UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

87 lines (84 loc) 10 kB
import * as block_Blocks from './Blocks.es.js'; import BlockRegisterEvent from '../events/block/BlockRegisterEvent.es.js'; import Timer from '../utils/Timer.es.js'; import { BlockIdsType } from './BlockIdsType.es.js'; 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 (!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 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(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)!`); } } export { BlockManager as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2tNYW5hZ2VyLmVzLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmxvY2svQmxvY2tNYW5hZ2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEJsb2NrcyBmcm9tICcuL0Jsb2Nrcyc7XG5cbmltcG9ydCB0eXBlIFNlcnZlciBmcm9tICcuLi9TZXJ2ZXInO1xuaW1wb3J0IEJsb2NrUmVnaXN0ZXJFdmVudCBmcm9tICcuLi9ldmVudHMvYmxvY2svQmxvY2tSZWdpc3RlckV2ZW50JztcbmltcG9ydCBUaW1lciBmcm9tICcuLi91dGlscy9UaW1lcic7XG5pbXBvcnQgdHlwZSB7IEJsb2NrIH0gZnJvbSAnLi9CbG9jayc7XG5pbXBvcnQgeyBCbG9ja0lkc1R5cGUgfSBmcm9tICcuL0Jsb2NrSWRzVHlwZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJsb2NrTWFuYWdlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2ZXI6IFNlcnZlcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGJsb2NrcyA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGphdmFCbG9ja3MgPSBuZXcgTWFwKCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3Ioc2VydmVyOiBTZXJ2ZXIpIHtcbiAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gZW5hYmxlIGhvb2suXG4gICAgICogQGdyb3VwIExpZmVjeWNsZVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBlbmFibGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0QmxvY2tzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT24gZGlzYWJsZSBob29rLlxuICAgICAqIEBncm91cCBMaWZlY3ljbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgZGlzYWJsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5ibG9ja3MuY2xlYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYmxvY2sgYnkgbmFtZXNwYWNlZCBJRC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmxvY2sobmFtZTogc3RyaW5nKTogQmxvY2sge1xuICAgICAgICBpZiAoIXRoaXMuYmxvY2tzLmhhcyhuYW1lKSAmJiAhdGhpcy5qYXZhQmxvY2tzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGJsb2NrIHdpdGggaWQgJHtuYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICh0aGlzLmJsb2Nrcy5nZXQobmFtZSkgfHwgdGhpcy5qYXZhQmxvY2tzLmdldChuYW1lKSkgYXMgQmxvY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJsb2NrIGJ5IG51bWVyaWMgSUQuXG4gICAgICovXG4gICAgcHVibGljIGdldEJsb2NrQnlJZChpZDogbnVtYmVyKTogQmxvY2sge1xuICAgICAgICBpZiAoIUJsb2NrSWRzVHlwZVtpZF0pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBibG9jayB3aXRoIG51bWVyaWMgaWQgJHtpZH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldEJsb2NrcygpLmZpbmQoKGEpID0+IGEuZ2V0SWQoKSA9PT0gaWQgJiYgYS5tZXRhID09PSAwKSE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJsb2NrIGJ5IG51bWVyaWMgaWQgYW5kIG1ldGEgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldEJsb2NrQnlJZEFuZE1ldGEoaWQ6IG51bWJlciwgbWV0YTogbnVtYmVyKTogQmxvY2sgfCBudWxsIHtcbiAgICAgICAgY29uc3QgYmxvY2sgPSB0aGlzLmdldEJsb2NrcygpLmZpbmQoKGEpID0+IGEuaWQgPT09IGlkICYmIGEubWV0YSA9PT0gbWV0YSk7XG4gICAgICAgIHJldHVybiBibG9jayB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgYmxvY2tzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYWxsIHJlZ2lzdGVyZWQgYmxvY2tzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCbG9ja3MoKTogQmxvY2tbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuYmxvY2tzLnZhbHVlcygpKSBhcyBCbG9ja1tdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgYmxvY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmxvY2sgLSBUaGUgYmxvY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJCbG9jayhibG9jazogQmxvY2spIHtcbiAgICAgICAgaWYgKHRoaXMuYmxvY2tzLmdldChibG9jay5uYW1lKSB8fCB0aGlzLmdldEJsb2NrQnlJZEFuZE1ldGEoYmxvY2suZ2V0SWQoKSwgYmxvY2suZ2V0TWV0YSgpKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQmxvY2sgd2l0aCBpZCAke2Jsb2NrLmdldE5hbWUoKX0gKCR7YmxvY2suZ2V0SWQoKX06JHtibG9jay5nZXRNZXRhKCl9KSBhbHJlYWR5IGV4aXN0c2ApO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEJsb2NrUmVnaXN0ZXJFdmVudChibG9jayk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VydmVyLmVtaXQoJ2Jsb2NrUmVnaXN0ZXInLCBldmVudCk7XG4gICAgICAgIGlmIChldmVudC5pc0NhbmNlbGxlZCgpKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TG9nZ2VyKCkuZGVidWcoYEJsb2NrIHdpdGggaWQgwqdiJHtibG9jay5uYW1lfcKnciByZWdpc3RlcmVkYCk7XG4gICAgICAgIHRoaXMuYmxvY2tzLnNldChibG9jay5uYW1lLCBibG9jayk7XG4gICAgICAgIHRoaXMuamF2YUJsb2Nrcy5zZXQoYmxvY2suamF2YU5hbWUsIGJsb2NrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBibG9ja3MgZXhwb3J0ZWQgYnkgJy4vQmxvY2tzJ1xuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgaW1wb3J0QmxvY2tzKCkge1xuICAgICAgICBjb25zdCB0aW1lciA9IG5ldyBUaW1lcigpO1xuXG4gICAgICAgIC8vIER5bmFtaWNhbGx5IHJlZ2lzdGVyIGJsb2Nrc1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChPYmplY3QuZW50cmllcyhCbG9ja3MpLm1hcChhc3luYyAoWywgYmxvY2tdKSA9PiB0aGlzLnJlZ2lzdGVyQmxvY2sobmV3IGJsb2NrKCkpKSk7XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TG9nZ2VyKCkudmVyYm9zZShgUmVnaXN0ZXJlZCDCp2Ike3RoaXMuYmxvY2tzLnNpemV9wqdyIGJsb2NrKHMpICh0b29rIMKnZSR7dGltZXIuc3RvcCgpfSBtc8KncikhYCk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIkJsb2NrcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFRQSxNQUFxQixZQUFhLENBQUE7QUFBQSxFQUNiLE1BQUE7QUFBQSxFQUNBLE1BQUEsdUJBQWEsR0FBSSxFQUFBO0FBQUEsRUFDakIsVUFBQSx1QkFBaUIsR0FBSSxFQUFBO0FBQUEsRUFFL0IsWUFBWSxNQUFnQixFQUFBO0FBQy9CLElBQUEsSUFBQSxDQUFLLE1BQVMsR0FBQSxNQUFBO0FBQUE7QUFDbEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE1BQWEsTUFBd0IsR0FBQTtBQUNqQyxJQUFBLE1BQU0sS0FBSyxZQUFhLEVBQUE7QUFBQTtBQUM1QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBYSxPQUF5QixHQUFBO0FBQ2xDLElBQUEsSUFBQSxDQUFLLE9BQU8sS0FBTSxFQUFBO0FBQUE7QUFDdEI7QUFBQTtBQUFBO0FBQUEsRUFLTyxTQUFTLElBQXFCLEVBQUE7QUFDakMsSUFBSSxJQUFBLENBQUMsSUFBSyxDQUFBLE1BQUEsQ0FBTyxHQUFJLENBQUEsSUFBSSxDQUFLLElBQUEsQ0FBQyxJQUFLLENBQUEsVUFBQSxDQUFXLEdBQUksQ0FBQSxJQUFJLENBQUcsRUFBQTtBQUN0RCxNQUFBLE1BQU0sSUFBSSxLQUFBLENBQU0sQ0FBeUIsc0JBQUEsRUFBQSxJQUFJLENBQUUsQ0FBQSxDQUFBO0FBQUE7QUFHbkQsSUFBUSxPQUFBLElBQUEsQ0FBSyxPQUFPLEdBQUksQ0FBQSxJQUFJLEtBQUssSUFBSyxDQUFBLFVBQUEsQ0FBVyxJQUFJLElBQUksQ0FBQTtBQUFBO0FBQzdEO0FBQUE7QUFBQTtBQUFBLEVBS08sYUFBYSxFQUFtQixFQUFBO0FBQ25DLElBQUksSUFBQSxDQUFDLFlBQWEsQ0FBQSxFQUFFLENBQUcsRUFBQTtBQUNuQixNQUFBLE1BQU0sSUFBSSxLQUFBLENBQU0sQ0FBaUMsOEJBQUEsRUFBQSxFQUFFLENBQUUsQ0FBQSxDQUFBO0FBQUE7QUFHekQsSUFBQSxPQUFPLElBQUssQ0FBQSxTQUFBLEVBQVksQ0FBQSxJQUFBLENBQUssQ0FBQyxDQUFBLEtBQU0sQ0FBRSxDQUFBLEtBQUEsRUFBWSxLQUFBLEVBQUEsSUFBTSxDQUFFLENBQUEsSUFBQSxLQUFTLENBQUMsQ0FBQTtBQUFBO0FBQ3hFO0FBQUE7QUFBQTtBQUFBLEVBS08sbUJBQUEsQ0FBb0IsSUFBWSxJQUE0QixFQUFBO0FBQy9ELElBQUEsTUFBTSxLQUFRLEdBQUEsSUFBQSxDQUFLLFNBQVUsRUFBQSxDQUFFLElBQUssQ0FBQSxDQUFDLENBQU0sS0FBQSxDQUFBLENBQUUsRUFBTyxLQUFBLEVBQUEsSUFBTSxDQUFFLENBQUEsSUFBQSxLQUFTLElBQUksQ0FBQTtBQUN6RSxJQUFBLE9BQU8sS0FBUyxJQUFBLElBQUE7QUFBQTtBQUNwQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxTQUFxQixHQUFBO0FBQ3hCLElBQUEsT0FBTyxLQUFNLENBQUEsSUFBQSxDQUFLLElBQUssQ0FBQSxNQUFBLENBQU8sUUFBUSxDQUFBO0FBQUE7QUFDMUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBYSxjQUFjLEtBQWMsRUFBQTtBQUNyQyxJQUFBLElBQUksSUFBSyxDQUFBLE1BQUEsQ0FBTyxHQUFJLENBQUEsS0FBQSxDQUFNLElBQUksQ0FBQSxJQUFLLElBQUssQ0FBQSxtQkFBQSxDQUFvQixLQUFNLENBQUEsS0FBQSxFQUFTLEVBQUEsS0FBQSxDQUFNLFNBQVMsQ0FBQTtBQUN0RixNQUFBLE1BQU0sSUFBSSxLQUFBLENBQU0sQ0FBaUIsY0FBQSxFQUFBLEtBQUEsQ0FBTSxTQUFTLENBQUEsRUFBQSxFQUFLLEtBQU0sQ0FBQSxLQUFBLEVBQU8sQ0FBQSxDQUFBLEVBQUksS0FBTSxDQUFBLE9BQUEsRUFBUyxDQUFrQixnQkFBQSxDQUFBLENBQUE7QUFFM0csSUFBTSxNQUFBLEtBQUEsR0FBUSxJQUFJLGtCQUFBLENBQW1CLEtBQUssQ0FBQTtBQUMxQyxJQUFBLE1BQU0sSUFBSyxDQUFBLE1BQUEsQ0FBTyxJQUFLLENBQUEsZUFBQSxFQUFpQixLQUFLLENBQUE7QUFDN0MsSUFBSSxJQUFBLEtBQUEsQ0FBTSxhQUFlLEVBQUE7QUFFekIsSUFBQSxJQUFBLENBQUssT0FBTyxTQUFVLEVBQUEsQ0FBRSxNQUFNLENBQW1CLGdCQUFBLEVBQUEsS0FBQSxDQUFNLElBQUksQ0FBZSxhQUFBLENBQUEsQ0FBQTtBQUMxRSxJQUFBLElBQUEsQ0FBSyxNQUFPLENBQUEsR0FBQSxDQUFJLEtBQU0sQ0FBQSxJQUFBLEVBQU0sS0FBSyxDQUFBO0FBQ2pDLElBQUEsSUFBQSxDQUFLLFVBQVcsQ0FBQSxHQUFBLENBQUksS0FBTSxDQUFBLFFBQUEsRUFBVSxLQUFLLENBQUE7QUFBQTtBQUM3QztBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQWMsWUFBZSxHQUFBO0FBQ3pCLElBQU0sTUFBQSxLQUFBLEdBQVEsSUFBSSxLQUFNLEVBQUE7QUFHeEIsSUFBQSxNQUFNLFFBQVEsR0FBSSxDQUFBLE1BQUEsQ0FBTyxRQUFRQSxZQUFNLENBQUEsQ0FBRSxJQUFJLE9BQU8sR0FBRyxLQUFLLE1BQU0sSUFBSyxDQUFBLGFBQUEsQ0FBYyxJQUFJLEtBQU0sRUFBQyxDQUFDLENBQUMsQ0FBQTtBQUVsRyxJQUFBLElBQUEsQ0FBSyxNQUFPLENBQUEsU0FBQSxFQUFZLENBQUEsT0FBQSxDQUFRLENBQWdCLGFBQUEsRUFBQSxJQUFBLENBQUssTUFBTyxDQUFBLElBQUksQ0FBdUIsb0JBQUEsRUFBQSxLQUFBLENBQU0sSUFBSyxFQUFDLENBQVMsT0FBQSxDQUFBLENBQUE7QUFBQTtBQUVwSDs7OzsifQ==