package net.minecraft.client.entity;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.NetClientHandler;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.network.packet.Packet101CloseWindow;
import net.minecraft.network.packet.Packet10Flying;
import net.minecraft.network.packet.Packet11PlayerPosition;
import net.minecraft.network.packet.Packet12PlayerLook;
import net.minecraft.network.packet.Packet13PlayerLookMove;
import net.minecraft.network.packet.Packet14BlockDig;
import net.minecraft.network.packet.Packet18Animation;
import net.minecraft.network.packet.Packet19EntityAction;
import net.minecraft.network.packet.Packet202PlayerAbilities;
import net.minecraft.network.packet.Packet205ClientCommand;
import net.minecraft.network.packet.Packet3Chat;
import net.minecraft.stats.StatBase;
import net.minecraft.util.DamageSource;
import net.minecraft.util.MathHelper;
import net.minecraft.util.Session;
import net.minecraft.world.World;
@SideOnly(Side.CLIENT)
public class EntityClientPlayerMP extends EntityPlayerSP
{
public NetClientHandler sendQueue;
private double oldPosX;
/** Old Minimum Y of the bounding box */
private double oldMinY;
private double oldPosY;
private double oldPosZ;
private float oldRotationYaw;
private float oldRotationPitch;
/** Check if was on ground last update */
private boolean wasOnGround = false;
/** should the player stop sneaking? */
private boolean shouldStopSneaking = false;
private boolean wasSneaking = false;
private int field_71168_co = 0;
/** has the client player's health been set? */
private boolean hasSetHealth = false;
public EntityClientPlayerMP(Minecraft par1Minecraft, World par2World, Session par3Session, NetClientHandler par4NetClientHandler)
{
super(par1Minecraft, par2World, par3Session, 0);
this.sendQueue = par4NetClientHandler;
}
/**
* Called when the entity is attacked.
*/
public boolean attackEntityFrom(DamageSource par1DamageSource, int par2)
{
return false;
}
/**
* Heal living entity (param: amount of half-hearts)
*/
public void heal(int par1) {}
/**
* Called to update the entity's position/logic.
*/
public void onUpdate()
{
if (this.worldObj.blockExists(MathHelper.floor_double(this.posX), 0, MathHelper.floor_double(this.posZ)))
{
super.onUpdate();
this.sendMotionUpdates();
}
}
/**
* Send updated motion and position information to the server
*/
public void sendMotionUpdates()
{
boolean flag = this.isSprinting();
if (flag != this.wasSneaking)
{
if (flag)
{
this.sendQueue.addToSendQueue(new Packet19EntityAction(this, 4));
}
else
{
this.sendQueue.addToSendQueue(new Packet19EntityAction(this, 5));
}
this.wasSneaking = flag;
}
boolean flag1 = this.isSneaking();
if (flag1 != this.shouldStopSneaking)
{
if (flag1)
{
this.sendQueue.addToSendQueue(new Packet19EntityAction(this, 1));
}
else
{
this.sendQueue.addToSendQueue(new Packet19EntityAction(this, 2));
}
this.shouldStopSneaking = flag1;
}
double d0 = this.posX - this.oldPosX;
double d1 = this.boundingBox.minY - this.oldMinY;
double d2 = this.posZ - this.oldPosZ;
double d3 = (double)(this.rotationYaw - this.oldRotationYaw);
double d4 = (double)(this.rotationPitch - this.oldRotationPitch);
boolean flag2 = d0 * d0 + d1 * d1 + d2 * d2 > 9.0E-4D || this.field_71168_co >= 20;
boolean flag3 = d3 != 0.0D || d4 != 0.0D;
if (this.ridingEntity != null)
{
this.sendQueue.addToSendQueue(new Packet13PlayerLookMove(this.motionX, -999.0D, -999.0D, this.motionZ, this.rotationYaw, this.rotationPitch, this.onGround));
flag2 = false;
}
else if (flag2 && flag3)
{
this.sendQueue.addToSendQueue(new Packet13PlayerLookMove(this.posX, this.boundingBox.minY, this.posY, this.posZ, this.rotationYaw, this.rotationPitch, this.onGround));
}
else if (flag2)
{
this.sendQueue.addToSendQueue(new Packet11PlayerPosition(this.posX, this.boundingBox.minY, this.posY, this.posZ, this.onGround));
}
else if (flag3)
{
this.sendQueue.addToSendQueue(new Packet12PlayerLook(this.rotationYaw, this.rotationPitch, this.onGround));
}
else
{
this.sendQueue.addToSendQueue(new Packet10Flying(this.onGround));
}
++this.field_71168_co;
this.wasOnGround = this.onGround;
if (flag2)
{
this.oldPosX = this.posX;
this.oldMinY = this.boundingBox.minY;
this.oldPosY = this.posY;
this.oldPosZ = this.posZ;
this.field_71168_co = 0;
}
if (flag3)
{
this.oldRotationYaw = this.rotationYaw;
this.oldRotationPitch = this.rotationPitch;
}
}
/**
* Called when player presses the drop item key
*/
public EntityItem dropOneItem(boolean par1)
{
int i = par1 ? 3 : 4;
this.sendQueue.addToSendQueue(new Packet14BlockDig(i, 0, 0, 0, 0));
return null;
}
/**
* Joins the passed in entity item with the world. Args: entityItem
*/
public void joinEntityItemWithWorld(EntityItem par1EntityItem) {}
/**
* Sends a chat message from the player. Args: chatMessage
*/
public void sendChatMessage(String par1Str)
{
this.sendQueue.addToSendQueue(new Packet3Chat(par1Str));
}
/**
* Swings the item the player is holding.
*/
public void swingItem()
{
super.swingItem();
this.sendQueue.addToSendQueue(new Packet18Animation(this, 1));
}
public void respawnPlayer()
{
this.sendQueue.addToSendQueue(new Packet205ClientCommand(1));
}
/**
* Deals damage to the entity. If its a EntityPlayer then will take damage from the armor first and then health
* second with the reduced value. Args: damageAmount
*/
protected void damageEntity(DamageSource par1DamageSource, int par2)
{
if (!this.isEntityInvulnerable())
{
this.setEntityHealth(this.getHealth() - par2);
}
}
/**
* sets current screen to null (used on escape buttons of GUIs)
*/
public void closeScreen()
{
this.sendQueue.addToSendQueue(new Packet101CloseWindow(this.openContainer.windowId));
this.func_92015_f();
}
public void func_92015_f()
{
this.inventory.setItemStack((ItemStack)null);
super.closeScreen();
}
/**
* Updates health locally.
*/
public void setHealth(int par1)
{
if (this.hasSetHealth)
{
super.setHealth(par1);
}
else
{
this.setEntityHealth(par1);
this.hasSetHealth = true;
}
}
/**
* Adds a value to a statistic field.
*/
public void addStat(StatBase par1StatBase, int par2)
{
if (par1StatBase != null)
{
if (par1StatBase.isIndependent)
{
super.addStat(par1StatBase, par2);
}
}
}
/**
* Used by NetClientHandler.handleStatistic
*/
public void incrementStat(StatBase par1StatBase, int par2)
{
if (par1StatBase != null)
{
if (!par1StatBase.isIndependent)
{
super.addStat(par1StatBase, par2);
}
}
}
/**
* Sends the player's abilities to the server (if there is one).
*/
public void sendPlayerAbilities()
{
this.sendQueue.addToSendQueue(new Packet202PlayerAbilities(this.capabilities));
}
public boolean func_71066_bF()
{
return true;
}
}