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