fix: Moving Shot only charges mana for a fired shot (#2726)

Moving Shot charged its mana in `OnBeforeSwing`, before `BaseRanged.OnSwing` decided whether to fire. A swing that fired nothing (a paralyzed or frozen archer, no ammo, a failed harmful check) still took the mana and left the move armed. Every swing after that charged again, so inside the 3-second window you paid twice, until the archer ran out of mana.

`OnBeforeSwing` now only checks the mana. Moving Shot's own `OnHit`/`OnMiss` charge it, and those only run once a shot has fired. This is how the other weapon abilities pay. A miss still costs mana. A parried shot no longer does: the parry clears the move before `OnHit` runs, the same as for every other ability.
This commit is contained in:
LoveDesignUA 2026-10-24 10:21:36 +07:00 • committed by GitHub
parent 88859ac69e
commit 302f1ad988
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -11,8 +11,9 @@ namespace Server.Items
public override bool ValidatesDuringHit => false;
// Mana is only checked here; OnHit/OnMiss charge it, since they run only for a shot that actually fired.
public override bool OnBeforeSwing(Mobile attacker, Mobile defender) =>
Validate(attacker) && CheckMana(attacker, true);
Validate(attacker) && CheckMana(attacker, false);
public override void OnMiss(Mobile attacker, Mobile defender)
{
@ -20,7 +21,10 @@ namespace Server.Items
ClearCurrentAbility(attacker);
attacker.SendLocalizedMessage(1060089); // You fail to execute your special move
if (CheckMana(attacker, true))
{
attacker.SendLocalizedMessage(1060089); // You fail to execute your special move
}
}
public override void OnHit(Mobile attacker, Mobile defender, int damage, WorldLocation worldLocation)
@ -29,7 +33,10 @@ namespace Server.Items
ClearCurrentAbility(attacker);
attacker.SendLocalizedMessage(1060216); // Your shot was successful
if (CheckMana(attacker, true))
{
attacker.SendLocalizedMessage(1060216); // Your shot was successful
}
}
}
}