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