@@ 23,6 23,7 @@ fn main() {
.add_systems(Startup, spawn_planets)
//.add_systems(Update, on_connection)
.add_systems(Update, on_message)
+ .add_systems(Update, on_close)
.add_systems(FixedUpdate, on_position_change)
.run();
@@ 168,6 169,37 @@ fn on_message(
}
}
+fn on_close(
+ player_query: Query<(Entity, &Player)>,
+ mut commands: Commands,
+ mut packet_recv: Local<ManualEventReader<ServerEvent>>,
+ mut packet_send: ResMut<Events<ServerEvent>>,
+) {
+ let mut packets = Vec::new();
+ for packet in packet_recv.read(&packet_send) {
+ if let ServerEvent::Close(addr) = packet {
+ for (entity, player) in &player_query {
+ if player.addr == *addr {
+ commands.entity(entity).despawn();
+
+ let packet = Packet::PlayerLeave {
+ id: entity.index()
+ };
+ let buf = serde_json::to_vec(&packet).unwrap();
+ for (in_entity, player) in &player_query {
+ if entity != in_entity {
+ packets.push(ServerEvent::Send(player.addr, MessageType::Text, buf.clone()));
+ }
+ }
+ }
+ }
+ }
+ }
+ for packet in packets {
+ packet_send.send(packet);
+ }
+}
+
fn on_position_change(
mut commands: Commands,
part_query: Query<(Entity, &PartType, &Transform), Changed<Transform>>,
@@ 50,5 50,8 @@ pub enum Packet {
},
PartPositions {
parts: Vec<(u32, Part)>
- }
+ },
+ PlayerLeave {
+ id: u32,
+ },
}