Одна вещь, чтобы добавить к тому, что 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
Вы хотите, чтобы местоположения были в одном блоке? – kmecpp
@kmecpp Позволяет просто сказать, что мне нужен случайный x, z, который может быть выше max, меньше, чем min, поэтому он может быть 1000,1000, но не 999,999 может быть -1000, -1000, но не -999.-999 – Community
A немного запутанные вашими фотографиями ... вы хотите только одно местоположение или несколько мест? Как в кольцо? – kmecpp