fix(core): Caches DateTime.NowUtc (#548)

- [X] Caches DateTime.NowUtc on the game loop (not other threads)
- [X] Replaces all locations where it makes sense
- [X] Adds Min/Max for `IComparable` (TimeSpan, DateTimes, etc)

Closes #261
This commit is contained in:
Kamron Batman 2021-03-13 01:32:04 -08:00 • committed by GitHub
parent 5de6edbeb8
commit 6c4308bce6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
208 changed files with 660 additions and 793 deletions

View file

@ -26,7 +26,7 @@ namespace Server.Items
Movable = false;
m_MinDamage = minDamage;
m_MaxDamage = maxDamage;
m_Created = DateTime.UtcNow;
m_Created = Core.Now;
m_Duration = duration;
m_Timer = Timer.DelayCall(TimeSpan.Zero, TimeSpan.FromSeconds(1), OnTick);
}
@ -44,7 +44,7 @@ namespace Server.Items
private void OnTick()
{
var now = DateTime.UtcNow;
var now = Core.Now;
var age = now - m_Created;
if (age > m_Duration)

View file

@ -113,7 +113,7 @@ namespace Server.Items
m_CorpseName = GetCorpseName(owner);
TimeOfDeath = DateTime.UtcNow;
TimeOfDeath = Core.Now;
AccessLevel = owner.AccessLevel;
Guild = owner.Guild as Guild;
@ -140,10 +140,10 @@ namespace Server.Items
{
var info = owner.Aggressors[i];
if (DateTime.UtcNow - info.LastCombatTime < lastTime)
if (Core.Now - info.LastCombatTime < lastTime)
{
Killer = info.Attacker;
lastTime = DateTime.UtcNow - info.LastCombatTime;
lastTime = Core.Now - info.LastCombatTime;
}
if (!isBaseCreature && !info.CriminalAggression)
@ -156,10 +156,10 @@ namespace Server.Items
{
var info = owner.Aggressed[i];
if (DateTime.UtcNow - info.LastCombatTime < lastTime)
if (Core.Now - info.LastCombatTime < lastTime)
{
Killer = info.Defender;
lastTime = DateTime.UtcNow - info.LastCombatTime;
lastTime = Core.Now - info.LastCombatTime;
}
if (!isBaseCreature)
@ -200,7 +200,7 @@ namespace Server.Items
}
[CommandProperty(AccessLevel.GameMaster)]
public virtual bool InstancedCorpse => Core.SE && DateTime.UtcNow < TimeOfDeath + InstancedCorpseTime;
public virtual bool InstancedCorpse => Core.SE && Core.Now < TimeOfDeath + InstancedCorpseTime;
public override bool IsDecoContainer => false;
@ -471,7 +471,7 @@ namespace Server.Items
{
m_DecayTimer?.Stop();
m_DecayTime = DateTime.UtcNow + delay;
m_DecayTime = Core.Now + delay;
m_DecayTimer = new InternalTimer(this, delay);
m_DecayTimer.Start();
@ -657,7 +657,7 @@ namespace Server.Items
if (reader.ReadBool())
{
BeginDecay(reader.ReadDeltaTime() - DateTime.UtcNow);
BeginDecay(reader.ReadDeltaTime() - Core.Now);
}
Looters = reader.ReadEntityList<Mobile>();
@ -711,7 +711,7 @@ namespace Server.Items
{
if (reader.ReadBool())
{
BeginDecay(reader.ReadDeltaTime() - DateTime.UtcNow);
BeginDecay(reader.ReadDeltaTime() - Core.Now);
}
goto case 6;
@ -757,7 +757,7 @@ namespace Server.Items
{
if (version < 10)
{
TimeOfDeath = DateTime.UtcNow;
TimeOfDeath = Core.Now;
}
if (version < 7)

View file

@ -27,7 +27,7 @@ namespace Server.Items
{
m_DecayTimer?.Stop();
m_DecayTime = DateTime.UtcNow + delay;
m_DecayTime = Core.Now + delay;
m_DecayTimer = new InternalTimer(this, delay);
m_DecayTimer.Start();
@ -85,7 +85,7 @@ namespace Server.Items
{
if (reader.ReadBool())
{
BeginDecay(reader.ReadDeltaTime() - DateTime.UtcNow);
BeginDecay(reader.ReadDeltaTime() - Core.Now);
}
break;

View file

@ -14,7 +14,7 @@ namespace Server.Items
{
Movable = false;
Light = LightType.Circle225;
NextSpawn = DateTime.UtcNow;
NextSpawn = Core.Now;
NextSpawnDelay = TimeSpan.FromMinutes(15.0);
SpawnRange = 5;
}
@ -87,7 +87,7 @@ namespace Server.Items
NextSpawnDelay = reader.ReadTimeSpan();
}
NextSpawn = DateTime.UtcNow;
NextSpawn = Core.Now;
}
public virtual void HeedWarning()
@ -101,7 +101,7 @@ namespace Server.Items
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if (NextSpawn < DateTime.UtcNow) // means we haven't spawned anything if the next spawn is below
if (NextSpawn < Core.Now) // means we haven't spawned anything if the next spawn is below
{
if (Utility.InRange(m.Location, Location, 1) && !Utility.InRange(oldLocation, Location, 1) && m.Player &&
!(m.AccessLevel > AccessLevel.Player || m.Hidden))
@ -171,7 +171,7 @@ namespace Server.Items
{
try
{
if (NextSpawn < DateTime.UtcNow)
if (NextSpawn < Core.Now)
{
var map = Map;
var bc = Creatures.RandomElement().CreateInstance<BaseCreature>();
@ -182,7 +182,7 @@ namespace Server.Items
Timer.DelayCall(TimeSpan.FromSeconds(1), SummonCreatureToWorld, bc, spawnLoc, map);
NextSpawn = DateTime.UtcNow + NextSpawnDelay;
NextSpawn = Core.Now + NextSpawnDelay;
}
else
{

View file

@ -225,7 +225,7 @@ namespace Server.Items
{
Movable = false;
m_LitBy = litBy;
m_Expire = DateTime.UtcNow + TimeSpan.FromSeconds(10);
m_Expire = Core.Now + TimeSpan.FromSeconds(10);
m_Burning = toDamage;
m_Timer = Timer.DelayCall(TimeSpan.FromSeconds(1.0), TimeSpan.FromSeconds(1.0), OnFirebombFieldTimerTick);
}
@ -295,7 +295,7 @@ namespace Server.Items
}
}
if (DateTime.UtcNow >= m_Expire)
if (Core.Now >= m_Expire)
{
m_Timer.Stop();
Delete();

View file

@ -24,7 +24,7 @@ namespace Server.Items
{
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that
}
else if (Visible && (ItemID == 4656 || ItemID == 4702) && DateTime.UtcNow >= m_NextUse)
else if (Visible && (ItemID == 4656 || ItemID == 4702) && Core.Now >= m_NextUse)
{
var p = GetWorldLocation();
@ -42,7 +42,7 @@ namespace Server.Items
Timer.DelayCall(TimeSpan.FromSeconds(5.00), BackUp);
m_NextUse = DateTime.UtcNow + TimeSpan.FromSeconds(10.0);
m_NextUse = Core.Now + TimeSpan.FromSeconds(10.0);
}
}

View file

@ -244,7 +244,7 @@ namespace Server.Items
if (text.Length > 0)
{
var message = new PlayerBBMessage(DateTime.UtcNow, from, text);
var message = new PlayerBBMessage(Core.Now, from, text);
if (m_Greeting)
{

View file

@ -27,7 +27,7 @@ namespace Server.Items
m_MinDamage = minDamage;
m_MaxDamage = maxDamage;
m_Created = DateTime.UtcNow;
m_Created = Core.Now;
m_Duration = duration;
m_Timer = Timer.DelayCall(TimeSpan.Zero, TimeSpan.FromSeconds(1), OnTick);
@ -46,7 +46,7 @@ namespace Server.Items
private void OnTick()
{
var now = DateTime.UtcNow;
var now = Core.Now;
var age = now - m_Created;
if (age > m_Duration)

View file

@ -197,7 +197,7 @@ namespace Server.Items
}
if (m_User.Deleted || m_User.Map != Map || !m_User.InRange(this, 3)
|| m_User.NetState == null || DateTime.UtcNow - m_LastUse >= m_UseTimeout)
|| m_User.NetState == null || Core.Now - m_LastUse >= m_UseTimeout)
{
m_User.CloseGump<GameGump>();
}
@ -209,7 +209,7 @@ namespace Server.Items
}
m_User = from;
m_LastUse = DateTime.UtcNow;
m_LastUse = Core.Now;
from.SendGump(new GameGump(this, from, 0, false));
}
@ -473,7 +473,7 @@ namespace Server.Items
if (40.0 + Utility.RandomDouble() * 80.0 < lockpicking)
{
m_From.SendGump(new GameGump(m_Panel, m_From, m_Step, true));
m_Panel.m_LastUse = DateTime.UtcNow;
m_Panel.m_LastUse = Core.Now;
}
else
{
@ -520,7 +520,7 @@ namespace Server.Items
{
m_From.PlaySound(0x1F4);
m_From.SendGump(new GameGump(m_Panel, m_From, m_Step + 1, false));
m_Panel.m_LastUse = DateTime.UtcNow;
m_Panel.m_LastUse = Core.Now;
}
}
else

View file

@ -755,7 +755,7 @@ namespace Server.Items
if (ShowTimeRemaining)
{
m.SendMessage("Time remaining: {0}", FormatTime(info.Timer.Next - DateTime.UtcNow));
m.SendMessage("Time remaining: {0}", FormatTime(info.Timer.Next - Core.Now));
}
Timer.DelayCall(TimeSpan.FromSeconds(5), EndLock, m);
@ -932,7 +932,7 @@ namespace Server.Items
var m = reader.ReadEntity<Mobile>();
var end = reader.ReadDateTime();
StartTimer(m, end - DateTime.UtcNow);
StartTimer(m, end - Core.Now);
}
}
}

View file

@ -100,12 +100,12 @@ namespace Server.Items
public virtual void Broadcast(Mobile triggerer)
{
if (m_Broadcasting || DateTime.UtcNow < m_LastBroadcast + ResetDelay)
if (m_Broadcasting || Core.Now < m_LastBroadcast + ResetDelay)
{
return;
}
m_LastBroadcast = DateTime.UtcNow;
m_LastBroadcast = Core.Now;
m_Broadcasting = true;