package net.minecraft.network.play.server;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.io.IOException;
import java.util.concurrent.Semaphore;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;
import net.minecraft.network.INetHandler;
import net.minecraft.network.Packet;
import net.minecraft.network.PacketBuffer;
import net.minecraft.network.play.INetHandlerPlayClient;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.NibbleArray;
import net.minecraft.world.chunk.storage.ExtendedBlockStorage;
public class S21PacketChunkData extends Packet
{
private int field_149284_a;
private int field_149282_b;
private int field_149283_c;
private int field_149280_d;
private byte[] field_149281_e;
private byte[] field_149278_f;
private boolean field_149279_g;
private int field_149285_h;
private static byte[] field_149286_i = new byte[196864];
private static final String __OBFID = "CL_00001304";
private Semaphore deflateGate;
public S21PacketChunkData() {}
public S21PacketChunkData(Chunk p_i45196_1_, boolean p_i45196_2_, int p_i45196_3_)
{
this.field_149284_a = p_i45196_1_.xPosition;
this.field_149282_b = p_i45196_1_.zPosition;
this.field_149279_g = p_i45196_2_;
S21PacketChunkData.Extracted extracted = func_149269_a(p_i45196_1_, p_i45196_2_, p_i45196_3_);
this.field_149280_d = extracted.field_150281_c;
this.field_149283_c = extracted.field_150280_b;
this.field_149278_f = extracted.field_150282_a;
this.deflateGate = new Semaphore(1);
}
private void deflate()
{
Deflater deflater = new Deflater(-1);
try
{
deflater.setInput(this.field_149278_f, 0, this.field_149278_f.length);
deflater.finish();
byte[] deflated = new byte[this.field_149278_f.length];
this.field_149285_h = deflater.deflate(deflated);
this.field_149281_e = deflated;
}
finally
{
deflater.end();
}
}
public static int func_149275_c()
{
return 196864;
}
/**
* Reads the raw packet data from the data stream.
*/
public void readPacketData(PacketBuffer data) throws IOException
{
this.field_149284_a = data.readInt();
this.field_149282_b = data.readInt();
this.field_149279_g = data.readBoolean();
this.field_149283_c = data.readShort();
this.field_149280_d = data.readShort();
this.field_149285_h = data.readInt();
if (field_149286_i.length < this.field_149285_h)
{
field_149286_i = new byte[this.field_149285_h];
}
data.readBytes(field_149286_i, 0, this.field_149285_h);
int i = 0;
int j;
int msb = 0; //BugFix: MC does not read the MSB array from the packet properly, causing issues for servers that use blocks > 256
for (j = 0; j < 16; ++j)
{
i += this.field_149283_c >> j & 1;
msb += this.field_149283_c >> j & 1;
}
j = 12288 * i;
j += 2048 * msb;
if (this.field_149279_g)
{
j += 256;
}
this.field_149278_f = new byte[j];
Inflater inflater = new Inflater();
inflater.setInput(field_149286_i, 0, this.field_149285_h);
try
{
inflater.inflate(this.field_149278_f);
}
catch (DataFormatException dataformatexception)
{
throw new IOException("Bad compressed data format");
}
finally
{
inflater.end();
}
}
/**
* Writes the raw packet data to the data stream.
*/
public void writePacketData(PacketBuffer data) throws IOException
{
if (this.field_149281_e == null)
{
deflateGate.acquireUninterruptibly();
if (this.field_149281_e == null)
{
deflate();
}
deflateGate.release();
}
data.writeInt(this.field_149284_a);
data.writeInt(this.field_149282_b);
data.writeBoolean(this.field_149279_g);
data.writeShort((short)(this.field_149283_c & 65535));
data.writeShort((short)(this.field_149280_d & 65535));
data.writeInt(this.field_149285_h);
data.writeBytes(this.field_149281_e, 0, this.field_149285_h);
}
/**
* Passes this Packet on to the NetHandler for processing.
*/
public void processPacket(INetHandlerPlayClient handler)
{
handler.handleChunkData(this);
}
/**
* Returns a string formatted as comma separated [field]=[value] values. Used by Minecraft for logging purposes.
*/
public String serialize()
{
return String.format("x=%d, z=%d, full=%b, sects=%d, add=%d, size=%d", new Object[] {Integer.valueOf(this.field_149284_a), Integer.valueOf(this.field_149282_b), Boolean.valueOf(this.field_149279_g), Integer.valueOf(this.field_149283_c), Integer.valueOf(this.field_149280_d), Integer.valueOf(this.field_149285_h)});
}
@SideOnly(Side.CLIENT)
public byte[] func_149272_d()
{
return this.field_149278_f;
}
public static S21PacketChunkData.Extracted func_149269_a(Chunk p_149269_0_, boolean p_149269_1_, int p_149269_2_)
{
int j = 0;
ExtendedBlockStorage[] aextendedblockstorage = p_149269_0_.getBlockStorageArray();
int k = 0;
S21PacketChunkData.Extracted extracted = new S21PacketChunkData.Extracted();
byte[] abyte = field_149286_i;
if (p_149269_1_)
{
p_149269_0_.sendUpdates = true;
}
int l;
for (l = 0; l < aextendedblockstorage.length; ++l)
{
if (aextendedblockstorage[l] != null && (!p_149269_1_ || !aextendedblockstorage[l].isEmpty()) && (p_149269_2_ & 1 << l) != 0)
{
extracted.field_150280_b |= 1 << l;
if (aextendedblockstorage[l].getBlockMSBArray() != null)
{
extracted.field_150281_c |= 1 << l;
++k;
}
}
}
for (l = 0; l < aextendedblockstorage.length; ++l)
{
if (aextendedblockstorage[l] != null && (!p_149269_1_ || !aextendedblockstorage[l].isEmpty()) && (p_149269_2_ & 1 << l) != 0)
{
byte[] abyte1 = aextendedblockstorage[l].getBlockLSBArray();
System.arraycopy(abyte1, 0, abyte, j, abyte1.length);
j += abyte1.length;
}
}
NibbleArray nibblearray;
for (l = 0; l < aextendedblockstorage.length; ++l)
{
if (aextendedblockstorage[l] != null && (!p_149269_1_ || !aextendedblockstorage[l].isEmpty()) && (p_149269_2_ & 1 << l) != 0)
{
nibblearray = aextendedblockstorage[l].getMetadataArray();
System.arraycopy(nibblearray.data, 0, abyte, j, nibblearray.data.length);
j += nibblearray.data.length;
}
}
for (l = 0; l < aextendedblockstorage.length; ++l)
{
if (aextendedblockstorage[l] != null && (!p_149269_1_ || !aextendedblockstorage[l].isEmpty()) && (p_149269_2_ & 1 << l) != 0)
{
nibblearray = aextendedblockstorage[l].getBlocklightArray();
System.arraycopy(nibblearray.data, 0, abyte, j, nibblearray.data.length);
j += nibblearray.data.length;
}
}
if (!p_149269_0_.worldObj.provider.hasNoSky)
{
for (l = 0; l < aextendedblockstorage.length; ++l)
{
if (aextendedblockstorage[l] != null && (!p_149269_1_ || !aextendedblockstorage[l].isEmpty()) && (p_149269_2_ & 1 << l) != 0)
{
nibblearray = aextendedblockstorage[l].getSkylightArray();
System.arraycopy(nibblearray.data, 0, abyte, j, nibblearray.data.length);
j += nibblearray.data.length;
}
}
}
if (k > 0)
{
for (l = 0; l < aextendedblockstorage.length; ++l)
{
if (aextendedblockstorage[l] != null && (!p_149269_1_ || !aextendedblockstorage[l].isEmpty()) && aextendedblockstorage[l].getBlockMSBArray() != null && (p_149269_2_ & 1 << l) != 0)
{
nibblearray = aextendedblockstorage[l].getBlockMSBArray();
System.arraycopy(nibblearray.data, 0, abyte, j, nibblearray.data.length);
j += nibblearray.data.length;
}
}
}
if (p_149269_1_)
{
byte[] abyte2 = p_149269_0_.getBiomeArray();
System.arraycopy(abyte2, 0, abyte, j, abyte2.length);
j += abyte2.length;
}
extracted.field_150282_a = new byte[j];
System.arraycopy(abyte, 0, extracted.field_150282_a, 0, j);
return extracted;
}
/**
* Passes this Packet on to the NetHandler for processing.
*/
public void processPacket(INetHandler handler)
{
this.processPacket((INetHandlerPlayClient)handler);
}
@SideOnly(Side.CLIENT)
public int func_149273_e()
{
return this.field_149284_a;
}
@SideOnly(Side.CLIENT)
public int func_149271_f()
{
return this.field_149282_b;
}
@SideOnly(Side.CLIENT)
public int func_149276_g()
{
return this.field_149283_c;
}
@SideOnly(Side.CLIENT)
public int func_149270_h()
{
return this.field_149280_d;
}
@SideOnly(Side.CLIENT)
public boolean func_149274_i()
{
return this.field_149279_g;
}
public static class Extracted
{
public byte[] field_150282_a;
public int field_150280_b;
public int field_150281_c;
private static final String __OBFID = "CL_00001305";
}
}