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

Форум администраторов игровых серверов (https://forum.zone-game.info/TT.php)
-   Работа со скриптами (https://forum.zone-game.info/forumdisplay.php?f=37)
-   -   Лаги при взятии профы или смене саба (https://forum.zone-game.info/showthread.php?t=25433)

orionpvp 03.01.2013 01:55

Лаги при взятии профы или смене саба
 
У меня на пвп сервере автоматическое изучение скилов.
Когда игрок у нпц берет первую или вторую профу - он подвисает на 10-20 секунд.
Также это создает небольшие лаги на сервере.

Есть ли способ сделать автоизучение или смену саба без лагов?

Код
Код:

public int giveAvailableSkills(boolean includedByFs, boolean includeAutoGet)
        {
                int unLearnable = 0;
                int skillCounter = 0;
               
                // Get available skills
                FastList<L2SkillLearn> skills = SkillTreesData.getInstance().getAvailableSkills(this, getClassId(), includedByFs, includeAutoGet);
               
                while (skills.size() > unLearnable)
                {
                        for (L2SkillLearn s: skills)
                        {
                                L2Skill sk = SkillTable.getInstance().getInfo(s.getSkillId(), s.getSkillLevel());
                                if (sk == null || (sk.getId() == L2Skill.SKILL_DIVINE_INSPIRATION && !Config.AUTO_LEARN_DIVINE_INSPIRATION && !isGM()))
                                {
                                        unLearnable++;
                                        continue;
                                }
                               
                                if (getSkillLevel(sk.getId()) == -1)
                                {
                                        skillCounter++;
                                }
                               
                                // fix when learning toggle skills
                                if (sk.isToggle())
                                {
                                        L2Effect toggleEffect = getFirstEffect(sk.getId());
                                        if (toggleEffect != null)
                                        {
                                                // stop old toggle skill effect, and give new toggle skill effect back
                                                toggleEffect.exit();
                                                sk.getEffects(this, this);
                                        }
                                }
                                addSkill(sk, true);
                        }
                       
                        //Get new available skills, some skills depend of previous skills to be available.
                        skills = SkillTreesData.getInstance().getAvailableSkills(this, getClassId(), includedByFs, includeAutoGet);
                }
               
                sendMessage("You have learned " + skillCounter + " new skills.");
                return skillCounter;
        }
       
        /**
        * Give all available AutoGet skills to the player.<br>
        */
        public void giveAvailableAutoGetSkills()
        {
                // Get available skills
                final FastList<L2SkillLearn> autoGetSkills = SkillTreesData.getInstance().getAvailableAutoGetSkills(this);
               
                if ((autoGetSkills != null) && !autoGetSkills.isEmpty())
                {
                        for (L2SkillLearn s: autoGetSkills)
                        {
                                final L2Skill skill = SkillTable.getInstance().getInfo(s.getSkillId(), s.getSkillLevel());
                                if (skill != null)
                                {
                                        addSkill(skill, true);
                                }
                                else
                                {
                                        _log.warning("Skipped null autoGet Skill for player:" + getName() + "[" + getObjectId() + "]");
                                }
                        }
                }
        }
       
        public L2Skill addSkill(L2Skill newSkill, boolean store)
        {
                // Add a skill to the L2PcInstance _skills and its Func objects to the calculator set of the L2PcInstance
                L2Skill oldSkill = super.addSkill(newSkill);
               
                // Add or update a L2PcInstance skill in the character_skills table of the database
                if (store)
                {
                        storeSkill(newSkill, oldSkill, -1);
                }
                return oldSkill;
        }

Добавлено через 1 минуту
Код:

public FastList<L2SkillLearn> getAvailableSkills(L2PcInstance player, ClassId classId, boolean includeByFs, boolean includeAutoGet)
        {
                final FastList<L2SkillLearn> result = new FastList<L2SkillLearn>();
                final FastMap<Integer, L2SkillLearn> skills = getCompleteClassSkillTree(classId);
               
                if (skills.isEmpty())
                {
                        // The Skill Tree for this class is undefined.
                        _log.warning(getClass().getSimpleName() + ": Skilltree for class " + classId + " is not defined!");
                        return result;
                }
               
                final L2Skill[] oldSkills = player.getAllSkills();
                for (L2SkillLearn temp : skills.values())
                {
                        if (((includeAutoGet && temp.isAutoGet()) || temp.isLearnedByNpc() || (includeByFs && temp.isLearnedByFS())) && (player.getLevel() >= temp.getGetLevel()))
                        {
                                boolean knownSkill = false;
                               
                                for (int j = 0; (j < oldSkills.length) && !knownSkill; j++)
                                {
                                        if (oldSkills[j].getId() == temp.getSkillId())
                                        {
                                                if (oldSkills[j].getLevel() == (temp.getSkillLevel() - 1))
                                                {
                                                        // This is the next level of a known skill:
                                                        result.add(temp);
                                                }
                                                knownSkill = true;
                                        }
                                }
                               
                                if (!knownSkill && (temp.getSkillLevel() == 1))
                                {
                                        // This is a new skill:
                                        result.add(temp);
                                }
                        }
                }
                return result;
        }


Silvern 03.01.2013 05:33

Re: Лаги при взятии профы или смене саба
 
Сборка чья? Или на лыже пилим?

4ipolino 03.01.2013 14:01

Re: Лаги при взятии профы или смене саба
 
Цитата:

Сообщение от Silvern (Сообщение 259824)
Сборка чья? Или на лыже пилим?

SkillTreesData.java - L2J SVN
метод загуглить тяжело? :redlol:

orionpvp 04.01.2013 08:03

Re: Лаги при взятии профы или смене саба
 
Сборка L2jserver.com Freya

orionpvp 05.01.2013 20:29

Re: Лаги при взятии профы или смене саба
 
Скилы которые должны быть выучены находяться в хмл файле.
У гладиатора к примеру у скила "Трипл соник слеш" 22 уровня, при взятии второй профы учаться все 22 лвла подряд.
Можно ли сделать так что бы учился 22рой лвл без выученого 21вого?
Если я оставляю в хмл файлле только 22рой лвл без предыдущих - скил не изучаеться.
Когда я убрал проверку
Код:

if (oldSkills[j].getLevel() == (temp.getSkillLevel() - 1))
                                                {
                                                        // This is the next level of a known skill:
                                                        result.add(temp);
                                                }

и вписал вместо этого кода - просто
Код:

result.add(temp)
-при создании персонажа сервер зависает с ошибкой.

Visor 06.01.2013 13:10

Re: Лаги при взятии профы или смене саба
 
Много пакетов идет на клиент тяжелых, поэтому и лаг в клиенте получается.


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

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