    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.func_85032_ar())
    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    }