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