package net.minecraft.entity.ai;
import net.minecraft.block.Block;
import net.minecraft.block.BlockBed;
import net.minecraft.entity.passive.EntityOcelot;
import net.minecraft.tileentity.TileEntityChest;
import net.minecraft.world.World;
public class EntityAIOcelotSit extends EntityAIBase
{
private final EntityOcelot theOcelot;
private final float field_75404_b;
/** Tracks for how long the task has been executing */
private int currentTick = 0;
private int field_75402_d = 0;
/** For how long the Ocelot should be sitting */
private int maxSittingTicks = 0;
/** X Coordinate of a nearby sitable block */
private int sitableBlockX = 0;
/** Y Coordinate of a nearby sitable block */
private int sitableBlockY = 0;
/** Z Coordinate of a nearby sitable block */
private int sitableBlockZ = 0;
public EntityAIOcelotSit(EntityOcelot par1EntityOcelot, float par2)
{
this.theOcelot = par1EntityOcelot;
this.field_75404_b = par2;
this.setMutexBits(5);
}
/**
* Returns whether the EntityAIBase should begin execution.
*/
public boolean shouldExecute()
{
return this.theOcelot.isTamed() && !this.theOcelot.isSitting() && this.theOcelot.getRNG().nextDouble() <= 0.006500000134110451D && this.getNearbySitableBlockDistance();
}
/**
* Returns whether an in-progress EntityAIBase should continue executing
*/
public boolean continueExecuting()
{
return this.currentTick <= this.maxSittingTicks && this.field_75402_d <= 60 && this.isSittableBlock(this.theOcelot.worldObj, this.sitableBlockX, this.sitableBlockY, this.sitableBlockZ);
}
/**
* Execute a one shot task or start executing a continuous task
*/
public void startExecuting()
{
this.theOcelot.getNavigator().tryMoveToXYZ((double)((float)this.sitableBlockX) + 0.5D, (double)(this.sitableBlockY + 1), (double)((float)this.sitableBlockZ) + 0.5D, this.field_75404_b);
this.currentTick = 0;
this.field_75402_d = 0;
this.maxSittingTicks = this.theOcelot.getRNG().nextInt(this.theOcelot.getRNG().nextInt(1200) + 1200) + 1200;
this.theOcelot.func_70907_r().setSitting(false);
}
/**
* Resets the task
*/
public void resetTask()
{
this.theOcelot.setSitting(false);
}
/**
* Updates the task
*/
public void updateTask()
{
++this.currentTick;
this.theOcelot.func_70907_r().setSitting(false);
if (this.theOcelot.getDistanceSq((double)this.sitableBlockX, (double)(this.sitableBlockY + 1), (double)this.sitableBlockZ) > 1.0D)
{
this.theOcelot.setSitting(false);
this.theOcelot.getNavigator().tryMoveToXYZ((double)((float)this.sitableBlockX) + 0.5D, (double)(this.sitableBlockY + 1), (double)((float)this.sitableBlockZ) + 0.5D, this.field_75404_b);
++this.field_75402_d;
}
else if (!this.theOcelot.isSitting())
{
this.theOcelot.setSitting(true);
}
else
{
--this.field_75402_d;
}
}
/**
* Searches for a block to sit on within a 8 block range, returns 0 if none found
*/
protected boolean getNearbySitableBlockDistance()
{
int var1 = (int)this.theOcelot.posY;
double var2 = 2.147483647E9D;
for (int var4 = (int)this.theOcelot.posX - 8; (double)var4 < this.theOcelot.posX + 8.0D; ++var4)
{
for (int var5 = (int)this.theOcelot.posZ - 8; (double)var5 < this.theOcelot.posZ + 8.0D; ++var5)
{
if (this.isSittableBlock(this.theOcelot.worldObj, var4, var1, var5) && this.theOcelot.worldObj.isAirBlock(var4, var1 + 1, var5))
{
double var6 = this.theOcelot.getDistanceSq((double)var4, (double)var1, (double)var5);
if (var6 < var2)
{
this.sitableBlockX = var4;
this.sitableBlockY = var1;
this.sitableBlockZ = var5;
var2 = var6;
}
}
}
}
return var2 < 2.147483647E9D;
}
/**
* Determines whether the Ocelot wants to sit on the block at given coordinate
*/
protected boolean isSittableBlock(World par1World, int par2, int par3, int par4)
{
int var5 = par1World.getBlockId(par2, par3, par4);
int var6 = par1World.getBlockMetadata(par2, par3, par4);
if (var5 == Block.chest.blockID)
{
TileEntityChest var7 = (TileEntityChest)par1World.getBlockTileEntity(par2, par3, par4);
if (var7.numUsingPlayers < 1)
{
return true;
}
}
else
{
if (var5 == Block.stoneOvenActive.blockID)
{
return true;
}
if (var5 == Block.bed.blockID && !BlockBed.isBlockHeadOfBed(var6))
{
return true;
}
}
return false;
}
}