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