pw-js-world
Version:
An optional package for PW-JS-Api, aims to serve world purposes.
199 lines • 14.6 kB
JavaScript
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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