Вопрос Анализатор пакетов

Kulakus

Пользователь
Сообщения
18
привет, я хочу создать плагин который анализирует пакеты выбранного игрока
Я имею ввиду что ты вводишь /inspect и тебе выводиться на протяжении n-ого промежутка времени строки по типу "nick - время затраченное на пакет"
У меня есть опыт разработки плагинов, я хочу узнать одно: как мне перехватывать пакет и узнавать сколько было времени на него затрачено остальное, то есть основную логику, остальное я смогу сам
Объединено

up
 
Последнее редактирование:
Решение
как только прописываешь /inspect nick на протяжении 2-ух минут "слежка за пакетами"
Мы ищем игрока с указанным ником и создаем для него новый PlayerPacketListener. Затем мы регистрируем наш PacketListener для перехвата пакетов и запускаем задачу анализа на INSPECT_DURATION тиков (120 секунд). По истечении этого времени мы удаляем PacketListener и выводим результаты анализа в чат.

Код:
public class InspectCommand implements CommandExecutor {

    private static final int INSPECT_DURATION = 120 * 20; // время анализа в тиках (120 секунд)

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (!(sender instanceof Player)) {...
Для перехвата и анализа пакетов можно использовать ProtocolLib. Он позволяет создавать кастомные пакеты, перехватывать и изменять существующие пакеты, а также получать информацию о времени, затраченном на обработку каждого пакета.

Пример кода, который перехватывает и анализирует пакеты игрока при использовании этой команды:

Код:
public class InspectCommand implements CommandExecutor {
    private ProtocolManager protocolManager;
    private Map<String, Long> packetTimes = new HashMap<>();

    public InspectCommand(Plugin plugin) {
        protocolManager = ProtocolLibrary.getProtocolManager();

        // Регистрируем листенер, который будет обрабатывать пакеты игрока
        protocolManager.addPacketListener(new PacketAdapter(plugin, ListenerPriority.NORMAL, PacketType.Play.Client.ALL) {
            @Override
            public void onPacketReceiving(PacketEvent event) {
                Player player = event.getPlayer();
                String playerName = player.getName();

                // Проверяем, что игрок использует команду /inspect
                if (!player.hasMetadata("inspect")) {
                    return;
                }

                // Получаем тип и время пакета
                PacketType packetType = event.getPacketType();
                long timestamp = System.currentTimeMillis();

                // Добавляем время пакета в карту
                packetTimes.put(packetType + " - " + playerName, timestamp);
            }
        });
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (!(sender instanceof Player)) {
            sender.sendMessage("Команда только для игроков!");
            return true;
        }

        Player player = (Player) sender;

        if (args.length != 1 || !args[0].equals("inspect")) {
            return false;
        }

        // Устанавливаем метаданные игроку, чтобы отслеживать его пакеты
        player.setMetadata("inspect", new FixedMetadataValue(plugin, true));

        // Ждем 10 секунд, чтобы собрать достаточно информации
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // Удаляем метаданные игрока и выводим время, затраченное на каждый пакет
        player.removeMetadata("inspect", plugin);

        for (Map.Entry<String, Long> entry : packetTimes.entrySet()) {
            String packetType = entry.getKey();
            long time = System.currentTimeMillis() - entry.getValue();
            player.sendMessage(packetType + " - " + time + "мс");
        }

        // Очищаем карту для следующего игрока
        packetTimes.clear();

        return true;
    }
}
 
это же время обработки сервером пакета?
В примере коде мы фиксируем время приема пакета игроком на стороне сервера, когда Spigot обрабатывает пакет. Затем, когда команда /inspect выполняется, мы вычисляем время, прошедшее между моментом приема пакета и выполнением команды. Это время является приблизительным временем, затраченным на обработку пакета сервером.
 
В примере коде мы фиксируем время приема пакета игроком на стороне сервера, когда Spigot обрабатывает пакет. Затем, когда команда /inspect выполняется, мы вычисляем время, прошедшее между моментом приема пакета и выполнением команды. Это время является приблизительным временем, затраченным на обработку пакета сервером.
это не совсем то что я хочу, я хочу анализировать определенного игрока, плагин создан для анализа так называемых bad-пакет, что бы написать плагин по защите от них
 
это не совсем то что я хочу, я хочу анализировать определенного игрока, плагин создан для анализа так называемых bad-пакет, что бы написать плагин по защите от них
Всех игроков сразу? Или определенного игрока на сервере? И нужно чтобы все выводило в консоль или в чат тебе?
 
как только прописываешь /inspect nick на протяжении 2-ух минут "слежка за пакетами"
Мы ищем игрока с указанным ником и создаем для него новый PlayerPacketListener. Затем мы регистрируем наш PacketListener для перехвата пакетов и запускаем задачу анализа на INSPECT_DURATION тиков (120 секунд). По истечении этого времени мы удаляем PacketListener и выводим результаты анализа в чат.

Код:
public class InspectCommand implements CommandExecutor {

    private static final int INSPECT_DURATION = 120 * 20; // время анализа в тиках (120 секунд)

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (!(sender instanceof Player)) {
            sender.sendMessage(ChatColor.RED + "Only players can use this command!");
            return true;
        }
        Player player = (Player) sender;

        // Проверяем, что игрок ввел ник
        if (args.length != 1) {
            player.sendMessage(ChatColor.RED + "Usage: /inspect <player>");
            return true;
        }

        // Ищем игрока с указанным ником
        Player targetPlayer = Bukkit.getPlayer(args[0]);
        if (targetPlayer == null) {
            player.sendMessage(ChatColor.RED + "Player not found!");
            return true;
        }

        // Создаем новый PlayerPacketListener для анализа пакетов выбранного игрока
        PlayerPacketListener packetListener = new PlayerPacketListener(targetPlayer);

        // Регистрируем наш PacketListener для перехвата пакетов
        ProtocolLibrary.getProtocolManager().addPacketListener(packetListener);

        // Запускаем задачу анализа на INSPECT_DURATION тиков (120 секунд)
        Bukkit.getScheduler().runTaskLater(this, () -> {
            // Удаляем PacketListener после завершения анализа
            ProtocolLibrary.getProtocolManager().removePacketListener(packetListener);

            // Выводим результаты анализа в чат
            player.sendMessage(ChatColor.YELLOW + "Packet analysis results for player " + targetPlayer.getName() + ":");
            for (int packetId : packetListener.getPacketIds()) {
                long processingTime = packetListener.getPacketProcessingTime(packetId);
                player.sendMessage(ChatColor.GREEN + "Packet " + packetId + ": " + processingTime + "ms");
            }
        }, INSPECT_DURATION);

        player.sendMessage(ChatColor.YELLOW + "Analyzing packets for player " + targetPlayer.getName() + "...");

        return true;
    }

}
 
Назад
Сверху Снизу