Chat
This commit is contained in:
@@ -80,7 +80,9 @@ const block = EverythingRegistry.register<BlockRegistry>("blocks", "bworld:furna
|
|||||||
if (block_data && block_data.data.inventory) {
|
if (block_data && block_data.data.inventory) {
|
||||||
const gui = new GuiFurnace(block_data.data.inventory, player_component.player_inventory, block_data.data);
|
const gui = new GuiFurnace(block_data.data.inventory, player_component.player_inventory, block_data.data);
|
||||||
player_component.screens.push(gui);
|
player_component.screens.push(gui);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
},
|
},
|
||||||
on_create(dimension, block) {
|
on_create(dimension, block) {
|
||||||
dimension.add_block_data({
|
dimension.add_block_data({
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { BlockRegistry, EverythingRegistry } from "$/common/everything_registry.
|
|||||||
import { register_block_item } from "$/common/utils.ts";
|
import { register_block_item } from "$/common/utils.ts";
|
||||||
|
|
||||||
const block = EverythingRegistry.register<BlockRegistry>("blocks", "bworld:glass", {
|
const block = EverythingRegistry.register<BlockRegistry>("blocks", "bworld:glass", {
|
||||||
|
id: "bworld:glass",
|
||||||
textures: "bworld:glass",
|
textures: "bworld:glass",
|
||||||
has_collision: true,
|
has_collision: true,
|
||||||
transparent: true,
|
transparent: true,
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ EverythingRegistry.register<BlockRegistry>("blocks", "bworld:grass", {
|
|||||||
if (item?.type_id === "bworld:hoe") {
|
if (item?.type_id === "bworld:hoe") {
|
||||||
block.id = "bworld:hoed_dirt";
|
block.id = "bworld:hoed_dirt";
|
||||||
dimension.add_block(block);
|
dimension.add_block(block);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ export class PlayerControls extends Component {
|
|||||||
hotbar_9: KeyCode = "Digit9";
|
hotbar_9: KeyCode = "Digit9";
|
||||||
|
|
||||||
open_inventory: KeyCode = "KeyE";
|
open_inventory: KeyCode = "KeyE";
|
||||||
|
open_chat: KeyCode = "KeyT";
|
||||||
|
|
||||||
open_debug: KeyCode = "F3";
|
open_debug: KeyCode = "F3";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,131 @@
|
|||||||
|
import { GuiScreen } from "./gui_screen.ts";
|
||||||
|
import { canvas, draw_rect, draw_text, measure_text } from "$/client/renderer/mod.ts";
|
||||||
|
import { InputManager } from "../input_manager.ts";
|
||||||
|
import { ClientWorld } from "../client_world.ts";
|
||||||
|
import { PlayerComponent } from "../player.ts";
|
||||||
|
import { ItemStack } from "../inventory.ts";
|
||||||
|
|
||||||
|
export class GuiChat extends GuiScreen {
|
||||||
|
world: ClientWorld;
|
||||||
|
|
||||||
|
text_typed = "";
|
||||||
|
caret = 0;
|
||||||
|
key_repeat_timer = 0;
|
||||||
|
show_caret = true;
|
||||||
|
|
||||||
|
constructor(world: ClientWorld) {
|
||||||
|
super();
|
||||||
|
this.world = world;
|
||||||
|
}
|
||||||
|
|
||||||
|
override on_render(): void {
|
||||||
|
draw_rect(0, 0, canvas.width, canvas.height, [0, 0, 0, 0.8]);
|
||||||
|
|
||||||
|
const y = canvas.height - 32;
|
||||||
|
draw_rect(0, y, canvas.width, canvas.height, [0, 0, 0, 0.4]);
|
||||||
|
|
||||||
|
draw_text(this.text_typed, 0, y, 2, [1, 1, 1]);
|
||||||
|
|
||||||
|
if (this.show_caret) {
|
||||||
|
const before_text = this.text_typed.substring(0, this.caret);
|
||||||
|
const caret_x = 0 + measure_text(before_text, 2);
|
||||||
|
|
||||||
|
draw_rect(caret_x, y + 4, 1, 32 - 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override on_tick(_delta: number): void {
|
||||||
|
const now = performance.now();
|
||||||
|
const repeat_delay = 400;
|
||||||
|
const repeat_rate = 40;
|
||||||
|
|
||||||
|
const allow_repeat = () => {
|
||||||
|
if (InputManager.is_key_pressed("Backspace")) {
|
||||||
|
this.key_repeat_timer = now;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (InputManager.is_key_down("Backspace")) {
|
||||||
|
if (now - this.key_repeat_timer > repeat_delay) {
|
||||||
|
this.key_repeat_timer = now - (repeat_delay - repeat_rate);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (allow_repeat()) {
|
||||||
|
if (this.caret > 0) {
|
||||||
|
this.text_typed = this.text_typed.slice(0, this.caret - 1) + this.text_typed.slice(this.caret);
|
||||||
|
this.caret -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (InputManager.is_key_pressed("Delete")) {
|
||||||
|
this.text_typed = this.text_typed.slice(0, this.caret) + this.text_typed.slice(this.caret + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (InputManager.is_key_pressed("ArrowLeft")) {
|
||||||
|
this.caret = Math.max(0, this.caret - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (InputManager.is_key_pressed("ArrowRight")) {
|
||||||
|
this.caret = Math.min(this.text_typed.length, this.caret + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (InputManager.is_key_pressed("Home")) {
|
||||||
|
this.caret = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (InputManager.is_key_pressed("End")) {
|
||||||
|
this.caret = this.text_typed.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
const typed = InputManager.get_typed_characters();
|
||||||
|
|
||||||
|
for (const char of typed) {
|
||||||
|
this.text_typed = this.text_typed.slice(0, this.caret) + char + this.text_typed.slice(this.caret);
|
||||||
|
this.caret += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (InputManager.is_key_pressed("Enter")) {
|
||||||
|
this.submit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
override on_close(): void {}
|
||||||
|
|
||||||
|
submit() {
|
||||||
|
if (this.text_typed.startsWith("/")) {
|
||||||
|
this.command();
|
||||||
|
} else {
|
||||||
|
// we dont have multiplayer lol?
|
||||||
|
}
|
||||||
|
this.text_typed = "";
|
||||||
|
|
||||||
|
const [player] = this.world.get_tag("player")!;
|
||||||
|
const player_component = player.get(PlayerComponent);
|
||||||
|
if (player_component) {
|
||||||
|
player_component.pop_screen();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
command() {
|
||||||
|
if (this.text_typed.startsWith("/give")) {
|
||||||
|
let [_, item_id, quantity] = this.text_typed.split(" ");
|
||||||
|
|
||||||
|
if (!item_id.includes(":")) {
|
||||||
|
item_id = `bworld:${item_id}`;
|
||||||
|
}
|
||||||
|
if (quantity === undefined) {
|
||||||
|
quantity = "1";
|
||||||
|
}
|
||||||
|
|
||||||
|
const [player] = this.world.get_tag("player")!;
|
||||||
|
const player_component = player.get(PlayerComponent);
|
||||||
|
if (player_component) {
|
||||||
|
player_component.player_inventory.container.add_item(new ItemStack(item_id, Number(quantity)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Inventory, PlayerInventory } from "../inventory.ts";
|
import { Inventory, PlayerInventory } from "../inventory.ts";
|
||||||
import { add_player_hotbar, add_player_inventory, GuiScreen, Slot } from "./gui_screen.ts";
|
import { add_player_hotbar, add_player_inventory, GuiInventoryScreen, Slot } from "./gui_screen.ts";
|
||||||
import { canvas, draw_rect, Texture } from "$/client/renderer/mod.ts";
|
import { canvas, draw_rect, Texture } from "$/client/renderer/mod.ts";
|
||||||
import { AssetManager } from "../assets.ts";
|
import { AssetManager } from "../assets.ts";
|
||||||
import { SLOT_SIZE } from "../../common/constants.ts";
|
import { SLOT_SIZE } from "../../common/constants.ts";
|
||||||
@@ -7,7 +7,7 @@ import { draw_nine_slice } from "../systems/rendering/render_utils.ts";
|
|||||||
|
|
||||||
const PADDING = 10;
|
const PADDING = 10;
|
||||||
|
|
||||||
export class GuiChest extends GuiScreen {
|
export class GuiChest extends GuiInventoryScreen {
|
||||||
override inventory_width = PADDING * 2 + SLOT_SIZE * 9;
|
override inventory_width = PADDING * 2 + SLOT_SIZE * 9;
|
||||||
override inventory_height = PADDING * 4 + SLOT_SIZE * 7;
|
override inventory_height = PADDING * 4 + SLOT_SIZE * 7;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Inventory, PlayerInventory } from "../inventory.ts";
|
import { Inventory, PlayerInventory } from "../inventory.ts";
|
||||||
import { add_player_hotbar, add_player_inventory, GuiScreen, Slot } from "./gui_screen.ts";
|
import { add_player_hotbar, add_player_inventory, GuiInventoryScreen, Slot } from "./gui_screen.ts";
|
||||||
import { canvas, draw_rect, draw_text, Texture } from "$/client/renderer/mod.ts";
|
import { canvas, draw_rect, draw_text, Texture } from "$/client/renderer/mod.ts";
|
||||||
import { AssetManager } from "../assets.ts";
|
import { AssetManager } from "../assets.ts";
|
||||||
import { SLOT_SIZE } from "../../common/constants.ts";
|
import { SLOT_SIZE } from "../../common/constants.ts";
|
||||||
@@ -7,7 +7,7 @@ import { draw_nine_slice } from "../systems/rendering/render_utils.ts";
|
|||||||
|
|
||||||
const PADDING = 10;
|
const PADDING = 10;
|
||||||
|
|
||||||
export class GuiFurnace extends GuiScreen<Inventory, { fuel: number; progress: number }> {
|
export class GuiFurnace extends GuiInventoryScreen<Inventory, { fuel: number; progress: number }> {
|
||||||
override inventory_width = PADDING * 2 + SLOT_SIZE * 9;
|
override inventory_width = PADDING * 2 + SLOT_SIZE * 9;
|
||||||
override inventory_height = PADDING * 4 + SLOT_SIZE * 7;
|
override inventory_height = PADDING * 4 + SLOT_SIZE * 7;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { Container, Inventory, ItemStack, PlayerInventory } from "../inventory.ts";
|
import { Container, Inventory, ItemStack, PlayerInventory } from "../inventory.ts";
|
||||||
import { add_player_hotbar, add_player_inventory, GuiScreen, Slot } from "./gui_screen.ts";
|
import { add_player_hotbar, add_player_inventory, GuiInventoryScreen, Slot } from "./gui_screen.ts";
|
||||||
import { canvas, draw_rect, Texture } from "$/client/renderer/mod.ts";
|
import { canvas, draw_rect, Texture } from "$/client/renderer/mod.ts";
|
||||||
import { AssetManager } from "../assets.ts";
|
import { AssetManager } from "../assets.ts";
|
||||||
import { SLOT_SIZE } from "../../common/constants.ts";
|
import { SLOT_SIZE } from "../../common/constants.ts";
|
||||||
@@ -33,7 +33,7 @@ const recipes: CraftingRecipe[] = [
|
|||||||
|
|
||||||
const PADDING = 10;
|
const PADDING = 10;
|
||||||
|
|
||||||
export class GuiPlayerInventory extends GuiScreen {
|
export class GuiPlayerInventory extends GuiInventoryScreen {
|
||||||
override inventory_width = PADDING * 2 + SLOT_SIZE * 9;
|
override inventory_width = PADDING * 2 + SLOT_SIZE * 9;
|
||||||
override inventory_height = PADDING * 2 + SLOT_SIZE * 4 + PADDING + SLOT_SIZE * 3 + PADDING;
|
override inventory_height = PADDING * 2 + SLOT_SIZE * 4 + PADDING + SLOT_SIZE * 3 + PADDING;
|
||||||
|
|
||||||
|
|||||||
@@ -25,14 +25,22 @@ export class Slot {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class GuiScreen<Inv extends Inventory = Inventory, Properties = Record<string, unknown> | undefined> {
|
export abstract class GuiScreen {
|
||||||
|
x: number = 0;
|
||||||
|
y: number = 0;
|
||||||
|
|
||||||
|
abstract on_tick(_delta: number): void;
|
||||||
|
abstract on_render(): void;
|
||||||
|
abstract on_close(): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class GuiInventoryScreen<Inv extends Inventory = Inventory, Properties = Record<string, unknown> | undefined>
|
||||||
|
extends GuiScreen {
|
||||||
inventory: Inv;
|
inventory: Inv;
|
||||||
player_inventory: PlayerInventory;
|
player_inventory: PlayerInventory;
|
||||||
properties: Properties;
|
properties: Properties;
|
||||||
|
|
||||||
slots: Slot[] = [];
|
slots: Slot[] = [];
|
||||||
x: number = 0;
|
|
||||||
y: number = 0;
|
|
||||||
inventory_width: number = 500;
|
inventory_width: number = 500;
|
||||||
inventory_height: number = 500;
|
inventory_height: number = 500;
|
||||||
|
|
||||||
@@ -41,6 +49,7 @@ export class GuiScreen<Inv extends Inventory = Inventory, Properties = Record<st
|
|||||||
player_inventory: PlayerInventory,
|
player_inventory: PlayerInventory,
|
||||||
properties: Properties,
|
properties: Properties,
|
||||||
) {
|
) {
|
||||||
|
super();
|
||||||
this.inventory = inventory;
|
this.inventory = inventory;
|
||||||
this.player_inventory = player_inventory;
|
this.player_inventory = player_inventory;
|
||||||
this.properties = properties;
|
this.properties = properties;
|
||||||
@@ -245,7 +254,7 @@ export class GuiScreen<Inv extends Inventory = Inventory, Properties = Record<st
|
|||||||
// generic methods that is often needed
|
// generic methods that is often needed
|
||||||
|
|
||||||
export function add_player_inventory(
|
export function add_player_inventory(
|
||||||
handler: GuiScreen,
|
handler: GuiInventoryScreen,
|
||||||
player_inventory: PlayerInventory,
|
player_inventory: PlayerInventory,
|
||||||
offset_x: number,
|
offset_x: number,
|
||||||
offset_y: number,
|
offset_y: number,
|
||||||
@@ -265,7 +274,7 @@ export function add_player_inventory(
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function add_player_hotbar(
|
export function add_player_hotbar(
|
||||||
handler: GuiScreen,
|
handler: GuiInventoryScreen,
|
||||||
player_inventory: PlayerInventory,
|
player_inventory: PlayerInventory,
|
||||||
offset_x: number,
|
offset_x: number,
|
||||||
offset_y: number,
|
offset_y: number,
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ import { PlayerComponent } from "../player.ts";
|
|||||||
import { GuiPlayerInventory } from "../gui/gui_player_inventory.ts";
|
import { GuiPlayerInventory } from "../gui/gui_player_inventory.ts";
|
||||||
import { CollisionCuboid } from "../components/collision.ts";
|
import { CollisionCuboid } from "../components/collision.ts";
|
||||||
import { BlockRegistry, EverythingRegistry, ItemRegistry } from "$/common/everything_registry.ts";
|
import { BlockRegistry, EverythingRegistry, ItemRegistry } from "$/common/everything_registry.ts";
|
||||||
|
import { GuiChat } from "../gui/gui_chat.ts";
|
||||||
|
import { GuiInventoryScreen } from "../gui/gui_screen.ts";
|
||||||
|
|
||||||
export class PlayerControlsSystem extends System {
|
export class PlayerControlsSystem extends System {
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -23,56 +25,68 @@ export class PlayerControlsSystem extends System {
|
|||||||
const position = player.get(Position)!;
|
const position = player.get(Position)!;
|
||||||
const camera = player.get(Camera)!;
|
const camera = player.get(Camera)!;
|
||||||
|
|
||||||
let input_x = 0;
|
if (player_component.screens.length === 0) {
|
||||||
let input_z = 0;
|
let input_x = 0;
|
||||||
|
let input_z = 0;
|
||||||
|
|
||||||
if (InputManager.is_key_down(controls.move_left)) {
|
if (InputManager.is_key_down(controls.move_left)) {
|
||||||
input_x -= 1;
|
input_x -= 1;
|
||||||
}
|
}
|
||||||
if (InputManager.is_key_down(controls.move_right)) {
|
if (InputManager.is_key_down(controls.move_right)) {
|
||||||
input_x += 1;
|
input_x += 1;
|
||||||
}
|
}
|
||||||
if (InputManager.is_key_down(controls.move_forward)) {
|
if (InputManager.is_key_down(controls.move_forward)) {
|
||||||
input_z -= 1;
|
input_z -= 1;
|
||||||
}
|
}
|
||||||
if (InputManager.is_key_down(controls.move_backwards)) {
|
if (InputManager.is_key_down(controls.move_backwards)) {
|
||||||
input_z += 1;
|
input_z += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const size = Math.hypot(input_x, input_z);
|
const size = Math.hypot(input_x, input_z);
|
||||||
if (size > 0) {
|
if (size > 0) {
|
||||||
input_x /= size;
|
input_x /= size;
|
||||||
input_z /= size;
|
input_z /= size;
|
||||||
}
|
}
|
||||||
|
|
||||||
const sin = Math.sin(camera.yaw);
|
const sin = Math.sin(camera.yaw);
|
||||||
const cos = Math.cos(camera.yaw);
|
const cos = Math.cos(camera.yaw);
|
||||||
|
|
||||||
const forwardX = sin;
|
const forwardX = sin;
|
||||||
const forwardZ = cos;
|
const forwardZ = cos;
|
||||||
|
|
||||||
const rightX = cos;
|
const rightX = cos;
|
||||||
const rightZ = -sin;
|
const rightZ = -sin;
|
||||||
|
|
||||||
const speed_modifier = InputManager.is_key_down(controls.sprint_key) ? 1.75 : 1;
|
const speed_modifier = InputManager.is_key_down(controls.sprint_key) ? 1.75 : 1;
|
||||||
|
|
||||||
velocity.vx = (forwardX * input_z + rightX * input_x) * controls.move_speed * speed_modifier;
|
velocity.vx = (forwardX * input_z + rightX * input_x) * controls.move_speed * speed_modifier;
|
||||||
velocity.vz = (forwardZ * input_z + rightZ * input_x) * controls.move_speed * speed_modifier;
|
velocity.vz = (forwardZ * input_z + rightZ * input_x) * controls.move_speed * speed_modifier;
|
||||||
|
|
||||||
const cuboid = player.get(CollisionCuboid);
|
const cuboid = player.get(CollisionCuboid);
|
||||||
|
|
||||||
if (InputManager.is_key_down("Space") && cuboid?.colliding_y === 1) {
|
if (InputManager.is_key_down("Space") && cuboid?.colliding_y === 1) {
|
||||||
velocity.vy += controls.jump_force;
|
velocity.vy += controls.jump_force;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (InputManager.is_key_pressed(controls.open_inventory)) {
|
if (InputManager.is_key_pressed(controls.open_inventory)) {
|
||||||
if (player_component.screens.length === 0) {
|
if (player_component.screens.length === 0) {
|
||||||
player_component.screens.push(new GuiPlayerInventory(player_component.player_inventory));
|
player_component.screens.push(new GuiPlayerInventory(player_component.player_inventory));
|
||||||
} else {
|
} else if (player_component.screens.at(-1) instanceof GuiInventoryScreen) {
|
||||||
player_component.pop_screen();
|
player_component.pop_screen();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (InputManager.is_key_pressed(controls.open_chat)) {
|
||||||
|
if (player_component.screens.length === 0) {
|
||||||
|
player_component.screens.push(new GuiChat(world));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (InputManager.is_key_pressed("Escape")) {
|
||||||
|
player_component.pop_screen();
|
||||||
|
}
|
||||||
|
|
||||||
if (InputManager.is_key_pressed(controls.open_debug)) {
|
if (InputManager.is_key_pressed(controls.open_debug)) {
|
||||||
world.debugging = !world.debugging;
|
world.debugging = !world.debugging;
|
||||||
}
|
}
|
||||||
@@ -103,14 +117,13 @@ export class PlayerControlsSystem extends System {
|
|||||||
} else if (InputManager.is_mouse_pressed(2)) {
|
} else if (InputManager.is_mouse_pressed(2)) {
|
||||||
// interact if possible
|
// interact if possible
|
||||||
const block_info = EverythingRegistry.get_by_id<BlockRegistry>("blocks", block.block);
|
const block_info = EverythingRegistry.get_by_id<BlockRegistry>("blocks", block.block);
|
||||||
if (block_info && block_info.on_interact) {
|
const interacted = block_info?.on_interact?.(world.dimension, {
|
||||||
block_info.on_interact(world.dimension, {
|
x: block.x,
|
||||||
x: block.x,
|
y: block.y,
|
||||||
y: block.y,
|
z: block.z,
|
||||||
z: block.z,
|
id: block_info.id,
|
||||||
id: block_info.id,
|
});
|
||||||
});
|
if (!interacted) {
|
||||||
} else {
|
|
||||||
const inventory = player_component.player_inventory;
|
const inventory = player_component.player_inventory;
|
||||||
const hotbar_slot = inventory.container.get_slot(inventory.hotbar_selected);
|
const hotbar_slot = inventory.container.get_slot(inventory.hotbar_selected);
|
||||||
if (hotbar_slot && hotbar_slot.has_item()) {
|
if (hotbar_slot && hotbar_slot.has_item()) {
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ export interface BlockRegistry {
|
|||||||
on_create?(dimension: Dimension, block: Block): void;
|
on_create?(dimension: Dimension, block: Block): void;
|
||||||
on_break?(dimension: Dimension, block: Block): void;
|
on_break?(dimension: Dimension, block: Block): void;
|
||||||
on_click?(dimension: Dimension, block: Block): void;
|
on_click?(dimension: Dimension, block: Block): void;
|
||||||
on_interact?(dimension: Dimension, block: Block): void;
|
on_interact?(dimension: Dimension, block: Block): boolean;
|
||||||
on_tick?(dimension: Dimension, block: Block, tick_delta: number): void;
|
on_tick?(dimension: Dimension, block: Block, tick_delta: number): void;
|
||||||
on_second?(dimension: Dimension, block: Block, second_delta: number): void;
|
on_second?(dimension: Dimension, block: Block, second_delta: number): void;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user