Fixed infinite attack speed exploit.

Contributed by Iris.
This commit is contained in:
MobiusDevelopment 2021-03-21 07:37:21 +00:00
parent f45ae159f3
commit b8316f9080
57 changed files with 418 additions and 266 deletions

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}

View File

@ -48,13 +48,6 @@ public class PetAttack implements IPlayerActionHandler
}
else if (pet.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (pet.isAttackingNow())
{
pet.abortAttack();
pet.abortCast();
}
pet.doAttack(player.getTarget());
}
}

View File

@ -37,13 +37,6 @@ public class ServitorAttack implements IPlayerActionHandler
{
if (summon.canAttack(player.getTarget(), ctrlPressed))
{
// Prevent spamming next target and attack to increase attack speed.
if (summon.isAttackingNow())
{
summon.abortAttack();
summon.abortCast();
}
summon.doAttack(player.getTarget());
}
}

View File

@ -44,6 +44,20 @@ public class SummonAI extends PlayableAI implements Runnable
private volatile boolean _isDefending;
private Future<?> _avoidTask = null;
// Fix: Infinite Atk. Spd. exploit
private IntentionCommand _nextIntention = null;
private void saveNextIntention(CtrlIntention intention, Object arg0, Object arg1)
{
_nextIntention = new IntentionCommand(intention, arg0, arg1);
}
@Override
public IntentionCommand getNextIntention()
{
return _nextIntention;
}
public SummonAI(Summon summon)
{
super(summon);
@ -111,6 +125,14 @@ public class SummonAI extends PlayableAI implements Runnable
}
clientStopMoving(null);
// Fix: Infinite Atk. Spd. exploit
if (_actor.isAttackingNow())
{
saveNextIntention(AI_INTENTION_ATTACK, attackTarget, null);
return;
}
_actor.doAutoAttack(attackTarget);
}