context: using System;
  using System.Collections.Generic;
  using Server.ContextMenus;
  using Server.Gumps;
  using Server.Mobiles;
  using Server.Multis;
  using Server.Targeting;
  
  namespace Server.Items
  {
      public class VendorRentalContract : Item
      {
          private VendorRentalDuration m_Duration;
          private int m_Price;
          private bool m_LandlordRenew;
          private Mobile m_Offeree;
          private Timer m_OfferExpireTimer;
          [Constructable]
          public VendorRentalContract()
              : base(0x14F0)
          {
              Weight = 1.0;
              Hue = 0x672;
  
              m_Duration = VendorRentalDuration.Instances[0];
              m_Price = 1500;
          }
  
          public VendorRentalContract(Serial serial)
              : base(serial)
          {
          }
  
          public override int LabelNumber
          {
              get
              {
                  return 1062332;
              }
          }// a vendor rental contract
          public VendorRentalDuration Duration
          {
              get
              {
                  return m_Duration;
              }
              set
              {
                  if (value != null)
                      m_Duration = value;
              }
          }
          [CommandProperty(AccessLevel.GameMaster)]
          public int Price
          {
              get
              {
                  return m_Price;
              }
              set
              {
                  m_Price = value;
              }
          }
          [CommandProperty(AccessLevel.GameMaster)]
          public bool LandlordRenew
          {
              get
              {
                  return m_LandlordRenew;
              }
              set
              {
                  m_LandlordRenew = value;
              }
          }
          public Mobile Offeree
          {
              get
              {
                  return m_Offeree;
              }
              set
              {
                  if (m_OfferExpireTimer != null)
                  {
                      m_OfferExpireTimer.Stop();
                      m_OfferExpireTimer = null;
                  }
  
                  m_Offeree = value;
  
                  if (value != null)
                  {
                      m_OfferExpireTimer = new OfferExpireTimer(this);
                      m_OfferExpireTimer.Start();
                  }
  
                  InvalidateProperties();
              }
          }
          public override void GetProperties(ObjectPropertyList list)
          {
              base.GetProperties(list);
  
              if (Offeree != null)
                  list.Add(1062368, Offeree.Name); // Being Offered To ~1_NAME~
          }
  
          public bool IsLandlord(Mobile m)
          {
              if (IsLockedDown)
              {
                  BaseHouse house = BaseHouse.FindHouseAt(this);
  
                  if (house != null && house.DecayType != DecayType.Condemned)
                  {
                      return house.IsOwner(m);
                  }
              }
  
              return false;
          }
  
          public bool IsUsableBy(Mobile from, bool byLandlord, bool byBackpack, bool noOfferee, bool sendMessage)
          {
              if (Deleted || !from.CheckAlive(sendMessage))
              {
                  return false;
              }
  
              if (noOfferee && Offeree != null)
              {
                  if (sendMessage)
                  {
                      from.SendLocalizedMessage(1062343); // That item is currently in use.
                  }
  
                  return false;
              }
  
              if (byBackpack && IsChildOf(from.Backpack))
              {
                  return true;
              }
  
              if (byLandlord && IsLandlord(from))
              {
                  if (from.Map != Map || !from.InRange(this, 5))
                  {
                      if (sendMessage)
                      {
                          from.SendLocalizedMessage(501853); // Target is too far away.
                      }
  
                      return false;
                  }
  
                  return true;
              }
  
              return false;
          }
  
          public override void OnDelete()
          {
              if (IsLockedDown)
              {
                  BaseHouse house = BaseHouse.FindHouseAt(this);
  
                  if (house != null)
                  {
                      house.VendorRentalContracts.Remove(this);
                  }
              }
          }
  
          public override void OnDoubleClick(Mobile from)
          {
              if (Offeree != null)
              {
                  from.SendLocalizedMessage(1062343); // That item is currently in use.
              }
              else if (!IsLockedDown)
              {
                  if (!IsChildOf(from.Backpack))
                  {
                      from.SendLocalizedMessage(1062334); // This item must be in your backpack to be used.
                      return;
                  }
  
                  BaseHouse house = BaseHouse.FindHouseAt(from);
  
                  if (house == null || !house.IsOwner(from))
                  {
                      from.SendLocalizedMessage(1062333); // You must be standing inside of a house that you own to make use of this contract.
                  }
                  else if (!house.IsAosRules)
                  {
                      from.SendMessage("Rental contracts can only be placed in AOS-enabled houses.");
                  }
                  else if (!house.Public)
                  {
                      from.SendLocalizedMessage(1062335); // Rental contracts can only be placed in public houses.
                  }
                  else if (!house.CanPlaceNewVendor())
                  {
                      from.SendLocalizedMessage(1062352); // You do not have enought storage available to place this contract.
                  }
                  else
                  {
                      from.SendLocalizedMessage(1062337); // Target the exact location you wish to rent out.
                      from.Target = new RentTarget(this);
                  }
              }
              else if (IsLandlord(from))
              {
                  if (from.InRange(this, 5))
                  {
                      from.CloseGump(typeof(VendorRentalContractGump));
                      from.SendGump(new VendorRentalContractGump(this, from));
                  }
                  else
                  {
                      from.SendLocalizedMessage(501853); // Target is too far away.
                  }
              }
          }
  
          public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list)
          {
              base.GetContextMenuEntries(from, list);
  
              if (IsUsableBy(from, true, true, true, false))
              {
                  list.Add(new ContractOptionEntry(this));
              }
          }
  
          public override void Serialize(GenericWriter writer)
          {
              base.Serialize(writer);
  
              writer.WriteEncodedInt(0); // version
  
              writer.WriteEncodedInt(m_Duration.ID);
  
              writer.Write((int)m_Price);
              writer.Write((bool)m_LandlordRenew);
          }
  
          public override void Deserialize(GenericReader reader)
          {
              base.Deserialize(reader);
  
              int version = reader.ReadEncodedInt();
  
              int durationID = reader.ReadEncodedInt();
              if (durationID < VendorRentalDuration.Instances.Length)
              {
                  m_Duration = VendorRentalDuration.Instances[durationID];
              }
              else
              {
                  m_Duration = VendorRentalDuration.Instances[0];
              }
  
              m_Price = reader.ReadInt();
              m_LandlordRenew = reader.ReadBool();
          }
  
          private class ContractOptionEntry : ContextMenuEntry
          {
              private readonly VendorRentalContract m_Contract;
              public ContractOptionEntry(VendorRentalContract contract)
                  : base(6209)
              {
                  m_Contract = contract;
              }
  
              public override void OnClick()
              {
                  Mobile from = Owner.From;
  
                  if (m_Contract.IsUsableBy(from, true, true, true, true))
                  {
                      from.CloseGump(typeof(VendorRentalContractGump));
                      from.SendGump(new VendorRentalContractGump(m_Contract, from));
                  }
              }
          }
  
          private class RentTarget : Target
          {
              private readonly VendorRentalContract m_Contract;
              public RentTarget(VendorRentalContract contract)
                  : base(-1, false, TargetFlags.None)
              {
                  m_Contract = contract;
              }
  
              protected override void OnTarget(Mobile from, object targeted)
              {
                  if (!m_Contract.IsUsableBy(from, false, true, true, true))
                  {
                      return;
                  }
  
                  IPoint3D location = targeted as IPoint3D;
                  if (location == null)
                  {
                      return;
                  }
  
  
gt:                 Point3D pLocation = new Point3D(location);