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

80 lines
No EOL
2.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsEmu.DTOs.Maps;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Act4.Configuration;
using WingsEmu.Game.Act4.Event;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Maps.Event;
using WingsEmu.Packets.Enums;
namespace Plugin.Act4.Event;
public class PortalTriggerAct4EventHandler : IAsyncEventProcessor<PortalTriggerEvent>
{
private readonly Act4Configuration _act4Configuration;
private readonly IGameLanguageService _languageService;
private readonly IMapManager _mapManager;
public PortalTriggerAct4EventHandler(Act4Configuration act4Configuration, IGameLanguageService languageService, IMapManager mapManager)
{
_act4Configuration = act4Configuration;
_languageService = languageService;
_mapManager = mapManager;
}
public async Task HandleAsync(PortalTriggerEvent e, CancellationToken cancellation)
{
if (!e.Sender.CurrentMapInstance.HasMapFlag(MapFlags.ACT_4))
{
return;
}
if (e.Sender.CurrentMapInstance.MapInstanceType == MapInstanceType.TimeSpaceInstance)
{
return;
}
List<int> bannedMapIds = e.Sender.PlayerEntity.Faction == FactionType.Angel ? _act4Configuration.BannedMapIdsToAngels : _act4Configuration.BannedMapIdsToDemons;
if (e.Portal.DestinationMapInstance != null && bannedMapIds.Contains(e.Portal.DestinationMapInstance.MapId))
{
e.Sender.SendInformationChatMessage(_languageService.GetLanguage(GameDialogKey.PORTAL_CHATMESSAGE_BLOCKED, e.Sender.UserLanguage));
return;
}
e.Sender.PlayerEntity.LastPortal = DateTime.UtcNow;
if (e.Portal.Type == PortalType.AngelRaid || e.Portal.Type == PortalType.DemonRaid)
{
await e.Sender.EmitEventAsync(new Act4DungeonEnterEvent
{
Confirmed = e.Confirmed
});
return;
}
if (e.Portal.DestinationMapInstance == null)
{
return;
}
//TP Logic
if (e.Portal.DestinationX == -1 && e.Portal.DestinationY == -1)
{
await _mapManager.TeleportOnRandomPlaceInMapAsync(e.Sender, e.Portal.DestinationMapInstance);
return;
}
if (e.Portal.DestinationMapInstance.Id == e.Sender.PlayerEntity.MapInstanceId && e.Portal.DestinationX.HasValue && e.Portal.DestinationY.HasValue)
{
e.Sender.PlayerEntity.TeleportOnMap(e.Portal.DestinationX.Value, e.Portal.DestinationY.Value, true);
return;
}
e.Sender.ChangeMap(e.Portal.DestinationMapInstance, e.Portal.DestinationX, e.Portal.DestinationY);
}
}