diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java index e69d3f5bf6..2926d0bd15 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/player/BukkitPlayer.java @@ -32,6 +32,7 @@ import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MathMan; +import com.plotsquared.core.util.WorldUtil; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.world.item.ItemType; @@ -120,6 +121,9 @@ public long getLastPlayed() { @Override public boolean canTeleport(final @NonNull Location location) { + if (!WorldUtil.isValidLocation(location)) { + return false; + } final org.bukkit.Location to = BukkitUtil.adapt(location); final org.bukkit.Location from = player.getLocation(); PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to); @@ -221,7 +225,7 @@ public int hasPermissionRange( @Override public void teleport(final @NonNull Location location, final @NonNull TeleportCause cause) { - if (Math.abs(location.getX()) >= 30000000 || Math.abs(location.getZ()) >= 30000000) { + if (!WorldUtil.isValidLocation(location)) { return; } final org.bukkit.Location bukkitLocation = diff --git a/Core/src/main/java/com/plotsquared/core/command/MainCommand.java b/Core/src/main/java/com/plotsquared/core/command/MainCommand.java index 721bec05f3..322e04dbe0 100644 --- a/Core/src/main/java/com/plotsquared/core/command/MainCommand.java +++ b/Core/src/main/java/com/plotsquared/core/command/MainCommand.java @@ -268,6 +268,7 @@ public CompletableFuture execute( tp = true; } else { player.sendMessage(TranslatableCaption.of("border.denied")); + return CompletableFuture.completedFuture(false); } // Trim command args = Arrays.copyOfRange(args, 1, args.length); diff --git a/Core/src/main/java/com/plotsquared/core/plot/Plot.java b/Core/src/main/java/com/plotsquared/core/plot/Plot.java index 67db8a698e..27ef4b3189 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/Plot.java +++ b/Core/src/main/java/com/plotsquared/core/plot/Plot.java @@ -2574,6 +2574,12 @@ public void teleportPlayer(final PlotPlayer player, Consumer result) */ public void teleportPlayer(final PlotPlayer player, TeleportCause cause, Consumer resultConsumer) { Plot plot = this.getBasePlot(false); + if (!WorldUtil.isValidLocation(plot.getBottomAbs())) { + // prevent from teleporting into unsafe regions + player.sendMessage(TranslatableCaption.of("border.denied")); + resultConsumer.accept(false); + return; + } PlayerTeleportToPlotEvent event = this.eventDispatcher.callTeleport(player, player.getLocation(), plot, cause); if (event.getEventResult() == Result.DENY) { diff --git a/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java b/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java index d00ce0e21f..f016de9244 100644 --- a/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java @@ -62,6 +62,15 @@ public abstract class WorldUtil { + /** + * {@return whether the given location is valid in the world} + * @param location the location to check + * @since TODO + */ + public static boolean isValidLocation(Location location) { + return Math.abs(location.getX()) < 30000000 && Math.abs(location.getZ()) < 30000000; + } + /** * Set the biome in a region *