server-master/srcs/_plugins/Plugin.Act4/Event/Act4DungeonEnterEventHandler.cs
2026-02-10 18:21:30 +01:00

92 lines
No EOL
3.3 KiB
C#

using System;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using PhoenixLib.Logging;
using Plugin.Act4.Extension;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Act4;
using WingsEmu.Game.Act4.Configuration;
using WingsEmu.Game.Act4.Event;
using WingsEmu.Game.Extensions;
namespace Plugin.Act4.Event;
public class Act4DungeonSystemException : Exception
{
public Act4DungeonSystemException(string message) : base(message)
{
}
}
public class Act4DungeonEnterEventHandler : IAsyncEventProcessor<Act4DungeonEnterEvent>
{
private readonly Act4DungeonsConfiguration _act4DungeonsConfiguration;
private readonly IDungeonFactory _dungeonFactory;
private readonly IAct4DungeonManager _dungeonManager;
private readonly IGameLanguageService _languageService;
public Act4DungeonEnterEventHandler(IAct4DungeonManager dungeonManager, IGameLanguageService languageService, Act4DungeonsConfiguration act4DungeonsConfiguration, IDungeonFactory dungeonFactory)
{
_dungeonManager = dungeonManager;
_languageService = languageService;
_act4DungeonsConfiguration = act4DungeonsConfiguration;
_dungeonFactory = dungeonFactory;
}
public async Task HandleAsync(Act4DungeonEnterEvent e, CancellationToken cancellation)
{
if (!_dungeonManager.DungeonsActive)
{
return;
}
if (e.Sender.PlayerEntity.Faction != _dungeonManager.AllowedFaction)
{
e.Sender.SendInformationChatMessage(_languageService.GetLanguage(GameDialogKey.PORTAL_CHATMESSAGE_BLOCKED, e.Sender.UserLanguage));
return;
}
if (!e.Sender.PlayerEntity.IsInFamily())
{
e.Sender.SendInformationChatMessage(_languageService.GetLanguage(GameDialogKey.ACT4_DUNGEON_CHATMESSAGE_FAMILY_NEEDED, e.Sender.UserLanguage));
return;
}
long familyId = e.Sender.PlayerEntity.Family.Id;
int reputationCost = e.Sender.GetDungeonReputationRequirement(_act4DungeonsConfiguration.DungeonEntryCostMultiplier);
if (!e.Confirmed)
{
e.Sender.SendQnaPacket("preq 1", _languageService.GetLanguageFormat(GameDialogKey.ACT4_DUNGEON_QNAMESSAGE_ENTRY_COST, e.Sender.UserLanguage, reputationCost));
return;
}
if (!e.Sender.PlayerEntity.RemoveReputation(reputationCost))
{
e.Sender.SendInformationChatMessage(_languageService.GetLanguage(GameDialogKey.INFORMATION_CHATMESSAGE_NOT_ENOUGH_REPUT, e.Sender.UserLanguage));
return;
}
DungeonInstance dungeon = _dungeonManager.GetDungeon(familyId);
if (dungeon == null)
{
dungeon = _dungeonFactory.CreateDungeon(familyId, _dungeonManager.DungeonType);
if (dungeon != null)
{
_dungeonManager.RegisterDungeon(dungeon);
}
}
if (dungeon == null)
{
Log.Error($"[ACT4_DUNGEON_ENTER] Wasn't able to generate a new Dungeon for the Family with FamilyId: '{familyId.ToString()}'",
new Act4DungeonSystemException($"FamilyId: {familyId} Dungeon Faction: {_dungeonManager.AllowedFaction} Dungeon Type: {_dungeonManager.DungeonType}"));
return;
}
e.Sender.ChangeMap(dungeon.SpawnInstance.MapInstance, dungeon.SpawnPoint.X, dungeon.SpawnPoint.Y);
}
}