From fc94dbe16980f08f690128f5ee97ddcaf0465bb1 Mon Sep 17 00:00:00 2001 From: alexcrea Date: Thu, 25 Dec 2025 22:33:37 +0100 Subject: [PATCH] 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) } }