From 296b5c9ee0b1ea5d2c63308dee04f31acafe6a7c Mon Sep 17 00:00:00 2001 From: core Date: Wed, 12 Apr 2023 19:54:08 -0400 Subject: [PATCH] multiple players support --- client/src/lib.rs | 27 ++++++++++++------ client/src/rendering/renderer.rs | 3 ++ protocol/src/lib.rs | 13 ++++++--- server/src/handler.rs | 7 ++--- server/src/manager.rs | 4 +-- server/src/timer.rs | 48 +++++++++++++++++++------------- 6 files changed, 63 insertions(+), 39 deletions(-) diff --git a/client/src/lib.rs b/client/src/lib.rs index 24055ec2a67c395a4cf5bd15b7a4698d50662b3e..15446cfc3a4c50d7ddb470c11bb4b2a560f12c89 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -1,4 +1,5 @@ use std::error::Error; +use std::panic; use std::str::FromStr; use futures::stream::{SplitSink, SplitStream}; @@ -7,7 +8,7 @@ use log::{debug, error, info, Level, trace, warn}; use wasm_bindgen::prelude::*; use web_sys::console::debug; use ws_stream_wasm::{WsErr, WsMessage, WsMeta, WsStream}; -use starkingdoms_protocol::{ProtocolPlanet, State}; +use starkingdoms_protocol::{ProtocolPlanet, ProtocolPlayer, State}; use starkingdoms_protocol::PROTOCOL_VERSION; use starkingdoms_protocol::MessageS2C; use starkingdoms_protocol::MessageC2S; @@ -43,7 +44,8 @@ pub struct Client { pub client_data: Option, pub planets: Vec, pub x: f64, - pub y: f64 + pub y: f64, + pub players: Vec } #[derive(Debug)] @@ -53,7 +55,8 @@ pub struct ClientData { pub rx: SplitStream, pub pong_timeout: u64, pub textures: TextureLoader, - pub renderer: WebRenderer + pub renderer: WebRenderer, + pub username: String } pub const PONG_MAX_TIMEOUT: u64 = 5; @@ -63,7 +66,8 @@ lazy_static! { client_data: None, planets: vec![], x: 0f64, - y: 0f64 + y: 0f64, + players: vec![] })); } @@ -71,7 +75,7 @@ pub const MAX_CONNECTION_TRIES: i32 = 10; #[wasm_bindgen] pub async fn rust_init(gateway: &str, username: &str, texture_size: &str) -> Result<(), JsValue> { - console_error_panic_hook::set_once(); + panic::set_hook(Box::new(console_error_panic_hook::hook)); set_status("Starting logger..."); @@ -139,7 +143,8 @@ pub async fn main(gateway: &str, username: &str, backoff: i32, textures: Texture rx, pong_timeout: (js_sys::Date::now() as u64 / 1000) + 5, textures, - renderer + renderer, + username: username.to_string() }; trace!("Split stream, handshaking with server"); @@ -252,9 +257,13 @@ pub async fn update_socket() -> Result<(), JsError> { MessageS2C::PlanetData { planets } => { client.planets = planets; }, - MessageS2C::Position { x, y } => { - client.x = x; - client.y = y; + MessageS2C::PlayersUpdate { players } => { + let me = players.iter().find(|i| i.username == client_data.username); + if let Some(me) = me { + client.x = me.x; + client.y = me.y; + } + client.players = players; } _ => { warn!("server sent unexpected packet {:?}, ignoring", msg); diff --git a/client/src/rendering/renderer.rs b/client/src/rendering/renderer.rs index 3857005cc08a18821ee0de8e68a4de926c0cbf62..1cc1abf78ee433d22d15257336035a1708d23396 100644 --- a/client/src/rendering/renderer.rs +++ b/client/src/rendering/renderer.rs @@ -53,6 +53,9 @@ impl Renderer for WebRenderer { context.draw_image_with_html_image_element_and_dw_and_dh(&texture_image, -planet.radius, -planet.radius, planet.radius * 2f64, planet.radius * 2f64).map_err(|e: JsValue| e.as_string().unwrap())?; context.restore(); } + + + // do not remove // im making this smiley an easter egg soon // i just have to go fix the broken build system first diff --git a/protocol/src/lib.rs b/protocol/src/lib.rs index 5aa28a9f4b947c84835f5482d1774e06bd0fa978..dc181b3cfe29eafdc982c425e9b8e66fff28251a 100644 --- a/protocol/src/lib.rs +++ b/protocol/src/lib.rs @@ -47,10 +47,7 @@ pub enum MessageS2C { Pong {}, PlayersUpdate { - rotation: Vec, - x: Vec, - y: Vec, - username: Vec, + players: Vec }, @@ -59,6 +56,14 @@ pub enum MessageS2C { } } +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ProtocolPlayer { + pub rotation: f64, + pub x: f64, + pub y: f64, + pub username: String +} + #[derive(Serialize, Deserialize, Debug, Clone)] pub enum GoodbyeReason { UnsupportedProtocol { supported: u32, got: u32 }, diff --git a/server/src/handler.rs b/server/src/handler.rs index cc8753f107738cc9481e995d27592fd3e72bda33..8f0f58290ebdb3ee88fd9d1fc4d3d49bbfde43ed 100644 --- a/server/src/handler.rs +++ b/server/src/handler.rs @@ -33,12 +33,9 @@ pub async fn handle_client(mgr: ClientManager, data: Arc>, r from }).await?; } - ClientHandlerMessage::PlayersUpdate { rotation, x, y, usernames } => { + ClientHandlerMessage::PlayersUpdate { players } => { send!(client_tx, &MessageS2C::PlayersUpdate { - rotation, - x, - y, - username: usernames + players }).await?; } ClientHandlerMessage::PlanetData { planets } => { diff --git a/server/src/manager.rs b/server/src/manager.rs index b954fb9f62e0e7da0b59bbdf51b9072a1f80ad14..26491422e23d99fcca9407f933657d5f296bc9a9 100644 --- a/server/src/manager.rs +++ b/server/src/manager.rs @@ -5,7 +5,7 @@ use std::sync::Arc; use rapier2d_f64::na::{Vector2}; use rapier2d_f64::prelude::{IntegrationParameters, PhysicsPipeline, IslandManager, BroadPhase, NarrowPhase, ImpulseJointSet, MultibodyJointSet, CCDSolver, RigidBodySet, ColliderSet, RigidBodyHandle}; -use starkingdoms_protocol::ProtocolPlanet; +use starkingdoms_protocol::{ProtocolPlanet, ProtocolPlayer}; use tokio::sync::mpsc::Sender; use tokio::sync::RwLock; @@ -61,6 +61,6 @@ impl PhysicsData { pub enum ClientHandlerMessage { Tick, ChatMessage { from: String, message: String }, - PlayersUpdate { rotation: Vec, x: Vec, y: Vec, usernames: Vec }, + PlayersUpdate { players: Vec }, PlanetData { planets: Vec }, } diff --git a/server/src/timer.rs b/server/src/timer.rs index a04c30622d19c3d16925584c066b0017dbb4e30c..d6880dcadb1fda2b845daa8a4c9a49a45d1b4b56 100644 --- a/server/src/timer.rs +++ b/server/src/timer.rs @@ -3,7 +3,7 @@ use std::{time::Duration, sync::Arc}; use log::{error}; use rapier2d_f64::prelude::{PhysicsPipeline, RigidBodyHandle}; -use starkingdoms_protocol::{ProtocolPlanet, PlanetType}; +use starkingdoms_protocol::{ProtocolPlanet, PlanetType, ProtocolPlayer}; use tokio::{time::sleep, sync::RwLock}; use crate::{manager::{ClientHandlerMessage, ClientManager, PhysicsData}, SCALE}; @@ -14,34 +14,44 @@ pub async fn timer_main(mgr: ClientManager, physics_data: Arc { - let player_handles = mgr.players.read().await.values().map(|s| {s.handle}).collect::>(); - let data = physics_data.read().await; - let mut translations = Vec::new(); - let mut rotations = Vec::new(); - for handle in player_handles { - let player_body = data.rigid_body_set.get(handle).unwrap(); - translations.push(player_body.translation()); - rotations.push(player_body.rotation().angle()); - } - let usernames_raw = mgr.usernames.read().await; - let usernames = usernames_raw.values().collect::>(); - - match client_thread.tx.send(ClientHandlerMessage::PlayersUpdate { - rotation: rotations, - usernames: usernames.into_iter().map(|s| s.clone()).collect(), - x: translations.clone().into_iter().map(|s| { s.x * SCALE}).collect(), - y: translations.into_iter().map(|s| { s.y * SCALE}).collect() }).await { + match client_thread.tx.send(ClientHandlerMessage::PlayersUpdate {players: protocol_players.clone()}).await { Ok(_) => (), Err(e) => { error!("unable to send position packet: {}", e); } }; + let world = world_data.read().await; let earth_handle = world.get(0).unwrap(); - let earth_body = data.rigid_body_set.get(*earth_handle).unwrap(); + let earth_body = physics_data.rigid_body_set.get(*earth_handle).unwrap(); //let earth_collider = data.collider_set.get(earth_body.colliders()[0]).unwrap(); let protocol_earth = ProtocolPlanet { planet_type: PlanetType::Earth,