UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

101 lines (98 loc) 14.3 kB
import { BlockMappings } from '../../block/BlockMappings.es.js'; 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; } } export { BlockStorage as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmxvY2tTdG9yYWdlLmVzLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd29ybGQvY2h1bmsvQmxvY2tTdG9yYWdlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgTGVnYWN5SWQgfSBmcm9tICcuLi8uLi9ibG9jay9CbG9ja01hcHBpbmdzJztcbmltcG9ydCB7IEJsb2NrTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9ibG9jay9CbG9ja01hcHBpbmdzJztcblxuaW1wb3J0IHR5cGUgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5cbmludGVyZmFjZSBCbG9ja1N0b3JhZ2VEYXRhIHtcbiAgICBibG9ja3M/OiBudW1iZXJbXTtcbiAgICBwYWxldHRlPzogbnVtYmVyW107XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJsb2NrU3RvcmFnZSB7XG4gICAgcHJpdmF0ZSBibG9ja3M6IG51bWJlcltdO1xuICAgIHByaXZhdGUgcGFsZXR0ZTogbnVtYmVyW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoeyBibG9ja3MsIHBhbGV0dGUgfTogQmxvY2tTdG9yYWdlRGF0YSkge1xuICAgICAgICB0aGlzLnBhbGV0dGUgPSBwYWxldHRlID8/IFtCbG9ja01hcHBpbmdzLmdldFJ1bnRpbWVJZCgnbWluZWNyYWZ0OmFpcicpXTtcbiAgICAgICAgdGhpcy5ibG9ja3MgPSBibG9ja3MgPz8gQXJyYXkuZnJvbTxudW1iZXI+KHsgbGVuZ3RoOiA0MDk2IH0pLmZpbGwoMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0SW5kZXgoYng6IG51bWJlciwgYnk6IG51bWJlciwgYno6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGJ4ID0gYnggJiAweDBmO1xuICAgICAgICBieiA9IGJ6ICYgMHgwZjtcbiAgICAgICAgYnkgPSBieSAmIDB4MGY7XG4gICAgICAgIHJldHVybiAoKGJ4IDw8IDgpICsgKGJ6IDw8IDQpKSB8IGJ5O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRCbG9jayhieDogbnVtYmVyLCBieTogbnVtYmVyLCBiejogbnVtYmVyKTogTGVnYWN5SWQge1xuICAgICAgICBjb25zdCBwYWxldHRlSW5kZXggPSB0aGlzLmJsb2Nrc1tCbG9ja1N0b3JhZ2UuZ2V0SW5kZXgoYngsIGJ5LCBieildITtcbiAgICAgICAgY29uc3QgcnVudGltZUlkID0gdGhpcy5wYWxldHRlW3BhbGV0dGVJbmRleF0hO1xuICAgICAgICByZXR1cm4gQmxvY2tNYXBwaW5ncy5nZXRMZWdhY3lJZChydW50aW1lSWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRCbG9jayhieDogbnVtYmVyLCBieTogbnVtYmVyLCBiejogbnVtYmVyLCBydW50aW1lSWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMucGFsZXR0ZS5pbmNsdWRlcyhydW50aW1lSWQpKSB7XG4gICAgICAgICAgICB0aGlzLnBhbGV0dGUucHVzaChydW50aW1lSWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmxvY2tzW0Jsb2NrU3RvcmFnZS5nZXRJbmRleChieCwgYnksIGJ6KV0gPSB0aGlzLnBhbGV0dGUuaW5kZXhPZihydW50aW1lSWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXR3b3JrU2VyaWFsaXplKHN0cmVhbTogQmluYXJ5U3RyZWFtKTogdm9pZCB7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL1RvbWNjL2E5NmFmNTA5ZTI3NWIxYWY0ODNiMjVjNTQzY2ZiZjM3XG4gICAgICAgIGxldCBiaXRzUGVyQmxvY2sgPSBNYXRoLmNlaWwoTWF0aC5sb2cyKHRoaXMucGFsZXR0ZS5sZW5ndGgpKTtcblxuICAgICAgICBzd2l0Y2ggKGJpdHNQZXJCbG9jaykge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGJpdHNQZXJCbG9jayA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgYml0c1BlckJsb2NrID0gODtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgYml0c1BlckJsb2NrID0gMTY7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyA3IGJpdDogc3RvcmFnZSB0eXBlLCAxIGJpdCAoc2hpZnQgdG8gZW5kKTogbmV0d29yayBmb3JtYXQgKGFsd2F5cyAxKVxuICAgICAgICBzdHJlYW0ud3JpdGVCeXRlKChiaXRzUGVyQmxvY2sgPDwgMSkgfCAxKTtcbiAgICAgICAgY29uc3QgYmxvY2tzUGVyV29yZCA9IE1hdGguZmxvb3IoMzIgLyBiaXRzUGVyQmxvY2spO1xuICAgICAgICBjb25zdCB3b3Jkc1BlckNodW5rID0gTWF0aC5jZWlsKDQwOTYgLyBibG9ja3NQZXJXb3JkKTtcblxuICAgICAgICAvLyBFbmNvZGluZyBleGFtcGxlXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9OaWNsYXNPbG9mc3Nvbi9NaU5FVC9ibG9iLzRhY2JjY2I2ZGVkYWUwNjY1NDdmODQ4NmEyYWNlMWM5ZDZkYjAwODQvc3JjL01pTkVUL01pTkVUL1dvcmxkcy9TdWJDaHVuay5jcyNMMjk0XG4gICAgICAgIGxldCBwb3NpdGlvbiA9IDA7XG4gICAgICAgIGZvciAobGV0IHcgPSAwOyB3IDwgd29yZHNQZXJDaHVuazsgdysrKSB7XG4gICAgICAgICAgICBsZXQgd29yZCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBibG9jayA9IDA7IGJsb2NrIDwgYmxvY2tzUGVyV29yZDsgYmxvY2srKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5ibG9ja3NbcG9zaXRpb24rK10hO1xuICAgICAgICAgICAgICAgIHdvcmQgfD0gc3RhdGUgPDwgKGJpdHNQZXJCbG9jayAqIGJsb2NrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0cmVhbS53cml0ZUludExFKHdvcmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV3JpdGUgcGFsZXR0ZSBlbnRyaWVzIGFzIHJ1bnRpbWUgaWRzXG4gICAgICAgIHN0cmVhbS53cml0ZVZhckludCh0aGlzLnBhbGV0dGUubGVuZ3RoKTtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5wYWxldHRlKSB7XG4gICAgICAgICAgICBzdHJlYW0ud3JpdGVWYXJJbnQodmFsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbmV0d29ya0Rlc2VyaWFsaXplKHN0cmVhbTogQmluYXJ5U3RyZWFtKTogQmxvY2tTdG9yYWdlIHtcbiAgICAgICAgY29uc3QgYml0c1BlckJsb2NrID0gc3RyZWFtLnJlYWRCeXRlKCkgPj4gMTtcbiAgICAgICAgY29uc3QgYmxvY2tzUGVyV29yZCA9IE1hdGguZmxvb3IoMzIgLyBiaXRzUGVyQmxvY2spO1xuICAgICAgICBjb25zdCB3b3Jkc1BlckNodW5rID0gTWF0aC5jZWlsKDQwOTYgLyBibG9ja3NQZXJXb3JkKTtcblxuICAgICAgICBjb25zdCB3b3JkczogbnVtYmVyW10gPSBuZXcgQXJyYXkod29yZHNQZXJDaHVuayk7XG4gICAgICAgIGZvciAobGV0IHcgPSAwOyB3IDwgd29yZHNQZXJDaHVuazsgdysrKSB7XG4gICAgICAgICAgICB3b3Jkc1t3XSA9IHN0cmVhbS5yZWFkSW50TEUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhbGV0dGVDb3VudCA9IHN0cmVhbS5yZWFkVmFySW50KCk7XG4gICAgICAgIGNvbnN0IHBhbGV0dGU6IG51bWJlcltdID0gbmV3IEFycmF5KHBhbGV0dGVDb3VudCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFsZXR0ZUNvdW50OyBpKyspIHtcbiAgICAgICAgICAgIHBhbGV0dGVbaV0gPSBzdHJlYW0ucmVhZFZhckludCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5jb2RpbmcgZXhhbXBsZVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20va2Vubnl2di9BbGV4L2Jsb2IvZGNjYTBkNjk3YmJiMjU2MzdhOGJjZmE5MzgzMGY4YTc2MmM0NjNhZi9zcmMvQWxleC9Xb3JsZHMvTXVsdGlwbGF5ZXIvQmVkcm9jay9DaHVua1Byb2Nlc3Nvci5jcyNMMzY3XG5cbiAgICAgICAgbGV0IHBvc2l0b24gPSAwO1xuICAgICAgICBjb25zdCBzdG9yYWdlID0gbmV3IEJsb2NrU3RvcmFnZSh7IHBhbGV0dGUgfSk7XG4gICAgICAgIGZvciAobGV0IHcgPSAwOyB3IDwgd29yZHNQZXJDaHVuazsgdysrKSB7XG4gICAgICAgICAgICBjb25zdCB3b3JkID0gd29yZHNbd10hO1xuICAgICAgICAgICAgZm9yIChsZXQgYmxvY2sgPSAwOyBibG9jayA8IGJsb2Nrc1BlcldvcmQ7IGJsb2NrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9ICh3b3JkID4+ICgocG9zaXRvbiAlIGJsb2Nrc1BlcldvcmQpICogYml0c1BlckJsb2NrKSkgJiAoKDEgPDwgYml0c1BlckJsb2NrKSAtIDEpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgeCA9IChwb3NpdG9uID4+IDgpICYgMHhmO1xuICAgICAgICAgICAgICAgIGNvbnN0IHkgPSBwb3NpdG9uICYgMHhmO1xuICAgICAgICAgICAgICAgIGNvbnN0IHogPSAocG9zaXRvbiA+PiA0KSAmIDB4ZjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zbGF0ZWQgPSBwYWxldHRlW3N0YXRlXSE7XG4gICAgICAgICAgICAgICAgc3RvcmFnZS5zZXRCbG9jayh4LCB5LCB6LCB0cmFuc2xhdGVkKTtcbiAgICAgICAgICAgICAgICBwb3NpdG9uKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0b3JhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhbGV0dGUubGVuZ3RoID09PSAxO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVVBLE1BQXFCLFlBQWEsQ0FBQTtBQUFBLEVBQ3RCLE1BQUE7QUFBQSxFQUNBLE9BQUE7QUFBQSxFQUVELFdBQVksQ0FBQSxFQUFFLE1BQVEsRUFBQSxPQUFBLEVBQTZCLEVBQUE7QUFDdEQsSUFBQSxJQUFBLENBQUssVUFBVSxPQUFXLElBQUEsQ0FBQyxhQUFjLENBQUEsWUFBQSxDQUFhLGVBQWUsQ0FBQyxDQUFBO0FBQ3RFLElBQUssSUFBQSxDQUFBLE1BQUEsR0FBUyxNQUFVLElBQUEsS0FBQSxDQUFNLElBQWEsQ0FBQSxFQUFFLFFBQVEsSUFBSyxFQUFDLENBQUUsQ0FBQSxJQUFBLENBQUssQ0FBQyxDQUFBO0FBQUE7QUFDdkUsRUFFQSxPQUFlLFFBQUEsQ0FBUyxFQUFZLEVBQUEsRUFBQSxFQUFZLEVBQW9CLEVBQUE7QUFDaEUsSUFBQSxFQUFBLEdBQUssRUFBSyxHQUFBLEVBQUE7QUFDVixJQUFBLEVBQUEsR0FBSyxFQUFLLEdBQUEsRUFBQTtBQUNWLElBQUEsRUFBQSxHQUFLLEVBQUssR0FBQSxFQUFBO0FBQ1YsSUFBUyxPQUFBLENBQUEsRUFBQSxJQUFNLENBQU0sS0FBQSxFQUFBLElBQU0sQ0FBTSxDQUFBLEdBQUEsRUFBQTtBQUFBO0FBQ3JDLEVBRU8sUUFBQSxDQUFTLEVBQVksRUFBQSxFQUFBLEVBQVksRUFBc0IsRUFBQTtBQUMxRCxJQUFNLE1BQUEsWUFBQSxHQUFlLEtBQUssTUFBTyxDQUFBLFlBQUEsQ0FBYSxTQUFT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