Sueta
PR

Protocoller API

0.0.5

A feature rich and easy to use Minecraft packet sniffer

·Plugin

Protocoller
This is a very easy-to-use "interceptor" of outgoing / incoming Minecraft packets.
Sometimes it is not possible to do anything using standard APIs, with this plugin, you get the ability to intercept packets when they are sent/received and edit them, which greatly expands the possibilities of the plugin developer. You can also create your own packets, which is also simple here, all (almost) Minecraft classes necessary for creating packets are present and deobfuscated, and everything is also adapted for multiversion.

API example:
(Or on GitHub)

MainClass.java
package ExamplePlugin;

import net.alis.protocoller.Protocoller;
import net.alis.protocoller.ProtocollerClient;
import net.alis.protocoller.event.PacketEventsManager;
import net.alis.protocoller.event.impl.ManagerType;
import net.alis.protocoller.plugin.exception.BannedClientException;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;


public final class MainClass extends JavaPlugin {

    public static ProtocollerClient protocollerApi;
    public static PacketEventsManager syncEventManager;
    public static PacketEventsManager asyncEventManager;

    @Override
    public void onEnable() {
        try {
            protocollerApi = Protocoller.get().registerClient((Plugin) this);
        } catch (BannedClientException e) {
            throw new RuntimeException(e);
        }

        syncEventManager = protocollerApi.getEventManager(ManagerType.SYNCHRONOUS);
        asyncEventManager = protocollerApi.getEventManager(ManagerType.ASYNCHRONOUS);

        syncEventManager.registerListener(protocollerApi, new ExampleSyncPacketListener());

        asyncEventManager.registerListener(protocollerApi, new ExampleAsyncPacketListener());

    }

    @Override
    public void onDisable() { }
}
ExampleAsyncPacketListener.java
package ExamplePlugin;

import net.alis.protocoller.event.async.AsyncPacketLoginReceiveEvent;
import net.alis.protocoller.event.impl.PacketEventHandler;
import net.alis.protocoller.event.impl.PacketEventPriority;
import net.alis.protocoller.event.impl.PacketListener;
import net.alis.protocoller.packet.PacketType;
import net.alis.protocoller.packet.packets.login.PacketLoginInStart;
import net.alis.protocoller.plugin.managers.LogsManager;
import net.alis.protocoller.samples.authlib.GameProfile;

public class ExampleAsyncPacketListener implements PacketListener {

    @PacketEventHandler(eventPriority = PacketEventPriority.NORMAL, ignoreCancelled = true)
    public void onPlayerLoginStart(AsyncPacketLoginReceiveEvent event) {
        if(event.getPacketType() == PacketType.Login.Client.START) {
            PacketLoginInStart loginPack = new PacketLoginInStart(event.getData());
            GameProfile prePlayerData = loginPack.getGameProfile();
            LogsManager.get().getLogger().info("Player \"" + prePlayerData.getName() + "\" will join the server soon");
        }

    }

}
ExampleSyncPacketListener.java
package ExamplePlugin;

import net.alis.protocoller.NetworkPlayer;
import net.alis.protocoller.event.impl.PacketListener;
import net.alis.protocoller.event.sync.PacketPlaySendEvent;
import net.alis.protocoller.packet.PacketType;
import net.alis.protocoller.packet.packets.game.PacketPlayOutAbilities;
import org.bukkit.entity.Player;

public class ExampleSyncPacketListener implements PacketListener {

    public void yourCustomMethodName(PacketPlaySendEvent event) {
        if(event.getPacketType() == PacketType.Play.Server.ABILITIES) {
            PacketPlayOutAbilities abilities = new PacketPlayOutAbilities(event.getData());
            NetworkPlayer networkPlayer = event.getNetworkPlayer();
            Player player = event.getNetworkPlayer().getBukkitPlayer();
            if(player.getName().equalsIgnoreCase("ALis")) {
                if(!abilities.isCanFly()) abilities.setCanFly(true);
                event.setPacket(abilities);
            }
            return;
        }

    }


}
NetworkPlayerWorkExample.java
package ExamplePlugin;

import net.alis.protocoller.NetworkPlayer;
import net.alis.protocoller.NetworkServer;
import net.alis.protocoller.packet.packets.game.PacketPlayOutChat;
import net.alis.protocoller.plugin.enums.Version;
import net.alis.protocoller.samples.network.NetworkManager;
import net.alis.protocoller.samples.network.PlayerConnection;
import net.alis.protocoller.samples.network.chat.ChatComponent;
import net.md_5.bungee.api.MessageType;
import net.md_5.bungee.api.chat.HoverEvent;
import org.bukkit.Bukkit;
import java.util.UUID;

public class NetworkPlayerWorkExample {

    public void networkPlayerWorking() {
        NetworkServer server = MainClass.protocollerApi.getServer();
        NetworkPlayer player = server.getPlayer(UUID.fromString("ALis"));
        NetworkPlayer player1 = server.getPlayer("ALis");
        NetworkPlayer player2 = server.getPlayer(Bukkit.getPlayer("ALis"));

        PlayerConnection connection = player.getConnection();
        int ping = player.getPing();
        int protocol = player.getVersion().getProtocol();
        String versionName = player.getVersion().asString();

        ChatComponent component = new ChatComponent("Welcome to the ");
        component.append("server " + player.getName()).setHoverEvent(HoverEvent.Action.SHOW_TEXT, "You amazing!");
        connection.sendPacket(new PacketPlayOutChat(component, MessageType.CHAT, player.getUniqueId()));

        NetworkManager manager = connection.getNetworkManager();
    }


}
NetworkServerWorkExample.java
package ExamplePlugin;

import io.netty.channel.ChannelFuture;
import net.alis.protocoller.NetworkServer;
import net.alis.protocoller.samples.authlib.GameProfile;
import net.alis.protocoller.samples.authlib.properties.Property;
import net.alis.protocoller.samples.network.NetworkManager;
import net.alis.protocoller.samples.network.chat.ChatComponent;
import net.alis.protocoller.samples.network.status.ServerData;
import net.alis.protocoller.samples.network.status.ServerPing;
import net.alis.protocoller.samples.network.status.ServerPingPlayerSample;
import net.alis.protocoller.samples.server.ServerConnection;
import net.alis.protocoller.samples.server.rcon.QueryThreadGC4;
import net.alis.protocoller.samples.server.rcon.RconThread;
import net.alis.protocoller.samples.server.rcon.RemoteControlSession;
import net.alis.protocoller.samples.server.rcon.RemoteStatusReply;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;


public class NetworkServerWorkExample {

    public static void serverConnectionAccess() {
        NetworkServer server = MainClass.protocollerApi.getServer();
        ServerConnection connection = server.getConnection();
        List<NetworkManager> managers = connection.getConnections();
        List<ChannelFuture> channels = connection.getChannels();
        NetworkManager manager = managers.get(0);
        Property[] p = manager.getSpoofedProfiles();
    }

    public static void changeServerStatusInfo() {
        NetworkServer server = MainClass.protocollerApi.getServer();
        ServerPing ping = server.getServerStatus();
        ping.setVersion(new ServerData("Spigot 1.25.1", 756));
        ping.setFavicon("Some favicon");
        ping.setDescription(new ChatComponent("A best minecraft server!"));
        ServerPingPlayerSample playerSample = new ServerPingPlayerSample(10000, 999);
        List<GameProfile> profiles = new ArrayList<>();
        profiles.add(new GameProfile(UUID.randomUUID(), "ALis"));
        profiles.add(new GameProfile(UUID.randomUUID(), "Tasher228"));
        profiles.add(new GameProfile(UUID.randomUUID(), "Notch"));
        playerSample.setSample(profiles.toArray(new GameProfile[0]));
        ping.setPlayers(playerSample);
        server.setServerStatus(ping);
    }


    public static void changeGC4Thread() {
        NetworkServer server = MainClass.protocollerApi.getServer();
        QueryThreadGC4 query = server.getQueryThreadGC4();
        if(query != null) { //QueryThread can be null(Может возвращать null)
            query.setMaxPlayers(1000);
            RemoteStatusReply statusReply = query.getRulesResponse();
            byte[] replyBytes = statusReply.toByteArray();
            query.setServerIp("1.1.1.1");
            query.setServerName("Best minecraft server");
            int queryPort = query.getQueryPort();
        }
    }

    public void rconCheck() {
        NetworkServer server = MainClass.protocollerApi.getServer();
        RconThread rcon = server.getRconThread(); //RconThread can be null
        if(rcon != null){
            List<RemoteControlSession> sessions = rcon.getClients();
            RemoteControlSession session = sessions.get(0);
            if(session.isAuthed()) {
                session.setAuthed(false);
            }
        }
    }

}

Similar projects

Plugin →