diff options
Diffstat (limited to 'server/src')
| -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, +    },  } | 
