server-master/srcs/Plugin.RainbowBattle/EventHandlers/RainbowBattleLeaveEventHandler.cs
2026-02-10 18:21:30 +01:00

88 lines
No EOL
3.5 KiB
C#

using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsAPI.Data.Character;
using WingsAPI.Packets.Enums.Rainbow;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Networking;
using WingsEmu.Game.RainbowBattle;
using WingsEmu.Game.RainbowBattle.Event;
using WingsEmu.Packets.Enums.Chat;
namespace Plugin.RainbowBattle.EventHandlers
{
public class RainbowBattleLeaveEventHandler : IAsyncEventProcessor<RainbowBattleLeaveEvent>
{
public async Task HandleAsync(RainbowBattleLeaveEvent e, CancellationToken cancellation)
{
IClientSession session = e.Sender;
RainbowBattleParty rainbowBattleParty = session.PlayerEntity.RainbowBattleComponent.RainbowBattleParty;
if (rainbowBattleParty == null)
{
return;
}
if (e.CheckIfFinished && rainbowBattleParty.FinishTime == null)
{
return;
}
RainbowBattleTeamType team = session.PlayerEntity.RainbowBattleComponent.Team;
IReadOnlyList<IClientSession> members = team == RainbowBattleTeamType.Red ? rainbowBattleParty.RedTeam : rainbowBattleParty.BlueTeam;
switch (team)
{
case RainbowBattleTeamType.Red:
session.PlayerEntity.RainbowBattleComponent.RainbowBattleParty.RemoveRedPlayer(session);
break;
case RainbowBattleTeamType.Blue:
session.PlayerEntity.RainbowBattleComponent.RainbowBattleParty.RemoveBluePlayer(session);
break;
}
string membersPacket = rainbowBattleParty.GenerateRainbowMembers(team);
string memberList = rainbowBattleParty.GenerateRainbowBattleWidget(team);
string rainbowScore = rainbowBattleParty.GenerateRainbowScore(team);
foreach (IClientSession member in members)
{
if (e.SendMessage)
{
member.SendMsg(member.GetLanguageFormat(GameDialogKey.RAINBOW_BATTLE_MESSAGE_PLAYER_LEFT, session.PlayerEntity.Name), MsgMessageType.Middle);
member.SendChatMessage(member.GetLanguageFormat(GameDialogKey.RAINBOW_BATTLE_MESSAGE_PLAYER_LEFT, session.PlayerEntity.Name), ChatMessageColorType.Yellow);
}
member.SendPacket(membersPacket);
member.SendPacket(memberList);
member.SendPacket(rainbowScore);
}
session.SendPacket(RainbowBattleExtensions.GenerateRainbowTime(RainbowTimeType.End));
session.SendPacket(RainbowBattleExtensions.GenerateRainBowEnter(false));
session.SendPacket(RainbowBattleExtensions.GenerateRainBowExit());
if (e.AddLeaverBuster && rainbowBattleParty.FinishTime == null)
{
ProcessLeaverBuster(session);
}
session.PlayerEntity.RainbowBattleComponent.RemoveRainbowBattle();
session.ChangeToLastBaseMap();
}
private void ProcessLeaverBuster(IClientSession session)
{
session.PlayerEntity.RainbowBattleLeaverBusterDto ??= new RainbowBattleLeaverBusterDto();
RainbowBattleLeaverBusterDto leaver = session.PlayerEntity.RainbowBattleLeaverBusterDto;
if (leaver.Exits < 3) // Only 3 times per month
{
leaver.Exits++;
return;
}
leaver.RewardPenalty++;
}
}
}