Beispiel #1
0
        public void SetBlock(int x, int y, int z, int blockStateId)
        {
            if (Pallete != null)
            {
                if (Pallete.Contains(blockStateId))
                {
                    blockStateId = Pallete.IndexOf(blockStateId);
                }
                else
                {
                    Pallete.Add(blockStateId);
                    blockStateId = Pallete.Count - 1;
                    byte bitsNeeded = Utils.BitsNeededToStore(blockStateId);
                    if (bitsNeeded > Data.BitsPerVar)
                    {
                        if (bitsNeeded > PalleteBitsPerVarMax)
                        {
                            BitStorage newStorage = new BitStorage(PalleteBitsPerVarMax, Volume);
                            for (int i = 0; i < Volume; i++)
                            {
                                newStorage.Set(i, Pallete[Data.Get(i)]);
                            }

                            Pallete = null;
                            Data    = newStorage;
                        }
                        else
                        {
                            BitStorage newStorage = new BitStorage(bitsNeeded, Volume);
                            for (int i = 0; i < Volume; i++)
                            {
                                newStorage.Set(i, Data.Get(i));
                            }

                            Data = newStorage;
                        }
                    }
                }
            }

            int oldBlock = GetBlock(x, y, z);

            if (oldBlock == 0 && blockStateId != 0)
            {
                SolidBlockCount++;
            }
            else if (oldBlock != 0 && blockStateId == 0)
            {
                SolidBlockCount--;
            }

            Data.Set(GetBlockIndex(x, y, z), blockStateId);
        }
Beispiel #2
0
        public ChunkDataPacket(Client client, ChunkColumn column) : base(client)
        {
            PacketId = 0x22;
            MCSerializer serializer = new MCSerializer();


            serializer.WriteInt(column.X);
            serializer.WriteInt(column.Z);
            serializer.WriteBool(true);
            serializer.WriteVarInt(column.SectionMask);
            NbtWriter  heightmapWriter  = new NbtWriter(serializer.Stream, "root");
            BitStorage heightmapStorage = new BitStorage(9, 256);

            for (int y = 0; y < 256; y++)
            {
                for (int z = 0; z < 16; z++)
                {
                    for (int x = 0; x < 16; x++)
                    {
                        if (column.GetBlock(x, y, z).StateId != 0)
                        {
                            heightmapStorage.Set(ChunkColumn.GetHeightmapIdx(x, z), y);
                        }
                    }
                }
            }

            heightmapWriter.WriteLongArray("MOTION_BLOCKING", heightmapStorage.Data);
            heightmapWriter.EndCompound();
            heightmapWriter.Finish();

            for (int y = 0; y < 256; y += 4)
            {
                for (int z = 0; z < 16; z += 4)
                {
                    for (int x = 0; x < 16; x += 4)
                    {
                        serializer.WriteInt((int)column.GetBiome(x, y, z));
                    }
                }
            }

            MCSerializer dataSerializer = new MCSerializer();
            int          primaryBitMask = column.SectionMask;

            for (int y = 0; y < 16; y++)
            {
                if ((primaryBitMask & 0b1) == 1)
                {
                    column.Sections[y].Write(dataSerializer);
                }

                primaryBitMask >>= 1;
            }

            byte[] encodedChunkData = dataSerializer.GetBytes();
            serializer.WriteVarInt(encodedChunkData.Length);
            serializer.WriteBytes(encodedChunkData);

            // TODO: Block Entities
            serializer.WriteVarInt(0);
            Data = serializer.GetBytes();
        }