Files
2026-09-24 23:28:01 -03:00

65 lines
2.5 KiB
TypeScript

// what client scripts get, see "Client scripts" and "GUIs" in MODS.md
import type { Id, KeyCode, ModInfo, Position } from "./shared.ts";
export type { Id, ItemStack, KeyCode, ModInfo, Position } from "./shared.ts";
export interface ClientContext {
mod: ModInfo;
ui: ClientUi;
hud: HudRegistry;
input: { bind(id: Id, default_key: KeyCode, on_press: () => void): void };
net: ClientNet;
player: { readonly name: string; readonly position: Readonly<Position> };
// read only, what this client sees
world: { get_block(x: number, y: number, z: number): Id | undefined };
log(...args: unknown[]): void;
}
export interface ModScreen<Props = unknown> {
on_open?(): void;
on_tick?(dt: number): void;
on_render(g: Graphics): void;
// the server sent new props for this screen
on_props?(props: Props): void;
on_close?(): void;
// return true to keep the screen open when escape is pressed
on_escape?(): boolean;
}
export type Color = [number, number, number, number];
// immediate mode drawing, like the debug ui, styled with assets/sprites/ui.png
export interface Graphics {
readonly width: number;
readonly height: number;
readonly mouse: { x: number; y: number; down: boolean; pressed: boolean };
rect(x: number, y: number, w: number, h: number, color?: Color): void;
panel(x: number, y: number, w: number, h: number): void;
text(text: string, x: number, y: number, options?: { scale?: number; color?: Color }): void;
measure_text(text: string, scale?: number): number;
texture(id: Id, x: number, y: number, w: number, h: number): void;
item(id: Id, x: number, y: number, count?: number): void;
clip(x: number, y: number, w: number, h: number, draw: () => void): void;
button(label: string, x: number, y: number, w: number, h: number): boolean;
text_input(id: string, x: number, y: number, w: number): string;
slider(id: string, x: number, y: number, w: number, min: number, max: number): number;
// server synced slots, same rules as container screens
slots(container: string, layout: { slot: number; x: number; y: number }[], x: number, y: number): void;
key_pressed(key: KeyCode): boolean;
}
export interface ClientUi {
register_screen<Props>(id: Id, create: (props: Props) => ModScreen<Props>): void;
// open a screen that doesn't involve the server, like a settings page
open<Props>(id: Id, props: Props): void;
}
export interface HudRegistry {
register(id: Id, element: { on_render(g: Graphics): void }): void;
}
export interface ClientNet {
on<T = unknown>(channel: Id, handler: (data: T) => void): void;
send(channel: Id, data: unknown): void;
}