M client/src/lib.rs => client/src/lib.rs +3 -3
@@ 6,7 6,7 @@ use futures::StreamExt;
use log::{debug, error, info, Level, trace, warn};
use wasm_bindgen::prelude::*;
use ws_stream_wasm::{WsErr, WsMessage, WsMeta, WsStream};
-use starkingdoms_protocol::{Planet, State};
+use starkingdoms_protocol::{ProtocolPlanet, State};
use starkingdoms_protocol::PROTOCOL_VERSION;
use starkingdoms_protocol::MessageS2C;
use starkingdoms_protocol::MessageC2S;
@@ 39,7 39,7 @@ extern {
#[derive(Debug)]
pub struct Client {
pub client_data: Option<ClientData>,
- pub planets: Vec<Planet>,
+ pub planets: Vec<ProtocolPlanet>,
pub x: f64,
pub y: f64
}
@@ 286,4 286,4 @@ pub fn get_texture(texture_id: &str) -> Option<String> {
} else {
None
}
-}>
\ No newline at end of file
+}
M server/src/handler.rs => server/src/handler.rs +6 -0
@@ 32,6 32,12 @@ pub async fn handle_client(mgr: ClientManager, data: Arc<RwLock<PhysicsData>>, r
from
}).await?;
}
+ ClientHandlerMessage::Position { x, y } => {
+ send!(client_tx, &MessageS2C::Position {
+ x,
+ y
+ }).await?;
+ }
}
} else {
info!("channel closed, shutting down");
M server/src/manager.rs => server/src/manager.rs +3 -1
@@ 57,7 57,9 @@ impl PhysicsData {
}
}
+#[derive(Debug)]
pub enum ClientHandlerMessage {
Tick,
- ChatMessage { from: String, message: String }
+ ChatMessage { from: String, message: String },
+ Position { x: f64, y: f64 },
}
M server/src/timer.rs => server/src/timer.rs +13 -3
@@ 4,7 4,7 @@ use log::{error};
use rapier2d::prelude::{PhysicsPipeline};
use tokio::{time::sleep, sync::RwLock};
-use crate::{manager::{ClientHandlerMessage, ClientManager, PhysicsData}, SCALE};
+use crate::{manager::{ClientHandlerMessage, ClientManager, PhysicsData}, SCALE, send};
pub async fn timer_main(mgr: ClientManager, physics_data: Arc<RwLock<PhysicsData>>) {
let mut pipeline = PhysicsPipeline::new();
@@ 13,9 13,19 @@ pub async fn timer_main(mgr: ClientManager, physics_data: Arc<RwLock<PhysicsData
physics_data.write().await.tick(&mut pipeline);
- for (_addr, client_thread) in mgr.handlers.read().await.iter() {
+ for (addr, client_thread) in mgr.handlers.read().await.iter() {
match client_thread.tx.send(ClientHandlerMessage::Tick).await {
- Ok(_) => (),
+ Ok(_) => {
+ let player_handle = mgr.players.read().await.get(addr).unwrap().handle;
+ let data = physics_data.read().await;
+ let player_body = data.rigid_body_set.get(player_handle).unwrap();
+ match client_thread.tx.send(ClientHandlerMessage::Position { x: player_body.translation().x as f64, y: player_body.translation().y as f64 }).await {
+ Ok(_) => (),
+ Err(e) => {
+ error!("unable to send position packet: {}", e);
+ }
+ };
+ }
Err(e) => {
error!("unable to update a client thread: {}", e);
}