import { Block, Dimension } from "$/client/components/dimension.ts"; import { ItemStack } from "$/client/inventory.ts"; export class EverythingRegistry { static #key_to_id = new Map>(); static #id_to_value = new Map(); static register(registry: string, key: string, value: T) { if (!this.#key_to_id.has(registry)) { this.#key_to_id.set(registry, new Map()); this.#id_to_value.set(registry, []); } const key_map = this.#key_to_id.get(registry)!; const values = this.#id_to_value.get(registry)!; const id = values.length + 1; key_map.set(key, id); values[id] = value; } static get(registry: string, key: string): T | undefined { const id = this.#key_to_id.get(registry)?.get(key); if (id === undefined) { return undefined; } return this.#id_to_value.get(registry)?.[id] as T; } static get_id(registry: string, key: string): number | undefined { return this.#key_to_id.get(registry)?.get(key); } static get_full(registry: string, key: string): [number, T] | undefined { const id = this.#key_to_id.get(registry)?.get(key); if (id === undefined) { return undefined; } return [id, this.#id_to_value.get(registry)?.[id] as T]; } static get_by_id(registry: string, id: number): T | undefined { return this.#id_to_value.get(registry)?.[id] as T; } static get_registry(registry: string): T[] { return this.#id_to_value.get(registry) as T[]; } } export interface TileRegistry { texture_id: string | ((tile: Block) => string); has_collision: boolean; transparent?: boolean; on_create?(dimension: Dimension, tile: Block): void; on_click?(dimension: Dimension, tile: Block): void; on_interact?(dimension: Dimension, tile: Block): void; on_tick?(dimension: Dimension, tile: Block, tick_delta: number): void; on_second?(dimension: Dimension, tile: Block, second_delta: number): void; } export interface ItemRegistry { texture_id: string | ((item: ItemStack) => string); on_create?(item: ItemStack): void; get_lore?(item: ItemStack): string; }