import type { Client } from "../client.ts"; import { InputManager } from "../input_manager.ts"; import { ClientInventories } from "../inventory.ts"; import { Player } from "./player.ts"; // how often the position goes to the server const SEND_POSITION_INTERVAL = 1 / 10; // the player this client controls, like minecraft's LocalPlayer export class LocalPlayer extends Player { client: Client; inventories = new ClientInventories(); move_speed = 4; jump_force = 6.7; #send_timer = 0; constructor(client: Client, id: string, name: string) { super(client.level, id, name); this.client = client; } tick(delta: number) { if (!this.client.screen) { this.#apply_input(); } this.move(delta); this.#send_position(delta); } // turns with the mouse, like minecraft's MouseHandler.turnPlayer turn(mouse_dx: number, mouse_dy: number) { this.yaw += -mouse_dx * 0.001; this.pitch += -mouse_dy * 0.001; const limit = Math.PI / 2 - 0.01; this.pitch = Math.max(-limit, Math.min(limit, this.pitch)); } // walking relative to where it's looking #apply_input() { const options = this.client.options; let input_x = 0; let input_z = 0; if (InputManager.is_key_down(options.key_left)) { input_x -= 1; } if (InputManager.is_key_down(options.key_right)) { input_x += 1; } if (InputManager.is_key_down(options.key_forward)) { input_z -= 1; } if (InputManager.is_key_down(options.key_back)) { input_z += 1; } const size = Math.hypot(input_x, input_z); if (size > 0) { input_x /= size; input_z /= size; } const sin = Math.sin(this.yaw); const cos = Math.cos(this.yaw); const speed = this.move_speed * (InputManager.is_key_down(options.key_sprint) ? 1.75 : 1); this.vx = (sin * input_z + cos * input_x) * speed; this.vz = (cos * input_z - sin * input_x) * speed; if (InputManager.is_key_down(options.key_jump) && this.on_ground) { this.vy += this.jump_force; } } #send_position(delta: number) { this.#send_timer += delta; if (this.#send_timer < SEND_POSITION_INTERVAL) { return; } this.#send_timer = 0; this.client.connection.send({ type: "move", x: this.x, y: this.y, z: this.z, yaw: this.yaw, pitch: this.pitch, }); } }