mirror of
https://github.com/daffyyyy/CS2-SimpleAdmin.git
synced 2026-03-07 23:37:56 +00:00
1.3.0e
- Added `css_rename` - Added `css_silence` - Added `css_addsilence` - Added `css_unsilence` - PlayerPenaltyManager class - Fix for invalid players New commands localized only for `pl` and `en`, if u can please make pr for other languages
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -6,6 +6,7 @@
|
|||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
||||||
|
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
114
Events.cs
114
Events.cs
@@ -21,37 +21,24 @@ public partial class CS2_SimpleAdmin
|
|||||||
//RegisterListener<OnClientDisconnect>(OnClientDisconnect);
|
//RegisterListener<OnClientDisconnect>(OnClientDisconnect);
|
||||||
//RegisterEventHandler<EventPlayerConnectFull>(OnPlayerFullConnect);
|
//RegisterEventHandler<EventPlayerConnectFull>(OnPlayerFullConnect);
|
||||||
RegisterListener<Listeners.OnMapStart>(OnMapStart);
|
RegisterListener<Listeners.OnMapStart>(OnMapStart);
|
||||||
|
RegisterListener<Listeners.OnClientVoice>(OnClientVoice);
|
||||||
//RegisterEventHandler<EventPlayerHurt>(OnPlayerHurt);
|
//RegisterEventHandler<EventPlayerHurt>(OnPlayerHurt);
|
||||||
//RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
//RegisterEventHandler<EventRoundStart>(OnRoundStart);
|
||||||
AddCommandListener("say", OnCommandSay);
|
AddCommandListener("say", OnCommandSay);
|
||||||
AddCommandListener("say_team", OnCommandTeamSay);
|
AddCommandListener("say_team", OnCommandTeamSay);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*private HookResult OnPlayerFullConnect(EventPlayerConnectFull @event, GameEventInfo info)
|
private void OnClientVoice(int playerSlot)
|
||||||
{
|
{
|
||||||
CCSPlayerController? player = @event.Userid;
|
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager();
|
||||||
|
if (!playerPenaltyManager.IsSlotInPenalties(playerSlot)) return;
|
||||||
|
|
||||||
if (player is null || player.IsBot || player.IsHLTV) return HookResult.Continue;
|
CCSPlayerController? player = Utilities.GetPlayerFromSlot(playerSlot);
|
||||||
|
if (player is null || !player.IsValid) return;
|
||||||
|
|
||||||
PlayerInfo playerInfo = new PlayerInfo
|
if (playerPenaltyManager.IsPenalized(playerSlot, PenaltyType.Mute) || playerPenaltyManager.IsPenalized(playerSlot, PenaltyType.Silence))
|
||||||
{
|
player.VoiceFlags = VoiceFlags.Muted;
|
||||||
UserId = player.UserId,
|
|
||||||
Index = (ushort)player.UserId,
|
|
||||||
SteamId = player?.AuthorizedSteamID?.SteamId64.ToString(),
|
|
||||||
Name = player?.PlayerName,
|
|
||||||
IpAddress = player?.IpAddress?.Split(":")[0]
|
|
||||||
};
|
|
||||||
|
|
||||||
Task.Run(async () =>
|
|
||||||
{
|
|
||||||
Server.NextFrame(() =>
|
|
||||||
{
|
|
||||||
if (player is null) return;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
return HookResult.Continue;
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
[GameEventHandler]
|
[GameEventHandler]
|
||||||
private HookResult OnRoundEnd(EventRoundEnd @event, GameEventInfo info)
|
private HookResult OnRoundEnd(EventRoundEnd @event, GameEventInfo info)
|
||||||
@@ -67,10 +54,10 @@ public partial class CS2_SimpleAdmin
|
|||||||
{
|
{
|
||||||
if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).Length == 0) return HookResult.Continue;
|
if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).Length == 0) return HookResult.Continue;
|
||||||
|
|
||||||
if (player != null && gaggedPlayers.Contains(player.Slot))
|
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager();
|
||||||
{
|
|
||||||
|
if (playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) || playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence))
|
||||||
return HookResult.Handled;
|
return HookResult.Handled;
|
||||||
}
|
|
||||||
|
|
||||||
return HookResult.Continue;
|
return HookResult.Continue;
|
||||||
}
|
}
|
||||||
@@ -79,10 +66,10 @@ public partial class CS2_SimpleAdmin
|
|||||||
{
|
{
|
||||||
if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).Length == 0) return HookResult.Continue;
|
if (player is null || !player.IsValid || player.IsBot || player.IsHLTV || info.GetArg(1).Length == 0) return HookResult.Continue;
|
||||||
|
|
||||||
if (player != null && gaggedPlayers.Contains(player.Slot))
|
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager();
|
||||||
{
|
|
||||||
|
if (playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) || playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence))
|
||||||
return HookResult.Handled;
|
return HookResult.Handled;
|
||||||
}
|
|
||||||
|
|
||||||
if (info.GetArg(1).StartsWith("@"))
|
if (info.GetArg(1).StartsWith("@"))
|
||||||
{
|
{
|
||||||
@@ -173,14 +160,18 @@ public partial class CS2_SimpleAdmin
|
|||||||
|
|
||||||
if (activeMutes.Count > 0)
|
if (activeMutes.Count > 0)
|
||||||
{
|
{
|
||||||
|
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager();
|
||||||
foreach (var mute in activeMutes)
|
foreach (var mute in activeMutes)
|
||||||
{
|
{
|
||||||
string muteType = mute.type;
|
string muteType = mute.type;
|
||||||
|
|
||||||
if (muteType == "GAG")
|
if (muteType == "GAG")
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
if (playerInfo.Slot.HasValue && !gaggedPlayers.Contains(playerInfo.Slot.Value))
|
if (playerInfo.Slot.HasValue && !gaggedPlayers.Contains(playerInfo.Slot.Value))
|
||||||
gaggedPlayers.Add(playerInfo.Slot.Value);
|
gaggedPlayers.Add(playerInfo.Slot.Value);
|
||||||
|
*/
|
||||||
|
playerPenaltyManager.AddPenalty(1, PenaltyType.Gag, DateTime.Parse(mute.ends), mute.duration);
|
||||||
|
|
||||||
if (TagsDetected)
|
if (TagsDetected)
|
||||||
{
|
{
|
||||||
@@ -192,16 +183,16 @@ public partial class CS2_SimpleAdmin
|
|||||||
}
|
}
|
||||||
else if (muteType == "MUTE")
|
else if (muteType == "MUTE")
|
||||||
{
|
{
|
||||||
Server.NextFrame(() =>
|
playerPenaltyManager.AddPenalty(1, PenaltyType.Mute, DateTime.Parse(mute.ends), mute.duration);
|
||||||
{
|
|
||||||
if (player.IsValid)
|
|
||||||
player.VoiceFlags = VoiceFlags.Muted;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (playerInfo.Slot.HasValue && !gaggedPlayers.Contains(playerInfo.Slot.Value))
|
/*
|
||||||
|
* if (playerInfo.Slot.HasValue && !gaggedPlayers.Contains(playerInfo.Slot.Value))
|
||||||
gaggedPlayers.Add(playerInfo.Slot.Value);
|
gaggedPlayers.Add(playerInfo.Slot.Value);
|
||||||
|
*/
|
||||||
|
playerPenaltyManager.AddPenalty(1, PenaltyType.Silence, DateTime.Parse(mute.ends), mute.duration);
|
||||||
|
|
||||||
Server.NextFrame(() =>
|
Server.NextFrame(() =>
|
||||||
{
|
{
|
||||||
@@ -211,10 +202,8 @@ public partial class CS2_SimpleAdmin
|
|||||||
{
|
{
|
||||||
Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}");
|
Server.ExecuteCommand($"css_tag_mute {playerInfo.SteamId}");
|
||||||
}
|
}
|
||||||
player.VoiceFlags = VoiceFlags.Muted;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -241,7 +230,9 @@ public partial class CS2_SimpleAdmin
|
|||||||
Logger.LogCritical("[OnClientDisconnect] After Check");
|
Logger.LogCritical("[OnClientDisconnect] After Check");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
RemoveFromConcurrentBag(gaggedPlayers, player.Slot);
|
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager();
|
||||||
|
playerPenaltyManager.RemoveAllPenalties(player.Slot);
|
||||||
|
//RemoveFromConcurrentBag(gaggedPlayers, player.Slot);
|
||||||
RemoveFromConcurrentBag(silentPlayers, player.Slot);
|
RemoveFromConcurrentBag(silentPlayers, player.Slot);
|
||||||
RemoveFromConcurrentBag(godPlayers, player.Slot);
|
RemoveFromConcurrentBag(godPlayers, player.Slot);
|
||||||
|
|
||||||
@@ -253,33 +244,70 @@ public partial class CS2_SimpleAdmin
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (TagsDetected)
|
if (TagsDetected)
|
||||||
NativeAPI.IssueServerCommand($"css_tag_unmute {player.SteamID}");
|
Server.ExecuteCommand($"css_tag_unmute {player.SteamID}");
|
||||||
|
|
||||||
return HookResult.Continue;
|
return HookResult.Continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnMapStart(string mapName)
|
private void OnMapStart(string mapName)
|
||||||
{
|
{
|
||||||
gaggedPlayers.Clear();
|
Random random = new Random();
|
||||||
|
//gaggedPlayers.Clear();
|
||||||
godPlayers.Clear();
|
godPlayers.Clear();
|
||||||
silentPlayers.Clear();
|
silentPlayers.Clear();
|
||||||
|
|
||||||
|
PlayerPenaltyManager playerPenaltyManager = new PlayerPenaltyManager();
|
||||||
|
playerPenaltyManager.RemoveAllPenalties();
|
||||||
|
|
||||||
_database = new(dbConnectionString);
|
_database = new(dbConnectionString);
|
||||||
|
|
||||||
if (_database == null) return;
|
if (_database == null) return;
|
||||||
|
|
||||||
AddTimer(60.0f, bannedPlayers.Clear, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
AddTimer(random.Next(60, 80), async () =>
|
||||||
AddTimer(130.0f, async () =>
|
|
||||||
{
|
{
|
||||||
|
#if DEBUG
|
||||||
|
Logger.LogCritical("[OnMapStart] Expired check");
|
||||||
|
#endif
|
||||||
AdminSQLManager _adminManager = new(_database);
|
AdminSQLManager _adminManager = new(_database);
|
||||||
BanManager _banManager = new(_database, Config);
|
BanManager _banManager = new(_database, Config);
|
||||||
MuteManager _muteManager = new(_database);
|
MuteManager _muteManager = new(_database);
|
||||||
await _banManager.ExpireOldBans();
|
await _banManager.ExpireOldBans();
|
||||||
await _muteManager.ExpireOldMutes();
|
await _muteManager.ExpireOldMutes();
|
||||||
await _adminManager.DeleteOldAdmins();
|
await _adminManager.DeleteOldAdmins();
|
||||||
#if DEBUG
|
|
||||||
Logger.LogCritical("[OnMapStart] Expired check");
|
bannedPlayers.Clear();
|
||||||
#endif
|
|
||||||
|
Server.NextFrame(() =>
|
||||||
|
{
|
||||||
|
foreach (CCSPlayerController player in Helper.GetValidPlayers())
|
||||||
|
{
|
||||||
|
if (playerPenaltyManager.IsSlotInPenalties(player.Slot))
|
||||||
|
{
|
||||||
|
if (!playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) && !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence))
|
||||||
|
player.VoiceFlags = VoiceFlags.Normal;
|
||||||
|
|
||||||
|
if (!playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag) && !playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence))
|
||||||
|
{
|
||||||
|
if (TagsDetected)
|
||||||
|
Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
!playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Silence) &&
|
||||||
|
!playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Mute) &&
|
||||||
|
!playerPenaltyManager.IsPenalized(player.Slot, PenaltyType.Gag)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
player.VoiceFlags = VoiceFlags.Normal;
|
||||||
|
|
||||||
|
if (TagsDetected)
|
||||||
|
Server.ExecuteCommand($"css_tag_unmute {player!.SteamID}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
playerPenaltyManager.RemoveExpiredPenalties();
|
||||||
|
|
||||||
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
|
||||||
|
|
||||||
|
|||||||
32
Helper.cs
32
Helper.cs
@@ -2,9 +2,12 @@
|
|||||||
using CounterStrikeSharp.API.Core;
|
using CounterStrikeSharp.API.Core;
|
||||||
using CounterStrikeSharp.API.Modules.Admin;
|
using CounterStrikeSharp.API.Modules.Admin;
|
||||||
using CounterStrikeSharp.API.Modules.Entities;
|
using CounterStrikeSharp.API.Modules.Entities;
|
||||||
|
using CounterStrikeSharp.API.Modules.Memory;
|
||||||
using CounterStrikeSharp.API.Modules.Menu;
|
using CounterStrikeSharp.API.Modules.Menu;
|
||||||
using CounterStrikeSharp.API.Modules.Utils;
|
using CounterStrikeSharp.API.Modules.Utils;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace CS2_SimpleAdmin
|
namespace CS2_SimpleAdmin
|
||||||
@@ -33,6 +36,12 @@ namespace CS2_SimpleAdmin
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<CCSPlayerController> GetValidPlayers()
|
||||||
|
{
|
||||||
|
return Utilities.GetPlayers().FindAll(p => p != null && p.IsValid && p.SteamID.ToString().Length == 17 && p.Connected == PlayerConnectedState.PlayerConnected && !p.IsBot && !p.IsHLTV);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static bool IsValidSteamID64(string input)
|
public static bool IsValidSteamID64(string input)
|
||||||
{
|
{
|
||||||
string pattern = @"^\d{17}$";
|
string pattern = @"^\d{17}$";
|
||||||
@@ -154,4 +163,27 @@ namespace CS2_SimpleAdmin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class SchemaString<SchemaClass> : NativeObject where SchemaClass : NativeObject
|
||||||
|
{
|
||||||
|
public SchemaString(SchemaClass instance, string member) : base(Schema.GetSchemaValue<nint>(instance.Handle, typeof(SchemaClass).Name!, member))
|
||||||
|
{ }
|
||||||
|
|
||||||
|
public unsafe void Set(string str)
|
||||||
|
{
|
||||||
|
byte[] bytes = this.GetStringBytes(str);
|
||||||
|
|
||||||
|
for (int i = 0; i < bytes.Length; i++)
|
||||||
|
{
|
||||||
|
Unsafe.Write((void*)(this.Handle.ToInt64() + i), bytes[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Unsafe.Write((void*)(this.Handle.ToInt64() + bytes.Length), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] GetStringBytes(string str)
|
||||||
|
{
|
||||||
|
return Encoding.ASCII.GetBytes(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -25,6 +25,8 @@ namespace CS2_SimpleAdmin
|
|||||||
string muteType = "GAG";
|
string muteType = "GAG";
|
||||||
if (type == 1)
|
if (type == 1)
|
||||||
muteType = "MUTE";
|
muteType = "MUTE";
|
||||||
|
else if (type == 2)
|
||||||
|
muteType = "SILENCE";
|
||||||
|
|
||||||
var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`, `server_id`) " +
|
var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `player_name`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`, `server_id`) " +
|
||||||
"VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @type, @serverid)";
|
"VALUES (@playerSteamid, @playerName, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @type, @serverid)";
|
||||||
@@ -56,6 +58,8 @@ namespace CS2_SimpleAdmin
|
|||||||
string muteType = "GAG";
|
string muteType = "GAG";
|
||||||
if (type == 1)
|
if (type == 1)
|
||||||
muteType = "MUTE";
|
muteType = "MUTE";
|
||||||
|
else if (type == 2)
|
||||||
|
muteType = "SILENCE";
|
||||||
|
|
||||||
var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`, `server_id`) " +
|
var sql = "INSERT INTO `sa_mutes` (`player_steamid`, `admin_steamid`, `admin_name`, `reason`, `duration`, `ends`, `created`, `type`, `server_id`) " +
|
||||||
"VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @type, @serverid)";
|
"VALUES (@playerSteamid, @adminSteamid, @adminName, @banReason, @duration, @ends, @created, @type, @serverid)";
|
||||||
@@ -136,6 +140,8 @@ namespace CS2_SimpleAdmin
|
|||||||
{
|
{
|
||||||
muteType = "MUTE";
|
muteType = "MUTE";
|
||||||
}
|
}
|
||||||
|
else if (type == 2)
|
||||||
|
muteType = "SILENCE";
|
||||||
|
|
||||||
string sqlUnban = "UPDATE sa_mutes SET status = 'UNMUTED' WHERE (player_steamid = @pattern OR player_name = @pattern) AND type = @muteType AND status = 'ACTIVE'";
|
string sqlUnban = "UPDATE sa_mutes SET status = 'UNMUTED' WHERE (player_steamid = @pattern OR player_name = @pattern) AND type = @muteType AND status = 'ACTIVE'";
|
||||||
await connection.ExecuteAsync(sqlUnban, new { pattern = playerPattern, muteType });
|
await connection.ExecuteAsync(sqlUnban, new { pattern = playerPattern, muteType });
|
||||||
@@ -174,11 +180,6 @@ namespace CS2_SimpleAdmin
|
|||||||
|
|
||||||
if (muteType == "GAG")
|
if (muteType == "GAG")
|
||||||
{
|
{
|
||||||
if (player.Slot.HasValue && !CS2_SimpleAdmin.gaggedPlayers.Contains(player.Slot.Value))
|
|
||||||
{
|
|
||||||
CS2_SimpleAdmin.gaggedPlayers.Add(player.Slot.Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (CS2_SimpleAdmin.TagsDetected)
|
if (CS2_SimpleAdmin.TagsDetected)
|
||||||
NativeAPI.IssueServerCommand($"css_tag_mute {player!.SteamId}");
|
NativeAPI.IssueServerCommand($"css_tag_mute {player!.SteamId}");
|
||||||
|
|
||||||
|
|||||||
139
PlayerPenaltyManager.cs
Normal file
139
PlayerPenaltyManager.cs
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
using System.Collections.Concurrent;
|
||||||
|
|
||||||
|
namespace CS2_SimpleAdmin
|
||||||
|
{
|
||||||
|
public enum PenaltyType
|
||||||
|
{
|
||||||
|
Mute,
|
||||||
|
Gag,
|
||||||
|
Silence
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PlayerPenaltyManager
|
||||||
|
{
|
||||||
|
private static ConcurrentDictionary<int, Dictionary<PenaltyType, List<(DateTime EndDateTime, int Duration)>>> penalties =
|
||||||
|
new ConcurrentDictionary<int, Dictionary<PenaltyType, List<(DateTime, int)>>>();
|
||||||
|
|
||||||
|
// Add a penalty for a player
|
||||||
|
public void AddPenalty(int slot, PenaltyType penaltyType, DateTime endDateTime, int durationSeconds)
|
||||||
|
{
|
||||||
|
if (!penalties.ContainsKey(slot))
|
||||||
|
{
|
||||||
|
penalties[slot] = new Dictionary<PenaltyType, List<(DateTime, int)>>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!penalties[slot].ContainsKey(penaltyType))
|
||||||
|
{
|
||||||
|
penalties[slot][penaltyType] = new List<(DateTime, int)>();
|
||||||
|
}
|
||||||
|
|
||||||
|
penalties[slot][penaltyType].Add((endDateTime, durationSeconds));
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsPenalized(int slot, PenaltyType penaltyType)
|
||||||
|
{
|
||||||
|
//Console.WriteLine($"Checking penalties for player with slot {slot} and penalty type {penaltyType}");
|
||||||
|
|
||||||
|
if (penalties.TryGetValue(slot, out var penaltyDict) && penaltyDict.TryGetValue(penaltyType, out var penaltiesList))
|
||||||
|
{
|
||||||
|
//Console.WriteLine($"Found penalties for player with slot {slot} and penalty type {penaltyType}");
|
||||||
|
|
||||||
|
DateTime now = DateTime.Now;
|
||||||
|
|
||||||
|
// Check if any active penalties exist
|
||||||
|
foreach (var penalty in penaltiesList.ToList())
|
||||||
|
{
|
||||||
|
// Check if the penalty is still active
|
||||||
|
if (penalty.Duration > 0 && now >= penalty.EndDateTime.AddSeconds(penalty.Duration))
|
||||||
|
{
|
||||||
|
//Console.WriteLine($"Removing expired penalty for player with slot {slot} and penalty type {penaltyType}");
|
||||||
|
penaltiesList.Remove(penalty); // Remove expired penalty
|
||||||
|
if (penaltiesList.Count == 0)
|
||||||
|
{
|
||||||
|
//Console.WriteLine($"No more penalties of type {penaltyType} for player with slot {slot}. Removing penalty type.");
|
||||||
|
penaltyDict.Remove(penaltyType); // Remove penalty type if no more penalties exist
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (penalty.Duration == 0 || now < penalty.EndDateTime)
|
||||||
|
{
|
||||||
|
//Console.WriteLine($"Player with slot {slot} is penalized for type {penaltyType}");
|
||||||
|
// Return true if there's an active penalty
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return false if no active penalties are found
|
||||||
|
//Console.WriteLine($"Player with slot {slot} is not penalized for type {penaltyType}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return false if no penalties of the specified type were found for the player
|
||||||
|
//Console.WriteLine($"No penalties found for player with slot {slot} and penalty type {penaltyType}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the end datetime and duration of penalties for a player and penalty type
|
||||||
|
public List<(DateTime EndDateTime, int Duration)> GetPlayerPenalties(int slot, PenaltyType penaltyType)
|
||||||
|
{
|
||||||
|
if (penalties.TryGetValue(slot, out Dictionary<PenaltyType, List<(DateTime EndDateTime, int Duration)>>? penaltyDict) &&
|
||||||
|
penaltyDict.TryGetValue(penaltyType, out List<(DateTime EndDateTime, int Duration)>? penaltiesList) && penaltiesList != null)
|
||||||
|
{
|
||||||
|
return penaltiesList;
|
||||||
|
}
|
||||||
|
return new List<(DateTime EndDateTime, int Duration)>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsSlotInPenalties(int slot)
|
||||||
|
{
|
||||||
|
return penalties.ContainsKey(slot);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove all penalties for a player slot
|
||||||
|
public void RemoveAllPenalties(int slot)
|
||||||
|
{
|
||||||
|
if (penalties.ContainsKey(slot))
|
||||||
|
{
|
||||||
|
penalties.TryRemove(slot, out _);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove all penalties
|
||||||
|
public void RemoveAllPenalties()
|
||||||
|
{
|
||||||
|
penalties.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove all penalties of a selected type from a specific player
|
||||||
|
public void RemovePenaltiesByType(int slot, PenaltyType penaltyType)
|
||||||
|
{
|
||||||
|
if (penalties.TryGetValue(slot, out Dictionary<PenaltyType, List<(DateTime EndDateTime, int Duration)>>? penaltyDict) &&
|
||||||
|
penaltyDict.ContainsKey(penaltyType))
|
||||||
|
{
|
||||||
|
penaltyDict.Remove(penaltyType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove all expired penalties for all players and penalty types
|
||||||
|
public void RemoveExpiredPenalties()
|
||||||
|
{
|
||||||
|
DateTime now = DateTime.Now;
|
||||||
|
foreach (var kvp in penalties.ToList()) // Use ToList to avoid modification while iterating
|
||||||
|
{
|
||||||
|
var playerSlot = kvp.Key;
|
||||||
|
var penaltyDict = kvp.Value;
|
||||||
|
|
||||||
|
// Remove expired penalties for the player
|
||||||
|
foreach (var penaltiesList in penaltyDict.Values)
|
||||||
|
{
|
||||||
|
penaltiesList.RemoveAll(p => p.Duration > 0 && now >= p.EndDateTime.AddSeconds(p.Duration));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove player slot if no penalties left
|
||||||
|
if (penaltyDict.Count == 0)
|
||||||
|
{
|
||||||
|
penalties.TryRemove(playerSlot, out _);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -109,6 +109,31 @@ public static class PlayerUtils
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void Rename(this CCSPlayerController controller, string newName = "Unknown")
|
||||||
|
{
|
||||||
|
if (CS2_SimpleAdmin._plugin == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
SchemaString<CBasePlayerController> playerName = new SchemaString<CBasePlayerController>(controller, "m_iszPlayerName");
|
||||||
|
playerName.Set(newName + " ");
|
||||||
|
|
||||||
|
CS2_SimpleAdmin._plugin.AddTimer(0.25f, () =>
|
||||||
|
{
|
||||||
|
Utilities.SetStateChanged(controller, "CCSPlayerController", "m_szClan");
|
||||||
|
Utilities.SetStateChanged(controller, "CBasePlayerController", "m_iszPlayerName");
|
||||||
|
});
|
||||||
|
|
||||||
|
CS2_SimpleAdmin._plugin.AddTimer(0.3f, () =>
|
||||||
|
{
|
||||||
|
playerName.Set(newName);
|
||||||
|
});
|
||||||
|
|
||||||
|
CS2_SimpleAdmin._plugin.AddTimer(0.4f, () =>
|
||||||
|
{
|
||||||
|
Utilities.SetStateChanged(controller, "CBasePlayerController", "m_iszPlayerName");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private static void PerformSlap(CBasePlayerPawn pawn, int damage = 0)
|
private static void PerformSlap(CBasePlayerPawn pawn, int damage = 0)
|
||||||
{
|
{
|
||||||
if (pawn.LifeState != (int)LifeState_t.LIFE_ALIVE)
|
if (pawn.LifeState != (int)LifeState_t.LIFE_ALIVE)
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
"sa_player_gag_message_perm": "You have been gagged permanently for {lightred}{0}{default} by {lightred}{1}{default}!",
|
"sa_player_gag_message_perm": "You have been gagged permanently for {lightred}{0}{default} by {lightred}{1}{default}!",
|
||||||
"sa_player_mute_message_time": "You have been muted for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!",
|
"sa_player_mute_message_time": "You have been muted for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!",
|
||||||
"sa_player_mute_message_perm": "You have been muted permanently for {lightred}{0}{default} by {lightred}{1}{default}!",
|
"sa_player_mute_message_perm": "You have been muted permanently for {lightred}{0}{default} by {lightred}{1}{default}!",
|
||||||
|
"sa_player_silence_message_time": "You have been silenced for {lightred}{0}{default} for {lightred}{1}{default} minutes by {lightred}{2}{default}!",
|
||||||
|
"sa_player_silence_message_perm": "You have been silenced permanently for {lightred}{0}{default} by {lightred}{1}{default}!",
|
||||||
"sa_admin_ban_message_time": "Admin {lightred}{0}{default} banned {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!",
|
"sa_admin_ban_message_time": "Admin {lightred}{0}{default} banned {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!",
|
||||||
"sa_admin_ban_message_perm": "Admin {lightred}{0}{default} banned {lightred}{1}{default} permanently for {lightred}{2}{default}!",
|
"sa_admin_ban_message_perm": "Admin {lightred}{0}{default} banned {lightred}{1}{default} permanently for {lightred}{2}{default}!",
|
||||||
"sa_admin_kick_message": "Admin {lightred}{0}{default} kicked {lightred}{1}{default} for {lightred}{2}{default}!",
|
"sa_admin_kick_message": "Admin {lightred}{0}{default} kicked {lightred}{1}{default} for {lightred}{2}{default}!",
|
||||||
@@ -15,6 +17,8 @@
|
|||||||
"sa_admin_gag_message_perm": "Admin {lightred}{0}{default} gagged {lightred}{1}{default} permanently for {lightred}{2}{default}!",
|
"sa_admin_gag_message_perm": "Admin {lightred}{0}{default} gagged {lightred}{1}{default} permanently for {lightred}{2}{default}!",
|
||||||
"sa_admin_mute_message_time": "Admin {lightred}{0}{default} muted {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!",
|
"sa_admin_mute_message_time": "Admin {lightred}{0}{default} muted {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!",
|
||||||
"sa_admin_mute_message_perm": "Admin {lightred}{0}{default} muted {lightred}{1}{default} permanently for {lightred}{2}{default}!",
|
"sa_admin_mute_message_perm": "Admin {lightred}{0}{default} muted {lightred}{1}{default} permanently for {lightred}{2}{default}!",
|
||||||
|
"sa_admin_silence_message_time": "Admin {lightred}{0}{default} silenced {lightred}{1}{default} for {lightred}{2}{default} for {lightred}{3}{default} minutes!",
|
||||||
|
"sa_admin_silence_message_perm": "Admin {lightred}{0}{default} silenced {lightred}{1}{default} permanently for {lightred}{2}{default}!",
|
||||||
"sa_admin_give_message": "Admin {lightred}{0}{default} gave {lightred}{1}{default} a {lightred}{2}{default}!",
|
"sa_admin_give_message": "Admin {lightred}{0}{default} gave {lightred}{1}{default} a {lightred}{2}{default}!",
|
||||||
"sa_admin_strip_message": "Admin {lightred}{0}{default} took all of player {lightred}{1}{default} weapons!",
|
"sa_admin_strip_message": "Admin {lightred}{0}{default} took all of player {lightred}{1}{default} weapons!",
|
||||||
"sa_admin_hp_message": "Admin {lightred}{0}{default} changed {lightred}{1}{default} hp amount{default}!",
|
"sa_admin_hp_message": "Admin {lightred}{0}{default} changed {lightred}{1}{default} hp amount{default}!",
|
||||||
@@ -26,6 +30,7 @@
|
|||||||
"sa_admin_noclip_message": "Admin {lightred}{0}{default} toggled noclip for {lightred}{1}{default}!",
|
"sa_admin_noclip_message": "Admin {lightred}{0}{default} toggled noclip for {lightred}{1}{default}!",
|
||||||
"sa_admin_freeze_message": "Admin {lightred}{0}{default} freezed {lightred}{1}{default}!",
|
"sa_admin_freeze_message": "Admin {lightred}{0}{default} freezed {lightred}{1}{default}!",
|
||||||
"sa_admin_unfreeze_message": "Admin {lightred}{0}{default} umfreezed {lightred}{1}{default}!",
|
"sa_admin_unfreeze_message": "Admin {lightred}{0}{default} umfreezed {lightred}{1}{default}!",
|
||||||
|
"sa_admin_rename_message": "Admin {lightred}{0}{default} changed {lightred}{1}{default} nickname to {lightred}{2}{default}!",
|
||||||
"sa_admin_respawn_message": "Admin {lightred}{0}{default} respawned {lightred}{1}{default}!",
|
"sa_admin_respawn_message": "Admin {lightred}{0}{default} respawned {lightred}{1}{default}!",
|
||||||
"sa_admin_team_message": "Admin {lightred}{0}{default} transfered {lightred}{1}{default} to {lightred}{2}{default}!",
|
"sa_admin_team_message": "Admin {lightred}{0}{default} transfered {lightred}{1}{default} to {lightred}{2}{default}!",
|
||||||
"sa_admin_vote_menu_title": "{lime}VOTING FOR {gold}{0}",
|
"sa_admin_vote_menu_title": "{lime}VOTING FOR {gold}{0}",
|
||||||
|
|||||||
@@ -8,6 +8,8 @@
|
|||||||
"sa_player_gag_message_perm": "Zostałeś zakneblowany na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!",
|
"sa_player_gag_message_perm": "Zostałeś zakneblowany na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!",
|
||||||
"sa_player_mute_message_time": "Zostałeś uciszony za {lightred}{0}{default} na {lightred}{1}{default} minute przez {lightred}{2}{default}!",
|
"sa_player_mute_message_time": "Zostałeś uciszony za {lightred}{0}{default} na {lightred}{1}{default} minute przez {lightred}{2}{default}!",
|
||||||
"sa_player_mute_message_perm": "Zostałeś uciszony na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!",
|
"sa_player_mute_message_perm": "Zostałeś uciszony na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!",
|
||||||
|
"sa_player_silence_message_time": "Zostałeś wyciszony za {lightred}{0}{default} na {lightred}{1}{default} minut przez {lightred}{2}{default}!",
|
||||||
|
"sa_player_silence_message_perm": "Zostałeś wyciszony na zawsze za {lightred}{0}{default} przez {lightred}{1}{default}!",
|
||||||
"sa_admin_ban_message_time": "Admin {lightred}{0}{default} zbanował {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!",
|
"sa_admin_ban_message_time": "Admin {lightred}{0}{default} zbanował {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!",
|
||||||
"sa_admin_ban_message_perm": "Admin {lightred}{0}{default} zbanował {lightred}{1}{default} na zawsze za {lightred}{2}{default}!",
|
"sa_admin_ban_message_perm": "Admin {lightred}{0}{default} zbanował {lightred}{1}{default} na zawsze za {lightred}{2}{default}!",
|
||||||
"sa_admin_kick_message": "Admin {lightred}{0}{default} wyrzucił {lightred}{1}{default} za {lightred}{2}{default}!",
|
"sa_admin_kick_message": "Admin {lightred}{0}{default} wyrzucił {lightred}{1}{default} za {lightred}{2}{default}!",
|
||||||
@@ -15,6 +17,8 @@
|
|||||||
"sa_admin_gag_message_perm": "Admin {lightred}{0}{default} zakneblował {lightred}{1}{default} na zawsze za {lightred}{2}{default}!",
|
"sa_admin_gag_message_perm": "Admin {lightred}{0}{default} zakneblował {lightred}{1}{default} na zawsze za {lightred}{2}{default}!",
|
||||||
"sa_admin_mute_message_time": "Admin {lightred}{0}{default} uciszył {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!",
|
"sa_admin_mute_message_time": "Admin {lightred}{0}{default} uciszył {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!",
|
||||||
"sa_admin_mute_message_perm": "Admin {lightred}{0}{default} uciszył {lightred}{1}{default} na zawsze za {lightred}{2}{default}!",
|
"sa_admin_mute_message_perm": "Admin {lightred}{0}{default} uciszył {lightred}{1}{default} na zawsze za {lightred}{2}{default}!",
|
||||||
|
"sa_admin_silence_message_time": "Admin {lightred}{0}{default} wyciszył {lightred}{1}{default} za {lightred}{2}{default} na {lightred}{3}{default} minut!",
|
||||||
|
"sa_admin_silence_message_perm": "Admin {lightred}{0}{default} wyciszył {lightred}{1}{default} na zawsze za {lightred}{2}{default}!",
|
||||||
"sa_admin_give_message": "Admin {lightred}{0}{default} dał {lightred}{1}{default} przedmiot {lightred}{2}{default}!",
|
"sa_admin_give_message": "Admin {lightred}{0}{default} dał {lightred}{1}{default} przedmiot {lightred}{2}{default}!",
|
||||||
"sa_admin_strip_message": "Admin {lightred}{0}{default} zabrał wszystkie bronie {lightred}{1}{default}!",
|
"sa_admin_strip_message": "Admin {lightred}{0}{default} zabrał wszystkie bronie {lightred}{1}{default}!",
|
||||||
"sa_admin_hp_message": "Admin {lightred}{0}{default} zmienił ilość hp dla {lightred}{1}{default}!",
|
"sa_admin_hp_message": "Admin {lightred}{0}{default} zmienił ilość hp dla {lightred}{1}{default}!",
|
||||||
@@ -26,6 +30,7 @@
|
|||||||
"sa_admin_noclip_message": "Admin {lightred}{0}{default} ustawił latanie dla {lightred}{1}{default}!",
|
"sa_admin_noclip_message": "Admin {lightred}{0}{default} ustawił latanie dla {lightred}{1}{default}!",
|
||||||
"sa_admin_freeze_message": "Admin {lightred}{0}{default} zamroził {lightred}{1}{default}!",
|
"sa_admin_freeze_message": "Admin {lightred}{0}{default} zamroził {lightred}{1}{default}!",
|
||||||
"sa_admin_unfreeze_message": "Admin {lightred}{0}{default} odmroził {lightred}{1}{default}!",
|
"sa_admin_unfreeze_message": "Admin {lightred}{0}{default} odmroził {lightred}{1}{default}!",
|
||||||
|
"sa_admin_rename_message": "Admin {lightred}{0}{default} zmienił nick gracza {lightred}{1}{default} na {lightred}{2}{default}!",
|
||||||
"sa_admin_respawn_message": "Admin {lightred}{0}{default} odrodził {lightred}{1}{default}!",
|
"sa_admin_respawn_message": "Admin {lightred}{0}{default} odrodził {lightred}{1}{default}!",
|
||||||
"sa_admin_team_message": "Admin {lightred}{0}{default} przerzucił {lightred}{1}{default} do {lightred}{2}{default}!",
|
"sa_admin_team_message": "Admin {lightred}{0}{default} przerzucił {lightred}{1}{default} do {lightred}{2}{default}!",
|
||||||
"sa_admin_vote_menu_title": "{lime}GŁOSOWANIE NA {gold}{0}",
|
"sa_admin_vote_menu_title": "{lime}GŁOSOWANIE NA {gold}{0}",
|
||||||
|
|||||||
Reference in New Issue
Block a user