diff options
Diffstat (limited to 'server/src/game.rs')
-rw-r--r-- | server/src/game.rs | 14 |
1 files changed, 12 insertions, 2 deletions
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(); |