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 this.setEntityHealth(this.getHealth() - par2);
191 }
192
193 /**
194 * sets current screen to null (used on escape buttons of GUIs)
195 */
196 public void closeScreen()
197 {
198 this.sendQueue.addToSendQueue(new Packet101CloseWindow(this.craftingInventory.windowId));
199 this.inventory.setItemStack((ItemStack)null);
200 super.closeScreen();
201 }
202
203 /**
204 * Updates health locally.
205 */
206 public void setHealth(int par1)
207 {
208 if (this.hasSetHealth)
209 {
210 super.setHealth(par1);
211 }
212 else
213 {
214 this.setEntityHealth(par1);
215 this.hasSetHealth = true;
216 }
217 }
218
219 /**
220 * Adds a value to a statistic field.
221 */
222 public void addStat(StatBase par1StatBase, int par2)
223 {
224 if (par1StatBase != null)
225 {
226 if (par1StatBase.isIndependent)
227 {
228 super.addStat(par1StatBase, par2);
229 }
230 }
231 }
232
233 /**
234 * Used by NetClientHandler.handleStatistic
235 */
236 public void incrementStat(StatBase par1StatBase, int par2)
237 {
238 if (par1StatBase != null)
239 {
240 if (!par1StatBase.isIndependent)
241 {
242 super.addStat(par1StatBase, par2);
243 }
244 }
245 }
246
247 /**
248 * Sends the player's abilities to the server (if there is one).
249 */
250 public void sendPlayerAbilities()
251 {
252 this.sendQueue.addToSendQueue(new Packet202PlayerAbilities(this.capabilities));
253 }
254
255 public boolean func_71066_bF()
256 {
257 return true;
258 }
259 }