001package net.minecraft.network.packet; 002 003import java.io.DataInputStream; 004import java.io.DataOutputStream; 005import java.io.IOException; 006import net.minecraft.entity.Entity; 007import net.minecraft.util.MathHelper; 008 009public class Packet23VehicleSpawn extends Packet 010{ 011 /** Entity ID of the object. */ 012 public int entityId; 013 014 /** The X position of the object. */ 015 public int xPosition; 016 017 /** The Y position of the object. */ 018 public int yPosition; 019 020 /** The Z position of the object. */ 021 public int zPosition; 022 023 /** 024 * Not sent if the thrower entity ID is 0. The speed of this fireball along the X axis. 025 */ 026 public int speedX; 027 028 /** 029 * Not sent if the thrower entity ID is 0. The speed of this fireball along the Y axis. 030 */ 031 public int speedY; 032 033 /** 034 * Not sent if the thrower entity ID is 0. The speed of this fireball along the Z axis. 035 */ 036 public int speedZ; 037 038 /** The pitch in steps of 2p/256 */ 039 public int pitch; 040 041 /** The yaw in steps of 2p/256 */ 042 public int yaw; 043 044 /** The type of object. */ 045 public int type; 046 047 /** 0 if not a fireball. Otherwise, this is the Entity ID of the thrower. */ 048 public int throwerEntityId; 049 050 public Packet23VehicleSpawn() {} 051 052 public Packet23VehicleSpawn(Entity par1Entity, int par2) 053 { 054 this(par1Entity, par2, 0); 055 } 056 057 public Packet23VehicleSpawn(Entity par1Entity, int par2, int par3) 058 { 059 this.entityId = par1Entity.entityId; 060 this.xPosition = MathHelper.floor_double(par1Entity.posX * 32.0D); 061 this.yPosition = MathHelper.floor_double(par1Entity.posY * 32.0D); 062 this.zPosition = MathHelper.floor_double(par1Entity.posZ * 32.0D); 063 this.pitch = MathHelper.floor_float(par1Entity.rotationPitch * 256.0F / 360.0F); 064 this.yaw = MathHelper.floor_float(par1Entity.rotationYaw * 256.0F / 360.0F); 065 this.type = par2; 066 this.throwerEntityId = par3; 067 068 if (par3 > 0) 069 { 070 double d0 = par1Entity.motionX; 071 double d1 = par1Entity.motionY; 072 double d2 = par1Entity.motionZ; 073 double d3 = 3.9D; 074 075 if (d0 < -d3) 076 { 077 d0 = -d3; 078 } 079 080 if (d1 < -d3) 081 { 082 d1 = -d3; 083 } 084 085 if (d2 < -d3) 086 { 087 d2 = -d3; 088 } 089 090 if (d0 > d3) 091 { 092 d0 = d3; 093 } 094 095 if (d1 > d3) 096 { 097 d1 = d3; 098 } 099 100 if (d2 > d3) 101 { 102 d2 = d3; 103 } 104 105 this.speedX = (int)(d0 * 8000.0D); 106 this.speedY = (int)(d1 * 8000.0D); 107 this.speedZ = (int)(d2 * 8000.0D); 108 } 109 } 110 111 /** 112 * Abstract. Reads the raw packet data from the data stream. 113 */ 114 public void readPacketData(DataInputStream par1DataInputStream) throws IOException 115 { 116 this.entityId = par1DataInputStream.readInt(); 117 this.type = par1DataInputStream.readByte(); 118 this.xPosition = par1DataInputStream.readInt(); 119 this.yPosition = par1DataInputStream.readInt(); 120 this.zPosition = par1DataInputStream.readInt(); 121 this.pitch = par1DataInputStream.readByte(); 122 this.yaw = par1DataInputStream.readByte(); 123 this.throwerEntityId = par1DataInputStream.readInt(); 124 125 if (this.throwerEntityId > 0) 126 { 127 this.speedX = par1DataInputStream.readShort(); 128 this.speedY = par1DataInputStream.readShort(); 129 this.speedZ = par1DataInputStream.readShort(); 130 } 131 } 132 133 /** 134 * Abstract. Writes the raw packet data to the data stream. 135 */ 136 public void writePacketData(DataOutputStream par1DataOutputStream) throws IOException 137 { 138 par1DataOutputStream.writeInt(this.entityId); 139 par1DataOutputStream.writeByte(this.type); 140 par1DataOutputStream.writeInt(this.xPosition); 141 par1DataOutputStream.writeInt(this.yPosition); 142 par1DataOutputStream.writeInt(this.zPosition); 143 par1DataOutputStream.writeByte(this.pitch); 144 par1DataOutputStream.writeByte(this.yaw); 145 par1DataOutputStream.writeInt(this.throwerEntityId); 146 147 if (this.throwerEntityId > 0) 148 { 149 par1DataOutputStream.writeShort(this.speedX); 150 par1DataOutputStream.writeShort(this.speedY); 151 par1DataOutputStream.writeShort(this.speedZ); 152 } 153 } 154 155 /** 156 * Passes this Packet on to the NetHandler for processing. 157 */ 158 public void processPacket(NetHandler par1NetHandler) 159 { 160 par1NetHandler.handleVehicleSpawn(this); 161 } 162 163 /** 164 * Abstract. Return the size of the packet (not counting the header). 165 */ 166 public int getPacketSize() 167 { 168 return 21 + this.throwerEntityId > 0 ? 6 : 0; 169 } 170}