Переглянути джерело

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 роки тому
батько
коміт
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 FATAL:
 			case DEATHLINK:
-			case CPDAM:
 			case MANADAM:
 			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.L2WeaponType;
 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.Lambda;
 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));
 		}
 		
-		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");
 		int trigId = 0;
 		if (attrs.getNamedItem("triggeredId") != null)
@@ -472,7 +456,7 @@ public abstract class DocumentBase
 			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);
 		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++;
 						continue;
 					}
-					if (skill.isOffensive() && !skill.isNeutral())
+					if (skill.isOffensive())
 					{
 						if (isPlayer())
 						{
@@ -6708,7 +6708,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 				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();
 		}
@@ -6985,11 +6985,7 @@ public abstract class L2Character extends L2Object implements ISkillsHolder
 					// EVT_ATTACKED and PvPStatus
 					if (target instanceof L2Character)
 					{
-						if (skill.isNeutral())
-						{
-							// no flags
-						}
-						else if (skill.isOffensive())
+						if (skill.isOffensive())
 						{
 							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())
 							{

+ 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 (process.equalsIgnoreCase("sweep") || process.equalsIgnoreCase("Quest"))
+					if (process.equalsIgnoreCase("Sweeper") || process.equalsIgnoreCase("Quest"))
 					{
 						SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.EARNED_S2_S1_S);
 						sm.addItemName(itemId);
@@ -9143,25 +9143,25 @@ public final class L2PcInstance extends L2Playable
 		}
 		
 		// Check if the attacker is a L2MonsterInstance
-		if (attacker instanceof L2MonsterInstance)
+		if (attacker.isMonster())
 		{
 			return true;
 		}
 		
 		// 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;
 		}
 		
 		// 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;
 		}
 		
 		// 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()))
 			{
@@ -9177,7 +9177,7 @@ public final class L2PcInstance extends L2Playable
 		}
 		
 		// Check if the attacker is a L2Playable
-		if (attacker instanceof L2Playable)
+		if (attacker.isPlayable())
 		{
 			if (isInsideZone(ZoneId.PEACE))
 			{
@@ -9226,7 +9226,7 @@ public final class L2PcInstance extends L2Playable
 			}
 			
 			// 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;
 			}
@@ -9687,7 +9687,7 @@ public final class L2PcInstance extends L2Playable
 			
 		}
 		// 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.
 			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
 		switch (sklTargetType)
 		{
@@ -10004,7 +9990,7 @@ public final class L2PcInstance extends L2Playable
 		{
 			SkillDat skilldat = getCurrentSkill();
 			SkillDat skilldatpet = getCurrentPetSkill();
-			if (skill.isPvpSkill()) // pvp skill
+			if (skill.isPVP())
 			{
 				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 FATAL:
 					case DEATHLINK:
-					case CPDAM:
 					case MANADAM:
 					case CPDAMPERCENT:
 						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.model.ChanceCondition;
 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.Lambda;
 import com.l2jserver.gameserver.model.stats.Env;
@@ -54,14 +53,13 @@ public class EffectTemplate
 	public final byte abnormalLvl;
 	public final boolean icon;
 	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 triggeredLevel;
 	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;
 		applayCond = pApplayCond;
@@ -76,7 +74,6 @@ public class EffectTemplate
 		icon = showicon;
 		funcName = func;
 		effectPower = ePower;
-		effectType = eType;
 		
 		triggeredId = trigId;
 		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.interfaces.IChanceSkillTrigger;
 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.FuncTemplate;
 import com.l2jserver.gameserver.model.skills.funcs.Lambda;
@@ -133,7 +132,6 @@ public abstract class L2Effect implements IChanceSkillTrigger
 	 * For special behavior. See Formulas.calcEffectSuccess
 	 */
 	private double _effectPower;
-	private L2SkillType _effectSkillType;
 	
 	/**
 	 * <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;
 		_icon = template.icon;
 		_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;
 				
-				if (_skill.isPvpSkill() && _icon && getEffected().isPlayer())
+				if (_skill.isPVP() && _icon && getEffected().isPlayer())
 				{
 					SystemMessage smsg = SystemMessage.getSystemMessage(SystemMessageId.YOU_FEEL_S1_EFFECT);
 					smsg.addSkillName(_skill);
@@ -672,11 +665,6 @@ public abstract class L2Effect implements IChanceSkillTrigger
 		return _effectPower;
 	}
 	
-	public L2SkillType getSkillType()
-	{
-		return _effectSkillType;
-	}
-	
 	public boolean canBeStolen()
 	{
 		// TODO: Unhardcode skillId

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

@@ -68,13 +68,13 @@ public enum L2EffectType
 	MUTE,
 	NEGATE,
 	NOBLESSE_BLESSING,
+	NONE,
 	PARALYZE,
 	PETRIFICATION,
 	PHOENIX_BLESSING,
 	PHYSICAL_ATTACK_MUTE,
 	PHYSICAL_MUTE,
 	PROTECTION_BLESSING,
-	RANDOMIZE_HATE,
 	REBALANCE_HP,
 	RELAXING,
 	REMOVE_TARGET,
@@ -85,7 +85,6 @@ public enum L2EffectType
 	SILENT_MOVE,
 	SLEEP,
 	SPOIL,
-	SWEEPER,
 	STUN,
 	SUMMON_AGATHION,
 	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 _blowChance;
 	
-	private final boolean _isNeutral;
 	// Effecting area of the skill, in radius.
 	// The radius center varies according to the _targetType:
 	// "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 boolean _isOffensive;
+	private final boolean _isPVP;
 	private final int _chargeConsume;
 	private final int _triggeredId;
 	private final int _triggeredLevel;
@@ -211,6 +211,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	private final int _afterEffectLvl;
 	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 _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 _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");
 		_refId = set.getInteger("referenceId", 0);
 		_displayId = set.getInteger("displayId", _id);
-		_name = set.getString("name");
+		_name = set.getString("name", "");
 		_operateType = set.getEnum("operateType", L2SkillOpType.class);
 		_magic = set.getInteger("isMagic", 0);
 		_traitType = set.getEnum("trait", L2TraitType.class, L2TraitType.NONE);
@@ -322,7 +323,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		_stayOnSubclassChange = set.getBool("stayOnSubclassChange", true);
 		
 		_killByDOT = set.getBool("killByDOT", false);
-		_isNeutral = set.getBool("neutral", false);
 		_hitTime = set.getInteger("hitTime", 0);
 		String hitTimings = set.getString("hitTimings", null);
 		if (hitTimings != null)
@@ -430,7 +430,8 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		_armorsAllowed = set.getInteger("armorsAllowed", 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);
 		_triggeredId = set.getInteger("triggeredId", 0);
 		_triggeredLevel = set.getInteger("triggeredLevel", 1);
@@ -451,6 +452,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		
 		_isHeroSkill = SkillTreesData.getInstance().isHeroSkill(_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);
 		_lethalEffect1 = set.getInteger("lethal1", 0);
@@ -871,6 +873,11 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return _magic == 2;
 	}
 	
+	public final boolean isDance()
+	{
+		return _magic == 3;
+	}
+	
 	/**
 	 * @return Returns true to set static reuse.
 	 */
@@ -974,11 +981,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return _isTriggeredSkill;
 	}
 	
-	public final boolean isDance()
-	{
-		return _magic == 3;
-	}
-	
 	public final float getSSBoost()
 	{
 		return _sSBoost;
@@ -1027,9 +1029,9 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return _isOffensive;
 	}
 	
-	public final boolean isNeutral()
+	public final boolean isPVP()
 	{
-		return _isNeutral;
+		return _isPVP;
 	}
 	
 	public final boolean isHeroSkill()
@@ -1042,6 +1044,11 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		return _isGMSkill;
 	}
 	
+	public final boolean is7Signs()
+	{
+		return _isSevenSings;
+	}
+	
 	public final int getChargeConsume()
 	{
 		return _chargeConsume;
@@ -1112,94 +1119,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		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()
 	{
 		return _stayAfterDeath;
@@ -1210,11 +1129,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		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)
 	{
 		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);
 			}
 		}
-		activeChar.sendMessage("Target type of skill is not currently handled");
+		activeChar.sendMessage("Target type of skill is not currently handled.");
 		return _emptyTargetList;
 	}
 	
@@ -1375,10 +1289,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	
 	public final L2Object getFirstOfTargetList(L2Character activeChar)
 	{
-		L2Object[] targets;
-		
-		targets = getTargetList(activeChar, true);
-		
+		L2Object[] targets = getTargetList(activeChar, true);
 		if (targets.length == 0)
 		{
 			return null;
@@ -1437,8 +1348,8 @@ public abstract class L2Skill implements IChanceSkillTrigger
 						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;
 					}
@@ -1537,28 +1448,26 @@ public abstract class L2Skill implements IChanceSkillTrigger
 			return _emptyFunctionSet;
 		}
 		
-		ArrayList<Func> funcs = new ArrayList<>(_funcTemplates.length);
+		List<Func> funcs = new ArrayList<>(_funcTemplates.length);
 		
 		Env env = new Env();
 		env.setCharacter(player);
 		env.setSkill(this);
 		
 		Func f;
-		
 		for (FuncTemplate t : _funcTemplates)
 		{
-			
 			f = t.getFunc(env, this); // skill is owner
 			if (f != null)
 			{
 				funcs.add(f);
 			}
 		}
+		
 		if (funcs.isEmpty())
 		{
 			return _emptyFunctionSet;
 		}
-		
 		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)
 		{
 			env = new Env();
@@ -1640,14 +1548,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		
 		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);
 				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)
 		{
 			env = new Env();
@@ -1737,13 +1637,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		
 		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);
 				if (e != null)
@@ -1770,7 +1664,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		}
 		
 		List<L2Effect> effects = new ArrayList<>(_effectTemplatesSelf.length);
-		
 		for (EffectTemplate et : _effectTemplatesSelf)
 		{
 			Env env = new Env();
@@ -1785,11 +1678,11 @@ public abstract class L2Skill implements IChanceSkillTrigger
 				effects.add(e);
 			}
 		}
+		
 		if (effects.isEmpty())
 		{
 			return _emptyEffectSet;
 		}
-		
 		return effects.toArray(new L2Effect[effects.size()]);
 	}
 	
@@ -1801,7 +1694,6 @@ public abstract class L2Skill implements IChanceSkillTrigger
 		}
 		
 		List<L2Effect> effects = new ArrayList<>(_effectTemplatesPassive.length);
-		
 		for (EffectTemplate et : _effectTemplatesPassive)
 		{
 			Env env = new Env();
@@ -1816,11 +1708,11 @@ public abstract class L2Skill implements IChanceSkillTrigger
 				effects.add(e);
 			}
 		}
+		
 		if (effects.isEmpty())
 		{
 			return _emptyEffectSet;
 		}
-		
 		return effects.toArray(new L2Effect[effects.size()]);
 	}
 	
@@ -1924,7 +1816,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 	@Override
 	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
 	PDAM,
 	MDAM,
-	CPDAM,
 	MANADAM,
 	CPDAMPERCENT,
 	DOT,
@@ -128,7 +127,6 @@ public enum L2SkillType
 	RECALL(L2SkillTeleport.class),
 	TELEPORT(L2SkillTeleport.class),
 	SUMMON_FRIEND,
-	SPOIL,
 	BEAST_FEED,
 	BEAST_RELEASE,
 	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.effects.EffectTemplate;
 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.ClanHall;
 import com.l2jserver.gameserver.model.entity.Fort;
@@ -1525,7 +1524,7 @@ public final class Formulas
 	{
 		// TODO: CHECK/FIX THIS FORMULA UP!!
 		double defence = 0;
-		if (skill.isActive() && skill.isOffensive() && !skill.isNeutral())
+		if (skill.isActive() && skill.isOffensive())
 		{
 			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)
 	{
+		// 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.getPower() == -1)
@@ -1795,25 +1801,6 @@ public final class Formulas
 			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.
 		double statMod = calcSkillStatMod(skill, target);
 		double rate = (baseRate / statMod);
@@ -1885,7 +1872,7 @@ public final class Formulas
 		if (attacker.isDebug() || Config.DEVELOPER)
 		{
 			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();
 			if (attacker.isDebug())
 			{
@@ -2118,9 +2105,7 @@ public final class Formulas
 			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);
 		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))
@@ -2405,7 +2390,6 @@ public final class Formulas
 			case CHARGEDAM:
 			case FATAL:
 			case DEATHLINK:
-			case CPDAM:
 			case MANADAM:
 			case CPDAMPERCENT:
 				final Stats stat = skill.isMagic() ? Stats.VENGEANCE_SKILL_MAGIC_DAMAGE : Stats.VENGEANCE_SKILL_PHYSICAL_DAMAGE;