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

BETA: Core-Part for [DP10006].

Nos 11 роки тому
батько
коміт
070f617df0

+ 318 - 323
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2AttackableAI.java

@@ -1366,9 +1366,9 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			dist2 = dist2 - 30;
 		}
 		
-		switch (sk.getSkillType())
+		if (sk.isContinuous())
 		{
-			case BUFF:
+			if (!sk.isDebuff())
 			{
 				if (!caster.isAffectedBySkill(sk.getId()))
 				{
@@ -1407,241 +1407,201 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 					caster.setTarget(targets);
 					return true;
 				}
-				break;
 			}
-			default:
+			else
 			{
-				if (sk.isDebuff())
+				if (GeoData.getInstance().canSeeTarget(caster, attackTarget) && !canAOE(sk) && !attackTarget.isDead() && (dist2 <= srange))
 				{
-					if (GeoData.getInstance().canSeeTarget(caster, attackTarget) && !canAOE(sk) && !attackTarget.isDead() && (dist2 <= srange))
+					if (!attackTarget.isAffectedBySkill(sk.getId()))
 					{
-						if (!attackTarget.isAffectedBySkill(sk.getId()))
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
+						clientStopMoving(null);
+						caster.doCast(sk);
+						return true;
 					}
-					else if (canAOE(sk))
+				}
+				else if (canAOE(sk))
+				{
+					if ((sk.getTargetType() == L2TargetType.AURA) || (sk.getTargetType() == L2TargetType.BEHIND_AURA) || (sk.getTargetType() == L2TargetType.FRONT_AURA) || (sk.getTargetType() == L2TargetType.AURA_CORPSE_MOB))
 					{
-						if ((sk.getTargetType() == L2TargetType.AURA) || (sk.getTargetType() == L2TargetType.BEHIND_AURA) || (sk.getTargetType() == L2TargetType.FRONT_AURA) || (sk.getTargetType() == L2TargetType.AURA_CORPSE_MOB))
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
-						if (((sk.getTargetType() == L2TargetType.AREA) || (sk.getTargetType() == L2TargetType.BEHIND_AREA) || (sk.getTargetType() == L2TargetType.FRONT_AREA)) && GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
+						clientStopMoving(null);
+						caster.doCast(sk);
+						return true;
 					}
-					else if (sk.getTargetType() == L2TargetType.ONE)
+					if (((sk.getTargetType() == L2TargetType.AREA) || (sk.getTargetType() == L2TargetType.BEHIND_AREA) || (sk.getTargetType() == L2TargetType.FRONT_AREA)) && GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
 					{
-						L2Character target = effectTargetReconsider(sk, false);
-						if (target != null)
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
+						clientStopMoving(null);
+						caster.doCast(sk);
+						return true;
 					}
 				}
-				
-				if (sk.hasEffectType(L2EffectType.DISPEL))
+				else if (sk.getTargetType() == L2TargetType.ONE)
 				{
-					if (sk.getTargetType() == L2TargetType.ONE)
-					{
-						if ((attackTarget.getEffectList().getFirstEffect(L2EffectType.BUFF) != null) && GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
-						L2Character target = effectTargetReconsider(sk, false);
-						if (target != null)
-						{
-							clientStopMoving(null);
-							L2Object targets = attackTarget;
-							caster.setTarget(target);
-							caster.doCast(sk);
-							caster.setTarget(targets);
-							return true;
-						}
-					}
-					else if (canAOE(sk))
+					L2Character target = effectTargetReconsider(sk, false);
+					if (target != null)
 					{
-						if (((sk.getTargetType() == L2TargetType.AURA) || (sk.getTargetType() == L2TargetType.BEHIND_AURA) || (sk.getTargetType() == L2TargetType.FRONT_AURA)) && GeoData.getInstance().canSeeTarget(caster, attackTarget))
-						
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
-						else if (((sk.getTargetType() == L2TargetType.AREA) || (sk.getTargetType() == L2TargetType.BEHIND_AREA) || (sk.getTargetType() == L2TargetType.FRONT_AREA)) && GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
+						clientStopMoving(null);
+						caster.doCast(sk);
+						return true;
 					}
 				}
+			}
+		}
+		
+		if (sk.hasEffectType(L2EffectType.DISPEL))
+		{
+			if (sk.getTargetType() == L2TargetType.ONE)
+			{
+				if ((attackTarget.getEffectList().getFirstEffect(L2EffectType.BUFF) != null) && GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
+				{
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
+				L2Character target = effectTargetReconsider(sk, false);
+				if (target != null)
+				{
+					clientStopMoving(null);
+					L2Object targets = attackTarget;
+					caster.setTarget(target);
+					caster.doCast(sk);
+					caster.setTarget(targets);
+					return true;
+				}
+			}
+			else if (canAOE(sk))
+			{
+				if (((sk.getTargetType() == L2TargetType.AURA) || (sk.getTargetType() == L2TargetType.BEHIND_AURA) || (sk.getTargetType() == L2TargetType.FRONT_AURA)) && GeoData.getInstance().canSeeTarget(caster, attackTarget))
 				
-				if (sk.hasEffectType(L2EffectType.HEAL, L2EffectType.HEAL_PERCENT))
 				{
-					double percentage = (caster.getCurrentHp() / caster.getMaxHp()) * 100;
-					if (caster.isMinion() && (sk.getTargetType() != L2TargetType.SELF))
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
+				else if (((sk.getTargetType() == L2TargetType.AREA) || (sk.getTargetType() == L2TargetType.BEHIND_AREA) || (sk.getTargetType() == L2TargetType.FRONT_AREA)) && GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
+				{
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
+			}
+		}
+		
+		if (sk.hasEffectType(L2EffectType.HEAL, L2EffectType.HEAL_PERCENT))
+		{
+			double percentage = (caster.getCurrentHp() / caster.getMaxHp()) * 100;
+			if (caster.isMinion() && (sk.getTargetType() != L2TargetType.SELF))
+			{
+				L2Character leader = caster.getLeader();
+				if ((leader != null) && !leader.isDead() && (Rnd.get(100) > ((leader.getCurrentHp() / leader.getMaxHp()) * 100)))
+				{
+					if (!Util.checkIfInRange((sk.getCastRange() + caster.getTemplate().getCollisionRadius() + leader.getTemplate().getCollisionRadius()), caster, leader, false) && !isParty(sk) && !caster.isMovementDisabled())
 					{
-						L2Character leader = caster.getLeader();
-						if ((leader != null) && !leader.isDead() && (Rnd.get(100) > ((leader.getCurrentHp() / leader.getMaxHp()) * 100)))
-						{
-							if (!Util.checkIfInRange((sk.getCastRange() + caster.getTemplate().getCollisionRadius() + leader.getTemplate().getCollisionRadius()), caster, leader, false) && !isParty(sk) && !caster.isMovementDisabled())
-							{
-								moveToPawn(leader, sk.getCastRange() + caster.getTemplate().getCollisionRadius() + leader.getTemplate().getCollisionRadius());
-							}
-							if (GeoData.getInstance().canSeeTarget(caster, leader))
-							{
-								clientStopMoving(null);
-								caster.setTarget(leader);
-								caster.doCast(sk);
-								return true;
-							}
-						}
+						moveToPawn(leader, sk.getCastRange() + caster.getTemplate().getCollisionRadius() + leader.getTemplate().getCollisionRadius());
 					}
-					if (Rnd.get(100) < ((100 - percentage) / 3))
+					if (GeoData.getInstance().canSeeTarget(caster, leader))
 					{
 						clientStopMoving(null);
-						caster.setTarget(caster);
+						caster.setTarget(leader);
 						caster.doCast(sk);
 						return true;
 					}
-					
-					if (sk.getTargetType() == L2TargetType.ONE)
+				}
+			}
+			if (Rnd.get(100) < ((100 - percentage) / 3))
+			{
+				clientStopMoving(null);
+				caster.setTarget(caster);
+				caster.doCast(sk);
+				return true;
+			}
+			
+			if (sk.getTargetType() == L2TargetType.ONE)
+			{
+				for (L2Character obj : caster.getKnownList().getKnownCharactersInRadius(sk.getCastRange() + caster.getTemplate().getCollisionRadius()))
+				{
+					if (!(obj instanceof L2Attackable) || obj.isDead())
 					{
-						for (L2Character obj : caster.getKnownList().getKnownCharactersInRadius(sk.getCastRange() + caster.getTemplate().getCollisionRadius()))
-						{
-							if (!(obj instanceof L2Attackable) || obj.isDead())
-							{
-								continue;
-							}
-							
-							L2Attackable targets = ((L2Attackable) obj);
-							if ((caster.getFactionId() != null) && !caster.getFactionId().equals(targets.getFactionId()))
-							{
-								continue;
-							}
-							percentage = (targets.getCurrentHp() / targets.getMaxHp()) * 100;
-							if (Rnd.get(100) < ((100 - percentage) / 10))
-							{
-								if (GeoData.getInstance().canSeeTarget(caster, targets))
-								{
-									clientStopMoving(null);
-									caster.setTarget(obj);
-									caster.doCast(sk);
-									return true;
-								}
-							}
-						}
+						continue;
 					}
-					if (isParty(sk))
+					
+					L2Attackable targets = ((L2Attackable) obj);
+					if ((caster.getFactionId() != null) && !caster.getFactionId().equals(targets.getFactionId()))
 					{
-						for (L2Character obj : caster.getKnownList().getKnownCharactersInRadius(sk.getAffectRange() + caster.getTemplate().getCollisionRadius()))
-						{
-							if (!(obj instanceof L2Attackable))
-							{
-								continue;
-							}
-							L2Npc targets = ((L2Npc) obj);
-							if ((caster.getFactionId() != null) && targets.getFactionId().equals(caster.getFactionId()))
-							{
-								if ((obj.getCurrentHp() < obj.getMaxHp()) && (Rnd.get(100) <= 20))
-								{
-									clientStopMoving(null);
-									caster.setTarget(caster);
-									caster.doCast(sk);
-									return true;
-								}
-							}
-						}
+						continue;
 					}
-				}
-				
-				if (sk.hasEffectType(L2EffectType.PHYSICAL_ATTACK, L2EffectType.PHYSICAL_ATTACK_HP_LINK, L2EffectType.FATAL_BLOW, L2EffectType.ENERGY_ATTACK, L2EffectType.MAGICAL_ATTACK_MP, L2EffectType.MAGICAL_ATTACK, L2EffectType.DEATH_LINK, L2EffectType.HP_DRAIN))
-				{
-					if (!canAura(sk))
+					percentage = (targets.getCurrentHp() / targets.getMaxHp()) * 100;
+					if (Rnd.get(100) < ((100 - percentage) / 10))
 					{
-						if (GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
-						
-						L2Character target = skillTargetReconsider(sk);
-						if (target != null)
+						if (GeoData.getInstance().canSeeTarget(caster, targets))
 						{
 							clientStopMoving(null);
-							L2Object targets = attackTarget;
-							caster.setTarget(target);
+							caster.setTarget(obj);
 							caster.doCast(sk);
-							caster.setTarget(targets);
 							return true;
 						}
 					}
-					else
-					{
-						clientStopMoving(null);
-						caster.doCast(sk);
-						return true;
-					}
 				}
-				
-				if (sk.hasEffectType(L2EffectType.SLEEP))
+			}
+			if (isParty(sk))
+			{
+				for (L2Character obj : caster.getKnownList().getKnownCharactersInRadius(sk.getAffectRange() + caster.getTemplate().getCollisionRadius()))
 				{
-					if (sk.getTargetType() == L2TargetType.ONE)
+					if (!(obj instanceof L2Attackable))
 					{
-						if (!attackTarget.isDead() && (dist2 <= srange))
-						{
-							if ((dist2 > range) || attackTarget.isMoving())
-							{
-								if (!attackTarget.isAffectedBySkill(sk.getId()))
-								{
-									clientStopMoving(null);
-									caster.doCast(sk);
-									return true;
-								}
-							}
-						}
-						
-						L2Character target = effectTargetReconsider(sk, false);
-						if (target != null)
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
+						continue;
 					}
-					else if (canAOE(sk))
+					L2Npc targets = ((L2Npc) obj);
+					if ((caster.getFactionId() != null) && targets.getFactionId().equals(caster.getFactionId()))
 					{
-						if ((sk.getTargetType() == L2TargetType.AURA) || (sk.getTargetType() == L2TargetType.BEHIND_AURA) || (sk.getTargetType() == L2TargetType.FRONT_AURA))
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
-						if (((sk.getTargetType() == L2TargetType.AREA) || (sk.getTargetType() == L2TargetType.BEHIND_AREA) || (sk.getTargetType() == L2TargetType.FRONT_AREA)) && GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
+						if ((obj.getCurrentHp() < obj.getMaxHp()) && (Rnd.get(100) <= 20))
 						{
 							clientStopMoving(null);
+							caster.setTarget(caster);
 							caster.doCast(sk);
 							return true;
 						}
 					}
 				}
+			}
+		}
+		
+		if (sk.hasEffectType(L2EffectType.PHYSICAL_ATTACK, L2EffectType.PHYSICAL_ATTACK_HP_LINK, L2EffectType.FATAL_BLOW, L2EffectType.ENERGY_ATTACK, L2EffectType.MAGICAL_ATTACK_MP, L2EffectType.MAGICAL_ATTACK, L2EffectType.DEATH_LINK, L2EffectType.HP_DRAIN))
+		{
+			if (!canAura(sk))
+			{
+				if (GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
+				{
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
 				
-				if (sk.hasEffectType(L2EffectType.STUN, L2EffectType.ROOT, L2EffectType.PARALYZE, L2EffectType.MUTE, L2EffectType.FEAR))
+				L2Character target = skillTargetReconsider(sk);
+				if (target != null)
 				{
-					if (GeoData.getInstance().canSeeTarget(caster, attackTarget) && !canAOE(sk) && (dist2 <= srange))
+					clientStopMoving(null);
+					L2Object targets = attackTarget;
+					caster.setTarget(target);
+					caster.doCast(sk);
+					caster.setTarget(targets);
+					return true;
+				}
+			}
+			else
+			{
+				clientStopMoving(null);
+				caster.doCast(sk);
+				return true;
+			}
+		}
+		
+		if (sk.hasEffectType(L2EffectType.SLEEP))
+		{
+			if (sk.getTargetType() == L2TargetType.ONE)
+			{
+				if (!attackTarget.isDead() && (dist2 <= srange))
+				{
+					if ((dist2 > range) || attackTarget.isMoving())
 					{
 						if (!attackTarget.isAffectedBySkill(sk.getId()))
 						{
@@ -1650,171 +1610,206 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 							return true;
 						}
 					}
-					else if (canAOE(sk))
+				}
+				
+				L2Character target = effectTargetReconsider(sk, false);
+				if (target != null)
+				{
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
+			}
+			else if (canAOE(sk))
+			{
+				if ((sk.getTargetType() == L2TargetType.AURA) || (sk.getTargetType() == L2TargetType.BEHIND_AURA) || (sk.getTargetType() == L2TargetType.FRONT_AURA))
+				{
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
+				if (((sk.getTargetType() == L2TargetType.AREA) || (sk.getTargetType() == L2TargetType.BEHIND_AREA) || (sk.getTargetType() == L2TargetType.FRONT_AREA)) && GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
+				{
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
+			}
+		}
+		
+		if (sk.hasEffectType(L2EffectType.STUN, L2EffectType.ROOT, L2EffectType.PARALYZE, L2EffectType.MUTE, L2EffectType.FEAR))
+		{
+			if (GeoData.getInstance().canSeeTarget(caster, attackTarget) && !canAOE(sk) && (dist2 <= srange))
+			{
+				if (!attackTarget.isAffectedBySkill(sk.getId()))
+				{
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
+			}
+			else if (canAOE(sk))
+			{
+				if ((sk.getTargetType() == L2TargetType.AURA) || (sk.getTargetType() == L2TargetType.BEHIND_AURA) || (sk.getTargetType() == L2TargetType.FRONT_AURA))
+				{
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
+				if (((sk.getTargetType() == L2TargetType.AREA) || (sk.getTargetType() == L2TargetType.BEHIND_AREA) || (sk.getTargetType() == L2TargetType.FRONT_AREA)) && GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
+				{
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
+			}
+			else if (sk.getTargetType() == L2TargetType.ONE)
+			{
+				L2Character target = effectTargetReconsider(sk, false);
+				if (target != null)
+				{
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
+			}
+		}
+		
+		if (sk.hasEffectType(L2EffectType.DMG_OVER_TIME, L2EffectType.DMG_OVER_TIME_PERCENT))
+		{
+			if (GeoData.getInstance().canSeeTarget(caster, attackTarget) && !canAOE(sk) && !attackTarget.isDead() && (dist2 <= srange))
+			{
+				if (!attackTarget.isAffectedBySkill(sk.getId()))
+				{
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
+			}
+			else if (canAOE(sk))
+			{
+				if ((sk.getTargetType() == L2TargetType.AURA) || (sk.getTargetType() == L2TargetType.BEHIND_AURA) || (sk.getTargetType() == L2TargetType.FRONT_AURA) || (sk.getTargetType() == L2TargetType.AURA_CORPSE_MOB))
+				{
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
+				if (((sk.getTargetType() == L2TargetType.AREA) || (sk.getTargetType() == L2TargetType.BEHIND_AREA) || (sk.getTargetType() == L2TargetType.FRONT_AREA)) && GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
+				{
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
+			}
+			else if (sk.getTargetType() == L2TargetType.ONE)
+			{
+				L2Character target = effectTargetReconsider(sk, false);
+				if (target != null)
+				{
+					clientStopMoving(null);
+					caster.doCast(sk);
+					return true;
+				}
+			}
+		}
+		
+		if (sk.hasEffectType(L2EffectType.RESURRECTION))
+		{
+			if (!isParty(sk))
+			{
+				if (caster.isMinion() && (sk.getTargetType() != L2TargetType.SELF))
+				{
+					L2Character leader = caster.getLeader();
+					if ((leader != null) && leader.isDead())
 					{
-						if ((sk.getTargetType() == L2TargetType.AURA) || (sk.getTargetType() == L2TargetType.BEHIND_AURA) || (sk.getTargetType() == L2TargetType.FRONT_AURA))
+						if (!Util.checkIfInRange((sk.getCastRange() + caster.getTemplate().getCollisionRadius() + leader.getTemplate().getCollisionRadius()), caster, leader, false) && !isParty(sk) && !caster.isMovementDisabled())
 						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
-						if (((sk.getTargetType() == L2TargetType.AREA) || (sk.getTargetType() == L2TargetType.BEHIND_AREA) || (sk.getTargetType() == L2TargetType.FRONT_AREA)) && GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
+							moveToPawn(leader, sk.getCastRange() + caster.getTemplate().getCollisionRadius() + leader.getTemplate().getCollisionRadius());
 						}
 					}
-					else if (sk.getTargetType() == L2TargetType.ONE)
+					if (GeoData.getInstance().canSeeTarget(caster, leader))
 					{
-						L2Character target = effectTargetReconsider(sk, false);
-						if (target != null)
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
+						clientStopMoving(null);
+						caster.setTarget(leader);
+						caster.doCast(sk);
+						return true;
 					}
 				}
 				
-				if (sk.hasEffectType(L2EffectType.DMG_OVER_TIME, L2EffectType.DMG_OVER_TIME_PERCENT))
+				for (L2Character obj : caster.getKnownList().getKnownCharactersInRadius(sk.getCastRange() + caster.getTemplate().getCollisionRadius()))
 				{
-					if (GeoData.getInstance().canSeeTarget(caster, attackTarget) && !canAOE(sk) && !attackTarget.isDead() && (dist2 <= srange))
+					if (!(obj instanceof L2Attackable) || !obj.isDead())
 					{
-						if (!attackTarget.isAffectedBySkill(sk.getId()))
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
+						continue;
 					}
-					else if (canAOE(sk))
+					
+					L2Attackable targets = ((L2Attackable) obj);
+					if ((caster.getFactionId() != null) && !caster.getFactionId().equals(targets.getFactionId()))
 					{
-						if ((sk.getTargetType() == L2TargetType.AURA) || (sk.getTargetType() == L2TargetType.BEHIND_AURA) || (sk.getTargetType() == L2TargetType.FRONT_AURA) || (sk.getTargetType() == L2TargetType.AURA_CORPSE_MOB))
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
-						if (((sk.getTargetType() == L2TargetType.AREA) || (sk.getTargetType() == L2TargetType.BEHIND_AREA) || (sk.getTargetType() == L2TargetType.FRONT_AREA)) && GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
-						{
-							clientStopMoving(null);
-							caster.doCast(sk);
-							return true;
-						}
+						continue;
 					}
-					else if (sk.getTargetType() == L2TargetType.ONE)
+					if (Rnd.get(100) < 10)
 					{
-						L2Character target = effectTargetReconsider(sk, false);
-						if (target != null)
+						if (GeoData.getInstance().canSeeTarget(caster, targets))
 						{
 							clientStopMoving(null);
+							caster.setTarget(obj);
 							caster.doCast(sk);
 							return true;
 						}
 					}
 				}
-				
-				if (sk.hasEffectType(L2EffectType.RESURRECTION))
+			}
+			else if (isParty(sk))
+			{
+				for (L2Character obj : caster.getKnownList().getKnownCharactersInRadius(sk.getAffectRange() + caster.getTemplate().getCollisionRadius()))
 				{
-					if (!isParty(sk))
+					if (!(obj instanceof L2Attackable))
 					{
-						if (caster.isMinion() && (sk.getTargetType() != L2TargetType.SELF))
-						{
-							L2Character leader = caster.getLeader();
-							if ((leader != null) && leader.isDead())
-							{
-								if (!Util.checkIfInRange((sk.getCastRange() + caster.getTemplate().getCollisionRadius() + leader.getTemplate().getCollisionRadius()), caster, leader, false) && !isParty(sk) && !caster.isMovementDisabled())
-								{
-									moveToPawn(leader, sk.getCastRange() + caster.getTemplate().getCollisionRadius() + leader.getTemplate().getCollisionRadius());
-								}
-							}
-							if (GeoData.getInstance().canSeeTarget(caster, leader))
-							{
-								clientStopMoving(null);
-								caster.setTarget(leader);
-								caster.doCast(sk);
-								return true;
-							}
-						}
-						
-						for (L2Character obj : caster.getKnownList().getKnownCharactersInRadius(sk.getCastRange() + caster.getTemplate().getCollisionRadius()))
-						{
-							if (!(obj instanceof L2Attackable) || !obj.isDead())
-							{
-								continue;
-							}
-							
-							L2Attackable targets = ((L2Attackable) obj);
-							if ((caster.getFactionId() != null) && !caster.getFactionId().equals(targets.getFactionId()))
-							{
-								continue;
-							}
-							if (Rnd.get(100) < 10)
-							{
-								if (GeoData.getInstance().canSeeTarget(caster, targets))
-								{
-									clientStopMoving(null);
-									caster.setTarget(obj);
-									caster.doCast(sk);
-									return true;
-								}
-							}
-						}
+						continue;
 					}
-					else if (isParty(sk))
+					L2Npc targets = ((L2Npc) obj);
+					if ((caster.getFactionId() != null) && caster.getFactionId().equals(targets.getFactionId()))
 					{
-						for (L2Character obj : caster.getKnownList().getKnownCharactersInRadius(sk.getAffectRange() + caster.getTemplate().getCollisionRadius()))
+						if ((obj.getCurrentHp() < obj.getMaxHp()) && (Rnd.get(100) <= 20))
 						{
-							if (!(obj instanceof L2Attackable))
-							{
-								continue;
-							}
-							L2Npc targets = ((L2Npc) obj);
-							if ((caster.getFactionId() != null) && caster.getFactionId().equals(targets.getFactionId()))
-							{
-								if ((obj.getCurrentHp() < obj.getMaxHp()) && (Rnd.get(100) <= 20))
-								{
-									clientStopMoving(null);
-									caster.setTarget(caster);
-									caster.doCast(sk);
-									return true;
-								}
-							}
+							clientStopMoving(null);
+							caster.setTarget(caster);
+							caster.doCast(sk);
+							return true;
 						}
 					}
 				}
-				
-				if (!canAura(sk))
-				{
-					
-					if (GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
-					{
-						clientStopMoving(null);
-						caster.doCast(sk);
-						return true;
-					}
-					
-					L2Character target = skillTargetReconsider(sk);
-					if (target != null)
-					{
-						clientStopMoving(null);
-						L2Object targets = attackTarget;
-						caster.setTarget(target);
-						caster.doCast(sk);
-						caster.setTarget(targets);
-						return true;
-					}
-				}
-				else
-				{
-					clientStopMoving(null);
-					caster.doCast(sk);
-					return true;
-				}
-				break;
 			}
 		}
+		
+		if (!canAura(sk))
+		{
+			
+			if (GeoData.getInstance().canSeeTarget(caster, attackTarget) && !attackTarget.isDead() && (dist2 <= srange))
+			{
+				clientStopMoving(null);
+				caster.doCast(sk);
+				return true;
+			}
+			
+			L2Character target = skillTargetReconsider(sk);
+			if (target != null)
+			{
+				clientStopMoving(null);
+				L2Object targets = attackTarget;
+				caster.setTarget(target);
+				caster.doCast(sk);
+				caster.setTarget(targets);
+				return true;
+			}
+		}
+		else
+		{
+			clientStopMoving(null);
+			caster.doCast(sk);
+			return true;
+		}
 		return false;
 	}
 	

+ 71 - 64
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2CharacterAI.java

@@ -55,6 +55,7 @@ import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.model.items.type.L2WeaponType;
 import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.skills.L2Skill;
+import com.l2jserver.gameserver.model.skills.L2SkillType;
 import com.l2jserver.gameserver.model.skills.targets.L2TargetType;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
@@ -1281,75 +1282,81 @@ public class L2CharacterAI extends AbstractAI
 				}
 				int castRange = sk.getCastRange();
 				boolean hasLongRangeDamageSkill = false;
-				switch (sk.getSkillType())
+				
+				if ((sk.getSkillType() == L2SkillType.NOTDONE) || (sk.getSkillType() == L2SkillType.COREDONE))
+				{
+					continue;
+				}
+				else if (sk.isContinuous())
 				{
-					case BUFF:
+					if (!sk.isDebuff())
+					{
 						buffSkills.add(sk);
-						continue; // won't be considered something for fighting
-					case NOTDONE:
-					case COREDONE:
-						continue; // won't be considered something for fighting
-					default:
-						if (sk.isDebuff())
-						{
-							debuffSkills.add(sk);
-						}
-						else if (sk.hasEffectType(L2EffectType.DISPEL))
-						{
-							cancelSkills.add(sk);
-						}
-						else if (sk.hasEffectType(L2EffectType.HEAL, L2EffectType.HEAL_PERCENT))
-						{
-							healSkills.add(sk);
-							hasHealOrResurrect = true;
-						}
-						else if (sk.hasEffectType(L2EffectType.SLEEP))
-						{
-							sleepSkills.add(sk);
-						}
-						else if (sk.hasEffectType(L2EffectType.STUN, L2EffectType.PARALYZE))
-						{
-							// hardcoding petrification until improvements are made to
-							// EffectTemplate... petrification is totally different for
-							// AI than paralyze
-							switch (sk.getId())
-							{
-								case 367:
-								case 4111:
-								case 4383:
-								case 4616:
-								case 4578:
-									sleepSkills.add(sk);
-									break;
-								default:
-									generalDisablers.add(sk);
-									break;
-							}
-						}
-						else if (sk.hasEffectType(L2EffectType.ROOT))
-						{
-							rootSkills.add(sk);
-						}
-						else if (sk.hasEffectType(L2EffectType.FEAR))
-						{
-							debuffSkills.add(sk);
-						}
-						else if (sk.hasEffectType(L2EffectType.MUTE))
-						{
-							muteSkills.add(sk);
-						}
-						else if (sk.hasEffectType(L2EffectType.RESURRECTION))
-						{
-							resurrectSkills.add(sk);
-							hasHealOrResurrect = true;
-						}
-						else
+					}
+					else
+					{
+						debuffSkills.add(sk);
+					}
+					continue;
+				}
+				else
+				{
+					if (sk.hasEffectType(L2EffectType.DISPEL))
+					{
+						cancelSkills.add(sk);
+					}
+					else if (sk.hasEffectType(L2EffectType.HEAL, L2EffectType.HEAL_PERCENT))
+					{
+						healSkills.add(sk);
+						hasHealOrResurrect = true;
+					}
+					else if (sk.hasEffectType(L2EffectType.SLEEP))
+					{
+						sleepSkills.add(sk);
+					}
+					else if (sk.hasEffectType(L2EffectType.STUN, L2EffectType.PARALYZE))
+					{
+						// hardcoding petrification until improvements are made to
+						// EffectTemplate... petrification is totally different for
+						// AI than paralyze
+						switch (sk.getId())
 						{
-							generalSkills.add(sk);
-							hasLongRangeDamageSkill = true;
+							case 367:
+							case 4111:
+							case 4383:
+							case 4616:
+							case 4578:
+								sleepSkills.add(sk);
+								break;
+							default:
+								generalDisablers.add(sk);
+								break;
 						}
-						break;
+					}
+					else if (sk.hasEffectType(L2EffectType.ROOT))
+					{
+						rootSkills.add(sk);
+					}
+					else if (sk.hasEffectType(L2EffectType.FEAR))
+					{
+						debuffSkills.add(sk);
+					}
+					else if (sk.hasEffectType(L2EffectType.MUTE))
+					{
+						muteSkills.add(sk);
+					}
+					else if (sk.hasEffectType(L2EffectType.RESURRECTION))
+					{
+						resurrectSkills.add(sk);
+						hasHealOrResurrect = true;
+					}
+					else
+					{
+						generalSkills.add(sk);
+						hasLongRangeDamageSkill = true;
+					}
 				}
+				
 				if (castRange > 70)
 				{
 					hasLongRangeSkills = true;

+ 4 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2FortSiegeGuardAI.java

@@ -43,7 +43,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.skills.L2Skill;
-import com.l2jserver.gameserver.model.skills.L2SkillType;
 import com.l2jserver.gameserver.util.Util;
 import com.l2jserver.util.Rnd;
 
@@ -610,7 +609,7 @@ public class L2FortSiegeGuardAI extends L2CharacterAI implements Runnable
 				{
 					
 					L2Object OldTarget = _actor.getTarget();
-					if ((sk.getSkillType() == L2SkillType.BUFF) || (sk.hasEffectType(L2EffectType.HEAL)))
+					if ((sk.isContinuous() && !sk.isDebuff()) || (sk.hasEffectType(L2EffectType.HEAL)))
 					{
 						boolean useSkillSelf = true;
 						if ((sk.hasEffectType(L2EffectType.HEAL)) && (_actor.getCurrentHp() > (int) (_actor.getMaxHp() / 1.5)))
@@ -619,7 +618,7 @@ public class L2FortSiegeGuardAI extends L2CharacterAI implements Runnable
 							break;
 						}
 						
-						if ((sk.getSkillType() == L2SkillType.BUFF) && _actor.isAffectedBySkill(sk.getId()))
+						if ((sk.isContinuous() && !sk.isDebuff()) && _actor.isAffectedBySkill(sk.getId()))
 						{
 							useSkillSelf = false;
 						}
@@ -755,7 +754,7 @@ public class L2FortSiegeGuardAI extends L2CharacterAI implements Runnable
 					if (((castRange * castRange) >= dist_2) && !sk.isPassive() && (_actor.getCurrentMp() >= _actor.getStat().getMpConsume(sk)) && !_actor.isSkillDisabled(sk))
 					{
 						L2Object OldTarget = _actor.getTarget();
-						if ((sk.getSkillType() == L2SkillType.BUFF) || (sk.hasEffectType(L2EffectType.HEAL)))
+						if ((sk.isContinuous() && !sk.isDebuff()) || (sk.hasEffectType(L2EffectType.HEAL)))
 						{
 							boolean useSkillSelf = true;
 							if ((sk.hasEffectType(L2EffectType.HEAL)) && (_actor.getCurrentHp() > (int) (_actor.getMaxHp() / 1.5)))
@@ -764,7 +763,7 @@ public class L2FortSiegeGuardAI extends L2CharacterAI implements Runnable
 								break;
 							}
 							
-							if ((sk.getSkillType() == L2SkillType.BUFF) && _actor.isAffectedBySkill(sk.getId()))
+							if ((sk.isContinuous() && !sk.isDebuff()) && _actor.isAffectedBySkill(sk.getId()))
 							{
 								useSkillSelf = false;
 							}

+ 4 - 5
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2SiegeGuardAI.java

@@ -41,7 +41,6 @@ import com.l2jserver.gameserver.model.actor.instance.L2NpcInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.skills.L2Skill;
-import com.l2jserver.gameserver.model.skills.L2SkillType;
 import com.l2jserver.gameserver.util.Util;
 import com.l2jserver.util.Rnd;
 
@@ -582,7 +581,7 @@ public class L2SiegeGuardAI extends L2CharacterAI implements Runnable
 				{
 					
 					L2Object OldTarget = _actor.getTarget();
-					if ((sk.getSkillType() == L2SkillType.BUFF) || (sk.hasEffectType(L2EffectType.HEAL)))
+					if ((sk.isContinuous() && !sk.isDebuff()) || (sk.hasEffectType(L2EffectType.HEAL)))
 					{
 						boolean useSkillSelf = true;
 						if ((sk.hasEffectType(L2EffectType.HEAL)) && (_actor.getCurrentHp() > (int) (_actor.getMaxHp() / 1.5)))
@@ -591,7 +590,7 @@ public class L2SiegeGuardAI extends L2CharacterAI implements Runnable
 							break;
 						}
 						
-						if ((sk.getSkillType() == L2SkillType.BUFF) && _actor.isAffectedBySkill(sk.getId()))
+						if ((sk.isContinuous() && !sk.isDebuff()) && _actor.isAffectedBySkill(sk.getId()))
 						{
 							useSkillSelf = false;
 						}
@@ -723,7 +722,7 @@ public class L2SiegeGuardAI extends L2CharacterAI implements Runnable
 					if (((castRange * castRange) >= dist_2) && !sk.isPassive() && (_actor.getCurrentMp() >= _actor.getStat().getMpConsume(sk)) && !_actor.isSkillDisabled(sk))
 					{
 						L2Object OldTarget = _actor.getTarget();
-						if ((sk.getSkillType() == L2SkillType.BUFF) || (sk.hasEffectType(L2EffectType.HEAL)))
+						if ((sk.isContinuous() && !sk.isDebuff()) || (sk.hasEffectType(L2EffectType.HEAL)))
 						{
 							boolean useSkillSelf = true;
 							if ((sk.hasEffectType(L2EffectType.HEAL)) && (_actor.getCurrentHp() > (int) (_actor.getMaxHp() / 1.5)))
@@ -732,7 +731,7 @@ public class L2SiegeGuardAI extends L2CharacterAI implements Runnable
 								break;
 							}
 							
-							if ((sk.getSkillType() == L2SkillType.BUFF) && _actor.isAffectedBySkill(sk.getId()))
+							if ((sk.isContinuous() && !sk.isDebuff()) && _actor.isAffectedBySkill(sk.getId()))
 							{
 								useSkillSelf = false;
 							}

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

@@ -1671,17 +1671,16 @@ public abstract class L2Character extends L2Object implements ISkillsHolder, IDe
 					return;
 				}
 				
-				switch (skill.getSkillType())
+				if (skill.isContinuous() && !skill.isDebuff())
 				{
-					case BUFF:
+					doit = true;
+				}
+				else if (skill.getSkillType() == L2SkillType.DUMMY)
+				{
+					if (skill.hasEffectType(L2EffectType.CPHEAL, L2EffectType.HEAL))
+					{
 						doit = true;
-						break;
-					case DUMMY:
-						if (skill.hasEffectType(L2EffectType.CPHEAL, L2EffectType.HEAL))
-						{
-							doit = true;
-						}
-						break;
+					}
 				}
 				
 				if (doit)

+ 26 - 26
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2BabyPetInstance.java

@@ -37,6 +37,7 @@ import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.L2Skill;
+import com.l2jserver.gameserver.model.skills.L2SkillType;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 import com.l2jserver.util.Rnd;
@@ -90,43 +91,42 @@ public final class L2BabyPetInstance extends L2PetInstance
 					continue;
 				}
 				
-				switch (skill.getSkillType())
+				if (skill.isContinuous() && !skill.isDebuff())
 				{
-					case BUFF:
-						if (_buffs == null)
-						{
-							_buffs = new FastList<>();
-						}
-						_buffs.add(new SkillHolder(skill));
-						break;
-					case DUMMY:
-						if (skill.hasEffectType(L2EffectType.MANAHEAL_BY_LEVEL))
+					if (_buffs == null)
+					{
+						_buffs = new FastList<>();
+					}
+					_buffs.add(new SkillHolder(skill));
+				}
+				else if (skill.getSkillType() == L2SkillType.DUMMY)
+				{
+					if (skill.hasEffectType(L2EffectType.MANAHEAL_BY_LEVEL))
+					{
+						_recharge = new SkillHolder(skill);
+					}
+					else if (skill.hasEffectType(L2EffectType.HEAL))
+					{
+						if (healPower == 0)
 						{
-							_recharge = new SkillHolder(skill);
+							// set both heal types to the same skill
+							_majorHeal = new SkillHolder(skill);
+							_minorHeal = _majorHeal;
+							healPower = skill.getPower();
 						}
-						else if (skill.hasEffectType(L2EffectType.HEAL))
+						else
 						{
-							if (healPower == 0)
+							// another heal skill found - search for most powerful
+							if (skill.getPower() > healPower)
 							{
-								// set both heal types to the same skill
 								_majorHeal = new SkillHolder(skill);
-								_minorHeal = _majorHeal;
-								healPower = skill.getPower();
 							}
 							else
 							{
-								// another heal skill found - search for most powerful
-								if (skill.getPower() > healPower)
-								{
-									_majorHeal = new SkillHolder(skill);
-								}
-								else
-								{
-									_minorHeal = new SkillHolder(skill);
-								}
+								_minorHeal = new SkillHolder(skill);
 							}
 						}
-						break;
+					}
 				}
 			}
 		}

+ 2 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2TamedBeastInstance.java

@@ -36,7 +36,6 @@ import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
 import com.l2jserver.gameserver.model.skills.L2Skill;
-import com.l2jserver.gameserver.model.skills.L2SkillType;
 import com.l2jserver.gameserver.network.serverpackets.AbstractNpcInfo;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
 import com.l2jserver.gameserver.network.serverpackets.SocialAction;
@@ -277,7 +276,7 @@ public final class L2TamedBeastInstance extends L2FeedableBeastInstance
 				for (L2Skill skill : getTemplate().getSkills().values())
 				{
 					// if the skill is a buff, check if the owner has it already [ owner.getEffect(L2Skill skill) ]
-					if (skill.getSkillType() == L2SkillType.BUFF)
+					if (skill.isContinuous() && !skill.isDebuff())
 					{
 						totalBuffsAvailable++;
 					}
@@ -540,7 +539,7 @@ public final class L2TamedBeastInstance extends L2FeedableBeastInstance
 			for (L2Skill skill : _tamedBeast.getTemplate().getSkills().values())
 			{
 				// if the skill is a buff, check if the owner has it already [ owner.getEffect(L2Skill skill) ]
-				if (skill.getSkillType() == L2SkillType.BUFF)
+				if (skill.isContinuous() && !skill.isDebuff())
 				{
 					if (i++ == rand)
 					{

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

@@ -41,6 +41,7 @@ import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.interfaces.IIdentifiable;
 import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.model.skills.L2Skill;
+import com.l2jserver.gameserver.model.skills.L2SkillType;
 
 /**
  * NPC template.
@@ -340,65 +341,68 @@ public final class L2NpcTemplate extends L2CharTemplate implements IIdentifiable
 			else
 			{
 				addGeneralSkill(skill);
-				switch (skill.getSkillType())
+				
+				if (skill.isContinuous())
 				{
-					case BUFF:
+					if (!skill.isDebuff())
+					{
 						addBuffSkill(skill);
-						break;
-					case DUMMY:
-						if (skill.isDebuff())
-						{
-							addDebuffSkill(skill);
-							addCOTSkill(skill);
-							addRangeSkill(skill);
-						}
-						else if (skill.hasEffectType(L2EffectType.DISPEL))
-						{
-							addNegativeSkill(skill);
-							addRangeSkill(skill);
-						}
-						else if (skill.hasEffectType(L2EffectType.HEAL, L2EffectType.HEAL_PERCENT))
-						{
-							addHealSkill(skill);
-						}
-						else if (skill.hasEffectType(L2EffectType.PHYSICAL_ATTACK, L2EffectType.PHYSICAL_ATTACK_HP_LINK, L2EffectType.FATAL_BLOW, L2EffectType.ENERGY_ATTACK, L2EffectType.MAGICAL_ATTACK_MP, L2EffectType.MAGICAL_ATTACK, L2EffectType.DEATH_LINK, L2EffectType.HP_DRAIN))
-						{
-							addAtkSkill(skill);
-							addUniversalSkill(skill);
-							addRangeSkill(skill);
-						}
-						else if (skill.hasEffectType(L2EffectType.SLEEP))
-						{
-							addImmobiliseSkill(skill);
-						}
-						else if (skill.hasEffectType(L2EffectType.STUN, L2EffectType.ROOT))
-						{
-							addImmobiliseSkill(skill);
-							addRangeSkill(skill);
-						}
-						else if (skill.hasEffectType(L2EffectType.MUTE, L2EffectType.FEAR))
-						{
-							addCOTSkill(skill);
-							addRangeSkill(skill);
-						}
-						else if (skill.hasEffectType(L2EffectType.PARALYZE))
-						{
-							addImmobiliseSkill(skill);
-							addRangeSkill(skill);
-						}
-						else if (skill.hasEffectType(L2EffectType.DMG_OVER_TIME, L2EffectType.DMG_OVER_TIME_PERCENT))
-						{
-							addRangeSkill(skill);
-						}
-						else if (skill.hasEffectType(L2EffectType.RESURRECTION))
-						{
-							addResSkill(skill);
-						}
-						else
-						{
-							addUniversalSkill(skill);
-						}
-						break;
+					}
+					else
+					{
+						addDebuffSkill(skill);
+						addCOTSkill(skill);
+						addRangeSkill(skill);
+					}
+				}
+				else if (skill.getSkillType() == L2SkillType.DUMMY)
+				{
+					if (skill.hasEffectType(L2EffectType.DISPEL))
+					{
+						addNegativeSkill(skill);
+						addRangeSkill(skill);
+					}
+					else if (skill.hasEffectType(L2EffectType.HEAL, L2EffectType.HEAL_PERCENT))
+					{
+						addHealSkill(skill);
+					}
+					else if (skill.hasEffectType(L2EffectType.PHYSICAL_ATTACK, L2EffectType.PHYSICAL_ATTACK_HP_LINK, L2EffectType.FATAL_BLOW, L2EffectType.ENERGY_ATTACK, L2EffectType.MAGICAL_ATTACK_MP, L2EffectType.MAGICAL_ATTACK, L2EffectType.DEATH_LINK, L2EffectType.HP_DRAIN))
+					{
+						addAtkSkill(skill);
+						addUniversalSkill(skill);
+						addRangeSkill(skill);
+					}
+					else if (skill.hasEffectType(L2EffectType.SLEEP))
+					{
+						addImmobiliseSkill(skill);
+					}
+					else if (skill.hasEffectType(L2EffectType.STUN, L2EffectType.ROOT))
+					{
+						addImmobiliseSkill(skill);
+						addRangeSkill(skill);
+					}
+					else if (skill.hasEffectType(L2EffectType.MUTE, L2EffectType.FEAR))
+					{
+						addCOTSkill(skill);
+						addRangeSkill(skill);
+					}
+					else if (skill.hasEffectType(L2EffectType.PARALYZE))
+					{
+						addImmobiliseSkill(skill);
+						addRangeSkill(skill);
+					}
+					else if (skill.hasEffectType(L2EffectType.DMG_OVER_TIME, L2EffectType.DMG_OVER_TIME_PERCENT))
+					{
+						addRangeSkill(skill);
+					}
+					else if (skill.hasEffectType(L2EffectType.RESURRECTION))
+					{
+						addResSkill(skill);
+					}
+					else
+					{
+						addUniversalSkill(skill);
+					}
 				}
 			}
 		}

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

@@ -56,7 +56,6 @@ public enum L2SkillType
 	SUMMON(L2SkillSummon.class),
 	FEED_PET,
 	
-	BUFF,
 	DETECT_TRAP,
 	REMOVE_TRAP,
 	

+ 1 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/RequestMagicSkillUse.java

@@ -23,7 +23,6 @@ import com.l2jserver.gameserver.ai.CtrlIntention;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.skills.L2Skill;
-import com.l2jserver.gameserver.model.skills.L2SkillType;
 import com.l2jserver.gameserver.model.skills.targets.L2TargetType;
 import com.l2jserver.gameserver.network.SystemMessageId;
 import com.l2jserver.gameserver.network.serverpackets.ActionFailed;
@@ -97,7 +96,7 @@ public final class RequestMagicSkillUse extends L2GameClientPacket
 		activeChar.useMagic(skill, _ctrlPressed, _shiftPressed);
 		
 		// Stop if use self-buff (except if on AirShip or Boat).
-		if (((skill.getSkillType() == L2SkillType.BUFF) && (skill.getTargetType() == L2TargetType.SELF)) && (!activeChar.isInAirShip() || !activeChar.isInBoat()))
+		if ((skill.isContinuous() && !skill.isDebuff() && (skill.getTargetType() == L2TargetType.SELF)) && (!activeChar.isInAirShip() || !activeChar.isInBoat()))
 		{
 			activeChar.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, activeChar.getLocation());
 		}