Better old versions support (#102)

This commit is contained in:
alexcrea 2025-12-26 00:55:59 +01:00 committed by GitHub
commit 6975f29d9d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
32 changed files with 210 additions and 503 deletions

View file

@ -76,6 +76,7 @@ dependencies {
// Include nms
implementation(project(":nms:nms-common"))
implementation(project(":nms:nms-paper"))
for (nmsPart in reobfNMS) {
implementation(project(":nms:$nmsPart", configuration = "reobf"))
}

View file

@ -21,8 +21,8 @@ repositories {
// Set target version
tasks.withType<JavaCompile>().configureEach {
sourceCompatibility = "21"
targetCompatibility = "21"
sourceCompatibility = "16"
targetCompatibility = "16"
options.encoding = "UTF-8"
}
@ -30,6 +30,6 @@ tasks.withType<JavaCompile>().configureEach {
kotlin {
compilerOptions {
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
jvmTarget.set(JvmTarget.JVM_21)
jvmTarget.set(JvmTarget.JVM_16)
}
}

View file

@ -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<Any>?
fun getContainerClass(view: InventoryView): Class<Any>?
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
}
}

1
nms/nms-paper/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
.lastDeploymentsId

View file

@ -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<JavaCompile>().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)
}
}

View file

@ -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)
}
}

View file

@ -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<Any>? {
if (view !is CraftInventoryView) return null
val container = view.handle
return container.javaClass
}
}

View file

@ -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<Any>? {
if (view !is CraftInventoryView) return null
val container = view.handle
return container.javaClass
}
}

View file

@ -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<Any>? {
if (view !is CraftInventoryView) return null
val container = view.handle
return container.javaClass
}
}

View file

@ -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<Any>? {
if (view !is CraftInventoryView) return null
val container = view.handle
return container.javaClass
}
}

View file

@ -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<Any>? {
if (view !is CraftInventoryView) return null
val container = view.handle
return container.javaClass
}
}

View file

@ -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<Any>? {
if (view !is CraftInventoryView) return null
val container = view.handle
return container.javaClass
}
}

View file

@ -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<Any>? {
if (view !is CraftInventoryView) return null
val container = view.handle
return container.javaClass
}
}

View file

@ -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<Any>? {
if (view !is CraftInventoryView) return null
val container = view.handle
return container.javaClass
}
}

View file

@ -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<Any>? {
if (view !is CraftInventoryView) return null
val container = view.handle
return container.javaClass
}
}

View file

@ -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<Any>? {
if (view !is CraftInventoryView) return null
val container = view.handle
return container.javaClass
}
}

View file

@ -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<Any>? {
if(view !is CraftInventoryView<*, *>) return null
val container = view.handle
return container.javaClass
}
}

View file

@ -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<Any>? {
// 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
}
}
}

View file

@ -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<Any>? {
if(view !is CraftInventoryView<*, *>) return null
val container = view.handle
return container.javaClass
}
}

View file

@ -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<Any>? {
// 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
}
}
}

View file

@ -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<Any>? {
// 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
}
}
}

View file

@ -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<Any>? {
// 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
}
}
}

View file

@ -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<Any>? {
// 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
}
}
}

View file

@ -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"
val reobfNMS = providers.gradleProperty("subprojects.reobfnms")

View file

@ -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
}
}
}

View file

@ -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<Any>? {
// 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) {}
}
}

View file

@ -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,48 +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()
11 -> v1_21R7_ExternGuiTester()
else -> null
}
else -> null
}
return GenericExternGuiTester()
}
}

View file

@ -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
}
}
}

View file

@ -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)
}
}