diff --git a/build.gradle b/build.gradle index 48797a4..f647536 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group = 'me.xpyex' -version = '1.0.13' +version = '1.0.14' def pluginPackage = 'me.xpyex.plugin.CnUsername'.toLowerCase() def modulePackage = 'me.xpyex.module.CnUsername'.toLowerCase() diff --git a/src/main/java/me/xpyex/module/cnusername/CnUsername.java b/src/main/java/me/xpyex/module/cnusername/CnUsername.java index f5c5872..1ef01e2 100644 --- a/src/main/java/me/xpyex/module/cnusername/CnUsername.java +++ b/src/main/java/me/xpyex/module/cnusername/CnUsername.java @@ -57,7 +57,7 @@ public class CnUsername { } public static void premain(final String agentArgs, final Instrumentation inst) { - System.out.println(agentArgs); + Logging.debug(agentArgs); Logging.info("开始载入模块 §eCnUsername"); Logging.info("如遇Bug,或需提出建议: §aQQ群546338486 §r| §eQQ1723275529"); Logging.info("开源地址§6§o(GitHub)§r: https://github.com/0XPYEX0/CnUsername"); @@ -87,6 +87,7 @@ public byte[] transform(ClassLoader loader, String className, Class classBein case ClassVisitorLoginListener.CLASS_PATH_YARN: case ClassVisitorStringReader.CLASS_PATH: case ClassVisitorStringUtil.CLASS_PATH: + Logging.debug(className); Logging.info("开始修改类 " + className); try { ClassReader reader = new ClassReader(classFileBuffer); @@ -98,10 +99,6 @@ public byte[] transform(ClassLoader loader, String className, Class classBein visitor = new ClassVisitorAllowedCharacters(className, writer, agentArgs); break; case ClassVisitorCraftPlayerProfile.CLASS_PATH: - try { - Class.forName(ClassVisitorStringUtil.CLASS_PATH.replace("/", "."), true, loader); - } catch (ClassNotFoundException ignored) { - } if (Version.parse("1.20.4").compareToIgnoreOptional(MC_VERSION) >= 0) { Logging.info("服务端处于§e1.20.5以下§r版本,无需修改CraftPlayerProfile类"); return null; diff --git a/src/main/java/me/xpyex/module/cnusername/Logging.java b/src/main/java/me/xpyex/module/cnusername/Logging.java index 1edf7d9..ae1d322 100644 --- a/src/main/java/me/xpyex/module/cnusername/Logging.java +++ b/src/main/java/me/xpyex/module/cnusername/Logging.java @@ -27,6 +27,16 @@ public static void warning(String s) { getLogger().warning(ColoredConsole.toANSI(PREFIX + s + "§r")); } + public static void debug(String s) { + if (CnUsername.DEBUG) { + if (LOGGER.get() == null) { + System.out.println(ColoredConsole.toANSI("[" + FORMAT.format(new Date()) + " §9DEBUG§r]: " + PREFIX + s + "§r")); + return; + } + getLogger().info(ColoredConsole.toANSI(PREFIX + s + "§r")); + } + } + public static Logger getLogger() { return LOGGER.get(); // diff --git a/src/main/java/me/xpyex/plugin/cnusername/bukkit/CnUsernameBK.java b/src/main/java/me/xpyex/plugin/cnusername/bukkit/CnUsernameBK.java index 1184279..59f5d7f 100644 --- a/src/main/java/me/xpyex/plugin/cnusername/bukkit/CnUsernameBK.java +++ b/src/main/java/me/xpyex/plugin/cnusername/bukkit/CnUsernameBK.java @@ -5,6 +5,7 @@ import me.xpyex.module.cnusername.CnUsername; import me.xpyex.module.cnusername.Logging; import me.xpyex.module.cnusername.UpdateChecker; +import me.xpyex.module.cnusername.impl.PatternVisitor; import me.xpyex.module.cnusername.minecraft.ClassVisitorLoginListener; import me.xpyex.module.cnusername.mojang.ClassVisitorStringUtil; import me.xpyex.module.cnusername.paper.ClassVisitorCraftPlayerProfile; @@ -44,7 +45,7 @@ public CnUsernameBK() { // net.minecraft.util.StringUtil ClassReader reader = new ClassReader(Bukkit.class.getClassLoader().getResourceAsStream(ClassVisitorStringUtil.CLASS_PATH + ".class")); String className = reader.getClassName().replace("/", "."); - byte[] data = modifyClass(reader); + byte[] data = modifyClass(reader, ClassVisitorStringUtil.class); loadClass(className, data); Logging.info("修改完成并保存"); if (CnUsername.DEBUG) { @@ -64,7 +65,7 @@ public CnUsernameBK() { // com.destroystokyo.paper.profile.CraftPlayerProfile ClassReader reader = new ClassReader(Bukkit.class.getClassLoader().getResourceAsStream(ClassVisitorCraftPlayerProfile.CLASS_PATH + ".class")); String className = reader.getClassName().replace("/", "."); - byte[] data = modifyClass(reader); + byte[] data = modifyClass(reader, ClassVisitorCraftPlayerProfile.class); loadClass(className, data); Logging.info("修改完成并保存"); if (CnUsername.DEBUG) { @@ -118,7 +119,7 @@ public void onLoad() { throw new IllegalStateException("无法读取对应Class: Class可能不存在,或Class先于插件加载."); } String className = classReader.getClassName().replace("/", "."); - byte[] data = modifyClass(classReader); + byte[] data = modifyClass(classReader, ClassVisitorLoginListener.class); loadClass(className, data); Logging.info("修改完成并保存"); if (CnUsername.DEBUG) { @@ -168,12 +169,17 @@ public void onPreLogin(AsyncPlayerPreLoginEvent event) { }, this); } - private byte[] modifyClass(ClassReader reader) { + private byte[] modifyClass(ClassReader reader, Class type) { String className = reader.getClassName().replace("/", "."); Logging.info("开始修改类 " + className); ClassWriter classWriter = new ClassWriter(reader, ClassWriter.COMPUTE_FRAMES); - ClassVisitor classVisitor = new ClassVisitorLoginListener(className, classWriter, readPluginPattern()); - reader.accept(classVisitor, 0); - return classWriter.toByteArray(); + try { + type.getConstructor(String.class, ClassVisitor.class, String.class).newInstance(className, classWriter, readPluginPattern()); + ClassVisitor classVisitor = new ClassVisitorLoginListener(className, classWriter, readPluginPattern()); + reader.accept(classVisitor, 0); + return classWriter.toByteArray(); + } catch (ReflectiveOperationException e) { + return new byte[0]; + } } }