Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Работа над Goddess of Destruction Glory Days
#31
Не могу разобраться, в чем проблема. Вроде пакет апнул, а все равно такая фигня.
[Изображение: image.png]
Код:
public class CharacterSelectionInfo extends L2GameServerPacket {
    private static final Logger _log = LoggerFactory.getLogger(CharacterSelectionInfo.class);

    private String _loginName;

    private int _sessionId;

    private CharSelectionInfo charSelectionInfo;

    public CharacterSelectionInfo(String loginName, int sessionId) {
        _sessionId = sessionId;
        _loginName = loginName;
        charSelectionInfo = loadCharacterSelectInfo(loginName);
    }

    public CharSelectionInfo getCharInfo() {
        return charSelectionInfo;
    }

    @Override
    protected final void writeImpl() {
        int size = charSelectionInfo.size();

        writeC(0x09);
        writeD(size);
        writeD(0x07);
        writeC(0x00);
        writeC(0x01);
        writeD(0x00);

        long lastAccess = -1L;
        int lastUsed = -1;
        for (CharSelectInfoPackage info : charSelectionInfo)
            if (lastAccess < info.getLastAccess())
            {
                lastAccess = info.getLastAccess();
                lastUsed++;
            }
        int i = 0;
        for (CharSelectInfoPackage charInfoPackage : charSelectionInfo) {
            writeS(charInfoPackage.getName());
            writeD(charInfoPackage.getCharId()); // ?
            writeS(_loginName);
            writeD(_sessionId);
            writeD(charInfoPackage.getClanId());
            writeD(0x00); // ??

            writeD(charInfoPackage.getSex());
            writeD(charInfoPackage.getRace());
            writeD(charInfoPackage.getBaseClassId());

            
            writeD(0x01); // default active for all (GOD)

            writeD(charInfoPackage.getX());
            writeD(charInfoPackage.getY());
            writeD(charInfoPackage.getZ());

            writeF(charInfoPackage.getCurrentHp());
            writeF(charInfoPackage.getCurrentMp());

            writeD(charInfoPackage.getSp());
            writeQ(charInfoPackage.getExp());
            writeF(Experience.getExpPercent(charInfoPackage.getLevel(), charInfoPackage.getExp()));
            writeD(charInfoPackage.getLevel());

            writeD(charInfoPackage.getKarma());
            writeD(charInfoPackage.getPk());
            writeD(charInfoPackage.getPvP());

            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            writeD(0x00);

            for (int PAPERDOLL_ID : Inventory.PAPERDOLL_ORDER)
                writeD(charInfoPackage.getPaperdollItemId(PAPERDOLL_ID));
                
            writeD(0);
            writeD(0);
            writeD(0);
            writeD(0);
            writeD(0);
            writeD(0);
            writeD(0);
            writeD(0);
            writeD(0);
            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 == lastUsed ? 1 : 0);

            writeC(Math.min(charInfoPackage.getPaperdollEnchantEffect(Inventory.PAPERDOLL_RHAND), 127));

            writeH(0x00);
            writeH(0x00);

            int weaponId = charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_RHAND);
            if (weaponId == 8190) // Transform id
                writeD(301);
            else if (weaponId == 8689)
                writeD(302);
            else
                writeD(0x00);

            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            writeF(0x00);
            writeF(0x00);

            writeD(charSelectionInfo.getVitalityPoints());
            writeD(0); //?
            writeD(0); //?
            writeD(charInfoPackage.getAccessLevel() > -100 ? 0x01 : 0x00);
            writeC(0x00);
            writeC(0x00);
            i++;
        }
    }
Ответ
#32
Вот мой 488
Код:
public class CharacterSelectionInfo extends L2GameServerPacket
{
    private static final Logger _log = LoggerFactory.getLogger(CharacterSelectionInfo.class);

    private String _loginName;
    private int _sessionId;
    private CharInfoList _charInfoList;

    public CharInfoList getCharInfo()
    {
        return _charInfoList;
    }

    public CharacterSelectionInfo(String loginName, int sessionId)
    {
        _sessionId = sessionId;
        _loginName = loginName;
        _charInfoList = new CharInfoList(loginName);
    }

    @Override
    protected final void writeImpl()
    {
        writeEx(ServerPacket.CharacterSelectionInfo);

        writeD(_charInfoList != null ? _charInfoList.size() : 0);
        writeD(0x07); // Максимальное количество персонажей на сервере
        writeC(0x00); // Разрешает или запрещает создание игроков
        writeC(0x01);
        writeD(0x00);

        for(CharInfoList.CharInfo _charInfo :  _charInfoList)
        {
            writeS(_charInfo.getName());
            writeD(_charInfo.getCharId()); // ?
            writeS(_loginName);
            writeD(_sessionId);
            writeD(_charInfo.getClanId());
            writeD(0x00); // ??

            writeD(_charInfo.getSex());
            writeD(_charInfo.getRace());
            writeD(_charInfo.getBaseClassId());

            writeD(0x01); // active ??

            writeD(_charInfo.getX());
            writeD(_charInfo.getY());
            writeD(_charInfo.getZ());

            writeF(_charInfo.getCurrentHp());
            writeF(_charInfo.getCurrentMp());

            writeD(_charInfo.getSp());
            writeQ(_charInfo.getExp());
            writeF(Experience.getExpPercent(_charInfo.getLevel(), _charInfo.getExp()));
            writeD(_charInfo.getLevel());

            writeD(_charInfo.getKarma());
            writeD(_charInfo.getPk());
            writeD(_charInfo.getPvP());

            for (int j = 0; j < 7; j++)
                writeD(0x00);

            for(int PAPERDOLL_ID : Inventory.PAPERDOLL_ORDER)
                writeD(_charInfo.getPaperdollItemId(PAPERDOLL_ID));

            writeD(_charInfo.getPaperdollVisualId(Inventory.PAPERDOLL_RHAND)); //Внешний вид оружия (ИД Итема).
            writeD(_charInfo.getPaperdollVisualId(Inventory.PAPERDOLL_LHAND)); //Внешний вид щита (ИД Итема).
            writeD(_charInfo.getPaperdollVisualId(Inventory.PAPERDOLL_GLOVES)); //Внешний вид перчаток (ИД Итема).
            writeD(_charInfo.getPaperdollVisualId(Inventory.PAPERDOLL_CHEST)); //Внешний вид верха (ИД Итема).
            writeD(_charInfo.getPaperdollVisualId(Inventory.PAPERDOLL_LEGS)); //Внешний вид низа (ИД Итема).
            writeD(_charInfo.getPaperdollVisualId(Inventory.PAPERDOLL_FEET)); //Внешний вид ботинок (ИД Итема).
            writeD(0);
            writeD(_charInfo.getPaperdollVisualId(Inventory.PAPERDOLL_HAIR)); //Внешний вид шляпы (ИД итема).
            writeD(_charInfo.getPaperdollVisualId(Inventory.PAPERDOLL_DHAIR)); //Внешний вид маски (ИД итема).

            writeD(_charInfo.getHairStyle());
            writeD(_charInfo.getHairColor());
            writeD(_charInfo.getFace());

            writeF(_charInfo.getMaxHp()); // hp max
            writeF(_charInfo.getMaxMp()); // mp max

            writeD(_charInfo.getAccessLevel() > -100 ? _charInfo.getDeleteTime() : -1);
            writeD(_charInfo.getClassId());
            writeD(_charInfo.isLast() ? 1 : 0);

            writeC(Math.min(_charInfo.getPaperdollEnchantEffect(Inventory.PAPERDOLL_RHAND), 127));

            writeH(0x00);
            writeH(0x00);

            int weaponId = _charInfo.getPaperdollItemId(Inventory.PAPERDOLL_RHAND);
            if (weaponId == 8190) // Transform id
                writeD(301);
            else if (weaponId == 8689)
                writeD(302);
            else
                writeD(0x00);

            for (int j = 0; j < 4; j++)
                writeD(0x00);

            writeF(0x00);
            writeF(0x00);

            writeD(getClient().getVitalityPoints()); // Vitality Points
            writeD(getClient().getVitalityPercent()); // Vitality percent
            writeD(getClient().getVitalityItemCounts()); //Vitaliti items count
            writeD(_charInfo.getAccessLevel() > -100 ? 0x01 : 0x00); // Access level
            writeC(0x00);
            writeC(0x00);
        }
    }
}

Протокол какой используете?
Ответ
#33
Работаю с 488 протоколом.

Никто не подскажет, какие serverpackets отвечают за вход в игру? Бьюсь уже второй день: при попытке зайти в игру, окно загрузки виснет, а через некоторое время вылез в гс 0xd0=221 и пара ошибок при чтении клиент_пакетов.
Неужели надо в каждом серверном пакете менять опкод? :confused:
Ответ
#34
а все опкоды расширенных пакетов корректно сдвинул?
Ответ
#35
Gaikotsu Написал:а все опкоды расширенных пакетов корректно сдвинул?
Поподробнее, пожалуйста. С пакеткой связался первый раз.

Добавлено через 9 минут
Пакеты с приставкой Ex ?
Ответ
#36
да
начиная с 448 или 449 протокола (не помню уж) - все расширенные пакеты сдвинулись на единицу - http://www.l2jserver.com/forum/viewtopic...90&t=26548
P.S. только списки бери из архива в последнем сообщении темы - в первом там рсширенные коды ошибочны - сдвиг больше чем надо.

+ там только для 479 протокола, но в большинстве своем там совдпадает все с 488, только в 488 сразу после 0xFE:0x13B: ExAbnormalVisualEffectInfo вставили еще один пакет, так что следующие надо еще на единицу сдвинуть.

и вобще - сделай задавание опкодов пакетов через enum, вон как у Mifesto сделано (да и я тоже подобным образом сделал недавно) - намного удобней будет при необходимости исправлять числовые значения опкодов в одном файле, чем перебирать кучу классов с самими с пакетами.
Ответ
#37
Доходчиво и понятно. Спасибо, будем пробовать Smile
Ответ
#38
[SRC="java"] /**
* Формируем опКод пакета по Енуму, воизбежание проблем и заморочек с протоколами.
* Только для Extended пакетов (FE).
*/
protected void writeFe(Class<?> className)
{
int opCode = L2ServerPacketFEList.valueOf(className.getSimpleName()).ordinal();

writeEx(opCode);
}[/SRC]
Список пакетов(488 протокол)
enum
Ответ
#39
Сдвинул опкоды у всех Ex пакетов, characterSelectedInfo\charInfo сделал. Но при входе в игру по прежнему все виснет и ГС пишет 0x0d=221.
Я уже не знаю, в чем проблема :<
Никто не знает случаем?
Ответ
#40
KilRoy Написал:[SRC="java"] /**
* Формируем опКод пакета по Енуму, воизбежание проблем и заморочек с протоколами.
* Только для Extended пакетов (FE).
*/
protected void writeFe(Class<?> className)
{
int opCode = L2ServerPacketFEList.valueOf(className.getSimpleName()).ordinal();

writeEx(opCode);
}[/SRC]

уж неудержался.

Ты сам знаеш - что да как?

Например как разворащивается valueOf? - ок один цыкл. No problem

Но блин - getSimpleName(), ты смотрел?
consulo.io - Consulo - multi-language IDE
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Работа над Goddess of Destruction (part 7) n3k0nation 459 174,227 03-21-2022, 04:21 PM
Последний пост: TieLay
  {EuroPTS} Glory Days by nexten SWnet 0 1,587 03-13-2021, 03:37 PM
Последний пост: SWnet
  Работа с камерой и Энтер чат FriendlyGhost 0 1,301 04-29-2018, 06:07 AM
Последний пост: FriendlyGhost
  Goddess of Destruction ( новая ветка от NcSoft ) Bacek 180 58,976 08-22-2017, 12:32 PM
Последний пост: BadStealth
  Оплачиваемая работа Grek1993 1 1,349 08-01-2015, 11:29 AM
Последний пост: ztaecz
  Работа над Goddess of Destruction (part 6) Ashe 1,274 471,494 07-11-2015, 08:00 PM
Последний пост: n3k0nation
  Работа с мультиселлом Evencelance 11 2,446 09-19-2014, 12:43 PM
Последний пост: Evencelance
  Работа над Goddess of Destruction (part 5) Ozzy 980 338,530 10-09-2013, 09:13 AM
Последний пост: Ashe
  Сборщик мусора glory days promailer 7 2,157 07-09-2013, 08:28 PM
Последний пост: Dеmon
  Зависания Glory Days promailer 14 3,884 07-03-2013, 12:47 PM
Последний пост: promailer

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)