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 }