context: #region Header
  // **********
  // ServUO - BankCheck.cs
  // **********
  #endregion
  
  #region References
  using System;
  
  using Server.Accounting;
  using Server.Engines.Quests.Haven;
  using Server.Engines.Quests.Necro;
  using Server.Mobiles;
  using Server.Network;
  
  using CashBankCheckObjective = Server.Engines.Quests.Necro.CashBankCheckObjective;
  #endregion
  
  namespace Server.Items
  {
      public static class BankCheckExtensions
      {
          public static int GetChecksWorth(this Container cont, bool recurse)
          {
              int count = 0;
  
              var items = cont.FindItemsByType(typeof(BankCheck), recurse);
              foreach (BankCheck check in items)
              {
                  count += check.Worth;
              }
              return count;
          }
          public static int TakeFromChecks(this Container cont, int amount, bool recurse)
          {
              int left = amount;
  
              var items = cont.FindItemsByType(typeof(BankCheck), recurse);
              foreach(BankCheck check in items)
              {
                  if(check.Worth <= left)
                  {
                      left -= check.Worth;
                      check.Delete();
                  }
                  else
                  {
                      check.Worth -= left;
                      check.InvalidateProperties();
                      left = 0;
                      break;
                  }
              }
  
              return amount - left;
          }
      }
  
  	public class BankCheck : Item
  	{
  		private int m_Worth;
  
  		public BankCheck(Serial serial)
  			: base(serial)
  		{ }
  
  		[Constructable]
  		public BankCheck(int worth)
  			: base(0x14F0)
  		{
  			Weight = 1.0;
  			Hue = 0x34;
  			LootType = LootType.Blessed;
  
  			m_Worth = worth;
  		}
  
  		[CommandProperty(AccessLevel.GameMaster)]
  		public int Worth
  		{
  			get { return m_Worth; }
  			set
  			{
  				m_Worth = value;
  				InvalidateProperties();
  			}
  		}
  
  		public override bool DisplayLootType { get { return Core.AOS; } }
  
  		public override int LabelNumber { get { return 1041361; } } // A bank check
  
  		public override void Serialize(GenericWriter writer)
  		{
  			base.Serialize(writer);
  
  			writer.Write(0); // version
  
  			writer.Write(m_Worth);
  		}
  
  		public override void Deserialize(GenericReader reader)
  		{
  			base.Deserialize(reader);
  			LootType = LootType.Blessed;
  
  			var version = reader.ReadInt();
  
  			switch (version)
  			{
  				case 0:
  				{
  					m_Worth = reader.ReadInt();
  					break;
  				}
  			}
  		}
  
  		public override void GetProperties(ObjectPropertyList list)
  		{
  			base.GetProperties(list);
  
  			var worth = Core.ML ? m_Worth.ToString("#,0") : m_Worth.ToString();
  
  			list.Add(1060738, worth); // value: ~1_val~
  		}
  
  #if NEWPARENT
  		public override void OnAdded(IEntity parent)
  #else
  		public override void OnAdded(object parent)
  #endif
  		{
  			base.OnAdded(parent);
  
  			if (!AccountGold.Enabled)
  			{
  				return;
  			}
  
  			Mobile owner = null;
  			SecureTradeInfo tradeInfo = null;
  
  			Container root = parent as Container;
  
  			while (root != null && root.Parent is Container)
  			{
  				root = (Container)root.Parent;
  			}
  
  			parent = root ?? parent;
  
  			if (parent is SecureTradeContainer && AccountGold.ConvertOnTrade)
  			{
  				var trade = (SecureTradeContainer)parent;
  
  				if (trade.Trade.From.Container == trade)
  				{
  					tradeInfo = trade.Trade.From;
  					owner = tradeInfo.Mobile;
  				}
  				else if (trade.Trade.To.Container == trade)
  				{
  					tradeInfo = trade.Trade.To;
  					owner = tradeInfo.Mobile;
  				}
  			}
  			else if (parent is BankBox && AccountGold.ConvertOnBank)
  			{
  				owner = ((BankBox)parent).Owner;
  			}
  
  			if (owner == null || owner.Account == null || !owner.Account.DepositGold(Worth))
  			{
  				return;
  			}
  
  			if (tradeInfo != null)
  			{
  				if (owner.NetState != null && !owner.NetState.NewSecureTrading)
  				{
  					var total = Worth / Math.Max(1.0, Account.CurrencyThreshold);
  					var plat = (int)Math.Truncate(total);
  					var gold = (int)((total - plat) * Account.CurrencyThreshold);
  
  					tradeInfo.Plat += plat;
  					tradeInfo.Gold += gold;
  				}
  
  				if (tradeInfo.VirtualCheck != null)
  				{
  					tradeInfo.VirtualCheck.UpdateTrade(tradeInfo.Mobile);
  				}
  			}
  
  			owner.SendLocalizedMessage(1042763, Worth.ToString("#,0"));
  
  			Delete();
  
  			((Container)parent).UpdateTotals();
  		}
  
  		public override void OnSingleClick(Mobile from)
  		{
  			from.Send(
  				new MessageLocalizedAffix(
  					Serial,
  					ItemID,
  					MessageType.Label,
  					0x3B2,
  					3,
  					1041361,
  					"",
  					AffixType.Append,
  					String.Concat(" ", m_Worth.ToString()),
  					"")); // A bank check:
  		}
  
  		public override void OnDoubleClick(Mobile from)
  		{
  			// This probably isn't OSI accurate, but we can't just make the quests redundant.
  			// Double-clicking the BankCheck in your pack will now credit your account.
  
  			var box = AccountGold.Enabled ? from.Backpack : from.FindBankNoCreate();
  
  			if (box == null || !IsChildOf(box))
  			{
  				from.SendLocalizedMessage(AccountGold.Enabled ? 1080058 : 1047026); 
  				// This must be in your backpack to use it. : That must be in your bank box to use it.
  				return;
  			}
  
  			Delete();
  
  			var deposited = 0;
  			var toAdd = m_Worth;
  
  			if (AccountGold.Enabled && from.Account != null && from.Account.DepositGold(toAdd))
  			{
  				deposited = toAdd;
  				toAdd = 0;
  			}
  
  			if (toAdd > 0)
  			{
  				Gold gold;
  
  
gt: 				while (toAdd > 60000)