UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

91 lines (86 loc) 10.3 kB
'use strict'; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } }); const block_Blocks = require('./Blocks.cjs.cjs'); const events_block_BlockRegisterEvent = require('../events/block/BlockRegisterEvent.cjs.cjs'); const utils_Timer = require('../utils/Timer.cjs.cjs'); const block_BlockIdsType = require('./BlockIdsType.cjs.cjs'); class BlockManager { 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 (!block_BlockIdsType.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) { const block = this.getBlocks().find((a) => a.id === id && a.meta === meta); return block || 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 events_block_BlockRegisterEvent.default(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 utils_Timer.default(); await Promise.all(Object.entries(block_Blocks).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)!`); } } exports.default = BlockManager; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2tNYW5hZ2VyLmNqcy5janMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ibG9jay9CbG9ja01hbmFnZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgQmxvY2tzIGZyb20gJy4vQmxvY2tzJztcblxuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4uL1NlcnZlcic7XG5pbXBvcnQgQmxvY2tSZWdpc3RlckV2ZW50IGZyb20gJy4uL2V2ZW50cy9ibG9jay9CbG9ja1JlZ2lzdGVyRXZlbnQnO1xuaW1wb3J0IFRpbWVyIGZyb20gJy4uL3V0aWxzL1RpbWVyJztcbmltcG9ydCB0eXBlIHsgQmxvY2sgfSBmcm9tICcuL0Jsb2NrJztcbmltcG9ydCB7IEJsb2NrSWRzVHlwZSB9IGZyb20gJy4vQmxvY2tJZHNUeXBlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmxvY2tNYW5hZ2VyIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlcnZlcjogU2VydmVyO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYmxvY2tzID0gbmV3IE1hcCgpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgamF2YUJsb2NrcyA9IG5ldyBNYXAoKTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXJ2ZXI6IFNlcnZlcikge1xuICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBlbmFibGUgaG9vay5cbiAgICAgKiBAZ3JvdXAgTGlmZWN5Y2xlXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGVuYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbXBvcnRCbG9ja3MoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbiBkaXNhYmxlIGhvb2suXG4gICAgICogQGdyb3VwIExpZmVjeWNsZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBkaXNhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmJsb2Nrcy5jbGVhcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBibG9jayBieSBuYW1lc3BhY2VkIElELlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCbG9jayhuYW1lOiBzdHJpbmcpOiBCbG9jayB7XG4gICAgICAgIGlmICghdGhpcy5ibG9ja3MuaGFzKG5hbWUpICYmICF0aGlzLmphdmFCbG9ja3MuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYmxvY2sgd2l0aCBpZCAke25hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHRoaXMuYmxvY2tzLmdldChuYW1lKSB8fCB0aGlzLmphdmFCbG9ja3MuZ2V0KG5hbWUpKSBhcyBCbG9jaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYmxvY2sgYnkgbnVtZXJpYyBJRC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmxvY2tCeUlkKGlkOiBudW1iZXIpOiBCbG9jayB7XG4gICAgICAgIGlmICghQmxvY2tJZHNUeXBlW2lkXSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGJsb2NrIHdpdGggbnVtZXJpYyBpZCAke2lkfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QmxvY2tzKCkuZmluZCgoYSkgPT4gYS5nZXRJZCgpID09PSBpZCAmJiBhLm1ldGEgPT09IDApITtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYmxvY2sgYnkgbnVtZXJpYyBpZCBhbmQgbWV0YSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmxvY2tCeUlkQW5kTWV0YShpZDogbnVtYmVyLCBtZXRhOiBudW1iZXIpOiBCbG9jayB8IG51bGwge1xuICAgICAgICBjb25zdCBibG9jayA9IHRoaXMuZ2V0QmxvY2tzKCkuZmluZCgoYSkgPT4gYS5pZCA9PT0gaWQgJiYgYS5tZXRhID09PSBtZXRhKTtcbiAgICAgICAgcmV0dXJuIGJsb2NrIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCBibG9ja3MuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBhbGwgcmVnaXN0ZXJlZCBibG9ja3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEJsb2NrcygpOiBCbG9ja1tdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5ibG9ja3MudmFsdWVzKCkpIGFzIEJsb2NrW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXIgYSBibG9jay5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBibG9jayAtIFRoZSBibG9ja1xuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyByZWdpc3RlckJsb2NrKGJsb2NrOiBCbG9jaykge1xuICAgICAgICBpZiAodGhpcy5ibG9ja3MuZ2V0KGJsb2NrLm5hbWUpIHx8IHRoaXMuZ2V0QmxvY2tCeUlkQW5kTWV0YShibG9jay5nZXRJZCgpLCBibG9jay5nZXRNZXRhKCkpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBCbG9jayB3aXRoIGlkICR7YmxvY2suZ2V0TmFtZSgpfSAoJHtibG9jay5nZXRJZCgpfToke2Jsb2NrLmdldE1ldGEoKX0pIGFscmVhZHkgZXhpc3RzYCk7XG5cbiAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQmxvY2tSZWdpc3RlckV2ZW50KGJsb2NrKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXJ2ZXIuZW1pdCgnYmxvY2tSZWdpc3RlcicsIGV2ZW50KTtcbiAgICAgICAgaWYgKGV2ZW50LmlzQ2FuY2VsbGVkKCkpIHJldHVybjtcblxuICAgICAgICB0aGlzLnNlcnZlci5nZXRMb2dnZXIoKS5kZWJ1ZyhgQmxvY2sgd2l0aCBpZCDCp2Ike2Jsb2NrLm5hbWV9wqdyIHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgdGhpcy5ibG9ja3Muc2V0KGJsb2NrLm5hbWUsIGJsb2NrKTtcbiAgICAgICAgdGhpcy5qYXZhQmxvY2tzLnNldChibG9jay5qYXZhTmFtZSwgYmxvY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGJsb2NrcyBleHBvcnRlZCBieSAnLi9CbG9ja3MnXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBpbXBvcnRCbG9ja3MoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gbmV3IFRpbWVyKCk7XG5cbiAgICAgICAgLy8gRHluYW1pY2FsbHkgcmVnaXN0ZXIgYmxvY2tzXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKE9iamVjdC5lbnRyaWVzKEJsb2NrcykubWFwKGFzeW5jIChbLCBibG9ja10pID0+IHRoaXMucmVnaXN0ZXJCbG9jayhuZXcgYmxvY2soKSkpKTtcblxuICAgICAgICB0aGlzLnNlcnZlci5nZXRMb2dnZXIoKS52ZXJib3NlKGBSZWdpc3RlcmVkIMKnYiR7dGhpcy5ibG9ja3Muc2l6ZX3Cp3IgYmxvY2socykgKHRvb2sgwqdlJHt0aW1lci5zdG9wKCl9IG1zwqdyKSFgKTtcbiAgICB9XG59XG4iXSwibmFtZXMiOlsiQmxvY2tJZHNUeXBlIiwiQmxvY2tSZWdpc3RlckV2ZW50IiwiVGltZXIiLCJCbG9ja3MiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVFBLE1BQXFCLFlBQWEsQ0FBQTtBQUFBLEVBQ2IsTUFBQTtBQUFBLEVBQ0EsTUFBQSx1QkFBYSxHQUFJLEVBQUE7QUFBQSxFQUNqQixVQUFBLHVCQUFpQixHQUFJLEVBQUE7QUFBQSxFQUUvQixZQUFZLE1BQWdCLEVBQUE7QUFDL0IsSUFBQSxJQUFBLENBQUssTUFBUyxHQUFBLE1BQUE7QUFBQTtBQUNsQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBYSxNQUF3QixHQUFBO0FBQ2pDLElBQUEsTUFBTSxLQUFLLFlBQWEsRUFBQTtBQUFBO0FBQzVCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxNQUFhLE9BQXlCLEdBQUE7QUFDbEMsSUFBQSxJQUFBLENBQUssT0FBTyxLQUFNLEVBQUE7QUFBQTtBQUN0QjtBQUFBO0FB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