在给定范围内生成随机位置(可以是正数或负数)
Generating a Random Location Within a Given Range (that can be positive or negative)
目前我有这个代码。
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 坐标生成也可以为负的随机值。我遇到的问题是,我需要数字的绝对值仍然大于 min
值,即使实际数字不是。
更简单地说,现在它只能生成min
和max
之间的随机位置。我还如何包括 -min
和 -max
之间的数字?
好的,现在我得到你想要的。如果您只需要使其适用于负数,那么您已经有了基本的工作代码。一个简单的解决方法是在已经生成的数字上添加一个随机符号。像这样的东西应该可以正常工作:
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();
}
有一点要补充到 kmecpp 所说的内容,因为我无法发表评论,不要遍历所有 Y 块来检查它们是否是空气。这比使用 getHighestBlockYAt(x, z);
需要更长的时间。这将 return 世界上最高方块在该位置的 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());
关于负数和正数范围内的随机传送,这是我在服务器上使用的代码。 (请注意,这会将它们传送到重生点)
这会将玩家传送到一个以 0,0 为中心的 12000 格宽的正方形中的随机位置。
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
目前我有这个代码。
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 坐标生成也可以为负的随机值。我遇到的问题是,我需要数字的绝对值仍然大于 min
值,即使实际数字不是。
更简单地说,现在它只能生成min
和max
之间的随机位置。我还如何包括 -min
和 -max
之间的数字?
好的,现在我得到你想要的。如果您只需要使其适用于负数,那么您已经有了基本的工作代码。一个简单的解决方法是在已经生成的数字上添加一个随机符号。像这样的东西应该可以正常工作:
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();
}
有一点要补充到 kmecpp 所说的内容,因为我无法发表评论,不要遍历所有 Y 块来检查它们是否是空气。这比使用 getHighestBlockYAt(x, z);
需要更长的时间。这将 return 世界上最高方块在该位置的 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());
关于负数和正数范围内的随机传送,这是我在服务器上使用的代码。 (请注意,这会将它们传送到重生点)
这会将玩家传送到一个以 0,0 为中心的 12000 格宽的正方形中的随机位置。
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