54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import { ClientWorld } from "$/client/client_world.ts";
|
|
import { Connection } from "$/client/network.ts";
|
|
import {
|
|
canvas,
|
|
draw_rect,
|
|
draw_text,
|
|
flush_batch,
|
|
push_box,
|
|
set_current_texture,
|
|
white_tex,
|
|
} from "$/client/renderer/mod.ts";
|
|
|
|
const CHAT_LINE_HEIGHT = 24;
|
|
const CHAT_VISIBLE_SECONDS = 10;
|
|
const CHAT_MAX_LINES = 10;
|
|
|
|
export function render_remote_players(connection: Connection) {
|
|
if (connection.players.size === 0) {
|
|
return;
|
|
}
|
|
|
|
flush_batch();
|
|
set_current_texture(white_tex!);
|
|
|
|
for (const player of connection.players.values()) {
|
|
const [r, g, b] = player.color;
|
|
const x = player.display_x;
|
|
const y = player.display_y;
|
|
const z = player.display_z;
|
|
|
|
// body
|
|
push_box(x - 0.3, y, z - 0.15, 0.6, 1.3, 0.3, r, g, b);
|
|
// head
|
|
push_box(x - 0.25, y + 1.3, z - 0.25, 0.5, 0.5, 0.5, 0.95, 0.8, 0.65);
|
|
}
|
|
|
|
flush_batch();
|
|
}
|
|
|
|
// draws the chat log above the bottom left corner, `all` shows old messages too (when the chat is open)
|
|
export function render_chat_log(world: ClientWorld, all: boolean, bottom = canvas.height - 100) {
|
|
const now = performance.now();
|
|
const lines = world.chat_log
|
|
.filter((line) => all || now - line.time < CHAT_VISIBLE_SECONDS * 1000)
|
|
.slice(-CHAT_MAX_LINES);
|
|
|
|
let y = bottom - lines.length * CHAT_LINE_HEIGHT;
|
|
for (const line of lines) {
|
|
draw_rect(0, y, 600, CHAT_LINE_HEIGHT, [0, 0, 0, 0.4]);
|
|
draw_text(line.text, 4, y, 2, [1, 1, 1, 1]);
|
|
y += CHAT_LINE_HEIGHT;
|
|
}
|
|
}
|