From be958462e49f53e64e12b2e639c889bb01679e64 Mon Sep 17 00:00:00 2001 From: alexcrea Date: Wed, 9 Jul 2025 13:35:08 +0200 Subject: [PATCH] bring back bukkit scheduler for mockbukkit also other mockbukkit fixes --- build.gradle.kts | 5 +++++ .../cuanvil/dependency/DependencyManager.kt | 21 +++++++++++++++++-- .../dependency/datapack/DataPackDependency.kt | 3 +++ .../cuanvil/dependency/gui/ExternGuiTester.kt | 8 +++---- .../dependency/scheduler/BukkitScheduler.kt | 17 +++++++++++++++ .../dependency/scheduler/FoliaScheduler.kt | 14 ++++--------- .../dependency/scheduler/TaskScheduler.kt | 18 ++++++++++++++++ .../cuanvil/tests/DefaultCustomAnvilTest.java | 12 ++++++++--- 8 files changed, 78 insertions(+), 20 deletions(-) create mode 100644 src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/BukkitScheduler.kt create mode 100644 src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/TaskScheduler.kt diff --git a/build.gradle.kts b/build.gradle.kts index 31537a5..579c9c9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -125,6 +125,11 @@ allprojects { } +// Stupid paperweight workaround +paperweight { + addServerDependencyTo = configurations.named(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME).map { setOf(it) } +} + tasks { // Online jar (use of libraries) diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt index 29635b6..5b5599f 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt @@ -20,7 +20,9 @@ import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester import xyz.alexcrea.cuanvil.dependency.packet.PacketManagerBase import xyz.alexcrea.cuanvil.dependency.packet.PacketManagerSelector import xyz.alexcrea.cuanvil.dependency.plugins.* +import xyz.alexcrea.cuanvil.dependency.scheduler.BukkitScheduler import xyz.alexcrea.cuanvil.dependency.scheduler.FoliaScheduler +import xyz.alexcrea.cuanvil.dependency.scheduler.TaskScheduler import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_OUTPUT_SLOT import xyz.alexcrea.cuanvil.util.AnvilUseType import java.util.logging.Level @@ -29,7 +31,8 @@ import java.util.logging.Level object DependencyManager { var isFolia: Boolean = false - lateinit var scheduler: FoliaScheduler + var isMockbukkit: Boolean = false + lateinit var scheduler: TaskScheduler lateinit var packetManager: PacketManagerBase var enchantmentSquaredCompatibility: EnchantmentSquaredDependency? = null @@ -48,10 +51,15 @@ object DependencyManager { // Bukkit or Paper scheduler ? isFolia = testIsFolia() + isMockbukkit = testIsMockbukkit() + if (isFolia) { CustomAnvil.instance.logger.info("Folia detected... Custom Anvil Folia support is experimental. issues are more likely to happens.") } - scheduler = FoliaScheduler() + + scheduler = + if (isMockbukkit) BukkitScheduler() + else FoliaScheduler() // Packet Manager val forceProtocolib = ConfigHolder.DEFAULT_CONFIG.config.getBoolean("force_protocolib", false) @@ -101,6 +109,15 @@ object DependencyManager { } + private fun testIsMockbukkit(): Boolean { + try { + Class.forName("org.mockbukkit.mockbukkit.exception.UnimplementedOperationException") + return true + } catch (e: ClassNotFoundException) { + return false + } + } + fun handleCompatibilityConfig() { enchantmentSquaredCompatibility?.registerPluginConfiguration() diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackDependency.kt index 892a16d..86e03b4 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackDependency.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackDependency.kt @@ -11,6 +11,7 @@ import xyz.alexcrea.cuanvil.api.ConflictBuilder import xyz.alexcrea.cuanvil.api.EnchantmentApi import xyz.alexcrea.cuanvil.api.MaterialGroupApi import xyz.alexcrea.cuanvil.config.ConfigHolder +import xyz.alexcrea.cuanvil.dependency.DependencyManager import xyz.alexcrea.cuanvil.enchant.wrapped.CABukkitEnchantment import xyz.alexcrea.cuanvil.enchant.wrapped.CAIncompatibleAllEnchant import xyz.alexcrea.cuanvil.group.IncludeGroup @@ -37,6 +38,8 @@ object DataPackDependency { } fun handleDatapackConfigs() { + if (DependencyManager.isMockbukkit) return + val enabledDatapack = enabledDatapacks for (packName in enabledDatapack) { // Handling of pack name is horrible: it is based on file name diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/ExternGuiTester.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/ExternGuiTester.kt index 005ce3a..f4849e1 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/ExternGuiTester.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/ExternGuiTester.kt @@ -2,6 +2,7 @@ package xyz.alexcrea.cuanvil.dependency.gui import org.bukkit.craftbukkit.inventory.CraftInventoryView import org.bukkit.inventory.InventoryView +import xyz.alexcrea.cuanvil.dependency.DependencyManager object ExternGuiTester { @@ -13,10 +14,7 @@ object ExternGuiTester { } fun testIfGui(view: InventoryView): Boolean { - // this mean we are on test - //TODO review why needed knowing previous mitigations should works - if(view.javaClass.name.endsWith("AnvilViewMock")) return false - + if (DependencyManager.isMockbukkit) return false val clazz = getContainerClass(view) ?: return false val clazzName = clazz.name @@ -30,7 +28,7 @@ object ExternGuiTester { fun expectWesjd(name: String): Boolean { val spigotVer = GuiTesterSelector.spigotVersionString - if(spigotVer == null) return false + if (spigotVer == null) return false val expectedWesjdGuiPath = "anvilgui.version.Wrapper${spigotVer}" diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/BukkitScheduler.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/BukkitScheduler.kt new file mode 100644 index 0000000..8c04162 --- /dev/null +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/BukkitScheduler.kt @@ -0,0 +1,17 @@ +package xyz.alexcrea.cuanvil.dependency.scheduler + +import org.bukkit.Bukkit +import org.bukkit.entity.Entity +import org.bukkit.plugin.Plugin + +class BukkitScheduler : TaskScheduler { + + override fun scheduleGlobally(plugin: Plugin, task: Runnable, time: Long): Any { + return Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, task, time) + } + + + override fun scheduleOnEntity(plugin: Plugin, entity: Entity, task: Runnable, time: Long): Any { + return Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, task, time) + } +} diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/FoliaScheduler.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/FoliaScheduler.kt index 5497860..7f5bf72 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/FoliaScheduler.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/FoliaScheduler.kt @@ -5,10 +5,11 @@ import org.bukkit.Bukkit import org.bukkit.entity.Entity import org.bukkit.plugin.Plugin +//TODO first, add to mockbukkit theses then do next todo //TODO replace usage of this to in code correct version -class FoliaScheduler { +class FoliaScheduler: TaskScheduler { - fun scheduleGlobally(plugin: Plugin, task: Runnable, time: Long): Any { + override fun scheduleGlobally(plugin: Plugin, task: Runnable, time: Long): Any { if (time < 1) { return Bukkit.getGlobalRegionScheduler().run( plugin @@ -21,11 +22,7 @@ class FoliaScheduler { ) } - fun scheduleGlobally(plugin: Plugin, task: Runnable): Any?{ - return scheduleGlobally(plugin, task, 0L) - } - - fun scheduleOnEntity(plugin: Plugin, entity: Entity, task: Runnable, time: Long): Any? { + override fun scheduleOnEntity(plugin: Plugin, entity: Entity, task: Runnable, time: Long): Any? { if (time < 1) { return entity.scheduler.run( plugin, @@ -41,7 +38,4 @@ class FoliaScheduler { ) } - fun scheduleOnEntity(plugin: Plugin, entity: Entity, task: Runnable): Any?{ - return scheduleOnEntity(plugin, entity, task, 0L) - } } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/TaskScheduler.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/TaskScheduler.kt new file mode 100644 index 0000000..e6a70dd --- /dev/null +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/TaskScheduler.kt @@ -0,0 +1,18 @@ +package xyz.alexcrea.cuanvil.dependency.scheduler + +import org.bukkit.entity.Entity +import org.bukkit.plugin.Plugin + +interface TaskScheduler { + + fun scheduleGlobally(plugin: Plugin, task: Runnable, time: Long): Any? + fun scheduleGlobally(plugin: Plugin, task: Runnable): Any?{ + return scheduleGlobally(plugin, task, 0L) + } + + fun scheduleOnEntity(plugin: Plugin, entity: Entity, task: Runnable, time: Long): Any? + fun scheduleOnEntity(plugin: Plugin, entity: Entity, task: Runnable): Any?{ + return scheduleOnEntity(plugin, entity, task, 0L) + } + +} \ No newline at end of file diff --git a/src/test/java/xyz/alexcrea/cuanvil/tests/DefaultCustomAnvilTest.java b/src/test/java/xyz/alexcrea/cuanvil/tests/DefaultCustomAnvilTest.java index bdb280c..d28bbcb 100644 --- a/src/test/java/xyz/alexcrea/cuanvil/tests/DefaultCustomAnvilTest.java +++ b/src/test/java/xyz/alexcrea/cuanvil/tests/DefaultCustomAnvilTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.mockbukkit.mockbukkit.MockBukkit; import org.mockbukkit.mockbukkit.ServerMock; +import org.mockbukkit.mockbukkit.exception.UnimplementedOperationException; import xyz.alexcrea.cuanvil.enchant.CAEnchantment; import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry; @@ -26,9 +27,14 @@ public abstract class DefaultCustomAnvilTest { @BeforeEach public void setUp() { // Load your plugin - plugin = MockBukkit.load(CustomAnvil.class); - // Continue initialization of the plugin - server.getScheduler().performOneTick(); + try { + plugin = MockBukkit.load(CustomAnvil.class); + + // Continue initialization of the plugin + server.getScheduler().performOneTick(); + } catch (UnimplementedOperationException exception) { + throw new IllegalStateException("unimplemented on plugin startup", exception); + } } @AfterEach