Addition of onHitTimer and HitTask rechargeShots parameter.

Thanks to Lito.
This commit is contained in:
MobiusDevelopment 2022-01-15 22:02:45 +00:00
parent 2842f85de0
commit ed4965f32e
4 changed files with 54 additions and 32 deletions

View File

@ -1236,7 +1236,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
}
// Create a new hit task with Medium priority
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk);
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, shld1, attack.hasSoulshot(), true), sAtk);
// Calculate and set the disable delay of the bow in function of the Attack Speed
_disableBowAttackEndTime = ((sAtk + reuse) / GameTimeTaskManager.MILLIS_IN_TICK) + GameTimeTaskManager.getInstance().getGameTicks();
@ -1306,7 +1306,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
}
// Create a new hit task with Medium priority
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk);
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, shld1, attack.hasSoulshot(), true), sAtk);
// Calculate and set the disable delay of the bow in function of the Attack Speed
_disableBowAttackEndTime = ((sAtk + reuse) / GameTimeTaskManager.MILLIS_IN_TICK) + GameTimeTaskManager.getInstance().getGameTicks();
@ -1377,17 +1377,17 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
}
// Create a new hit task with Medium priority for hit 1
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk / 2);
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, shld1, attack.hasSoulshot(), true), sAtk / 2);
// Create a new hit task with Medium priority for hit 2 with a higher delay
ThreadPool.schedule(new HitTask(this, target, damage2, crit2, miss2, attack.hasSoulshot(), shld2), sAtk);
ThreadPool.schedule(new HitTask(this, target, damage2, crit2, miss2, shld2, attack.hasSoulshot(), false), sAtk);
// Add those hits to the Server-Client packet Attack
attack.addHit(target, damage1, miss1, crit1, shld1);
attack.addHit(target, damage2, miss2, crit2, shld2);
// Return true if hit 1 or hit 2 isn't missed
return (!miss1 || !miss2);
return !miss1 || !miss2;
}
/**
@ -1407,7 +1407,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
private boolean doAttackHitByPole(Attack attack, Creature target, int sAtk)
{
// Perform the main target hit.
boolean hitted = doAttackHitSimple(attack, target, 100, sAtk);
boolean hitted = doAttackHitSimple(attack, target, 100, sAtk, true);
// H5 Changes: without Polearm Mastery (skill 216) max simultaneous attacks is 3 (1 by default + 2 in skill 3599).
int attackCountMax = (int) _stat.calcStat(Stat.ATTACK_COUNT_MAX, 1, null, null);
@ -1459,7 +1459,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
}
// Launch a simple attack against the additional target.
hitted |= doAttackHitSimple(attack, obj, attackpercent, sAtk);
hitted |= doAttackHitSimple(attack, obj, attackpercent, sAtk, false);
attackpercent /= 1.15;
if (--attackCountMax <= 0)
{
@ -1491,10 +1491,10 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
private boolean doAttackHitSimple(Attack attack, Creature target, int sAtk)
{
return doAttackHitSimple(attack, target, 100, sAtk);
return doAttackHitSimple(attack, target, 100, sAtk, true);
}
private boolean doAttackHitSimple(Attack attack, Creature target, double attackpercent, int sAtk)
private boolean doAttackHitSimple(Attack attack, Creature target, double attackpercent, int sAtk, boolean rechargeShots)
{
int damage1 = 0;
byte shld1 = 0;
@ -1521,7 +1521,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
}
// Create a new hit task with Medium priority
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk);
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, shld1, attack.hasSoulshot(), rechargeShots), sAtk);
// Add this hit to the Server-Client packet Attack
attack.addHit(target, damage1, miss1, crit1, shld1);
@ -4739,10 +4739,11 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
* @param damageValue Number of HP to reduce
* @param crit True if hit is critical
* @param miss True if hit is missed
* @param soulshot True if SoulShot are charged
* @param shld True if shield is efficient
* @param soulshot True if SoulShot are charged
* @param rechargeShots True if SoulShots are re-charged
*/
public void onHitTimer(Creature target, int damageValue, boolean crit, boolean miss, boolean soulshot, byte shld)
public void onHitTimer(Creature target, int damageValue, boolean crit, boolean miss, byte shld, boolean soulshot, boolean rechargeShots)
{
// If the attacker/target is dead or use fake death, notify the AI with EVT_CANCEL
// and send a Server->Client packet ActionFailed (if attacker is a Player)
@ -4763,7 +4764,10 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE, null);
// Some times attack is processed but target die before the hit
// So we need to recharge shot for next attack
rechargeShots(true, false);
if (rechargeShots)
{
rechargeShots(true, false);
}
getAI().notifyEvent(CtrlEvent.EVT_CANCEL);
sendPacket(ActionFailed.STATIC_PACKET);
return;
@ -4914,14 +4918,19 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
}
}
}
// Launch weapon onCritical Special ability effect if available
if (crit && (weapon != null))
{
weapon.castOnCriticalSkill(this, target);
}
}
// Recharge any active auto-soulshot tasks for current creature.
rechargeShots(true, false);
if (rechargeShots)
{
rechargeShots(true, false);
}
}
/**

View File

@ -38,8 +38,9 @@ public class HitTask implements Runnable
private final boolean _miss;
private final byte _shld;
private final boolean _soulshot;
private final boolean _rechargeShots;
public HitTask(Creature creature, Creature target, int damage, boolean crit, boolean miss, boolean soulshot, byte shld)
public HitTask(Creature creature, Creature target, int damage, boolean crit, boolean miss, byte shld, boolean soulshot, boolean rechargeShots)
{
_creature = creature;
_hitTarget = target;
@ -48,6 +49,7 @@ public class HitTask implements Runnable
_shld = shld;
_miss = miss;
_soulshot = soulshot;
_rechargeShots = rechargeShots;
}
@Override
@ -55,7 +57,7 @@ public class HitTask implements Runnable
{
if (_creature != null)
{
_creature.onHitTimer(_hitTarget, _damage, _crit, _miss, _soulshot, _shld);
_creature.onHitTimer(_hitTarget, _damage, _crit, _miss, _shld, _soulshot, _rechargeShots);
}
}
}

View File

@ -1237,7 +1237,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
}
// Create a new hit task with Medium priority
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk);
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, shld1, attack.hasSoulshot(), true), sAtk);
// Calculate and set the disable delay of the bow in function of the Attack Speed
_disableBowAttackEndTime = ((sAtk + reuse) / GameTimeTaskManager.MILLIS_IN_TICK) + GameTimeTaskManager.getInstance().getGameTicks();
@ -1307,7 +1307,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
}
// Create a new hit task with Medium priority
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk);
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, shld1, attack.hasSoulshot(), true), sAtk);
// Calculate and set the disable delay of the bow in function of the Attack Speed
_disableBowAttackEndTime = ((sAtk + reuse) / GameTimeTaskManager.MILLIS_IN_TICK) + GameTimeTaskManager.getInstance().getGameTicks();
@ -1378,17 +1378,17 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
}
// Create a new hit task with Medium priority for hit 1
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk / 2);
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, shld1, attack.hasSoulshot(), true), sAtk / 2);
// Create a new hit task with Medium priority for hit 2 with a higher delay
ThreadPool.schedule(new HitTask(this, target, damage2, crit2, miss2, attack.hasSoulshot(), shld2), sAtk);
ThreadPool.schedule(new HitTask(this, target, damage2, crit2, miss2, shld2, attack.hasSoulshot(), false), sAtk);
// Add those hits to the Server-Client packet Attack
attack.addHit(target, damage1, miss1, crit1, shld1);
attack.addHit(target, damage2, miss2, crit2, shld2);
// Return true if hit 1 or hit 2 isn't missed
return (!miss1 || !miss2);
return !miss1 || !miss2;
}
/**
@ -1408,7 +1408,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
private boolean doAttackHitByPole(Attack attack, Creature target, int sAtk)
{
// Perform the main target hit.
boolean hitted = doAttackHitSimple(attack, target, 100, sAtk);
boolean hitted = doAttackHitSimple(attack, target, 100, sAtk, true);
// H5 Changes: without Polearm Mastery (skill 216) max simultaneous attacks is 3 (1 by default + 2 in skill 3599).
int attackCountMax = (int) _stat.calcStat(Stat.ATTACK_COUNT_MAX, 1, null, null);
@ -1460,7 +1460,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
}
// Launch a simple attack against the additional target.
hitted |= doAttackHitSimple(attack, obj, attackpercent, sAtk);
hitted |= doAttackHitSimple(attack, obj, attackpercent, sAtk, false);
attackpercent /= 1.15;
if (--attackCountMax <= 0)
{
@ -1492,10 +1492,10 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
*/
private boolean doAttackHitSimple(Attack attack, Creature target, int sAtk)
{
return doAttackHitSimple(attack, target, 100, sAtk);
return doAttackHitSimple(attack, target, 100, sAtk, true);
}
private boolean doAttackHitSimple(Attack attack, Creature target, double attackpercent, int sAtk)
private boolean doAttackHitSimple(Attack attack, Creature target, double attackpercent, int sAtk, boolean rechargeShots)
{
int damage1 = 0;
byte shld1 = 0;
@ -1522,7 +1522,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
}
// Create a new hit task with Medium priority
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, attack.hasSoulshot(), shld1), sAtk);
ThreadPool.schedule(new HitTask(this, target, damage1, crit1, miss1, shld1, attack.hasSoulshot(), rechargeShots), sAtk);
// Add this hit to the Server-Client packet Attack
attack.addHit(target, damage1, miss1, crit1, shld1);
@ -4741,10 +4741,11 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
* @param damageValue Number of HP to reduce
* @param crit True if hit is critical
* @param miss True if hit is missed
* @param soulshot True if SoulShot are charged
* @param shld True if shield is efficient
* @param soulshot True if SoulShot are charged
* @param rechargeShots True if SoulShots are re-charged
*/
public void onHitTimer(Creature target, int damageValue, boolean crit, boolean miss, boolean soulshot, byte shld)
public void onHitTimer(Creature target, int damageValue, boolean crit, boolean miss, byte shld, boolean soulshot, boolean rechargeShots)
{
// If the attacker/target is dead or use fake death, notify the AI with EVT_CANCEL
// and send a Server->Client packet ActionFailed (if attacker is a Player)
@ -4765,7 +4766,10 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
// getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE, null);
// Some times attack is processed but target die before the hit
// So we need to recharge shot for next attack
rechargeShots(true, false);
if (rechargeShots)
{
rechargeShots(true, false);
}
getAI().notifyEvent(CtrlEvent.EVT_CANCEL);
sendPacket(ActionFailed.STATIC_PACKET);
return;
@ -4916,14 +4920,19 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe
}
}
}
// Launch weapon onCritical Special ability effect if available
if (crit && (weapon != null))
{
weapon.castOnCriticalSkill(this, target);
}
}
// Recharge any active auto-soulshot tasks for current creature.
rechargeShots(true, false);
if (rechargeShots)
{
rechargeShots(true, false);
}
}
/**

View File

@ -38,8 +38,9 @@ public class HitTask implements Runnable
private final boolean _miss;
private final byte _shld;
private final boolean _soulshot;
private final boolean _rechargeShots;
public HitTask(Creature creature, Creature target, int damage, boolean crit, boolean miss, boolean soulshot, byte shld)
public HitTask(Creature creature, Creature target, int damage, boolean crit, boolean miss, byte shld, boolean soulshot, boolean rechargeShots)
{
_creature = creature;
_hitTarget = target;
@ -48,6 +49,7 @@ public class HitTask implements Runnable
_shld = shld;
_miss = miss;
_soulshot = soulshot;
_rechargeShots = rechargeShots;
}
@Override
@ -55,7 +57,7 @@ public class HitTask implements Runnable
{
if (_creature != null)
{
_creature.onHitTimer(_hitTarget, _damage, _crit, _miss, _soulshot, _shld);
_creature.onHitTimer(_hitTarget, _damage, _crit, _miss, _shld, _soulshot, _rechargeShots);
}
}
}