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)