@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
191 lines (188 loc) • 15.6 kB
JavaScript
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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