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 }