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

81 lines
No EOL
2.6 KiB
C#

using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using PhoenixLib.Logging;
using WingsEmu.Game;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Networking;
using WingsEmu.Game.TimeSpaces;
using WingsEmu.Game.TimeSpaces.Events;
namespace Plugin.TimeSpaces.Handlers;
public class TimeSpaceStartPortalEventHandler : IAsyncEventProcessor<TimeSpaceStartPortalEvent>
{
private readonly IAsyncEventPipeline _eventPipeline;
private readonly ITimeSpaceManager _timeSpaceManager;
public TimeSpaceStartPortalEventHandler(IAsyncEventPipeline eventPipeline, ITimeSpaceManager timeSpaceManager)
{
_eventPipeline = eventPipeline;
_timeSpaceManager = timeSpaceManager;
}
public async Task HandleAsync(TimeSpaceStartPortalEvent e, CancellationToken cancellation)
{
IClientSession session = e.Sender;
if (!session.HasCurrentMapInstance || session.CurrentMapInstance.MapInstanceType != MapInstanceType.TimeSpaceInstance)
{
return;
}
IPortalEntity portal = session.CurrentMapInstance.Portals.FirstOrDefault(s =>
session.PlayerEntity.PositionY >= s.PositionY - 1 &&
session.PlayerEntity.PositionY <= s.PositionY + 1 &&
session.PlayerEntity.PositionX >= s.PositionX - 1 &&
session.PlayerEntity.PositionX <= s.PositionX + 1);
if (portal == null)
{
Log.Debug("Portal not found");
return;
}
if (portal.DestinationMapInstance == null)
{
return;
}
if (!session.PlayerEntity.TimeSpaceComponent.IsInTimeSpaceParty)
{
return;
}
TimeSpaceParty timeSpace = session.PlayerEntity.TimeSpaceComponent.TimeSpace;
if (timeSpace == null)
{
return;
}
if (timeSpace.Leader?.PlayerEntity.Id != session.PlayerEntity.Id)
{
return;
}
session.PlayerEntity.LastPortal = DateTime.UtcNow;
if (!timeSpace.Started)
{
timeSpace.StartTimeSpace();
await _eventPipeline.ProcessEventAsync(new TimeSpaceStartClockEvent(session.PlayerEntity.TimeSpaceComponent.TimeSpace, true));
session.SendPacket(session.CurrentMapInstance.GenerateRsfn(isVisit: true));
}
// This is how a normal TS portal should work. Anyways, it can be modified to add portals that TP on the same map, etc...
session.ChangeMap(portal.DestinationMapInstance, portal.DestinationX, portal.DestinationY);
}
}