feat(bukkit): 支持 Minecraft 1.20 版本
This commit is contained in:
		@@ -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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user