2
0
JIV 15 жил өмнө
parent
commit
886a4fbc17

+ 9 - 0
L2_GameServer/java/com/l2jserver/gameserver/ai/AbstractAI.java

@@ -884,4 +884,13 @@ abstract class AbstractAI implements Ctrl
 	{
 		stopFollow();
 	}
+	
+	@Override
+	public String toString()
+	{
+		if (_actor == null)
+			return "Actor: null";
+		else
+			return "Actor: "+_actor;
+	}
 }

+ 140 - 136
L2_GameServer/java/com/l2jserver/gameserver/ai/L2AttackableAI.java

@@ -1672,76 +1672,114 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 				if (_actor.isMoving())
 					dist = dist - 50;
 			}
-		}
-		catch (NullPointerException e)
-		{
-			setIntention(AI_INTENTION_ACTIVE);
-			return;
-		}
-		
-		//Check if activeChar has any skill
-		if (_skillrender.hasSkill())
-		{
-			//-------------------------------------------------------------
-			//Try to stop the target or disable the target as priority
-			int random = Rnd.get(100);
-			if (_skillrender.hasImmobiliseSkill() && !getAttackTarget().isImmobilized() && random < 2)
+			
+			//Check if activeChar has any skill
+			if (_skillrender.hasSkill())
 			{
-				for (L2Skill sk : _skillrender._immobiliseskills)
+				//-------------------------------------------------------------
+				//Try to stop the target or disable the target as priority
+				int random = Rnd.get(100);
+				if (_skillrender.hasImmobiliseSkill() && !getAttackTarget().isImmobilized() && random < 2)
 				{
-					if (sk.getMpConsume() >= _actor.getCurrentMp() || _actor.isSkillDisabled(sk) || (sk.getCastRange() + _actor.getTemplate().collisionRadius + getAttackTarget().getTemplate().collisionRadius <= dist2 && !canAura(sk)) || (sk.isMagic() && _actor.isMuted()) || (!sk.isMagic() && _actor.isPhysicalMuted()))
-					{
-						continue;
-					}
-					if (!GeoData.getInstance().canSeeTarget(_actor, getAttackTarget()))
-						continue;
-					if (getAttackTarget().getFirstEffect(sk) == null)
+					for (L2Skill sk : _skillrender._immobiliseskills)
 					{
-						clientStopMoving(null);
-						//L2Object target = getAttackTarget();
-						//_actor.setTarget(_actor);
-						_actor.doCast(sk);
-						//_actor.setTarget(target);
-						return;
+						if (sk.getMpConsume() >= _actor.getCurrentMp() || _actor.isSkillDisabled(sk) || (sk.getCastRange() + _actor.getTemplate().collisionRadius + getAttackTarget().getTemplate().collisionRadius <= dist2 && !canAura(sk)) || (sk.isMagic() && _actor.isMuted()) || (!sk.isMagic() && _actor.isPhysicalMuted()))
+						{
+							continue;
+						}
+						if (!GeoData.getInstance().canSeeTarget(_actor, getAttackTarget()))
+							continue;
+						if (getAttackTarget().getFirstEffect(sk) == null)
+						{
+							clientStopMoving(null);
+							//L2Object target = getAttackTarget();
+							//_actor.setTarget(_actor);
+							_actor.doCast(sk);
+							//_actor.setTarget(target);
+							return;
+						}
 					}
 				}
-			}
-			//-------------------------------------------------------------
-			//Same as Above, but with Mute/FEAR etc....
-			if (_skillrender.hasCOTSkill() && random < 5)
-			{
-				for (L2Skill sk : _skillrender._cotskills)
+				//-------------------------------------------------------------
+				//Same as Above, but with Mute/FEAR etc....
+				if (_skillrender.hasCOTSkill() && random < 5)
 				{
-					if (sk.getMpConsume() >= _actor.getCurrentMp() || _actor.isSkillDisabled(sk) || (sk.getCastRange() + _actor.getTemplate().collisionRadius + getAttackTarget().getTemplate().collisionRadius <= dist2 && !canAura(sk)) || (sk.isMagic() && _actor.isMuted()) || (!sk.isMagic() && _actor.isPhysicalMuted()))
+					for (L2Skill sk : _skillrender._cotskills)
 					{
-						continue;
+						if (sk.getMpConsume() >= _actor.getCurrentMp() || _actor.isSkillDisabled(sk) || (sk.getCastRange() + _actor.getTemplate().collisionRadius + getAttackTarget().getTemplate().collisionRadius <= dist2 && !canAura(sk)) || (sk.isMagic() && _actor.isMuted()) || (!sk.isMagic() && _actor.isPhysicalMuted()))
+						{
+							continue;
+						}
+						if (!GeoData.getInstance().canSeeTarget(_actor, getAttackTarget()))
+							continue;
+						if (getAttackTarget().getFirstEffect(sk) == null)
+						{
+							clientStopMoving(null);
+							//L2Object target = getAttackTarget();
+							//_actor.setTarget(_actor);
+							_actor.doCast(sk);
+							//_actor.setTarget(target);
+							return;
+						}
 					}
-					if (!GeoData.getInstance().canSeeTarget(_actor, getAttackTarget()))
-						continue;
-					if (getAttackTarget().getFirstEffect(sk) == null)
+				}
+				//-------------------------------------------------------------
+				if (_skillrender.hasDebuffSkill() && random < 8)
+				{
+					for (L2Skill sk : _skillrender._debuffskills)
 					{
-						clientStopMoving(null);
-						//L2Object target = getAttackTarget();
-						//_actor.setTarget(_actor);
-						_actor.doCast(sk);
-						//_actor.setTarget(target);
-						return;
+						if (sk.getMpConsume() >= _actor.getCurrentMp() || _actor.isSkillDisabled(sk) || (sk.getCastRange() + _actor.getTemplate().collisionRadius + getAttackTarget().getTemplate().collisionRadius <= dist2 && !canAura(sk)) || (sk.isMagic() && _actor.isMuted()) || (!sk.isMagic() && _actor.isPhysicalMuted()))
+						{
+							continue;
+						}
+						if (!GeoData.getInstance().canSeeTarget(_actor, getAttackTarget()))
+							continue;
+						if (getAttackTarget().getFirstEffect(sk) == null)
+						{
+							clientStopMoving(null);
+							//L2Object target = getAttackTarget();
+							//_actor.setTarget(_actor);
+							_actor.doCast(sk);
+							//_actor.setTarget(target);
+							return;
+						}
 					}
 				}
-			}
-			//-------------------------------------------------------------
-			if (_skillrender.hasDebuffSkill() && random < 8)
-			{
-				for (L2Skill sk : _skillrender._debuffskills)
+				//-------------------------------------------------------------
+				//Some side effect skill like CANCEL or NEGATE
+				if (_skillrender.hasNegativeSkill() && random < 9)
 				{
-					if (sk.getMpConsume() >= _actor.getCurrentMp() || _actor.isSkillDisabled(sk) || (sk.getCastRange() + _actor.getTemplate().collisionRadius + getAttackTarget().getTemplate().collisionRadius <= dist2 && !canAura(sk)) || (sk.isMagic() && _actor.isMuted()) || (!sk.isMagic() && _actor.isPhysicalMuted()))
+					for (L2Skill sk : _skillrender._negativeskills)
 					{
-						continue;
+						if (sk.getMpConsume() >= _actor.getCurrentMp() || _actor.isSkillDisabled(sk) || (sk.getCastRange() + _actor.getTemplate().collisionRadius + getAttackTarget().getTemplate().collisionRadius <= dist2 && !canAura(sk)) || (sk.isMagic() && _actor.isMuted()) || (!sk.isMagic() && _actor.isPhysicalMuted()))
+						{
+							continue;
+						}
+						if (!GeoData.getInstance().canSeeTarget(_actor, getAttackTarget()))
+							continue;
+						if (getAttackTarget().getFirstEffect(L2EffectType.BUFF) != null)
+						{
+							clientStopMoving(null);
+							//L2Object target = getAttackTarget();
+							//_actor.setTarget(_actor);
+							_actor.doCast(sk);
+							//_actor.setTarget(target);
+							return;
+						}
 					}
-					if (!GeoData.getInstance().canSeeTarget(_actor, getAttackTarget()))
-						continue;
-					if (getAttackTarget().getFirstEffect(sk) == null)
+				}
+				//-------------------------------------------------------------
+				//Start ATK SKILL when nothing can be done
+				if (_skillrender.hasAtkSkill())
+				{
+					for (L2Skill sk : _skillrender._atkskills)
 					{
+						if (sk.getMpConsume() >= _actor.getCurrentMp() || _actor.isSkillDisabled(sk) || (sk.getCastRange() + _actor.getTemplate().collisionRadius + getAttackTarget().getTemplate().collisionRadius <= dist2 && !canAura(sk)) || (sk.isMagic() && _actor.isMuted()) || (!sk.isMagic() && _actor.isPhysicalMuted()))
+						{
+							continue;
+						}
+						if (!GeoData.getInstance().canSeeTarget(_actor, getAttackTarget()))
+							continue;
 						clientStopMoving(null);
 						//L2Object target = getAttackTarget();
 						//_actor.setTarget(_actor);
@@ -1750,106 +1788,68 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 						return;
 					}
 				}
-			}
-			//-------------------------------------------------------------
-			//Some side effect skill like CANCEL or NEGATE
-			if (_skillrender.hasNegativeSkill() && random < 9)
-			{
-				for (L2Skill sk : _skillrender._negativeskills)
+				//-------------------------------------------------------------
+				//if there is no ATK skill to use, then try Universal skill
+				/*
+				if(_skillrender.hasUniversalSkill())
 				{
-					if (sk.getMpConsume() >= _actor.getCurrentMp() || _actor.isSkillDisabled(sk) || (sk.getCastRange() + _actor.getTemplate().collisionRadius + getAttackTarget().getTemplate().collisionRadius <= dist2 && !canAura(sk)) || (sk.isMagic() && _actor.isMuted()) || (!sk.isMagic() && _actor.isPhysicalMuted()))
-					{
-						continue;
-					}
-					if (!GeoData.getInstance().canSeeTarget(_actor, getAttackTarget()))
-						continue;
-					if (getAttackTarget().getFirstEffect(L2EffectType.BUFF) != null)
+					for(L2Skill sk:_skillrender._universalskills)
 					{
+						if(sk.getMpConsume()>=_actor.getCurrentMp()
+								|| _actor.isSkillDisabled(sk.getId())
+								||(sk.getCastRange()+ _actor.getTemplate().collisionRadius + getAttackTarget().getTemplate().collisionRadius <= dist2 && !canAura(sk))
+								||(sk.isMagic()&&_actor.isMuted())
+								||(!sk.isMagic()&&_actor.isPhysicalMuted()))
+						{
+							continue;
+						}
+						if(!GeoData.getInstance().canSeeTarget(_actor,getAttackTarget()))
+							continue;
 						clientStopMoving(null);
-						//L2Object target = getAttackTarget();
+						L2Object target = getAttackTarget();
 						//_actor.setTarget(_actor);
 						_actor.doCast(sk);
 						//_actor.setTarget(target);
 						return;
 					}
 				}
+
+				*/
 			}
-			//-------------------------------------------------------------
-			//Start ATK SKILL when nothing can be done
-			if (_skillrender.hasAtkSkill())
+			//timepass = timepass + 1;
+			if (_actor.isMovementDisabled())
 			{
-				for (L2Skill sk : _skillrender._atkskills)
-				{
-					if (sk.getMpConsume() >= _actor.getCurrentMp() || _actor.isSkillDisabled(sk) || (sk.getCastRange() + _actor.getTemplate().collisionRadius + getAttackTarget().getTemplate().collisionRadius <= dist2 && !canAura(sk)) || (sk.isMagic() && _actor.isMuted()) || (!sk.isMagic() && _actor.isPhysicalMuted()))
-					{
-						continue;
-					}
-					if (!GeoData.getInstance().canSeeTarget(_actor, getAttackTarget()))
-						continue;
-					clientStopMoving(null);
-					//L2Object target = getAttackTarget();
-					//_actor.setTarget(_actor);
-					_actor.doCast(sk);
-					//_actor.setTarget(target);
-					return;
-				}
+				//timepass = 0;
+				targetReconsider();
+				
+				return;
 			}
-			//-------------------------------------------------------------
-			//if there is no ATK skill to use, then try Universal skill
-			/*
-			if(_skillrender.hasUniversalSkill())
+			//else if(timepass>=5)
+			//{
+			//	timepass = 0;
+			//	AggroReconsider();
+			//	return;
+			//}
+			
+			if (dist > range || !GeoData.getInstance().canSeeTarget(_actor, getAttackTarget()))
 			{
-				for(L2Skill sk:_skillrender._universalskills)
-				{
-					if(sk.getMpConsume()>=_actor.getCurrentMp()
-							|| _actor.isSkillDisabled(sk.getId())
-							||(sk.getCastRange()+ _actor.getTemplate().collisionRadius + getAttackTarget().getTemplate().collisionRadius <= dist2 && !canAura(sk))
-							||(sk.isMagic()&&_actor.isMuted())
-							||(!sk.isMagic()&&_actor.isPhysicalMuted()))
-					{
-						continue;
-					}
-					if(!GeoData.getInstance().canSeeTarget(_actor,getAttackTarget()))
-						continue;
-					clientStopMoving(null);
-					L2Object target = getAttackTarget();
-					//_actor.setTarget(_actor);
-					_actor.doCast(sk);
-					//_actor.setTarget(target);
-					return;
-				}
+				if (getAttackTarget().isMoving())
+					range -= 100;
+				if (range < 5)
+					range = 5;
+				moveToPawn(getAttackTarget(), range);
+				return;
+				
 			}
-
-			*/
-		}
-		//timepass = timepass + 1;
-		if (_actor.isMovementDisabled())
-		{
-			//timepass = 0;
-			targetReconsider();
 			
-			return;
+			melee(((L2Npc) _actor).getPrimaryAttack());
 		}
-		//else if(timepass>=5)
-		//{
-		//	timepass = 0;
-		//	AggroReconsider();
-		//	return;
-		//}
-		
-		if (dist > range || !GeoData.getInstance().canSeeTarget(_actor, getAttackTarget()))
+		catch (NullPointerException e)
 		{
-			if (getAttackTarget().isMoving())
-				range -= 100;
-			if (range < 5)
-				range = 5;
-			moveToPawn(getAttackTarget(), range);
+			setIntention(AI_INTENTION_ACTIVE);
+			_log.log(Level.WARNING, this+ " - failed executing movementDisable(): "+e.getMessage(),e);
 			return;
-			
 		}
-		
-		melee(((L2Npc) _actor).getPrimaryAttack());
-		return;
 	}
 	
 	private L2Character effectTargetReconsider(L2Skill sk, boolean positive)
@@ -2322,6 +2322,10 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 			else if (getIntention() == AI_INTENTION_ATTACK)
 				thinkAttack();
 		}
+		catch(Exception e)
+		{
+			_log.log(Level.WARNING, this+" -  onEvtThink() failed: "+e.getMessage(), e);
+		}
 		finally
 		{
 			// Stop thinking action