using System; namespace Server.Items { public class DecayedCorpse : Container { private static TimeSpan m_DefaultDecayTime = TimeSpan.FromMinutes(7.0); private DateTime m_DecayTime; private Timer m_DecayTimer; public DecayedCorpse(string name) : base(Utility.Random(0xECA, 9)) { Movable = false; Name = name; BeginDecay(m_DefaultDecayTime); } public DecayedCorpse(Serial serial) : base(serial) { } // Do not display (x items, y stones) public override bool DisplaysContent => false; public void BeginDecay(TimeSpan delay) { m_DecayTimer?.Stop(); m_DecayTime = DateTime.UtcNow + delay; m_DecayTimer = new InternalTimer(this, delay); m_DecayTimer.Start(); } public override void OnAfterDelete() { m_DecayTimer?.Stop(); m_DecayTimer = null; } // Do not display (x items, y stones) public override bool CheckContentDisplay(Mobile from) { return false; } public override void AddNameProperty(ObjectPropertyList list) { list.Add(1046414, Name); // the remains of ~1_NAME~ } public override void OnSingleClick(Mobile from) { LabelTo(from, 1046414, Name); // the remains of ~1_NAME~ } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write(1); // version writer.Write(m_DecayTimer != null); if (m_DecayTimer != null) writer.WriteDeltaTime(m_DecayTime); } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); switch (version) { case 0: { BeginDecay(m_DefaultDecayTime); break; } case 1: { if (reader.ReadBool()) BeginDecay(reader.ReadDeltaTime() - DateTime.UtcNow); break; } } } private class InternalTimer : Timer { private DecayedCorpse m_Corpse; public InternalTimer(DecayedCorpse c, TimeSpan delay) : base(delay) { m_Corpse = c; Priority = TimerPriority.FiveSeconds; } protected override void OnTick() { m_Corpse.Delete(); } } } }