119 lines
3.8 KiB
TypeScript
119 lines
3.8 KiB
TypeScript
/*global Java, base, module, exports, require*/
|
|
let ChatSerializer: any
|
|
let nmsChatSerializerMethodName: string
|
|
let PacketPlayOutChat: any
|
|
let chatMessageTypes: any
|
|
|
|
let RemapUtils: any
|
|
|
|
let playerConnectionFieldName: string
|
|
let sendPacketMethodName: string
|
|
|
|
let above_1_16 = false
|
|
let downgrade = false
|
|
/**
|
|
* 获取NMS版本
|
|
*/
|
|
let nmsVersion = undefined
|
|
/**
|
|
* 获取NMS类
|
|
*/
|
|
function nmsCls(name: string) {
|
|
return base.getClass(['net.minecraft.server', nmsVersion, name].join('.'))
|
|
}
|
|
|
|
function remapMethod(clazz: any, origin: string, test: string, params: any) {
|
|
try {
|
|
return clazz.getMethod(origin, params)
|
|
} catch (ex) {
|
|
if (RemapUtils) {
|
|
return clazz.getMethod(RemapUtils.mapMethod(clazz, origin, params), params)
|
|
} else {
|
|
return clazz.getMethod(test, params)
|
|
}
|
|
}
|
|
}
|
|
|
|
function remapFieldName(clazz: any, origin: string, test: string) {
|
|
try {
|
|
return clazz.getField(origin)
|
|
} catch (ex) {
|
|
if (RemapUtils) {
|
|
return clazz.getField(RemapUtils.mapFieldName(clazz, origin))
|
|
} else {
|
|
return clazz.getField(test)
|
|
}
|
|
}
|
|
}
|
|
|
|
function init() {
|
|
//@ts-ignore
|
|
nmsVersion = org.bukkit.Bukkit.server.class.name.split('.')[3]
|
|
try {
|
|
RemapUtils = Java.type('catserver.server.remapper.RemapUtils')
|
|
} catch (ex) {
|
|
}
|
|
let nmsChatSerializerClass = nmsCls(nmsVersion.split("_")[1] > 7 ? "IChatBaseComponent$ChatSerializer" : "ChatSerializer")
|
|
let nmsChatSerializerMethod = remapMethod(nmsChatSerializerClass, 'a', 'func_150699_a', base.getClass('java.lang.String'))
|
|
nmsChatSerializerMethodName = nmsChatSerializerMethod.getName()
|
|
ChatSerializer = Java.type(nmsChatSerializerClass.getName())
|
|
let packetTypeClass = nmsCls("PacketPlayOutChat")
|
|
PacketPlayOutChat = Java.type(packetTypeClass.getName())
|
|
let packetTypeConstructor: { parameterTypes: any[] }
|
|
let constructors = packetTypeClass.constructors
|
|
Java.from(constructors).forEach(function (c) {
|
|
if (c.parameterTypes.length === 2) {
|
|
packetTypeConstructor = c
|
|
}
|
|
if (c.parameterTypes.length === 3) {
|
|
packetTypeConstructor = c
|
|
above_1_16 = true
|
|
}
|
|
})
|
|
let parameterTypes = packetTypeConstructor.parameterTypes
|
|
let nmsChatMessageTypeClass = parameterTypes[1]
|
|
if (nmsChatMessageTypeClass.isEnum()) {
|
|
chatMessageTypes = nmsChatMessageTypeClass.getEnumConstants()
|
|
}
|
|
let playerConnectionField = remapFieldName(nmsCls('EntityPlayer'), 'playerConnection', 'field_71135_a')
|
|
playerConnectionFieldName = playerConnectionField.getName()
|
|
sendPacketMethodName = remapMethod(playerConnectionField.getType(), 'sendPacket', 'func_179290_a', nmsCls('Packet')).getName()
|
|
}
|
|
|
|
function json(sender: { name: string }, json: string) {
|
|
if (downgrade) {
|
|
return '/tellraw ' + sender.name + ' ' + json
|
|
} else {
|
|
send(sender, json, 0)
|
|
return false
|
|
}
|
|
}
|
|
|
|
function send(sender: any, json: any, type: number) {
|
|
let packet
|
|
if (above_1_16) {
|
|
packet = new PacketPlayOutChat(ChatSerializer[nmsChatSerializerMethodName](json), chatMessageTypes == null ? type : chatMessageTypes[type], sender.getUniqueId())
|
|
} else {
|
|
packet = new PacketPlayOutChat(ChatSerializer[nmsChatSerializerMethodName](json), chatMessageTypes == null ? type : chatMessageTypes[type])
|
|
}
|
|
sendPacket(sender, packet)
|
|
}
|
|
|
|
function sendPacket(player: { handle: { [x: string]: { [x: string]: (arg0: any) => void } } }, p: any) {
|
|
player.handle[playerConnectionFieldName][sendPacketMethodName](p)
|
|
}
|
|
|
|
try {
|
|
init()
|
|
} catch (ex) {
|
|
org.bukkit.Bukkit.getConsoleSender().sendMessage(`§6[§cMS§6][§bbukkit§6][§achat§6] §cNMS Inject Error §4${ex} §cDowngrade to Command Mode...`)
|
|
downgrade = true
|
|
}
|
|
|
|
let chat = {
|
|
json,
|
|
send
|
|
}
|
|
|
|
export default chat
|