diff --git a/SpigotCore/SpigotCore_Main/src/com/comphenix/tinyprotocol/TinyProtocol.java b/SpigotCore/SpigotCore_Main/src/com/comphenix/tinyprotocol/TinyProtocol.java
index 8140400c..b47d54f0 100644
--- a/SpigotCore/SpigotCore_Main/src/com/comphenix/tinyprotocol/TinyProtocol.java
+++ b/SpigotCore/SpigotCore_Main/src/com/comphenix/tinyprotocol/TinyProtocol.java
@@ -19,14 +19,11 @@
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 de.steamwar.core.Core;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelDuplexHandler;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelPromise;
-import lombok.Getter;
+import io.netty.channel.*;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -34,190 +31,490 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerLoginEvent;
-import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.plugin.Plugin;
+import org.bukkit.scheduler.BukkitRunnable;
import java.util.*;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.function.BiFunction;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
-public class TinyProtocol implements Listener {
+/**
+ * Represents a very tiny alternative to ProtocolLib.
+ *
+ * It now supports intercepting packets during login and status ping (such as OUT_SERVER_PING)!
+ *
+ * @author Kristian
+ */
+public abstract class TinyProtocol {
+ private static final AtomicInteger ID = new AtomicInteger(0);
- private static final Class> craftServer = Reflection.getClass("org.bukkit.craftbukkit.CraftServer");
- private static final Class> dedicatedPlayerList = Reflection.getClass("net.minecraft.server.dedicated.DedicatedPlayerList");
- private static final Field> getPlayerList = Reflection.getField(craftServer, dedicatedPlayerList, 0);
- private static final Class> playerList = Reflection.getClass("net.minecraft.server.players.PlayerList");
- private static final Class> minecraftServer = Reflection.getClass("net.minecraft.server.MinecraftServer");
- private static final Field> getMinecraftServer = Reflection.getField(playerList, minecraftServer, 0);
- public static final Class> serverConnection = Reflection.getClass("net.minecraft.server.network.ServerConnectionListener");
- private static final Field> getServerConnection = Reflection.getField(minecraftServer, serverConnection, 0);
- public static Object getServerConnection(Plugin plugin) {
- return getServerConnection.get(getMinecraftServer.get(getPlayerList.get(plugin.getServer())));
- }
- private static final Class> networkManager = Reflection.getClass("net.minecraft.network.NetworkManager");
- public static final Field networkManagers = Reflection.getField(serverConnection, List.class, 0, networkManager);
+ // 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");
- private static final String HANDLER_NAME = "tiny-steamwar";
- public static final TinyProtocol instance = new TinyProtocol(Core.getInstance());
+ // 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);
- public static void init() {
- //enforce init
- }
+ // Looking up ServerConnection
+ private static final Class