aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-06-23 14:43:23 +0200
committermetamuffin <metamuffin@disroot.org>2024-06-23 19:32:37 +0200
commit85e478653a308d05884db8a0c69ac2d0dcda21eb (patch)
treee425b5b1e45933b07f45973c257d5922654d78a6
parent267869f2d3dcf762a3db4dbc885f6b90a9a4ad41 (diff)
downloadhurrycurry-85e478653a308d05884db8a0c69ac2d0dcda21eb.tar
hurrycurry-85e478653a308d05884db8a0c69ac2d0dcda21eb.tar.bz2
hurrycurry-85e478653a308d05884db8a0c69ac2d0dcda21eb.tar.zst
prevent too far interact
-rw-r--r--server/src/customer/movement.rs2
-rw-r--r--server/src/game.rs14
2 files changed, 13 insertions, 3 deletions
diff --git a/server/src/customer/movement.rs b/server/src/customer/movement.rs
index a4b039e2..c637a17f 100644
--- a/server/src/customer/movement.rs
+++ b/server/src/customer/movement.rs
@@ -4,7 +4,7 @@ use std::collections::HashSet;
const PLAYER_SIZE: f32 = 0.4;
const PLAYER_SPEED: f32 = 25.;
-pub const PLAYER_SPEED_LIMIT: f32 = 8.;
+pub const PLAYER_SPEED_LIMIT: f32 = 10.;
pub struct MovementBase {
pub position: Vec2,
diff --git a/server/src/game.rs b/server/src/game.rs
index 8ca3523f..b38d3ace 100644
--- a/server/src/game.rs
+++ b/server/src/game.rs
@@ -183,11 +183,18 @@ impl Game {
let dt = player.last_position_ts.elapsed().as_secs_f32();
let dist = pos.distance(player.position);
let speed = dist / dt;
- if speed < PLAYER_SPEED_LIMIT && dist < 1. {
+ let interact_dist = player
+ .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. {
player.position = pos;
player.last_position_ts = Instant::now();
} else {
- warn!("{:?} moved to quickly.", player.name)
+ warn!(
+ "{:?} moved to quickly. speed={speed:.02} dist={dist:.02}",
+ player.name
+ )
}
self.packet_out.push_back(PacketC::Position {
@@ -219,6 +226,9 @@ impl Game {
if !edge && player.interacting != Some(pos) {
bail!("already not interacting here")
}
+ if edge && (pos.as_vec2() + Vec2::splat(0.5)).distance(player.position) > 2. {
+ bail!("interacting too far from player");
+ }
let tile_had_item = tile.item.is_some();
let player_had_item = player.item.is_some();