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

137 lines
No EOL
4.5 KiB
C#

using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Characters;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Networking;
using WingsEmu.Game.Raids;
using WingsEmu.Game.Raids.Configuration;
using WingsEmu.Game.Raids.Events;
using WingsEmu.Game.Revival;
using WingsEmu.Packets.Enums.Chat;
namespace Plugin.Raids;
public class RaidPartyLeaveEventHandler : IAsyncEventProcessor<RaidPartyLeaveEvent>
{
private readonly IGameLanguageService _gameLanguage;
private readonly RaidConfiguration _raidConfiguration;
public RaidPartyLeaveEventHandler(IGameLanguageService gameLanguage, RaidConfiguration raidConfiguration)
{
_gameLanguage = gameLanguage;
_raidConfiguration = raidConfiguration;
}
public async Task HandleAsync(RaidPartyLeaveEvent e, CancellationToken cancellation)
{
IClientSession session = e.Sender;
IPlayerEntity character = session.PlayerEntity;
bool byKick = e.ByKick;
if (session?.PlayerEntity == null)
{
return;
}
if (!character.IsInRaidParty)
{
return;
}
bool isLeader = character.IsRaidLeader(character.Id);
if (!character.HasRaidStarted && isLeader)
{
await session.EmitEventAsync(new RaidPartyDisbandEvent());
return;
}
RaidParty raidParty = character.Raid;
if (raidParty == null)
{
return;
}
if (raidParty.Members == null)
{
InternalLeave(session);
return;
}
if (raidParty.Members.Count - 1 < 1)
{
await session.EmitEventAsync(new RaidPartyDisbandEvent());
return;
}
if (session.PlayerEntity.RaidDeaths >= _raidConfiguration.LivesPerCharacter && session.PlayerEntity.Raid.Instance.Lives > 0)
{
session.PlayerEntity.ShowRaidDeathInfo = true;
}
InternalLeave(session);
if (raidParty.Started)
{
if (!session.PlayerEntity.IsAlive())
{
await session.EmitEventAsync(new RevivalReviveEvent());
}
session.ChangeToLastBaseMap();
if (e.RemoveLife)
{
raidParty.Instance.IncreaseOrDecreaseLives(-1);
}
}
GameDialogKey chatMessageDialog = GameDialogKey.RAID_CHATMESSAGE_LEFT;
GameDialogKey msgDialog = GameDialogKey.RAID_SHOUTMESSAGE_LEFT;
if (byKick)
{
chatMessageDialog = GameDialogKey.RAID_CHATMESSAGE_KICKED_OTHER;
msgDialog = GameDialogKey.RAID_SHOUTMESSAGE_KICKED_OTHER;
session.SendChatMessage(_gameLanguage.GetLanguage(GameDialogKey.RAID_CHATMESSAGE_KICKED, session.UserLanguage), ChatMessageColorType.Yellow);
session.SendMsg(_gameLanguage.GetLanguage(GameDialogKey.RAID_SHOUTMESSAGE_KICKED, session.UserLanguage), MsgMessageType.Middle);
}
await session.EmitEventAsync(new RaidLeftEvent { RaidId = raidParty.Id });
foreach (IClientSession member in raidParty.Members)
{
if (raidParty.Started && isLeader)
{
member.SendChatMessage(_gameLanguage.GetLanguageFormat(GameDialogKey.RAID_CHATMESSAGE_NEW_LEADER, member.UserLanguage, raidParty.Leader.PlayerEntity.Name),
ChatMessageColorType.Yellow);
member.SendMsg(_gameLanguage.GetLanguageFormat(GameDialogKey.RAID_SHOUTMESSAGE_NEW_LEADER, member.UserLanguage, raidParty.Leader.PlayerEntity.Name), MsgMessageType.Middle);
}
else
{
member.SendChatMessage(_gameLanguage.GetLanguageFormat(chatMessageDialog, member.UserLanguage, character.Name), ChatMessageColorType.Yellow);
member.SendMsg(_gameLanguage.GetLanguageFormat(msgDialog, member.UserLanguage, character.Name), MsgMessageType.Middle);
}
member.SendRaidPacket(RaidPacketType.LIST_MEMBERS);
member.RefreshRaidMemberList();
}
}
public static void InternalLeave(IClientSession session)
{
if (session?.PlayerEntity == null)
{
return;
}
session.PlayerEntity.Raid?.RemoveMember(session);
session.PlayerEntity.SetRaidParty(null);
session.SendRaidPacket(RaidPacketType.LEAVE, true);
session.SendRaidPacket(RaidPacketType.LEADER_RELATED, true);
}
}