2015-08-03 8 views
0

В настоящее время у меня есть этот код.Создание случайного местоположения в пределах заданного диапазона (который может быть положительным или отрицательным)

public static Location getRandomLocation(int min, int max, World w) { 
    int x = CommonUtils.randomInt(min, max); 
    int y = 255; 
    int z = CommonUtils.randomInt(min, max); 
    while (w.getBlockAt(x, y, z).getType() == Material.AIR) { 
     y--; 
    } 
    return w.getBlockAt(x, y + 1, z).getLocation(); 
} 

Я хочу генерировать случайные значения для координат x и z, которые также могут быть отрицательными. Проблема I в том, что, было то, что мне нужно, чтобы абсолютное значение чисел было еще больше, чем значение min, даже если фактическое число не является.

Проще говоря, прямо сейчас он может генерировать случайные местоположения между min и max. Как я бы также включил числа, которые находятся между -min и -max?

+0

Вы хотите, чтобы местоположения были в одном блоке? – kmecpp

+0

@kmecpp Позволяет просто сказать, что мне нужен случайный x, z, который может быть выше max, меньше, чем min, поэтому он может быть 1000,1000, но не 999,999 может быть -1000, -1000, но не -999.-999 – Community

+0

A немного запутанные вашими фотографиями ... вы хотите только одно местоположение или несколько мест? Как в кольцо? – kmecpp

ответ

0

Хорошо, теперь я получаю то, что вы хотите. У вас уже есть рабочий код, если вам просто нужно заставить его работать для отрицательных чисел. Простое исправить было бы просто добавить случайный знак на уже сгенерированные числа. Нечто подобное должно работать нормально:

public static Location getRandomLocation(int min, int max, World world) { 
    int x = CommonUtils.randomInt(-max, max);//Random x coord 
    int z; 
    if (Math.abs(x) < min) { 
     z = CommonUtils.randomInt(min, max);//If x coord is less than the minimum choose a z coord that is within range 
     if (new Random().nextBoolean()) {//Top or bottom of range 
      z = -z; 
     } 
    } else { 
     z = CommonUtils.randomInt(-max, max);//Else choose any z coord 
    } 
    int y = 255; 
    while (world.getBlockAt(x, y, z).getType() == Material.AIR) { 
     y--; 
    } 
    return world.getBlockAt(x, y + 1, z).getLocation(); 
} 
+0

Другая проблема: теперь они создаются в TOP RIGHT, TOP LEFT , BOTTOM RIGHT, BOTTOM LEFT. Но не в ЛЕВОМ, ПРАВО, ТОП, НИЖНЕЙ. – Community

+0

http://i.gyazo.com/cece1143ee7980cdd2594fd56d049d36.png Красные поля - это местоположения, в которых создаются местоположения. – Community

+0

@ Danielngx-development Можете ли вы разместить больше кода, чтобы я точно знал, что вы делаете с этим методом? – kmecpp

0

Одна вещь, чтобы добавить к тому, что kmecpp сказал, как я не могу комментировать, не проходное все блоки Y, чтобы проверить, если они воздуха или нет. Это дольше, чем использование getHighestBlockYAt(x, z);. Это вернет Y место самого высокого блока в мире в этом месте. Например:

//Get your Random location with random x and y, and set the y to something like 5. 
int newY = getServer().getWorld(worldName).getHighestBlockYAt(loc.getX(), loc.getZ()); 
Location newLoc = new Location(loc.getWorld(), loc.getX(), newY, loc.getZ()); 

Что касается Random телепортации в диапазоне с отрицательными и положительными числами, вот мой код, который я использую на моем сервере. (Обратите внимание, что это будет телепортировать их в икру)

Это позволит телепортировать игрока в случайное положение в квадрате шириной 12000 квадратных с центром 0,02.

Random rand = new Random(); 
int max = 6000; 
int min = -6000; 
int locX = rand.nextInt((max - min) + 1) + min; 
int locZ = rand.nextInt((max - min) + 1) + min; 
Location loc = new Location(getServer().getWorld("wild"), locX, 20, locZ); 
loc.setY(getServer().getWorld("wild").getHighestBlockYAt(locX, locZ)); 
Block b = getServer().getWorld("world").getBlockAt((int) loc.getX(), (int) loc.getY() - 1, (int) loc.getZ()); 
while(b.getType() == Material.LAVA || b.getType() == Material.WATER){ 
    locX = rand.nextInt((max - min) + 1) + min; 
    locZ = rand.nextInt((max - min) + 1) + min; 
    loc = new Location(getServer().getWorld("wild"), locX, 20, locZ); 
    loc.setY(getServer().getWorld("wild").getHighestBlockYAt(locX, locZ)); 
    b = getServer().getWorld("world").getBlockAt((int) loc.getX(), (int), loc.getY() - 1, (int) loc.getZ()); 
} 
return loc; 

Если вы хотите сделать так, чтобы они не телепортироваться в икре, вам нужно установить еще шесть Интс, spawnXMin, spawnXMax, и соответствующие из них для Y и Z. Тогда просто сделайте простую проверку:

int spawnXMin = 100, spawnXMax = 200, spawnYMin = 0, spawnYMax = 255, spawnZMin = 150, spawnZMax = 250; 
while(!(loc.getX() < spawnXMax && loc.getX() > spawnXMin && loc.getY() < spawnYMax && loc.getY() > spawnMin && loc.getZ() < spawnZMax && loc.getZ() > spawnZMin)) { 
    //Player is not in spawn so redo above while code 
} 
//Found Location! 
//Teleport Player