context: using System;
  using Server.Multis;
  using Server.Network;
  
  namespace Server.Items
  {
      public class FelineBlessedStatue : BaseContainer, IFlipable
      {
          public static readonly TimeSpan RespawnDuration = TimeSpan.FromDays(1);
          public static readonly string TimerID = "FelineStatueTimer";
  
          public override int LabelNumber => 1075494; // Blessed Statue
  
          private static readonly Type[] m_ResourceTypes = new Type[]
          {
              typeof(BlackPearl),
              typeof(Bloodmoss),
              typeof(Garlic),
              typeof(Ginseng),
              typeof(MandrakeRoot),
              typeof(Nightshade),
              typeof(SpidersSilk),
              typeof(SulfurousAsh)
          };
  
          [CommandProperty(AccessLevel.GameMaster)]
          public DateTime NextReagentTime  { get; set; }
  
          [Constructable]
          public FelineBlessedStatue()
              : base(0x1947)
          {
              Weight = 12;            
              LootType = LootType.Blessed;
          }
  
          public override int DefaultGumpID => 0x116;
  
          public virtual void OnFlip(Mobile m)
          {
              if (ItemID == 0x1947)
              {
                  ItemID = 0x1948;
              }
              else if (ItemID == 0x1948)
              {
                  ItemID = 0x1947;
              }
              else if (ItemID == 0x1949)
              {
                  ItemID = 0x194A;
              }
              else if (ItemID == 0x194A)
              {
                  ItemID = 0x1949;
              }
          }
  
          public override void OnDoubleClick(Mobile from)
          {
              BaseHouse house = BaseHouse.FindHouseAt(this);
  
              if (house != null && (house.IsLockedDown(this) || house.IsSecure(this)))
              {
                  if (!from.InRange(GetWorldLocation(), 1))
                  {
                      from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
                  }
                  else
                  {
                      base.OnDoubleClick(from);
                  }                
              }
              else
              {
                  from.SendLocalizedMessage(501717); // This isn't secure...
              }
          }
  
          public void StartTimer()
          {
              if (NextReagentTime == DateTime.MinValue)
              {
                  NextReagentTime = DateTime.UtcNow + RespawnDuration;
              }
              else if (NextReagentTime < DateTime.UtcNow)
              {
                  NextReagentTime = DateTime.UtcNow + TimeSpan.FromSeconds(10);
              }
  
              TimerRegistry.Register(TimerID, this, NextReagentTime - DateTime.UtcNow, false, statue => OnTick(statue));
          }
  
          public void StopTimer()
          {
              TimerRegistry.RemoveFromRegistry(TimerID, this);
          }
  
          public static void OnTick(FelineBlessedStatue statue)
          {
              if (statue.Movable)
              {
                  statue.StopTimer();
                  return;
              }
  
              statue.DropResource();
  
              TimerRegistry.UpdateRegistry(TimerID, statue, RespawnDuration);
              statue.NextReagentTime = DateTime.UtcNow + RespawnDuration;
          }
  
          public override bool TryDropItem(Mobile from, Item dropped, bool sendFullMessage)
          {
              return false;
          }
  
          public override bool OnDragDropInto(Mobile from, Item item, Point3D p)
          {
              return false;
          }
  
          public override void OnItemRemoved(Item item)
          {
              base.OnItemRemoved(item);
  
              CheckContainer();
              StartTimer();
          }
  
          public override void OnSecureChange()
          {
              if (!World.Loading && IsSecure)
              {
                  StartTimer();
              }
          }
  
          public override void OnLockDownChange()
          {
              if (!World.Loading && IsLockedDown)
              {                
                  StartTimer();
              }
          }
  
          public void CheckContainer()
          {
              if (Items.Count == 0)
              {
                  if (ItemID == 0x1949 || ItemID == 0x194A)
                  {
                      ItemID -= 2;
                  }                
              }
              else
              {
                  if (ItemID == 0x1947 || ItemID == 0x1948)
                  {
                      ItemID += 2;
                  }
              }
          }
  
          private void DropResource()
          {            
              var item = Activator.CreateInstance(m_ResourceTypes[Utility.Random(m_ResourceTypes.Length)]) as Item;           
  
              if (item != null)
              {
                  item.Amount = Utility.RandomMinMax(10, 20);
  
                  if (TotalItems + 1 > MaxItems)
                  {
                      item.Delete();
                      StopTimer();
                  }
                  else
                  {
                      DropItemStacked(item);
  
                      CheckContainer();                    
                  }
              }
          }
  
          public FelineBlessedStatue(Serial serial)
              : base(serial)
          {
          }
  
          public override void Serialize(GenericWriter writer)
          {
              base.Serialize(writer);
              writer.Write(0);
  
              writer.Write(NextReagentTime);
          }
  
          public override void Deserialize(GenericReader reader)
          {
              base.Deserialize(reader);
              reader.ReadInt();
  
              NextReagentTime  = reader.ReadDateTime();
  
  
gt:             if (IsLockedDown || IsSecure)