diff options
author | metamuffin <metamuffin@disroot.org> | 2024-06-23 14:43:23 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-06-23 19:32:37 +0200 |
commit | 85e478653a308d05884db8a0c69ac2d0dcda21eb (patch) | |
tree | e425b5b1e45933b07f45973c257d5922654d78a6 | |
parent | 267869f2d3dcf762a3db4dbc885f6b90a9a4ad41 (diff) | |
download | hurrycurry-85e478653a308d05884db8a0c69ac2d0dcda21eb.tar hurrycurry-85e478653a308d05884db8a0c69ac2d0dcda21eb.tar.bz2 hurrycurry-85e478653a308d05884db8a0c69ac2d0dcda21eb.tar.zst |
prevent too far interact
-rw-r--r-- | server/src/customer/movement.rs | 2 | ||||
-rw-r--r-- | server/src/game.rs | 14 |
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(); |