From 24b81e5f005784b2f77e428b341585266c6c620e Mon Sep 17 00:00:00 2001 From: 502647092 Date: Tue, 25 Jul 2017 23:45:20 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 502647092 --- .../pw/yumc/YumCore/bukkit/compatible/C.java | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/src/main/java/pw/yumc/YumCore/bukkit/compatible/C.java b/src/main/java/pw/yumc/YumCore/bukkit/compatible/C.java index 5c8310b..70a879a 100644 --- a/src/main/java/pw/yumc/YumCore/bukkit/compatible/C.java +++ b/src/main/java/pw/yumc/YumCore/bukkit/compatible/C.java @@ -37,6 +37,7 @@ public class C { private static Method chatSerializer; private static Method getHandle; + private static Method nmsChatMessageTypeClassValueOf; private static String version; private static boolean newversion; @@ -44,7 +45,7 @@ public class C { private static Field playerConnection; private static Method sendPacket; - private static Object[] ChatMessageTypes; + private static Object[] chatMessageTypes; public static boolean init; static { @@ -55,12 +56,22 @@ public class C { chatSerializer = nmsChatSerializer.getMethod("a", String.class); nmsIChatBaseComponent = Class.forName(a("IChatBaseComponent")); packetType = Class.forName(a("PacketPlayOutChat")); - try { - nmsChatMessageTypeClass = Class.forName(a("ChatMessageType")); - ChatMessageTypes = nmsChatMessageTypeClass.getEnumConstants(); - packetTypeConstructor = packetType.getConstructor(nmsIChatBaseComponent, nmsChatMessageTypeClass); - } catch (ClassNotFoundException ex) { - packetTypeConstructor = packetType.getConstructor(nmsIChatBaseComponent, newversion ? int.class : byte.class); + Arrays.stream(packetType.getConstructors()).forEach(c -> { + if (c.getParameterTypes().length == 2) { + packetTypeConstructor = c; + } + }); + nmsChatMessageTypeClass = packetTypeConstructor.getParameterTypes()[1]; + if (nmsChatMessageTypeClass.isEnum()) { + chatMessageTypes = nmsChatMessageTypeClass.getEnumConstants(); + } else { + switch (nmsChatMessageTypeClass.getName()) { + case "int": + nmsChatMessageTypeClass = Integer.class; + case "byte": + nmsChatMessageTypeClass = Byte.class; + } + nmsChatMessageTypeClassValueOf = nmsChatMessageTypeClass.getDeclaredMethod("valueOf", String.class); } Class typeCraftPlayer = Class.forName(b("entity.CraftPlayer")); Class typeNMSPlayer = Class.forName(a("EntityPlayer")); @@ -112,11 +123,8 @@ public class C { Object serialized = chatSerializer.invoke(null, json); Object player = getHandle.invoke(receivingPacket); Object connection = playerConnection.get(player); - if (nmsChatMessageTypeClass != null) { - sendPacket.invoke(connection, packetTypeConstructor.newInstance(serialized, ChatMessageTypes[type])); - } else { - sendPacket.invoke(connection, packetTypeConstructor.newInstance(serialized, newversion ? type : (byte) type)); - } + Object typeObj = chatMessageTypes == null ? nmsChatMessageTypeClassValueOf.invoke(null, String.valueOf(type)) : chatMessageTypes[type]; + sendPacket.invoke(connection, packetTypeConstructor.newInstance(serialized, typeObj)); } catch (Exception ex) { Log.d("Json发包错误 " + version, ex); }