mirror of
https://github.com/alexcrea/CustomAnvil.git
synced 2026-06-23 16:16:17 +02:00
Better old versions support (#102)
This commit is contained in:
commit
6975f29d9d
32 changed files with 210 additions and 503 deletions
|
|
@ -76,6 +76,7 @@ dependencies {
|
||||||
|
|
||||||
// Include nms
|
// Include nms
|
||||||
implementation(project(":nms:nms-common"))
|
implementation(project(":nms:nms-common"))
|
||||||
|
implementation(project(":nms:nms-paper"))
|
||||||
for (nmsPart in reobfNMS) {
|
for (nmsPart in reobfNMS) {
|
||||||
implementation(project(":nms:$nmsPart", configuration = "reobf"))
|
implementation(project(":nms:$nmsPart", configuration = "reobf"))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,8 @@ repositories {
|
||||||
|
|
||||||
// Set target version
|
// Set target version
|
||||||
tasks.withType<JavaCompile>().configureEach {
|
tasks.withType<JavaCompile>().configureEach {
|
||||||
sourceCompatibility = "21"
|
sourceCompatibility = "16"
|
||||||
targetCompatibility = "21"
|
targetCompatibility = "16"
|
||||||
|
|
||||||
options.encoding = "UTF-8"
|
options.encoding = "UTF-8"
|
||||||
}
|
}
|
||||||
|
|
@ -30,6 +30,6 @@ tasks.withType<JavaCompile>().configureEach {
|
||||||
kotlin {
|
kotlin {
|
||||||
compilerOptions {
|
compilerOptions {
|
||||||
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
apiVersion.set(org.jetbrains.kotlin.gradle.dsl.KotlinVersion.KOTLIN_2_0)
|
||||||
jvmTarget.set(JvmTarget.JVM_21)
|
jvmTarget.set(JvmTarget.JVM_16)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,55 +5,13 @@ import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil
|
||||||
|
|
||||||
interface ExternGuiTester {
|
interface ExternGuiTester {
|
||||||
|
|
||||||
object Const{
|
fun getContainerClass(view: InventoryView): Class<Any>?
|
||||||
val cannonicalPaperAnvilMenu = "net.minecraft.world.inventory.AnvilMenu"
|
|
||||||
}
|
|
||||||
|
|
||||||
val wesjdAnvilGuiName: String?
|
|
||||||
|
|
||||||
fun getContainerClass(inventory: InventoryView): Class<Any>?
|
|
||||||
|
|
||||||
fun testIfGui(inventory: InventoryView): Boolean {
|
fun testIfGui(inventory: InventoryView): Boolean {
|
||||||
// this mean we are on test
|
// container class only allow default bukkit craft view class
|
||||||
//TODO review why needed knowing previous mitigations should works
|
|
||||||
if(inventory.javaClass.name.endsWith("AnvilViewMock")) return false
|
|
||||||
|
|
||||||
val clazz = getContainerClass(inventory) ?: return false
|
val clazz = getContainerClass(inventory)
|
||||||
|
return clazz != null
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
1
nms/nms-paper/.gitignore
vendored
Normal file
1
nms/nms-paper/.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
.lastDeploymentsId
|
||||||
35
nms/nms-paper/build.gradle.kts
Normal file
35
nms/nms-paper/build.gradle.kts
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -3,6 +3,8 @@ rootProject.name = "CustomAnvil"
|
||||||
// NMS subproject
|
// NMS subproject
|
||||||
include("nms:nms-common")
|
include("nms:nms-common")
|
||||||
findProject(":nms:nms-common")?.name = "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")
|
val reobfNMS = providers.gradleProperty("subprojects.reobfnms")
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package xyz.alexcrea.cuanvil.dependency.gui
|
package xyz.alexcrea.cuanvil.dependency.gui
|
||||||
|
|
||||||
import xyz.alexcrea.cuanvil.dependency.gui.version.*;
|
|
||||||
import xyz.alexcrea.cuanvil.update.UpdateUtils
|
import xyz.alexcrea.cuanvil.update.UpdateUtils
|
||||||
|
|
||||||
object GuiTesterSelector {
|
object GuiTesterSelector {
|
||||||
|
|
@ -10,48 +9,7 @@ object GuiTesterSelector {
|
||||||
val versionParts = UpdateUtils.currentMinecraftVersionArray()
|
val versionParts = UpdateUtils.currentMinecraftVersionArray()
|
||||||
if (versionParts[0] != 1) return null
|
if (versionParts[0] != 1) return null
|
||||||
|
|
||||||
return when (versionParts[1]) {
|
return GenericExternGuiTester()
|
||||||
// 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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
package xyz.alexcrea.cuanvil.dependency.packet
|
package xyz.alexcrea.cuanvil.dependency.packet
|
||||||
|
|
||||||
import org.bukkit.Bukkit
|
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.packet.versions.*
|
||||||
|
import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil
|
||||||
import xyz.alexcrea.cuanvil.update.UpdateUtils
|
import xyz.alexcrea.cuanvil.update.UpdateUtils
|
||||||
|
|
||||||
object PacketManagerSelector {
|
object PacketManagerSelector {
|
||||||
|
|
@ -10,7 +13,9 @@ object PacketManagerSelector {
|
||||||
return if (forceProtocolib)
|
return if (forceProtocolib)
|
||||||
protocolibIfPresent
|
protocolibIfPresent
|
||||||
else
|
else
|
||||||
versionSpecificManager ?: protocolibIfPresent
|
reobfPacketManager ?:
|
||||||
|
if(PlatformUtil.isPaper) PaperPacketManager()
|
||||||
|
else protocolibIfPresent
|
||||||
}
|
}
|
||||||
|
|
||||||
private val protocolibIfPresent: PacketManager
|
private val protocolibIfPresent: PacketManager
|
||||||
|
|
@ -19,52 +24,21 @@ object PacketManagerSelector {
|
||||||
ProtocoLibWrapper()
|
ProtocoLibWrapper()
|
||||||
else
|
else
|
||||||
NoPacketManager()
|
NoPacketManager()
|
||||||
private val versionSpecificManager: PacketManagerBase?
|
|
||||||
|
// Reobfuscated packet manager for spigot or paper as it remap
|
||||||
|
private val reobfPacketManager: PacketManagerBase?
|
||||||
get() {
|
get() {
|
||||||
val versionParts = UpdateUtils.currentMinecraftVersionArray()
|
val versionParts = UpdateUtils.currentMinecraftVersionArray()
|
||||||
if (versionParts[0] != 1) return null
|
if (versionParts[0] != 1) return null
|
||||||
|
|
||||||
return when (versionParts[1]) {
|
try {
|
||||||
// Can't support 1.16.5 bc 1.16.5 paper userdev do not exist
|
val clazz = Class.forName("xyz.alexcrea.cuanvil.dependency.packet.versions." +
|
||||||
|
"V${MinecraftVersionUtil.craftbukkitVersion}_PacketManager")
|
||||||
|
|
||||||
17 -> when (versionParts[2]) {
|
val manager = clazz.getConstructor().newInstance()
|
||||||
0, 1 -> V1_17R1_PacketManager()
|
return manager as PacketManagerBase
|
||||||
else -> null
|
} catch (e: ClassNotFoundException) {
|
||||||
}
|
return 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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,12 @@ import org.bukkit.plugin.Plugin
|
||||||
|
|
||||||
class BukkitScheduler : TaskScheduler {
|
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)
|
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)
|
return Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, task, time)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue