summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/src/customer/movement.rs1
-rw-r--r--server/src/data.rs4
-rw-r--r--server/src/game.rs26
-rw-r--r--test-client/main.ts12
-rw-r--r--test-client/movement.ts5
-rw-r--r--test-client/visual.ts18
6 files changed, 47 insertions, 19 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
diff --git a/test-client/main.ts b/test-client/main.ts
index 7146a3d1..d3d1eb54 100644
--- a/test-client/main.ts
+++ b/test-client/main.ts
@@ -2,7 +2,7 @@
import { player_movement_update } from "./movement.ts";
import { Gamedata, ItemIndex, Message, PacketC, PacketS, PlayerID, TileIndex } from "./protocol.ts";
-import { V2, add_v2, lerp_exp_v2_mut, normalize, lerp_exp } from "./util.ts";
+import { V2, add_v2, lerp_exp_v2_mut, normalize, lerp_exp, sub_v2, length } from "./util.ts";
import { draw_ingame, draw_wait } from "./visual.ts";
export let ctx: CanvasRenderingContext2D;
@@ -76,7 +76,7 @@ export const items_removed = new Set<ItemData>()
export let data: Gamedata = { item_names: [], tile_names: [], spawn: [0, 0], tile_collide: [], tile_interact: [] }
-let my_id: PlayerID = -1
+export let my_id: PlayerID = -1
export const camera: V2 = { x: 0, y: 0 }
export const interact_target_anim: V2 = { x: 0, y: 0 }
export let interact_possible_anim: number = 0
@@ -109,10 +109,12 @@ function packet(p: PacketC) {
players.delete(p.id)
break;
case "position": {
- if (p.player == my_id) return; // we know better where we are
const pl = players.get(p.player)!
- pl.x = p.pos[0]
- pl.y = p.pos[1]
+ const pos = { x: p.pos[0], y: p.pos[1] }
+ const dist = length(sub_v2(pl, pos));
+ if (p.player == my_id && dist < 1) return; // we know better where we are
+ pl.x = pos.x
+ pl.y = pos.y
pl.rot = p.rot
break;
}
diff --git a/test-client/movement.ts b/test-client/movement.ts
index 88c47c33..cd5cc1d5 100644
--- a/test-client/movement.ts
+++ b/test-client/movement.ts
@@ -3,12 +3,13 @@ import { tiles, players, PlayerData } from "./main.ts";
import { V2, normalize, length, sub_v2, lerp_exp_v2_mut } from "./util.ts";
export const PLAYER_SIZE = 0.4;
+export const PLAYER_SPEED = 25;
export function player_movement_update(p: PlayerData, dt: number, input: V2) {
if (length(input) > 0.1) lerp_exp_v2_mut(p.facing, input, dt * 10.)
p.rot = Math.atan2(p.facing.x, p.facing.y)
- p.vel.x += input.x * dt * 25
- p.vel.y += input.y * dt * 25
+ p.vel.x += input.x * dt * PLAYER_SPEED
+ p.vel.y += input.y * dt * PLAYER_SPEED
p.x += p.vel.x * dt
p.y += p.vel.y * dt
collide_player(p, dt)
diff --git a/test-client/visual.ts b/test-client/visual.ts
index 60d8e7a0..e23f0f01 100644
--- a/test-client/visual.ts
+++ b/test-client/visual.ts
@@ -1,4 +1,4 @@
-import { ItemData, MessageData, PlayerData, TileData, camera, canvas, ctx, data, get_interact_target, interact_active_anim, interact_possible_anim, interact_target_anim, items_removed, keys_down, players, tiles } from "./main.ts";
+import { ItemData, MessageData, PlayerData, TileData, camera, canvas, ctx, data, get_interact_target, interact_active_anim, interact_possible_anim, interact_target_anim, items_removed, keys_down, my_id, players, tiles } from "./main.ts";
import { PLAYER_SIZE } from "./movement.ts";
import { FALLBACK_TILE, ITEMS, TILES, FALLBACK_ITEM } from "./tiles.ts";
import { V2, ceil_v2, floor_v2 } from "./util.ts";
@@ -64,14 +64,20 @@ export function draw_ingame() {
if (keys_down.has("KeyP")) {
camera_zoom = 0.05
- ctx.fillStyle = "white"
- ctx.textAlign = "left"
- ctx.textBaseline = "bottom"
- ctx.font = "20px sans-serif"
- ctx.fillText(`interact = ${JSON.stringify(get_interact_target())}`, 10, 30)
+ draw_debug()
} else { camera_zoom = 0.1 }
}
+function draw_debug() {
+ ctx.fillStyle = "white"
+ ctx.textAlign = "left"
+ ctx.textBaseline = "bottom"
+ ctx.font = "20px sans-serif"
+ ctx.fillText(`position = ${JSON.stringify(players.get(my_id)?.anim_position)}`, 10, 30)
+ ctx.fillText(`velocity = ${JSON.stringify(players.get(my_id)?.vel)}`, 10, 50)
+ ctx.fillText(`interact = ${JSON.stringify(get_interact_target())}`, 10, 70)
+}
+
function draw_tile(tile: TileData) {
ctx.save()
ctx.translate(tile.x + 0.5, tile.y + 0.5)