Files
abysmal-isle/Scripts/SubSystem/Event System/BaseEvent.cs
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

220 lines
4.4 KiB
C#

using System;
using System.Collections.Generic;
using Server.Items;
using Server.Mobiles;
namespace Server.EventSystem
{
public abstract class BaseEvent
{
#region Private Variables
private bool m_Enabled;
private bool m_Started;
//private Point3D m_StartingLocation;
//private Map m_StartingMap;
private EventTimer m_EventTimer;
#endregion
#region Public Variables
public bool Enabled { get { return m_Enabled; } }
public bool Started { get { return m_Started; } }
/*[CommandProperty( AccessLevel.Administrator )]
public Point3D StartingLocation { get { return m_StartingLocation; } set { m_StartingLocation = value; } }
[CommandProperty( AccessLevel.Administrator )]
public Map StartingMap { get { return m_StartingMap; } set { m_StartingMap = value; } }*/
public EventTimer EventTimer { get { return m_EventTimer; } set { m_EventTimer = value; } }
#endregion
#region Abstract Properties/Methods
public abstract EventType EventType { get; }
public abstract string EventName { get; }
public abstract TimeSpan TimerFrequency { get; }
public abstract Map StartingMap { get; }
public abstract Point3D StartingLocation { get; }
protected abstract void OnEnable();
protected abstract void OnDisable();
public abstract void OnStart();
protected abstract void OnStop();
public abstract void OnTick( int ticks );
#endregion
#region Constructor
public BaseEvent()
{
}
#endregion
#region Virtual Methods
public virtual void Enable()
{
if ( !m_Enabled )
{
m_Enabled = true;
OnEnable();
}
}
public virtual void Disable()
{
if ( m_Enabled )
{
m_Enabled = false;
OnDisable();
}
}
public virtual void Start()
{
if ( !m_Started )
{
m_Started = true;
if ( m_EventTimer != null )
m_EventTimer.Stop();
if ( TimerFrequency != TimeSpan.Zero )
{
m_EventTimer = new EventTimer( this );
m_EventTimer.Start();
}
OnStart();
}
}
public virtual void Stop()
{
if ( m_Started )
{
m_Started = false;
if ( m_EventTimer != null )
{
m_EventTimer.Stop();
m_EventTimer = null;
}
OnStop();
}
}
public virtual void RefreshPlayer( Mobile from )
{
if ( from == null )
return;
if ( !from.Alive )
from.Resurrect();
Container pack = from.Backpack;
Item holding = from.Holding;
if ( holding != null && pack != null )
pack.DropItem( holding );
from.RevealingAction();
from.Poison = null;
from.StatMods.Clear();
Factions.Faction.ClearSkillLoss( from );
from.Hits = from.HitsMax;
from.Mana = from.ManaMax;
from.Stam = from.StamMax;
Targeting.Target.Cancel( from );
from.MagicDamageAbsorb = 0;
from.MeleeDamageAbsorb = 0;
Spells.Second.ProtectionSpell.Registry.Remove( from );
DefensiveSpell.Nullify( from );
from.Combatant = null;
from.Delta( MobileDelta.Noto ); //Update notoriety
}
public virtual void Serialize( GenericWriter writer )
{
writer.Write( (int)0 ); //version
}
public virtual void Deserialize( GenericReader reader )
{
int version = reader.ReadInt();
switch ( version )
{
case 0:
{
break;
}
}
}
#endregion
#region Public Methods
public void Announce( int hue, string message, params object[] args )
{
World.Broadcast( hue, false, String.Format( "[{0}]: {1}", EventName, message ), args );
}
public void LocalAnnounce( Point3D p, Map map, int range, int hue, string message, params object[] args )
{
IPooledEnumerable eable = map.GetMobilesInRange( p, range );
foreach (Mobile mobile in eable)
{
if (mobile != null && mobile is PlayerMobile)
{
mobile.SendMessage(hue, message, args);
}
}
eable.Free(); //get rid of our enumerable.
}
public void SpawnGates()
{
Action<Point3D> spawnGate = delegate( Point3D loc ) { new EventGate( this ).MoveToWorld( loc, Map.Felucca ); };
MoongateLocations.Banks.ForEach( spawnGate );
MoongateLocations.Shrines.ForEach( spawnGate );
}
public void DespawnGates()
{
List<Item> gates = new List<Item>();
foreach ( Item i in World.Items.Values )
{
if ( i is EventGate )
gates.Add( i );
}
foreach ( Item gate in gates )
gate.Delete();
}
#endregion
}
}