diff --git a/client/components/dimension.ts b/client/components/dimension.ts index e339cf9..07cf1bb 100644 --- a/client/components/dimension.ts +++ b/client/components/dimension.ts @@ -138,7 +138,7 @@ export class Dimension extends Component { ) as BlockData; } - break_block(x: number, y: number, z: number) { + break_block(x: number, y: number, z: number, drop_item: boolean = true) { const block_chunk_x = Math.floor(x / CHUNK_SIZE); const block_chunk_z = Math.floor(z / CHUNK_SIZE); const chunk = this.get_chunk(block_chunk_x, block_chunk_z); @@ -148,7 +148,7 @@ export class Dimension extends Component { const block_info = EverythingRegistry.get_by_id("blocks", this.get_block(x, y, z))!; - if (block_info.drop_table) { + if (drop_item && block_info.drop_table) { const [player] = this.world.get_tag("player")!; const player_component = player.get(PlayerComponent)!; player_component.player_inventory.container.add_item(new ItemStack(block_info.drop_table)); diff --git a/client/items/axe.ts b/client/items/axe.ts index 987f26f..ca9c362 100644 --- a/client/items/axe.ts +++ b/client/items/axe.ts @@ -2,4 +2,5 @@ import { EverythingRegistry, ItemRegistry } from "$/common/everything_registry.t EverythingRegistry.register("items", "bworld:axe", { texture_id: "bworld:axe", + tool_type: "axe", }); diff --git a/client/items/wood_pickaxe.ts b/client/items/wood_pickaxe.ts index 67a0ed0..7ac7b5f 100644 --- a/client/items/wood_pickaxe.ts +++ b/client/items/wood_pickaxe.ts @@ -2,4 +2,5 @@ import { EverythingRegistry, ItemRegistry } from "$/common/everything_registry.t EverythingRegistry.register("items", "bworld:wood_pickaxe", { texture_id: "bworld:wood_pickaxe", + tool_type: "pickaxe", }); diff --git a/client/systems/player_controls.ts b/client/systems/player_controls.ts index 19c1335..5fc6469 100644 --- a/client/systems/player_controls.ts +++ b/client/systems/player_controls.ts @@ -119,15 +119,25 @@ export class PlayerControlsSystem extends System { } const block = world.dimension.get_looked_block(world.dimension, camera); + const holding_item = player_component.player_inventory.container.get_item( + player_component.player_inventory.hotbar_selected, + ); + const holding_item_info = EverythingRegistry.get("items", holding_item?.type_id ?? ""); if (block && player_component.screens.length === 0) { const block_info = EverythingRegistry.get_by_id("blocks", block.block)!; if (player_component.breaking_block) { player_component.breaking_block = { x: block.x, y: block.y, z: block.z }; player_component.break_progress_max = block_info.toughness ?? 9999; - player_component.break_progress += delta; + let multiplier = 1; + if (holding_item_info?.tool_type === block_info.tool_to_break) { + multiplier *= 2; + } + player_component.break_progress += delta * multiplier; if (player_component.break_progress >= player_component.break_progress_max) { - world.dimension.break_block(block.x, block.y, block.z); + const drop_item = !block_info.requires_tool || + holding_item_info?.tool_type === block_info.tool_to_break; + world.dimension.break_block(block.x, block.y, block.z, drop_item); player_component.break_progress_max = 0; player_component.break_progress = 0; } @@ -166,6 +176,10 @@ export class PlayerControlsSystem extends System { } } } + } else { + player_component.breaking_block = undefined; + player_component.break_progress_max = 0; + player_component.break_progress = 0; } if (player_component.screens.length === 0) { diff --git a/common/everything_registry.ts b/common/everything_registry.ts index 1df32a2..b2f11bb 100644 --- a/common/everything_registry.ts +++ b/common/everything_registry.ts @@ -107,6 +107,7 @@ export interface BlockRegistry { export interface ItemRegistry { texture_id: string | ((item: ItemStack) => string); block_id?: string; + tool_type?: string; place?(dimension: Dimension, block: Block): void;