context: using System;
  using Server.Accounting;
  using System.Globalization;
  using Server.Engines.Quests;
  using Server.Mobiles;
  using Server.Network;
  using Haven = Server.Engines.Quests.Haven;
  using Necro = Server.Engines.Quests.Necro;
  
  using CashBankCheckObjective = Server.Engines.Quests.Necro.CashBankCheckObjective;
  
  namespace Server.Items
  {
      public class BankCheck : Item
      {
          private int m_Worth;
          public BankCheck(Serial serial)
              : base(serial)
          {
          }
  
          [Constructable]
          public BankCheck(int worth)
              : base(0x14F0)
          {
              this.Weight = 1.0;
              this.Hue = 0x34;
              this.LootType = LootType.Blessed;
  
              this.m_Worth = worth;
          }
  
          [CommandProperty(AccessLevel.GameMaster)]
          public int Worth
          {
              get
              {
                  return this.m_Worth;
              }
              set
              {
                  this.m_Worth = value;
                  this.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((int)0); // version
  
              writer.Write((int)this.m_Worth);
          }
  
          public override void Deserialize(GenericReader reader)
          {
              base.Deserialize(reader);
              this.LootType = LootType.Blessed;
  
              int version = reader.ReadInt();
  
              switch ( version )
              {
                  case 0:
                      {
                          this.m_Worth = reader.ReadInt();
                          break;
                      }
              }
          }
  
          public override void GetProperties(ObjectPropertyList list)
          {
              base.GetProperties(list);
  
              string worth;
  
              if (Core.ML)
                  worth = this.m_Worth.ToString("N0", CultureInfo.GetCultureInfo("en-US"));
              else
                  worth = this.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(this.Serial, this.ItemID, MessageType.Label, 0x3B2, 3, 1041361, "", AffixType.Append, String.Concat(" ", this.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;
  
                  while (toAdd > 60000)
                  {
                      gold = new Gold(60000);
  
  
gt:                     if (box.TryDropItem(from, gold, false))