using System; using System.Collections; using Server.Targeting; using Server.Network; using Server.Mobiles; namespace Server.Spells.Custom { public class SacredBoonSpell : ClericSpell { private static SpellInfo m_Info = new SpellInfo( "Sacred Boon", "Vir Consolatio", SpellCircle.Fourth, 212, 9041 ); private static Hashtable m_Table = new Hashtable(); public override int RequiredTithing{ get{ return 15; } } public override double RequiredSkill{ get{ return 25.0; } } public SacredBoonSpell( Mobile caster, Item scroll ) : base( caster, scroll, m_Info ) { } public static bool HasEffect( Mobile m ) { return ( m_Table[m] != null ); } public static void RemoveEffect( Mobile m ) { Timer t = (Timer)m_Table[m]; if ( t != null ) { t.Stop(); m_Table.Remove( m ); } } public override void OnCast() { Caster.Target = new InternalTarget( this ); } public void Target( Mobile m ) { if ( !Caster.CanSee( m ) ) { Caster.SendLocalizedMessage( 500237 ); // Target can not be seen. } if ( m_Table.Contains( m ) ) { Caster.LocalOverheadMessage( MessageType.Regular, 0x481, false, "That target already has this affect." ); } else if ( CheckBSequence( m, false ) ) { SpellHelper.Turn( Caster, m ); Timer t = new InternalTimer( m, Caster ); t.Start(); m_Table[m] = t; m.PlaySound( 0x202 ); m.FixedParticles( 0x376A, 1, 62, 9923, 3, 3, EffectLayer.Waist ); m.FixedParticles( 0x3779, 1, 46, 9502, 5, 3, EffectLayer.Waist ); m.SendMessage( "A magic aura surrounds you causing your wounds to heal faster." ); } FinishSequence(); } private class InternalTarget : Target { private SacredBoonSpell m_Owner; public InternalTarget( SacredBoonSpell owner ) : base( 12, false, TargetFlags.Beneficial ) { m_Owner = owner; } protected override void OnTarget( Mobile from, object o ) { if ( o is Mobile ) { m_Owner.Target( (Mobile)o ); } } protected override void OnTargetFinish( Mobile from ) { m_Owner.FinishSequence(); } } private class InternalTimer : Timer { private Mobile dest, source; private DateTime NextTick; private DateTime Expire; public InternalTimer( Mobile m, Mobile from ) : base( TimeSpan.FromSeconds( 0.1 ), TimeSpan.FromSeconds( 0.1 ) ) { dest = m; source = from; Priority = TimerPriority.FiftyMS; Expire = DateTime.Now + TimeSpan.FromSeconds( 30.0 ); } protected override void OnTick() { if ( !dest.CheckAlive() ) { Stop(); m_Table.Remove( dest ); } if ( DateTime.Now < NextTick ) return; if ( DateTime.Now >= NextTick ) { double heal = Utility.RandomMinMax( 6, 9 ) + source.Skills[SkillName.Magery].Value / 50.0; heal *= DivineFocusSpell.GetScalar( source ); dest.Heal( (int)heal ); dest.PlaySound( 0x202 ); dest.FixedParticles( 0x376A, 1, 62, 9923, 3, 3, EffectLayer.Waist ); dest.FixedParticles( 0x3779, 1, 46, 9502, 5, 3, EffectLayer.Waist ); NextTick = DateTime.Now + TimeSpan.FromSeconds( 4 ); } if ( DateTime.Now >= Expire ) { Stop(); if ( m_Table.Contains( dest ) ) m_Table.Remove( dest ); } } } } }