diff --git a/client/blocks/chest.ts b/client/blocks/chest.ts index 6ecbd07..3871f3b 100644 --- a/client/blocks/chest.ts +++ b/client/blocks/chest.ts @@ -7,12 +7,15 @@ interface TileChestData { inventory: Inventory; } -EverythingRegistry.register>("blocks", "bworld:chest", { +EverythingRegistry.register("blocks", "bworld:chest", { id: "bworld:chest", textures: "bworld:chest", - has_collision: false, + toughness: 10, + requires_tool: false, + tool_to_break: "axe", - on_interact(dimension, tile) { + has_collision: false, + /*on_interact(dimension, tile) { const [player] = dimension.world.get_tag("player")!; const player_component = player.get(PlayerComponent)!; if (tile.data && tile.data.inventory) { @@ -21,5 +24,5 @@ EverythingRegistry.register>("blocks", "bworld:ches }, on_create(_, tile) { tile.data = { inventory: new Inventory(new Container(9 * 3)) }; - }, + },*/ }); diff --git a/client/blocks/coal_ore.ts b/client/blocks/coal_ore.ts index ee8d5fc..3a67e96 100644 --- a/client/blocks/coal_ore.ts +++ b/client/blocks/coal_ore.ts @@ -6,6 +6,9 @@ const block = EverythingRegistry.register("blocks", "bworld:coal_ textures: "bworld:stone_coal", has_collision: true, drop_table: "bworld:coal_ore", + toughness: 5, + requires_tool: true, + tool_to_break: "pickaxe", }); register_block_item(block); diff --git a/client/blocks/copper_ore.ts b/client/blocks/copper_ore.ts index ed6222e..f9cd529 100644 --- a/client/blocks/copper_ore.ts +++ b/client/blocks/copper_ore.ts @@ -6,6 +6,9 @@ const block = EverythingRegistry.register("blocks", "bworld:coppe textures: "bworld:stone_copper", has_collision: true, drop_table: "bworld:copper_ore", + toughness: 5, + requires_tool: true, + tool_to_break: "pickaxe", }); register_block_item(block); diff --git a/client/blocks/dirt.ts b/client/blocks/dirt.ts index 44a9f37..75938ab 100644 --- a/client/blocks/dirt.ts +++ b/client/blocks/dirt.ts @@ -7,6 +7,9 @@ const block = EverythingRegistry.register("blocks", "bworld:dirt" textures: "bworld:dirt", has_collision: false, drop_table: "bworld:dirt", + toughness: 2, + requires_tool: false, + tool_to_break: "shovel", on_interact(dimension, block) { const [player] = dimension.world.get_tag("player")!; @@ -14,7 +17,9 @@ const block = EverythingRegistry.register("blocks", "bworld:dirt" const maybe_item = player_inventory.container.get_item(player_inventory.hotbar_selected); if (maybe_item && maybe_item.type_id === "bworld:hoe") { dimension.add_block({ x: block.x, y: block.y, z: block.z, id: "bworld:hoed_dirt" }); + return true; } + return false; }, }); diff --git a/client/blocks/furnace.ts b/client/blocks/furnace.ts index 062974c..7f27359 100644 --- a/client/blocks/furnace.ts +++ b/client/blocks/furnace.ts @@ -123,6 +123,9 @@ const block = EverythingRegistry.register("blocks", "bworld:furna textures: { front: "bworld:furnace", side: "bworld:stone" }, has_collision: true, drop_table: "bworld:furnace", + toughness: 5, + requires_tool: true, + tool_to_break: "pickaxe", on_interact(dimension, block) { const [player] = dimension.world.get_tag("player")!; diff --git a/client/blocks/glass.ts b/client/blocks/glass.ts index 9b30bef..428f1ac 100644 --- a/client/blocks/glass.ts +++ b/client/blocks/glass.ts @@ -6,6 +6,9 @@ const block = EverythingRegistry.register("blocks", "bworld:glass textures: "bworld:glass", has_collision: true, transparent: true, + toughness: 3, + requires_tool: false, + tool_to_break: "pickaxe", }); register_block_item(block); diff --git a/client/blocks/gold_ore.ts b/client/blocks/gold_ore.ts index 2ffa421..84a5955 100644 --- a/client/blocks/gold_ore.ts +++ b/client/blocks/gold_ore.ts @@ -6,6 +6,9 @@ const block = EverythingRegistry.register("blocks", "bworld:gold_ textures: "bworld:stone_gold", has_collision: true, drop_table: "bworld:gold_ore", + toughness: 5, + requires_tool: true, + tool_to_break: "pickaxe", }); register_block_item(block); diff --git a/client/blocks/grass.ts b/client/blocks/grass.ts index 9c808e8..158c5e7 100644 --- a/client/blocks/grass.ts +++ b/client/blocks/grass.ts @@ -6,6 +6,9 @@ EverythingRegistry.register("blocks", "bworld:grass", { textures: { top: "bworld:grass_top", bottom: "bworld:dirt", "side": "bworld:grass_side" }, has_collision: false, drop_table: "bworld:dirt", + toughness: 2, + requires_tool: false, + tool_to_break: "shovel", on_interact(dimension, block) { const [player] = dimension.world.get_tag("player")!; diff --git a/client/blocks/hoed_dirt.ts b/client/blocks/hoed_dirt.ts index 09f6205..38a0af3 100644 --- a/client/blocks/hoed_dirt.ts +++ b/client/blocks/hoed_dirt.ts @@ -7,6 +7,9 @@ const block = EverythingRegistry.register("blocks", "bworld:hoed_ textures: { side: "bworld:dirt", top: "bworld:hoed_dirt", bottom: "bworld:dirt" }, has_collision: false, drop_table: "bworld:dirt", + toughness: 5, + requires_tool: false, + tool_to_break: "shovel", }); register_block_item(block); diff --git a/client/blocks/iron_ore.ts b/client/blocks/iron_ore.ts index 501c710..345f15e 100644 --- a/client/blocks/iron_ore.ts +++ b/client/blocks/iron_ore.ts @@ -6,6 +6,9 @@ const block = EverythingRegistry.register("blocks", "bworld:iron_ textures: "bworld:stone_iron", has_collision: true, drop_table: "bworld:iron_ore", + toughness: 5, + requires_tool: true, + tool_to_break: "pickaxe", }); register_block_item(block); diff --git a/client/blocks/leaves.ts b/client/blocks/leaves.ts index 853ba14..5ae0e7f 100644 --- a/client/blocks/leaves.ts +++ b/client/blocks/leaves.ts @@ -6,6 +6,9 @@ const block = EverythingRegistry.register("blocks", "bworld:leave textures: "bworld:leaves", has_collision: true, transparent: true, + toughness: 3, + requires_tool: false, + tool_to_break: "hoe", }); register_block_item(block); diff --git a/client/blocks/log.ts b/client/blocks/log.ts index 82b3d9e..0104d87 100644 --- a/client/blocks/log.ts +++ b/client/blocks/log.ts @@ -6,6 +6,9 @@ const block = EverythingRegistry.register("blocks", "bworld:log", textures: { side: "bworld:log_side", top: "bworld:log_top", bottom: "bworld:log_top" }, has_collision: true, drop_table: "bworld:log", + toughness: 3, + requires_tool: false, + tool_to_break: "axe", }); register_block_item(block); diff --git a/client/blocks/planks.ts b/client/blocks/planks.ts index c6b248e..8c735a8 100644 --- a/client/blocks/planks.ts +++ b/client/blocks/planks.ts @@ -6,6 +6,9 @@ const block = EverythingRegistry.register("blocks", "bworld:plank textures: "bworld:planks", has_collision: true, drop_table: "bworld:log", + toughness: 3, + requires_tool: false, + tool_to_break: "axe", }); register_block_item(block); diff --git a/client/blocks/sand.ts b/client/blocks/sand.ts index f61e721..be92179 100644 --- a/client/blocks/sand.ts +++ b/client/blocks/sand.ts @@ -1,11 +1,14 @@ import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts"; -import { register_block_item } from "../../common/utils.ts"; +import { register_block_item } from "$/common/utils.ts"; const block = EverythingRegistry.register("blocks", "bworld:sand", { id: "bworld:sand", textures: "bworld:sand", has_collision: true, drop_table: "bworld:sand", + toughness: 3, + requires_tool: false, + tool_to_break: "shovel", }); register_block_item(block); diff --git a/client/blocks/snow.ts b/client/blocks/snow.ts index ce8fab8..f9a01b4 100644 --- a/client/blocks/snow.ts +++ b/client/blocks/snow.ts @@ -5,6 +5,9 @@ const block = EverythingRegistry.register("blocks", "bworld:snow" id: "bworld:snow", textures: "bworld:snow", has_collision: true, + toughness: 2, + requires_tool: true, + tool_to_break: "shovel", }); register_block_item(block); diff --git a/client/blocks/stone.ts b/client/blocks/stone.ts index b1cebf1..d5abd89 100644 --- a/client/blocks/stone.ts +++ b/client/blocks/stone.ts @@ -6,6 +6,9 @@ const block = EverythingRegistry.register("blocks", "bworld:stone textures: "bworld:stone", has_collision: true, drop_table: "bworld:stone", + toughness: 3, + requires_tool: true, + tool_to_break: "pickaxe", }); register_block_item(block); diff --git a/client/blocks/tin_ore.ts b/client/blocks/tin_ore.ts index 4b55813..b08c366 100644 --- a/client/blocks/tin_ore.ts +++ b/client/blocks/tin_ore.ts @@ -6,6 +6,9 @@ const block = EverythingRegistry.register("blocks", "bworld:tin_o textures: "bworld:stone_tin", has_collision: true, drop_table: "bworld:tin_ore", + toughness: 5, + requires_tool: true, + tool_to_break: "pickaxe", }); register_block_item(block); diff --git a/client/player.ts b/client/player.ts index 0f68628..14e84d7 100644 --- a/client/player.ts +++ b/client/player.ts @@ -13,6 +13,10 @@ export class PlayerComponent extends Component { screens: GuiScreen[] = []; render_distance = 6; + breaking_block = false; + break_progress = 0; + break_progress_max = 0; + pop_screen() { const screen = this.screens.pop(); if (screen) { diff --git a/client/systems/player_controls.ts b/client/systems/player_controls.ts index cbbae82..f698502 100644 --- a/client/systems/player_controls.ts +++ b/client/systems/player_controls.ts @@ -17,7 +17,7 @@ export class PlayerControlsSystem extends System { super(); } - update(world: ClientWorld, _delta: number): void { + update(world: ClientWorld, delta: number): void { const [player] = world.get_tag("player")!; const velocity = player.get(Velocity)!; const controls = player.get(PlayerControls)!; @@ -110,13 +110,28 @@ export class PlayerControlsSystem extends System { InputManager.set_mouse_grabbed(player_component.screens.length === 0); + if (InputManager.is_mouse_down(0) && player_component.screens.length === 0) { + player_component.breaking_block = true; + } else { + player_component.breaking_block = false; + player_component.break_progress_max = 0; + player_component.break_progress = 0; + } + const block = world.dimension.get_looked_block(world.dimension, camera); + if (block && player_component.screens.length === 0) { - if (InputManager.is_mouse_pressed(0)) { - world.dimension.break_block(block.x, block.y, block.z); + const block_info = EverythingRegistry.get_by_id("blocks", block.block)!; + if (player_component.breaking_block) { + player_component.break_progress_max = block_info.toughness ?? 9999; + player_component.break_progress += delta; + if (player_component.break_progress >= player_component.break_progress_max) { + world.dimension.break_block(block.x, block.y, block.z); + player_component.break_progress_max = 0; + player_component.break_progress = 0; + } } else if (InputManager.is_mouse_pressed(2)) { // interact if possible - const block_info = EverythingRegistry.get_by_id("blocks", block.block); const interacted = block_info?.on_interact?.(world.dimension, { x: block.x, y: block.y, diff --git a/client/systems/rendering/player.ts b/client/systems/rendering/player.ts index c797c27..aa8b3e8 100644 --- a/client/systems/rendering/player.ts +++ b/client/systems/rendering/player.ts @@ -2,7 +2,8 @@ import { SLOT_SIZE } from "$/common/constants.ts"; import { AssetManager } from "$/client/assets.ts"; import { PlayerInventory } from "../../inventory.ts"; import { draw_item, draw_nine_slice } from "./render_utils.ts"; -import { canvas, draw_rect_stroke, Texture } from "$/client/renderer/mod.ts"; +import { canvas, draw_rect_stroke, push_back_face, Texture } from "$/client/renderer/mod.ts"; +import { PlayerComponent } from "../../player.ts"; const PADDING = 10; diff --git a/common/everything_registry.ts b/common/everything_registry.ts index 945cbb2..e3c84b0 100644 --- a/common/everything_registry.ts +++ b/common/everything_registry.ts @@ -69,6 +69,9 @@ export interface BlockRegistry { alpha?: number; has_collision: boolean; + toughness?: number; + requires_tool?: boolean; + tool_to_break?: string; drop_table?: string; on_create?(dimension: Dimension, block: Block): void;