Tool
This commit is contained in:
@@ -138,7 +138,7 @@ export class Dimension extends Component {
|
|||||||
) as BlockData<T>;
|
) as BlockData<T>;
|
||||||
}
|
}
|
||||||
|
|
||||||
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_x = Math.floor(x / CHUNK_SIZE);
|
||||||
const block_chunk_z = Math.floor(z / CHUNK_SIZE);
|
const block_chunk_z = Math.floor(z / CHUNK_SIZE);
|
||||||
const chunk = this.get_chunk(block_chunk_x, block_chunk_z);
|
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<BlockRegistry>("blocks", this.get_block(x, y, z))!;
|
const block_info = EverythingRegistry.get_by_id<BlockRegistry>("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] = this.world.get_tag("player")!;
|
||||||
const player_component = player.get(PlayerComponent)!;
|
const player_component = player.get(PlayerComponent)!;
|
||||||
player_component.player_inventory.container.add_item(new ItemStack(block_info.drop_table));
|
player_component.player_inventory.container.add_item(new ItemStack(block_info.drop_table));
|
||||||
|
|||||||
@@ -2,4 +2,5 @@ import { EverythingRegistry, ItemRegistry } from "$/common/everything_registry.t
|
|||||||
|
|
||||||
EverythingRegistry.register<ItemRegistry>("items", "bworld:axe", {
|
EverythingRegistry.register<ItemRegistry>("items", "bworld:axe", {
|
||||||
texture_id: "bworld:axe",
|
texture_id: "bworld:axe",
|
||||||
|
tool_type: "axe",
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,4 +2,5 @@ import { EverythingRegistry, ItemRegistry } from "$/common/everything_registry.t
|
|||||||
|
|
||||||
EverythingRegistry.register<ItemRegistry>("items", "bworld:wood_pickaxe", {
|
EverythingRegistry.register<ItemRegistry>("items", "bworld:wood_pickaxe", {
|
||||||
texture_id: "bworld:wood_pickaxe",
|
texture_id: "bworld:wood_pickaxe",
|
||||||
|
tool_type: "pickaxe",
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -119,15 +119,25 @@ export class PlayerControlsSystem extends System {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const block = world.dimension.get_looked_block(world.dimension, camera);
|
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<ItemRegistry>("items", holding_item?.type_id ?? "");
|
||||||
|
|
||||||
if (block && player_component.screens.length === 0) {
|
if (block && player_component.screens.length === 0) {
|
||||||
const block_info = EverythingRegistry.get_by_id<BlockRegistry>("blocks", block.block)!;
|
const block_info = EverythingRegistry.get_by_id<BlockRegistry>("blocks", block.block)!;
|
||||||
if (player_component.breaking_block) {
|
if (player_component.breaking_block) {
|
||||||
player_component.breaking_block = { x: block.x, y: block.y, z: block.z };
|
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_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) {
|
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_max = 0;
|
||||||
player_component.break_progress = 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) {
|
if (player_component.screens.length === 0) {
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ export interface BlockRegistry {
|
|||||||
export interface ItemRegistry<T = unknown | undefined> {
|
export interface ItemRegistry<T = unknown | undefined> {
|
||||||
texture_id: string | ((item: ItemStack<T>) => string);
|
texture_id: string | ((item: ItemStack<T>) => string);
|
||||||
block_id?: string;
|
block_id?: string;
|
||||||
|
tool_type?: string;
|
||||||
|
|
||||||
place?(dimension: Dimension, block: Block): void;
|
place?(dimension: Dimension, block: Block): void;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user