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 }