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    }