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 /server/src/game.rs | |
| parent | 267869f2d3dcf762a3db4dbc885f6b90a9a4ad41 (diff) | |
| download | hurrycurry-85e478653a308d05884db8a0c69ac2d0dcda21eb.tar hurrycurry-85e478653a308d05884db8a0c69ac2d0dcda21eb.tar.bz2 hurrycurry-85e478653a308d05884db8a0c69ac2d0dcda21eb.tar.zst | |
prevent too far interact
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(); | 
