Посмотрите видео ниже, чтобы узнать, как установить наш сайт в виде веб-приложения на главном экране.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
при входе выходят такие пакеты
[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); // Может запретить игрокам создавать новых...
при входе выходят такие пакетыСудя по левелу 65535, нарушена структура пакета, который формирует лобби. Т.е количество фактически отправляемых полей не совпадает с тем количеством, которое ожидает клиент. Из-за этого, когда клиент вычитывает из буфера данные согласно ожидаемой структуре, происходит смещение и начинается хаос.
@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)при входе выходят такие пакеты
[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)