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('.'))
}
remapMethod(clazz: any, origin: string, test: string, params: any) {
try {
return clazz.getMethod(origin, params)
} catch (ex: any) {
if (this.RemapUtils) {
return clazz.getMethod(this.RemapUtils.mapMethod(clazz, origin, params), params)
} else {
return clazz.getMethod(test, params)
remapMethod(clazz: any, methods: string[], params: any) {
for (const method of methods) {
try {
if (this.RemapUtils) {
return clazz.getMethod(this.RemapUtils.mapMethod(clazz, method, params), params)
} else {
return clazz.getMethod(method, params)
}
} catch (error) {
}
}
throw new Error(`Class ${clazz} not found method ${methods}`)
}
remapFieldName(clazz: any, origin: string, test: string) {
try {
return clazz.getField(origin)
} catch (ex: any) {
if (this.RemapUtils) {
return clazz.getField(this.RemapUtils.mapFieldName(clazz, origin))
} else {
return clazz.getField(test)
remapFieldName(clazz: any, fields: string[]) {
for (const field of fields) {
try {
if (this.RemapUtils) {
return clazz.getField(this.RemapUtils.mapFieldName(clazz, field))
} else {
return clazz.getField(field)
}
} catch (ex: any) {
}
}
throw new Error(`Class ${clazz} not found field ${fields}`)
}
json(sender: any, json: string) {
@@ -107,10 +111,10 @@ abstract class BukkitChatInvoke {
class BukkitChatInvokeBase extends BukkitChatInvoke {
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) {
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()
}
getPacketPlayOutChat(sender: any, json: any, type: number) {
@@ -123,7 +127,7 @@ class BukkitChatInvokeBase extends BukkitChatInvoke {
return this.nmsCls("PacketPlayOutChat")
}
getPlayerConnectionField() {
return this.remapFieldName(this.nmsCls('EntityPlayer'), 'playerConnection', 'field_71135_a')
return this.remapFieldName(this.nmsCls('EntityPlayer'), ['playerConnection', 'field_71135_a'])
}
getPacketClass() {
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)
}
}
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 {
let Bukkit: typeof org.bukkit.Bukkit = Java.type('org.bukkit.Bukkit')
// @ts-ignore
let nmsVersion = Bukkit.getServer().class.name.split('.')[3]
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)
} else if (nmsSubVersion >= 18) {
bukkitChatInvoke = new BukkitChatInvoke_1_18_2(nmsVersion)