runuo/Scripts/Items/Containers/MarkContainer.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

267 lines
No EOL
6.2 KiB
C#

using System;
using Server;
using Server.Commands;
namespace Server.Items
{
public class MarkContainer : LockableContainer
{
public static void Initialize()
{
CommandSystem.Register( "SecretLocGen", AccessLevel.Administrator, new CommandEventHandler( SecretLocGen_OnCommand ) );
}
[Usage( "SecretLocGen" )]
[Description( "Generates mark containers to Malas secret locations." )]
public static void SecretLocGen_OnCommand( CommandEventArgs e )
{
CreateMalasPassage( 951, 546, -70, 1006, 994, -70, false, false );
CreateMalasPassage( 914, 192, -79, 1019, 1062, -70, false, false );
CreateMalasPassage( 1614, 143, -90, 1214, 1313, -90, false, false );
CreateMalasPassage( 2176, 324, -90, 1554, 172, -90, false, false );
CreateMalasPassage( 864, 812, -90, 1061, 1161, -70, false, false );
CreateMalasPassage( 1051, 1434, -85, 1076, 1244, -70, false, true );
CreateMalasPassage( 1326, 523, -87, 1201, 1554, -70, false, false );
CreateMalasPassage( 424, 189, -1, 2333, 1501, -90, true, false );
CreateMalasPassage( 1313, 1115, -85, 1183, 462, -45, false, false );
e.Mobile.SendMessage( "Secret mark containers have been created." );
}
private static bool FindMarkContainer( Point3D p, Map map )
{
IPooledEnumerable eable = map.GetItemsInRange( p, 0 );
foreach ( Item item in eable )
{
if ( item.Z == p.Z && item is MarkContainer )
{
eable.Free();
return true;
}
}
eable.Free();
return false;
}
private static void CreateMalasPassage( int x, int y, int z, int xTarget, int yTarget, int zTarget, bool bone, bool locked )
{
Point3D location = new Point3D( x, y, z );
if ( FindMarkContainer( location, Map.Malas ) )
return;
MarkContainer cont = new MarkContainer( bone, locked );
cont.TargetMap = Map.Malas;
cont.Target = new Point3D( xTarget, yTarget, zTarget );
cont.Description = "strange location";
cont.MoveToWorld( location, Map.Malas );
}
private bool m_AutoLock;
private InternalTimer m_RelockTimer;
private Map m_TargetMap;
private Point3D m_Target;
private string m_Description;
[CommandProperty( AccessLevel.GameMaster )]
public bool AutoLock
{
get { return m_AutoLock; }
set
{
m_AutoLock = value;
if ( !m_AutoLock )
StopTimer();
else if ( !Locked && m_RelockTimer == null )
m_RelockTimer = new InternalTimer( this );
}
}
[CommandProperty( AccessLevel.GameMaster )]
public Map TargetMap { get { return m_TargetMap; } set { m_TargetMap = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public Point3D Target { get { return m_Target; } set { m_Target = value; } }
[CommandProperty( AccessLevel.GameMaster )]
public bool Bone
{
get { return ItemID == 0xECA; }
set
{
ItemID = value ? 0xECA : 0xE79;
Hue = value ? 1102 : 0;
}
}
[CommandProperty( AccessLevel.GameMaster )]
public string Description { get { return m_Description; } set { m_Description = value; } }
public override bool IsDecoContainer
{
get{ return false; }
}
[Constructable]
public MarkContainer() : this( false )
{
}
[Constructable]
public MarkContainer( bool bone ) : this( bone, false )
{
}
[Constructable]
public MarkContainer( bool bone, bool locked ) : base( bone ? 0xECA : 0xE79 )
{
Movable = false;
if ( bone )
Hue = 1102;
m_AutoLock = locked;
Locked = locked;
if ( locked )
LockLevel = -255;
}
public MarkContainer( Serial serial ) : base( serial )
{
}
[CommandProperty( AccessLevel.GameMaster )]
public override bool Locked
{
get { return base.Locked; }
set
{
base.Locked = value;
if ( m_AutoLock )
{
StopTimer();
if ( !Locked )
m_RelockTimer = new InternalTimer( this );
}
}
}
public void StopTimer()
{
if ( m_RelockTimer != null )
m_RelockTimer.Stop();
m_RelockTimer = null;
}
private class InternalTimer : Timer
{
private MarkContainer m_Container;
private DateTime m_RelockTime;
public MarkContainer Container { get { return m_Container; } }
public DateTime RelockTime { get { return m_RelockTime; } }
public InternalTimer( MarkContainer container ) : this( container, TimeSpan.FromMinutes( 5.0 ) )
{
}
public InternalTimer( MarkContainer container, TimeSpan delay ) : base( delay )
{
m_Container = container;
m_RelockTime = DateTime.UtcNow + delay;
Start();
}
protected override void OnTick()
{
m_Container.Locked = true;
m_Container.LockLevel = -255;
}
}
public void Mark( RecallRune rune )
{
if ( TargetMap != null )
{
rune.Marked = true;
rune.TargetMap = m_TargetMap;
rune.Target = m_Target;
rune.Description = m_Description;
rune.House = null;
}
}
public override bool OnDragDrop( Mobile from, Item dropped )
{
RecallRune rune = dropped as RecallRune;
if ( rune != null && base.OnDragDrop( from, dropped ) )
{
Mark( rune );
return true;
}
else
{
return false;
}
}
public override bool OnDragDropInto( Mobile from, Item dropped, Point3D p )
{
RecallRune rune = dropped as RecallRune;
if ( rune != null && base.OnDragDropInto( from, dropped, p ) )
{
Mark( rune );
return true;
}
else
{
return false;
}
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( (int)0 ); // version
writer.Write( m_AutoLock );
if ( !Locked && m_AutoLock )
writer.WriteDeltaTime( m_RelockTimer.RelockTime );
writer.Write( m_TargetMap );
writer.Write( m_Target );
writer.Write( m_Description );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
m_AutoLock = reader.ReadBool();
if ( !Locked && m_AutoLock )
m_RelockTimer = new InternalTimer( this, reader.ReadDeltaTime() - DateTime.UtcNow );
m_TargetMap = reader.ReadMap();
m_Target = reader.ReadPoint3D();
m_Description = reader.ReadString();
}
}
}