context: using System;
  using Server.Items;
  using Server.Mobiles;
  
  namespace Server.Engines.MLQuests.Items
  {
      public class MLQuestTeleporter : Teleporter
  	{
  		private Type m_QuestType;
  		private TextDefinition m_Message;
  
  		[CommandProperty(AccessLevel.GameMaster)]
  		public Type QuestType
  		{
  			get { return m_QuestType; }
  			set { m_QuestType = value; InvalidateProperties(); }
  		}
  
  		[CommandProperty(AccessLevel.GameMaster)]
  		public TextDefinition Message
  		{
  			get { return m_Message; }
  			set { m_Message = value; }
  		}
  
  		[Constructable]
  		public MLQuestTeleporter()
  			: this(Point3D.Zero, null, null, null)
  		{
  		}
  
  		[Constructable]
  		public MLQuestTeleporter(Point3D pointDest, Map mapDest)
  			: this(pointDest, mapDest, null, null)
  		{
  		}
  
  		[Constructable]
  		public MLQuestTeleporter(Point3D pointDest, Map mapDest, Type questType, TextDefinition message)
  			: base(pointDest, mapDest)
  		{
  			m_QuestType = questType;
  			m_Message = message;
  		}
  
  		public override bool CanTeleport(Mobile m)
  		{
  			if (!base.CanTeleport(m))
  				return false;
  
  			if (m_QuestType != null)
  			{
  				PlayerMobile pm = m as PlayerMobile;
  
  				if (pm == null)
  					return false;
  
  				MLQuestContext context = MLQuestSystem.GetContext(pm);
  
  				if (context == null || (!context.IsDoingQuest(m_QuestType) && !context.HasDoneQuest(m_QuestType)))
  				{
  					TextDefinition.SendMessageTo(m, m_Message);
  					return false;
  				}
  			}
  
  			return true;
  		}
  
  		public override void GetProperties(ObjectPropertyList list)
  		{
  			base.GetProperties(list);
  
  			if (m_QuestType != null)
  				list.Add(String.Format("Required quest: {0}", m_QuestType.Name));
  		}
  
  		public MLQuestTeleporter(Serial serial)
  			: base(serial)
  		{
  		}
  
  		public override void Serialize(GenericWriter writer)
  		{
  			base.Serialize(writer);
  
  			writer.Write((int)0); // version
  
  			writer.Write((m_QuestType != null) ? m_QuestType.FullName : null);
  			TextDefinition.Serialize(writer, m_Message);
  		}
  
  		public override void Deserialize(GenericReader reader)
  		{
  			base.Deserialize(reader);
  
  			int version = reader.ReadInt();
  
  			string typeName = reader.ReadString();
  
  			if (typeName != null)
  				m_QuestType = ScriptCompiler.FindTypeByFullName(typeName, false);
  
  			m_Message = TextDefinition.Deserialize(reader);
  		}
  	}
  
  	public interface ITicket
  	{
  		void OnTicketUsed(Mobile from);
  	}
  
  	public class TicketTeleporter : Teleporter
  	{
  		private Type m_TicketType;
  		private TextDefinition m_Message;
  
  		[CommandProperty(AccessLevel.GameMaster)]
  		public Type TicketType
  		{
  			get { return m_TicketType; }
  			set { m_TicketType = value; InvalidateProperties(); }
  		}
  
  		[CommandProperty(AccessLevel.GameMaster)]
  		public TextDefinition Message
  		{
  			get { return m_Message; }
  			set { m_Message = value; }
  		}
  
  		[Constructable]
  		public TicketTeleporter()
  			: this(Point3D.Zero, null, null, null)
  		{
  		}
  
  		[Constructable]
  		public TicketTeleporter(Point3D pointDest, Map mapDest)
  			: this(pointDest, mapDest, null, null)
  		{
  		}
  
  		[Constructable]
  		public TicketTeleporter(Point3D pointDest, Map mapDest, Type ticketType, TextDefinition message)
  			: base(pointDest, mapDest)
  		{
  			m_TicketType = ticketType;
  			m_Message = message;
  		}
  
  		public override bool CanTeleport(Mobile m)
  		{
  			if (!base.CanTeleport(m))
  				return false;
  
  			if (m_TicketType != null)
  			{
  				Item ticket = null;
  				Container pack = m.Backpack;
  
  				if (pack != null)
  					ticket = pack.FindItemByType(m_TicketType, false); // Check (top level) backpack
  
  				if (ticket == null)
  				{
  					foreach (Item item in m.Items) // Check paperdoll
  					{
  						if (m_TicketType.IsAssignableFrom(item.GetType()))
  						{
  							ticket = item;
  							break;
  						}
  					}
  				}
  
  				if (ticket == null)
  				{
  					TextDefinition.SendMessageTo(m, m_Message);
  					return false;
  				}
  
  				if (ticket is ITicket)
  					((ITicket)ticket).OnTicketUsed(m);
  			}
  
  			return true;
  		}
  
  		public override void GetProperties(ObjectPropertyList list)
  		{
  			base.GetProperties(list);
  
  			if (m_TicketType != null)
  				list.Add(String.Format("Required ticket: {0}", m_TicketType.Name));
  		}
  
  		public TicketTeleporter(Serial serial)
  			: base(serial)
  		{
  		}
  
  		public override void Serialize(GenericWriter writer)
  		{
  			base.Serialize(writer);
  
  			writer.Write((int)0); // version
  
  			writer.Write((m_TicketType != null) ? m_TicketType.FullName : null);
  			TextDefinition.Serialize(writer, m_Message);
  		}
  
  		public override void Deserialize(GenericReader reader)
  		{
  			base.Deserialize(reader);
  
  			int version = reader.ReadInt();
  
  			string typeName = reader.ReadString();
  
  
gt: 			if (typeName != null)