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 Dictionary m_Table = new Dictionary(); public override int BaseMana => 30; // No longer active in pub21: /*public override bool CheckSkills( Mobile from ) { if ( !base.CheckSkills( from ) ) return false; if ( !(from.Weapon is Fists) ) return true; Skill skill = from.Skills.Anatomy; if ( skill?.Base >= 80.0 ) return true; from.SendLocalizedMessage( 1061811 ); // You lack the required anatomy skill to perform that attack! return false; }*/ public override bool RequiresTactics(Mobile from) { return !(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! TimeSpan 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) { return m_Table.ContainsKey(m); } public static void BeginImmunity(Mobile m, TimeSpan duration) { if (m_Table.TryGetValue(m, out InternalTimer timer)) timer?.Stop(); m_Table[m] = timer = new InternalTimer(m, duration); timer.Start(); } public static void EndImmunity(Mobile m) { if (m_Table.TryGetValue(m, out InternalTimer timer)) { timer?.Stop(); m_Table.Remove(m); } } private class InternalTimer : Timer { private Mobile m_Mobile; public InternalTimer(Mobile m, TimeSpan duration) : base(duration) { m_Mobile = m; Priority = TimerPriority.TwoFiftyMS; } protected override void OnTick() { EndImmunity(m_Mobile); } } } }