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

127 lines
No EOL
6.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsAPI.Packets.Enums.Rainbow;
using WingsEmu.Game._enum;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Characters;
using WingsEmu.Game.Configurations;
using WingsEmu.Game.Entities;
using WingsEmu.Game.Entities.Extensions;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Mates;
using WingsEmu.Game.Networking;
using WingsEmu.Game.RainbowBattle;
using WingsEmu.Game.RainbowBattle.Event;
using WingsEmu.Packets.Enums;
using WingsEmu.Packets.Enums.Chat;
namespace Plugin.RainbowBattle.EventHandlers
{
public class RainbowBattleFreezeEventHandler : IAsyncEventProcessor<RainbowBattleFreezeEvent>
{
private readonly RainbowBattleConfiguration _rainbowBattleConfiguration;
public RainbowBattleFreezeEventHandler(RainbowBattleConfiguration rainbowBattleConfiguration) => _rainbowBattleConfiguration = rainbowBattleConfiguration;
public async Task HandleAsync(RainbowBattleFreezeEvent e, CancellationToken cancellation)
{
IClientSession session = e.Sender;
IBattleEntity killer = e.Killer;
RainbowBattleParty rainbowParty = session.PlayerEntity.RainbowBattleComponent.RainbowBattleParty;
if (rainbowParty == null)
{
return;
}
session.PlayerEntity.RainbowBattleComponent.IsFrozen = true;
session.PlayerEntity.RainbowBattleComponent.FrozenTime = DateTime.UtcNow.AddSeconds(_rainbowBattleConfiguration.SecondsBeingFrozen);
session.SendCondPacket();
session.BroadcastEffect(EffectType.Frozen);
await session.PlayerEntity.RemoveNegativeBuffs(100);
session.PlayerEntity.Hp = session.PlayerEntity.MaxHp;
session.PlayerEntity.Mp = session.PlayerEntity.MaxMp;
session.RefreshStat();
foreach (IMateEntity mate in session.PlayerEntity.MateComponent.TeamMembers())
{
session.PlayerEntity.MapInstance.RemoveMate(mate);
session.PlayerEntity.MapInstance.Broadcast(mate.GenerateOut());
}
IReadOnlyList<IClientSession> members = session.PlayerEntity.RainbowBattleComponent.Team == RainbowBattleTeamType.Red ? rainbowParty.RedTeam : rainbowParty.BlueTeam;
foreach (IClientSession member in members)
{
member.SendMsg(member.GetLanguageFormat(GameDialogKey.RAINBOW_BATTLE_SHOUTMESSAGE_FROZEN, session.PlayerEntity.Name), MsgMessageType.Middle);
}
session.PlayerEntity.RainbowBattleComponent.Deaths++;
session.PlayerEntity.RainbowBattleComponent.ActivityPoints += _rainbowBattleConfiguration.DeathActivityPoints;
IPlayerEntity playerKiller = killer switch
{
IPlayerEntity playerEntity => playerEntity,
IMateEntity mateEntity => mateEntity.Owner,
IMonsterEntity monsterEntity => monsterEntity.SummonerType != null && monsterEntity.SummonerId != null && monsterEntity.SummonerType == VisualType.Player
? monsterEntity.MapInstance.GetCharacterById(monsterEntity.SummonerId.Value)
: null,
_ => null
};
if (playerKiller?.RainbowBattleComponent.RainbowBattleParty == null)
{
return;
}
playerKiller.RainbowBattleComponent.Kills++;
playerKiller.RainbowBattleComponent.ActivityPoints += _rainbowBattleConfiguration.KillActivityPoints;
IReadOnlyList<IClientSession> playerMembers = playerKiller.RainbowBattleComponent.Team == RainbowBattleTeamType.Red
? playerKiller.RainbowBattleComponent.RainbowBattleParty.RedTeam
: playerKiller.RainbowBattleComponent.RainbowBattleParty.BlueTeam;
string memberList = playerKiller.RainbowBattleComponent.RainbowBattleParty.GenerateRainbowBattleWidget(playerKiller.RainbowBattleComponent.Team);
foreach (IClientSession member in playerMembers)
{
member.SendPacket(memberList);
}
await session.EmitEventAsync(new RainbowBattleFrozenEvent
{
Id = playerKiller.RainbowBattleComponent.RainbowBattleParty.Id,
Killer = new RainbowBattlePlayerDump
{
CharacterId = playerKiller.Id,
Level = playerKiller.Level,
Class = playerKiller.Class,
Specialist = playerKiller.Specialist,
TotalFireResistance = playerKiller.FireResistance,
TotalWaterResistance = playerKiller.WaterResistance,
TotalLightResistance = playerKiller.LightResistance,
TotalDarkResistance = playerKiller.DarkResistance,
FairyLevel = playerKiller.Fairy?.ElementRate + playerKiller.Fairy?.GameItem.ElementRate,
Score = playerKiller.RainbowBattleComponent.ActivityPoints,
Team = playerKiller.RainbowBattleComponent.Team.ToString()
},
Killed = new RainbowBattlePlayerDump
{
CharacterId = session.PlayerEntity.Id,
Level = session.PlayerEntity.Level,
Class = session.PlayerEntity.Class,
Specialist = session.PlayerEntity.Specialist,
TotalFireResistance = session.PlayerEntity.FireResistance,
TotalWaterResistance = session.PlayerEntity.WaterResistance,
TotalLightResistance = session.PlayerEntity.LightResistance,
TotalDarkResistance = session.PlayerEntity.DarkResistance,
FairyLevel = session.PlayerEntity.Fairy?.ElementRate + session.PlayerEntity.Fairy?.GameItem.ElementRate,
Score = session.PlayerEntity.RainbowBattleComponent.ActivityPoints,
Team = session.PlayerEntity.RainbowBattleComponent.Team.ToString()
}
});
}
}
}