Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
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);
            });
        }
Beispiel #5
0
        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);
            });
        }
Beispiel #6
0
        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);
        }
Beispiel #7
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);
        }
Beispiel #8
0
        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)));
        }
Beispiel #9
0
        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);
        }
Beispiel #10
0
        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);
            });
        }
Beispiel #11
0
        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);
        }
Beispiel #12
0
        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()));
        }