102 lines
No EOL
2.5 KiB
C#
102 lines
No EOL
2.5 KiB
C#
using System;
|
|
using Server.Mobiles;
|
|
using Server.Network;
|
|
using Server.Targeting;
|
|
|
|
namespace Server.Spells.Fifth
|
|
{
|
|
public class BladeSpiritsSpell : MagerySpell
|
|
{
|
|
private static SpellInfo m_Info = new SpellInfo(
|
|
"Blade Spirits", "In Jux Hur Ylem",
|
|
266,
|
|
9040,
|
|
false,
|
|
Reagent.BlackPearl,
|
|
Reagent.MandrakeRoot,
|
|
Reagent.Nightshade
|
|
);
|
|
|
|
public override SpellCircle Circle { get { return SpellCircle.Fifth; } }
|
|
|
|
public BladeSpiritsSpell( Mobile caster, Item scroll ) : base( caster, scroll, m_Info )
|
|
{
|
|
}
|
|
|
|
public override TimeSpan GetCastDelay()
|
|
{
|
|
return base.GetCastDelay() + TimeSpan.FromSeconds( 6.0 );
|
|
}
|
|
|
|
public override bool CheckCast()
|
|
{
|
|
if ( !base.CheckCast() )
|
|
return false;
|
|
|
|
if( (Caster.Followers + 1) > Caster.FollowersMax )
|
|
{
|
|
Caster.SendLocalizedMessage( 1049645 ); // You have too many followers to summon that creature.
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override void OnCast()
|
|
{
|
|
Caster.Target = new InternalTarget( this );
|
|
}
|
|
|
|
public void Target( IPoint3D p )
|
|
{
|
|
Map map = Caster.Map;
|
|
|
|
SpellHelper.GetSurfaceTop( ref p );
|
|
|
|
if ( map == null || !map.CanSpawnMobile( p.X, p.Y, p.Z ) )
|
|
{
|
|
Caster.SendLocalizedMessage( 501942 ); // That location is blocked.
|
|
}
|
|
else if ( SpellHelper.CheckTown( p, Caster ) && CheckSequence() )
|
|
{
|
|
Caster.CheckSkill( SkillName.Concentration, 0.0, 100.0 );
|
|
|
|
TimeSpan duration = TimeSpan.FromSeconds( Utility.Random( 80, 40 ) + (Caster.Skills.Concentration.Value / 5) );
|
|
|
|
BaseCreature.Summon( new BladeSpirits(), false, Caster, new Point3D( p ), 0x212, duration );
|
|
}
|
|
|
|
FinishSequence();
|
|
}
|
|
|
|
private class InternalTarget : Target
|
|
{
|
|
private BladeSpiritsSpell m_Owner;
|
|
|
|
public InternalTarget( BladeSpiritsSpell owner ) : base( 12, true, TargetFlags.None )
|
|
{
|
|
m_Owner = owner;
|
|
}
|
|
|
|
protected override void OnTarget( Mobile from, object o )
|
|
{
|
|
if ( o is IPoint3D )
|
|
m_Owner.Target( (IPoint3D)o );
|
|
}
|
|
|
|
protected override void OnTargetOutOfLOS( Mobile from, object o )
|
|
{
|
|
from.SendLocalizedMessage( 501943 ); // Target cannot be seen. Try again.
|
|
from.Target = new InternalTarget( m_Owner );
|
|
from.Target.BeginTimeout( from, TimeoutTime - DateTime.Now );
|
|
m_Owner = null;
|
|
}
|
|
|
|
protected override void OnTargetFinish( Mobile from )
|
|
{
|
|
if ( m_Owner != null )
|
|
m_Owner.FinishSequence();
|
|
}
|
|
}
|
|
}
|
|
} |