public static BaseQuest RandomQuest(PlayerMobile pm, ITierQuester quester) { TierQuestInfo info = quester.TierInfo; if (info != null) { List <Type> list = new List <Type>(); int lastTierComplete = 0; for (int i = 0; i < info.Tiers.Length; i++) { TierInfo tier = info.Tiers[i]; if (lastTierComplete >= tier.ToComplete) { list.AddRange(tier.Quests); } lastTierComplete = 0; foreach (Type quest in tier.Quests) { lastTierComplete += HasCompleted(pm, quest, info); } } if (list.Count > 0) { return(QuestHelper.Construct(list[Utility.Random(list.Count)])); } } return(null); }
public static TimeSpan GetCooldown(TierQuestInfo tierInfo, Type questType) { TierInfo info = null; for (var index = 0; index < tierInfo.Tiers.Length; index++) { var i = tierInfo.Tiers[index]; bool any = false; for (var index1 = 0; index1 < i.Quests.Length; index1++) { var q = i.Quests[index1]; if (q == questType) { any = true; break; } } if (any) { info = i; break; } } if (info != null) { return(info.Cooldown); } return(TimeSpan.Zero); }
public static int GetCompleteReq(TierQuestInfo tierInfo, Type questType) { TierInfo info = null; for (var index = 0; index < tierInfo.Tiers.Length; index++) { var i = tierInfo.Tiers[index]; bool any = false; for (var index1 = 0; index1 < i.Quests.Length; index1++) { var q = i.Quests[index1]; if (q == questType) { any = true; break; } } if (any) { info = i; break; } } if (info != null) { return(info.ToComplete); } return(0); }
public static void OnSave(WorldSaveEventArgs e) { Persistence.Serialize( FilePath, writer => { writer.Write(0); writer.Write(QuestData.Count); foreach (var kvp in QuestData) { writer.Write(kvp.Key); QuestWriter.Quests(writer, kvp.Value); } writer.Write(ChainData.Count); foreach (var kvp in ChainData) { writer.Write(kvp.Key); QuestWriter.Chains(writer, kvp.Value); } TierQuestInfo.Save(writer); }); }
public static void OnSave(WorldSaveEventArgs e) { Persistence.Serialize( FilePath, writer => { writer.Write(0); writer.Write(QuestData.Count); foreach (KeyValuePair <PlayerMobile, List <BaseQuest> > kvp in QuestData) { writer.Write(kvp.Key); QuestWriter.Quests(writer, kvp.Value); } writer.Write(ChainData.Count); foreach (KeyValuePair <PlayerMobile, Dictionary <QuestChain, BaseChain> > kvp in ChainData) { writer.Write(kvp.Key); QuestWriter.Chains(writer, kvp.Value); } TierQuestInfo.Save(writer); }); }
public static int GetCompleteReq(TierQuestInfo tierInfo, Type questType) { TierInfo info = tierInfo.Tiers.FirstOrDefault(i => i.Quests.Any(q => q == questType)); if (info != null) { return(info.ToComplete); } return(0); }
public static TimeSpan GetCooldown(TierQuestInfo tierInfo, Type questType) { TierInfo info = tierInfo.Tiers.FirstOrDefault(i => i.Quests.Any(q => q == questType)); if (info != null) { return(info.Cooldown); } return(TimeSpan.Zero); }
static TierQuestInfo() { Percolem = new TierQuestInfo(typeof(Percolem), new TierInfo(0, TimeSpan.FromMinutes(30), typeof(BouraBouraQuest), typeof(RaptorliciousQuest), typeof(TheSlithWarsQuest)), new TierInfo(5, TimeSpan.FromMinutes(120), typeof(AmbushingTheAmbushersQuest), typeof(BouraBouraAndMoreBouraQuest), typeof(RevengeOfTheSlithQuest), typeof(WeveGotAnAntProblemQuest)), new TierInfo(10, TimeSpan.FromMinutes(1440), typeof(ItMakesMeSickQuest), typeof(ItsAMadMadWorldQuest), typeof(TheDreamersQuest))); Thepem = new TierQuestInfo(typeof(Thepem), new TierInfo(0, TimeSpan.FromMinutes(30), typeof(AllThatGlitters), typeof(TastyTreats)), new TierInfo(5, TimeSpan.FromMinutes(120), typeof(MetalHead), typeof(PinkistheNewBlack))); Zosilem = new TierQuestInfo(typeof(Zosilem), new TierInfo(0, TimeSpan.FromMinutes(30), typeof(DabblingontheDarkSide), typeof(TheBrainyAlchemist)), new TierInfo(5, TimeSpan.FromMinutes(120), typeof(ArmorUp), typeof(ToTurnBaseMetalIntoVerite)), new TierInfo(10, TimeSpan.FromMinutes(1440), typeof(PureValorite), typeof(TheForbiddenFruit))); }
public static BaseQuest RandomQuest(PlayerMobile from, Type[] quests, object quester, bool message) { if (quests == null) { return(null); } BaseQuest quest = null; if (quester is ITierQuester tierQuester) { quest = TierQuestInfo.RandomQuest(from, tierQuester); } else if (quests.Length > 0) { // give it 10 tries to generate quest for (int i = 0; i < 10; i++) { quest = Construct(quests[Utility.Random(quests.Length)]); } } if (quest != null) { quest.Owner = from; quest.Quester = quester; if (CanOffer(from, quest, quester, message)) { return(quest); } if (quester is Mobile mobile && message) { if (mobile is MondainQuester mondainQuester) { mondainQuester.OnOfferFailed(); } else { mobile.Say(1080107); // I'm sorry, I have nothing for you at this time. } } } return(null); }
public static void OnLoad() { Persistence.Deserialize( FilePath, reader => { int version = reader.ReadInt(); int count = reader.ReadInt(); for (int i = 0; i < count; i++) { PlayerMobile pm = reader.ReadMobile() as PlayerMobile; List <BaseQuest> quests = QuestReader.Quests(reader, pm); if (pm != null) { QuestData[pm] = quests; } } count = reader.ReadInt(); for (int i = 0; i < count; i++) { PlayerMobile pm = reader.ReadMobile() as PlayerMobile; Dictionary <QuestChain, BaseChain> dic = QuestReader.Chains(reader); if (pm != null) { ChainData[pm] = dic; } } TierQuestInfo.Load(reader); }); }
public static int HasCompleted(PlayerMobile pm, Type questType, TierQuestInfo info) { if (!PlayerTierInfo.ContainsKey(pm)) { return(0); } int completed = 0; foreach (KeyValuePair <Type, int> kvp in PlayerTierInfo[pm]) { if (questType == kvp.Key) { completed += kvp.Value; } } /*foreach (var tier in info.Tiers) * { * if (tier.Quests.Any(q => q == questType)) * { * foreach (var q in tier.Quests) * { * foreach (var kvp in PlayerTierInfo[pm]) * { * if (q == kvp.Key) * { * completed += kvp.Value; * } * } * } * } * }*/ return(completed); }
public virtual void GiveRewards() { // give rewards for (int i = 0; i < m_Rewards.Count; i++) { Type type = m_Rewards[i].Type; m_Rewards[i].GiveReward(); if (type == null) { continue; } Item reward; try { reward = Activator.CreateInstance(type) as Item; } catch (Exception e) { Server.Diagnostics.ExceptionLogging.LogException(e); reward = null; } if (reward != null) { if (reward.Stackable) { reward.Amount = m_Rewards[i].Amount; m_Rewards[i].Amount = 1; } for (int j = 0; j < m_Rewards[i].Amount; j++) { if (!m_Owner.PlaceInBackpack(reward)) { reward.MoveToWorld(m_Owner.Location, m_Owner.Map); } if (m_Rewards[i].Name is int) { m_Owner.SendLocalizedMessage(1074360, "#" + (int)m_Rewards[i].Name); // You receive a reward: ~1_REWARD~ } else if (m_Rewards[i].Name is string) { m_Owner.SendLocalizedMessage(1074360, (string)m_Rewards[i].Name); // You receive a reward: ~1_REWARD~ } // already marked, we need to see if this gives progress to another quest. if (reward.QuestItem) { QuestHelper.CheckRewardItem(Owner, reward); } } } } // remove quest if (NextQuest == null) { RemoveQuest(true); } else { RemoveQuest(); } // offer next quest if present if (NextQuest != null) { BaseQuest quest = QuestHelper.RandomQuest(m_Owner, new Type[] { NextQuest }, StartingMobile); if (quest != null && quest.ChainID == ChainID) { m_Owner.SendGump(new MondainQuestGump(quest)); } } if (this is ITierQuest) { TierQuestInfo.CompleteQuest(Owner, (ITierQuest)this); } EventSink.InvokeQuestComplete(new QuestCompleteEventArgs(Owner, GetType())); }