context: using Server.ContextMenus;
  using Server.Gumps;
  using Server.Mobiles;
  using Server.Multis;
  using Server.Network;
  using Server.Targeting;
  using System;
  using System.Collections.Generic;
  
  namespace Server.Items
  {
      [FlipableAttribute(0x4513, 0x4514)]
      public class ChickenCoop : Item, ISecurable, IChopable
      {
          public static readonly int MaxStables = 3;
  
          public override int LabelNumber => 1112570;  // a chicken coop
  
          private SecureLevel m_Level;
          private readonly Dictionary<Mobile, List<BaseCreature>> m_Stored = new Dictionary<Mobile, List<BaseCreature>>();
  
          [CommandProperty(AccessLevel.GameMaster)]
          public SecureLevel Level
          {
              get { return m_Level; }
              set { m_Level = value; }
          }
  
          public Dictionary<Mobile, List<BaseCreature>> Stored => m_Stored;
  
          [Constructable]
          public ChickenCoop()
              : base(0x4513)
          {
              Weight = 20;
              m_Level = SecureLevel.CoOwners;
          }
  
          public void OnChop(Mobile from)
          {
              if (CheckAccess(from))
              {
                  Effects.PlaySound(GetWorldLocation(), Map, 0x3B3);
                  from.SendLocalizedMessage(500461); // You destroy the item.
  
                  Delete();
              }
          }
  
          public override void Delete()
          {
              if (m_Stored != null && m_Stored.Count > 0)
              {
                  List<List<BaseCreature>> masterList = new List<List<BaseCreature>>(m_Stored.Values);
  
                  for (int i = 0; i < masterList.Count; i++)
                  {
                      for (int j = 0; j < masterList[i].Count; j++)
                      {
                          if (masterList[i][j] != null && !masterList[i][j].Deleted)
                              masterList[i][j].Delete();
                      }
                  }
  
                  m_Stored.Clear();
              }
  
              base.Delete();
          }
  
          public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list)
          {
              base.GetContextMenuEntries(from, list);
  
              if (CheckAccess(from))
              {
                  SetSecureLevelEntry.AddTo(from, this, list);
  
                  list.Add(new StableEntry(this, from));
  
                  if (m_Stored.ContainsKey(from) && m_Stored[from].Count > 0)
                      list.Add(new ClaimAllEntry(this, from));
              }
          }
  
          private class StableEntry : ContextMenuEntry
          {
              private readonly ChickenCoop m_Coop;
              private readonly Mobile m_From;
  
              public StableEntry(ChickenCoop coop, Mobile from)
                  : base(6126, 12)
              {
                  m_Coop = coop;
                  m_From = from;
              }
  
              public override void OnClick()
              {
                  m_Coop.BeginStable(m_From);
              }
          }
  
          private class ClaimAllEntry : ContextMenuEntry
          {
              private readonly ChickenCoop m_Coop;
              private readonly Mobile m_From;
  
              public ClaimAllEntry(ChickenCoop coop, Mobile from)
                  : base(6127, 12)
              {
                  m_Coop = coop;
                  m_From = from;
              }
  
              public override void OnClick()
              {
                  m_Coop.Claim(m_From);
              }
          }
  
          public ChickenCoop(Serial serial)
              : base(serial)
          {
          }
  
          public override bool ForceShowProperties => true;
  
          public override void GetProperties(ObjectPropertyList list)
          {
              base.AddNameProperties(list);
          }
  
          private class ClaimListGump : Gump
          {
              private readonly ChickenCoop m_Post;
              private readonly Mobile m_From;
              private readonly List<BaseCreature> m_List;
  
              public ClaimListGump(ChickenCoop post, Mobile from, List<BaseCreature> list)
                  : base(50, 50)
              {
                  m_Post = post;
                  m_From = from;
                  m_List = list;
  
                  from.CloseGump(typeof(ClaimListGump));
  
                  AddPage(0);
  
                  AddBackground(0, 0, 325, 50 + (list.Count * 20), 9250);
                  AddAlphaRegion(5, 5, 315, 40 + (list.Count * 20));
  
                  AddHtml(15, 15, 275, 20, "<BASEFONT COLOR=#FFFFFF>Select a pet to retrieve from the stables:</BASEFONT>", false, false);
  
                  for (int i = 0; i < list.Count; ++i)
                  {
                      BaseCreature pet = list[i];
  
                      if (pet == null || pet.Deleted)
                          continue;
  
                      AddButton(15, 39 + (i * 20), 10006, 10006, i + 1, GumpButtonType.Reply, 0);
                      AddHtml(32, 35 + (i * 20), 275, 18, String.Format("<BASEFONT COLOR=#C0C0EE>{0}</BASEFONT>", pet.Name), false, false);
                  }
              }
  
              public override void OnResponse(NetState sender, RelayInfo info)
              {
                  int index = info.ButtonID - 1;
  
                  if (index >= 0 && index < m_List.Count)
                      m_Post.EndClaimList(m_From, m_List[index]);
              }
          }
  
          public static int GetMaxStabled(Mobile from)
          {
              int max = 3;
              return max;
          }
  
          private class StableTarget : Target
          {
              private readonly ChickenCoop m_Post;
  
              public StableTarget(ChickenCoop post)
                  : base(12, false, TargetFlags.None)
              {
                  m_Post = post;
              }
  
              protected override void OnTarget(Mobile from, object targeted)
              {
                  if (targeted is ChickenLizard || targeted is Chicken || targeted is BattleChickenLizard)
                      m_Post.EndStable(from, (BaseCreature)targeted);
                  else if (targeted == from)
                      from.SendLocalizedMessage(502672); // HA HA HA! Sorry, I am not an inn.
                  else
                      from.SendLocalizedMessage(1112558); // You may only stable chickens in the chicken coop.
              }
          }
  
          public void BeginClaimList(Mobile from)
          {
              if (Deleted || !from.CheckAlive() || !m_Stored.ContainsKey(from) || m_Stored[from] == null)
                  return;
  
              List<BaseCreature> stabled = m_Stored[from];
  
              for (int i = 0; i < stabled.Count; i++)
              {
                  BaseCreature pet = stabled[i] as BaseCreature;
  
                  if (pet == null || pet.Deleted)
                  {
                      pet.IsStabled = false;
                      stabled.RemoveAt(i);
                      --i;
                      continue;
                  }
              }
  
  
gt:             if (stabled.Count > 0)