// 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 }; // read only, what this client sees world: { get_block(x: number, y: number, z: number): Id | undefined }; log(...args: unknown[]): void; } export interface ModScreen { 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(id: Id, create: (props: Props) => ModScreen): void; // open a screen that doesn't involve the server, like a settings page open(id: Id, props: Props): void; } export interface HudRegistry { register(id: Id, element: { on_render(g: Graphics): void }): void; } export interface ClientNet { on(channel: Id, handler: (data: T) => void): void; send(channel: Id, data: unknown): void; }