Отправка пакета CPacketPlayerTryUseItem на сервер

Версия Minecraft
1.12.2
API
Forge
Здравствуйте.

Представим, что у нас есть клиент с установленным модом и какой-то сервер. На сервере есть мини-игра, суть которой в том, что на экране в титле появляются цифры от 1 до 6 (своеобразная рулетка), а задача игроков - нажать ПКМ в тот момент, когда на экране цифра 6 (нажать можно в любой момент, но от цифры зависит количество полученных очков, поэтому чем больше, тем лучше). Так как я ещё новичок в разработке модов, идея, которая пришла мне в голову, как реализовать это с помощью мода, такая:
1. Отслеживать каждый тик, что находится в титле у игрока.
2. Если титл равен "6", отправить пакет CPacketPlayerTryUseItem (или вызвать метод mc.playerController.processRightClick, пробовал и то, и то, результат примерно одинаковый).

Цифры меняются примерно раз в 4 тика (по моим подсчётам). Всё, что я описал выше, у меня реализовано и работает, то есть мод фиксирует "нужный" титл и отправляет пакет на сервер. Однако проблема в том, что результат моего действия (ответ от сервера) не тот, который мне нужен - если, например, на экране цифры меняются в порядке 4-6-2-3, то во время шестёрки пакет отправится, но сервер отправляет сообщение о том, что я "выбил" двойку или тройку, то есть словно я отправил пакет на несколько тиков позже.

Я не понимаю, можно ли это вообще как-то исправить. У меня есть подозрение, что такое поведение зависит от скорости интернет-соединения и никак, кроме как переехать к хосту сервера, исправить я это не могу.

Можно ли, например, как-то отправить такой пакет, который даст серверу понять, что я "нажал ПКМ" именно когда на экране была шестёрка? Такое вообще возможно? Если нет, то что делать?

Не думаю, что здесь необходимо прикреплять какой-то код, но если надо будет, то прикреплю.
 
Решение
@SecretAgent12, можете, пожалуйста, объяснить подробнее? Что за класс Robot? Вы имеете в виду, что я должен при получении титла использовать его для нажатия ПКМ?

Как-то так?
Java:
@SubscribeEvent
public void onTickUpdate(TickEvent.ClientTickEvent event){
String currentTitle = RenderUtils.getTitle(mc);
    if (currentTitle == "6"){
        Robot robot = null;
        try {
              robot = new Robot();
        } catch (AWTException e) {
              e.printStackTrace();
        }
        robot.mousePress(InputEvent.BUTTON1_MASK);
    }
}

Потому что этот класс я встречаю впервые. (RenderUtils - мой класс с методом получения текущего титла)
 
Всё равно ответ сервера приходит с "запозданием".

Вот мой код:
Java:
public int ticks = 0;
        public int ticksCounter = 0;
        @SubscribeEvent
        public void onClientTick(TickEvent.ClientTickEvent event){

            if (enabledModes.contains("Рулетка")) {
                ticksCounter++;
                String currentTitle = RenderUtils.getTitle(mc);
                ChatUtils.sendMessage(mc.player, "[" + ticksCounter + "] Текущий титл: " + currentTitle);
                if (ticks == 1){
                    Ruletka.releaseRightClick(mc);
                    ChatUtils.sendMessage(mc.player, "[" + ticksCounter + "] Отпускаю ПКМ");
                    ticks++;
                }
                else if (currentTitle.contains("a6")){
                    Ruletka.holdRightClick(mc);
                    ChatUtils.sendMessage(mc.player, "[" + ticksCounter + "] Обнаружено совпадение, нажимаю ПКМ");
                    ticks++;
                }

            }
        }


Вот логи клиента:
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [115] Текущий титл: §64§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [116] Текущий титл: §64§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [117] Текущий титл: §64§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [118] Текущий титл: §a6§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [118] Обнаружено совпадение, нажимаю ПКМ
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [119] Текущий титл: §a6§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [119] Отпускаю ПКМ
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [120] Текущий титл: §e5§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [121] Текущий титл: §e5§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [122] Текущий титл: §e5§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [123] Текущий титл: §e5§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [124] Текущий титл: §52§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [125] Текущий титл: §52§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [126] Текущий титл: §52§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [127] Текущий титл: §52§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] На Вашем кубике выпало число: 5
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [128] Текущий титл: §e5§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [129] Текущий титл: §e5§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [130] Текущий титл: §e5§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [131] Текущий титл: §e5§r
[19:49:43] [Client thread/INFO] [net.minecraft.client.gui.GuiNewChat]: [CHAT] [132] Текущий титл: §e5§r

Как можно заметить, клик ПКМ выполняется вовремя (в квадратных скобках номер текущего тика с запуска мода), однако сервер отвечает так, словно я нажал ПКМ на 128 тике, а не на 118.
 
То есть это никак нельзя реализовать, получается?

Пинг 80-100 мс. По такой логике, задержка в 10 тиков всё равно слишком большая. Так как нужный титл примерно держится 3-4 тика в среднем, то в 2 тика задержка не критична.
 
7,099
324
1,510
Сверху