Пример #1
0
 private void ParseNamedEntitySpawn(BinaryReader reader)
 {
     HandleNamedEntitySpawn(reader.ReadNetworkInt32(), reader.ReadNetworkString(), reader.ReadNetworkInt32(), reader.ReadNetworkInt32(), reader.ReadNetworkInt32(), reader.ReadByte(), reader.ReadByte(), reader.ReadNetworkInt16());
 }
Пример #2
0
 private void ParseItemSpawn(BinaryReader reader)
 {
     HandleItemSpawn(reader.ReadNetworkInt32(), reader.ReadNetworkInt16(), reader.ReadByte(), reader.ReadNetworkInt32(), reader.ReadNetworkInt32(), reader.ReadNetworkInt32(), reader.ReadByte(), reader.ReadByte(), reader.ReadByte());
 }
Пример #3
0
        private void ParseMapChunk(BinaryReader reader)
        {
            int x = reader.ReadNetworkInt32();
            short y = reader.ReadNetworkInt16();
            int z = reader.ReadNetworkInt32();
            byte size_x = reader.ReadByte();
            byte size_y = reader.ReadByte();
            byte size_z = reader.ReadByte();
            int size = reader.ReadNetworkInt32();

            if (reader.BaseStream.Position + size > reader.BaseStream.Length)        // Like omg BinaryReader won't throw exceptions
                throw new EndOfStreamException("Reader has reached end of stream."); // if you read past the end of the stream :@

            byte[] data = Compression.DecompressZLib(reader.ReadBytes(size));

            // parse data block

            size_x++;
            size_y++;
            size_z++;

            // wat to do here... hmm

            MCBlock[, ,] blockdata = new MCBlock[size_x, size_y, size_z];

            BinaryReader parser = new BinaryReader(new MemoryStream(data));

            byte[] blocks = parser.ReadBytes(size_x * size_y * size_z);
            byte[] metadatas = new byte[blocks.Length];
            byte[] lights = new byte[blocks.Length];
            byte[] skylights = new byte[blocks.Length];

            for (int i = 0; i < blocks.Length; i += 2)
            {
                byte metadata = parser.ReadByte();

                metadatas[i] = (byte)((metadata >> 4) & 0xF);
                metadatas[i + 1] = (byte)(metadata & 0xF);
            }

            for (int i = 0; i < blocks.Length; i += 2)
            {
                byte light = parser.ReadByte();

                lights[i] = (byte)((light >> 4) & 0xF);
                lights[i + 1] = (byte)(light & 0xF);
            }

            for (int i = 0; i < blocks.Length; i += 2)
            {
                byte skylight = parser.ReadByte();

                skylights[i] = (byte)((skylight >> 4) & 0xF);
                skylights[i + 1] = (byte)(skylight & 0xF);
            }

            for (int iX = 0; iX < size_x; iX++)
            {
                for (int iY = 0; iY < size_y; iY++)
                {
                    for (int iZ = 0; iZ < size_z; iZ++)
                    {
                        int index = iY + (iZ * size_y) + (iX * size_y * size_z);

                        blockdata[iX, iY, iZ] = new MCBlock();

                        blockdata[iX, iY, iZ].Type = (MCBlockType)blocks[index];
                        blockdata[iX, iY, iZ].MetaData = metadatas[index];
                        blockdata[iX, iY, iZ].Light = lights[index];
                        blockdata[iX, iY, iZ].SkyLight = skylights[index];
                    }
                }
            }

            HandleMapChunk(x, y, z, blockdata);
        }
Пример #4
0
 private void ParseHoldSwitch(BinaryReader reader)
 {
     HandleHoldSwitch(reader.ReadNetworkInt32(), reader.ReadNetworkInt16());
 }
Пример #5
0
        private void ParseComplexEntities(BinaryReader reader)
        {
            int x = reader.ReadNetworkInt32();
            short y = reader.ReadNetworkInt16();
            int z = reader.ReadNetworkInt32();
            short size = reader.ReadNetworkInt16();

            if (reader.BaseStream.Position + size > reader.BaseStream.Length)
                throw new EndOfStreamException("Reader has reached end of stream.");

            byte[] data = Compression.DecompressGZip(reader.ReadBytes(size));

            INamedBinaryTag nbt = NBTStructure.ParseNBT(data);

            HandleComplexEntities(x, y, z, nbt);
        }
Пример #6
0
 private void ParseAddInventory(BinaryReader reader)
 {
     HandleAddInventory(reader.ReadNetworkInt16(), reader.ReadByte(), reader.ReadNetworkInt16());
 }
Пример #7
0
        protected void ParsePlayerInventory(BinaryReader reader)
        {
            int type = reader.ReadNetworkInt32();
            short count = reader.ReadNetworkInt16();

            List<MCItem> items = new List<MCItem>();

            for (int i = 0; i < count; i++)
            {
                short itemid = reader.ReadNetworkInt16();

                if (itemid == -1)
                    items.Add(new MCItem(-1, 0, 0));
                else
                    items.Add(new MCItem(itemid, reader.ReadByte(), reader.ReadNetworkInt16()));
            }

            HandlePlayerInventory(type, count, items);
        }
Пример #8
0
        protected void ParseMultiBlockChange(BinaryReader reader)
        {
            int x = reader.ReadNetworkInt32();
            int z = reader.ReadNetworkInt32();
            short size = reader.ReadNetworkInt16();

            List<MCBlockTransform> changes = new List<MCBlockTransform>();

            Vector3D[] relativepos = new Vector3D[size];
            byte[] blocks = new byte[size];
            byte[] metadatas = new byte[size];

            for (short i = 0; i < size; i++)
            {
                short xyz = reader.ReadNetworkInt16();

                int xpos = (xyz >> 12) & 0xF;
                int zpos = (xyz >> 8) & 0xF;
                int ypos = xyz & 0xFF;

                relativepos[i] = new Vector3D(xpos, ypos, zpos);
            }

            for (short i = 0; i < size; i++)
                blocks[i] = reader.ReadByte();

            for (short i = 0; i < size; i++)
                metadatas[i] = reader.ReadByte();

            for (short i = 0; i < size; i++)
                changes.Add(new MCBlockTransform(relativepos[i], blocks[i], metadatas[i]));

            HandleMultiBlockChange(x, z, size, changes);
        }