UNPKG

@jsprismarine/nbt

Version:
116 lines (115 loc) • 16.5 kB
import ByteValue from "./types/ByteVal.es.js"; import DoubleValue from "./types/DoubleVal.es.js"; import FloatValue from "./types/FloatVal.es.js"; import LongValue from "./types/LongVal.es.js"; import NumberValue from "./types/NumberVal.es.js"; import ShortValue from "./types/ShortVal.es.js"; import StringValue from "./types/StringVal.es.js"; import NBTWriter from "./NBTWriter.es.js"; import NBTReader from "./NBTReader.es.js"; import fs from "node:fs"; import BinaryStream from "@jsprismarine/jsbinaryutils"; //#region src/NBTTagCompound.ts var NBTTagCompound = class NBTTagCompound { name; children = /* @__PURE__ */ new Map(); static readFromFile(path, byteOrder) { return NBTTagCompound.readFromStream(new BinaryStream(fs.readFileSync(path)), byteOrder); } static readFromStream(input, byteOrder, varints = false) { const reader = new NBTReader(input, byteOrder); reader.setUseVarint(varints); return reader.parse(); } constructor(name = null) { this.name = name; } setName(name) { this.name = name; } getName() { return this.name; } addValue(name, value) { if (value instanceof NBTTagCompound && name !== value.getName()) throw new Error(`Failed to add NBTTagCompound with name ${value.getName()} given name ${name}`); this.children.set(name, value); } addChild(tag) { this.children.set(tag.getName(), tag); } getList(name, insert) { if (this.children.has(name)) return this.children.get(name); if (insert) { const backingList = /* @__PURE__ */ new Set(); this.addValue(name, backingList); return backingList; } return null; } getCompound(name, insert) { if (this.children.has(name)) return this.children.get(name); if (insert) { const compound = new NBTTagCompound(); this.addValue(name, compound); return compound; } return null; } writeToStream(out, byteOrder, varints = false) { const writer = new NBTWriter(out, byteOrder); writer.setUseVarint(varints); writer.writeCompound(this); } getByte(name, defaultValue) { return this.children.has(name) ? this.children.get(name).getValue() : defaultValue; } getShort(name, defaultValue) { return this.children.has(name) ? this.children.get(name).getValue() : defaultValue; } getNumber(name, defaultValue) { return this.children.has(name) ? this.children.get(name).getValue() : defaultValue; } getLong(name, defaultValue) { return this.children.has(name) ? this.children.get(name).getValue() : defaultValue; } getFloat(name, defaultValue) { return this.children.has(name) ? this.children.get(name).getValue() : defaultValue; } getDouble(name, defaultValue) { return this.children.has(name) ? this.children.get(name).getValue() : defaultValue; } getString(name, defaultValue) { return this.children.has(name) ? this.children.get(name).getValue() : defaultValue; } remove(key) { return this.children.delete(key); } entries() { return this.children.entries(); } has(key) { return this.children.has(key); } size() { return this.children.size; } equals(that) { if (this.children.size !== that.children.size) return false; for (const [key, val] of this.children) { const testVal = that.children.get(key); if (testVal === void 0 && !that.children.has(key)) return false; if (val instanceof NBTTagCompound && testVal instanceof NBTTagCompound && !val.equals(testVal)) return false; if (val instanceof ByteValue && testVal instanceof ByteValue && val.getValue() !== testVal.getValue()) return false; if (val instanceof DoubleValue && testVal instanceof DoubleValue && val.getValue() !== testVal.getValue()) return false; if (val instanceof FloatValue && testVal instanceof FloatValue && val.getValue() !== testVal.getValue()) return false; if (val instanceof LongValue && testVal instanceof LongValue && val.getValue() !== testVal.getValue()) return false; if (val instanceof NumberValue && testVal instanceof NumberValue && val.getValue() !== testVal.getValue()) return false; if (val instanceof ShortValue && testVal instanceof ShortValue && val.getValue() !== testVal.getValue()) return false; if (val instanceof StringValue && testVal instanceof StringValue && val.getValue() !== testVal.getValue()) return false; } return true; } }; //#endregion export { NBTTagCompound as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUVGFnQ29tcG91bmQuZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL05CVFRhZ0NvbXBvdW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBCeXRlT3JkZXIgfSBmcm9tICcuL0J5dGVPcmRlcic7XG5pbXBvcnQgTkJUUmVhZGVyIGZyb20gJy4vTkJUUmVhZGVyJztcbmltcG9ydCBOQlRXcml0ZXIgZnJvbSAnLi9OQlRXcml0ZXInO1xuaW1wb3J0IEJ5dGVWYWwgZnJvbSAnLi90eXBlcy9CeXRlVmFsJztcbmltcG9ydCBEb3VibGVWYWwgZnJvbSAnLi90eXBlcy9Eb3VibGVWYWwnO1xuaW1wb3J0IEZsb2F0VmFsIGZyb20gJy4vdHlwZXMvRmxvYXRWYWwnO1xuaW1wb3J0IExvbmdWYWwgZnJvbSAnLi90eXBlcy9Mb25nVmFsJztcbmltcG9ydCBOdW1iZXJWYWwgZnJvbSAnLi90eXBlcy9OdW1iZXJWYWwnO1xuaW1wb3J0IFNob3J0VmFsIGZyb20gJy4vdHlwZXMvU2hvcnRWYWwnO1xuaW1wb3J0IFN0cmluZ1ZhbCBmcm9tICcuL3R5cGVzL1N0cmluZ1ZhbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5CVFRhZ0NvbXBvdW5kIHtcbiAgICBwcml2YXRlIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgcHVibGljIHJlYWRvbmx5IGNoaWxkcmVuOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xuXG4gICAgcHVibGljIHN0YXRpYyByZWFkRnJvbUZpbGUocGF0aDogc3RyaW5nLCBieXRlT3JkZXI6IEJ5dGVPcmRlcik6IE5CVFRhZ0NvbXBvdW5kIHtcbiAgICAgICAgcmV0dXJuIE5CVFRhZ0NvbXBvdW5kLnJlYWRGcm9tU3RyZWFtKG5ldyBCaW5hcnlTdHJlYW0oZnMucmVhZEZpbGVTeW5jKHBhdGgpKSwgYnl0ZU9yZGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRGcm9tU3RyZWFtKGlucHV0OiBCaW5hcnlTdHJlYW0sIGJ5dGVPcmRlcjogQnl0ZU9yZGVyLCB2YXJpbnRzID0gZmFsc2UpOiBOQlRUYWdDb21wb3VuZCB7XG4gICAgICAgIGNvbnN0IHJlYWRlcjogTkJUUmVhZGVyID0gbmV3IE5CVFJlYWRlcihpbnB1dCwgYnl0ZU9yZGVyKTtcbiAgICAgICAgcmVhZGVyLnNldFVzZVZhcmludCh2YXJpbnRzKTtcbiAgICAgICAgcmV0dXJuIHJlYWRlci5wYXJzZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbCkge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5uYW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTkJUVGFnQ29tcG91bmQgJiYgbmFtZSAhPT0gdmFsdWUuZ2V0TmFtZSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBhZGQgTkJUVGFnQ29tcG91bmQgd2l0aCBuYW1lICR7dmFsdWUuZ2V0TmFtZSgpfSBnaXZlbiBuYW1lICR7bmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hpbGRyZW4uc2V0KG5hbWUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkQ2hpbGQodGFnOiBOQlRUYWdDb21wb3VuZCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoaWxkcmVuLnNldCh0YWcuZ2V0TmFtZSgpISwgdGFnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TGlzdChuYW1lOiBzdHJpbmcsIGluc2VydDogYm9vbGVhbik6IFNldDxhbnk+IHwgbnVsbCB7XG4gICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluc2VydCkge1xuICAgICAgICAgICAgY29uc3QgYmFja2luZ0xpc3Q6IFNldDxhbnk+ID0gbmV3IFNldCgpO1xuICAgICAgICAgICAgdGhpcy5hZGRWYWx1ZShuYW1lLCBiYWNraW5nTGlzdCk7XG4gICAgICAgICAgICByZXR1cm4gYmFja2luZ0xpc3Q7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG91bmQobmFtZTogc3RyaW5nLCBpbnNlcnQ6IGJvb2xlYW4pOiBOQlRUYWdDb21wb3VuZCB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmdldChuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbnNlcnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvdW5kOiBOQlRUYWdDb21wb3VuZCA9IG5ldyBOQlRUYWdDb21wb3VuZCgpO1xuICAgICAgICAgICAgdGhpcy5hZGRWYWx1ZShuYW1lLCBjb21wb3VuZCk7XG4gICAgICAgICAgICByZXR1cm4gY29tcG91bmQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGVUb1N0cmVhbShvdXQ6IEJpbmFyeVN0cmVhbSwgYnl0ZU9yZGVyOiBCeXRlT3JkZXIsIHZhcmludHMgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBjb25zdCB3cml0ZXI6IE5CVFdyaXRlciA9IG5ldyBOQlRXcml0ZXIob3V0LCBieXRlT3JkZXIpO1xuICAgICAgICB3cml0ZXIuc2V0VXNlVmFyaW50KHZhcmludHMpO1xuICAgICAgICB3cml0ZXIud3JpdGVDb21wb3VuZCh0aGlzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Qnl0ZShuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uaGFzKG5hbWUpID8gKHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpIGFzIEJ5dGVWYWwpLmdldFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNob3J0KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5oYXMobmFtZSkgPyAodGhpcy5jaGlsZHJlbi5nZXQobmFtZSkgYXMgU2hvcnRWYWwpLmdldFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE51bWJlcihuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uaGFzKG5hbWUpID8gKHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpIGFzIE51bWJlclZhbCkuZ2V0VmFsdWUoKSA6IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TG9uZyhuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogYmlnaW50KTogYmlnaW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uaGFzKG5hbWUpID8gKHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpIGFzIExvbmdWYWwpLmdldFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZsb2F0KG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5oYXMobmFtZSkgPyAodGhpcy5jaGlsZHJlbi5nZXQobmFtZSkgYXMgRmxvYXRWYWwpLmdldFZhbHVlKCkgOiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERvdWJsZShuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uaGFzKG5hbWUpID8gKHRoaXMuY2hpbGRyZW4uZ2V0KG5hbWUpIGFzIERvdWJsZVZhbCkuZ2V0VmFsdWUoKSA6IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3RyaW5nKG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbi5oYXMobmFtZSkgPyAodGhpcy5jaGlsZHJlbi5nZXQobmFtZSkgYXMgU3RyaW5nVmFsKS5nZXRWYWx1ZSgpIDogZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4uZGVsZXRlKGtleSk7XG4gICAgfVxuXG4gICAgcHVibGljIGVudHJpZXMoKTogSXRlcmFibGVJdGVyYXRvcjxbc3RyaW5nLCBhbnldPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmVudHJpZXMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaXplKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuLnNpemU7XG4gICAgfVxuXG4gICAgLy8gVGhhbmtzIHN0YWNrb3ZlcmZsb3chIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1OTQ4MzM1L2hvdy1jYW4taS1jaGVjay1pZi10d28tbWFwLW9iamVjdHMtYXJlLWVxdWFsXG4gICAgcHVibGljIGVxdWFscyh0aGF0OiBOQlRUYWdDb21wb3VuZCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5zaXplICE9PSB0aGF0LmNoaWxkcmVuLnNpemUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiB0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXN0VmFsID0gdGhhdC5jaGlsZHJlbi5nZXQoa2V5KTtcblxuICAgICAgICAgICAgaWYgKHRlc3RWYWwgPT09IHVuZGVmaW5lZCAmJiAhdGhhdC5jaGlsZHJlbi5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE5CVFRhZ0NvbXBvdW5kICYmIHRlc3RWYWwgaW5zdGFuY2VvZiBOQlRUYWdDb21wb3VuZCAmJiAhdmFsLmVxdWFscyh0ZXN0VmFsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIEJ5dGVWYWwgJiYgdGVzdFZhbCBpbnN0YW5jZW9mIEJ5dGVWYWwgJiYgdmFsLmdldFZhbHVlKCkgIT09IHRlc3RWYWwuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIERvdWJsZVZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgRG91YmxlVmFsICYmIHZhbC5nZXRWYWx1ZSgpICE9PSB0ZXN0VmFsLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBGbG9hdFZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgRmxvYXRWYWwgJiYgdmFsLmdldFZhbHVlKCkgIT09IHRlc3RWYWwuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIExvbmdWYWwgJiYgdGVzdFZhbCBpbnN0YW5jZW9mIExvbmdWYWwgJiYgdmFsLmdldFZhbHVlKCkgIT09IHRlc3RWYWwuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlclZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgTnVtYmVyVmFsICYmIHZhbC5nZXRWYWx1ZSgpICE9PSB0ZXN0VmFsLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBTaG9ydFZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgU2hvcnRWYWwgJiYgdmFsLmdldFZhbHVlKCkgIT09IHRlc3RWYWwuZ2V0VmFsdWUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIFN0cmluZ1ZhbCAmJiB0ZXN0VmFsIGluc3RhbmNlb2YgU3RyaW5nVmFsICYmIHZhbC5nZXRWYWx1ZSgpICE9PSB0ZXN0VmFsLmdldFZhbHVlKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAg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