:(
This commit is contained in:
Dawid Bepierszcz
2025-11-13 01:40:50 +01:00
parent 4865b76262
commit 9723a4faee

View File

@@ -283,6 +283,15 @@ internal class PlayerManager
#endif #endif
if (CS2_SimpleAdmin.DatabaseProvider == null) if (CS2_SimpleAdmin.DatabaseProvider == null)
return; return;
// Optimization: Get players once and avoid allocating anonymous types
var validPlayers = Helper.GetValidPlayers();
// Use ValueTuple instead of anonymous type - better performance and less allocations
var tempPlayers = new List<(string PlayerName, ulong SteamID, string? IpAddress, int? UserId, int Slot)>(validPlayers.Count);
foreach (var p in validPlayers)
{
tempPlayers.Add((p.PlayerName, p.SteamID, p.IpAddress, p.UserId, p.Slot));
}
var pluginInstance = CS2_SimpleAdmin.Instance; var pluginInstance = CS2_SimpleAdmin.Instance;
var config = _config.OtherSettings; // Cache config access var config = _config.OtherSettings; // Cache config access
@@ -291,8 +300,7 @@ internal class PlayerManager
{ {
try try
{ {
// Always run cache and permission refresh, regardless of player count // Run all expire tasks in parallel
// This ensures bans/mutes status changes are detected even when server is empty
var expireTasks = new[] var expireTasks = new[]
{ {
pluginInstance.BanManager.ExpireOldBans(), pluginInstance.BanManager.ExpireOldBans(),
@@ -320,11 +328,6 @@ internal class PlayerManager
if (pluginInstance.CacheManager == null) if (pluginInstance.CacheManager == null)
return; return;
// Only check players if there are any online
var validPlayers = Helper.GetValidPlayers();
if (validPlayers.Count == 0)
return;
// Optimization: Cache ban type and multi-account check to avoid repeated config access // Optimization: Cache ban type and multi-account check to avoid repeated config access
var banType = config.BanType; var banType = config.BanType;
var checkMultiAccounts = config.CheckMultiAccountsByIp; var checkMultiAccounts = config.CheckMultiAccountsByIp;
@@ -332,7 +335,7 @@ internal class PlayerManager
var bannedPlayers = new List<(string PlayerName, ulong SteamID, string? IpAddress, int? UserId, int Slot)>(); var bannedPlayers = new List<(string PlayerName, ulong SteamID, string? IpAddress, int? UserId, int Slot)>();
// Manual loop instead of LINQ - better performance // Manual loop instead of LINQ - better performance
foreach (var player in validPlayers) foreach (var player in tempPlayers)
{ {
var playerName = player.PlayerName; var playerName = player.PlayerName;
var steamId = player.SteamID; var steamId = player.SteamID;
@@ -348,7 +351,7 @@ internal class PlayerManager
if (isBanned) if (isBanned)
{ {
bannedPlayers.Add((playerName, steamId, ip, player.UserId, player.Slot)); bannedPlayers.Add(player);
} }
} }
@@ -369,8 +372,8 @@ internal class PlayerManager
if (config.TimeMode == 0) if (config.TimeMode == 0)
{ {
// Optimization: Manual projection instead of LINQ // Optimization: Manual projection instead of LINQ
var onlinePlayers = new List<(ulong, int?, int)>(validPlayers.Count); var onlinePlayers = new List<(ulong, int?, int)>(tempPlayers.Count);
foreach (var player in validPlayers) foreach (var player in tempPlayers)
{ {
onlinePlayers.Add((player.SteamID, player.UserId, player.Slot)); onlinePlayers.Add((player.SteamID, player.UserId, player.Slot));
} }