servuo/Scripts/Spells/Bushido/CounterAttack.cs
2020-04-16 18:41:32 -07:00

113 lines
No EOL
3 KiB
C#

using Server.Items;
using System;
using System.Collections;
namespace Server.Spells.Bushido
{
public class CounterAttack : SamuraiSpell
{
private static readonly SpellInfo m_Info = new SpellInfo(
"CounterAttack", null,
-1,
9002);
private static readonly Hashtable m_Table = new Hashtable();
public CounterAttack(Mobile caster, Item scroll)
: base(caster, scroll, m_Info)
{
}
public override TimeSpan CastDelayBase => TimeSpan.FromSeconds(0.25);
public override double RequiredSkill => 40.0;
public override int RequiredMana => 5;
public static bool IsCountering(Mobile m)
{
return m_Table.Contains(m);
}
public static void StartCountering(Mobile m)
{
Timer t = (Timer)m_Table[m];
if (t != null)
t.Stop();
t = new InternalTimer(m);
m_Table[m] = t;
BuffInfo.AddBuff(m, new BuffInfo(BuffIcon.CounterAttack, 1060598, 1063266, TimeSpan.FromSeconds(30), m));
t.Start();
}
public static void StopCountering(Mobile m)
{
Timer t = (Timer)m_Table[m];
if (t != null)
t.Stop();
m_Table.Remove(m);
BuffInfo.RemoveBuff(m, BuffIcon.CounterAttack);
OnEffectEnd(m, typeof(CounterAttack));
}
public override bool CheckCast()
{
if (!base.CheckCast())
return false;
if (Caster.FindItemOnLayer(Layer.TwoHanded) as BaseShield != null)
return true;
if (Caster.FindItemOnLayer(Layer.OneHanded) as BaseWeapon != null)
return true;
if (Caster.FindItemOnLayer(Layer.TwoHanded) as BaseWeapon != null)
return true;
Caster.SendLocalizedMessage(1062944); // You must have a weapon or a shield equipped to use this ability!
return false;
}
public override void OnBeginCast()
{
base.OnBeginCast();
Caster.FixedEffect(0x37C4, 10, 7, 4, 3);
}
public override void OnCast()
{
if (CheckSequence())
{
Caster.SendLocalizedMessage(1063118); // You prepare to respond immediately to the next blocked blow.
OnCastSuccessful(Caster);
StartCountering(Caster);
}
FinishSequence();
}
private class InternalTimer : Timer
{
private readonly Mobile m_Mobile;
public InternalTimer(Mobile m)
: base(TimeSpan.FromSeconds(30.0))
{
m_Mobile = m;
Priority = TimerPriority.TwoFiftyMS;
}
protected override void OnTick()
{
StopCountering(m_Mobile);
m_Mobile.SendLocalizedMessage(1063119); // You return to your normal stance.
}
}
}
}