From 25acdc57e632007d2d585085553eaa342607a564 Mon Sep 17 00:00:00 2001
From: Adry_85 <Adrya85@hotmail.it>
Date: Mon, 18 Mar 2013 23:57:12 +0000
Subject: [PATCH] BETA: Fixing !CancelDebuff effect.

	Reviewed by: MELERIX, !UnAfraid, Zoey76
---
 .../handlers/effecthandlers/Cancel.java       |  2 +-
 .../handlers/effecthandlers/CancelDebuff.java | 57 ++++++-------------
 .../handlers/skillhandlers/StealBuffs.java    |  2 +-
 .../game/data/stats/skills/00700-00799.xml    |  3 +
 .../game/data/stats/skills/01400-01499.xml    |  3 +
 .../game/data/stats/skills/05500-05599.xml    |  1 +
 .../game/data/stats/skills/07000-07099.xml    |  1 +
 7 files changed, 26 insertions(+), 43 deletions(-)

diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Cancel.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Cancel.java
index cbdd0a8e06..4e8a2cb52a 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Cancel.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Cancel.java
@@ -65,7 +65,7 @@ public class Cancel extends L2Effect
 			return false;
 		}
 		
-		final List<L2Effect> canceled = Formulas.calcCancel(activeChar, target, effect.getSkill(), effect.getEffectPower());
+		final List<L2Effect> canceled = Formulas.calcCancelStealEffects(activeChar, target, effect.getSkill(), effect.getEffectPower());
 		for (L2Effect eff : canceled)
 		{
 			eff.exit();
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CancelDebuff.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CancelDebuff.java
index 3b555c3b55..02b2d97d96 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CancelDebuff.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CancelDebuff.java
@@ -24,7 +24,7 @@ import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.stats.Env;
-import com.l2jserver.util.Rnd;
+import com.l2jserver.gameserver.model.stats.Formulas;
 
 /**
  * @author UnAfraid
@@ -61,65 +61,40 @@ public class CancelDebuff extends L2Effect
 			return false;
 		}
 		
-		final int cancelLvl = skill.getMagicLevel();
-		int count = skill.getMaxNegatedEffects();
-		
-		L2Effect effect;
-		int lastCanceledSkillId = 0;
+		int count = 0;
 		final L2Effect[] effects = target.getAllEffects();
-		for (int i = effects.length; --i >= 0;)
+		
+		if ((effects == null) || (effects.length == 0))
 		{
-			effect = effects[i];
-			if (effect == null)
-			{
-				continue;
-			}
-			
-			if (!effect.getSkill().isDebuff() || !effect.getSkill().canBeDispeled())
+			return false;
+		}
+		
+		for (L2Effect e : effects)
+		{
+			if ((e == null) || !e.getSkill().isDebuff() || !e.getSkill().canBeDispeled())
 			{
-				effects[i] = null;
 				continue;
 			}
 			
-			if (effect.getSkill().getId() == lastCanceledSkillId)
+			// TODO: Unhardcode Poison of Death skill
+			if (e.getSkill().getId() == 4082)
 			{
-				effect.exit(); // this skill already canceled
 				continue;
 			}
 			
-			if (!calcCancelSuccess(effect, cancelLvl, (int) baseRate))
+			if (!Formulas.calcCancelSuccess(e, skill.getMagicLevel(), (int) baseRate, skill))
 			{
 				continue;
 			}
 			
-			lastCanceledSkillId = effect.getSkill().getId();
-			effect.exit();
-			count--;
+			e.exit();
 			
-			if (count == 0)
+			count++;
+			if (count >= skill.getMaxNegatedEffects())
 			{
 				break;
 			}
 		}
-		
 		return true;
 	}
-	
-	private static boolean calcCancelSuccess(L2Effect effect, int cancelLvl, int baseRate)
-	{
-		int rate = 2 * (cancelLvl - effect.getSkill().getMagicLevel());
-		rate += (effect.getAbnormalTime() - effect.getTime()) / 1200;
-		rate += baseRate;
-		
-		if (rate < effect.getSkill().getMinChance())
-		{
-			rate = effect.getSkill().getMinChance();
-		}
-		else if (rate > effect.getSkill().getMaxChance())
-		{
-			rate = effect.getSkill().getMaxChance();
-		}
-		
-		return Rnd.get(100) < rate;
-	}
 }
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/StealBuffs.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/StealBuffs.java
index 9b36704dd3..8c98d6b37f 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/StealBuffs.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/StealBuffs.java
@@ -64,7 +64,7 @@ public class StealBuffs implements ISkillHandler
 			}
 			
 			Env env;
-			final List<L2Effect> toSteal = Formulas.calcCancel(activeChar, target, skill, skill.getPower());
+			final List<L2Effect> toSteal = Formulas.calcCancelStealEffects(activeChar, target, skill, skill.getPower());
 			
 			if (toSteal.size() == 0)
 			{
diff --git a/L2J_DataPack_BETA/dist/game/data/stats/skills/00700-00799.xml b/L2J_DataPack_BETA/dist/game/data/stats/skills/00700-00799.xml
index 70722e35be..6c5b7e67be 100644
--- a/L2J_DataPack_BETA/dist/game/data/stats/skills/00700-00799.xml
+++ b/L2J_DataPack_BETA/dist/game/data/stats/skills/00700-00799.xml
@@ -39,6 +39,7 @@
 		<set name="operateType" val="A1" />
 		<set name="reuseDelay" val="8000" />
 		<set name="target" val="TARGET_ONE" />
+		<set name="maxNegated" val="10" />
 		<for>
 			<effect name="CancelDebuff" noicon="1" val="0" effectPower="100" />
 		</for>
@@ -547,6 +548,7 @@
 		<set name="operateType" val="A1" />
 		<set name="isMagic" val="1" /> <!-- Magic Skill -->
 		<set name="aggroPoints" val="624" />
+		<set name="maxNegated" val="10" />
 		<for>
 			<effect name="CancelDebuff" noicon="1" val="0" effectPower="100" />
 		</for>
@@ -974,6 +976,7 @@
 		<set name="castRange" val="600" />
 		<set name="effectRange" val="1100" />
 		<set name="aggroPoints" val="624" />
+		<set name="maxNegated" val="10" />
 		<for>
 			<effect name="CancelDebuff" noicon="1" val="0" effectPower="100" />
 		</for>
diff --git a/L2J_DataPack_BETA/dist/game/data/stats/skills/01400-01499.xml b/L2J_DataPack_BETA/dist/game/data/stats/skills/01400-01499.xml
index dfc1555e10..fccc61433d 100644
--- a/L2J_DataPack_BETA/dist/game/data/stats/skills/01400-01499.xml
+++ b/L2J_DataPack_BETA/dist/game/data/stats/skills/01400-01499.xml
@@ -282,6 +282,7 @@
 	<skill id="1409" levels="1" name="Cleanse">
 		<set name="itemConsumeId" val="8874" />
 		<set name="itemConsumeCount" val="1" />
+		<set name="magicLvl" val="78" />
 		<set name="mpInitialConsume" val="12" />
 		<set name="mpConsume" val="46" />
 		<set name="target" val="TARGET_ONE" />
@@ -291,6 +292,7 @@
 		<set name="operateType" val="A1" />
 		<set name="castRange" val="600" />
 		<set name="effectRange" val="1100" />
+		<set name="maxNegated" val="10" />
 		<for>
 			<effect name="CancelDebuff" noicon="1" val="0" effectPower="100" />
 		</for>
@@ -780,6 +782,7 @@
 		<set name="itemConsumeCount" val="1" />
 		<set name="mpInitialConsume" val="70" />
 		<set name="mpConsume" val="70" />
+		<set name="maxNegated" val="10" />
 		<cond msgId="1509">
 			<player olympiad="false" />
 		</cond>
diff --git a/L2J_DataPack_BETA/dist/game/data/stats/skills/05500-05599.xml b/L2J_DataPack_BETA/dist/game/data/stats/skills/05500-05599.xml
index a8e7dfae4d..36d3927959 100644
--- a/L2J_DataPack_BETA/dist/game/data/stats/skills/05500-05599.xml
+++ b/L2J_DataPack_BETA/dist/game/data/stats/skills/05500-05599.xml
@@ -1230,6 +1230,7 @@
 		<set name="magicLvl" val="80" />
 		<set name="operateType" val="A1" />
 		<set name="target" val="TARGET_SELF" />
+		<set name="maxNegated" val="10" />
 		<for>
 			<effect name="CancelDebuff" noicon="1" val="0" effectPower="100" />
 		</for>
diff --git a/L2J_DataPack_BETA/dist/game/data/stats/skills/07000-07099.xml b/L2J_DataPack_BETA/dist/game/data/stats/skills/07000-07099.xml
index 608eb65e33..6139aa5bd2 100644
--- a/L2J_DataPack_BETA/dist/game/data/stats/skills/07000-07099.xml
+++ b/L2J_DataPack_BETA/dist/game/data/stats/skills/07000-07099.xml
@@ -25,6 +25,7 @@
 		<set name="castRange" val="400" />
 		<set name="effectRange" val="900" />
 		<set name="aggroPoints" val="100" />
+		<set name="maxNegated" val="20" />
 		<for>
 			<effect name="CancelDebuff" noicon="1" val="0" effectPower="100" />
 		</for>
-- 
GitLab