diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/src/game.rs | 17 | ||||
-rw-r--r-- | server/src/main.rs | 16 | ||||
-rw-r--r-- | server/src/protocol.rs | 3 |
3 files changed, 26 insertions, 10 deletions
diff --git a/server/src/game.rs b/server/src/game.rs index b38d3ace..c240ea13 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -6,7 +6,7 @@ use crate::{ }; use anyhow::{anyhow, bail, Result}; use glam::{IVec2, Vec2}; -use log::{info, warn}; +use log::info; use std::{ collections::{HashMap, VecDeque}, ops::Deref, @@ -187,21 +187,22 @@ impl Game { .interacting .map(|p| (p.as_vec2() + Vec2::splat(0.5)).distance(player.position)) .unwrap_or_default(); - if speed < PLAYER_SPEED_LIMIT && dist < 1. && interact_dist < 2. { + let movement_ok = speed < PLAYER_SPEED_LIMIT && dist < 1. && interact_dist < 2.; + if movement_ok { player.position = pos; player.last_position_ts = Instant::now(); - } else { - warn!( - "{:?} moved to quickly. speed={speed:.02} dist={dist:.02}", - player.name - ) } - self.packet_out.push_back(PacketC::Position { player: pid, pos: player.position, rot, }); + if !movement_ok { + bail!( + "{:?} moved to quickly. speed={speed:.02} dist={dist:.02}", + player.name + ) + } } PacketS::Collide { player, force } => { self.packet_out diff --git a/server/src/main.rs b/server/src/main.rs index 96c268e5..5c718fb0 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -5,7 +5,7 @@ use std::{sync::Arc, time::Duration}; use tokio::{ net::TcpListener, spawn, - sync::{broadcast, RwLock}, + sync::{broadcast, mpsc::channel, RwLock}, time::sleep, }; use tokio_tungstenite::tungstenite::Message; @@ -55,6 +55,7 @@ async fn main() -> Result<()> { let (mut write, mut read) = sock.split(); let game = game.clone(); let mut rx = rx.resubscribe(); + let (error_tx, mut error_rx) = channel::<PacketC>(8); info!("{addr} connected via ws"); let init = game.write().await.prime_client(id); spawn(async move { @@ -69,7 +70,13 @@ async fn main() -> Result<()> { return; } } - while let Ok(packet) = rx.recv().await { + loop { + let Some(packet) = tokio::select!( + p = rx.recv() => p.ok(), + p = error_rx.recv() => p, + ) else { + break; + }; if let Err(e) = write .send(tokio_tungstenite::tungstenite::Message::Text( serde_json::to_string(&packet).unwrap(), @@ -92,6 +99,11 @@ async fn main() -> Result<()> { debug!("<- {id:?} {packet:?}"); if let Err(e) = game.write().await.packet_in(id, packet) { warn!("client error: {e}"); + let _ = error_tx + .send(PacketC::Error { + message: format!("{e}"), + }) + .await; } } Message::Close(_) => break, diff --git a/server/src/protocol.rs b/server/src/protocol.rs index 305ffa1d..fb24f7cf 100644 --- a/server/src/protocol.rs +++ b/server/src/protocol.rs @@ -111,4 +111,7 @@ pub enum PacketC { player: PlayerID, message: Option<Message>, }, + Error { + message: String, + }, } |