001 package net.minecraft.network.packet;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.SideOnly;
005 import java.io.DataInputStream;
006 import java.io.DataOutputStream;
007 import java.io.IOException;
008 import java.util.List;
009 import net.minecraft.entity.DataWatcher;
010 import net.minecraft.entity.EntityList;
011 import net.minecraft.entity.EntityLiving;
012 import net.minecraft.util.MathHelper;
013
014 public class Packet24MobSpawn extends Packet
015 {
016 /** The entity ID. */
017 public int entityId;
018
019 /** The type of mob. */
020 public int type;
021
022 /** The X position of the entity. */
023 public int xPosition;
024
025 /** The Y position of the entity. */
026 public int yPosition;
027
028 /** The Z position of the entity. */
029 public int zPosition;
030 public int velocityX;
031 public int velocityY;
032 public int velocityZ;
033
034 /** The yaw of the entity. */
035 public byte yaw;
036
037 /** The pitch of the entity. */
038 public byte pitch;
039
040 /** The yaw of the entity's head. */
041 public byte headYaw;
042
043 /** Indexed metadata for Mob, terminated by 0x7F */
044 private DataWatcher metaData;
045 private List metadata;
046
047 public Packet24MobSpawn() {}
048
049 public Packet24MobSpawn(EntityLiving par1EntityLiving)
050 {
051 this.entityId = par1EntityLiving.entityId;
052 this.type = (byte)EntityList.getEntityID(par1EntityLiving);
053 this.xPosition = par1EntityLiving.myEntitySize.multiplyBy32AndRound(par1EntityLiving.posX);
054 this.yPosition = MathHelper.floor_double(par1EntityLiving.posY * 32.0D);
055 this.zPosition = par1EntityLiving.myEntitySize.multiplyBy32AndRound(par1EntityLiving.posZ);
056 this.yaw = (byte)((int)(par1EntityLiving.rotationYaw * 256.0F / 360.0F));
057 this.pitch = (byte)((int)(par1EntityLiving.rotationPitch * 256.0F / 360.0F));
058 this.headYaw = (byte)((int)(par1EntityLiving.rotationYawHead * 256.0F / 360.0F));
059 double var2 = 3.9D;
060 double var4 = par1EntityLiving.motionX;
061 double var6 = par1EntityLiving.motionY;
062 double var8 = par1EntityLiving.motionZ;
063
064 if (var4 < -var2)
065 {
066 var4 = -var2;
067 }
068
069 if (var6 < -var2)
070 {
071 var6 = -var2;
072 }
073
074 if (var8 < -var2)
075 {
076 var8 = -var2;
077 }
078
079 if (var4 > var2)
080 {
081 var4 = var2;
082 }
083
084 if (var6 > var2)
085 {
086 var6 = var2;
087 }
088
089 if (var8 > var2)
090 {
091 var8 = var2;
092 }
093
094 this.velocityX = (int)(var4 * 8000.0D);
095 this.velocityY = (int)(var6 * 8000.0D);
096 this.velocityZ = (int)(var8 * 8000.0D);
097 this.metaData = par1EntityLiving.getDataWatcher();
098 }
099
100 /**
101 * Abstract. Reads the raw packet data from the data stream.
102 */
103 public void readPacketData(DataInputStream par1DataInputStream) throws IOException
104 {
105 this.entityId = par1DataInputStream.readInt();
106 this.type = par1DataInputStream.readByte() & 255;
107 this.xPosition = par1DataInputStream.readInt();
108 this.yPosition = par1DataInputStream.readInt();
109 this.zPosition = par1DataInputStream.readInt();
110 this.yaw = par1DataInputStream.readByte();
111 this.pitch = par1DataInputStream.readByte();
112 this.headYaw = par1DataInputStream.readByte();
113 this.velocityX = par1DataInputStream.readShort();
114 this.velocityY = par1DataInputStream.readShort();
115 this.velocityZ = par1DataInputStream.readShort();
116 this.metadata = DataWatcher.readWatchableObjects(par1DataInputStream);
117 }
118
119 /**
120 * Abstract. Writes the raw packet data to the data stream.
121 */
122 public void writePacketData(DataOutputStream par1DataOutputStream) throws IOException
123 {
124 par1DataOutputStream.writeInt(this.entityId);
125 par1DataOutputStream.writeByte(this.type & 255);
126 par1DataOutputStream.writeInt(this.xPosition);
127 par1DataOutputStream.writeInt(this.yPosition);
128 par1DataOutputStream.writeInt(this.zPosition);
129 par1DataOutputStream.writeByte(this.yaw);
130 par1DataOutputStream.writeByte(this.pitch);
131 par1DataOutputStream.writeByte(this.headYaw);
132 par1DataOutputStream.writeShort(this.velocityX);
133 par1DataOutputStream.writeShort(this.velocityY);
134 par1DataOutputStream.writeShort(this.velocityZ);
135 this.metaData.writeWatchableObjects(par1DataOutputStream);
136 }
137
138 /**
139 * Passes this Packet on to the NetHandler for processing.
140 */
141 public void processPacket(NetHandler par1NetHandler)
142 {
143 par1NetHandler.handleMobSpawn(this);
144 }
145
146 /**
147 * Abstract. Return the size of the packet (not counting the header).
148 */
149 public int getPacketSize()
150 {
151 return 26;
152 }
153
154 @SideOnly(Side.CLIENT)
155 public List getMetadata()
156 {
157 if (this.metadata == null)
158 {
159 this.metadata = this.metaData.func_75685_c();
160 }
161
162 return this.metadata;
163 }
164 }