UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

191 lines (188 loc) • 15.6 kB
import { item_id_map } from '@jsprismarine/bedrock-data'; import { ItemEnchantmentType } from '../item/ItemEnchantmentType.es.js'; import { ItemTieredToolType } from '../item/ItemTieredToolType.es.js'; import { BlockToolType } from './BlockToolType.es.js'; class Block { /** * The block's numeric block ID. */ id; /** * The block's namespaced block ID. */ name; /** * The block's java-edition namespaced block ID. */ javaName; hardness; meta = 0; networkId; // TODO nbt = null; count = 1; constructor({ id, name, javaName, parentName, hardness }) { Object.setPrototypeOf(this, Block.prototype); this.id = id; this.name = name; this.javaName = javaName ?? name; this.hardness = hardness ?? 0; this.networkId = item_id_map[parentName ?? name]; } get [Symbol.toStringTag]() { return `Block(${this.toString()})`; } toString() { return this.name; } /** * Get the Block's namespaced id. */ getName() { return this.name; } /** * Get the Block's meta value. */ getMeta() { return this.meta; } /** * Get the Block's numeric id. * * @returns The block's numeric ID. */ getId() { return this.id; } /** * Get the Block's network numeric id. */ getNetworkId() { return this.networkId || this.getId(); } /** * Get the Block's hardness value. */ getHardness() { return this.hardness; } /** * Get the Block's break time. */ getBreakTime(_item, _server) { return this.getHardness(); } /** * Get the Block's blast resistance. */ getBlastResistance() { return this.getHardness() * 5; } /** * Get the Block's light level emission. */ getLightLevel() { return 0; } /** * Get the Block's flammability. */ getFlammability() { return 0; } /** * Get the Block's required tool type. */ getToolType() { return [BlockToolType.None]; } /** * Get the Block's required item tool tier. */ getToolHarvestLevel() { return ItemTieredToolType.None; } /** * Get the Block's drop(s) if the tool is compatible. */ getDropsForCompatibleTool(_item, _server) { return [this]; } /** * Get the Block's drop(s) from the current item. */ getDrops(item, server) { if (this.isCompatibleWithTool(item)) { if (this.isAffectedBySilkTouch() && item?.hasEnchantment(ItemEnchantmentType.SilkTouch)) return this.getSilkTouchDrops(item, server); return this.getDropsForCompatibleTool(item, server); } return []; } /** * Get the Block's drop(s) if silk touch is used. */ getSilkTouchDrops(_item, _server) { return [this]; } getLightFilter() { return 15; } canPassThrough() { return false; } /** * Sets if the block can be replaced when place action occurs on it. */ canBeReplaced() { return false; } canBePlaced() { return true; } canBeFlowedInto() { return false; } isTransparent() { return false; } /** * Check if the block is breakable. * * @returns `true` if the block is breakable otherwise `false`. */ isBreakable() { return true; } /** * Check if the block is solid. * * @returns `true` if the block is solid otherwise `false`. */ isSolid() { return false; } isCompatibleWithTool(item) { const toolType = this.getToolType(); const harvestLevel = this.getToolHarvestLevel(); if (toolType.includes(BlockToolType.None) || harvestLevel <= 0) return true; if (!item) return false; if (toolType.includes(item.getToolType()) && item.getToolHarvestLevel() >= harvestLevel) return true; return false; } isAffectedBySilkTouch() { return true; } isPartOfCreativeInventory() { return true; } } export { Block }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2suZXMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ibG9jay9CbG9jay50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpdGVtX2lkX21hcCBhcyBCbG9ja0lkTWFwIH0gZnJvbSAnQGpzcHJpc21hcmluZS9iZWRyb2NrLWRhdGEnO1xuaW1wb3J0IHR5cGUgU2VydmVyIGZyb20gJy4uL1NlcnZlcic7XG5pbXBvcnQgdHlwZSB7IEl0ZW0gfSBmcm9tICcuLi9pdGVtL0l0ZW0nO1xuaW1wb3J0IHsgSXRlbUVuY2hhbnRtZW50VHlwZSB9IGZyb20gJy4uL2l0ZW0vSXRlbUVuY2hhbnRtZW50VHlwZSc7XG5pbXBvcnQgeyBJdGVtVGllcmVkVG9vbFR5cGUgfSBmcm9tICcuLi9pdGVtL0l0ZW1UaWVyZWRUb29sVHlwZSc7XG5pbXBvcnQgeyBCbG9ja1Rvb2xUeXBlIH0gZnJvbSAnLi9CbG9ja1Rvb2xUeXBlJztcblxuZXhwb3J0IGNsYXNzIEJsb2NrIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYmxvY2sncyBudW1lcmljIGJsb2NrIElELlxuICAgICAqL1xuICAgIHB1YmxpYyBpZDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJsb2NrJ3MgbmFtZXNwYWNlZCBibG9jayBJRC5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJsb2NrJ3MgamF2YS1lZGl0aW9uIG5hbWVzcGFjZWQgYmxvY2sgSUQuXG4gICAgICovXG4gICAgcHVibGljIGphdmFOYW1lOiBzdHJpbmc7XG4gICAgcHVibGljIGhhcmRuZXNzOiBudW1iZXI7XG4gICAgcHVibGljIG1ldGEgPSAwO1xuICAgIHByaXZhdGUgbmV0d29ya0lkOiBudW1iZXI7XG5cbiAgICAvLyBUT0RPXG4gICAgcHVibGljIG5idCA9IG51bGw7XG4gICAgcHVibGljIGNvdW50ID0gMTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih7XG4gICAgICAgIGlkLFxuICAgICAgICBuYW1lLFxuICAgICAgICBqYXZhTmFtZSxcbiAgICAgICAgcGFyZW50TmFtZSxcbiAgICAgICAgaGFyZG5lc3NcbiAgICB9OiB7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgamF2YU5hbWU/OiBzdHJpbmc7XG4gICAgICAgIHBhcmVudE5hbWU/OiBzdHJpbmc7XG4gICAgICAgIGhhcmRuZXNzPzogbnVtYmVyO1xuICAgIH0pIHtcbiAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIEJsb2NrLnByb3RvdHlwZSk7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5qYXZhTmFtZSA9IGphdmFOYW1lID8/IG5hbWU7XG4gICAgICAgIHRoaXMuaGFyZG5lc3MgPSBoYXJkbmVzcyA/PyAwO1xuXG4gICAgICAgIHRoaXMubmV0d29ya0lkID0gKEJsb2NrSWRNYXAgYXMgYW55KVtwYXJlbnROYW1lID8/IG5hbWVdIGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgICAgICByZXR1cm4gYEJsb2NrKCR7dGhpcy50b1N0cmluZygpfSlgO1xuICAgIH1cbiAgICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIG5hbWVzcGFjZWQgaWQuXG4gICAgICovXG4gICAgcHVibGljIGdldE5hbWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIG1ldGEgdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIGdldE1ldGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1ldGE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIG51bWVyaWMgaWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBUaGUgYmxvY2sncyBudW1lcmljIElELlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIG5ldHdvcmsgbnVtZXJpYyBpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmV0d29ya0lkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXR3b3JrSWQgfHwgdGhpcy5nZXRJZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBoYXJkbmVzcyB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SGFyZG5lc3MoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFyZG5lc3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGJyZWFrIHRpbWUuXG4gICAgICovXG4gICAgcHVibGljIGdldEJyZWFrVGltZShfaXRlbTogSXRlbSB8IG51bGwsIF9zZXJ2ZXI6IFNlcnZlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRIYXJkbmVzcygpOyAvLyBUT0RPOiBGaXggYnJlYWsgdGltZSBjYWxjdWxhdGlvbnNcblxuICAgICAgICAvKiBsZXQgYmFzZSA9IHRoaXMuZ2V0SGFyZG5lc3MoKTtcbiAgICAgICAgYmFzZSAqPSB0aGlzLmlzQ29tcGF0aWJsZVdpdGhUb29sKGl0ZW0pID8gMS41IDogNTtcbiAgICAgICAgY29uc3QgZWZmaWNpZW5jeSA9IDE7IC8vIEl0ZW0uZ2V0TWluaW5nRWZmaWNpZW5jeSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIChiYXNlIC89IGVmZmljaWVuY3kpOyAqL1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBibGFzdCByZXNpc3RhbmNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCbGFzdFJlc2lzdGFuY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEhhcmRuZXNzKCkgKiA1O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBsaWdodCBsZXZlbCBlbWlzc2lvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TGlnaHRMZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGZsYW1tYWJpbGl0eS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmxhbW1hYmlsaXR5KCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgcmVxdWlyZWQgdG9vbCB0eXBlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUb29sVHlwZSgpOiBCbG9ja1Rvb2xUeXBlW10ge1xuICAgICAgICByZXR1cm4gW0Jsb2NrVG9vbFR5cGUuTm9uZV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIHJlcXVpcmVkIGl0ZW0gdG9vbCB0aWVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRUb29sSGFydmVzdExldmVsKCk6IEl0ZW1UaWVyZWRUb29sVHlwZSB7XG4gICAgICAgIHJldHVybiBJdGVtVGllcmVkVG9vbFR5cGUuTm9uZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgZHJvcChzKSBpZiB0aGUgdG9vbCBpcyBjb21wYXRpYmxlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcm9wc0ZvckNvbXBhdGlibGVUb29sKF9pdGVtOiBJdGVtIHwgbnVsbCwgX3NlcnZlcjogU2VydmVyKTogQXJyYXk8QmxvY2sgfCBJdGVtIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBkcm9wKHMpIGZyb20gdGhlIGN1cnJlbnQgaXRlbS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RHJvcHMoaXRlbTogSXRlbSB8IG51bGwsIHNlcnZlcjogU2VydmVyKTogQXJyYXk8QmxvY2sgfCBJdGVtIHwgbnVsbD4ge1xuICAgICAgICBpZiAodGhpcy5pc0NvbXBhdGlibGVXaXRoVG9vbChpdGVtKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNBZmZlY3RlZEJ5U2lsa1RvdWNoKCkgJiYgaXRlbT8uaGFzRW5jaGFudG1lbnQoSXRlbUVuY2hhbnRtZW50VHlwZS5TaWxrVG91Y2gpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFNpbGtUb3VjaERyb3BzKGl0ZW0sIHNlcnZlcik7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERyb3BzRm9yQ29tcGF0aWJsZVRvb2woaXRlbSwgc2VydmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgZHJvcChzKSBpZiBzaWxrIHRvdWNoIGlzIHVzZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldFNpbGtUb3VjaERyb3BzKF9pdGVtOiBJdGVtLCBfc2VydmVyOiBTZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuIFt0aGlzXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TGlnaHRGaWx0ZXIoKSB7XG4gICAgICAgIHJldHVybiAxNTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuUGFzc1Rocm91Z2goKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGlmIHRoZSBibG9jayBjYW4gYmUgcmVwbGFjZWQgd2hlbiBwbGFjZSBhY3Rpb24gb2NjdXJzIG9uIGl0LlxuICAgICAqL1xuICAgIHB1YmxpYyBjYW5CZVJlcGxhY2VkKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGNhbkJlUGxhY2VkKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQmVGbG93ZWRJbnRvKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVHJhbnNwYXJlbnQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgYmxvY2sgaXMgYnJlYWthYmxlLlxuICAgICAqXG4gICAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBibG9jayBpcyBicmVha2FibGUgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHVibGljIGlzQnJlYWthYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgYmxvY2sgaXMgc29saWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGJsb2NrIGlzIHNvbGlkIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgICAqL1xuICAgIHB1YmxpYyBpc1NvbGlkKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQ29tcGF0aWJsZVdpdGhUb29sKGl0ZW06IEl0ZW0gfCBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRvb2xUeXBlID0gdGhpcy5nZXRUb29sVHlwZSgpO1xuICAgICAgICBjb25zdCBoYXJ2ZXN0TGV2ZWwgPSB0aGlzLmdldFRvb2xIYXJ2ZXN0TGV2ZWwoKTtcblxuICAgICAgICBpZiAodG9vbFR5cGUuaW5jbHVkZXMoQmxvY2tUb29sVHlwZS5Ob25lKSB8fCBoYXJ2ZXN0TGV2ZWwgPD0gMCkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodG9vbFR5cGUuaW5jbHVkZXMoaXRlbS5nZXRUb29sVHlwZSgpKSAmJiBpdGVtLmdldFRvb2xIYXJ2ZXN0TGV2ZWwoKSA+PSBoYXJ2ZXN0TGV2ZWwpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQWZmZWN0ZWRCeVNpbGtUb3VjaCgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGlzUGFydE9mQ3JlYXRpdmVJbnZlbnRvcnkoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJCbG9ja0lkTWFwIl0sIm1hcHBpbmdzIjoiOzs7OztBQU9PLE1BQU0sS0FBTSxDQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJUixFQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxJQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxRQUFBO0FBQUEsRUFDQSxRQUFBO0FBQUEsRUFDQSxJQUFPLEdBQUEsQ0FBQTtBQUFBLEVBQ04sU0FBQTtBQUFBO0FBQUEsRUFHRCxHQUFNLEdBQUEsSUFBQTtBQUFBLEVBQ04sS0FBUSxHQUFBLENBQUE7QUFBQSxFQUVSLFdBQVksQ0FBQTtBQUFBLElBQ2YsRUFBQTtBQUFBLElBQ0EsSUFBQTtBQUFBLElBQ0EsUUFBQTtBQUFBLElBQ0EsVUFBQTtBQUFBLElBQ0E7QUFBQSxHQU9ELEVBQUE7QUFDQyxJQUFPLE1BQUEsQ0FBQSxjQUFBLENBQWUsSUFBTSxFQUFBLEtBQUEsQ0FBTSxTQUFTLENBQUE7QUFDM0MsSUFBQSxJQUFBLENBQUssRUFBSyxHQUFBLEVBQUE7QUFDVixJQUFBLElBQUEsQ0FBSyxJQUFPLEdBQUEsSUFBQTtBQUNaLElBQUEsSUFBQSxDQUFLLFdBQVcsUUFBWSxJQUFBLElBQUE7QUFDNUIsSUFBQSxJQUFBLENBQUssV0FBVyxRQUFZLElBQUEsQ0FBQTtBQUU1QixJQUFLLElBQUEsQ0FBQSxTQUFBLEdBQWFBLFdBQW1CLENBQUEsVUFBQSxJQUFjLElBQUksQ0FBQTtBQUFBO0FBQzNELEVBRUEsS0FB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