    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 vec3 = this.findPossibleShelter();
    046
    047            if (vec3 == null)
    048            {
    049                return false;
    050            }
    051            else
    052            {
    053                this.shelterX = vec3.xCoord;
    054                this.shelterY = vec3.yCoord;
    055                this.shelterZ = vec3.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 random = this.theCreature.getRNG();
    080
    081        for (int i = 0; i < 10; ++i)
    082        {
    083            int j = MathHelper.floor_double(this.theCreature.posX + (double)random.nextInt(20) - 10.0D);
    084            int k = MathHelper.floor_double(this.theCreature.boundingBox.minY + (double)random.nextInt(6) - 3.0D);
    085            int l = MathHelper.floor_double(this.theCreature.posZ + (double)random.nextInt(20) - 10.0D);
    086
    087            if (!this.theWorld.canBlockSeeTheSky(j, k, l) && this.theCreature.getBlockPathWeight(j, k, l) < 0.0F)
    088            {
    089                return this.theWorld.getWorldVec3Pool().getVecFromPool((double)j, (double)k, (double)l);
    090            }
    091        }
    092
    093        return null;
    094    }
    095}