summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/src/game.rs17
-rw-r--r--server/src/main.rs16
-rw-r--r--server/src/protocol.rs3
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,
+ },
}