Merge branch 'daffyyyy:main' into main

This commit is contained in:
Dollan
2025-03-27 12:50:43 +01:00
committed by GitHub
13 changed files with 134 additions and 70 deletions

View File

@@ -19,7 +19,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
public override string ModuleName => "CS2-SimpleAdmin" + (Helper.IsDebugBuild ? " (DEBUG)" : " (RELEASE)"); public override string ModuleName => "CS2-SimpleAdmin" + (Helper.IsDebugBuild ? " (DEBUG)" : " (RELEASE)");
public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)"; public override string ModuleDescription => "Simple admin plugin for Counter-Strike 2 :)";
public override string ModuleAuthor => "daffyy & Dliix66"; public override string ModuleAuthor => "daffyy & Dliix66";
public override string ModuleVersion => "1.7.5a"; public override string ModuleVersion => "1.7.6a";
public override void Load(bool hotReload) public override void Load(bool hotReload)
{ {
@@ -56,7 +56,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
public override void OnAllPluginsLoaded(bool hotReload) public override void OnAllPluginsLoaded(bool hotReload)
{ {
AddTimer(3.0f, () => ReloadAdmins(null)); AddTimer(5.0f, () => ReloadAdmins(null));
try try
{ {

View File

@@ -366,10 +366,10 @@ public partial class CS2_SimpleAdmin
: (_localizer?["sa_console"] ?? "Console"); : (_localizer?["sa_console"] ?? "Console");
// Freeze player pawn if alive // Freeze player pawn if alive
if (player.PawnIsAlive) if (player.PlayerPawn?.Value?.LifeState == (int)LifeState_t.LIFE_ALIVE)
{ {
player.Pawn.Value?.Freeze(); player.PlayerPawn?.Value?.Freeze();
AddTimer(5.0f, () => player.Pawn.Value?.Unfreeze(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); AddTimer(5.0f, () => player.PlayerPawn?.Value?.Unfreeze(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
} }
// Get player and admin information // Get player and admin information

View File

@@ -391,15 +391,6 @@ public partial class CS2_SimpleAdmin
{ {
if (Database == null) return; if (Database == null) return;
for (var index = 0; index < PermissionManager.AdminCache.Keys.ToList().Count; index++)
{
var steamId = PermissionManager.AdminCache.Keys.ToList()[index];
if (!PermissionManager.AdminCache.TryRemove(steamId, out _)) continue;
AdminManager.ClearPlayerPermissions(steamId);
AdminManager.RemovePlayerAdminData(steamId);
}
Task.Run(async () => Task.Run(async () =>
{ {
await PermissionManager.CrateGroupsJsonFile(); await PermissionManager.CrateGroupsJsonFile();
@@ -411,11 +402,11 @@ public partial class CS2_SimpleAdmin
await Server.NextWorldUpdateAsync(() => await Server.NextWorldUpdateAsync(() =>
{ {
if (!string.IsNullOrEmpty(adminsFile)) if (!string.IsNullOrEmpty(adminsFile))
AddTimer(1.8f, () => AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json")); AddTimer(1.3f, () => AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json"));
if (!string.IsNullOrEmpty(groupsFile)) if (!string.IsNullOrEmpty(groupsFile))
AddTimer(2.5f, () => AdminManager.LoadAdminGroups(ModuleDirectory + "/data/groups.json")); AddTimer(2.5f, () => AdminManager.LoadAdminGroups(ModuleDirectory + "/data/groups.json"));
if (!string.IsNullOrEmpty(adminsFile)) if (!string.IsNullOrEmpty(adminsFile))
AddTimer(3.0f, () => AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json")); AddTimer(3.5f, () => AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json"));
_logger?.LogInformation("Loaded admins!"); _logger?.LogInformation("Loaded admins!");
}); });
@@ -443,8 +434,8 @@ public partial class CS2_SimpleAdmin
{ {
Server.ExecuteCommand("sv_disable_teamselect_menu 1"); Server.ExecuteCommand("sv_disable_teamselect_menu 1");
if (caller.PlayerPawn.Value != null && caller.PawnIsAlive) if (caller.PlayerPawn?.Value?.LifeState == (int)LifeState_t.LIFE_ALIVE)
caller.PlayerPawn.Value.CommitSuicide(true, false); caller.PlayerPawn.Value?.CommitSuicide(true, false);
AddTimer(1.0f, () => { Server.NextFrame(() => caller.ChangeTeam(CsTeam.Spectator)); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); AddTimer(1.0f, () => { Server.NextFrame(() => caller.ChangeTeam(CsTeam.Spectator)); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
AddTimer(1.4f, () => { Server.NextFrame(() => caller.ChangeTeam(CsTeam.None)); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); AddTimer(1.4f, () => { Server.NextFrame(() => caller.ChangeTeam(CsTeam.None)); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);

View File

@@ -18,7 +18,7 @@ public partial class CS2_SimpleAdmin
if (targets == null) return; if (targets == null) return;
var playersToTarget = targets.Players.Where(player => var playersToTarget = targets.Players.Where(player =>
player.IsValid && player.IsValid &&
player is { PawnIsAlive: true, IsHLTV: false, Connected: PlayerConnectedState.PlayerConnected }).ToList(); player is { IsHLTV: false, Connected: PlayerConnectedState.PlayerConnected, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -70,7 +70,7 @@ public partial class CS2_SimpleAdmin
var targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList(); var playersToTarget = targets.Players.Where(player => player.IsValid && player is {IsHLTV: false, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -124,7 +124,7 @@ public partial class CS2_SimpleAdmin
var targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
var playersToTarget = targets.Players.Where(player => player is { IsValid: true, PawnIsAlive: true, IsHLTV: false }).ToList(); var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -144,7 +144,7 @@ public partial class CS2_SimpleAdmin
var targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
var playersToTarget = targets.Players.Where(player => player is { IsValid: true, PawnIsAlive: true, IsHLTV: false }).ToList(); var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -218,7 +218,7 @@ public partial class CS2_SimpleAdmin
var targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
var playersToTarget = targets.Players.Where(player => player is { IsValid: true, PawnIsAlive: true, IsHLTV: false }).ToList(); var playersToTarget = targets.Players.Where(player => player is { IsValid: true, IsHLTV: false, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {

View File

@@ -22,7 +22,7 @@ public partial class CS2_SimpleAdmin
var targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList(); var playersToTarget = targets.Players.Where(player => player.IsValid && player is {IsHLTV: false, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -67,7 +67,7 @@ public partial class CS2_SimpleAdmin
var targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList(); var playersToTarget = targets.Players.Where(player => player.IsValid && player is { IsHLTV: false, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).ToList();
var weaponName = command.GetArg(2); var weaponName = command.GetArg(2);
// check if item is typed // check if item is typed
@@ -173,7 +173,7 @@ public partial class CS2_SimpleAdmin
var targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList(); var playersToTarget = targets.Players.Where(player => player.IsValid && player is { IsHLTV: false, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -192,7 +192,7 @@ public partial class CS2_SimpleAdmin
callerName ??= caller != null ? caller.PlayerName : _localizer?["sa_console"] ?? "Console"; callerName ??= caller != null ? caller.PlayerName : _localizer?["sa_console"] ?? "Console";
// Check if player is valid, alive, and connected // Check if player is valid, alive, and connected
if (!player.IsValid || !player.PawnIsAlive || player.Connected != PlayerConnectedState.PlayerConnected) if (!player.IsValid || player.PlayerPawn?.Value?.LifeState != (int)LifeState_t.LIFE_ALIVE || player.Connected != PlayerConnectedState.PlayerConnected)
return; return;
// Strip weapons from the player // Strip weapons from the player
@@ -225,7 +225,7 @@ public partial class CS2_SimpleAdmin
var targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList(); var playersToTarget = targets.Players.Where(player => player.IsValid && player is { IsHLTV: false, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -274,7 +274,7 @@ public partial class CS2_SimpleAdmin
var targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList(); var playersToTarget = targets.Players.Where(player => player.IsValid && player is { IsHLTV: false, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -330,7 +330,7 @@ public partial class CS2_SimpleAdmin
var targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList(); var playersToTarget = targets.Players.Where(player => player.IsValid && player is { IsHLTV: false, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -387,7 +387,7 @@ public partial class CS2_SimpleAdmin
var targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList(); var playersToTarget = targets.Players.Where(player => player.IsValid && player is { IsHLTV: false, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).ToList();
playersToTarget.ForEach(player => playersToTarget.ForEach(player =>
{ {
@@ -438,7 +438,7 @@ public partial class CS2_SimpleAdmin
var targets = GetTarget(command); var targets = GetTarget(command);
if (targets == null) return; if (targets == null) return;
var playersToTarget = targets.Players.Where(player => player.IsValid && player is { PawnIsAlive: true, IsHLTV: false }).ToList(); var playersToTarget = targets.Players.Where(player => player.IsValid && player is { IsHLTV: false, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).ToList();
if (command.ArgCount >= 2) if (command.ArgCount >= 2)
{ {
@@ -549,7 +549,7 @@ public partial class CS2_SimpleAdmin
// Change team based on the provided teamName and conditions // Change team based on the provided teamName and conditions
if (!teamName.Equals("swap", StringComparison.OrdinalIgnoreCase)) if (!teamName.Equals("swap", StringComparison.OrdinalIgnoreCase))
{ {
if (player.PawnIsAlive && teamNum != CsTeam.Spectator && !kill && Instance.Config.OtherSettings.TeamSwitchType == 1) if (player.PlayerPawn?.Value?.LifeState == (int)LifeState_t.LIFE_ALIVE && teamNum != CsTeam.Spectator && !kill && Instance.Config.OtherSettings.TeamSwitchType == 1)
player.SwitchTeam(teamNum); player.SwitchTeam(teamNum);
else else
player.ChangeTeam(teamNum); player.ChangeTeam(teamNum);
@@ -560,7 +560,7 @@ public partial class CS2_SimpleAdmin
{ {
var _teamNum = (CsTeam)player.TeamNum == CsTeam.Terrorist ? CsTeam.CounterTerrorist : CsTeam.Terrorist; var _teamNum = (CsTeam)player.TeamNum == CsTeam.Terrorist ? CsTeam.CounterTerrorist : CsTeam.Terrorist;
teamName = _teamNum == CsTeam.Terrorist ? "TT" : "CT"; teamName = _teamNum == CsTeam.Terrorist ? "TT" : "CT";
if (player.PawnIsAlive && !kill && Instance.Config.OtherSettings.TeamSwitchType == 1) if (player.PlayerPawn?.Value?.LifeState == (int)LifeState_t.LIFE_ALIVE && !kill && Instance.Config.OtherSettings.TeamSwitchType == 1)
player.SwitchTeam(_teamNum); player.SwitchTeam(_teamNum);
else else
player.ChangeTeam(_teamNum); player.ChangeTeam(_teamNum);
@@ -740,7 +740,7 @@ public partial class CS2_SimpleAdmin
public void OnGotoCommand(CCSPlayerController? caller, CommandInfo command) public void OnGotoCommand(CCSPlayerController? caller, CommandInfo command)
{ {
// Check if the caller is valid and has a live pawn // Check if the caller is valid and has a live pawn
if (caller == null || !caller.PawnIsAlive) return; if (caller == null || caller.PlayerPawn?.Value?.LifeState != (int)LifeState_t.LIFE_ALIVE) return;
// Get the target players // Get the target players
var targets = GetTarget(command); var targets = GetTarget(command);
@@ -754,7 +754,7 @@ public partial class CS2_SimpleAdmin
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
// Process each player to teleport // Process each player to teleport
foreach (var player in playersToTarget.Where(player => player is { Connected: PlayerConnectedState.PlayerConnected, PawnIsAlive: true }).Where(caller.CanTarget)) foreach (var player in playersToTarget.Where(player => player is { Connected: PlayerConnectedState.PlayerConnected, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).Where(caller.CanTarget))
{ {
if (caller.PlayerPawn.Value == null || player.PlayerPawn.Value == null) if (caller.PlayerPawn.Value == null || player.PlayerPawn.Value == null)
continue; continue;
@@ -778,7 +778,7 @@ public partial class CS2_SimpleAdmin
// Set a timer to toggle collision back after 4 seconds // Set a timer to toggle collision back after 4 seconds
AddTimer(4, () => AddTimer(4, () =>
{ {
if (!caller.IsValid || !caller.PawnIsAlive) if (!caller.IsValid || caller.PlayerPawn?.Value?.LifeState != (int)LifeState_t.LIFE_ALIVE)
return; return;
caller.PlayerPawn.Value.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER; caller.PlayerPawn.Value.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER;
@@ -811,7 +811,8 @@ public partial class CS2_SimpleAdmin
public void OnBringCommand(CCSPlayerController? caller, CommandInfo command) public void OnBringCommand(CCSPlayerController? caller, CommandInfo command)
{ {
// Check if the caller is valid and has a live pawn // Check if the caller is valid and has a live pawn
if (caller == null || !caller.PawnIsAlive) return; if (caller == null || caller.PlayerPawn?.Value?.LifeState != (int)LifeState_t.LIFE_ALIVE)
return;
// Get the target players // Get the target players
var targets = GetTarget(command); var targets = GetTarget(command);
@@ -825,7 +826,7 @@ public partial class CS2_SimpleAdmin
Helper.LogCommand(caller, command); Helper.LogCommand(caller, command);
// Process each player to teleport // Process each player to teleport
foreach (var player in playersToTarget.Where(player => player is { Connected: PlayerConnectedState.PlayerConnected, PawnIsAlive: true }).Where(caller.CanTarget)) foreach (var player in playersToTarget.Where(player => player is { Connected: PlayerConnectedState.PlayerConnected, PlayerPawn.Value.LifeState: (int)LifeState_t.LIFE_ALIVE }).Where(caller.CanTarget))
{ {
if (caller.PlayerPawn.Value == null || player.PlayerPawn.Value == null) if (caller.PlayerPawn.Value == null || player.PlayerPawn.Value == null)
continue; continue;
@@ -849,7 +850,7 @@ public partial class CS2_SimpleAdmin
// Set a timer to toggle collision back after 4 seconds // Set a timer to toggle collision back after 4 seconds
AddTimer(4, () => AddTimer(4, () =>
{ {
if (!player.IsValid || !player.PawnIsAlive) if (!player.IsValid || player.PlayerPawn?.Value?.LifeState != (int)LifeState_t.LIFE_ALIVE)
return; return;
caller.PlayerPawn.Value.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER; caller.PlayerPawn.Value.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER;

View File

@@ -230,6 +230,8 @@ public class OtherSettings
[JsonPropertyName("AdditionalCommandsToLog")] [JsonPropertyName("AdditionalCommandsToLog")]
public List<string> AdditionalCommandsToLog { get; set; } = new(); public List<string> AdditionalCommandsToLog { get; set; } = new();
[JsonPropertyName("IgnoredIps")]
public List<string> IgnoredIps { get; set; } = new();
} }
public class CS2_SimpleAdminConfig : BasePluginConfig public class CS2_SimpleAdminConfig : BasePluginConfig

View File

@@ -107,13 +107,21 @@ public partial class CS2_SimpleAdmin
if (player.UserId.HasValue) if (player.UserId.HasValue)
PlayersInfo.TryRemove(player.UserId.Value, out _); PlayersInfo.TryRemove(player.UserId.Value, out _);
var authorizedSteamId = player.AuthorizedSteamID; if (!PermissionManager.AdminCache.TryGetValue(steamId, out var data)
if (authorizedSteamId == null || !PermissionManager.AdminCache.TryGetValue(authorizedSteamId, || !(data.ExpirationTime <= Time.ActualDateTime()))
out var expirationTime) {
|| !(expirationTime <= Time.ActualDateTime())) return HookResult.Continue; return HookResult.Continue;
}
AdminManager.ClearPlayerPermissions(authorizedSteamId); AdminManager.RemovePlayerPermissions(steamId, PermissionManager.AdminCache[steamId].Flags.ToArray());
AdminManager.RemovePlayerAdminData(authorizedSteamId); AdminManager.RemovePlayerFromGroup(steamId, true, PermissionManager.AdminCache[steamId].Flags.ToArray());
var adminData = AdminManager.GetPlayerAdminData(steamId);
if (adminData == null || data.Flags.ToList().Count != 0 && adminData.Groups.ToList().Count != 0)
return HookResult.Continue;
AdminManager.ClearPlayerPermissions(steamId);
AdminManager.RemovePlayerAdminData(steamId);
return HookResult.Continue; return HookResult.Continue;
} }
@@ -372,7 +380,7 @@ public partial class CS2_SimpleAdmin
private void OnMapStart(string mapName) private void OnMapStart(string mapName)
{ {
if (Config.OtherSettings.ReloadAdminsEveryMapChange && ServerLoaded && ServerId != null) if (Config.OtherSettings.ReloadAdminsEveryMapChange && ServerLoaded && ServerId != null)
AddTimer(3.0f, () => ReloadAdmins(null)); AddTimer(5.0f, () => ReloadAdmins(null));
AddTimer(1.0f, () => new ServerManager().CheckHibernationStatus()); AddTimer(1.0f, () => new ServerManager().CheckHibernationStatus());
@@ -395,10 +403,9 @@ public partial class CS2_SimpleAdmin
{ {
var player = @event.Userid; var player = @event.Userid;
if (player is null || @event.Attacker is null || !player.PawnIsAlive || player.PlayerPawn.Value == null) if (player is null || @event.Attacker is null || player.PlayerPawn?.Value?.LifeState != (int)LifeState_t.LIFE_ALIVE || player.PlayerPawn.Value == null)
return HookResult.Continue; return HookResult.Continue;
if (SpeedPlayers.TryGetValue(player.Slot, out var speedPlayer)) if (SpeedPlayers.TryGetValue(player.Slot, out var speedPlayer))
AddTimer(0.15f, () => player.SetSpeed(speedPlayer)); AddTimer(0.15f, () => player.SetSpeed(speedPlayer));

View File

@@ -73,7 +73,7 @@ public static class PlayerExtensions
public static void SetHp(this CCSPlayerController? controller, int health = 100) public static void SetHp(this CCSPlayerController? controller, int health = 100)
{ {
if (controller == null) return; if (controller == null) return;
if ((health <= 0 || !controller.PawnIsAlive || controller.PlayerPawn.Value == null)) return; if (health <= 0 || controller.PlayerPawn.Value == null || controller.PlayerPawn?.Value?.LifeState != (int)LifeState_t.LIFE_ALIVE) return;
controller.PlayerPawn.Value.Health = health; controller.PlayerPawn.Value.Health = health;

View File

@@ -145,7 +145,7 @@ internal class BanManager(Database.Database? database)
{ {
string sql; string sql;
if (CS2_SimpleAdmin.Instance.Config.OtherSettings.CheckMultiAccountsByIp) if (CS2_SimpleAdmin.Instance.Config.OtherSettings.CheckMultiAccountsByIp && !CS2_SimpleAdmin.Instance.Config.OtherSettings.IgnoredIps.Contains(player.IpAddress))
{ {
sql = CS2_SimpleAdmin.Instance.Config.MultiServerMode ? """ sql = CS2_SimpleAdmin.Instance.Config.MultiServerMode ? """
SELECT COALESCE(( SELECT COALESCE((
@@ -232,7 +232,8 @@ internal class BanManager(Database.Database? database)
{ {
PlayerSteamID = player.SteamId.SteamId64.ToString(), PlayerSteamID = player.SteamId.SteamId64.ToString(),
PlayerIP = CS2_SimpleAdmin.Instance.Config.OtherSettings.BanType == 0 || PlayerIP = CS2_SimpleAdmin.Instance.Config.OtherSettings.BanType == 0 ||
string.IsNullOrEmpty(player.IpAddress) string.IsNullOrEmpty(player.IpAddress) ||
CS2_SimpleAdmin.Instance.Config.OtherSettings.IgnoredIps.Contains(player.IpAddress)
? null ? null
: player.IpAddress, : player.IpAddress,
PlayerName = !string.IsNullOrEmpty(player.Name) ? player.Name : string.Empty, PlayerName = !string.IsNullOrEmpty(player.Name) ? player.Name : string.Empty,

View File

@@ -5,6 +5,7 @@ using Microsoft.Extensions.Logging;
using MySqlConnector; using MySqlConnector;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using CounterStrikeSharp.API.Modules.Admin;
namespace CS2_SimpleAdmin.Managers; namespace CS2_SimpleAdmin.Managers;
@@ -12,7 +13,8 @@ public class PermissionManager(Database.Database? database)
{ {
// Unused for now // Unused for now
//public static readonly ConcurrentDictionary<string, ConcurrentBag<string>> _adminCache = new ConcurrentDictionary<string, ConcurrentBag<string>>(); //public static readonly ConcurrentDictionary<string, ConcurrentBag<string>> _adminCache = new ConcurrentDictionary<string, ConcurrentBag<string>>();
public static readonly ConcurrentDictionary<SteamID, DateTime?> AdminCache = new(); // public static readonly ConcurrentDictionary<SteamID, DateTime?> AdminCache = new();
public static readonly ConcurrentDictionary<SteamID, (DateTime? ExpirationTime, List<string> Flags)> AdminCache = new();
/* /*
public async Task<List<(List<string>, int)>> GetAdminFlags(string steamId) public async Task<List<(List<string>, int)>> GetAdminFlags(string steamId)
@@ -334,7 +336,7 @@ public class PermissionManager(Database.Database? database)
.GroupBy(player => player.name) // Group by player name .GroupBy(player => player.name) // Group by player name
.ToDictionary( .ToDictionary(
group => group.Key, // Use the player name as the key group => group.Key, // Use the player name as the key
group => object (group) =>
{ {
// Consolidate data for players with the same name // Consolidate data for players with the same name
var consolidatedData = group.Aggregate( var consolidatedData = group.Aggregate(
@@ -366,16 +368,76 @@ public class PermissionManager(Database.Database? database)
return acc; return acc;
}); });
foreach (var player in group) Server.NextFrameAsync(() =>
{ {
SteamID.TryParse(player.identity, out var steamId); var keysToRemove = new List<SteamID>();
if (steamId != null && !AdminCache.ContainsKey(steamId))
foreach (var steamId in AdminCache.Keys.ToList())
{ {
AdminCache.TryAdd(steamId, player.ends); var data = AdminManager.GetPlayerAdminData(steamId);
} if (data != null)
{
var flagsArray = AdminCache[steamId].Flags.ToArray();
AdminManager.RemovePlayerPermissions(steamId, flagsArray);
AdminManager.RemovePlayerFromGroup(steamId, true, flagsArray);
} }
return (object)consolidatedData; keysToRemove.Add(steamId);
}
foreach (var steamId in keysToRemove)
{
if (!AdminCache.TryRemove(steamId, out _)) continue;
var data = AdminManager.GetPlayerAdminData(steamId);
if (data == null) continue;
if (data.Flags.Count != 0 && data.Groups.Count != 0) continue;
AdminManager.ClearPlayerPermissions(steamId);
AdminManager.RemovePlayerAdminData(steamId);
}
foreach (var player in group)
{
if (SteamID.TryParse(player.identity, out var steamId) && steamId != null)
{
AdminCache.TryAdd(steamId, (player.ends, player.flags));
}
}
});
// Server.NextFrameAsync(() =>
// {
// for (var index = 0; index < AdminCache.Keys.ToList().Count; index++)
// {
// var steamId = AdminCache.Keys.ToList()[index];
//
// var data = AdminManager.GetPlayerAdminData(steamId);
// if (data != null)
// {
// AdminManager.RemovePlayerPermissions(steamId, AdminCache[steamId].Flags.ToArray());
// AdminManager.RemovePlayerFromGroup(steamId, true, AdminCache[steamId].Flags.ToArray());
// }
//
// if (!AdminCache.TryRemove(steamId, out _)) continue;
//
// if (data == null) continue;
// if (data.Flags.ToList().Count != 0 && data.Groups.ToList().Count != 0)
// continue;
//
// AdminManager.ClearPlayerPermissions(steamId);
// AdminManager.RemovePlayerAdminData(steamId);
// }
//
// foreach (var player in group)
// {
// SteamID.TryParse(player.identity, out var steamId);
// if (steamId == null) continue;
// AdminCache.TryAdd(steamId, (player.ends, player.flags));
// }
// });
return consolidatedData;
}); });
var json = JsonConvert.SerializeObject(jsonData, Formatting.Indented); var json = JsonConvert.SerializeObject(jsonData, Formatting.Indented);

View File

@@ -229,7 +229,7 @@ public class PlayerManager
foreach (var value in CS2_SimpleAdmin.GravityPlayers) foreach (var value in CS2_SimpleAdmin.GravityPlayers)
{ {
if (value.Key is not if (value.Key is not
{ IsValid: true, Connected: PlayerConnectedState.PlayerConnected, PawnIsAlive: true }) { IsValid: true, Connected: PlayerConnectedState.PlayerConnected } && value.Key.PlayerPawn?.Value?.LifeState == (int)LifeState_t.LIFE_ALIVE)
continue; continue;
value.Key.SetGravity(value.Value); value.Key.SetGravity(value.Value);

View File

@@ -18,12 +18,12 @@ public static class PlayersMenu
public static void OpenAliveMenu(CCSPlayerController admin, string menuName, Action<CCSPlayerController, CCSPlayerController> onSelectAction, Func<CCSPlayerController, bool>? enableFilter = null) public static void OpenAliveMenu(CCSPlayerController admin, string menuName, Action<CCSPlayerController, CCSPlayerController> onSelectAction, Func<CCSPlayerController, bool>? enableFilter = null)
{ {
OpenMenu(admin, menuName, onSelectAction, p => p.PawnIsAlive); OpenMenu(admin, menuName, onSelectAction, p => p.PlayerPawn?.Value?.LifeState == (int)LifeState_t.LIFE_ALIVE);
} }
public static void OpenDeadMenu(CCSPlayerController admin, string menuName, Action<CCSPlayerController?, CCSPlayerController> onSelectAction, Func<CCSPlayerController, bool>? enableFilter = null) public static void OpenDeadMenu(CCSPlayerController admin, string menuName, Action<CCSPlayerController?, CCSPlayerController> onSelectAction, Func<CCSPlayerController, bool>? enableFilter = null)
{ {
OpenMenu(admin, menuName, onSelectAction, p => p.PawnIsAlive == false); OpenMenu(admin, menuName, onSelectAction, p => p.PlayerPawn?.Value?.LifeState != (int)LifeState_t.LIFE_ALIVE);
} }
public static void OpenMenu(CCSPlayerController admin, string menuName, Action<CCSPlayerController, CCSPlayerController> onSelectAction, Func<CCSPlayerController, bool>? enableFilter = null) public static void OpenMenu(CCSPlayerController admin, string menuName, Action<CCSPlayerController, CCSPlayerController> onSelectAction, Func<CCSPlayerController, bool>? enableFilter = null)

View File

@@ -1 +1 @@
1.7.5a 1.7.6a