Register items for blocks

This commit is contained in:
2026-03-26 11:07:41 -03:00
parent 6e6dd08af7
commit 188b7a4372
15 changed files with 71 additions and 100 deletions
+3 -2
View File
@@ -8,11 +8,12 @@ interface TileChestData {
} }
EverythingRegistry.register<BlockRegistry<TileChestData>>("blocks", "bworld:chest", { EverythingRegistry.register<BlockRegistry<TileChestData>>("blocks", "bworld:chest", {
id: "bworld:chest",
textures: "bworld:chest", textures: "bworld:chest",
has_collision: false, has_collision: false,
on_interact(world, tile) { on_interact(dimension, tile) {
const [player] = world.get_tag("player")!; const [player] = dimension.world.get_tag("player")!;
const player_component = player.get(PlayerComponent)!; const player_component = player.get(PlayerComponent)!;
if (tile.data && tile.data.inventory) { if (tile.data && tile.data.inventory) {
player_component.screens.push(new GuiChest(tile.data.inventory, player_component.player_inventory)); player_component.screens.push(new GuiChest(tile.data.inventory, player_component.player_inventory));
+4 -81
View File
@@ -1,8 +1,9 @@
import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; 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"; import { PlayerComponent } from "../player.ts";
EverythingRegistry.register<BlockRegistry>("blocks", "bworld:dirt", { const block = EverythingRegistry.register<BlockRegistry>("blocks", "bworld:dirt", {
id: "bworld:dirt",
textures: "bworld:dirt", textures: "bworld:dirt",
has_collision: false, has_collision: false,
drop_table: "bworld:dirt", drop_table: "bworld:dirt",
@@ -17,82 +18,4 @@ EverythingRegistry.register<BlockRegistry>("blocks", "bworld:dirt", {
}, },
}); });
EverythingRegistry.register<BlockRegistry>("blocks", "bworld:hoed_dirt", { register_block_item(block);
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<BlockRegistry>("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);
}
},
});
+4 -1
View File
@@ -1,7 +1,10 @@
import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts";
import { register_block_item } from "$/common/utils.ts";
EverythingRegistry.register<BlockRegistry>("blocks", "bworld:glass", { const block = EverythingRegistry.register<BlockRegistry>("blocks", "bworld:glass", {
textures: "bworld:glass", textures: "bworld:glass",
has_collision: true, has_collision: true,
transparent: true, transparent: true,
}); });
register_block_item(block);
+12
View File
@@ -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<BlockRegistry>("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);
+11
View File
@@ -0,0 +1,11 @@
import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts";
import { register_block_item } from "$/common/utils.ts";
const block = EverythingRegistry.register<BlockRegistry>("blocks", "bworld:leaves", {
id: "bworld:leaves",
textures: "bworld:leaves",
has_collision: true,
transparent: true,
});
register_block_item(block);
+4 -6
View File
@@ -1,13 +1,11 @@
import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts";
import { register_block_item } from "$/common/utils.ts";
EverythingRegistry.register<BlockRegistry>("blocks", "bworld:log", { const block = EverythingRegistry.register<BlockRegistry>("blocks", "bworld:log", {
id: "bworld:log",
textures: { side: "bworld:log_side", top: "bworld:log_top", bottom: "bworld:log_top" }, textures: { side: "bworld:log_side", top: "bworld:log_top", bottom: "bworld:log_top" },
has_collision: true, has_collision: true,
drop_table: "bworld:log", drop_table: "bworld:log",
}); });
EverythingRegistry.register<BlockRegistry>("blocks", "bworld:leaves", { register_block_item(block);
textures: "bworld:leaves",
has_collision: true,
transparent: true,
});
+2
View File
@@ -9,3 +9,5 @@ import "./log.ts";
import "./sand.ts"; import "./sand.ts";
import "./snow.ts"; import "./snow.ts";
import "./glass.ts"; import "./glass.ts";
import "./hoed_dirt.ts";
import "./leaves.ts";
+5 -1
View File
@@ -1,7 +1,11 @@
import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts";
import { register_block_item } from "../../common/utils.ts";
EverythingRegistry.register<BlockRegistry>("blocks", "bworld:sand", { const block = EverythingRegistry.register<BlockRegistry>("blocks", "bworld:sand", {
id: "bworld:sand",
textures: "bworld:sand", textures: "bworld:sand",
has_collision: true, has_collision: true,
drop_table: "bworld:sand", drop_table: "bworld:sand",
}); });
register_block_item(block);
+5 -1
View File
@@ -1,6 +1,10 @@
import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts";
import { register_block_item } from "$/common/utils.ts";
EverythingRegistry.register<BlockRegistry>("blocks", "bworld:snow", { const block = EverythingRegistry.register<BlockRegistry>("blocks", "bworld:snow", {
id: "bworld:snow",
textures: "bworld:snow", textures: "bworld:snow",
has_collision: true, has_collision: true,
}); });
register_block_item(block);
+5 -1
View File
@@ -1,7 +1,11 @@
import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts";
import { register_block_item } from "$/common/utils.ts";
EverythingRegistry.register<BlockRegistry>("blocks", "bworld:stone", { const block = EverythingRegistry.register<BlockRegistry>("blocks", "bworld:stone", {
id: "bworld:stone",
textures: "bworld:stone", textures: "bworld:stone",
has_collision: true, has_collision: true,
drop_table: "bworld:stone", drop_table: "bworld:stone",
}); });
register_block_item(block);
+1
View File
@@ -1,6 +1,7 @@
import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts";
EverythingRegistry.register<BlockRegistry>("blocks", "bworld:water", { EverythingRegistry.register<BlockRegistry>("blocks", "bworld:water", {
id: "bworld:water",
textures: "bworld:water", textures: "bworld:water",
has_collision: false, has_collision: false,
transparent: true, transparent: true,
-5
View File
@@ -1,5 +0,0 @@
import { EverythingRegistry, ItemRegistry } from "$/common/everything_registry.ts";
EverythingRegistry.register<ItemRegistry>("items", "bworld:dirt", {
texture_id: "bworld:dirt",
});
-1
View File
@@ -1,2 +1 @@
import "./watering_can.ts"; import "./watering_can.ts";
import "./dirt.ts";
+4 -1
View File
@@ -5,7 +5,7 @@ export class EverythingRegistry {
static #key_to_id = new Map<string, Map<string, number>>(); static #key_to_id = new Map<string, Map<string, number>>();
static #id_to_value = new Map<string, unknown[]>(); static #id_to_value = new Map<string, unknown[]>();
static register<T>(registry: string, key: string, value: T) { static register<T>(registry: string, key: string, value: T): T {
if (!this.#key_to_id.has(registry)) { if (!this.#key_to_id.has(registry)) {
this.#key_to_id.set(registry, new Map()); this.#key_to_id.set(registry, new Map());
this.#id_to_value.set(registry, []); this.#id_to_value.set(registry, []);
@@ -18,6 +18,8 @@ export class EverythingRegistry {
key_map.set(key, id); key_map.set(key, id);
values[id] = value; values[id] = value;
return value;
} }
static get<T>(registry: string, key: string): T | undefined { static get<T>(registry: string, key: string): T | undefined {
@@ -61,6 +63,7 @@ interface TextureFront {
} }
export interface BlockRegistry<T = unknown | undefined> { export interface BlockRegistry<T = unknown | undefined> {
id: string;
textures: string | TextureSideTopBottom | TextureFront; textures: string | TextureSideTopBottom | TextureFront;
transparent?: boolean; transparent?: boolean;
alpha?: number; alpha?: number;
+11
View File
@@ -1,5 +1,6 @@
import { AssetManager } from "../client/assets.ts"; import { AssetManager } from "../client/assets.ts";
import { SpriteRegion } from "./constants.ts"; import { SpriteRegion } from "./constants.ts";
import { BlockRegistry, EverythingRegistry, ItemRegistry } from "./everything_registry.ts";
export function point_inside_rec( export function point_inside_rec(
point_x: number, point_x: number,
@@ -43,3 +44,13 @@ export function distance_point_point(ax: number, ay: number, az: number, bx: num
const dz = az - bz; const dz = az - bz;
return dx * dx + dy * dy + dz * dz; 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<ItemRegistry>("items", block.id, {
texture_id,
});
}