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 | |
| parent | 78696ae1a7a31b597984aa783253c1b00a043291 (diff) | |
| download | hurrycurry-70a6107085d921a3020d2037a09abdaa40970722.tar hurrycurry-70a6107085d921a3020d2037a09abdaa40970722.tar.bz2 hurrycurry-70a6107085d921a3020d2037a09abdaa40970722.tar.zst | |
cant move too quickly
| -rw-r--r-- | server/src/customer/movement.rs | 1 | ||||
| -rw-r--r-- | server/src/data.rs | 4 | ||||
| -rw-r--r-- | server/src/game.rs | 26 | ||||
| -rw-r--r-- | test-client/main.ts | 12 | ||||
| -rw-r--r-- | test-client/movement.ts | 5 | ||||
| -rw-r--r-- | test-client/visual.ts | 18 | 
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) | 
