UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

81 lines (80 loc) 8.47 kB
import { BlockIdsType } from "./BlockIdsType.es.js"; import { Blocks_exports } from "./Blocks.es.js"; import BlockRegisterEvent from "../events/block/BlockRegisterEvent.es.js"; import Timer from "../utils/Timer.es.js"; //#region src/block/BlockManager.ts var BlockManager = class { server; blocks = /* @__PURE__ */ new Map(); javaBlocks = /* @__PURE__ */ new Map(); constructor(server) { this.server = server; } /** * On enable hook. * @group Lifecycle */ async enable() { await this.importBlocks(); } /** * On disable hook. * @group Lifecycle */ async disable() { this.blocks.clear(); } /** * Get block by namespaced ID. */ getBlock(name) { if (!this.blocks.has(name) && !this.javaBlocks.has(name)) throw new Error(`invalid block with id ${name}`); return this.blocks.get(name) || this.javaBlocks.get(name); } /** * Get block by numeric ID. */ getBlockById(id) { if (!BlockIdsType[id]) throw new Error(`invalid block with numeric id ${id}`); return this.getBlocks().find((a) => a.getId() === id && a.meta === 0); } /** * Get block by numeric id and meta value. */ getBlockByIdAndMeta(id, meta) { return this.getBlocks().find((a) => a.id === id && a.meta === meta) || null; } /** * Get all blocks. * * @returns all registered blocks. */ getBlocks() { return Array.from(this.blocks.values()); } /** * Register a block. * * @param block - The block */ async registerBlock(block) { if (this.blocks.get(block.name) || this.getBlockByIdAndMeta(block.getId(), block.getMeta())) throw new Error(`Block with id ${block.getName()} (${block.getId()}:${block.getMeta()}) already exists`); const event = new BlockRegisterEvent(block); await this.server.emit("blockRegister", event); if (event.isCancelled()) return; this.server.getLogger().debug(`Block with id §b${block.name}§r registered`); this.blocks.set(block.name, block); this.javaBlocks.set(block.javaName, block); } /** * Register blocks exported by './Blocks' */ async importBlocks() { const timer = new Timer(); await Promise.all(Object.entries(Blocks_exports).map(async ([, block]) => this.registerBlock(new block()))); this.server.getLogger().verbose(`Registered §b${this.blocks.size}§r block(s) (took §e${timer.stop()} ms§r)!`); } }; //#endregion export { BlockManager as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2tNYW5hZ2VyLmVzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ibG9jay9CbG9ja01hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgQmxvY2tzIGZyb20gJy4vQmxvY2tzJztcblxuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4uL1NlcnZlcic7XG5pbXBvcnQgQmxvY2tSZWdpc3RlckV2ZW50IGZyb20gJy4uL2V2ZW50cy9ibG9jay9CbG9ja1JlZ2lzdGVyRXZlbnQnO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4uL3V0aWxzL1RpbWVyJztcbmltcG9ydCB0eXBlIHsgQmxvY2sgfSBmcm9tICcuL0Jsb2NrJztcbmltcG9ydCB7IEJsb2NrSWRzVHlwZSB9IGZyb20gJy4vQmxvY2tJZHNUeXBlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmxvY2tNYW5hZ2VyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlcnZlcjogU2VydmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYmxvY2tzID0gbmV3IE1hcCgpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgamF2YUJsb2NrcyA9IG5ldyBNYXAoKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXJ2ZXI6IFNlcnZlcikge1xuICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBlbmFibGUgaG9vay5cbiAgICAgKiBAZ3JvdXAgTGlmZWN5Y2xlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGVuYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbXBvcnRCbG9ja3MoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBkaXNhYmxlIGhvb2suXG4gICAgICogQGdyb3VwIExpZmVjeWNsZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkaXNhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmJsb2Nrcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBibG9jayBieSBuYW1lc3BhY2VkIElELlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCbG9jayhuYW1lOiBzdHJpbmcpOiBCbG9jayB7XG4gICAgICAgIGlmICghdGhpcy5ibG9ja3MuaGFzKG5hbWUpICYmICF0aGlzLmphdmFCbG9ja3MuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYmxvY2sgd2l0aCBpZCAke25hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHRoaXMuYmxvY2tzLmdldChuYW1lKSB8fCB0aGlzLmphdmFCbG9ja3MuZ2V0KG5hbWUpKSBhcyBCbG9jaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYmxvY2sgYnkgbnVtZXJpYyBJRC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmxvY2tCeUlkKGlkOiBudW1iZXIpOiBCbG9jayB7XG4gICAgICAgIGlmICghQmxvY2tJZHNUeXBlW2lkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGJsb2NrIHdpdGggbnVtZXJpYyBpZCAke2lkfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QmxvY2tzKCkuZmluZCgoYSkgPT4gYS5nZXRJZCgpID09PSBpZCAmJiBhLm1ldGEgPT09IDApITtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYmxvY2sgYnkgbnVtZXJpYyBpZCBhbmQgbWV0YSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmxvY2tCeUlkQW5kTWV0YShpZDogbnVtYmVyLCBtZXRhOiBudW1iZXIpOiBCbG9jayB8IG51bGwge1xuICAgICAgICBjb25zdCBibG9jayA9IHRoaXMuZ2V0QmxvY2tzKCkuZmluZCgoYSkgPT4gYS5pZCA9PT0gaWQgJiYgYS5tZXRhID09PSBtZXRhKTtcbiAgICAgICAgcmV0dXJuIGJsb2NrIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBibG9ja3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBhbGwgcmVnaXN0ZXJlZCBibG9ja3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEJsb2NrcygpOiBCbG9ja1tdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5ibG9ja3MudmFsdWVzKCkpIGFzIEJsb2NrW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBibG9jay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBibG9jayAtIFRoZSBibG9ja1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlckJsb2NrKGJsb2NrOiBCbG9jaykge1xuICAgICAgICBpZiAodGhpcy5ibG9ja3MuZ2V0KGJsb2NrLm5hbWUpIHx8IHRoaXMuZ2V0QmxvY2tCeUlkQW5kTWV0YShibG9jay5nZXRJZCgpLCBibG9jay5nZXRNZXRhKCkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCbG9jayB3aXRoIGlkICR7YmxvY2suZ2V0TmFtZSgpfSAoJHtibG9jay5nZXRJZCgpfToke2Jsb2NrLmdldE1ldGEoKX0pIGFscmVhZHkgZXhpc3RzYCk7XG5cbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQmxvY2tSZWdpc3RlckV2ZW50KGJsb2NrKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXJ2ZXIuZW1pdCgnYmxvY2tSZWdpc3RlcicsIGV2ZW50KTtcbiAgICAgICAgaWYgKGV2ZW50LmlzQ2FuY2VsbGVkKCkpIHJldHVybjtcblxuICAgICAgICB0aGlzLnNlcnZlci5nZXRMb2dnZXIoKS5kZWJ1ZyhgQmxvY2sgd2l0aCBpZCDCp2Ike2Jsb2NrLm5hbWV9wqdyIHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgdGhpcy5ibG9ja3Muc2V0KGJsb2NrLm5hbWUsIGJsb2NrKTtcbiAgICAgICAgdGhpcy5qYXZhQmxvY2tzLnNldChibG9jay5qYXZhTmFtZSwgYmxvY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGJsb2NrcyBleHBvcnRlZCBieSAnLi9CbG9ja3MnXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBpbXBvcnRCbG9ja3MoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gbmV3IFRpbWVyKCk7XG5cbiAgICAgICAgLy8gRHluYW1pY2FsbHkgcmVnaXN0ZXIgYmxvY2tzXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKE9iamVjdC5lbnRyaWVzKEJsb2NrcykubWFwKGFzeW5jIChbLCBibG9ja10pID0+IHRoaXMucmVnaXN0ZXJCbG9jayhuZXcgYmxvY2soKSkpKTtcblxuICAgICAgICB0aGlzLnNlcnZlci5nZXRMb2dnZXIoKS52ZXJib3NlKGBSZWdpc3RlcmVkIMKnYiR7dGhpcy5ibG9ja3Muc2l6ZX3Cp3IgYmxvY2socykgKHRvb2sgwqdlJHt0aW1lci5zdG9wKCl9IG1zwqdyKSFgKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBUUEsSUFBcUIsZUFBckIsTUFBa0M7Q0FDOUI7Q0FDQSx5QkFBMEIsSUFBSSxJQUFJO0NBQ2xDLDZCQUE4QixJQUFJLElBQUk7Q0FFdEMsWUFBbUIsUUFBZ0I7RUFDL0IsS0FBSyxTQUFTO0NBQ2xCOzs7OztDQU1BLE1BQWEsU0FBd0I7RUFDakMsTUFBTSxLQUFLLGFBQWE7Q0FDNUI7Ozs7O0NBTUEsTUFBYSxVQUF5QjtFQUNsQyxLQUFLLE9BQU8sTUFBTTtDQUN0Qjs7OztDQUtBLFNBQWdCLE1BQXFCO0VBQ2pDLElBQUksQ0FBQyxLQUFLLE9BQU8sSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLFdBQVcsSUFBSSxJQUFJLEdBQ25ELE1BQU0sSUFBSSxNQUFNLHlCQUF5QixNQUFNO0VBR25ELE9BQVEsS0FBSyxPQUFPLElBQUksSUFBSSxLQUFLLEtBQUssV0FBVyxJQUFJLElBQUk7Q0FDN0Q7Ozs7Q0FLQSxhQUFvQixJQUFtQjtFQUNuQyxJQUFJLENBQUMsYUFBYSxLQUNkLE1BQU0sSUFBSSxNQUFNLGlDQUFpQyxJQUFJO0VBR3pELE9BQU8sS0FBSyxVQUFVLEVBQUUsTUFBTSxNQUFNLEVBQUUsTUFBTSxNQUFNLE1BQU0sRUFBRSxTQUFTLENBQUM7Q0FDeEU7Ozs7Q0FLQSxvQkFBMkIsSUFBWSxNQUE0QjtFQUUvRCxPQURjLEtBQUssVUFBVSxFQUFFLE1BQU0sTUFBTSxFQUFFLE9BQU8sTUFBTSxFQUFFLFNBQVMsSUFDOUQsS0FBUztDQUNwQjs7Ozs7O0NBT0EsWUFBNEI7RUFDeEIsT0FBTyxNQUFNLEtBQUssS0FBSyxPQUFPLE9BQU8sQ0FBQztDQUMxQzs7Ozs7O0NBT0EsTUFBYSxjQUFjLE9BQWM7RUFDckMsSUFBSSxLQUFLLE9BQU8sSUFBSSxNQUFNLElBQUksS0FBSyxLQUFLLG9CQUFvQixNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxHQUN0RixNQUFNLElBQUksTUFBTSxpQkFBaUIsTUFBTSxRQUFRLEVBQUUsSUFBSSxNQUFNLE1BQU0sRUFBRSxHQUFHLE1BQU0sUUFBUSxFQUFFLGlCQUFpQjtFQUUzRyxNQUFNLFFBQVEsSUFBSSxtQkFBbUIsS0FBSztFQUMxQyxNQUFNLEtBQUssT0FBTyxLQUFLLGlCQUFpQixLQUFLO0VBQzdDLElBQUksTUFBTSxZQUFZLEdBQUc7RUFFekIsS0FBSyxPQUFPLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixNQUFNLEtBQUssY0FBYztFQUMxRSxLQUFLLE9BQU8sSUFBSSxNQUFNLE1BQU0sS0FBSztFQUNqQyxLQUFLLFdBQVcsSUFBSSxNQUFNLFVBQVUsS0FBSztDQUM3Qzs7OztDQUtBLE1BQWMsZUFBZTtFQUN6QixNQUFNLFFBQVEsSUFBSSxNQUFNO0VBR3hCLE1BQU0sUUFBUSxJQUFJLE9BQU8sUUFBUSxjQUFNLEVBQUUsSUFBSSxPQUFPLEdBQUcsV0FBVyxLQUFLLGNBQWMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO0VBRWxHLEtBQUssT0FBTyxVQUFVLEVBQUUsUUFBUSxnQkFBZ0IsS0FBSyxPQUFPLEtBQUssc0JBQXNCLE1BQU0sS0FBSyxFQUFFLFFBQVE7Q0FDaEg7QUFDSiJ9