mirror of
https://github.com/daffyyyy/CS2-SimpleAdmin.git
synced 2026-02-18 18:49:23 +00:00
1.7.0a
- Fixed css_warn (unfreeze player after 5s) - Fixed server loading from database (reduced delay) - Added checking the player in an earlier phase of the connection - Fixed admin name when using action from menu
This commit is contained in:
@@ -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.6.9c";
|
public override string ModuleVersion => "1.7.0a";
|
||||||
|
|
||||||
public override void Load(bool hotReload)
|
public override void Load(bool hotReload)
|
||||||
{
|
{
|
||||||
@@ -94,7 +94,7 @@ public partial class CS2_SimpleAdmin : BasePlugin, IPluginConfig<CS2_SimpleAdmin
|
|||||||
|
|
||||||
DbConnectionString = builder.ConnectionString;
|
DbConnectionString = builder.ConnectionString;
|
||||||
Database = new Database.Database(DbConnectionString);
|
Database = new Database.Database(DbConnectionString);
|
||||||
|
|
||||||
if (!Database.CheckDatabaseConnection(out var exception))
|
if (!Database.CheckDatabaseConnection(out var exception))
|
||||||
{
|
{
|
||||||
if (exception != null)
|
if (exception != null)
|
||||||
|
|||||||
@@ -56,7 +56,9 @@ public partial class CS2_SimpleAdmin
|
|||||||
if (!CheckValidBan(caller, time)) return;
|
if (!CheckValidBan(caller, time)) return;
|
||||||
|
|
||||||
// Set default caller name if not provided
|
// Set default caller name if not provided
|
||||||
callerName ??= _localizer?["sa_console"] ?? "Console";
|
callerName = !string.IsNullOrEmpty(caller?.PlayerName)
|
||||||
|
? caller.PlayerName
|
||||||
|
: (_localizer?["sa_console"] ?? "Console");
|
||||||
|
|
||||||
// Freeze player pawn if alive
|
// Freeze player pawn if alive
|
||||||
if (player.PawnIsAlive)
|
if (player.PawnIsAlive)
|
||||||
@@ -321,12 +323,15 @@ public partial class CS2_SimpleAdmin
|
|||||||
if (!CheckValidBan(caller, time)) return;
|
if (!CheckValidBan(caller, time)) return;
|
||||||
|
|
||||||
// Set default caller name if not provided
|
// Set default caller name if not provided
|
||||||
callerName ??= _localizer?["sa_console"] ?? "Console";
|
callerName = !string.IsNullOrEmpty(caller?.PlayerName)
|
||||||
|
? caller.PlayerName
|
||||||
|
: (_localizer?["sa_console"] ?? "Console");
|
||||||
|
|
||||||
// Freeze player pawn if alive
|
// Freeze player pawn if alive
|
||||||
if (player.PawnIsAlive)
|
if (player.PawnIsAlive)
|
||||||
{
|
{
|
||||||
player.Pawn.Value?.Freeze();
|
player.Pawn.Value?.Freeze();
|
||||||
|
AddTimer(5.0f, () => player.Pawn.Value?.Unfreeze(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get player and admin information
|
// Get player and admin information
|
||||||
|
|||||||
@@ -371,18 +371,20 @@ public partial class CS2_SimpleAdmin
|
|||||||
{
|
{
|
||||||
await PermissionManager.CrateGroupsJsonFile();
|
await PermissionManager.CrateGroupsJsonFile();
|
||||||
await PermissionManager.CreateAdminsJsonFile();
|
await PermissionManager.CreateAdminsJsonFile();
|
||||||
|
|
||||||
var adminsFile = await File.ReadAllTextAsync(Instance.ModuleDirectory + "/data/admins.json");
|
var adminsFile = await File.ReadAllTextAsync(Instance.ModuleDirectory + "/data/admins.json");
|
||||||
var groupsFile = await File.ReadAllTextAsync(Instance.ModuleDirectory + "/data/groups.json");
|
var groupsFile = await File.ReadAllTextAsync(Instance.ModuleDirectory + "/data/groups.json");
|
||||||
|
|
||||||
await Server.NextWorldUpdateAsync(() =>
|
await Server.NextWorldUpdateAsync(() =>
|
||||||
{
|
{
|
||||||
if (!string.IsNullOrEmpty(adminsFile))
|
if (!string.IsNullOrEmpty(adminsFile))
|
||||||
AddTimer(0.5f, () => AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json"));
|
AddTimer(1.8f, () => AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json"));
|
||||||
if (!string.IsNullOrEmpty(groupsFile))
|
if (!string.IsNullOrEmpty(groupsFile))
|
||||||
AddTimer(0.8f, () => AdminManager.LoadAdminGroups(ModuleDirectory + "/data/groups.json"));
|
AddTimer(2.5f, () => AdminManager.LoadAdminGroups(ModuleDirectory + "/data/groups.json"));
|
||||||
if (!string.IsNullOrEmpty(adminsFile))
|
if (!string.IsNullOrEmpty(adminsFile))
|
||||||
AddTimer(1.1f, () => AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json"));
|
AddTimer(3.0f, () => AdminManager.LoadAdminData(ModuleDirectory + "/data/admins.json"));
|
||||||
|
|
||||||
|
_logger?.LogInformation("Loaded admins!");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
using CounterStrikeSharp.API;
|
||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Admin;
|
using CounterStrikeSharp.API.Modules.Admin;
|
||||||
using CounterStrikeSharp.API.Modules.Commands;
|
using CounterStrikeSharp.API.Modules.Commands;
|
||||||
@@ -755,15 +756,43 @@ public partial class CS2_SimpleAdmin
|
|||||||
// 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, PawnIsAlive: true }).Where(caller.CanTarget))
|
||||||
{
|
{
|
||||||
if (caller.PlayerPawn.Value == null)
|
if (caller.PlayerPawn.Value == null || player.PlayerPawn.Value == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Teleport the caller to the player and toggle noclip
|
// Teleport the caller to the player and toggle noclip
|
||||||
caller.TeleportPlayer(player);
|
caller.TeleportPlayer(player);
|
||||||
caller.PlayerPawn.Value.ToggleNoclip();
|
// caller.PlayerPawn.Value.ToggleNoclip();
|
||||||
|
|
||||||
// Set a timer to toggle noclip back after 3 seconds
|
caller.PlayerPawn.Value.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_DISSOLVING;
|
||||||
AddTimer(3, () => caller.PlayerPawn.Value.ToggleNoclip());
|
caller.PlayerPawn.Value.Collision.CollisionAttribute.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_DISSOLVING;
|
||||||
|
|
||||||
|
Utilities.SetStateChanged(caller, "CCollisionProperty", "m_CollisionGroup");
|
||||||
|
Utilities.SetStateChanged(caller, "VPhysicsCollisionAttribute_t", "m_nCollisionGroup");
|
||||||
|
|
||||||
|
player.PlayerPawn.Value.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_DISSOLVING;
|
||||||
|
player.PlayerPawn.Value.Collision.CollisionAttribute.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_DISSOLVING;
|
||||||
|
|
||||||
|
Utilities.SetStateChanged(player, "CCollisionProperty", "m_CollisionGroup");
|
||||||
|
Utilities.SetStateChanged(player, "VPhysicsCollisionAttribute_t", "m_nCollisionGroup");
|
||||||
|
|
||||||
|
// Set a timer to toggle collision back after 4 seconds
|
||||||
|
AddTimer(4, () =>
|
||||||
|
{
|
||||||
|
if (!caller.IsValid || !caller.PawnIsAlive)
|
||||||
|
return;
|
||||||
|
|
||||||
|
caller.PlayerPawn.Value.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER;
|
||||||
|
caller.PlayerPawn.Value.Collision.CollisionAttribute.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER;
|
||||||
|
|
||||||
|
Utilities.SetStateChanged(caller, "CCollisionProperty", "m_CollisionGroup");
|
||||||
|
Utilities.SetStateChanged(caller, "VPhysicsCollisionAttribute_t", "m_nCollisionGroup");
|
||||||
|
|
||||||
|
player.PlayerPawn.Value.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER;
|
||||||
|
player.PlayerPawn.Value.Collision.CollisionAttribute.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER;
|
||||||
|
|
||||||
|
Utilities.SetStateChanged(player, "CCollisionProperty", "m_CollisionGroup");
|
||||||
|
Utilities.SetStateChanged(player, "VPhysicsCollisionAttribute_t", "m_nCollisionGroup");
|
||||||
|
});
|
||||||
|
|
||||||
// Prepare message key and arguments for the teleport notification
|
// Prepare message key and arguments for the teleport notification
|
||||||
var activityMessageKey = "sa_admin_tp_message";
|
var activityMessageKey = "sa_admin_tp_message";
|
||||||
@@ -798,15 +827,43 @@ public partial class CS2_SimpleAdmin
|
|||||||
// 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, PawnIsAlive: true }).Where(caller.CanTarget))
|
||||||
{
|
{
|
||||||
if (caller.PlayerPawn.Value == null)
|
if (caller.PlayerPawn.Value == null || player.PlayerPawn.Value == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Teleport the player to the caller and toggle noclip
|
// Teleport the player to the caller and toggle noclip
|
||||||
player.TeleportPlayer(caller);
|
player.TeleportPlayer(caller);
|
||||||
caller.PlayerPawn.Value.ToggleNoclip();
|
// caller.PlayerPawn.Value.ToggleNoclip();
|
||||||
|
|
||||||
|
caller.PlayerPawn.Value.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_DISSOLVING;
|
||||||
|
caller.PlayerPawn.Value.Collision.CollisionAttribute.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_DISSOLVING;
|
||||||
|
|
||||||
|
Utilities.SetStateChanged(caller, "CCollisionProperty", "m_CollisionGroup");
|
||||||
|
Utilities.SetStateChanged(caller, "VPhysicsCollisionAttribute_t", "m_nCollisionGroup");
|
||||||
|
|
||||||
|
player.PlayerPawn.Value.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_DISSOLVING;
|
||||||
|
player.PlayerPawn.Value.Collision.CollisionAttribute.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_DISSOLVING;
|
||||||
|
|
||||||
|
Utilities.SetStateChanged(player, "CCollisionProperty", "m_CollisionGroup");
|
||||||
|
Utilities.SetStateChanged(player, "VPhysicsCollisionAttribute_t", "m_nCollisionGroup");
|
||||||
|
|
||||||
// Set a timer to toggle noclip back after 3 seconds
|
// Set a timer to toggle collision back after 4 seconds
|
||||||
AddTimer(3, () => caller.PlayerPawn.Value.ToggleNoclip());
|
AddTimer(4, () =>
|
||||||
|
{
|
||||||
|
if (!player.IsValid || !player.PawnIsAlive)
|
||||||
|
return;
|
||||||
|
|
||||||
|
caller.PlayerPawn.Value.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER;
|
||||||
|
caller.PlayerPawn.Value.Collision.CollisionAttribute.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER;
|
||||||
|
|
||||||
|
Utilities.SetStateChanged(caller, "CCollisionProperty", "m_CollisionGroup");
|
||||||
|
Utilities.SetStateChanged(caller, "VPhysicsCollisionAttribute_t", "m_nCollisionGroup");
|
||||||
|
|
||||||
|
player.PlayerPawn.Value.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER;
|
||||||
|
player.PlayerPawn.Value.Collision.CollisionAttribute.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER;
|
||||||
|
|
||||||
|
Utilities.SetStateChanged(player, "CCollisionProperty", "m_CollisionGroup");
|
||||||
|
Utilities.SetStateChanged(player, "VPhysicsCollisionAttribute_t", "m_nCollisionGroup");
|
||||||
|
});
|
||||||
|
|
||||||
// Prepare message key and arguments for the bring notification
|
// Prepare message key and arguments for the bring notification
|
||||||
var activityMessageKey = "sa_admin_bring_message";
|
var activityMessageKey = "sa_admin_bring_message";
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ public partial class CS2_SimpleAdmin
|
|||||||
private void RegisterEvents()
|
private void RegisterEvents()
|
||||||
{
|
{
|
||||||
RegisterListener<Listeners.OnMapStart>(OnMapStart);
|
RegisterListener<Listeners.OnMapStart>(OnMapStart);
|
||||||
|
RegisterListener<Listeners.OnClientConnect>(OnClientConnect);
|
||||||
RegisterListener<Listeners.OnGameServerSteamAPIActivated>(OnGameServerSteamAPIActivated);
|
RegisterListener<Listeners.OnGameServerSteamAPIActivated>(OnGameServerSteamAPIActivated);
|
||||||
if (Config.OtherSettings.UserMessageGagChatType)
|
if (Config.OtherSettings.UserMessageGagChatType)
|
||||||
HookUserMessage(118, HookUmChat);
|
HookUserMessage(118, HookUmChat);
|
||||||
@@ -120,10 +121,31 @@ public partial class CS2_SimpleAdmin
|
|||||||
return HookResult.Continue;
|
return HookResult.Continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnClientConnect(int playerslot, string name, string ipaddress)
|
||||||
|
{
|
||||||
|
#if DEBUG
|
||||||
|
Logger.LogCritical("[OnClientConnect]");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
Server.NextFrame(() =>
|
||||||
|
{
|
||||||
|
var player = Utilities.GetPlayerFromSlot(playerslot);
|
||||||
|
|
||||||
|
if (player == null || !player.IsValid || player.IsBot)
|
||||||
|
return;
|
||||||
|
|
||||||
|
new PlayerManager().LoadPlayerData(player);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
[GameEventHandler]
|
[GameEventHandler]
|
||||||
public HookResult OnPlayerFullConnect(EventPlayerConnectFull @event, GameEventInfo info)
|
public HookResult OnPlayerFullConnect(EventPlayerConnectFull @event, GameEventInfo info)
|
||||||
{
|
{
|
||||||
|
#if DEBUG
|
||||||
|
Logger.LogCritical("[OnPlayerFullConnect]");
|
||||||
|
#endif
|
||||||
|
|
||||||
var player = @event.Userid;
|
var player = @event.Userid;
|
||||||
|
|
||||||
if (player == null || !player.IsValid || player.IsBot)
|
if (player == null || !player.IsValid || player.IsBot)
|
||||||
|
|||||||
@@ -307,7 +307,7 @@ internal static class Helper
|
|||||||
var arg = currentMessageArgs[i];
|
var arg = currentMessageArgs[i];
|
||||||
currentMessageArgs[i] = CS2_SimpleAdmin.Instance.Config.OtherSettings.ShowActivityType switch
|
currentMessageArgs[i] = CS2_SimpleAdmin.Instance.Config.OtherSettings.ShowActivityType switch
|
||||||
{
|
{
|
||||||
1 => arg.Replace("CALLER", AdminManager.PlayerHasPermissions(controller, "@css/kick") || AdminManager.PlayerHasPermissions(controller, "@css/ban") ? callerName : CS2_SimpleAdmin._localizer["sa_admin"]),
|
1 => arg.Replace("CALLER", AdminManager.PlayerHasPermissions(new SteamID(controller.SteamID), "@css/kick") || AdminManager.PlayerHasPermissions(new SteamID(controller.SteamID), "@css/ban") ? callerName : CS2_SimpleAdmin._localizer["sa_admin"]),
|
||||||
2 => arg.Replace("CALLER", callerName ?? CS2_SimpleAdmin._localizer["sa_console"]),
|
2 => arg.Replace("CALLER", callerName ?? CS2_SimpleAdmin._localizer["sa_console"]),
|
||||||
_ => arg
|
_ => arg
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ public class PermissionManager(Database.Database? database)
|
|||||||
// Console.WriteLine($"Player SteamID: {player.PlayerSteamId}, Name: {player.PlayerName}, Flags: {string.Join(", ", player.Flags)}, Immunity: {player.Immunity}, Ends: {player.Ends}");
|
// Console.WriteLine($"Player SteamID: {player.PlayerSteamId}, Name: {player.PlayerName}, Flags: {string.Join(", ", player.Flags)}, Immunity: {player.Immunity}, Ends: {player.Ends}");
|
||||||
// }
|
// }
|
||||||
|
|
||||||
List<(string, string, List<string>, int, DateTime?)> filteredFlagsWithImmunity = [];
|
List<(string, string, List<string>, int, DateTime?)> filteredFlagsWithImmunity = [];
|
||||||
|
|
||||||
// Add the grouped players to the list
|
// Add the grouped players to the list
|
||||||
filteredFlagsWithImmunity.AddRange(groupedPlayers);
|
filteredFlagsWithImmunity.AddRange(groupedPlayers);
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ public class PlayerManager
|
|||||||
var victim = Utilities.GetPlayerFromUserid(userId);
|
var victim = Utilities.GetPlayerFromUserid(userId);
|
||||||
|
|
||||||
if (victim == null || !victim.UserId.HasValue) return;
|
if (victim == null || !victim.UserId.HasValue) return;
|
||||||
|
|
||||||
if (CS2_SimpleAdmin.UnlockedCommands)
|
if (CS2_SimpleAdmin.UnlockedCommands)
|
||||||
Server.ExecuteCommand($"banid 1 {userId}");
|
Server.ExecuteCommand($"banid 1 {userId}");
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ public class ServerManager
|
|||||||
{
|
{
|
||||||
ipAddress = Helper.GetServerIp();
|
ipAddress = Helper.GetServerIp();
|
||||||
|
|
||||||
if (_getIpTryCount <= 32)
|
if (_getIpTryCount <= 32 && (string.IsNullOrEmpty(ipAddress) || ipAddress.StartsWith("0.0.0")))
|
||||||
{
|
{
|
||||||
_getIpTryCount++;
|
_getIpTryCount++;
|
||||||
|
|
||||||
|
|||||||
@@ -148,7 +148,7 @@ public static class ManagePlayersMenu
|
|||||||
{
|
{
|
||||||
if (player is not { IsValid: true }) return;
|
if (player is not { IsValid: true }) return;
|
||||||
|
|
||||||
CS2_SimpleAdmin.Instance.Kick(admin, player, reason);
|
CS2_SimpleAdmin.Instance.Kick(admin, player, reason, admin.PlayerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void BanMenu(CCSPlayerController admin, CCSPlayerController player, int duration)
|
internal static void BanMenu(CCSPlayerController admin, CCSPlayerController player, int duration)
|
||||||
@@ -180,7 +180,7 @@ public static class ManagePlayersMenu
|
|||||||
{
|
{
|
||||||
if (player is not { IsValid: true }) return;
|
if (player is not { IsValid: true }) return;
|
||||||
|
|
||||||
CS2_SimpleAdmin.Instance.Ban(admin, player, duration, reason);
|
CS2_SimpleAdmin.Instance.Ban(admin, player, duration, reason, admin.PlayerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void WarnMenu(CCSPlayerController admin, CCSPlayerController player, int duration)
|
private static void WarnMenu(CCSPlayerController admin, CCSPlayerController player, int duration)
|
||||||
@@ -210,7 +210,7 @@ public static class ManagePlayersMenu
|
|||||||
{
|
{
|
||||||
if (player is not { IsValid: true }) return;
|
if (player is not { IsValid: true }) return;
|
||||||
|
|
||||||
CS2_SimpleAdmin.Instance.Warn(admin, player, duration, reason);
|
CS2_SimpleAdmin.Instance.Warn(admin, player, duration, reason, admin.PlayerName);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void GagMenu(CCSPlayerController admin, CCSPlayerController player, int duration)
|
internal static void GagMenu(CCSPlayerController admin, CCSPlayerController player, int duration)
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
1.6.9c
|
1.7.0a
|
||||||
Reference in New Issue
Block a user