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 if (var14)
110 {
111 this.sendQueue.addToSendQueue(new Packet11PlayerPosition(this.motionX, -999.0D, -999.0D, this.motionZ, this.onGround));
112 }
113 else
114 {
115 this.sendQueue.addToSendQueue(new Packet13PlayerLookMove(this.motionX, -999.0D, -999.0D, this.motionZ, this.rotationYaw, this.rotationPitch, this.onGround));
116 }
117
118 var13 = false;
119 }
120 else if (var13 && var14)
121 {
122 this.sendQueue.addToSendQueue(new Packet13PlayerLookMove(this.posX, this.boundingBox.minY, this.posY, this.posZ, this.rotationYaw, this.rotationPitch, this.onGround));
123 }
124 else if (var13)
125 {
126 this.sendQueue.addToSendQueue(new Packet11PlayerPosition(this.posX, this.boundingBox.minY, this.posY, this.posZ, this.onGround));
127 }
128 else if (var14)
129 {
130 this.sendQueue.addToSendQueue(new Packet12PlayerLook(this.rotationYaw, this.rotationPitch, this.onGround));
131 }
132 else if (this.wasOnGround != this.onGround)
133 {
134 this.sendQueue.addToSendQueue(new Packet10Flying(this.onGround));
135 }
136
137 ++this.field_71168_co;
138 this.wasOnGround = this.onGround;
139
140 if (var13)
141 {
142 this.oldPosX = this.posX;
143 this.oldMinY = this.boundingBox.minY;
144 this.oldPosY = this.posY;
145 this.oldPosZ = this.posZ;
146 this.field_71168_co = 0;
147 }
148
149 if (var14)
150 {
151 this.oldRotationYaw = this.rotationYaw;
152 this.oldRotationPitch = this.rotationPitch;
153 }
154 }
155
156 /**
157 * Called when player presses the drop item key
158 */
159 public EntityItem dropOneItem()
160 {
161 this.sendQueue.addToSendQueue(new Packet14BlockDig(4, 0, 0, 0, 0));
162 return null;
163 }
164
165 /**
166 * Joins the passed in entity item with the world. Args: entityItem
167 */
168 public void joinEntityItemWithWorld(EntityItem par1EntityItem) {}
169
170 /**
171 * Sends a chat message from the player. Args: chatMessage
172 */
173 public void sendChatMessage(String par1Str)
174 {
175 this.sendQueue.addToSendQueue(new Packet3Chat(par1Str));
176 }
177
178 /**
179 * Swings the item the player is holding.
180 */
181 public void swingItem()
182 {
183 super.swingItem();
184 this.sendQueue.addToSendQueue(new Packet18Animation(this, 1));
185 }
186
187 public void respawnPlayer()
188 {
189 this.sendQueue.addToSendQueue(new Packet205ClientCommand(1));
190 }
191
192 /**
193 * Deals damage to the entity. If its a EntityPlayer then will take damage from the armor first and then health
194 * second with the reduced value. Args: damageAmount
195 */
196 protected void damageEntity(DamageSource par1DamageSource, int par2)
197 {
198 this.setEntityHealth(this.getHealth() - par2);
199 }
200
201 /**
202 * sets current screen to null (used on escape buttons of GUIs)
203 */
204 public void closeScreen()
205 {
206 this.sendQueue.addToSendQueue(new Packet101CloseWindow(this.craftingInventory.windowId));
207 this.inventory.setItemStack((ItemStack)null);
208 super.closeScreen();
209 }
210
211 /**
212 * Updates health locally.
213 */
214 public void setHealth(int par1)
215 {
216 if (this.hasSetHealth)
217 {
218 super.setHealth(par1);
219 }
220 else
221 {
222 this.setEntityHealth(par1);
223 this.hasSetHealth = true;
224 }
225 }
226
227 /**
228 * Adds a value to a statistic field.
229 */
230 public void addStat(StatBase par1StatBase, int par2)
231 {
232 if (par1StatBase != null)
233 {
234 if (par1StatBase.isIndependent)
235 {
236 super.addStat(par1StatBase, par2);
237 }
238 }
239 }
240
241 /**
242 * Used by NetClientHandler.handleStatistic
243 */
244 public void incrementStat(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 * Sends the player's abilities to the server (if there is one).
257 */
258 public void sendPlayerAbilities()
259 {
260 this.sendQueue.addToSendQueue(new Packet202PlayerAbilities(this.capabilities));
261 }
262
263 public boolean func_71066_bF()
264 {
265 return true;
266 }
267 }