diff --git a/Core/src/main/java/com/plotsquared/core/command/DebugRoadRegen.java b/Core/src/main/java/com/plotsquared/core/command/DebugRoadRegen.java index 678dfd33a..127cbeba7 100644 --- a/Core/src/main/java/com/plotsquared/core/command/DebugRoadRegen.java +++ b/Core/src/main/java/com/plotsquared/core/command/DebugRoadRegen.java @@ -90,7 +90,7 @@ public class DebugRoadRegen extends SubCommand { } public boolean regenPlot(PlotPlayer player) { - PlotArea area = player.getCurrentPlot().getArea(); + PlotArea area = player.getContextualPlotArea(); if (area == null) { player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world")); return false; @@ -145,9 +145,10 @@ public class DebugRoadRegen extends SubCommand { return false; } - PlotArea area = player.getCurrentPlot().getArea(); + PlotArea area = player.getContextualPlotArea(); if (area == null) { player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world")); + return false; } Plot plot = player.getCurrentPlot(); PlotManager manager = area.getPlotManager(); diff --git a/Core/src/main/java/com/plotsquared/core/command/ListCmd.java b/Core/src/main/java/com/plotsquared/core/command/ListCmd.java index 2766721ff..586c1cf97 100644 --- a/Core/src/main/java/com/plotsquared/core/command/ListCmd.java +++ b/Core/src/main/java/com/plotsquared/core/command/ListCmd.java @@ -150,8 +150,8 @@ public class ListCmd extends SubCommand { page = 0; } - String world = player.getCurrentPlot().getWorldName(); - PlotArea area = player.getCurrentPlot().getArea(); + PlotArea area = player.getContextualPlotArea(); + String world = area != null ? area.getWorldName() : ""; String arg = args[0].toLowerCase(); final boolean[] sort = new boolean[]{true}; diff --git a/Core/src/main/java/com/plotsquared/core/command/Load.java b/Core/src/main/java/com/plotsquared/core/command/Load.java index cf4936211..e3fc9b9b6 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Load.java +++ b/Core/src/main/java/com/plotsquared/core/command/Load.java @@ -68,11 +68,6 @@ public class Load extends SubCommand { @Override public boolean onCommand(final PlotPlayer player, final String[] args) { - final String world = player.getCurrentPlot().getWorldName(); - if (!this.plotAreaManager.hasPlotArea(world)) { - player.sendMessage(TranslatableCaption.of("errors.not_in_plot_world")); - return false; - } final Plot plot = player.getCurrentPlot(); if (plot == null) { player.sendMessage(TranslatableCaption.of("errors.not_in_plot")); diff --git a/Core/src/main/java/com/plotsquared/core/command/Set.java b/Core/src/main/java/com/plotsquared/core/command/Set.java index 52c32c997..efdd5adca 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Set.java +++ b/Core/src/main/java/com/plotsquared/core/command/Set.java @@ -78,7 +78,7 @@ public class Set extends SubCommand { @Override public boolean set(PlotPlayer player, final Plot plot, String value) { - final PlotArea plotArea = player.getCurrentPlot().getArea(); + final PlotArea plotArea = player.getContextualPlotArea(); if (plotArea == null) { return false; } diff --git a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java index b0692aa2f..e2c9dd854 100644 --- a/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java +++ b/Core/src/main/java/com/plotsquared/core/player/PlotPlayer.java @@ -290,8 +290,7 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer, * * @return the plot the player is standing on or null if standing on a road or not in a {@link PlotArea} */ - @Nullable - public Plot getCurrentPlot() { + public @Nullable Plot getCurrentPlot() { try (final MetaDataAccess lastPlotAccess = this.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) { if (lastPlotAccess.get().orElse(null) == null && !Settings.Enabled_Components.EVENTS) { @@ -320,7 +319,7 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer, */ public int getPlotCount() { if (!Settings.Limit.GLOBAL) { - return getPlotCount(getCurrentPlot().getWorldName()); + return getPlotCount(getContextualWorldName()); } final AtomicInteger count = new AtomicInteger(0); final UUID uuid = getUUID(); @@ -340,7 +339,7 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer, public int getClusterCount() { if (!Settings.Limit.GLOBAL) { - return getClusterCount(getCurrentPlot().getWorldName()); + return getClusterCount(getContextualWorldName()); } final AtomicInteger count = new AtomicInteger(0); this.plotAreaManager.forEachPlotArea(value -> { @@ -353,6 +352,34 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer, return count.get(); } + /** + * {@return the world name at the player's contextual position} + * The contextual position can be affected when using a command with + * an explicit plot override, e.g., `/plot <id> info`. + */ + private @NonNull String getContextualWorldName() { + Plot current = getCurrentPlot(); + if (current != null) { + return current.getWorldName(); + } + return getLocation().getWorldName(); + } + + /** + * {@return the plot area at the player's contextual position} + * The contextual position can be affected when using a command with + * an explicit plot override, e.g., `/plot <id> info`. + * + * @since TODO + */ + public @Nullable PlotArea getContextualPlotArea() { + Plot current = getCurrentPlot(); + if (current != null) { + return current.getArea(); + } + return getLocation().getPlotArea(); + } + /** * Get the number of plots this player owns in the world. * @@ -683,86 +710,87 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer, public void populatePersistentMetaMap() { if (Settings.Enabled_Components.PERSISTENT_META) { - DBFunc.getPersistentMeta(getUUID(), new RunnableVal<>() { - @Override - public void run(Map value) { - try { - PlotPlayer.this.metaMap = value; - if (value.isEmpty()) { - return; - } - - if (PlotPlayer.this.getAttribute("debug")) { - debugModeEnabled.add(PlotPlayer.this); - } - - if (!Settings.Teleport.ON_LOGIN) { - return; - } - PlotAreaManager manager = PlotPlayer.this.plotAreaManager; - - if (!(manager instanceof SinglePlotAreaManager)) { - return; - } - PlotArea area = ((SinglePlotAreaManager) manager).getArea(); - boolean V2 = false; - byte[] arr = PlotPlayer.this.getPersistentMeta("quitLoc"); - if (arr == null) { - arr = PlotPlayer.this.getPersistentMeta("quitLocV2"); - if (arr == null) { - return; - } - V2 = true; - removePersistentMeta("quitLocV2"); - } else { - removePersistentMeta("quitLoc"); - } - - if (!getMeta("teleportOnLogin", true)) { - return; - } - ByteBuffer quitWorld = ByteBuffer.wrap(arr); - final int plotX = quitWorld.getShort(); - final int plotZ = quitWorld.getShort(); - PlotId id = PlotId.of(plotX, plotZ); - int x = quitWorld.getInt(); - int y = V2 ? quitWorld.getShort() : (quitWorld.get() & 0xFF); - int z = quitWorld.getInt(); - Plot plot = area.getOwnedPlot(id); - - if (plot == null) { - return; - } - - final Location location = Location.at(plot.getWorldName(), x, y, z); - if (plot.isLoaded()) { - TaskManager.runTask(() -> { - if (getMeta("teleportOnLogin", true)) { - teleport(location, TeleportCause.LOGIN); - sendMessage( - TranslatableCaption.of("teleport.teleported_to_plot")); + DBFunc.getPersistentMeta( + getUUID(), new RunnableVal<>() { + @Override + public void run(Map value) { + try { + PlotPlayer.this.metaMap = value; + if (value.isEmpty()) { + return; } - }); - } else if (!PlotSquared.get().isMainThread(Thread.currentThread())) { - if (getMeta("teleportOnLogin", true)) { - plot.teleportPlayer( - PlotPlayer.this, - result -> TaskManager.runTask(() -> { - if (getMeta("teleportOnLogin", true)) { - if (plot.isLoaded()) { - teleport(location, TeleportCause.LOGIN); - sendMessage(TranslatableCaption - .of("teleport.teleported_to_plot")); - } - } - }) - ); + + if (PlotPlayer.this.getAttribute("debug")) { + debugModeEnabled.add(PlotPlayer.this); + } + + if (!Settings.Teleport.ON_LOGIN) { + return; + } + PlotAreaManager manager = PlotPlayer.this.plotAreaManager; + + if (!(manager instanceof SinglePlotAreaManager)) { + return; + } + PlotArea area = ((SinglePlotAreaManager) manager).getArea(); + boolean V2 = false; + byte[] arr = PlotPlayer.this.getPersistentMeta("quitLoc"); + if (arr == null) { + arr = PlotPlayer.this.getPersistentMeta("quitLocV2"); + if (arr == null) { + return; + } + V2 = true; + removePersistentMeta("quitLocV2"); + } else { + removePersistentMeta("quitLoc"); + } + + if (!getMeta("teleportOnLogin", true)) { + return; + } + ByteBuffer quitWorld = ByteBuffer.wrap(arr); + final int plotX = quitWorld.getShort(); + final int plotZ = quitWorld.getShort(); + PlotId id = PlotId.of(plotX, plotZ); + int x = quitWorld.getInt(); + int y = V2 ? quitWorld.getShort() : (quitWorld.get() & 0xFF); + int z = quitWorld.getInt(); + Plot plot = area.getOwnedPlot(id); + + if (plot == null) { + return; + } + + final Location location = Location.at(plot.getWorldName(), x, y, z); + if (plot.isLoaded()) { + TaskManager.runTask(() -> { + if (getMeta("teleportOnLogin", true)) { + teleport(location, TeleportCause.LOGIN); + sendMessage( + TranslatableCaption.of("teleport.teleported_to_plot")); + } + }); + } else if (!PlotSquared.get().isMainThread(Thread.currentThread())) { + if (getMeta("teleportOnLogin", true)) { + plot.teleportPlayer( + PlotPlayer.this, + result -> TaskManager.runTask(() -> { + if (getMeta("teleportOnLogin", true)) { + if (plot.isLoaded()) { + teleport(location, TeleportCause.LOGIN); + sendMessage(TranslatableCaption + .of("teleport.teleported_to_plot")); + } + } + }) + ); + } + } + } catch (Throwable e) { + LOGGER.error("Error populating persistent meta for player {}", PlotPlayer.this.getName(), e); } } - } catch (Throwable e) { - LOGGER.error("Error populating persistent meta for player {}", PlotPlayer.this.getName(), e); - } - } } ); } @@ -832,7 +860,8 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer, } @SuppressWarnings("unchecked") - @Nullable T getPersistentMeta(final @NonNull MetaDataKey key) { + @Nullable + T getPersistentMeta(final @NonNull MetaDataKey key) { final byte[] value = this.getPersistentMeta(key.toString()); if (value == null) { return null; @@ -1002,9 +1031,11 @@ public abstract class PlotPlayer

implements CommandCaller, OfflinePlotPlayer, if (throwable != null) { sendMessage( TranslatableCaption.of("errors.error"), - TagResolver.resolver("value", Tag.inserting( - Component.text("Failed to resolve asynchronous caption replacements") - )) + TagResolver.resolver( + "value", Tag.inserting( + Component.text("Failed to resolve asynchronous caption replacements") + ) + ) ); LOGGER.error("Failed to resolve asynchronous tagresolver(s) for " + caption, throwable); } else { 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..1206e98bd 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/Plot.java +++ b/Core/src/main/java/com/plotsquared/core/plot/Plot.java @@ -541,7 +541,7 @@ public class Plot { * * @return World name */ - public @Nullable String getWorldName() { + public @NonNull String getWorldName() { return area.getWorldName(); } diff --git a/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlot.java b/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlot.java index eaf660455..eacca8988 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlot.java +++ b/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlot.java @@ -58,7 +58,7 @@ public class SinglePlot extends Plot { } @Override - public String getWorldName() { + public @NonNull String getWorldName() { return getId().toUnderscoreSeparatedString(); }