server-master/srcs/_plugins/WingsEmu.Plugins.BasicImplementation/Entities/MapJoinMonsterEntityEventHandler.cs
2026-02-10 18:21:30 +01:00

76 lines
No EOL
2.5 KiB
C#

using System;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsEmu.Game;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Entities;
using WingsEmu.Game.Entities.Event;
using WingsEmu.Game.Entities.Extensions;
using WingsEmu.Game.Helpers.Damages;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Monster.Event;
namespace WingsEmu.Plugins.BasicImplementations.Entities;
public class MapJoinMonsterEntityEventHandler : IAsyncEventProcessor<MapJoinMonsterEntityEvent>
{
private readonly IAsyncEventPipeline _asyncEventPipeline;
private readonly IRandomGenerator _randomGenerator;
public MapJoinMonsterEntityEventHandler(IRandomGenerator randomGenerator, IAsyncEventPipeline asyncEventPipeline)
{
_randomGenerator = randomGenerator;
_asyncEventPipeline = asyncEventPipeline;
}
public async Task HandleAsync(MapJoinMonsterEntityEvent e, CancellationToken cancellation)
{
IMonsterEntity monsterEntity = e.MonsterEntity;
short x = e.MapX ?? monsterEntity.PositionX;
short y = e.MapY ?? monsterEntity.PositionY;
if (monsterEntity.MapInstance.IsBlockedZone(x, y))
{
Position randomPosition = monsterEntity.MapInstance.GetRandomPosition();
x = randomPosition.X;
y = randomPosition.Y;
}
monsterEntity.ChangePosition(new Position(x, y));
monsterEntity.FirstX = x;
monsterEntity.FirstY = y;
monsterEntity.NextTick = DateTime.UtcNow;
monsterEntity.NextAttackReady = DateTime.UtcNow;
monsterEntity.OnFirstDamageReceive = true;
monsterEntity.NextTick += TimeSpan.FromMilliseconds(_randomGenerator.RandomNumber(1000));
monsterEntity.MapInstance.AddMonster(monsterEntity);
monsterEntity.ModeDeathsSinceRespawn = monsterEntity.MapInstance.MonsterDeathsOnMap();
if (monsterEntity.ModeIsHpTriggered)
{
monsterEntity.ModeIsActive = false;
}
else
{
monsterEntity.MapInstance.ActivateMode(monsterEntity);
}
if (!monsterEntity.IsStillAlive || !monsterEntity.IsAlive())
{
monsterEntity.IsStillAlive = true;
monsterEntity.Hp = monsterEntity.MaxHp;
monsterEntity.Mp = monsterEntity.MaxMp;
}
monsterEntity.MapInstance.Broadcast(monsterEntity.GenerateIn(e.ShowEffect));
await _asyncEventPipeline.ProcessEventAsync(new MonsterRespawnedEvent
{
Monster = monsterEntity
});
}
}