diff --git a/CS2-SimpleAdmin/Managers/PlayerManager.cs b/CS2-SimpleAdmin/Managers/PlayerManager.cs index 3974689..c8e84b0 100644 --- a/CS2-SimpleAdmin/Managers/PlayerManager.cs +++ b/CS2-SimpleAdmin/Managers/PlayerManager.cs @@ -283,6 +283,15 @@ internal class PlayerManager #endif if (CS2_SimpleAdmin.DatabaseProvider == null) 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 config = _config.OtherSettings; // Cache config access @@ -291,8 +300,7 @@ internal class PlayerManager { try { - // Always run cache and permission refresh, regardless of player count - // This ensures bans/mutes status changes are detected even when server is empty + // Run all expire tasks in parallel var expireTasks = new[] { pluginInstance.BanManager.ExpireOldBans(), @@ -320,11 +328,6 @@ internal class PlayerManager if (pluginInstance.CacheManager == null) 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 var banType = config.BanType; 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)>(); // Manual loop instead of LINQ - better performance - foreach (var player in validPlayers) + foreach (var player in tempPlayers) { var playerName = player.PlayerName; var steamId = player.SteamID; @@ -348,7 +351,7 @@ internal class PlayerManager 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) { // Optimization: Manual projection instead of LINQ - var onlinePlayers = new List<(ulong, int?, int)>(validPlayers.Count); - foreach (var player in validPlayers) + var onlinePlayers = new List<(ulong, int?, int)>(tempPlayers.Count); + foreach (var player in tempPlayers) { onlinePlayers.Add((player.SteamID, player.UserId, player.Slot)); }