проблема с пакетом

Статус
В этой теме нельзя размещать новые ответы.

Dev_mod

Единомышленник
Участник
Сообщения
15
Розыгрыши
0
Репутация
5
Реакции
6
Баллы
115
Хроники
  1. Chaotic Throne: High Five
Исходники
Присутствуют
Сборка
L2scripts
С High Five апаю пакетку на 464 протокол, проблема когда создаёшь больше одного чара отображается только один а второй отображается не корректно
помогите понять в чём проблема


 
Решение
Судя по левелу 65535, нарушена структура пакета, который формирует лобби. Т.е количество фактически отправляемых полей не совпадает с тем количеством, которое ожидает клиент. Из-за этого, когда клиент вычитывает из буфера данные согласно ожидаемой структуре, происходит смещение и начинается хаос.
 
при входе выходят такие пакеты
[22:36:28] INFO ProtocolVersion
[22:36:28] INFO VersionCheckPacket
[22:36:28] INFO AuthLogin
[22:36:28] INFO RequestExBRVersion
[22:36:28] INFO ExBRVersion
[22:36:28] INFO LoginResultPacket
[22:36:28] INFO CharacterSelectionInfoPacket
и как я понял тот что мне нужен это CharacterSelectionInfoPacket
я пересматривал там всё несколько раз и так и не нашёл пропущеный пакет getPapedollOrder 60 пакетов getPaperdollOrderVisualld 9 пакетов
Код:
@Override
    protected final void writeImpl()
    {
        int size = _characterPackages != null ? _characterPackages.length : 0;

        writeD(size);
        writeD(Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT); // Может запретить игрокам создавать новых персонажей (если 0); (если 1, клиент спросит, можно ли создавать персонажей (0x13) Ответ: (0x0D) )
        writeC(size == Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT); // if 1 can't create new char
        writeC(0x01); // 0=can't play, 1=can play free until level 85, 2=100% free play
        writeD(0x02); // 0x01 - Выводит окно, что нужно купить игру, что создавать более 2х чаров. 0х02 - обычное лобби.
        writeC(0x00); // 0x01 - Предлогает купить ПА.
        writeC(0x00); // Balthus Knights

        long lastAccess = -1;
        if (_activeId == -1)
        {
            for (int i = 0; i < size; i++)
            {
                if (lastAccess < _characterPackages[i].getLastAccess())
                {
                    lastAccess = _characterPackages[i].getLastAccess();
                    _activeId = i;
                }
            }
        }


        for(int i = 0; i < size; i++)
        {
            CharSelectInfoPackage charInfoPackage = _characterPackages[i];

            writeS(charInfoPackage.getName()); // Character name
            writeD(charInfoPackage.getObjectId()); // Character ID
            writeS(_loginName); // Account name
            writeD(_sessionId); // Account ID
            writeD(charInfoPackage.getClanId()); // Clan ID
            writeD(0); // Builder level
            writeD(charInfoPackage.getSex()); // Sex
            writeD(charInfoPackage.getRace()); // Race
            writeD(charInfoPackage.getBaseClassId());
            writeD(Config.REQUEST_ID);
            writeD(charInfoPackage.getX());
            writeD(charInfoPackage.getY());
            writeD(charInfoPackage.getZ());
            writeF(charInfoPackage.getCurrentHp());
            writeF(charInfoPackage.getCurrentMp());
            writeQ(charInfoPackage.getSp());
            writeQ(charInfoPackage.getExp());
            int lvl = Experience.getLevel(charInfoPackage.getExp());
            writeF(Experience.getExpPercent(lvl, charInfoPackage.getExp()));
            writeD(lvl);
            writeD(charInfoPackage.getKarma());
            writeD(charInfoPackage.getPk());
            writeD(charInfoPackage.getPvP());
            writeD(0);
            writeD(0);
            writeD(0);
            writeD(0);
            writeD(0);
            writeD(0);
            writeD(0);
            writeD(0); // unk Ertheia
            writeD(0); // unk Ertheia
            for (int slot : getPaperdollOrder())
            {
                writeD(charInfoPackage.getPaperdollItemId(slot));
            }
            for (int slot : getPaperdollOrderVisualId())
            {
                writeD(charInfoPackage.getPaperdollVisualId(slot));
            }
            writeH(charInfoPackage.getPaperdollEnchantEffect(Inventory.PAPERDOLL_CHEST));
            writeH(charInfoPackage.getPaperdollEnchantEffect(Inventory.PAPERDOLL_LEGS));
            writeH(charInfoPackage.getPaperdollEnchantEffect(Inventory.PAPERDOLL_HEAD));
            writeH(charInfoPackage.getPaperdollEnchantEffect(Inventory.PAPERDOLL_GLOVES));
            writeH(charInfoPackage.getPaperdollEnchantEffect(Inventory.PAPERDOLL_FEET));
            writeD(charInfoPackage.getHairStyle());
            writeD(charInfoPackage.getHairColor());
            writeD(charInfoPackage.getFace());
            writeF(charInfoPackage.getMaxHp()); // hp max
            writeF(charInfoPackage.getMaxMp()); // mp max
            writeD(charInfoPackage.getAccessLevel() > -100 ? charInfoPackage.getDeleteTimer() : -1);
            writeD(charInfoPackage.getClassId());
            writeD(i == _activeId);
            _log.info("i == _activeId: " + (i == _activeId));
            writeC(charInfoPackage.getPaperdollEnchantEffect(Inventory.PAPERDOLL_RHAND) > 127 ? 127 : charInfoPackage.getPaperdollEnchantEffect(Inventory.PAPERDOLL_RHAND));
            writeD(charInfoPackage.getPaperdollVariation1Id(Inventory.PAPERDOLL_RHAND));
            writeD(charInfoPackage.getPaperdollVariation2Id(Inventory.PAPERDOLL_RHAND));
            writeD(0);// Transformation: Currently on retail when you are on character select you don't see your transformation.
            writeD(0); // Pet NpcId
            writeD(0); // Pet level
            writeD(0); // Pet Food
            writeD(0); // Pet Food Level
            writeF(0); // Current pet HP
            writeF(0); // Current pet MP
            writeD(charInfoPackage.getVitalityPoints());// Vitality
            if(_hasPremiumAccount)
            {
                writeD(charInfoPackage.getVitalityPoints() > 0 ? (int) (100 * Config.ALT_VITALITY_PA_RATE) : 100);
                writeD(Config.ALT_VITALITY_POTIONS_PA_LIMIT - charInfoPackage.getVitalityUsedPotions());
            }
            else
            {
                writeD(charInfoPackage.getVitalityPoints() > 0 ? (int) (100 * Config.ALT_VITALITY_RATE) : 100);
                writeD(Config.ALT_VITALITY_POTIONS_LIMIT - charInfoPackage.getVitalityUsedPotions());
            }
            writeD(charInfoPackage.getAccessLevel() != -100);
            _log.info("AccessLevel != -100: " + (charInfoPackage.getAccessLevel() != -100));
            writeC(charInfoPackage.isNoble());
            writeC(Hero.getInstance().isHero(charInfoPackage.getObjectId()) ? 2 : 0); // hero glow
            writeC(charInfoPackage.isHairAccessoryEnabled()); // show hair accessory if enabled
            writeD(0);// 235 - ban time left
            writeD((int) (charInfoPackage.getLastAccess() / 1000));
            writeC(0); // 338

            writeD(0);

            writeD(0); // 362 - Vanguard mount.
            writeD(0); // 464
            writeD(0); // 464
            writeD(0); // 464

        }
    }
 
Вопрос сразу - какой тип сервера? Эссенц, мейн и классик отличаются по структуре немного(а иногда и много).
 
Есть подозрение, что последние 4 инта(writeD) лишние и должны быть 4 байта(writeC)
 
Решение
Статус
В этой теме нельзя размещать новые ответы.
Данный сайт использует cookie. Вы должны принять их для продолжения использования. Узнать больше…