UNPKG

pw-js-world

Version:

An optional package for PW-JS-Api, aims to serve world purposes.

199 lines 14.6 kB
import { PWApiClient } from "pw-js-api"; import { MissingBlockError } from "./util/Error.js"; import { compareObjs, listedFieldTypeToGameType } from "./util/Misc.js"; export default class Block { constructor(bId, args) { /** * NOTE as of October 2025, this is an object NOT an array. * * Stores the arguments */ this.args = {}; if (typeof bId === "number") this.bId = bId; else { this.bId = Block.getIdByName(bId); } if (args) { // LEGACY SUPPORT if (Array.isArray(args)) { args = Block.getArgsAsFields(this); } // else { const keys = Object.keys(args); if (keys.length > 0) { for (let i = 0, ken = keys.length; i < ken; i++) { const arg = args[keys[i]]; const val = arg.value; switch (arg.value.case) { default: // TODO: error handling? case "boolValue": case "byteArrayValue": case "stringValue": case "uint32Value": case "int32Value": this.args[keys[i]] = val.value; } } } //} } } /** * True if there is at least one argument, otherwise false. */ hasArgs() { return Object.keys(this.args).length > 0; } static getArgsAsFields(bId, args) { if (bId instanceof Block) { args = bId.args; bId = bId.bId; } if (args === undefined) return {}; const fields = Block.getFieldsByBlockId(bId); const obj = {}; for (let i = 0, len = fields.length; i < len; i++) { const f = fields[i]; if (f.Required === true && args[f.Name] === undefined) throw Error(`Missing argument: ${f.Name} (Type: ${f.Type})`); else if (f.Required === false && args[f.Name] === undefined) continue; obj[f.Name] = { value: { case: listedFieldTypeToGameType(f.Type), value: args[f.Name] } }; } return obj; } static getArgsAsArray(bId, args) { if (bId instanceof Block) { args = bId.args; bId = bId.bId; } if (args === undefined) return []; const arr = []; const fields = Block.getFieldsByBlockId(bId); for (let i = 0, len = fields.length; i < len; i++) { const f = fields[i]; const val = args[f.Name]; if (f.Required === true && val === undefined) throw Error(`Missing argument: ${f.Name} (Type: ${f.Type})`); else if (f.Required === false && args[f.Name] === undefined) arr.push(undefined); arr.push(args[fields[i].Name]); } return arr; } toPacket(pos, y, layer) { if (typeof pos === "number") { pos = [{ x: pos, y }]; layer = layer !== null && layer !== void 0 ? layer : 0; } else layer = y !== null && y !== void 0 ? y : 0; return { isFillOperation: false, blockId: this.bId, layer, positions: pos, fields: Block.getArgsAsFields(this), // extraFields: Block.serializeArgs(this.bId, this.args, { endian: "big", writeId: false, readTypeByte: true }) }; } /** * This will return the block name in UPPER_CASE form. * * For eg EFFECTS_INVULNERABILITY. * * @throws {MissingBlockError} * If the ID of this block is not known. */ get name() { var _a; const block = (_a = PWApiClient.listBlocks) === null || _a === void 0 ? void 0 : _a[this.bId]; if (block === undefined) throw new MissingBlockError("Current block data is missing, run Api#listBlocks first?", this.bId); return block.PaletteId.toUpperCase(); } clone(obj = false) { if (obj === true) return { bId: this.bId, args: this.args, name: this.name }; const b = new Block(this.bId); b.args = this.args; return b; } compareTo(b) { return this.bId === b.bId && compareObjs(this.args, b.args); } /** * This can be convenient as it will always return the ID if it exists, and it will throw an error if it doesn't. * * This expects the name sent to be in full upper capital form though. * * @throws {MissingBlockError} * If the connection is unknown, this can be because you're trying to use this function when Api#getListBlocks has never been invoked, or the object is missing. */ static getIdByName(paletteId) { var _a; const block = (_a = PWApiClient.listBlocksObj) === null || _a === void 0 ? void 0 : _a[paletteId.toUpperCase()]; if (block === undefined) throw new MissingBlockError("Current block data is missing, run Api#listBlocks first?", paletteId); return block.Id; } /** * This will return the corresponding palette id by the ID of that block. * * The name sent will be in full upper capital if it exists. * * @throws {MissingBlockError} * If the connection is unknown, this can be because you're trying to use this function when Api#getListBlocks has never been invoked, or the object is missing. */ static getPaletteIdById(blockId) { var _a; const block = (_a = PWApiClient.listBlocks) === null || _a === void 0 ? void 0 : _a[blockId]; if (block === undefined) throw new MissingBlockError("Current block data is missing, run Api#listBlocks first?", blockId); return block.PaletteId.toUpperCase(); } /** * Returns the block fields for that block by given block ID. * * If a block don't have args, it will return an empty array. * * If the block don't exist, it may throw an exception. */ static getFieldsByBlockId(blockId) { var _a, _b; return (_b = (_a = PWApiClient.listBlocks) === null || _a === void 0 ? void 0 : _a[blockId].Fields) !== null && _b !== void 0 ? _b : []; // const block = PWApiClient.listBlocks?.[blockId]; // return block ? MissingBlockData[block?.PaletteId.toUpperCase()] ?? (block.BlockDataArgs) as ComponentTypeHeader[] ?? [] : []; } /** * Returns the block fields for that block by given palette ID (full upper case). * * For eg "EMPTY" or "SIGN_GOLD" * * If a block don't have args, it will return an empty array. * * If the block don't exist, it may throw an exception. */ static getFieldsByPaletteId(paletteId) { var _a, _b; return (_b = (_a = PWApiClient.listBlocksObj) === null || _a === void 0 ? void 0 : _a[paletteId].Fields) !== null && _b !== void 0 ? _b : []; //MissingBlockData[paletteId] ?? (PWApiClient.listBlocksObj?.[paletteId].BlockDataArgs) as ComponentTypeHeader[] ?? [] } } // Temporary fix as some blocks currently have incorrect args // const MissingBlockData = { // SWITCH_LOCAL_ACTIVATOR: [ComponentTypeHeader.Int32, ComponentTypeHeader.Byte], // SWITCH_GLOBAL_ACTIVATOR: [ComponentTypeHeader.Int32, ComponentTypeHeader.Byte], // } as Record<string, ComponentTypeHeader[]>; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvQmxvY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUE0QyxXQUFXLEVBQWtCLE1BQU0sV0FBVyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4RSxNQUFNLENBQUMsT0FBTyxPQUFPLEtBQUs7SUFTdEIsWUFBWSxHQUFnQyxFQUFFLElBQXFHO1FBUG5KOzs7O1dBSUc7UUFDSCxTQUFJLEdBQTZCLEVBQUUsQ0FBQztRQUdoQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFFBQVE7WUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQzthQUN2QyxDQUFDO1lBQ0YsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1AsaUJBQWlCO1lBQ2pCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN0QixJQUFJLEdBQUcsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUEsU0FBUztZQUNOLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQzlDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMs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