Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
Работа над Goddess of Destruction Glory Days
#1
кто хочет занятся этой лабудой пишите мне
работаю на 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 протоколом таути)
Ответ
#2
[SRC="java"]
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++;
}
}
}[/SRC]
488 протокол. Там еще помимо ExAcquirableSkillListByClass (0 после МинУровня скила), такой же 0 и в ExAcquirableSkillInfo.
Еще есть неведомая хрень с телепортом. Если кто в курсе - что так поменялось то в ГД?!(Смотрел Мув, Теле, Валидейт - локатион пакетики, ниче вроде не менялось О_О). Это походу то самое, на что намекал Кейчи Smile
Ответ
#3
Эта неведома хрень с телепортами Clan Company , у НПЦ можно выдавать реквест на евент клана , поступает окно акепта , после приема все кто приняли реквест телепортятся к евент НПЦ. Это единственное что появилось в Glory нового
http://boards.lineage2.com/showthread.ph...ost3271577
Clan Requests and Dwarf Guilds
Эвент по сути простейший , день ушатать на реализацию , если надо заходи с снифером на евро , я тебе покажу как он работает
Ответ
#4
Deazer;262545 Написал:Эта неведома хрень с телепортами Clan Company , у НПЦ можно выдавать реквест на евент клана , поступает окно акепта , после приема все кто приняли реквест телепортятся к евент НПЦ. Это единственное что появилось в Glory
Не чуть не туда ты наверно дядь(либо я тя не понял) Smile Вообще Перемещение через TeleportToLocation не работает.
Ответ
#5
KilRoy Написал:Не чуть не туда ты наверно дядь(либо я тя не понял) Smile Вообще Перемещение через TeleportToLocation не работает.
Так бы сразу и написал , вроде ничего не менялось в этой стороне.
Ответ
#6
Deazer;262547 Написал:Так бы сразу и написал , вроде ничего не менялось в этой стороне.
Вот и я о том же, пересмотрел MoveToLocation, TeleportToLocation, ValidateLocation, все норм Smile
Хотя есть мысля, что что-то в глори вырезали по пакетам связанное...Ибо ТП Доходит до момента потемнения экрана. И дальше...ну а дальше оут оф контрол Smile
Ответ
#7
KilRoy Написал:Вот и я о том же, пересмотрел MoveToLocation, TeleportToLocation, ValidateLocation, все норм Smile
Хотя есть мысля, что что-то в глори вырезали по пакетам связанное...Ибо ТП Доходит до момента потемнения экрана. И дальше...ну а дальше оут оф контрол Smile

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

Добавлено через 7 минут
Deazer;262549 Написал:слать на клиен в время телепорта , он склеевается
Кстати он не склеевается, а тупо темнеет экран и все Smile Крути камерой, открывай инвент. ну и т.д. И + по оверам = out of control.
Да и толи мне кажется, толи клиент ГД - лагает сам по себе очень серьезно...Таути вообще плавненько робил Smile
Ответ
#9
Может кто подскажет где копать при следующей проблеме: при взятии 4 профы удаляются третьепрофные скиллы, как это устранить? В каком файле копать, подскажите пожалуйста.
Ответ
#10
Ну тут не файл вам в помощь, а все что связанно с Классами. Они у вас удаляются, скорее всего, по причине - что активный класс проверяется на наличие сторонних скилов(в данном случае скилов 3й профы на классе, к ним не относящимся). Только причем тут Глори Дейз?
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Работа над Goddess of Destruction (part 7) n3k0nation 459 175,387 03-21-2022, 04:21 PM
Последний пост: TieLay
  {EuroPTS} Glory Days by nexten SWnet 0 1,592 03-13-2021, 03:37 PM
Последний пост: SWnet
  Работа с камерой и Энтер чат FriendlyGhost 0 1,304 04-29-2018, 06:07 AM
Последний пост: FriendlyGhost
  Goddess of Destruction ( новая ветка от NcSoft ) Bacek 180 59,333 08-22-2017, 12:32 PM
Последний пост: BadStealth
  Оплачиваемая работа Grek1993 1 1,356 08-01-2015, 11:29 AM
Последний пост: ztaecz
  Работа над Goddess of Destruction (part 6) Ashe 1,274 474,744 07-11-2015, 08:00 PM
Последний пост: n3k0nation
  Работа с мультиселлом Evencelance 11 2,463 09-19-2014, 12:43 PM
Последний пост: Evencelance
  Работа над Goddess of Destruction (part 5) Ozzy 980 341,030 10-09-2013, 09:13 AM
Последний пост: Ashe
  Сборщик мусора glory days promailer 7 2,168 07-09-2013, 08:28 PM
Последний пост: Dеmon
  Зависания Glory Days promailer 14 3,907 07-03-2013, 12:47 PM
Последний пост: promailer

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


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