Pārlūkot izejas kodu

ChanceSkills - Trigger on specific skill cast
Usage: <set name="activationSkills" val="skillId1,skillId2, skillId3..." />

Nik 14 gadi atpakaļ
vecāks
revīzija
606dcd7d39

+ 24 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/ChanceCondition.java

@@ -101,15 +101,17 @@ public final class ChanceCondition
 	private final int _chance;
 	private final int _mindmg;
 	private final byte[] _elements;
+	private final int[] _activationSkills;
 	private final boolean _pvpOnly;
 	
-	private ChanceCondition(TriggerType trigger, int chance, int mindmg, byte[] elements, boolean pvpOnly)
+	private ChanceCondition(TriggerType trigger, int chance, int mindmg, byte[] elements, int[] activationSkills, boolean pvpOnly)
 	{
 		_triggerType = trigger;
 		_chance = chance;
 		_mindmg = mindmg;
 		_elements = elements;
 		_pvpOnly = pvpOnly;
+		_activationSkills = activationSkills;
 	}
 	
 	public static ChanceCondition parse(StatsSet set)
@@ -120,10 +122,11 @@ public final class ChanceCondition
 			int chance = set.getInteger("activationChance", -1);
 			int mindmg = set.getInteger("activationMinDamage", -1);
 			String elements = set.getString("activationElements", null);
+			String activationSkills = set.getString("activationSkills", null);
 			boolean pvpOnly = set.getBool("pvpChanceOnly", false);
 			
 			if (trigger != null)
-				return new ChanceCondition(trigger, chance, mindmg, parseElements(elements), pvpOnly);
+				return new ChanceCondition(trigger, chance, mindmg, parseElements(elements), parseActivationSkills(activationSkills), pvpOnly);
 		}
 		catch (Exception e)
 		{
@@ -132,7 +135,7 @@ public final class ChanceCondition
 		return null;
 	}
 	
-	public static ChanceCondition parse(String chanceType, int chance, int mindmg, String elements, boolean pvpOnly)
+	public static ChanceCondition parse(String chanceType, int chance, int mindmg, String elements, String activationSkills, boolean pvpOnly)
 	{
 		try
 		{
@@ -142,7 +145,7 @@ public final class ChanceCondition
 			TriggerType trigger = Enum.valueOf(TriggerType.class, chanceType);
 			
 			if (trigger != null)
-				return new ChanceCondition(trigger, chance, mindmg, parseElements(elements), pvpOnly);
+				return new ChanceCondition(trigger, chance, mindmg, parseElements(elements), parseActivationSkills(activationSkills), pvpOnly);
 		}
 		catch (Exception e)
 		{
@@ -166,7 +169,20 @@ public final class ChanceCondition
 		return elements;
 	}
 	
-	public boolean trigger(int event, int damage, byte element, boolean playable)
+	public static final int[] parseActivationSkills(String list)
+	{
+		if (list == null)
+			return null;
+		
+		String[] valuesSplit = list.split(",");
+		int[] skillIds = new int[valuesSplit.length];
+		for (int i = 0; i < valuesSplit.length; i++)
+			skillIds[i] = Integer.parseInt(valuesSplit[i]);
+		
+		return skillIds;
+	}
+	
+	public boolean trigger(int event, int damage, byte element, boolean playable, L2Skill skill)
 	{
 		if (_pvpOnly && !playable)
 			return false;
@@ -174,6 +190,9 @@ public final class ChanceCondition
 		if (_elements != null && Arrays.binarySearch(_elements, element) < 0)
 			return false;
 		
+		if (_activationSkills != null && skill != null && Arrays.binarySearch(_activationSkills, skill.getId()) < 0)
+			return false;
+		
 		// if the skill has "activationMinDamage" setted to higher than -1(default)
 		// and if "activationMinDamage" is still higher than the recieved damage, the skill wont trigger
 		if (_mindmg > -1 && _mindmg > damage)

+ 12 - 12
L2J_Server_BETA/java/com/l2jserver/gameserver/model/ChanceSkillList.java

@@ -69,21 +69,21 @@ public class ChanceSkillList extends FastMap<IChanceSkillTrigger, ChanceConditio
 				event |= ChanceCondition.EVT_CRIT;
 		}
 		
-		onEvent(event, damage, target, Elementals.NONE);
+		onEvent(event, damage, target, null, Elementals.NONE);
 	}
 	
 	public void onEvadedHit(L2Character attacker)
 	{
-		onEvent(ChanceCondition.EVT_EVADED_HIT, 0, attacker, Elementals.NONE);
+		onEvent(ChanceCondition.EVT_EVADED_HIT, 0, attacker, null, Elementals.NONE);
 	}
 	
-	public void onSkillHit(L2Character target, boolean ownerWasHit, boolean wasMagic, boolean wasOffensive, byte element)
+	public void onSkillHit(L2Character target, L2Skill skill, boolean ownerWasHit)
 	{
 		int event;
 		if (ownerWasHit)
 		{
 			event = ChanceCondition.EVT_HIT_BY_SKILL;
-			if (wasOffensive)
+			if (skill.isOffensive())
 			{
 				event |= ChanceCondition.EVT_HIT_BY_OFFENSIVE_SKILL;
 				event |= ChanceCondition.EVT_ATTACKED;
@@ -96,29 +96,29 @@ public class ChanceSkillList extends FastMap<IChanceSkillTrigger, ChanceConditio
 		else
 		{
 			event = ChanceCondition.EVT_CAST;
-			event |= wasMagic ? ChanceCondition.EVT_MAGIC : ChanceCondition.EVT_PHYSICAL;
-			event |= wasOffensive ? ChanceCondition.EVT_MAGIC_OFFENSIVE : ChanceCondition.EVT_MAGIC_GOOD;
+			event |= skill.isMagic() ? ChanceCondition.EVT_MAGIC : ChanceCondition.EVT_PHYSICAL;
+			event |= skill.isOffensive() ? ChanceCondition.EVT_MAGIC_OFFENSIVE : ChanceCondition.EVT_MAGIC_GOOD;
 		}
 		
-		onEvent(event, 0, target, element);
+		onEvent(event, 0, target, skill, skill.getElement());
 	}
 	
 	public void onStart(byte element)
 	{
-		onEvent(ChanceCondition.EVT_ON_START, 0, _owner, element);
+		onEvent(ChanceCondition.EVT_ON_START, 0, _owner, null, element);
 	}
 	
 	public void onActionTime(byte element)
 	{
-		onEvent(ChanceCondition.EVT_ON_ACTION_TIME, 0, _owner, element);
+		onEvent(ChanceCondition.EVT_ON_ACTION_TIME, 0, _owner, null, element);
 	}
 	
 	public void onExit(byte element)
 	{
-		onEvent(ChanceCondition.EVT_ON_EXIT, 0, _owner, element);
+		onEvent(ChanceCondition.EVT_ON_EXIT, 0, _owner, null, element);
 	}
 	
-	public void onEvent(int event, int damage, L2Character target, byte element)
+	public void onEvent(int event, int damage, L2Character target, L2Skill skill, byte element)
 	{
 		if (_owner.isDead())
 			return;
@@ -126,7 +126,7 @@ public class ChanceSkillList extends FastMap<IChanceSkillTrigger, ChanceConditio
 		final boolean playable = target instanceof L2Playable;
 		for (FastMap.Entry<IChanceSkillTrigger, ChanceCondition> e = head(), end = tail(); (e = e.getNext()) != end;)
 		{
-			if (e.getValue() != null && e.getValue().trigger(event, damage, element, playable))
+			if (e.getValue() != null && e.getValue().trigger(event, damage, element, playable, skill))
 			{
 				if (e.getKey() instanceof L2Skill)
 					makeCast((L2Skill)e.getKey(), target);

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Character.java

@@ -6499,10 +6499,10 @@ public abstract class L2Character extends L2Object
 							
 							// Maybe launch chance skills on us
 							if (_chanceSkills != null)
-								_chanceSkills.onSkillHit(target, false, skill.isMagic(), skill.isOffensive(), skill.getElement());
+								_chanceSkills.onSkillHit(target, skill, false);
 							// Maybe launch chance skills on target
 							if (target.getChanceSkills() != null)
-								target.getChanceSkills().onSkillHit(this, true, skill.isMagic(), skill.isOffensive(), skill.getElement());
+								target.getChanceSkills().onSkillHit(this, skill, true);
 					}
 				}
 			}

+ 4 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/skills/DocumentBase.java

@@ -363,11 +363,14 @@ abstract class DocumentBase
 		String activationElements = null;
 		if (attrs.getNamedItem("activationElements") != null)
 			activationElements = getValue(attrs.getNamedItem("activationElements").getNodeValue(), template);
+		String activationSkills = null;
+		if (attrs.getNamedItem("activationSkills") != null)
+			activationSkills = getValue(attrs.getNamedItem("activationSkills").getNodeValue(), template);
 		boolean pvpOnly = false;
 		if (attrs.getNamedItem("pvpChanceOnly") != null)
 			pvpOnly = Boolean.parseBoolean(getValue(attrs.getNamedItem("pvpChanceOnly").getNodeValue(), template));
 		
-		ChanceCondition chance = ChanceCondition.parse(chanceCond, activationChance, activationMinDamage, activationElements, pvpOnly);
+		ChanceCondition chance = ChanceCondition.parse(chanceCond, activationChance, activationMinDamage, activationElements, activationSkills, pvpOnly);
 		
 		if (chance == null && isChanceSkillTrigger)
 			throw new NoSuchElementException("Invalid chance condition: " + chanceCond + " "