Raw (prismarine-chunk based) Storage Provider implementation. Supports all versions that prismarine-chunk supports thereby providing a stop-gap measure until prismarine-provider-anvil is updated.
const RawStorage = require('prismarine-provider-raw')('1.16.1')
const Chunk = require('prismarine-chunk')('1.16.1')
const storage = new RawStorage('./world/')
const chunk = new Chunk()
storage.save(0, 1, chunk).then(() => {
console.log('saved!')
storage.load(0, 1).then(c => {
console.log('loaded!')
}).catch(e => {
console.error(e.stack)
})
}).catch(e => {
console.error(e.stack)
})
Create a new RawStorage instance which uses the folder at path
for storage (Optionally disable zlib compression with compress
)
Store a prismarine-chunk chunk
at pos x
, y
. Returns a promise.
Load the prismarine-chunk at pos x
, y
. Returns a promise.
Load and defrag all region files (reduces wasted storage space)
NOTE: there is no need to run this regularly
The format is loosely based on minecraft's Anvil Region format. The world is divided into 32*32 (1024) chunk sections, called 'regions'. The region a chunk belongs to can be found by dividing and then flooring the chunk coordinates by 32 (Bit-shift right by 5):
const regionX = chunkX >> 5
const regionY = chunkY >> 5
Offset | Size (Bytes) | Field | Purpose |
---|---|---|---|
0x0 | 0x4 | Magic Number | CHNK (43 48 4e 4b ) in ASCII |
0x4 | 0x1 | Prismarine Version | Prismarine format version |
0x5 | 0x2 | MC World Version | Minecraft protocol version for the chunks (e.g. 1.16.1 => 736) |
0x7 | 0x4 | X Position | X Position of the region file |
0xB | 0x4 | Y Position | Y Position of the region file |
0xF | 0x2000 | Chunk Info x1024 | Chunk locations and sizes in the file (see Chunk Info below) |
0x200F | - | Chunk Data | Sparse chunk data, referenced by Chunk Info entries, variable size |
Offset | Size (Bytes) | Field | Purpose |
---|---|---|---|
0x0 | 0x4 | Offset | Chunk data offset, in bytes, after the File Header |
0x4 | 0x4 | Size | Chunk data size, in bytes |
Offset | Size (Bytes) | Field | Purpose |
---|---|---|---|
0x0 | 0x1 | Compression | If the rest of the data is GZip compressed or not |
0x1 | 0x1 | Features | BitMask (0: Full Chunk (Ground Up), 1: Includes SkyLight, 2-7: Reserved) |
0x2 | 0x2 | BitMask | Section Bitmask with bits set to 1 for every 16x16x16 chunk section whose data is included in Data |
0x4 | 0x4 | Data Length | Length of the following Block Data |
0x8 | - | Data | Block Data |
Unk+0x8 | 0x3 | SkyLight Mask | Only the first 18 bits are actually used (missing for versions 1.13 and below) |
Unk+0xB | 0x3 | BlockLight Mask | Only the first 18 bits are actually used (missing for versions 1.13 and below) |
Unk+0xE | 0x3 | Empty SkyLight Mask | Only the first 18 bits are actually used (missing for versions 1.13 and below) |
Unk+0x11 | 0x3 | Empty BlockLight Mask | Only the first 18 bits are actually used (missing for versions 1.13 and below) |
Unk+0x14 | 0x4 | Light Data Length | Length of the following Light Data (missing for versions 1.13 and below) |
Unk+0x18 | - | Light Data | Light Data (missing for versions 1.13 and below) |
Unk2+0x18 | 0x1000 | Biomes | 1024 Biome IDs (missing for versions 1.14 and below) |