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 }