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 }