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