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