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

@ -1760,7 +1760,7 @@ namespace Server.Mobiles
public virtual bool DoBardPacified()
{
if (DateTime.UtcNow < m_Mobile.BardEndTime)
if (Core.Now < m_Mobile.BardEndTime)
{
m_Mobile.DebugSay("I am pacified, I wait");
m_Mobile.Combatant = null;
@ -1777,7 +1777,7 @@ namespace Server.Mobiles
public virtual bool DoBardProvoked()
{
if (DateTime.UtcNow >= m_Mobile.BardEndTime &&
if (Core.Now >= m_Mobile.BardEndTime &&
(m_Mobile.BardMaster?.Deleted != false ||
m_Mobile.BardMaster.Map != m_Mobile.Map || m_Mobile.GetDistanceToSqrt(m_Mobile.BardMaster) >
m_Mobile.RangePerception))
@ -1944,7 +1944,7 @@ namespace Server.Mobiles
using (var op = new StreamWriter("nan_transform.txt", true))
{
op.WriteLine(
$"NaN in TransformMoveDelay: {DateTime.UtcNow}, {GetType()}, {m_Mobile?.GetType()}, {m_Mobile.HitsMax}"
$"NaN in TransformMoveDelay: {Core.Now}, {GetType()}, {m_Mobile?.GetType()}, {m_Mobile.HitsMax}"
);
}

View file

@ -100,7 +100,7 @@ namespace Server.Mobiles
from.SendLocalizedMessage(1071182); // The cow nimbly escapes your attempts to milk it.
}
if (Milk == 0 && MilkedOn + TimeSpan.FromDays(1) > DateTime.UtcNow)
if (Milk == 0 && MilkedOn + TimeSpan.FromDays(1) > Core.Now)
{
from.SendLocalizedMessage(1080198); // This cow can not be milked now. Please wait for some time.
}
@ -111,7 +111,7 @@ namespace Server.Mobiles
Milk = 4;
}
MilkedOn = DateTime.UtcNow;
MilkedOn = Core.Now;
Milk--;
return true;

View file

@ -54,7 +54,7 @@ namespace Server.Mobiles
set
{
m_NextWoolTime = value;
Body = DateTime.UtcNow >= m_NextWoolTime ? 0xCF : 0xDF;
Body = Core.Now >= m_NextWoolTime ? 0xCF : 0xDF;
}
}
@ -68,7 +68,7 @@ namespace Server.Mobiles
public void Carve(Mobile from, Item item)
{
if (DateTime.UtcNow < m_NextWoolTime)
if (Core.Now < m_NextWoolTime)
{
// This sheep is not yet ready to be shorn.
PrivateOverheadMessage(MessageType.Regular, 0x3B2, 500449, from.NetState);
@ -78,13 +78,13 @@ namespace Server.Mobiles
from.SendLocalizedMessage(500452); // You place the gathered wool into your backpack.
from.AddToBackpack(new Wool(Map == Map.Felucca ? 2 : 1));
NextWoolTime = DateTime.UtcNow + TimeSpan.FromHours(3.0); // TODO: Proper time delay
NextWoolTime = Core.Now + TimeSpan.FromHours(3.0); // TODO: Proper time delay
}
public override void OnThink()
{
base.OnThink();
Body = DateTime.UtcNow >= m_NextWoolTime ? 0xCF : 0xDF;
Body = Core.Now >= m_NextWoolTime ? 0xCF : 0xDF;
}
public override void Serialize(IGenericWriter writer)

View file

@ -134,10 +134,10 @@ namespace Server.Mobiles
var attacker = from ?? m_Rider.FindMostRecentDamager(true);
if (!(attacker == this || attacker == m_Rider || willKill || DateTime.UtcNow < NextMountAbility)
if (!(attacker == this || attacker == m_Rider || willKill || Core.Now < NextMountAbility)
&& DoMountAbility(amount, from))
{
NextMountAbility = DateTime.UtcNow + MountAbilityDelay;
NextMountAbility = Core.Now + MountAbilityDelay;
}
}

View file

@ -962,7 +962,7 @@ namespace Server.Mobiles
{
if (m_DeleteTimer?.Running == true)
{
return m_DeleteTimer.Next - DateTime.UtcNow;
return m_DeleteTimer.Next - Core.Now;
}
return TimeSpan.Zero;
@ -1422,7 +1422,7 @@ namespace Server.Mobiles
public void Unpacify()
{
BardEndTime = DateTime.UtcNow;
BardEndTime = Core.Now;
BardPacified = false;
}
@ -1907,7 +1907,7 @@ namespace Server.Mobiles
if (m_bSummoned)
{
SummonEnd = reader.ReadDeltaTime();
new UnsummonTimer(m_ControlMaster, this, SummonEnd - DateTime.UtcNow).Start();
new UnsummonTimer(m_ControlMaster, this, SummonEnd - Core.Now).Start();
}
ControlSlots = reader.ReadInt();
@ -2631,7 +2631,7 @@ namespace Server.Mobiles
{
// idling...
if (DateTime.UtcNow >= m_IdleReleaseTime)
if (Core.Now >= m_IdleReleaseTime)
{
m_IdleReleaseTime = DateTime.MinValue;
return false; // idle is over
@ -2645,7 +2645,7 @@ namespace Server.Mobiles
return false; // not idling, but don't want to enter idle state
}
m_IdleReleaseTime = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(15, 25));
m_IdleReleaseTime = Core.Now + TimeSpan.FromSeconds(Utility.RandomMinMax(15, 25));
if (Body.IsHuman)
{
@ -3271,7 +3271,7 @@ namespace Server.Mobiles
{
if (OwnerAbandonTime == DateTime.MinValue)
{
OwnerAbandonTime = DateTime.UtcNow;
OwnerAbandonTime = Core.Now;
}
}
else
@ -3551,7 +3551,7 @@ namespace Server.Mobiles
}
new UnsummonTimer(caster, creature, duration).Start();
creature.SummonEnd = DateTime.UtcNow + duration;
creature.SummonEnd = Core.Now + duration;
creature.MoveToWorld(p, caster.Map);
@ -3730,7 +3730,7 @@ namespace Server.Mobiles
BardMaster = master;
BardTarget = target;
Combatant = target;
BardEndTime = DateTime.UtcNow + TimeSpan.FromSeconds(30.0);
BardEndTime = Core.Now + TimeSpan.FromSeconds(30.0);
if (target is BaseCreature t)
{
@ -3744,7 +3744,7 @@ namespace Server.Mobiles
t.BardMaster = master;
t.BardTarget = this;
t.Combatant = this;
t.BardEndTime = DateTime.UtcNow + TimeSpan.FromSeconds(30.0);
t.BardEndTime = Core.Now + TimeSpan.FromSeconds(30.0);
}
}
else
@ -3859,7 +3859,7 @@ namespace Server.Mobiles
{
if (OwnerAbandonTime == DateTime.MinValue)
{
OwnerAbandonTime = DateTime.UtcNow;
OwnerAbandonTime = Core.Now;
}
}
else
@ -3933,7 +3933,7 @@ namespace Server.Mobiles
private void CheckShout(PlayerMobile pm, Point3D oldLocation)
{
if (m_MLNextShout > DateTime.UtcNow || pm.Hidden || !pm.Alive)
if (m_MLNextShout > Core.Now || pm.Hidden || !pm.Alive)
{
return;
}
@ -3960,7 +3960,7 @@ namespace Server.Mobiles
}
Shout(pm);
m_MLNextShout = DateTime.UtcNow + ShoutDelay;
m_MLNextShout = Core.Now + ShoutDelay;
}
public virtual void Shout(PlayerMobile pm)
@ -4187,7 +4187,7 @@ namespace Server.Mobiles
return false;
}
if (DateTime.UtcNow >= EndFleeTime)
if (Core.Now >= EndFleeTime)
{
StopFlee();
return false;
@ -4198,7 +4198,7 @@ namespace Server.Mobiles
public virtual void BeginFlee(TimeSpan maxDuration)
{
EndFleeTime = DateTime.UtcNow + maxDuration;
EndFleeTime = Core.Now + maxDuration;
}
public virtual bool IsPetFriend(Mobile m) => Friends?.Contains(m) == true;
@ -4398,9 +4398,9 @@ namespace Server.Mobiles
{
if (BondingBegin == DateTime.MinValue)
{
BondingBegin = DateTime.UtcNow;
BondingBegin = Core.Now;
}
else if (BondingBegin + BondingDelay <= DateTime.UtcNow)
else if (BondingBegin + BondingDelay <= Core.Now)
{
IsBonded = true;
BondingBegin = DateTime.MinValue;
@ -5617,7 +5617,7 @@ namespace Server.Mobiles
public LoyaltyTimer() : base(InternalDelay, InternalDelay)
{
m_NextHourlyCheck = DateTime.UtcNow + TimeSpan.FromHours(1.0);
m_NextHourlyCheck = Core.Now + TimeSpan.FromHours(1.0);
Priority = TimerPriority.FiveSeconds;
}
@ -5628,12 +5628,12 @@ namespace Server.Mobiles
protected override void OnTick()
{
if (DateTime.UtcNow < m_NextHourlyCheck)
if (Core.Now < m_NextHourlyCheck)
{
return;
}
m_NextHourlyCheck = DateTime.UtcNow + TimeSpan.FromHours(1.0);
m_NextHourlyCheck = Core.Now + TimeSpan.FromHours(1.0);
var toRelease = new List<BaseCreature>();
@ -5662,9 +5662,9 @@ namespace Server.Mobiles
{
if (c.OwnerAbandonTime == DateTime.MinValue)
{
c.OwnerAbandonTime = DateTime.UtcNow;
c.OwnerAbandonTime = Core.Now;
}
else if (c.OwnerAbandonTime + c.BondingAbandonDelay <= DateTime.UtcNow)
else if (c.OwnerAbandonTime + c.BondingAbandonDelay <= Core.Now)
{
toRemove.Add(c);
}

View file

@ -190,7 +190,7 @@ namespace Server.Mobiles
if (before != m_Values[index].Value)
{
m_Values[index].LastDecay = DateTime.UtcNow;
m_Values[index].LastDecay = Core.Now;
}
}
@ -225,7 +225,7 @@ namespace Server.Mobiles
for (var i = 0; i < t.m_Values.Length; i++)
{
if (t.GetLastDecay(i) + LossDelay < DateTime.UtcNow)
if (t.GetLastDecay(i) + LossDelay < Core.Now)
{
t.Atrophy(i, LossAmount);
}

View file

@ -47,12 +47,12 @@ namespace Server.Mobiles
{
base.OnThink();
if (DateTime.UtcNow < m_NextRestore)
if (Core.Now < m_NextRestore)
{
return;
}
m_NextRestore = DateTime.UtcNow + TimeSpan.FromSeconds(2.0);
m_NextRestore = Core.Now + TimeSpan.FromSeconds(2.0);
var caster = ControlMaster ?? SummonMaster;

View file

@ -62,12 +62,12 @@ namespace Server.Mobiles
{
base.OnThink();
if (DateTime.UtcNow < m_NextPickup)
if (Core.Now < m_NextPickup)
{
return;
}
m_NextPickup = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(5, 10));
m_NextPickup = Core.Now + TimeSpan.FromSeconds(Utility.RandomMinMax(5, 10));
var pack = Backpack;

View file

@ -48,12 +48,12 @@ namespace Server.Mobiles
{
base.OnThink();
if (DateTime.UtcNow < m_NextFlare)
if (Core.Now < m_NextFlare)
{
return;
}
m_NextFlare = DateTime.UtcNow + TimeSpan.FromSeconds(5.0 + 25.0 * Utility.RandomDouble());
m_NextFlare = Core.Now + TimeSpan.FromSeconds(5.0 + 25.0 * Utility.RandomDouble());
FixedEffect(0x37C4, 1, 12, 1109, 6);
PlaySound(0x1D3);

View file

@ -113,11 +113,11 @@ namespace Server.Mobiles
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if (!m.Frozen && DateTime.UtcNow >= m_NextResurrect && InRange(m, 4) && !InRange(oldLocation, 4) && InLOS(m))
if (!m.Frozen && Core.Now >= m_NextResurrect && InRange(m, 4) && !InRange(oldLocation, 4) && InLOS(m))
{
if (!m.Alive)
{
m_NextResurrect = DateTime.UtcNow + ResurrectDelay;
m_NextResurrect = Core.Now + ResurrectDelay;
if (m.Map?.CanFit(m.Location, 16, false, false) != true)
{

View file

@ -24,7 +24,7 @@ namespace Server.Mobiles
var scalar = caster.Skills.SpiritSpeak.Value * 0.01;
m_Target = target;
m_ExpireTime = DateTime.UtcNow + duration;
m_ExpireTime = Core.Now + duration;
SetStr(200);
SetDex(150);
@ -87,7 +87,7 @@ namespace Server.Mobiles
public override void OnThink()
{
if (!m_Target.Alive || DateTime.UtcNow > m_ExpireTime)
if (!m_Target.Alive || Core.Now > m_ExpireTime)
{
Kill();
return;

View file

@ -51,7 +51,7 @@ namespace Server.Mobiles
PackItem(new BlackthornWelcomeBook());
}
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(5, 30));
m_NextAbilityTime = Core.Now + TimeSpan.FromSeconds(Utility.RandomMinMax(5, 30));
}
public Betrayer(Serial serial)
@ -148,13 +148,13 @@ namespace Server.Mobiles
{
var combatant = Combatant;
if (DateTime.UtcNow < m_NextAbilityTime || combatant?.Deleted != false || combatant.Map != Map ||
if (Core.Now < m_NextAbilityTime || combatant?.Deleted != false || combatant.Map != Map ||
!InRange(combatant, 3) || !CanBeHarmful(combatant) || !InLOS(combatant))
{
return;
}
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(5, 30));
m_NextAbilityTime = Core.Now + TimeSpan.FromSeconds(Utility.RandomMinMax(5, 30));
if (Utility.RandomBool())
{

View file

@ -18,7 +18,7 @@ namespace Server.Mobiles
Hue = 0x41CE;
m_Target = target;
m_ExpireTime = DateTime.UtcNow + TimeSpan.FromMinutes(10.0);
m_ExpireTime = Core.Now + TimeSpan.FromMinutes(10.0);
SetStr(401, 500);
SetDex(296, 315);
@ -114,7 +114,7 @@ namespace Server.Mobiles
public override void OnThink()
{
if (!m_Target.Alive || DateTime.UtcNow > m_ExpireTime)
if (!m_Target.Alive || Core.Now > m_ExpireTime)
{
Delete();
return;

View file

@ -108,7 +108,7 @@ namespace Server.Mobiles
return;
}
if (DateTime.UtcNow >= m_NextBomb)
if (Core.Now >= m_NextBomb)
{
ThrowBomb(combatant);
@ -116,11 +116,11 @@ namespace Server.Mobiles
if (Utility.RandomDouble() <= 0.75 && m_Thrown % 2 == 1) // 75% chance to quickly throw another bomb
{
m_NextBomb = DateTime.UtcNow + TimeSpan.FromSeconds(3.0);
m_NextBomb = Core.Now + TimeSpan.FromSeconds(3.0);
}
else
{
m_NextBomb = DateTime.UtcNow + TimeSpan.FromSeconds(5.0 + 10.0 * Utility.RandomDouble()); // 5-15 seconds
m_NextBomb = Core.Now + TimeSpan.FromSeconds(5.0 + 10.0 * Utility.RandomDouble()); // 5-15 seconds
}
}
}

View file

@ -71,7 +71,7 @@ namespace Server.Mobiles
PackItem(Seed.RandomPeculiarSeed(4));
}
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(2, 5));
m_NextAbilityTime = Core.Now + TimeSpan.FromSeconds(Utility.RandomMinMax(2, 5));
}
public JukaMage(Serial serial) : base(serial)
@ -101,7 +101,7 @@ namespace Server.Mobiles
public override void OnThink()
{
if (DateTime.UtcNow >= m_NextAbilityTime)
if (Core.Now >= m_NextAbilityTime)
{
JukaLord toBuff = null;
@ -119,7 +119,7 @@ namespace Server.Mobiles
{
if (CanBeBeneficial(toBuff) && toBuff.BeginAction<JukaMage>())
{
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(30, 60));
m_NextAbilityTime = Core.Now + TimeSpan.FromSeconds(Utility.RandomMinMax(30, 60));
toBuff.Say(true, "Give me the power to destroy my enemies!");
Say(true, "Fight well my lord!");
@ -169,7 +169,7 @@ namespace Server.Mobiles
}
else
{
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(2, 5));
m_NextAbilityTime = Core.Now + TimeSpan.FromSeconds(Utility.RandomMinMax(2, 5));
}
}

View file

@ -81,7 +81,7 @@ namespace Server.Mobiles
AddItem(new Crossbow());
PackItem(pack);
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(2, 5));
m_NextAbilityTime = Core.Now + TimeSpan.FromSeconds(Utility.RandomMinMax(2, 5));
}
public MeerCaptain(Serial serial) : base(serial)
@ -116,9 +116,9 @@ namespace Server.Mobiles
PlaySound(0x1E9);
}
if (DateTime.UtcNow >= m_NextAbilityTime)
if (Core.Now >= m_NextAbilityTime)
{
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(10, 15));
m_NextAbilityTime = Core.Now + TimeSpan.FromSeconds(Utility.RandomMinMax(10, 15));
var eable = GetMobilesInRange(8);

View file

@ -40,7 +40,7 @@ namespace Server.Mobiles
VirtualArmor = 34;
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(2, 5));
m_NextAbilityTime = Core.Now + TimeSpan.FromSeconds(Utility.RandomMinMax(2, 5));
}
public MeerEternal(Serial serial) : base(serial)
@ -159,13 +159,13 @@ namespace Server.Mobiles
public override void OnThink()
{
if (DateTime.UtcNow >= m_NextAbilityTime)
if (Core.Now >= m_NextAbilityTime)
{
var combatant = Combatant;
if (combatant != null && combatant.Map == Map && combatant.InRange(this, 12))
{
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(10, 15));
m_NextAbilityTime = Core.Now + TimeSpan.FromSeconds(Utility.RandomMinMax(10, 15));
var ability = Utility.Random(4);

View file

@ -44,7 +44,7 @@ namespace Server.Mobiles
VirtualArmor = 16;
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(2, 5));
m_NextAbilityTime = Core.Now + TimeSpan.FromSeconds(Utility.RandomMinMax(2, 5));
}
public MeerMage(Serial serial) : base(serial)
@ -76,14 +76,14 @@ namespace Server.Mobiles
public override void OnThink()
{
if (DateTime.UtcNow >= m_NextAbilityTime)
if (Core.Now >= m_NextAbilityTime)
{
var combatant = Combatant;
if (combatant != null && combatant.Map == Map && combatant.InRange(this, 12) && IsEnemy(combatant) &&
!UnderEffect(combatant))
{
m_NextAbilityTime = DateTime.UtcNow + TimeSpan.FromSeconds(Utility.RandomMinMax(20, 30));
m_NextAbilityTime = Core.Now + TimeSpan.FromSeconds(Utility.RandomMinMax(20, 30));
if (combatant is BaseCreature bc)
{

View file

@ -94,7 +94,7 @@ namespace Server.Mobiles
public void AreaPeace()
{
if (Combatant == null || Deleted || !Alive || m_NextPeace > DateTime.UtcNow || Utility.RandomDouble() > 0.1)
if (Combatant == null || Deleted || !Alive || m_NextPeace > Core.Now || Utility.RandomDouble() > 0.1)
{
return;
}
@ -105,24 +105,24 @@ namespace Server.Mobiles
{
if (m is PlayerMobile pm && IsValidTarget(pm))
{
pm.PeacedUntil = DateTime.UtcNow + duration;
pm.PeacedUntil = Core.Now + duration;
m.SendLocalizedMessage(1072065); // You gaze upon the dryad's beauty, and forget to continue battling!
m.FixedParticles(0x376A, 1, 20, 0x7F5, EffectLayer.Waist);
m.Combatant = null;
}
}
m_NextPeace = DateTime.UtcNow + TimeSpan.FromSeconds(10);
m_NextPeace = Core.Now + TimeSpan.FromSeconds(10);
PlaySound(0x1D3);
}
public bool IsValidTarget(PlayerMobile m) =>
m?.PeacedUntil < DateTime.UtcNow && !m.Hidden && m.AccessLevel == AccessLevel.Player &&
m?.PeacedUntil < Core.Now && !m.Hidden && m.AccessLevel == AccessLevel.Player &&
CanBeHarmful(m);
public void AreaUndress()
{
if (Combatant == null || Deleted || !Alive || m_NextUndress > DateTime.UtcNow || Utility.RandomDouble() > 0.005)
if (Combatant == null || Deleted || !Alive || m_NextUndress > Core.Now || Utility.RandomDouble() > 0.005)
{
return;
}
@ -144,7 +144,7 @@ namespace Server.Mobiles
}
}
m_NextUndress = DateTime.UtcNow + TimeSpan.FromMinutes(1);
m_NextUndress = Core.Now + TimeSpan.FromMinutes(1);
}
public void UndressItem(Mobile m, Layer layer)

View file

@ -90,14 +90,14 @@ namespace Server.Mobiles
public void Peace(Mobile target)
{
if (target == null || Deleted || !Alive || m_NextPeace > DateTime.UtcNow || Utility.RandomDouble() > 0.1)
if (target == null || Deleted || !Alive || m_NextPeace > Core.Now || Utility.RandomDouble() > 0.1)
{
return;
}
if (target is PlayerMobile p && p.PeacedUntil < DateTime.UtcNow && !p.Hidden && CanBeHarmful(p))
if (target is PlayerMobile p && p.PeacedUntil < Core.Now && !p.Hidden && CanBeHarmful(p))
{
p.PeacedUntil = DateTime.UtcNow + TimeSpan.FromMinutes(1);
p.PeacedUntil = Core.Now + TimeSpan.FromMinutes(1);
p.SendLocalizedMessage(500616); // You hear lovely music, and forget to continue battling!
p.FixedParticles(0x376A, 1, 32, 0x15BD, EffectLayer.Waist);
p.Combatant = null;
@ -105,13 +105,13 @@ namespace Server.Mobiles
PlaySound(0x58D);
}
m_NextPeace = DateTime.UtcNow + TimeSpan.FromSeconds(10);
m_NextPeace = Core.Now + TimeSpan.FromSeconds(10);
}
public void Suppress(Mobile target)
{
if (target == null || m_Suppressed.ContainsKey(target) || Deleted || !Alive ||
m_NextSuppress > DateTime.UtcNow || Utility.RandomDouble() > 0.1)
m_NextSuppress > Core.Now || Utility.RandomDouble() > 0.1)
{
return;
}
@ -137,7 +137,7 @@ namespace Server.Mobiles
PlaySound(0x58C);
}
m_NextSuppress = DateTime.UtcNow + TimeSpan.FromSeconds(10);
m_NextSuppress = Core.Now + TimeSpan.FromSeconds(10);
}
public static void SuppressRemove(Mobile target)
@ -160,7 +160,7 @@ namespace Server.Mobiles
public void Undress(Mobile target)
{
if (target == null || Deleted || !Alive || m_NextUndress > DateTime.UtcNow || Utility.RandomDouble() > 0.005)
if (target == null || Deleted || !Alive || m_NextUndress > Core.Now || Utility.RandomDouble() > 0.005)
{
return;
}
@ -178,7 +178,7 @@ namespace Server.Mobiles
); // The satyr's music makes your blood race. Your clothing is too confining.
}
m_NextUndress = DateTime.UtcNow + TimeSpan.FromMinutes(1);
m_NextUndress = Core.Now + TimeSpan.FromMinutes(1);
}
public void UndressItem(Mobile m, Layer layer)
@ -193,7 +193,7 @@ namespace Server.Mobiles
public void Provoke(Mobile target)
{
if (target == null || Deleted || !Alive || m_NextProvoke > DateTime.UtcNow || Utility.RandomDouble() > 0.05)
if (target == null || Deleted || !Alive || m_NextProvoke > Core.Now || Utility.RandomDouble() > 0.05)
{
return;
}
@ -220,7 +220,7 @@ namespace Server.Mobiles
}
}
m_NextProvoke = DateTime.UtcNow + TimeSpan.FromSeconds(10);
m_NextProvoke = Core.Now + TimeSpan.FromSeconds(10);
}
private class AnimateTimer : Timer

View file

@ -98,7 +98,7 @@ namespace Server.Mobiles
if (value != null)
{
Morph(value);
m_LastMorph = DateTime.UtcNow;
m_LastMorph = Core.Now;
}
m_MorphedInto = value;
@ -128,10 +128,10 @@ namespace Server.Mobiles
if (Combatant != null)
{
if (m_NextFireRing <= DateTime.UtcNow && Utility.RandomDouble() < 0.02)
if (m_NextFireRing <= Core.Now && Utility.RandomDouble() < 0.02)
{
FireRing();
m_NextFireRing = DateTime.UtcNow + TimeSpan.FromMinutes(2);
m_NextFireRing = Core.Now + TimeSpan.FromMinutes(2);
}
if (Combatant.Player && m_MorphedInto != Combatant && Utility.RandomDouble() < 0.05)
@ -145,7 +145,7 @@ namespace Server.Mobiles
{
var idle = base.CheckIdle();
if (idle && m_MorphedInto != null && DateTime.UtcNow - m_LastMorph > TimeSpan.FromSeconds(30))
if (idle && m_MorphedInto != null && Core.Now - m_LastMorph > TimeSpan.FromSeconds(30))
{
MorphedInto = null;
}

View file

@ -68,10 +68,10 @@ namespace Server.Mobiles
{
if (!from.Alive && from is PlayerMobile)
{
if (!from.Frozen && DateTime.UtcNow >= m_NextResurrect && InRange(from, 4) && !InRange(oldLocation, 4) &&
if (!from.Frozen && Core.Now >= m_NextResurrect && InRange(from, 4) && !InRange(oldLocation, 4) &&
InLOS(from))
{
m_NextResurrect = DateTime.UtcNow + ResurrectDelay;
m_NextResurrect = Core.Now + ResurrectDelay;
if (!from.Criminal && from.Kills < 5 && from.Karma > 0)
{
if (from.Map?.CanFit(from.Location, 16, false, false) == true)

View file

@ -10,7 +10,7 @@ namespace Server.Mobiles
public PlagueSpawn(Mobile owner = null) : base(AIType.AI_Melee, FightMode.Closest, 10, 1, 0.2, 0.4)
{
Owner = owner;
ExpireTime = DateTime.UtcNow + TimeSpan.FromMinutes(1.0);
ExpireTime = Core.Now + TimeSpan.FromMinutes(1.0);
Hue = Utility.Random(0x11, 15);
@ -102,7 +102,7 @@ namespace Server.Mobiles
public override void OnThink()
{
if (Owner != null && (DateTime.UtcNow >= ExpireTime || Owner.Deleted || Map != Owner.Map || !InRange(Owner, 16)))
if (Owner != null && (Core.Now >= ExpireTime || Owner.Deleted || Map != Owner.Map || !InRange(Owner, 16)))
{
PlaySound(GetIdleSound());
Delete();

View file

@ -63,10 +63,10 @@ namespace Server.Mobiles
return;
}
if (DateTime.UtcNow >= m_NextAttack)
if (Core.Now >= m_NextAttack)
{
SandAttack(combatant);
m_NextAttack = DateTime.UtcNow + TimeSpan.FromSeconds(10.0 + 10.0 * Utility.RandomDouble());
m_NextAttack = Core.Now + TimeSpan.FromSeconds(10.0 + 10.0 * Utility.RandomDouble());
}
}

View file

@ -289,39 +289,19 @@ namespace Server.Mobiles
[CommandProperty(AccessLevel.GameMaster)]
public TimeSpan SavagePaintExpiration
{
get
{
var ts = m_SavagePaintExpiration - DateTime.UtcNow;
if (ts < TimeSpan.Zero)
{
ts = TimeSpan.Zero;
}
return ts;
}
set => m_SavagePaintExpiration = DateTime.UtcNow + value;
get => Utility.Max(m_SavagePaintExpiration - Core.Now, TimeSpan.Zero);
set => m_SavagePaintExpiration = Core.Now + value;
}
[CommandProperty(AccessLevel.GameMaster)]
public TimeSpan NextSmithBulkOrder
{
get
{
var ts = m_NextSmithBulkOrder - DateTime.UtcNow;
if (ts < TimeSpan.Zero)
{
ts = TimeSpan.Zero;
}
return ts;
}
get => Utility.Max(m_NextSmithBulkOrder - Core.Now, TimeSpan.Zero);
set
{
try
{
m_NextSmithBulkOrder = DateTime.UtcNow + value;
m_NextSmithBulkOrder = Core.Now + value;
}
catch
{
@ -333,22 +313,12 @@ namespace Server.Mobiles
[CommandProperty(AccessLevel.GameMaster)]
public TimeSpan NextTailorBulkOrder
{
get
{
var ts = m_NextTailorBulkOrder - DateTime.UtcNow;
if (ts < TimeSpan.Zero)
{
ts = TimeSpan.Zero;
}
return ts;
}
get => Utility.Max(m_NextTailorBulkOrder - Core.Now, TimeSpan.Zero);
set
{
try
{
m_NextTailorBulkOrder = DateTime.UtcNow + value;
m_NextTailorBulkOrder = Core.Now + value;
}
catch
{
@ -381,7 +351,7 @@ namespace Server.Mobiles
{
if (NetState != null)
{
return m_GameTime + (DateTime.UtcNow - SessionStart);
return m_GameTime + (Core.Now - SessionStart);
}
return m_GameTime;
@ -1140,7 +1110,7 @@ namespace Server.Mobiles
}
}
if (m_MountBlock?.m_Timer.Running != true || m_MountBlock.m_Timer.Next < DateTime.UtcNow + duration)
if (m_MountBlock?.m_Timer.Running != true || m_MountBlock.m_Timer.Next < Core.Now + duration)
{
m_MountBlock = new MountBlock(duration, type, this);
}
@ -1568,12 +1538,12 @@ namespace Server.Mobiles
{
if (m is PlayerMobile pm)
{
pm.SessionStart = DateTime.UtcNow;
pm.SessionStart = Core.Now;
pm.Quest?.StartTimer();
pm.BedrollLogout = false;
pm.LastOnline = DateTime.UtcNow;
pm.LastOnline = Core.Now;
}
DisguiseTimers.StartTimer(m);
@ -1615,13 +1585,13 @@ namespace Server.Mobiles
if (from is PlayerMobile pm)
{
pm.m_GameTime += DateTime.UtcNow - pm.SessionStart;
pm.m_GameTime += Core.Now - pm.SessionStart;
pm.Quest?.StopTimer();
pm.SpeechLog = null;
pm.ClearQuestArrow();
pm.LastOnline = DateTime.UtcNow;
pm.LastOnline = Core.Now;
}
DisguiseTimers.StopTimer(from);
@ -2661,7 +2631,7 @@ namespace Server.Mobiles
}
}
if (Kills >= 5 && DateTime.UtcNow >= m_NextJustAward)
if (Kills >= 5 && Core.Now >= m_NextJustAward)
{
var m = FindMostRecentDamager(false);
@ -2694,7 +2664,7 @@ namespace Server.Mobiles
m.FixedParticles(0x375A, 9, 20, 5027, EffectLayer.Waist);
m.PlaySound(0x1F7);
m_NextJustAward = DateTime.UtcNow + TimeSpan.FromMinutes(pointsToGain / 3.0);
m_NextJustAward = Core.Now + TimeSpan.FromMinutes(pointsToGain / 3.0);
}
}
}
@ -2949,7 +2919,7 @@ namespace Server.Mobiles
if (tbl.TryGetValue(obj, out var count))
{
if (count.TimeStamp + SkillCheck.AntiMacroExpire <= DateTime.UtcNow)
if (count.TimeStamp + SkillCheck.AntiMacroExpire <= Core.Now)
{
count.Count = 1;
return true;
@ -3292,7 +3262,7 @@ namespace Server.Mobiles
foreach (var (k, v) in t)
{
if (v.TimeStamp + SkillCheck.AntiMacroExpire <= DateTime.UtcNow)
if (v.TimeStamp + SkillCheck.AntiMacroExpire <= Core.Now)
{
toRemove.Add(k);
}
@ -4132,7 +4102,7 @@ namespace Server.Mobiles
for (var i = 0; i < m_StuckMenuUses.Length; ++i)
{
if (DateTime.UtcNow - m_StuckMenuUses[i] > TimeSpan.FromDays(1.0))
if (Core.Now - m_StuckMenuUses[i] > TimeSpan.FromDays(1.0))
{
return true;
}
@ -4150,9 +4120,9 @@ namespace Server.Mobiles
for (var i = 0; i < m_StuckMenuUses.Length; ++i)
{
if (DateTime.UtcNow - m_StuckMenuUses[i] > TimeSpan.FromDays(1.0))
if (Core.Now - m_StuckMenuUses[i] > TimeSpan.FromDays(1.0))
{
m_StuckMenuUses[i] = DateTime.UtcNow;
m_StuckMenuUses[i] = Core.Now;
return;
}
}
@ -4428,9 +4398,9 @@ namespace Server.Mobiles
return false;
}
if (DateTime.UtcNow - m_LastYoungMessage > TimeSpan.FromMinutes(1.0))
if (Core.Now - m_LastYoungMessage > TimeSpan.FromMinutes(1.0))
{
m_LastYoungMessage = DateTime.UtcNow;
m_LastYoungMessage = Core.Now;
// A monster looks at you menacingly but does not attack.
// You would be under attack now if not for your status as a new citizen of Britannia.
SendLocalizedMessage(1019067);
@ -4441,9 +4411,9 @@ namespace Server.Mobiles
public bool CheckYoungHealTime()
{
if (DateTime.UtcNow - m_LastYoungHeal > TimeSpan.FromMinutes(5.0))
if (Core.Now - m_LastYoungHeal > TimeSpan.FromMinutes(5.0))
{
m_LastYoungHeal = DateTime.UtcNow;
m_LastYoungHeal = Core.Now;
return true;
}
@ -4658,7 +4628,7 @@ namespace Server.Mobiles
set
{
m_Count = value;
TimeStamp = DateTime.UtcNow;
TimeStamp = Core.Now;
}
}
}

View file

@ -284,10 +284,10 @@ namespace Server.Mobiles
return false;
}
if (m is PlayerMobile mobile && mobile.LastEscortTime + EscortDelay >= DateTime.UtcNow)
if (m is PlayerMobile mobile && mobile.LastEscortTime + EscortDelay >= Core.Now)
{
var minutes =
(int)Math.Ceiling((mobile.LastEscortTime + EscortDelay - DateTime.UtcNow).TotalMinutes);
(int)Math.Ceiling((mobile.LastEscortTime + EscortDelay - Core.Now).TotalMinutes);
Say("You must rest {0} minute{1} before we set out on this journey.", minutes, minutes == 1 ? "" : "s");
return false;
@ -295,11 +295,11 @@ namespace Server.Mobiles
if (SetControlMaster(m))
{
m_LastSeenEscorter = DateTime.UtcNow;
m_LastSeenEscorter = Core.Now;
if (m is PlayerMobile playerMobile)
{
playerMobile.LastEscortTime = DateTime.UtcNow;
playerMobile.LastEscortTime = Core.Now;
}
Say(
@ -420,7 +420,7 @@ namespace Server.Mobiles
{
StopFollow();
var lastSeenDelay = DateTime.UtcNow - m_LastSeenEscorter;
var lastSeenDelay = Core.Now - m_LastSeenEscorter;
if (lastSeenDelay >= AbandonDelay)
{
@ -443,7 +443,7 @@ namespace Server.Mobiles
StartFollow(master);
}
m_LastSeenEscorter = DateTime.UtcNow;
m_LastSeenEscorter = Core.Now;
return master;
}
@ -451,9 +451,9 @@ namespace Server.Mobiles
{
m_DeleteTimer?.Stop();
m_DeleteTime = DateTime.UtcNow + DeleteTime;
m_DeleteTime = Core.Now + DeleteTime;
m_DeleteTimer = new DeleteTimer(this, m_DeleteTime - DateTime.UtcNow);
m_DeleteTimer = new DeleteTimer(this, m_DeleteTime - Core.Now);
m_DeleteTimer.Start();
}
@ -509,7 +509,7 @@ namespace Server.Mobiles
if (escorter is PlayerMobile pm)
{
if (pm.CompassionGains > 0 && DateTime.UtcNow > pm.NextCompassionDay)
if (pm.CompassionGains > 0 && Core.Now > pm.NextCompassionDay)
{
pm.NextCompassionDay = DateTime.MinValue;
pm.CompassionGains = 0;
@ -533,7 +533,7 @@ namespace Server.Mobiles
}
pm.NextCompassionDay =
DateTime.UtcNow + TimeSpan.FromDays(1.0); // in one day CompassionGains gets reset to 0
Core.Now + TimeSpan.FromDays(1.0); // in one day CompassionGains gets reset to 0
++pm.CompassionGains;
if (pm.CompassionGains >= 5)
@ -604,7 +604,7 @@ namespace Server.Mobiles
if (reader.ReadBool())
{
m_DeleteTime = reader.ReadDeltaTime();
m_DeleteTimer = new DeleteTimer(this, m_DeleteTime - DateTime.UtcNow);
m_DeleteTimer = new DeleteTimer(this, m_DeleteTime - Core.Now);
m_DeleteTimer.Start();
}

View file

@ -102,23 +102,14 @@ namespace Server.Mobiles
{
Lines = lines;
if (duration < TimeSpan.Zero)
{
duration = TimeSpan.Zero;
}
else if (duration > TimeSpan.FromDays(365.0))
{
duration = TimeSpan.FromDays(365.0);
}
ExpireTime = DateTime.UtcNow + duration;
ExpireTime = Core.Now + duration.Clamp(TimeSpan.Zero, TimeSpan.FromDays(365));
}
public string[] Lines { get; }
public DateTime ExpireTime { get; }
public bool Expired => DateTime.UtcNow >= ExpireTime;
public bool Expired => Core.Now >= ExpireTime;
}
public class TownCrierDurationPrompt : Prompt
@ -242,12 +233,7 @@ namespace Server.Mobiles
{
var tce = entries[i];
var toExpire = tce.ExpireTime - DateTime.UtcNow;
if (toExpire < TimeSpan.Zero)
{
toExpire = TimeSpan.Zero;
}
var toExpire = Utility.Max(tce.ExpireTime - Core.Now, TimeSpan.Zero);
var sb = new StringBuilder();
@ -301,12 +287,7 @@ namespace Server.Mobiles
if (index < entries?.Count)
{
var tce = entries[index];
var ts = tce.ExpireTime - DateTime.UtcNow;
if (ts < TimeSpan.Zero)
{
ts = TimeSpan.Zero;
}
var ts = Utility.Max(tce.ExpireTime - Core.Now, TimeSpan.Zero);
m_From.SendMessage("Editing entry #{0}.", index + 1);
m_From.SendMessage("Enter the first line to shout:");

View file

@ -45,7 +45,7 @@ namespace Server.Mobiles
pack = new Backpack { Layer = Layer.ShopResale, Movable = false, Visible = false };
AddItem(pack);
LastRestock = DateTime.UtcNow;
LastRestock = Core.Now;
}
public BaseVendor(Serial serial)
@ -97,7 +97,7 @@ namespace Server.Mobiles
public virtual void Restock()
{
LastRestock = DateTime.UtcNow;
LastRestock = Core.Now;
var buyInfo = GetBuyInfo();
@ -565,7 +565,7 @@ namespace Server.Mobiles
protected void LoadSBInfo()
{
LastRestock = DateTime.UtcNow;
LastRestock = Core.Now;
for (var i = 0; i < m_ArmorBuyInfo.Count; ++i)
{
@ -840,7 +840,7 @@ namespace Server.Mobiles
return;
}
if (DateTime.UtcNow - LastRestock > RestockDelay)
if (Core.Now - LastRestock > RestockDelay)
{
Restock();
}
@ -900,7 +900,7 @@ namespace Server.Mobiles
var item = playerItems[i];
if (item.LastMoved + InventoryDecayTime <= DateTime.UtcNow)
if (item.LastMoved + InventoryDecayTime <= Core.Now)
{
item.Delete();
}
@ -1064,7 +1064,7 @@ namespace Server.Mobiles
var pm = from as PlayerMobile;
if (Core.ML && pm?.NextBODTurnInTime > DateTime.UtcNow)
if (Core.ML && pm?.NextBODTurnInTime > Core.Now)
{
SayTo(from, 1079976); // You'll have to wait a few seconds while I inspect the last order.
return false;
@ -1118,7 +1118,7 @@ namespace Server.Mobiles
if (Core.ML && pm != null)
{
pm.NextBODTurnInTime = DateTime.UtcNow + TimeSpan.FromSeconds(10.0);
pm.NextBODTurnInTime = Core.Now + TimeSpan.FromSeconds(10.0);
}
dropped.Delete();

View file

@ -94,7 +94,7 @@ namespace Server.Mobiles
{
SayTo(pm, 501046); // Thou must resign from thy other guild first.
}
else if (pm.GameTime < JoinGameAge || pm.CreationTime + JoinAge > DateTime.UtcNow)
else if (pm.GameTime < JoinGameAge || pm.CreationTime + JoinAge > Core.Now)
{
SayTo(pm, 501048); // You are too young to join my guild...
}
@ -111,7 +111,7 @@ namespace Server.Mobiles
{
SayTo(pm, 501052); // Thou dost not belong to my guild!
}
else if (pm.NpcGuildJoinTime + QuitAge > DateTime.UtcNow ||
else if (pm.NpcGuildJoinTime + QuitAge > Core.Now ||
pm.NpcGuildGameTime + QuitGameAge > pm.GameTime)
{
SayTo(pm, 501053); // You just joined my guild! You must wait a week to resign.
@ -141,7 +141,7 @@ namespace Server.Mobiles
{
SayTo(pm, 501046); // Thou must resign from thy other guild first.
}
else if (pm.GameTime < JoinGameAge || pm.CreationTime + JoinAge > DateTime.UtcNow)
else if (pm.GameTime < JoinGameAge || pm.CreationTime + JoinAge > Core.Now)
{
SayTo(pm, 501048); // You are too young to join my guild...
}
@ -150,7 +150,7 @@ namespace Server.Mobiles
SayWelcomeTo(pm);
pm.NpcGuild = NpcGuild;
pm.NpcGuildJoinTime = DateTime.UtcNow;
pm.NpcGuildJoinTime = Core.Now;
pm.NpcGuildGameTime = pm.GameTime;
dropped.Delete();

View file

@ -34,13 +34,13 @@ namespace Server.Mobiles
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if (DateTime.UtcNow > m_NextCheckPack && InRange(m, 4) && !InRange(oldLocation, 4) && m.Player)
if (Core.Now > m_NextCheckPack && InRange(m, 4) && !InRange(oldLocation, 4) && m.Player)
{
var pack = m.Backpack;
if (pack != null)
{
m_NextCheckPack = DateTime.UtcNow + TimeSpan.FromSeconds(2.0);
m_NextCheckPack = Core.Now + TimeSpan.FromSeconds(2.0);
if (pack.FindItemByType<HouseDeed>(false) != null)
{

View file

@ -47,14 +47,14 @@ namespace Server.Mobiles
{
base.OnSpeech(e);
if (!e.Handled && m_NextShush <= DateTime.UtcNow && InLOS(e.Mobile))
if (!e.Handled && m_NextShush <= Core.Now && InLOS(e.Mobile))
{
Direction = GetDirectionTo(e.Mobile);
PlaySound(Female ? 0x32F : 0x441);
PublicOverheadMessage(MessageType.Regular, 0x3B2, 1073990); // Shhhh!
m_NextShush = DateTime.UtcNow + ShushDelay;
m_NextShush = Core.Now + ShushDelay;
e.Handled = true;
}
}

View file

@ -306,7 +306,7 @@ namespace Server.Mobiles
m_PayTimer = new PayTimer(this, delay);
m_PayTimer.Start();
NextPayTime = DateTime.UtcNow + delay;
NextPayTime = Core.Now + delay;
}
public PlayerVendor(Serial serial) : base(serial)
@ -454,7 +454,7 @@ namespace Server.Mobiles
var description = reader.ReadString();
var created = version < 1 ? DateTime.UtcNow : reader.ReadDateTime();
var created = version < 1 ? Core.Now : reader.ReadDateTime();
if (item != null)
{
@ -480,7 +480,7 @@ namespace Server.Mobiles
Timer.DelayCall(FixDresswear);
}
NextPayTime = DateTime.UtcNow + PayTimer.GetInterval();
NextPayTime = Core.Now + PayTimer.GetInterval();
if (newVendorSystemActivated)
{
@ -494,7 +494,7 @@ namespace Server.Mobiles
InitStats(100, 100, 25);
}
var delay = NextPayTime - DateTime.UtcNow;
var delay = NextPayTime - Core.Now;
m_PayTimer = new PayTimer(this, delay > TimeSpan.Zero ? delay : TimeSpan.Zero);
m_PayTimer.Start();
@ -752,7 +752,7 @@ namespace Server.Mobiles
}
private VendorItem SetVendorItem(Item item, int price, string description) =>
SetVendorItem(item, price, description, DateTime.UtcNow);
SetVendorItem(item, price, description, Core.Now);
private VendorItem SetVendorItem(Item item, int price, string description, DateTime created)
{
@ -1064,7 +1064,7 @@ namespace Server.Mobiles
{
vendor.SayTo(from, 503202); // This item is not for sale.
}
else if (vi.Created + TimeSpan.FromMinutes(1.0) > DateTime.UtcNow)
else if (vi.Created + TimeSpan.FromMinutes(1.0) > Core.Now)
{
from.SendMessage("You cannot buy this item right now. Please wait one minute and try again.");
}
@ -1368,7 +1368,7 @@ namespace Server.Mobiles
protected override void OnTick()
{
m_Vendor.NextPayTime = DateTime.UtcNow + Interval;
m_Vendor.NextPayTime = Core.Now + Interval;
int pay;
int totalGold;

View file

@ -61,7 +61,7 @@ namespace Server.Mobiles
RentalGold = rentalGold;
RentalExpireTime = DateTime.UtcNow + duration.Duration;
RentalExpireTime = Core.Now + duration.Duration;
m_RentalExpireTimer = new RentalExpireTimer(this, duration.Duration);
m_RentalExpireTimer.Start();
}
@ -103,7 +103,7 @@ namespace Server.Mobiles
public void ComputeRentalExpireDelay(out int days, out int hours)
{
var delay = RentalExpireTime - DateTime.UtcNow;
var delay = RentalExpireTime - Core.Now;
if (delay <= TimeSpan.Zero)
{
@ -213,7 +213,7 @@ namespace Server.Mobiles
RentalExpireTime = reader.ReadDeltaTime();
var delay = RentalExpireTime - DateTime.UtcNow;
var delay = RentalExpireTime - Core.Now;
m_RentalExpireTimer = new RentalExpireTimer(this, delay > TimeSpan.Zero ? delay : TimeSpan.Zero);
m_RentalExpireTimer.Start();
}
@ -380,7 +380,7 @@ namespace Server.Mobiles
m_Vendor.RentalPrice = renewalPrice;
m_Vendor.RentalExpireTime = DateTime.UtcNow + m_Vendor.RentalDuration.Duration;
m_Vendor.RentalExpireTime = Core.Now + m_Vendor.RentalDuration.Duration;
}
else
{

View file

@ -19,7 +19,7 @@ namespace Server.Mobiles
Items = new List<Item>();
ExpireTime = DateTime.UtcNow + GracePeriod;
ExpireTime = Core.Now + GracePeriod;
m_ExpireTimer = new ExpireTimer(this, GracePeriod);
m_ExpireTimer.Start();
}
@ -45,7 +45,7 @@ namespace Server.Mobiles
}
else
{
var delay = ExpireTime - DateTime.UtcNow;
var delay = ExpireTime - Core.Now;
m_ExpireTimer = new ExpireTimer(this, delay > TimeSpan.Zero ? delay : TimeSpan.Zero);
m_ExpireTimer.Start();
}