using System; using System.Collections.Generic; using System.Text; using Server; using Server.Items; using Server.Mobiles; namespace Server.Engines.MLQuests.Items { public class MLQuestTeleporter : Teleporter { private MLQuest m_RequiredQuest; private TextDefinition m_Message; [CommandProperty( AccessLevel.GameMaster )] public MLQuest RequiredQuest { get { return m_RequiredQuest; } // Needs work for in-game set { m_RequiredQuest = 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, MLQuest quest, TextDefinition message ) : base( pointDest, mapDest ) { m_RequiredQuest = quest; m_Message = message; } public override bool CanTeleport( Mobile m ) { if ( !base.CanTeleport( m ) ) return false; if ( m_RequiredQuest != null ) { PlayerMobile pm = m as PlayerMobile; if ( pm == null ) return false; MLQuestContext context = MLQuestSystem.GetContext( pm ); if ( context == null || ( !context.IsDoingQuest( m_RequiredQuest ) && !context.HasDoneQuest( m_RequiredQuest ) ) ) { TextDefinition.SendMessageTo( m, m_Message ); return false; } } return true; } public override void GetProperties( ObjectPropertyList list ) { base.GetProperties( list ); if ( m_RequiredQuest != null ) list.Add( String.Format( "Required quest: {0}", m_RequiredQuest ) ); } public MLQuestTeleporter( Serial serial ) : base( serial ) { } public override void Serialize( GenericWriter writer ) { base.Serialize( writer ); writer.Write( (int) 0 ); // version MLQuestSystem.WriteQuestRef( writer, m_RequiredQuest ); TextDefinition.Serialize( writer, m_Message ); } public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadInt(); m_RequiredQuest = MLQuestSystem.ReadQuestRef( reader ); 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.FullName ); TextDefinition.Serialize( writer, m_Message ); } public override void Deserialize( GenericReader reader ) { base.Deserialize( reader ); int version = reader.ReadInt(); m_TicketType = ScriptCompiler.FindTypeByFullName( reader.ReadString(), false ); m_Message = TextDefinition.Deserialize( reader ); } } }