/*
* 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 .
*/
/**
* @author Forsaiken
*/
package net.sf.l2j.gameserver.handler;
import java.io.File;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilderFactory;
import net.sf.l2j.Config;
import net.sf.l2j.gameserver.model.L2Skill;
import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
import net.sf.l2j.util.L2FastList;
import net.sf.l2j.util.L2FastMap;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
public final class SkillLearnModTable
{
private static final Logger _log = Logger.getLogger(SkillLearnModTable.class.getName());
private static SkillLearnModTable _instance;
public static SkillLearnModTable getInstance()
{
if (_instance == null)
_instance = new SkillLearnModTable();
return _instance;
}
private SkillLearnModTable()
{
load();
}
private L2FastMap> _stackingSkills;
public void load()
{
_stackingSkills = new L2FastMap>();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setIgnoringComments(true);
File file = new File(Config.DATAPACK_ROOT + "/data/mods/skillstacking.xml");
if (!file.exists())
{
_log.info("The skillstacking.xml file is missing.");
return;
}
try
{
Document doc = factory.newDocumentBuilder().parse(file);
for (Node n = doc.getFirstChild(); n != null; n = n.getNextSibling())
{
if ("list".equalsIgnoreCase(n.getNodeName()))
{
for (Node na = n.getFirstChild(); na != null; na = na.getNextSibling())
{
if ("skillgroup".equalsIgnoreCase(na.getNodeName()))
{
L2FastList stackingSkills = new L2FastList();
for (Node nb = na.getFirstChild(); nb != null; nb = nb.getNextSibling())
{
if ("skill".equalsIgnoreCase(nb.getNodeName()))
{
NamedNodeMap attrs = nb.getAttributes();
final int skill_id = Integer.parseInt(attrs.getNamedItem("id").getNodeValue());
stackingSkills.add(skill_id);
}
}
_log.info("SKILL MOD LEARN: NEW SKILL STACK GROUP");
for (final int skill_id : stackingSkills)
{
_log.info("ID "+skill_id);
_stackingSkills.put(skill_id, stackingSkills);
}
}
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* Check if the skill_id stack with the players current skills.
* @param player who wants to learn the skill
* @param skill_id of the skill the player wants to learn
* @return true if stacking
*/
public final boolean isStacking(L2PcInstance player, final int skill_id)
{
if (_stackingSkills.containsKey(skill_id))
{
System.out.println("Player want to learn a skill wich is marked to be stackable" + skill_id);
L2FastList tempList = _stackingSkills.get(skill_id);
L2Skill[] skills = player.getAllSkills();
System.out.println("1");
if (skills != null && tempList != null)
{
System.out.println("2");
for (L2Skill skill : skills)
{
if (skill != null)
{
System.out.println("3");
final int temp = skill.getId();
if (temp == skill_id)
{
System.out.println("Loop over skill wich player allready have...continue" + skill_id);
continue;
}
if (tempList.contains(temp))
{
System.out.println("player have allready: "+temp+" and is not allowed to learn "+skill_id);
return true;
}
}
}
}
}
return false;
}
}