@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
195 lines (190 loc) • 15.9 kB
JavaScript
'use strict';
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const BedrockData = require('@jsprismarine/bedrock-data');
const item_ItemEnchantmentType = require('../item/ItemEnchantmentType.cjs.cjs');
const item_ItemTieredToolType = require('../item/ItemTieredToolType.cjs.cjs');
const block_BlockToolType = require('./BlockToolType.cjs.cjs');
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 = BedrockData.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 [block_BlockToolType.BlockToolType.None];
}
/**
* Get the Block's required item tool tier.
*/
getToolHarvestLevel() {
return item_ItemTieredToolType.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(item_ItemEnchantmentType.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(block_BlockToolType.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;
}
}
exports.Block = Block;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2suY2pzLmNqcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jsb2NrL0Jsb2NrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGl0ZW1faWRfbWFwIGFzIEJsb2NrSWRNYXAgfSBmcm9tICdAanNwcmlzbWFyaW5lL2JlZHJvY2stZGF0YSc7XG5pbXBvcnQgdHlwZSBTZXJ2ZXIgZnJvbSAnLi4vU2VydmVyJztcbmltcG9ydCB0eXBlIHsgSXRlbSB9IGZyb20gJy4uL2l0ZW0vSXRlbSc7XG5pbXBvcnQgeyBJdGVtRW5jaGFudG1lbnRUeXBlIH0gZnJvbSAnLi4vaXRlbS9JdGVtRW5jaGFudG1lbnRUeXBlJztcbmltcG9ydCB7IEl0ZW1UaWVyZWRUb29sVHlwZSB9IGZyb20gJy4uL2l0ZW0vSXRlbVRpZXJlZFRvb2xUeXBlJztcbmltcG9ydCB7IEJsb2NrVG9vbFR5cGUgfSBmcm9tICcuL0Jsb2NrVG9vbFR5cGUnO1xuXG5leHBvcnQgY2xhc3MgQmxvY2sge1xuICAgIC8qKlxuICAgICAqIFRoZSBibG9jaydzIG51bWVyaWMgYmxvY2sgSUQuXG4gICAgICovXG4gICAgcHVibGljIGlkOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmxvY2sncyBuYW1lc3BhY2VkIGJsb2NrIElELlxuICAgICAqL1xuICAgIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYmxvY2sncyBqYXZhLWVkaXRpb24gbmFtZXNwYWNlZCBibG9jayBJRC5cbiAgICAgKi9cbiAgICBwdWJsaWMgamF2YU5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgaGFyZG5lc3M6IG51bWJlcjtcbiAgICBwdWJsaWMgbWV0YSA9IDA7XG4gICAgcHJpdmF0ZSBuZXR3b3JrSWQ6IG51bWJlcjtcblxuICAgIC8vIFRPRE9cbiAgICBwdWJsaWMgbmJ0ID0gbnVsbDtcbiAgICBwdWJsaWMgY291bnQgPSAxO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHtcbiAgICAgICAgaWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGphdmFOYW1lLFxuICAgICAgICBwYXJlbnROYW1lLFxuICAgICAgICBoYXJkbmVzc1xuICAgIH06IHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBqYXZhTmFtZT86IHN0cmluZztcbiAgICAgICAgcGFyZW50TmFtZT86IHN0cmluZztcbiAgICAgICAgaGFyZG5lc3M/OiBudW1iZXI7XG4gICAgfSkge1xuICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgQmxvY2sucHJvdG90eXBlKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICB0aGlzLmphdmFOYW1lID0gamF2YU5hbWUgPz8gbmFtZTtcbiAgICAgICAgdGhpcy5oYXJkbmVzcyA9IGhhcmRuZXNzID8/IDA7XG5cbiAgICAgICAgdGhpcy5uZXR3b3JrSWQgPSAoQmxvY2tJZE1hcCBhcyBhbnkpW3BhcmVudE5hbWUgPz8gbmFtZV0gYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgICAgIHJldHVybiBgQmxvY2soJHt0aGlzLnRvU3RyaW5nKCl9KWA7XG4gICAgfVxuICAgIHB1YmxpYyB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbmFtZXNwYWNlZCBpZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbWV0YSB2YWx1ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWV0YSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWV0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbnVtZXJpYyBpZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFRoZSBibG9jaydzIG51bWVyaWMgSUQuXG4gICAgICovXG4gICAgcHVibGljIGdldElkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgbmV0d29yayBudW1lcmljIGlkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROZXR3b3JrSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5ldHdvcmtJZCB8fCB0aGlzLmdldElkKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGhhcmRuZXNzIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIYXJkbmVzcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5oYXJkbmVzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgYnJlYWsgdGltZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QnJlYWtUaW1lKF9pdGVtOiBJdGVtIHwgbnVsbCwgX3NlcnZlcjogU2VydmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEhhcmRuZXNzKCk7IC8vIFRPRE86IEZpeCBicmVhayB0aW1lIGNhbGN1bGF0aW9uc1xuXG4gICAgICAgIC8qIGxldCBiYXNlID0gdGhpcy5nZXRIYXJkbmVzcygpO1xuICAgICAgICBiYXNlICo9IHRoaXMuaXNDb21wYXRpYmxlV2l0aFRvb2woaXRlbSkgPyAxLjUgOiA1O1xuICAgICAgICBjb25zdCBlZmZpY2llbmN5ID0gMTsgLy8gSXRlbS5nZXRNaW5pbmdFZmZpY2llbmN5KHRoaXMpO1xuICAgICAgICByZXR1cm4gKGJhc2UgLz0gZWZmaWNpZW5jeSk7ICovXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGJsYXN0IHJlc2lzdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIGdldEJsYXN0UmVzaXN0YW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SGFyZG5lc3MoKSAqIDU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGxpZ2h0IGxldmVsIGVtaXNzaW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMaWdodExldmVsKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgZmxhbW1hYmlsaXR5LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGbGFtbWFiaWxpdHkoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyByZXF1aXJlZCB0b29sIHR5cGUuXG4gICAgICovXG4gICAgcHVibGljIGdldFRvb2xUeXBlKCk6IEJsb2NrVG9vbFR5cGVbXSB7XG4gICAgICAgIHJldHVybiBbQmxvY2tUb29sVHlwZS5Ob25lXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIEJsb2NrJ3MgcmVxdWlyZWQgaXRlbSB0b29sIHRpZXIuXG4gICAgICovXG4gICAgcHVibGljIGdldFRvb2xIYXJ2ZXN0TGV2ZWwoKTogSXRlbVRpZXJlZFRvb2xUeXBlIHtcbiAgICAgICAgcmV0dXJuIEl0ZW1UaWVyZWRUb29sVHlwZS5Ob25lO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBkcm9wKHMpIGlmIHRoZSB0b29sIGlzIGNvbXBhdGlibGUuXG4gICAgICovXG4gICAgcHVibGljIGdldERyb3BzRm9yQ29tcGF0aWJsZVRvb2woX2l0ZW06IEl0ZW0gfCBudWxsLCBfc2VydmVyOiBTZXJ2ZXIpOiBBcnJheTxCbG9jayB8IEl0ZW0gfCBudWxsPiB7XG4gICAgICAgIHJldHVybiBbdGhpc107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBCbG9jaydzIGRyb3AocykgZnJvbSB0aGUgY3VycmVudCBpdGVtLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXREcm9wcyhpdGVtOiBJdGVtIHwgbnVsbCwgc2VydmVyOiBTZXJ2ZXIpOiBBcnJheTxCbG9jayB8IEl0ZW0gfCBudWxsPiB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29tcGF0aWJsZVdpdGhUb29sKGl0ZW0pKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0FmZmVjdGVkQnlTaWxrVG91Y2goKSAmJiBpdGVtPy5oYXNFbmNoYW50bWVudChJdGVtRW5jaGFudG1lbnRUeXBlLlNpbGtUb3VjaCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2lsa1RvdWNoRHJvcHMoaXRlbSwgc2VydmVyKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RHJvcHNGb3JDb21wYXRpYmxlVG9vbChpdGVtLCBzZXJ2ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBkcm9wKHMpIGlmIHNpbGsgdG91Y2ggaXMgdXNlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0U2lsa1RvdWNoRHJvcHMoX2l0ZW06IEl0ZW0sIF9zZXJ2ZXI6IFNlcnZlcikge1xuICAgICAgICByZXR1cm4gW3RoaXNdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRMaWdodEZpbHRlcigpIHtcbiAgICAgICAgcmV0dXJuIDE1O1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5QYXNzVGhyb3VnaCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgaWYgdGhlIGJsb2NrIGNhbiBiZSByZXBsYWNlZCB3aGVuIHBsYWNlIGFjdGlvbiBvY2N1cnMgb24gaXQuXG4gICAgICovXG4gICAgcHVibGljIGNhbkJlUmVwbGFjZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2FuQmVQbGFjZWQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5CZUZsb3dlZEludG8oKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNUcmFuc3BhcmVudCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBibG9jayBpcyBicmVha2FibGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGJsb2NrIGlzIGJyZWFrYWJsZSBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNCcmVha2FibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIHRoZSBibG9jayBpcyBzb2xpZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgYmxvY2sgaXMgc29saWQgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHVibGljIGlzU29saWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNDb21wYXRpYmxlV2l0aFRvb2woaXRlbTogSXRlbSB8IG51bGwpIHtcbiAgICAgICAgY29uc3QgdG9vbFR5cGUgPSB0aGlzLmdldFRvb2xUeXBlKCk7XG4gICAgICAgIGNvbnN0IGhhcnZlc3RMZXZlbCA9IHRoaXMuZ2V0VG9vbEhhcnZlc3RMZXZlbCgpO1xuXG4gICAgICAgIGlmICh0b29sVHlwZS5pbmNsdWRlcyhCbG9ja1Rvb2xUeXBlLk5vbmUpIHx8IGhhcnZlc3RMZXZlbCA8PSAwKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKCFpdGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0b29sVHlwZS5pbmNsdWRlcyhpdGVtLmdldFRvb2xUeXBlKCkpICYmIGl0ZW0uZ2V0VG9vbEhhcnZlc3RMZXZlbCgpID49IGhhcnZlc3RMZXZlbCkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBZmZlY3RlZEJ5U2lsa1RvdWNoKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNQYXJ0T2ZDcmVhdGl2ZUludmVudG9yeSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIkJsb2NrSWRNYXAiLCJCbG9ja1Rvb2xUeXBlIiwiSXRlbVRpZXJlZFRvb2xUeXBlIiwiSXRlbUVuY2hhbnRtZW50VHlwZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBT08sTUFBTSxLQUFNLENBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlSLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLElBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFFBQUE7QUFBQSxFQUNBLFFBQUE7QUFBQSxFQUNBLElBQU8sR0FBQSxDQUFBO0FBQUEsRUFDTixTQUFBO0FBQUE7QUFBQSxFQUdELEdBQU0sR0FBQSxJQUFBO0FBQUEsRUFDTixLQUFRLEdBQUEsQ0FBQTtBQUFBLEVBRVIsV0FBWSxDQUFBO0FBQUEsSUFDZixFQUFBO0FBQUEsSUFDQSxJQUFBO0FBQUEsSUFDQSxRQUFBO0FBQUEsSUFDQSxVQUFBO0FBQUEsSUFDQTtBQUFBLEdBT0QsRUFBQTtBQUNDLElBQU8sTUFBQSxDQUFBLGNBQUEsQ0FBZSxJQUFNLEVBQUEsS0FBQSxDQUFNLFNBQVMsQ0FBQTtBQUMzQyxJQUFBLElBQUEsQ0FBSyxFQUFLLEdBQUEsRUFBQTtBQUNWLElBQUEsSUFBQSxDQUFLLElBQU8sR0FBQSxJQUFBO0FBQ1osSUFBQSxJQUFBLENBQUssV0FBVyxRQUFZLElBQUEsSUFBQTtBQUM1QixJQUFBLElBQUEsQ0FBSyxXQUFXLFFBQVksSUFBQSxDQUFBO0FBRTVCLElBQUssSUFBQSxD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