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