diff options
| author | metamuffin <metamuffin@disroot.org> | 2024-06-23 14:21:25 +0200 | 
|---|---|---|
| committer | metamuffin <metamuffin@disroot.org> | 2024-06-23 19:32:37 +0200 | 
| commit | 70a6107085d921a3020d2037a09abdaa40970722 (patch) | |
| tree | 052a1e784f87ce2cab77230b674e3871da5a5f79 /server/src/game.rs | |
| parent | 78696ae1a7a31b597984aa783253c1b00a043291 (diff) | |
| download | hurrycurry-70a6107085d921a3020d2037a09abdaa40970722.tar hurrycurry-70a6107085d921a3020d2037a09abdaa40970722.tar.bz2 hurrycurry-70a6107085d921a3020d2037a09abdaa40970722.tar.zst | |
cant move too quickly
Diffstat (limited to 'server/src/game.rs')
| -rw-r--r-- | server/src/game.rs | 26 | 
1 files changed, 22 insertions, 4 deletions
| diff --git a/server/src/game.rs b/server/src/game.rs index e2245895..8ca3523f 100644 --- a/server/src/game.rs +++ b/server/src/game.rs @@ -1,15 +1,17 @@  use crate::{ +    customer::movement::PLAYER_SPEED_LIMIT,      data::Gamedata,      interaction::{interact, tick_tile, InteractEffect, TickEffect},      protocol::{ItemIndex, Message, PacketC, PacketS, PlayerID, RecipeIndex, TileIndex},  };  use anyhow::{anyhow, bail, Result};  use glam::{IVec2, Vec2}; -use log::info; +use log::{info, warn};  use std::{      collections::{HashMap, VecDeque},      ops::Deref,      sync::Arc, +    time::Instant,  };  #[derive(Debug, PartialEq)] @@ -34,6 +36,7 @@ pub struct Player {      pub name: String,      pub character: i32,      pub position: Vec2, +    pub last_position_ts: Instant,      pub interacting: Option<IVec2>,      pub item: Option<Item>,      pub communicate: Option<Message>, @@ -131,6 +134,7 @@ impl Game {                      player,                      Player {                          item: None, +                        last_position_ts: Instant::now(),                          character,                          position: if player.0 < 0 {                              self.data.customer_spawn @@ -170,13 +174,27 @@ impl Game {                      .push_back(PacketC::RemovePlayer { id: player })              }              PacketS::Position { pos, rot } => { -                self.packet_out -                    .push_back(PacketC::Position { player, pos, rot }); +                let pid = player;                  let player = self                      .players                      .get_mut(&player)                      .ok_or(anyhow!("player does not exist"))?; -                player.position = pos; + +                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. { +                    player.position = pos; +                    player.last_position_ts = Instant::now(); +                } else { +                    warn!("{:?} moved to quickly.", player.name) +                } + +                self.packet_out.push_back(PacketC::Position { +                    player: pid, +                    pos: player.position, +                    rot, +                });              }              PacketS::Collide { player, force } => {                  self.packet_out | 
