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

89 lines
No EOL
3.3 KiB
C#

using System;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsAPI.Game.Extensions.Families;
using WingsAPI.Game.Extensions.Groups;
using WingsEmu.Game._i18n;
using WingsEmu.Game._ItemUsage.Configuration;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Configurations;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Extensions.Mates;
using WingsEmu.Game.Managers;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Mates;
using WingsEmu.Game.Mates.Events;
using WingsEmu.Game.Networking;
using WingsEmu.Game.Networking.Broadcasting;
using WingsEmu.Game.RainbowBattle;
using WingsEmu.Game.Revival;
using WingsEmu.Plugins.BasicImplementations.Revival;
namespace WingsEmu.Plugins.BasicImplementations.Event.Mates;
public class MateReviveEventHandler : IAsyncEventProcessor<MateReviveEvent>
{
private readonly RevivalEventBaseHandler _eventBaseHandler;
private readonly IGameLanguageService _gameLanguage;
private readonly IGameLanguageService _language;
private readonly IRankingManager _rankingManager;
private readonly IReputationConfiguration _reputationConfiguration;
private readonly ISpPartnerConfiguration _spPartner;
public MateReviveEventHandler(ISpPartnerConfiguration spPartner, IGameLanguageService language,
RevivalEventBaseHandler eventBaseHandler, IRankingManager rankingManager, IReputationConfiguration reputationConfiguration, IGameLanguageService gameLanguage)
{
_spPartner = spPartner;
_language = language;
_eventBaseHandler = eventBaseHandler;
_rankingManager = rankingManager;
_reputationConfiguration = reputationConfiguration;
_gameLanguage = gameLanguage;
}
public async Task HandleAsync(MateReviveEvent e, CancellationToken cancellation)
{
IClientSession session = e.Sender;
IMateEntity mateEntity = e.MateEntity;
if (mateEntity.IsAlive())
{
return;
}
if (!BasicUnregisteringForMates(mateEntity, e.Delayed, e.ExpectedGuid))
{
return;
}
mateEntity.Hp = mateEntity.MaxHp / 2;
mateEntity.Mp = mateEntity.MaxMp / 2;
session.SendMateLife(mateEntity);
if (session.PlayerEntity.IsOnVehicle)
{
return;
}
// yes, twice
session.CurrentMapInstance.Broadcast(x => mateEntity.GenerateOut());
session.CurrentMapInstance.Broadcast(x => mateEntity.GenerateOut());
mateEntity.TeleportNearCharacter();
if (mateEntity.MapInstance.MapInstanceType == MapInstanceType.RainbowBattle)
{
session.BroadcastIn(_reputationConfiguration, _rankingManager.TopReputation, new ExceptSessionBroadcast(session));
session.BroadcastGidx(session.PlayerEntity.Family, _gameLanguage);
session.BroadcastRainbowTeamType();
}
session.CurrentMapInstance.Broadcast(s => mateEntity.GenerateIn(_language, s.UserLanguage, _spPartner));
session.SendCondMate(mateEntity);
session.RefreshParty(_spPartner);
}
public bool BasicUnregisteringForMates(IMateEntity mateEntity, bool delayed, Guid expectedGuid)
=> mateEntity.Owner.Session.IsConnected && _eventBaseHandler.BasicUnregistering(mateEntity.Id, delayed ? ForcedType.Forced : ForcedType.NoForced, expectedGuid);
}