diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
index eec8fb34..dbd3df1b
--- a/.gitignore
+++ b/.gitignore
@@ -133,4 +133,13 @@ $RECYCLE.BIN/
# End of https://www.gitignore.io/api/java,windows,intellij
# Claude Code documentation (local development only)
-CLAUDE.md
\ No newline at end of file
+CLAUDE.md
+
+# Maven build output
+target/
+
+# Folia notes (local only)
+FOLIA_COMPATIBILITY.md
+
+# Generated by maven-shade-plugin on every package
+dependency-reduced-pom.xml
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
old mode 100644
new mode 100755
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
old mode 100644
new mode 100755
diff --git a/.idea/misc.xml b/.idea/misc.xml
old mode 100644
new mode 100755
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
old mode 100644
new mode 100755
diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
old mode 100644
new mode 100755
diff --git a/CODE_FLOW.md b/CODE_FLOW.md
old mode 100644
new mode 100755
diff --git a/LICENSE b/LICENSE
old mode 100644
new mode 100755
diff --git a/README.md b/README.md
old mode 100644
new mode 100755
index 5b37ee60..6e07fd12
--- a/README.md
+++ b/README.md
@@ -2,7 +2,28 @@
+## ⚡ Folia Compatible
+This fork adds **full Folia support** for multi-threaded servers while maintaining complete backward compatibility with Bukkit/Spigot/Paper.
+
+Scheduling goes through `SchedulerAdapter`, which picks Folia's region schedulers when it detects Folia
+and the normal `BukkitScheduler` everywhere else.
+
+---
+
+## Supported Versions
+
+Runs on Bukkit/Spigot/Paper/Folia from 1.13.2 through the year based drops: **26.1, 26.1.1, 26.1.2 and 26.2**.
+Minecraft dropped the leading `1.` in 2026, so the drop after 1.21.11 is 26.1, not 1.26.1.
+
+Builds against `spigot-api 26.2` and Java 21. `plugin.yml` keeps `api-version: 1.21` on purpose: it is a
+minimum, not a target, so the same jar still loads on 1.21 servers. To build against an older drop:
+
+```
+mvn -Dspigot.version=26.1-R0.1-SNAPSHOT clean package
+```
+
+---
SignShop allows you to set up physical shops by punching a chest with your items you want to sell, then punching a sign (while holding redstone dust). It's easy to set up, and even easier to customize!
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
index ed982a79..04e92705
--- a/pom.xml
+++ b/pom.xml
@@ -6,12 +6,15 @@
org.wargamer2010SignShop
- 5.2.0
+ 5.2.32121UTF-8
+
+ 26.2-R0.1-SNAPSHOT
@@ -55,114 +58,143 @@
org.spigotmcspigot-api
- 1.21-R0.1-SNAPSHOT
+ ${spigot.version}providedorg.jetbrainsannotations-java5
- 24.0.1
+ 24.1.0providedcom.github.MilkBowlVaultAPI
- 1.7
+ 1.7.1providedcom.github.GriefPreventionGriefPrevention
- 16.18.4
+ 18.0.0providedcom.sk89q.worldguardworldguard-bukkit
- 7.0.0
+ 7.0.18providedcom.sk89q.worldeditworldedit-bukkit
- 7.1.0
+ 7.4.5providedcom.palmergames.bukkit.townytowny
- 0.100.3.0
+ 0.103.2.0
+ provided
+
+
+
+ net.kyori
+ adventure-api
+ 4.26.1providedworld.bentoboxbentobox
- 2.4.1-SNAPSHOT
+ 2.7.0provided
- com.bekvon.bukkit
- residence
- 4.8.8.2
+ com.github.Zrips
+ Residence
+ 6.0.2.3provided
+ true
- com.earth2me
- essentials
- 2.22.0
+ net.essentialsx
+ EssentialsX
+ 2.21.2provided
+ trueus.dynmapDynmapCoreAPI
- 3.7-beta-6
+ 3.8provided
+ trueorg.xerialsqlite-jdbc
- 3.25.2
+ 3.53.2.1provided
- com.Zrips
+ com.github.ZripsCMI-API
- 9.7.14.3
+ 9.8.6.4provided
+ truecom.griefcraft.lwcLWCX2.2.5provided
+ truenl.rutgerkokblocklocker
- 1.7
+ 1.13provided
+ truecom.github.angeschossenLandsAPI
- 4.9.4
+ 7.25.4providedorg.bstatsbstats-bukkit
- 3.0.0
+ 3.2.1compilecom.google.code.gsongson
- 2.10.1
+ 2.14.0provided
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.11.0
+
+ 21
+ 21
+
+
+ **/hooks/LWCHook.java
+
+
+ org.apache.maven.pluginsmaven-jar-plugin
diff --git a/signshopheader.png b/signshopheader.png
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/essentials/SetExpFix.java b/src/main/java/org/wargamer2010/essentials/SetExpFix.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/Seller.java b/src/main/java/org/wargamer2010/signshop/Seller.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/SignShop.java b/src/main/java/org/wargamer2010/signshop/SignShop.java
old mode 100644
new mode 100755
index 83c53918..1d4628f6
--- a/src/main/java/org/wargamer2010/signshop/SignShop.java
+++ b/src/main/java/org/wargamer2010/signshop/SignShop.java
@@ -7,6 +7,7 @@
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.event.Event;
+import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
@@ -273,11 +274,11 @@ public void onEnable() {
}
//Setup worth
if (getSignShopConfig().getEnablePriceFromWorth()) {
- if (Bukkit.getServer().getPluginManager().getPlugin("CMI") != null && Bukkit.getServer().getPluginManager().getPlugin("CMI").isEnabled()) {
+ if (isPluginRunning("CMI")) {
worthHandler = new CMIWorthHandler();
log("Using worth information from CMI.", Level.INFO);
}
- else if (Bukkit.getServer().getPluginManager().getPlugin("Essentials") != null && Bukkit.getServer().getPluginManager().getPlugin("Essentials").isEnabled()) {
+ else if (isPluginRunning("Essentials")) {
worthHandler = new EssentialsWorthHandler();
log("Using worth information from Essentials.", Level.INFO);
}
@@ -309,6 +310,11 @@ else if (Bukkit.getServer().getPluginManager().getPlugin("Essentials") != null &
log("v" + pdfFile.getVersion() + " Enabled", Level.INFO);
}
+ private static boolean isPluginRunning(String name) {
+ Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin(name);
+ return plugin != null && plugin.isEnabled();
+ }
+
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String commandLabel, @NotNull String[] args) {
String commandName = cmd.getName().toLowerCase();
diff --git a/src/main/java/org/wargamer2010/signshop/Vault.java b/src/main/java/org/wargamer2010/signshop/Vault.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/api/Reloadable.java b/src/main/java/org/wargamer2010/signshop/api/Reloadable.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/commands/CommandDispatcher.java b/src/main/java/org/wargamer2010/signshop/commands/CommandDispatcher.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/commands/HelpHandler.java b/src/main/java/org/wargamer2010/signshop/commands/HelpHandler.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/commands/ICommandHandler.java b/src/main/java/org/wargamer2010/signshop/commands/ICommandHandler.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/commands/IgnoreHandler.java b/src/main/java/org/wargamer2010/signshop/commands/IgnoreHandler.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/commands/ReloadHandler.java b/src/main/java/org/wargamer2010/signshop/commands/ReloadHandler.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/commands/StatsHandler.java b/src/main/java/org/wargamer2010/signshop/commands/StatsHandler.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/commands/TutorialHandler.java b/src/main/java/org/wargamer2010/signshop/commands/TutorialHandler.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/commands/UnlinkHandler.java b/src/main/java/org/wargamer2010/signshop/commands/UnlinkHandler.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/configuration/ColorUtil.java b/src/main/java/org/wargamer2010/signshop/configuration/ColorUtil.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/configuration/FileSaveWorker.java b/src/main/java/org/wargamer2010/signshop/configuration/FileSaveWorker.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/configuration/LinkableMaterial.java b/src/main/java/org/wargamer2010/signshop/configuration/LinkableMaterial.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/configuration/SignShopConfig.java b/src/main/java/org/wargamer2010/signshop/configuration/SignShopConfig.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/configuration/configUtil.java b/src/main/java/org/wargamer2010/signshop/configuration/configUtil.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/data/BookFactory.java b/src/main/java/org/wargamer2010/signshop/data/BookFactory.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/data/BookItem.java b/src/main/java/org/wargamer2010/signshop/data/BookItem.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/data/IBookItem.java b/src/main/java/org/wargamer2010/signshop/data/IBookItem.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/data/IItemTags.java b/src/main/java/org/wargamer2010/signshop/data/IItemTags.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/data/ItemTags.java b/src/main/java/org/wargamer2010/signshop/data/ItemTags.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/data/LegacyBookItem.java b/src/main/java/org/wargamer2010/signshop/data/LegacyBookItem.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/data/SSDatabase.java b/src/main/java/org/wargamer2010/signshop/data/SSDatabase.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/data/SignShopBooks.java b/src/main/java/org/wargamer2010/signshop/data/SignShopBooks.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/data/SignShopItemMeta.java b/src/main/java/org/wargamer2010/signshop/data/SignShopItemMeta.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/data/Storage.java b/src/main/java/org/wargamer2010/signshop/data/Storage.java
old mode 100644
new mode 100755
index e0cbdd82..49b1ec8d
--- a/src/main/java/org/wargamer2010/signshop/data/Storage.java
+++ b/src/main/java/org/wargamer2010/signshop/data/Storage.java
@@ -128,7 +128,9 @@ public static Storage init(File ymlFile) {
public static void dispose() {
instance = null;
- fileSaveWorker.stop();
+ if (fileSaveWorker != null) {
+ fileSaveWorker.stop();
+ }
}
public static Storage get() {
@@ -225,8 +227,12 @@ private boolean loadSellerFromSettings(String key, HashMap>
throw storageEx;
}
if(!itemUtil.clickedSign(seller_sign)) {
- storageEx.setReason(StorageExceptionReason.SIGN_LOCATION_NOT_ACTUALLY_SIGN);
- throw storageEx;
+ // On Folia, block checks during startup may fail due to threading
+ // Log a warning but continue loading - shop will be validated on first use
+ SignShop.log("Could not validate sign at " + seller_sign.getLocation() + " during startup (may be Folia threading issue). Will validate on first use.", java.util.logging.Level.WARNING);
+ // Don't throw exception - allow shop to load and be validated later
+ // storageEx.setReason(StorageExceptionReason.SIGN_LOCATION_NOT_ACTUALLY_SIGN);
+ // throw storageEx;
}
seller_activatables = signshopUtil.getBlocksFromLocStringList(getSetting(sellerSettings, "activatables"), world);
seller_containables = signshopUtil.getBlocksFromLocStringList(getSetting(sellerSettings, "containables"), world);
diff --git a/src/main/java/org/wargamer2010/signshop/data/serialization/BukkitSerialization.java b/src/main/java/org/wargamer2010/signshop/data/serialization/BukkitSerialization.java
old mode 100644
new mode 100755
index 9f209dc2..3b1c6f37
--- a/src/main/java/org/wargamer2010/signshop/data/serialization/BukkitSerialization.java
+++ b/src/main/java/org/wargamer2010/signshop/data/serialization/BukkitSerialization.java
@@ -6,11 +6,11 @@
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.util.io.BukkitObjectInputStream;
import org.bukkit.util.io.BukkitObjectOutputStream;
-import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.util.Base64;
/**
* Legacy Java object serialization for ItemStacks.
@@ -23,10 +23,29 @@
* @see ItemSerializer
*/
public class BukkitSerialization {
+ /**
+ * SnakeYAML 2.6 (shipped with Minecraft 26.1 and up) dropped its bundled Base64Coder,
+ * so we encode ourselves. Same layout as before: 76 character lines separated by the
+ * platform line ending, and a lenient decoder so shops written by older builds
+ * (or on Windows, with CRLF) still load.
+ */
+ private static final Base64.Encoder ENCODER =
+ Base64.getMimeEncoder(76, System.lineSeparator().getBytes());
+ private static final Base64.Decoder DECODER = Base64.getMimeDecoder();
+
private BukkitSerialization() {
}
+ /**
+ * Base64 encodes the given bytes the way snakeyaml used to: 76 character lines, and a line
+ * break after the last one as well, so re-saving a shop leaves the file byte for byte the same.
+ */
+ private static String encodeBase64(byte[] data) {
+ String encoded = ENCODER.encodeToString(data);
+ return encoded.isEmpty() ? encoded : encoded + System.lineSeparator();
+ }
+
/**
* Converts the player inventory to a String array of Base64 strings. First string is the content and second string is the armor.
*
@@ -68,7 +87,7 @@ public static String itemStackArrayToBase64(ItemStack[] items) throws IllegalSta
// Serialize that array
dataOutput.close();
- return Base64Coder.encodeLines(outputStream.toByteArray());
+ return encodeBase64(outputStream.toByteArray());
} catch (Exception e) {
throw new IllegalStateException("Unable to save item stacks.", e);
}
@@ -99,7 +118,7 @@ public static String toBase64(Inventory inventory) throws IllegalStateException
// Serialize that array
dataOutput.close();
- return Base64Coder.encodeLines(outputStream.toByteArray());
+ return encodeBase64(outputStream.toByteArray());
} catch (Exception e) {
throw new IllegalStateException("Unable to save item stacks.", e);
}
@@ -117,7 +136,7 @@ public static String toBase64(Inventory inventory) throws IllegalStateException
*/
public static Inventory fromBase64(String data) throws IOException {
try {
- ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data));
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(DECODER.decode(data));
BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream);
Inventory inventory = Bukkit.getServer().createInventory(null, dataInput.readInt());
@@ -142,7 +161,7 @@ public static Inventory fromBase64(String data) throws IOException {
*/
public static ItemStack[] itemStackArrayFromBase64(String data) throws IOException {
try {
- ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data));
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(DECODER.decode(data));
BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream);
ItemStack[] items = new ItemStack[dataInput.readInt()];
diff --git a/src/main/java/org/wargamer2010/signshop/data/serialization/ItemSerializer.java b/src/main/java/org/wargamer2010/signshop/data/serialization/ItemSerializer.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/IMessagePartContainer.java b/src/main/java/org/wargamer2010/signshop/events/IMessagePartContainer.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/IOperationEvent.java b/src/main/java/org/wargamer2010/signshop/events/IOperationEvent.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/SSCreatedEvent.java b/src/main/java/org/wargamer2010/signshop/events/SSCreatedEvent.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/SSDestroyedEvent.java b/src/main/java/org/wargamer2010/signshop/events/SSDestroyedEvent.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/SSDestroyedEventType.java b/src/main/java/org/wargamer2010/signshop/events/SSDestroyedEventType.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/SSEvent.java b/src/main/java/org/wargamer2010/signshop/events/SSEvent.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/SSEventFactory.java b/src/main/java/org/wargamer2010/signshop/events/SSEventFactory.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/SSExpiredEvent.java b/src/main/java/org/wargamer2010/signshop/events/SSExpiredEvent.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/SSLinkEvent.java b/src/main/java/org/wargamer2010/signshop/events/SSLinkEvent.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/SSMoneyEventType.java b/src/main/java/org/wargamer2010/signshop/events/SSMoneyEventType.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/SSMoneyRequestType.java b/src/main/java/org/wargamer2010/signshop/events/SSMoneyRequestType.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/SSMoneyTransactionEvent.java b/src/main/java/org/wargamer2010/signshop/events/SSMoneyTransactionEvent.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/SSPostTransactionEvent.java b/src/main/java/org/wargamer2010/signshop/events/SSPostTransactionEvent.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/SSPreTransactionEvent.java b/src/main/java/org/wargamer2010/signshop/events/SSPreTransactionEvent.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/events/SSTouchShopEvent.java b/src/main/java/org/wargamer2010/signshop/events/SSTouchShopEvent.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/hooks/BentoBoxHook.java b/src/main/java/org/wargamer2010/signshop/hooks/BentoBoxHook.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/hooks/BlockLockerHook.java b/src/main/java/org/wargamer2010/signshop/hooks/BlockLockerHook.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/hooks/GriefPreventionHook.java b/src/main/java/org/wargamer2010/signshop/hooks/GriefPreventionHook.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/hooks/Hook.java b/src/main/java/org/wargamer2010/signshop/hooks/Hook.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/hooks/HookManager.java b/src/main/java/org/wargamer2010/signshop/hooks/HookManager.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/hooks/LWCHook.java b/src/main/java/org/wargamer2010/signshop/hooks/LWCHook.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/hooks/LandsHook.java b/src/main/java/org/wargamer2010/signshop/hooks/LandsHook.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/hooks/ResidenceHook.java b/src/main/java/org/wargamer2010/signshop/hooks/ResidenceHook.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/hooks/TownyHook.java b/src/main/java/org/wargamer2010/signshop/hooks/TownyHook.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/hooks/WorldGuardHook.java b/src/main/java/org/wargamer2010/signshop/hooks/WorldGuardHook.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/incompatibility/IncompatibilityChecker.java b/src/main/java/org/wargamer2010/signshop/incompatibility/IncompatibilityChecker.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/incompatibility/IncompatibilityDetector.java b/src/main/java/org/wargamer2010/signshop/incompatibility/IncompatibilityDetector.java
old mode 100644
new mode 100755
index 199dd74e..190a1da5
--- a/src/main/java/org/wargamer2010/signshop/incompatibility/IncompatibilityDetector.java
+++ b/src/main/java/org/wargamer2010/signshop/incompatibility/IncompatibilityDetector.java
@@ -31,8 +31,7 @@
*
* {@literal @}Override
* public boolean isRelevantForCurrentVersion() {
- * String version = Bukkit.getVersion();
- * return version.contains("1.21.10") || version.contains("1.21.1");
+ * return versionUtil.isAtLeast("1.21.10");
* }
*
* {@literal @}Override
@@ -70,12 +69,16 @@ public interface IncompatibilityDetector {
*
This allows detectors to be automatically disabled if running on a Spigot
* version where the incompatibility doesn't exist (e.g., if Spigot fixes the bug).
*
+ *
Compare with {@link org.wargamer2010.signshop.util.versionUtil#isAtLeast(String)} instead
+ * of matching on the version string. Minecraft switched from 1.x to a year based scheme
+ * (26.1, 26.1.1, 26.1.2, 26.2, ...), so a check like {@code version.contains("1.21")} quietly
+ * stops matching on newer servers.
+ *
*
Example:
*
* public boolean isRelevantForCurrentVersion() {
- * String version = Bukkit.getVersion();
- * // Only relevant for Spigot 1.21.10 through 1.21.19
- * return version.contains("1.21.1") && !version.contains("1.21.2");
+ * // 1.21.10 up to, but not including, 26.2
+ * return versionUtil.isAtLeast("1.21.10") {@literal &&} !versionUtil.isAtLeast("26.2");
* }
*
Still present on the year based releases (26.1, 26.1.1, 26.1.2, 26.2).
+ *
*
Detection Method:
*
*
Check if item is a PLAYER_HEAD
@@ -52,20 +54,12 @@
*/
public class PlayerHeadIncompatibilityDetector implements IncompatibilityDetector {
- // ========================================
- // Version Constants
- // ========================================
-
/** First Spigot version with stricter validation */
private static final String FIRST_AFFECTED_VERSION = "1.21.10";
/** Version where this was fixed (null = not fixed yet) */
private static final String FIXED_IN_VERSION = null;
- // ========================================
- // Detection Logic
- // ========================================
-
/**
* Detects if a player head has an empty name field.
*
@@ -130,37 +124,21 @@ public IncompatibilityType detect(ItemStack item) {
return null;
}
- // ========================================
- // Version Checking
- // ========================================
-
/**
* Checks if this incompatibility affects the current Spigot version.
*
- *
Logic:
- *
- *
Check if version contains "1.21.1" (covers 1.21.10 through 1.21.19)
- *
Or check if version contains "1.21.2" or higher
- *
Returns false if fixed version is known and current version is >= fixed version
- *
+ *
Affects 1.21.10 and everything after it, which includes the year based
+ * releases (26.1 and up) since those sort above every 1.x version.
*
* @return true if current Spigot version is affected by this incompatibility
*/
@Override
public boolean isRelevantForCurrentVersion() {
- String version = Bukkit.getVersion();
-
- // If there's a known fix version, check if we're past it
- if (FIXED_IN_VERSION != null && isVersionGreaterOrEqual(version)) {
+ if (FIXED_IN_VERSION != null && versionUtil.isAtLeast(FIXED_IN_VERSION)) {
return false; // Issue is fixed in this version
}
- // Check if we're on an affected version (1.21.10+)
- // This is a simplified check - in production you'd want proper version parsing
- return version.contains("1.21.1") || // 1.21.10-1.21.19
- version.contains("1.21.2") || // 1.21.20+
- version.contains("1.22") || // Future versions
- version.contains("1.23"); // Future versions
+ return versionUtil.isAtLeast(FIRST_AFFECTED_VERSION);
}
/**
@@ -173,48 +151,6 @@ public String getFixedInVersion() {
return FIXED_IN_VERSION;
}
- // ========================================
- // Helper Methods
- // ========================================
-
- /**
- * Simplified version comparison.
- *
- *
NOTE: This is a basic implementation. For production use, consider
- * a more robust version comparison library.
- *
- * @param current Current version string
- * @return true if current >= target
- */
- private boolean isVersionGreaterOrEqual(String current) {
- // Extract version numbers (simplified - doesn't handle all edge cases)
- try {
- String currentClean = current.replaceAll("[^0-9.]", "");
- String targetClean = PlayerHeadIncompatibilityDetector.FIXED_IN_VERSION.replaceAll("[^0-9.]", "");
-
- String[] currentParts = currentClean.split("\\.");
- String[] targetParts = targetClean.split("\\.");
-
- int maxLength = Math.max(currentParts.length, targetParts.length);
-
- for (int i = 0; i < maxLength; i++) {
- int currentPart = i < currentParts.length ?
- Integer.parseInt(currentParts[i]) : 0;
- int targetPart = i < targetParts.length ?
- Integer.parseInt(targetParts[i]) : 0;
-
- if (currentPart > targetPart) return true;
- if (currentPart < targetPart) return false;
- }
-
- return true; // Equal
-
- } catch (NumberFormatException e) {
- // If parsing fails, assume version is relevant (safer)
- return false;
- }
- }
-
/**
* Logs debug messages when debugging is enabled.
*
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/EssentialsHelper.java b/src/main/java/org/wargamer2010/signshop/listeners/EssentialsHelper.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/ServerLoadedListener.java b/src/main/java/org/wargamer2010/signshop/listeners/ServerLoadedListener.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/SignShopBlockListener.java b/src/main/java/org/wargamer2010/signshop/listeners/SignShopBlockListener.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/SignShopLoginListener.java b/src/main/java/org/wargamer2010/signshop/listeners/SignShopLoginListener.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/SignShopPlayerListener.java b/src/main/java/org/wargamer2010/signshop/listeners/SignShopPlayerListener.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/SignShopServerListener.java b/src/main/java/org/wargamer2010/signshop/listeners/SignShopServerListener.java
old mode 100644
new mode 100755
index 4c49a12b..7a55cdcb
--- a/src/main/java/org/wargamer2010/signshop/listeners/SignShopServerListener.java
+++ b/src/main/java/org/wargamer2010/signshop/listeners/SignShopServerListener.java
@@ -21,14 +21,14 @@ public SignShopServerListener(Server pServer) {
}
public static boolean isEssentialsConflictFound() {
- if(Bukkit.getServer().getPluginManager().getPlugin(pluginName) != null)
+ if (Bukkit.getServer().getPluginManager().getPlugin(pluginName) != null)
return EssentialsHelper.isEssentialsConflictFound();
return false;
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPluginEnabled(PluginEnableEvent event) {
- if(event.getPlugin().getName().equals(pluginName))
+ if (event.getPlugin().getName().equals(pluginName))
setupPluginToHookInto();
}
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/BankTransaction.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/BankTransaction.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/DefaultMoneyTransaction.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/DefaultMoneyTransaction.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/DynmapManager.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/DynmapManager.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/GetPriceFromWorth.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/GetPriceFromWorth.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/MoneyModifierListener.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/MoneyModifierListener.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/PermissionChecker.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/PermissionChecker.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/PermitChecker.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/PermitChecker.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SharedMoneyTransaction.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SharedMoneyTransaction.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/ShopCooldown.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/ShopCooldown.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/ShopUpdater.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/ShopUpdater.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SignSidesValidator.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SignSidesValidator.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SimpleBlacklister.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SimpleBlacklister.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SimpleBlockProtector.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SimpleBlockProtector.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SimpleMessenger.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SimpleMessenger.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SimpleRestricter.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SimpleRestricter.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SimpleShopLimiter.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SimpleShopLimiter.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SimpleShopProtector.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/SimpleShopProtector.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/StockChecker.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/StockChecker.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/TimedCommandListener.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/TimedCommandListener.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/TownyChecker.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/TownyChecker.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/WorldGuardChecker.java b/src/main/java/org/wargamer2010/signshop/listeners/sslisteners/WorldGuardChecker.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/money/IMoneyModifier.java b/src/main/java/org/wargamer2010/signshop/money/IMoneyModifier.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/money/MoneyModifierManager.java b/src/main/java/org/wargamer2010/signshop/money/MoneyModifierManager.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/money/PlayerPriceModifier.java b/src/main/java/org/wargamer2010/signshop/money/PlayerPriceModifier.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/money/RoundPriceModifier.java b/src/main/java/org/wargamer2010/signshop/money/RoundPriceModifier.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/BankSign.java b/src/main/java/org/wargamer2010/signshop/operations/BankSign.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/Chest.java b/src/main/java/org/wargamer2010/signshop/operations/Chest.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/OnExpiration.java b/src/main/java/org/wargamer2010/signshop/operations/OnExpiration.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/RandomItem.java b/src/main/java/org/wargamer2010/signshop/operations/RandomItem.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/Reset.java b/src/main/java/org/wargamer2010/signshop/operations/Reset.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/RestrictedSign.java b/src/main/java/org/wargamer2010/signshop/operations/RestrictedSign.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/ShareSign.java b/src/main/java/org/wargamer2010/signshop/operations/ShareSign.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/SignShopArgument.java b/src/main/java/org/wargamer2010/signshop/operations/SignShopArgument.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/SignShopArguments.java b/src/main/java/org/wargamer2010/signshop/operations/SignShopArguments.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/SignShopArgumentsType.java b/src/main/java/org/wargamer2010/signshop/operations/SignShopArgumentsType.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/SignShopEventHandler.java b/src/main/java/org/wargamer2010/signshop/operations/SignShopEventHandler.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/SignShopOperation.java b/src/main/java/org/wargamer2010/signshop/operations/SignShopOperation.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/SignShopOperationListItem.java b/src/main/java/org/wargamer2010/signshop/operations/SignShopOperationListItem.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/cooldown.java b/src/main/java/org/wargamer2010/signshop/operations/cooldown.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/disenchantItemInHand.java b/src/main/java/org/wargamer2010/signshop/operations/disenchantItemInHand.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/enchantItemInHand.java b/src/main/java/org/wargamer2010/signshop/operations/enchantItemInHand.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/giveOwnerMoney.java b/src/main/java/org/wargamer2010/signshop/operations/giveOwnerMoney.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/givePlayerItems.java b/src/main/java/org/wargamer2010/signshop/operations/givePlayerItems.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/givePlayerMoney.java b/src/main/java/org/wargamer2010/signshop/operations/givePlayerMoney.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/givePlayerXP.java b/src/main/java/org/wargamer2010/signshop/operations/givePlayerXP.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/giveShopItems.java b/src/main/java/org/wargamer2010/signshop/operations/giveShopItems.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/giveTownMoney.java b/src/main/java/org/wargamer2010/signshop/operations/giveTownMoney.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/healPlayer.java b/src/main/java/org/wargamer2010/signshop/operations/healPlayer.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/oneTime.java b/src/main/java/org/wargamer2010/signshop/operations/oneTime.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/playJukebox.java b/src/main/java/org/wargamer2010/signshop/operations/playJukebox.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/playerIsOp.java b/src/main/java/org/wargamer2010/signshop/operations/playerIsOp.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/promotePlayer.java b/src/main/java/org/wargamer2010/signshop/operations/promotePlayer.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/repairPlayerHeldItem.java b/src/main/java/org/wargamer2010/signshop/operations/repairPlayerHeldItem.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/resetOneTime.java b/src/main/java/org/wargamer2010/signshop/operations/resetOneTime.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/runCommand.java b/src/main/java/org/wargamer2010/signshop/operations/runCommand.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/runTimedCommand.java b/src/main/java/org/wargamer2010/signshop/operations/runTimedCommand.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/setClearSkies.java b/src/main/java/org/wargamer2010/signshop/operations/setClearSkies.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/setDayTime.java b/src/main/java/org/wargamer2010/signshop/operations/setDayTime.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/setNightTime.java b/src/main/java/org/wargamer2010/signshop/operations/setNightTime.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/setRaining.java b/src/main/java/org/wargamer2010/signshop/operations/setRaining.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/setRedStoneOnTemp.java b/src/main/java/org/wargamer2010/signshop/operations/setRedStoneOnTemp.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/setRedstoneOff.java b/src/main/java/org/wargamer2010/signshop/operations/setRedstoneOff.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/setRedstoneOn.java b/src/main/java/org/wargamer2010/signshop/operations/setRedstoneOn.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/takeItemInHand.java b/src/main/java/org/wargamer2010/signshop/operations/takeItemInHand.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/takeOwnerMoney.java b/src/main/java/org/wargamer2010/signshop/operations/takeOwnerMoney.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/takePlayerInventory.java b/src/main/java/org/wargamer2010/signshop/operations/takePlayerInventory.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/takePlayerItems.java b/src/main/java/org/wargamer2010/signshop/operations/takePlayerItems.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/takePlayerMoney.java b/src/main/java/org/wargamer2010/signshop/operations/takePlayerMoney.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/takePlayerXP.java b/src/main/java/org/wargamer2010/signshop/operations/takePlayerXP.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/takeShopItems.java b/src/main/java/org/wargamer2010/signshop/operations/takeShopItems.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/takeTownMoney.java b/src/main/java/org/wargamer2010/signshop/operations/takeTownMoney.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/takeVariablePlayerItems.java b/src/main/java/org/wargamer2010/signshop/operations/takeVariablePlayerItems.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/operations/toggleRedstone.java b/src/main/java/org/wargamer2010/signshop/operations/toggleRedstone.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/player/MessageWorker.java b/src/main/java/org/wargamer2010/signshop/player/MessageWorker.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/player/PlayerCache.java b/src/main/java/org/wargamer2010/signshop/player/PlayerCache.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/player/PlayerIdentifier.java b/src/main/java/org/wargamer2010/signshop/player/PlayerIdentifier.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/player/PlayerMetadata.java b/src/main/java/org/wargamer2010/signshop/player/PlayerMetadata.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/player/SignShopPlayer.java b/src/main/java/org/wargamer2010/signshop/player/SignShopPlayer.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/player/VirtualInventory.java b/src/main/java/org/wargamer2010/signshop/player/VirtualInventory.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/scheduling/FoliaDetector.java b/src/main/java/org/wargamer2010/signshop/scheduling/FoliaDetector.java
old mode 100644
new mode 100755
diff --git a/src/main/java/org/wargamer2010/signshop/scheduling/SchedulerAdapter.java b/src/main/java/org/wargamer2010/signshop/scheduling/SchedulerAdapter.java
old mode 100644
new mode 100755
index 195c5b5c..2e6d817b
--- a/src/main/java/org/wargamer2010/signshop/scheduling/SchedulerAdapter.java
+++ b/src/main/java/org/wargamer2010/signshop/scheduling/SchedulerAdapter.java
@@ -9,6 +9,7 @@
import java.lang.reflect.Method;
import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
/**
* Scheduler abstraction supporting both standard Bukkit and Folia region-based scheduling.
@@ -39,23 +40,68 @@ public SchedulerAdapter(Plugin plugin) {
private void initializeFoliaReflection() {
try {
+ plugin.getLogger().info("[Folia] Initializing Folia scheduler reflection...");
+
Class> serverClass = Bukkit.getServer().getClass();
+ plugin.getLogger().info("[Folia] Server class: " + serverClass.getName());
+
+ plugin.getLogger().info("[Folia] Getting scheduler methods from Server...");
getRegionSchedulerMethod = serverClass.getMethod("getRegionScheduler");
+ plugin.getLogger().info("[Folia] ✓ getRegionScheduler()");
+
getGlobalRegionSchedulerMethod = serverClass.getMethod("getGlobalRegionScheduler");
+ plugin.getLogger().info("[Folia] ✓ getGlobalRegionScheduler()");
+
getAsyncSchedulerMethod = serverClass.getMethod("getAsyncScheduler");
+ plugin.getLogger().info("[Folia] ✓ getAsyncScheduler()");
+ plugin.getLogger().info("[Folia] Loading RegionScheduler class...");
Class> regionSchedulerClass = Class.forName("io.papermc.paper.threadedregions.scheduler.RegionScheduler");
- runMethod = regionSchedulerClass.getMethod("run", Plugin.class, Location.class, Runnable.class);
- runDelayedMethod = regionSchedulerClass.getMethod("runDelayed", Plugin.class, Location.class, Runnable.class, long.class);
+ plugin.getLogger().info("[Folia] ✓ RegionScheduler loaded");
+ plugin.getLogger().info("[Folia] Getting RegionScheduler methods...");
+ // Folia uses Consumer instead of Runnable
+ runMethod = regionSchedulerClass.getMethod("run", Plugin.class, Location.class, Consumer.class);
+ plugin.getLogger().info("[Folia] ✓ run(Plugin, Location, Consumer)");
+
+ runDelayedMethod = regionSchedulerClass.getMethod("runDelayed", Plugin.class, Location.class, Consumer.class, long.class);
+ plugin.getLogger().info("[Folia] ✓ runDelayed(Plugin, Location, Consumer, long)");
+
+ plugin.getLogger().info("[Folia] Loading GlobalRegionScheduler class...");
Class> globalRegionSchedulerClass = Class.forName("io.papermc.paper.threadedregions.scheduler.GlobalRegionScheduler");
- runAtFixedRateMethod = globalRegionSchedulerClass.getMethod("runAtFixedRate", Plugin.class, Runnable.class, long.class, long.class);
+ plugin.getLogger().info("[Folia] ✓ GlobalRegionScheduler loaded");
+
+ plugin.getLogger().info("[Folia] Getting GlobalRegionScheduler methods...");
+ // Folia uses Consumer instead of Runnable
+ runAtFixedRateMethod = globalRegionSchedulerClass.getMethod("runAtFixedRate", Plugin.class, Consumer.class, long.class, long.class);
+ plugin.getLogger().info("[Folia] ✓ runAtFixedRate(Plugin, Consumer, long, long)");
+ plugin.getLogger().info("[Folia] Loading AsyncScheduler class...");
Class> asyncSchedulerClass = Class.forName("io.papermc.paper.threadedregions.scheduler.AsyncScheduler");
- runDelayedAsyncMethod = asyncSchedulerClass.getMethod("runDelayed", Plugin.class, Runnable.class, long.class, TimeUnit.class);
+ plugin.getLogger().info("[Folia] ✓ AsyncScheduler loaded");
- cancelTasksMethod = serverClass.getMethod("cancelTasks", Plugin.class);
+ plugin.getLogger().info("[Folia] Getting AsyncScheduler methods...");
+ // Folia uses Consumer instead of Runnable
+ runDelayedAsyncMethod = asyncSchedulerClass.getMethod("runDelayed", Plugin.class, Consumer.class, long.class, TimeUnit.class);
+ plugin.getLogger().info("[Folia] ✓ runDelayed(Plugin, Consumer, long, TimeUnit)");
+
+ plugin.getLogger().info("[Folia] Getting cancelTasks method...");
+ try {
+ cancelTasksMethod = serverClass.getMethod("cancelTasks", Plugin.class);
+ plugin.getLogger().info("[Folia] ✓ cancelTasks(Plugin)");
+ } catch (NoSuchMethodException e) {
+ plugin.getLogger().warning("[Folia] ⚠ cancelTasks(Plugin) not found - task cancellation will use alternative method");
+ cancelTasksMethod = null;
+ }
+
+ plugin.getLogger().info("[Folia] ✓ Folia reflection initialized successfully!");
} catch (Exception e) {
+ plugin.getLogger().severe("[Folia] ✗ Failed to initialize Folia reflection!");
+ plugin.getLogger().severe("[Folia] Error details: " + e.getClass().getName() + ": " + e.getMessage());
+ if (e.getCause() != null) {
+ plugin.getLogger().severe("[Folia] Caused by: " + e.getCause().getClass().getName() + ": " + e.getCause().getMessage());
+ }
+ e.printStackTrace();
throw new RuntimeException("Failed to initialize Folia reflection", e);
}
}
@@ -68,7 +114,9 @@ public void runAtLocation(Location location, Runnable task) {
if (isFolia) {
try {
Object regionScheduler = getRegionSchedulerMethod.invoke(Bukkit.getServer());
- runMethod.invoke(regionScheduler, plugin, location, task);
+ // Folia expects Consumer, wrap our Runnable
+ Consumer