001package net.minecraft.entity.ai;
002
003import java.util.Random;
004import net.minecraft.entity.EntityCreature;
005import net.minecraft.util.MathHelper;
006import net.minecraft.util.Vec3;
007import net.minecraft.world.World;
008
009public class EntityAIFleeSun extends EntityAIBase
010{
011    private EntityCreature theCreature;
012    private double shelterX;
013    private double shelterY;
014    private double shelterZ;
015    private float movementSpeed;
016    private World theWorld;
017
018    public EntityAIFleeSun(EntityCreature par1EntityCreature, float par2)
019    {
020        this.theCreature = par1EntityCreature;
021        this.movementSpeed = par2;
022        this.theWorld = par1EntityCreature.worldObj;
023        this.setMutexBits(1);
024    }
025
026    /**
027     * Returns whether the EntityAIBase should begin execution.
028     */
029    public boolean shouldExecute()
030    {
031        if (!this.theWorld.isDaytime())
032        {
033            return false;
034        }
035        else if (!this.theCreature.isBurning())
036        {
037            return false;
038        }
039        else if (!this.theWorld.canBlockSeeTheSky(MathHelper.floor_double(this.theCreature.posX), (int)this.theCreature.boundingBox.minY, MathHelper.floor_double(this.theCreature.posZ)))
040        {
041            return false;
042        }
043        else
044        {
045            Vec3 var1 = this.findPossibleShelter();
046
047            if (var1 == null)
048            {
049                return false;
050            }
051            else
052            {
053                this.shelterX = var1.xCoord;
054                this.shelterY = var1.yCoord;
055                this.shelterZ = var1.zCoord;
056                return true;
057            }
058        }
059    }
060
061    /**
062     * Returns whether an in-progress EntityAIBase should continue executing
063     */
064    public boolean continueExecuting()
065    {
066        return !this.theCreature.getNavigator().noPath();
067    }
068
069    /**
070     * Execute a one shot task or start executing a continuous task
071     */
072    public void startExecuting()
073    {
074        this.theCreature.getNavigator().tryMoveToXYZ(this.shelterX, this.shelterY, this.shelterZ, this.movementSpeed);
075    }
076
077    private Vec3 findPossibleShelter()
078    {
079        Random var1 = this.theCreature.getRNG();
080
081        for (int var2 = 0; var2 < 10; ++var2)
082        {
083            int var3 = MathHelper.floor_double(this.theCreature.posX + (double)var1.nextInt(20) - 10.0D);
084            int var4 = MathHelper.floor_double(this.theCreature.boundingBox.minY + (double)var1.nextInt(6) - 3.0D);
085            int var5 = MathHelper.floor_double(this.theCreature.posZ + (double)var1.nextInt(20) - 10.0D);
086
087            if (!this.theWorld.canBlockSeeTheSky(var3, var4, var5) && this.theCreature.getBlockPathWeight(var3, var4, var5) < 0.0F)
088            {
089                return this.theWorld.getWorldVec3Pool().getVecFromPool((double)var3, (double)var4, (double)var5);
090            }
091        }
092
093        return null;
094    }
095}