示例#1
0
        public void RegisterQuest(CustomQuest quest)
        {
            if (!this.allowedChars.IsMatch(quest.Name))
            {
                throw new InvalidQuestException("Quest name contains unallowed characters.");
            }

            quest.OwnedByModUid = this.ModUid;

            this.QuestManager.RegisterQuest(quest);
        }
示例#2
0
        /// <summary>
        /// Get connected vanilla quest with this managed quest in quest log
        /// </summary>
        /// <param name="customQuest"></param>
        /// <returns>null if this quest is not in quest log, otherwise the connected vanilla quest</returns>
        public static Quest GetInQuestLog(this CustomQuest customQuest)
        {
            if (!Context.IsWorldReady)
            {
                return(null);
            }

            return(Game1.player.questLog
                   .Where(q => q.id.Value == customQuest.id)
                   .FirstOrDefault());
        }
        public static bool IsNeverCompleted(this CustomQuest customQuest)
        {
            if (!Context.IsWorldReady)
            {
                return(false);
            }

            var stats = QuestFrameworkMod.Instance.
                        StatsManager
                        .GetStats(Game1.player.UniqueMultiplayerID);

            return(stats.GetQuestStatSummary(customQuest.GetFullName()).LastCompleted == null);
        }
示例#4
0
        internal CustomQuest CreateQuestOfType(string type)
        {
            if (!this.Factories.ContainsKey(type))
            {
                throw new InvalidQuestException($"Quest type factory {type} doesn't exist!");
            }

            CustomQuest quest = this.Factories[type]();

            if (quest.Name != null)
            {
                throw new InvalidQuestException("Quest name is unexpectedly assigned by factory!");
            }

            return(quest);
        }
示例#5
0
        private void OnQuestAccepted(object sender, QuestEventArgs e)
        {
            if (!e.IsManaged || this._npcQuestOffers.Value.Count == 0)
            {
                return;
            }

            CustomQuest quest = e.GetManagedQuest();
            QuestOffer <NpcOfferAttributes> offer = this.QuestOffers.FirstOrDefault(o => o.QuestName == quest.GetFullName());

            if (offer != null)
            {
                this.QuestOffers.Remove(offer);
                this.RefreshActiveIndicators();
            }
        }
示例#6
0
        private void SetQuestDetails(CustomQuest quest, string[] definition)
        {
            quest.BaseType    = definition[0] == "Location" ? QuestType.Location : QuestType.Custom;
            quest.Title       = definition[1];
            quest.Description = definition[2];
            quest.Objective   = definition[3];
            quest.Trigger     = definition[4];
            quest.Reward      = int.Parse(definition[5]);
            quest.Cancelable  = definition[6].Equals("true");

            if (definition.Length > 7)
            {
                quest.NextQuests.AddRange(
                    definition[7].Split(' ').Select(n => "adventure" + n));
            }
        }
        public bool CheckConditions(Dictionary<string, string> conditions, CustomQuest context, IEnumerable<string> ignore = null, bool ignoreUnknown = false)
        {
            bool flag = true;

            if (conditions == null)
                return true;

            foreach (var cond in conditions)
            {
                if (ignore != null && ignore.Any(ig => ig == cond.Key))
                    continue;

                flag &= this.CheckCondition(cond.Key, cond.Value, context, ignoreUnknown);
            }

            this.monitor.VerboseLog($"All checked conditions result is {flag}");

            return flag;
        }
示例#8
0
        public bool CheckCondition(string condition, string value, CustomQuest context)
        {
            bool   isNot             = false;
            string realConditionName = condition;

            if (condition == null || value == null)
            {
                return(true);
            }

            if (condition.StartsWith("not:"))
            {
                condition = condition.Substring(4);
                isNot     = true;
            }

            if (this.Conditions.TryGetValue(condition, out var conditionFunc))
            {
                bool result = false;

                foreach (string valuePart in value.Split('|'))
                {
                    result |= conditionFunc(valuePart.Trim(), context);
                }

                if (this.monitor.IsVerbose)
                {
                    this.monitor.Log(
                        $"Checked condition `{realConditionName}` for `{value}` " +
                        $"in quest context `{context.GetFullName()}` " +
                        $"returns {(isNot ? !result : result)}");
                }

                return(isNot ? !result : result);
            }

            this.monitor.Log(
                $"Checked unknown condition `{condition}` in quest context `{context.GetFullName()}`. Result for unknown conditions is always false.", LogLevel.Warn);

            return(false);
        }
示例#9
0
        private void Apply(Content content)
        {
            // Register quests
            foreach (var questData in content.Quests)
            {
                CustomQuest managedQuest = this.MapQuest(content, questData);

                if (questData.Hooks != null)
                {
                    managedQuest.Hooks.AddRange(questData.Hooks);
                }

                this.ApplyHandlers(managedQuest, questData);
                this.Manager.RegisterQuest(managedQuest);
            }

            // Add quest schedules
            foreach (var offer in content.Offers)
            {
                this.ScheduleManager.AddOffer(offer);
            }
        }
示例#10
0
        private void Apply(Content content)
        {
            // Register quests
            foreach (var questData in content.Quests)
            {
                try
                {
                    CustomQuest managedQuest = this.MapQuest(content, questData);

                    if (questData.Hooks != null)
                    {
                        managedQuest.Hooks.AddRange(questData.Hooks);
                    }

                    if (!this.allowedChars.IsMatch(managedQuest.Name))
                    {
                        this.Monitor.Log($"Quest name `{managedQuest.Name}` contains unallowed characters in pack `{content.Owner.Manifest.UniqueID}`", LogLevel.Error);
                        return;
                    }

                    this.ApplyHandlers(managedQuest, questData);
                    this.Manager.RegisterQuest(managedQuest);
                }
                catch (InvalidQuestException ex)
                {
                    this.Monitor.Log($"Error while creating quest `{questData.Name}` from pack `{content.Owner.Manifest.UniqueID}`: {ex.Message}", LogLevel.Error);
                }
            }

            this.RegisterBoards(content.Owner, content.CustomBoards);
            this.RegisterDropBoxes(content.Owner, content.CustomDropBoxes);

            // Add quest schedules
            foreach (var offer in content.Offers)
            {
                this.ScheduleManager.AddOffer(offer);
            }
        }
示例#11
0
        public void LoadQuests(IGameMaster master)
        {
            foreach (var questRaw in this.GetQuestsSource())
            {
                var         definition = questRaw.Value.Split('/');
                CustomQuest quest;

                if (definition[0] == "Recruitment")
                {
                    quest = new RecruitmentQuest(master, this.contentLoader)
                    {
                        CustomTypeId = RecruitmentQuest.TYPE_ID,
                    };
                }
                else
                {
                    quest = new CustomQuest();
                }

                quest.Name = $"adventure{questRaw.Key}";
                this.SetQuestDetails(quest, definition);
                this.questApi.RegisterQuest(quest);
            }
        }
示例#12
0
        private string ToQuestString(CustomQuest quest)
        {
            var type = quest.BaseType == QuestType.Custom ? "Basic" : quest.BaseType.ToString();

            return($"{type}/{quest.Title}/{quest.Description}/{quest.Objective}./{quest.Trigger}/-1/{quest.Reward}/-1/true/{quest.ReactionText}");
        }
 /// <summary>
 /// Check if this quest is included in player's quest log.
 /// </summary>
 /// <param name="customQuest"></param>
 /// <returns></returns>
 public static bool IsInQuestLog(this CustomQuest customQuest)
 {
     return(Context.IsWorldReady && Game1.player.hasQuest(customQuest.id));
 }
示例#14
0
        public void RegisterQuest(CustomQuest quest)
        {
            quest.OwnedByModUid = this.ModUid;

            this.QuestManager.RegisterQuest(quest);
        }
示例#15
0
 public void Initialize(CustomQuest customQuest)
 {
     this.WatchFields(ActiveStateHelper.GatherActiveStateProperties(customQuest).ToArray());
     this.WatchFields(ActiveStateHelper.GatherActiveStateFields(customQuest).ToArray());
 }
示例#16
0
        private void ApplyHandlers(CustomQuest managedQuest, QuestData questData)
        {
            managedQuest.Accepted += (_sender, _info) =>
            {
                if (_info.VanillaQuest.completed.Value)
                {
                    return;
                }

                // Add/Remove conversation topic(s) when quest was ACCEPTED
                if (!string.IsNullOrEmpty(questData.ConversationTopic?.AddWhenQuestAccepted))
                {
                    ConversationTopicHelper.AddConversationTopic(questData.ConversationTopic.AddWhenQuestAccepted);
                }
                if (!string.IsNullOrEmpty(questData.ConversationTopic?.RemoveWhenQuestAccepted))
                {
                    ConversationTopicHelper.RemoveConversationTopic(questData.ConversationTopic.RemoveWhenQuestAccepted);
                }
            };
            managedQuest.Completed += (_sender, _info) =>
            {
                if (!_info.VanillaQuest.completed.Value)
                {
                    return;
                }

                // Add/Remove conversation topic(s) when quest was COMPLETED
                if (!string.IsNullOrEmpty(questData.ConversationTopic?.AddWhenQuestCompleted))
                {
                    ConversationTopicHelper.AddConversationTopic(questData.ConversationTopic.AddWhenQuestCompleted);
                }
                if (!string.IsNullOrEmpty(questData.ConversationTopic?.RemoveWhenQuestCompleted))
                {
                    ConversationTopicHelper.RemoveConversationTopic(questData.ConversationTopic.RemoveWhenQuestCompleted);
                }
                if (!string.IsNullOrEmpty(questData.AddMailOnComplete))
                {
                    MailHelper.AddMail(questData.AddMailOnComplete);
                }
                if (!string.IsNullOrEmpty(questData.RemoveMailOnComplete))
                {
                    MailHelper.RemoveMail(questData.RemoveMailOnComplete);
                }
            };
            managedQuest.Removed += (_sender, _info) =>
            {
                if (_info.VanillaQuest.completed.Value)
                {
                    return;
                }

                // Add/Remove conversation topic(s) when quest was REMOVED
                if (!string.IsNullOrEmpty(questData.ConversationTopic?.AddWhenQuestRemoved))
                {
                    ConversationTopicHelper.AddConversationTopic(questData.ConversationTopic.AddWhenQuestRemoved);
                }
                if (!string.IsNullOrEmpty(questData.ConversationTopic?.RemoveWhenQuestRemoved))
                {
                    ConversationTopicHelper.RemoveConversationTopic(questData.ConversationTopic.RemoveWhenQuestRemoved);
                }
            };
        }
 public static bool CheckGlobalConditions(this CustomQuest customQuest, Dictionary <string, string> conditions, IEnumerable <string> ignore = null, bool ignoreUnknown = false)
 {
     return(QuestFrameworkMod.Instance.ConditionManager.CheckConditions(conditions, customQuest, ignore, ignoreUnknown));
 }
 private static bool IsQuestCompletedDate(SDate dateToCheck, CustomQuest managedQuest)
 {
     return(GetQuestStats(managedQuest).LastCompleted == dateToCheck);
 }
        private static bool IsQuestAcceptedInPeriod(string valueToCheck, CustomQuest managedQuest)
        {
            if (!Context.IsWorldReady)
            {
                return(false);
            }
            var   parts      = valueToCheck.Split(' ');
            var   acceptDate = GetQuestStats(managedQuest).LastAccepted;
            SDate now        = SDate.Now();

            Monitor.VerboseLog(
                $"Checking quest accept date `{acceptDate}` matches current `{now}` by `{valueToCheck}`");

            if (parts.Length < 1 || acceptDate == null || (parts.Contains("today") && acceptDate != now))
            {
                return(false);
            }

            bool flag = true;

            foreach (string part in parts)
            {
                string[] period = part.Split('=');
                string   type   = period.ElementAtOrDefault(0);
                string   value  = period.ElementAtOrDefault(1);

                switch (type)
                {
                case "y":
                case "year":
                    flag &= acceptDate.Year == (
                        int.TryParse(value, out var year)
                                ? year
                                : now.Year
                        );
                    break;

                case "s":
                case "season":
                    flag &= acceptDate.Season == (value ?? now.Season);
                    break;

                case "wd":
                case "weekday":
                    flag &= acceptDate.DayOfWeek == (
                        Enum.TryParse <DayOfWeek>(value, out var dayOfWeek)
                                ? dayOfWeek
                                : now.DayOfWeek
                        );
                    break;

                case "d":
                case "day":
                    flag &= acceptDate.Day == (
                        int.TryParse(value, out var day)
                                ? day
                                : now.Day
                        );
                    break;

                default:
                    flag &= false;
                    break;
                }
            }

            return(flag);
        }
 public static bool CheckGlobalCondition(this CustomQuest customQuest, string condition, string value, bool ignoreUnknown = false)
 {
     return(QuestFrameworkMod.Instance.ConditionManager.CheckCondition(condition, value, customQuest, ignoreUnknown));
 }