diff --git a/client/blocks/chest.ts b/client/blocks/chest.ts index 38948d8..6ecbd07 100644 --- a/client/blocks/chest.ts +++ b/client/blocks/chest.ts @@ -8,11 +8,12 @@ interface TileChestData { } EverythingRegistry.register>("blocks", "bworld:chest", { + id: "bworld:chest", textures: "bworld:chest", has_collision: false, - on_interact(world, tile) { - const [player] = world.get_tag("player")!; + on_interact(dimension, tile) { + const [player] = dimension.world.get_tag("player")!; const player_component = player.get(PlayerComponent)!; if (tile.data && tile.data.inventory) { player_component.screens.push(new GuiChest(tile.data.inventory, player_component.player_inventory)); diff --git a/client/blocks/dirt.ts b/client/blocks/dirt.ts index bf53e65..44a9f37 100644 --- a/client/blocks/dirt.ts +++ b/client/blocks/dirt.ts @@ -1,8 +1,9 @@ import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; -import { WateringCanData } from "../items/watering_can.ts"; +import { register_block_item } from "$/common/utils.ts"; import { PlayerComponent } from "../player.ts"; -EverythingRegistry.register("blocks", "bworld:dirt", { +const block = EverythingRegistry.register("blocks", "bworld:dirt", { + id: "bworld:dirt", textures: "bworld:dirt", has_collision: false, drop_table: "bworld:dirt", @@ -17,82 +18,4 @@ EverythingRegistry.register("blocks", "bworld:dirt", { }, }); -EverythingRegistry.register("blocks", "bworld:hoed_dirt", { - textures: { side: "bworld:dirt", top: "bworld:hoed_dirt", bottom: "bworld:dirt" }, - has_collision: false, - drop_table: "bworld:dirt", - - on_click(world, tile) { - const [player] = world.get_tag("player")!; - const player_inventory = player.get(PlayerComponent)!.player_inventory; - const item = player_inventory.container.get_item(player_inventory.hotbar_selected); - if (!item) { - return; - } - - if (item.type_id === "bworld:pickaxe") { - tile.id = "bworld:dirt"; - } - }, - on_interact(world, tile) { - const [player] = world.get_tag("player")!; - const player_inventory = player.get(PlayerComponent)!.player_inventory; - const item = player_inventory.container.get_item(player_inventory.hotbar_selected); - if (!item) { - return; - } - - if (item.type_id === "bworld:watering_can") { - const data = item.data as WateringCanData; - if (data.water > 0) { - tile.id = "bworld:hoed_watered_dirt"; - data.water -= 1; - } - } - }, -}); - -EverythingRegistry.register("blocks", "bworld:hoed_watered_dirt", { - textures: "bworld:hoed_watered_dirt", - has_collision: false, - drop_table: "bworld:dirt", - - on_click(world, tile) { - const [player] = world.get_tag("player")!; - const player_inventory = player.get(PlayerComponent)!.player_inventory; - const item = player_inventory.container.get_item(player_inventory.hotbar_selected); - if (!item) { - return; - } - - if (item.type_id === "bworld:pickaxe") { - tile.id = "bworld:dirt"; - } - }, - on_interact(world, tile) { - const [player] = world.get_tag("player")!; - const player_inventory = player.get(PlayerComponent)!.player_inventory; - const item = player_inventory.container.get_item(player_inventory.hotbar_selected); - if (!item) { - return; - } - - if (item.type_id === "bworld:tomato_seeds") { - world.dimension.add_block(world, { x: tile.x, y: tile.y, id: "bworld:tomato_crop", tickable: true }); - item.amount -= 1; - player_inventory.container.set_item(player_inventory.hotbar_selected, item); - } else if (item.type_id === "bworld:potato_seeds") { - world.dimension.add_block(world, { x: tile.x, y: tile.y, id: "bworld:potato_crop", tickable: true }); - item.amount -= 1; - player_inventory.container.set_item(player_inventory.hotbar_selected, item); - } else if (item.type_id === "bworld:pumpkin_seeds") { - world.dimension.add_block(world, { x: tile.x, y: tile.y, id: "bworld:pumpkin_crop", tickable: true }); - item.amount -= 1; - player_inventory.container.set_item(player_inventory.hotbar_selected, item); - } else if (item.type_id === "bworld:carrot_seeds") { - world.dimension.add_block(world, { x: tile.x, y: tile.y, id: "bworld:carrot_crop", tickable: true }); - item.amount -= 1; - player_inventory.container.set_item(player_inventory.hotbar_selected, item); - } - }, -}); +register_block_item(block); diff --git a/client/blocks/glass.ts b/client/blocks/glass.ts index 17f27d9..32a800c 100644 --- a/client/blocks/glass.ts +++ b/client/blocks/glass.ts @@ -1,7 +1,10 @@ import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; +import { register_block_item } from "$/common/utils.ts"; -EverythingRegistry.register("blocks", "bworld:glass", { +const block = EverythingRegistry.register("blocks", "bworld:glass", { textures: "bworld:glass", has_collision: true, transparent: true, }); + +register_block_item(block); diff --git a/client/blocks/hoed_dirt.ts b/client/blocks/hoed_dirt.ts new file mode 100644 index 0000000..09f6205 --- /dev/null +++ b/client/blocks/hoed_dirt.ts @@ -0,0 +1,12 @@ +import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; +import { register_block_item } from "$/common/utils.ts"; + +// TODO: watered state +const block = EverythingRegistry.register("blocks", "bworld:hoed_dirt", { + id: "bworld:hoed_dirt", + textures: { side: "bworld:dirt", top: "bworld:hoed_dirt", bottom: "bworld:dirt" }, + has_collision: false, + drop_table: "bworld:dirt", +}); + +register_block_item(block); diff --git a/client/blocks/leaves.ts b/client/blocks/leaves.ts new file mode 100644 index 0000000..853ba14 --- /dev/null +++ b/client/blocks/leaves.ts @@ -0,0 +1,11 @@ +import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; +import { register_block_item } from "$/common/utils.ts"; + +const block = EverythingRegistry.register("blocks", "bworld:leaves", { + id: "bworld:leaves", + textures: "bworld:leaves", + has_collision: true, + transparent: true, +}); + +register_block_item(block); diff --git a/client/blocks/log.ts b/client/blocks/log.ts index 459959d..82b3d9e 100644 --- a/client/blocks/log.ts +++ b/client/blocks/log.ts @@ -1,13 +1,11 @@ import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; +import { register_block_item } from "$/common/utils.ts"; -EverythingRegistry.register("blocks", "bworld:log", { +const block = EverythingRegistry.register("blocks", "bworld:log", { + id: "bworld:log", textures: { side: "bworld:log_side", top: "bworld:log_top", bottom: "bworld:log_top" }, has_collision: true, drop_table: "bworld:log", }); -EverythingRegistry.register("blocks", "bworld:leaves", { - textures: "bworld:leaves", - has_collision: true, - transparent: true, -}); +register_block_item(block); diff --git a/client/blocks/mod.ts b/client/blocks/mod.ts index d77a8a0..d1d96f3 100644 --- a/client/blocks/mod.ts +++ b/client/blocks/mod.ts @@ -9,3 +9,5 @@ import "./log.ts"; import "./sand.ts"; import "./snow.ts"; import "./glass.ts"; +import "./hoed_dirt.ts"; +import "./leaves.ts"; diff --git a/client/blocks/sand.ts b/client/blocks/sand.ts index 55c6931..f61e721 100644 --- a/client/blocks/sand.ts +++ b/client/blocks/sand.ts @@ -1,7 +1,11 @@ import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; +import { register_block_item } from "../../common/utils.ts"; -EverythingRegistry.register("blocks", "bworld:sand", { +const block = EverythingRegistry.register("blocks", "bworld:sand", { + id: "bworld:sand", textures: "bworld:sand", has_collision: true, drop_table: "bworld:sand", }); + +register_block_item(block); diff --git a/client/blocks/snow.ts b/client/blocks/snow.ts index 7909d1a..ce8fab8 100644 --- a/client/blocks/snow.ts +++ b/client/blocks/snow.ts @@ -1,6 +1,10 @@ import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; +import { register_block_item } from "$/common/utils.ts"; -EverythingRegistry.register("blocks", "bworld:snow", { +const block = EverythingRegistry.register("blocks", "bworld:snow", { + id: "bworld:snow", textures: "bworld:snow", has_collision: true, }); + +register_block_item(block); diff --git a/client/blocks/stone.ts b/client/blocks/stone.ts index a46e792..b1cebf1 100644 --- a/client/blocks/stone.ts +++ b/client/blocks/stone.ts @@ -1,7 +1,11 @@ import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; +import { register_block_item } from "$/common/utils.ts"; -EverythingRegistry.register("blocks", "bworld:stone", { +const block = EverythingRegistry.register("blocks", "bworld:stone", { + id: "bworld:stone", textures: "bworld:stone", has_collision: true, drop_table: "bworld:stone", }); + +register_block_item(block); diff --git a/client/blocks/water.ts b/client/blocks/water.ts index 76f66e4..a6373c7 100644 --- a/client/blocks/water.ts +++ b/client/blocks/water.ts @@ -1,6 +1,7 @@ import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; EverythingRegistry.register("blocks", "bworld:water", { + id: "bworld:water", textures: "bworld:water", has_collision: false, transparent: true, diff --git a/client/items/dirt.ts b/client/items/dirt.ts deleted file mode 100644 index 48bc91f..0000000 --- a/client/items/dirt.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { EverythingRegistry, ItemRegistry } from "$/common/everything_registry.ts"; - -EverythingRegistry.register("items", "bworld:dirt", { - texture_id: "bworld:dirt", -}); diff --git a/client/items/mod.ts b/client/items/mod.ts index 109cfa4..3436f6a 100644 --- a/client/items/mod.ts +++ b/client/items/mod.ts @@ -1,2 +1 @@ import "./watering_can.ts"; -import "./dirt.ts"; diff --git a/common/everything_registry.ts b/common/everything_registry.ts index fca1c01..7e6caa6 100644 --- a/common/everything_registry.ts +++ b/common/everything_registry.ts @@ -5,7 +5,7 @@ export class EverythingRegistry { static #key_to_id = new Map>(); static #id_to_value = new Map(); - static register(registry: string, key: string, value: T) { + static register(registry: string, key: string, value: T): T { if (!this.#key_to_id.has(registry)) { this.#key_to_id.set(registry, new Map()); this.#id_to_value.set(registry, []); @@ -18,6 +18,8 @@ export class EverythingRegistry { key_map.set(key, id); values[id] = value; + + return value; } static get(registry: string, key: string): T | undefined { @@ -61,6 +63,7 @@ interface TextureFront { } export interface BlockRegistry { + id: string; textures: string | TextureSideTopBottom | TextureFront; transparent?: boolean; alpha?: number; diff --git a/common/utils.ts b/common/utils.ts index 1115078..da4238b 100644 --- a/common/utils.ts +++ b/common/utils.ts @@ -1,5 +1,6 @@ import { AssetManager } from "../client/assets.ts"; import { SpriteRegion } from "./constants.ts"; +import { BlockRegistry, EverythingRegistry, ItemRegistry } from "./everything_registry.ts"; export function point_inside_rec( point_x: number, @@ -43,3 +44,13 @@ export function distance_point_point(ax: number, ay: number, az: number, bx: num const dz = az - bz; return dx * dx + dy * dy + dz * dz; } + +export function register_block_item(block: BlockRegistry) { + let texture_id = "bworld:missing"; + if (typeof block.textures === "string") { + texture_id = block.textures; + } + EverythingRegistry.register("items", block.id, { + texture_id, + }); +}