Furnace
This commit is contained in:
@@ -1,18 +1,12 @@
|
||||
import { System } from "$/common/ecs/mod.ts";
|
||||
import { ClientWorld } from "../client_world.ts";
|
||||
import { Dimension } from "../components/dimension.ts";
|
||||
import { Camera, screen_to_world } from "../components/camera.ts";
|
||||
import { InputManager } from "../input_manager.ts";
|
||||
import { canvas } from "../renderer/mod.ts";
|
||||
import { TICK_DELTA, TILE_SIZE } from "$/common/constants.ts";
|
||||
import { TICK_DELTA } from "$/common/constants.ts";
|
||||
import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.ts";
|
||||
import { Position } from "$/common/components/position.ts";
|
||||
import { distance_point_rectangle } from "../../common/utils.ts";
|
||||
|
||||
export class DimensionLogicSystem extends System {
|
||||
update(world: ClientWorld, delta: number): void {
|
||||
/*const dimension_entity = world.get_entities().values().find((ent) => ent.get(Dimension));
|
||||
const dimension = dimension_entity!.get(Dimension)!;
|
||||
const dimension = world.dimension;
|
||||
|
||||
dimension.second_timer += delta;
|
||||
dimension.tick_timer += delta;
|
||||
@@ -23,74 +17,26 @@ export class DimensionLogicSystem extends System {
|
||||
if (dimension.tick_timer >= TICK_DELTA) {
|
||||
this.handle_tick(world, dimension);
|
||||
}
|
||||
|
||||
const [player] = world.get_tag("player")!;
|
||||
const player_position = player.get(Position)!;
|
||||
const camera = player.get(Camera)!;
|
||||
|
||||
const mouse = InputManager.get_mouse_position();
|
||||
|
||||
const world_mouse = screen_to_world(
|
||||
mouse.x,
|
||||
mouse.y,
|
||||
camera,
|
||||
canvas.width,
|
||||
canvas.height,
|
||||
);
|
||||
|
||||
const tile_x = Math.floor(world_mouse.x / TILE_SIZE);
|
||||
const tile_y = Math.floor(world_mouse.y / TILE_SIZE);
|
||||
|
||||
const tile = dimension.tiles.findLast((tile) => tile.x === tile_x && tile.y === tile_y);
|
||||
|
||||
if (tile) {
|
||||
const tile_info = EverythingRegistry.get<TileRegistry>("blocks", tile.id);
|
||||
|
||||
if (!tile_info) {
|
||||
return;
|
||||
}
|
||||
|
||||
const distance_to_player = distance_point_rectangle(
|
||||
player_position.x + (72 / 2),
|
||||
player_position.y + (72 / 2),
|
||||
tile.x * TILE_SIZE,
|
||||
tile.y * TILE_SIZE,
|
||||
TILE_SIZE,
|
||||
TILE_SIZE,
|
||||
);
|
||||
if (distance_to_player > TILE_SIZE * 2) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (tile_info.on_interact || tile_info.on_click) {
|
||||
if (tile_info.on_interact && InputManager.is_mouse_pressed(2)) {
|
||||
InputManager.consume_mouse(2);
|
||||
tile_info.on_interact(world, tile);
|
||||
}
|
||||
if (tile_info.on_click && InputManager.is_mouse_pressed(0)) {
|
||||
InputManager.consume_mouse(0);
|
||||
tile_info.on_click(world, tile);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
handle_second(world: ClientWorld, dimension: Dimension) {
|
||||
const tickables = dimension.blocks.filter((t) => t.tickable);
|
||||
for (const tickable of tickables) {
|
||||
const tile_info = EverythingRegistry.get<BlockRegistry>("blocks", tickable.id);
|
||||
if (tile_info && tile_info.on_second) {
|
||||
tile_info.on_second(world, tickable, dimension.second_timer);
|
||||
for (const chunk of dimension.chunks) {
|
||||
for (const tickable of chunk.blocks_data) {
|
||||
const tile_info = EverythingRegistry.get<BlockRegistry>("blocks", tickable.id);
|
||||
if (tile_info && tile_info.on_second) {
|
||||
tile_info.on_second(world.dimension, tickable, dimension.second_timer);
|
||||
}
|
||||
}
|
||||
}
|
||||
dimension.second_timer = 0;
|
||||
}
|
||||
|
||||
handle_tick(world: ClientWorld, dimension: Dimension) {
|
||||
const tickables = dimension.blocks.filter((t) => t.tickable);
|
||||
for (const tickable of tickables) {
|
||||
const tile_info = EverythingRegistry.get<BlockRegistry>("blocks", tickable.id);
|
||||
if (tile_info && tile_info.on_tick) {
|
||||
tile_info.on_tick(world, tickable, dimension.tick_timer);
|
||||
for (const chunk of dimension.chunks) {
|
||||
for (const tickable of chunk.blocks_data) {
|
||||
const tile_info = EverythingRegistry.get<BlockRegistry>("blocks", tickable.id);
|
||||
if (tile_info && tile_info.on_tick) {
|
||||
tile_info.on_tick(world.dimension, tickable, dimension.tick_timer);
|
||||
}
|
||||
}
|
||||
}
|
||||
dimension.tick_timer = 0;
|
||||
|
||||
@@ -8,6 +8,7 @@ import { Position } from "../../common/components/position.ts";
|
||||
import { PlayerComponent } from "../player.ts";
|
||||
import { GuiPlayerInventory } from "../gui/gui_player_inventory.ts";
|
||||
import { CollisionCuboid } from "../components/collision.ts";
|
||||
import { BlockRegistry, EverythingRegistry, ItemRegistry } from "$/common/everything_registry.ts";
|
||||
|
||||
export class PlayerControlsSystem extends System {
|
||||
constructor() {
|
||||
@@ -96,28 +97,44 @@ export class PlayerControlsSystem extends System {
|
||||
InputManager.set_mouse_grabbed(player_component.screens.length === 0);
|
||||
|
||||
const block = world.dimension.get_looked_block(world.dimension, camera);
|
||||
if (block) {
|
||||
if (block && player_component.screens.length === 0) {
|
||||
if (InputManager.is_mouse_pressed(0)) {
|
||||
world.dimension.break_block(block.x, block.y, block.z);
|
||||
} else if (InputManager.is_mouse_pressed(2)) {
|
||||
const inventory = player_component.player_inventory;
|
||||
const hotbar_slot = inventory.container.get_slot(inventory.hotbar_selected);
|
||||
if (hotbar_slot.has_item()) {
|
||||
const FACE_OFFSETS = {
|
||||
top: { x: 0, y: 1, z: 0 },
|
||||
bottom: { x: 0, y: -1, z: 0 },
|
||||
north: { x: 0, y: 0, z: -1 },
|
||||
south: { x: 0, y: 0, z: 1 },
|
||||
west: { x: -1, y: 0, z: 0 },
|
||||
east: { x: 1, y: 0, z: 0 },
|
||||
};
|
||||
const offset = FACE_OFFSETS[block.face];
|
||||
world.dimension.add_block({
|
||||
x: block.x + offset.x,
|
||||
y: block.y + offset.y,
|
||||
z: block.z + offset.z,
|
||||
id: "bworld:glass",
|
||||
// interact if possible
|
||||
const block_info = EverythingRegistry.get_by_id<BlockRegistry>("blocks", block.block);
|
||||
if (block_info && block_info.on_interact) {
|
||||
block_info.on_interact(world.dimension, {
|
||||
x: block.x,
|
||||
y: block.y,
|
||||
z: block.z,
|
||||
id: block_info.id,
|
||||
});
|
||||
} else {
|
||||
const inventory = player_component.player_inventory;
|
||||
const hotbar_slot = inventory.container.get_slot(inventory.hotbar_selected);
|
||||
if (hotbar_slot && hotbar_slot.has_item()) {
|
||||
const item = hotbar_slot.get_item()!;
|
||||
const item_info = EverythingRegistry.get<ItemRegistry>("items", item.type_id);
|
||||
if (item_info && item_info.block_id) {
|
||||
const FACE_OFFSETS = {
|
||||
top: { x: 0, y: 1, z: 0 },
|
||||
bottom: { x: 0, y: -1, z: 0 },
|
||||
north: { x: 0, y: 0, z: -1 },
|
||||
south: { x: 0, y: 0, z: 1 },
|
||||
west: { x: -1, y: 0, z: 0 },
|
||||
east: { x: 1, y: 0, z: 0 },
|
||||
};
|
||||
const offset = FACE_OFFSETS[block.face];
|
||||
world.dimension.add_block({
|
||||
x: block.x + offset.x,
|
||||
y: block.y + offset.y,
|
||||
z: block.z + offset.z,
|
||||
id: item_info.block_id,
|
||||
});
|
||||
hotbar_slot.amount! -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user