runuo/Scripts/Engines/MLQuests/Objectives/BaseObjective.cs
Mark Sturgill d2c670f5c3 Implement Core.TickCount
Convert movement, actions (lift/use), combat, and spells to use Core.TickCount and avoid DateTime caveats (performance, system time dependency, etc)
Refactor DateTime.Now to DateTime.UtcNow
Add LOS check for Iron Maiden addon
2013-10-06 03:21:18 -07:00

214 lines
4.4 KiB
C#

using System;
using Server;
using Server.Engines.MLQuests;
using Server.Mobiles;
using Server.Gumps;
using System.Collections.Generic;
namespace Server.Engines.MLQuests.Objectives
{
public abstract class BaseObjective
{
public virtual bool IsTimed { get { return false; } }
public virtual TimeSpan Duration { get { return TimeSpan.Zero; } }
public BaseObjective()
{
}
public virtual bool CanOffer( IQuestGiver quester, PlayerMobile pm, bool message )
{
return true;
}
public abstract void WriteToGump( Gump g, ref int y );
public virtual BaseObjectiveInstance CreateInstance( MLQuestInstance instance )
{
return null;
}
}
public abstract class BaseObjectiveInstance
{
private MLQuestInstance m_Instance;
private DateTime m_EndTime;
private bool m_Expired;
public MLQuestInstance Instance
{
get { return m_Instance; }
}
public bool IsTimed
{
get { return ( m_EndTime != DateTime.MinValue ); }
}
public DateTime EndTime
{
get { return m_EndTime; }
set { m_EndTime = value; }
}
public bool Expired
{
get { return m_Expired; }
set { m_Expired = value; }
}
public BaseObjectiveInstance( MLQuestInstance instance, BaseObjective obj )
{
m_Instance = instance;
if ( obj.IsTimed )
m_EndTime = DateTime.UtcNow + obj.Duration;
}
public virtual void WriteToGump( Gump g, ref int y )
{
if ( IsTimed )
WriteTimeRemaining( g, ref y, ( m_EndTime > DateTime.UtcNow ) ? ( m_EndTime - DateTime.UtcNow ) : TimeSpan.Zero );
}
public static void WriteTimeRemaining( Gump g, ref int y, TimeSpan timeRemaining )
{
g.AddHtmlLocalized( 103, y, 120, 16, 1062379, 0x15F90, false, false ); // Est. time remaining:
g.AddLabel( 223, y, 0x481, timeRemaining.TotalSeconds.ToString( "F0" ) );
y += 16;
}
public virtual bool AllowsQuestItem( Item item, Type type )
{
return false;
}
public virtual bool IsCompleted()
{
return false;
}
public virtual void CheckComplete()
{
if ( IsCompleted() )
{
m_Instance.Player.PlaySound( 0x5B6 ); // public sound
m_Instance.CheckComplete();
}
}
public virtual void OnQuestAccepted()
{
}
public virtual void OnQuestCancelled()
{
}
public virtual void OnQuestCompleted()
{
}
public virtual bool OnBeforeClaimReward()
{
return true;
}
public virtual void OnClaimReward()
{
}
public virtual void OnAfterClaimReward()
{
}
public virtual void OnRewardClaimed()
{
}
public virtual void OnQuesterDeleted()
{
}
public virtual void OnPlayerDeath()
{
}
public virtual void OnExpire()
{
}
public enum DataType : byte
{
None,
EscortObjective,
KillObjective,
DeliverObjective
}
public virtual DataType ExtraDataType { get { return DataType.None; } }
public virtual void Serialize( GenericWriter writer )
{
// Version info is written in MLQuestPersistence.Serialize
if ( IsTimed )
{
writer.Write( true );
writer.WriteDeltaTime( m_EndTime );
}
else
{
writer.Write( false );
}
// For type checks on deserialization
// (This way quest objectives can be changed without breaking serialization)
writer.Write( (byte)ExtraDataType );
}
public static void Deserialize( GenericReader reader, int version, BaseObjectiveInstance objInstance )
{
if ( reader.ReadBool() )
{
DateTime endTime = reader.ReadDeltaTime();
if ( objInstance != null )
objInstance.EndTime = endTime;
}
DataType extraDataType = (DataType)reader.ReadByte();
switch ( extraDataType )
{
case DataType.EscortObjective:
{
bool completed = reader.ReadBool();
if ( objInstance is EscortObjectiveInstance )
( (EscortObjectiveInstance)objInstance ).HasCompleted = completed;
break;
}
case DataType.KillObjective:
{
int slain = reader.ReadInt();
if ( objInstance is KillObjectiveInstance )
( (KillObjectiveInstance)objInstance ).Slain = slain;
break;
}
case DataType.DeliverObjective:
{
bool completed = reader.ReadBool();
if ( objInstance is DeliverObjectiveInstance )
( (DeliverObjectiveInstance)objInstance ).HasCompleted = completed;
break;
}
}
}
}
}