From c166d2a78a6cef8b8ac8789ee8f3f65cd7364ec9 Mon Sep 17 00:00:00 2001 From: alexcrea <42614139+alexcrea@users.noreply.github.com> Date: Sun, 7 Dec 2025 15:33:39 +0100 Subject: [PATCH 1/3] start of nms generalization --- .../cuanvil/dependency/gui/ExternGuiTester.kt | 50 ++-------------- .../gui/version/v1_17R1_ExternGuiTester.kt | 16 ----- .../gui/version/v1_18R1_ExternGuiTester.kt | 16 ----- .../gui/version/v1_18R2_ExternGuiTester.kt | 16 ----- .../gui/version/v1_19R1_ExternGuiTester.kt | 16 ----- .../gui/version/v1_19R2_ExternGuiTester.kt | 16 ----- .../gui/version/v1_19R3_ExternGuiTester.kt | 16 ----- .../gui/version/v1_20R1_ExternGuiTester.kt | 16 ----- .../gui/version/v1_20R2_ExternGuiTester.kt | 17 ------ .../gui/version/v1_20R3_ExternGuiTester.kt | 17 ------ .../gui/version/v1_20R4_ExternGuiTester.kt | 17 ------ .../gui/version/v1_21R1_ExternGuiTester.kt | 17 ------ .../gui/version/v1_21R2_ExternGuiTester.kt | 34 ----------- .../gui/version/v1_21R3_ExternGuiTester.kt | 17 ------ .../gui/version/v1_21R4_ExternGuiTester.kt | 34 ----------- .../gui/version/v1_21R5_ExternGuiTester.kt | 34 ----------- .../gui/version/v1_21R6_ExternGuiTester.kt | 34 ----------- .../dependency/gui/GenericExternGuiTester.kt | 58 +++++++++++++++++++ .../dependency/gui/GuiTesterSelector.kt | 43 +------------- 19 files changed, 63 insertions(+), 421 deletions(-) delete mode 100644 nms/v1_17R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_17R1_ExternGuiTester.kt delete mode 100644 nms/v1_18R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_18R1_ExternGuiTester.kt delete mode 100644 nms/v1_18R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_18R2_ExternGuiTester.kt delete mode 100644 nms/v1_19R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_19R1_ExternGuiTester.kt delete mode 100644 nms/v1_19R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_19R2_ExternGuiTester.kt delete mode 100644 nms/v1_19R3/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_19R3_ExternGuiTester.kt delete mode 100644 nms/v1_20R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R1_ExternGuiTester.kt delete mode 100644 nms/v1_20R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R2_ExternGuiTester.kt delete mode 100644 nms/v1_20R3/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R3_ExternGuiTester.kt delete mode 100644 nms/v1_20R4/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R4_ExternGuiTester.kt delete mode 100644 nms/v1_21R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R1_ExternGuiTester.kt delete mode 100644 nms/v1_21R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R2_ExternGuiTester.kt delete mode 100644 nms/v1_21R3/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R3_ExternGuiTester.kt delete mode 100644 nms/v1_21R4/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R4_ExternGuiTester.kt delete mode 100644 nms/v1_21R5/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R5_ExternGuiTester.kt delete mode 100644 nms/v1_21R6/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R6_ExternGuiTester.kt create mode 100644 src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GenericExternGuiTester.kt diff --git a/nms/nms-common/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/ExternGuiTester.kt b/nms/nms-common/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/ExternGuiTester.kt index 3079b8a..029e4a7 100644 --- a/nms/nms-common/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/ExternGuiTester.kt +++ b/nms/nms-common/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/ExternGuiTester.kt @@ -5,55 +5,13 @@ import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil interface ExternGuiTester { - object Const{ - val cannonicalPaperAnvilMenu = "net.minecraft.world.inventory.AnvilMenu" - } - - val wesjdAnvilGuiName: String? - - fun getContainerClass(inventory: InventoryView): Class? + fun getContainerClass(view: InventoryView): Class? fun testIfGui(inventory: InventoryView): Boolean { - // this mean we are on test - //TODO review why needed knowing previous mitigations should works - if(inventory.javaClass.name.endsWith("AnvilViewMock")) return false + // container class only allow default bukkit craft view class - val clazz = getContainerClass(inventory) ?: return false - - val clazzName = clazz.name - if(!PlatformUtil.isPaper){ - // Blacklist gui causing issue - if (expectWesjd(clazzName)) return true - if (expectXenondevUI(clazzName)) return true - if (expectVanePortal(clazzName)) return true - - return false - } - - // Only allow cannonical anvil menu class - return !Const.cannonicalPaperAnvilMenu.equals(clazzName, true) - } - - fun expectWesjd(name: String): Boolean { - val expectedWesjdGuiPath = "anvilgui.version.$wesjdAnvilGuiName" - - return name.contains(expectedWesjdGuiPath) - } - - private val XenondevUIPrefix: String - get() = "xyz.xenondevs.inventoryaccess." - private val XenondevUISufix: String - get() = ".AnvilInventoryImpl" - - fun expectXenondevUI(name: String): Boolean { - return name.startsWith(XenondevUIPrefix) - && name.endsWith(XenondevUISufix) - } - - fun expectVanePortal(name: String): Boolean { - val expected = "org.oddlama.vane.core.menu.AnvilMenu\$AnvilContainer" - - return name == expected + val clazz = getContainerClass(inventory) + return clazz != null } } \ No newline at end of file diff --git a/nms/v1_17R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_17R1_ExternGuiTester.kt b/nms/v1_17R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_17R1_ExternGuiTester.kt deleted file mode 100644 index 8e352e0..0000000 --- a/nms/v1_17R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_17R1_ExternGuiTester.kt +++ /dev/null @@ -1,16 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester - -class v1_17R1_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_17_R1" - - override fun getContainerClass(view: InventoryView): Class? { - if (view !is CraftInventoryView) return null - val container = view.handle - - return container.javaClass - } -} \ No newline at end of file diff --git a/nms/v1_18R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_18R1_ExternGuiTester.kt b/nms/v1_18R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_18R1_ExternGuiTester.kt deleted file mode 100644 index 659a0f6..0000000 --- a/nms/v1_18R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_18R1_ExternGuiTester.kt +++ /dev/null @@ -1,16 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester - -class v1_18R1_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_18_R1" - - override fun getContainerClass(view: InventoryView): Class? { - if (view !is CraftInventoryView) return null - val container = view.handle - - return container.javaClass - } -} \ No newline at end of file diff --git a/nms/v1_18R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_18R2_ExternGuiTester.kt b/nms/v1_18R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_18R2_ExternGuiTester.kt deleted file mode 100644 index 1447716..0000000 --- a/nms/v1_18R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_18R2_ExternGuiTester.kt +++ /dev/null @@ -1,16 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester - -class v1_18R2_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_18_R2" - - override fun getContainerClass(view: InventoryView): Class? { - if (view !is CraftInventoryView) return null - val container = view.handle - - return container.javaClass - } -} \ No newline at end of file diff --git a/nms/v1_19R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_19R1_ExternGuiTester.kt b/nms/v1_19R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_19R1_ExternGuiTester.kt deleted file mode 100644 index c151924..0000000 --- a/nms/v1_19R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_19R1_ExternGuiTester.kt +++ /dev/null @@ -1,16 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester - -class v1_19R1_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_19_R1" - - override fun getContainerClass(view: InventoryView): Class? { - if (view !is CraftInventoryView) return null - val container = view.handle - - return container.javaClass - } -} \ No newline at end of file diff --git a/nms/v1_19R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_19R2_ExternGuiTester.kt b/nms/v1_19R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_19R2_ExternGuiTester.kt deleted file mode 100644 index ac46674..0000000 --- a/nms/v1_19R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_19R2_ExternGuiTester.kt +++ /dev/null @@ -1,16 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester - -class v1_19R2_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_19_R2" - - override fun getContainerClass(view: InventoryView): Class? { - if (view !is CraftInventoryView) return null - val container = view.handle - - return container.javaClass - } -} \ No newline at end of file diff --git a/nms/v1_19R3/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_19R3_ExternGuiTester.kt b/nms/v1_19R3/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_19R3_ExternGuiTester.kt deleted file mode 100644 index 7ce5abd..0000000 --- a/nms/v1_19R3/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_19R3_ExternGuiTester.kt +++ /dev/null @@ -1,16 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester - -class v1_19R3_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_19_R3" - - override fun getContainerClass(view: InventoryView): Class? { - if (view !is CraftInventoryView) return null - val container = view.handle - - return container.javaClass - } -} \ No newline at end of file diff --git a/nms/v1_20R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R1_ExternGuiTester.kt b/nms/v1_20R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R1_ExternGuiTester.kt deleted file mode 100644 index dae3b98..0000000 --- a/nms/v1_20R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R1_ExternGuiTester.kt +++ /dev/null @@ -1,16 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester - -class v1_20R1_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_20_R1" - - override fun getContainerClass(view: InventoryView): Class? { - if (view !is CraftInventoryView) return null - val container = view.handle - - return container.javaClass - } -} diff --git a/nms/v1_20R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R2_ExternGuiTester.kt b/nms/v1_20R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R2_ExternGuiTester.kt deleted file mode 100644 index 6a8358a..0000000 --- a/nms/v1_20R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R2_ExternGuiTester.kt +++ /dev/null @@ -1,17 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester -import kotlin.jvm.javaClass - -class v1_20R2_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_20_R2" - - override fun getContainerClass(view: InventoryView): Class? { - if (view !is CraftInventoryView) return null - val container = view.handle - - return container.javaClass - } -} diff --git a/nms/v1_20R3/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R3_ExternGuiTester.kt b/nms/v1_20R3/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R3_ExternGuiTester.kt deleted file mode 100644 index 80362e2..0000000 --- a/nms/v1_20R3/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R3_ExternGuiTester.kt +++ /dev/null @@ -1,17 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester -import kotlin.jvm.javaClass - -class v1_20R3_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_20_R3" - - override fun getContainerClass(view: InventoryView): Class? { - if (view !is CraftInventoryView) return null - val container = view.handle - - return container.javaClass - } -} diff --git a/nms/v1_20R4/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R4_ExternGuiTester.kt b/nms/v1_20R4/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R4_ExternGuiTester.kt deleted file mode 100644 index 16e867c..0000000 --- a/nms/v1_20R4/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_20R4_ExternGuiTester.kt +++ /dev/null @@ -1,17 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester -import kotlin.jvm.javaClass - -class v1_20R4_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_20_R4" - - override fun getContainerClass(view: InventoryView): Class? { - if (view !is CraftInventoryView) return null - val container = view.handle - - return container.javaClass - } -} diff --git a/nms/v1_21R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R1_ExternGuiTester.kt b/nms/v1_21R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R1_ExternGuiTester.kt deleted file mode 100644 index 3111735..0000000 --- a/nms/v1_21R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R1_ExternGuiTester.kt +++ /dev/null @@ -1,17 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester - -class v1_21R1_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_21_R1" - - override fun getContainerClass(view: InventoryView): Class? { - if(view !is CraftInventoryView<*, *>) return null - val container = view.handle - - return container.javaClass - } - -} diff --git a/nms/v1_21R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R2_ExternGuiTester.kt b/nms/v1_21R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R2_ExternGuiTester.kt deleted file mode 100644 index 2604a16..0000000 --- a/nms/v1_21R2/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R2_ExternGuiTester.kt +++ /dev/null @@ -1,34 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester - -class v1_21R2_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_21_R2" - - var tested = false; - var possible = false; - - override fun getContainerClass(view: InventoryView): Class? { - // In case we are in a test environment - if(!tested) testClassExist() - if(!possible) return null - - if(view !is CraftInventoryView<*, *>) return null - val container = view.handle - - return container.javaClass - } - - fun testClassExist(){ - tested = true; - try { - Class.forName("org.bukkit.craftbukkit.inventory.CraftInventoryView") - possible = true - } catch (e: ClassNotFoundException){ - possible = false - } - } - -} diff --git a/nms/v1_21R3/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R3_ExternGuiTester.kt b/nms/v1_21R3/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R3_ExternGuiTester.kt deleted file mode 100644 index 70c5df9..0000000 --- a/nms/v1_21R3/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R3_ExternGuiTester.kt +++ /dev/null @@ -1,17 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester - -class v1_21R3_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_21_R3" - - override fun getContainerClass(view: InventoryView): Class? { - if(view !is CraftInventoryView<*, *>) return null - val container = view.handle - - return container.javaClass - } - -} diff --git a/nms/v1_21R4/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R4_ExternGuiTester.kt b/nms/v1_21R4/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R4_ExternGuiTester.kt deleted file mode 100644 index 6b76451..0000000 --- a/nms/v1_21R4/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R4_ExternGuiTester.kt +++ /dev/null @@ -1,34 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester - -class v1_21R4_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_21_R4" - - var tested = false; - var possible = false; - - override fun getContainerClass(view: InventoryView): Class? { - // In case we are in a test environment - if(!tested) testClassExist() - if(!possible) return null - - if(view !is CraftInventoryView<*, *>) return null - val container = view.handle - - return container.javaClass - } - - fun testClassExist(){ - tested = true; - try { - Class.forName("org.bukkit.craftbukkit.inventory.CraftInventoryView") - possible = true - } catch (e: ClassNotFoundException){ - possible = false - } - } - -} diff --git a/nms/v1_21R5/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R5_ExternGuiTester.kt b/nms/v1_21R5/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R5_ExternGuiTester.kt deleted file mode 100644 index 59eadbc..0000000 --- a/nms/v1_21R5/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R5_ExternGuiTester.kt +++ /dev/null @@ -1,34 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester - -class v1_21R5_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_21_R5" - - var tested = false; - var possible = false; - - override fun getContainerClass(view: InventoryView): Class? { - // In case we are in a test environment - if(!tested) testClassExist() - if(!possible) return null - - if(view !is CraftInventoryView<*, *>) return null - val container = view.handle - - return container.javaClass - } - - fun testClassExist(){ - tested = true; - try { - Class.forName("org.bukkit.craftbukkit.inventory.CraftInventoryView") - possible = true - } catch (e: ClassNotFoundException){ - possible = false - } - } - -} diff --git a/nms/v1_21R6/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R6_ExternGuiTester.kt b/nms/v1_21R6/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R6_ExternGuiTester.kt deleted file mode 100644 index 4e4c32b..0000000 --- a/nms/v1_21R6/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R6_ExternGuiTester.kt +++ /dev/null @@ -1,34 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester - -class v1_21R6_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_21_R6" - - var tested = false; - var possible = false; - - override fun getContainerClass(view: InventoryView): Class? { - // In case we are in a test environment - if(!tested) testClassExist() - if(!possible) return null - - if(view !is CraftInventoryView<*, *>) return null - val container = view.handle - - return container.javaClass - } - - fun testClassExist(){ - tested = true; - try { - Class.forName("org.bukkit.craftbukkit.inventory.CraftInventoryView") - possible = true - } catch (e: ClassNotFoundException){ - possible = false - } - } - -} \ No newline at end of file diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GenericExternGuiTester.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GenericExternGuiTester.kt new file mode 100644 index 0000000..85e32d5 --- /dev/null +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GenericExternGuiTester.kt @@ -0,0 +1,58 @@ +package xyz.alexcrea.cuanvil.dependency.gui + +import org.bukkit.inventory.InventoryView +import xyz.alexcrea.cuanvil.dependency.MinecraftVersionUtil +import java.lang.reflect.Method + +class GenericExternGuiTester: ExternGuiTester { + + companion object { + private const val ANVIL_CLASS_NAME = "org.bukkit.craftbukkit.inventory.view.CraftAnvilView" + private const val INV_CLASS_NAME = "org.bukkit.craftbukkit.inventory.CraftInventoryView" + private const val HANDLE_METHOD_NAME = "getHandle" + } + + var tested = false + + var testedClass: String? = null + lateinit var getHandleMethod: Method + + override fun getContainerClass(view: InventoryView): Class? { + // In case we are in a test environment + if(!tested) testClassExist() + + if(!testedClass.contentEquals(view.javaClass.name)) + return null + + val container = getHandleMethod.invoke(view) + return container.javaClass + } + + fun tryFromClass(className: String) { + val clazz = Class.forName(className) + testedClass = className + + getHandleMethod = clazz.getMethod(HANDLE_METHOD_NAME) + } + + fun testClassExist() { + tested = true + + // We first try to get craft anvil interface, + // but is absent on old version so we try craft inventory view before + try { + tryFromClass(ANVIL_CLASS_NAME) + return + } + catch (_: ClassNotFoundException) {} + catch (_: NoSuchMethodException) {} + + try { + tryFromClass(INV_CLASS_NAME) + return + } + catch (_: ClassNotFoundException) {} + catch (_: NoSuchMethodException) {} + } + +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GuiTesterSelector.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GuiTesterSelector.kt index f3d2122..f64a7f1 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GuiTesterSelector.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/GuiTesterSelector.kt @@ -1,6 +1,5 @@ package xyz.alexcrea.cuanvil.dependency.gui -import xyz.alexcrea.cuanvil.dependency.gui.version.*; import xyz.alexcrea.cuanvil.update.UpdateUtils object GuiTesterSelector { @@ -10,47 +9,7 @@ object GuiTesterSelector { val versionParts = UpdateUtils.currentMinecraftVersionArray() if (versionParts[0] != 1) return null - return when (versionParts[1]) { - // Can't support 1.16.5 bc 1.16.5 paper userdev do not exist - - 17 -> when (versionParts[2]) { - 0, 1 -> v1_17R1_ExternGuiTester() - else -> null - } - - 18 -> when (versionParts[2]) { - 0, 1 -> v1_18R1_ExternGuiTester() - 2 -> v1_18R2_ExternGuiTester() - else -> null - } - - 19 -> when (versionParts[2]) { - 0, 1, 2 -> v1_19R1_ExternGuiTester() - 3 -> v1_19R2_ExternGuiTester() - 4 -> v1_19R3_ExternGuiTester() - else -> null - } - - 20 -> when (versionParts[2]) { - 0, 1 -> v1_20R1_ExternGuiTester() - 2 -> v1_20R2_ExternGuiTester() - 3, 4 -> v1_20R3_ExternGuiTester() - 5, 6 -> v1_20R4_ExternGuiTester() - else -> null - } - - 21 -> when (versionParts[2]) { - 0, 1 -> v1_21R1_ExternGuiTester() - 2, 3 -> v1_21R2_ExternGuiTester() - 4 -> v1_21R3_ExternGuiTester() - 5 -> v1_21R4_ExternGuiTester() - 6, 7, 8 -> v1_21R5_ExternGuiTester() - 9, 10 -> v1_21R6_ExternGuiTester() - else -> null - } - - else -> null - } + return GenericExternGuiTester() } } \ No newline at end of file From fc94dbe16980f08f690128f5ee97ddcaf0465bb1 Mon Sep 17 00:00:00 2001 From: alexcrea Date: Thu, 25 Dec 2025 22:33:37 +0100 Subject: [PATCH 2/3] Generic gui tester and generic paper nms --- build.gradle.kts | 1 + nms/nms-paper/.gitignore | 1 + nms/nms-paper/build.gradle.kts | 35 +++++++++++ .../dependency/datapack/DataPackTester.kt | 0 .../packet/versions/PaperPacketManager.kt | 33 +++++++++++ .../dependency/scheduler/FoliaScheduler.kt | 0 ...PacketManager.kt => PaperPacketManager.kt} | 0 .../gui/version/v1_21R7_ExternGuiTester.kt | 34 ----------- settings.gradle.kts | 2 + .../dependency/MinecraftVersionUtil.kt | 54 +++++++++++++++++ .../packet/PacketManagerSelector.kt | 58 +++++-------------- .../dependency/scheduler/BukkitScheduler.kt | 4 +- 12 files changed, 144 insertions(+), 78 deletions(-) create mode 100644 nms/nms-paper/.gitignore create mode 100644 nms/nms-paper/build.gradle.kts rename nms/{v1_20R1 => nms-paper}/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackTester.kt (100%) create mode 100644 nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/versions/PaperPacketManager.kt rename nms/{v1_20R3 => nms-paper}/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/FoliaScheduler.kt (100%) rename nms/v1_21R6/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/versions/{V1_21R6_PacketManager.kt => PaperPacketManager.kt} (100%) delete mode 100644 nms/v1_21R7/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R7_ExternGuiTester.kt create mode 100644 src/main/kotlin/xyz/alexcrea/cuanvil/dependency/MinecraftVersionUtil.kt diff --git a/build.gradle.kts b/build.gradle.kts index b209202..944175b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -73,6 +73,7 @@ dependencies { // Include nms implementation(project(":nms:nms-common")) + implementation(project(":nms:nms-paper")) implementation(project(":nms:v1_17R1", configuration = "reobf")) implementation(project(":nms:v1_18R1", configuration = "reobf")) implementation(project(":nms:v1_18R2", configuration = "reobf")) diff --git a/nms/nms-paper/.gitignore b/nms/nms-paper/.gitignore new file mode 100644 index 0000000..47374f1 --- /dev/null +++ b/nms/nms-paper/.gitignore @@ -0,0 +1 @@ +.lastDeploymentsId \ No newline at end of file diff --git a/nms/nms-paper/build.gradle.kts b/nms/nms-paper/build.gradle.kts new file mode 100644 index 0000000..3b98361 --- /dev/null +++ b/nms/nms-paper/build.gradle.kts @@ -0,0 +1,35 @@ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget + +group = rootProject.group +version = rootProject.version + +plugins { + id("io.papermc.paperweight.userdev") +} + +dependencies { + implementation(project(":nms:nms-common")) + + // Used for nms + paperweight.paperDevBundle("1.20.6-R0.1-SNAPSHOT") +} + +repositories { + maven("https://repo.papermc.io/repository/maven-public/") + +} + +// Set target version +tasks.withType().configureEach { + sourceCompatibility = "18" + targetCompatibility = "18" + + options.encoding = "UTF-8" +} + +kotlin { + compilerOptions { + apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) + jvmTarget.set(JvmTarget.JVM_18) + } +} diff --git a/nms/v1_20R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackTester.kt b/nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackTester.kt similarity index 100% rename from nms/v1_20R1/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackTester.kt rename to nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/datapack/DataPackTester.kt diff --git a/nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/versions/PaperPacketManager.kt b/nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/versions/PaperPacketManager.kt new file mode 100644 index 0000000..7e248e1 --- /dev/null +++ b/nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/versions/PaperPacketManager.kt @@ -0,0 +1,33 @@ +package xyz.alexcrea.cuanvil.dependency.packet.versions + +import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket +import net.minecraft.world.entity.player.Abilities +import org.bukkit.craftbukkit.entity.CraftPlayer +import org.bukkit.entity.Player +import xyz.alexcrea.cuanvil.dependency.packet.PacketManager +import xyz.alexcrea.cuanvil.dependency.packet.PacketManagerBase + +class PaperPacketManager : PacketManagerBase(), PacketManager { + override val canSetInstantBuild: Boolean + get() = true + + override fun setInstantBuild(player: Player, instantBuild: Boolean) { + val nmsPlayer = (player as CraftPlayer).handle + val playerAbilities = nmsPlayer.abilities + val sendedAbilities: Abilities + if (playerAbilities.instabuild == instantBuild) { + sendedAbilities = playerAbilities + } else { + sendedAbilities = Abilities() + sendedAbilities.invulnerable = playerAbilities.invulnerable + sendedAbilities.flying = playerAbilities.flying + sendedAbilities.mayfly = playerAbilities.mayfly + sendedAbilities.instabuild = instantBuild + sendedAbilities.mayBuild = playerAbilities.mayBuild + sendedAbilities.flyingSpeed = playerAbilities.flyingSpeed + sendedAbilities.walkingSpeed = playerAbilities.walkingSpeed + } + val packet = ClientboundPlayerAbilitiesPacket(sendedAbilities) + nmsPlayer.connection.send(packet) + } +} diff --git a/nms/v1_20R3/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/FoliaScheduler.kt b/nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/FoliaScheduler.kt similarity index 100% rename from nms/v1_20R3/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/FoliaScheduler.kt rename to nms/nms-paper/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/FoliaScheduler.kt diff --git a/nms/v1_21R6/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/versions/V1_21R6_PacketManager.kt b/nms/v1_21R6/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/versions/PaperPacketManager.kt similarity index 100% rename from nms/v1_21R6/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/versions/V1_21R6_PacketManager.kt rename to nms/v1_21R6/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/versions/PaperPacketManager.kt diff --git a/nms/v1_21R7/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R7_ExternGuiTester.kt b/nms/v1_21R7/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R7_ExternGuiTester.kt deleted file mode 100644 index c380211..0000000 --- a/nms/v1_21R7/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/gui/version/v1_21R7_ExternGuiTester.kt +++ /dev/null @@ -1,34 +0,0 @@ -package xyz.alexcrea.cuanvil.dependency.gui.version - -import org.bukkit.craftbukkit.inventory.CraftInventoryView -import org.bukkit.inventory.InventoryView -import xyz.alexcrea.cuanvil.dependency.gui.ExternGuiTester - -class v1_21R7_ExternGuiTester: ExternGuiTester { - override val wesjdAnvilGuiName = "Wrapper1_21_R7" - - var tested = false; - var possible = false; - - override fun getContainerClass(view: InventoryView): Class? { - // In case we are in a test environment - if(!tested) testClassExist() - if(!possible) return null - - if(view !is CraftInventoryView<*, *>) return null - val container = view.handle - - return container.javaClass - } - - fun testClassExist(){ - tested = true; - try { - Class.forName("org.bukkit.craftbukkit.inventory.CraftInventoryView") - possible = true - } catch (e: ClassNotFoundException){ - possible = false - } - } - -} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 0790502..85566be 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,6 +3,8 @@ rootProject.name = "CustomAnvil" // NMS subproject include("nms:nms-common") findProject(":nms:nms-common")?.name = "nms-common" +include("nms:nms-paper") +findProject(":nms:nms-paper")?.name = "nms-paper" include("nms:v1_17R1") findProject(":nms:v1_17R1")?.name = "v1_17R1" include("nms:v1_18R1") diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/MinecraftVersionUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/MinecraftVersionUtil.kt new file mode 100644 index 0000000..69ec546 --- /dev/null +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/MinecraftVersionUtil.kt @@ -0,0 +1,54 @@ +package xyz.alexcrea.cuanvil.dependency + +import xyz.alexcrea.cuanvil.update.UpdateUtils + +object MinecraftVersionUtil { + + val craftbukkitVersion: String? + get() { + val versionParts = UpdateUtils.currentMinecraftVersionArray() + if (versionParts[0] != 1) return null + + return when (versionParts[1]) { + 17 -> when (versionParts[2]) { + 0, 1 -> "1_17R1" + else -> null + } + + 18 -> when (versionParts[2]) { + 0, 1 -> "1_18R1" + 2 -> "1_18R2" + else -> null + } + + 19 -> when (versionParts[2]) { + 0, 1, 2 -> "1_19R1" + 3 -> "1_19R2" + 4 -> "1_19R3" + else -> null + } + + 20 -> when (versionParts[2]) { + 0, 1 -> "1_20R1" + 2 -> "1_20R2" + 3, 4 -> "1_20R3" + 5, 6 -> "1_20R4" + else -> null + } + + 21 -> when (versionParts[2]) { + 0, 1 -> "1_21R1" + 2, 3 -> "1_21R2" + 4 -> "1_21R3" + 5 -> "1_21R4" + 6, 7, 8 -> "1_21R5" + 9, 10 -> "1_21R6" + 11 -> "1_21R7" + else -> null + } + + else -> null + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/PacketManagerSelector.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/PacketManagerSelector.kt index ccb8620..f38b9e4 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/PacketManagerSelector.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/packet/PacketManagerSelector.kt @@ -1,7 +1,10 @@ package xyz.alexcrea.cuanvil.dependency.packet import org.bukkit.Bukkit +import su.nightexpress.nightcore.bridge.paper.PaperBridge +import xyz.alexcrea.cuanvil.dependency.MinecraftVersionUtil import xyz.alexcrea.cuanvil.dependency.packet.versions.* +import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil import xyz.alexcrea.cuanvil.update.UpdateUtils object PacketManagerSelector { @@ -10,7 +13,9 @@ object PacketManagerSelector { return if (forceProtocolib) protocolibIfPresent else - versionSpecificManager ?: protocolibIfPresent + reobfPacketManager ?: + if(PlatformUtil.isPaper) PaperPacketManager() + else protocolibIfPresent } private val protocolibIfPresent: PacketManager @@ -19,52 +24,21 @@ object PacketManagerSelector { ProtocoLibWrapper() else NoPacketManager() - private val versionSpecificManager: PacketManagerBase? + + // Reobfuscated packet manager for spigot or paper as it remap + private val reobfPacketManager: PacketManagerBase? get() { val versionParts = UpdateUtils.currentMinecraftVersionArray() if (versionParts[0] != 1) return null - return when (versionParts[1]) { - // Can't support 1.16.5 bc 1.16.5 paper userdev do not exist + try { + val clazz = Class.forName("xyz.alexcrea.cuanvil.dependency.packet.versions." + + "V${MinecraftVersionUtil.craftbukkitVersion}_PacketManager") - 17 -> when (versionParts[2]) { - 0, 1 -> V1_17R1_PacketManager() - else -> null - } - - 18 -> when (versionParts[2]) { - 0, 1 -> V1_18R1_PacketManager() - 2 -> V1_18R2_PacketManager() - else -> null - } - - 19 -> when (versionParts[2]) { - 0, 1, 2 -> V1_19R1_PacketManager() - 3 -> V1_19R2_PacketManager() - 4 -> V1_19R3_PacketManager() - else -> null - } - - 20 -> when (versionParts[2]) { - 0, 1 -> V1_20R1_PacketManager() - 2 -> V1_20R2_PacketManager() - 3, 4 -> V1_20R3_PacketManager() - 5, 6 -> V1_20R4_PacketManager() - else -> null - } - - 21 -> when (versionParts[2]) { - 0, 1 -> V1_21R1_PacketManager() - 2, 3 -> V1_21R2_PacketManager() - 4 -> V1_21R3_PacketManager() - 5 -> V1_21R4_PacketManager() - 6, 7, 8 -> V1_21R5_PacketManager() - 9, 10 -> V1_21R6_PacketManager() - 11 -> V1_21R7_PacketManager() - else -> null - } - - else -> null + val manager = clazz.getConstructor().newInstance() + return manager as PacketManagerBase + } catch (e: ClassNotFoundException) { + return null } } } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/BukkitScheduler.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/BukkitScheduler.kt index b26dd42..8c04162 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/BukkitScheduler.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/scheduler/BukkitScheduler.kt @@ -6,12 +6,12 @@ import org.bukkit.plugin.Plugin class BukkitScheduler : TaskScheduler { - override fun scheduleGlobally(plugin: Plugin, task: Runnable, time: Long): Any? { + 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? { + override fun scheduleOnEntity(plugin: Plugin, entity: Entity, task: Runnable, time: Long): Any { return Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, task, time) } } From 1544cd315b7f15759f40460221a06f744d494020 Mon Sep 17 00:00:00 2001 From: alexcrea Date: Fri, 26 Dec 2025 00:51:14 +0100 Subject: [PATCH 3/3] fix older version issue --- nms/nms-common/build.gradle.kts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nms/nms-common/build.gradle.kts b/nms/nms-common/build.gradle.kts index 6088e77..67936b9 100644 --- a/nms/nms-common/build.gradle.kts +++ b/nms/nms-common/build.gradle.kts @@ -21,8 +21,8 @@ repositories { // Set target version tasks.withType().configureEach { - sourceCompatibility = "21" - targetCompatibility = "21" + sourceCompatibility = "16" + targetCompatibility = "16" options.encoding = "UTF-8" } @@ -30,6 +30,6 @@ tasks.withType().configureEach { kotlin { compilerOptions { apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0) - jvmTarget.set(JvmTarget.JVM_21) + jvmTarget.set(JvmTarget.JVM_16) } }