    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.entity.player.EntityPlayer;
    007    import net.minecraft.item.Item;
    008    import net.minecraft.item.ItemStack;
    009    import net.minecraft.util.ChunkCoordinates;
    010    import net.minecraft.util.DamageSource;
    011    import net.minecraft.util.MathHelper;
    012    import net.minecraft.util.StringUtils;
    013    import net.minecraft.world.World;
    014
    015    @SideOnly(Side.CLIENT)
    016    public class EntityOtherPlayerMP extends EntityPlayer
    017    {
    018        private boolean isItemInUse = false;
    019        private int otherPlayerMPPosRotationIncrements;
    020        private double otherPlayerMPX;
    021        private double otherPlayerMPY;
    022        private double otherPlayerMPZ;
    023        private double otherPlayerMPYaw;
    024        private double otherPlayerMPPitch;
    025
    026        public EntityOtherPlayerMP(World par1World, String par2Str)
    027        {
    028            super(par1World);
    029            this.username = par2Str;
    030            this.yOffset = 0.0F;
    031            this.stepHeight = 0.0F;
    032
    033            if (par2Str != null && par2Str.length() > 0)
    034            {
    035                this.skinUrl = "http://skins.minecraft.net/MinecraftSkins/" + StringUtils.stripControlCodes(par2Str) + ".png";
    036            }
    037
    038            this.noClip = true;
    039            this.field_71082_cx = 0.25F;
    040            this.renderDistanceWeight = 10.0D;
    041        }
    042
    043        /**
    044         * sets the players height back to normal after doing things like sleeping and dieing
    045         */
    046        protected void resetHeight()
    047        {
    048            this.yOffset = 0.0F;
    049        }
    050
    051        /**
    052         * Called when the entity is attacked.
    053         */
    054        public boolean attackEntityFrom(DamageSource par1DamageSource, int par2)
    055        {
    056            return true;
    057        }
    058
    059        /**
    060         * Sets the position and rotation. Only difference from the other one is no bounding on the rotation. Args: posX,
    061         * posY, posZ, yaw, pitch
    062         */
    063        public void setPositionAndRotation2(double par1, double par3, double par5, float par7, float par8, int par9)
    064        {
    065            this.otherPlayerMPX = par1;
    066            this.otherPlayerMPY = par3;
    067            this.otherPlayerMPZ = par5;
    068            this.otherPlayerMPYaw = (double)par7;
    069            this.otherPlayerMPPitch = (double)par8;
    070            this.otherPlayerMPPosRotationIncrements = par9;
    071        }
    072
    073        public void updateCloak()
    074        {
    075            this.playerCloakUrl = "http://skins.minecraft.net/MinecraftCloaks/" + StringUtils.stripControlCodes(this.username) + ".png";
    076            this.cloakUrl = this.playerCloakUrl;
    077        }
    078
    079        /**
    080         * Called to update the entity's position/logic.
    081         */
    082        public void onUpdate()
    083        {
    084            this.field_71082_cx = 0.0F;
    085            super.onUpdate();
    086            this.prevLegYaw = this.legYaw;
    087            double var1 = this.posX - this.prevPosX;
    088            double var3 = this.posZ - this.prevPosZ;
    089            float var5 = MathHelper.sqrt_double(var1 * var1 + var3 * var3) * 4.0F;
    090
    091            if (var5 > 1.0F)
    092            {
    093                var5 = 1.0F;
    094            }
    095
    096            this.legYaw += (var5 - this.legYaw) * 0.4F;
    097            this.legSwing += this.legYaw;
    098
    099            if (!this.isItemInUse && this.isEating() && this.inventory.mainInventory[this.inventory.currentItem] != null)
    100            {
    101                ItemStack var6 = this.inventory.mainInventory[this.inventory.currentItem];
    102                this.setItemInUse(this.inventory.mainInventory[this.inventory.currentItem], Item.itemsList[var6.itemID].getMaxItemUseDuration(var6));
    103                this.isItemInUse = true;
    104            }
    105            else if (this.isItemInUse && !this.isEating())
    106            {
    107                this.clearItemInUse();
    108                this.isItemInUse = false;
    109            }
    110        }
    111
    112        public float getShadowSize()
    113        {
    114            return 0.0F;
    115        }
    116
    117        /**
    118         * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons
    119         * use this to react to sunlight and start to burn.
    120         */
    121        public void onLivingUpdate()
    122        {
    123            super.updateEntityActionState();
    124
    125            if (this.otherPlayerMPPosRotationIncrements > 0)
    126            {
    127                double var1 = this.posX + (this.otherPlayerMPX - this.posX) / (double)this.otherPlayerMPPosRotationIncrements;
    128                double var3 = this.posY + (this.otherPlayerMPY - this.posY) / (double)this.otherPlayerMPPosRotationIncrements;
    129                double var5 = this.posZ + (this.otherPlayerMPZ - this.posZ) / (double)this.otherPlayerMPPosRotationIncrements;
    130                double var7;
    131
    132                for (var7 = this.otherPlayerMPYaw - (double)this.rotationYaw; var7 < -180.0D; var7 += 360.0D)
    133                {
    134                    ;
    135                }
    136
    137                while (var7 >= 180.0D)
    138                {
    139                    var7 -= 360.0D;
    140                }
    141
    142                this.rotationYaw = (float)((double)this.rotationYaw + var7 / (double)this.otherPlayerMPPosRotationIncrements);
    143                this.rotationPitch = (float)((double)this.rotationPitch + (this.otherPlayerMPPitch - (double)this.rotationPitch) / (double)this.otherPlayerMPPosRotationIncrements);
    144                --this.otherPlayerMPPosRotationIncrements;
    145                this.setPosition(var1, var3, var5);
    146                this.setRotation(this.rotationYaw, this.rotationPitch);
    147            }
    148
    149            this.prevCameraYaw = this.cameraYaw;
    150            float var9 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
    151            float var2 = (float)Math.atan(-this.motionY * 0.20000000298023224D) * 15.0F;
    152
    153            if (var9 > 0.1F)
    154            {
    155                var9 = 0.1F;
    156            }
    157
    158            if (!this.onGround || this.getHealth() <= 0)
    159            {
    160                var9 = 0.0F;
    161            }
    162
    163            if (this.onGround || this.getHealth() <= 0)
    164            {
    165                var2 = 0.0F;
    166            }
    167
    168            this.cameraYaw += (var9 - this.cameraYaw) * 0.4F;
    169            this.cameraPitch += (var2 - this.cameraPitch) * 0.8F;
    170        }
    171
    172        /**
    173         * Sets the held item, or an armor slot. Slot 0 is held item. Slot 1-4 is armor. Params: Item, slot
    174         */
    175        public void setCurrentItemOrArmor(int par1, ItemStack par2ItemStack)
    176        {
    177            if (par1 == 0)
    178            {
    179                this.inventory.mainInventory[this.inventory.currentItem] = par2ItemStack;
    180            }
    181            else
    182            {
    183                this.inventory.armorInventory[par1 - 1] = par2ItemStack;
    184            }
    185        }
    186
    187        public float getEyeHeight()
    188        {
    189            return 1.82F;
    190        }
    191
    192        public void sendChatToPlayer(String par1Str)
    193        {
    194            Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(par1Str);
    195        }
    196
    197        /**
    198         * Returns true if the command sender is allowed to use the given command.
    199         */
    200        public boolean canCommandSenderUseCommand(int par1, String par2Str)
    201        {
    202            return false;
    203        }
    204
    205        /**
    206         * Return the coordinates for this player as ChunkCoordinates.
    207         */
    208        public ChunkCoordinates getPlayerCoordinates()
    209        {
    210            return new ChunkCoordinates(MathHelper.floor_double(this.posX + 0.5D), MathHelper.floor_double(this.posY + 0.5D), MathHelper.floor_double(this.posZ + 0.5D));
    211        }
    212    }