aboutsummaryrefslogtreecommitdiff
path: root/server/src
diff options
context:
space:
mode:
Diffstat (limited to 'server/src')
-rw-r--r--server/src/customer/movement.rs1
-rw-r--r--server/src/data.rs4
-rw-r--r--server/src/game.rs26
3 files changed, 25 insertions, 6 deletions
diff --git a/server/src/customer/movement.rs b/server/src/customer/movement.rs
index 6a70a44f..a4b039e2 100644
--- a/server/src/customer/movement.rs
+++ b/server/src/customer/movement.rs
@@ -4,6 +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 struct MovementBase {
pub position: Vec2,
diff --git a/server/src/data.rs b/server/src/data.rs
index 17b508ec..5fa1a009 100644
--- a/server/src/data.rs
+++ b/server/src/data.rs
@@ -132,10 +132,10 @@ pub fn build_gamedata(
for (x, tile) in line.trim().char_indices() {
let pos = IVec2::new(x as i32, y as i32);
if tile == map_in.chef_spawn {
- chef_spawn = pos.as_vec2();
+ chef_spawn = pos.as_vec2() + Vec2::splat(0.5);
}
if tile == map_in.customer_spawn {
- customer_spawn = pos.as_vec2();
+ customer_spawn = pos.as_vec2() + Vec2::splat(0.5);
}
let tilename = map_in.tiles[&tile].clone();
let itemname = map_in.items.get(&tile).cloned();
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