Example #1
0
        /// <summary>
        /// Completes a quest for a player. If a reward is selected, that reward will be given to the player.
        /// Otherwise, all rewards configured for this quest will be given to the player.
        /// </summary>
        /// <param name="player">The player completing the quest.</param>
        /// <param name="questSource">The source of the quest completion</param>
        /// <param name="selectedReward">The reward selected by the player</param>
        public void Complete(uint player, uint questSource, IQuestReward selectedReward)
        {
            if (!GetIsPC(player) || GetIsDM(player))
            {
                return;
            }
            if (!CanComplete(player))
            {
                return;
            }

            var playerId = GetObjectUUID(player);
            var dbPlayer = DB.Get <Player>(playerId);
            var quest    = dbPlayer.Quests.ContainsKey(QuestId) ? dbPlayer.Quests[QuestId] : new PlayerQuest();

            // Mark player as being on the last state of the quest.
            quest.CurrentState = GetStates().Count();
            quest.TimesCompleted++;

            // No selected reward, simply give all available rewards to the player.
            if (selectedReward == null)
            {
                foreach (var reward in Rewards)
                {
                    reward.GiveReward(player);
                }
            }
            // There is a selected reward. Give that reward and any rewards which are not selectable to the player.
            else
            {
                // Non-selectable rewards (gold, GP, etc) are granted to the player.
                foreach (var reward in Rewards.Where(x => !x.IsSelectable))
                {
                    reward.GiveReward(player);
                }

                selectedReward.GiveReward(player);
            }

            quest.ItemProgresses.Clear();
            quest.KillProgresses.Clear();
            quest.DateLastCompleted  = DateTime.UtcNow;
            dbPlayer.Quests[QuestId] = quest;
            DB.Set(playerId, dbPlayer);

            foreach (var action in OnCompleteActions)
            {
                action.Invoke(player, questSource);
            }

            SendMessageToPC(player, "Quest '" + Name + "' complete!");
            RemoveJournalQuestEntry(QuestId, player, false);

            Events.SignalEvent("FFO_COMPLETE_QUEST", player);
        }
Example #2
0
        public static QuestInstance GenerateQuestInstance(QuestSourceTypes forcedType)
        {
            int questDuration = m_QuestDurationChoser.GetRandomValue();
            int itemRewardChance;

            IQuestReward additionalReward = null;
            IQuestSource qSource;

            switch (forcedType)
            {
            default:
            case QuestSourceTypes.FACTION:
                qSource = ReputationManager.GetRandomFaction();
                QuestSourceFaction factionSource = qSource as QuestSourceFaction;
                itemRewardChance = 25;

                if (Random.Range(0, daysSinceHeroRecruit) == 0)
                {
                    additionalReward     = new QuestRewardHero(factionSource);
                    daysSinceHeroRecruit = Random.Range(10, 20);
                }
                else if (Random.Range(0, daysSinceFactionRecruit) == 0)
                {
                    additionalReward        = new QuestRewardFaction(factionSource.AverageHeroLevel + Random.Range(3, 6));
                    daysSinceFactionRecruit = Random.Range(25, 35);
                }

                daysSinceHeroRecruit--;
                daysSinceFactionRecruit--;
                break;

            case QuestSourceTypes.PERSON:
                qSource          = ReputationGenerator.GenerateReputationInstance(new QuestSourcePerson(EnumUtility.GetRandomEnumValue <ReputationBiases>()));
                itemRewardChance = 5;
                break;

            case QuestSourceTypes.RUMOR:
                qSource          = ReputationGenerator.GenerateReputationInstance(new QuestSourceRumor());
                itemRewardChance = 15;
                break;
            }

            QuestInstance quest = GenerateQuestInstance(qSource, questDuration);

            quest.AdditionalReward = additionalReward;
            quest.PartySize        = m_PartySizeChoser.GetRandomValue();

            if (Random.Range(0, itemRewardChance) == 0)
            {
                GameItem itemReward = GameItemGenerator.GenerateItem(GameItemTypes.UNKNOWN, GetItemRarityForDifficulty(quest.DifficultyLevel));
                quest.HandlerItemReward = new QuestRewardItem(itemReward);
            }

            return(quest);
        }
Example #3
0
        /// <summary>
        /// Completes a quest for a player. If a reward is selected, that reward will be given to the player.
        /// Otherwise, all rewards configured for this quest will be given to the player.
        /// </summary>
        /// <param name="player">The player completing the quest.</param>
        /// <param name="questSource">The source of the quest completion</param>
        /// <param name="selectedReward">The reward selected by the player</param>
        internal void Complete(NWGameObject player, NWGameObject questSource, IQuestReward selectedReward)
        {
            if (!GetIsPlayer(player))
            {
                return;
            }
            if (!CanComplete(player))
            {
                return;
            }

            var playerID = GetGlobalID(player);
            var pcState  = QuestProgressRepo.Get(playerID, QuestID);

            // Mark player as being on the last state of the quest.
            pcState.CurrentState = GetStates().Count();
            pcState.TimesCompleted++;

            // No selected reward, simply give all available rewards to the player.
            if (selectedReward == null)
            {
                foreach (var reward in Rewards)
                {
                    reward.GiveReward(player);
                }
            }
            // There is a selected reward. Give that reward and any rewards which are not selectable to the player.
            else
            {
                // Non-selectable rewards (gold, GP, etc) are granted to the player.
                foreach (var reward in Rewards.Where(x => !x.IsSelectable))
                {
                    reward.GiveReward(player);
                }

                selectedReward.GiveReward(player);
            }

            QuestProgressRepo.Set(playerID, pcState);

            foreach (var action in _onCompleteActions)
            {
                action.Invoke(player, questSource);
            }

            SendMessageToPC(player, "Quest '" + Name + "' complete!");
            RemoveJournalQuestEntry(JournalTag, player, false);

            Publish.CustomEvent(player, QuestEventPrefix.OnQuestAdvanced, new QuestCompleted(player, QuestID));
        }
        public static void UpdateRelatedQuest(IQuestReward item, bool isChecked)
        {
            if (item == null || item.QuestStages.Count == 0)
            {
                return;
            }

            var quest = item.QuestStages.First().Quest;

            quest.IsChecked = isChecked;
            quest.WeaponRewards.ForEach(x => x.IsChecked    = isChecked);
            quest.ArmorRewards.ForEach(x => x.IsChecked     = isChecked);
            quest.CompanionRewards.ForEach(x => x.IsChecked = isChecked);
            QuestRepository.UpdateQuestCompleted(quest);
        }
Example #5
0
        public void Complete(NWPlayer player, NWObject questSource, IQuestReward selectedReward)
        {
            if (!player.IsPlayer)
            {
                return;
            }
            if (!CanComplete(player))
            {
                return;
            }

            PCQuestStatus pcState = DataService.PCQuestStatus.GetByPlayerAndQuestID(player.GlobalID, QuestID);

            // Mark player as being on the last state of the quest.
            pcState.QuestState     = GetStates().Count();
            pcState.CompletionDate = DateTime.UtcNow;
            pcState.TimesCompleted++;

            // No selected reward, simply give all available rewards to the player.
            if (selectedReward == null)
            {
                foreach (var reward in Rewards)
                {
                    reward.GiveReward(player);
                }
            }
            // There is a selected reward. Give that reward and any rewards which are not selectable to the player.
            else
            {
                // Non-selectable rewards (gold, GP, etc) are granted to the player.
                foreach (var reward in Rewards.Where(x => !x.IsSelectable))
                {
                    reward.GiveReward(player);
                }

                selectedReward.GiveReward(player);
            }

            DataService.SubmitDataChange(pcState, DatabaseActionType.Update);
            _onComplete?.Invoke(player, questSource);

            player.SendMessage("Quest '" + Name + "' complete!");
            RemoveJournalQuestEntry(JournalTag, player, false);
            MessageHub.Instance.Publish(new OnQuestCompleted(player, QuestID));
        }
Example #6
0
        public IQuest AddReward(IQuestReward reward)
        {
            Rewards.Add(reward);

            return(this);
        }
Example #7
0
 /// <summary>
 /// Adds a new reward for completing this quest.
 /// </summary>
 /// <param name="reward">The new reward to add.</param>
 protected void AddReward(IQuestReward reward)
 {
     Rewards.Add(reward);
 }