Работа над Goddess of Destruction Glory Days - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II

Lineage II
Дискуссии на тему создания, настройки и обслуживания серверов Lineage 2. При поддержке: Премиум услуги по рекламе

Ответ
Опции темы
Непрочитано 01.11.2012, 16:11   #1
Изгнанные

Автор темы (Топик Стартер) Работа над 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 протоколом таути)
Mazaffaka вне форума Отправить сообщение для Mazaffaka с помощью Skype™ Ответить с цитированием
Непрочитано 10.01.2013, 17:49   #2
Забанен за кидаловo/обман/развод

По умолчанию 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.
Еще есть неведомая хрень с телепортом. Если кто в курсе - что так поменялось то в ГД?!(Смотрел Мув, Теле, Валидейт - локатион пакетики, ниче вроде не менялось О_О). Это походу то самое, на что намекал Кейчи
KilRoy вне форума Отправить сообщение для KilRoy с помощью ICQ Отправить сообщение для KilRoy с помощью Skype™ Ответить с цитированием
Непрочитано 10.01.2013, 17:56   #3
Аватар для Deazer

По умолчанию Re: Работа над Goddess of Destruction Glory Days

Эта неведома хрень с телепортами Clan Company , у НПЦ можно выдавать реквест на евент клана , поступает окно акепта , после приема все кто приняли реквест телепортятся к евент НПЦ. Это единственное что появилось в Glory нового
http://boards.lineage2.com/showthrea...77#post3271577
Clan Requests and Dwarf Guilds
Эвент по сути простейший , день ушатать на реализацию , если надо заходи с снифером на евро , я тебе покажу как он работает
Deazer вне форума Ответить с цитированием
Сказали спасибо:
Непрочитано 10.01.2013, 17:58   #4
Забанен за кидаловo/обман/развод

По умолчанию Re: Работа над Goddess of Destruction Glory Days

Цитата:
Сообщение от Deazer Посмотреть сообщение
Эта неведома хрень с телепортами Clan Company , у НПЦ можно выдавать реквест на евент клана , поступает окно акепта , после приема все кто приняли реквест телепортятся к евент НПЦ. Это единственное что появилось в Glory
Не чуть не туда ты наверно дядь(либо я тя не понял) Вообще Перемещение через TeleportToLocation не работает.
KilRoy вне форума Отправить сообщение для KilRoy с помощью ICQ Отправить сообщение для KilRoy с помощью Skype™ Ответить с цитированием
Непрочитано 10.01.2013, 18:00   #5
Аватар для Deazer

По умолчанию Re: Работа над Goddess of Destruction Glory Days

Цитата:
Сообщение от KilRoy Посмотреть сообщение
Не чуть не туда ты наверно дядь(либо я тя не понял) Вообще Перемещение через TeleportToLocation не работает.
Так бы сразу и написал , вроде ничего не менялось в этой стороне.
Deazer вне форума Ответить с цитированием
Непрочитано 10.01.2013, 18:02   #6
Забанен за кидаловo/обман/развод

По умолчанию Re: Работа над Goddess of Destruction Glory Days

Цитата:
Сообщение от Deazer Посмотреть сообщение
Так бы сразу и написал , вроде ничего не менялось в этой стороне.
Вот и я о том же, пересмотрел MoveToLocation, TeleportToLocation, ValidateLocation, все норм
Хотя есть мысля, что что-то в глори вырезали по пакетам связанное...Ибо ТП Доходит до момента потемнения экрана. И дальше...ну а дальше оут оф контрол
KilRoy вне форума Отправить сообщение для KilRoy с помощью ICQ Отправить сообщение для KilRoy с помощью Skype™ Ответить с цитированием
Непрочитано 10.01.2013, 18:05   #7
Аватар для Deazer

По умолчанию Re: Работа над Goddess of Destruction Glory Days

Цитата:
Сообщение от KilRoy Посмотреть сообщение
Вот и я о том же, пересмотрел MoveToLocation, TeleportToLocation, ValidateLocation, все норм
Хотя есть мысля, что что-то в глори вырезали по пакетам связанное...Ибо ТП Доходит до момента потемнения экрана. И дальше...ну а дальше оут оф контрол
А не бомбишь ли ты клиент какими то пакетами в время телепорта ? Прикол в том , что если хоть что то слать на клиен в время телепорта , он склеевается , забыл как называется флаг на блок приема пакетов в время телепорта , но его надо ставить при перемещении.
Deazer вне форума Ответить с цитированием
Непрочитано 10.01.2013, 18:06   #8
Забанен за кидаловo/обман/развод

По умолчанию Re: Работа над Goddess of Destruction Glory Days

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

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

Последний раз редактировалось KilRoy; 10.01.2013 в 18:14. Причина: Добавлено сообщение
KilRoy вне форума Отправить сообщение для KilRoy с помощью ICQ Отправить сообщение для KilRoy с помощью Skype™ Ответить с цитированием
Непрочитано 10.01.2013, 18:20   #9
Пользователь

По умолчанию Re: Работа над Goddess of Destruction Glory Days

Может кто подскажет где копать при следующей проблеме: при взятии 4 профы удаляются третьепрофные скиллы, как это устранить? В каком файле копать, подскажите пожалуйста.
jorjge вне форума Ответить с цитированием
Непрочитано 10.01.2013, 18:26   #10
Забанен за кидаловo/обман/развод

По умолчанию Re: Работа над Goddess of Destruction Glory Days

Ну тут не файл вам в помощь, а все что связанно с Классами. Они у вас удаляются, скорее всего, по причине - что активный класс проверяется на наличие сторонних скилов(в данном случае скилов 3й профы на классе, к ним не относящимся). Только причем тут Глори Дейз?
KilRoy вне форума Отправить сообщение для KilRoy с помощью ICQ Отправить сообщение для KilRoy с помощью Skype™ Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа над Goddess of Destruction (part 2) Ozzy Lineage II 411 22.06.2011 15:58
Работа над Goddess of Destruction JaFo Lineage II 409 20.05.2011 01:48
Объединённый клиент Lineage II Goddess of Destruction и Aion 2.5 TieLay Aion 9 01.04.2011 22:28
Объединённый клиент Lineage II Goddess of Destruction и Aion 2.5 TieLay Lineage II 0 01.04.2011 09:11
Адаптируем SQL BimBom Работа со скриптами 9 14.10.2009 15:14


© 2007–2020 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 03:15. Часовой пояс GMT +3.

Вверх