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 EntityClientPlayerMP extends EntityPlayerSP 009 { 010 public NetClientHandler sendQueue; 011 private double oldPosX; 012 013 /** Old Minimum Y of the bounding box */ 014 private double oldMinY; 015 private double oldPosY; 016 private double oldPosZ; 017 private float oldRotationYaw; 018 private float oldRotationPitch; 019 020 /** Check if was on ground last update */ 021 private boolean wasOnGround = false; 022 023 /** should the player stop sneaking? */ 024 private boolean shouldStopSneaking = false; 025 private boolean wasSneaking = false; 026 private int field_71168_co = 0; 027 028 /** has the client player's health been set? */ 029 private boolean hasSetHealth = false; 030 031 public EntityClientPlayerMP(Minecraft par1Minecraft, World par2World, Session par3Session, NetClientHandler par4NetClientHandler) 032 { 033 super(par1Minecraft, par2World, par3Session, 0); 034 this.sendQueue = par4NetClientHandler; 035 } 036 037 /** 038 * Called when the entity is attacked. 039 */ 040 public boolean attackEntityFrom(DamageSource par1DamageSource, int par2) 041 { 042 return false; 043 } 044 045 /** 046 * Heal living entity (param: amount of half-hearts) 047 */ 048 public void heal(int par1) {} 049 050 /** 051 * Called to update the entity's position/logic. 052 */ 053 public void onUpdate() 054 { 055 if (this.worldObj.blockExists(MathHelper.floor_double(this.posX), 0, MathHelper.floor_double(this.posZ))) 056 { 057 super.onUpdate(); 058 this.sendMotionUpdates(); 059 } 060 } 061 062 /** 063 * Send updated motion and position information to the server 064 */ 065 public void sendMotionUpdates() 066 { 067 boolean var1 = this.isSprinting(); 068 069 if (var1 != this.wasSneaking) 070 { 071 if (var1) 072 { 073 this.sendQueue.addToSendQueue(new Packet19EntityAction(this, 4)); 074 } 075 else 076 { 077 this.sendQueue.addToSendQueue(new Packet19EntityAction(this, 5)); 078 } 079 080 this.wasSneaking = var1; 081 } 082 083 boolean var2 = this.isSneaking(); 084 085 if (var2 != this.shouldStopSneaking) 086 { 087 if (var2) 088 { 089 this.sendQueue.addToSendQueue(new Packet19EntityAction(this, 1)); 090 } 091 else 092 { 093 this.sendQueue.addToSendQueue(new Packet19EntityAction(this, 2)); 094 } 095 096 this.shouldStopSneaking = var2; 097 } 098 099 double var3 = this.posX - this.oldPosX; 100 double var5 = this.boundingBox.minY - this.oldMinY; 101 double var7 = this.posZ - this.oldPosZ; 102 double var9 = (double)(this.rotationYaw - this.oldRotationYaw); 103 double var11 = (double)(this.rotationPitch - this.oldRotationPitch); 104 boolean var13 = var3 * var3 + var5 * var5 + var7 * var7 > 9.0E-4D || this.field_71168_co >= 20; 105 boolean var14 = var9 != 0.0D || var11 != 0.0D; 106 107 if (this.ridingEntity != null) 108 { 109 this.sendQueue.addToSendQueue(new Packet13PlayerLookMove(this.motionX, -999.0D, -999.0D, this.motionZ, this.rotationYaw, this.rotationPitch, this.onGround)); 110 var13 = false; 111 } 112 else if (var13 && var14) 113 { 114 this.sendQueue.addToSendQueue(new Packet13PlayerLookMove(this.posX, this.boundingBox.minY, this.posY, this.posZ, this.rotationYaw, this.rotationPitch, this.onGround)); 115 } 116 else if (var13) 117 { 118 this.sendQueue.addToSendQueue(new Packet11PlayerPosition(this.posX, this.boundingBox.minY, this.posY, this.posZ, this.onGround)); 119 } 120 else if (var14) 121 { 122 this.sendQueue.addToSendQueue(new Packet12PlayerLook(this.rotationYaw, this.rotationPitch, this.onGround)); 123 } 124 else 125 { 126 this.sendQueue.addToSendQueue(new Packet10Flying(this.onGround)); 127 } 128 129 ++this.field_71168_co; 130 this.wasOnGround = this.onGround; 131 132 if (var13) 133 { 134 this.oldPosX = this.posX; 135 this.oldMinY = this.boundingBox.minY; 136 this.oldPosY = this.posY; 137 this.oldPosZ = this.posZ; 138 this.field_71168_co = 0; 139 } 140 141 if (var14) 142 { 143 this.oldRotationYaw = this.rotationYaw; 144 this.oldRotationPitch = this.rotationPitch; 145 } 146 } 147 148 /** 149 * Called when player presses the drop item key 150 */ 151 public EntityItem dropOneItem() 152 { 153 this.sendQueue.addToSendQueue(new Packet14BlockDig(4, 0, 0, 0, 0)); 154 return null; 155 } 156 157 /** 158 * Joins the passed in entity item with the world. Args: entityItem 159 */ 160 public void joinEntityItemWithWorld(EntityItem par1EntityItem) {} 161 162 /** 163 * Sends a chat message from the player. Args: chatMessage 164 */ 165 public void sendChatMessage(String par1Str) 166 { 167 this.sendQueue.addToSendQueue(new Packet3Chat(par1Str)); 168 } 169 170 /** 171 * Swings the item the player is holding. 172 */ 173 public void swingItem() 174 { 175 super.swingItem(); 176 this.sendQueue.addToSendQueue(new Packet18Animation(this, 1)); 177 } 178 179 public void respawnPlayer() 180 { 181 this.sendQueue.addToSendQueue(new Packet205ClientCommand(1)); 182 } 183 184 /** 185 * Deals damage to the entity. If its a EntityPlayer then will take damage from the armor first and then health 186 * second with the reduced value. Args: damageAmount 187 */ 188 protected void damageEntity(DamageSource par1DamageSource, int par2) 189 { 190 if (!this.func_85032_ar()) 191 { 192 this.setEntityHealth(this.getHealth() - par2); 193 } 194 } 195 196 /** 197 * sets current screen to null (used on escape buttons of GUIs) 198 */ 199 public void closeScreen() 200 { 201 this.sendQueue.addToSendQueue(new Packet101CloseWindow(this.craftingInventory.windowId)); 202 this.inventory.setItemStack((ItemStack)null); 203 super.closeScreen(); 204 } 205 206 /** 207 * Updates health locally. 208 */ 209 public void setHealth(int par1) 210 { 211 if (this.hasSetHealth) 212 { 213 super.setHealth(par1); 214 } 215 else 216 { 217 this.setEntityHealth(par1); 218 this.hasSetHealth = true; 219 } 220 } 221 222 /** 223 * Adds a value to a statistic field. 224 */ 225 public void addStat(StatBase par1StatBase, int par2) 226 { 227 if (par1StatBase != null) 228 { 229 if (par1StatBase.isIndependent) 230 { 231 super.addStat(par1StatBase, par2); 232 } 233 } 234 } 235 236 /** 237 * Used by NetClientHandler.handleStatistic 238 */ 239 public void incrementStat(StatBase par1StatBase, int par2) 240 { 241 if (par1StatBase != null) 242 { 243 if (!par1StatBase.isIndependent) 244 { 245 super.addStat(par1StatBase, par2); 246 } 247 } 248 } 249 250 /** 251 * Sends the player's abilities to the server (if there is one). 252 */ 253 public void sendPlayerAbilities() 254 { 255 this.sendQueue.addToSendQueue(new Packet202PlayerAbilities(this.capabilities)); 256 } 257 258 public boolean func_71066_bF() 259 { 260 return true; 261 } 262 }