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
223 lines
No EOL
4.8 KiB
C#
223 lines
No EOL
4.8 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Server;
|
|
using Server.Network;
|
|
using Server.Gumps;
|
|
using Server.Multis;
|
|
using Server.ContextMenus;
|
|
|
|
namespace Server.Items
|
|
{
|
|
[FlipableAttribute( 0x234C, 0x234D )]
|
|
public class RoseOfTrinsic : Item, ISecurable
|
|
{
|
|
private static readonly TimeSpan m_SpawnTime = TimeSpan.FromHours( 4.0 );
|
|
|
|
private int m_Petals;
|
|
private DateTime m_NextSpawnTime;
|
|
private SpawnTimer m_SpawnTimer;
|
|
|
|
private SecureLevel m_Level;
|
|
|
|
public override int LabelNumber{ get{ return 1062913; } } // Rose of Trinsic
|
|
|
|
[CommandProperty( AccessLevel.GameMaster )]
|
|
public SecureLevel Level
|
|
{
|
|
get{ return m_Level; }
|
|
set{ m_Level = value; }
|
|
}
|
|
|
|
[CommandProperty( AccessLevel.GameMaster )]
|
|
public int Petals
|
|
{
|
|
get{ return m_Petals; }
|
|
set
|
|
{
|
|
if ( value >= 10 )
|
|
{
|
|
m_Petals = 10;
|
|
|
|
StopSpawnTimer();
|
|
}
|
|
else
|
|
{
|
|
if ( value <= 0 )
|
|
m_Petals = 0;
|
|
else
|
|
m_Petals = value;
|
|
|
|
StartSpawnTimer( m_SpawnTime );
|
|
}
|
|
|
|
InvalidateProperties();
|
|
}
|
|
}
|
|
|
|
[Constructable]
|
|
public RoseOfTrinsic() : base( 0x234D )
|
|
{
|
|
Weight = 1.0;
|
|
LootType = LootType.Blessed;
|
|
|
|
m_Petals = 0;
|
|
StartSpawnTimer( TimeSpan.FromMinutes( 1.0 ) );
|
|
}
|
|
|
|
public override void GetProperties( ObjectPropertyList list )
|
|
{
|
|
base.GetProperties( list );
|
|
|
|
list.Add( 1062925, Petals.ToString() ); // Petals: ~1_COUNT~
|
|
}
|
|
|
|
public override void GetContextMenuEntries( Mobile from, List<ContextMenuEntry> list )
|
|
{
|
|
base.GetContextMenuEntries( from, list );
|
|
|
|
SetSecureLevelEntry.AddTo( from, this, list );
|
|
}
|
|
|
|
private void StartSpawnTimer( TimeSpan delay )
|
|
{
|
|
StopSpawnTimer();
|
|
|
|
m_SpawnTimer = new SpawnTimer( this, delay );
|
|
m_SpawnTimer.Start();
|
|
|
|
m_NextSpawnTime = DateTime.UtcNow + delay;
|
|
}
|
|
|
|
private void StopSpawnTimer()
|
|
{
|
|
if ( m_SpawnTimer != null )
|
|
{
|
|
m_SpawnTimer.Stop();
|
|
m_SpawnTimer = null;
|
|
}
|
|
}
|
|
|
|
private class SpawnTimer : Timer
|
|
{
|
|
private RoseOfTrinsic m_Rose;
|
|
|
|
public SpawnTimer( RoseOfTrinsic rose, TimeSpan delay ) : base( delay )
|
|
{
|
|
m_Rose = rose;
|
|
|
|
Priority = TimerPriority.OneMinute;
|
|
}
|
|
|
|
protected override void OnTick()
|
|
{
|
|
if ( m_Rose.Deleted )
|
|
return;
|
|
|
|
m_Rose.m_SpawnTimer = null;
|
|
m_Rose.Petals++;
|
|
}
|
|
}
|
|
|
|
public override void OnDoubleClick( Mobile from )
|
|
{
|
|
if ( !from.InRange( GetWorldLocation(), 2 ) )
|
|
{
|
|
from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 1019045 ); // I can't reach that.
|
|
}
|
|
else if ( Petals > 0 )
|
|
{
|
|
from.AddToBackpack( new RoseOfTrinsicPetal( Petals ) );
|
|
Petals = 0;
|
|
}
|
|
}
|
|
|
|
public RoseOfTrinsic( Serial serial ) : base( serial )
|
|
{
|
|
}
|
|
|
|
public override void Serialize( GenericWriter writer )
|
|
{
|
|
base.Serialize( writer );
|
|
|
|
writer.WriteEncodedInt( (int) 0 ); // version
|
|
|
|
writer.WriteEncodedInt( (int) m_Petals );
|
|
writer.WriteDeltaTime( (DateTime) m_NextSpawnTime );
|
|
writer.WriteEncodedInt( (int) m_Level );
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize( reader );
|
|
|
|
int version = reader.ReadEncodedInt();
|
|
|
|
m_Petals = reader.ReadEncodedInt();
|
|
m_NextSpawnTime = reader.ReadDeltaTime();
|
|
m_Level = (SecureLevel) reader.ReadEncodedInt();
|
|
|
|
if ( m_Petals < 10 )
|
|
StartSpawnTimer( m_NextSpawnTime - DateTime.UtcNow );
|
|
}
|
|
}
|
|
|
|
public class RoseOfTrinsicPetal : Item
|
|
{
|
|
public override int LabelNumber{ get{ return 1062926; } } // Petal of the Rose of Trinsic
|
|
|
|
[Constructable]
|
|
public RoseOfTrinsicPetal() : this( 1 )
|
|
{
|
|
}
|
|
|
|
[Constructable]
|
|
public RoseOfTrinsicPetal( int amount ) : base( 0x1021 )
|
|
{
|
|
Stackable = true;
|
|
Amount = amount;
|
|
|
|
Weight = 1.0;
|
|
Hue = 0xE;
|
|
}
|
|
|
|
|
|
|
|
public override void OnDoubleClick( Mobile from )
|
|
{
|
|
if ( !IsChildOf( from.Backpack ) )
|
|
{
|
|
from.SendLocalizedMessage( 1042038 ); // You must have the object in your backpack to use it.
|
|
}
|
|
else if ( from.GetStatMod( "RoseOfTrinsicPetal" ) != null )
|
|
{
|
|
from.SendLocalizedMessage( 1062927 ); // You have eaten one of these recently and eating another would provide no benefit.
|
|
}
|
|
else
|
|
{
|
|
from.PlaySound( 0x1EE );
|
|
from.AddStatMod( new StatMod( StatType.Str, "RoseOfTrinsicPetal", 5, TimeSpan.FromMinutes( 5.0 ) ) );
|
|
|
|
Consume();
|
|
}
|
|
}
|
|
|
|
public RoseOfTrinsicPetal( Serial serial ) : base( serial )
|
|
{
|
|
}
|
|
|
|
public override void Serialize( GenericWriter writer )
|
|
{
|
|
base.Serialize( writer );
|
|
|
|
writer.WriteEncodedInt( (int) 0 ); // version
|
|
}
|
|
|
|
public override void Deserialize(GenericReader reader)
|
|
{
|
|
base.Deserialize( reader );
|
|
|
|
int version = reader.ReadEncodedInt();
|
|
}
|
|
}
|
|
} |