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