UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

105 lines (100 loc) • 14.5 kB
'use strict'; 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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