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

62 lines
No EOL
1.8 KiB
C#

using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using Serilog;
using WingsEmu.Game;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Characters;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Raids.Events;
namespace Plugin.Raids.Handlers;
public class RaidTeleportMemberEventHandler : IAsyncEventProcessor<RaidTeleportMemberEvent>
{
private readonly IRandomGenerator _randomGenerator;
public RaidTeleportMemberEventHandler(IRandomGenerator randomGenerator) => _randomGenerator = randomGenerator;
public async Task HandleAsync(RaidTeleportMemberEvent e, CancellationToken cancellation)
{
short sourceX = e.SourcePosition.X;
short sourceY = e.SourcePosition.Y;
short destX = e.DestinationPosition.X;
short destY = e.DestinationPosition.Y;
byte range = e.Range;
IMapInstance mapInstance = e.MapInstance;
if (mapInstance == null)
{
Log.Debug("MapInstance for RaidMemberTeleport is null.");
return;
}
IEnumerable<IPlayerEntity> membersToTeleport = mapInstance.GetCharactersInRange(e.SourcePosition, range);
foreach (IPlayerEntity member in membersToTeleport)
{
if (member == null)
{
continue;
}
if (!member.IsAlive())
{
continue;
}
short x = (short)(destX + _randomGenerator.RandomNumber(-3, 3));
short y = (short)(destY + _randomGenerator.RandomNumber(-3, 3));
if (mapInstance.IsBlockedZone(x, y))
{
x = destX;
y = destY;
}
member.TeleportOnMap(x, y, true);
}
}
}