Перехват пакетов

Версия Minecraft
1.7.10
API
Forge
236
4
22
Доброй ночи всем. Назрел такой вопрос: Можно ли в forge перехватывать модовые (желательно и майновские) пакеты "Клиен->Сервер" на серверной части мода? Когда я кодил на Bukkit, то часто слышал, что там используют в таких целях ProtocolLib. Есть ли в forge возможность прослушки пакетов? Если да - можно, пожалуйста, пример реализации этого? Я пытался слушать ивенты FMLNetworkEvent.ClientCustomPacketEvent и FMLNetworkEvent.ServerCustomPacketEvent, но не 1 из них не реагировал ни на вход игрока, ни на регистрацию канала в тессеракте ThermalExpansion и т.д.
 
7,099
324
1,510
Можно. И даже можно изменять пакеты. Чекай WynnLang: WynnLangTeam/WynnLang
Там правда перехват сервер->клиент пакетов с клиентской стороны, но суть та же, просто событие ServerConnectionFromClientEvent надо юзать
 
236
4
22
Можно. И даже можно изменять пакеты. Чекай WynnLang: WynnLangTeam/WynnLang
Там правда перехват сервер->клиент пакетов с клиентской стороны, но суть та же, просто событие ServerConnectionFromClientEvent надо юзать
Вообщем научился ловить все пакеты, переопределяя channelRead(). Но вопрос теперь последний - как мне расшифровать пакет под String? Копаясь через рефлекшен апи - смог получить имя класса пакета. А вот если пытаться получить поля и их значения - я получаю обычно поле с String названием мода, int ID пакета и data (как я понял это и есть пакет). А вот как уже его расшифровывать не понимаю..
 
7,099
324
1,510
MessageHandler видел? Там чек типа пакета ,каст и обращение к геттерам пакета
 
236
4
22
MessageHandler видел? Там чек типа пакета ,каст и обращение к геттерам пакета
Ничего не понял сейчас. Я сделал так:

Java:
@SubscribeEvent
public void packetRecived(ServerConnectionFromClientEvent e)
{
    e.manager.channel().pipeline().addBefore("fml:packet_handler", "mymodid:mychannelname", new PacketHandler());
}

public class PacketHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception
    {
        super.channelRead(ctx, msg);
        System.out.println("Вот тут хочу \"расшифровать\" пакет....");   
    }
    
    
}
Но пока не нашёл как узнать скажем так какой класс создал этот пакет и как мне его "дешифровать"
 
236
4
22
Как я догадываюсь по тому коду - нужно знать в каком порядке записаны были данные в буфер. А если я собираюсь сканировать все пакеты - откуда мне этот порядок знать?
И да. Миксины - полная <...> непонятная.

Как я понял - мне нужно как-то получить обжект пакета а потом рефлексией его филды получать и значения с них.
 

will0376

Токсичная личность
2,072
55
584
И да. Миксины - полная х непонятная.
(оффтоп)Не зря же твоим ником в гравите всяких тупиков называли(да и называют)... (/оффтоп)
Тебе выше уже писали: глянь в ксенобайте прослушку.
 
7,099
324
1,510
236
4
22
Вот же у тебя пакет. Берешьи чекаешь его instanceof, потом кастуешь, потом работаешь с методами пакета. Ничего не зашифровано 🤦‍♂️
Во 1 - как я тебе угадаю чем он там кастуется? Ну ок, на рефлексию сошлёмся к примеру... А как я узнаю какие методы есть в том классе для чтения? :cautious:
 
7,099
324
1,510
Во 1 - как я тебе угадаю чем он там кастуется?
Перечисли все, которые тебе нужны. В любом случае ты должен знать, какие пакеты ожидаешь.
Если тебе нужны вообще все пакеты которые есть в сборке и могут появитсья позже - рефлексией пройдись по всех полям и отобрази каждый пакет в Map<String,Object>, а дальше работай с этими бесформенными кусками данных
 
236
4
22
Перечисли все, которые тебе нужны. В любом случае ты должен знать, какие пакеты ожидаешь.
Если тебе нужны вообще все пакеты которые есть в сборке и могут появитсья позже - рефлексией пройдись по всех полям и отобрази каждый пакет в Map<String,Object>, а дальше работай с этими бесформенными кусками данных
Я и пытался рефлекшеном так творить. Но.. В пакетах бывают либо массивы, которые трудно к "читаемой" строке прировнять, либо ещё хуже - не примитивные типы данных (к примеру ItemStack`и, NBT и т.п. Либо вообще свои экземпляры классов)
 
Сверху