protected override List <MLQuest> ConstructQuestList() { if (m_MLQuest == null) { Region reg = Region; Type[] list = reg.IsPartOf("Haven Island") ? m_MLQuestTypesNH : m_MLQuestTypes; int randomIdx = Utility.Random(list.Length); for (int i = 0; i < list.Length; ++i) { Type questType = list[randomIdx]; MLQuest quest = MLQuestSystem.FindQuest(questType); if (quest != null) { bool okay = true; foreach (BaseObjective obj in quest.Objectives) { if (obj is EscortObjective && ((EscortObjective)obj).Destination.Contains(reg)) { okay = false; // We're already there! break; } } if (okay) { m_MLQuest = quest; break; } } else if (MLQuestSystem.Debug) { Console.WriteLine("Warning: Escortable cannot be assigned quest type '{0}', it is not registered", questType.Name); } randomIdx = (randomIdx + 1) % list.Length; } if (m_MLQuest == null) { if (MLQuestSystem.Debug) { Console.WriteLine("Warning: No suitable quest found for escort {0}", Serial); } return(null); } } List <MLQuest> result = new List <MLQuest> { m_MLQuest }; return(result); }
public void AddObjectives(MLQuest quest) { AddHtmlLocalized(98, 140, 312, 16, 1049073, 0x2710); // Objective: AddHtmlLocalized( 98, 156, 312, 16, quest.ObjectiveType == ObjectiveType.All ? 1072208 : 1072209, 0x2710 ); // All of the following / Only one of the following var y = 172; foreach (var objective in quest.Objectives) { objective.WriteToGump(this, ref y); if (objective.IsTimed) { if (objective is CollectObjective) { y -= 16; } BaseObjectiveInstance.WriteTimeRemaining(this, ref y, objective.Duration); } } }
public MLQuestInstance( MLQuest quest, IQuestGiver quester, PlayerMobile player ) { m_Quest = quest; m_Quester = quester; m_QuesterType = ( quester == null ) ? null : quester.GetType(); m_Player = player; m_Accepted = DateTime.UtcNow; m_Flags = MLQuestInstanceFlags.None; m_ObjectiveInstances = new BaseObjectiveInstance[quest.Objectives.Count]; BaseObjectiveInstance obj; bool timed = false; for ( int i = 0; i < quest.Objectives.Count; ++i ) { m_ObjectiveInstances[i] = obj = quest.Objectives[i].CreateInstance( this ); if ( obj.IsTimed ) timed = true; } Register(); if ( timed ) m_Timer = Timer.DelayCall( TimeSpan.FromSeconds( 5 ), TimeSpan.FromSeconds( 5 ), Slice ); }
public QuestLogDetailedGump(MLQuestInstance instance, bool closeGumps) : base(1046026) // Quest Log { m_Instance = instance; m_CloseGumps = closeGumps; PlayerMobile pm = instance.Player; MLQuest quest = instance.Quest; if (closeGumps) { CloseOtherGumps(pm); pm.CloseGump(typeof(QuestLogDetailedGump)); } SetTitle(quest.Title); RegisterButton(ButtonPosition.Left, ButtonGraphic.Resign, 1); RegisterButton(ButtonPosition.Right, ButtonGraphic.Okay, 2); SetPageCount(3); BuildPage(); AddDescription(quest); if (instance.Failed) // only displayed on the first page { AddHtmlLocalized(160, 80, 250, 16, 500039, 0x3C00, false, false); // Failed! } BuildPage(); AddObjectivesProgress(instance); BuildPage(); AddRewardsPage(quest); }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); if (reader.ReadBool()) { m_DestinationString = reader.ReadString(); // NOTE: We cannot EDI.Find here, regions have not yet been loaded :-( } if (reader.ReadBool()) { m_DeleteTime = reader.ReadDeltaTime(); m_DeleteTimer = new DeleteTimer(this, m_DeleteTime - DateTime.UtcNow); m_DeleteTimer.Start(); } if (version >= 1) { MLQuest quest = MLQuestSystem.ReadQuestRef(reader); if (MLQuestSystem.Enabled && quest != null && !StaticMLQuester) { m_MLQuest = quest; } } }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); m_RequiredQuest = MLQuestSystem.ReadQuestRef(reader); m_Message = TextDefinition.Deserialize(reader); }
protected override List<MLQuest> ConstructQuestList() { if ( m_MLQuest == null ) { Region reg = Region; Type[] list = reg.IsPartOf( "Haven Island" ) ? m_MLQuestTypesNH : m_MLQuestTypes; int randomIdx = Utility.Random( list.Length ); for ( int i = 0; i < list.Length; ++i ) { Type questType = list[randomIdx]; MLQuest quest = MLQuestSystem.FindQuest( questType ); if ( quest != null ) { bool okay = true; foreach ( BaseObjective obj in quest.Objectives ) { if ( obj is EscortObjective && ( (EscortObjective)obj ).Destination.Contains( reg ) ) { okay = false; // We're already there! break; } } if ( okay ) { m_MLQuest = quest; break; } } else if ( MLQuestSystem.Debug ) { Console.WriteLine( "Warning: Escortable cannot be assigned quest type '{0}', it is not registered", questType.Name ); } randomIdx = ( randomIdx + 1 ) % list.Length; } if ( m_MLQuest == null ) { if ( MLQuestSystem.Debug ) Console.WriteLine( "Warning: No suitable quest found for escort {0}", Serial ); return null; } } List<MLQuest> result = new List<MLQuest>(); result.Add( m_MLQuest ); return result; }
public void AddRewards(MLQuest quest, int x, int y, int spacing) { int xReward = x + 28; foreach (BaseReward reward in quest.Rewards) { AddImage(x, y + 1, 0x4B9); reward.WriteToGump(this, xReward, ref y); y += spacing; } }
public void AddDescription(MLQuest quest) { AddHtmlLocalized( 98, 140, 312, 16, quest.IsChainTriggered || quest.NextQuest != null ? 1075024 : 1072202, 0x2710 ); // Description [(quest chain)] TextDefinition.AddHtmlText(this, 98, 156, 312, 240, quest.Description, false, true, 0x15F90, 0xBDE784); }
public QuestConversationGump(MLQuest quest, PlayerMobile pm, TextDefinition text) : base(3006156) // Quest Conversation { CloseOtherGumps(pm); SetTitle(quest.Title); RegisterButton(ButtonPosition.Right, ButtonGraphic.Close, 3); SetPageCount(1); BuildPage(); AddConversation(text); }
public void AddRewards(MLQuest quest) // For the claim rewards gump { int y = 146; if (quest.Rewards.Count > 1) { // TODO: Is this what this is for? Does "Only one of the following" occur? AddHtmlLocalized(100, 140, 312, 16, 1072208, 0x2710, false, false); // All of the following y += 16; } AddRewards(quest, 107, y, 26); }
public QuestConversationGump( MLQuest quest, PlayerMobile pm, TextDefinition text ) : base( 3006156 ) // Quest Conversation { CloseOtherGumps( pm ); SetTitle( quest.Title ); RegisterButton( ButtonPosition.Right, ButtonGraphic.Close, 3 ); SetPageCount( 1 ); BuildPage(); AddConversation( text ); }
public void AddObjectivesProgress(MLQuestInstance instance) { MLQuest quest = instance.Quest; AddHtmlLocalized(98, 140, 312, 16, 1049073, 0x2710, false, false); // Objective: AddHtmlLocalized(98, 156, 312, 16, (quest.ObjectiveType == ObjectiveType.All) ? 1072208 : 1072209, 0x2710, false, false); // All of the following / Only one of the following int y = 172; foreach (BaseObjectiveInstance objInstance in instance.Objectives) { objInstance.WriteToGump(this, ref y); } }
public void AddRewardsPage(MLQuest quest) // For the quest log/offer gumps { AddHtmlLocalized(98, 140, 312, 16, 1072201, 0x2710, false, false); // Reward int y = 162; if (quest.Rewards.Count > 1) { // TODO: Is this what this is for? Does "Only one of the following" occur? AddHtmlLocalized(98, 156, 312, 16, 1072208, 0x2710, false, false); // All of the following y += 16; } AddRewards(quest, 105, y, 16); }
public QuestRewardGump(MLQuestInstance instance) : base(1072201) // Reward { m_Instance = instance; MLQuest quest = instance.Quest; PlayerMobile pm = instance.Player; CloseOtherGumps(pm); SetTitle(quest.Title); RegisterButton(ButtonPosition.Left, ButtonGraphic.Accept, 1); SetPageCount(1); BuildPage(); AddRewards(quest); }
public void ConsumeNeeded(PlayerMobile pm) { MLQuestContext context = MLQuestSystem.GetContext(pm); if (context != null) { foreach (Type type in Needed) { MLQuest quest = MLQuestSystem.FindQuest(type); if (quest != null) { context.RemoveDoneQuest(quest); } } } }
public void TalkTo(PlayerMobile pm) { if (pm == null || m_Timer?.Running == true) { return; } int completed = CompletedCount(pm); if (completed == Needed.Length) { m_Timer = new InternalTimer(this, pm, Complete, true); } else if (completed == 0) { m_Timer = new InternalTimer(this, pm, Offer, false); } else { List <TextDefinition> conversation = new List <TextDefinition>(); conversation.AddRange(Incomplete); MLQuestContext context = MLQuestSystem.GetContext(pm); if (context != null) { foreach (Type type in Needed) { MLQuest quest = MLQuestSystem.FindQuest(type); if (quest == null || context.HasDoneQuest(quest)) { continue; } conversation.Add(quest.Title); } } m_Timer = new InternalTimer(this, pm, conversation, false); } m_Timer.Start(); }
public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write((int)2); // version writer.Write(MLQuestSystem.Contexts.Count); foreach (MLQuestContext context in MLQuestSystem.Contexts.Values) { context.Serialize(writer); } writer.Write(MLQuestSystem.Quests.Count); foreach (MLQuest quest in MLQuestSystem.Quests.Values) { MLQuest.Serialize(writer, quest); } }
public QuestReportBackGump(MLQuestInstance instance) : base(3006156) // Quest Conversation { m_Instance = instance; MLQuest quest = instance.Quest; PlayerMobile pm = instance.Player; // TODO: Check close sequence CloseOtherGumps(pm); SetTitle(quest.Title); RegisterButton(ButtonPosition.Left, ButtonGraphic.Continue, 4); RegisterButton(ButtonPosition.Right, ButtonGraphic.Close, 3); SetPageCount(1); BuildPage(); AddConversation(quest.CompletionMessage); }
private int CompletedCount(PlayerMobile pm) { MLQuestContext context = MLQuestSystem.GetContext(pm); if (context == null) { return(0); } int result = 0; foreach (Type type in Needed) { MLQuest quest = MLQuestSystem.FindQuest(type); if (quest == null || context.HasDoneQuest(quest)) { ++result; } } return(result); }
public QuestOfferGump(MLQuest quest, IQuestGiver quester, PlayerMobile pm) : base(1049010) // Quest Offer { m_Quest = quest; m_Quester = quester; CloseOtherGumps(pm); pm.CloseGump(typeof(QuestOfferGump)); SetTitle(quest.Title); RegisterButton(ButtonPosition.Left, ButtonGraphic.Accept, 1); RegisterButton(ButtonPosition.Right, ButtonGraphic.Refuse, 2); SetPageCount(3); BuildPage(); AddDescription(quest); BuildPage(); AddObjectives(quest); BuildPage(); AddRewardsPage(quest); }
public QuestOfferGump( MLQuest quest, IQuestGiver quester, PlayerMobile pm ) : base( 1049010 ) // Quest Offer { m_Quest = quest; m_Quester = quester; CloseOtherGumps( pm ); pm.CloseGump( typeof( QuestOfferGump ) ); SetTitle( quest.Title ); RegisterButton( ButtonPosition.Left, ButtonGraphic.Accept, 1 ); RegisterButton( ButtonPosition.Right, ButtonGraphic.Refuse, 2 ); SetPageCount( 3 ); BuildPage(); AddDescription( quest ); BuildPage(); AddObjectives( quest ); BuildPage(); AddRewardsPage( quest ); }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); int contexts = reader.ReadInt(); for (int i = 0; i < contexts; ++i) { MLQuestContext context = new MLQuestContext(reader, version); if (context.Owner != null) { MLQuestSystem.Contexts[context.Owner] = context; } } int quests = reader.ReadInt(); for (int i = 0; i < quests; ++i) { MLQuest.Deserialize(reader, version); } }
public void AddRewards( MLQuest quest ) // For the claim rewards gump { int y = 146; if ( quest.Rewards.Count > 1 ) { // TODO: Is this what this is for? Does "Only one of the following" occur? AddHtmlLocalized( 100, 140, 312, 16, 1072208, 0x2710, false, false ); // All of the following y += 16; } AddRewards( quest, 107, y, 26 ); }
public void AddRewards( MLQuest quest, int x, int y, int spacing ) { int xReward = x + 28; foreach ( BaseReward reward in quest.Rewards ) { AddImage( x, y + 1, 0x4B9 ); reward.WriteToGump( this, xReward, ref y ); y += spacing; } }
public bool HasDoneQuest( MLQuest quest ) { foreach ( MLDoneQuestInfo info in m_DoneQuests ) { if ( info.m_Quest == quest ) return true; } return false; }
public static void WriteQuestRef( GenericWriter writer, MLQuest quest ) { writer.Write( ( quest != null && quest.SaveEnabled ) ? quest.GetType().FullName : null ); }
private static bool FindQuest( IQuestGiver quester, PlayerMobile pm, MLQuestContext context, out MLQuest quest, out MLQuestInstance entry ) { quest = null; entry = null; List<MLQuest> quests = quester.MLQuests; Type questerType = quester.GetType(); // 1. Check quests in progress with this NPC (overriding deliveries is intended) if ( context != null ) { foreach ( MLQuest questEntry in quests ) { MLQuestInstance instance = context.FindInstance( questEntry ); if ( instance != null && ( instance.Quester == quester || ( !questEntry.IsEscort && instance.QuesterType == questerType ) ) ) { entry = instance; quest = questEntry; return true; } } } // 2. Check deliveries (overriding chain offers is intended) if ( ( entry = HandleDelivery( pm, quester, questerType ) ) != null ) { quest = entry.Quest; return true; } // 3. Check chain quest offers if ( context != null ) { foreach ( MLQuest questEntry in quests ) { if ( questEntry.IsChainTriggered && context.ChainOffers.Contains( questEntry ) ) { quest = questEntry; return true; } } } // 4. Random quest quest = RandomStarterQuest( quester, pm, context ); return ( quest != null ); }
public static void Register( MLQuest quest, params Type[] questerTypes ) { Register( quest.GetType(), quest ); foreach ( Type questerType in questerTypes ) RegisterQuestGiver( quest, questerType ); }
public void AddDescription( MLQuest quest ) { AddHtmlLocalized( 98, 140, 312, 16, ( quest.IsChainTriggered || quest.NextQuest != null ) ? 1075024 : 1072202, 0x2710, false, false ); // Description [(quest chain)] TextDefinition.AddHtmlText( this, 98, 156, 312, 240, quest.Description, false, true, 0x15F90, 0xBDE784 ); }
public void RemoveDoneQuest( MLQuest quest ) { for ( int i = m_DoneQuests.Count - 1; i >= 0; --i ) { MLDoneQuestInfo info = m_DoneQuests[i]; if ( info.m_Quest == quest ) m_DoneQuests.RemoveAt( i ); } }
public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); if (reader.ReadBool()) m_DestinationString = reader.ReadString(); // NOTE: We cannot EDI.Find here, regions have not yet been loaded :-( if (reader.ReadBool()) { m_DeleteTime = reader.ReadDeltaTime(); m_DeleteTimer = new DeleteTimer(this, m_DeleteTime - DateTime.UtcNow); m_DeleteTimer.Start(); } if ( version >= 1 ) { MLQuest quest = MLQuestSystem.ReadQuestRef( reader ); if ( MLQuestSystem.Enabled && quest != null && !StaticMLQuester ) m_MLQuest = quest; } }
public QuestCancelConfirmGump(MLQuestInstance instance, bool closeGumps) : base(120, 50) { m_Instance = instance; m_CloseGumps = closeGumps; if (closeGumps) { BaseQuestGump.CloseOtherGumps(instance.Player); } AddPage(0); Closable = false; AddImageTiled(0, 0, 348, 262, 0xA8E); AddAlphaRegion(0, 0, 348, 262); AddImage(0, 15, 0x27A8); AddImageTiled(0, 30, 17, 200, 0x27A7); AddImage(0, 230, 0x27AA); AddImage(15, 0, 0x280C); AddImageTiled(30, 0, 300, 17, 0x280A); AddImage(315, 0, 0x280E); AddImage(15, 244, 0x280C); AddImageTiled(30, 244, 300, 17, 0x280A); AddImage(315, 244, 0x280E); AddImage(330, 15, 0x27A8); AddImageTiled(330, 30, 17, 200, 0x27A7); AddImage(330, 230, 0x27AA); AddImage(333, 2, 0x2716); AddImage(333, 248, 0x2716); AddImage(2, 248, 0x2716); AddImage(2, 2, 0x2716); AddHtmlLocalized(25, 22, 200, 20, 1049000, 0x7D00, false, false); // Confirm Quest Cancellation AddImage(25, 40, 0xBBF); /* * This quest will give you valuable information, skills * and equipment that will help you advance in the * game at a quicker pace.<BR> * <BR> * Are you certain you wish to cancel at this time? */ AddHtmlLocalized(25, 55, 300, 120, 1060836, 0xFFFFFF, false, false); MLQuest quest = instance.Quest; if (quest.IsChainTriggered || quest.NextQuest != null) { AddRadio(25, 145, 0x25F8, 0x25FB, false, 2); AddHtmlLocalized(60, 150, 280, 20, 1075023, 0xFFFFFF, false, false); // Yes, I want to quit this entire chain! } AddRadio(25, 180, 0x25F8, 0x25FB, true, 1); AddHtmlLocalized(60, 185, 280, 20, 1049005, 0xFFFFFF, false, false); // Yes, I really want to quit this quest! AddRadio(25, 215, 0x25F8, 0x25FB, false, 0); AddHtmlLocalized(60, 220, 280, 20, 1049006, 0xFFFFFF, false, false); // No, I don't want to quit. AddButton(265, 220, 0xF7, 0xF8, 7, GumpButtonType.Reply, 0); }
public bool HasDoneQuest( MLQuest quest, out DateTime nextAvailable ) { nextAvailable = DateTime.MinValue; foreach ( MLDoneQuestInfo info in m_DoneQuests ) { if ( info.m_Quest == quest ) { nextAvailable = info.m_NextAvailable; return true; } } return false; }
public void SetDoneQuest( MLQuest quest ) { SetDoneQuest( quest, DateTime.MinValue ); }
public MLQuestTeleporter(Point3D pointDest, Map mapDest, MLQuest quest, TextDefinition message) : base(pointDest, mapDest) { m_RequiredQuest = quest; m_Message = message; }
public void AddRewardsPage( MLQuest quest ) // For the quest log/offer gumps { AddHtmlLocalized( 98, 140, 312, 16, 1072201, 0x2710, false, false ); // Reward int y = 162; if ( quest.Rewards.Count > 1 ) { // TODO: Is this what this is for? Does "Only one of the following" occur? AddHtmlLocalized( 98, 156, 312, 16, 1072208, 0x2710, false, false ); // All of the following y += 16; } AddRewards( quest, 105, y, 16 ); }
public void AddObjectives( MLQuest quest ) { AddHtmlLocalized( 98, 140, 312, 16, 1049073, 0x2710, false, false ); // Objective: AddHtmlLocalized( 98, 156, 312, 16, ( quest.ObjectiveType == ObjectiveType.All ) ? 1072208 : 1072209, 0x2710, false, false ); // All of the following / Only one of the following int y = 172; foreach ( BaseObjective objective in quest.Objectives ) { objective.WriteToGump( this, ref y ); if ( objective.IsTimed ) { if ( objective is CollectObjective ) y -= 16; BaseObjectiveInstance.WriteTimeRemaining( this, ref y, objective.Duration ); } } }
public void SetDoneQuest( MLQuest quest, DateTime nextAvailable ) { foreach ( MLDoneQuestInfo info in m_DoneQuests ) { if ( info.m_Quest == quest ) { info.m_NextAvailable = nextAvailable; return; } } m_DoneQuests.Add( new MLDoneQuestInfo( quest, nextAvailable ) ); }
public MLDoneQuestInfo( MLQuest quest, DateTime nextAvailable ) { m_Quest = quest; m_NextAvailable = nextAvailable; }
public bool IsDoingQuest( MLQuest quest ) { return ( FindInstance( quest ) != null ); }
private static void RegisterQuestGiver( MLQuest quest, Type questerType ) { List<MLQuest> questList; if ( !m_QuestGivers.TryGetValue( questerType, out questList ) ) m_QuestGivers[questerType] = questList = new List<MLQuest>(); questList.Add( quest ); }
private static void Register( Type type, MLQuest quest ) { m_Quests[type] = quest; }
public MLQuestInstance FindInstance( MLQuest quest ) { foreach ( MLQuestInstance instance in m_QuestInstances ) { if ( instance.Quest == quest ) return instance; } return null; }