From cb9a8a6cfbe52afbe4c884090d3c1c8fb08fb030 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Sun, 24 Aug 2025 17:26:03 +0100 Subject: [PATCH] fix: attempt to address unnecessary flight status changes - addresses #3743 --- .../bukkit/listener/PlayerEventListener.java | 6 ++-- .../core/listener/PlotListener.java | 35 ++++++++++++++----- .../java/com/plotsquared/core/plot/Plot.java | 4 +-- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java index 6abea3958..821a35e97 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java @@ -600,7 +600,7 @@ public class PlayerEventListener implements Listener { PlotArea area = location.getPlotArea(); if (area == null) { if (lastPlot != null) { - plotListener.plotExit(pp, lastPlot); + plotListener.plotExit(pp, lastPlot, null, null); lastPlotAccess.remove(); } try (final MetaDataAccess lastLocationAccess = @@ -753,7 +753,7 @@ public class PlayerEventListener implements Listener { if (now == null) { try (final MetaDataAccess kickAccess = pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) { - if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse( + if (lastPlot != null && !plotListener.plotExit(pp, lastPlot, now, area) && this.tmpTeleport && !kickAccess.get().orElse( false)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), @@ -847,7 +847,7 @@ public class PlayerEventListener implements Listener { if (plot == null) { try (final MetaDataAccess kickAccess = pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) { - if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse( + if (lastPlot != null && !plotListener.plotExit(pp, lastPlot, null, area) && this.tmpTeleport && !kickAccess.get().orElse( false)) { pp.sendMessage( TranslatableCaption.of("permission.no_permission_event"), diff --git a/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java b/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java index 766bf62d9..a2f5a046d 100644 --- a/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java +++ b/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java @@ -164,7 +164,7 @@ public class PlotListener { try (final MetaDataAccess lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) { Plot last = lastPlot.get().orElse(null); if ((last != null) && !last.getId().equals(plot.getId())) { - plotExit(player, last); + plotExit(player, last, plot, plot.getArea()); } if (PlotSquared.platform().expireManager() != null) { PlotSquared.platform().expireManager().handleEntry(player, plot); @@ -365,7 +365,12 @@ public class PlotListener { return true; } - public boolean plotExit(final PlotPlayer player, Plot plot) { + public boolean plotExit( + final PlotPlayer player, + @NonNull Plot plot, + @Nullable Plot nextPlot, + @Nullable PlotArea nextArea + ) { try (final MetaDataAccess lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) { final Plot previous = lastPlot.remove(); @@ -382,7 +387,9 @@ public class PlotListener { if (plot.hasOwner()) { PlotArea pw = plot.getArea(); if (pw == null) { - return true; + if (nextPlot == null || (pw = nextPlot.getArea()) == null) { + return true; + } } try (final MetaDataAccess kickAccess = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) { @@ -440,11 +447,23 @@ public class PlotListener { player.setFlight(value.get()); metaDataAccess.remove(); } else { - GameMode gameMode = player.getGameMode(); - if (gameMode == GameModes.SURVIVAL || gameMode == GameModes.ADVENTURE) { - player.setFlight(false); - } else if (!player.getFlight()) { - player.setFlight(true); + FlyFlag.FlyStatus flight = FlyFlag.FlyStatus.DEFAULT; + if (nextPlot != null) { + flight = nextPlot.getFlag(FlyFlag.class); + } else if (nextArea != null) { + if (nextArea.isRoadFlags()) { + flight = nextArea.getRoadFlag(FlyFlag.class); + } else { + flight = nextArea.getFlag(FlyFlag.class); + } + } + if (flight != FlyFlag.FlyStatus.ENABLED) { + GameMode gameMode = player.getGameMode(); + if (gameMode == GameModes.SURVIVAL || gameMode == GameModes.ADVENTURE) { + player.setFlight(false); + } else if (!player.getFlight()) { + player.setFlight(true); + } } } } 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 655dc6d3f..4a017ab38 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/Plot.java +++ b/Core/src/main/java/com/plotsquared/core/plot/Plot.java @@ -1340,7 +1340,7 @@ public class Plot { for (Plot current : getConnectedPlots()) { List> players = current.getPlayersInPlot(); for (PlotPlayer pp : players) { - this.plotListener.plotExit(pp, current); + this.plotListener.plotExit(pp, current, null, area); } if (Settings.Backup.DELETE_ON_UNCLAIM) { @@ -2594,7 +2594,7 @@ public class Plot { public void reEnter() { TaskManager.runTaskLater(() -> { for (PlotPlayer pp : Plot.this.getPlayersInPlot()) { - this.plotListener.plotExit(pp, Plot.this); + this.plotListener.plotExit(pp, Plot.this, Plot.this, area); this.plotListener.plotEntry(pp, Plot.this); } }, TaskTime.ticks(1L));