115 lines
3.4 KiB
TypeScript
115 lines
3.4 KiB
TypeScript
/*global Java, base, module, exports, require*/
|
|
var nmsChatSerializerClass;
|
|
var nmsChatSerializerMethod;
|
|
var packetTypeConstructor;
|
|
var nmsChatMessageTypeClass;
|
|
var chatMessageTypes;
|
|
|
|
var RemapUtils;
|
|
|
|
var playerConnectionFieldName;
|
|
var sendPacketMethod;
|
|
|
|
var downgrade = false;
|
|
/**
|
|
* 获取NMS版本
|
|
*/
|
|
//@ts-ignore
|
|
var nmsVersion = org.bukkit.Bukkit.server.class.name.split('.')[3];
|
|
/**
|
|
* 获取NMS类
|
|
*/
|
|
function nmsCls(name) {
|
|
return base.getClass(['net.minecraft.server', nmsVersion, name].join('.'))
|
|
}
|
|
|
|
function remapMethod(clazz: any, origin: string, test: string, params) {
|
|
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() {
|
|
try {
|
|
RemapUtils = Java.type('catserver.server.remapper.RemapUtils');
|
|
} catch (ex) {
|
|
}
|
|
nmsChatSerializerClass = nmsCls(nmsVersion.split("_")[1] > 7 ? "IChatBaseComponent$ChatSerializer" : "ChatSerializer");
|
|
nmsChatSerializerMethod = remapMethod(nmsChatSerializerClass, 'a', 'func_150699_a', base.getClass('java.lang.String'))
|
|
var packetTypeClass = nmsCls("PacketPlayOutChat");
|
|
Java.from(packetTypeClass.constructors).forEach(function(c) {
|
|
if (c.parameterTypes.length === 2) {
|
|
packetTypeConstructor = c
|
|
}
|
|
});
|
|
nmsChatMessageTypeClass = packetTypeConstructor.parameterTypes[1];
|
|
if (nmsChatMessageTypeClass.isEnum()) {
|
|
chatMessageTypes = nmsChatMessageTypeClass.getEnumConstants();
|
|
} else {
|
|
switch (nmsChatMessageTypeClass.name) {
|
|
case "int":
|
|
//@ts-ignore
|
|
nmsChatMessageTypeClass = java.lang.Integer;
|
|
break;
|
|
case "byte":
|
|
//@ts-ignore
|
|
nmsChatMessageTypeClass = java.lang.Byte;
|
|
break;
|
|
}
|
|
}
|
|
var entityPlayerClass = nmsCls('EntityPlayer');
|
|
var packetClass = nmsCls('Packet');
|
|
var playerConnectionField = remapFieldName(entityPlayerClass, 'playerConnection', 'field_71135_a')
|
|
playerConnectionFieldName = playerConnectionField.getName()
|
|
sendPacketMethod = remapMethod(playerConnectionField.getType(), 'sendPacket', 'func_179290_a', packetClass)
|
|
}
|
|
|
|
function json(sender, json) {
|
|
if (downgrade) {
|
|
return '/tellraw ' + sender.name + ' ' + json
|
|
} else {
|
|
send(sender, json, 0);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function send(sender, json, type) {
|
|
//@ts-ignore
|
|
sendPacket(sender, packetTypeConstructor.newInstance(nmsChatSerializerMethod.invoke(null, json), chatMessageTypes == null ? nmsChatMessageTypeClass.valueOf(java.lang.String.valueOf(type)) : chatMessageTypes[type]))
|
|
}
|
|
|
|
function sendPacket(player, p) {
|
|
sendPacketMethod.invoke(player.handle[playerConnectionFieldName], 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
|
|
}
|
|
|
|
export default chat
|