From d396b7b9c26b16d84fd9092b55a57e30ea2a2572 Mon Sep 17 00:00:00 2001 From: ghostlyzsh Date: Sat, 25 Nov 2023 17:58:05 -0600 Subject: [PATCH] server sends SpawnPlayer packet --- server/Cargo.toml | 2 +- server/src/macros.rs | 18 ++++++++++++ server/src/main.rs | 65 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 server/src/macros.rs diff --git a/server/Cargo.toml b/server/Cargo.toml index 961522a6ed113a3080fa51e24c215757f32dd16b..59198f8f95ed89aabc2af121d90256c8b1bb5434 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -8,4 +8,4 @@ bevy = { version = "0.12", default-features = false } serde = { version = "1", features = ["derive"] } serde_json = "1" bevy_twite = { git = "https://gitlab.com/ghostlyzsh/twite.git" } -tracing-subscriber = "0.3" \ No newline at end of file +tracing-subscriber = "0.3" diff --git a/server/src/macros.rs b/server/src/macros.rs new file mode 100644 index 0000000000000000000000000000000000000000..e2c1a0f3f6fdf9ecd0936a279090e2d6ec681ada --- /dev/null +++ b/server/src/macros.rs @@ -0,0 +1,18 @@ +#[macro_export] +macro_rules! err_or_cont { + ($expr:expr) => { + match $expr { + Ok(n) => n, + Err(_) => continue + } + }; +} +#[macro_export] +macro_rules! some_or_cont { + ($expr:expr) => { + match $expr { + Some(n) => n, + None => continue + } + }; +} diff --git a/server/src/main.rs b/server/src/main.rs index a401d62a5d72f70ee19ae389020c200374ae0423..8204233b4e5f25f82cbb419ad941ae14b0aea21a 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -6,6 +6,7 @@ use packet::*; pub mod component; pub mod packet; +pub mod macros; fn main() { let subscriber = tracing_subscriber::FmtSubscriber::new(); @@ -20,7 +21,8 @@ fn main() { .add_plugins(MinimalPlugins) .add_plugins(TwiteServerPlugin) .add_systems(Startup, spawn_planets) - .add_systems(Update, on_connection) + //.add_systems(Update, on_connection) + .add_systems(Update, on_message) .add_systems(FixedUpdate, on_position_change) .run(); @@ -36,7 +38,7 @@ fn spawn_planets(mut commands: Commands) { }); } -fn on_connection( +/*fn on_connection( mut commands: Commands, planet_query: Query<(Entity, &PlanetType, &Transform)>, mut reader: Local>, @@ -68,13 +70,70 @@ fn on_connection( let packet = Packet::PlanetPositions { planets }; let buf = serde_json::to_vec(&packet).unwrap(); - packets.push(ServerEvent::Send(*addr, MessageType::Text, buf)); } } for packet in packets { events.send(packet); } +}*/ + +fn on_message( + mut commands: Commands, + planet_query: Query<(Entity, &PlanetType, &Transform)>, + mut packet_recv: Local>, + mut packet_send: ResMut>, +) { + let mut packets = Vec::new(); + for ev in packet_recv.read(&packet_send) { + if let ServerEvent::Recv(addr, MessageType::Text, data) = ev { + let data = String::from_utf8_lossy(&data); + let json: serde_json::Value = err_or_cont!(serde_json::from_str(&data)); + let packet_type = json["t"].clone(); + let data = json["c"].clone(); + let packet_type = some_or_cont!(packet_type.as_str()); + match packet_type { + "ClientLogin" => { + // spawn player + let transform = Transform::from_xyz(0.0, 0.0, 0.0); + let id = commands + .spawn(PlayerBundle { + part: PartBundle { + part_type: PartType::Hearty, + transform: TransformBundle::from(transform), + }, + addr: Player(*addr), + }).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(); + for (entity, planet_type, transform) in planet_query.iter() { + planets.push((entity.index(), Planet { + planet_type: *planet_type, + transform: proto_transform!(transform) + })); + } + let packet = Packet::PlanetPositions { planets }; + let buf = serde_json::to_vec(&packet).unwrap(); + packets.push(ServerEvent::Send(*addr, MessageType::Text, buf)); + } + _ => continue + }; + } + } + for packet in packets { + packet_send.send(packet); + } } fn on_position_change(