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}