server-master/srcs/_plugins/Plugin.QuestImpl/Handlers/AddSoundFlowerQuestEventHandler.cs
2026-02-10 18:21:30 +01:00

83 lines
No EOL
3.3 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsAPI.Game.Extensions.Quests;
using WingsEmu.DTOs.Quests;
using WingsEmu.Game;
using WingsEmu.Game._enum;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Characters;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Networking;
using WingsEmu.Game.Quests;
using WingsEmu.Game.Quests.Configurations;
using WingsEmu.Game.Quests.Event;
using WingsEmu.Packets.Enums.Chat;
namespace Plugin.QuestImpl.Handlers
{
public class AddSoundFlowerQuestEventHandler : IAsyncEventProcessor<AddSoundFlowerQuestEvent>
{
private readonly IGameLanguageService _gameLanguageService;
private readonly IQuestManager _questManager;
private readonly IRandomGenerator _randomGenerator;
private readonly SoundFlowerConfiguration _soundFlowerConfiguration;
public AddSoundFlowerQuestEventHandler(IQuestManager questManager, SoundFlowerConfiguration soundFlowerConfiguration, IRandomGenerator randomGenerator,
IGameLanguageService gameLanguageService)
{
_questManager = questManager;
_soundFlowerConfiguration = soundFlowerConfiguration;
_randomGenerator = randomGenerator;
_gameLanguageService = gameLanguageService;
}
public async Task HandleAsync(AddSoundFlowerQuestEvent e, CancellationToken cancellation)
{
IClientSession session = e.Sender;
IPlayerEntity player = session.PlayerEntity;
SoundFlowerType soundFlowerType = e.SoundFlowerType;
IReadOnlyCollection<QuestDto> flowerQuests = soundFlowerType switch
{
SoundFlowerType.SOUND_FLOWER => _soundFlowerConfiguration.SoundFlowerQuestVnums.Select(s => _questManager.GetQuestById(s)).ToList(),
SoundFlowerType.WILD_SOUND_FLOWER => _soundFlowerConfiguration.WildSoundFlowerQuestVnums.Select(s => _questManager.GetQuestById(s)).ToList(),
_ => new List<QuestDto>()
};
if (!flowerQuests.Any())
{
return;
}
IReadOnlyCollection<QuestDto> possibleQuests =
flowerQuests.Where(s => s.MinLevel <= player.Level && player.Level <= s.MaxLevel && player.GetCurrentQuests().All(t => t.QuestId != s.Id)).ToList();
if (!possibleQuests.Any())
{
session.SendMsg(session.GetLanguage(GameDialogKey.QUEST_SHOUTMESSAGE_ALREADY_HAVE_QUEST), MsgMessageType.Middle);
return;
}
if (session.GetEmptyQuestSlot(QuestSlotType.GENERAL, true) == -1)
{
session.SendMsg(_gameLanguageService.GetLanguage(GameDialogKey.QUEST_SHOUTMESSAGE_SLOT_FULL, session.UserLanguage), MsgMessageType.Middle);
return;
}
QuestDto rndQuest = possibleQuests.ElementAt(_randomGenerator.RandomNumber(possibleQuests.Count));
if (rndQuest == null)
{
return;
}
if (e.SoundFlowerType == SoundFlowerType.SOUND_FLOWER)
{
session.PlayerEntity.DecreasePendingSoundFlowerQuests();
}
await e.Sender.EmitEventAsync(new AddQuestEvent(rndQuest.Id, QuestSlotType.GENERAL));
}
}
}