001    package net.minecraft.entity.ai;
002    
003    import java.util.Random;
004    import net.minecraft.entity.EntityCreature;
005    import net.minecraft.util.MathHelper;
006    import net.minecraft.util.Vec3;
007    import net.minecraft.world.World;
008    
009    public 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    }