Browse Source

BETA: Reworking skills (cleanup):
* No more...
* "neutral" skills, all skills are "neutral" by default.
* dynamic skill/effect type dependent "offensive" checks.
* dynamic skill/effect type dependent "pvp" checks.
* null names, default is empty string.
* dynamic seven sings skill checks, is cached in boolean until is finally unhardcoded.
* CPDAM skill type, not used anywhere.
* skills "pvp" and "offensive" at the same time.
* Spoil skill handler!
* !CpDam skill handler!
* _effectSkillType in L2Effect.
* effectType in !EffectTemplate.
* effectType in skill XMLs.
* effectPower=-1 lands always!
* Fixing Sweeper effect typos!
* Reported by: Decad, Torvitas

Reviewed by: Adry_85, MELERIX, UnAfriad

Zoey76 12 years ago
parent
commit
e9fbc25e6a

+ 0 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2AttackableAI.java

@@ -1741,7 +1741,6 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			case CHARGEDAM:
 			case CHARGEDAM:
 			case FATAL:
 			case FATAL:
 			case DEATHLINK:
 			case DEATHLINK:
-			case CPDAM:
 			case MANADAM:
 			case MANADAM:
 			case CPDAMPERCENT:
 			case CPDAMPERCENT:
 			{
 			{

+ 1 - 17
L2J_Server_BETA/java/com/l2jserver/gameserver/engines/DocumentBase.java

@@ -117,7 +117,6 @@ import com.l2jserver.gameserver.model.items.L2Item;
 import com.l2jserver.gameserver.model.items.type.L2ArmorType;
 import com.l2jserver.gameserver.model.items.type.L2ArmorType;
 import com.l2jserver.gameserver.model.items.type.L2WeaponType;
 import com.l2jserver.gameserver.model.items.type.L2WeaponType;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.skills.L2Skill;
-import com.l2jserver.gameserver.model.skills.L2SkillType;
 import com.l2jserver.gameserver.model.skills.funcs.FuncTemplate;
 import com.l2jserver.gameserver.model.skills.funcs.FuncTemplate;
 import com.l2jserver.gameserver.model.skills.funcs.Lambda;
 import com.l2jserver.gameserver.model.skills.funcs.Lambda;
 import com.l2jserver.gameserver.model.skills.funcs.LambdaCalc;
 import com.l2jserver.gameserver.model.skills.funcs.LambdaCalc;
@@ -397,21 +396,6 @@ public abstract class DocumentBase
 			effectPower = Double.parseDouble(getValue(attrs.getNamedItem("effectPower").getNodeValue(), template));
 			effectPower = Double.parseDouble(getValue(attrs.getNamedItem("effectPower").getNodeValue(), template));
 		}
 		}
 		
 		
-		L2SkillType type = null;
-		if (attrs.getNamedItem("effectType") != null)
-		{
-			String typeName = getValue(attrs.getNamedItem("effectType").getNodeValue(), template);
-			
-			try
-			{
-				type = Enum.valueOf(L2SkillType.class, typeName);
-			}
-			catch (Exception e)
-			{
-				throw new IllegalArgumentException("Not skilltype found for: " + typeName);
-			}
-		}
-		
 		final boolean isChanceSkillTrigger = name.equals("ChanceSkillTrigger");
 		final boolean isChanceSkillTrigger = name.equals("ChanceSkillTrigger");
 		int trigId = 0;
 		int trigId = 0;
 		if (attrs.getNamedItem("triggeredId") != null)
 		if (attrs.getNamedItem("triggeredId") != null)
@@ -472,7 +456,7 @@ public abstract class DocumentBase
 			throw new NoSuchElementException("Invalid chance condition: " + chanceCond + " " + activationChance);
 			throw new NoSuchElementException("Invalid chance condition: " + chanceCond + " " + activationChance);
 		}
 		}
 		
 		
-		final EffectTemplate lt = new EffectTemplate(attachCond, applayCond, name, lambda, count, abnormalTime, abnormalVisualEffect, special, event, abnormalType, abnormalLvl, icon, effectPower, type, trigId, trigLvl, chance);
+		final EffectTemplate lt = new EffectTemplate(attachCond, applayCond, name, lambda, count, abnormalTime, abnormalVisualEffect, special, event, abnormalType, abnormalLvl, icon, effectPower, trigId, trigLvl, chance);
 		parseTemplate(n, lt);
 		parseTemplate(n, lt);
 		if (template instanceof L2Item)
 		if (template instanceof L2Item)
 		{
 		{

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

@@ -6392,7 +6392,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 						_skipgeo++;
 						_skipgeo++;
 						continue;
 						continue;
 					}
 					}
-					if (skill.isOffensive() && !skill.isNeutral())
+					if (skill.isOffensive())
 					{
 					{
 						if (isPlayer())
 						if (isPlayer())
 						{
 						{
@@ -6708,7 +6708,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 				getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target);
 				getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, target);
 			}
 			}
 		}
 		}
-		if (skill.isOffensive() && !skill.isNeutral() && !(skill.getSkillType() == L2SkillType.UNLOCK) && !(skill.getSkillType() == L2SkillType.DELUXE_KEY_UNLOCK))
+		if (skill.isOffensive() && !(skill.getSkillType() == L2SkillType.UNLOCK) && !(skill.getSkillType() == L2SkillType.DELUXE_KEY_UNLOCK))
 		{
 		{
 			getAI().clientStartAutoAttack();
 			getAI().clientStartAutoAttack();
 		}
 		}
@@ -6985,11 +6985,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 					// EVT_ATTACKED and PvPStatus
 					// EVT_ATTACKED and PvPStatus
 					if (target instanceof L2Character)
 					if (target instanceof L2Character)
 					{
 					{
-						if (skill.isNeutral())
-						{
-							// no flags
-						}
-						else if (skill.isOffensive())
+						if (skill.isOffensive())
 						{
 						{
 							if (target.isPlayer() || target.isSummon() || target.isTrap())
 							if (target.isPlayer() || target.isSummon() || target.isTrap())
 							{
 							{
@@ -7042,7 +7038,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 								}
 								}
 							}
 							}
 						}
 						}
-						else
+						else if (skill.isPVP())
 						{
 						{
 							if (target.isPlayer())
 							if (target.isPlayer())
 							{
 							{

+ 9 - 23
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -3868,7 +3868,7 @@ public final class L2PcInstance extends L2Playable
 			{
 			{
 				if (count > 1)
 				if (count > 1)
 				{
 				{
-					if (process.equalsIgnoreCase("sweep") || process.equalsIgnoreCase("Quest"))
+					if (process.equalsIgnoreCase("Sweeper") || process.equalsIgnoreCase("Quest"))
 					{
 					{
 						SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S);
 						SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S);
 						sm.addItemName(itemId);
 						sm.addItemName(itemId);
@@ -9143,25 +9143,25 @@ public final class L2PcInstance extends L2Playable
 		}
 		}
 		
 		
 		// Check if the attacker is a L2MonsterInstance
 		// Check if the attacker is a L2MonsterInstance
-		if (attacker instanceof L2MonsterInstance)
+		if (attacker.isMonster())
 		{
 		{
 			return true;
 			return true;
 		}
 		}
 		
 		
 		// is AutoAttackable if both players are in the same duel and the duel is still going on
 		// is AutoAttackable if both players are in the same duel and the duel is still going on
-		if ((attacker instanceof L2PcInstance) && (getDuelState() == Duel.DUELSTATE_DUELLING) && (getDuelId() == ((L2PcInstance) attacker).getDuelId()))
+		if (attacker.isPlayer() && (getDuelState() == Duel.DUELSTATE_DUELLING) && (getDuelId() == ((L2PcInstance) attacker).getDuelId()))
 		{
 		{
 			return true;
 			return true;
 		}
 		}
 		
 		
 		// Check if the attacker is not in the same party. NOTE: Party checks goes before oly checks in order to prevent patry member autoattack at oly.
 		// Check if the attacker is not in the same party. NOTE: Party checks goes before oly checks in order to prevent patry member autoattack at oly.
-		if ((getParty() != null) && getParty().getMembers().contains(attacker))
+		if (isInParty() && getParty().getMembers().contains(attacker))
 		{
 		{
 			return false;
 			return false;
 		}
 		}
 		
 		
 		// Check if the attacker is in olympia and olympia start
 		// Check if the attacker is in olympia and olympia start
-		if ((attacker instanceof L2PcInstance) && ((L2PcInstance) attacker).isInOlympiadMode())
+		if (attacker.isPlayer() && attacker.getActingPlayer().isInOlympiadMode())
 		{
 		{
 			if (isInOlympiadMode() && isOlympiadStart() && (((L2PcInstance) attacker).getOlympiadGameId() == getOlympiadGameId()))
 			if (isInOlympiadMode() && isOlympiadStart() && (((L2PcInstance) attacker).getOlympiadGameId() == getOlympiadGameId()))
 			{
 			{
@@ -9177,7 +9177,7 @@ public final class L2PcInstance extends L2Playable
 		}
 		}
 		
 		
 		// Check if the attacker is a L2Playable
 		// Check if the attacker is a L2Playable
-		if (attacker instanceof L2Playable)
+		if (attacker.isPlayable())
 		{
 		{
 			if (isInsideZone(ZoneId.PEACE))
 			if (isInsideZone(ZoneId.PEACE))
 			{
 			{
@@ -9226,7 +9226,7 @@ public final class L2PcInstance extends L2Playable
 			}
 			}
 			
 			
 			// Check if the attacker is not in the same ally
 			// Check if the attacker is not in the same ally
-			if ((attacker instanceof L2PcInstance) && (getAllyId() != 0) && (getAllyId() == attackerPlayer.getAllyId()))
+			if (attacker.isPlayer() && (getAllyId() != 0) && (getAllyId() == attackerPlayer.getAllyId()))
 			{
 			{
 				return false;
 				return false;
 			}
 			}
@@ -9687,7 +9687,7 @@ public final class L2PcInstance extends L2Playable
 			
 			
 		}
 		}
 		// Check if the skill is defensive
 		// Check if the skill is defensive
-		if (!skill.isOffensive() && (target instanceof L2MonsterInstance) && !forceUse && !skill.isNeutral())
+		if (!skill.isOffensive() && target.isMonster() && !forceUse)
 		{
 		{
 			// check if the target is a monster and if force attack is set.. if not then we don't want to cast.
 			// check if the target is a monster and if force attack is set.. if not then we don't want to cast.
 			switch (sklTargetType)
 			switch (sklTargetType)
@@ -9724,20 +9724,6 @@ public final class L2PcInstance extends L2Playable
 			}
 			}
 		}
 		}
 		
 		
-		// Check if the skill is Spoil type and if the target isn't already spoiled
-		if (sklType == L2SkillType.SPOIL)
-		{
-			if (!(target instanceof L2MonsterInstance))
-			{
-				// Send a System Message to the L2PcInstance
-				sendPacket(SystemMessageId.INCORRECT_TARGET);
-				
-				// Send a Server->Client packet ActionFailed to the L2PcInstance
-				sendPacket(ActionFailed.STATIC_PACKET);
-				return false;
-			}
-		}
-		
 		// Check if this is a Pvp skill and target isn't a non-flagged/non-karma player
 		// Check if this is a Pvp skill and target isn't a non-flagged/non-karma player
 		switch (sklTargetType)
 		switch (sklTargetType)
 		{
 		{
@@ -10004,7 +9990,7 @@ public final class L2PcInstance extends L2Playable
 		{
 		{
 			SkillDat skilldat = getCurrentSkill();
 			SkillDat skilldat = getCurrentSkill();
 			SkillDat skilldatpet = getCurrentPetSkill();
 			SkillDat skilldatpet = getCurrentPetSkill();
-			if (skill.isPvpSkill()) // pvp skill
+			if (skill.isPVP())
 			{
 			{
 				if ((getClan() != null) && (((L2PcInstance) target).getClan() != null))
 				if ((getClan() != null) && (((L2PcInstance) target).getClan() != null))
 				{
 				{

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

@@ -469,7 +469,6 @@ public final class L2NpcTemplate extends L2CharTemplate
 					case CHARGEDAM:
 					case CHARGEDAM:
 					case FATAL:
 					case FATAL:
 					case DEATHLINK:
 					case DEATHLINK:
-					case CPDAM:
 					case MANADAM:
 					case MANADAM:
 					case CPDAMPERCENT:
 					case CPDAMPERCENT:
 						addAtkSkill(skill);
 						addAtkSkill(skill);

+ 2 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/model/effects/EffectTemplate.java

@@ -26,7 +26,6 @@ import java.util.logging.Logger;
 import com.l2jserver.gameserver.handler.EffectHandler;
 import com.l2jserver.gameserver.handler.EffectHandler;
 import com.l2jserver.gameserver.model.ChanceCondition;
 import com.l2jserver.gameserver.model.ChanceCondition;
 import com.l2jserver.gameserver.model.conditions.Condition;
 import com.l2jserver.gameserver.model.conditions.Condition;
-import com.l2jserver.gameserver.model.skills.L2SkillType;
 import com.l2jserver.gameserver.model.skills.funcs.FuncTemplate;
 import com.l2jserver.gameserver.model.skills.funcs.FuncTemplate;
 import com.l2jserver.gameserver.model.skills.funcs.Lambda;
 import com.l2jserver.gameserver.model.skills.funcs.Lambda;
 import com.l2jserver.gameserver.model.stats.Env;
 import com.l2jserver.gameserver.model.stats.Env;
@@ -54,14 +53,13 @@ public class EffectTemplate
 	public final byte abnormalLvl;
 	public final byte abnormalLvl;
 	public final boolean icon;
 	public final boolean icon;
 	public final String funcName;
 	public final String funcName;
-	public final double effectPower; // to thandle chance
-	public final L2SkillType effectType; // to handle resistences etc...
+	public final double effectPower; // to handle chance
 	
 	
 	public final int triggeredId;
 	public final int triggeredId;
 	public final int triggeredLevel;
 	public final int triggeredLevel;
 	public final ChanceCondition chanceCondition;
 	public final ChanceCondition chanceCondition;
 	
 	
-	public EffectTemplate(Condition pAttachCond, Condition pApplayCond, String func, Lambda pLambda, int pCounter, int pAbnormalTime, AbnormalEffect pAbnormalEffect, AbnormalEffect[] pSpecialEffect, AbnormalEffect pEventEffect, String pAbnormalType, byte pAbnormalLvl, boolean showicon, double ePower, L2SkillType eType, int trigId, int trigLvl, ChanceCondition chanceCond)
+	public EffectTemplate(Condition pAttachCond, Condition pApplayCond, String func, Lambda pLambda, int pCounter, int pAbnormalTime, AbnormalEffect pAbnormalEffect, AbnormalEffect[] pSpecialEffect, AbnormalEffect pEventEffect, String pAbnormalType, byte pAbnormalLvl, boolean showicon, double ePower, int trigId, int trigLvl, ChanceCondition chanceCond)
 	{
 	{
 		attachCond = pAttachCond;
 		attachCond = pAttachCond;
 		applayCond = pApplayCond;
 		applayCond = pApplayCond;
@@ -76,7 +74,6 @@ public class EffectTemplate
 		icon = showicon;
 		icon = showicon;
 		funcName = func;
 		funcName = func;
 		effectPower = ePower;
 		effectPower = ePower;
-		effectType = eType;
 		
 		
 		triggeredId = trigId;
 		triggeredId = trigId;
 		triggeredLevel = trigLvl;
 		triggeredLevel = trigLvl;

+ 1 - 13
L2J_Server_BETA/java/com/l2jserver/gameserver/model/effects/L2Effect.java

@@ -32,7 +32,6 @@ import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.interfaces.IChanceSkillTrigger;
 import com.l2jserver.gameserver.model.interfaces.IChanceSkillTrigger;
 import com.l2jserver.gameserver.model.skills.L2Skill;
 import com.l2jserver.gameserver.model.skills.L2Skill;
-import com.l2jserver.gameserver.model.skills.L2SkillType;
 import com.l2jserver.gameserver.model.skills.funcs.Func;
 import com.l2jserver.gameserver.model.skills.funcs.Func;
 import com.l2jserver.gameserver.model.skills.funcs.FuncTemplate;
 import com.l2jserver.gameserver.model.skills.funcs.FuncTemplate;
 import com.l2jserver.gameserver.model.skills.funcs.Lambda;
 import com.l2jserver.gameserver.model.skills.funcs.Lambda;
@@ -133,7 +132,6 @@ public abstract class L2Effect implements IChanceSkillTrigger
 	 * For special behavior. See Formulas.calcEffectSuccess
 	 * For special behavior. See Formulas.calcEffectSuccess
 	 */
 	 */
 	private double _effectPower;
 	private double _effectPower;
-	private L2SkillType _effectSkillType;
 	
 	
 	/**
 	/**
 	 * <font color="FF0000"><b>WARNING: scheduleEffect no longer inside constructor</b></font><br>
 	 * <font color="FF0000"><b>WARNING: scheduleEffect no longer inside constructor</b></font><br>
@@ -179,11 +177,6 @@ public abstract class L2Effect implements IChanceSkillTrigger
 		_periodFirstTime = 0;
 		_periodFirstTime = 0;
 		_icon = template.icon;
 		_icon = template.icon;
 		_effectPower = template.effectPower;
 		_effectPower = template.effectPower;
-		_effectSkillType = template.effectType;
-		
-		// Commented out by DrHouse:
-		// scheduleEffect can call onStart before effect is completely initialized on constructor (child classes constructor)
-		// scheduleEffect();
 	}
 	}
 	
 	
 	/**
 	/**
@@ -477,7 +470,7 @@ public abstract class L2Effect implements IChanceSkillTrigger
 			{
 			{
 				_state = EffectState.ACTING;
 				_state = EffectState.ACTING;
 				
 				
-				if (_skill.isPvpSkill() && _icon && getEffected().isPlayer())
+				if (_skill.isPVP() && _icon && getEffected().isPlayer())
 				{
 				{
 					SystemMessage smsg = SystemMessage.getSystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
 					SystemMessage smsg = SystemMessage.getSystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
 					smsg.addSkillName(_skill);
 					smsg.addSkillName(_skill);
@@ -672,11 +665,6 @@ public abstract class L2Effect implements IChanceSkillTrigger
 		return _effectPower;
 		return _effectPower;
 	}
 	}
 	
 	
-	public L2SkillType getSkillType()
-	{
-		return _effectSkillType;
-	}
-	
 	public boolean canBeStolen()
 	public boolean canBeStolen()
 	{
 	{
 		// TODO: Unhardcode skillId
 		// TODO: Unhardcode skillId

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

@@ -68,13 +68,13 @@ public enum L2EffectType
 	MUTE,
 	MUTE,
 	NEGATE,
 	NEGATE,
 	NOBLESSE_BLESSING,
 	NOBLESSE_BLESSING,
+	NONE,
 	PARALYZE,
 	PARALYZE,
 	PETRIFICATION,
 	PETRIFICATION,
 	PHOENIX_BLESSING,
 	PHOENIX_BLESSING,
 	PHYSICAL_ATTACK_MUTE,
 	PHYSICAL_ATTACK_MUTE,
 	PHYSICAL_MUTE,
 	PHYSICAL_MUTE,
 	PROTECTION_BLESSING,
 	PROTECTION_BLESSING,
-	RANDOMIZE_HATE,
 	REBALANCE_HP,
 	REBALANCE_HP,
 	RELAXING,
 	RELAXING,
 	REMOVE_TARGET,
 	REMOVE_TARGET,
@@ -85,7 +85,6 @@ public enum L2EffectType
 	SILENT_MOVE,
 	SILENT_MOVE,
 	SLEEP,
 	SLEEP,
 	SPOIL,
 	SPOIL,
-	SWEEPER,
 	STUN,
 	STUN,
 	SUMMON_AGATHION,
 	SUMMON_AGATHION,
 	SUMMON_PET,
 	SUMMON_PET,

+ 31 - 139
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2Skill.java

@@ -163,7 +163,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	private final int _maxChance;
 	private final int _maxChance;
 	private final int _blowChance;
 	private final int _blowChance;
 	
 	
-	private final boolean _isNeutral;
 	// Effecting area of the skill, in radius.
 	// Effecting area of the skill, in radius.
 	// The radius center varies according to the _targetType:
 	// The radius center varies according to the _targetType:
 	// "caster" if targetType = AURA/PARTY/CLAN or "target" if targetType = AREA
 	// "caster" if targetType = AURA/PARTY/CLAN or "target" if targetType = AREA
@@ -194,6 +193,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	
 	
 	private final int _minPledgeClass;
 	private final int _minPledgeClass;
 	private final boolean _isOffensive;
 	private final boolean _isOffensive;
+	private final boolean _isPVP;
 	private final int _chargeConsume;
 	private final int _chargeConsume;
 	private final int _triggeredId;
 	private final int _triggeredId;
 	private final int _triggeredLevel;
 	private final int _triggeredLevel;
@@ -211,6 +211,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	private final int _afterEffectLvl;
 	private final int _afterEffectLvl;
 	private final boolean _isHeroSkill; // If true the skill is a Hero Skill
 	private final boolean _isHeroSkill; // If true the skill is a Hero Skill
 	private final boolean _isGMSkill; // True if skill is GM skill
 	private final boolean _isGMSkill; // True if skill is GM skill
+	private final boolean _isSevenSings;
 	
 	
 	private final int _baseCritRate; // percent of success for skill critical hit (especially for PDAM & BLOW - they're not affected by rCrit values or buffs). Default loads -1 for all other skills but 0 to PDAM & BLOW
 	private final int _baseCritRate; // percent of success for skill critical hit (especially for PDAM & BLOW - they're not affected by rCrit values or buffs). Default loads -1 for all other skills but 0 to PDAM & BLOW
 	private final int _lethalEffect1; // percent of success for lethal 1st effect (hit cp to 1 or if mob hp to 50%) (only for PDAM skills)
 	private final int _lethalEffect1; // percent of success for lethal 1st effect (hit cp to 1 or if mob hp to 50%) (only for PDAM skills)
@@ -260,7 +261,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		_level = set.getInteger("level");
 		_level = set.getInteger("level");
 		_refId = set.getInteger("referenceId", 0);
 		_refId = set.getInteger("referenceId", 0);
 		_displayId = set.getInteger("displayId", _id);
 		_displayId = set.getInteger("displayId", _id);
-		_name = set.getString("name");
+		_name = set.getString("name", "");
 		_operateType = set.getEnum("operateType", L2SkillOpType.class);
 		_operateType = set.getEnum("operateType", L2SkillOpType.class);
 		_magic = set.getInteger("isMagic", 0);
 		_magic = set.getInteger("isMagic", 0);
 		_traitType = set.getEnum("trait", L2TraitType.class, L2TraitType.NONE);
 		_traitType = set.getEnum("trait", L2TraitType.class, L2TraitType.NONE);
@@ -322,7 +323,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		_stayOnSubclassChange = set.getBool("stayOnSubclassChange", true);
 		_stayOnSubclassChange = set.getBool("stayOnSubclassChange", true);
 		
 		
 		_killByDOT = set.getBool("killByDOT", false);
 		_killByDOT = set.getBool("killByDOT", false);
-		_isNeutral = set.getBool("neutral", false);
 		_hitTime = set.getInteger("hitTime", 0);
 		_hitTime = set.getInteger("hitTime", 0);
 		String hitTimings = set.getString("hitTimings", null);
 		String hitTimings = set.getString("hitTimings", null);
 		if (hitTimings != null)
 		if (hitTimings != null)
@@ -430,7 +430,8 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		_armorsAllowed = set.getInteger("armorsAllowed", 0);
 		_armorsAllowed = set.getInteger("armorsAllowed", 0);
 		
 		
 		_minPledgeClass = set.getInteger("minPledgeClass", 0);
 		_minPledgeClass = set.getInteger("minPledgeClass", 0);
-		_isOffensive = set.getBool("offensive", isSkillTypeOffensive());
+		_isOffensive = set.getBool("offensive", false);
+		_isPVP = set.getBool("pvp", false);
 		_chargeConsume = set.getInteger("chargeConsume", 0);
 		_chargeConsume = set.getInteger("chargeConsume", 0);
 		_triggeredId = set.getInteger("triggeredId", 0);
 		_triggeredId = set.getInteger("triggeredId", 0);
 		_triggeredLevel = set.getInteger("triggeredLevel", 1);
 		_triggeredLevel = set.getInteger("triggeredLevel", 1);
@@ -451,6 +452,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		
 		
 		_isHeroSkill = SkillTreesData.getInstance().isHeroSkill(_id, _level);
 		_isHeroSkill = SkillTreesData.getInstance().isHeroSkill(_id, _level);
 		_isGMSkill = SkillTreesData.getInstance().isGMSkill(_id, _level);
 		_isGMSkill = SkillTreesData.getInstance().isGMSkill(_id, _level);
+		_isSevenSings = (_id > 4360) && (_id < 4367);
 		
 		
 		_baseCritRate = set.getInteger("baseCritRate", ((_skillType == L2SkillType.PDAM) || (_skillType == L2SkillType.BLOW)) ? 0 : -1);
 		_baseCritRate = set.getInteger("baseCritRate", ((_skillType == L2SkillType.PDAM) || (_skillType == L2SkillType.BLOW)) ? 0 : -1);
 		_lethalEffect1 = set.getInteger("lethal1", 0);
 		_lethalEffect1 = set.getInteger("lethal1", 0);
@@ -871,6 +873,11 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return _magic == 2;
 		return _magic == 2;
 	}
 	}
 	
 	
+	public final boolean isDance()
+	{
+		return _magic == 3;
+	}
+	
 	/**
 	/**
 	 * @return Returns true to set static reuse.
 	 * @return Returns true to set static reuse.
 	 */
 	 */
@@ -974,11 +981,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return _isTriggeredSkill;
 		return _isTriggeredSkill;
 	}
 	}
 	
 	
-	public final boolean isDance()
-	{
-		return _magic == 3;
-	}
-	
 	public final float getSSBoost()
 	public final float getSSBoost()
 	{
 	{
 		return _sSBoost;
 		return _sSBoost;
@@ -1027,9 +1029,9 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return _isOffensive;
 		return _isOffensive;
 	}
 	}
 	
 	
-	public final boolean isNeutral()
+	public final boolean isPVP()
 	{
 	{
-		return _isNeutral;
+		return _isPVP;
 	}
 	}
 	
 	
 	public final boolean isHeroSkill()
 	public final boolean isHeroSkill()
@@ -1042,6 +1044,11 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return _isGMSkill;
 		return _isGMSkill;
 	}
 	}
 	
 	
+	public final boolean is7Signs()
+	{
+		return _isSevenSings;
+	}
+	
 	public final int getChargeConsume()
 	public final int getChargeConsume()
 	{
 	{
 		return _chargeConsume;
 		return _chargeConsume;
@@ -1112,94 +1119,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return _flyCourse;
 		return _flyCourse;
 	}
 	}
 	
 	
-	public final boolean isPvpSkill()
-	{
-		switch (_skillType)
-		{
-			case DOT:
-			case BLEED:
-			case CONFUSION:
-			case POISON:
-			case DEBUFF:
-			case AGGDEBUFF:
-			case STUN:
-			case ROOT:
-			case FEAR:
-			case SLEEP:
-			case MDOT:
-			case MUTE:
-			case PARALYZE:
-			case BETRAY:
-			case DISARM:
-			case AGGDAMAGE:
-			case STEAL_BUFF:
-			case AGGREDUCE_CHAR:
-			case MANADAM:
-				return true;
-			default:
-			{
-				return hasEffectType(L2EffectType.CANCEL);
-			}
-		}
-	}
-	
-	public final boolean isSkillTypeOffensive()
-	{
-		switch (_skillType)
-		{
-			case PDAM:
-			case MDAM:
-			case CPDAM:
-			case DOT:
-			case CPDAMPERCENT:
-			case BLEED:
-			case POISON:
-			case AGGDAMAGE:
-			case DEBUFF:
-			case AGGDEBUFF:
-			case STUN:
-			case ROOT:
-			case CONFUSION:
-			case ERASE:
-			case BLOW:
-			case FATAL:
-			case FEAR:
-			case DRAIN:
-			case SLEEP:
-			case CHARGEDAM:
-			case CONFUSE_MOB_ONLY:
-			case DEATHLINK:
-			case MANADAM:
-			case MDOT:
-			case MUTE:
-			case SOULSHOT:
-			case SPIRITSHOT:
-			case SPOIL:
-			case PARALYZE:
-			case AGGREDUCE:
-			case AGGREMOVE:
-			case AGGREDUCE_CHAR:
-			case BETRAY:
-			case DELUXE_KEY_UNLOCK:
-			case SOW:
-			case DISARM:
-			case STEAL_BUFF:
-			case INSTANT_JUMP:
-				return true;
-			default:
-				return hasEffectType(L2EffectType.CANCEL, L2EffectType.SWEEPER);
-		}
-	}
-	
-	public final boolean is7Signs()
-	{
-		if ((_id > 4360) && (_id < 4367))
-		{
-			return true;
-		}
-		return false;
-	}
-	
 	public final boolean isStayAfterDeath()
 	public final boolean isStayAfterDeath()
 	{
 	{
 		return _stayAfterDeath;
 		return _stayAfterDeath;
@@ -1210,11 +1129,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return _stayOnSubclassChange;
 		return _stayOnSubclassChange;
 	}
 	}
 	
 	
-	// int weapons[] = {L2Weapon.WEAPON_TYPE_ETC, L2Weapon.WEAPON_TYPE_BOW,
-	// L2Weapon.WEAPON_TYPE_POLE, L2Weapon.WEAPON_TYPE_DUALFIST,
-	// L2Weapon.WEAPON_TYPE_DUAL, L2Weapon.WEAPON_TYPE_BLUNT,
-	// L2Weapon.WEAPON_TYPE_SWORD, L2Weapon.WEAPON_TYPE_DAGGER};
-	
 	public final boolean getWeaponDependancy(L2Character activeChar)
 	public final boolean getWeaponDependancy(L2Character activeChar)
 	{
 	{
 		if (getWeaponDependancy(activeChar, false))
 		if (getWeaponDependancy(activeChar, false))
@@ -1364,7 +1278,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 				_log.log(Level.WARNING, "Exception in L2Skill.getTargetList(): " + e.getMessage(), e);
 				_log.log(Level.WARNING, "Exception in L2Skill.getTargetList(): " + e.getMessage(), e);
 			}
 			}
 		}
 		}
-		activeChar.sendMessage("Target type of skill is not currently handled");
+		activeChar.sendMessage("Target type of skill is not currently handled.");
 		return _emptyTargetList;
 		return _emptyTargetList;
 	}
 	}
 	
 	
@@ -1375,10 +1289,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	
 	
 	public final L2Object getFirstOfTargetList(L2Character activeChar)
 	public final L2Object getFirstOfTargetList(L2Character activeChar)
 	{
 	{
-		L2Object[] targets;
-		
-		targets = getTargetList(activeChar, true);
-		
+		L2Object[] targets = getTargetList(activeChar, true);
 		if (targets.length == 0)
 		if (targets.length == 0)
 		{
 		{
 			return null;
 			return null;
@@ -1437,8 +1348,8 @@ public abstract class L2Skill implements IChanceSkillTrigger
 						return false;
 						return false;
 					}
 					}
 					
 					
-					// Same commandchannel
-					if ((player.getParty().getCommandChannel() != null) && (player.getParty().getCommandChannel() == targetPlayer.getParty().getCommandChannel()))
+					// Same command channel
+					if (player.getParty().isInCommandChannel() && (player.getParty().getCommandChannel() == targetPlayer.getParty().getCommandChannel()))
 					{
 					{
 						return false;
 						return false;
 					}
 					}
@@ -1537,28 +1448,26 @@ public abstract class L2Skill implements IChanceSkillTrigger
 			return _emptyFunctionSet;
 			return _emptyFunctionSet;
 		}
 		}
 		
 		
-		ArrayList<Func> funcs = new ArrayList<>(_funcTemplates.length);
+		List<Func> funcs = new ArrayList<>(_funcTemplates.length);
 		
 		
 		Env env = new Env();
 		Env env = new Env();
 		env.setCharacter(player);
 		env.setCharacter(player);
 		env.setSkill(this);
 		env.setSkill(this);
 		
 		
 		Func f;
 		Func f;
-		
 		for (FuncTemplate t : _funcTemplates)
 		for (FuncTemplate t : _funcTemplates)
 		{
 		{
-			
 			f = t.getFunc(env, this); // skill is owner
 			f = t.getFunc(env, this); // skill is owner
 			if (f != null)
 			if (f != null)
 			{
 			{
 				funcs.add(f);
 				funcs.add(f);
 			}
 			}
 		}
 		}
+		
 		if (funcs.isEmpty())
 		if (funcs.isEmpty())
 		{
 		{
 			return _emptyFunctionSet;
 			return _emptyFunctionSet;
 		}
 		}
-		
 		return funcs.toArray(new Func[funcs.size()]);
 		return funcs.toArray(new Func[funcs.size()]);
 	}
 	}
 	
 	
@@ -1626,8 +1535,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 			}
 			}
 		}
 		}
 		
 		
-		ArrayList<L2Effect> effects = new ArrayList<>(_effectTemplates.length);
-		
+		List<L2Effect> effects = new ArrayList<>(_effectTemplates.length);
 		if (env == null)
 		if (env == null)
 		{
 		{
 			env = new Env();
 			env = new Env();
@@ -1640,14 +1548,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		
 		
 		for (EffectTemplate et : _effectTemplates)
 		for (EffectTemplate et : _effectTemplates)
 		{
 		{
-			boolean success = true;
-			
-			if (et.effectPower > -1)
-			{
-				success = Formulas.calcEffectSuccess(effector, effected, et, this, env.getShield(), env.isSoulShot(), env.isSpiritShot(), env.isBlessedSpiritShot());
-			}
-			
-			if (success)
+			if (Formulas.calcEffectSuccess(effector, effected, et, this, env.getShield(), env.isSoulShot(), env.isSpiritShot(), env.isBlessedSpiritShot()))
 			{
 			{
 				L2Effect e = et.getEffect(env);
 				L2Effect e = et.getEffect(env);
 				if (e != null)
 				if (e != null)
@@ -1723,8 +1624,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 			}
 			}
 		}
 		}
 		
 		
-		ArrayList<L2Effect> effects = new ArrayList<>(_effectTemplates.length);
-		
+		List<L2Effect> effects = new ArrayList<>(_effectTemplates.length);
 		if (env == null)
 		if (env == null)
 		{
 		{
 			env = new Env();
 			env = new Env();
@@ -1737,13 +1637,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		
 		
 		for (EffectTemplate et : _effectTemplates)
 		for (EffectTemplate et : _effectTemplates)
 		{
 		{
-			boolean success = true;
-			if (et.effectPower > -1)
-			{
-				success = Formulas.calcEffectSuccess(effector.getOwner(), effected, et, this, env.getShield(), env.isSoulShot(), env.isSpiritShot(), env.isBlessedSpiritShot());
-			}
-			
-			if (success)
+			if (Formulas.calcEffectSuccess(effector.getOwner(), effected, et, this, env.getShield(), env.isSoulShot(), env.isSpiritShot(), env.isBlessedSpiritShot()))
 			{
 			{
 				L2Effect e = et.getEffect(env);
 				L2Effect e = et.getEffect(env);
 				if (e != null)
 				if (e != null)
@@ -1770,7 +1664,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		}
 		}
 		
 		
 		List<L2Effect> effects = new ArrayList<>(_effectTemplatesSelf.length);
 		List<L2Effect> effects = new ArrayList<>(_effectTemplatesSelf.length);
-		
 		for (EffectTemplate et : _effectTemplatesSelf)
 		for (EffectTemplate et : _effectTemplatesSelf)
 		{
 		{
 			Env env = new Env();
 			Env env = new Env();
@@ -1785,11 +1678,11 @@ public abstract class L2Skill implements IChanceSkillTrigger
 				effects.add(e);
 				effects.add(e);
 			}
 			}
 		}
 		}
+		
 		if (effects.isEmpty())
 		if (effects.isEmpty())
 		{
 		{
 			return _emptyEffectSet;
 			return _emptyEffectSet;
 		}
 		}
-		
 		return effects.toArray(new L2Effect[effects.size()]);
 		return effects.toArray(new L2Effect[effects.size()]);
 	}
 	}
 	
 	
@@ -1801,7 +1694,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		}
 		}
 		
 		
 		List<L2Effect> effects = new ArrayList<>(_effectTemplatesPassive.length);
 		List<L2Effect> effects = new ArrayList<>(_effectTemplatesPassive.length);
-		
 		for (EffectTemplate et : _effectTemplatesPassive)
 		for (EffectTemplate et : _effectTemplatesPassive)
 		{
 		{
 			Env env = new Env();
 			Env env = new Env();
@@ -1816,11 +1708,11 @@ public abstract class L2Skill implements IChanceSkillTrigger
 				effects.add(e);
 				effects.add(e);
 			}
 			}
 		}
 		}
+		
 		if (effects.isEmpty())
 		if (effects.isEmpty())
 		{
 		{
 			return _emptyEffectSet;
 			return _emptyEffectSet;
 		}
 		}
-		
 		return effects.toArray(new L2Effect[effects.size()]);
 		return effects.toArray(new L2Effect[effects.size()]);
 	}
 	}
 	
 	
@@ -1924,7 +1816,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	@Override
 	@Override
 	public String toString()
 	public String toString()
 	{
 	{
-		return "" + _name + "[id=" + _id + ",lvl=" + _level + "]";
+		return _name + "[id=" + _id + ",lvl=" + _level + "]";
 	}
 	}
 	
 	
 	/**
 	/**

+ 0 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/L2SkillType.java

@@ -43,7 +43,6 @@ public enum L2SkillType
 	// Damage
 	// Damage
 	PDAM,
 	PDAM,
 	MDAM,
 	MDAM,
-	CPDAM,
 	MANADAM,
 	MANADAM,
 	CPDAMPERCENT,
 	CPDAMPERCENT,
 	DOT,
 	DOT,
@@ -128,7 +127,6 @@ public enum L2SkillType
 	RECALL(L2SkillTeleport.class),
 	RECALL(L2SkillTeleport.class),
 	TELEPORT(L2SkillTeleport.class),
 	TELEPORT(L2SkillTeleport.class),
 	SUMMON_FRIEND,
 	SUMMON_FRIEND,
-	SPOIL,
 	BEAST_FEED,
 	BEAST_FEED,
 	BEAST_RELEASE,
 	BEAST_RELEASE,
 	BEAST_RELEASE_ALL,
 	BEAST_RELEASE_ALL,

+ 10 - 26
L2J_Server_BETA/java/com/l2jserver/gameserver/model/stats/Formulas.java

@@ -41,7 +41,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
 import com.l2jserver.gameserver.model.effects.EffectTemplate;
 import com.l2jserver.gameserver.model.effects.EffectTemplate;
 import com.l2jserver.gameserver.model.effects.L2Effect;
 import com.l2jserver.gameserver.model.effects.L2Effect;
-import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.entity.Castle;
 import com.l2jserver.gameserver.model.entity.Castle;
 import com.l2jserver.gameserver.model.entity.ClanHall;
 import com.l2jserver.gameserver.model.entity.ClanHall;
 import com.l2jserver.gameserver.model.entity.Fort;
 import com.l2jserver.gameserver.model.entity.Fort;
@@ -1525,7 +1524,7 @@ public final class Formulas
 	{
 	{
 		// TODO: CHECK/FIX THIS FORMULA UP!!
 		// TODO: CHECK/FIX THIS FORMULA UP!!
 		double defence = 0;
 		double defence = 0;
-		if (skill.isActive() && skill.isOffensive() && !skill.isNeutral())
+		if (skill.isActive() && skill.isOffensive())
 		{
 		{
 			defence = target.getMDef(actor, skill);
 			defence = target.getMDef(actor, skill);
 		}
 		}
@@ -1768,6 +1767,13 @@ public final class Formulas
 	
 	
 	public static boolean calcEffectSuccess(L2Character attacker, L2Character target, EffectTemplate effect, L2Skill skill, byte shld, boolean ss, boolean sps, boolean bss)
 	public static boolean calcEffectSuccess(L2Character attacker, L2Character target, EffectTemplate effect, L2Skill skill, byte shld, boolean ss, boolean sps, boolean bss)
 	{
 	{
+		// Effect base rate, if it's -1 (or less) always land.
+		final double baseRate = effect.effectPower;
+		if (baseRate < 0)
+		{
+			return true;
+		}
+		
 		if (skill.isDebuff())
 		if (skill.isDebuff())
 		{
 		{
 			if (skill.getPower() == -1)
 			if (skill.getPower() == -1)
@@ -1795,25 +1801,6 @@ public final class Formulas
 			return false;
 			return false;
 		}
 		}
 		
 		
-		final L2SkillType effectType = effect.effectType;
-		double baseRate = effect.effectPower;
-		if (effectType == null)
-		{
-			if (baseRate > skill.getMaxChance())
-			{
-				return Rnd.get(100) < skill.getMaxChance();
-			}
-			else if (baseRate < skill.getMinChance())
-			{
-				return Rnd.get(100) < skill.getMinChance();
-			}
-			return Rnd.get(100) < baseRate;
-		}
-		else if (skill.hasEffectType(L2EffectType.CANCEL))
-		{
-			return true;
-		}
-		
 		// Calculate BaseRate.
 		// Calculate BaseRate.
 		double statMod = calcSkillStatMod(skill, target);
 		double statMod = calcSkillStatMod(skill, target);
 		double rate = (baseRate / statMod);
 		double rate = (baseRate / statMod);
@@ -1885,7 +1872,7 @@ public final class Formulas
 		if (attacker.isDebug() || Config.DEVELOPER)
 		if (attacker.isDebug() || Config.DEVELOPER)
 		{
 		{
 			final StringBuilder stat = new StringBuilder(100);
 			final StringBuilder stat = new StringBuilder(100);
-			StringUtil.append(stat, skill.getName(), " eff.type:", effectType.toString(), " power:", String.valueOf(baseRate), " stat:", String.format("%1.2f", statMod), " res:", String.format("%1.2f", resMod), "(", String.format("%1.2f", prof), "/", String.format("%1.2f", vuln), ") elem:", String.valueOf(elementModifier), " mAtk:", String.format("%1.2f", mAtkModifier), " ss:", String.valueOf(ssModifier), " lvl:", String.format("%1.2f", lvlBonusMod), " total:", String.valueOf(rate));
+			StringUtil.append(stat, skill.getName(), " power:", String.valueOf(baseRate), " stat:", String.format("%1.2f", statMod), " res:", String.format("%1.2f", resMod), "(", String.format("%1.2f", prof), "/", String.format("%1.2f", vuln), ") elem:", String.valueOf(elementModifier), " mAtk:", String.format("%1.2f", mAtkModifier), " ss:", String.valueOf(ssModifier), " lvl:", String.format("%1.2f", lvlBonusMod), " total:", String.valueOf(rate));
 			final String result = stat.toString();
 			final String result = stat.toString();
 			if (attacker.isDebug())
 			if (attacker.isDebug())
 			{
 			{
@@ -2118,9 +2105,7 @@ public final class Formulas
 			return true;
 			return true;
 		}
 		}
 		
 		
-		// DS: remove skill magic level dependence from nukes
-		// int lvlDifference = (target.getLevel() - (skill.getMagicLevel() > 0 ? skill.getMagicLevel() : attacker.getLevel()));
-		int lvlDifference = (target.getLevel() - (skill.getSkillType() == L2SkillType.SPOIL ? skill.getMagicLevel() : attacker.getLevel()));
+		int lvlDifference = (target.getLevel() - (skill.getMagicLevel() > 0 ? skill.getMagicLevel() : attacker.getLevel()));
 		double lvlModifier = Math.pow(1.3, lvlDifference);
 		double lvlModifier = Math.pow(1.3, lvlDifference);
 		float targetModifier = 1;
 		float targetModifier = 1;
 		if (target.isL2Attackable() && !target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_MAGIC_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 3))
 		if (target.isL2Attackable() && !target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_MAGIC_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 3))
@@ -2405,7 +2390,6 @@ public final class Formulas
 			case CHARGEDAM:
 			case CHARGEDAM:
 			case FATAL:
 			case FATAL:
 			case DEATHLINK:
 			case DEATHLINK:
-			case CPDAM:
 			case MANADAM:
 			case MANADAM:
 			case CPDAMPERCENT:
 			case CPDAMPERCENT:
 				final Stats stat = skill.isMagic() ? Stats.VENGEANCE_SKILL_MAGIC_DAMAGE : Stats.VENGEANCE_SKILL_PHYSICAL_DAMAGE;
 				final Stats stat = skill.isMagic() ? Stats.VENGEANCE_SKILL_MAGIC_DAMAGE : Stats.VENGEANCE_SKILL_PHYSICAL_DAMAGE;