server-master/srcs/_plugins/WingsEmu.Plugins.GameEvents/Matchmaking/Matchmaker/InstantBattleMatchmaker.cs
2026-02-10 18:21:30 +01:00

80 lines
No EOL
3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using WingsEmu.Game._i18n;
using WingsEmu.Game.GameEvent.Configuration;
using WingsEmu.Game.GameEvent.Matchmaking.Matchmaker;
using WingsEmu.Game.GameEvent.Matchmaking.Result;
using WingsEmu.Game.Networking;
using WingsEmu.Plugins.GameEvents.Configuration.InstantBattle;
using WingsEmu.Plugins.GameEvents.Matchmaking.Result;
namespace WingsEmu.Plugins.GameEvents.Matchmaking.Matchmaker
{
public class InstantBattleMatchmaker : IMatchmaker
{
private readonly IGlobalInstantBattleConfiguration _configuration;
public InstantBattleMatchmaker(IGlobalInstantBattleConfiguration configuration) => _configuration = configuration;
public IMatchmakingResult Matchmake(List<IClientSession> sessions)
{
var games = new List<Tuple<InstantBattleConfiguration, List<IClientSession>>>();
var refusedSessions = new Dictionary<GameDialogKey, List<IClientSession>>();
foreach (IClientSession session in sessions)
{
InstantBattleConfiguration eventConfiguration = _configuration.GetInternalConfiguration(session.PlayerEntity);
if (eventConfiguration == default)
{
continue;
}
Tuple<InstantBattleConfiguration, List<IClientSession>> game = games.FirstOrDefault(
x => x.Item1 == eventConfiguration && x.Item2.Count < eventConfiguration.Requirements.Players.Maximum);
if (game == default)
{
game = new Tuple<InstantBattleConfiguration, List<IClientSession>>(eventConfiguration, new List<IClientSession>());
games.Add(game);
}
game.Item2.Add(session);
}
var gamesToSend = new List<Tuple<IGameEventConfiguration, List<IClientSession>>>();
foreach (Tuple<InstantBattleConfiguration, List<IClientSession>> game in games)
{
if (game.Item2.Count < game.Item1.Requirements.Players.Minimum)
{
foreach (IClientSession session in game.Item2)
{
DictionaryAdd(refusedSessions, GameDialogKey.GAMEEVENT_SHOUTMESSAGE_NOT_ENOUGH_PLAYERS, session);
}
continue;
}
gamesToSend.Add(new Tuple<IGameEventConfiguration, List<IClientSession>>(game.Item1, game.Item2));
}
return new InstantBattleMatchmakingResult(gamesToSend, refusedSessions);
}
private void DictionaryAdd(Dictionary<GameDialogKey, List<IClientSession>> dictionary, GameDialogKey dialogKey, IClientSession clientSession)
{
if (dictionary.ContainsKey(dialogKey))
{
dictionary[dialogKey].Add(clientSession);
return;
}
dictionary.Add(dialogKey, new List<IClientSession>
{
clientSession
});
}
}
}