001 package net.minecraft.network.packet; 002 003 import cpw.mods.fml.common.Side; 004 import cpw.mods.fml.common.asm.SideOnly; 005 import java.io.DataInputStream; 006 import java.io.DataOutputStream; 007 import java.io.IOException; 008 import java.util.List; 009 import java.util.zip.DataFormatException; 010 import java.util.zip.Deflater; 011 import java.util.zip.Inflater; 012 import net.minecraft.world.chunk.Chunk; 013 014 public class Packet56MapChunks extends Packet 015 { 016 private int[] field_73589_c; 017 private int[] field_73586_d; 018 public int[] field_73590_a; 019 public int[] field_73588_b; 020 private byte[] field_73587_e; 021 private byte[][] field_73584_f; 022 private int field_73585_g; 023 private static byte[] field_73591_h = new byte[0]; 024 025 public Packet56MapChunks() {} 026 027 public Packet56MapChunks(List par1List) 028 { 029 int var2 = par1List.size(); 030 this.field_73589_c = new int[var2]; 031 this.field_73586_d = new int[var2]; 032 this.field_73590_a = new int[var2]; 033 this.field_73588_b = new int[var2]; 034 this.field_73584_f = new byte[var2][]; 035 int var3 = 0; 036 037 for (int var4 = 0; var4 < var2; ++var4) 038 { 039 Chunk var5 = (Chunk)par1List.get(var4); 040 Packet51MapChunkData var6 = Packet51MapChunk.getMapChunkData(var5, true, 65535); 041 042 if (field_73591_h.length < var3 + var6.field_74582_a.length) 043 { 044 byte[] var7 = new byte[var3 + var6.field_74582_a.length]; 045 System.arraycopy(field_73591_h, 0, var7, 0, field_73591_h.length); 046 field_73591_h = var7; 047 } 048 049 System.arraycopy(var6.field_74582_a, 0, field_73591_h, var3, var6.field_74582_a.length); 050 var3 += var6.field_74582_a.length; 051 this.field_73589_c[var4] = var5.xPosition; 052 this.field_73586_d[var4] = var5.zPosition; 053 this.field_73590_a[var4] = var6.field_74580_b; 054 this.field_73588_b[var4] = var6.field_74581_c; 055 this.field_73584_f[var4] = var6.field_74582_a; 056 } 057 058 Deflater var11 = new Deflater(-1); 059 060 try 061 { 062 var11.setInput(field_73591_h, 0, var3); 063 var11.finish(); 064 this.field_73587_e = new byte[var3]; 065 this.field_73585_g = var11.deflate(this.field_73587_e); 066 } 067 finally 068 { 069 var11.end(); 070 } 071 } 072 073 /** 074 * Abstract. Reads the raw packet data from the data stream. 075 */ 076 public void readPacketData(DataInputStream par1DataInputStream) throws IOException 077 { 078 short var2 = par1DataInputStream.readShort(); 079 this.field_73585_g = par1DataInputStream.readInt(); 080 this.field_73589_c = new int[var2]; 081 this.field_73586_d = new int[var2]; 082 this.field_73590_a = new int[var2]; 083 this.field_73588_b = new int[var2]; 084 this.field_73584_f = new byte[var2][]; 085 086 if (field_73591_h.length < this.field_73585_g) 087 { 088 field_73591_h = new byte[this.field_73585_g]; 089 } 090 091 par1DataInputStream.readFully(field_73591_h, 0, this.field_73585_g); 092 byte[] var3 = new byte[196864 * var2]; 093 Inflater var4 = new Inflater(); 094 var4.setInput(field_73591_h, 0, this.field_73585_g); 095 096 try 097 { 098 var4.inflate(var3); 099 } 100 catch (DataFormatException var11) 101 { 102 throw new IOException("Bad compressed data format"); 103 } 104 finally 105 { 106 var4.end(); 107 } 108 109 int var5 = 0; 110 111 for (int var6 = 0; var6 < var2; ++var6) 112 { 113 this.field_73589_c[var6] = par1DataInputStream.readInt(); 114 this.field_73586_d[var6] = par1DataInputStream.readInt(); 115 this.field_73590_a[var6] = par1DataInputStream.readShort(); 116 this.field_73588_b[var6] = par1DataInputStream.readShort(); 117 int var7 = 0; 118 int var8; 119 120 for (var8 = 0; var8 < 16; ++var8) 121 { 122 var7 += this.field_73590_a[var6] >> var8 & 1; 123 } 124 125 int msb = 0; //BugFix: MC does not read the MSB array from the packet properly, causing issues for servers that use blocks > 256 126 for (int x = 0; x < 16; x++) 127 { 128 msb += (field_73588_b[var6] >> x) & 1; 129 } 130 131 var8 = 2048 * 5 * var7 + (2048 * msb) + 256; 132 this.field_73584_f[var6] = new byte[var8]; 133 System.arraycopy(var3, var5, this.field_73584_f[var6], 0, var8); 134 var5 += var8; 135 } 136 } 137 138 /** 139 * Abstract. Writes the raw packet data to the data stream. 140 */ 141 public void writePacketData(DataOutputStream par1DataOutputStream) throws IOException 142 { 143 par1DataOutputStream.writeShort(this.field_73589_c.length); 144 par1DataOutputStream.writeInt(this.field_73585_g); 145 par1DataOutputStream.write(this.field_73587_e, 0, this.field_73585_g); 146 147 for (int var2 = 0; var2 < this.field_73589_c.length; ++var2) 148 { 149 par1DataOutputStream.writeInt(this.field_73589_c[var2]); 150 par1DataOutputStream.writeInt(this.field_73586_d[var2]); 151 par1DataOutputStream.writeShort((short)(this.field_73590_a[var2] & 65535)); 152 par1DataOutputStream.writeShort((short)(this.field_73588_b[var2] & 65535)); 153 } 154 } 155 156 /** 157 * Passes this Packet on to the NetHandler for processing. 158 */ 159 public void processPacket(NetHandler par1NetHandler) 160 { 161 par1NetHandler.handleMapChunks(this); 162 } 163 164 /** 165 * Abstract. Return the size of the packet (not counting the header). 166 */ 167 public int getPacketSize() 168 { 169 return 6 + this.field_73585_g + 12 * this.func_73581_d(); 170 } 171 172 @SideOnly(Side.CLIENT) 173 public int func_73582_a(int par1) 174 { 175 return this.field_73589_c[par1]; 176 } 177 178 @SideOnly(Side.CLIENT) 179 public int func_73580_b(int par1) 180 { 181 return this.field_73586_d[par1]; 182 } 183 184 public int func_73581_d() 185 { 186 return this.field_73589_c.length; 187 } 188 189 @SideOnly(Side.CLIENT) 190 public byte[] func_73583_c(int par1) 191 { 192 return this.field_73584_f[par1]; 193 } 194 }