From 05f422993232b163a91bc1bc9ac1f640be2195a6 Mon Sep 17 00:00:00 2001 From: ghostlyzsh Date: Sat, 25 Nov 2023 19:54:30 -0600 Subject: [PATCH] sending players on connection and part positions --- server/src/component.rs | 7 ++++-- server/src/main.rs | 56 ++++++++++++++++++++++++++++++++--------- server/src/packet.rs | 8 ++++-- 3 files changed, 55 insertions(+), 16 deletions(-) diff --git a/server/src/component.rs b/server/src/component.rs index 95beb98150b2256288ae28458b6d60f5adc89328..004ee56be93011cfa9ae90c3e66907debed4ea1a 100644 --- a/server/src/component.rs +++ b/server/src/component.rs @@ -14,7 +14,10 @@ pub enum PartType { } #[derive(Component)] -pub struct Player(pub SocketAddr); +pub struct Player { + pub addr: SocketAddr, + pub username: String, +} #[derive(Bundle)] pub struct PlanetBundle { @@ -31,5 +34,5 @@ pub struct PartBundle { #[derive(Bundle)] pub struct PlayerBundle { pub part: PartBundle, - pub addr: Player, + pub player: Player, } diff --git a/server/src/main.rs b/server/src/main.rs index 8204233b4e5f25f82cbb419ad941ae14b0aea21a..cc96e00e02b790c3e61c5e4a1d25e7f5872536f0 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -81,6 +81,8 @@ fn spawn_planets(mut commands: Commands) { fn on_message( mut commands: Commands, planet_query: Query<(Entity, &PlanetType, &Transform)>, + player_query: Query<(Entity, &Player)>, + part_query: Query<(Entity, &PartType, &Transform)>, mut packet_recv: Local>, mut packet_send: ResMut>, ) { @@ -93,8 +95,11 @@ fn on_message( let data = json["c"].clone(); let packet_type = some_or_cont!(packet_type.as_str()); match packet_type { + // handshake "ClientLogin" => { // spawn player + let username = data["username"].clone(); + let username = some_or_cont!(username.as_str()); let transform = Transform::from_xyz(0.0, 0.0, 0.0); let id = commands .spawn(PlayerBundle { @@ -102,18 +107,8 @@ fn on_message( part_type: PartType::Hearty, transform: TransformBundle::from(transform), }, - addr: Player(*addr), + player: Player { addr: *addr, username: username.to_string() }, }).id().index(); - // tell other clients that a player has spawned - let username = data["username"].clone(); - let username = some_or_cont!(username.as_str()); - let packet = Packet::SpawnPlayer { - id, - username: username.to_string(), - position: proto_transform!(transform), - }; - let buf = serde_json::to_vec(&packet).unwrap(); - packets.push(ServerEvent::Broadcast(MessageType::Text, buf)); // tell this player the planets let mut planets = Vec::new(); @@ -126,6 +121,43 @@ fn on_message( let packet = Packet::PlanetPositions { planets }; let buf = serde_json::to_vec(&packet).unwrap(); packets.push(ServerEvent::Send(*addr, MessageType::Text, buf)); + + // tell the player already existing users + let mut players = Vec::new(); + for (entity, player) in &player_query { + players.push((entity.index(), player.username.clone())); + } + let packet = Packet::PlayerList { + players, + }; + let buf = serde_json::to_vec(&packet).unwrap(); + packets.push(ServerEvent::Send(*addr, MessageType::Text, buf)); + + // tell other players that a player has spawned in + let packet = Packet::SpawnPlayer { + id, + username: username.to_string(), + }; + let buf = serde_json::to_vec(&packet).unwrap(); + packets.push(ServerEvent::Broadcast(MessageType::Text, buf)); + + // tell the player where parts are + let mut parts = Vec::new(); + for (entity, part_type, transform) in &part_query { + parts.push((entity.index(), Part { + part_type: *part_type, + transform: proto_transform!(transform), + })); + } + parts.push((id, Part { + part_type: PartType::Hearty, + transform: proto_transform!(transform), + })); + let packet = Packet::PartPositions { + parts + }; + let buf = serde_json::to_vec(&packet).unwrap(); + packets.push(ServerEvent::Send(*addr, MessageType::Text, buf)); } _ => continue }; @@ -138,7 +170,7 @@ fn on_message( fn on_position_change( mut commands: Commands, - part_query: Query<(Entity, &PartType, &Transform), (With, Changed)>, + part_query: Query<(Entity, &PartType, &Transform), Changed>, planet_query: Query<(Entity, &PlanetType, &Transform), Changed>, mut packet_send: EventWriter, ) { diff --git a/server/src/packet.rs b/server/src/packet.rs index 8d01c7a9b8c0171fc9680f28bbd533935bbc83bd..407c7dc9d0a3635e0f3e46b806e3ec5df4d0daa6 100644 --- a/server/src/packet.rs +++ b/server/src/packet.rs @@ -32,14 +32,18 @@ pub struct Part { #[derive(Debug, Serialize, Deserialize)] #[serde(tag = "t", content = "c")] pub enum Packet { + // serverbound ClientLogin { username: String, jwt: Option, }, + // clientbound SpawnPlayer { id: u32, username: String, - position: ProtoTransform + }, + PlayerList { + players: Vec<(u32, String)>, }, PlanetPositions { planets: Vec<(u32, Planet)> @@ -47,4 +51,4 @@ pub enum Packet { PartPositions { parts: Vec<(u32, Part)> } -} \ No newline at end of file +}