Added min and max y settings (Resolves #2)

Max y will be 127 in the nether by default. Use the -maxY parameter to change it. Also once a maxY is set it will try to find a random y between the values if the highest block is above the max y value.
This commit is contained in:
Phoenix616 2019-10-02 17:02:09 +01:00
parent 8eb93d138e
commit 081d217053
4 changed files with 66 additions and 1 deletions

View File

@ -149,6 +149,20 @@ public class RandomTeleport extends JavaPlugin implements RandomTeleportAPI {
} }
return false; return false;
})); }));
addOptionParser(new SimpleOptionParser(array("miny"), (searcher, args) -> {
if (args.length > 0) {
searcher.setMinY(Integer.parseInt(args[0]));
return true;
}
return false;
}));
addOptionParser(new SimpleOptionParser(array("maxy"), (searcher, args) -> {
if (args.length > 0) {
searcher.setMaxY(Integer.parseInt(args[0]));
return true;
}
return false;
}));
addOptionParser(new SimpleOptionParser(array("w", "world"), (searcher, args) -> { addOptionParser(new SimpleOptionParser(array("w", "world"), (searcher, args) -> {
if (args.length > 0) { if (args.length > 0) {
World world = getServer().getWorld(args[0]); World world = getServer().getWorld(args[0]);

View File

@ -28,6 +28,7 @@ import io.papermc.lib.PaperLib;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
@ -68,6 +69,8 @@ public class RandomSearcher {
private Location center; private Location center;
private int minRadius = 0; private int minRadius = 0;
private int maxRadius = Integer.MAX_VALUE; private int maxRadius = Integer.MAX_VALUE;
private int minY = 0;
private int maxY;
private boolean loadedOnly = false; private boolean loadedOnly = false;
private boolean generatedOnly = false; private boolean generatedOnly = false;
private int maxTries = 100; private int maxTries = 100;
@ -85,6 +88,11 @@ public class RandomSearcher {
setCenter(center); setCenter(center);
setMinRadius(minRadius); setMinRadius(minRadius);
setMaxRadius(maxRadius); setMaxRadius(maxRadius);
if (center.getWorld().getEnvironment() == World.Environment.NETHER) {
maxY = 127;
} else {
maxY = center.getWorld().getMaxHeight();
}
this.validators.getRaw().putAll(plugin.getLocationValidators().getRaw()); this.validators.getRaw().putAll(plugin.getLocationValidators().getRaw());
Arrays.asList(validators).forEach(this.validators::add); Arrays.asList(validators).forEach(this.validators::add);
} }
@ -216,6 +224,40 @@ public class RandomSearcher {
this.maxRadius = maxRadius; this.maxRadius = maxRadius;
} }
/**
* Get the minimum Y
* @return The minimum Y, always positive and less than the max Y!
*/
public int getMinY() {
return minY;
}
/**
* Set the minimum search Y
* @param minY The min Y; has to be positive and less than the max Y!
*/
public void setMinY(int minY) {
Validate.isTrue(minY >= 0 && minY < maxY, "Min Y has to be positive and less than the max Y!");
this.minY = minY;
}
/**
* Get the maximum Y
* @return The maximum Y, always greater than the minimum Y
*/
public int getMaxY() {
return maxY;
}
/**
* Set the maximum search Y
* @param maxY The max Y; has to be greater than the min Y!
*/
public void setMaxY(int maxY) {
Validate.isTrue(maxY > minY, "Max Y has to be greater than the min Y!");
this.maxY = maxY;
}
/** /**
* By default it will search for coordinates in any chunk, even unloaded ones prompting the server to load new * By default it will search for coordinates in any chunk, even unloaded ones prompting the server to load new
* chunks which might result in some performance impact if the server doesn't support async loading. This disables * chunks which might result in some performance impact if the server doesn't support async loading. This disables

View File

@ -32,9 +32,16 @@ public class HeightValidator extends LocationValidator {
@Override @Override
public boolean validate(RandomSearcher searcher, Location location) { public boolean validate(RandomSearcher searcher, Location location) {
Block block = location.getWorld().getHighestBlockAt(location); Block block = location.getWorld().getHighestBlockAt(location);
if (block.getY() > searcher.getMaxY()) {
block = location.getWorld().getBlockAt(
block.getX(),
searcher.getMinY() + searcher.getRandom().nextInt(searcher.getMaxY() - searcher.getMinY()),
block.getZ()
);
}
while (block.isEmpty()) { while (block.isEmpty()) {
block = block.getRelative(BlockFace.DOWN); block = block.getRelative(BlockFace.DOWN);
if (block == null || block.getY() == 0) { if (block == null || block.getY() < searcher.getMinY()) {
return false; return false;
} }
} }

View File

@ -22,6 +22,8 @@ commands:
> -b,-biome <biomename> [<biome 2> ...] - only teleport to this biome (multiple allowed, Bukkit biome names!) > -b,-biome <biomename> [<biome 2> ...] - only teleport to this biome (multiple allowed, Bukkit biome names!)
> -x,-xPos <x value> - x axis of the center point, if not set the player's x axis is used > -x,-xPos <x value> - x axis of the center point, if not set the player's x axis is used
> -z,-zPos <z value> - z axis of the center point, if not set the player's z axis is used > -z,-zPos <z value> - z axis of the center point, if not set the player's z axis is used
> -minY <y value> - minimum y value that the random location should have (default: 0)
> -maxY <y value> - maximum y value that the random location should have (default: world height, half in nether)
> -l,-loaded - only search loaded chunks for possible locations (might fail more often) > -l,-loaded - only search loaded chunks for possible locations (might fail more often)
> -g,-generated - only search generated chunks for possible locations > -g,-generated - only search generated chunks for possible locations
> -c, -cooldown <seconds> - cooldown in seconds after which the player can use this teleporter again > -c, -cooldown <seconds> - cooldown in seconds after which the player can use this teleporter again