From 5a57b5f79987ffbaeed14eda3518cb77b5181a5f Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sat, 16 May 2026 11:36:09 +0200 Subject: [PATCH] Remove Reflection from TinyProtocol --- .../comphenix/tinyprotocol/TinyProtocol.java | 66 ++++--------------- 1 file changed, 14 insertions(+), 52 deletions(-) diff --git a/SpigotCore/SpigotCore_Main/src/com/comphenix/tinyprotocol/TinyProtocol.java b/SpigotCore/SpigotCore_Main/src/com/comphenix/tinyprotocol/TinyProtocol.java index b47d54f0..d869c13d 100644 --- a/SpigotCore/SpigotCore_Main/src/com/comphenix/tinyprotocol/TinyProtocol.java +++ b/SpigotCore/SpigotCore_Main/src/com/comphenix/tinyprotocol/TinyProtocol.java @@ -20,11 +20,13 @@ package com.comphenix.tinyprotocol; import com.google.common.collect.MapMaker; -import com.mojang.authlib.GameProfile; import de.steamwar.Reflection; -import de.steamwar.Reflection.Field; import io.netty.channel.*; -import org.bukkit.Bukkit; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.login.ServerboundHelloPacket; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.network.ServerConnectionListener; +import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -49,27 +51,6 @@ import java.util.logging.Level; public abstract class TinyProtocol { private static final AtomicInteger ID = new AtomicInteger(0); - // Required Minecraft classes - private static final Class entityPlayerClass = Reflection.getClass("{nms}.EntityPlayer", "net.minecraft.server.level.EntityPlayer"); - private static final Class playerConnectionClass = Reflection.getClass("{nms}.PlayerConnection", "net.minecraft.server.network.PlayerConnection"); - private static final Class networkManagerClass = Reflection.getClass("{nms}.NetworkManager", "net.minecraft.network.NetworkManager"); - - // Used in order to lookup a channel - private static final MethodInvoker getPlayerHandle = Reflection.getMethod("{obc}.entity.CraftPlayer", "getHandle"); - private static final FieldAccessor getConnection = Reflection.getField(entityPlayerClass, null, playerConnectionClass); - private static final FieldAccessor getManager = Reflection.getField(playerConnectionClass, null, networkManagerClass); - private static final FieldAccessor getChannel = Reflection.getField(networkManagerClass, Channel.class, 0); - - // Looking up ServerConnection - private static final Class minecraftServerClass = Reflection.getUntypedClass("{nms}.MinecraftServer", "net.minecraft.server.MinecraftServer"); - private static final Class serverConnectionClass = Reflection.getUntypedClass("{nms}.ServerConnection", "net.minecraft.server.network.ServerConnection"); - private static final FieldAccessor getMinecraftServer = Reflection.getField("{obc}.CraftServer", minecraftServerClass, 0); - private static final FieldAccessor getServerConnection = Reflection.getField(minecraftServerClass, serverConnectionClass, 0); - - // Packets we have to intercept - private static final Class PACKET_LOGIN_IN_START = Reflection.getClass("{nms}.PacketLoginInStart", "net.minecraft.network.protocol.login.PacketLoginInStart"); - private static final FieldAccessor getGameProfile = Reflection.getField(PACKET_LOGIN_IN_START, GameProfile.class, 0); - // Speedup channel lookup private Map channelLookup = new MapMaker().weakValues().makeMap(); private Listener listener; @@ -78,7 +59,7 @@ public abstract class TinyProtocol { private Set uninjectedChannels = Collections.newSetFromMap(new MapMaker().weakKeys().makeMap()); // List of network markers - private List networkManagers; + private List networkManagers; // Injected channel handlers private List serverChannels = new ArrayList<>(); @@ -204,34 +185,18 @@ public abstract class TinyProtocol { @SuppressWarnings("unchecked") private void registerChannelHandler() { - Object mcServer = getMinecraftServer.get(Bukkit.getServer()); - Object serverConnection = getServerConnection.get(mcServer); - boolean looking = true; - - try { - Field field = Reflection.getParameterizedField(serverConnectionClass, List.class, networkManagerClass); - field.setAccessible(true); - - networkManagers = (List) field.get(serverConnection); - } catch (Exception ex) { - plugin.getLogger().info("Encountered an exception checking list fields" + ex); - MethodInvoker method = Reflection.getTypedMethod(serverConnectionClass, null, List.class, serverConnectionClass); - - networkManagers = (List) method.invoke(null, serverConnection); - } - - if (networkManagers == null) { - throw new IllegalArgumentException("Failed to obtain list of network managers"); - } + ServerConnectionListener serverConnection = MinecraftServer.getServer().getConnection(); + networkManagers = serverConnection.getConnections(); // We need to synchronize against this list createServerChannelHandler(); // Find the correct list, or implicitly throw an exception + boolean looking = true; for (int i = 0; looking; i++) { List list = Reflection.getField(serverConnection.getClass(), List.class, i).get(serverConnection); for (Object item : list) { - if (!ChannelFuture.class.isInstance(item)) + if (!(item instanceof ChannelFuture)) break; // Channel future that contains the server connection @@ -416,10 +381,8 @@ public abstract class TinyProtocol { // Lookup channel again if (channel == null) { - Object connection = getConnection.get(getPlayerHandle.invoke(player)); - Object manager = getManager.get(connection); - - channelLookup.put(player.getName(), channel = getChannel.get(manager)); + Channel playerChannel = ((CraftPlayer) player).getHandle().connection.connection.channel; + channelLookup.put(player.getName(), channel = playerChannel); } return channel; @@ -536,9 +499,8 @@ public abstract class TinyProtocol { } private void handleLoginStart(Channel channel, Object packet) { - if (PACKET_LOGIN_IN_START.isInstance(packet)) { - GameProfile profile = getGameProfile.get(packet); - channelLookup.put(profile.getName(), channel); + if (packet instanceof ServerboundHelloPacket(String name, UUID packetId)) { + channelLookup.put(name, channel); } } }