001    package net.minecraft.src;
002    
003    import java.io.ByteArrayOutputStream;
004    import java.io.DataInputStream;
005    import java.io.DataOutputStream;
006    import java.io.IOException;
007    
008    public class Packet52MultiBlockChange extends Packet
009    {
010        /** Chunk X position. */
011        public int xPosition;
012    
013        /** Chunk Z position. */
014        public int zPosition;
015    
016        /** The metadata for each block changed. */
017        public byte[] metadataArray;
018    
019        /** The size of the arrays. */
020        public int size;
021        private static byte[] field_73449_e = new byte[0];
022    
023        public Packet52MultiBlockChange()
024        {
025            this.isChunkDataPacket = true;
026        }
027    
028        public Packet52MultiBlockChange(int par1, int par2, short[] par3ArrayOfShort, int par4, World par5World)
029        {
030            this.isChunkDataPacket = true;
031            this.xPosition = par1;
032            this.zPosition = par2;
033            this.size = par4;
034            int var6 = 4 * par4;
035            Chunk var7 = par5World.getChunkFromChunkCoords(par1, par2);
036    
037            try
038            {
039                if (par4 >= 64)
040                {
041                    System.out.println("ChunkTilesUpdatePacket compress " + par4);
042    
043                    if (field_73449_e.length < var6)
044                    {
045                        field_73449_e = new byte[var6];
046                    }
047                }
048                else
049                {
050                    ByteArrayOutputStream var8 = new ByteArrayOutputStream(var6);
051                    DataOutputStream var9 = new DataOutputStream(var8);
052    
053                    for (int var10 = 0; var10 < par4; ++var10)
054                    {
055                        int var11 = par3ArrayOfShort[var10] >> 12 & 15;
056                        int var12 = par3ArrayOfShort[var10] >> 8 & 15;
057                        int var13 = par3ArrayOfShort[var10] & 255;
058                        var9.writeShort(par3ArrayOfShort[var10]);
059                        var9.writeShort((short)((var7.getBlockID(var11, var13, var12) & 4095) << 4 | var7.getBlockMetadata(var11, var13, var12) & 15));
060                    }
061    
062                    this.metadataArray = var8.toByteArray();
063    
064                    if (this.metadataArray.length != var6)
065                    {
066                        throw new RuntimeException("Expected length " + var6 + " doesn\'t match received length " + this.metadataArray.length);
067                    }
068                }
069            }
070            catch (IOException var14)
071            {
072                System.err.println(var14.getMessage());
073                this.metadataArray = null;
074            }
075        }
076    
077        /**
078         * Abstract. Reads the raw packet data from the data stream.
079         */
080        public void readPacketData(DataInputStream par1DataInputStream) throws IOException
081        {
082            this.xPosition = par1DataInputStream.readInt();
083            this.zPosition = par1DataInputStream.readInt();
084            this.size = par1DataInputStream.readShort() & 65535;
085            int var2 = par1DataInputStream.readInt();
086    
087            if (var2 > 0)
088            {
089                this.metadataArray = new byte[var2];
090                par1DataInputStream.readFully(this.metadataArray);
091            }
092        }
093    
094        /**
095         * Abstract. Writes the raw packet data to the data stream.
096         */
097        public void writePacketData(DataOutputStream par1DataOutputStream) throws IOException
098        {
099            par1DataOutputStream.writeInt(this.xPosition);
100            par1DataOutputStream.writeInt(this.zPosition);
101            par1DataOutputStream.writeShort((short)this.size);
102    
103            if (this.metadataArray != null)
104            {
105                par1DataOutputStream.writeInt(this.metadataArray.length);
106                par1DataOutputStream.write(this.metadataArray);
107            }
108            else
109            {
110                par1DataOutputStream.writeInt(0);
111            }
112        }
113    
114        /**
115         * Passes this Packet on to the NetHandler for processing.
116         */
117        public void processPacket(NetHandler par1NetHandler)
118        {
119            par1NetHandler.handleMultiBlockChange(this);
120        }
121    
122        /**
123         * Abstract. Return the size of the packet (not counting the header).
124         */
125        public int getPacketSize()
126        {
127            return 10 + this.size * 4;
128        }
129    }