UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

135 lines (132 loc) 15.6 kB
import { NBTReader, ByteOrder } from '@jsprismarine/nbt'; import { item_id_map } from '@jsprismarine/bedrock-data'; import BinaryStream from '@jsprismarine/jsbinaryutils'; import { BlockMappings } from '../block/BlockMappings.es.js'; import { BlockToolType } from '../block/BlockToolType.es.js'; class Item { id; networkId; name; meta = 0; durability = this.getMaxDurability(); // TODO nbt = null; count = 1; constructor({ id, name, meta }) { this.id = id; this.name = name; if (meta) this.meta = meta; this.networkId = item_id_map[name]; } getName() { return this.name; } getId() { return this.id; } /** * Get the Block's network numeric id */ getNetworkId() { return this.networkId || this.getId(); } isTool() { return false; } isArmorPiece() { return false; } getBurnTime() { return 0; } getToolType() { return BlockToolType.None; } getToolHarvestLevel() { return 0; } getArmorDefensePoints() { return 0; } getArmorToughness() { return 0; } hasEnchantment(_enchantment) { return false; } getEnchantability() { return 0; } getMaxDurability() { return 0; } getDurability() { return this.durability; } getMaxAmount() { return 64; } getAmount() { return this.count; } isPartOfCreativeInventory() { return true; } networkSerialize(stream, additionalData = null) { stream.writeVarInt(this.getNetworkId()); if (this.getId() === 0 || this.getName() === "minecraft:air") { return; } stream.writeShortLE(this.getAmount()); stream.writeUnsignedVarInt(this.meta); if (additionalData) { additionalData(stream); } stream.writeVarInt(BlockMappings.getRuntimeId(this.getName())); const str = new BinaryStream(); str.writeShortLE(0); str.writeIntLE(0); str.writeIntLE(0); if (this.getName() === "minecraft:shield") { str.writeLongLE(BigInt(0)); } stream.writeUnsignedVarInt(str.getBuffer().byteLength); stream.write(new Uint8Array(str.getBuffer())); } static networkDeserialize(stream, extra = false) { const id = stream.readVarInt(); if (id === 0) { return new Item({ id: 0, name: "minecraft:air" }); } stream.readUnsignedShortLE(); stream.readUnsignedVarInt(); if (extra && stream.readBoolean()) { stream.readVarInt(); } const temp = stream.readVarInt(); const data = temp >> 8; let _nbt = null; const extraLen = stream.readUnsignedShortLE(); if (extraLen === -1) { stream.readByte(); try { const nbtReader = new NBTReader(stream, ByteOrder.LITTLE_ENDIAN); nbtReader.setUseVarint(true); _nbt = nbtReader.parse(); } catch (error) { throw new Error(`Failed to parse item stack nbt`, { cause: error }); } } const countPlaceOn = stream.readVarInt(); for (let i = 0; i < countPlaceOn; i++) { stream.read(stream.readUnsignedShortLE()); } const countCanBreak = stream.readVarInt(); for (let i = 0; i < countCanBreak; i++) { stream.read(stream.readUnsignedShortLE()); } return new Item({ id, name: "minecraft:unknown", meta: data }); } } export { Item }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXRlbS5lcy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2l0ZW0vSXRlbS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCeXRlT3JkZXIsIE5CVFJlYWRlciB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvbmJ0JztcblxuaW1wb3J0IHsgaXRlbV9pZF9tYXAgYXMgSXRlbUlkTWFwIH0gZnJvbSAnQGpzcHJpc21hcmluZS9iZWRyb2NrLWRhdGEnO1xuaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHsgQmxvY2tNYXBwaW5ncyB9IGZyb20gJy4uL2Jsb2NrL0Jsb2NrTWFwcGluZ3MnO1xuaW1wb3J0IHsgQmxvY2tUb29sVHlwZSB9IGZyb20gJy4uL2Jsb2NrL0Jsb2NrVG9vbFR5cGUnO1xuaW1wb3J0IHR5cGUgeyBJdGVtRW5jaGFudG1lbnRUeXBlIH0gZnJvbSAnLi9JdGVtRW5jaGFudG1lbnRUeXBlJztcblxuZXhwb3J0IGludGVyZmFjZSBJdGVtUHJvcHMge1xuICAgIGlkOiBudW1iZXI7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG1ldGE/OiBudW1iZXI7XG4gICAgbmJ0PzogYW55O1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIGR1cmFiaWxpdHk/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBJdGVtIHtcbiAgICBwcml2YXRlIGlkOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBuZXR3b3JrSWQ6IG51bWJlcjtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZztcbiAgICBwdWJsaWMgbWV0YSA9IDA7XG4gICAgcHVibGljIGR1cmFiaWxpdHk6IG51bWJlciA9IHRoaXMuZ2V0TWF4RHVyYWJpbGl0eSgpO1xuXG4gICAgLy8gVE9ET1xuICAgIHB1YmxpYyBuYnQgPSBudWxsO1xuICAgIHB1YmxpYyBjb3VudCA9IDE7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoeyBpZCwgbmFtZSwgbWV0YSB9OiBJdGVtUHJvcHMpIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgICAgICBpZiAobWV0YSkgdGhpcy5tZXRhID0gbWV0YTtcblxuICAgICAgICB0aGlzLm5ldHdvcmtJZCA9IChJdGVtSWRNYXAgYXMgYW55KVtuYW1lXSBhcyBudW1iZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgQmxvY2sncyBuZXR3b3JrIG51bWVyaWMgaWRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TmV0d29ya0lkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZXR3b3JrSWQgfHwgdGhpcy5nZXRJZCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1Rvb2woKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBcm1vclBpZWNlKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEJ1cm5UaW1lKCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VG9vbFR5cGUoKSB7XG4gICAgICAgIHJldHVybiBCbG9ja1Rvb2xUeXBlLk5vbmU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRvb2xIYXJ2ZXN0TGV2ZWwoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBcm1vckRlZmVuc2VQb2ludHMoKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBcm1vclRvdWdobmVzcygpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc0VuY2hhbnRtZW50KF9lbmNoYW50bWVudDogSXRlbUVuY2hhbnRtZW50VHlwZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEVuY2hhbnRhYmlsaXR5KCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWF4RHVyYWJpbGl0eSgpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldER1cmFiaWxpdHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmR1cmFiaWxpdHk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1heEFtb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIDY0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBbW91bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvdW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1BhcnRPZkNyZWF0aXZlSW52ZW50b3J5KCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV0d29ya1NlcmlhbGl6ZShcbiAgICAgICAgc3RyZWFtOiBCaW5hcnlTdHJlYW0sXG4gICAgICAgIGFkZGl0aW9uYWxEYXRhOiBudWxsIHwgKChzdHJlYW06IEJpbmFyeVN0cmVhbSkgPT4gdm9pZCkgPSBudWxsXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHN0cmVhbS53cml0ZVZhckludCh0aGlzLmdldE5ldHdvcmtJZCgpKTtcbiAgICAgICAgaWYgKHRoaXMuZ2V0SWQoKSA9PT0gMCB8fCB0aGlzLmdldE5hbWUoKSA9PT0gJ21pbmVjcmFmdDphaXInKSB7XG4gICAgICAgICAgICAvLyBUaGUgaXRlbSBpcyBBaXIgc28gdGhlcmUncyBubyBhZGRpdGlvbmFsIGRhdGFcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0cmVhbS53cml0ZVNob3J0TEUodGhpcy5nZXRBbW91bnQoKSk7XG4gICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkVmFySW50KHRoaXMubWV0YSk7XG5cbiAgICAgICAgLy8gVXNlIGEgY2xvc3VyZSB0byBhZGQgYWRkaXRpb25hbCBkYXRhXG4gICAgICAgIGlmIChhZGRpdGlvbmFsRGF0YSkge1xuICAgICAgICAgICAgYWRkaXRpb25hbERhdGEoc3RyZWFtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IFByb3BlciBibG9jayBydW50aW1lIElEXG4gICAgICAgIHN0cmVhbS53cml0ZVZhckludChCbG9ja01hcHBpbmdzLmdldFJ1bnRpbWVJZCh0aGlzLmdldE5hbWUoKSkpO1xuXG4gICAgICAgIGNvbnN0IHN0ciA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcblxuICAgICAgICAvKiBpZiAodGhpcy5uYnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBhbW91bnQgb2YgdGFncyB0byB3cml0ZVxuICAgICAgICAgICAgLy8gKDEpIGFjY29yZGluZyB0byB2YW5pbGxhXG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFNob3J0TEUoMHhmZmZmKTtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZUJ5dGUoMSk7XG5cbiAgICAgICAgICAgIC8vIFdyaXRlIGhhcmRjb2RlZCBOQlQgdGFnXG4gICAgICAgICAgICAvLyBUT0RPOiB1bmltcGxlbWVudGVkIE5CVC53cml0ZShuYnQsIHRydWUsIHRydWUpXG4gICAgICAgIH0gKi9cblxuICAgICAgICAvLyBUT0RPOiBwcm9wZXIgTkJUXG4gICAgICAgIHN0ci53cml0ZVNob3J0TEUoMCk7XG5cbiAgICAgICAgLy8gQ2FuUGxhY2UgYW5kIGNhbkJyZWFrXG4gICAgICAgIHN0ci53cml0ZUludExFKDApO1xuICAgICAgICBzdHIud3JpdGVJbnRMRSgwKTtcblxuICAgICAgICAvLyBUT0RPOiBjaGVjayBmb3IgYWRkaXRpb25hbCBkYXRhXG4gICAgICAgIGlmICh0aGlzLmdldE5hbWUoKSA9PT0gJ21pbmVjcmFmdDpzaGllbGQnKSB7XG4gICAgICAgICAgICBzdHIud3JpdGVMb25nTEUoQmlnSW50KDApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkVmFySW50KHN0ci5nZXRCdWZmZXIoKS5ieXRlTGVuZ3RoKTtcbiAgICAgICAgc3RyZWFtLndyaXRlKG5ldyBVaW50OEFycmF5KHN0ci5nZXRCdWZmZXIoKSkpO1xuXG4gICAgICAgIC8vIFRPRE86IGNoZWNrIGZvciBhZGRpdGlvbmFsIGRhdGFcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5ldHdvcmtEZXNlcmlhbGl6ZShzdHJlYW06IEJpbmFyeVN0cmVhbSwgZXh0cmEgPSBmYWxzZSk6IEl0ZW0ge1xuICAgICAgICBjb25zdCBpZCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG4gICAgICAgIGlmIChpZCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gVE9ETzogaXRlbXNcbiAgICAgICAgICAgIHJldHVybiBuZXcgSXRlbSh7IGlkOiAwLCBuYW1lOiAnbWluZWNyYWZ0OmFpcicgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBfY291bnQgPSBzdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnRMRSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVudXNlZC1pbXBvcnRzL25vLXVudXNlZC12YXJzXG4gICAgICAgIGNvbnN0IF9uZXREYXRhID0gc3RyZWFtLnJlYWRVbnNpZ25lZFZhckludCgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVudXNlZC1pbXBvcnRzL25vLXVudXNlZC12YXJzXG5cbiAgICAgICAgLy8gVE9ETzogcmVmYWN0b3IgZXZlcnl0aGluZyBiYXNpY2FsbHkuLi5cbiAgICAgICAgaWYgKGV4dHJhICYmIHN0cmVhbS5yZWFkQm9vbGVhbigpKSB7XG4gICAgICAgICAgICBzdHJlYW0ucmVhZFZhckludCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGVtcCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG4gICAgICAgIC8vIGNvbnN0IGFtb3VudCA9IHRlbXAgJiAweGZmO1xuICAgICAgICBjb25zdCBkYXRhID0gdGVtcCA+PiA4O1xuXG4gICAgICAgIGxldCBfbmJ0ID0gbnVsbDtcbiAgICAgICAgY29uc3QgZXh0cmFMZW4gPSBzdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnRMRSgpO1xuICAgICAgICBpZiAoZXh0cmFMZW4gPT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uID0gc3RyZWFtLnJlYWRCeXRlKCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdW51c2VkLWltcG9ydHMvbm8tdW51c2VkLXZhcnNcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYnRSZWFkZXIgPSBuZXcgTkJUUmVhZGVyKHN0cmVhbSwgQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pO1xuICAgICAgICAgICAgICAgIG5idFJlYWRlci5zZXRVc2VWYXJpbnQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgX25idCA9IG5idFJlYWRlci5wYXJzZSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBpdGVtIHN0YWNrIG5idGAsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEp1c3QgbG9nIGFuZCByZXR1cm4gQUlSXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3VudFBsYWNlT24gPSBzdHJlYW0ucmVhZFZhckludCgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50UGxhY2VPbjsgaSsrKSB7XG4gICAgICAgICAgICBzdHJlYW0ucmVhZChzdHJlYW0ucmVhZFVuc2lnbmVkU2hvcnRMRSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvdW50Q2FuQnJlYWsgPSBzdHJlYW0ucmVhZFZhckludCgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50Q2FuQnJlYWs7IGkrKykge1xuICAgICAgICAgICAgc3RyZWFtLnJlYWQoc3RyZWFtLnJlYWRVbnNpZ25lZFNob3J0TEUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBjaGVjayBpZiBoYXMgYWRkaXRpb25hbCBkYXRhXG5cbiAgICAgICAgLy8gVE9ETzogcnVudGltZUlkXG4gICAgICAgIC8vIFRPRE86IGh0dHBzOi8vZ2l0aHViLmNvbS9KU1ByaXNtYXJpbmUvSlNQcmlzbWFyaW5lL2lzc3Vlcy8xMDZuZXdcbiAgICAgICAgcmV0dXJuIG5ldyBJdGVtKHsgaWQsIG5hbWU6ICdtaW5lY3JhZnQ6dW5rbm93bicsIG1ldGE6IGRhdGEgfSk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIkl0ZW1JZE1hcCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBaUJPLE1BQU0sSUFBSyxDQUFBO0FBQUEsRUFDTixFQUFBO0FBQUEsRUFDQSxTQUFBO0FBQUEsRUFDQSxJQUFBO0FBQUEsRUFDRCxJQUFPLEdBQUEsQ0FBQTtBQUFBLEVBQ1AsVUFBQSxHQUFxQixLQUFLLGdCQUFpQixFQUFBO0FBQUE7QUFBQSxFQUczQyxHQUFNLEdBQUEsSUFBQTtBQUFBLEVBQ04sS0FBUSxHQUFBLENBQUE7QUFBQSxFQUVSLFdBQVksQ0FBQSxFQUFFLEVBQUksRUFBQSxJQUFBLEVBQU0sTUFBbUIsRUFBQTtBQUM5QyxJQUFBLElBQUEsQ0FBSyxFQUFLLEdBQUEsRUFBQTtBQUNWLElBQUEsSUFBQSxDQUFLLElBQU8sR0FBQSxJQUFBO0FBQ1osSUFBSSxJQUFBLElBQUEsT0FBVyxJQUFPLEdBQUEsSUFBQTtBQUV0QixJQUFLLElBQUEsQ0FBQSxTQUFBLEdBQWFBLFlBQWtCLElBQUksQ0FBQTtBQUFBO0FBQzVDLEVBRU8sT0FBa0IsR0FBQTtBQUNyQixJQUFBLE9BQU8sSUFBSyxDQUFBLElBQUE7QUFBQTtBQUNoQixFQUVPLEtBQVEsR0FBQTtBQUNY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