Обработка пакетов в очереди.

67
1
3
Сервер и клиент постоянно обмениваются пакетами. Как я могу пустить проверку этих пакетов через свой код на стороне клиента, т.е до их отправки/выполнения?
Мб какие эвенты есть?


Вот тут хранятся пакеты, которые присылает сервер:
Код:
Minecraft.getMinecraft().thePlayer.sendQueue.getNetworkManager().receivedPacketsQueue
Но это поле приватное.
Конечно можно с ним работать так:
Код:
Object o = Minecraft.getMinecraft().thePlayer.sendQueue.getNetworkManager();
Field privateField = o.getClass().getDeclaredField("receivedPacketsQueue");
privateField.setAccessible(true);
Queue queue = (Queue)privateStringField.get(o);
Но это по-моему совсем извращение.
И мне нужно обработать только определенный пакет и сразу, а не вызывать перебор всей очереди каждую миллисекунду.
 
Access Transformer'ом можно сделать любое поле и метод публичными
 
Agravaine написал(а):
А для чего тебе это?
Мне нужно на стороне клиента обрабатывать пакеты класса S03PacketTimeUpdate (и не только их).
Например удалять, редактировать их.
 
Вопрос актуален. Пока что использую костыль:
из соседнего потока:
Код:
Object o = Minecraft.getMinecraft().thePlayer.sendQueue.getNetworkManager();
Field privateField = o.getClass().getDeclaredField("receivedPacketsQueue");
privateField.setAccessible(true);
Queue queue = (Queue)privateStringField.get(o);


TIME_PACKET = new Predicate<Object>(){
              @Override
              public boolean test(Object o) {
                return o instanceof S03PacketTimeUpdate;
              }
            };

while(true)
    queue.removeIf(TIME_PACKET);
Но не дает мне все, что я хотел реализовать. Так я могу только удалять пакеты. А мне нужно еще доставать их, 
читать поля.
 
AT тебе точно в помощь:
В файле modid_at.cfg:
public путь до класса */field # * - это все переменные, field это одна переменная, выбирай сам.
С методами тоже можно так работать, но вижу, тебе это не нужно.
 
Подскажите: на форуме была где то темка про динамическое редактирование методов minecraft при загрузке мода.
 
Зачем тянуть еще 1 библиотеку? Оставь как есть, оно сильно тормозить не будет.
 
Значит Access Transformer никого не интересует, лучше использовать велики (╯°□°)╯︵ ┻━┻
 
У тебя всё, что не используется, так, как ты хочешь - велики. Одно из двух:
ты даун
у тебя проблемы с ЧСВ
 
Мда, это самый лёгкий способ сделать, а ты тут ещё и гадаешь кто я.
 
Ладно, не буду спорить. С тебя код, который будет заниматься сортировкой пакетов и сам файлик трансформера
 
Щас прям, для тебя буду писать ещё и код, катись отсюда.
Текст , который нужно вставить в трансформер я уже дал, слепой что-ли?
 
Xakep_SDK написал(а):
Оставь как есть, оно сильно тормозить не будет.
Код:
while(true)
    queue.removeIf(TIME_PACKET);
Ога. Не будет.

Вот как оно делается либой из той темы, ссылку на которую дал агравейн.
Хук, конечно, не в классе FMLClientHandler'а, но это для наглядности.
В данном случае добавление пакета в очередь отправки отменится, если это пакет, удовлетворяющий условию хук-метода.
kiss_12kb.1452462187.png

- Хм, кода мало, вроде норм. О НЕТ! ЗДЕСЬ ЖЕ ЛИШНЯЯ БИБЛИОТЕКА, Я УМРУ!
- Хотя стойте, стойте, я же могу полностью засрать пару ядер, чтобы они как можно чаще (любой sleep добавит шансов пропустить пакет, он вполне может отправиться раньше, чем его перехватит while) полностью перебирали лист и модифицировали его. Ой да какой concurrentModification, ты что.
 
Назад
Сверху