001package net.minecraft.client.entity; 002 003import cpw.mods.fml.relauncher.Side; 004import cpw.mods.fml.relauncher.SideOnly; 005import net.minecraft.client.Minecraft; 006import net.minecraft.entity.player.EntityPlayer; 007import net.minecraft.item.Item; 008import net.minecraft.item.ItemStack; 009import net.minecraft.util.ChunkCoordinates; 010import net.minecraft.util.DamageSource; 011import net.minecraft.util.MathHelper; 012import net.minecraft.util.StringUtils; 013import net.minecraft.world.World; 014 015@SideOnly(Side.CLIENT) 016public 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.cloakUrl = "http://skins.minecraft.net/MinecraftCloaks/" + StringUtils.stripControlCodes(this.username) + ".png"; 076 } 077 078 /** 079 * Called to update the entity's position/logic. 080 */ 081 public void onUpdate() 082 { 083 this.field_71082_cx = 0.0F; 084 super.onUpdate(); 085 this.prevLimbYaw = this.limbYaw; 086 double d0 = this.posX - this.prevPosX; 087 double d1 = this.posZ - this.prevPosZ; 088 float f = MathHelper.sqrt_double(d0 * d0 + d1 * d1) * 4.0F; 089 090 if (f > 1.0F) 091 { 092 f = 1.0F; 093 } 094 095 this.limbYaw += (f - this.limbYaw) * 0.4F; 096 this.limbSwing += this.limbYaw; 097 098 if (!this.isItemInUse && this.isEating() && this.inventory.mainInventory[this.inventory.currentItem] != null) 099 { 100 ItemStack itemstack = this.inventory.mainInventory[this.inventory.currentItem]; 101 this.setItemInUse(this.inventory.mainInventory[this.inventory.currentItem], Item.itemsList[itemstack.itemID].getMaxItemUseDuration(itemstack)); 102 this.isItemInUse = true; 103 } 104 else if (this.isItemInUse && !this.isEating()) 105 { 106 this.clearItemInUse(); 107 this.isItemInUse = false; 108 } 109 } 110 111 public float getShadowSize() 112 { 113 return 0.0F; 114 } 115 116 /** 117 * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons 118 * use this to react to sunlight and start to burn. 119 */ 120 public void onLivingUpdate() 121 { 122 super.updateEntityActionState(); 123 124 if (this.otherPlayerMPPosRotationIncrements > 0) 125 { 126 double d0 = this.posX + (this.otherPlayerMPX - this.posX) / (double)this.otherPlayerMPPosRotationIncrements; 127 double d1 = this.posY + (this.otherPlayerMPY - this.posY) / (double)this.otherPlayerMPPosRotationIncrements; 128 double d2 = this.posZ + (this.otherPlayerMPZ - this.posZ) / (double)this.otherPlayerMPPosRotationIncrements; 129 double d3; 130 131 for (d3 = this.otherPlayerMPYaw - (double)this.rotationYaw; d3 < -180.0D; d3 += 360.0D) 132 { 133 ; 134 } 135 136 while (d3 >= 180.0D) 137 { 138 d3 -= 360.0D; 139 } 140 141 this.rotationYaw = (float)((double)this.rotationYaw + d3 / (double)this.otherPlayerMPPosRotationIncrements); 142 this.rotationPitch = (float)((double)this.rotationPitch + (this.otherPlayerMPPitch - (double)this.rotationPitch) / (double)this.otherPlayerMPPosRotationIncrements); 143 --this.otherPlayerMPPosRotationIncrements; 144 this.setPosition(d0, d1, d2); 145 this.setRotation(this.rotationYaw, this.rotationPitch); 146 } 147 148 this.prevCameraYaw = this.cameraYaw; 149 float f = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ); 150 float f1 = (float)Math.atan(-this.motionY * 0.20000000298023224D) * 15.0F; 151 152 if (f > 0.1F) 153 { 154 f = 0.1F; 155 } 156 157 if (!this.onGround || this.getHealth() <= 0) 158 { 159 f = 0.0F; 160 } 161 162 if (this.onGround || this.getHealth() <= 0) 163 { 164 f1 = 0.0F; 165 } 166 167 this.cameraYaw += (f - this.cameraYaw) * 0.4F; 168 this.cameraPitch += (f1 - this.cameraPitch) * 0.8F; 169 } 170 171 /** 172 * Sets the held item, or an armor slot. Slot 0 is held item. Slot 1-4 is armor. Params: Item, slot 173 */ 174 public void setCurrentItemOrArmor(int par1, ItemStack par2ItemStack) 175 { 176 if (par1 == 0) 177 { 178 this.inventory.mainInventory[this.inventory.currentItem] = par2ItemStack; 179 } 180 else 181 { 182 this.inventory.armorInventory[par1 - 1] = par2ItemStack; 183 } 184 } 185 186 public float getEyeHeight() 187 { 188 return 1.82F; 189 } 190 191 public void sendChatToPlayer(String par1Str) 192 { 193 Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(par1Str); 194 } 195 196 /** 197 * Returns true if the command sender is allowed to use the given command. 198 */ 199 public boolean canCommandSenderUseCommand(int par1, String par2Str) 200 { 201 return false; 202 } 203 204 /** 205 * Return the position for this command sender. 206 */ 207 public ChunkCoordinates getPlayerCoordinates() 208 { 209 return new ChunkCoordinates(MathHelper.floor_double(this.posX + 0.5D), MathHelper.floor_double(this.posY + 0.5D), MathHelper.floor_double(this.posZ + 0.5D)); 210 } 211}