Browse Source

BETA: Little update of ArmorSetsTable:
* Enforcing xsd validation.
* Using DocumentParser and removing old implementation of XMLParser
* Only one chest per set is now supported (Since set is binded to it)

Rumen Nikiforov 13 years ago
parent
commit
3238e435f1

+ 108 - 125
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/ArmorSetsTable.java

@@ -15,29 +15,25 @@
 package com.l2jserver.gameserver.datatables;
 
 import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
 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.gameserver.engines.DocumentParser;
 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
+ * @author godson, Luno, UnAfraid
  */
-public class ArmorSetsTable
+public class ArmorSetsTable extends DocumentParser
 {
-	private static Logger _log = Logger.getLogger(ArmorSetsTable.class.getName());
-	
-	private FastList<L2ArmorSet> _armorSets;
+	private Map<Integer, L2ArmorSet> _armorSets;
 	
 	public static ArmorSetsTable getInstance()
 	{
@@ -46,151 +42,138 @@ public class ArmorSetsTable
 	
 	private ArmorSetsTable()
 	{
-		_armorSets = new FastList<>();
-		loadData();
+		_armorSets = new HashMap<>();
+		load();
 	}
 	
-	private final class Parser extends XMLParser
+	private void load()
 	{
-		public Parser(File f)
-		{
-			super(f);
-		}
-		
-		@Override
-		public void parseDoc(Document doc)
+		loadDirectory(new File(Config.DATAPACK_ROOT, "data/stats/armorsets"));
+		_log.log(Level.INFO, getClass().getSimpleName() + ": Loaded " + _armorSets.size() + " Armor sets.");
+	}
+	
+	@Override
+	protected void parseDoc(Document doc)
+	{
+		NamedNodeMap attrs;
+		L2ArmorSet set;
+		for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
 		{
-			NamedNodeMap attrs;
-			L2ArmorSet set;
-			Node att = null;
-			for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
+			if ("list".equalsIgnoreCase(n.getNodeName()))
 			{
-				if ("list".equalsIgnoreCase(n.getNodeName()))
+				for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
 				{
-					for (Node d = n.getFirstChild(); d != null; d = d.getNextSibling())
+					if ("set".equalsIgnoreCase(d.getNodeName()))
 					{
-						if ("set".equalsIgnoreCase(d.getNodeName()))
+						set = new L2ArmorSet();
+						for (Node a = d.getFirstChild(); a != null; a = a.getNextSibling())
 						{
-							set = new L2ArmorSet();
-							_armorSets.add(set);
-							for (Node a = d.getFirstChild(); a != null; a = a.getNextSibling())
+							attrs = a.getAttributes();
+							switch (a.getNodeName())
 							{
-								attrs = a.getAttributes();
-								try
+								case "chest":
+								{
+									set.addChest(getIntValue(attrs.getNamedItem("id")));
+									break;
+								}
+								case "feet":
+								{
+									set.addFeet(getIntValue(attrs.getNamedItem("id")));
+									break;
+								}
+								case "gloves":
+								{
+									set.addGloves(getIntValue(attrs.getNamedItem("id")));
+									break;
+								}
+								case "head":
+								{
+									set.addHead(getIntValue(attrs.getNamedItem("id")));
+									break;
+								}
+								case "legs":
+								{
+									set.addLegs(getIntValue(attrs.getNamedItem("id")));
+									break;
+								}
+								case "shield":
+								{
+									set.addShield(getIntValue(attrs.getNamedItem("id")));
+									break;
+								}
+								case "skill":
+								{
+									int skillId = getIntValue(attrs.getNamedItem("id"));
+									int skillLevel = getIntValue(attrs.getNamedItem("level"));
+									set.addSkill(new SkillHolder(skillId, skillLevel));
+									break;
+								}
+								case "shield_skill":
 								{
-									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
-									}
+									int skillId = getIntValue(attrs.getNamedItem("id"));
+									int skillLevel = getIntValue(attrs.getNamedItem("level"));
+									set.addShieldSkill(new SkillHolder(skillId, skillLevel));
+									break;
 								}
-								catch (Exception e)
+								case "enchant6skill":
 								{
-									_log.log(Level.WARNING, "Error while parsing set id: " + d.getAttributes().getNamedItem("id").getNodeValue() + " " + e.getMessage(), e);
+									int skillId = getIntValue(attrs.getNamedItem("id"));
+									int skillLevel = getIntValue(attrs.getNamedItem("level"));
+									set.addEnchant6Skill(new SkillHolder(skillId, skillLevel));
+									break;
+								}
+								case "con":
+								{
+									// TODO: Implement me
+									break;
+								}
+								case "dex":
+								{
+									// TODO: Implement me
+									break;
+								}
+								case "str":
+								{
+									// TODO: Implement me
+									break;
+								}
+								case "men":
+								{
+									// TODO: Implement me
+									break;
+								}
+								case "wit":
+								{
+									// TODO: Implement me
+									break;
+								}
+								case "int":
+								{
+									// TODO: Implement me
+									break;
 								}
 							}
 						}
+						_armorSets.put(set.getChestId(), set);
 					}
 				}
 			}
 		}
 	}
 	
-	private void loadData()
+	private int getIntValue(Node n)
 	{
-		File dir = new File(Config.DATAPACK_ROOT, "data/stats/armorsets");
-		if (dir.isDirectory())
-		{
-			for (File f : dir.listFiles(new XMLFilter()))
-			{
-				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.");
+		return Integer.parseInt(n.getNodeValue());
 	}
 	
 	public boolean setExists(int chestId)
 	{
-		return getSet(chestId) != null;
+		return _armorSets.containsKey(chestId);
 	}
 	
 	public L2ArmorSet getSet(int chestId)
 	{
-		for (L2ArmorSet set : _armorSets)
-		{
-			if (set.containsChest(chestId))
-				return set;
-		}
-		
-		return null;
+		return _armorSets.get(chestId);
 	}
 	
 	@SuppressWarnings("synthetic-access")

+ 40 - 48
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2ArmorSet.java

@@ -14,7 +14,8 @@
  */
 package com.l2jserver.gameserver.model;
 
-import javolution.util.FastList;
+import java.util.ArrayList;
+import java.util.List;
 
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
@@ -26,34 +27,33 @@ import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
  */
 public final class L2ArmorSet
 {
-	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 int _chestId;
+	private final List<Integer> _legs;
+	private final List<Integer> _head;
+	private final List<Integer> _gloves;
+	private final List<Integer> _feet;	
+	private final List<Integer> _shield;
 	
-	private final FastList<SkillHolder> _skills;
-	private final FastList<SkillHolder> _shieldSkills;
-	private final FastList<SkillHolder> _enchant6Skill;
+	private final List<SkillHolder> _skills;
+	private final List<SkillHolder> _shieldSkills;
+	private final List<SkillHolder> _enchant6Skill;
 	
 	public L2ArmorSet()
 	{
-		_chest = new FastList<>();
-		_legs = new FastList<>();
-		_head = new FastList<>();
-		_gloves = new FastList<>();
-		_feet = new FastList<>();
-		_shield = new FastList<>();
+		_legs = new ArrayList<>();
+		_head = new ArrayList<>();
+		_gloves = new ArrayList<>();
+		_feet = new ArrayList<>();
+		_shield = new ArrayList<>();
 		
-		_skills = new FastList<>();
-		_shieldSkills = new FastList<>();
-		_enchant6Skill = new FastList<>();
+		_skills = new ArrayList<>();
+		_shieldSkills = new ArrayList<>();
+		_enchant6Skill = new ArrayList<>();
 	}
 	
 	public void addChest(int id)
 	{
-		_chest.add(id);
+		_chestId = id;
 	}
 	
 	public void addLegs(int id)
@@ -126,53 +126,50 @@ public final class L2ArmorSet
 		if (feetItem != null)
 			feet = feetItem.getItemId();
 		
-		if (!_chest.isEmpty())
-		{
-			for (Integer chest : _chest)
-			{
-				if (containAll(chest, legs, head, gloves, feet))
-					return true;
-			}
-		}
-		return containAll(0, legs, head, gloves, feet);
+		return containAll(_chestId, legs, head, gloves, feet);
 	}
 	
 	public boolean containAll(int chest, int legs, int head, int gloves, int feet)
 	{
-		if (!_chest.isEmpty() && !_chest.contains(Integer.valueOf(chest)))
+		if (_chestId != 0 &&_chestId != chest)
 			return false;
-		if (!_legs.isEmpty() && !_legs.contains(Integer.valueOf(legs)))
+		if (!_legs.isEmpty() && !_legs.contains(legs))
 			return false;
-		if (!_head.isEmpty() && !_head.contains(Integer.valueOf(head)))
+		if (!_head.isEmpty() && !_head.contains(head))
 			return false;
-		if (!_gloves.isEmpty() && !_gloves.contains(Integer.valueOf(gloves)))
+		if (!_gloves.isEmpty() && !_gloves.contains(gloves))
 			return false;
-		if (!_feet.isEmpty() && !_feet.contains(Integer.valueOf(feet)))
+		if (!_feet.isEmpty() && !_feet.contains(feet))
 			return false;
 		
 		return true;
 	}
 	
-	public boolean containItem(int slot, Integer itemId)
+	public boolean containItem(int slot, int itemId)
 	{
 		switch (slot)
 		{
 			case Inventory.PAPERDOLL_CHEST:
-				return _chest.contains(Integer.valueOf(itemId));
+				return _chestId == itemId;
 			case Inventory.PAPERDOLL_LEGS:
-				return _legs.contains(Integer.valueOf(itemId));
+				return _legs.contains(itemId);
 			case Inventory.PAPERDOLL_HEAD:
-				return _head.contains(Integer.valueOf(itemId));
+				return _head.contains(itemId);
 			case Inventory.PAPERDOLL_GLOVES:
-				return _gloves.contains(Integer.valueOf(itemId));
+				return _gloves.contains(itemId);
 			case Inventory.PAPERDOLL_FEET:
-				return _feet.contains(Integer.valueOf(itemId));
+				return _feet.contains(itemId);
 			default:
 				return false;
 		}
 	}
 	
-	public FastList<SkillHolder> getSkills()
+	public int getChestId()
+	{
+		return _chestId;
+	}
+	
+	public List<SkillHolder> getSkills()
 	{
 		return _skills;
 	}
@@ -193,12 +190,12 @@ public final class L2ArmorSet
 		return _shield.contains(Integer.valueOf(shield_id));
 	}
 	
-	public FastList<SkillHolder> getShieldSkillId()
+	public List<SkillHolder> getShieldSkillId()
 	{
 		return _shieldSkills;
 	}
 	
-	public FastList<SkillHolder> getEnchant6skillId()
+	public List<SkillHolder> getEnchant6skillId()
 	{
 		return _enchant6Skill;
 	}
@@ -234,9 +231,4 @@ public final class L2ArmorSet
 		
 		return true;
 	}
-
-	public boolean containsChest(int chestId)
-	{
-		return _chest.contains(Integer.valueOf(chestId));
-	}
 }

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

@@ -466,7 +466,7 @@ public abstract class Inventory extends ItemContainer
 				if (armorSet.containAll(player))
 				{
 					L2Skill itemSkill;
-					final FastList<SkillHolder> skills = armorSet.getSkills();
+					final List<SkillHolder> skills = armorSet.getSkills();
 					
 					if (skills != null)
 					{
@@ -563,9 +563,9 @@ public abstract class Inventory extends ItemContainer
 			
 			boolean remove = false;
 			L2Skill itemSkill;
-			FastList<SkillHolder> skills = null;
-			FastList<SkillHolder> shieldSkill = null; // shield skill
-			FastList<SkillHolder> skillId6 = null; // enchant +6 skill
+			List<SkillHolder> skills = null;
+			List<SkillHolder> shieldSkill = null; // shield skill
+			List<SkillHolder> skillId6 = null; // enchant +6 skill
 			
 			if (slot == PAPERDOLL_CHEST)
 			{

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

@@ -1,91 +0,0 @@
-/*
- * 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);
-}