Esempio n. 1
0
        public static ChunkData Deserialize(ref SpanReader br, bool isOverworld)
        {
            var result = new ChunkData
            {
                ChunkX             = br.ReadAsInt(),
                ChunkZ             = br.ReadAsInt(),
                GroundUpContinuous = br.ReadAsBoolean(),
                PrimaryBitMask     = br.ReadAsVarInt(out _)
            };

            var hasBioms = result.GroundUpContinuous;

            result.Size = br.ReadAsVarInt(out _);
            var dataReader = br.ReadAsSubReader((int)result.Size - (hasBioms ? 256 : 0));
            var data       = new List <ChunkSection>();

            while (!dataReader.IsCosumed)
            {
                data.Add(ChunkSection.Deserialize(ref dataReader, isOverworld));
            }
            result.Data = data.ToArray();

            if (hasBioms)
            {
                result.Biomes = br.ReadAsByteArray(256);
            }
            result.NumberOfBlockEntities = br.ReadAsVarInt(out _);
            return(result);
        }
Esempio n. 2
0
        public static ChunkData Deserialize(ref SpanReader br, bool isOverworld)
        {
            var result = new ChunkData
            {
                ChunkX         = br.ReadAsInt(),
                ChunkZ         = br.ReadAsInt(),
                FullChunk      = br.ReadAsBoolean(),
                PrimaryBitMask = br.ReadAsVarInt(out _),
                Heightmaps     = br.ReadAsNbtTag(),
            };

            var hasBioms = result.FullChunk;

            if (hasBioms)
            {
                result.Biomes = br.ReadAsIntArray(1024);
            }

            result.Size = br.ReadAsVarInt(out _);
            var dataReader = br.ReadAsSubReader((int)result.Size);
            var data       = new List <ChunkSection>();

            while (!dataReader.IsCosumed)
            {
                data.Add(ChunkSection.Deserialize(ref dataReader, isOverworld));
            }
            result.Data = data.ToArray();

            result.NumberOfBlockEntities = br.ReadAsVarInt(out _);
            result.BlockEntities         = br.ReadAsNbtTagArray((int)result.NumberOfBlockEntities);
            return(result);
        }
Esempio n. 3
0
        public static ChunkSection Deserialize(ref SpanReader br, bool isOverworld)
        {
            var result = new ChunkSection
            {
                BitsPerBlock  = br.ReadAsByte(),
                PaletteLength = br.ReadAsVarInt(out _)
            };

            if (result.PaletteLength != 0)
            {
                var paletteReader = br.ReadAsSubReader((int)result.PaletteLength);
                var palette       = new List <uint>();
                while (!paletteReader.IsCosumed)
                {
                    palette.Add(paletteReader.ReadAsVarInt(out _));
                }
                result.Palette = palette.ToArray();
            }

            result.DataArrayLength = br.ReadAsVarInt(out _);
            var dataArray = new ulong[result.DataArrayLength];

            for (int i = 0; i < dataArray.Length; i++)
            {
                dataArray[i] = br.ReadAsUnsignedLong();
            }
            result.DataArray  = dataArray;
            result.BlockLight = br.ReadAsByteArray(ChunkConstants.BlocksInSection / 2);
            if (isOverworld)
            {
                result.SkyLight = br.ReadAsByteArray(ChunkConstants.BlocksInSection / 2);
            }
            return(result);
        }
Esempio n. 4
0
        public static ChunkSection Deserialize(ref SpanReader br, bool isOverworld)
        {
            var result = new ChunkSection
            {
                BlockCount    = br.ReadAsShort(),
                BitsPerBlock  = br.ReadAsByte(),
                PaletteLength = br.ReadAsVarInt(out _)
            };

            if (result.BitsPerBlock < 4)
            {
                throw new InvalidDataException("ChunkSection: BitsPerBlock should be greater than or equal to 4.");
            }
            else if (result.BitsPerBlock >= 5 && result.BitsPerBlock < 9)
            {
                if (result.PaletteLength != 0)
                {
                    var paletteReader = br.ReadAsSubReader((int)result.PaletteLength);
                    var palette       = new List <uint>();
                    while (!paletteReader.IsCosumed)
                    {
                        palette.Add(paletteReader.ReadAsVarInt(out _));
                    }
                    result.Palette = palette.ToArray();
                }
            }

            result.DataArrayLength = br.ReadAsVarInt(out _);
            var dataArray = new ulong[result.DataArrayLength];

            for (int i = 0; i < dataArray.Length; i++)
            {
                dataArray[i] = br.ReadAsUnsignedLong();
            }
            result.DataArray = dataArray;
            return(result);
        }