public virtual ActionResult StartQuest(int Id) { var myMembershipId = User.Identity.GetUserId(); if (PvPStatics.AnimateUpdateInProgress) { TempData["Error"] = "Player update portion of the world update is still in progress."; TempData["SubError"] = "Try again a bit later when the update has progressed farther along."; return(RedirectToAction(MVC.PvP.Play())); } var me = PlayerProcedures.GetPlayerFromMembership(myMembershipId); // assert player is in an okay form to do this if (me.Mobility != PvPStatics.MobilityFull) { TempData["Error"] = "You must be animate in order to begin a quest."; return(RedirectToAction(MVC.PvP.Play())); } // assert that this player is not in a duel if (me.InDuel > 0) { TempData["Error"] = "You must finish your duel before you begin a quest."; return(RedirectToAction(MVC.PvP.Play())); } // assert that this player is not in a quest if (me.InQuest > 0) { TempData["Error"] = "You must finish your current quest before you start another."; return(RedirectToAction(MVC.PvP.Play())); } // assert player has not been in combat recently var lastAttackTimeAgo = Math.Abs(Math.Floor(me.GetLastCombatTimestamp().Subtract(DateTime.UtcNow).TotalMinutes)); if (lastAttackTimeAgo < TurnTimesStatics.GetMinutesSinceLastCombatBeforeQuestingOrDuelling()) { TempData["Error"] = "You have been in combat too recently in order to begin this quest."; TempData["SubError"] = "You must stay out of combat for another " + (TurnTimesStatics.GetMinutesSinceLastCombatBeforeQuestingOrDuelling() - lastAttackTimeAgo) + " minutes."; return(RedirectToAction(MVC.PvP.Play())); } var questStart = QuestProcedures.GetQuest(Id); // assert player is in the correct place if (me.dbLocationName != questStart.Location) { TempData["Error"] = "You are not in the correct location to begin this quest."; return(RedirectToAction(MVC.PvP.Play())); } var gameTurnNum = PvPWorldStatProcedures.GetWorldTurnNumber(); // assert player did not fail or abandon this quest too soon ago var lastTurnAttempted = QuestProcedures.GetLastTurnQuestEnded(me, questStart.Id); if (PvPWorldStatProcedures.GetWorldTurnNumber() - lastTurnAttempted < QuestStatics.QuestFailCooldownTurnLength) { TempData["Error"] = "You recently failed or abandoned this quest."; TempData["SubError"] = "You must wait another " + (QuestStatics.QuestFailCooldownTurnLength - (gameTurnNum - lastTurnAttempted)) + " turns before you can attempt this quest again."; return(RedirectToAction(MVC.PvP.Play())); } var questPlayerStatuses = QuestProcedures.GetQuestPlayerStatuses(me); var canStartQuest = QuestProcedures.PlayerCanBeginQuest(me, questStart, questPlayerStatuses, gameTurnNum); // assert player meets level / game turn requirements for this quest if (!canStartQuest) { TempData["Error"] = "You do not meet all of the criteria to begin this quest."; return(RedirectToAction(MVC.PvP.Play())); } // all checks have passed; start the player on this quest QuestProcedures.PlayerBeginQuest(me, questStart); LocationLogProcedures.AddLocationLog(me.dbLocationName, "<span class='playerMediatingNotification'><b>" + me.GetFullName() + "</b> began the quest <b>" + questStart.Name + "</b> here.</span>"); TempData["Result"] = "You started the quest " + questStart.Name + "."; return(RedirectToAction(MVC.Quest.Questing())); }