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