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