Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Плагин Protocoller v0.0.5 - Многофункциональный и простой в использовании прехватчик пакетов Minecraft

ReloGGrc

Активный участник
Пользователь
Баллы
46
Имя в Minecraft
ALis
GitHub: https://github.com/ItsALisName/Protocoller
Скачать: https://github.com/ItsALisName/Protocoller/releases/

Protocoller


Это весьма простой в использовании "перехватчик" исходящих/входящих пакетов Minecraft.
Иногда невозможно осуществить что-либо с использованием стандартных API, с помощью данного плагина, вы получаете возможность перехватывать пакеты при их отправке/получении и редактировать их, что значительно расширяет возможности разработчика плагина. Так же можно создавать свои пакеты что здесь также просто, все(почти) классы Minecraft необходимые для создания пакетов присутствуют и деобфусцированы, а так же все адаптировано под мультиверсионность.

​

Пример работы с API:
(Или на GitHub'e)​

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() { }

}
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");
        }
    }

}
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;
        }
    }

}
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();

    }


}
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(Может быть null)
        if(rcon != null){
            List<RemoteControlSession> sessions = rcon.getClients();
            RemoteControlSession session = sessions.get(0);
            if(session.isAuthed()) {
                session.setAuthed(false);
            }
        }
    }

}
Код:
package ExamplePlugin;

import net.alis.protocoller.NetworkServer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;

import java.util.List;

public class CommandWorkingExample {

    public void registerCommands() {
        NetworkServer server = MainClass.protocollerApi.getServer();
        Command command = server.getCommandMap().getCommand("tpa");
        server.getCommandMap().unregister(command);
        server.getCommandMap().register("plugin_name", new ExampleCommand("example"));
        server.syncCommands();
    }

    public static class ExampleCommand extends Command {

        protected ExampleCommand(@NotNull String name) {
            super(name);
            this.setPermission("example.permission");
            this.setAliases(List.of("example1", "example2"));
        }

        @Override
        public boolean execute(@NotNull CommandSender commandSender, @NotNull String s, @NotNull String[] strings) {
            commandSender.sendMessage("Command successfully executed!");
            return true;
        }

        @NotNull
        @Override
        public List<String> tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException {
            return List.of("Your", "custom", "completions");
        }
    }

}

Команды:
​
  1. /protocoller, /protocoller ?, /protocoller help - показывает список команд с описанием; (PERMISSION: protocoller.command)
  2. /protocoller version - показывает текущую версию плагина; (PERMISSION: protocoller.command.version)
  3. /protocoller checkupdates - принудительно запускает проверку обновлений; (PERMISSION: protocoller.command.checkupdates)
  4. /protocoller users - показывает список пользователей API; (PERMISSION: protocoller.command.users)
  5. /protocoller users unregister <name> - удаляет определенного пользователя; (PERMISSION: protocoller.command.users.unregister)
  6. /protocoller reload - перезагружает конфигурацию; (PERMISSION: protocoller.command.reload)
Для выполенения любой команды из данных нужно как минимум право 'protocoller.command'
При выполнение из игры все команды снабжены автозаполением, наводимым и кликабельным текстом(В некоторых случаях при наличии определенных прав).​
 
Последнее редактирование:
Обновление, версия 0.0.3:
  • Добавлены методы NetworkPlayer#getGameProfile(), NetworkPlayer#getPlayerAbilities(), NetworkPlayer#setPlayerAbilities(PlayerAbilities);
  • Добавлен пакет ClientboundChunksBiomesPacket
  • Добавлен пакет ClientboundCustomChatCompletionsPacket
  • Добавлен пакет ClientboundDamageEventPacket
  • Добавлен пакет ClientboundDeleteChatPacket
  • Добавлен пакет ClientboundDisguisedChatPacket
  • Добавлен пакет ClientboundHurtAnimationPacket
  • Добавлен пакет ClientboundInitializeBorderPacket

Новая версия доступна на GitHub'e
 
Protocoller v0.0.4​
  • (BETA) Добавлена проверка более новых версий с возможность автоматической загрузки новой версии (Все настраивается в конфиге)
Новая версия доступна на GitHub'e
 
В чем преимущество над ProtocolLib?
 
На мой взгляд только в том, что он проще, ну а вообще кому как
 
Protocoller v0.0.5
​
  • Добавлен метод NetworkPlayer#setGameProfile(GameProfile)
  • Исправлен метод ClientboundPlayerInfoRemovePacket#setPlayerList(List<UUID>)
  • Добавлен пакет ClientboundPlayerInfoUpdatePacket
  • Добавлен пакет ClientboundServerDataPacket
  • Добавлен метод NetworkServer#worlds() [BETA]
  • Доработан класс Vector2F
  • Добавлен конструктор для пакета ClientboundInitializeBorderPacket
  • Добавлен конструктор для пакета ClientboundLevelChunkPacketData
  • Добавлен метод NetworkServer#getWorldServer(String) [BETA]
  • Добавлен конструктор для пакета ClientboundLevelChunkWithLightPacket
  • Добавлен конструктор для пакета ClientboundLightUpdatePacketData
  • Исправлен пакет ClientboundSetSimulationDistancePacket
  • Добавлен конструктор для пакета PacketPlayInBEdit(Только для версий 1.17 и выше)
  • Добавлен метод NetworkServer#getCommandListenerWrapper()
  • Добавлен метод NetworkPlayer#getCommandListenerWrapper()
  • Добавлен метод NetworkPlayer#getWorld()
  • Добавлен метод NetworkPlayer#setPlayerInput(float, float, boolean, boolean)
  • Добавлен метод NetworkPlayer#restoreFrom(NetworkPlayer, boolean)
  • Добавлен метод NetworkPlayer#sendChatMessage(ChatComponent)
  • Добавлен метод NetworkPlayer#sendChatMessageAsync(ChatComponent)
  • Добавлен метод NetworkPlayer#sendActionbarText(ChatComponent)
  • Добавлен метод NetworkPlayer#sendActionbarTextAsync(ChatComponent)
  • Добавлен метод NetworkPlayer#trackChunk(ChunkCoordIntPair, Packet)
  • Добавлен метод NetworkPlayer#untrackChunk(ChunkCoordIntPair)
  • Добавлен пакет PacketPlayOutTitle
  • Добавлен метод NetworkServer#syncCommands()
  • Добавлен пакет ClientboundSetTitleTextPacket
  • Добавлен пакет ClientboundSetSubtitleTextPacket
  • Добавлен метод NetworkPlayer#sendTitle(TitleData)
  • Добавлен метод NetworkPlayer#sendTitleAsync(TitleData)
  • Добавлен пакет ClientboundSetBorderCenterPacket
  • Добавлен пакет ClientboundSetBorderLerpSizePacket
  • Добавлен пакет ClientboundSetBorderSizePacket
  • Добавлен пакет ClientboundSystemChatPacket
  • Добавлен пакет ClientboundUpdateEnabledFeaturesPacket
  • Добавлен пакет ClientboundPlayerChatPacket
  • В файле general.yml добавлен параметр replace-plugins-command
  • В файле general.yml добавлен параметр async.command-execution
  • Добавлен метод NetworkServer#getCommandMap()
  • В файле general.yml добавлен параметр disable-reload-command
  • В файле general.yml добавлен параметр replace-version-command
  • В файле general.yml добавлен параметр version-command-message
  • Обновлен пакет PacketPlayOutAdvancements
Добавлены команды:
  • /protocoller, /protocoller ?, /protocoller help - показывает список команд с описанием; (PERMISSION: protocoller.command)
  • /protocoller version - показывает текущую версию плагина; (PERMISSION: protocoller.command.version)
  • /protocoller checkupdates - принудительно запускает проверку обновлений; (PERMISSION: protocoller.command.checkupdates)
  • /protocoller users - показывает список пользователей API; (PERMISSION: protocoller.command.users)
  • /protocoller users unregister <name> - удаляет определенного пользователя; (PERMISSION: protocoller.command.users.unregister)
  • /protocoller reload - перезагружает конфигурацию; (PERMISSION: protocoller.command.reload)

Новая версия доступна на GitHub'e
​
 

Поделиться этой страницей

Назад
Верх