From 293c239fb855f819a4ad0e63a5ae68d3ab0a08c9 Mon Sep 17 00:00:00 2001 From: Stijn Bannink Date: Mon, 13 Nov 2023 21:30:32 +0100 Subject: [PATCH] v1.6.2: More version fixes (1.20.2 and 1.19.2) --- pom.xml | 2 +- .../mapreflectionapi/api/MapWrapper.java | 2 +- .../listeners/PacketListener.java | 22 +++++++++++-------- .../utils/ReflectionUtil.java | 6 ++--- .../utils/ReflectionUtils.java | 4 ++-- 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index 1c9a571..2d2e3c3 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ tech.sbdevelopment MapReflectionAPI - 1.6.1 + 1.6.2 jar MapReflectionAPI diff --git a/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapWrapper.java b/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapWrapper.java index b964af9..1c063b7 100644 --- a/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapWrapper.java +++ b/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapWrapper.java @@ -344,7 +344,7 @@ public class MapWrapper extends AbstractMapWrapper { ReflectionUtil.ListParam list = new ReflectionUtil.ListParam<>(); Object packet; - if (supports(19, 2)) { //1.19.3 + if (supports(19, 3)) { //1.19.3 Class dataWatcherRecordClass = getNMSClass("network.syncher", "DataWatcher$b"); // Sadly not possible to use ReflectionUtil (in its current state), because of the Object parameter Object dataWatcherItem; diff --git a/src/main/java/tech/sbdevelopment/mapreflectionapi/listeners/PacketListener.java b/src/main/java/tech/sbdevelopment/mapreflectionapi/listeners/PacketListener.java index f1a04be..616d620 100644 --- a/src/main/java/tech/sbdevelopment/mapreflectionapi/listeners/PacketListener.java +++ b/src/main/java/tech/sbdevelopment/mapreflectionapi/listeners/PacketListener.java @@ -47,6 +47,16 @@ public class PacketListener implements Listener { private static final Class packetPlayInSetCreativeSlotClass = getNMSClass("network.protocol.game", "PacketPlayInSetCreativeSlot"); private static final Class vec3DClass = getNMSClass("world.phys", "Vec3D"); private static final Class craftStackClass = getCraftClass("inventory.CraftItemStack"); + private static final Class playerCommonConnection; + + static { + if (supports(20) && supportsPatch(2)) { + // The packet send method has been abstracted from ServerGamePacketListenerImpl to ServerCommonPacketListenerImpl in 1.20.2 + playerCommonConnection = getNMSClass("server.network", "ServerCommonPacketListenerImpl"); + } else { + playerCommonConnection = getNMSClass("server.network", "PlayerConnection"); + } + } @EventHandler public void onJoin(PlayerJoinEvent e) { @@ -116,7 +126,7 @@ public class PacketListener implements Listener { } else if (packet.getClass().isAssignableFrom(packetPlayInSetCreativeSlotClass)) { Object packetPlayInSetCreativeSlot = packetPlayInSetCreativeSlotClass.cast(packet); - int slot = (int) ReflectionUtil.callDeclaredMethod(packetPlayInSetCreativeSlot, supports(19, 3) ? "a" : supports(13) ? "b" : "a"); //1.19.4 = a, 1.19.3 - 1.13 = b, 1.12 = a + int slot = (int) ReflectionUtil.callDeclaredMethod(packetPlayInSetCreativeSlot, supports(19, 4) ? "a" : supports(13) ? "b" : "a"); //1.19.4 = a, 1.19.3 - 1.13 = b, 1.12 = a Object nmsStack = ReflectionUtil.callDeclaredMethod(packetPlayInSetCreativeSlot, supports(20, 2) ? "d" : supports(18) ? "c" : "getItemStack"); //1.20.2 = d, >= 1.18 = c, 1.17 = getItemStack ItemStack craftStack = (ItemStack) ReflectionUtil.callMethod(craftStackClass, "asBukkitCopy", nmsStack); @@ -144,13 +154,7 @@ 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; - 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 - + Object networkManager = getDeclaredField(playerCommonConnection, playerConnection, supports(20, 2) ? "c" : supports(19, 4) ? "h" : supports(19) ? "b" : supports(17) ? "a" : "networkManager"); //1.20.2 = ServerCommonPacketListenerImpl#c, 1.20(.1) & 1.19.4 = h, >= 1.19.3 = b, 1.18 - 1.17 = 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 } @@ -164,4 +168,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 4fb2aea..a1cbe13 100644 --- a/src/main/java/tech/sbdevelopment/mapreflectionapi/utils/ReflectionUtil.java +++ b/src/main/java/tech/sbdevelopment/mapreflectionapi/utils/ReflectionUtil.java @@ -300,15 +300,15 @@ public class ReflectionUtil { } @Nullable - public static Object getSuperDeclaredField(Object object, String field) { + public static Object getDeclaredField(Class clazz, Object object, String field) { try { - String cacheKey = "SuperDeclaredField:" + object.getClass().getSuperclass().getName() + ":" + field; + String cacheKey = "DeclaredField:" + clazz.getName() + ":" + field; if (fieldCache.containsKey(cacheKey)) { Field cachedField = fieldCache.get(cacheKey); return cachedField.get(object); } else { - Field f = object.getClass().getSuperclass().getDeclaredField(field); + Field f = clazz.getDeclaredField(field); f.setAccessible(true); fieldCache.put(cacheKey, f); return f.get(object); diff --git a/src/main/java/tech/sbdevelopment/mapreflectionapi/utils/ReflectionUtils.java b/src/main/java/tech/sbdevelopment/mapreflectionapi/utils/ReflectionUtils.java index 1edf971..804a628 100644 --- a/src/main/java/tech/sbdevelopment/mapreflectionapi/utils/ReflectionUtils.java +++ b/src/main/java/tech/sbdevelopment/mapreflectionapi/utils/ReflectionUtils.java @@ -107,7 +107,7 @@ public final class ReflectionUtils { public static final int MINOR_NUMBER; /** * The raw patch version number. - * E.g. {@code v1_17_R1} to {@code 1} + * E.g. {@code 1.19.2} to {@code 2} *

* I'd not recommend developers to support individual patches at all. You should always support the latest patch. * For example, between v1.14.0, v1.14.1, v1.14.2, v1.14.3 and v1.14.4 you should only support v1.14.4 @@ -254,7 +254,7 @@ public final class ReflectionUtils { v(20, "c").v(17, "b").orElse("playerConnection"), playerConnection); getHandle = lookup.findVirtual(craftPlayer, "getHandle", MethodType.methodType(entityPlayer)); getHandleWorld = lookup.findVirtual(craftWorld, "getHandle", MethodType.methodType(worldServer)); - sendPacket = lookup.findVirtual(playerConnection, + sendPacket = lookup.findVirtual(playerCommonConnection, v(20, 2, "b").v(18, "a").orElse("sendPacket"), MethodType.methodType(void.class, getNMSClass("network.protocol", "Packet"))); } catch (NoSuchMethodException | NoSuchFieldException | IllegalAccessException ex) {