    001    package net.minecraft.network.packet;
    002
    003    import java.io.DataInputStream;
    004    import java.io.DataOutputStream;
    005    import java.io.IOException;
    006    import net.minecraft.entity.Entity;
    007    import net.minecraft.util.MathHelper;
    008
    009    public 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        public int field_92025_h;
    038        public int field_92026_i;
    039
    040        /** The type of object. */
    041        public int type;
    042
    043        /** 0 if not a fireball. Otherwise, this is the Entity ID of the thrower. */
    044        public int throwerEntityId;
    045
    046        public Packet23VehicleSpawn() {}
    047
    048        public Packet23VehicleSpawn(Entity par1Entity, int par2)
    049        {
    050            this(par1Entity, par2, 0);
    051        }
    052
    053        public Packet23VehicleSpawn(Entity par1Entity, int par2, int par3)
    054        {
    055            this.entityId = par1Entity.entityId;
    056            this.xPosition = MathHelper.floor_double(par1Entity.posX * 32.0D);
    057            this.yPosition = MathHelper.floor_double(par1Entity.posY * 32.0D);
    058            this.zPosition = MathHelper.floor_double(par1Entity.posZ * 32.0D);
    059            this.field_92025_h = MathHelper.floor_float(par1Entity.rotationPitch * 256.0F / 360.0F);
    060            this.field_92026_i = MathHelper.floor_float(par1Entity.rotationYaw * 256.0F / 360.0F);
    061            this.type = par2;
    062            this.throwerEntityId = par3;
    063
    064            if (par3 > 0)
    065            {
    066                double var4 = par1Entity.motionX;
    067                double var6 = par1Entity.motionY;
    068                double var8 = par1Entity.motionZ;
    069                double var10 = 3.9D;
    070
    071                if (var4 < -var10)
    072                {
    073                    var4 = -var10;
    074                }
    075
    076                if (var6 < -var10)
    077                {
    078                    var6 = -var10;
    079                }
    080
    081                if (var8 < -var10)
    082                {
    083                    var8 = -var10;
    084                }
    085
    086                if (var4 > var10)
    087                {
    088                    var4 = var10;
    089                }
    090
    091                if (var6 > var10)
    092                {
    093                    var6 = var10;
    094                }
    095
    096                if (var8 > var10)
    097                {
    098                    var8 = var10;
    099                }
    100
    101                this.speedX = (int)(var4 * 8000.0D);
    102                this.speedY = (int)(var6 * 8000.0D);
    103                this.speedZ = (int)(var8 * 8000.0D);
    104            }
    105        }
    106
    107        /**
    108         * Abstract. Reads the raw packet data from the data stream.
    109         */
    110        public void readPacketData(DataInputStream par1DataInputStream) throws IOException
    111        {
    112            this.entityId = par1DataInputStream.readInt();
    113            this.type = par1DataInputStream.readByte();
    114            this.xPosition = par1DataInputStream.readInt();
    115            this.yPosition = par1DataInputStream.readInt();
    116            this.zPosition = par1DataInputStream.readInt();
    117            this.field_92025_h = par1DataInputStream.readByte();
    118            this.field_92026_i = par1DataInputStream.readByte();
    119            this.throwerEntityId = par1DataInputStream.readInt();
    120
    121            if (this.throwerEntityId > 0)
    122            {
    123                this.speedX = par1DataInputStream.readShort();
    124                this.speedY = par1DataInputStream.readShort();
    125                this.speedZ = par1DataInputStream.readShort();
    126            }
    127        }
    128
    129        /**
    130         * Abstract. Writes the raw packet data to the data stream.
    131         */
    132        public void writePacketData(DataOutputStream par1DataOutputStream) throws IOException
    133        {
    134            par1DataOutputStream.writeInt(this.entityId);
    135            par1DataOutputStream.writeByte(this.type);
    136            par1DataOutputStream.writeInt(this.xPosition);
    137            par1DataOutputStream.writeInt(this.yPosition);
    138            par1DataOutputStream.writeInt(this.zPosition);
    139            par1DataOutputStream.writeByte(this.field_92025_h);
    140            par1DataOutputStream.writeByte(this.field_92026_i);
    141            par1DataOutputStream.writeInt(this.throwerEntityId);
    142
    143            if (this.throwerEntityId > 0)
    144            {
    145                par1DataOutputStream.writeShort(this.speedX);
    146                par1DataOutputStream.writeShort(this.speedY);
    147                par1DataOutputStream.writeShort(this.speedZ);
    148            }
    149        }
    150
    151        /**
    152         * Passes this Packet on to the NetHandler for processing.
    153         */
    154        public void processPacket(NetHandler par1NetHandler)
    155        {
    156            par1NetHandler.handleVehicleSpawn(this);
    157        }
    158
    159        /**
    160         * Abstract. Return the size of the packet (not counting the header).
    161         */
    162        public int getPacketSize()
    163        {
    164            return 21 + this.throwerEntityId > 0 ? 6 : 0;
    165        }
    166    }