From e9039eb56d2c087e06356cb6e71cca77abbf40d1 Mon Sep 17 00:00:00 2001 From: StanByes Date: Mon, 23 Oct 2023 13:18:40 +0200 Subject: [PATCH] Patch reflection channel getter at PlayerJoinEvent --- .../listeners/PacketListener.java | 10 ++++++++-- .../utils/ReflectionUtil.java | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/main/java/tech/sbdevelopment/mapreflectionapi/listeners/PacketListener.java b/src/main/java/tech/sbdevelopment/mapreflectionapi/listeners/PacketListener.java index 72748a1..22677cf 100644 --- a/src/main/java/tech/sbdevelopment/mapreflectionapi/listeners/PacketListener.java +++ b/src/main/java/tech/sbdevelopment/mapreflectionapi/listeners/PacketListener.java @@ -144,7 +144,13 @@ public class PacketListener implements Listener { private Channel getChannel(Player player) { Object playerHandle = getHandle(player); Object playerConnection = getDeclaredField(playerHandle, supports(20) ? "c" : supports(17) ? "b" : "playerConnection"); //1.20 = c, 1.17-1.19 = b, 1.16 = playerConnection - Object networkManager = getDeclaredField(playerConnection, supports(19, 3) ? "h" : supports(19) ? "b" : supports(17) ? "a" : "networkManager"); //1.20 & 1.19.4 = h, >= 1.19.3 = b, 1.18 = a, 1.16 = networkManager + + Object networkManager; + if (supports(20, 2)) + networkManager = getSuperDeclaredField(playerConnection, "c"); //1.20.2 = c + else + networkManager = getDeclaredField(playerConnection, supports(19, 3) ? "h" : supports(19) ? "b" : supports(17) ? "a" : "networkManager"); //1.20 & 1.19.4 = h, >= 1.19.3 = b, 1.18 = a, 1.16 = networkManager + return (Channel) getDeclaredField(networkManager, supports(20, 2) ? "n" : supports(18) ? "m" : supports(17) ? "k" : "channel"); //1.20.2 = n, 1.20(.1), 1.19 & 1.18 = m, 1.17 = k, 1.16 = channel } @@ -158,4 +164,4 @@ public class PacketListener implements Listener { return new Vector(x, y, z); } -} +} \ No newline at end of file diff --git a/src/main/java/tech/sbdevelopment/mapreflectionapi/utils/ReflectionUtil.java b/src/main/java/tech/sbdevelopment/mapreflectionapi/utils/ReflectionUtil.java index b998d74..4fb2aea 100644 --- a/src/main/java/tech/sbdevelopment/mapreflectionapi/utils/ReflectionUtil.java +++ b/src/main/java/tech/sbdevelopment/mapreflectionapi/utils/ReflectionUtil.java @@ -299,6 +299,26 @@ public class ReflectionUtil { } } + @Nullable + public static Object getSuperDeclaredField(Object object, String field) { + try { + String cacheKey = "SuperDeclaredField:" + object.getClass().getSuperclass().getName() + ":" + field; + + if (fieldCache.containsKey(cacheKey)) { + Field cachedField = fieldCache.get(cacheKey); + return cachedField.get(object); + } else { + Field f = object.getClass().getSuperclass().getDeclaredField(field); + f.setAccessible(true); + fieldCache.put(cacheKey, f); + return f.get(object); + } + } catch (NoSuchFieldException | IllegalAccessException ex) { + ex.printStackTrace(); + return null; + } + } + public static void setDeclaredField(Object object, String field, Object value) { try { String cacheKey = "DeclaredField:" + object.getClass().getName() + ":" + field; -- 2.45.3