Browse Source

BETA: Core-part for ​​​​[DP9744].
Reviewed by: Zoey76

Adry_85 12 years ago
parent
commit
9acc283383

+ 2 - 8
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2AttackableAI.java

@@ -1518,14 +1518,8 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			}
 			default:
 			{
-				if (sk.hasEffectType(L2EffectType.CANCEL, L2EffectType.CANCEL_ALL, L2EffectType.NEGATE))
+				if (sk.hasEffectType(L2EffectType.DISPEL))
 				{
-					// decrease cancel probability
-					if (Rnd.get(50) != 0)
-					{
-						return true;
-					}
-					
 					if (sk.getTargetType() == L2TargetType.ONE)
 					{
 						if ((attackTarget.getFirstEffect(L2EffectType.BUFF) != null) && GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
@@ -2072,7 +2066,7 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			return null;
 		}
 		L2Attackable actor = getActiveChar();
-		if (!sk.hasEffectType(L2EffectType.CANCEL, L2EffectType.CANCEL_ALL, L2EffectType.NEGATE))
+		if (!sk.hasEffectType(L2EffectType.DISPEL))
 		{
 			if (!positive)
 			{

+ 2 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2CharacterAI.java

@@ -1303,7 +1303,7 @@ public class L2CharacterAI extends AbstractAI
 					case COREDONE:
 						continue; // won't be considered something for fighting
 					default:
-						if (sk.hasEffectType(L2EffectType.CANCEL, L2EffectType.CANCEL_ALL, L2EffectType.NEGATE))
+						if (sk.hasEffectType(L2EffectType.DISPEL))
 						{
 							cancelSkills.add(sk);
 						}
@@ -1482,7 +1482,7 @@ public class L2CharacterAI extends AbstractAI
 	
 	public boolean canAOE(L2Skill sk)
 	{
-		if (sk.hasEffectType(L2EffectType.CANCEL, L2EffectType.CANCEL_ALL, L2EffectType.NEGATE))
+		if (sk.hasEffectType(L2EffectType.DISPEL))
 		{
 			if ((sk.getTargetType() == L2TargetType.AURA) || (sk.getTargetType() == L2TargetType.BEHIND_AURA) || (sk.getTargetType() == L2TargetType.FRONT_AURA) || (sk.getTargetType() == L2TargetType.AURA_CORPSE_MOB))
 			{

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/templates/L2NpcTemplate.java

@@ -440,7 +440,7 @@ public final class L2NpcTemplate extends L2CharTemplate
 						addRangeSkill(skill);
 						break;
 					case DUMMY:
-						if (skill.hasEffectType(L2EffectType.CANCEL, L2EffectType.CANCEL_ALL, L2EffectType.NEGATE))
+						if (skill.hasEffectType(L2EffectType.DISPEL))
 						{
 							addNegativeSkill(skill);
 							addRangeSkill(skill);

+ 1 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/model/effects/L2EffectType.java

@@ -26,9 +26,6 @@ public enum L2EffectType
 {
 	BLOCK_RESURRECTION,
 	BUFF,
-	CANCEL,
-	CANCEL_ALL,
-	CANCEL_DEBUFF,
 	CHARM_OF_LUCK,
 	CHARMOFCOURAGE,
 	CLAN_GATE,
@@ -41,6 +38,7 @@ public enum L2EffectType
 	DAMAGE_TRANSFER,
 	DEBUFF,
 	DISARM,
+	DISPEL,
 	DMG_OVER_TIME,
 	DMG_OVER_TIME_PERCENT,
 	DEATH_LINK,
@@ -66,7 +64,6 @@ public enum L2EffectType
 	MANAHEAL_BY_LEVEL,
 	MANAHEAL_PERCENT,
 	MUTE,
-	NEGATE,
 	NOBLESSE_BLESSING,
 	NONE,
 	PARALYZE,

+ 0 - 51
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2Skill.java

@@ -21,10 +21,8 @@ package com.l2jserver.gameserver.model.skills;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.EnumMap;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
@@ -133,12 +131,8 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	private final AbnormalType _abnormalType;
 	/** Abnormal time: global effect duration time. */
 	private final int _abnormalTime;
-	/** Abnormal type map for types that this skills might remove. */
-	private final Map<AbnormalType, Byte> _negateAbnormals;
 	/** Abnormal type set for abnormal types that this effect skill blocks. */
 	private final Set<AbnormalType> _blockBuffSlots;
-	/** Maximum amount of effects removed. */
-	private final int _maxNegatedEffects;
 	/** If {@code true} this skill's effect should stay after death. */
 	private final boolean _stayAfterDeath;
 	/** If {@code true} this skill's effect should stay after class-subclass change. */
@@ -294,39 +288,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		
 		_abnormalTime = abnormalTime;
 		_attribute = set.getString("attribute", "");
-		String negateAbnormals = set.getString("negateAbnormals", null);
-		if ((negateAbnormals != null) && !negateAbnormals.isEmpty())
-		{
-			_negateAbnormals = new EnumMap<>(AbnormalType.class);
-			for (String ngtStack : negateAbnormals.split(";"))
-			{
-				String[] ngt = ngtStack.split(",");
-				final AbnormalType type = AbnormalType.getAbnormalType(ngt[0]);
-				if (ngt.length == 1) // Only abnormalType is present, without abnormalLvl
-				{
-					_negateAbnormals.put(type, Byte.MAX_VALUE);
-				}
-				else if (ngt.length == 2) // Both abnormalType and abnormalLvl are present
-				{
-					try
-					{
-						_negateAbnormals.put(type, Byte.parseByte(ngt[1]));
-					}
-					catch (Exception e)
-					{
-						throw new IllegalArgumentException("SkillId: " + _id + " Byte value required, but found: " + ngt[1]);
-					}
-				}
-				else
-				{
-					throw new IllegalArgumentException("SkillId: " + _id + ": Incorrect negate Abnormals for " + ngtStack + ". Lvl: abnormalType1,abnormalLvl1;abnormalType2,abnormalLvl2;abnormalType3,abnormalLvl3... or abnormalType1;abnormalType2;abnormalType3...");
-				}
-			}
-		}
-		else
-		{
-			_negateAbnormals = Collections.<AbnormalType, Byte> emptyMap();
-		}
 		
 		String blockBuffSlots = set.getString("blockBuffSlot", null);
 		if ((blockBuffSlots != null) && !blockBuffSlots.isEmpty())
@@ -342,8 +303,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 			_blockBuffSlots = Collections.<AbnormalType> emptySet();
 		}
 		
-		_maxNegatedEffects = set.getInteger("maxNegated", 0);
-		
 		_stayAfterDeath = set.getBool("stayAfterDeath", false);
 		_stayOnSubclassChange = set.getBool("stayOnSubclassChange", true);
 		
@@ -586,11 +545,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return isPvE ? _pvePower : isPvP ? _pvpPower : _power;
 	}
 	
-	public final Map<AbnormalType, Byte> getNegateAbnormals()
-	{
-		return _negateAbnormals;
-	}
-	
 	public final Set<AbnormalType> getBlockBuffSlots()
 	{
 		return _blockBuffSlots;
@@ -624,11 +578,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return _magicLevel;
 	}
 	
-	public final int getMaxNegatedEffects()
-	{
-		return _maxNegatedEffects;
-	}
-	
 	public final int getLvlBonusRate()
 	{
 		return _lvlBonusRate;

+ 39 - 110
L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/Formulas.java

@@ -20,7 +20,6 @@ package com.l2jserver.gameserver.model.stats;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Map.Entry;
 import java.util.logging.Logger;
 
 import com.l2jserver.Config;
@@ -51,7 +50,6 @@ import com.l2jserver.gameserver.model.items.L2Item;
 import com.l2jserver.gameserver.model.items.L2Weapon;
 import com.l2jserver.gameserver.model.items.type.L2ArmorType;
 import com.l2jserver.gameserver.model.items.type.L2WeaponType;
-import com.l2jserver.gameserver.model.skills.AbnormalType;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.skills.L2SkillType;
 import com.l2jserver.gameserver.model.skills.L2TraitType;
@@ -2149,135 +2147,66 @@ public final class Formulas
 		return Rnd.get(100) < activeChar.calcStat(Stats.BLOW_RATE, blowChance, target, null);
 	}
 	
-	public static List<L2Effect> calcCancelStealEffects(L2Character activeChar, L2Character target, L2Skill skill, double power)
+	public static List<L2Effect> calcCancelStealEffects(L2Character activeChar, L2Character target, L2Skill skill, String slot, int rate, int max)
 	{
-		// Resists.
-		int cancelMagicLvl = skill.getMagicLevel();
-		int count = skill.getMaxNegatedEffects();
-		final double vuln = target.calcStat(Stats.CANCEL_VULN, 0, target, null);
-		final double prof = activeChar.calcStat(Stats.CANCEL_PROF, 0, target, null);
-		double resMod = 1 + (((vuln + prof) * -1) / 100);
-		double rate = power / resMod;
-		
-		if (activeChar.isDebug() || Config.DEVELOPER)
-		{
-			final StringBuilder stat = new StringBuilder(100);
-			StringUtil.append(stat, skill.getName(), " Base Rate:", String.valueOf((int) power), " Magiclvl:", String.valueOf(cancelMagicLvl), " resMod:", String.format("%1.2f", resMod), "(", String.format("%1.2f", prof), "/", String.format("%1.2f", vuln), ") Rate:", String.valueOf(rate));
-			final String result = stat.toString();
-			if (activeChar.isDebug())
-			{
-				activeChar.sendDebugMessage(result);
-			}
-			if (Config.DEVELOPER)
-			{
-				_log.info(result);
-			}
-		}
-		
-		// Cancel for Abnormals.
 		final List<L2Effect> effects = target.getAllEffects();
-		List<L2Effect> canceled = new ArrayList<>(count);
-		if (!skill.getNegateAbnormals().isEmpty())
+		List<L2Effect> canceled = new ArrayList<>(max);
+		if (!effects.isEmpty())
 		{
-			for (L2Effect eff : effects)
+			if (slot.equals("buff"))
 			{
-				if (eff == null)
-				{
-					continue;
-				}
+				int cancelMagicLvl = skill.getMagicLevel();
+				final double vuln = target.calcStat(Stats.CANCEL_VULN, 0, target, null);
+				final double prof = activeChar.calcStat(Stats.CANCEL_PROF, 0, target, null);
+				double resMod = 1 + (((vuln + prof) * -1) / 100);
+				double finalRate = rate / resMod;
 				
-				for (Entry<AbnormalType, Byte> negate : skill.getNegateAbnormals().entrySet())
+				if (activeChar.isDebug() || Config.DEVELOPER)
 				{
-					if ((eff.getSkill().getAbnormalType() == negate.getKey()) && (negate.getValue() >= eff.getSkill().getAbnormalLvl()))
+					final StringBuilder stat = new StringBuilder(100);
+					StringUtil.append(stat, skill.getName(), " Base Rate:", String.valueOf(rate), " Magiclvl:", String.valueOf(cancelMagicLvl), " resMod:", String.format("%1.2f", resMod), "(", String.format("%1.2f", prof), "/", String.format("%1.2f", vuln), ") Rate:", String.valueOf(rate));
+					final String result = stat.toString();
+					if (activeChar.isDebug())
 					{
-						if (calcCancelSuccess(eff, cancelMagicLvl, (int) rate, skill))
-						{
-							eff.exit();
-						}
+						activeChar.sendDebugMessage(result);
+					}
+					if (Config.DEVELOPER)
+					{
+						_log.info(result);
 					}
-				}
-			}
-		}
-		// Common Cancel/Steal.
-		else
-		{
-			// First Pass.
-			int lastCanceledSkillId = 0;
-			L2Effect effect;
-			for (int i = effects.size(); --i >= 0;) // reverse order
-			{
-				effect = effects.get(i);
-				if (effect == null)
-				{
-					continue;
-				}
-				
-				// remove effect if can't be stolen
-				if (!effect.canBeStolen())
-				{
-					effects.remove(i);
-					continue;
-				}
-				
-				// Only Dances/Songs.
-				if (!effect.getSkill().isDance())
-				{
-					continue;
-				}
-				
-				if (!calcCancelSuccess(effect, cancelMagicLvl, (int) rate, skill))
-				{
-					continue;
-				}
-				
-				if (effect.getSkill().getId() != lastCanceledSkillId)
-				{
-					lastCanceledSkillId = effect.getSkill().getId();
-					count--;
 				}
 				
-				canceled.add(effect);
-				if (count == 0)
-				{
-					break;
-				}
-			}
-			// Second Pass.
-			if (count > 0)
-			{
-				lastCanceledSkillId = 0;
-				for (int i = effects.size(); --i >= 0;)
+				L2Effect effect;
+				for (int i = effects.size(); --i >= 0;) // reverse order
 				{
 					effect = effects.get(i);
-					if (effect == null)
-					{
-						continue;
-					}
-					
-					// All Except Dances/Songs.
-					if (effect.getSkill().isDance())
+					if (!effect.canBeStolen() || effect.getSkill().isDance() || (!calcCancelSuccess(effect, cancelMagicLvl, (int) finalRate, skill)))
 					{
 						continue;
 					}
-					
-					if (!calcCancelSuccess(effect, cancelMagicLvl, (int) rate, skill))
-					{
-						continue;
-					}
-					
-					if (effect.getSkill().getId() != lastCanceledSkillId)
-					{
-						lastCanceledSkillId = effect.getSkill().getId();
-						count--;
-					}
-					
 					canceled.add(effect);
-					if (count == 0)
+					if (canceled.size() >= max)
 					{
 						break;
 					}
 				}
 			}
+			else if (slot.equals("debuff"))
+			{
+				L2Effect effect;
+				for (int i = effects.size(); --i >= 0;) // reverse order
+				{
+					effect = effects.get(i);
+					if (effect.getSkill().isDebuff() && effect.getSkill().canBeDispeled() && (Rnd.get(100) <= rate))
+					{
+						canceled.add(effect);
+						if (canceled.size() >= max)
+						{
+							break;
+						}
+					}
+				}
+			}
 		}
 		return canceled;
 	}