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

Форум администраторов игровых серверов (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)

Mazaffaka 01.11.2012 16:11

Работа над Goddess of Destruction Glory Days
 
кто хочет занятся этой лабудой пишите мне
работаю на 479 протоколе(птс руофф или NA OFF)
1. это пакет на скилы
Код:

public class ExAcquirableSkillListByClass extends L2GameServerPacket {
    private Player player;
    private Collection<SkillLearn> skills;
    private List<Require> _reqs = Collections.emptyList();

    public ExAcquirableSkillListByClass(Player player)
    {
        this.player = player;
        skills = new ArrayList<SkillLearn>();
        for (SkillLearn skill : SkillAcquireHolder.getInstance().getAvailableSkills(player, AcquireType.NORMAL, true))
        {
            if (skill.getCost() != 0) {
                skills.add(skill);
            }
        }
    }

    @Override
    protected final void writeImpl() {
        writeEx449(0xF9);

        writeD(skills.size());
        for (SkillLearn skillLearn : skills) {
            writeD(skillLearn.getId());// skill id
            writeD(skillLearn.getLevel());// skill level
            writeD(skillLearn.getCost());// sp_cost
            writeH(skillLearn.getMinLevel());// Required Level
            writeH(0);//Glory Days
            writeD(_reqs.size());
            for (Require temp : _reqs)
            {
                writeD(temp.itemId);
                writeQ(temp.count);
            }

            writeD(skillLearn.getRemovedSkillsForPlayer(player).size());// deletedSkillsSize
            for (Skill skill : skillLearn.getRemovedSkillsForPlayer(player)) {
                writeD(skill.getId());// skillId
                writeD(skill.getLevel());// skillLvl
            }
        }
    }
   
    private static class Require {
        public int itemId;
        public long count;

        public Require(int pItemId, long pCount) {
            itemId = pItemId;
            count = pCount;
        }
    }
}

2. это чарселектинфо
Код:

package l2p.gameserver.network.serverpackets;

import l2p.commons.dbutils.DbUtils;
import l2p.gameserver.Config;
import l2p.gameserver.dao.CharacterDAO;
import l2p.gameserver.database.DatabaseFactory;
import l2p.gameserver.model.CharSelectionInfo;
import l2p.gameserver.model.CharSelectionInfo.CharSelectInfoPackage;
import l2p.gameserver.model.base.ClassId;
import l2p.gameserver.model.base.Experience;
import l2p.gameserver.model.base.Race;
import l2p.gameserver.model.base.SubClassType;
import l2p.gameserver.model.items.Inventory;
import l2p.gameserver.utils.AutoBan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

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); // active ??

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

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

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

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

            // 449 - 16
            // 468 - ? (7)
            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));


            // New Protocol 411
            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            // End Protocol 411

            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));
            writeD(charInfoPackage.getPaperdollAugmentationId(Inventory.PAPERDOLL_RHAND));
            int weaponId = charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_RHAND);
            if (weaponId == 8190) // Transform id
                writeD(301);
            else if (weaponId == 8689)
                writeD(302);
            else
                writeD(0x00);

            //TODO: Pet info?
            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            writeD(0x00);
            writeF(0x00);
            writeF(0x00);

            writeD(charSelectionInfo.getVitalityPoints());
            writeD(charInfoPackage.getAccessLevel() > -100 ? 0x01 : 0x00);

            i++;
            writeD(20);  //в снифе было 20
            writeD(1);    // в снифе было 1
            writeH(0x00);
        }
    }

    public static CharSelectionInfo loadCharacterSelectInfo(String loginName) {
        CharSelectionInfo charSelectionInfo = new CharSelectionInfo();

        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rset = null;
        try {
            con = DatabaseFactory.getInstance().getConnection();
            statement = con.prepareStatement("SELECT * FROM characters AS c LEFT JOIN character_subclasses AS cs ON (c.obj_Id=cs.char_obj_id AND cs.active=1) WHERE account_name=? LIMIT 7");
            statement.setString(1, loginName);
            rset = statement.executeQuery();
            while (rset.next()) { // fills the package
                charSelectionInfo.addSelectionInfo(restoreChar(rset));
            }
            DbUtils.closeQuietly(statement, rset);
            statement = con.prepareStatement("SELECT `points` FROM `vitality_points` WHERE `account_name`=?");
            statement.setString(1, loginName);
            rset = statement.executeQuery();
            if (rset.next()) {
                int points = rset.getInt(1);
                charSelectionInfo.setVitalityPoints(points);
            }
        } catch (Exception e) {
            _log.error("could not restore charinfo:", e);
        } finally {
            DbUtils.closeQuietly(con, statement, rset);
        }

        return charSelectionInfo;
    }

    private static int[] restoreBaseClassId(int objId) {
        int[] classId = new int[2];

        Connection con = null;
        PreparedStatement statement = null;
        ResultSet rset = null;
        try {
            con = DatabaseFactory.getInstance().getConnection();
            statement = con.prepareStatement("SELECT class_id, default_class_id FROM character_subclasses WHERE char_obj_id=? AND type=" + SubClassType.BASE_CLASS.ordinal());
            statement.setInt(1, objId);
            rset = statement.executeQuery();
            while (rset.next()) {
                classId[0] = rset.getInt("class_id");
                classId[1] = rset.getInt("default_class_id");
            }
        } catch (Exception e) {
            _log.error("could not restore base class id:", e);
        } finally {
            DbUtils.closeQuietly(con, statement, rset);
        }

        return classId;
    }

    private static CharSelectInfoPackage restoreChar(ResultSet chardata) {
        CharSelectInfoPackage charInfopackage = null;
        try {
            int objectId = chardata.getInt("obj_Id");
            int classid = chardata.getInt("class_id");
            int[] baseClassId = new int[]{classid, chardata.getInt("default_class_id")};
            boolean useBaseClass = chardata.getInt("type") == SubClassType.BASE_CLASS.ordinal();
            if (!useBaseClass)
                baseClassId = restoreBaseClassId(objectId);
            Race race = ClassId.VALUES[baseClassId[1]].getRace();
            String name = chardata.getString("char_name");
            charInfopackage = new CharSelectInfoPackage(objectId, name);
            charInfopackage.setLevel(chardata.getInt("level"));
            charInfopackage.setMaxHp(chardata.getInt("maxHp"));
            charInfopackage.setCurrentHp(chardata.getDouble("curHp"));
            charInfopackage.setMaxMp(chardata.getInt("maxMp"));
            charInfopackage.setCurrentMp(chardata.getDouble("curMp"));

            charInfopackage.setX(chardata.getInt("x"));
            charInfopackage.setY(chardata.getInt("y"));
            charInfopackage.setZ(chardata.getInt("z"));
            charInfopackage.setPk(chardata.getInt("pkkills"));
            charInfopackage.setPvP(chardata.getInt("pvpkills"));

            charInfopackage.setFace(chardata.getInt("face"));
            charInfopackage.setHairStyle(chardata.getInt("hairstyle"));
            charInfopackage.setHairColor(chardata.getInt("haircolor"));
            charInfopackage.setSex(chardata.getInt("sex"));

            charInfopackage.setExp(chardata.getLong("exp"));
            charInfopackage.setSp(chardata.getInt("sp"));
            charInfopackage.setClanId(chardata.getInt("clanid"));

            charInfopackage.setKarma(chardata.getInt("karma"));
            charInfopackage.setRace(race.ordinal());
            charInfopackage.setClassId(classid);
            charInfopackage.setBaseClassId(baseClassId[0]);
            long deletetime = chardata.getLong("deletetime");
            int deletedays = 0;
            if (Config.DELETE_DAYS > 0)
                if (deletetime > 0) {
                    deletetime = (int) (System.currentTimeMillis() / 1000 - deletetime);
                    deletedays = (int) (deletetime / 3600 / 24);
                    if (deletedays >= Config.DELETE_DAYS) {
                        CharacterDAO.getInstance().deleteCharByObjId(objectId);
                        return null;
                    }
                    deletetime = Config.DELETE_DAYS * 3600 * 24 - deletetime;
                } else
                    deletetime = 0;
            charInfopackage.setDeleteTimer((int) deletetime);
            charInfopackage.setLastAccess(chardata.getLong("lastAccess") * 1000L);
            charInfopackage.setAccessLevel(chardata.getInt("accesslevel"));

            if (charInfopackage.getAccessLevel() < 0 && !AutoBan.isBanned(objectId))
                charInfopackage.setAccessLevel(0);
        } catch (Exception e) {
            _log.error("", e);
        }

        return charInfopackage;
    }
}

больше отличий я пока не нашёл(если сравнивать с 449 протоколом таути)

KilRoy 10.01.2013 17:49

Re: Работа над Goddess of Destruction Glory Days
 
 
public class CharacterSelectionInfo extends L2GameServerPacket
{
	@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());
 
			if(Config.ACCESS_ENTER_ONLY_PREMIUM)
				writeD(charSelectionInfo.getPremiumAccess() > 0 ? 0x01 : 0x00);
			else
				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());
 
			for (int j = 0; j < 7; j++)
				writeD(0x00);
 
			for (int PAPERDOLL_ID : Inventory.PAPERDOLL_ORDER)
				writeD(charInfoPackage.getPaperdollItemId(PAPERDOLL_ID));
 
			writeD(charInfoPackage.getPaperdollDisplayId(Inventory.PAPERDOLL_RHAND));
			writeD(charInfoPackage.getPaperdollDisplayId(Inventory.PAPERDOLL_LHAND));
			writeD(charInfoPackage.getPaperdollDisplayId(Inventory.PAPERDOLL_GLOVES));
			writeD(charInfoPackage.getPaperdollDisplayId(Inventory.PAPERDOLL_CHEST));
			writeD(charInfoPackage.getPaperdollDisplayId(Inventory.PAPERDOLL_LEGS));
			writeD(charInfoPackage.getPaperdollDisplayId(Inventory.PAPERDOLL_FEET));
			writeD(charInfoPackage.getPaperdollDisplayId(Inventory.PAPERDOLL_HAIR));
			writeD(charInfoPackage.getPaperdollDisplayId(Inventory.PAPERDOLL_DHAIR));
			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()); // Vitality Points
			writeD(charSelectionInfo.getPremiumAccess() > 0 ? 300 : 200); // Vitality percent
			writeD(charSelectionInfo.getVitalityItemCounts()); //Vitaliti items count
			writeD(charInfoPackage.getAccessLevel() > -100 ? 0x01 : 0x00); // Access level
			writeC(0x00);
			writeC(0x00);
			i++;
		}
	}
}
Code: Java
488 протокол. Там еще помимо ExAcquirableSkillListByClass (0 после МинУровня скила), такой же 0 и в ExAcquirableSkillInfo.
Еще есть неведомая хрень с телепортом. Если кто в курсе - что так поменялось то в ГД?!(Смотрел Мув, Теле, Валидейт - локатион пакетики, ниче вроде не менялось О_О). Это походу то самое, на что намекал Кейчи :)

Deazer 10.01.2013 17:56

Re: Работа над Goddess of Destruction Glory Days
 
Эта неведома хрень с телепортами Clan Company , у НПЦ можно выдавать реквест на евент клана , поступает окно акепта , после приема все кто приняли реквест телепортятся к евент НПЦ. Это единственное что появилось в Glory нового
http://boards.lineage2.com/showthrea...77#post3271577
Clan Requests and Dwarf Guilds
Эвент по сути простейший , день ушатать на реализацию , если надо заходи с снифером на евро , я тебе покажу как он работает

KilRoy 10.01.2013 17:58

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

Сообщение от Deazer (Сообщение 262545)
Эта неведома хрень с телепортами Clan Company , у НПЦ можно выдавать реквест на евент клана , поступает окно акепта , после приема все кто приняли реквест телепортятся к евент НПЦ. Это единственное что появилось в Glory

Не чуть не туда ты наверно дядь(либо я тя не понял) :) Вообще Перемещение через TeleportToLocation не работает.

Deazer 10.01.2013 18:00

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

Сообщение от KilRoy (Сообщение 262546)
Не чуть не туда ты наверно дядь(либо я тя не понял) :) Вообще Перемещение через TeleportToLocation не работает.

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

KilRoy 10.01.2013 18:02

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

Сообщение от Deazer (Сообщение 262547)
Так бы сразу и написал , вроде ничего не менялось в этой стороне.

Вот и я о том же, пересмотрел MoveToLocation, TeleportToLocation, ValidateLocation, все норм :)
Хотя есть мысля, что что-то в глори вырезали по пакетам связанное...Ибо ТП Доходит до момента потемнения экрана. И дальше...ну а дальше оут оф контрол :)

Deazer 10.01.2013 18:05

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

Сообщение от KilRoy (Сообщение 262548)
Вот и я о том же, пересмотрел MoveToLocation, TeleportToLocation, ValidateLocation, все норм :)
Хотя есть мысля, что что-то в глори вырезали по пакетам связанное...Ибо ТП Доходит до момента потемнения экрана. И дальше...ну а дальше оут оф контрол :)

А не бомбишь ли ты клиент какими то пакетами в время телепорта ? Прикол в том , что если хоть что то слать на клиен в время телепорта , он склеевается , забыл как называется флаг на блок приема пакетов в время телепорта , но его надо ставить при перемещении.

KilRoy 10.01.2013 18:06

Re: Работа над Goddess of Destruction Glory Days
 
нет, ничего не отсылается. Прикол в том, что откатив пакеты обратно на Таути, все нормально :)

Добавлено через 7 минут
Цитата:

Сообщение от Deazer (Сообщение 262549)
слать на клиен в время телепорта , он склеевается

Кстати он не склеевается, а тупо темнеет экран и все :) Крути камерой, открывай инвент. ну и т.д. И + по оверам = out of control.
Да и толи мне кажется, толи клиент ГД - лагает сам по себе очень серьезно...Таути вообще плавненько робил :)

jorjge 10.01.2013 18:20

Re: Работа над Goddess of Destruction Glory Days
 
Может кто подскажет где копать при следующей проблеме: при взятии 4 профы удаляются третьепрофные скиллы, как это устранить? В каком файле копать, подскажите пожалуйста.

KilRoy 10.01.2013 18:26

Re: Работа над Goddess of Destruction Glory Days
 
Ну тут не файл вам в помощь, а все что связанно с Классами. Они у вас удаляются, скорее всего, по причине - что активный класс проверяется на наличие сторонних скилов(в данном случае скилов 3й профы на классе, к ним не относящимся). Только причем тут Глори Дейз?

jorjge 10.01.2013 18:29

Re: Работа над Goddess of Destruction Glory Days
 
Да не помогают нигде, решил сюда написать. А кстати на админе проблемы нет такой. искал по методу isGm но ненашёл ничего, что могло бы для админов давать исключение

что на это можете сказать?

Bacek 10.01.2013 21:02

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

Сообщение от KilRoy (Сообщение 262550)
нет, ничего не отсылается. Прикол в том, что откатив пакеты обратно на Таути, все нормально :)

Добавлено через 7 минут

Кстати он не склеевается, а тупо темнеет экран и все :) Крути камерой, открывай инвент. ну и т.д. И + по оверам = out of control.
Да и толи мне кажется, толи клиент ГД - лагает сам по себе очень серьезно...Таути вообще плавненько робил :)

Это не баг. Сделали уже 2 месяца назад. Там все просто.
Это только 1 из подводных камней.

KilRoy 10.01.2013 21:10

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

Сообщение от Bacek (Сообщение 262597)
Это не баг. Сделали уже 2 месяца назад. Там все просто.
Это только 1 из подводных камней.

Ох и люблю такие посты...

smeli 10.01.2013 22:46

Re: Работа над Goddess of Destruction Glory Days
 
where I can download patch of glory dayz
pliz plox

KilRoy 10.01.2013 23:11

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

Сообщение от smeli (Сообщение 262636)
where I can download patch of glory dayz
pliz plox

http://rghost.ru/42900544 - 488 (патченый)
Дядя, хоть в скайп бы смотрел ;)

smeli 11.01.2013 12:40

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

Сообщение от KilRoy (Сообщение 262653)
http://rghost.ru/42900544 - 488 (патченый)
Дядя, хоть в скайп бы смотрел ;)

как только выбрался из сугробов к компу так сразу и посмотрел
махал сегодня лопатаой для снега

iquelite 11.01.2013 15:19

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

Сообщение от KilRoy (Сообщение 262548)
Вот и я о том же, пересмотрел MoveToLocation, TeleportToLocation, ValidateLocation, все норм :)
Хотя есть мысля, что что-то в глори вырезали по пакетам связанное...Ибо ТП Доходит до момента потемнения экрана. И дальше...ну а дальше оут оф контрол :)

ValidateLocation do not work, maybe in new Encryption

smeli 11.01.2013 15:24

Re: Работа над Goddess of Destruction Glory Days
 
надо енджин без темиды и посмотреть в ИДА чего нужно клиенту чтоб он отправил пакет Аппеаринг ну и таогда сервер ему даст что надо для продолжения игры

darkevil 11.01.2013 15:42

Re: Работа над Goddess of Destruction Glory Days
 
Каждый свою теорию выдвигает, одна чумавей другая.
Смели как всегда дальше всех зашел :)

Добавлено через 2 минуты
Цитата:

Сообщение от iquelite (Сообщение 262823)
ValidateLocation do not work, maybe in new Encryption

VL is work... look carefully

KilRoy 11.01.2013 16:33

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

Сообщение от darkevil (Сообщение 262828)
Смели как всегда дальше всех зашел

c Аппеарингом то понятно, а вот дллка не радует :)

smeli 11.01.2013 16:39

Re: Работа над Goddess of Destruction Glory Days
 
дружно ищем решения проблемы

а то линдвиор уже давно на дворе а мы на глори затоптались

Добавлено через 41 минуту
у меня была когда то такая беда: пакеты посылаются все такие что надо но клиент висит и всё
оказалось что пакет клана был не такой какой клиент хотел, пакет он пулучал но игнорировал

может оно?


ещё много лет немог реализовать пакет GMvievUserInfo
там вообще было всё хорошо и пакеты хорошие и очередь хорошая
и окно у клиента открывалось, только оно пустое было
но так ничего и неработало пока несделал такую фигню:
до послания пакета GMvievUserInfo, я послал такой же пакет но пустой

2 пакета GMvievUserInfo пробили плотину и дело пошло

KilRoy 11.01.2013 17:23

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

Сообщение от smeli (Сообщение 262856)
у меня была когда то такая беда: пакеты посылаются все такие что надо но клиент висит и всё
оказалось что пакет клана был не такой какой клиент хотел, пакет он пулучал но игнорировал

может оно?

ещё много лет немог реализовать пакет GMvievUserInfo
там вообще было всё хорошо и пакеты хорошие и очередь хорошая
и окно у клиента открывалось, только оно пустое было
но так ничего и неработало пока несделал такую фигню:
до послания пакета GMvievUserInfo, я послал такой же пакет но пустой

2 пакета GMvievUserInfo пробили плотину и дело пошло

Все может быть на самом деле :) Л2 такая Л2...
Цитата:

Сообщение от KilRoy (Сообщение 262876)
дружно ищем решения проблемы

а то линдвиор уже давно на дворе а мы на глори затоптались

Хех :)

darkevil 11.01.2013 19:23

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

Сообщение от smeli (Сообщение 262856)
дружно ищем решения проблемы

а то линдвиор уже давно на дворе а мы на глори затоптались

Добавлено через 41 минуту
у меня была когда то такая беда: пакеты посылаются все такие что надо но клиент висит и всё
оказалось что пакет клана был не такой какой клиент хотел, пакет он пулучал но игнорировал

может оно?


ещё много лет немог реализовать пакет GMvievUserInfo
там вообще было всё хорошо и пакеты хорошие и очередь хорошая
и окно у клиента открывалось, только оно пустое было
но так ничего и неработало пока несделал такую фигню:
до послания пакета GMvievUserInfo, я послал такой же пакет но пустой

2 пакета GMvievUserInfo пробили плотину и дело пошло

Линдвиор какашка, только на корейском пока =(

elastic 12.01.2013 07:56

Re: Работа над Goddess of Destruction Glory Days
 
Ох... пакеты...
Может немножко не в тему, но все же:
Кто-нибудь мог бы подсказать\пояснить принцип поднятия пакетки до след. хроник? Ну в данном случае glory days. Вот у меня есть дапм пакетки под 488 протокол, есть опкоды, но в каком направлении их применить - не знаю :(

darkevil 12.01.2013 09:28

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

Сообщение от elastic (Сообщение 263188)
Ох... пакеты...
Может немножко не в тему, но все же:
Кто-нибудь мог бы подсказать\пояснить принцип поднятия пакетки до след. хроник? Ну в данном случае glory days. Вот у меня есть дапм пакетки под 488 протокол, есть опкоды, но в каком направлении их применить - не знаю :(

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

Ну и структура пакетов меняется добавляют новый фишки\плюшки, не редко принцип работы некоторых пакетов меняется.
Все зависит от конкретных случаев, в любом случае тут простым дампом не всегда можно обойтись.

P.S. А вообще тут и самому можно разобраться. Никто конкретно ничего не скажет т.к. это просто дело привычки исследовать и разбирать пакетку.

elastic 12.01.2013 10:34

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

Сообщение от darkevil (Сообщение 263198)
При смене хроник корейцы могут как убирать так и добавлять новые пакеты, причем не только в конце добавляя номер опкода по порядку, но в последнее время они запихивают пакеты даже в середину в итоге все что ниже нового пакета будут со смещением в 1н и более опкодов т.е. нужно будет править у таких пакетов их опкоды.

Ну и структура пакетов меняется добавляют новый фишки\плюшки, не редко принцип работы некоторых пакетов меняется.
Все зависит от конкретных случаев, в любом случае тут простым дампом не всегда можно обойтись.

P.S. А вообще тут и самому можно разобраться. Никто конкретно ничего не скажет т.к. это просто дело привычки исследовать и разбирать пакетку.

Спасибо Вам за ответ :)
Пытался разобраться сам, но как-то мутно, от одних вопросов избавляешься - вылезает куча других.
Да корейцы что-то новое курить начали... пакеты в середину пихать... :(

KilRoy 12.01.2013 15:05

Re: Работа над Goddess of Destruction Glory Days
 
fixed...isValidation(TeleportToLocation)

fear111 12.01.2013 17:38

Re: Работа над Goddess of Destruction Glory Days
 
интересно, в каком случае 0 отправлять?

KilRoy 12.01.2013 18:17

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

Сообщение от fear111 (Сообщение 263301)
интересно, в каком случае 0 отправлять?

Во всех. Валидейт не более чем костыль, рабочий, но костыль. Проблема чуть в другом, и как говорили выше - решаема. Чуть просто копнуть нужно.

smeli 14.01.2013 22:25

Re: Работа над Goddess of Destruction Glory Days
 
а какие ещё подводные камни есть?

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(), ты смотрел?


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

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