public override void HandleMcpeLevelChunk(McpeLevelChunk message) { var coord = new ChunkCoordinates(message.chunkX, message.chunkZ); int chunkCount = (int)message.subChunkCount; byte[] data = message.chunkData; Client.Chunks.GetOrAdd(coord, _ => { ChunkColumn chunk = null; try { chunk = ClientUtils.DecodeChunkColumn(chunkCount, data, BlockPalette, _internalStates); if (chunk != null) { chunk.X = coord.X; chunk.Z = coord.Z; chunk.RecalcHeight(); } } catch (Exception e) { Log.Error($"Reading chunk {coord}", e); } return(chunk); }); }
public override void HandleMcpeClientCacheMissResponse(McpeClientCacheMissResponse message) { foreach (KeyValuePair <ulong, byte[]> kv in message.blobs) { ulong hash = kv.Key; byte[] data = kv.Value; Client.BlobCache.TryAdd(hash, data); var chunks = _futureChunks.Where(c => c.Key.SubChunks.Contains(hash) || c.Key.Biome == hash); foreach (KeyValuePair <CachedChunk, object> kvp in chunks) { CachedChunk chunk = kvp.Key; if (chunk.Biome == hash) { chunk.Chunk.biomeId = data; chunk.Biome = 0; } else { for (int i = 0; i < chunk.SubChunks.Length; i++) { ulong subChunkHash = chunk.SubChunks[i]; if (subChunkHash == hash) { // parse data chunk.Chunk[i] = ClientUtils.DecodeChunkColumn(1, data, BlockPalette, _internalStates)[0]; chunk.SubChunks[i] = 0; } } } if (chunk.Biome == 0 && chunk.SubChunks.All(c => c == 0)) { _futureChunks.TryRemove(chunk, out _); var coordinates = new ChunkCoordinates(chunk.Chunk.X, chunk.Chunk.Z); foreach (KeyValuePair <BlockCoordinates, NbtCompound> bePair in _futureBlockEntities.Where(be => (ChunkCoordinates)be.Key == coordinates)) { chunk.Chunk.BlockEntities.Add(bePair); _futureBlockEntities.TryRemove(bePair.Key, out _); } chunk.Chunk.RecalcHeight(); Client.Chunks[coordinates] = chunk.Chunk; } } } }
public override void HandleMcpeLevelChunk(McpeLevelChunk message) { if (!Client._chunks.ContainsKey(new Tuple <int, int>(message.chunkX, message.chunkZ))) { //Log.Debug($"Chunk X={message.chunkX}, Z={message.chunkZ}, size={message.chunkData.Length}, Count={Client._chunks.Count}"); try { ChunkColumn chunk = ClientUtils.DecodeChunkColumn((int)message.subChunkCount, message.chunkData, _blockPallet, _internalStates); if (chunk != null) { chunk.x = message.chunkX; chunk.z = message.chunkZ; chunk.RecalcHeight(); Client._chunks.TryAdd(new Tuple <int, int>(message.chunkX, message.chunkZ), chunk); //Log.Debug($"Added parsed bedrock chunk X={chunk.x}, Z={chunk.z}"); } } catch (Exception e) { Log.Error("Reading chunk", e); } } }