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; import net.minecraftforge.common.ForgeDummyContainer; import net.minecraftforge.common.MinecraftForge; 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 l = 4 * par4; Chunk chunk = par5World.getChunkFromChunkCoords(par1, par2); try { if (par4 >= ForgeDummyContainer.clumpingThreshold) { if (field_73449_e.length < l) { field_73449_e = new byte[l]; } } else { ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream(l); DataOutputStream dataoutputstream = new DataOutputStream(bytearrayoutputstream); for (int i1 = 0; i1 < par4; ++i1) { int j1 = par3ArrayOfShort[i1] >> 12 & 15; int k1 = par3ArrayOfShort[i1] >> 8 & 15; int l1 = par3ArrayOfShort[i1] & 255; dataoutputstream.writeShort(par3ArrayOfShort[i1]); dataoutputstream.writeShort((short)((chunk.getBlockID(j1, l1, k1) & 4095) << 4 | chunk.getBlockMetadata(j1, l1, k1) & 15)); } this.metadataArray = bytearrayoutputstream.toByteArray(); if (this.metadataArray.length != l) { throw new RuntimeException("Expected length " + l + " doesn\'t match received length " + this.metadataArray.length); } } } catch (IOException ioexception) { this.field_98193_m.logSevereException("Couldn\'t create chunk packet", ioexception); 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 i = par1DataInputStream.readInt(); if (i > 0) { this.metadataArray = new byte[i]; 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; } }