diff --git a/.github/workflows/build-pr.yml b/.github/workflows/build-pr.yml index 8d275132c..e5bb474d5 100644 --- a/.github/workflows/build-pr.yml +++ b/.github/workflows/build-pr.yml @@ -11,7 +11,7 @@ jobs: - name: Checkout Repository uses: actions/checkout@v5 - name: Validate Gradle Wrapper - uses: gradle/actions/wrapper-validation@v4 + uses: gradle/actions/wrapper-validation@v5 - name: Setup Java uses: actions/setup-java@v5 with: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ba3b82bad..24567b719 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -11,7 +11,7 @@ jobs: - name: Checkout Repository uses: actions/checkout@v5 - name: Validate Gradle Wrapper - uses: gradle/actions/wrapper-validation@v4 + uses: gradle/actions/wrapper-validation@v5 - name: Setup Java uses: actions/setup-java@v5 with: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 8a932ed0d..92653fd3a 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -27,10 +27,10 @@ jobs: distribution: temurin java-version: 21 - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} - name: Autobuild - uses: github/codeql-action/autobuild@v3 + uses: github/codeql-action/autobuild@v4 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@v4 diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java index cf1c57878..c0a76c823 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java @@ -219,7 +219,7 @@ public class BlockEventListener implements Listener { } } - @EventHandler(priority = EventPriority.LOWEST) + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void blockDestroy(BlockBreakEvent event) { Player player = event.getPlayer(); Location location = BukkitUtil.adapt(event.getBlock().getLocation()); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntityEventListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntityEventListener.java index 1edf9f189..15220af2d 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntityEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntityEventListener.java @@ -160,7 +160,7 @@ public class EntityEventListener implements Listener { return; } } - case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL", + case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SILVERFISH_BLOCK", "ENDER_PEARL", "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN", "NETHER_PORTAL", "FROZEN", "SPELL", "DEFAULT" -> { if (!area.isMobSpawning()) { diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener.java index cfe1a2ffc..9eafe1dc1 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener.java @@ -104,6 +104,10 @@ public class PaperListener implements Listener { } Plot plot = area.getPlot(location); if (plot != null) { + // Prevent dropping blocks which normally would not be dropped. + if (!event.willDrop()) { + return; + } event.setWillDrop(plot.getFlag(TileDropFlag.class)); } } @@ -202,7 +206,7 @@ public class PaperListener implements Listener { return; } } - case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL", "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> { + case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SILVERFISH_BLOCK", "ENDER_PEARL", "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> { if (!area.isMobSpawning()) { event.setShouldAbortSpawn(true); event.setCancelled(true); 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/configuration/Settings.java b/Core/src/main/java/com/plotsquared/core/configuration/Settings.java index 04e88a40c..67378c450 100644 --- a/Core/src/main/java/com/plotsquared/core/configuration/Settings.java +++ b/Core/src/main/java/com/plotsquared/core/configuration/Settings.java @@ -435,6 +435,11 @@ public class Settings extends Config { public static String SCHEMATICS = "schematics"; public static String TEMPLATES = "templates"; + @Comment({"If schematics used for generation should be searched for in the path.schematics location", + " - This setting exists and is `false` by default for backwards compatibility.", + " - If false then generation schematics must be located in `schematics`", + " - Schematics must still always be under GEN_ROAD_SCHEMATIC/ etc."}) + public static boolean USE_SCHEMATICS_PATH_FOR_GEN_SCHEMATICS = false; } diff --git a/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java b/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java index d0ebd643b..326bf7284 100644 --- a/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java +++ b/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java @@ -140,7 +140,8 @@ public class HybridPlotWorld extends ClassicPlotWorld { @NonNull @Override protected PlotManager createManager() { - return new HybridPlotManager(this, PlotSquared.platform().regionManager(), + return new HybridPlotManager( + this, PlotSquared.platform().regionManager(), PlotSquared.platform().injector().getInstance(ProgressSubscriberFactory.class) ); } @@ -215,15 +216,16 @@ public class HybridPlotWorld extends ClassicPlotWorld { // Try to determine root. This means that plot areas can have separate schematic // directories + String schematicFolder = Settings.Paths.USE_SCHEMATICS_PATH_FOR_GEN_SCHEMATICS ? Settings.Paths.SCHEMATICS : "schematics"; if (!(root = FileUtils.getFile( PlotSquared.platform().getDirectory(), - "schematics/GEN_ROAD_SCHEMATIC/" + this.getWorldName() + "/" + this.getId() + schematicFolder + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + this.getWorldName() + File.separator + this.getId() )) .exists()) { root = FileUtils.getFile( PlotSquared.platform().getDirectory(), - "schematics/GEN_ROAD_SCHEMATIC/" + this.getWorldName() + schematicFolder + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + this.getWorldName() ); } 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..47679888e 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., {@code /plot 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., {@code /plot info}. + * + * @since 7.5.9 + */ + 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 cc6e55516..01d59d4dd 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/Plot.java +++ b/Core/src/main/java/com/plotsquared/core/plot/Plot.java @@ -542,7 +542,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(); } diff --git a/Core/src/main/java/com/plotsquared/core/util/placeholders/PlaceholderRegistry.java b/Core/src/main/java/com/plotsquared/core/util/placeholders/PlaceholderRegistry.java index b6a3fbd93..01cdb93b7 100644 --- a/Core/src/main/java/com/plotsquared/core/util/placeholders/PlaceholderRegistry.java +++ b/Core/src/main/java/com/plotsquared/core/util/placeholders/PlaceholderRegistry.java @@ -204,6 +204,9 @@ public final class PlaceholderRegistry { this.createPlaceholder("currentplot_x", (player, plot) -> Integer.toString(plot.getId().getX())); this.createPlaceholder("currentplot_y", (player, plot) -> Integer.toString(plot.getId().getY())); this.createPlaceholder("currentplot_xy", (player, plot) -> plot.getId().toString()); + this.createPlaceholder("currentplot_abs_x", (player, plot) -> Integer.toString(plot.getId().getX()), true); + this.createPlaceholder("currentplot_abs_y", (player, plot) -> Integer.toString(plot.getId().getY()), true); + this.createPlaceholder("currentplot_abs_xy", (player, plot) -> plot.getId().toString(), true); this.createPlaceholder("currentplot_rating", (player, plot) -> { if (Double.isNaN(plot.getAverageRating())) { return legacyComponent(TranslatableCaption.of("placeholder.nan"), player); @@ -253,7 +256,23 @@ public final class PlaceholderRegistry { final @NonNull String key, final @NonNull BiFunction, Plot, String> placeholderFunction ) { - this.registerPlaceholder(new PlotSpecificPlaceholder(key) { + this.createPlaceholder(key, placeholderFunction, false); + } + + /** + * Create a functional placeholder + * + * @param key Placeholder key + * @param placeholderFunction Placeholder generator. Cannot return null + * @param requireAbsolute If the plot given to the placeholder should be the absolute (not base) plot + * @since 7.5.9 + */ + public void createPlaceholder( + final @NonNull String key, + final @NonNull BiFunction, Plot, String> placeholderFunction, + final boolean requireAbsolute + ) { + this.registerPlaceholder(new PlotSpecificPlaceholder(key, requireAbsolute) { @Override public @NonNull String getValue(final @NonNull PlotPlayer player, final @NonNull Plot plot) { return placeholderFunction.apply(player, plot); diff --git a/Core/src/main/java/com/plotsquared/core/util/placeholders/PlotSpecificPlaceholder.java b/Core/src/main/java/com/plotsquared/core/util/placeholders/PlotSpecificPlaceholder.java index d9218cdd3..55bf4853f 100644 --- a/Core/src/main/java/com/plotsquared/core/util/placeholders/PlotSpecificPlaceholder.java +++ b/Core/src/main/java/com/plotsquared/core/util/placeholders/PlotSpecificPlaceholder.java @@ -27,14 +27,28 @@ import org.checkerframework.checker.nullness.qual.NonNull; */ public abstract class PlotSpecificPlaceholder extends Placeholder { + private final boolean requireAbsolute; + public PlotSpecificPlaceholder(final @NonNull String key) { + this(key, false); + } + + /** + * Create a functional placeholder + * + * @param key Placeholder key + * @param requireAbsolute If the plot given to the placeholder should be the absolute (not base) plot + * @since 7.5.9 + */ + public PlotSpecificPlaceholder(final @NonNull String key, final boolean requireAbsolute) { super(key); + this.requireAbsolute = requireAbsolute; } @Override public @NonNull final String getValue(final @NonNull PlotPlayer player) { - final Plot plot = player.getCurrentPlot(); + final Plot plot = requireAbsolute ? player.getLocation().getPlotAbs() : player.getCurrentPlot(); if (plot == null) { return ""; } diff --git a/build.gradle.kts b/build.gradle.kts index 5ef437abd..b098368d7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -20,7 +20,7 @@ plugins { } group = "com.intellectualsites.plotsquared" -version = "7.5.9-SNAPSHOT" +version = "7.5.11-SNAPSHOT" if (!File("$rootDir/.git").exists()) { logger.lifecycle(""" @@ -65,10 +65,16 @@ subprojects { plugin() } + configurations.matching { it.name == "signatures" }.configureEach { + attributes { + attribute(Attribute.of("signatures-unique", String::class.java), "true") + } + } + dependencies { // Tests - testImplementation("org.junit.jupiter:junit-jupiter:5.14.0") - testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.14.0") + testImplementation("org.junit.jupiter:junit-jupiter:6.0.1") + testRuntimeOnly("org.junit.platform:junit-platform-launcher:6.0.1") } plugins.withId("java") { @@ -95,9 +101,15 @@ subprojects { } } - val javaComponent = components["java"] as AdhocComponentWithVariants - javaComponent.withVariantsFromConfiguration(configurations["shadowRuntimeElements"]) { - skip() + afterEvaluate { + val javaComponent = components["java"] as AdhocComponentWithVariants + configurations.findByName("shadowRuntimeElements")?.let { shadowRuntimeElements -> + javaComponent.withVariantsFromConfiguration(shadowRuntimeElements) { + skip() + } + } ?: run { + logger.warn("Configuration 'shadowRuntimeElements' does not exist.") + } } signing { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b8818366f..7d77da188 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,19 +2,19 @@ # Platform expectations paper = "1.20.4-R0.1-SNAPSHOT" guice = "7.0.0" -spotbugs = "4.9.6" -checkerqual = "3.51.1" +spotbugs = "4.9.8" +checkerqual = "3.52.0" gson = "2.10" guava = "31.1-jre" snakeyaml = "2.0" -adventure = "4.24.0" +adventure = "4.25.0" adventure-bukkit = "4.4.1" log4j = "2.19.0" # Plugins worldedit = "7.2.20" -fawe = "2.13.2" -placeholderapi = "2.11.6" +fawe = "2.14.0" +placeholderapi = "2.11.7" luckperms = "5.5" essentialsx = "2.21.2" mvdwapi = "3.1.1" @@ -33,11 +33,11 @@ vault = "1.7.1" serverlib = "2.3.7" # Gradle plugins -shadow = "8.3.9" +shadow = "9.2.2" grgit = "4.1.1" -spotless = "8.0.0" -publish = "0.34.0" -runPaper = "3.0.1" +spotless = "8.1.0" +publish = "0.35.0" +runPaper = "3.0.2" [libraries] # Platform expectations diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 1b33c55ba..f8e1ee312 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d4081da47..23449a2b5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 23d15a936..adff685a0 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index 5eed7ee84..e509b2dd8 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell