Kaynağa Gözat

BETA: Core support for [L8744]

Rumen Nikiforov 13 yıl önce
ebeveyn
işleme
e3e0b3a97f

+ 133 - 79
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ArmorSetsTable.java

@@ -14,17 +14,21 @@
  */
 package com.l2jserver.gameserver.datatables;
 
-import gnu.trove.map.hash.TIntObjectHashMap;
-
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
+import java.io.File;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import javolution.util.FastList;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+
 import com.l2jserver.Config;
-import com.l2jserver.L2DatabaseFactory;
 import com.l2jserver.gameserver.model.L2ArmorSet;
+import com.l2jserver.gameserver.model.holders.SkillHolder;
+import com.l2jserver.util.XMLParser;
+import com.l2jserver.util.file.filter.XMLFilter;
 
 /**
  * @author godson, Luno
@@ -33,7 +37,7 @@ public class ArmorSetsTable
 {
 	private static Logger _log = Logger.getLogger(ArmorSetsTable.class.getName());
 	
-	private TIntObjectHashMap<L2ArmorSet> _armorSets;
+	private FastList<L2ArmorSet> _armorSets;
 	
 	public static ArmorSetsTable getInstance()
 	{
@@ -42,101 +46,151 @@ public class ArmorSetsTable
 	
 	private ArmorSetsTable()
 	{
-		_armorSets = new TIntObjectHashMap<L2ArmorSet>();
+		_armorSets = new FastList<>();
 		loadData();
 	}
 	
-	private void loadData()
+	private final class Parser extends XMLParser
 	{
-		Connection con = null;
-		try
-		{
-			con = L2DatabaseFactory.getInstance().getConnection();
-			PreparedStatement statement = con.prepareStatement("SELECT chest, legs, head, gloves, feet, skill, shield, shield_skill_id, enchant6skill, mw_legs, mw_head, mw_gloves, mw_feet, mw_shield FROM armorsets");
-			ResultSet rset = statement.executeQuery();
-			
-			while (rset.next())
-			{
-				int chest = rset.getInt("chest");
-				int legs = rset.getInt("legs");
-				int head = rset.getInt("head");
-				int gloves = rset.getInt("gloves");
-				int feet = rset.getInt("feet");
-				String[] skills = rset.getString("skill").split(";");
-				int shield = rset.getInt("shield");
-				int shield_skill_id = rset.getInt("shield_skill_id");
-				int enchant6skill = rset.getInt("enchant6skill");
-				int mw_legs = rset.getInt("mw_legs");
-				int mw_head = rset.getInt("mw_head");
-				int mw_gloves = rset.getInt("mw_gloves");
-				int mw_feet = rset.getInt("mw_feet");
-				int mw_shield = rset.getInt("mw_shield");
-				_armorSets.put(chest, new L2ArmorSet(chest, legs, head, gloves, feet, skills, shield, shield_skill_id, enchant6skill, mw_legs, mw_head, mw_gloves, mw_feet, mw_shield));
-			}
-			
-			rset.close();
-			statement.close();
-			_log.info("ArmorSetsTable: Loaded " + _armorSets.size() + " armor sets.");
-		}
-		catch (Exception e)
-		{
-			_log.log(Level.SEVERE, "ArmorSetsTable: Error reading ArmorSets table: " + e.getMessage(), e);
-		}
-		finally
+		public Parser(File f)
 		{
-			L2DatabaseFactory.close(con);
+			super(f);
 		}
 		
-		if (Config.CUSTOM_ARMORSETS_TABLE)
+		@Override
+		public void parseDoc(Document doc)
 		{
-			try
+			NamedNodeMap attrs;
+			L2ArmorSet set;
+			Node att = null;
+			for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
 			{
-				int cSets = _armorSets.size();
-				con = L2DatabaseFactory.getInstance().getConnection();
-				PreparedStatement statement = con.prepareStatement("SELECT chest, legs, head, gloves, feet, skill, shield, shield_skill_id, enchant6skill, mw_legs, mw_head, mw_gloves, mw_feet, mw_shield FROM custom_armorsets");
-				ResultSet rset = statement.executeQuery();
-				while (rset.next())
+				if ("list".equalsIgnoreCase(n.getNodeName()))
 				{
-					int chest = rset.getInt("chest");
-					int legs = rset.getInt("legs");
-					int head = rset.getInt("head");
-					int gloves = rset.getInt("gloves");
-					int feet = rset.getInt("feet");
-					String[] skills = rset.getString("skill").split(";");
-					int shield = rset.getInt("shield");
-					int shield_skill_id = rset.getInt("shield_skill_id");
-					int enchant6skill = rset.getInt("enchant6skill");
-					int mw_legs = rset.getInt("mw_legs");
-					int mw_head = rset.getInt("mw_head");
-					int mw_gloves = rset.getInt("mw_gloves");
-					int mw_feet = rset.getInt("mw_feet");
-					int mw_shield = rset.getInt("mw_shield");
-					_armorSets.put(chest, new L2ArmorSet(chest, legs, head, gloves, feet, skills, shield, shield_skill_id, enchant6skill, mw_legs, mw_head, mw_gloves, mw_feet, mw_shield));
+					for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+					{
+						if ("set".equalsIgnoreCase(d.getNodeName()))
+						{
+							set = new L2ArmorSet();
+							_armorSets.add(set);
+							for (Node a = d.getFirstChild(); a != null; a = a.getNextSibling())
+							{
+								attrs = a.getAttributes();
+								try
+								{
+									if (attrs != null)
+										att = attrs.getNamedItem("id");
+									String name = a.getNodeName();
+									if ("chest".equalsIgnoreCase(name))
+									{
+										set.addChest(Integer.parseInt(att.getNodeValue()));
+									}
+									else if ("feet".equalsIgnoreCase(name))
+									{
+										set.addFeet(Integer.parseInt(att.getNodeValue()));
+									}
+									else if ("gloves".equalsIgnoreCase(name))
+									{
+										set.addGloves(Integer.parseInt(att.getNodeValue()));
+									}
+									else if ("head".equalsIgnoreCase(name))
+									{
+										set.addHead(Integer.parseInt(att.getNodeValue()));
+									}
+									else if ("legs".equalsIgnoreCase(name))
+									{
+										set.addLegs(Integer.parseInt(att.getNodeValue()));
+									}
+									else if ("shield".equalsIgnoreCase(name))
+									{
+										set.addShield(Integer.parseInt(att.getNodeValue()));
+									}
+									else if ("skill".equalsIgnoreCase(name))
+									{
+										int skillId = Integer.parseInt(att.getNodeValue());
+										int skillLevel = Integer.parseInt(attrs.getNamedItem("level").getNodeValue());
+										set.addSkill(new SkillHolder(skillId, skillLevel));										
+									}
+									else if ("shield_skill".equalsIgnoreCase(name))
+									{
+										int skillId = Integer.parseInt(att.getNodeValue());
+										int skillLevel = Integer.parseInt(attrs.getNamedItem("level").getNodeValue());
+										set.addShieldSkill(new SkillHolder(skillId, skillLevel));
+									}
+									else if ("enchant6skill".equalsIgnoreCase(name))
+									{
+										int skillId = Integer.parseInt(att.getNodeValue());
+										int skillLevel = Integer.parseInt(attrs.getNamedItem("level").getNodeValue());
+										set.addEnchant6Skill(new SkillHolder(skillId, skillLevel));
+									}
+									else if ("con".equalsIgnoreCase(name))
+									{
+										// TODO: Implement me
+									}
+									else if ("dex".equalsIgnoreCase(name))
+									{
+										// TODO: Implement me
+									}
+									else if ("str".equalsIgnoreCase(name))
+									{
+										// TODO: Implement me
+									}
+									else if ("men".equalsIgnoreCase(name))
+									{
+										// TODO: Implement me
+									}
+									else if ("wit".equalsIgnoreCase(name))
+									{
+										// TODO: Implement me
+									}
+									else if ("int".equalsIgnoreCase(name))
+									{
+										// TODO: Implement me
+									}
+								}
+								catch (Exception e)
+								{
+									_log.log(Level.WARNING, "Error while parsing set id: " + d.getAttributes().getNamedItem("id").getNodeValue() + " " + e.getMessage(), e);
+								}
+							}
+						}
+					}
 				}
-				
-				rset.close();
-				statement.close();
-				_log.info("ArmorSetsTable: Loaded " + (_armorSets.size() - cSets) + " Custom armor sets.");
-			}
-			catch (Exception e)
-			{
-				_log.log(Level.SEVERE, "ArmorSetsTable: Error reading Custom ArmorSets table: " + e.getMessage(), e);
 			}
-			finally
+		}
+	}
+	
+	private void loadData()
+	{
+		File dir = new File(Config.DATAPACK_ROOT, "data/stats/armorsets");
+		if (dir.isDirectory())
+		{
+			for (File f : dir.listFiles(new XMLFilter()))
 			{
-				L2DatabaseFactory.close(con);
+				new Parser(f);
 			}
 		}
+		else
+		{
+			_log.log(Level.WARNING, getClass().getSimpleName() + ": Couldn't find folder: " + dir.getAbsolutePath());
+		}
+		_log.log(Level.INFO, getClass().getSimpleName() + ": Loaded " + _armorSets.size() + " Armor sets.");
 	}
 	
 	public boolean setExists(int chestId)
 	{
-		return _armorSets.containsKey(chestId);
+		return getSet(chestId) != null;
 	}
 	
 	public L2ArmorSet getSet(int chestId)
 	{
-		return _armorSets.get(chestId);
+		for (L2ArmorSet set : _armorSets)
+		{
+			if (set.containsChest(chestId))
+				return set;
+		}
+		
+		return null;
 	}
 	
 	@SuppressWarnings("synthetic-access")

+ 106 - 61
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2ArmorSet.java

@@ -14,7 +14,10 @@
  */
 package com.l2jserver.gameserver.model;
 
+import javolution.util.FastList;
+
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.itemcontainer.Inventory;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 
@@ -23,42 +26,74 @@ import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
  */
 public final class L2ArmorSet
 {
-	private final int _chest;
-	private final int _legs;
-	private final int _head;
-	private final int _gloves;
-	private final int _feet;
-	private final int _mw_legs;
-	private final int _mw_head;
-	private final int _mw_gloves;
-	private final int _mw_feet;
-	
-	private final String[] _skills;
-	
-	private final int _shield;
-	private final int _mw_shield;
-	private final int _shieldSkillId;
-	
-	private final int _enchant6Skill;
-	
-	public L2ArmorSet(int chest, int legs, int head, int gloves, int feet, String[] skills, int shield, int shield_skill_id, int enchant6skill, int mw_legs, int mw_head, int mw_gloves, int mw_feet, int mw_shield)
-	{
-		_chest = chest;
-		_legs = legs;
-		_head = head;
-		_gloves = gloves;
-		_feet = feet;
-		_mw_legs = mw_legs;
-		_mw_head = mw_head;
-		_mw_gloves = mw_gloves;
-		_mw_feet = mw_feet;
-		_mw_shield = mw_shield;
-		_skills = skills;
-		
-		_shield = shield;
-		_shieldSkillId = shield_skill_id;
+	private final FastList<Integer> _chest;
+	private final FastList<Integer> _legs;
+	private final FastList<Integer> _head;
+	private final FastList<Integer> _gloves;
+	private final FastList<Integer> _feet;	
+	private final FastList<Integer> _shield;
+	
+	private final FastList<SkillHolder> _skills;
+	private final FastList<SkillHolder> _shieldSkills;
+	private final FastList<SkillHolder> _enchant6Skill;
+	
+	public L2ArmorSet()
+	{
+		_chest = new FastList<>();
+		_legs = new FastList<>();
+		_head = new FastList<>();
+		_gloves = new FastList<>();
+		_feet = new FastList<>();
+		_shield = new FastList<>();
 		
-		_enchant6Skill = enchant6skill;
+		_skills = new FastList<>();
+		_shieldSkills = new FastList<>();
+		_enchant6Skill = new FastList<>();
+	}
+	
+	public void addChest(int id)
+	{
+		_chest.add(id);
+	}
+	
+	public void addLegs(int id)
+	{
+		_legs.add(id);
+	}
+	
+	public void addHead(int id)
+	{
+		_head.add(id);
+	}
+	
+	public void addGloves(int id)
+	{
+		_gloves.add(id);
+	}
+	
+	public void addFeet(int id)
+	{
+		_feet.add(id);
+	}
+	
+	public void addShield(int id)
+	{
+		_shield.add(id);
+	}
+	
+	public void addSkill(SkillHolder holder)
+	{
+		_skills.add(holder);
+	}
+	
+	public void addShieldSkill(SkillHolder holder)
+	{
+		_shieldSkills.add(holder);
+	}
+	
+	public void addEnchant6Skill(SkillHolder holder)
+	{
+		_enchant6Skill.add(holder);
 	}
 	
 	/**
@@ -91,45 +126,53 @@ public final class L2ArmorSet
 		if (feetItem != null)
 			feet = feetItem.getItemId();
 		
-		return containAll(_chest, legs, head, gloves, feet);
+		if (!_chest.isEmpty())
+		{
+			for (Integer chest : _chest)
+			{
+				if (containAll(chest, legs, head, gloves, feet))
+					return true;
+			}
+		}
+		return containAll(0, legs, head, gloves, feet);
 	}
 	
 	public boolean containAll(int chest, int legs, int head, int gloves, int feet)
 	{
-		if (_chest != 0 && _chest != chest)
+		if (!_chest.isEmpty() && !_chest.contains(Integer.valueOf(chest)))
 			return false;
-		if (_legs != 0 && _legs != legs && (_mw_legs == 0 || _mw_legs != legs))
+		if (!_legs.isEmpty() && !_legs.contains(Integer.valueOf(legs)))
 			return false;
-		if (_head != 0 && _head != head && (_mw_head == 0 || _mw_head != head))
+		if (!_head.isEmpty() && !_head.contains(Integer.valueOf(head)))
 			return false;
-		if (_gloves != 0 && _gloves != gloves && (_mw_gloves == 0 || _mw_gloves != gloves))
+		if (!_gloves.isEmpty() && !_gloves.contains(Integer.valueOf(gloves)))
 			return false;
-		if (_feet != 0 && _feet != feet && (_mw_feet == 0 || _mw_feet != feet))
+		if (!_feet.isEmpty() && !_feet.contains(Integer.valueOf(feet)))
 			return false;
 		
 		return true;
 	}
 	
-	public boolean containItem(int slot, int itemId)
+	public boolean containItem(int slot, Integer itemId)
 	{
 		switch (slot)
 		{
 			case Inventory.PAPERDOLL_CHEST:
-				return _chest == itemId;
+				return _chest.contains(Integer.valueOf(itemId));
 			case Inventory.PAPERDOLL_LEGS:
-				return (_legs == itemId || _mw_legs == itemId);
+				return _legs.contains(Integer.valueOf(itemId));
 			case Inventory.PAPERDOLL_HEAD:
-				return (_head == itemId || _mw_head == itemId);
+				return _head.contains(Integer.valueOf(itemId));
 			case Inventory.PAPERDOLL_GLOVES:
-				return (_gloves == itemId || _mw_gloves == itemId);
+				return _gloves.contains(Integer.valueOf(itemId));
 			case Inventory.PAPERDOLL_FEET:
-				return (_feet == itemId || _mw_feet == itemId);
+				return _feet.contains(Integer.valueOf(itemId));
 			default:
 				return false;
 		}
 	}
 	
-	public String[] getSkills()
+	public FastList<SkillHolder> getSkills()
 	{
 		return _skills;
 	}
@@ -139,26 +182,23 @@ public final class L2ArmorSet
 		Inventory inv = player.getInventory();
 		
 		L2ItemInstance shieldItem = inv.getPaperdollItem(Inventory.PAPERDOLL_LHAND);
-		if (shieldItem != null && (shieldItem.getItemId() == _shield || shieldItem.getItemId() == _mw_shield))
-			return true;
-		
-		return false;
+		return (shieldItem != null && _shield.contains(Integer.valueOf(shieldItem.getItemId())));
 	}
 	
 	public boolean containShield(int shield_id)
 	{
-		if (_shield == 0)
+		if (_shield.isEmpty())
 			return false;
 		
-		return (_shield == shield_id || _mw_shield == shield_id);
+		return _shield.contains(Integer.valueOf(shield_id));
 	}
 	
-	public int getShieldSkillId()
+	public FastList<SkillHolder> getShieldSkillId()
 	{
-		return _shieldSkillId;
+		return _shieldSkills;
 	}
 	
-	public int getEnchant6skillId()
+	public FastList<SkillHolder> getEnchant6skillId()
 	{
 		return _enchant6Skill;
 	}
@@ -183,15 +223,20 @@ public final class L2ArmorSet
 		
 		if (chestItem == null || chestItem.getEnchantLevel() < 6)
 			return false;
-		if (_legs != 0 && (legsItem == null || legsItem.getEnchantLevel() < 6))
+		if (!_legs.isEmpty() && (legsItem == null || legsItem.getEnchantLevel() < 6))
 			return false;
-		if (_gloves != 0 && (glovesItem == null || glovesItem.getEnchantLevel() < 6))
+		if (!_gloves.isEmpty() && (glovesItem == null || glovesItem.getEnchantLevel() < 6))
 			return false;
-		if (_head != 0 && (headItem == null || headItem.getEnchantLevel() < 6))
+		if (!_head.isEmpty() && (headItem == null || headItem.getEnchantLevel() < 6))
 			return false;
-		if (_feet != 0 && (feetItem == null || feetItem.getEnchantLevel() < 6))
+		if (!_feet.isEmpty() && (feetItem == null || feetItem.getEnchantLevel() < 6))
 			return false;
 		
 		return true;
 	}
+
+	public boolean containsChest(int chestId)
+	{
+		return _chest.contains(Integer.valueOf(chestId));
+	}
 }

+ 6 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/holders/SkillHolder.java

@@ -54,4 +54,10 @@ public final class SkillHolder
 	{
 		return SkillTable.getInstance().getInfo(_skillId, _skillLvl);
 	}
+	
+	@Override
+	public String toString()
+	{
+		return "[SkillId: " + _skillId + " Level: " + _skillLvl + "]";
+	}
 }

+ 62 - 99
L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/Inventory.java

@@ -28,7 +28,6 @@ import com.l2jserver.Config;
 import com.l2jserver.L2DatabaseFactory;
 import com.l2jserver.gameserver.datatables.ArmorSetsTable;
 import com.l2jserver.gameserver.datatables.ItemTable;
-import com.l2jserver.gameserver.datatables.SkillTable;
 import com.l2jserver.gameserver.model.L2ArmorSet;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -466,105 +465,82 @@ public abstract class Inventory extends ItemContainer
 			{
 				if (armorSet.containAll(player))
 				{
-					int skillId, skillLvl;
 					L2Skill itemSkill;
-					final String[] skills = armorSet.getSkills();
+					final FastList<SkillHolder> skills = armorSet.getSkills();
 					
 					if (skills != null)
 					{
-						for (String skillInfo : skills)
+						for (SkillHolder holder : skills)
 						{
-							skillId = 0;
-							skillLvl = 0;
-							String[] skill = skillInfo.split("-");
-							if (skill != null && skill.length == 2)
+							
+							itemSkill = holder.getSkill();
+							if (itemSkill != null)
 							{
-								try
-								{
-									skillId = Integer.parseInt(skill[0]);
-									skillLvl = Integer.parseInt(skill[1]);
-								}
-								catch (NumberFormatException e)
-								{
-									_log.warning("Inventory.ArmorSetListener: 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.hasSkillReuse(itemSkill.getReuseHashCode()))
 									{
-										player.addSkill(itemSkill, false);
+										int equipDelay = itemSkill.getEquipDelay();
 										
-										if (itemSkill.isActive())
+										if (equipDelay > 0)
 										{
-											if (player.hasSkillReuse(itemSkill.getReuseHashCode()))
-											{
-												int equipDelay = itemSkill.getEquipDelay();
-												
-												if (equipDelay > 0)
-												{
-													player.addTimeStamp(itemSkill, itemSkill.getEquipDelay());
-													player.disableSkill(itemSkill, itemSkill.getEquipDelay());
-												}
-											}
-											updateTimeStamp = true;
+											player.addTimeStamp(itemSkill, itemSkill.getEquipDelay());
+											player.disableSkill(itemSkill, itemSkill.getEquipDelay());
 										}
-										update = true;
-									}
-									else
-									{
-										_log.warning("Inventory.ArmorSetListener: Incorrect skill: "+skillInfo+".");
 									}
+									updateTimeStamp = true;
 								}
+								update = true;
+							}
+							else
+							{
+								_log.warning("Inventory.ArmorSetListener: Incorrect skill: " + holder + ".");
 							}
 						}
 					}
 					
 					if (armorSet.containShield(player)) // has shield from set
 					{
-						final L2Skill shieldSkill = SkillTable.getInstance().getInfo(armorSet.getShieldSkillId(),1);
-						
-						if (shieldSkill != null)
+						for (SkillHolder holder : armorSet.getShieldSkillId())
 						{
-							player.addSkill(shieldSkill, false);
-							update = true;
+							if (holder.getSkill() != null)
+							{
+								player.addSkill(holder.getSkill(), false);
+								update = true;
+							}
+							else
+								_log.warning("Inventory.ArmorSetListener: Incorrect skill: " + holder + ".");
 						}
-						else
-							_log.warning("Inventory.ArmorSetListener: Incorrect skill: "+armorSet.getShieldSkillId()+".");
 					}
 					
 					if (armorSet.isEnchanted6(player)) // has all parts of set enchanted to 6 or more
 					{
-						final int skillId6 = armorSet.getEnchant6skillId();
-						
-						if (skillId6 > 0)
+						for (SkillHolder holder : armorSet.getEnchant6skillId())
 						{
-							L2Skill skille = SkillTable.getInstance().getInfo(skillId6,1);
-							
-							if (skille != null)
+							if (holder.getSkill() != null)
 							{
-								player.addSkill(skille, false);
+								player.addSkill(holder.getSkill(), false);
 								update = true;
 							}
 							else
-								_log.warning("Inventory.ArmorSetListener: Incorrect skill: "+armorSet.getEnchant6skillId()+".");
+								_log.warning("Inventory.ArmorSetListener: Incorrect skill: " + holder + ".");
 						}
 					}
 				}
 			}
 			else if (armorSet.containShield(item.getItemId()))
 			{
-				if (armorSet.containAll(player))
+				for (SkillHolder holder : armorSet.getShieldSkillId())
 				{
-					final L2Skill shieldSkill = SkillTable.getInstance().getInfo(armorSet.getShieldSkillId(),1);
-					
-					if (shieldSkill != null)
+					if (holder.getSkill() != null)
 					{
-						player.addSkill(shieldSkill, false);
+						player.addSkill(holder.getSkill(), false);
 						update = true;
 					}
 					else
-						_log.warning("Inventory.ArmorSetListener: Incorrect skill: "+armorSet.getShieldSkillId()+".");
+						_log.warning("Inventory.ArmorSetListener: Incorrect skill: " + holder + ".");
 				}
 			}
 			
@@ -586,11 +562,10 @@ public abstract class Inventory extends ItemContainer
 			L2PcInstance player = (L2PcInstance) inventory.getOwner();
 			
 			boolean remove = false;
-			int skillId, skillLvl;
 			L2Skill itemSkill;
-			String[] skills = null;
-			int shieldSkill = 0; // shield skill
-			int skillId6 = 0; // enchant +6 skill
+			FastList<SkillHolder> skills = null;
+			FastList<SkillHolder> shieldSkill = null; // shield skill
+			FastList<SkillHolder> skillId6 = null; // enchant +6 skill
 			
 			if (slot == PAPERDOLL_CHEST)
 			{
@@ -631,50 +606,38 @@ public abstract class Inventory extends ItemContainer
 			{
 				if (skills != null)
 				{
-					for (String skillInfo : skills)
+					for (SkillHolder holder : skills)
 					{
-						skillId = 0;
-						skillLvl = 0;
-						String[] skill = skillInfo.split("-");
-						if (skill != null && skill.length == 2)
-						{
-							try
-							{
-								skillId = Integer.parseInt(skill[0]);
-								skillLvl = Integer.parseInt(skill[1]);
-							}
-							catch (NumberFormatException e)
-							{
-								_log.warning("Inventory.ArmorSetListener: Incorrect skill: "+skillInfo+".");
-							}
-							if (skillId > 0 && skillLvl >0)
-							{
-								itemSkill = SkillTable.getInstance().getInfo(skillId, skillLvl);
-								if (itemSkill != null)
-									player.removeSkill(itemSkill, false, itemSkill.isPassive());
-								else
-									_log.warning("Inventory.ArmorSetListener: Incorrect skill: "+skillInfo+".");
-							}
-						}
+						itemSkill = holder.getSkill();
+						if (itemSkill != null)
+							player.removeSkill(itemSkill, false, itemSkill.isPassive());
+						else
+							_log.warning("Inventory.ArmorSetListener: Incorrect skill: " + holder + ".");
 					}
 				}
 				
-				if (shieldSkill != 0)
+				if (shieldSkill != null)
 				{
-					L2Skill skill = SkillTable.getInstance().getInfo(shieldSkill,1);
-					if (skill != null)
-						player.removeSkill(skill, false, skill.isPassive());
-					else
-						_log.warning("Inventory.ArmorSetListener: Incorrect skill: "+shieldSkill+".");
+					for (SkillHolder holder : shieldSkill)
+					{
+						itemSkill = holder.getSkill();
+						if (itemSkill != null)
+							player.removeSkill(itemSkill, false, itemSkill.isPassive());
+						else
+							_log.warning("Inventory.ArmorSetListener: Incorrect skill: " + holder + ".");
+					}
 				}
 				
-				if (skillId6 != 0)
+				if (skillId6 != null)
 				{
-					L2Skill skill = SkillTable.getInstance().getInfo(skillId6,1);
-					if (skill != null)
-						player.removeSkill(skill, false, skill.isPassive());
-					else
-						_log.warning("Inventory.ArmorSetListener: Incorrect skill: "+skillId6+".");
+					for (SkillHolder holder : skillId6)
+					{
+						itemSkill = holder.getSkill();
+						if (itemSkill != null)
+							player.removeSkill(itemSkill, false, itemSkill.isPassive());
+						else
+							_log.warning("Inventory.ArmorSetListener: Incorrect skill: " + holder + ".");
+					}
 				}
 				
 				player.checkItemRestriction();

+ 91 - 0
L2J_Server_BETA/java/com/l2jserver/util/XMLParser.java

@@ -0,0 +1,91 @@
+/*
+ * 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.util;
+
+import java.io.File;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.w3c.dom.Document;
+
+/**
+ * @author UnAfraid
+ *
+ */
+public abstract class XMLParser
+{
+	private static final Logger _log = Logger.getLogger(XMLParser.class.getName());
+	
+	private final File _file;
+	public XMLParser(File f)
+	{
+		_file = f;
+		doParse();
+	}
+	
+	public boolean isIgnoringComments()
+	{
+		return false;
+	}
+	
+	public boolean isValidating()
+	{
+		return false;
+	}
+	
+	public void doParse()
+	{
+		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+		factory.setValidating(isValidating());
+		factory.setIgnoringComments(isIgnoringComments());
+		Document doc = null;
+		
+		if (getXML().exists())
+		{
+			try
+			{
+				doc = factory.newDocumentBuilder().parse(getXML());
+			}
+			catch (Exception e)
+			{
+				_log.log(Level.WARNING, "Could not parse " + getXML().getName() + " file: " + e.getMessage(), e);
+				return;
+			}
+			
+			try
+			{
+				parseDoc(doc);
+			}
+			catch (Exception e)
+			{
+				_log.log(Level.WARNING, "Error while parsing doc: " + e.getMessage(), e);
+			}
+		
+		}
+		else
+		{
+			_log.log(Level.WARNING, "Could not found " + getXML().getName() + " file!");
+		}
+	}
+	
+	public File getXML()
+	{
+		return _file;
+	}
+	
+	public abstract void parseDoc(Document doc);
+}