001    package net.minecraft.client.entity;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import net.minecraft.client.Minecraft;
006    import net.minecraft.client.multiplayer.NetClientHandler;
007    import net.minecraft.entity.item.EntityItem;
008    import net.minecraft.item.ItemStack;
009    import net.minecraft.network.packet.Packet101CloseWindow;
010    import net.minecraft.network.packet.Packet10Flying;
011    import net.minecraft.network.packet.Packet11PlayerPosition;
012    import net.minecraft.network.packet.Packet12PlayerLook;
013    import net.minecraft.network.packet.Packet13PlayerLookMove;
014    import net.minecraft.network.packet.Packet14BlockDig;
015    import net.minecraft.network.packet.Packet18Animation;
016    import net.minecraft.network.packet.Packet19EntityAction;
017    import net.minecraft.network.packet.Packet202PlayerAbilities;
018    import net.minecraft.network.packet.Packet205ClientCommand;
019    import net.minecraft.network.packet.Packet3Chat;
020    import net.minecraft.stats.StatBase;
021    import net.minecraft.util.DamageSource;
022    import net.minecraft.util.MathHelper;
023    import net.minecraft.util.Session;
024    import net.minecraft.world.World;
025    
026    @SideOnly(Side.CLIENT)
027    public class EntityClientPlayerMP extends EntityPlayerSP
028    {
029        public NetClientHandler sendQueue;
030        private double oldPosX;
031    
032        /** Old Minimum Y of the bounding box */
033        private double oldMinY;
034        private double oldPosY;
035        private double oldPosZ;
036        private float oldRotationYaw;
037        private float oldRotationPitch;
038    
039        /** Check if was on ground last update */
040        private boolean wasOnGround = false;
041    
042        /** should the player stop sneaking? */
043        private boolean shouldStopSneaking = false;
044        private boolean wasSneaking = false;
045        private int field_71168_co = 0;
046    
047        /** has the client player's health been set? */
048        private boolean hasSetHealth = false;
049    
050        public EntityClientPlayerMP(Minecraft par1Minecraft, World par2World, Session par3Session, NetClientHandler par4NetClientHandler)
051        {
052            super(par1Minecraft, par2World, par3Session, 0);
053            this.sendQueue = par4NetClientHandler;
054        }
055    
056        /**
057         * Called when the entity is attacked.
058         */
059        public boolean attackEntityFrom(DamageSource par1DamageSource, int par2)
060        {
061            return false;
062        }
063    
064        /**
065         * Heal living entity (param: amount of half-hearts)
066         */
067        public void heal(int par1) {}
068    
069        /**
070         * Called to update the entity's position/logic.
071         */
072        public void onUpdate()
073        {
074            if (this.worldObj.blockExists(MathHelper.floor_double(this.posX), 0, MathHelper.floor_double(this.posZ)))
075            {
076                super.onUpdate();
077                this.sendMotionUpdates();
078            }
079        }
080    
081        /**
082         * Send updated motion and position information to the server
083         */
084        public void sendMotionUpdates()
085        {
086            boolean var1 = this.isSprinting();
087    
088            if (var1 != this.wasSneaking)
089            {
090                if (var1)
091                {
092                    this.sendQueue.addToSendQueue(new Packet19EntityAction(this, 4));
093                }
094                else
095                {
096                    this.sendQueue.addToSendQueue(new Packet19EntityAction(this, 5));
097                }
098    
099                this.wasSneaking = var1;
100            }
101    
102            boolean var2 = this.isSneaking();
103    
104            if (var2 != this.shouldStopSneaking)
105            {
106                if (var2)
107                {
108                    this.sendQueue.addToSendQueue(new Packet19EntityAction(this, 1));
109                }
110                else
111                {
112                    this.sendQueue.addToSendQueue(new Packet19EntityAction(this, 2));
113                }
114    
115                this.shouldStopSneaking = var2;
116            }
117    
118            double var3 = this.posX - this.oldPosX;
119            double var5 = this.boundingBox.minY - this.oldMinY;
120            double var7 = this.posZ - this.oldPosZ;
121            double var9 = (double)(this.rotationYaw - this.oldRotationYaw);
122            double var11 = (double)(this.rotationPitch - this.oldRotationPitch);
123            boolean var13 = var3 * var3 + var5 * var5 + var7 * var7 > 9.0E-4D || this.field_71168_co >= 20;
124            boolean var14 = var9 != 0.0D || var11 != 0.0D;
125    
126            if (this.ridingEntity != null)
127            {
128                this.sendQueue.addToSendQueue(new Packet13PlayerLookMove(this.motionX, -999.0D, -999.0D, this.motionZ, this.rotationYaw, this.rotationPitch, this.onGround));
129                var13 = false;
130            }
131            else if (var13 && var14)
132            {
133                this.sendQueue.addToSendQueue(new Packet13PlayerLookMove(this.posX, this.boundingBox.minY, this.posY, this.posZ, this.rotationYaw, this.rotationPitch, this.onGround));
134            }
135            else if (var13)
136            {
137                this.sendQueue.addToSendQueue(new Packet11PlayerPosition(this.posX, this.boundingBox.minY, this.posY, this.posZ, this.onGround));
138            }
139            else if (var14)
140            {
141                this.sendQueue.addToSendQueue(new Packet12PlayerLook(this.rotationYaw, this.rotationPitch, this.onGround));
142            }
143            else
144            {
145                this.sendQueue.addToSendQueue(new Packet10Flying(this.onGround));
146            }
147    
148            ++this.field_71168_co;
149            this.wasOnGround = this.onGround;
150    
151            if (var13)
152            {
153                this.oldPosX = this.posX;
154                this.oldMinY = this.boundingBox.minY;
155                this.oldPosY = this.posY;
156                this.oldPosZ = this.posZ;
157                this.field_71168_co = 0;
158            }
159    
160            if (var14)
161            {
162                this.oldRotationYaw = this.rotationYaw;
163                this.oldRotationPitch = this.rotationPitch;
164            }
165        }
166    
167        /**
168         * Called when player presses the drop item key
169         */
170        public EntityItem dropOneItem(boolean par1)
171        {
172            int var2 = par1 ? 3 : 4;
173            this.sendQueue.addToSendQueue(new Packet14BlockDig(var2, 0, 0, 0, 0));
174            return null;
175        }
176    
177        /**
178         * Joins the passed in entity item with the world. Args: entityItem
179         */
180        public void joinEntityItemWithWorld(EntityItem par1EntityItem) {}
181    
182        /**
183         * Sends a chat message from the player. Args: chatMessage
184         */
185        public void sendChatMessage(String par1Str)
186        {
187            this.sendQueue.addToSendQueue(new Packet3Chat(par1Str));
188        }
189    
190        /**
191         * Swings the item the player is holding.
192         */
193        public void swingItem()
194        {
195            super.swingItem();
196            this.sendQueue.addToSendQueue(new Packet18Animation(this, 1));
197        }
198    
199        public void respawnPlayer()
200        {
201            this.sendQueue.addToSendQueue(new Packet205ClientCommand(1));
202        }
203    
204        /**
205         * Deals damage to the entity. If its a EntityPlayer then will take damage from the armor first and then health
206         * second with the reduced value. Args: damageAmount
207         */
208        protected void damageEntity(DamageSource par1DamageSource, int par2)
209        {
210            if (!this.isEntityInvulnerable())
211            {
212                this.setEntityHealth(this.getHealth() - par2);
213            }
214        }
215    
216        /**
217         * sets current screen to null (used on escape buttons of GUIs)
218         */
219        public void closeScreen()
220        {
221            this.sendQueue.addToSendQueue(new Packet101CloseWindow(this.openContainer.windowId));
222            this.func_92015_f();
223        }
224    
225        public void func_92015_f()
226        {
227            this.inventory.setItemStack((ItemStack)null);
228            super.closeScreen();
229        }
230    
231        /**
232         * Updates health locally.
233         */
234        public void setHealth(int par1)
235        {
236            if (this.hasSetHealth)
237            {
238                super.setHealth(par1);
239            }
240            else
241            {
242                this.setEntityHealth(par1);
243                this.hasSetHealth = true;
244            }
245        }
246    
247        /**
248         * Adds a value to a statistic field.
249         */
250        public void addStat(StatBase par1StatBase, int par2)
251        {
252            if (par1StatBase != null)
253            {
254                if (par1StatBase.isIndependent)
255                {
256                    super.addStat(par1StatBase, par2);
257                }
258            }
259        }
260    
261        /**
262         * Used by NetClientHandler.handleStatistic
263         */
264        public void incrementStat(StatBase par1StatBase, int par2)
265        {
266            if (par1StatBase != null)
267            {
268                if (!par1StatBase.isIndependent)
269                {
270                    super.addStat(par1StatBase, par2);
271                }
272            }
273        }
274    
275        /**
276         * Sends the player's abilities to the server (if there is one).
277         */
278        public void sendPlayerAbilities()
279        {
280            this.sendQueue.addToSendQueue(new Packet202PlayerAbilities(this.capabilities));
281        }
282    
283        public boolean func_71066_bF()
284        {
285            return true;
286        }
287    }