65 lines
2.5 KiB
TypeScript
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;
|
|
}
|