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 @@ SignShop LOGO

+## ⚡ 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.wargamer2010 SignShop - 5.2.0 + 5.2.3 21 21 UTF-8 + + 26.2-R0.1-SNAPSHOT @@ -55,114 +58,143 @@ org.spigotmc spigot-api - 1.21-R0.1-SNAPSHOT + ${spigot.version} provided org.jetbrains annotations-java5 - 24.0.1 + 24.1.0 provided com.github.MilkBowl VaultAPI - 1.7 + 1.7.1 provided com.github.GriefPrevention GriefPrevention - 16.18.4 + 18.0.0 provided com.sk89q.worldguard worldguard-bukkit - 7.0.0 + 7.0.18 provided com.sk89q.worldedit worldedit-bukkit - 7.1.0 + 7.4.5 provided com.palmergames.bukkit.towny towny - 0.100.3.0 + 0.103.2.0 + provided + + + + net.kyori + adventure-api + 4.26.1 provided world.bentobox bentobox - 2.4.1-SNAPSHOT + 2.7.0 provided - com.bekvon.bukkit - residence - 4.8.8.2 + com.github.Zrips + Residence + 6.0.2.3 provided + true - com.earth2me - essentials - 2.22.0 + net.essentialsx + EssentialsX + 2.21.2 provided + true us.dynmap DynmapCoreAPI - 3.7-beta-6 + 3.8 provided + true org.xerial sqlite-jdbc - 3.25.2 + 3.53.2.1 provided - com.Zrips + com.github.Zrips CMI-API - 9.7.14.3 + 9.8.6.4 provided + true com.griefcraft.lwc LWCX 2.2.5 provided + true nl.rutgerkok blocklocker - 1.7 + 1.13 provided + true com.github.angeschossen LandsAPI - 4.9.4 + 7.25.4 provided org.bstats bstats-bukkit - 3.0.0 + 3.2.1 compile com.google.code.gson gson - 2.10.1 + 2.14.0 provided + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 21 + 21 + + + **/hooks/LWCHook.java + + + org.apache.maven.plugins maven-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");
      * }
      * 
* diff --git a/src/main/java/org/wargamer2010/signshop/incompatibility/IncompatibilityType.java b/src/main/java/org/wargamer2010/signshop/incompatibility/IncompatibilityType.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/incompatibility/detectors/PlayerHeadIncompatibilityDetector.java b/src/main/java/org/wargamer2010/signshop/incompatibility/detectors/PlayerHeadIncompatibilityDetector.java old mode 100644 new mode 100755 index 9f4135e7..95a334bd --- a/src/main/java/org/wargamer2010/signshop/incompatibility/detectors/PlayerHeadIncompatibilityDetector.java +++ b/src/main/java/org/wargamer2010/signshop/incompatibility/detectors/PlayerHeadIncompatibilityDetector.java @@ -1,6 +1,5 @@ package org.wargamer2010.signshop.incompatibility.detectors; -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -8,6 +7,7 @@ import org.wargamer2010.signshop.SignShop; import org.wargamer2010.signshop.incompatibility.IncompatibilityDetector; import org.wargamer2010.signshop.incompatibility.IncompatibilityType; +import org.wargamer2010.signshop.util.versionUtil; import java.util.NoSuchElementException; @@ -31,6 +31,8 @@ * .get() // NPE! Optional is now empty * * + *

Still present on the year based releases (26.1, 26.1.1, 26.1.2, 26.2).

+ * *

Detection Method:

*
    *
  1. Check if item is a PLAYER_HEAD
  2. @@ -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 consumer = (scheduledTask) -> task.run(); + runMethod.invoke(regionScheduler, plugin, location, consumer); } catch (Exception e) { throw new RuntimeException("Failed to schedule Folia region task", e); } @@ -85,7 +133,9 @@ public void runAtLocationLater(Location location, Runnable task, long delayTicks if (isFolia) { try { Object regionScheduler = getRegionSchedulerMethod.invoke(Bukkit.getServer()); - runDelayedMethod.invoke(regionScheduler, plugin, location, task, delayTicks); + // Folia expects Consumer, wrap our Runnable + Consumer consumer = (scheduledTask) -> task.run(); + runDelayedMethod.invoke(regionScheduler, plugin, location, consumer, delayTicks); } catch (Exception e) { throw new RuntimeException("Failed to schedule delayed Folia region task", e); } @@ -134,7 +184,11 @@ public ScheduledTask runTimer(Runnable task, long delayTicks, long periodTicks) if (isFolia) { try { Object globalRegionScheduler = getGlobalRegionSchedulerMethod.invoke(Bukkit.getServer()); - Object foliaTask = runAtFixedRateMethod.invoke(globalRegionScheduler, plugin, task, delayTicks, periodTicks); + // Folia expects Consumer, wrap our Runnable + Consumer consumer = (scheduledTask) -> task.run(); + // Folia requires delay > 0, but Bukkit allows 0 + long foliaDelay = Math.max(1, delayTicks); + Object foliaTask = runAtFixedRateMethod.invoke(globalRegionScheduler, plugin, consumer, foliaDelay, periodTicks); return new FoliaScheduledTask(foliaTask); } catch (Exception e) { throw new RuntimeException("Failed to schedule Folia repeating task", e); @@ -153,7 +207,9 @@ public void runAsync(Runnable task) { if (isFolia) { try { Object asyncScheduler = getAsyncSchedulerMethod.invoke(Bukkit.getServer()); - runDelayedAsyncMethod.invoke(asyncScheduler, plugin, task, 0L, TimeUnit.MILLISECONDS); + // Folia expects Consumer, wrap our Runnable + Consumer consumer = (scheduledTask) -> task.run(); + runDelayedAsyncMethod.invoke(asyncScheduler, plugin, consumer, 0L, TimeUnit.MILLISECONDS); } catch (Exception e) { throw new RuntimeException("Failed to schedule Folia async task", e); } @@ -171,7 +227,9 @@ public void runAsyncLater(Runnable task, long delayTicks) { try { Object asyncScheduler = getAsyncSchedulerMethod.invoke(Bukkit.getServer()); long delayMillis = delayTicks * 50; // Convert ticks to milliseconds - runDelayedAsyncMethod.invoke(asyncScheduler, plugin, task, delayMillis, TimeUnit.MILLISECONDS); + // Folia expects Consumer, wrap our Runnable + Consumer consumer = (scheduledTask) -> task.run(); + runDelayedAsyncMethod.invoke(asyncScheduler, plugin, consumer, delayMillis, TimeUnit.MILLISECONDS); } catch (Exception e) { throw new RuntimeException("Failed to schedule delayed Folia async task", e); } @@ -198,10 +256,16 @@ public ScheduledTask runAsyncTimer(Runnable task, long delayTicks, long periodTi */ public void cancelAllTasks() { if (isFolia) { - try { - cancelTasksMethod.invoke(Bukkit.getServer(), plugin); - } catch (Exception e) { - throw new RuntimeException("Failed to cancel Folia tasks", e); + if (cancelTasksMethod != null) { + try { + cancelTasksMethod.invoke(Bukkit.getServer(), plugin); + } catch (Exception e) { + throw new RuntimeException("Failed to cancel Folia tasks", e); + } + } else { + // Folia doesn't have cancelTasks method - tasks are managed by schedulers + // Individual tasks should be cancelled via their ScheduledTask handles + plugin.getLogger().info("[Folia] cancelAllTasks not available - tasks should be cancelled individually"); } } else { Bukkit.getScheduler().cancelTasks(plugin); diff --git a/src/main/java/org/wargamer2010/signshop/specialops/ChangeOwner.java b/src/main/java/org/wargamer2010/signshop/specialops/ChangeOwner.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/specialops/ChangeShopItems.java b/src/main/java/org/wargamer2010/signshop/specialops/ChangeShopItems.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/specialops/ConvertChestshop.java b/src/main/java/org/wargamer2010/signshop/specialops/ConvertChestshop.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/specialops/CopySign.java b/src/main/java/org/wargamer2010/signshop/specialops/CopySign.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/specialops/LinkAdditionalBlocks.java b/src/main/java/org/wargamer2010/signshop/specialops/LinkAdditionalBlocks.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/specialops/LinkSpecialSign.java b/src/main/java/org/wargamer2010/signshop/specialops/LinkSpecialSign.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/specialops/SignShopSpecialOp.java b/src/main/java/org/wargamer2010/signshop/specialops/SignShopSpecialOp.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/timing/IExpirable.java b/src/main/java/org/wargamer2010/signshop/timing/IExpirable.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/timing/TimeManager.java b/src/main/java/org/wargamer2010/signshop/timing/TimeManager.java old mode 100644 new mode 100755 index efc1d9c9..7d001cad --- a/src/main/java/org/wargamer2010/signshop/timing/TimeManager.java +++ b/src/main/java/org/wargamer2010/signshop/timing/TimeManager.java @@ -1,5 +1,6 @@ package org.wargamer2010.signshop.timing; +import org.bukkit.Bukkit; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.MemorySection; import org.bukkit.configuration.file.FileConfiguration; @@ -164,7 +165,9 @@ public void stop() { if (scheduledTask != null) { scheduledTask.cancel(); } - fileSaveWorker.stop(); + if (fileSaveWorker != null) { + fileSaveWorker.stop(); + } } @Override diff --git a/src/main/java/org/wargamer2010/signshop/timing/TimedCommand.java b/src/main/java/org/wargamer2010/signshop/timing/TimedCommand.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/util/CooldownUtil.java b/src/main/java/org/wargamer2010/signshop/util/CooldownUtil.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/util/DataConverter.java b/src/main/java/org/wargamer2010/signshop/util/DataConverter.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/util/ItemMessagePart.java b/src/main/java/org/wargamer2010/signshop/util/ItemMessagePart.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/util/JarUtil.java b/src/main/java/org/wargamer2010/signshop/util/JarUtil.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/util/SSBukkitVersion.java b/src/main/java/org/wargamer2010/signshop/util/SSBukkitVersion.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/util/SSTimeUtil.java b/src/main/java/org/wargamer2010/signshop/util/SSTimeUtil.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/util/clicks.java b/src/main/java/org/wargamer2010/signshop/util/clicks.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/util/commandUtil.java b/src/main/java/org/wargamer2010/signshop/util/commandUtil.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/util/economyUtil.java b/src/main/java/org/wargamer2010/signshop/util/economyUtil.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/util/itemUtil.java b/src/main/java/org/wargamer2010/signshop/util/itemUtil.java old mode 100644 new mode 100755 index 0a7c9625..9d9a626b --- a/src/main/java/org/wargamer2010/signshop/util/itemUtil.java +++ b/src/main/java/org/wargamer2010/signshop/util/itemUtil.java @@ -716,7 +716,14 @@ public static void updateStockStatus(Block bSign, ChatColor ccColor) { } public static Boolean clickedSign(Block bBlock) { - return (Tag.ALL_SIGNS.isTagged(bBlock.getType())); + try { + return (Tag.ALL_SIGNS.isTagged(bBlock.getType())); + } catch (NullPointerException e) { + // Folia: Can't access block data from wrong thread during startup + // This is expected when loading shops at startup on Folia + // The shop will be validated later when accessed + return false; + } } public static Boolean clickedDoor(Block bBlock) { diff --git a/src/main/java/org/wargamer2010/signshop/util/lagSetter.java b/src/main/java/org/wargamer2010/signshop/util/lagSetter.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/util/signshopUtil.java b/src/main/java/org/wargamer2010/signshop/util/signshopUtil.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/util/versionUtil.java b/src/main/java/org/wargamer2010/signshop/util/versionUtil.java old mode 100644 new mode 100755 index 94be13c0..1268f347 --- a/src/main/java/org/wargamer2010/signshop/util/versionUtil.java +++ b/src/main/java/org/wargamer2010/signshop/util/versionUtil.java @@ -1,11 +1,9 @@ - package org.wargamer2010.signshop.util; import org.bukkit.Bukkit; import org.wargamer2010.signshop.SignShop; import java.util.logging.Level; -import java.util.regex.Pattern; /** * Bukkit/Spigot version detection and compatibility checking. @@ -19,10 +17,17 @@ *
  3. Post145: Bukkit 1.4.5-R0.3+ (modern API with ItemMeta)
  4. * * + *

    Two numbering schemes

    + *

    Minecraft numbered releases 1.0 up to 1.21.11, then switched to a year based + * scheme starting with 26.1 (26.1, 26.1.1, 26.1.2, 26.2, ...). Both look the same to + * the comparison below: the parts are compared as numbers, and since 26 > 1 every + * year based release sorts above every 1.x release.

    + * * @see SSBukkitVersion */ public class versionUtil { private static SSBukkitVersion cachedVersion = SSBukkitVersion.TBD; + private static int[] cachedServerVersion = null; private versionUtil() { @@ -35,18 +40,19 @@ private versionUtil() { public static SSBukkitVersion getBukkitVersionType() { if(cachedVersion == SSBukkitVersion.TBD) { String bukkitversion = Bukkit.getServer().getBukkitVersion(); - String[] versionbits = new String[1]; - if(bukkitversion.contains("-")) - versionbits = bukkitversion.split("-"); - if(versionbits.length < 2) - return SSBukkitVersion.Unknown; + String[] versionbits = bukkitversion.split("-"); + if(versionbits.length < 2) { + cachedVersion = SSBukkitVersion.Unknown; + SignShop.log("Could not determine Bukkit compatibility from this string: " + bukkitversion, Level.SEVERE); + return cachedVersion; + } - int cmp = versionUtil.compare(versionbits[0], "1.4.5"); + int cmp = compare(versionbits[0], "1.4.5"); if(cmp < 0) // < 1.4.5 cachedVersion = SSBukkitVersion.Pre145; else if(cmp == 0) { // == 1.4.5 - if(versionUtil.compare(versionbits[1], "R0.3") < 0) { // < 1.4.5-R0.3 + if(compare(versionbits[1], "R0.3") < 0) { // < 1.4.5-R0.3 cachedVersion = SSBukkitVersion.Pre145; // It didn't have support for ItemMeta so pre-Major-Overhaul } else { // >= 1.4.5-R0.3 cachedVersion = SSBukkitVersion.Post145; @@ -56,12 +62,36 @@ else if(cmp == 0) { // == 1.4.5 cachedVersion = SSBukkitVersion.Post145; } - if(cachedVersion == SSBukkitVersion.Unknown) - SignShop.log("Could not determine Bukkit compatibility from this string: " + Bukkit.getServer().getBukkitVersion(), Level.SEVERE); - return cachedVersion; } + /** + * The Minecraft version this server runs, split into its numeric parts. + * "26.1.2-R0.1-SNAPSHOT" gives {26, 1, 2}, "1.21.11-R0.1-SNAPSHOT" gives {1, 21, 11}. + * + * @return the version parts, or an empty array if the version string made no sense + */ + public static int[] getServerVersion() { + if(cachedServerVersion == null) + cachedServerVersion = parse(Bukkit.getServer().getBukkitVersion()); + + return cachedServerVersion.clone(); + } + + /** + * Checks whether the running server is at least the given Minecraft version. + * Works across both numbering schemes, so isAtLeast("1.21.10") is also true on 26.1 and up. + * + * @param version version to check against, e.g. "1.21.10" or "26.1" + * @return true if the server is that version or newer, false if it is older or unreadable + */ + public static boolean isAtLeast(String version) { + int[] server = getServerVersion(); + if(server.length == 0) + return false; + + return compare(server, parse(version)) >= 0; + } /** * Compare v1 with v2 and returns the result as an int @@ -70,22 +100,51 @@ else if(cmp == 0) { // == 1.4.5 * @param v2 Version string #2 * @return {@literal Returns < 0 if v1 < v2, > 0 if v1 > v2, 0 if v1 == v2} */ - private static int compare(String v1, String v2) { - String s1 = normalisedVersion(v1); - String s2 = normalisedVersion(v2); - return s1.compareTo(s2); + public static int compare(String v1, String v2) { + return compare(parse(v1), parse(v2)); } - private static String normalisedVersion(String version) { - return normalisedVersion(version, ".", 4); + private static int compare(int[] v1, int[] v2) { + for(int i = 0; i < Math.max(v1.length, v2.length); i++) { + int left = i < v1.length ? v1[i] : 0; + int right = i < v2.length ? v2[i] : 0; + + if(left != right) + return left < right ? -1 : 1; + } + + return 0; } - private static String normalisedVersion(String version, String sep, int maxWidth) { - String[] split = Pattern.compile(sep, Pattern.LITERAL).split(version); - StringBuilder sb = new StringBuilder((version.length() * 4)); // * 4 since we'll be adding chars - for (String s : split) { - sb.append(String.format("%" + maxWidth + 's', s)); + /** + * Pulls the numbers out of a version string. Anything that isn't a number is dropped, + * so "1.21.11-R0.1-SNAPSHOT" stops at the dash and "R0.3" reads as {0, 3}. + */ + private static int[] parse(String version) { + if(version == null || version.isEmpty()) + return new int[0]; + + String[] parts = version.split("-")[0].split("\\."); + int[] numbers = new int[parts.length]; + int found = 0; + + for(String part : parts) { + String digits = part.replaceAll("[^0-9]", ""); + if(digits.isEmpty()) + break; + + try { + numbers[found++] = Integer.parseInt(digits); + } catch(NumberFormatException e) { + break; // Absurdly long number, nothing sensible left to compare + } } - return sb.toString(); + + if(found == numbers.length) + return numbers; + + int[] trimmed = new int[found]; + System.arraycopy(numbers, 0, trimmed, 0, found); + return trimmed; } } diff --git a/src/main/java/org/wargamer2010/signshop/worth/CMIWorthHandler.java b/src/main/java/org/wargamer2010/signshop/worth/CMIWorthHandler.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/worth/EssentialsWorthHandler.java b/src/main/java/org/wargamer2010/signshop/worth/EssentialsWorthHandler.java old mode 100644 new mode 100755 diff --git a/src/main/java/org/wargamer2010/signshop/worth/WorthHandler.java b/src/main/java/org/wargamer2010/signshop/worth/WorthHandler.java old mode 100644 new mode 100755 diff --git a/src/main/resources/Reference.txt b/src/main/resources/Reference.txt old mode 100644 new mode 100755 diff --git a/src/main/resources/SSQuickReference.pdf b/src/main/resources/SSQuickReference.pdf old mode 100644 new mode 100755 diff --git a/src/main/resources/colors.yml b/src/main/resources/colors.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/de_DE.yml b/src/main/resources/de_DE.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/es_ES.yml b/src/main/resources/es_ES.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/fr_FR.yml b/src/main/resources/fr_FR.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/af_za-1.20.4.yml b/src/main/resources/materials-translated/af_za-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ar_sa-1.20.4.yml b/src/main/resources/materials-translated/ar_sa-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ast_es-1.20.4.yml b/src/main/resources/materials-translated/ast_es-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/az_az-1.20.4.yml b/src/main/resources/materials-translated/az_az-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ba_ru-1.20.4.yml b/src/main/resources/materials-translated/ba_ru-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/bar-1.20.4.yml b/src/main/resources/materials-translated/bar-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/be_by-1.20.4.yml b/src/main/resources/materials-translated/be_by-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/bg_bg-1.20.4.yml b/src/main/resources/materials-translated/bg_bg-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/br_fr-1.20.4.yml b/src/main/resources/materials-translated/br_fr-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/brb-1.20.4.yml b/src/main/resources/materials-translated/brb-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/bs_ba-1.20.4.yml b/src/main/resources/materials-translated/bs_ba-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ca_es-1.20.4.yml b/src/main/resources/materials-translated/ca_es-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/cs_cz-1.20.4.yml b/src/main/resources/materials-translated/cs_cz-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/cy_gb-1.20.4.yml b/src/main/resources/materials-translated/cy_gb-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/da_dk-1.20.4.yml b/src/main/resources/materials-translated/da_dk-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/de_at-1.20.4.yml b/src/main/resources/materials-translated/de_at-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/de_ch-1.20.4.yml b/src/main/resources/materials-translated/de_ch-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/de_de-1.20.4.yml b/src/main/resources/materials-translated/de_de-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/el_gr-1.20.4.yml b/src/main/resources/materials-translated/el_gr-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/en_au-1.20.4.yml b/src/main/resources/materials-translated/en_au-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/en_ca-1.20.4.yml b/src/main/resources/materials-translated/en_ca-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/en_gb-1.20.4.yml b/src/main/resources/materials-translated/en_gb-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/en_nz-1.20.4.yml b/src/main/resources/materials-translated/en_nz-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/en_pt-1.20.4.yml b/src/main/resources/materials-translated/en_pt-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/en_ud-1.20.4.yml b/src/main/resources/materials-translated/en_ud-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/en_us-1.20.4.yml b/src/main/resources/materials-translated/en_us-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/enp-1.20.4.yml b/src/main/resources/materials-translated/enp-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/enws-1.20.4.yml b/src/main/resources/materials-translated/enws-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/eo_uy-1.20.4.yml b/src/main/resources/materials-translated/eo_uy-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/es_ar-1.20.4.yml b/src/main/resources/materials-translated/es_ar-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/es_cl-1.20.4.yml b/src/main/resources/materials-translated/es_cl-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/es_ec-1.20.4.yml b/src/main/resources/materials-translated/es_ec-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/es_es-1.20.4.yml b/src/main/resources/materials-translated/es_es-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/es_mx-1.20.4.yml b/src/main/resources/materials-translated/es_mx-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/es_uy-1.20.4.yml b/src/main/resources/materials-translated/es_uy-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/es_ve-1.20.4.yml b/src/main/resources/materials-translated/es_ve-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/esan-1.20.4.yml b/src/main/resources/materials-translated/esan-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/et_ee-1.20.4.yml b/src/main/resources/materials-translated/et_ee-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/eu_es-1.20.4.yml b/src/main/resources/materials-translated/eu_es-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/fa_ir-1.20.4.yml b/src/main/resources/materials-translated/fa_ir-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/fi_fi-1.20.4.yml b/src/main/resources/materials-translated/fi_fi-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/fil_ph-1.20.4.yml b/src/main/resources/materials-translated/fil_ph-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/fo_fo-1.20.4.yml b/src/main/resources/materials-translated/fo_fo-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/fr_ca-1.20.4.yml b/src/main/resources/materials-translated/fr_ca-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/fr_fr-1.20.4.yml b/src/main/resources/materials-translated/fr_fr-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/fra_de-1.20.4.yml b/src/main/resources/materials-translated/fra_de-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/fur_it-1.20.4.yml b/src/main/resources/materials-translated/fur_it-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/fy_nl-1.20.4.yml b/src/main/resources/materials-translated/fy_nl-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ga_ie-1.20.4.yml b/src/main/resources/materials-translated/ga_ie-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/gd_gb-1.20.4.yml b/src/main/resources/materials-translated/gd_gb-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/gl_es-1.20.4.yml b/src/main/resources/materials-translated/gl_es-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/haw_us-1.20.4.yml b/src/main/resources/materials-translated/haw_us-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/he_il-1.20.4.yml b/src/main/resources/materials-translated/he_il-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/hi_in-1.20.4.yml b/src/main/resources/materials-translated/hi_in-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/hr_hr-1.20.4.yml b/src/main/resources/materials-translated/hr_hr-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/hu_hu-1.20.4.yml b/src/main/resources/materials-translated/hu_hu-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/hy_am-1.20.4.yml b/src/main/resources/materials-translated/hy_am-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/id_id-1.20.4.yml b/src/main/resources/materials-translated/id_id-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ig_ng-1.20.4.yml b/src/main/resources/materials-translated/ig_ng-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/io_en-1.20.4.yml b/src/main/resources/materials-translated/io_en-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/is_is-1.20.4.yml b/src/main/resources/materials-translated/is_is-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/isv-1.20.4.yml b/src/main/resources/materials-translated/isv-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/it_it-1.20.4.yml b/src/main/resources/materials-translated/it_it-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ja_jp-1.20.4.yml b/src/main/resources/materials-translated/ja_jp-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/jbo_en-1.20.4.yml b/src/main/resources/materials-translated/jbo_en-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ka_ge-1.20.4.yml b/src/main/resources/materials-translated/ka_ge-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/kk_kz-1.20.4.yml b/src/main/resources/materials-translated/kk_kz-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/kn_in-1.20.4.yml b/src/main/resources/materials-translated/kn_in-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ko_kr-1.20.4.yml b/src/main/resources/materials-translated/ko_kr-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ksh-1.20.4.yml b/src/main/resources/materials-translated/ksh-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/kw_gb-1.20.4.yml b/src/main/resources/materials-translated/kw_gb-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/la_la-1.20.4.yml b/src/main/resources/materials-translated/la_la-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/lb_lu-1.20.4.yml b/src/main/resources/materials-translated/lb_lu-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/li_li-1.20.4.yml b/src/main/resources/materials-translated/li_li-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/lmo-1.20.4.yml b/src/main/resources/materials-translated/lmo-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/lo_la-1.20.4.yml b/src/main/resources/materials-translated/lo_la-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/lol_us-1.20.4.yml b/src/main/resources/materials-translated/lol_us-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/lt_lt-1.20.4.yml b/src/main/resources/materials-translated/lt_lt-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/lv_lv-1.20.4.yml b/src/main/resources/materials-translated/lv_lv-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/lzh-1.20.4.yml b/src/main/resources/materials-translated/lzh-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/mk_mk-1.20.4.yml b/src/main/resources/materials-translated/mk_mk-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/mn_mn-1.20.4.yml b/src/main/resources/materials-translated/mn_mn-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ms_my-1.20.4.yml b/src/main/resources/materials-translated/ms_my-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/mt_mt-1.20.4.yml b/src/main/resources/materials-translated/mt_mt-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/nah-1.20.4.yml b/src/main/resources/materials-translated/nah-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/nds_de-1.20.4.yml b/src/main/resources/materials-translated/nds_de-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/nl_be-1.20.4.yml b/src/main/resources/materials-translated/nl_be-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/nl_nl-1.20.4.yml b/src/main/resources/materials-translated/nl_nl-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/nn_no-1.20.4.yml b/src/main/resources/materials-translated/nn_no-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/no_no-1.20.4.yml b/src/main/resources/materials-translated/no_no-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/oc_fr-1.20.4.yml b/src/main/resources/materials-translated/oc_fr-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ovd-1.20.4.yml b/src/main/resources/materials-translated/ovd-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/pl_pl-1.20.4.yml b/src/main/resources/materials-translated/pl_pl-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/pt_br-1.20.4.yml b/src/main/resources/materials-translated/pt_br-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/pt_pt-1.20.4.yml b/src/main/resources/materials-translated/pt_pt-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/qya_aa-1.20.4.yml b/src/main/resources/materials-translated/qya_aa-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ro_ro-1.20.4.yml b/src/main/resources/materials-translated/ro_ro-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/rpr-1.20.4.yml b/src/main/resources/materials-translated/rpr-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ru_ru-1.20.4.yml b/src/main/resources/materials-translated/ru_ru-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ry_ua-1.20.4.yml b/src/main/resources/materials-translated/ry_ua-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/sah_sah-1.20.4.yml b/src/main/resources/materials-translated/sah_sah-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/se_no-1.20.4.yml b/src/main/resources/materials-translated/se_no-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/sk_sk-1.20.4.yml b/src/main/resources/materials-translated/sk_sk-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/sl_si-1.20.4.yml b/src/main/resources/materials-translated/sl_si-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/so_so-1.20.4.yml b/src/main/resources/materials-translated/so_so-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/sq_al-1.20.4.yml b/src/main/resources/materials-translated/sq_al-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/sr_cs-1.20.4.yml b/src/main/resources/materials-translated/sr_cs-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/sr_sp-1.20.4.yml b/src/main/resources/materials-translated/sr_sp-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/sv_se-1.20.4.yml b/src/main/resources/materials-translated/sv_se-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/sxu-1.20.4.yml b/src/main/resources/materials-translated/sxu-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/szl-1.20.4.yml b/src/main/resources/materials-translated/szl-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/ta_in-1.20.4.yml b/src/main/resources/materials-translated/ta_in-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/th_th-1.20.4.yml b/src/main/resources/materials-translated/th_th-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/tl_ph-1.20.4.yml b/src/main/resources/materials-translated/tl_ph-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/tlh_aa-1.20.4.yml b/src/main/resources/materials-translated/tlh_aa-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/tok-1.20.4.yml b/src/main/resources/materials-translated/tok-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/tr_tr-1.20.4.yml b/src/main/resources/materials-translated/tr_tr-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/tt_ru-1.20.4.yml b/src/main/resources/materials-translated/tt_ru-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/uk_ua-1.20.4.yml b/src/main/resources/materials-translated/uk_ua-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/val_es-1.20.4.yml b/src/main/resources/materials-translated/val_es-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/vec_it-1.20.4.yml b/src/main/resources/materials-translated/vec_it-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/vi_vn-1.20.4.yml b/src/main/resources/materials-translated/vi_vn-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/yi_de-1.20.4.yml b/src/main/resources/materials-translated/yi_de-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/yo_ng-1.20.4.yml b/src/main/resources/materials-translated/yo_ng-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/zh_cn-1.20.4.yml b/src/main/resources/materials-translated/zh_cn-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/zh_hk-1.20.4.yml b/src/main/resources/materials-translated/zh_hk-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/zh_tw-1.20.4.yml b/src/main/resources/materials-translated/zh_tw-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials-translated/zlm_arab-1.20.4.yml b/src/main/resources/materials-translated/zlm_arab-1.20.4.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/materials.yml b/src/main/resources/materials.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/nl_NL.yml b/src/main/resources/nl_NL.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/pt_PT.yml b/src/main/resources/pt_PT.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/ru_RU.yml b/src/main/resources/ru_RU.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/signshopsign.png b/src/main/resources/signshopsign.png old mode 100644 new mode 100755 diff --git a/src/main/resources/zh_CN.yml b/src/main/resources/zh_CN.yml old mode 100644 new mode 100755 diff --git a/src/main/resources/zh_TW.yml b/src/main/resources/zh_TW.yml old mode 100644 new mode 100755