/// <summary> /// Tries to start the quest of the given group and number for the specified player. /// </summary> /// <param name="player">The player.</param> /// <param name="group">The group.</param> /// <param name="number">The number.</param> public void StartQuest(Player player, short group, short number) { using var loggerScope = player.Logger.BeginScope(this.GetType()); var quest = player.GetQuest(group, number); if (quest is null) { player.Logger.LogWarning("Failed, quest not found"); return; } if (quest.MinimumCharacterLevel > player.Level || (quest.MaximumCharacterLevel > 0 && quest.MaximumCharacterLevel < player.Level)) { player.Logger.LogDebug("Failed, character level {0} not in allowed range {1} to {2}.", player.Level, quest.MinimumCharacterLevel, quest.MaximumCharacterLevel); return; } var questState = player.SelectedCharacter !.QuestStates.FirstOrDefault(q => q.Group == group); if (questState is null) { questState = player.PersistenceContext.CreateNew <CharacterQuestState>(); questState.Group = group; player.SelectedCharacter.QuestStates.Add(questState); } if (questState.ActiveQuest != null) { player.Logger.LogDebug("There is already an active quest of this group."); player.ViewPlugIns.GetPlugIn <IQuestProgressPlugIn>()?.ShowQuestProgress(questState.ActiveQuest, false); return; } if (questState.LastFinishedQuest == quest && !quest.Repeatable) { player.Logger.LogDebug("The quest is not repeatable."); return; } if (quest.RequiredStartMoney > 0) { if (player.TryRemoveMoney(quest.RequiredStartMoney)) { player.ViewPlugIns.GetPlugIn <IUpdateMoneyPlugIn>()?.UpdateMoney(); } else { player.ViewPlugIns.GetPlugIn <IShowMessagePlugIn>()?.ShowMessage("Not enough money to proceed", MessageType.BlueNormal); return; } } questState.Clear(player.PersistenceContext); questState.ActiveQuest = quest; player.ViewPlugIns.GetPlugIn <IQuestStartedPlugIn>()?.QuestStarted(quest); }