From 8aab77a5dc530b90e6cac228f2f9ac365d4f9275 Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Sat, 28 Jun 2025 21:02:33 +0800 Subject: [PATCH] Add check destination safety portal property --- .../multiverse/portals/MVPortal.java | 24 +++++++++++++++++++ .../multiverse/portals/MVPortalNodes.java | 4 ++++ .../portals/listeners/MVPPlayerListener.java | 2 +- .../listeners/MVPPlayerMoveListener.java | 4 ++-- .../portals/listeners/MVPVehicleListener.java | 5 +++- .../listeners/PlayerListenerHelper.java | 8 ++++--- 6 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/mvplugins/multiverse/portals/MVPortal.java b/src/main/java/org/mvplugins/multiverse/portals/MVPortal.java index 1b071b6d..21deb35f 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/MVPortal.java +++ b/src/main/java/org/mvplugins/multiverse/portals/MVPortal.java @@ -29,6 +29,7 @@ import org.mvplugins.multiverse.core.teleportation.BlockSafety; import org.mvplugins.multiverse.core.world.LoadedMultiverseWorld; import org.mvplugins.multiverse.core.world.WorldManager; +import org.mvplugins.multiverse.external.vavr.control.Try; import org.mvplugins.multiverse.portals.config.PortalsConfig; import org.mvplugins.multiverse.portals.enums.PortalType; import org.bukkit.Location; @@ -290,6 +291,29 @@ public boolean setDestination(DestinationInstance newDestination) { .getOrNull(); } + /** + * + * @param checkDestinationSafety + * @return + * + * @since 5.1 + */ + @ApiStatus.AvailableSince("5.1") + public Try setCheckDestinationSafety(boolean checkDestinationSafety) { + return this.configHandle.set(configNodes.checkDestinationSafety, checkDestinationSafety); + } + + /** + * + * @return + * + * @since 5.1 + */ + @ApiStatus.AvailableSince("5.1") + public boolean getCheckDestinationSafety() { + return this.configHandle.get(configNodes.checkDestinationSafety); + } + public Location getSafePlayerSpawnLocation() { PortalLocation pl = this.location; double portalWidth = Math.abs((pl.getMaximum().getBlockX()) - pl.getMinimum().getBlockX()) + 1; diff --git a/src/main/java/org/mvplugins/multiverse/portals/MVPortalNodes.java b/src/main/java/org/mvplugins/multiverse/portals/MVPortalNodes.java index 3d494fa7..4607b864 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/MVPortalNodes.java +++ b/src/main/java/org/mvplugins/multiverse/portals/MVPortalNodes.java @@ -99,6 +99,10 @@ private N node(N node) { .toTry()) .build()); + final ConfigNode checkDestinationSafety = node(ConfigNode.builder("check-destination-safety", Boolean.class) + .defaultValue(true) + .build()); + final ConfigNode version = node(ConfigNode.builder("version", Double.class) .defaultValue(0.0) .hidden() diff --git a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerListener.java b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerListener.java index f6b37024..a956e4ce 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerListener.java +++ b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerListener.java @@ -283,7 +283,7 @@ public void playerPortal(PlayerPortalEvent event) { return; } - if (portalDest.checkTeleportSafety()) { + if (portal.getCheckDestinationSafety() && portalDest.checkTeleportSafety()) { Location safeLocation = blockSafety.findSafeSpawnLocation(portalDest.getLocation(event.getPlayer()).getOrNull()); if (safeLocation == null) { event.setCancelled(true); diff --git a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerMoveListener.java b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerMoveListener.java index 94bfcefd..4cc1abc1 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerMoveListener.java +++ b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerMoveListener.java @@ -153,7 +153,7 @@ public void playerMove(PlayerMoveEvent event) { price > 0D ? "been charged" : "earned", economist.formatPrice(price, currency), portal.getName())); - helper.performTeleport(event.getPlayer(), event.getTo(), ps, d); + helper.performTeleport(event.getPlayer(), event.getTo(), ps, d, portal.getCheckDestinationSafety()); } } else { p.sendMessage(economist.getNSFMessage(currency, @@ -164,7 +164,7 @@ public void playerMove(PlayerMoveEvent event) { MVPortalEvent portalEvent = new MVPortalEvent(d, event.getPlayer(), portal); this.plugin.getServer().getPluginManager().callEvent(portalEvent); if (!portalEvent.isCancelled()) { - helper.performTeleport(event.getPlayer(), event.getTo(), ps, d); + helper.performTeleport(event.getPlayer(), event.getTo(), ps, d, portal.getCheckDestinationSafety()); } } } diff --git a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPVehicleListener.java b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPVehicleListener.java index fccba0ab..202f6520 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPVehicleListener.java +++ b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPVehicleListener.java @@ -13,6 +13,7 @@ import com.dumptruckman.minecraft.util.Logging; import org.bukkit.Material; import org.bukkit.event.Listener; +import org.mvplugins.multiverse.core.destination.DestinationInstance; import org.mvplugins.multiverse.core.economy.MVEconomist; import org.mvplugins.multiverse.core.permissions.CorePermissionsChecker; import org.mvplugins.multiverse.core.teleportation.LocationManipulation; @@ -101,7 +102,9 @@ public void vehicleMove(VehicleMoveEvent event) { } } - safetyTeleporter.to(portal.getDestination()) + DestinationInstance destination = portal.getDestination(); + safetyTeleporter.to(destination) + .checkSafety(portal.getCheckDestinationSafety() && destination.checkTeleportSafety()) .passengerMode(PassengerModes.RETAIN_ALL) .teleportSingle(vehicle) .onSuccess(() -> Logging.finer("Successfully teleported vehicle %s using portal %s", diff --git a/src/main/java/org/mvplugins/multiverse/portals/listeners/PlayerListenerHelper.java b/src/main/java/org/mvplugins/multiverse/portals/listeners/PlayerListenerHelper.java index 5279f117..e83288b2 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/listeners/PlayerListenerHelper.java +++ b/src/main/java/org/mvplugins/multiverse/portals/listeners/PlayerListenerHelper.java @@ -13,7 +13,7 @@ import org.bukkit.entity.Player; @Service -public class PlayerListenerHelper { +final class PlayerListenerHelper { private final AsyncSafetyTeleporter safetyTeleporter; @@ -34,8 +34,10 @@ void stateFailure(String playerName, String portalName) { playerName, portalName)); } - void performTeleport(Player player, Location to, PortalPlayerSession ps, DestinationInstance destination) { - safetyTeleporter.to(destination).teleport(player) + void performTeleport(Player player, Location to, PortalPlayerSession ps, DestinationInstance destination, boolean checkSafety) { + safetyTeleporter.to(destination) + .checkSafety(checkSafety && destination.checkTeleportSafety()) + .teleportSingle(player) .onSuccess(() -> { ps.playerDidTeleport(to); ps.setTeleportTime(new Date());