Просмотр исходного кода

BETA: Fixing problems with Traps not using proper skills.
* Implementing support for getting / setting objects within StatsSet.
* Implementing support for reading ai_skill, ai_item parameters from data/stats/npcs/ xmls.
* Reported by: lion

Rumen Nikiforov 11 лет назад
Родитель
Сommit
4cb8c8134d

+ 24 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/datatables/NpcTable.java

@@ -44,6 +44,8 @@ import com.l2jserver.gameserver.model.L2NpcAIData;
 import com.l2jserver.gameserver.model.StatsSet;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.base.ClassId;
+import com.l2jserver.gameserver.model.holders.ItemHolder;
+import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.items.type.L2WeaponType;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.stats.BaseStats;
@@ -110,7 +112,6 @@ public class NpcTable extends DocumentParser
 	protected void parseDocument()
 	{
 		NamedNodeMap attrs;
-		StatsSet set;
 		for (Node n = getCurrentDocument().getFirstChild(); n != null; n = n.getNextSibling())
 		{
 			if ("list".equals(n.getNodeName()))
@@ -124,7 +125,6 @@ public class NpcTable extends DocumentParser
 						if (_npcs.containsKey(id))
 						{
 							L2NpcTemplate template = _npcs.get(id);
-							set = new StatsSet();
 							for (Node c = d.getFirstChild(); c != null; c = c.getNextSibling())
 							{
 								if ((c.getNodeName() == null) || c.getNodeName().startsWith("#"))
@@ -172,12 +172,32 @@ public class NpcTable extends DocumentParser
 									}
 									case "npc_ai":
 									{
+										StatsSet set = new StatsSet();
 										for (Node b = c.getFirstChild(); b != null; b = b.getNextSibling())
 										{
 											attrs = b.getAttributes();
-											if ("ai_param".equals(b.getNodeName()))
+											switch (b.getNodeName())
 											{
-												set.set(parseString(attrs, "name"), parseString(attrs, "val"));
+												case "ai_param":
+												{
+													set.set(parseString(attrs, "name"), parseString(attrs, "val"));
+													break;
+												}
+												case "ai_skill":
+												{
+													set.set(parseString(attrs, "name"), new SkillHolder(parseInt(attrs, "id"), parseInt(attrs, "level")));
+													break;
+												}
+												case "ai_item":
+												{
+													set.set(parseString(attrs, "name"), new ItemHolder(parseInt(attrs, "id"), 1));
+													break;
+												}
+												case "ai":
+												{
+													set.set(b.getNodeName(), b.getTextContent());
+													break;
+												}
 											}
 										}
 										template.setParameters(set);

+ 17 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/StatsSet.java

@@ -545,6 +545,11 @@ public class StatsSet implements IParserAdvUtils
 		}
 	}
 	
+	public void set(String name, Object value)
+	{
+		_set.put(name, value);
+	}
+	
 	public void set(String key, boolean value)
 	{
 		_set.put(key, value);
@@ -600,4 +605,16 @@ public class StatsSet implements IParserAdvUtils
 		
 		set(key, value);
 	}
+	
+	@SuppressWarnings("unchecked")
+	public final <A> A getObject(String name, Class<A> type)
+	{
+		Object obj = _set.get(name);
+		if ((obj == null) || !type.isAssignableFrom(obj.getClass()))
+		{
+			return null;
+		}
+		
+		return (A) obj;
+	}
 }

+ 6 - 18
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2TrapInstance.java

@@ -32,6 +32,7 @@ import com.l2jserver.gameserver.model.actor.knownlist.TrapKnownList;
 import com.l2jserver.gameserver.model.actor.tasks.npc.trap.TrapTask;
 import com.l2jserver.gameserver.model.actor.tasks.npc.trap.TrapTriggerTask;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
+import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.items.L2Weapon;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.model.olympiad.OlympiadGameManager;
@@ -57,7 +58,7 @@ public final class L2TrapInstance extends L2Npc
 	private final int _lifeTime;
 	private L2PcInstance _owner;
 	private final List<Integer> _playersWhoDetectedMe = new ArrayList<>();
-	private L2Skill _skill;
+	private final SkillHolder _skill;
 	private int _remainingTime;
 	
 	public L2TrapInstance(int objectId, L2NpcTemplate template, int instanceId, int lifeTime)
@@ -70,11 +71,7 @@ public final class L2TrapInstance extends L2Npc
 		
 		_owner = null;
 		_isTriggered = false;
-		// TODO: Manage this properly when NPC templates are complete and in XML.
-		for (L2Skill skill : template.getSkills().values())
-		{
-			_skill = skill; // Last skill
-		}
+		_skill = getTemplate().getParameters().getObject("trap_skill", SkillHolder.class);
 		_hasLifeTime = lifeTime >= 0;
 		_lifeTime = lifeTime != 0 ? lifeTime : 30000;
 		_remainingTime = _lifeTime;
@@ -94,11 +91,7 @@ public final class L2TrapInstance extends L2Npc
 		
 		_owner = owner;
 		_isTriggered = false;
-		// TODO: Manage this properly when NPC templates are complete and in XML.
-		for (L2Skill skill : template.getSkills().values())
-		{
-			_skill = skill; // Last skill
-		}
+		_skill = getTemplate().getParameters().getObject("trap_skill", SkillHolder.class);
 		_hasLifeTime = lifeTime >= 0;
 		_lifeTime = lifeTime != 0 ? lifeTime : 30000;
 		_remainingTime = getLifeTime();
@@ -182,7 +175,7 @@ public final class L2TrapInstance extends L2Npc
 	
 	public boolean checkTarget(L2Character target)
 	{
-		if (!L2Skill.checkForAreaOffensiveSkills(this, target, _skill, _isInArena))
+		if (!L2Skill.checkForAreaOffensiveSkills(this, target, _skill.getSkill(), _isInArena))
 		{
 			return false;
 		}
@@ -287,7 +280,7 @@ public final class L2TrapInstance extends L2Npc
 	
 	public L2Skill getSkill()
 	{
-		return _skill;
+		return _skill.getSkill();
 	}
 	
 	@Override
@@ -457,11 +450,6 @@ public final class L2TrapInstance extends L2Npc
 		_remainingTime = time;
 	}
 	
-	public void setSkill(L2Skill _skill)
-	{
-		this._skill = _skill;
-	}
-	
 	public int getLifeTime()
 	{
 		return _lifeTime;