From e2ca4b30be67c8946909fbc581aff496ae1d7256 Mon Sep 17 00:00:00 2001 From: XZot1K Date: Thu, 9 Mar 2023 18:36:00 -0500 Subject: [PATCH] * Fixed up old NMS reflection. Signed-off-by: BuildTools --- .../plugins/sp/core/packets/bar/ABH_Old.java | 12 ++++- .../packets/titles/versions/Titles_Old.java | 51 ++++++++++++++++--- 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/main/java/xzot1k/plugins/sp/core/packets/bar/ABH_Old.java b/src/main/java/xzot1k/plugins/sp/core/packets/bar/ABH_Old.java index e15781f..f0d35b4 100644 --- a/src/main/java/xzot1k/plugins/sp/core/packets/bar/ABH_Old.java +++ b/src/main/java/xzot1k/plugins/sp/core/packets/bar/ABH_Old.java @@ -41,7 +41,17 @@ public void sendActionBar(@NotNull Player player, @NotNull String message) { final Object icbc = method.invoke(csClass, ("{\"text\": \"" + SimplePortals.getPluginInstance().getManager().colorText(message) + "\"}")); - final Constructor packetConstructor = packetChatClass.getConstructor(icbClass, Byte.class); + Constructor packetConstructor = null; + for (Constructor con : packetChatClass.getConstructors()) { + + if (con.getParameterTypes().length != 2 || con.getParameterTypes()[0] != icbClass + || con.getParameterTypes()[1] != byte.class) continue; + + packetConstructor = con; + break; + } + + if (packetConstructor == null) return; final Object packet = packetConstructor.newInstance(icbc, (byte) 2); final Object cPlayer = craftPlayerClass.cast(player); diff --git a/src/main/java/xzot1k/plugins/sp/core/packets/titles/versions/Titles_Old.java b/src/main/java/xzot1k/plugins/sp/core/packets/titles/versions/Titles_Old.java index 01d44bc..8671b80 100644 --- a/src/main/java/xzot1k/plugins/sp/core/packets/titles/versions/Titles_Old.java +++ b/src/main/java/xzot1k/plugins/sp/core/packets/titles/versions/Titles_Old.java @@ -15,10 +15,13 @@ public class Titles_Old implements TitleHandler { - private Class csClass, titlePacketClass, etaClass, cpClass, packetClass; + private Class csClass, cbcClass, titlePacketClass, etaClass, cpClass, packetClass; public Titles_Old() { try { + cbcClass = Class.forName("net.minecraft.server." + + SimplePortals.getPluginInstance().getServerVersion() + ".IChatBaseComponent"); + csClass = Class.forName("net.minecraft.server." + SimplePortals.getPluginInstance().getServerVersion() + ".IChatBaseComponent$ChatSerializer"); @@ -48,23 +51,55 @@ public void sendSubTitle(Player player, String text, int fadeIn, int displayTime private void send(@NotNull Player player, @NotNull String action, @NotNull String text, int fadeIn, int displayTime, int fadeOut) { try { - final Object titleAction = etaClass.getDeclaredField(action); + final Object titleAction = etaClass.getDeclaredField(action).get(null); final Method aMethod = csClass.getDeclaredMethod("a", String.class); - final String textField = (String) aMethod.invoke(csClass, "{\"text\":\"" - + SimplePortals.getPluginInstance().getManager().colorText(text) + "\"}"); - final Constructor pConst = titlePacketClass.getConstructor(etaClass, String.class, - Integer.class, Integer.class, Integer.class); + final String coloredText = SimplePortals.getPluginInstance().getManager().colorText(text); + final Object textField = aMethod.invoke(csClass, "{\"text\":\"" + coloredText + "\"}"); + + + Constructor pConst = null; + for (Constructor con : titlePacketClass.getConstructors()) { + + if (con.getParameterTypes().length != 5) continue; + + if (con.getParameterTypes()[0] != etaClass || con.getParameterTypes()[1] != cbcClass + && con.getParameterTypes()[2] != int.class + && con.getParameterTypes()[3] != int.class + && con.getParameterTypes()[4] != int.class) continue; + + pConst = con; + break; + } + + boolean isOld = false; + if (pConst == null) { + for (Constructor con : titlePacketClass.getConstructors()) { + + if (con.getParameterTypes().length != 5) continue; + + if (con.getParameterTypes()[0] != etaClass || con.getParameterTypes()[1] != String.class + && con.getParameterTypes()[2] != int.class + && con.getParameterTypes()[3] != int.class + && con.getParameterTypes()[4] != int.class) continue; + + pConst = con; + isOld = true; + break; + } + } + + if (pConst == null) return; - final Object packet = pConst.newInstance(titleAction, textField, (fadeIn * 20), (displayTime * 20), (fadeOut * 20)); + final Object packet = pConst.newInstance(titleAction, (!isOld ? textField : coloredText), (fadeIn * 20), (displayTime * 20), (fadeOut * 20)); final Object cPlayer = cpClass.cast(player); final Object getHandle = cpClass.getDeclaredMethod("getHandle").invoke(cPlayer); final Object pConnection = getHandle.getClass().getDeclaredField("playerConnection").get(getHandle); final Method sendPacket = pConnection.getClass().getDeclaredMethod("sendPacket", packetClass); sendPacket.invoke(pConnection, packet); - } catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException + } catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | InstantiationException e) {e.printStackTrace();} }