pw-js-world
Version:
An optional package for PW-JS-Api, aims to serve world purposes.
246 lines • 22.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DeserialisedStructure = void 0;
const tslib_1 = require("tslib");
const Block_js_1 = tslib_1.__importDefault(require("./Block.js"));
const Misc_js_1 = require("./util/Misc.js");
/**
* This is external to the main Helper, it will allow developers to use the structure without needing to use helper if they so wish.
*
* All of the functions are static!
*/
class StructureHelper {
/**
* NOTE: If you're reading a file, you must get it then pass it to read.
*
* This is for reading the structure itself, if you have just the blocks (and width/height), you must use deserialiseStructBlocks;
*
* @param data Buffer representing the JSON structure itself.
*/
static read(data) {
if (data instanceof Uint8Array) {
const decoder = new TextDecoder();
data = JSON.parse(decoder.decode(data));
}
const json = "version" in data ? data : JSON.parse(data.toString());
if (json.version === undefined || json.version < 1 || json.version > 1)
throw Error("Unknown file format");
const desed = this.deserialiseStructBlocks(json.blocks, json.width, json.height);
return new DeserialisedStructure(desed.blocks, { width: desed.width, height: desed.height });
}
/**
* If width or height are not provided, the structure may be trimmed (empty blocks).
*
* This is ideal if you want the trimmed structure in that case.
*/
static deserialiseStructBlocks(struct, width, height) {
var _a, _b, _c, _d, _e, _f;
var _g, _h, _j, _k, _l, _m;
const { args, blocks, mapping } = struct;
const deBlocks = [[], [], []];
let isMissing = width === undefined || height === undefined;
if (width !== undefined && height !== undefined) {
for (let x = 0; x < width; x++) {
deBlocks[0][x] = [];
deBlocks[1][x] = [];
deBlocks[2][x] = [];
for (let y = 0; y < height; y++) {
deBlocks[0][x][y] = new Block_js_1.default(0);
deBlocks[1][x][y] = new Block_js_1.default(0);
deBlocks[2][x][y] = new Block_js_1.default(0);
}
}
}
let big = { x: 0, y: 0 };
for (let i = 0, ien = blocks.length; i < ien; i++) {
// While foreground and background layers are only supported for now, it's possible there are more layers in the future.
for (let l = 0, len = blocks[i].length; l < len; l++) {
for (let b = 0, ben = blocks[i][l].length; b < ben; b++) {
const block = blocks[i][l][b];
// It's a bit spammy and a lot of checks so this will only trigger if width/height are missing
// This is also to prevent errors, the missing elements will then be filled at the end.
if (isMissing) {
if (deBlocks[l] === undefined)
deBlocks[l] = [];
if (deBlocks[l][block[0]] === undefined)
deBlocks[l][block[0]] = [];
if (block[0] > big.x)
big.x = block[0];
if (block[1] > big.y)
big.y = block[1];
}
const deBlock = deBlocks[l][block[0]][block[1]] = new Block_js_1.default(mapping[i]);
const fields = Block_js_1.default.getFieldsByBlockId(deBlock.bId);
for (let a = 2, alen = block.length; a < alen; a++) {
let arg = args[block[a]];
if (typeof arg === "string" && arg.startsWith("\x00"))
arg = Uint8Array.from(arg.slice(1));
deBlock.args[fields[a - 2].Name] = arg;
}
}
}
}
if (width === undefined || height === undefined) {
for (let x = 0; x < big.x; x++) {
(_a = (_g = deBlocks[0])[x]) !== null && _a !== void 0 ? _a : (_g[x] = []);
(_b = (_h = deBlocks[1])[x]) !== null && _b !== void 0 ? _b : (_h[x] = []);
(_c = (_j = deBlocks[2])[x]) !== null && _c !== void 0 ? _c : (_j[x] = []);
for (let y = 0; y < big.y; y++) {
(_d = (_k = deBlocks[0][x])[y]) !== null && _d !== void 0 ? _d : (_k[y] = new Block_js_1.default(0));
(_e = (_l = deBlocks[1][x])[y]) !== null && _e !== void 0 ? _e : (_l[y] = new Block_js_1.default(0));
(_f = (_m = deBlocks[2][x])[y]) !== null && _f !== void 0 ? _f : (_m[y] = new Block_js_1.default(0));
}
}
return {
blocks: deBlocks,
width: big.x, height: big.y
};
}
return {
blocks: deBlocks,
width, height
};
}
}
exports.default = StructureHelper;
/**
* Represents the structure in its deserialised form, allows for modification
*/
class DeserialisedStructure {
constructor(blocks, struct) {
this.blocks = blocks;
this.width = struct.width;
this.height = struct.height;
}
/**
* This will return a new object that meets IStructureBlocks interface.
*
* NOTE: This requires you to have called API getlistblocks (unless you have joined the world)
*/
getSerialisedBlocks() {
var _a;
const blocks = [];
const args = [];
const mapping = [];
// corresponds to the index in mapping array.
const mappingDone = {};
const argDone = new Map();
for (let l = 0; l < this.blocks.length; l++) {
for (let x = 0; x < this.width; x++) {
for (let y = 0; y < this.height; y++) {
const block = this.blocks[l][x][y];
const blockName = block.name;
if (block.bId === 0)
continue;
if (mappingDone[block.bId] === undefined) {
mappingDone[block.bId] = mapping.push(blockName) - 1;
blocks[mappingDone[block.bId]] = [[], [], []];
}
const index = mappingDone[block.bId];
if (blocks[index][l] === undefined)
blocks[index][l] = [];
const toPut = [x, y];
// const keys = Object.keys(block.args);
const args = Block_js_1.default.getArgsAsArray(block);
for (let a = 0, argsLen = args.length; a < argsLen; a++) {
const arg = (args[a] instanceof Uint8Array) ? "\x00" + ((_a = args[a]) === null || _a === void 0 ? void 0 : _a.toString()) : args[a];
let argIndex = argDone.get(arg);
if (argIndex === undefined) {
argIndex = argDone.set(arg, args.push(arg) - 1).get(arg);
}
if (argIndex === undefined)
throw Error("This should be impossible at this point, but left for type safety.");
toPut[2 + a] = argIndex;
}
// for (let a = 0, argsLen = keys.length; a < argsLen; a++) {
// const arg = Buffer.isBuffer(block.args[keys[a]]) ? "\x00" + block.args[keys[a]].toString() : block.args[keys[a]];
// let argIndex = argDone.get(arg);
// if (argIndex === undefined) {
// argDone.set(arg, args.push(arg) - 1);
// argIndex = argDone.get(arg);
// }
// if (argIndex === undefined)
// toPut[2 + a] = argIndex;
// }
blocks[index][l].push(toPut);
}
}
}
return {
mapping,
args,
blocks
};
}
/**
* This will return the structure form, giving you the freedom to choose your own way of saving.
*/
toStruct() {
const struct = this.getSerialisedBlocks();
return {
width: this.width,
height: this.height,
version: 1,
blocks: struct
};
}
/**
* Buffer form of the structure.
*
* Ideal for server runtimes (and browser if polyfilled)
*/
toBuffer() {
return Buffer.from(this.toJSONString());
}
/**
* The JSON stringified of the structure.
*/
toJSONString(space) {
return JSON.stringify(this.toStruct(), undefined, space);
}
/**
* (This is for browser client or Bun)
*
* Blob form of the structure.
*/
toBlob() {
return new Blob([this.toJSONString()]);
}
/**
* Uint8Array form of the structure.
*/
toBytes() {
const encoder = new TextEncoder();
const bytes = encoder.encode(this.toJSONString());
return bytes;
}
toPackets(x, y, helper) {
const blockies = [];
if (helper) {
const maxWidth = this.width + x;
const maxHeight = this.height + y;
for (let l = 0; l < helper.blocks.length; l++) {
for (let x2 = x; x2 < helper.width && x2 < maxWidth; x2++) {
for (let y2 = y; y2 < helper.height && y2 < maxHeight; y2++) {
const currBlock = helper.blocks[l][x2 - x][y2 - y];
const structBlock = this.blocks[l][x2 - x][y2 - y];
if (!currBlock.compareTo(structBlock))
blockies.push({ block: this.blocks[l][x2][y2], layer: l, pos: { x: x2, y: y2 } });
}
}
}
}
else {
for (let l = 0; l < this.blocks.length; l++) {
for (let x2 = 0; x2 < this.width; x2++) {
for (let y2 = 0; y2 < this.height; y2++) {
blockies.push({ block: this.blocks[l][x2][y2], layer: l, pos: { x: x + x2, y: y + y2 } });
}
}
}
}
return (0, Misc_js_1.createBlockPackets)(blockies);
}
}
exports.DeserialisedStructure = DeserialisedStructure;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RydWN0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL1N0cnVjdHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsa0VBQStCO0FBSS9CLDRDQUFvRDtBQUVwRDs7OztHQUlHO0FBQ0gsTUFBcUIsZUFBZTtJQUNoQzs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQXNDO1FBQzlDLElBQUksSUFBSSxZQUFZLFVBQVUsRUFBRSxDQUFDO1lBQzdCLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7WUFDbEMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFlLENBQUM7UUFFbEYsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUM7WUFBRSxNQUFNLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRTNHLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWpGLE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFD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