Patch reflection channel getter at PlayerJoinEvent (1.20.2) #28
2 changed files with 28 additions and 2 deletions
|
@ -144,7 +144,13 @@ public class PacketListener implements Listener {
|
||||||
private Channel getChannel(Player player) {
|
private Channel getChannel(Player player) {
|
||||||
Object playerHandle = getHandle(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 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
|
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
public static void setDeclaredField(Object object, String field, Object value) {
|
||||||
try {
|
try {
|
||||||
String cacheKey = "DeclaredField:" + object.getClass().getName() + ":" + field;
|
String cacheKey = "DeclaredField:" + object.getClass().getName() + ":" + field;
|
||||||
|
|
Loading…
Add table
Reference in a new issue