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

137 lines
No EOL
6 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using Plugin.RainbowBattle.Managers;
using WingsAPI.Packets.Enums.Rainbow;
using WingsEmu.Game;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Characters.Events;
using WingsEmu.Game.Configurations;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Networking;
using WingsEmu.Game.RainbowBattle;
using WingsEmu.Game.RainbowBattle.Event;
using WingsEmu.Game.Skills;
using WingsEmu.Packets.Enums.Chat;
namespace Plugin.RainbowBattle.EventHandlers
{
public class RainbowBattleStartEventHandler : IAsyncEventProcessor<RainbowBattleStartEvent>
{
private readonly RainbowBattleConfiguration _rainbowBattleConfiguration;
private readonly IRainbowBattleManager _rainbowBattleManager;
private readonly IRainbowFactory _rainbowFactory;
private readonly IRandomGenerator _randomGenerator;
public RainbowBattleStartEventHandler(IRainbowFactory rainbowFactory, IRainbowBattleManager rainbowBattleManager,
RainbowBattleConfiguration rainbowBattleConfiguration, IRandomGenerator randomGenerator)
{
_rainbowFactory = rainbowFactory;
_rainbowBattleManager = rainbowBattleManager;
_rainbowBattleConfiguration = rainbowBattleConfiguration;
_randomGenerator = randomGenerator;
}
public async Task HandleAsync(RainbowBattleStartEvent e, CancellationToken cancellation)
{
RainbowBattleParty rainbowBattleParty = await _rainbowFactory.CreateRainbowBattle(e.RedTeam, e.BlueTeam);
if (rainbowBattleParty == null)
{
return;
}
if (!_rainbowBattleManager.IsActive)
{
_rainbowBattleManager.IsActive = true;
}
_rainbowBattleManager.AddRainbowBattle(rainbowBattleParty);
await HandleStart(rainbowBattleParty, RainbowBattleTeamType.Red);
await HandleStart(rainbowBattleParty, RainbowBattleTeamType.Blue);
}
private async Task HandleStart(RainbowBattleParty rainbowBattleParty, RainbowBattleTeamType teamType)
{
string score = rainbowBattleParty.GenerateRainbowScore(teamType);
string timeEnter = RainbowBattleExtensions.GenerateRainbowTime(RainbowTimeType.Enter);
string timeStart = RainbowBattleExtensions.GenerateRainbowTime(RainbowTimeType.Start, (short?)(rainbowBattleParty.EndTime - DateTime.UtcNow).TotalSeconds);
string rainbowEnter = RainbowBattleExtensions.GenerateRainBowEnter(true);
string membersPacket = rainbowBattleParty.GenerateRainbowMembers(teamType);
string memberList = rainbowBattleParty.GenerateRainbowBattleWidget(teamType);
IReadOnlyList<IClientSession> members = teamType == RainbowBattleTeamType.Red ? rainbowBattleParty.RedTeam : rainbowBattleParty.BlueTeam;
IMapInstance mapInstance = rainbowBattleParty.MapInstance;
GameDialogKey gameDialogKey = teamType == RainbowBattleTeamType.Red ? GameDialogKey.RAINBOW_BATTLE_SHOUTMESSAGE_RED_TEAM : GameDialogKey.RAINBOW_BATTLE_SHOUTMESSAGE_BLUE_TEAM;
foreach (IClientSession member in members)
{
member.PlayerEntity.RainbowBattleComponent.SetRainbowBattle(rainbowBattleParty, teamType);
member.PlayerEntity.Hp = member.PlayerEntity.MaxHp;
member.PlayerEntity.Mp = member.PlayerEntity.MaxMp;
await member.PlayerEntity.RemovePositiveBuffs(100);
await member.PlayerEntity.RemoveNegativeBuffs(100);
await member.EmitEventAsync(new RemoveVehicleEvent());
member.PlayerEntity.ClearSkillCooldowns();
foreach (IBattleEntitySkill skill in member.PlayerEntity.Skills)
{
skill.LastUse = DateTime.MinValue;
member.SendSkillCooldownReset(skill.Skill.CastId);
}
short randomX;
short randomY;
switch (teamType)
{
case RainbowBattleTeamType.Red:
randomX = (short)_randomGenerator.RandomNumber(_rainbowBattleConfiguration.RedStartX, _rainbowBattleConfiguration.RedEndX + 1);
randomY = (short)_randomGenerator.RandomNumber(_rainbowBattleConfiguration.RedStartY, _rainbowBattleConfiguration.RedEndY + 1);
if (mapInstance.IsBlockedZone(randomX, randomY))
{
randomX = 0;
randomY = 34;
}
break;
case RainbowBattleTeamType.Blue:
randomX = (short)_randomGenerator.RandomNumber(_rainbowBattleConfiguration.BlueStartX, _rainbowBattleConfiguration.BlueEndX + 1);
randomY = (short)_randomGenerator.RandomNumber(_rainbowBattleConfiguration.BlueStartY, _rainbowBattleConfiguration.BlueEndY + 1);
if (mapInstance.IsBlockedZone(randomX, randomY))
{
randomX = 117;
randomY = 42;
}
break;
default:
member.PlayerEntity.RainbowBattleComponent.RemoveRainbowBattle();
continue;
}
member.ChangeMap(mapInstance, randomX, randomY);
member.SendPacket(score);
member.SendPacket(timeEnter);
member.SendPacket(timeStart);
member.SendPacket(membersPacket);
member.SendPacket(rainbowEnter);
member.SendPacket(memberList);
member.BroadcastRainbowTeamType();
member.SendMsg(member.GetLanguage(gameDialogKey), MsgMessageType.Middle);
await member.EmitEventAsync(new RainbowBattleJoinEvent());
}
}
}
}