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
This commit is contained in:
Mark Sturgill 2013-10-06 03:21:18 -07:00
parent f99eefb288
commit d2c670f5c3
241 changed files with 842 additions and 831 deletions

View file

@ -18,7 +18,7 @@ namespace Server.Spells
private Item m_Scroll;
private SpellInfo m_Info;
private SpellState m_State;
private DateTime m_StartCastTime;
private int m_StartCastTime;
public SpellState State{ get{ return m_State; } set{ m_State = value; } }
public Mobile Caster{ get{ return m_Caster; } }
@ -27,7 +27,7 @@ namespace Server.Spells
public string Mantra{ get{ return m_Info.Mantra; } }
public Type[] Reagents{ get{ return m_Info.Reagents; } }
public Item Scroll{ get{ return m_Scroll; } }
public DateTime StartCastTime { get { return m_StartCastTime; } }
public int StartCastTime { get { return m_StartCastTime; } }
private static TimeSpan NextSpellDelay = TimeSpan.FromSeconds( 0.75 );
private static TimeSpan AnimateDelay = TimeSpan.FromSeconds( 1.5 );
@ -429,7 +429,7 @@ namespace Server.Spells
if ( Core.AOS && m_Caster.Player && type == DisturbType.Hurt )
DoHurtFizzle();
m_Caster.NextSpellTime = DateTime.Now + GetDisturbRecovery();
m_Caster.NextSpellTime = Core.TickCount + (int)GetDisturbRecovery().TotalMilliseconds;
}
else if ( m_State == SpellState.Sequencing )
{
@ -482,7 +482,7 @@ namespace Server.Spells
public bool Cast()
{
m_StartCastTime = DateTime.Now;
m_StartCastTime = Core.TickCount;
if ( Core.AOS && m_Caster.Spell is Spell && ((Spell)m_Caster.Spell).State == SpellState.Sequencing )
((Spell)m_Caster.Spell).Disturb( DisturbType.NewCast );
@ -507,11 +507,11 @@ namespace Server.Spells
{
m_Caster.SendLocalizedMessage( 502643 ); // You can not cast a spell while frozen.
}
else if ( CheckNextSpellTime && DateTime.Now < m_Caster.NextSpellTime )
else if (CheckNextSpellTime && Core.TickCount - m_Caster.NextSpellTime < 0)
{
m_Caster.SendLocalizedMessage( 502644 ); // You have not yet recovered from casting a spell.
}
else if ( m_Caster is PlayerMobile && ( (PlayerMobile) m_Caster ).PeacedUntil > DateTime.Now )
else if ( m_Caster is PlayerMobile && ( (PlayerMobile) m_Caster ).PeacedUntil > DateTime.UtcNow )
{
m_Caster.SendLocalizedMessage( 1072060 ); // You cannot cast a spell while calmed.
}
@ -633,7 +633,7 @@ namespace Server.Spells
if ( Core.AOS )
return TimeSpan.Zero;
double delay = 1.0 - Math.Sqrt( (DateTime.Now - m_StartCastTime).TotalSeconds / GetCastDelay().TotalSeconds );
double delay = 1.0 - Math.Sqrt((Core.TickCount - m_StartCastTime) / 1000 / GetCastDelay().TotalSeconds);
if ( delay < 0.2 )
delay = 0.2;
@ -753,7 +753,7 @@ namespace Server.Spells
m_Caster.SendLocalizedMessage( 502646 ); // You cannot cast a spell while frozen.
DoFizzle();
}
else if ( m_Caster is PlayerMobile && ((PlayerMobile) m_Caster).PeacedUntil > DateTime.Now )
else if ( m_Caster is PlayerMobile && ((PlayerMobile) m_Caster).PeacedUntil > DateTime.UtcNow )
{
m_Caster.SendLocalizedMessage( 1072060 ); // You cannot cast a spell while calmed.
DoFizzle();
@ -913,7 +913,7 @@ namespace Server.Spells
m_Spell.m_Caster.OnSpellCast( m_Spell );
if ( m_Spell.m_Caster.Region != null )
m_Spell.m_Caster.Region.OnSpellCast( m_Spell.m_Caster, m_Spell );
m_Spell.m_Caster.NextSpellTime = DateTime.Now + m_Spell.GetCastRecovery();// Spell.NextSpellDelay;
m_Spell.m_Caster.NextSpellTime = Core.TickCount + (int)m_Spell.GetCastRecovery().TotalMilliseconds; // Spell.NextSpellDelay;
Target originalTarget = m_Spell.m_Caster.Target;

View file

@ -140,7 +140,7 @@ namespace Server.Spells
{
AggressorInfo info = m.Aggressed[i];
if( info.Defender.Player && (DateTime.Now - info.LastCombatTime) < CombatHeatDelay )
if( info.Defender.Player && (DateTime.UtcNow - info.LastCombatTime) < CombatHeatDelay )
return true;
}
@ -150,7 +150,7 @@ namespace Server.Spells
{
AggressorInfo info = m.Aggressors[i];
if( info.Attacker.Player && (DateTime.Now - info.LastCombatTime) < CombatHeatDelay )
if( info.Attacker.Player && (DateTime.UtcNow - info.LastCombatTime) < CombatHeatDelay )
return true;
}
}

View file

@ -84,7 +84,7 @@ namespace Server.Spells.Chivalry
public override void DoFizzle()
{
Caster.PlaySound( 0x1D6 );
Caster.NextSpellTime = DateTime.Now;
Caster.NextSpellTime = Core.TickCount;
}
public override void DoHurtFizzle()

View file

@ -87,7 +87,7 @@ namespace Server.Spells.Eighth
{
from.SendLocalizedMessage( 501943 ); // Target cannot be seen. Try again.
from.Target = new InternalTarget( m_Owner );
from.Target.BeginTimeout( from, TimeoutTime - DateTime.Now );
from.Target.BeginTimeout( from, TimeoutTime - DateTime.UtcNow );
m_Owner = null;
}

View file

@ -94,7 +94,7 @@ namespace Server.Spells.Fifth
{
from.SendLocalizedMessage( 501943 ); // Target cannot be seen. Try again.
from.Target = new InternalTarget( m_Owner );
from.Target.BeginTimeout( from, TimeoutTime - DateTime.Now );
from.Target.BeginTimeout( from, TimeoutTime - DateTime.UtcNow );
m_Owner = null;
}

View file

@ -105,7 +105,7 @@ namespace Server.Spells.Fifth
m_Caster = caster;
m_End = DateTime.Now + duration;
m_End = DateTime.UtcNow + duration;
m_Timer = new InternalTimer( this, TimeSpan.FromSeconds( Math.Abs( val ) * 0.2 ), caster.InLOS( this ), canFit );
m_Timer.Start();
@ -239,7 +239,7 @@ namespace Server.Spells.Fifth
Effects.SendLocationParticles( EffectItem.Create( m_Item.Location, m_Item.Map, EffectItem.DefaultDuration ), 0x376A, 9, 10, 5040 );
}
}
else if ( DateTime.Now > m_Item.m_End )
else if ( DateTime.UtcNow > m_Item.m_End )
{
m_Item.Delete();
Stop();

View file

@ -118,7 +118,7 @@ namespace Server.Spells.Fourth
m_Damage = damage;
m_End = DateTime.Now + duration;
m_End = DateTime.UtcNow + duration;
m_Timer = new InternalTimer( this, TimeSpan.FromSeconds( Math.Abs( val ) * 0.2 ), caster.InLOS( this ), canFit );
m_Timer.Start();
@ -243,7 +243,7 @@ namespace Server.Spells.Fourth
Effects.SendLocationParticles( EffectItem.Create( m_Item.Location, m_Item.Map, EffectItem.DefaultDuration ), 0x376A, 9, 10, 5029 );
}
}
else if ( DateTime.Now > m_Item.m_End )
else if ( DateTime.UtcNow > m_Item.m_End )
{
m_Item.Delete();
Stop();

View file

@ -129,14 +129,14 @@ namespace Server.Spells.Necromancy
{
m_Caster = caster;
m_Target = target;
m_End = DateTime.Now + delay;
m_End = DateTime.UtcNow + delay;
Priority = TimerPriority.TwoFiftyMS;
}
protected override void OnTick()
{
if ( m_Caster.Deleted || m_Target.Deleted || !m_Caster.Alive || !m_Target.Alive || DateTime.Now >= m_End )
if ( m_Caster.Deleted || m_Target.Deleted || !m_Caster.Alive || !m_Target.Alive || DateTime.UtcNow >= m_End )
{
DoExpire ();
}

View file

@ -144,13 +144,13 @@ namespace Server.Spells.Necromancy
{
m_Caster = caster;
m_Target = target;
m_End = DateTime.Now + delay;
m_End = DateTime.UtcNow + delay;
Priority = TimerPriority.TwoFiftyMS;
}
public void RenewDelay(TimeSpan delay)
{
m_End = DateTime.Now + delay;
m_End = DateTime.UtcNow + delay;
}
public void Halt()
@ -160,7 +160,7 @@ namespace Server.Spells.Necromancy
protected override void OnTick()
{
if ( m_Target.Deleted || !m_Target.Alive || DateTime.Now >= m_End )
if ( m_Target.Deleted || !m_Target.Alive || DateTime.UtcNow >= m_End )
{
MindRotSpell.ClearMindRotScalar( m_Target );
Stop();

View file

@ -66,7 +66,7 @@ namespace Server.Spells.Necromancy
{
t.Delay += TimeSpan.FromSeconds( 2.0 );
buffTime = t.Next - DateTime.Now;
buffTime = t.Next - DateTime.UtcNow;
}
}
else

View file

@ -149,7 +149,7 @@ namespace Server.Spells.Necromancy
m_MaxBaseDamage = spiritLevel + 1;
m_HitDelay = 5;
m_NextHit = DateTime.Now + TimeSpan.FromSeconds( m_HitDelay );
m_NextHit = DateTime.UtcNow + TimeSpan.FromSeconds( m_HitDelay );
m_Count = (int)spiritLevel;
@ -167,7 +167,7 @@ namespace Server.Spells.Necromancy
Stop();
}
if ( !m_Target.Alive || DateTime.Now < m_NextHit )
if ( !m_Target.Alive || DateTime.UtcNow < m_NextHit )
return;
--m_Count;
@ -197,7 +197,7 @@ namespace Server.Spells.Necromancy
}
else
{
m_NextHit = DateTime.Now + TimeSpan.FromSeconds( m_HitDelay );
m_NextHit = DateTime.UtcNow + TimeSpan.FromSeconds( m_HitDelay );
double damage = m_MinBaseDamage + (Utility.RandomDouble() * (m_MaxBaseDamage - m_MinBaseDamage));

View file

@ -71,7 +71,7 @@ namespace Server.Spells.Ninjitsu
private bool CasterIsMoving()
{
return (DateTime.Now - Caster.LastMoveTime <= Caster.ComputeMovementSpeed(Caster.Direction));
return (Core.TickCount - Caster.LastMoveTime <= Caster.ComputeMovementSpeed(Caster.Direction));
}
private bool m_WasMoving;

View file

@ -169,7 +169,7 @@ namespace Server.Mobiles
TimeSpan duration = TimeSpan.FromSeconds( 30 + caster.Skills.Ninjitsu.Fixed / 40 );
new UnsummonTimer( caster, this, duration ).Start();
SummonEnd = DateTime.Now + duration;
SummonEnd = DateTime.UtcNow + duration;
MirrorImage.AddClone( m_Caster );
}

View file

@ -112,7 +112,7 @@ namespace Server.Spells.Sixth
m_Timer = new InternalTimer( this, duration );
m_Timer.Start();
m_End = DateTime.Now + duration;
m_End = DateTime.UtcNow + duration;
}
public override void OnAfterDelete()
@ -150,7 +150,7 @@ namespace Server.Spells.Sixth
m_Caster = reader.ReadMobile();
m_End = reader.ReadDeltaTime();
m_Timer = new InternalTimer( this, m_End - DateTime.Now );
m_Timer = new InternalTimer( this, m_End - DateTime.UtcNow );
m_Timer.Start();
break;

View file

@ -155,7 +155,7 @@ namespace Server.Spells.Spellweaving
{
to.SendLocalizedMessage( 1072828 ); // Your arcane focus is renewed.
focus.LifeSpan = duration;
focus.CreationTime = DateTime.Now;
focus.CreationTime = DateTime.UtcNow;
focus.StrengthBonus = strengthBonus;
focus.InvalidateProperties();
focus.SendTimeRemainingMessage( to );

View file

@ -114,7 +114,7 @@ namespace Server.Spells.Spellweaving
public override void DoFizzle()
{
Caster.PlaySound( 0x1D6 );
Caster.NextSpellTime = DateTime.Now;
Caster.NextSpellTime = Core.TickCount;
}
public override void DoHurtFizzle()

View file

@ -64,7 +64,7 @@ namespace Server.Items
public virtual void CheckExpiry()
{
if( (m_CreationTime + m_LifeSpan) < DateTime.Now )
if( (m_CreationTime + m_LifeSpan) < DateTime.UtcNow )
Expire( RootParent as Mobile );
else
InvalidateProperties();
@ -74,7 +74,7 @@ namespace Server.Items
public TransientItem( int itemID, TimeSpan lifeSpan )
: base( itemID )
{
m_CreationTime = DateTime.Now;
m_CreationTime = DateTime.UtcNow;
m_LifeSpan = lifeSpan;
m_Timer = Timer.DelayCall( TimeSpan.FromSeconds( 5 ), TimeSpan.FromSeconds( 5 ), new TimerCallback( CheckExpiry ) );
@ -89,7 +89,7 @@ namespace Server.Items
{
base.GetProperties( list );
TimeSpan remaining = ((m_CreationTime + m_LifeSpan) - DateTime.Now);
TimeSpan remaining = ((m_CreationTime + m_LifeSpan) - DateTime.UtcNow);
list.Add( 1072517, ((int)remaining.TotalSeconds).ToString() ); // Lifespan: ~1_val~ seconds
}

View file

@ -117,7 +117,7 @@ namespace Server.Spells.Third
m_Timer = new InternalTimer( this, TimeSpan.FromSeconds( 10.0 ) );
m_Timer.Start();
m_End = DateTime.Now + TimeSpan.FromSeconds( 10.0 );
m_End = DateTime.UtcNow + TimeSpan.FromSeconds( 10.0 );
}
public InternalItem( Serial serial ) : base( serial )
@ -145,7 +145,7 @@ namespace Server.Spells.Third
{
m_End = reader.ReadDeltaTime();
m_Timer = new InternalTimer( this, m_End - DateTime.Now );
m_Timer = new InternalTimer( this, m_End - DateTime.UtcNow );
m_Timer.Start();
break;
@ -157,7 +157,7 @@ namespace Server.Spells.Third
m_Timer = new InternalTimer( this, duration );
m_Timer.Start();
m_End = DateTime.Now + duration;
m_End = DateTime.UtcNow + duration;
break;
}