Compare commits

..

1 Commits

Author SHA1 Message Date
SirYwell
5b3c7a2934 fix: missing fallback if current plot is not explicitly overridden 2025-10-18 09:30:54 +02:00
21 changed files with 63 additions and 109 deletions

View File

@@ -27,7 +27,7 @@ body:
description: Which server version are you using? If your server version is not listed, it is not supported. Update to a supported version first.
multiple: false
options:
- '1.21.11'
- '1.21.4'
- '1.21.3'
- '1.21.1'
- '1.20.6'

18
.github/stale.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
daysUntilStale: 30
daysUntilClose: 7
only: issues
exemptLabels:
- "Bug"
- "Enhancement"
- "Approved"
- "Priority"
- "Under investigation"
staleLabel: "resolution: stale"
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. If the issue is still present and can be reproduced, please let the team know.
Thank you for your contributions.
closeComment: >
This issue has been automatically closed because it has not had activity in
a long time. If the issue still applies to the most recent supported
version, please reply to this issue and the team will reopen it.

View File

@@ -9,7 +9,7 @@ jobs:
os: [ ubuntu-latest, windows-latest, macos-latest ]
steps:
- name: Checkout Repository
uses: actions/checkout@v6
uses: actions/checkout@v5
- name: Validate Gradle Wrapper
uses: gradle/actions/wrapper-validation@v5
- name: Setup Java

View File

@@ -9,7 +9,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v6
uses: actions/checkout@v5
- name: Validate Gradle Wrapper
uses: gradle/actions/wrapper-validation@v5
- name: Setup Java

View File

@@ -20,7 +20,7 @@ jobs:
language: [ 'java' ]
steps:
- name: Checkout repository
uses: actions/checkout@v6
uses: actions/checkout@v5
- name: Setup Java
uses: actions/setup-java@v5
with:

View File

@@ -110,9 +110,9 @@ tasks {
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
val opt = options as StandardJavadocDocletOptions
opt.links("https://jd.papermc.io/paper/1.20.4/")
// opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/")
// opt.links("https://jd.advntr.dev/api/" + libs.adventureApi.get().versionConstraint.toString())
opt.links("https://jd.advntr.dev/api/" + libs.adventureApi.get().versionConstraint.toString())
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
opt.links("https://checkerframework.org/api/")
opt.isLinkSource = true

View File

@@ -219,7 +219,7 @@ public class BlockEventListener implements Listener {
}
}
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
@EventHandler(priority = EventPriority.LOWEST)
public void blockDestroy(BlockBreakEvent event) {
Player player = event.getPlayer();
Location location = BukkitUtil.adapt(event.getBlock().getLocation());

View File

@@ -104,10 +104,6 @@ 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));
}
}

View File

@@ -600,7 +600,7 @@ public class PlayerEventListener implements Listener {
PlotArea area = location.getPlotArea();
if (area == null) {
if (lastPlot != null) {
plotListener.plotExit(pp, lastPlot, null, null);
plotListener.plotExit(pp, lastPlot);
lastPlotAccess.remove();
}
try (final MetaDataAccess<Location> lastLocationAccess =
@@ -753,7 +753,7 @@ public class PlayerEventListener implements Listener {
if (now == null) {
try (final MetaDataAccess<Boolean> kickAccess =
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot, now, area) && this.tmpTeleport && !kickAccess.get().orElse(
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && 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<Boolean> kickAccess =
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot, null, area) && this.tmpTeleport && !kickAccess.get().orElse(
if (lastPlot != null && !plotListener.plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(
false)) {
pp.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),

View File

@@ -67,8 +67,8 @@ tasks {
withType<Javadoc> {
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
val opt = options as StandardJavadocDocletOptions
// opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString())
// opt.links("https://jd.advntr.dev/api/" + libs.adventureApi.get().versionConstraint.toString())
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString())
opt.links("https://jd.advntr.dev/api/" + libs.adventureApi.get().versionConstraint.toString())
opt.links("https://jd.advntr.dev/text-minimessage/" + libs.adventureApi.get().versionConstraint.toString())
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
opt.links("https://checkerframework.org/api/")

View File

@@ -435,11 +435,6 @@ 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/<world> etc."})
public static boolean USE_SCHEMATICS_PATH_FOR_GEN_SCHEMATICS = false;
}

View File

@@ -140,8 +140,7 @@ 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)
);
}
@@ -216,16 +215,15 @@ 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(),
schematicFolder + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + this.getWorldName() + File.separator + this.getId()
"schematics/GEN_ROAD_SCHEMATIC/" + this.getWorldName() + "/" + this.getId()
))
.exists()) {
root = FileUtils.getFile(
PlotSquared.platform().getDirectory(),
schematicFolder + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + this.getWorldName()
"schematics/GEN_ROAD_SCHEMATIC/" + this.getWorldName()
);
}

View File

@@ -164,7 +164,7 @@ public class PlotListener {
try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
Plot last = lastPlot.get().orElse(null);
if ((last != null) && !last.getId().equals(plot.getId())) {
plotExit(player, last, plot, plot.getArea());
plotExit(player, last);
}
if (PlotSquared.platform().expireManager() != null) {
PlotSquared.platform().expireManager().handleEntry(player, plot);
@@ -365,12 +365,7 @@ public class PlotListener {
return true;
}
public boolean plotExit(
final PlotPlayer<?> player,
@NonNull Plot plot,
@Nullable Plot nextPlot,
@Nullable PlotArea nextArea
) {
public boolean plotExit(final PlotPlayer<?> player, Plot plot) {
try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
final Plot previous = lastPlot.remove();
@@ -387,9 +382,7 @@ public class PlotListener {
if (plot.hasOwner()) {
PlotArea pw = plot.getArea();
if (pw == null) {
if (nextPlot == null || nextPlot.getArea() == null) {
return true;
}
return true;
}
try (final MetaDataAccess<Boolean> kickAccess =
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
@@ -447,23 +440,11 @@ public class PlotListener {
player.setFlight(value.get());
metaDataAccess.remove();
} else {
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);
}
GameMode gameMode = player.getGameMode();
if (gameMode == GameModes.SURVIVAL || gameMode == GameModes.ADVENTURE) {
player.setFlight(false);
} else if (!player.getFlight()) {
player.setFlight(true);
}
}
}

View File

@@ -355,7 +355,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
/**
* {@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 <id> info}.
* an explicit plot override, e.g., `/plot &ltid&gt info`.
*/
private @NonNull String getContextualWorldName() {
Plot current = getCurrentPlot();
@@ -368,9 +368,9 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer,
/**
* {@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 <id> info}.
* an explicit plot override, e.g., `/plot &ltid&gt info`.
*
* @since 7.5.9
* @since TODO
*/
public @Nullable PlotArea getContextualPlotArea() {
Plot current = getCurrentPlot();

View File

@@ -1340,7 +1340,7 @@ public class Plot {
for (Plot current : getConnectedPlots()) {
List<PlotPlayer<?>> players = current.getPlayersInPlot();
for (PlotPlayer<?> pp : players) {
this.plotListener.plotExit(pp, current, null, area);
this.plotListener.plotExit(pp, current);
}
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, Plot.this, area);
this.plotListener.plotExit(pp, Plot.this);
this.plotListener.plotEntry(pp, Plot.this);
}
}, TaskTime.ticks(1L));

View File

@@ -204,9 +204,6 @@ 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);
@@ -256,23 +253,7 @@ public final class PlaceholderRegistry {
final @NonNull String key,
final @NonNull BiFunction<PlotPlayer<?>, Plot, String> placeholderFunction
) {
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<PlotPlayer<?>, Plot, String> placeholderFunction,
final boolean requireAbsolute
) {
this.registerPlaceholder(new PlotSpecificPlaceholder(key, requireAbsolute) {
this.registerPlaceholder(new PlotSpecificPlaceholder(key) {
@Override
public @NonNull String getValue(final @NonNull PlotPlayer<?> player, final @NonNull Plot plot) {
return placeholderFunction.apply(player, plot);

View File

@@ -27,28 +27,14 @@ 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 = requireAbsolute ? player.getLocation().getPlotAbs() : player.getCurrentPlot();
final Plot plot = player.getCurrentPlot();
if (plot == null) {
return "";
}

View File

@@ -20,7 +20,7 @@ plugins {
}
group = "com.intellectualsites.plotsquared"
version = "7.5.11"
version = "7.5.9-SNAPSHOT"
if (!File("$rootDir/.git").exists()) {
logger.lifecycle("""
@@ -73,8 +73,8 @@ subprojects {
dependencies {
// Tests
testImplementation("org.junit.jupiter:junit-jupiter:6.0.1")
testRuntimeOnly("org.junit.platform:junit-platform-launcher:6.0.1")
testImplementation("org.junit.jupiter:junit-jupiter:6.0.0")
testRuntimeOnly("org.junit.platform:junit-platform-launcher:6.0.0")
}
plugins.withId("java") {
@@ -231,10 +231,9 @@ tasks {
register<RunServer>("runServer-$it") {
dependsOn(getByName("cacheLatestFaweArtifact"))
minecraftVersion(it)
pluginJars(project.files(
project(":plotsquared-bukkit").tasks.named<Jar>("shadowJar")
.map { it.archiveFile }
))
pluginJars(*project(":plotsquared-bukkit").getTasksByName("shadowJar", false)
.map { task -> (task as Jar).archiveFile }
.toTypedArray())
jvmArgs("-DPaper.IgnoreJavaVersion=true", "-Dcom.mojang.eula.agree=true")
downloadPlugins {
url("https://ci.athion.net/job/FastAsyncWorldEdit/lastSuccessfulBuild/artifact/artifacts/${project.ext["faweArtifact"]}")

View File

@@ -2,19 +2,19 @@
# Platform expectations
paper = "1.20.4-R0.1-SNAPSHOT"
guice = "7.0.0"
spotbugs = "4.9.8"
checkerqual = "3.52.1"
spotbugs = "4.9.6"
checkerqual = "3.51.1"
gson = "2.10"
guava = "31.1-jre"
snakeyaml = "2.0"
adventure = "4.26.1"
adventure = "4.25.0"
adventure-bukkit = "4.4.1"
log4j = "2.19.0"
# Plugins
worldedit = "7.2.20"
fawe = "2.14.3"
placeholderapi = "2.11.7"
fawe = "2.13.2"
placeholderapi = "2.11.6"
luckperms = "5.5"
essentialsx = "2.21.2"
mvdwapi = "3.1.1"
@@ -33,10 +33,10 @@ vault = "1.7.1"
serverlib = "2.3.7"
# Gradle plugins
shadow = "9.3.0"
shadow = "9.2.2"
grgit = "4.1.1"
spotless = "8.1.0"
publish = "0.35.0"
spotless = "8.0.0"
publish = "0.34.0"
runPaper = "3.0.2"
[libraries]

Binary file not shown.

View File

@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME