feat(bukkit): 支持 Minecraft 1.20 版本

This commit is contained in:
2025-07-14 17:01:25 +08:00
parent 9250dbb2ad
commit af76fe723c

View File

@@ -65,28 +65,32 @@ abstract class BukkitChatInvoke {
return base.getClass(['net.minecraft.server', this.nmsVersion, name].join('.')) return base.getClass(['net.minecraft.server', this.nmsVersion, name].join('.'))
} }
remapMethod(clazz: any, origin: string, test: string, params: any) { remapMethod(clazz: any, methods: string[], params: any) {
for (const method of methods) {
try { try {
return clazz.getMethod(origin, params)
} catch (ex: any) {
if (this.RemapUtils) { if (this.RemapUtils) {
return clazz.getMethod(this.RemapUtils.mapMethod(clazz, origin, params), params) return clazz.getMethod(this.RemapUtils.mapMethod(clazz, method, params), params)
} else { } else {
return clazz.getMethod(test, params) return clazz.getMethod(method, params)
}
} catch (error) {
} }
} }
throw new Error(`Class ${clazz} not found method ${methods}`)
} }
remapFieldName(clazz: any, origin: string, test: string) { remapFieldName(clazz: any, fields: string[]) {
for (const field of fields) {
try { try {
return clazz.getField(origin)
} catch (ex: any) {
if (this.RemapUtils) { if (this.RemapUtils) {
return clazz.getField(this.RemapUtils.mapFieldName(clazz, origin)) return clazz.getField(this.RemapUtils.mapFieldName(clazz, field))
} else { } else {
return clazz.getField(test) return clazz.getField(field)
}
} catch (ex: any) {
} }
} }
throw new Error(`Class ${clazz} not found field ${fields}`)
} }
json(sender: any, json: string) { json(sender: any, json: string) {
@@ -107,10 +111,10 @@ abstract class BukkitChatInvoke {
class BukkitChatInvokeBase extends BukkitChatInvoke { class BukkitChatInvokeBase extends BukkitChatInvoke {
getSendPacketMethodName(playerConnectionClass: any) { getSendPacketMethodName(playerConnectionClass: any) {
return this.remapMethod(playerConnectionClass, 'sendPacket', 'func_179290_a', this.getPacketClass()).getName() return this.remapMethod(playerConnectionClass, ['sendPacket', 'a', 'func_179290_a'], this.getPacketClass()).getName()
} }
getNmsChatSerializerMethodName(nmsChatSerializerClass: any) { getNmsChatSerializerMethodName(nmsChatSerializerClass: any) {
let nmsChatSerializerMethod = this.remapMethod(nmsChatSerializerClass, 'a', 'func_150699_a', base.getClass('java.lang.String')) let nmsChatSerializerMethod = this.remapMethod(nmsChatSerializerClass, ['serialize', 'a', 'func_150699_a'], base.getClass('java.lang.String'))
return nmsChatSerializerMethod.getName() return nmsChatSerializerMethod.getName()
} }
getPacketPlayOutChat(sender: any, json: any, type: number) { getPacketPlayOutChat(sender: any, json: any, type: number) {
@@ -123,7 +127,7 @@ class BukkitChatInvokeBase extends BukkitChatInvoke {
return this.nmsCls("PacketPlayOutChat") return this.nmsCls("PacketPlayOutChat")
} }
getPlayerConnectionField() { getPlayerConnectionField() {
return this.remapFieldName(this.nmsCls('EntityPlayer'), 'playerConnection', 'field_71135_a') return this.remapFieldName(this.nmsCls('EntityPlayer'), ['playerConnection', 'field_71135_a'])
} }
getPacketClass() { getPacketClass() {
return this.nmsCls('Packet') return this.nmsCls('Packet')
@@ -174,13 +178,27 @@ class BukkitChatInvoke_1_19 extends BukkitChatInvoke_1_18_2 {
return new this.PacketPlayOutChat(this.ChatSerializer[this.nmsChatSerializerMethodName](json), type) return new this.PacketPlayOutChat(this.ChatSerializer[this.nmsChatSerializerMethodName](json), type)
} }
} }
class BukkitChatInvoke_1_20 extends BukkitChatInvoke_1_19 {
getNmsChatSerializerClass() {
return base.getClass('net.minecraft.network.chat.IChatBaseComponent')
}
getNmsChatSerializerMethodName(nmsChatSerializerClass: any) {
let nmsChatSerializerMethod = this.remapMethod(nmsChatSerializerClass, ['literal', 'a'], base.getClass('java.lang.String'))
return nmsChatSerializerMethod.getName()
}
getPlayerConnectionField() {
return base.getClass('net.minecraft.server.level.EntityPlayer').getField('f')
}
}
try { try {
let Bukkit: typeof org.bukkit.Bukkit = Java.type('org.bukkit.Bukkit') let Bukkit: typeof org.bukkit.Bukkit = Java.type('org.bukkit.Bukkit')
// @ts-ignore // @ts-ignore
let nmsVersion = Bukkit.getServer().class.name.split('.')[3] let nmsVersion = Bukkit.getServer().class.name.split('.')[3]
let nmsSubVersion = nmsVersion.split("_")[1] let nmsSubVersion = nmsVersion.split("_")[1]
if (nmsSubVersion >= 19) { if (nmsSubVersion >= 20) {
bukkitChatInvoke = new BukkitChatInvoke_1_20(nmsVersion)
} else if (nmsSubVersion >= 19) {
bukkitChatInvoke = new BukkitChatInvoke_1_19(nmsVersion) bukkitChatInvoke = new BukkitChatInvoke_1_19(nmsVersion)
} else if (nmsSubVersion >= 18) { } else if (nmsSubVersion >= 18) {
bukkitChatInvoke = new BukkitChatInvoke_1_18_2(nmsVersion) bukkitChatInvoke = new BukkitChatInvoke_1_18_2(nmsVersion)