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
008 public class RandomPositionGenerator
009 {
010 /**
011 * used to store a driection when the user passes a point to move towards or away from. WARNING: NEVER THREAD SAFE.
012 * MULTIPLE findTowards and findAway calls, will share this var
013 */
014 private static Vec3 staticVector = Vec3.createVectorHelper(0.0D, 0.0D, 0.0D);
015
016 /**
017 * finds a random target within par1(x,z) and par2 (y) blocks
018 */
019 public static Vec3 findRandomTarget(EntityCreature par0EntityCreature, int par1, int par2)
020 {
021 return findRandomTargetBlock(par0EntityCreature, par1, par2, (Vec3)null);
022 }
023
024 /**
025 * finds a random target within par1(x,z) and par2 (y) blocks in the direction of the point par3
026 */
027 public static Vec3 findRandomTargetBlockTowards(EntityCreature par0EntityCreature, int par1, int par2, Vec3 par3Vec3)
028 {
029 staticVector.xCoord = par3Vec3.xCoord - par0EntityCreature.posX;
030 staticVector.yCoord = par3Vec3.yCoord - par0EntityCreature.posY;
031 staticVector.zCoord = par3Vec3.zCoord - par0EntityCreature.posZ;
032 return findRandomTargetBlock(par0EntityCreature, par1, par2, staticVector);
033 }
034
035 /**
036 * finds a random target within par1(x,z) and par2 (y) blocks in the reverse direction of the point par3
037 */
038 public static Vec3 findRandomTargetBlockAwayFrom(EntityCreature par0EntityCreature, int par1, int par2, Vec3 par3Vec3)
039 {
040 staticVector.xCoord = par0EntityCreature.posX - par3Vec3.xCoord;
041 staticVector.yCoord = par0EntityCreature.posY - par3Vec3.yCoord;
042 staticVector.zCoord = par0EntityCreature.posZ - par3Vec3.zCoord;
043 return findRandomTargetBlock(par0EntityCreature, par1, par2, staticVector);
044 }
045
046 /**
047 * searches 10 blocks at random in a within par1(x,z) and par2 (y) distance, ignores those not in the direction of
048 * par3Vec3, then points to the tile for which creature.getBlockPathWeight returns the highest number
049 */
050 private static Vec3 findRandomTargetBlock(EntityCreature par0EntityCreature, int par1, int par2, Vec3 par3Vec3)
051 {
052 Random var4 = par0EntityCreature.getRNG();
053 boolean var5 = false;
054 int var6 = 0;
055 int var7 = 0;
056 int var8 = 0;
057 float var9 = -99999.0F;
058 boolean var10;
059
060 if (par0EntityCreature.hasHome())
061 {
062 double var11 = (double)(par0EntityCreature.getHomePosition().getDistanceSquared(MathHelper.floor_double(par0EntityCreature.posX), MathHelper.floor_double(par0EntityCreature.posY), MathHelper.floor_double(par0EntityCreature.posZ)) + 4.0F);
063 double var13 = (double)(par0EntityCreature.getMaximumHomeDistance() + (float)par1);
064 var10 = var11 < var13 * var13;
065 }
066 else
067 {
068 var10 = false;
069 }
070
071 for (int var16 = 0; var16 < 10; ++var16)
072 {
073 int var12 = var4.nextInt(2 * par1) - par1;
074 int var17 = var4.nextInt(2 * par2) - par2;
075 int var14 = var4.nextInt(2 * par1) - par1;
076
077 if (par3Vec3 == null || (double)var12 * par3Vec3.xCoord + (double)var14 * par3Vec3.zCoord >= 0.0D)
078 {
079 var12 += MathHelper.floor_double(par0EntityCreature.posX);
080 var17 += MathHelper.floor_double(par0EntityCreature.posY);
081 var14 += MathHelper.floor_double(par0EntityCreature.posZ);
082
083 if (!var10 || par0EntityCreature.isWithinHomeDistance(var12, var17, var14))
084 {
085 float var15 = par0EntityCreature.getBlockPathWeight(var12, var17, var14);
086
087 if (var15 > var9)
088 {
089 var9 = var15;
090 var6 = var12;
091 var7 = var17;
092 var8 = var14;
093 var5 = true;
094 }
095 }
096 }
097 }
098
099 if (var5)
100 {
101 return par0EntityCreature.worldObj.getWorldVec3Pool().getVecFromPool((double)var6, (double)var7, (double)var8);
102 }
103 else
104 {
105 return null;
106 }
107 }
108 }