Pārlūkot izejas kodu

Item skills now parsed only once on server load, not each use. Thanks BiggBoss.

_DS_ 15 gadi atpakaļ
vecāks
revīzija
f93a1e582c

+ 65 - 128
L2_GameServer/java/com/l2jserver/gameserver/model/itemcontainer/Inventory.java

@@ -32,6 +32,7 @@ import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.L2ItemInstance.ItemLocation;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.serverpackets.SkillCoolTime;
+import com.l2jserver.gameserver.skills.SkillHolder;
 import com.l2jserver.gameserver.skills.Stats;
 import com.l2jserver.gameserver.templates.item.L2Armor;
 import com.l2jserver.gameserver.templates.item.L2EtcItem;
@@ -278,7 +279,6 @@ public abstract class Inventory extends ItemContainer
 				return;
 
 			L2Skill enchant4Skill, itemSkill;
-			int skillId, skillLvl;
 			L2Item it = item.getItem();
 			boolean update = false;
 
@@ -302,40 +302,24 @@ public abstract class Inventory extends ItemContainer
 					}
 				}
 
-				final String[] skills = ((L2Weapon)it).getSkills();
+				final SkillHolder[] skills = ((L2Weapon)it).getSkills();
 
 				if (skills != null)
 				{
-					for (String skillInfo : skills)
+					for (SkillHolder skillInfo  : skills)
 					{
-						skillId = 0;
-						skillLvl = 0;
-						String[] skill = skillInfo.split("-");
+						if(skillInfo == null)
+							continue;
 
-						if (skill != null && skill.length == 2)
-						{
-							try
-							{
-								skillId = Integer.parseInt(skill[0]);
-								skillLvl = Integer.parseInt(skill[1]);
-							}
-							catch (NumberFormatException e)
-							{
-								_log.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: "+skillInfo+".");
-							}
-							if (skillId > 0 && skillLvl > 0)
-							{
-								itemSkill = SkillTable.getInstance().getInfo(skillId, skillLvl);
+						itemSkill = skillInfo.getSkill();
 								
-								if (itemSkill != null)
-								{
-									player.removeSkill(itemSkill, false, itemSkill.isPassive());
-									update = true;
-								}
-								else
-									_log.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: "+skillInfo+".");
-							}
+						if (itemSkill != null)
+						{
+							player.removeSkill(itemSkill, false, itemSkill.isPassive());
+							update = true;
 						}
+						else
+							_log.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: "+skillInfo+".");
 					}
 				}
 			}
@@ -360,45 +344,30 @@ public abstract class Inventory extends ItemContainer
 					}
 				}
 				
-				final String[] skills = ((L2Armor)it).getSkills();
+				final SkillHolder[] skills = ((L2Armor)it).getSkills();
 
 				if (skills != null)
 				{
-					for (String skillInfo : skills)
+					for (SkillHolder skillInfo : skills)
 					{
-						skillId = 0;
-						skillLvl = 0;
-						String[] skill = skillInfo.split("-");
+						if(skillInfo == null)
+							continue;
 
-						if (skill != null && skill.length == 2)
-						{
-							try
-							{
-								skillId = Integer.parseInt(skill[0]);
-								skillLvl = Integer.parseInt(skill[1]);
-							}
-							catch (NumberFormatException e)
-							{
-								_log.warning("Inventory.ItemSkillsListener.Armor: Incorrect skill: "+skillInfo+".");								
-							}
-							if (skillId > 0 && skillLvl > 0)
-							{
-								itemSkill = SkillTable.getInstance().getInfo(skillId, skillLvl);
+						itemSkill = skillInfo.getSkill();
 								
-								if (itemSkill != null)
-								{
-									player.removeSkill(itemSkill, false, itemSkill.isPassive());
-									update = true;
-								}
-								else
-									_log.warning("Inventory.ItemSkillsListener.Armor: Incorrect skill: "+skillInfo+".");								
-							}
+						if (itemSkill != null)
+						{
+							player.removeSkill(itemSkill, false, itemSkill.isPassive());
+							update = true;
 						}
+						else
+							_log.warning("Inventory.ItemSkillsListener.Armor: Incorrect skill: "+skillInfo+".");								
 					}
 				}
 			}
 			if (update)
 				player.sendSkillList();
+			
 		}
 
 		public void notifyEquiped(int slot, L2ItemInstance item)
@@ -411,11 +380,10 @@ public abstract class Inventory extends ItemContainer
 				return;
 
 			L2Skill enchant4Skill, itemSkill;
-			int skillId, skillLvl;
 			L2Item it = item.getItem();
 			boolean update = false;
 			boolean updateTimeStamp = false;
-
+			
 			if (it instanceof L2Weapon)
 			{
 				// Apply augmentation bonuses on equip
@@ -437,55 +405,39 @@ public abstract class Inventory extends ItemContainer
 					}
 				}
 
-				final String[] skills = ((L2Weapon)it).getSkills();
+				final SkillHolder[] skills = ((L2Weapon)it).getSkills();
 
 				if (skills != null)
 				{
-					for (String skillInfo : skills)
+					for (SkillHolder skillInfo : skills)
 					{
-						skillId = 0;
-						skillLvl = 0;
-						String[] skill = skillInfo.split("-");
+						if(skillInfo == null)
+							continue;
 
-						if (skill != null && skill.length == 2)
+						itemSkill = skillInfo.getSkill(); 
+								
+						if (itemSkill != null)
 						{
-							try
-							{
-								skillId = Integer.parseInt(skill[0]);
-								skillLvl = Integer.parseInt(skill[1]);
-							}
-							catch (NumberFormatException e)
-							{
-								_log.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: "+skillInfo+".");								
-							}
-							if (skillId > 0 && skillLvl > 0)
+							player.addSkill(itemSkill, false);
+
+							if (itemSkill.isActive())
 							{
-								itemSkill = SkillTable.getInstance().getInfo(skillId, skillLvl);
-								
-								if (itemSkill != null)
+								if (player.getReuseTimeStamp().isEmpty() || !player.getReuseTimeStamp().containsKey(itemSkill.getId()))
 								{
-									player.addSkill(itemSkill, false);
+									int equipDelay = itemSkill.getEquipDelay();
 
-									if (itemSkill.isActive())
+									if (equipDelay > 0)
 									{
-										if (player.getReuseTimeStamp().isEmpty() || !player.getReuseTimeStamp().containsKey(itemSkill.getId()))
-										{
-											int equipDelay = itemSkill.getEquipDelay();
-
-											if (equipDelay > 0)
-											{
-												player.addTimeStamp(itemSkill.getId(), equipDelay);
-												player.disableSkill(itemSkill.getId(), equipDelay);
-											}
-										}
-										updateTimeStamp = true;
+										player.addTimeStamp(itemSkill.getId(), equipDelay);
+										player.disableSkill(itemSkill.getId(), equipDelay);
 									}
-									update = true;
 								}
-								else
-									_log.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: "+skillInfo+".");
+								updateTimeStamp = true;
 							}
+							update = true;
 						}
+						else
+							_log.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: "+skillInfo+".");
 					}
 				}
 			}
@@ -510,55 +462,39 @@ public abstract class Inventory extends ItemContainer
 					}
 				}
 				
-				final String[] skills = ((L2Armor)it).getSkills();
+				final SkillHolder[] skills = ((L2Armor)it).getSkills();
 
 				if (skills != null)
 				{
-					for (String skillInfo : skills)
+					for (SkillHolder skillInfo : skills)
 					{
-						skillId = 0;
-						skillLvl = 0;
-						String[] skill = skillInfo.split("-");
+						if(skillInfo == null)
+							continue;
 
-						if (skill != null && skill.length == 2)
+						itemSkill = skillInfo.getSkill(); 						
+								
+						if (itemSkill != null)
 						{
-							try
-							{
-								skillId = Integer.parseInt(skill[0]);
-								skillLvl = Integer.parseInt(skill[1]);
-							}
-							catch (NumberFormatException e)
-							{
-								_log.warning("Inventory.ItemSkillsListener.Armor: Incorrect skill: "+skillInfo+".");								
-							}
-							if (skillId > 0 && skillLvl > 0)
+							player.addSkill(itemSkill, false);
+
+							if (itemSkill.isActive())
 							{
-								itemSkill = SkillTable.getInstance().getInfo(skillId, skillLvl);
-								
-								if (itemSkill != null)
+								if (player.getReuseTimeStamp().isEmpty() || !player.getReuseTimeStamp().containsKey(itemSkill.getId()))
 								{
-									player.addSkill(itemSkill, false);
+									int equipDelay = itemSkill.getEquipDelay();
 
-									if (itemSkill.isActive())
+									if (equipDelay > 0)
 									{
-										if (player.getReuseTimeStamp().isEmpty() || !player.getReuseTimeStamp().containsKey(itemSkill.getId()))
-										{
-											int equipDelay = itemSkill.getEquipDelay();
-
-											if (equipDelay > 0)
-											{
-												player.addTimeStamp(itemSkill.getId(), itemSkill.getEquipDelay());
-												player.disableSkill(itemSkill.getId(), itemSkill.getEquipDelay());
-											}
-										}
-										updateTimeStamp = true;
+										player.addTimeStamp(itemSkill.getId(), itemSkill.getEquipDelay());
+										player.disableSkill(itemSkill.getId(), itemSkill.getEquipDelay());
 									}
-									update = true;
 								}
-								else
-									_log.warning("Inventory.ItemSkillsListener.Armor: Incorrect skill: "+skillInfo+".");
+								updateTimeStamp = true;
 							}
+							update = true;
 						}
+						else
+							_log.warning("Inventory.ItemSkillsListener.Armor: Incorrect skill: "+skillInfo+".");
 					}
 				}
 			}
@@ -1704,7 +1640,8 @@ public abstract class Inventory extends ItemContainer
 		}
 		catch (Exception e)
 		{
-			_log.warning("Could not restore inventory : " + e);
+			_log.warning("Could not restore inventory :");
+			e.printStackTrace();
 		}
 		finally 
 		{

+ 38 - 4
L2_GameServer/java/com/l2jserver/gameserver/templates/item/L2Armor.java

@@ -21,9 +21,11 @@ import com.l2jserver.gameserver.model.L2ItemInstance;
 import com.l2jserver.gameserver.model.L2Skill;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.skills.Env;
+import com.l2jserver.gameserver.skills.SkillHolder;
 import com.l2jserver.gameserver.skills.funcs.Func;
 import com.l2jserver.gameserver.skills.funcs.FuncTemplate;
 import com.l2jserver.gameserver.templates.StatsSet;
+import com.l2jserver.gameserver.util.StringUtil;
 
 /**
  * This class is dedicated to the management of armors.
@@ -38,7 +40,8 @@ public final class L2Armor extends L2Item
 	private final int _mpBonus;
 	private final int _hpBonus;
 	private L2Skill _enchant4Skill = null; // skill that activates when armor is enchanted +4
-	private final String[] _skill;
+	// private final String[] _skill;
+	private SkillHolder[] _skillHolder;
 
     /**
      * Constructor for Armor.<BR><BR>
@@ -69,7 +72,38 @@ public final class L2Armor extends L2Item
 				_enchant4Skill = SkillTable.getInstance().getInfo(skill_Id, skillLvl);
 		}
 
-		_skill = set.getString("skill").split(";");
+		String[] skills = set.getString("skill").split(";");
+		_skillHolder = new SkillHolder[skills.length];
+		byte iterator = 0;
+		for(String st : skills)
+		{
+			String[] info = st.split("-");
+			
+			if(info == null || info.length != 2)
+				continue;
+			
+			int id = 0;
+			int level = 0;
+			
+			try
+			{
+				id = Integer.parseInt(info[0]);
+				level = Integer.parseInt(info[1]);
+			}
+			catch(Exception nfe)
+			{
+				// Incorrect syntax, dont add new skill
+				System.out.println(StringUtil.concat("> Couldnt parse " , st, " in armor skills!"));
+				continue;
+			}
+			
+			// If skill can exist, add it
+			if(id > 0 && level > 0)
+			{
+				_skillHolder[iterator] = new SkillHolder(id, level);
+				iterator++;
+			}
+		}
 	}
 
 	/**
@@ -150,9 +184,9 @@ public final class L2Armor extends L2Item
 	 * Returns passive skill linked to that armor
 	 * @return
 	 */
-	public String[] getSkills()
+	public SkillHolder[] getSkills()
 	{
-		return _skill;
+		return _skillHolder;
 	}
 
 	/**

+ 41 - 4
L2_GameServer/java/com/l2jserver/gameserver/templates/item/L2EtcItem.java

@@ -14,7 +14,9 @@
  */
 package com.l2jserver.gameserver.templates.item;
 
+import com.l2jserver.gameserver.skills.SkillHolder;
 import com.l2jserver.gameserver.templates.StatsSet;
+import com.l2jserver.gameserver.util.StringUtil;
 
 /**
  * This class is dedicated to the management of EtcItem.
@@ -23,8 +25,9 @@ import com.l2jserver.gameserver.templates.StatsSet;
  */
 public final class L2EtcItem  extends L2Item
 {
-	private final String[] _skill;
+	// private final String[] _skill;
 	private final String _handler;
+	private SkillHolder[] _skillHolder;
 	/**
 	 * Constructor for EtcItem.
 	 * @see L2Item constructor
@@ -34,7 +37,41 @@ public final class L2EtcItem  extends L2Item
 	public L2EtcItem(L2EtcItemType type, StatsSet set)
 	{
 		super(type, set);
-		_skill = set.getString("skill").split(";");
+		String[] skills = set.getString("skill").split(";");
+		
+		_skillHolder = new SkillHolder[skills.length];
+		byte iterator = 0;
+		
+		for(String st : skills)
+		{
+			String[] info = st.split("-");
+			
+			if(info == null || info.length != 2)
+				continue;
+
+			int id = 0;
+			int level = 0;
+			
+			try
+			{
+				id = Integer.parseInt(info[0]);
+				level = Integer.parseInt(info[1]);
+			}
+			catch(Exception nfe)
+			{
+				// Incorrect syntax, dont add new skill
+				System.out.println(StringUtil.concat("> Couldnt parse " , st, " in etcitem skills!"));
+				continue;
+			}
+			
+			// If skill can exist, add it
+			if(id > 0 && level > 0)
+			{
+				_skillHolder[iterator] = new SkillHolder(id, level);
+				iterator++;
+			}
+		}
+		
 		_handler = set.getString("handler");
 	}
 
@@ -72,9 +109,9 @@ public final class L2EtcItem  extends L2Item
 	 * Returns skills linked to that EtcItem
 	 * @return
 	 */
-	public String[] getSkills()
+	public SkillHolder[] getSkills()
 	{
-		return _skill;
+		return _skillHolder;
 	}
 	
 	public String getHandlerName()

+ 38 - 4
L2_GameServer/java/com/l2jserver/gameserver/templates/item/L2Weapon.java

@@ -32,12 +32,14 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.skills.Env;
 import com.l2jserver.gameserver.skills.Formulas;
+import com.l2jserver.gameserver.skills.SkillHolder;
 import com.l2jserver.gameserver.skills.conditions.Condition;
 import com.l2jserver.gameserver.skills.conditions.ConditionGameChance;
 import com.l2jserver.gameserver.skills.funcs.Func;
 import com.l2jserver.gameserver.skills.funcs.FuncTemplate;
 import com.l2jserver.gameserver.templates.StatsSet;
 import com.l2jserver.gameserver.templates.skills.L2SkillType;
+import com.l2jserver.gameserver.util.StringUtil;
 
 import javolution.util.FastList;
 
@@ -63,7 +65,8 @@ public final class L2Weapon extends L2Item
 	private final int _mDam;
 	private L2Skill _enchant4Skill = null; // skill that activates when item is enchanted +4 (for duals)
 	private final int _changeWeaponId;
-	private final String[] _skill;
+	// private final String[] _skill;
+	private SkillHolder[] _skillHolder;
 	
 	// Attached skills for Special Abilities
 	protected L2Skill _skillsOnCast;
@@ -103,7 +106,38 @@ public final class L2Weapon extends L2Item
 		_mpConsume = set.getInteger("mp_consume");
 		_mDam = set.getInteger("m_dam");
 		
-		_skill = set.getString("skill").split(";");
+		String[] skills = set.getString("skill").split(";");
+		_skillHolder = new SkillHolder[skills.length];
+		byte iterator = 0;
+		for(String st : skills)
+		{
+			String[] info = st.split("-");
+			
+			if(info == null || info.length != 2)
+				continue;
+
+			int id = 0;
+			int level = 0;
+			
+			try
+			{
+				id = Integer.parseInt(info[0]);
+				level = Integer.parseInt(info[1]);
+			}
+			catch(Exception nfe)
+			{
+				// Incorrect syntax, dont add new skill
+				System.out.println(StringUtil.concat("> Couldnt parse " , st, " in weapon skills!"));
+				continue;
+			}
+			
+			// If skill can exist, add it
+			if(id > 0 && level > 0)
+			{
+				_skillHolder[iterator] = new SkillHolder(id, level);
+				iterator++;
+			}
+		}
 		
 		int sId = set.getInteger("enchant4_skill_id");
 		int sLv = set.getInteger("enchant4_skill_lvl");
@@ -273,9 +307,9 @@ public final class L2Weapon extends L2Item
 	 * Returns passive skill linked to that weapon
 	 * @return
 	 */
-	public String[] getSkills()
+	public SkillHolder[] getSkills()
 	{
-		return _skill;
+		return _skillHolder;
 	}
 	
 	/**