package net.minecraft.network.packet;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
public class Packet52MultiBlockChange extends Packet
{
/** Chunk X position. */
public int xPosition;
/** Chunk Z position. */
public int zPosition;
/** The metadata for each block changed. */
public byte[] metadataArray;
/** The size of the arrays. */
public int size;
private static byte[] field_73449_e = new byte[0];
public Packet52MultiBlockChange()
{
this.isChunkDataPacket = true;
}
public Packet52MultiBlockChange(int par1, int par2, short[] par3ArrayOfShort, int par4, World par5World)
{
this.isChunkDataPacket = true;
this.xPosition = par1;
this.zPosition = par2;
this.size = par4;
int var6 = 4 * par4;
Chunk var7 = par5World.getChunkFromChunkCoords(par1, par2);
try
{
if (par4 >= 64)
{
System.out.println("ChunkTilesUpdatePacket compress " + par4);
if (field_73449_e.length < var6)
{
field_73449_e = new byte[var6];
}
}
else
{
ByteArrayOutputStream var8 = new ByteArrayOutputStream(var6);
DataOutputStream var9 = new DataOutputStream(var8);
for (int var10 = 0; var10 < par4; ++var10)
{
int var11 = par3ArrayOfShort[var10] >> 12 & 15;
int var12 = par3ArrayOfShort[var10] >> 8 & 15;
int var13 = par3ArrayOfShort[var10] & 255;
var9.writeShort(par3ArrayOfShort[var10]);
var9.writeShort((short)((var7.getBlockID(var11, var13, var12) & 4095) << 4 | var7.getBlockMetadata(var11, var13, var12) & 15));
}
this.metadataArray = var8.toByteArray();
if (this.metadataArray.length != var6)
{
throw new RuntimeException("Expected length " + var6 + " doesn\'t match received length " + this.metadataArray.length);
}
}
}
catch (IOException var14)
{
System.err.println(var14.getMessage());
this.metadataArray = null;
}
}
/**
* Abstract. Reads the raw packet data from the data stream.
*/
public void readPacketData(DataInputStream par1DataInputStream) throws IOException
{
this.xPosition = par1DataInputStream.readInt();
this.zPosition = par1DataInputStream.readInt();
this.size = par1DataInputStream.readShort() & 65535;
int var2 = par1DataInputStream.readInt();
if (var2 > 0)
{
this.metadataArray = new byte[var2];
par1DataInputStream.readFully(this.metadataArray);
}
}
/**
* Abstract. Writes the raw packet data to the data stream.
*/
public void writePacketData(DataOutputStream par1DataOutputStream) throws IOException
{
par1DataOutputStream.writeInt(this.xPosition);
par1DataOutputStream.writeInt(this.zPosition);
par1DataOutputStream.writeShort((short)this.size);
if (this.metadataArray != null)
{
par1DataOutputStream.writeInt(this.metadataArray.length);
par1DataOutputStream.write(this.metadataArray);
}
else
{
par1DataOutputStream.writeInt(0);
}
}
/**
* Passes this Packet on to the NetHandler for processing.
*/
public void processPacket(NetHandler par1NetHandler)
{
par1NetHandler.handleMultiBlockChange(this);
}
/**
* Abstract. Return the size of the packet (not counting the header).
*/
public int getPacketSize()
{
return 10 + this.size * 4;
}
}