import loader from 'prismarine-chunk' import Vec3 from 'vec3' const rd = 8 export default function load (b) { const Chunk = loader(b._client.version) b.chunks = {} b._client.on('map_chunk', data => { if (!b.chunks[data.x]) { b.chunks[data.x] = [] } const chunk = new Chunk() chunk.load(data.chunkData) b.chunks[data.x][data.z] = chunk }) b._client.on('block_change', data => { const chunkX = data.location.x >> 4 const chunkZ = data.location.z >> 4 const blockX = data.location.x & 15 const blockZ = data.location.z & 15 if (b.chunks[chunkX] && b.chunks[chunkX][chunkZ]) { b.chunks[chunkX][chunkZ].setBlockStateId(new Vec3(blockX, data.location.y, blockZ), data.type) } }) b._client.on('multi_block_change', data => { for (const record of data.records) { const blockState = record >> 12 const blockX = record >> 8 & 15 const blockZ = record >> 4 & 15 const blockY = record & 15 if (b.chunks[data.chunkCoordinates.x] && b.chunks[data.chunkCoordinates.x][data.chunkCoordinates.z]) { b.chunks[data.chunkCoordinates.x][data.chunkCoordinates.z].setBlockStateId(new Vec3(blockX, blockY + 16 * data.chunkCoordinates.y, blockZ), blockState) } } }) b._client.on('position', data => { if (!b.ccStarted) { b.currentChunk = { x: data.x >> 4, z: data.z >> 4 } b.pos = { x: data.x, y: data.y, z: data.z } } else { b.currentChunk = { x: data.x >> 4, z: data.z >> 4 } b.pos = { x: data.x, y: data.y, z: data.z } } b._client.write('teleport_confirm', { teleportId: data.teleportId }) }) b.interval.unloadChunks = setInterval(() => { for (const i in b.chunks) { // X-values if (i > b.currentChunk.x + rd || i < b.currentChunk.x - rd) { delete b.chunks[i] } for (const z in b.chunks[i]) { // Z-values if (z > b.currentChunk.z + rd || z < b.currentChunk.z - rd) { delete b.chunks[i][z] } } } }, 1500) }