using System; using System.Collections.Generic; namespace Server.Items { /// /// A successful Paralyzing Blow will leave the target stunned, unable to move, attack, or cast spells, for a few seconds. /// public class ParalyzingBlow : WeaponAbility { public static readonly TimeSpan PlayerFreezeDuration = TimeSpan.FromSeconds(3.0); public static readonly TimeSpan NPCFreezeDuration = TimeSpan.FromSeconds(6.0); public static readonly TimeSpan FreezeDelayDuration = TimeSpan.FromSeconds(8.0); private static readonly Dictionary _table = new(); public override int BaseMana => 30; // When using Wrestling, tactics isnt needed. public override bool RequiresTactics(Mobile from) => !(from.Weapon is BaseWeapon weapon && weapon.Skill == SkillName.Wrestling); public override bool OnBeforeSwing(Mobile attacker, Mobile defender) { if (defender.Paralyzed) { attacker.SendLocalizedMessage(1061923); // The target is already frozen. return false; } return true; } public override void OnHit(Mobile attacker, Mobile defender, int damage) { if (!Validate(attacker) || !CheckMana(attacker, true)) { return; } ClearCurrentAbility(attacker); if (IsImmune(defender)) // Intentionally going after Mana consumption { attacker.SendLocalizedMessage(1070804); // Your target resists paralysis. defender.SendLocalizedMessage(1070813); // You resist paralysis. return; } defender.FixedEffect(0x376A, 9, 32); defender.PlaySound(0x204); attacker.SendLocalizedMessage(1060163); // You deliver a paralyzing blow! defender.SendLocalizedMessage(1060164); // The attack has temporarily paralyzed you! var duration = defender.Player ? PlayerFreezeDuration : NPCFreezeDuration; // Treat it as paralyze not as freeze, effect must be removed when damaged. defender.Paralyze(duration); BeginImmunity(defender, duration + FreezeDelayDuration); } public static bool IsImmune(Mobile m) => _table.ContainsKey(m); public static void BeginImmunity(Mobile m, TimeSpan duration) { EndImmunity(m); Timer.StartTimer(duration, () => EndImmunity(m), out var timerToken); _table[m] = timerToken; } public static void EndImmunity(Mobile m) { if (_table.Remove(m, out var timerToken)) { timerToken.Cancel(); } } } }