Files
AdamuSw/src/GameLogic/PlugIns/QuestMonsterKillCountPlugIn.cs
2026-07-14 19:00:35 +03:00

83 lines
3.4 KiB
C#

// <copyright file="QuestMonsterKillCountPlugIn.cs" company="MUnique">
// Licensed under the MIT License. See LICENSE file in the project root for full license information.
// </copyright>
namespace MUnique.OpenMU.GameLogic.PlugIns;
using System.ComponentModel.DataAnnotations;
using System.Runtime.InteropServices;
using MUnique.OpenMU.GameLogic.NPC;
using MUnique.OpenMU.PlugIns;
/// <summary>
/// This plugin increases the monster kill count of the quest state of active quests.
/// </summary>
[PlugIn]
[Display(Name = nameof(PlugInResources.QuestMonsterKillCountPlugIn_Name), Description = nameof(PlugInResources.QuestMonsterKillCountPlugIn_Description), ResourceType = typeof(PlugInResources))]
[Guid("416C2231-D7FE-414A-9321-26622E262EF5")]
public class QuestMonsterKillCountPlugIn : IAttackableGotKilledPlugIn, ISupportCustomConfiguration<QuestMonsterKillCountPlugInConfiguration>, ISupportDefaultCustomConfiguration
{
/// <inheritdoc/>
public QuestMonsterKillCountPlugInConfiguration? Configuration { get; set; }
/// <summary>
/// Is called when an <see cref="IAttackable" /> object got killed by another.
/// </summary>
/// <param name="killed">The killed <see cref="IAttackable" />.</param>
/// <param name="killer">The killer.</param>
public async ValueTask AttackableGotKilledAsync(IAttackable killed, IAttacker? killer)
{
var configuration = this.Configuration ??= CreateDefaultConfiguration();
if (!(killer is Player player && killed is Monster monster)
|| player.SelectedCharacter?.QuestStates is null)
{
return;
}
foreach (var questState in player.SelectedCharacter.QuestStates)
{
if (questState.ActiveQuest is null)
{
continue;
}
foreach (var killRequirement in questState.ActiveQuest.RequiredMonsterKills.Where(r => object.Equals(r.Monster, monster.Definition)))
{
if (questState.RequirementStates.FirstOrDefault(s => object.Equals(s.Requirement, killRequirement))
is not { } requirementState)
{
requirementState = player.PersistenceContext.CreateNew<QuestMonsterKillRequirementState>();
requirementState.Requirement = killRequirement;
questState.RequirementStates.Add(requirementState);
}
requirementState!.KillCount++;
if (killRequirement.MinimumNumber >= requirementState!.KillCount
&& configuration.Message.GetTranslation(player.Culture) is { Length: > 0 } translation)
{
var message = string.Format(
translation,
questState.ActiveQuest.Name.GetTranslation(player.Culture),
monster.Definition.Designation.GetTranslation(player.Culture),
requirementState.KillCount,
killRequirement.MinimumNumber);
await player.ShowBlueMessageAsync(message).ConfigureAwait(false);
}
}
}
}
/// <inheritdoc/>
public object CreateDefaultConfig()
{
return CreateDefaultConfiguration();
}
private static QuestMonsterKillCountPlugInConfiguration CreateDefaultConfiguration()
{
return new QuestMonsterKillCountPlugInConfiguration();
}
}