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;
                    }
                }
            }
        }
示例#3
0
        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);
                }
            }
        }