79 lines
No EOL
2.5 KiB
C#
79 lines
No EOL
2.5 KiB
C#
using System;
|
|
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.Configurations;
|
|
using WingsEmu.Game.Extensions;
|
|
using WingsEmu.Game.Maps;
|
|
using WingsEmu.Game.Networking;
|
|
using WingsEmu.Game.Revival;
|
|
|
|
namespace WingsEmu.Plugins.BasicImplementations.Revival;
|
|
|
|
public class RevivalEventArenaHandler : IAsyncEventProcessor<RevivalReviveEvent>
|
|
{
|
|
private readonly IGameLanguageService _gameLanguage;
|
|
private readonly PlayerRevivalPenalization _revivalPenalization;
|
|
private readonly ISpPartnerConfiguration _spPartnerConfiguration;
|
|
|
|
public RevivalEventArenaHandler(GameRevivalConfiguration revivalConfiguration, IGameLanguageService gameLanguage, ISpPartnerConfiguration spPartnerConfiguration)
|
|
{
|
|
_gameLanguage = gameLanguage;
|
|
_spPartnerConfiguration = spPartnerConfiguration;
|
|
_revivalPenalization = revivalConfiguration.PlayerRevivalConfiguration.PlayerRevivalPenalization;
|
|
}
|
|
|
|
public async Task HandleAsync(RevivalReviveEvent e, CancellationToken cancellation)
|
|
{
|
|
IClientSession sender = e.Sender;
|
|
IPlayerEntity character = e.Sender.PlayerEntity;
|
|
|
|
if (!sender.HasCurrentMapInstance)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (character.IsAlive() || character.MapInstance.MapInstanceType != MapInstanceType.ArenaInstance)
|
|
{
|
|
return;
|
|
}
|
|
|
|
character.Hp = 1;
|
|
character.Mp = 1;
|
|
|
|
bool hasPaidPenalization = false;
|
|
if (e.RevivalType == RevivalType.TryPayArenaRevival && e.Forced != ForcedType.HolyRevival)
|
|
{
|
|
hasPaidPenalization = character.RemoveGold(_revivalPenalization.ArenaGoldPenalization);
|
|
}
|
|
|
|
if (e.Forced == ForcedType.HolyRevival)
|
|
{
|
|
hasPaidPenalization = true;
|
|
}
|
|
|
|
if (hasPaidPenalization)
|
|
{
|
|
await character.Restore(restoreMates: false);
|
|
sender.RefreshStat();
|
|
sender.BroadcastTeleportPacket();
|
|
sender.BroadcastInTeamMembers(_gameLanguage, _spPartnerConfiguration);
|
|
sender.RefreshParty(_spPartnerConfiguration);
|
|
}
|
|
else
|
|
{
|
|
await sender.Respawn();
|
|
}
|
|
|
|
sender.BroadcastRevive();
|
|
sender.UpdateVisibility();
|
|
await sender.CheckPartnerBuff();
|
|
e.Sender.SendBuffsPacket();
|
|
sender.PlayerEntity.ArenaImmunity = DateTime.UtcNow;
|
|
}
|
|
} |