UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

97 lines (96 loc) 12.1 kB
"use strict"; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } }); const require_block_BlockMappings = require("../../block/BlockMappings.cjs.cjs"); //#region src/world/chunk/BlockStorage.ts var BlockStorage = class BlockStorage { blocks; palette; constructor({ blocks, palette }) { this.palette = palette ?? [require_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 require_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; } }; //#endregion exports.default = BlockStorage; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2tTdG9yYWdlLmNqcy5janMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dvcmxkL2NodW5rL0Jsb2NrU3RvcmFnZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IExlZ2FjeUlkIH0gZnJvbSAnLi4vLi4vYmxvY2svQmxvY2tNYXBwaW5ncyc7XG5pbXBvcnQgeyBCbG9ja01hcHBpbmdzIH0gZnJvbSAnLi4vLi4vYmxvY2svQmxvY2tNYXBwaW5ncyc7XG5cbmltcG9ydCB0eXBlIEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuXG5pbnRlcmZhY2UgQmxvY2tTdG9yYWdlRGF0YSB7XG4gICAgYmxvY2tzPzogbnVtYmVyW107XG4gICAgcGFsZXR0ZT86IG51bWJlcltdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCbG9ja1N0b3JhZ2Uge1xuICAgIHByaXZhdGUgYmxvY2tzOiBudW1iZXJbXTtcbiAgICBwcml2YXRlIHBhbGV0dGU6IG51bWJlcltdO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHsgYmxvY2tzLCBwYWxldHRlIH06IEJsb2NrU3RvcmFnZURhdGEpIHtcbiAgICAgICAgdGhpcy5wYWxldHRlID0gcGFsZXR0ZSA/PyBbQmxvY2tNYXBwaW5ncy5nZXRSdW50aW1lSWQoJ21pbmVjcmFmdDphaXInKV07XG4gICAgICAgIHRoaXMuYmxvY2tzID0gYmxvY2tzID8/IEFycmF5LmZyb208bnVtYmVyPih7IGxlbmd0aDogNDA5NiB9KS5maWxsKDApO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldEluZGV4KGJ4OiBudW1iZXIsIGJ5OiBudW1iZXIsIGJ6OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBieCA9IGJ4ICYgMHgwZjtcbiAgICAgICAgYnogPSBieiAmIDB4MGY7XG4gICAgICAgIGJ5ID0gYnkgJiAweDBmO1xuICAgICAgICByZXR1cm4gKChieCA8PCA4KSArIChieiA8PCA0KSkgfCBieTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QmxvY2soYng6IG51bWJlciwgYnk6IG51bWJlciwgYno6IG51bWJlcik6IExlZ2FjeUlkIHtcbiAgICAgICAgY29uc3QgcGFsZXR0ZUluZGV4ID0gdGhpcy5ibG9ja3NbQmxvY2tTdG9yYWdlLmdldEluZGV4KGJ4LCBieSwgYnopXSE7XG4gICAgICAgIGNvbnN0IHJ1bnRpbWVJZCA9IHRoaXMucGFsZXR0ZVtwYWxldHRlSW5kZXhdITtcbiAgICAgICAgcmV0dXJuIEJsb2NrTWFwcGluZ3MuZ2V0TGVnYWN5SWQocnVudGltZUlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QmxvY2soYng6IG51bWJlciwgYnk6IG51bWJlciwgYno6IG51bWJlciwgcnVudGltZUlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnBhbGV0dGUuaW5jbHVkZXMocnVudGltZUlkKSkge1xuICAgICAgICAgICAgdGhpcy5wYWxldHRlLnB1c2gocnVudGltZUlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJsb2Nrc1tCbG9ja1N0b3JhZ2UuZ2V0SW5kZXgoYngsIGJ5LCBieildID0gdGhpcy5wYWxldHRlLmluZGV4T2YocnVudGltZUlkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV0d29ya1NlcmlhbGl6ZShzdHJlYW06IEJpbmFyeVN0cmVhbSk6IHZvaWQge1xuICAgICAgICAvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9Ub21jYy9hOTZhZjUwOWUyNzViMWFmNDgzYjI1YzU0M2NmYmYzN1xuICAgICAgICBsZXQgYml0c1BlckJsb2NrID0gTWF0aC5jZWlsKE1hdGgubG9nMih0aGlzLnBhbGV0dGUubGVuZ3RoKSk7XG5cbiAgICAgICAgc3dpdGNoIChiaXRzUGVyQmxvY2spIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBiaXRzUGVyQmxvY2sgPSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgICAgIGJpdHNQZXJCbG9jayA9IDg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJpdHNQZXJCbG9jayA9IDE2O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNyBiaXQ6IHN0b3JhZ2UgdHlwZSwgMSBiaXQgKHNoaWZ0IHRvIGVuZCk6IG5ldHdvcmsgZm9ybWF0IChhbHdheXMgMSlcbiAgICAgICAgc3RyZWFtLndyaXRlQnl0ZSgoYml0c1BlckJsb2NrIDw8IDEpIHwgMSk7XG4gICAgICAgIGNvbnN0IGJsb2Nrc1BlcldvcmQgPSBNYXRoLmZsb29yKDMyIC8gYml0c1BlckJsb2NrKTtcbiAgICAgICAgY29uc3Qgd29yZHNQZXJDaHVuayA9IE1hdGguY2VpbCg0MDk2IC8gYmxvY2tzUGVyV29yZCk7XG5cbiAgICAgICAgLy8gRW5jb2RpbmcgZXhhbXBsZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTmljbGFzT2xvZnNzb24vTWlORVQvYmxvYi80YWNiY2NiNmRlZGFlMDY2NTQ3Zjg0ODZhMmFjZTFjOWQ2ZGIwMDg0L3NyYy9NaU5FVC9NaU5FVC9Xb3JsZHMvU3ViQ2h1bmsuY3MjTDI5NFxuICAgICAgICBsZXQgcG9zaXRpb24gPSAwO1xuICAgICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IHdvcmRzUGVyQ2h1bms7IHcrKykge1xuICAgICAgICAgICAgbGV0IHdvcmQgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgYmxvY2sgPSAwOyBibG9jayA8IGJsb2Nrc1BlcldvcmQ7IGJsb2NrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuYmxvY2tzW3Bvc2l0aW9uKytdITtcbiAgICAgICAgICAgICAgICB3b3JkIHw9IHN0YXRlIDw8IChiaXRzUGVyQmxvY2sgKiBibG9jayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVJbnRMRSh3b3JkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdyaXRlIHBhbGV0dGUgZW50cmllcyBhcyBydW50aW1lIGlkc1xuICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQodGhpcy5wYWxldHRlLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMucGFsZXR0ZSkge1xuICAgICAgICAgICAgc3RyZWFtLndyaXRlVmFySW50KHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5ldHdvcmtEZXNlcmlhbGl6ZShzdHJlYW06IEJpbmFyeVN0cmVhbSk6IEJsb2NrU3RvcmFnZSB7XG4gICAgICAgIGNvbnN0IGJpdHNQZXJCbG9jayA9IHN0cmVhbS5yZWFkQnl0ZSgpID4+IDE7XG4gICAgICAgIGNvbnN0IGJsb2Nrc1BlcldvcmQgPSBNYXRoLmZsb29yKDMyIC8gYml0c1BlckJsb2NrKTtcbiAgICAgICAgY29uc3Qgd29yZHNQZXJDaHVuayA9IE1hdGguY2VpbCg0MDk2IC8gYmxvY2tzUGVyV29yZCk7XG5cbiAgICAgICAgY29uc3Qgd29yZHM6IG51bWJlcltdID0gbmV3IEFycmF5KHdvcmRzUGVyQ2h1bmspO1xuICAgICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IHdvcmRzUGVyQ2h1bms7IHcrKykge1xuICAgICAgICAgICAgd29yZHNbd10gPSBzdHJlYW0ucmVhZEludExFKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwYWxldHRlQ291bnQgPSBzdHJlYW0ucmVhZFZhckludCgpO1xuICAgICAgICBjb25zdCBwYWxldHRlOiBudW1iZXJbXSA9IG5ldyBBcnJheShwYWxldHRlQ291bnQpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhbGV0dGVDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICBwYWxldHRlW2ldID0gc3RyZWFtLnJlYWRWYXJJbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuY29kaW5nIGV4YW1wbGVcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2tlbm55dnYvQWxleC9ibG9iL2RjY2EwZDY5N2JiYjI1NjM3YThiY2ZhOTM4MzBmOGE3NjJjNDYzYWYvc3JjL0FsZXgvV29ybGRzL011bHRpcGxheWVyL0JlZHJvY2svQ2h1bmtQcm9jZXNzb3IuY3MjTDM2N1xuXG4gICAgICAgIGxldCBwb3NpdG9uID0gMDtcbiAgICAgICAgY29uc3Qgc3RvcmFnZSA9IG5ldyBCbG9ja1N0b3JhZ2UoeyBwYWxldHRlIH0pO1xuICAgICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IHdvcmRzUGVyQ2h1bms7IHcrKykge1xuICAgICAgICAgICAgY29uc3Qgd29yZCA9IHdvcmRzW3ddITtcbiAgICAgICAgICAgIGZvciAobGV0IGJsb2NrID0gMDsgYmxvY2sgPCBibG9ja3NQZXJXb3JkOyBibG9jaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdGUgPSAod29yZCA+PiAoKHBvc2l0b24gJSBibG9ja3NQZXJXb3JkKSAqIGJpdHNQZXJCbG9jaykpICYgKCgxIDw8IGJpdHNQZXJCbG9jaykgLSAxKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHggPSAocG9zaXRvbiA+PiA4KSAmIDB4ZjtcbiAgICAgICAgICAgICAgICBjb25zdCB5ID0gcG9zaXRvbiAmIDB4ZjtcbiAgICAgICAgICAgICAgICBjb25zdCB6ID0gKHBvc2l0b24gPj4gNCkgJiAweGY7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2xhdGVkID0gcGFsZXR0ZVtzdGF0ZV0hO1xuICAgICAgICAgICAgICAgIHN0b3JhZ2Uuc2V0QmxvY2soeCwgeSwgeiwgdHJhbnNsYXRlZCk7XG4gICAgICAgICAgICAgICAgcG9zaXRvbisrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdG9yYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYWxldHRlLmxlbmd0aCA9PT0gMTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFVQSxJQUFxQixlQUFyQixNQUFxQixhQUFhO0NBQzlCO0NBQ0E7Q0FFQSxZQUFtQixFQUFFLFFBQVEsV0FBNkI7RUFDdEQsS0FBSyxVQUFVLFdBQVcsQ0FBQyw0QkFBQSxjQUFjLGFBQWEsZUFBZSxDQUFDO0VBQ3RFLEtBQUssU0FBUyxVQUFVLE1BQU0sS0FBYSxFQUFFLFFBQVEsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDO0NBQ3ZFO0NBRUEsT0FBZSxTQUFTLElBQVksSUFBWSxJQUFvQjtFQUNoRSxLQUFLLEtBQUs7RUFDVixLQUFLLEtBQUs7RUFDVixLQUFLLEtBQUs7RUFDVixRQUFTLE1BQU0sTUFBTSxNQUFNLEtBQU07Q0FDckM7Q0FFQSxTQUFnQixJQUFZLElBQVksSUFBc0I7RUFDMUQsTUFBTSxlQUFlLEtBQUssT0FBTyxhQUFhLFNBQVMsSUFBSSxJQUFJLEVBQUU7RUFDakUsTUFBTSxZQUFZLEtBQUssUUFBUTtFQUMvQixPQUFPLDRCQUFBLGNBQWMsWUFBWSxTQUFTO0NBQzlDO0NBRUEsU0FBZ0IsSUFBWSxJQUFZLElBQVksV0FBeUI7RUFDekUsSUFBSSxDQUFDLEtBQUssUUFBUSxTQUFTLFNBQVMsR0FDaEMsS0FBSyxRQUFRLEtBQUssU0FBUztFQUUvQixLQUFLLE9BQU8sYUFBYSxTQUFTLElBQUksSUFBSSxFQUFFLEtBQUssS0FBSyxRQUFRLFFBQVEsU0FBUztDQUNuRjtDQUVBLGlCQUF3QixRQUE0QjtFQUVoRCxJQUFJLGVBQWUsS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLFFBQVEsTUFBTSxDQUFDO0VBRTNELFFBQVEsY0FBUjtHQUNJLEtBQUs7SUFDRCxlQUFlO0lBQ2Y7R0FDSixLQUFLO0dBQ0wsS0FBSztHQUNMLEtBQUs7R0FDTCxLQUFLO0dBQ0wsS0FBSztHQUNMLEtBQUssR0FDRDtHQUNKLEtBQUs7R0FDTCxLQUFLO0lBQ0QsZUFBZTtJQUNmO0dBQ0o7SUFDSSxlQUFlO0lBQ2Y7RUFDUjtFQUdBLE9BQU8sVUFBVyxnQkFBZ0IsSUFBSyxDQUFDO0VBQ3hDLE1BQU0sZ0JBQWdCLEtBQUssTUFBTSxLQUFLLFlBQVk7RUFDbEQsTUFBTSxnQkFBZ0IsS0FBSyxLQUFLLE9BQU8sYUFBYTtFQUlwRCxJQUFJLFdBQVc7RUFDZixLQUFLLElBQUksSUFBSSxHQUFHLElBQUksZUFBZSxLQUFLO0dBQ3BDLElBQUksT0FBTztHQUNYLEtBQUssSUFBSSxRQUFRLEdBQUcsUUFBUSxlQUFlLFNBQVM7SUFDaEQsTUFBTSxRQUFRLEtBQUssT0FBTztJQUMxQixRQUFRLFNBQVUsZUFBZTtHQUNyQztHQUNBLE9BQU8sV0FBVyxJQUFJO0VBQzFCO0VBR0EsT0FBTyxZQUFZLEtBQUssUUFBUSxNQUFNO0VBQ3RDLEtBQUssTUFBTSxPQUFPLEtBQUssU0FDbkIsT0FBTyxZQUFZLEdBQUc7Q0FFOUI7Q0FFQSxPQUFjLG1CQUFtQixRQUFvQztFQUNqRSxNQUFNLGVBQWUsT0FBTyxTQUFTLEtBQUs7RUFDMUMsTUFBTSxnQkFBZ0IsS0FBSyxNQUFNLEtBQUssWUFBWTtFQUNsRCxNQUFNLGdCQUFnQixLQUFLLEtBQUssT0FBTyxhQUFhO0VBRXBELE1BQU0sUUFBa0IsSUFBSSxNQUFNLGFBQWE7RUFDL0MsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLGVBQWUsS0FDL0IsTUFBTSxLQUFLLE9BQU8sVUFBVTtFQUdoQyxNQUFNLGVBQWUsT0FBTyxXQUFXO0VBQ3ZDLE1BQU0sVUFBb0IsSUFBSSxNQUFNLFlBQVk7RUFDaEQsS0FBSyxJQUFJLElBQUksR0FBRyxJQUFJLGNBQWMsS0FDOUIsUUFBUSxLQUFLLE9BQU8sV0FBVztFQU1uQyxJQUFJLFVBQVU7RUFDZCxNQUFNLFVBQVUsSUFBSSxhQUFhLEVBQUUsUUFBUSxDQUFDO0VBQzVDLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxlQUFlLEtBQUs7R0FDcEMsTUFBTSxPQUFPLE1BQU07R0FDbkIsS0FBSyxJQUFJLFFBQVEsR0FBRyxRQUFRLGVBQWUsU0FBUztJQUNoRCxNQUFNLFFBQVMsUUFBVSxVQUFVLGdCQUFpQixnQkFBbUIsS0FBSyxnQkFBZ0I7SUFFNUYsTUFBTSxJQUFLLFdBQVcsSUFBSztJQUMzQixNQUFNLElBQUksVUFBVTtJQUNwQixNQUFNLElBQUssV0FBVyxJQUFLO0lBRTNCLE1BQU0sYUFBYSxRQUFRO0lBQzNCLFFBQVEsU0FBUyxHQUFHLEdBQUcsR0FBRyxVQUFVO0lBQ3BDO0dBQ0o7RUFDSjtFQUNBLE9BQU87Q0FDWDtDQUVBLFVBQTBCO0VBQ3RCLE9BQU8sS0FBSyxRQUFRLFdBQVc7Q0FDbkM7QUFDSiJ9