//
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
//
namespace MUnique.OpenMU.GameLogic.PlayerActions.Quests;
using MUnique.OpenMU.DataModel.Configuration.Quests;
///
/// Quest related extension methods.
///
public static class PlayerQuestExtensions
{
///
/// Gets the state of the quest.
///
/// The player.
/// The group of the quest.
/// The number of the quest.
/// The quest state, if found; Otherwise, null.
public static CharacterQuestState? GetQuestState(this Player player, short group, short number)
{
return player.SelectedCharacter?.QuestStates.FirstOrDefault(state => state.Group == group && (state.ActiveQuest?.Number == number || state.ActiveQuest?.StartingNumber == number));
}
///
/// Gets the state of the quest of a group.
///
/// The player.
/// The group of the quest.
/// The quest state, if found; Otherwise, null.
public static CharacterQuestState? GetQuestState(this Player player, short group)
{
return player.SelectedCharacter?.QuestStates.FirstOrDefault(state => state.Group == group);
}
///
/// Gets the quest definition for the specified group and number depending on the players character class.
///
/// The player.
/// The group.
/// The number.
/// The quest definition for the specified group and number depending on the players character class.
public static QuestDefinition? GetQuest(this Player player, short group, short number)
{
var possibleQuestsOfGroup = player.OpenedNpc?.Definition.Quests
.Where(q => q.Group == group)
.Where(q => q.QualifiedCharacter is null || Equals(q.QualifiedCharacter, player.SelectedCharacter?.CharacterClass))
.OrderBy(q => q.Number);
return possibleQuestsOfGroup?.FirstOrDefault(q => q.StartingNumber == number || q.Number == number);
}
///
/// Gets the available quests of the currently opened NPC depending on the players character class.
///
/// The player.
/// The available quests of the currently opened NPC depending on the players character class.
public static IEnumerable GetAvailableQuestsOfOpenedNpc(this Player player)
{
return player.OpenedNpc?.Definition.Quests
.Where(q => q.QualifiedCharacter is null
|| Equals(q.QualifiedCharacter, player.SelectedCharacter?.CharacterClass))
.Where(q => q.MinimumCharacterLevel <= player.Level
&& (q.MaximumCharacterLevel == default || q.MaximumCharacterLevel >= player.Level))
?? Enumerable.Empty();
}
}