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

165 lines
3.4 KiB
C#

using System;
using Server;
using Server.Items;
using Server.Mobiles;
namespace Server.ACC.CSS.Systems.Druid
{
public class SacredStone : Item
{
private Mobile m_Owner;
private bool m_campSecure = false;
private Timer m_campSecureTimer;
private Timer m_Timer;
public override bool HandlesOnMovement{ get{ return true; } }
public static int CampingRange{ get{ return 5; } }
[Constructable]
public SacredStone( Mobile owner ) : base ( 0x8E3 )
{
Movable = false;
Name="Sacred Stone";
m_Owner = owner;
m_Timer = new DecayTimer( this );
m_Timer.Start();
m_campSecureTimer = new SecureTimer( m_Owner, this );
m_campSecureTimer.Start();
}
public SacredStone( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int) 0 ); // version
writer.Write( m_Owner );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch( version )
{
case 0:
{
m_Owner = reader.ReadMobile();
m_Timer = new DecayTimer( this );
m_Timer.Start();
m_campSecureTimer = new SecureTimer( m_Owner, this );
m_campSecureTimer.Start();
break;
}
}
}
public override void OnMovement( Mobile m, Point3D oldLocation )
{
if( ( m is PlayerMobile ) && ( m == m_Owner ) )
{
bool inOldRange = Utility.InRange( oldLocation, Location, CampingRange );
bool inNewRange = Utility.InRange( m.Location, Location, CampingRange );
if ( inNewRange && !inOldRange )
OnEnter( m );
else if ( inOldRange && !inNewRange )
OnExit( m );
}
}
public virtual void OnEnter( Mobile m )
{
StartSecureTimer();
}
public virtual void OnExit( Mobile m )
{
StopSecureTimer();
m.SendMessage( "You have left the grove." );
}
public override void OnAfterDelete()
{
if( m_Timer != null )
m_Timer.Stop();
}
private class DecayTimer : Timer
{
private SacredStone m_Owner;
public DecayTimer( SacredStone owner ) : base( TimeSpan.FromMinutes( 2.0 ) )
{
Priority = TimerPriority.FiveSeconds;
m_Owner = owner;
}
protected override void OnTick()
{
m_Owner.Delete();
}
}
[CommandProperty( AccessLevel.GameMaster )]
public bool CampSecure
{
get { return m_campSecure; }
set { m_campSecure = value; }
}
[CommandProperty( AccessLevel.GameMaster )]
public Mobile Camper{ get { return m_Owner; } }
public void StartSecureTimer()
{
Camper.SendMessage( "You start to feel secure" ); // You feel it would take a few moments to secure your camp.
if( m_campSecureTimer.Running == false )
{
m_campSecure = false;
m_campSecureTimer.Start();
}
}
public void StopSecureTimer()
{
m_campSecure = false;
m_campSecureTimer.Stop();
}
public override void OnDelete()
{
base.OnDelete();
if( m_campSecureTimer != null )
StopSecureTimer();
}
private class SecureTimer : Timer
{
private Mobile m_Owner;
private SacredStone m_SacredStone;
public SecureTimer( Mobile owner , SacredStone SacredStone ) : base( TimeSpan.FromSeconds( 30.0 ) )
{
Priority = TimerPriority.FiveSeconds;
m_SacredStone = SacredStone;
m_Owner = owner;
}
protected override void OnTick()
{
m_SacredStone.CampSecure = true;
m_Owner.SendMessage( "The power of the grove washes over you." );
}
}
}
}