    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                if (var14)
    110                {
    111                    this.sendQueue.addToSendQueue(new Packet11PlayerPosition(this.motionX, -999.0D, -999.0D, this.motionZ, this.onGround));
    112                }
    113                else
    114                {
    115                    this.sendQueue.addToSendQueue(new Packet13PlayerLookMove(this.motionX, -999.0D, -999.0D, this.motionZ, this.rotationYaw, this.rotationPitch, this.onGround));
    116                }
    117
    118                var13 = false;
    119            }
    120            else if (var13 && var14)
    121            {
    122                this.sendQueue.addToSendQueue(new Packet13PlayerLookMove(this.posX, this.boundingBox.minY, this.posY, this.posZ, this.rotationYaw, this.rotationPitch, this.onGround));
    123            }
    124            else if (var13)
    125            {
    126                this.sendQueue.addToSendQueue(new Packet11PlayerPosition(this.posX, this.boundingBox.minY, this.posY, this.posZ, this.onGround));
    127            }
    128            else if (var14)
    129            {
    130                this.sendQueue.addToSendQueue(new Packet12PlayerLook(this.rotationYaw, this.rotationPitch, this.onGround));
    131            }
    132            else if (this.wasOnGround != this.onGround)
    133            {
    134                this.sendQueue.addToSendQueue(new Packet10Flying(this.onGround));
    135            }
    136
    137            ++this.field_71168_co;
    138            this.wasOnGround = this.onGround;
    139
    140            if (var13)
    141            {
    142                this.oldPosX = this.posX;
    143                this.oldMinY = this.boundingBox.minY;
    144                this.oldPosY = this.posY;
    145                this.oldPosZ = this.posZ;
    146                this.field_71168_co = 0;
    147            }
    148
    149            if (var14)
    150            {
    151                this.oldRotationYaw = this.rotationYaw;
    152                this.oldRotationPitch = this.rotationPitch;
    153            }
    154        }
    155
    156        /**
    157         * Called when player presses the drop item key
    158         */
    159        public EntityItem dropOneItem()
    160        {
    161            this.sendQueue.addToSendQueue(new Packet14BlockDig(4, 0, 0, 0, 0));
    162            return null;
    163        }
    164
    165        /**
    166         * Joins the passed in entity item with the world. Args: entityItem
    167         */
    168        public void joinEntityItemWithWorld(EntityItem par1EntityItem) {}
    169
    170        /**
    171         * Sends a chat message from the player. Args: chatMessage
    172         */
    173        public void sendChatMessage(String par1Str)
    174        {
    175            this.sendQueue.addToSendQueue(new Packet3Chat(par1Str));
    176        }
    177
    178        /**
    179         * Swings the item the player is holding.
    180         */
    181        public void swingItem()
    182        {
    183            super.swingItem();
    184            this.sendQueue.addToSendQueue(new Packet18Animation(this, 1));
    185        }
    186
    187        public void respawnPlayer()
    188        {
    189            this.sendQueue.addToSendQueue(new Packet205ClientCommand(1));
    190        }
    191
    192        /**
    193         * Deals damage to the entity. If its a EntityPlayer then will take damage from the armor first and then health
    194         * second with the reduced value. Args: damageAmount
    195         */
    196        protected void damageEntity(DamageSource par1DamageSource, int par2)
    197        {
    198            this.setEntityHealth(this.getHealth() - par2);
    199        }
    200
    201        /**
    202         * sets current screen to null (used on escape buttons of GUIs)
    203         */
    204        public void closeScreen()
    205        {
    206            this.sendQueue.addToSendQueue(new Packet101CloseWindow(this.craftingInventory.windowId));
    207            this.inventory.setItemStack((ItemStack)null);
    208            super.closeScreen();
    209        }
    210
    211        /**
    212         * Updates health locally.
    213         */
    214        public void setHealth(int par1)
    215        {
    216            if (this.hasSetHealth)
    217            {
    218                super.setHealth(par1);
    219            }
    220            else
    221            {
    222                this.setEntityHealth(par1);
    223                this.hasSetHealth = true;
    224            }
    225        }
    226
    227        /**
    228         * Adds a value to a statistic field.
    229         */
    230        public void addStat(StatBase par1StatBase, int par2)
    231        {
    232            if (par1StatBase != null)
    233            {
    234                if (par1StatBase.isIndependent)
    235                {
    236                    super.addStat(par1StatBase, par2);
    237                }
    238            }
    239        }
    240
    241        /**
    242         * Used by NetClientHandler.handleStatistic
    243         */
    244        public void incrementStat(StatBase par1StatBase, int par2)
    245        {
    246            if (par1StatBase != null)
    247            {
    248                if (!par1StatBase.isIndependent)
    249                {
    250                    super.addStat(par1StatBase, par2);
    251                }
    252            }
    253        }
    254
    255        /**
    256         * Sends the player's abilities to the server (if there is one).
    257         */
    258        public void sendPlayerAbilities()
    259        {
    260            this.sendQueue.addToSendQueue(new Packet202PlayerAbilities(this.capabilities));
    261        }
    262
    263        public boolean func_71066_bF()
    264        {
    265            return true;
    266        }
    267    }