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 public void func_70062_b(int par1, ItemStack par2ItemStack) 165 { 166 if (par1 == 0) 167 { 168 this.inventory.mainInventory[this.inventory.currentItem] = par2ItemStack; 169 } 170 else 171 { 172 this.inventory.armorInventory[par1 - 1] = par2ItemStack; 173 } 174 } 175 176 public float getEyeHeight() 177 { 178 return 1.82F; 179 } 180 181 public void sendChatToPlayer(String par1Str) 182 { 183 Minecraft.getMinecraft().ingameGUI.getChatGUI().printChatMessage(par1Str); 184 } 185 186 /** 187 * Returns true if the command sender is allowed to use the given command. 188 */ 189 public boolean canCommandSenderUseCommand(int par1, String par2Str) 190 { 191 return false; 192 } 193 194 public ChunkCoordinates func_82114_b() 195 { 196 return new ChunkCoordinates(MathHelper.floor_double(this.posX + 0.5D), MathHelper.floor_double(this.posY + 0.5D), MathHelper.floor_double(this.posZ + 0.5D)); 197 } 198 }