コード例 #1
0
ファイル: QuestService.cs プロジェクト: NZNightwolf/SWLOR_NWN
        public static void CompleteQuest(NWPlayer player, NWObject questOwner, int questID, ItemVO selectedItem)
        {
            if (!player.IsPlayer)
            {
                return;
            }

            Quest         quest   = DataService.Single <Quest>(x => x.ID == questID);
            PCQuestStatus pcState = DataService.Single <PCQuestStatus>(x => x.PlayerID == player.GlobalID && x.QuestID == questID);

            QuestState finalState = DataService.GetAll <QuestState>().Where(x => x.QuestID == questID).OrderBy(o => o.Sequence).Last();

            if (finalState == null)
            {
                player.SendMessage("Could not find final state of quest. Please notify an admin this quest is bugged. (QuestID: " + questID + ")");
                return;
            }

            pcState.CurrentQuestStateID = finalState.ID;
            pcState.CompletionDate      = DateTime.UtcNow;

            if (selectedItem == null)
            {
                var rewardItems = DataService.Where <QuestRewardItem>(x => x.QuestID == questID);
                foreach (QuestRewardItem reward in rewardItems)
                {
                    _.CreateItemOnObject(reward.Resref, player.Object, reward.Quantity);
                }
            }
            else
            {
                _.CreateItemOnObject(selectedItem.Resref, player.Object, selectedItem.Quantity);
            }

            if (quest.RewardGold > 0)
            {
                _.GiveGoldToCreature(player.Object, quest.RewardGold);
            }

            if (quest.RewardKeyItemID != null)
            {
                KeyItemService.GivePlayerKeyItem(player, (int)quest.RewardKeyItemID);
            }

            if (quest.RemoveStartKeyItemAfterCompletion && quest.StartKeyItemID != null)
            {
                KeyItemService.RemovePlayerKeyItem(player, (int)quest.StartKeyItemID);
            }

            if (!string.IsNullOrWhiteSpace(quest.MapNoteTag))
            {
                MapPinService.DeleteMapPin(player, "QST_MAP_NOTE_" + questID);
            }

            if (quest.RewardFame > 0)
            {
                PCRegionalFame     fame   = DataService.SingleOrDefault <PCRegionalFame>(x => x.PlayerID == player.GlobalID && x.FameRegionID == quest.FameRegionID);
                DatabaseActionType action = DatabaseActionType.Update;

                if (fame == null)
                {
                    fame = new PCRegionalFame
                    {
                        PlayerID     = player.GlobalID,
                        FameRegionID = quest.FameRegionID,
                        Amount       = 0
                    };

                    action = DatabaseActionType.Insert;
                }

                fame.Amount += quest.RewardFame;
                DataService.SubmitDataChange(fame, action);
            }

            player.SendMessage("Quest '" + quest.Name + "' complete!");
            DataService.SubmitDataChange(pcState, DatabaseActionType.Update);
            _.RemoveJournalQuestEntry(quest.JournalTag, player, FALSE);

            if (!string.IsNullOrWhiteSpace(quest.OnCompleteRule) && questOwner != null)
            {
                var rule = GetQuestRule(quest.OnCompleteRule);

                string[] args = null;
                if (!string.IsNullOrWhiteSpace(quest.OnCompleteArgs))
                {
                    args = quest.OnCompleteArgs.Split(',');
                }
                rule.Run(player, questOwner, questID, args);
            }

            MessageHub.Instance.Publish(new QuestCompletedMessage(player, questID));
        }
コード例 #2
0
        public void AcceptQuest(NWPlayer oPC, int questID)
        {
            if (!oPC.IsPlayer)
            {
                return;
            }

            PCQuestStatus status = _db.PCQuestStatus.Single(x => x.PlayerID == oPC.GlobalID && x.QuestID == questID);

            if (status != null)
            {
                if (status.CompletionDate != null)
                {
                    oPC.SendMessage("You have already completed this quest.");
                    return;
                }
                else
                {
                    oPC.SendMessage("You have already accepted this quest.");
                    return;
                }
            }


            Quest quest = _db.Quests.Single(x => x.QuestID == questID);

            if (!DoesPlayerMeetPrerequisites(oPC, quest.QuestPrerequisites))
            {
                oPC.SendMessage("You do not meet the prerequisites necessary to accept this quest.");
                return;
            }

            if (!DoesPlayerHaveRequiredKeyItems(oPC, quest.QuestStates.ElementAt(0).QuestRequiredKeyItemLists))
            {
                oPC.SendMessage("You do not have the required key items to accept this quest.");
                return;
            }

            PCRegionalFame fame = _db.PCRegionalFames.Single(x => x.PlayerID == oPC.GlobalID && x.FameRegionID == quest.FameRegionID);

            if (fame.Amount < quest.RequiredFameAmount)
            {
                oPC.SendMessage("You do not have enough fame to accept this quest.");
                return;
            }

            status = new PCQuestStatus();
            foreach (QuestState state in quest.QuestStates)
            {
                if (state.Sequence == 1)
                {
                    status.CurrentQuestStateID = state.QuestStateID;
                    break;
                }
            }

            if (status.CurrentQuestState == null)
            {
                oPC.SendMessage("There was an error accepting the quest '" + quest.Name + "'. Please inform an admin this quest is bugged. (QuestID: " + questID + ")");
                return;
            }

            // Give temporary key item at start of quest.
            if (quest.StartKeyItemID != null)
            {
                _keyItem.GivePlayerKeyItem(oPC, (int)quest.StartKeyItemID);
            }

            if (!string.IsNullOrWhiteSpace(quest.MapNoteTag))
            {
                _mapPin.AddWaypointMapPin(oPC, quest.MapNoteTag, quest.Name, "QST_MAP_NOTE_" + questID);
            }

            status.QuestID  = quest.QuestID;
            status.PlayerID = oPC.GlobalID;
            _db.PCQuestStatus.Add(status);
            _db.SaveChanges();

            CreateExtendedQuestDataEntries(status, questID, 1);

            _.AddJournalQuestEntry(quest.JournalTag, 1, oPC.Object, FALSE);
            oPC.SendMessage("Quest '" + quest.Name + "' accepted. Refer to your journal for more information on this quest.");
        }
コード例 #3
0
        public void CompleteQuest(NWPlayer player, int questID, ItemVO selectedItem)
        {
            if (!player.IsPlayer)
            {
                return;
            }

            Quest         quest   = _db.Quests.Single(x => x.QuestID == questID);
            PCQuestStatus pcState = _db.PCQuestStatus.Single(x => x.PlayerID == player.GlobalID && x.QuestID == questID);

            QuestState finalState = null;

            foreach (QuestState questState in quest.QuestStates)
            {
                if (questState.IsFinalState)
                {
                    finalState = questState;
                    break;
                }
            }

            if (finalState == null)
            {
                player.SendMessage("Could not find final state of quest. Please notify an admin this quest is bugged. (QuestID: " + questID + ")");
                return;
            }

            pcState.CurrentQuestStateID = finalState.QuestStateID;
            pcState.CompletionDate      = DateTime.UtcNow;

            if (selectedItem == null)
            {
                foreach (QuestRewardItem reward in quest.QuestRewardItems)
                {
                    _.CreateItemOnObject(reward.Resref, player.Object, reward.Quantity);
                }
            }
            else
            {
                _.CreateItemOnObject(selectedItem.Resref, player.Object, selectedItem.Quantity, "");
            }

            if (quest.RewardGold > 0)
            {
                _.GiveGoldToCreature(player.Object, quest.RewardGold);
            }

            if (quest.RewardXP > 0)
            {
                // TODO: Skill-related exp rewards??
            }

            if (quest.RewardKeyItemID != null)
            {
                _keyItem.GivePlayerKeyItem(player, (int)quest.RewardKeyItemID);
            }

            if (quest.RemoveStartKeyItemAfterCompletion && quest.StartKeyItemID != null)
            {
                _keyItem.RemovePlayerKeyItem(player, (int)quest.StartKeyItemID);
            }

            if (!string.IsNullOrWhiteSpace(quest.MapNoteTag))
            {
                _mapPin.DeleteMapPin(player, "QST_MAP_NOTE_" + questID);
            }

            if (quest.RewardFame > 0)
            {
                PCRegionalFame fame = _db.PCRegionalFames.Single(x => x.PlayerID == player.GlobalID && x.FameRegionID == quest.FameRegionID);
                fame.Amount += quest.RewardFame;
            }

            player.SendMessage("Quest '" + quest.Name + "' complete!");
            _db.SaveChanges();
        }
コード例 #4
0
        /// <summary>
        /// Returns true if player can accept a quest with the given ID.
        /// Returns false if player cannot accept the quest.
        /// </summary>
        /// <param name="oPC">The player to check</param>
        /// <param name="quest">The quest to check.</param>
        /// <param name="sendMessage">If true, a message will be sent to player about why they can't accept the quest.</param>
        /// <returns>true if player can accept quest. false otherwise.</returns>
        public static bool CanAcceptQuest(NWPlayer oPC, Quest quest, bool sendMessage)
        {
            // Retrieve the player's current quest status for this quest.
            // If they haven't accepted it yet, this will be null.
            PCQuestStatus status = DataService.SingleOrDefault <PCQuestStatus>(x => x.PlayerID == oPC.GlobalID &&
                                                                               x.QuestID == quest.ID);

            // If the status is null, it's assumed that the player hasn't accepted it yet.
            if (status != null)
            {
                // If the quest isn't repeatable, prevent the player from accepting it after it's already been completed.
                if (status.CompletionDate != null)
                {
                    // If it's repeatable, then we don't care if they've already completed it.
                    if (!quest.IsRepeatable)
                    {
                        if (sendMessage)
                        {
                            oPC.SendMessage("You have already completed this quest.");
                        }
                        return(false);
                    }
                }
                // If the player already accepted the quest, prevent them from accepting it again.
                else
                {
                    if (sendMessage)
                    {
                        oPC.SendMessage("You have already accepted this quest.");
                    }
                    return(false);
                }
            }

            // Check whether the player meets all necessary prerequisites.
            if (!DoesPlayerMeetPrerequisites(oPC, quest.ID))
            {
                if (sendMessage)
                {
                    oPC.SendMessage("You do not meet the prerequisites necessary to accept this quest.");
                }
                return(false);
            }

            // Retrieve the first state of the quest.
            var questState = DataService.Where <QuestState>(x => x.QuestID == quest.ID).First();

            // If this quest requires key items, ensure player has acquired them.
            if (!DoesPlayerHaveRequiredKeyItems(oPC, questState.ID))
            {
                if (sendMessage)
                {
                    oPC.SendMessage("You do not have the required key items to accept this quest.");
                }
                return(false);
            }

            // Retrieve the player's fame information. Treat a missing record as having 0 fame for this region.
            PCRegionalFame fame       = DataService.SingleOrDefault <PCRegionalFame>(x => x.PlayerID == oPC.GlobalID && x.FameRegionID == quest.FameRegionID);
            int            fameAmount = fame == null ? 0 : fame.Amount;

            // Ensure player has necessary fame for accepting this quest.
            if (fameAmount < quest.RequiredFameAmount)
            {
                if (sendMessage)
                {
                    oPC.SendMessage("You do not have enough fame to accept this quest.");
                }
                return(false);
            }

            return(true);
        }