@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
87 lines (84 loc) • 10 kB
JavaScript
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+IGEuaWQgPT09IGlkICYmIGEubWV0YSA9PT0gbWV0YSk7XG4gICAgICAgIHJldHVybiBibG9jayB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbGwgYmxvY2tzLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYWxsIHJlZ2lzdGVyZWQgYmxvY2tzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCbG9ja3MoKTogQmxvY2tbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuYmxvY2tzLnZhbHVlcygpKSBhcyBCbG9ja1tdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyIGEgYmxvY2suXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYmxvY2sgLSBUaGUgYmxvY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgcmVnaXN0ZXJCbG9jayhibG9jazogQmxvY2spIHtcbiAgICAgICAgaWYgKHRoaXMuYmxvY2tzLmdldChibG9jay5uYW1lKSB8fCB0aGlzLmdldEJsb2NrQnlJZEFuZE1ldGEoYmxvY2suZ2V0SWQoKSwgYmxvY2suZ2V0TWV0YSgpKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQmxvY2sgd2l0aCBpZCAke2Jsb2NrLmdldE5hbWUoKX0gKCR7YmxvY2suZ2V0SWQoKX06JHtibG9jay5nZXRNZXRhKCl9KSBhbHJlYWR5IGV4aXN0c2ApO1xuXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEJsb2NrUmVnaXN0ZXJFdmVudChibG9jayk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2VydmVyLmVtaXQoJ2Jsb2NrUmVnaXN0ZXInLCBldmVudCk7XG4gICAgICAgIGlmIChldmVudC5pc0NhbmNlbGxlZCgpKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TG9nZ2VyKCkuZGVidWcoYEJsb2NrIHdpdGggaWQgwqdiJHtibG9jay5uYW1lfcKnciByZWdpc3RlcmVkYCk7XG4gICAgICAgIHRoaXMuYmxvY2tzLnNldChibG9jay5uYW1lLCBibG9jayk7XG4gICAgICAgIHRoaXMuamF2YUJsb2Nrcy5zZXQoYmxvY2suamF2YU5hbWUsIGJsb2NrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWdpc3RlciBibG9ja3MgZXhwb3J0ZWQgYnkgJy4vQmxvY2tzJ1xuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgaW1wb3J0QmxvY2tzKCkge1xuICAgICAgICBjb25zdCB0aW1lciA9IG5ldyBUaW1lcigpO1xuXG4gICAgICAgIC8vIER5bmFtaWNhbGx5IHJlZ2lzdGVyIGJsb2Nrc1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChPYmplY3QuZW50cmllcyhCbG9ja3MpLm1hcChhc3luYyAoWywgYmxvY2tdKSA9PiB0aGlzLnJlZ2lzdGVyQmxvY2sobmV3IGJsb2NrKCkpKSk7XG5cbiAgICAgICAgdGhpcy5zZXJ2ZXIuZ2V0TG9nZ2VyKCkudmVyYm9zZShgUmVnaXN0ZXJlZCDCp2Ike3RoaXMuYmxvY2tzLnNpemV9wqdyIGJsb2NrKHMpICh0b29rIMKnZSR7dGltZXIuc3RvcCgpfSBtc8KncikhYCk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIkJsb2NrcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFRQSxNQUFxQixZQUFhLENBQUE7QUFBQSxFQUNiLE1BQUE7QUFBQSxFQUNBLE1BQUEsdUJBQWEsR0FBSSxFQUFBO0FBQUEsRUFDakIsVUFBQSx1QkFBaUIsR0FBSSxFQUFBO0FBQUEsRUFFL0IsWUFBWSxNQUFnQixFQUFBO0FBQy9CLElBQUEsSUFBQSxDQUFLLE1BQVMsR0FBQSxNQUFBO0FBQUE7QUFDbEI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLE1BQWEsTUFBd0IsR0FBQTtBQUNqQyxJQUFBLE1BQU0sS0FBSyxZQUFhLEVBQUE7QUFBQTtBQUM1QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBTUEsTUFBYSxPQUF5QixHQUFBO0FBQ2xDLElBQUEsSUFBQSxDQUFLLE9BQU8sS0FBTSxFQUFBO0FBQUE7QUFDdEI7QUFBQTtBQUFBO0FBQUEsRUFLTyxTQUFTLElBQXFCLEVBQUE7QUFDakMsSUFBSSxJQUFBLENBQUMs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