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    }