AvatarsConquest/Scripts/Mobiles/Towns/HintCrier.cs

147 lines
3.6 KiB
C#

using System;
using System.Collections.Generic;
using Server;
using Server.Items;
using Server.Network;
namespace Server.Mobiles
{
public class HintCrier : BaseCreature
{
private static List<HintCrier> m_Instances = new List<HintCrier>();
public static List<HintCrier> Instances { get { return m_Instances; } }
// The timer that handles ambient shouting
private Timer m_AutoShoutTimer;
public static void AnnounceEvent( string message )
{
foreach ( HintCrier crier in m_Instances )
{
crier.PublicOverheadMessage( MessageType.Regular, 0x2B, false, message );
}
}
private static string[] m_Hints = new string[]
{
"Lord British is looking for brave adventures for a 'Virtuous Quest'! See him in the castle throne room!!",
"Walk near the crops and they just might harvest themselves..."
};
[Constructable]
public HintCrier() : base( AIType.AI_Vendor, FightMode.None, 10, 1, 0.2, 0.4 )
{
m_Instances.Add( this );
Title = "the town crier";
Hue = Utility.RandomSkinHue();
Invulnerable = true;
CantWalk = true;
SpeechHue = 0x31;
WhisperHue = 0x31;
YellHue = 0x31;
if ( Utility.RandomBool() )
{
Body = 0x191;
Name = NameList.RandomName( "female" );
}
else
{
Body = 0x190;
Name = NameList.RandomName( "male" );
}
AddItem( new FancyShirt( Utility.RandomBlueHue() ) );
AddItem( new Kilt( Utility.RandomGreenHue() ) );
AddItem( new FeatheredHat( Utility.RandomGreenHue() ) );
AddItem( new ThighBoots() );
Utility.AssignRandomHair( this );
StartTimer();
}
public HintCrier( Serial serial ) : base( serial )
{
m_Instances.Add( this );
}
// Starts a looping timer that shouts a hint every 3 to 5 minutes
private void StartTimer()
{
if ( m_AutoShoutTimer == null )
{
m_AutoShoutTimer = Timer.DelayCall( TimeSpan.FromSeconds( 15.0 ), TimeSpan.FromSeconds( 30.0 ), new TimerCallback( AutoShout_Callback ) );
}
}
// Cleans up the timer if the NPC is deleted
private void StopTimer()
{
if ( m_AutoShoutTimer != null )
{
m_AutoShoutTimer.Stop();
m_AutoShoutTimer = null;
}
}
private void AutoShout_Callback()
{
// Only shout if there is a player within 15 tiles to save server resources
bool playerNearby = false;
foreach ( Mobile m in GetMobilesInRange( 15 ) )
{
if ( m.Player )
{
playerNearby = true;
break;
}
}
if ( playerNearby )
{
string hint = m_Hints[Utility.Random( m_Hints.Length )];
PublicOverheadMessage( MessageType.Regular, 0x2B, false, hint );
}
}
public override bool HandlesOnSpeech( Mobile from )
{
return ( from.Alive && InRange( from, 12 ) );
}
public override void OnSpeech( SpeechEventArgs e )
{
string speech = e.Speech.ToLower();
if ( (e.HasKeyword( 0x30 ) || speech.Contains("hint") || speech.Contains("rumor") || speech.Contains("secret")) && e.Mobile.Alive && InRange( e.Mobile, 12 ) )
{
Direction = GetDirectionTo( e.Mobile );
string hint = m_Hints[Utility.Random( m_Hints.Length )];
PublicOverheadMessage( MessageType.Regular, 0x2B, false, hint );
}
}
public override void OnDelete()
{
StopTimer();
m_Instances.Remove( this );
base.OnDelete();
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
// Restart the timer when the server reboots and loads the NPC
StartTimer();
}
}
}