340 lines
No EOL
8 KiB
C#
340 lines
No EOL
8 KiB
C#
using System;
|
||
using System.IO;
|
||
using Server;
|
||
using Server.Mobiles;
|
||
using System.Collections.Generic;
|
||
using Server.Network;
|
||
|
||
namespace Server.Items
|
||
{
|
||
public class SpawnsOverseer : Item
|
||
{
|
||
private int m_Range;
|
||
private int m_InRangeDelay;
|
||
private int m_OutRangeDelay;
|
||
private int m_Overseeing;
|
||
private CheckTimer m_Timer;
|
||
private bool m_Enable;
|
||
private TimeSpan m_CurrentDelay; // players out dungeon
|
||
private DateTime m_End;
|
||
|
||
[CommandProperty( AccessLevel.GameMaster )]
|
||
public bool Enable
|
||
{
|
||
get { return m_Enable; }
|
||
set
|
||
{
|
||
if ( value )
|
||
Begin();
|
||
|
||
else
|
||
End();
|
||
|
||
InvalidateProperties();
|
||
}
|
||
}
|
||
|
||
[CommandProperty( AccessLevel.GameMaster )]
|
||
public int Range
|
||
{
|
||
get { return m_Range; }
|
||
set { m_Range = value; InvalidateProperties(); }
|
||
}
|
||
|
||
[CommandProperty( AccessLevel.GameMaster )]
|
||
public TimeSpan CurrentDelay
|
||
{
|
||
get { return m_CurrentDelay; }
|
||
set { m_CurrentDelay = value; InvalidateProperties(); }
|
||
}
|
||
|
||
[CommandProperty( AccessLevel.GameMaster )]
|
||
public TimeSpan NextDelay
|
||
{
|
||
get
|
||
{
|
||
if ( m_Enable )
|
||
return m_End - DateTime.Now;
|
||
else
|
||
return TimeSpan.FromSeconds( 0 );
|
||
}
|
||
set
|
||
{
|
||
Begin();
|
||
DoTimer( value );
|
||
}
|
||
}
|
||
|
||
[CommandProperty( AccessLevel.GameMaster )]
|
||
public int InRangeDelay
|
||
{
|
||
get { return m_InRangeDelay; }
|
||
set { m_InRangeDelay = value; InvalidateProperties(); }
|
||
}
|
||
|
||
[CommandProperty( AccessLevel.GameMaster )]
|
||
public int OutRangeDelay
|
||
{
|
||
get { return m_OutRangeDelay; }
|
||
set { m_OutRangeDelay = value; InvalidateProperties(); }
|
||
}
|
||
|
||
[CommandProperty( AccessLevel.GameMaster )]
|
||
public int Overseeing
|
||
{
|
||
get { return m_Overseeing; }
|
||
set { m_Overseeing = value; InvalidateProperties(); }
|
||
}
|
||
|
||
public void Begin()
|
||
{
|
||
if ( !m_Enable )
|
||
{
|
||
m_Enable = true;
|
||
DoTimer();
|
||
}
|
||
}
|
||
|
||
public void End()
|
||
{
|
||
if ( m_Enable )
|
||
{
|
||
m_Timer.Stop();
|
||
m_Enable = false;
|
||
}
|
||
}
|
||
|
||
public void Restart()
|
||
{
|
||
if ( m_Enable )
|
||
{
|
||
m_Timer.Stop();
|
||
DoTimer();
|
||
}
|
||
}
|
||
|
||
public void DoTimer()
|
||
{
|
||
if ( !m_Enable )
|
||
return;
|
||
|
||
int mSeconds = (int)m_CurrentDelay.TotalSeconds;
|
||
|
||
TimeSpan delay = TimeSpan.FromSeconds( mSeconds );
|
||
DoTimer( delay );
|
||
}
|
||
|
||
public void DoTimer( TimeSpan delay )
|
||
{
|
||
if ( !m_Enable )
|
||
return;
|
||
|
||
if ( m_Timer != null )
|
||
m_Timer.Stop();
|
||
|
||
m_End = DateTime.Now + delay;
|
||
|
||
m_Timer = new CheckTimer( this, delay );
|
||
m_Timer.Start();
|
||
}
|
||
|
||
[Constructable]
|
||
public SpawnsOverseer() : this( 20, 30, 5, 0 )
|
||
{
|
||
}
|
||
|
||
[Constructable]
|
||
public SpawnsOverseer( int startrange ) : this( startrange, 30, 5, 0 )
|
||
{
|
||
}
|
||
|
||
[Constructable]
|
||
public SpawnsOverseer( int startrange, int startIRD, int startORD, int startOverseeing ) : base( 0x1F1E )
|
||
{
|
||
InitSeer( startrange, startIRD, startORD, startOverseeing );
|
||
}
|
||
|
||
private void InitSeer( int startrange, int startIRD, int startORD, int startOverseeing )
|
||
{
|
||
Name = "Spawns' Overseer";
|
||
Movable = false;
|
||
Light = LightType.Circle150;
|
||
Weight = 1;
|
||
Visible = false;
|
||
Enable = true;
|
||
Range = startrange;
|
||
CurrentDelay = TimeSpan.FromSeconds( 5 );
|
||
InRangeDelay = startIRD; //minutes
|
||
OutRangeDelay = startORD; //seconds
|
||
Overseeing = startOverseeing; //PremiumSpawners under control
|
||
}
|
||
|
||
public override void GetProperties( ObjectPropertyList list )
|
||
{
|
||
base.GetProperties( list );
|
||
|
||
if ( m_Enable )
|
||
{
|
||
list.Add( 1060742 ); // active
|
||
|
||
list.Add( 1060662, "Range\t{0}", Range.ToString() );
|
||
list.Add( 1060663, "In Range Delay\t{0} min", InRangeDelay.ToString() );
|
||
list.Add( 1060661, "Out Range Delay\t{0} sec", OutRangeDelay.ToString() );
|
||
list.Add( 1060658, "Overseeing\t{0} PremiumSpawners", Overseeing.ToString() );
|
||
}
|
||
else
|
||
{
|
||
list.Add( 1060743 ); // inactive
|
||
}
|
||
}
|
||
|
||
private class CheckTimer : Timer
|
||
{
|
||
private SpawnsOverseer m_SpawnsOverseer;
|
||
|
||
public CheckTimer( SpawnsOverseer Crystal, TimeSpan delay ) : base( delay, delay )
|
||
{
|
||
Priority = TimerPriority.OneSecond;
|
||
|
||
m_SpawnsOverseer = Crystal;
|
||
}
|
||
|
||
protected override void OnTick()
|
||
{
|
||
if ( ( m_SpawnsOverseer != null ) && ( !m_SpawnsOverseer.Deleted ) )
|
||
{
|
||
m_SpawnsOverseer.OnTickDoThis();
|
||
}
|
||
|
||
else
|
||
{
|
||
Stop();
|
||
}
|
||
}
|
||
}
|
||
|
||
public void OnTickDoThis()
|
||
{
|
||
List<Item> ClosePremiumSpawners = new List<Item>();
|
||
|
||
List<Mobile> ClosePlayers = new List<Mobile>();
|
||
|
||
List<Mobile> MobsCleaning = new List<Mobile>();
|
||
|
||
List<Item> ItemsCleaning = new List<Item>();
|
||
|
||
foreach ( Item item in this.GetItemsInRange( Range ) ) // para cada item dentro do raio de alcance
|
||
{
|
||
if( item is PremiumSpawner ) // se for um PremiumSpawner
|
||
ClosePremiumSpawners.Add( item );
|
||
}
|
||
|
||
if ( ClosePremiumSpawners.Count > 0 )
|
||
{
|
||
this.Overseeing = ClosePremiumSpawners.Count;
|
||
|
||
foreach ( Mobile m in this.GetMobilesInRange( Range ) ) // para cada mobile dentro do raio de alcance
|
||
{
|
||
if( m is PlayerMobile && m.AccessLevel == AccessLevel.Player || m is PlayerMobile && m.AccessLevel > AccessLevel.Player && m.Hidden == false ) //se f<>r player ou GM n<>o oculto (hidden)
|
||
ClosePlayers.Add( m );
|
||
}
|
||
|
||
if ( ClosePlayers.Count > 0 ) // h<> pelo menos um player pr<70>ximo
|
||
{
|
||
this.CurrentDelay = TimeSpan.FromMinutes( InRangeDelay ); // tempo para nova checagem
|
||
Restart();
|
||
|
||
foreach ( Item pspawner in ClosePremiumSpawners ) // pra cada PremiumSpawner pr<70>ximo (na lista)
|
||
{
|
||
if ( ((PremiumSpawner)pspawner).Running == false ) // se estiver desativado
|
||
{
|
||
((PremiumSpawner)pspawner).Running = true; // ativar!
|
||
((PremiumSpawner)pspawner).NextSpawn = TimeSpan.FromSeconds( 1 ); // respawn total!
|
||
}
|
||
}
|
||
}
|
||
|
||
else if ( ClosePlayers.Count <= 0 ) // n<>o tem ningu<67>m perto
|
||
{
|
||
this.CurrentDelay = TimeSpan.FromSeconds( OutRangeDelay ); // tempo para nova checagem
|
||
Restart();
|
||
|
||
foreach ( Item pspawner in ClosePremiumSpawners ) // pra cada Premium PremiumSpawner pr<70>ximo (na lista)
|
||
{
|
||
if ( ((PremiumSpawner)pspawner).Running == true ) // se estiver ativado
|
||
{
|
||
((PremiumSpawner)pspawner).Running = false; // desativar!
|
||
|
||
foreach ( Mobile mobdel in this.GetMobilesInRange( Range ) )
|
||
{
|
||
if( mobdel is BaseCreature || mobdel is TownCrier )
|
||
MobsCleaning.Add( mobdel );
|
||
}
|
||
|
||
if ( MobsCleaning.Count > 0 )
|
||
{
|
||
foreach ( Mobile mDel in MobsCleaning )
|
||
mDel.Delete();
|
||
}
|
||
|
||
foreach ( Item itemdel in this.GetItemsInRange( Range ) )
|
||
{
|
||
if( itemdel.Movable == true ) //se for um item m<>vel (n<>o decora<72><61>o)
|
||
ItemsCleaning.Add( itemdel );
|
||
}
|
||
|
||
if ( ItemsCleaning.Count > 0 )
|
||
{
|
||
foreach ( Item iDel in ItemsCleaning )
|
||
iDel.Delete();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
else if ( ClosePremiumSpawners.Count <= 0 )
|
||
{
|
||
this.Enable = false;
|
||
this.CurrentDelay = TimeSpan.FromSeconds( OutRangeDelay );
|
||
this.Overseeing = ClosePremiumSpawners.Count;
|
||
}
|
||
}
|
||
|
||
public SpawnsOverseer( Serial serial ) : base( serial )
|
||
{
|
||
}
|
||
|
||
public override void Serialize( GenericWriter writer )
|
||
{
|
||
base.Serialize( writer );
|
||
|
||
writer.Write( (int) 0 );
|
||
|
||
writer.Write( m_Range );
|
||
writer.Write( m_InRangeDelay );
|
||
writer.Write( m_OutRangeDelay );
|
||
writer.Write( m_Overseeing );
|
||
writer.Write( m_Enable );
|
||
if ( m_Enable )
|
||
writer.WriteDeltaTime( m_End );
|
||
}
|
||
|
||
public override void Deserialize( GenericReader reader )
|
||
{
|
||
base.Deserialize( reader );
|
||
|
||
int version = reader.ReadInt();
|
||
|
||
m_Range = reader.ReadInt();
|
||
m_InRangeDelay = reader.ReadInt();
|
||
m_OutRangeDelay = reader.ReadInt();
|
||
m_Overseeing = reader.ReadInt();
|
||
m_Enable = reader.ReadBool();
|
||
TimeSpan ts = TimeSpan.Zero;
|
||
if ( m_Enable )
|
||
ts = reader.ReadDeltaTime() - DateTime.Now;
|
||
DoTimer( ts );
|
||
}
|
||
}
|
||
} |