pw-js-world
Version:
An optional package for PW-JS-Api, aims to serve world purposes.
91 lines • 7.75 kB
JavaScript
import Block from "../Block.js";
export function uint8ArrayEquals(a, b) {
if (a === b) {
return true;
}
if (a.byteLength !== b.byteLength) {
return false;
}
for (let i = 0; i < a.byteLength; i++) {
if (a[i] !== b[i]) {
return false;
}
}
return true;
}
export function map(arr, cb) {
const res = [];
if (!Array.isArray(arr))
arr = Array.from(arr.values());
for (let i = 0, len = arr.length; i < len; i++) {
res[i] = cb(arr[i], i, arr);
// if (pred(arr[i], i, arr)) res.push(arr[i]);
}
return res;
}
export function find(arr, pred) {
if (!Array.isArray(arr))
arr = Array.from(arr.values());
for (let i = 0, len = arr.length; i < len; i++) {
if (pred(arr[i], i, arr))
return arr[i];
}
return undefined;
}
export function findIndex(arr, pred) {
if (!Array.isArray(arr))
arr = Array.from(arr.values());
for (let i = 0, len = arr.length; i < len; i++) {
if (pred(arr[i], i, arr))
return i;
}
return -1;
}
export function createBlockPacket(blockId, layer, pos, ...args) {
if (blockId instanceof Block) {
args = blockId.args;
blockId = blockId.bId;
}
else if (typeof blockId !== "number") {
blockId = Block.getIdByName(blockId);
}
if (blockId === undefined)
throw Error("Unknown block ID");
if (layer === undefined || layer < 0 || layer > 2)
throw Error("Unknown layer type");
if (!Array.isArray(pos))
pos = [pos];
return {
isFillOperation: false,
blockId,
layer,
positions: pos,
extraFields: Block.serializeArgs(blockId, args, { endian: "big", writeId: false, readTypeByte: true })
};
}
/**
* Creates sendable packets from given blocks. Attempts to minimise packet count, so it's preferable
* to use it over creating packets with createBlockPacket multiple times.
*/
export function createBlockPackets(blocks) {
// Exact max packet position size is unknown, but it was noticed, it works correctly with this size
const MAX_WORLD_BLOCK_PLACED_PACKET_POSITION_SIZE = 200;
const list = [];
for (let i = 0, len = blocks.length; i < len; i++) {
const block = blocks[i];
const packet = createBlockPacket(block.block, block.layer, block.pos);
const existingPacket = find(list, pack => pack.blockId === block.block.bId &&
pack.layer === block.layer &&
pack.positions.length < MAX_WORLD_BLOCK_PLACED_PACKET_POSITION_SIZE &&
uint8ArrayEquals(pack.extraFields, packet.extraFields));
if (existingPacket) {
if (findIndex(existingPacket.positions, pos => block.pos.x === pos.x && block.pos.y === pos.y) === -1) {
existingPacket.positions.push(block.pos);
}
}
else
list.push(packet);
}
return list;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlzYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi91dGlsL01pc2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxLQUFLLE1BQU0sYUFBYSxDQUFDO0FBR2hDLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxDQUFhLEVBQUUsQ0FBYTtJQUN6RCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNWLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVELElBQUksQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEMsT0FBTyxLQUFLLENBQUE7SUFDaEIsQ0FBQztJQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDaEIsT0FBTyxLQUFLLENBQUE7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNmLENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxDQUFPLEdBQTJCLEVBQUUsRUFBNEM7SUFDL0YsTUFBTSxHQUFHLEdBQU8sRUFBRSxDQUFDO0lBRW5CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRXhELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUIsOENBQThDO0lBQ2xELENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFNLFVBQVUsSUFBSSxDQUFJLEdBQTJCLEVBQUUsSUFBb0Q7SUFDckcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFeEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUFJLEdBQTJCLEVBQUUsSUFBb0Q7SUFDMUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFeEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDZCxDQUFDO0FBT0QsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE9BQTRDLEVBQUUsS0FBZ0IsRUFBRSxHQUFvQixFQUFFLEdBQUcsSUFBZ0I7SUFDdkksSUFBSSxPQUFPLFlBQVksS0FBSyxFQUFFLENBQUM7UUFDM0IsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDcEIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUE7SUFDekIsQ0FBQztTQUNJLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkMsT0FBTyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELElBQUksT0FBTyxLQUFLLFNBQVM7UUFBRSxNQUFNLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzNELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDO1FBQUUsTUFBTSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUVyRixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUVyQyxPQUFPO1FBQ0gsZUFBZSxFQUFFLEtBQUs7UUFDdEIsT0FBTztRQUNQLEtBQUs7UUFDTCxTQUFTLEVBQUUsR0FBRztRQUNkLFdBQVcsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO0tBQzNFLENBQUM7QUFDcEMsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUF3RDtJQUN2RixtR0FBbUc7SUFDbkcsTUFBTSwyQ0FBMkMsR0FBRyxHQUFHLENBQUM7SUFFeEQsTUFBTSxJQUFJLEdBQXlCLEVBQUUsQ0FBQztJQUV0QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDaEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdEUsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUNyQyxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRztZQUNoQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLO1lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLDJDQUEyQztZQUNuRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBWSxFQUFFLE1BQU0sQ0FBQyxXQUFZLENBQUMsQ0FDM0QsQ0FBQTtRQUVELElBQUksY0FBYyxFQUFFLENBQUM7WUFDakIsSUFBSSxTQUFTLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BHLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QyxDQUFDO1FBQ0wsQ0FBQzs7WUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNoQixDQUFDIn0=