Форум администраторов игровых серверов

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Lineage II (https://forum.zone-game.info/forumdisplay.php?f=34)
-   -   Работа над Goddess of Destruction Glory Days (https://forum.zone-game.info/showthread.php?t=24036)

elastic 03.02.2013 14:10

Re: Работа над Goddess of Destruction Glory Days
 
Не могу разобраться, в чем проблема. Вроде пакет апнул, а все равно такая фигня.
http://rghost.ru/43513999/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++;
        }
    }


Mifesto 03.02.2013 19:48

Re: Работа над Goddess of Destruction Glory Days
 
Вот мой 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);
                }
        }
}

Протокол какой используете?

elastic 03.02.2013 21:39

Re: Работа над Goddess of Destruction Glory Days
 
Работаю с 488 протоколом.

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

Gaikotsu 05.02.2013 07:59

Re: Работа над Goddess of Destruction Glory Days
 
а все опкоды расширенных пакетов корректно сдвинул?

elastic 05.02.2013 10:56

Re: Работа над Goddess of Destruction Glory Days
 
Цитата:

Сообщение от Gaikotsu (Сообщение 273582)
а все опкоды расширенных пакетов корректно сдвинул?

Поподробнее, пожалуйста. С пакеткой связался первый раз.

Добавлено через 9 минут
Пакеты с приставкой Ex ?

Gaikotsu 05.02.2013 11:12

Re: Работа над Goddess of Destruction Glory Days
 
да
начиная с 448 или 449 протокола (не помню уж) - все расширенные пакеты сдвинулись на единицу - http://www.l2jserver.com/forum/viewt...p?f=90&t=26548
P.S. только списки бери из архива в последнем сообщении темы - в первом там рсширенные коды ошибочны - сдвиг больше чем надо.

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

и вобще - сделай задавание опкодов пакетов через enum, вон как у Mifesto сделано (да и я тоже подобным образом сделал недавно) - намного удобней будет при необходимости исправлять числовые значения опкодов в одном файле, чем перебирать кучу классов с самими с пакетами.

elastic 05.02.2013 12:05

Re: Работа над Goddess of Destruction Glory Days
 
Доходчиво и понятно. Спасибо, будем пробовать :)

KilRoy 05.02.2013 12:13

Re: Работа над Goddess of Destruction Glory Days
 
	/**
	 * Формируем опКод пакета по Енуму, воизбежание проблем и заморочек с протоколами.
	 * Только для Extended пакетов (FE).
	 */
	protected void writeFe(Class<?> className)
	{
		int opCode = L2ServerPacketFEList.valueOf(className.getSimpleName()).ordinal();
 
		writeEx(opCode);
	}
Code: Java
Список пакетов(488 протокол)
enum:
Свернуть ↑Развернуть ↓

elastic 06.02.2013 17:42

Re: Работа над Goddess of Destruction Glory Days
 
Сдвинул опкоды у всех Ex пакетов, characterSelectedInfo\charInfo сделал. Но при входе в игру по прежнему все виснет и ГС пишет 0x0d=221.
Я уже не знаю, в чем проблема :<
Никто не знает случаем?

VISTALL 06.02.2013 18:15

Re: Работа над Goddess of Destruction Glory Days
 
Цитата:

Сообщение от KilRoy (Сообщение 273627)
	/**
	 * Формируем опКод пакета по Енуму, воизбежание проблем и заморочек с протоколами.
	 * Только для Extended пакетов (FE).
	 */
	protected void writeFe(Class<?> className)
	{
		int opCode = L2ServerPacketFEList.valueOf(className.getSimpleName()).ordinal();
 
		writeEx(opCode);
	}
Code: Java

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

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

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

Но блин - getSimpleName(), ты смотрел?


Текущее время: 02:11. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Перевод: zCarot