public void AcceptQuest(NWPlayer player, NWObject questOwner, int questID) { if (!player.IsPlayer) { return; } Quest quest = _data.Single <Quest>(x => x.ID == questID); if (!CanAcceptQuest(player, quest, true)) { return; } var questState = _data.Single <QuestState>(x => x.QuestID == questID && x.Sequence == 1); var status = new PCQuestStatus { CurrentQuestStateID = questState.ID }; // Give temporary key item at start of quest. if (quest.StartKeyItemID != null) { _keyItem.GivePlayerKeyItem(player, (int)quest.StartKeyItemID); } if (!string.IsNullOrWhiteSpace(quest.MapNoteTag)) { _mapPin.AddWaypointMapPin(player, quest.MapNoteTag, quest.Name, "QST_MAP_NOTE_" + questID); } status.QuestID = quest.ID; status.PlayerID = player.GlobalID; _data.SubmitDataChange(status, DatabaseActionType.Insert); CreateExtendedQuestDataEntries(status); _.AddJournalQuestEntry(quest.JournalTag, 1, player.Object, FALSE); player.SendMessage("Quest '" + quest.Name + "' accepted. Refer to your journal for more information on this quest."); if (!string.IsNullOrWhiteSpace(quest.OnAcceptRule) && questOwner != null) { App.ResolveByInterface <IQuestRule>("QuestRule." + quest.OnAcceptRule, rule => { string[] args = null; if (!string.IsNullOrWhiteSpace(quest.OnAcceptArgs)) { args = quest.OnAcceptArgs.Split(','); } rule.Run(player, questOwner, questID, args); }); } }
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."); }