feat: add configurable border size (#4213)

- allows players to travel past border, but not claim
 - closes #2962
This commit is contained in:
Jordan 2023-10-31 10:51:19 +00:00 committed by GitHub
parent 1c3776b605
commit 3cc770970f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 45 additions and 4 deletions

View File

@ -608,7 +608,7 @@ public class PlayerEventListener implements Listener {
this.tmpTeleport = true; this.tmpTeleport = true;
return; return;
} }
int border = area.getBorder(); int border = area.getBorder(true);
int x1; int x1;
if (x2 > border && this.tmpTeleport) { if (x2 > border && this.tmpTeleport) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
@ -703,7 +703,7 @@ public class PlayerEventListener implements Listener {
this.tmpTeleport = true; this.tmpTeleport = true;
return; return;
} }
int border = area.getBorder(); int border = area.getBorder(true);
int z1; int z1;
if (z2 > border && this.tmpTeleport) { if (z2 > border && this.tmpTeleport) {
if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { if (!pp.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {

View File

@ -193,7 +193,7 @@ public class Claim extends SubCommand {
} }
} }
if (!player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) { if (!player.hasPermission(Permission.PERMISSION_ADMIN_BYPASS_BORDER)) {
int border = area.getBorder(); int border = area.getBorder(false);
if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) { if (border != Integer.MAX_VALUE && plot.getDistanceFromOrigin() > border && !force) {
player.sendMessage(TranslatableCaption.of("border.denied")); player.sendMessage(TranslatableCaption.of("border.denied"));
return false; return false;

View File

@ -2638,6 +2638,11 @@ public class Plot {
return false; return false;
} }
/**
* Get the maximum distance of the plot from x=0, z=0.
*
* @return max block distance from 0,0
*/
public int getDistanceFromOrigin() { public int getDistanceFromOrigin() {
Location bot = getManager().getPlotBottomLocAbs(id); Location bot = getManager().getPlotBottomLocAbs(id);
Location top = getManager().getPlotTopLocAbs(id); Location top = getManager().getPlotTopLocAbs(id);
@ -2651,7 +2656,7 @@ public class Plot {
* Expands the world border to include this plot if it is beyond the current border. * Expands the world border to include this plot if it is beyond the current border.
*/ */
public void updateWorldBorder() { public void updateWorldBorder() {
int border = this.area.getBorder(); int border = this.area.getBorder(false);
if (border == Integer.MAX_VALUE) { if (border == Integer.MAX_VALUE) {
return; return;
} }

View File

@ -147,6 +147,7 @@ public abstract class PlotArea implements ComponentLike {
private Map<String, PlotExpression> prices = new HashMap<>(); private Map<String, PlotExpression> prices = new HashMap<>();
private List<String> schematics = new ArrayList<>(); private List<String> schematics = new ArrayList<>();
private boolean worldBorder = false; private boolean worldBorder = false;
private int borderSize = 1;
private boolean useEconomy = false; private boolean useEconomy = false;
private int hash; private int hash;
private CuboidRegion region; private CuboidRegion region;
@ -356,6 +357,7 @@ public abstract class PlotArea implements ComponentLike {
this.plotChat = config.getBoolean("chat.enabled"); this.plotChat = config.getBoolean("chat.enabled");
this.forcingPlotChat = config.getBoolean("chat.forced"); this.forcingPlotChat = config.getBoolean("chat.forced");
this.worldBorder = config.getBoolean("world.border"); this.worldBorder = config.getBoolean("world.border");
this.borderSize = config.getInt("world.border_size");
this.maxBuildHeight = config.getInt("world.max_height"); this.maxBuildHeight = config.getInt("world.max_height");
this.minBuildHeight = config.getInt("world.min_height"); this.minBuildHeight = config.getInt("world.min_height");
this.minGenHeight = config.getInt("world.min_gen_height"); this.minGenHeight = config.getInt("world.min_gen_height");
@ -489,6 +491,7 @@ public abstract class PlotArea implements ComponentLike {
options.put("event.spawn.custom", this.isSpawnCustom()); options.put("event.spawn.custom", this.isSpawnCustom());
options.put("event.spawn.breeding", this.isSpawnBreeding()); options.put("event.spawn.breeding", this.isSpawnBreeding());
options.put("world.border", this.hasWorldBorder()); options.put("world.border", this.hasWorldBorder());
options.put("world.border_size", this.getBorderSize());
options.put("home.default", "side"); options.put("home.default", "side");
String position = config.getString( String position = config.getString(
"home.nonmembers", "home.nonmembers",
@ -937,7 +940,9 @@ public abstract class PlotArea implements ComponentLike {
* Get the plot border distance for a world<br> * Get the plot border distance for a world<br>
* *
* @return The border distance or Integer.MAX_VALUE if no border is set * @return The border distance or Integer.MAX_VALUE if no border is set
* @deprecated Use {@link PlotArea#getBorder(boolean)}
*/ */
@Deprecated(forRemoval = true, since = "TODO")
public int getBorder() { public int getBorder() {
final Integer meta = (Integer) getMeta("worldBorder"); final Integer meta = (Integer) getMeta("worldBorder");
if (meta != null) { if (meta != null) {
@ -951,6 +956,27 @@ public abstract class PlotArea implements ComponentLike {
return Integer.MAX_VALUE; return Integer.MAX_VALUE;
} }
/**
* Get the plot border distance for a world, specifying whether the returned value should include the world.border-size
* value. This is a player-traversable area, where plots cannot be claimed
*
* @param getExtended If the extra border given by world.border-size should be included
* @return Border distance of Integer.MAX_VALUE if no border is set
* @since TODO
*/
public int getBorder(boolean getExtended) {
final Integer meta = (Integer) getMeta("worldBorder");
if (meta != null) {
int border = meta + 1;
if (border == 0) {
return Integer.MAX_VALUE;
} else {
return getExtended ? border + borderSize : border;
}
}
return Integer.MAX_VALUE;
}
/** /**
* Setup the plot border for a world (usually done when the world is created). * Setup the plot border for a world (usually done when the world is created).
*/ */
@ -1210,6 +1236,16 @@ public abstract class PlotArea implements ComponentLike {
return worldBorder; return worldBorder;
} }
/**
* Get the "extra border" size of the plot area.
*
* @return Plot area extra border size
* @since TODO
*/
public int getBorderSize() {
return borderSize;
}
/** /**
* Get whether plot signs are allowed or not. * Get whether plot signs are allowed or not.
* *