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

Форум администраторов игровых серверов (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й профы на классе, к ним не относящимся). Только причем тут Глори Дейз?


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

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