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

167 lines
No EOL
6.9 KiB
C#

using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsAPI.Game.Extensions.Families;
using WingsAPI.Game.Extensions.Groups;
using WingsAPI.Packets.Enums.Rainbow;
using WingsEmu.Game;
using WingsEmu.Game._enum;
using WingsEmu.Game._i18n;
using WingsEmu.Game._ItemUsage.Configuration;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Buffs;
using WingsEmu.Game.Characters;
using WingsEmu.Game.Configurations;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Helpers.Damages;
using WingsEmu.Game.Managers;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Mates;
using WingsEmu.Game.Networking;
using WingsEmu.Game.Networking.Broadcasting;
using WingsEmu.Game.RainbowBattle;
using WingsEmu.Game.RainbowBattle.Event;
using WingsEmu.Packets.Enums.Chat;
namespace Plugin.RainbowBattle.EventHandlers
{
public class RainbowBattleUnfreezeEventHandler : IAsyncEventProcessor<RainbowBattleUnfreezeEvent>
{
private readonly IBuffFactory _buffFactory;
private readonly IGameLanguageService _gameLanguageService;
private readonly RainbowBattleConfiguration _rainbowBattleConfiguration;
private readonly IRandomGenerator _randomGenerator;
private readonly IRankingManager _rankingManager;
private readonly IReputationConfiguration _reputationConfiguration;
private readonly ISpPartnerConfiguration _spPartner;
public RainbowBattleUnfreezeEventHandler(IGameLanguageService gameLanguageService, ISpPartnerConfiguration spPartner, RainbowBattleConfiguration rainbowBattleConfiguration,
IRandomGenerator randomGenerator, IBuffFactory buffFactory, IReputationConfiguration reputationConfiguration, IRankingManager rankingManager)
{
_gameLanguageService = gameLanguageService;
_spPartner = spPartner;
_rainbowBattleConfiguration = rainbowBattleConfiguration;
_randomGenerator = randomGenerator;
_buffFactory = buffFactory;
_reputationConfiguration = reputationConfiguration;
_rankingManager = rankingManager;
}
public async Task HandleAsync(RainbowBattleUnfreezeEvent e, CancellationToken cancellation)
{
IClientSession session = e.Sender;
IPlayerEntity target = e.Unfreezer;
RainbowBattleParty rainbowBattleParty = session.PlayerEntity.RainbowBattleComponent.RainbowBattleParty;
IMapInstance mapInstance = rainbowBattleParty?.MapInstance;
if (rainbowBattleParty == null || mapInstance == null)
{
return;
}
if (!session.PlayerEntity.RainbowBattleComponent.IsFrozen)
{
return;
}
if (target != null)
{
if (!target.RainbowBattleComponent.IsInRainbowBattle)
{
return;
}
if (target.RainbowBattleComponent.Team != session.PlayerEntity.RainbowBattleComponent.Team)
{
return;
}
if (target.RainbowBattleComponent.IsFrozen)
{
return;
}
if (target.Position.GetDistance(session.PlayerEntity.Position) > 5)
{
return;
}
}
session.PlayerEntity.Hp = session.PlayerEntity.MaxHp;
session.PlayerEntity.Mp = session.PlayerEntity.MaxMp;
session.PlayerEntity.RainbowBattleComponent.IsFrozen = false;
session.PlayerEntity.RainbowBattleComponent.FrozenTime = null;
await session.PlayerEntity.RemoveNegativeBuffs(100);
session.SendCondPacket();
session.RefreshStat();
foreach (IMateEntity mate in session.PlayerEntity.MateComponent.TeamMembers())
{
session.PlayerEntity.MapInstance.AddMate(mate);
}
if ((session.PlayerEntity.RainbowBattleComponent.Deaths % 3) == 0)
{
Buff angry = _buffFactory.CreateBuff((short)BuffVnums.ANGRY, session.PlayerEntity);
await session.PlayerEntity.AddBuffAsync(angry);
}
session.BroadcastIn(_reputationConfiguration, _rankingManager.TopReputation, new ExceptSessionBroadcast(session));
session.BroadcastGidx(session.PlayerEntity.Family, _gameLanguageService);
session.BroadcastRainbowTeamType();
session.BroadcastInTeamMembers(_gameLanguageService, _spPartner);
session.RefreshParty(_spPartner);
if (target != null)
{
IReadOnlyList<IClientSession> members = session.PlayerEntity.RainbowBattleComponent.Team == RainbowBattleTeamType.Red ? rainbowBattleParty.RedTeam : rainbowBattleParty.BlueTeam;
foreach (IClientSession member in members)
{
member.SendMsg(member.GetLanguageFormat(GameDialogKey.RAINBOW_BATTLE_SHOUTMESSAGE_UNFROZEN, session.PlayerEntity.Name), MsgMessageType.Middle);
}
target.RainbowBattleComponent.ActivityPoints += _rainbowBattleConfiguration.UnfreezeActivityPoints;
return;
}
// It's by time so move frozen player to start position / main flag
Buff buff = _buffFactory.CreateBuff((short)BuffVnums.INVICIBLE_IN_PVP, session.PlayerEntity, BuffFlag.NORMAL);
await session.PlayerEntity.AddBuffAsync(buff);
switch (session.PlayerEntity.RainbowBattleComponent.Team)
{
case RainbowBattleTeamType.Red:
short randomX = (short)_randomGenerator.RandomNumber(_rainbowBattleConfiguration.RedStartX, _rainbowBattleConfiguration.RedEndX + 1);
short randomY = (short)_randomGenerator.RandomNumber(_rainbowBattleConfiguration.RedStartY, _rainbowBattleConfiguration.RedEndY + 1);
if (mapInstance.IsBlockedZone(randomX, randomY))
{
randomX = 0;
randomY = 34;
}
session.PlayerEntity.TeleportOnMap(randomX, randomY, true);
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;
}
session.PlayerEntity.TeleportOnMap(randomX, randomY, true);
break;
}
}
}
}