Explorar o código

Fix for #4486
New function in SkillTable: boolean isEnchantable(skillId) should be used for checking, instead of level.

_DS_ %!s(int64=15) %!d(string=hai) anos
pai
achega
09423ff8e9

+ 18 - 3
L2_GameServer/java/com/l2jserver/gameserver/datatables/SkillTable.java

@@ -15,6 +15,7 @@ package com.l2jserver.gameserver.datatables;
 import com.l2jserver.gameserver.model.L2Skill;
 import com.l2jserver.gameserver.skills.SkillsEngine;
 
+import gnu.trove.TIntArrayList;
 import gnu.trove.TIntIntHashMap;
 import gnu.trove.TIntObjectHashMap;
 
@@ -25,6 +26,7 @@ public class SkillTable
 {
 	private final TIntObjectHashMap<L2Skill> _skills;
 	private final TIntIntHashMap _skillMaxLevel;
+	private final TIntArrayList _enchantable;
 	
 	public static SkillTable getInstance()
 	{
@@ -35,6 +37,7 @@ public class SkillTable
 	{
 		_skills = new TIntObjectHashMap<L2Skill>();
 		_skillMaxLevel = new TIntIntHashMap();
+		_enchantable = new TIntArrayList();
 		reload();
 	}
 	
@@ -48,16 +51,23 @@ public class SkillTable
 		{
 			final int skillId = skill.getId();
 			final int skillLvl = skill.getLevel();
-			// only non-enchanted skills
 			if (skillLvl > 99)
+			{
+				if (!_enchantable.contains(skillId))
+					_enchantable.add(skillId);
 				continue;
+			}
 
+			// only non-enchanted skills
 			final int maxLvl = _skillMaxLevel.get(skillId);
 			if (skillLvl > maxLvl)
 				_skillMaxLevel.put(skillId, skillLvl);
 		}
 		//SkillTreeTable.getInstance().reload();
-		
+
+		// Sorting for binarySearch
+		_enchantable.sort();
+
 		// Reloading as well FrequentSkill enumeration values 
 		for (FrequentSkill sk : FrequentSkill.values())
 			sk._skill = getInfo(sk._id, sk._level);
@@ -108,7 +118,12 @@ public class SkillTable
 	{
 		return _skillMaxLevel.get(skillId);
 	}
-	
+
+	public final boolean isEnchantable(final int skillId)
+	{
+		return _enchantable.binarySearch(skillId) >= 0;
+	}
+
 	/**
 	 * Returns an array with siege skills. If addNoble == true, will add also Advanced headquarters.
 	 */

+ 1 - 2
L2_GameServer/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -10283,8 +10283,7 @@ public final class L2PcInstance extends L2Playable
 				if (player.getClan() != null)
 					isDisabled = s.isClanSkill() && player.getClan().getReputationScore() < 0;
 
-				int skillMaxLevel = SkillTable.getInstance().getMaxLevel(s.getId());
-				boolean isEnchantable = skillMaxLevel > 100;
+				boolean isEnchantable = SkillTable.getInstance().isEnchantable(s.getId());
 				if (isEnchantable)
 				{
 					L2EnchantSkillLearn esl = EnchantGroupsTable.getInstance().getSkillEnchantmentBySkillId(s.getId());

+ 1 - 3
L2_GameServer/java/com/l2jserver/gameserver/network/serverpackets/GMViewSkillInfo.java

@@ -50,9 +50,7 @@ public class GMViewSkillInfo extends L2GameServerPacket
 			writeD(skill.getLevel());
 			writeD(skill.getId());
 			writeC(isDisabled && skill.isClanSkill() ? 1 : 0);
-			int skillMaxLevel = SkillTable.getInstance().getMaxLevel(skill.getId());
-			boolean isEnchanted = skillMaxLevel > 100;
-			writeC(isEnchanted ? 1 : 0);
+			writeC(SkillTable.getInstance().isEnchantable(skill.getId()) ? 1 : 0);
 		}
 	}