server-master/srcs/WingsAPI.Game/RainbowBattle/RainbowBattleExtensions.cs
2026-02-10 18:21:30 +01:00

157 lines
No EOL
5.9 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using WingsAPI.Packets.Enums.Rainbow;
using WingsEmu.DTOs.Maps;
using WingsEmu.Game.Entities;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Networking;
namespace WingsEmu.Game.RainbowBattle;
public static class RainbowBattleExtensions
{
public static string GenerateRainbowMembers(this RainbowBattleParty rainbowBattle, RainbowBattleTeamType team)
{
var packet = new StringBuilder("fbt 0 ");
IReadOnlyList<IClientSession> members = team == RainbowBattleTeamType.Red ? rainbowBattle.RedTeam : rainbowBattle.BlueTeam;
foreach (IClientSession member in members)
{
packet.Append($" {member.PlayerEntity.Id}");
}
return packet.ToString();
}
public static string GenerateRainbowBattleWidget(this RainbowBattleParty rainbowBattle, RainbowBattleTeamType team)
{
var packet = new StringBuilder("fblst");
IReadOnlyList<IClientSession> members = team == RainbowBattleTeamType.Red ? rainbowBattle.RedTeam : rainbowBattle.BlueTeam;
foreach (IClientSession member in members)
{
packet.Append(" " +
$"{member.PlayerEntity.Level}" +
$".{(member.PlayerEntity.Specialist != null && member.PlayerEntity.UseSp ? member.PlayerEntity.Specialist.GameItem.Morph : -1)}" +
$".{(byte)member.PlayerEntity.Class}" +
$".{member.PlayerEntity.RainbowBattleComponent.Kills}" +
$".{member.PlayerEntity.Name}" +
$".{(byte)member.PlayerEntity.Gender}" +
$".{member.PlayerEntity.Id}" +
$".{member.PlayerEntity.HeroLevel}");
}
return packet.ToString();
}
public static string GenerateRainbowBattleLive(this RainbowBattleParty rainbowBattle, RainbowBattleTeamType team)
{
var packet = new StringBuilder("fbt 3");
IReadOnlyList<IClientSession> members = team == RainbowBattleTeamType.Red ? rainbowBattle.RedTeam : rainbowBattle.BlueTeam;
foreach (IClientSession member in members)
{
packet.Append($" {member.PlayerEntity.Id}.{member.PlayerEntity.HpPercentage}.{member.PlayerEntity.MpPercentage}");
}
return packet.ToString();
}
public static string GenerateFlagPacket(this INpcEntity entity) => $"fbt 6 {entity.Id} {(byte)entity.RainbowFlag.FlagType} {(byte)entity.RainbowFlag.FlagTeamType}";
public static string GenerateRainBowEnter(bool isEnter) => $"fbt 1 {(isEnter ? 1 : 0)}";
public static string GenerateRainBowExit() => "fbt 2 -1";
public static string GenerateRainbowScore(this RainbowBattleParty party, RainbowBattleTeamType teamType)
{
var packet = new StringBuilder("fbs ");
int redPoints = party.RedPoints;
int bluePoints = party.BluePoints;
switch (teamType)
{
case RainbowBattleTeamType.Red:
int redTeamCount = party.RedTeam.Count;
int redBigFlags = party.RedFlags.TryGetValue(RainbowBattleFlagType.Big, out byte bigRedCount) ? bigRedCount : 0;
int redMediumFlags = party.RedFlags.TryGetValue(RainbowBattleFlagType.Medium, out byte mediumRedCount) ? mediumRedCount : 0;
int redSmallFlags = party.RedFlags.TryGetValue(RainbowBattleFlagType.Small, out byte smallRedCount) ? smallRedCount : 0;
packet.Append($"1 {redTeamCount} {redPoints} {bluePoints} {redSmallFlags} {redMediumFlags} {redBigFlags} RED");
break;
case RainbowBattleTeamType.Blue:
int blueTeamCount = party.BlueTeam.Count;
int blueBigFlags = party.BlueFlags.TryGetValue(RainbowBattleFlagType.Big, out byte bigBlueCount) ? bigBlueCount : 0;
int blueMediumFlags = party.BlueFlags.TryGetValue(RainbowBattleFlagType.Medium, out byte mediumBlueCount) ? mediumBlueCount : 0;
int blueSmallFlags = party.BlueFlags.TryGetValue(RainbowBattleFlagType.Small, out byte smallBlueCount) ? smallBlueCount : 0;
packet.Append($"2 {blueTeamCount} {redPoints} {bluePoints} {blueSmallFlags} {blueMediumFlags} {blueBigFlags} BLUE");
break;
}
return packet.ToString();
}
public static string GenerateRainbowTime(RainbowTimeType timeType, short? seconds = null)
{
switch (timeType)
{
case RainbowTimeType.End:
return "fbt 5 0 0";
case RainbowTimeType.Start:
return $"fbt 5 1 {seconds ?? 0}";
case RainbowTimeType.Enter:
return "fbt 5 2 0";
default:
throw new ArgumentOutOfRangeException(nameof(timeType), timeType, null);
}
}
public static string GenerateRainbowTeamType(this IClientSession session) =>
$"guri 5 1 {session.PlayerEntity.Id} {(session.PlayerEntity.RainbowBattleComponent.Team == RainbowBattleTeamType.Red ? 1 : 2).ToString()}";
public static void BroadcastRainbowTeamType(this IClientSession session) => session.CurrentMapInstance.Broadcast(session.GenerateRainbowTeamType());
public static bool CanJoinToRainbowBattle(this IClientSession session)
{
if (session.PlayerEntity.RainbowBattleComponent.IsInRainbowBattle)
{
return false;
}
if (session.PlayerEntity.IsInGroup())
{
return false;
}
if (session.PlayerEntity.TimeSpaceComponent.IsInTimeSpaceParty)
{
return false;
}
if (session.PlayerEntity.IsInRaidParty)
{
return false;
}
if (session.PlayerEntity.HasShopOpened)
{
return false;
}
if (session.IsMuted())
{
return false;
}
return session.CurrentMapInstance != null && session.CurrentMapInstance.HasMapFlag(MapFlags.IS_BASE_MAP);
}
}