SkillTreeTable.java - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Сообщество Календарь
Вернуться   Форум администраторов игровых серверов > MMO > Lineage II

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

Ответ
Опции темы
Непрочитано 25.01.2013, 05:29   #1
Пользователь

Автор темы (Топик Стартер) SkillTreeTable.java

Т.к на эту тему никто нормально не ответил и последняя ревизия на помогает, вот тема.

То вопрос в другом. Дабы сервер не нагружался, а это происходит т.к саб класс сразу 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;
	}
}
GRAFOON вне форума Ответить с цитированием
Непрочитано 25.01.2013, 09:21   #2
Герой

По умолчанию Re: SkillTreeTable.java

С каких пор он должен спадать не понятно, он просто не должен действовать на другие типы оружия кроме лука.
kingzor вне форума Отправить сообщение для kingzor с помощью ICQ Ответить с цитированием
Непрочитано 25.01.2013, 09:40   #3
Аватар для Zubastic
ZG troll squad

По умолчанию Re: SkillTreeTable.java

kingzor, это фрозены...забей.
2автор: по идее достаточно удалить изучение скиллов и сделать сразу добавление скиллов последнего уровня.
Zubastic вне форума Ответить с цитированием
Ответ


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

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

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

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


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

Вверх