From af76fe723cc16485d55f9a149da92b1d3a5c3a41 Mon Sep 17 00:00:00 2001 From: MiaoWoo Date: Mon, 14 Jul 2025 17:01:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(bukkit):=20=E6=94=AF=E6=8C=81=20Minecraft?= =?UTF-8?q?=201.20=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/bukkit/src/internal/chat.ts | 58 ++++++++++++++++++---------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/packages/bukkit/src/internal/chat.ts b/packages/bukkit/src/internal/chat.ts index b91fb30c..055dcb86 100644 --- a/packages/bukkit/src/internal/chat.ts +++ b/packages/bukkit/src/internal/chat.ts @@ -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)