|
@@ -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
|