Files
Unstable Kitsune b918192e4e Overwrite
Complete Overwrite of the Folder with the free shard. ServUO 57.3 has been added.
2023-11-28 23:20:26 -05:00

152 lines
3.6 KiB
C#

using System;
using System.Collections;
using Server;
using Server.Targeting;
using Server.Network;
using Server.Mobiles;
using Server.Items;
using Server.Spells;
using Server.Spells.Seventh;
using Server.Gumps;
namespace Server.ACC.CSS.Systems.Ranger
{
public class RangerHuntersAimSpell : RangerSpell
{
private static SpellInfo m_Info = new SpellInfo(
"Hunter's Aim", "Cu Ner Sinta",
//SpellCircle.Fourth,
212,
9041,
Reagent.Nightshade,
CReagent.SpringWater,
Reagent.Bloodmoss
);
public override SpellCircle Circle
{
get { return SpellCircle.Fourth; }
}
public override double CastDelay{ get{ return 3.0; } }
public override int RequiredMana{ get{ return 25; } }
public override double RequiredSkill{ get{ return 50; } }
private static Hashtable m_Table = new Hashtable();
public RangerHuntersAimSpell( Mobile caster, Item scroll ) : base( caster, scroll, m_Info )
{
}
public static double GetScalar( Mobile m )
{
double val = 1.0;
if ( m.CanBeginAction( typeof( RangerHuntersAimSpell ) ) )
val = 1.5;
return val;
}
public static bool HasEffect( Mobile m )
{
return ( m_Table[m] != null );
}
public static void RemoveEffect( Mobile m )
{
object[] mods = (object[])m_Table[m];
if ( mods != null )
{
m.RemoveStatMod( ((StatMod)mods[0]).Name );
m.RemoveStatMod( ((StatMod)mods[1]).Name );
m.RemoveSkillMod( (SkillMod)mods[2] );
m.RemoveSkillMod( (SkillMod)mods[3] );
}
m_Table.Remove( m );
m.EndAction( typeof( RangerHuntersAimSpell ) );
m.BodyMod = 0;
}
public override bool CheckCast()
{
if ( !base.CheckCast() )
{
return false;
}
else if ( !Caster.CanBeginAction( typeof( RangerHuntersAimSpell ) ) )
{
Caster.SendLocalizedMessage( 1005559 );
return false;
}
return true;
}
public override void OnCast()
{
if ( !Caster.CanBeginAction( typeof( RangerHuntersAimSpell ) ) )
{
Caster.SendLocalizedMessage( 1005559 );
}
else if ( CheckSequence() )
{
object[] mods = new object[]
{
new StatMod( StatType.Dex, "[Ranger] Dex Offset", 5, TimeSpan.Zero ),
new StatMod( StatType.Str, "[Ranger] Str Offset", 5, TimeSpan.Zero ),
new DefaultSkillMod( SkillName.Archery, true, 20 ),
new DefaultSkillMod( SkillName.Tactics, true, 20 ),
};
m_Table[Caster] = mods;
Caster.AddStatMod( (StatMod)mods[0] );
Caster.AddStatMod( (StatMod)mods[1] );
Caster.AddSkillMod( (SkillMod)mods[2] );
Caster.AddSkillMod( (SkillMod)mods[3] );
double span = 1.0 * RangerHuntersAimSpell.GetScalar( Caster );
new InternalTimer( Caster, TimeSpan.FromMinutes( (int)span ) ).Start();
IMount mount = Caster.Mount;
if ( mount != null )
mount.Rider = null;
Caster.BeginAction( typeof( RangerHuntersAimSpell ) );
}
}
private class InternalTimer : Timer
{
private Mobile m_Owner;
private DateTime m_Expire;
public InternalTimer( Mobile owner, TimeSpan duration ) : base( TimeSpan.Zero, TimeSpan.FromSeconds( 0.1 ) )
{
m_Owner = owner;
m_Expire = DateTime.Now + duration;
}
protected override void OnTick()
{
if ( DateTime.Now >= m_Expire )
{
RangerHuntersAimSpell.RemoveEffect( m_Owner );
Stop();
}
}
}
}
}