Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
SkillTreeTable.java
#1
Т.к на эту тему никто нормально не ответил и последняя ревизия на помогает, вот тема.

То вопрос в другом. Дабы сервер не нагружался, а это происходит т.к саб класс сразу 80 лвл и стоит автоизучение скилов. А они вроде как учатся с 1 лвл а не последнего. Вопрос в след. Что в этом файле надо править чтобы скилы были сразу последнего лвла? Тогда нагрузки не будет.


2) Вопрос. Что делать с бафом Snipe у лукарей? Когда снимаешь лук - баф не спадает. Копать файл: EffectImobileBuff.java?

Данные:


Код:
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* http://www.gnu.org/copyleft/gpl.html
*/
package com.l2jfrozen.gameserver.datatables.sql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import javolution.util.FastList;
import javolution.util.FastMap;

import com.l2jfrozen.gameserver.datatables.SkillTable;
import com.l2jfrozen.gameserver.model.L2EnchantSkillLearn;
import com.l2jfrozen.gameserver.model.L2PledgeSkillLearn;
import com.l2jfrozen.gameserver.model.L2Skill;
import com.l2jfrozen.gameserver.model.L2SkillLearn;
import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
import com.l2jfrozen.gameserver.model.base.ClassId;
import com.l2jfrozen.util.CloseUtil;
import com.l2jfrozen.util.database.L2DatabaseFactory;

/**
* This class ...
*
* @version $Revision: 1.13.2.2.2.8 $ $Date: 2005/04/06 16:13:25 $
*/
public class SkillTreeTable
{
    private final static Logger _log = Logger.getLogger(SkillTreeTable.class.getName());
    private static SkillTreeTable _instance;

    private Map<ClassId, Map<Integer, L2SkillLearn>> _skillTrees;
    private List<L2SkillLearn> _fishingSkillTrees; //all common skills (teached by Fisherman)
    private List<L2SkillLearn> _expandDwarfCraftSkillTrees; //list of special skill for dwarf (expand dwarf craft) learned by class teacher
    private List<L2PledgeSkillLearn> _pledgeSkillTrees; //pledge skill list
    private List<L2EnchantSkillLearn> _enchantSkillTrees; //enchant skill list

    public static SkillTreeTable getInstance()
    {
        if(_instance == null)
        {
            _instance = new SkillTreeTable();
        }

        return _instance;
    }

    /**
     * Return the minimum level needed to have this Expertise.<BR>
     * <BR>
     *
     * @param grade The grade level searched
     */
    public int getExpertiseLevel(int grade)
    {
        if(grade <= 0)
            return 0;

        // since expertise comes at same level for all classes we use paladin for now
        Map<Integer, L2SkillLearn> learnMap = getSkillTrees().get(ClassId.paladin);

        int skillHashCode = SkillTable.getSkillHashCode(239, grade);

        if(learnMap.containsKey(skillHashCode))
            return learnMap.get(skillHashCode).getMinLevel();
        
        return 0;
    }

    /**
     * Each class receives new skill on certain levels, this methods allow the retrieval of the minimun character level
     * of given class required to learn a given skill
     *
     * @param skillId The iD of the skill
     * @param classID The classId of the character
     * @param skillLvl The SkillLvl
     * @return The min level
     */
    public int getMinSkillLevel(int skillId, ClassId classId, int skillLvl)
    {
        Map<Integer, L2SkillLearn> map = getSkillTrees().get(classId);

        int skillHashCode = SkillTable.getSkillHashCode(skillId, skillLvl);

        if(map.containsKey(skillHashCode))
            return map.get(skillHashCode).getMinLevel();

        return 0;
    }

    public int getMinSkillLevel(int skillId, int skillLvl)
    {
        int skillHashCode = SkillTable.getSkillHashCode(skillId, skillLvl);

        // Look on all classes for this skill (takes the first one found)
        for(Map<Integer, L2SkillLearn> map : getSkillTrees().values())
        {
            // checks if the current class has this skill
            if(map.containsKey(skillHashCode))
                return map.get(skillHashCode).getMinLevel();
        }

        return 0;
    }

    private SkillTreeTable()
    {
        int classId = 0;
        int count = 0;

        Connection con = null;

        try
        {
            con = L2DatabaseFactory.getInstance().getConnection(false);
            final PreparedStatement statement = con.prepareStatement("SELECT * FROM class_list ORDER BY id");
            final ResultSet classlist = statement.executeQuery();

            Map<Integer, L2SkillLearn> map;
            int parentClassId;
            L2SkillLearn skillLearn;

            while(classlist.next())
            {
                map = new FastMap<Integer, L2SkillLearn>();
                parentClassId = classlist.getInt("parent_id");
                classId = classlist.getInt("id");
                final PreparedStatement statement2 = con.prepareStatement("SELECT class_id, skill_id, level, name, sp, min_level FROM skill_trees where class_id=? ORDER BY skill_id, level");
                statement2.setInt(1, classId);
                final ResultSet skilltree = statement2.executeQuery();

                if(parentClassId != -1)
                {
                    Map<Integer, L2SkillLearn> parentMap = getSkillTrees().get(ClassId.values()[parentClassId]);
                    map.putAll(parentMap);
                }

                int prevSkillId = -1;

                while(skilltree.next())
                {
                    int id = skilltree.getInt("skill_id");
                    int lvl = skilltree.getInt("level");
                    String name = skilltree.getString("name");
                    int minLvl = skilltree.getInt("min_level");
                    int cost = skilltree.getInt("sp");

                    if(prevSkillId != id)
                    {
                        prevSkillId = id;
                    }

                    skillLearn = new L2SkillLearn(id, lvl, minLvl, name, cost, 0, 0);
                    map.put(SkillTable.getSkillHashCode(id, lvl), skillLearn);
                }

                getSkillTrees().put(ClassId.values()[classId], map);
                skilltree.close();
                statement2.close();

                count += map.size();
                _log.finest("SkillTreeTable: skill tree for class {} has {} skills "+ classId+" "+ map.size());
            }

            classlist.close();
            statement.close();
        }
        catch(Exception e)
        {
            _log.severe("Error while creating skill tree (Class ID {}): "+ classId+" "+ e);
        }
        

        _log.finest("SkillTreeTable: Loaded {} skills."+" "+ count);

        //Skill tree for fishing skill (from Fisherman)
        int count2 = 0;
        int count3 = 0;

        try
        {
            _fishingSkillTrees = new FastList<L2SkillLearn>();
            _expandDwarfCraftSkillTrees = new FastList<L2SkillLearn>();

            final PreparedStatement statement = con.prepareStatement("SELECT skill_id, level, name, sp, min_level, costid, cost, isfordwarf FROM fishing_skill_trees ORDER BY skill_id, level");
            final ResultSet skilltree2 = statement.executeQuery();

            int prevSkillId = -1;

            while(skilltree2.next())
            {
                int id = skilltree2.getInt("skill_id");
                int lvl = skilltree2.getInt("level");
                String name = skilltree2.getString("name");
                int minLvl = skilltree2.getInt("min_level");
                int cost = skilltree2.getInt("sp");
                int costId = skilltree2.getInt("costid");
                int costCount = skilltree2.getInt("cost");
                int isDwarven = skilltree2.getInt("isfordwarf");

                if(prevSkillId != id)
                {
                    prevSkillId = id;
                }

                L2SkillLearn skill = new L2SkillLearn(id, lvl, minLvl, name, cost, costId, costCount);

                if(isDwarven == 0)
                {
                    _fishingSkillTrees.add(skill);
                }
                else
                {
                    _expandDwarfCraftSkillTrees.add(skill);
                }
            }

            skilltree2.close();
            statement.close();

            count2 = _fishingSkillTrees.size();
            count3 = _expandDwarfCraftSkillTrees.size();
        }
        catch(Exception e)
        {
            _log.severe("Error while creating fishing skill table"+" "+ e);
        }

        int count4 = 0;
        try
        {
            _enchantSkillTrees = new FastList<L2EnchantSkillLearn>();

            final PreparedStatement statement = con.prepareStatement("SELECT skill_id, level, name, base_lvl, sp, min_skill_lvl, exp, success_rate76, success_rate77, success_rate78 FROM enchant_skill_trees ORDER BY skill_id, level");
            final ResultSet skilltree3 = statement.executeQuery();

            int prevSkillId = -1;

            while(skilltree3.next())
            {
                int id = skilltree3.getInt("skill_id");
                int lvl = skilltree3.getInt("level");
                String name = skilltree3.getString("name");
                int baseLvl = skilltree3.getInt("base_lvl");
                int minSkillLvl = skilltree3.getInt("min_skill_lvl");
                int sp = skilltree3.getInt("sp");
                int exp = skilltree3.getInt("exp");
                byte rate76 = skilltree3.getByte("success_rate76");
                byte rate77 = skilltree3.getByte("success_rate77");
                byte rate78 = skilltree3.getByte("success_rate78");

                if(prevSkillId != id)
                {
                    prevSkillId = id;
                }

                _enchantSkillTrees.add(new L2EnchantSkillLearn(id, lvl, minSkillLvl, baseLvl, name, sp, exp, rate76, rate77, rate78));
            }

            skilltree3.close();
            statement.close();

            count4 = _enchantSkillTrees.size();
        }
        catch(Exception e)
        {
            _log.severe("Error while creating enchant skill table"+" "+ e);
        }

        int count5 = 0;
        try
        {
            _pledgeSkillTrees = new FastList<L2PledgeSkillLearn>();

            final PreparedStatement statement = con.prepareStatement("SELECT skill_id, level, name, clan_lvl, repCost, itemId FROM pledge_skill_trees ORDER BY skill_id, level");
            final ResultSet skilltree4 = statement.executeQuery();

            int prevSkillId = -1;

            while(skilltree4.next())
            {
                int id = skilltree4.getInt("skill_id");
                int lvl = skilltree4.getInt("level");
                String name = skilltree4.getString("name");
                int baseLvl = skilltree4.getInt("clan_lvl");
                int sp = skilltree4.getInt("repCost");
                int itemId = skilltree4.getInt("itemId");

                if(prevSkillId != id)
                {
                    prevSkillId = id;
                }

                _pledgeSkillTrees.add(new L2PledgeSkillLearn(id, lvl, baseLvl, name, sp, itemId));
            }

            skilltree4.close();
            statement.close();

            count5 = _pledgeSkillTrees.size();
        }
        catch(Exception e)
        {
            _log.severe("Error while creating fishing skill table"+" "+ e);
        }
        finally
        {
            CloseUtil.close(con);
        }

        _log.finest("FishingSkillTreeTable: Loaded {} general skills."+" "+ count2);
        _log.finest("FishingSkillTreeTable: Loaded {} dwarven skills."+" "+ count3);
        _log.finest("EnchantSkillTreeTable: Loaded {} enchant skills."+" "+ count4);
        _log.finest("PledgeSkillTreeTable: Loaded {} pledge skills"+" "+ count5);
    }

    private Map<ClassId, Map<Integer, L2SkillLearn>> getSkillTrees()
    {
        if(_skillTrees == null)
        {
            _skillTrees = new FastMap<ClassId, Map<Integer, L2SkillLearn>>();
        }

        return _skillTrees;
    }

    public L2SkillLearn[] getAvailableSkills(L2PcInstance cha, ClassId classId)
    {
        List<L2SkillLearn> result = new FastList<L2SkillLearn>();
        Collection<L2SkillLearn> skills = getSkillTrees().get(classId).values();

        L2Skill[] oldSkills = cha.getAllSkills();

        for(L2SkillLearn temp : skills)
        {
            if(temp.getMinLevel() <= cha.getLevel())
            {
                boolean knownSkill = false;

                for(int j = 0; j < oldSkills.length && !knownSkill; j++)
                {
                    if(oldSkills[j].getId() == temp.getId())
                    {
                        knownSkill = true;

                        if(oldSkills[j].getLevel() == temp.getLevel() - 1)
                        {
                            // this is the next level of a skill that we know
                            result.add(temp);
                        }
                    }
                }

                if(!knownSkill && temp.getLevel() == 1)
                {
                    // this is a new skill
                    result.add(temp);
                }
            }
        }

        return result.toArray(new L2SkillLearn[result.size()]);
    }

    public L2SkillLearn[] getAvailableSkills(L2PcInstance cha)
    {
        List<L2SkillLearn> result = new FastList<L2SkillLearn>();
        List<L2SkillLearn> skills = new FastList<L2SkillLearn>();

        skills.addAll(_fishingSkillTrees);

        if(cha.hasDwarvenCraft() && _expandDwarfCraftSkillTrees != null)
        {
            skills.addAll(_expandDwarfCraftSkillTrees);
        }

        L2Skill[] oldSkills = cha.getAllSkills();

        for(L2SkillLearn temp : skills)
        {
            if(temp.getMinLevel() <= cha.getLevel())
            {
                boolean knownSkill = false;

                for(int j = 0; j < oldSkills.length && !knownSkill; j++)
                {
                    if(oldSkills[j].getId() == temp.getId())
                    {
                        knownSkill = true;

                        if(oldSkills[j].getLevel() == temp.getLevel() - 1)
                        {
                            // this is the next level of a skill that we know
                            result.add(temp);
                        }
                    }
                }

                if(!knownSkill && temp.getLevel() == 1)
                {
                    // this is a new skill
                    result.add(temp);
                }
            }
        }

        return result.toArray(new L2SkillLearn[result.size()]);
    }

    public L2EnchantSkillLearn[] getAvailableEnchantSkills(L2PcInstance cha)
    {
        List<L2EnchantSkillLearn> result = new FastList<L2EnchantSkillLearn>();
        List<L2EnchantSkillLearn> skills = new FastList<L2EnchantSkillLearn>();

        skills.addAll(_enchantSkillTrees);

        L2Skill[] oldSkills = cha.getAllSkills();

        for(L2EnchantSkillLearn temp : skills)
        {
            if(76 <= cha.getLevel())
            {
                boolean knownSkill = false;

                for(int j = 0; j < oldSkills.length && !knownSkill; j++)
                {
                    if(oldSkills[j].getId() == temp.getId())
                    {
                        knownSkill = true;

                        if(oldSkills[j].getLevel() == temp.getMinSkillLevel())
                        {
                            // this is the next level of a skill that we know
                            result.add(temp);
                        }
                    }
                }

            }
        }

        //cha.sendMessage("loaded "+ result.size()+" enchant skills for this char(You)");
        return result.toArray(new L2EnchantSkillLearn[result.size()]);
    }

    public L2PledgeSkillLearn[] getAvailablePledgeSkills(L2PcInstance cha)
    {
        List<L2PledgeSkillLearn> result = new FastList<L2PledgeSkillLearn>();
        List<L2PledgeSkillLearn> skills = _pledgeSkillTrees;

        if(skills == null)
        {
            // the skilltree for this class is undefined, so we give an empty list
            _log.warning("No clan skills defined!");
            return new L2PledgeSkillLearn[0];
        }

        L2Skill[] oldSkills = cha.getClan().getAllSkills();

        for(L2PledgeSkillLearn temp : skills)
        {
            if(temp.getBaseLevel() <= cha.getClan().getLevel())
            {
                boolean knownSkill = false;

                for(int j = 0; j < oldSkills.length && !knownSkill; j++)
                {
                    if(oldSkills[j].getId() == temp.getId())
                    {
                        knownSkill = true;

                        if(oldSkills[j].getLevel() == temp.getLevel() - 1)
                        {
                            // this is the next level of a skill that we know
                            result.add(temp);
                        }
                    }
                }

                if(!knownSkill && temp.getLevel() == 1)
                {
                    // this is a new skill
                    result.add(temp);
                }
            }
        }

        return result.toArray(new L2PledgeSkillLearn[result.size()]);
    }

    /**
     * Returns all allowed skills for a given class.
     *
     * @param classId
     * @return all allowed skills for a given class.
     */
    public Collection<L2SkillLearn> getAllowedSkills(ClassId classId)
    {
        return getSkillTrees().get(classId).values();
    }

    public int getMinLevelForNewSkill(L2PcInstance cha, ClassId classId)
    {
        int minLevel = 0;
        Collection<L2SkillLearn> skills = getSkillTrees().get(classId).values();

        if(skills == null)
        {
            // the skilltree for this class is undefined, so we give an empty list
            _log.warning("Skilltree for class {} is not defined !"+" "+ classId);
            return minLevel;
        }

        for(L2SkillLearn temp : skills)
        {
            if(temp.getMinLevel() > cha.getLevel() && temp.getSpCost() != 0)
                if(minLevel == 0 || temp.getMinLevel() < minLevel)
                {
                    minLevel = temp.getMinLevel();
                }
        }

        return minLevel;
    }

    public int getMinLevelForNewSkill(L2PcInstance cha)
    {
        int minLevel = 0;
        List<L2SkillLearn> skills = new FastList<L2SkillLearn>();

        skills.addAll(_fishingSkillTrees);

        if(cha.hasDwarvenCraft() && _expandDwarfCraftSkillTrees != null)
        {
            skills.addAll(_expandDwarfCraftSkillTrees);
        }

        for(L2SkillLearn s : skills)
        {
            if(s.getMinLevel() > cha.getLevel())
                if(minLevel == 0 || s.getMinLevel() < minLevel)
                {
                    minLevel = s.getMinLevel();
                }
        }

        return minLevel;
    }

    public int getSkillCost(L2PcInstance player, L2Skill skill)
    {
        int skillCost = 100000000;
        ClassId classId = player.getSkillLearningClassId();
        int skillHashCode = SkillTable.getSkillHashCode(skill);

        if(getSkillTrees().get(classId).containsKey(skillHashCode))
        {
            L2SkillLearn skillLearn = getSkillTrees().get(classId).get(skillHashCode);
            if(skillLearn.getMinLevel() <= player.getLevel())
            {
                skillCost = skillLearn.getSpCost();
                if(!player.getClassId().equalsOrChildOf(classId))
                {
                    if(skill.getCrossLearnAdd() < 0)
                        return skillCost;

                    skillCost += skill.getCrossLearnAdd();
                    skillCost *= skill.getCrossLearnMul();
                }

                if(classId.getRace() != player.getRace() && !player.isSubClassActive())
                {
                    skillCost *= skill.getCrossLearnRace();
                }

                if(classId.isMage() != player.getClassId().isMage())
                {
                    skillCost *= skill.getCrossLearnProf();
                }
            }
        }

        return skillCost;
    }

    public int getSkillSpCost(L2PcInstance player, L2Skill skill)
    {
        int skillCost = 100000000;
        L2EnchantSkillLearn[] enchantSkillLearnList = getAvailableEnchantSkills(player);

        for(L2EnchantSkillLearn enchantSkillLearn : enchantSkillLearnList)
        {
            if(enchantSkillLearn.getId() != skill.getId())
            {
                continue;
            }

            if(enchantSkillLearn.getLevel() != skill.getLevel())
            {
                continue;
            }

            if(76 > player.getLevel())
            {
                continue;
            }

            skillCost = enchantSkillLearn.getSpCost();
        }
        return skillCost;
    }

    public int getSkillExpCost(L2PcInstance player, L2Skill skill)
    {
        int skillCost = 100000000;
        L2EnchantSkillLearn[] enchantSkillLearnList = getAvailableEnchantSkills(player);

        for(L2EnchantSkillLearn enchantSkillLearn : enchantSkillLearnList)
        {
            if(enchantSkillLearn.getId() != skill.getId())
            {
                continue;
            }

            if(enchantSkillLearn.getLevel() != skill.getLevel())
            {
                continue;
            }

            if(76 > player.getLevel())
            {
                continue;
            }

            skillCost = enchantSkillLearn.getExp();
        }

        return skillCost;
    }

    public byte getSkillRate(L2PcInstance player, L2Skill skill)
    {
        L2EnchantSkillLearn[] enchantSkillLearnList = getAvailableEnchantSkills(player);

        for(L2EnchantSkillLearn enchantSkillLearn : enchantSkillLearnList)
        {
            if(enchantSkillLearn.getId() != skill.getId())
            {
                continue;
            }

            if(enchantSkillLearn.getLevel() != skill.getLevel())
            {
                continue;
            }

            return enchantSkillLearn.getRate(player);
        }

        return 0;
    }
}







И EffectImobileBuff.java
Код:
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* http://www.gnu.org/copyleft/gpl.html
*/
package com.l2jfrozen.gameserver.skills.effects;

import com.l2jfrozen.gameserver.model.L2Effect;
import com.l2jfrozen.gameserver.skills.Env;

/**
* @author mkizub
*/
final class EffectImobileBuff extends L2Effect
{

    public EffectImobileBuff(Env env, EffectTemplate template)
    {
        super(env, template);
    }

    @Override
    public EffectType getEffectType()
    {
        return EffectType.BUFF;
    }

    /** Notify started */
    @Override
    public void onStart()
    {
        getEffector().setIsImobilised(true);
    }

    /** Notify exited */
    @Override
    public void onExit()
    {
        getEffector().setIsImobilised(false);
    }

    @Override
    public boolean onActionTime()
    {
        // just stop this effect
        return false;
    }
}
Ответ
#2
С каких пор он должен спадать не понятно, он просто не должен действовать на другие типы оружия кроме лука.
Ответ
#3
kingzor, это фрозены...забей.
2автор: по идее достаточно удалить изучение скиллов и сделать сразу добавление скиллов последнего уровня.
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Lineage2 java Chronicle3 сборка AlexBayev 0 421 07-20-2024, 05:23 PM
Последний пост: AlexBayev
  Порекомендуйте хорошую Java сборку L2 GF (PTS не потяну ибо навыков 0 ) Force 0 967 10-28-2023, 12:02 PM
Последний пост: Force
  Java dev hired! Krasib 0 1,214 08-15-2022, 10:00 AM
Последний пост: Krasib
  SVN ссылки Java серверов. PROGRAMMATOR 284 238,503 11-19-2020, 08:50 PM
Последний пост: AbsolutePower
  Java координаты, различия PTS и Java, какие сборки хороши (iL) varted 5 2,658 09-12-2018, 08:29 AM
Последний пост: varted
  l2 c4 java estorq 0 1,394 08-17-2018, 10:07 PM
Последний пост: estorq
  Топовая Java сборка под х3 и х1200 NovaPlanet 32 8,779 11-22-2016, 11:38 AM
Последний пост: 6bit
  Java в Class virusoflove 1 1,824 10-17-2016, 09:04 AM
Последний пост: Rolfer
  Помогите поставить Java сервер la2 c3! Winst 0 1,235 10-16-2016, 12:34 PM
Последний пост: Winst
  Ищу стабильную сборка java сервера HF introzorn 12 6,393 10-14-2016, 09:34 PM
Последний пост: Mangol

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


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