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

69 lines
No EOL
2.4 KiB
C#

using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsAPI.Game.Extensions.Groups;
using WingsEmu.Game._i18n;
using WingsEmu.Game._ItemUsage.Configuration;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Characters;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Revival;
namespace WingsEmu.Plugins.BasicImplementations.Revival;
public class RevivalEventNormalHandler : IAsyncEventProcessor<RevivalReviveEvent>
{
private readonly IGameLanguageService _gameLanguageService;
private readonly ISpPartnerConfiguration _spPartnerConfiguration;
public RevivalEventNormalHandler(IGameLanguageService gameLanguageService, ISpPartnerConfiguration spPartnerConfiguration)
{
_gameLanguageService = gameLanguageService;
_spPartnerConfiguration = spPartnerConfiguration;
}
public async Task HandleAsync(RevivalReviveEvent e, CancellationToken cancellation)
{
if (e.Sender.PlayerEntity == null)
{
return;
}
IPlayerEntity character = e.Sender.PlayerEntity;
if (character.IsAlive() || character.MapInstance == null ||
character.MapInstance.MapInstanceType != MapInstanceType.NormalInstance
&& e.Sender.PlayerEntity.MapInstance.MapInstanceType != MapInstanceType.EventGameInstance
&& character.MapInstance.MapInstanceType != MapInstanceType.Miniland)
{
return;
}
await BaseRevive(e);
}
public async Task BaseRevive(RevivalReviveEvent e)
{
IPlayerEntity character = e.Sender.PlayerEntity;
await character.Restore(restoreMates: false);
if (character.MapInstance.MapInstanceType != MapInstanceType.Miniland && e.RevivalType == RevivalType.DontPayRevival && e.Forced != ForcedType.HolyRevival)
{
await e.Sender.Respawn();
}
if (e.Forced == ForcedType.HolyRevival)
{
e.Sender.PlayerEntity.Hp = e.Sender.PlayerEntity.MaxHp;
e.Sender.PlayerEntity.Mp = e.Sender.PlayerEntity.MaxMp;
e.Sender.RefreshStat();
}
e.Sender.BroadcastRevive();
e.Sender.UpdateVisibility();
e.Sender.BroadcastInTeamMembers(_gameLanguageService, _spPartnerConfiguration);
e.Sender.RefreshParty(_spPartnerConfiguration);
await e.Sender.CheckPartnerBuff();
e.Sender.SendBuffsPacket();
}
}