парсинг и рабор пакета "S_EX_CHAR_INFO"

mouzy724

Единомышленник
Участник
Сообщения
36
Розыгрыши
0
Решения
1
Репутация
0
Реакции
20
Баллы
145
Всем привет. Может кто то скинуть как парсить пакет S_EX_CHAR_INFO? На всякий (клиент мейн - актуал)
В 542 протоколе информация о персонажах прилетает в этом пакете. Я нашел функцию которая парсит этот пакет, но она просто адово выглядит с огромным количествов условий в парсинге. Не получается распарсить самому.

Так же интересно есть ли способ как то где-то подсмотреть структуру пакетов которые могут меня интересовать, а не все через иду ковырять?

Спасибо за ответы
 
Интерфейсе он описан полность.
Из приколов - это записи шортов в начале каждого блока, которые отвечают за размер всего блока в байтах. Он не фиксированный, так как блок имеет в себе инфу о нике / титуле / аве / кубиках, которые имеют разную длину для каждого отдельно персонажа.

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

Ну а так, получился вот такой ужас:

Java:
   @Override
    public boolean write(PacketWriter packetWriter)
    {
        int cachedInformationBlockLength = 0;
        int realTimeInformationBlockLength = 0;
        for (DynamicBroadcastExCharInfoBlockType dynamicBroadcastExCharInfoBlockType : DynamicBroadcastExCharInfoBlockType.values())
        {
            if (dynamicBroadcastExCharInfoBlockType.ordinal() >= _packetData.length || _packetData[dynamicBroadcastExCharInfoBlockType.ordinal()] == null)
            {
                continue;
            }
            if (dynamicBroadcastExCharInfoBlockType.getBlockType() == IDynamicExCharInfoBlock.CACHE_BLOCK_TYPE)
            {
                cachedInformationBlockLength += _packetData[dynamicBroadcastExCharInfoBlockType.ordinal()].length;
            }
            else if (dynamicBroadcastExCharInfoBlockType.getBlockType() == IDynamicExCharInfoBlock.REAL_TIME_BLOCK_TYPE)
            {
                realTimeInformationBlockLength += _packetData[dynamicBroadcastExCharInfoBlockType.ordinal()].length;
            }
        }
        packetWriter.writeH(Short.BYTES + cachedInformationBlockLength);
        for (DynamicBroadcastExCharInfoBlockType dynamicBroadcastExCharInfoBlockType : DynamicBroadcastExCharInfoBlockType.values())
        {
            if (dynamicBroadcastExCharInfoBlockType.ordinal() >= _packetData.length || _packetData[dynamicBroadcastExCharInfoBlockType.ordinal()] == null)
            {
                continue;
            }
            if (dynamicBroadcastExCharInfoBlockType.getBlockType() == IDynamicExCharInfoBlock.CACHE_BLOCK_TYPE)
            {
                packetWriter.writeB(_packetData[dynamicBroadcastExCharInfoBlockType.ordinal()]);
            }
        }

        packetWriter.writeH(Short.BYTES + realTimeInformationBlockLength);
        for (DynamicBroadcastExCharInfoBlockType dynamicBroadcastExCharInfoBlockType : DynamicBroadcastExCharInfoBlockType.values())
        {
            if (dynamicBroadcastExCharInfoBlockType.ordinal() >= _packetData.length || _packetData[dynamicBroadcastExCharInfoBlockType.ordinal()] == null)
            {
                continue;
            }
            if (dynamicBroadcastExCharInfoBlockType.getBlockType() == IDynamicExCharInfoBlock.REAL_TIME_BLOCK_TYPE)
            {
                packetWriter.writeB(_packetData[dynamicBroadcastExCharInfoBlockType.ordinal()]);
            }
        }
        return true;
    }
 

Ну условно есть у нас в интерфейсе
C-подобный:
static function bool Decode_S_EX_CHAR_INFO(out _S_EX_CHAR_INFO packet)
{
    local int i, nSize;

    i = GetCurDecodePos();
    if(! DecodeShort(nSize))
    {
        return false;
    }
    if(! Decode_CachedParameters(packet.cachedParameters))
    {
        return false;
    }
    if(GetCurDecodePos() - i > nSize)
    {
        return false;
    }
    i = GetCurDecodePos();
    if(! DecodeShort(nSize))
    {
        return false;
    }
    if(! Decode_RealtimeParameters(packet.realtimeParameters))
    {
        return false;
    }
    if(GetCurDecodePos() - i > nSize)
    {
        return false;
    }
    return true;
}
где - if(GetCurDecodePos() - i > nSize)
это if(! DecodeShort(nSize)), где nSize - Short + байтовый размер следующего блока
ну а блоки - Decode_CachedParameters(packet.cachedParameters) в этом же файлике ищем и находим:
C-подобный:
static function bool Decode_CachedParameters(out _CachedParameters packet)
{
    local int i, nSize;

    if(! DecodeInt(packet.nID))
    {
        return false;
    }
    if(! DecodeShort(packet.hRace))
    {
        return false;
    }
 
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше…