From dde594033510bf885cbcf5cac608c66edaaa5961 Mon Sep 17 00:00:00 2001 From: ghostlyzsh Date: Sat, 25 Nov 2023 20:22:11 -0600 Subject: [PATCH] players can now leave --- server/src/main.rs | 32 ++++++++++++++++++++++++++++++++ server/src/packet.rs | 5 ++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/server/src/main.rs b/server/src/main.rs index cc96e00e02b790c3e61c5e4a1d25e7f5872536f0..8dc3a0ffd0f0bd1e17d7df8346c19b041c2a81a9 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -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>, + mut packet_send: ResMut>, +) { + 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>, diff --git a/server/src/packet.rs b/server/src/packet.rs index 407c7dc9d0a3635e0f3e46b806e3ec5df4d0daa6..5cc84fe9152fca8611586c54017bf084a6a5f29b 100644 --- a/server/src/packet.rs +++ b/server/src/packet.rs @@ -50,5 +50,8 @@ pub enum Packet { }, PartPositions { parts: Vec<(u32, Part)> - } + }, + PlayerLeave { + id: u32, + }, }