@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
92 lines (91 loc) • 11.9 kB
JavaScript
import { BlockMappings } from "../../block/BlockMappings.es.js";
//#region src/world/chunk/BlockStorage.ts
var BlockStorage = class BlockStorage {
blocks;
palette;
constructor({ blocks, palette }) {
this.palette = palette ?? [BlockMappings.getRuntimeId("minecraft:air")];
this.blocks = blocks ?? Array.from({ length: 4096 }).fill(0);
}
static getIndex(bx, by, bz) {
bx = bx & 15;
bz = bz & 15;
by = by & 15;
return (bx << 8) + (bz << 4) | by;
}
getBlock(bx, by, bz) {
const paletteIndex = this.blocks[BlockStorage.getIndex(bx, by, bz)];
const runtimeId = this.palette[paletteIndex];
return BlockMappings.getLegacyId(runtimeId);
}
setBlock(bx, by, bz, runtimeId) {
if (!this.palette.includes(runtimeId)) this.palette.push(runtimeId);
this.blocks[BlockStorage.getIndex(bx, by, bz)] = this.palette.indexOf(runtimeId);
}
networkSerialize(stream) {
let bitsPerBlock = Math.ceil(Math.log2(this.palette.length));
switch (bitsPerBlock) {
case 0:
bitsPerBlock = 1;
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6: break;
case 7:
case 8:
bitsPerBlock = 8;
break;
default:
bitsPerBlock = 16;
break;
}
stream.writeByte(bitsPerBlock << 1 | 1);
const blocksPerWord = Math.floor(32 / bitsPerBlock);
const wordsPerChunk = Math.ceil(4096 / blocksPerWord);
let position = 0;
for (let w = 0; w < wordsPerChunk; w++) {
let word = 0;
for (let block = 0; block < blocksPerWord; block++) {
const state = this.blocks[position++];
word |= state << bitsPerBlock * block;
}
stream.writeIntLE(word);
}
stream.writeVarInt(this.palette.length);
for (const val of this.palette) stream.writeVarInt(val);
}
static networkDeserialize(stream) {
const bitsPerBlock = stream.readByte() >> 1;
const blocksPerWord = Math.floor(32 / bitsPerBlock);
const wordsPerChunk = Math.ceil(4096 / blocksPerWord);
const words = new Array(wordsPerChunk);
for (let w = 0; w < wordsPerChunk; w++) words[w] = stream.readIntLE();
const paletteCount = stream.readVarInt();
const palette = new Array(paletteCount);
for (let i = 0; i < paletteCount; i++) palette[i] = stream.readVarInt();
let positon = 0;
const storage = new BlockStorage({ palette });
for (let w = 0; w < wordsPerChunk; w++) {
const word = words[w];
for (let block = 0; block < blocksPerWord; block++) {
const state = word >> positon % blocksPerWord * bitsPerBlock & (1 << bitsPerBlock) - 1;
const x = positon >> 8 & 15;
const y = positon & 15;
const z = positon >> 4 & 15;
const translated = palette[state];
storage.setBlock(x, y, z, translated);
positon++;
}
}
return storage;
}
isEmpty() {
return this.palette.length === 1;
}
};
//#endregion
export { BlockStorage as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2tTdG9yYWdlLmVzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93b3JsZC9jaHVuay9CbG9ja1N0b3JhZ2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBMZWdhY3lJZCB9IGZyb20gJy4uLy4uL2Jsb2NrL0Jsb2NrTWFwcGluZ3MnO1xuaW1wb3J0IHsgQmxvY2tNYXBwaW5ncyB9IGZyb20gJy4uLy4uL2Jsb2NrL0Jsb2NrTWFwcGluZ3MnO1xuXG5pbXBvcnQgdHlwZSBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcblxuaW50ZXJmYWNlIEJsb2NrU3RvcmFnZURhdGEge1xuICAgIGJsb2Nrcz86IG51bWJlcltdO1xuICAgIHBhbGV0dGU/OiBudW1iZXJbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmxvY2tTdG9yYWdlIHtcbiAgICBwcml2YXRlIGJsb2NrczogbnVtYmVyW107XG4gICAgcHJpdmF0ZSBwYWxldHRlOiBudW1iZXJbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih7IGJsb2NrcywgcGFsZXR0ZSB9OiBCbG9ja1N0b3JhZ2VEYXRhKSB7XG4gICAgICAgIHRoaXMucGFsZXR0ZSA9IHBhbGV0dGUgPz8gW0Jsb2NrTWFwcGluZ3MuZ2V0UnVudGltZUlkKCdtaW5lY3JhZnQ6YWlyJyldO1xuICAgICAgICB0aGlzLmJsb2NrcyA9IGJsb2NrcyA/PyBBcnJheS5mcm9tPG51bWJlcj4oeyBsZW5ndGg6IDQwOTYgfSkuZmlsbCgwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRJbmRleChieDogbnVtYmVyLCBieTogbnVtYmVyLCBiejogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgYnggPSBieCAmIDB4MGY7XG4gICAgICAgIGJ6ID0gYnogJiAweDBmO1xuICAgICAgICBieSA9IGJ5ICYgMHgwZjtcbiAgICAgICAgcmV0dXJuICgoYnggPDwgOCkgKyAoYnogPDwgNCkpIHwgYnk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEJsb2NrKGJ4OiBudW1iZXIsIGJ5OiBudW1iZXIsIGJ6OiBudW1iZXIpOiBMZWdhY3lJZCB7XG4gICAgICAgIGNvbnN0IHBhbGV0dGVJbmRleCA9IHRoaXMuYmxvY2tzW0Jsb2NrU3RvcmFnZS5nZXRJbmRleChieCwgYnksIGJ6KV0hO1xuICAgICAgICBjb25zdCBydW50aW1lSWQgPSB0aGlzLnBhbGV0dGVbcGFsZXR0ZUluZGV4XSE7XG4gICAgICAgIHJldHVybiBCbG9ja01hcHBpbmdzLmdldExlZ2FjeUlkKHJ1bnRpbWVJZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEJsb2NrKGJ4OiBudW1iZXIsIGJ5OiBudW1iZXIsIGJ6OiBudW1iZXIsIHJ1bnRpbWVJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5wYWxldHRlLmluY2x1ZGVzKHJ1bnRpbWVJZCkpIHtcbiAgICAgICAgICAgIHRoaXMucGFsZXR0ZS5wdXNoKHJ1bnRpbWVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ibG9ja3NbQmxvY2tTdG9yYWdlLmdldEluZGV4KGJ4LCBieSwgYnopXSA9IHRoaXMucGFsZXR0ZS5pbmRleE9mKHJ1bnRpbWVJZCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5ldHdvcmtTZXJpYWxpemUoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiB2b2lkIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vVG9tY2MvYTk2YWY1MDllMjc1YjFhZjQ4M2IyNWM1NDNjZmJmMzdcbiAgICAgICAgbGV0IGJpdHNQZXJCbG9jayA9IE1hdGguY2VpbChNYXRoLmxvZzIodGhpcy5wYWxldHRlLmxlbmd0aCkpO1xuXG4gICAgICAgIHN3aXRjaCAoYml0c1BlckJsb2NrKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgYml0c1BlckJsb2NrID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICBiaXRzUGVyQmxvY2sgPSA4O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBiaXRzUGVyQmxvY2sgPSAxNjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDcgYml0OiBzdG9yYWdlIHR5cGUsIDEgYml0IChzaGlmdCB0byBlbmQpOiBuZXR3b3JrIGZvcm1hdCAoYWx3YXlzIDEpXG4gICAgICAgIHN0cmVhbS53cml0ZUJ5dGUoKGJpdHNQZXJCbG9jayA8PCAxKSB8IDEpO1xuICAgICAgICBjb25zdCBibG9ja3NQZXJXb3JkID0gTWF0aC5mbG9vcigzMiAvIGJpdHNQZXJCbG9jayk7XG4gICAgICAgIGNvbnN0IHdvcmRzUGVyQ2h1bmsgPSBNYXRoLmNlaWwoNDA5NiAvIGJsb2Nrc1BlcldvcmQpO1xuXG4gICAgICAgIC8vIEVuY29kaW5nIGV4YW1wbGVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL05pY2xhc09sb2Zzc29uL01pTkVUL2Jsb2IvNGFjYmNjYjZkZWRhZTA2NjU0N2Y4NDg2YTJhY2UxYzlkNmRiMDA4NC9zcmMvTWlORVQvTWlORVQvV29ybGRzL1N1YkNodW5rLmNzI0wyOTRcbiAgICAgICAgbGV0IHBvc2l0aW9uID0gMDtcbiAgICAgICAgZm9yIChsZXQgdyA9IDA7IHcgPCB3b3Jkc1BlckNodW5rOyB3KyspIHtcbiAgICAgICAgICAgIGxldCB3b3JkID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGJsb2NrID0gMDsgYmxvY2sgPCBibG9ja3NQZXJXb3JkOyBibG9jaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmJsb2Nrc1twb3NpdGlvbisrXSE7XG4gICAgICAgICAgICAgICAgd29yZCB8PSBzdGF0ZSA8PCAoYml0c1BlckJsb2NrICogYmxvY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyZWFtLndyaXRlSW50TEUod29yZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSBwYWxldHRlIGVudHJpZXMgYXMgcnVudGltZSBpZHNcbiAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KHRoaXMucGFsZXR0ZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLnBhbGV0dGUpIHtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVZhckludCh2YWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBuZXR3b3JrRGVzZXJpYWxpemUoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiBCbG9ja1N0b3JhZ2Uge1xuICAgICAgICBjb25zdCBiaXRzUGVyQmxvY2sgPSBzdHJlYW0ucmVhZEJ5dGUoKSA+PiAxO1xuICAgICAgICBjb25zdCBibG9ja3NQZXJXb3JkID0gTWF0aC5mbG9vcigzMiAvIGJpdHNQZXJCbG9jayk7XG4gICAgICAgIGNvbnN0IHdvcmRzUGVyQ2h1bmsgPSBNYXRoLmNlaWwoNDA5NiAvIGJsb2Nrc1BlcldvcmQpO1xuXG4gICAgICAgIGNvbnN0IHdvcmRzOiBudW1iZXJbXSA9IG5ldyBBcnJheSh3b3Jkc1BlckNodW5rKTtcbiAgICAgICAgZm9yIChsZXQgdyA9IDA7IHcgPCB3b3Jkc1BlckNodW5rOyB3KyspIHtcbiAgICAgICAgICAgIHdvcmRzW3ddID0gc3RyZWFtLnJlYWRJbnRMRSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFsZXR0ZUNvdW50ID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgY29uc3QgcGFsZXR0ZTogbnVtYmVyW10gPSBuZXcgQXJyYXkocGFsZXR0ZUNvdW50KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWxldHRlQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmNvZGluZyBleGFtcGxlXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rZW5ueXZ2L0FsZXgvYmxvYi9kY2NhMGQ2OTdiYmIyNTYzN2E4YmNmYTkzODMwZjhhNzYyYzQ2M2FmL3NyYy9BbGV4L1dvcmxkcy9NdWx0aXBsYXllci9CZWRyb2NrL0NodW5rUHJvY2Vzc29yLmNzI0wzNjdcblxuICAgICAgICBsZXQgcG9zaXRvbiA9IDA7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBuZXcgQmxvY2tTdG9yYWdlKHsgcGFsZXR0ZSB9KTtcbiAgICAgICAgZm9yIChsZXQgdyA9IDA7IHcgPCB3b3Jkc1BlckNodW5rOyB3KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmQgPSB3b3Jkc1t3XSE7XG4gICAgICAgICAgICBmb3IgKGxldCBibG9jayA9IDA7IGJsb2NrIDwgYmxvY2tzUGVyV29yZDsgYmxvY2srKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gKHdvcmQgPj4gKChwb3NpdG9uICUgYmxvY2tzUGVyV29yZCkgKiBiaXRzUGVyQmxvY2spKSAmICgoMSA8PCBiaXRzUGVyQmxvY2spIC0gMSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gKHBvc2l0b24gPj4gOCkgJiAweGY7XG4gICAgICAgICAgICAgICAgY29uc3QgeSA9IHBvc2l0b24gJiAweGY7XG4gICAgICAgICAgICAgICAgY29uc3QgeiA9IChwb3NpdG9uID4+IDQpICYgMHhmO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHBhbGV0dGVbc3RhdGVdITtcbiAgICAgICAgICAgICAgICBzdG9yYWdlLnNldEJsb2NrKHgsIHksIHosIHRyYW5zbGF0ZWQpO1xuICAgICAgICAgICAgICAgIHBvc2l0b24rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RvcmFnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFsZXR0ZS5sZW5ndGggPT09IDE7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOztBQVVBLElBQXFCLGVBQXJCLE1BQXFCLGFBQWE7Q0FDOUI7Q0FDQTtDQUVBLFlBQW1CLEVBQUUsUUFBUSxXQUE2QjtFQUN0RCxLQUFLLFVBQVUsV0FBVyxDQUFDLGNBQWMsYUFBYSxlQUFlLENBQUM7RUFDdEUsS0FBSyxTQUFTLFVBQVUsTUFBTSxLQUFhLEVBQUUsUUFBUSxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUM7Q0FDdkU7Q0FFQSxPQUFlLFNBQVMsSUFBWSxJQUFZLElBQW9CO0VBQ2hFLEtBQUssS0FBSztFQUNWLEtBQUssS0FBSztFQUNWLEtBQUssS0FBSztFQUNWLFFBQVMsTUFBTSxNQUFNLE1BQU0sS0FBTTtDQUNyQztDQUVBLFNBQWdCLElBQVksSUFBWSxJQUFzQjtFQUMxRCxNQUFNLGVBQWUsS0FBSyxPQUFPLGFBQWEsU0FBUyxJQUFJLElBQUksRUFBRTtFQUNqRSxNQUFNLFlBQVksS0FBSyxRQUFRO0VBQy9CLE9BQU8sY0FBYyxZQUFZLFNBQVM7Q0FDOUM7Q0FFQSxTQUFnQixJQUFZLElBQVksSUFBWSxXQUF5QjtFQUN6RSxJQUFJLENBQUMsS0FBSyxRQUFRLFNBQVMsU0FBUyxHQUNoQyxLQUFLLFFBQVEsS0FBSyxTQUFTO0VBRS9CLEtBQUssT0FBTyxhQUFhLFNBQVMsSUFBSSxJQUFJLEVBQUUsS0FBSyxLQUFLLFFBQVEsUUFBUSxTQUFTO0NBQ25GO0NBRUEsaUJBQXdCLFFBQTRCO0VBRWhELElBQUksZUFBZSxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssUUFBUSxNQUFNLENBQUM7RUFFM0QsUUFBUSxjQUFSO0dBQ0ksS0FBSztJQUNELGVBQWU7SUFDZjtHQUNKLEtBQUs7R0FDTCxLQUFLO0dBQ0wsS0FBSztHQUNMLEtBQUs7R0FDTCxLQUFLO0dBQ0wsS0FBSyxHQUNEO0dBQ0osS0FBSztHQUNMLEtBQUs7SUFDRCxlQUFlO0lBQ2Y7R0FDSjtJQUNJLGVBQWU7SUFDZjtFQUNSO0VBR0EsT0FBTyxVQUFXLGdCQUFnQixJQUFLLENBQUM7RUFDeEMsTUFBTSxnQkFBZ0IsS0FBSyxNQUFNLEtBQUssWUFBWTtFQUNsRCxNQUFNLGdCQUFnQixLQUFLLEtBQUssT0FBTyxhQUFhO0VBSXBELElBQUksV0FBVztFQUNmLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxlQUFlLEtBQUs7R0FDcEMsSUFBSSxPQUFPO0dBQ1gsS0FBSyxJQUFJLFFBQVEsR0FBRyxRQUFRLGVBQWUsU0FBUztJQUNoRCxNQUFNLFFBQVEsS0FBSyxPQUFPO0lBQzFCLFFBQVEsU0FBVSxlQUFlO0dBQ3JDO0dBQ0EsT0FBTyxXQUFXLElBQUk7RUFDMUI7RUFHQSxPQUFPLFlBQVksS0FBSyxRQUFRLE1BQU07RUFDdEMsS0FBSyxNQUFNLE9BQU8sS0FBSyxTQUNuQixPQUFPLFlBQVksR0FBRztDQUU5QjtDQUVBLE9BQWMsbUJBQW1CLFFBQW9DO0VBQ2pFLE1BQU0sZUFBZSxPQUFPLFNBQVMsS0FBSztFQUMxQyxNQUFNLGdCQUFnQixLQUFLLE1BQU0sS0FBSyxZQUFZO0VBQ2xELE1BQU0sZ0JBQWdCLEtBQUssS0FBSyxPQUFPLGFBQWE7RUFFcEQsTUFBTSxRQUFrQixJQUFJLE1BQU0sYUFBYTtFQUMvQyxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksZUFBZSxLQUMvQixNQUFNLEtBQUssT0FBTyxVQUFVO0VBR2hDLE1BQU0sZUFBZSxPQUFPLFdBQVc7RUFDdkMsTUFBTSxVQUFvQixJQUFJLE1BQU0sWUFBWTtFQUNoRCxLQUFLLElBQUksSUFBSSxHQUFHLElBQUksY0FBYyxLQUM5QixRQUFRLEtBQUssT0FBTyxXQUFXO0VBTW5DLElBQUksVUFBVTtFQUNkLE1BQU0sVUFBVSxJQUFJLGFBQWEsRUFBRSxRQUFRLENBQUM7RUFDNUMsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLGVBQWUsS0FBSztHQUNwQyxNQUFNLE9BQU8sTUFBTTtHQUNuQixLQUFLLElBQUksUUFBUSxHQUFHLFFBQVEsZUFBZSxTQUFTO0lBQ2hELE1BQU0sUUFBUyxRQUFVLFVBQVUsZ0JBQWlCLGdCQUFtQixLQUFLLGdCQUFnQjtJQUU1RixNQUFNLElBQUssV0FBVyxJQUFLO0lBQzNCLE1BQU0sSUFBSSxVQUFVO0lBQ3BCLE1BQU0sSUFBSyxXQUFXLElBQUs7SUFFM0IsTUFBTSxhQUFhLFFBQVE7SUFDM0IsUUFBUSxTQUFTLEdBQUcsR0FBRyxHQUFHLFVBQVU7SUFDcEM7R0FDSjtFQUNKO0VBQ0EsT0FBTztDQUNYO0NBRUEsVUFBMEI7RUFDdEIsT0FBTyxLQUFLLFFBQVEsV0FBVztDQUNuQztBQUNKIn0=