@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
105 lines (100 loc) • 14.5 kB
JavaScript
;
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
const block_BlockMappings = require('../../block/BlockMappings.cjs.cjs');
class BlockStorage {
blocks;
palette;
constructor({ blocks, palette }) {
this.palette = palette ?? [block_BlockMappings.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 block_BlockMappings.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;
}
}
exports.default = BlockStorage;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2tTdG9yYWdlLmNqcy5janMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93b3JsZC9jaHVuay9CbG9ja1N0b3JhZ2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBMZWdhY3lJZCB9IGZyb20gJy4uLy4uL2Jsb2NrL0Jsb2NrTWFwcGluZ3MnO1xuaW1wb3J0IHsgQmxvY2tNYXBwaW5ncyB9IGZyb20gJy4uLy4uL2Jsb2NrL0Jsb2NrTWFwcGluZ3MnO1xuXG5pbXBvcnQgdHlwZSBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcblxuaW50ZXJmYWNlIEJsb2NrU3RvcmFnZURhdGEge1xuICAgIGJsb2Nrcz86IG51bWJlcltdO1xuICAgIHBhbGV0dGU/OiBudW1iZXJbXTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQmxvY2tTdG9yYWdlIHtcbiAgICBwcml2YXRlIGJsb2NrczogbnVtYmVyW107XG4gICAgcHJpdmF0ZSBwYWxldHRlOiBudW1iZXJbXTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih7IGJsb2NrcywgcGFsZXR0ZSB9OiBCbG9ja1N0b3JhZ2VEYXRhKSB7XG4gICAgICAgIHRoaXMucGFsZXR0ZSA9IHBhbGV0dGUgPz8gW0Jsb2NrTWFwcGluZ3MuZ2V0UnVudGltZUlkKCdtaW5lY3JhZnQ6YWlyJyldO1xuICAgICAgICB0aGlzLmJsb2NrcyA9IGJsb2NrcyA/PyBBcnJheS5mcm9tPG51bWJlcj4oeyBsZW5ndGg6IDQwOTYgfSkuZmlsbCgwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRJbmRleChieDogbnVtYmVyLCBieTogbnVtYmVyLCBiejogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgYnggPSBieCAmIDB4MGY7XG4gICAgICAgIGJ6ID0gYnogJiAweDBmO1xuICAgICAgICBieSA9IGJ5ICYgMHgwZjtcbiAgICAgICAgcmV0dXJuICgoYnggPDwgOCkgKyAoYnogPDwgNCkpIHwgYnk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEJsb2NrKGJ4OiBudW1iZXIsIGJ5OiBudW1iZXIsIGJ6OiBudW1iZXIpOiBMZWdhY3lJZCB7XG4gICAgICAgIGNvbnN0IHBhbGV0dGVJbmRleCA9IHRoaXMuYmxvY2tzW0Jsb2NrU3RvcmFnZS5nZXRJbmRleChieCwgYnksIGJ6KV0hO1xuICAgICAgICBjb25zdCBydW50aW1lSWQgPSB0aGlzLnBhbGV0dGVbcGFsZXR0ZUluZGV4XSE7XG4gICAgICAgIHJldHVybiBCbG9ja01hcHBpbmdzLmdldExlZ2FjeUlkKHJ1bnRpbWVJZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEJsb2NrKGJ4OiBudW1iZXIsIGJ5OiBudW1iZXIsIGJ6OiBudW1iZXIsIHJ1bnRpbWVJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5wYWxldHRlLmluY2x1ZGVzKHJ1bnRpbWVJZCkpIHtcbiAgICAgICAgICAgIHRoaXMucGFsZXR0ZS5wdXNoKHJ1bnRpbWVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ibG9ja3NbQmxvY2tTdG9yYWdlLmdldEluZGV4KGJ4LCBieSwgYnopXSA9IHRoaXMucGFsZXR0ZS5pbmRleE9mKHJ1bnRpbWVJZCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5ldHdvcmtTZXJpYWxpemUoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiB2b2lkIHtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vVG9tY2MvYTk2YWY1MDllMjc1YjFhZjQ4M2IyNWM1NDNjZmJmMzdcbiAgICAgICAgbGV0IGJpdHNQZXJCbG9jayA9IE1hdGguY2VpbChNYXRoLmxvZzIodGhpcy5wYWxldHRlLmxlbmd0aCkpO1xuXG4gICAgICAgIHN3aXRjaCAoYml0c1BlckJsb2NrKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgYml0c1BlckJsb2NrID0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgICAgICBiaXRzUGVyQmxvY2sgPSA4O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBiaXRzUGVyQmxvY2sgPSAxNjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDcgYml0OiBzdG9yYWdlIHR5cGUsIDEgYml0IChzaGlmdCB0byBlbmQpOiBuZXR3b3JrIGZvcm1hdCAoYWx3YXlzIDEpXG4gICAgICAgIHN0cmVhbS53cml0ZUJ5dGUoKGJpdHNQZXJCbG9jayA8PCAxKSB8IDEpO1xuICAgICAgICBjb25zdCBibG9ja3NQZXJXb3JkID0gTWF0aC5mbG9vcigzMiAvIGJpdHNQZXJCbG9jayk7XG4gICAgICAgIGNvbnN0IHdvcmRzUGVyQ2h1bmsgPSBNYXRoLmNlaWwoNDA5NiAvIGJsb2Nrc1BlcldvcmQpO1xuXG4gICAgICAgIC8vIEVuY29kaW5nIGV4YW1wbGVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL05pY2xhc09sb2Zzc29uL01pTkVUL2Jsb2IvNGFjYmNjYjZkZWRhZTA2NjU0N2Y4NDg2YTJhY2UxYzlkNmRiMDA4NC9zcmMvTWlORVQvTWlORVQvV29ybGRzL1N1YkNodW5rLmNzI0wyOTRcbiAgICAgICAgbGV0IHBvc2l0aW9uID0gMDtcbiAgICAgICAgZm9yIChsZXQgdyA9IDA7IHcgPCB3b3Jkc1BlckNodW5rOyB3KyspIHtcbiAgICAgICAgICAgIGxldCB3b3JkID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGJsb2NrID0gMDsgYmxvY2sgPCBibG9ja3NQZXJXb3JkOyBibG9jaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLmJsb2Nrc1twb3NpdGlvbisrXSE7XG4gICAgICAgICAgICAgICAgd29yZCB8PSBzdGF0ZSA8PCAoYml0c1BlckJsb2NrICogYmxvY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RyZWFtLndyaXRlSW50TEUod29yZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcml0ZSBwYWxldHRlIGVudHJpZXMgYXMgcnVudGltZSBpZHNcbiAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KHRoaXMucGFsZXR0ZS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB0aGlzLnBhbGV0dGUpIHtcbiAgICAgICAgICAgIHN0cmVhbS53cml0ZVZhckludCh2YWwpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBuZXR3b3JrRGVzZXJpYWxpemUoc3RyZWFtOiBCaW5hcnlTdHJlYW0pOiBCbG9ja1N0b3JhZ2Uge1xuICAgICAgICBjb25zdCBiaXRzUGVyQmxvY2sgPSBzdHJlYW0ucmVhZEJ5dGUoKSA+PiAxO1xuICAgICAgICBjb25zdCBibG9ja3NQZXJXb3JkID0gTWF0aC5mbG9vcigzMiAvIGJpdHNQZXJCbG9jayk7XG4gICAgICAgIGNvbnN0IHdvcmRzUGVyQ2h1bmsgPSBNYXRoLmNlaWwoNDA5NiAvIGJsb2Nrc1BlcldvcmQpO1xuXG4gICAgICAgIGNvbnN0IHdvcmRzOiBudW1iZXJbXSA9IG5ldyBBcnJheSh3b3Jkc1BlckNodW5rKTtcbiAgICAgICAgZm9yIChsZXQgdyA9IDA7IHcgPCB3b3Jkc1BlckNodW5rOyB3KyspIHtcbiAgICAgICAgICAgIHdvcmRzW3ddID0gc3RyZWFtLnJlYWRJbnRMRSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFsZXR0ZUNvdW50ID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgY29uc3QgcGFsZXR0ZTogbnVtYmVyW10gPSBuZXcgQXJyYXkocGFsZXR0ZUNvdW50KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYWxldHRlQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmNvZGluZyBleGFtcGxlXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rZW5ueXZ2L0FsZXgvYmxvYi9kY2NhMGQ2OTdiYmIyNTYzN2E4YmNmYTkzODMwZjhhNzYyYzQ2M2FmL3NyYy9BbGV4L1dvcmxkcy9NdWx0aXBsYXllci9CZWRyb2NrL0NodW5rUHJvY2Vzc29yLmNzI0wzNjdcblxuICAgICAgICBsZXQgcG9zaXRvbiA9IDA7XG4gICAgICAgIGNvbnN0IHN0b3JhZ2UgPSBuZXcgQmxvY2tTdG9yYWdlKHsgcGFsZXR0ZSB9KTtcbiAgICAgICAgZm9yIChsZXQgdyA9IDA7IHcgPCB3b3Jkc1BlckNodW5rOyB3KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmQgPSB3b3Jkc1t3XSE7XG4gICAgICAgICAgICBmb3IgKGxldCBibG9jayA9IDA7IGJsb2NrIDwgYmxvY2tzUGVyV29yZDsgYmxvY2srKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gKHdvcmQgPj4gKChwb3NpdG9uICUgYmxvY2tzUGVyV29yZCkgKiBiaXRzUGVyQmxvY2spKSAmICgoMSA8PCBiaXRzUGVyQmxvY2spIC0gMSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB4ID0gKHBvc2l0b24gPj4gOCkgJiAweGY7XG4gICAgICAgICAgICAgICAgY29uc3QgeSA9IHBvc2l0b24gJiAweGY7XG4gICAgICAgICAgICAgICAgY29uc3QgeiA9IChwb3NpdG9uID4+IDQpICYgMHhmO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHBhbGV0dGVbc3RhdGVdITtcbiAgICAgICAgICAgICAgICBzdG9yYWdlLnNldEJsb2NrKHgsIHksIHosIHRyYW5zbGF0ZWQpO1xuICAgICAgICAgICAgICAgIHBvc2l0b24rKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RvcmFnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNFbXB0eSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFsZXR0ZS5sZW5ndGggPT09IDE7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIkJsb2NrTWFwcGluZ3MiXSwibWFwcGluZ3MiOiI7Ozs7OztBQVVBLE1BQXFCLFlBQWEsQ0FBQTtBQUFBLEVBQ3RCLE1BQUE7QUFBQSxFQUNBLE9BQUE7QUFBQSxFQUVELFdBQVksQ0FBQSxFQUFFLE1BQVEsRUFBQSxPQUFBLEVBQTZCLEVBQUE7QUFDdEQsSUFBQSxJQUFBLENBQUssVUFBVSxPQUFXLElBQUEsQ0FBQ0EsaUNBQWMsQ0FBQSxZQUFBLENBQWEsZUFBZSxDQUFDLENBQUE7QUFDdEUsSUFBSyxJQUFBLENBQUEsTUFBQSxHQUFTLE1BQVUsSUFBQSxLQUFBLENBQU0sSUFBYSxDQUFBLEVBQUUsUUFBUSxJQUFLLEVBQUMsQ0FBRSxDQUFBLElBQUEsQ0FBSyxDQUFDLENBQUE7QUFBQTtBQUN2RSxFQUVBLE9BQWUsUUFBQSxDQUFTLEVBQVksRUFBQSxFQUFBLEVBQVksRUFBb0IsRUFBQTtBQUNoRSxJQUFBLEVBQUEsR0FBSyxFQUFLLEdBQUEsRUFBQTtBQUNWLElBQUEsRUFBQSxHQUFLLEVBQUssR0FBQSxFQUFBO0FBQ1YsSUFBQSxFQUFBLEdBQUssRUFBSyxHQUFBLEVBQUE7QUFDVixJQUFTLE9BQUEsQ0FBQSxFQUFBLElBQU0sQ0FBTSxLQUFBLEVBQUEsSUFBTSxDQUFNLENBQUEsR0FBQSxFQUFBO0FBQUE7QUFDckMsRUFFTyxRQUFBLENBQVMsRUFBWSxFQUFBLEVBQUEsRUFBWSxFQUFzQixFQUFBO0FBQzFELElBQU0sTUFBQSxZQUFBLEdBQWUsS0FBSyxN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