201 lines
No EOL
4.7 KiB
C#
201 lines
No EOL
4.7 KiB
C#
using System;
|
|
using Server;
|
|
using Server.Items;
|
|
using Server.Spells;
|
|
using Server.Network;
|
|
|
|
namespace Server.SkillHandlers
|
|
{
|
|
class SpiritSpeak
|
|
{
|
|
public static void Initialize()
|
|
{
|
|
SkillInfo.Table[32].Callback = new SkillUseCallback( OnUse );
|
|
}
|
|
|
|
public static TimeSpan OnUse( Mobile m )
|
|
{
|
|
if ( Core.AOS )
|
|
{
|
|
Spell spell = new SpiritSpeakSpell( m );
|
|
|
|
spell.Cast();
|
|
|
|
if ( spell.IsCasting )
|
|
return TimeSpan.FromSeconds( 5.0 );
|
|
|
|
return TimeSpan.Zero;
|
|
}
|
|
|
|
m.RevealingAction();
|
|
|
|
if ( m.CheckSkill( SkillName.SpiritSpeak, 0, 100 ) )
|
|
{
|
|
if ( !m.CanHearGhosts )
|
|
{
|
|
Timer t = new SpiritSpeakTimer( m );
|
|
double secs = m.Skills[SkillName.SpiritSpeak].Base / 50;
|
|
secs *= 90;
|
|
if ( secs < 15 )
|
|
secs = 15;
|
|
|
|
t.Delay = TimeSpan.FromSeconds( secs );//15seconds to 3 minutes
|
|
t.Start();
|
|
m.CanHearGhosts = true;
|
|
}
|
|
|
|
m.PlaySound( 0x24A );
|
|
m.SendLocalizedMessage( 502444 );//You contact the neitherworld.
|
|
}
|
|
else
|
|
{
|
|
m.SendLocalizedMessage( 502443 );//You fail to contact the neitherworld.
|
|
m.CanHearGhosts = false;
|
|
}
|
|
|
|
return TimeSpan.FromSeconds( 1.0 );
|
|
}
|
|
|
|
private class SpiritSpeakTimer : Timer
|
|
{
|
|
private Mobile m_Owner;
|
|
public SpiritSpeakTimer( Mobile m ) : base( TimeSpan.FromMinutes( 2.0 ) )
|
|
{
|
|
m_Owner = m;
|
|
Priority = TimerPriority.FiveSeconds;
|
|
}
|
|
|
|
protected override void OnTick()
|
|
{
|
|
m_Owner.CanHearGhosts = false;
|
|
m_Owner.SendLocalizedMessage( 502445 );//You feel your contact with the neitherworld fading.
|
|
}
|
|
}
|
|
|
|
private class SpiritSpeakSpell : Spell
|
|
{
|
|
private static SpellInfo m_Info = new SpellInfo( "Spirit Speak", "", 269 );
|
|
|
|
public override bool BlockedByHorrificBeast{ get{ return false; } }
|
|
|
|
public SpiritSpeakSpell( Mobile caster ) : base( caster, null, m_Info )
|
|
{
|
|
}
|
|
|
|
public override bool ClearHandsOnCast{ get{ return false; } }
|
|
|
|
public override double CastDelayFastScalar { get { return 0; } }
|
|
public override TimeSpan CastDelayBase { get { return TimeSpan.FromSeconds( 1.0 ); } }
|
|
|
|
public override int GetMana()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
public override void OnCasterHurt()
|
|
{
|
|
if ( IsCasting )
|
|
Disturb( DisturbType.Hurt, false, true );
|
|
}
|
|
|
|
public override bool ConsumeReagents()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public override bool CheckFizzle()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public override bool CheckNextSpellTime{ get{ return false; } }
|
|
|
|
public override void OnDisturb( DisturbType type, bool message )
|
|
{
|
|
Caster.NextSkillTime = Core.TickCount;
|
|
|
|
base.OnDisturb( type, message );
|
|
}
|
|
|
|
public override bool CheckDisturb( DisturbType type, bool checkFirst, bool resistable )
|
|
{
|
|
if ( type == DisturbType.EquipRequest || type == DisturbType.UseRequest )
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
public override void SayMantra()
|
|
{
|
|
// Anh Mi Sah Ko
|
|
Caster.PublicOverheadMessage( MessageType.Regular, 0x3B2, 1062074, "", false );
|
|
Caster.PlaySound( 0x24A );
|
|
}
|
|
|
|
public override void OnCast()
|
|
{
|
|
Corpse toChannel = null;
|
|
|
|
foreach ( Item item in Caster.GetItemsInRange( 3 ) )
|
|
{
|
|
if( item is Corpse && !( (Corpse)item ).Channeled )
|
|
{
|
|
toChannel = (Corpse)item;
|
|
break;
|
|
}
|
|
}
|
|
|
|
int max, min, mana, number;
|
|
|
|
if ( toChannel != null )
|
|
{
|
|
min = 1 + (int)(Caster.Skills[SkillName.SpiritSpeak].Value * 0.25);
|
|
max = min + 4;
|
|
mana = 0;
|
|
number = 1061287; // You channel energy from a nearby corpse to heal your wounds.
|
|
}
|
|
else
|
|
{
|
|
min = 1 + (int)(Caster.Skills[SkillName.SpiritSpeak].Value * 0.25);
|
|
max = min + 4;
|
|
mana = 10;
|
|
number = 1061286; // You channel your own spiritual energy to heal your wounds.
|
|
}
|
|
|
|
if ( Caster.Mana < mana )
|
|
{
|
|
Caster.SendLocalizedMessage( 1061285 ); // You lack the mana required to use this skill.
|
|
}
|
|
else
|
|
{
|
|
Caster.CheckSkill( SkillName.SpiritSpeak, 0.0, 120.0 );
|
|
|
|
if ( Utility.RandomDouble() > (Caster.Skills[SkillName.SpiritSpeak].Value / 100.0) )
|
|
{
|
|
Caster.SendLocalizedMessage( 502443 ); // You fail your attempt at contacting the netherworld.
|
|
}
|
|
else
|
|
{
|
|
if ( toChannel != null )
|
|
{
|
|
toChannel.Channeled = true;
|
|
toChannel.Hue = 0x835;
|
|
}
|
|
|
|
Caster.Mana -= mana;
|
|
Caster.SendLocalizedMessage( number );
|
|
|
|
if ( min > max )
|
|
min = max;
|
|
|
|
Caster.Hits += Utility.RandomMinMax( min, max );
|
|
|
|
Caster.FixedParticles( 0x375A, 1, 15, 9501, 2100, 4, EffectLayer.Waist );
|
|
}
|
|
}
|
|
|
|
FinishSequence();
|
|
}
|
|
}
|
|
}
|
|
} |