diff --git a/jRandomSkills - SRC Files/GlobalSuppressions.cs b/jRandomSkills - SRC Files/GlobalSuppressions.cs new file mode 100644 index 0000000..7c852b8 --- /dev/null +++ b/jRandomSkills - SRC Files/GlobalSuppressions.cs @@ -0,0 +1,12 @@ +// This file is used by Code Analysis to maintain SuppressMessage +// attributes that are applied to this project. +// Project-level suppressions either have no target or are given +// a specific target and scoped to a namespace, type, member, etc. + +using System.Diagnostics.CodeAnalysis; + +[assembly: SuppressMessage("Style", "IDE1006:Style nazewnictwa", Justification = "", Scope = "type", Target = "~T:src.jRandomSkills")] +[assembly: SuppressMessage("Performance", "CA1822:Oznaczaj elementy członkowskie jako statyczne", Justification = "", Scope = "member", Target = "~M:src.jRandomSkills.SkillAction(System.String,System.String,System.Object[])")] +[assembly: SuppressMessage("Performance", "CA1822:Oznaczaj elementy członkowskie jako statyczne", Justification = "", Scope = "member", Target = "~M:src.jRandomSkills.IsPlayerValid(CounterStrikeSharp.API.Core.CCSPlayerController)~System.Boolean")] +[assembly: SuppressMessage("Style", "IDE1006:Style nazewnictwa", Justification = "", Scope = "type", Target = "~T:src.jSkill_PlayerInfo")] +[assembly: SuppressMessage("Style", "IDE1006:Style nazewnictwa", Justification = "", Scope = "type", Target = "~T:src.jSkill_SkillInfo")] diff --git a/jRandomSkills - SRC Files/Properties/Resources.Designer.cs b/jRandomSkills - SRC Files/Properties/Resources.Designer.cs index 90c5831..d45662c 100644 --- a/jRandomSkills - SRC Files/Properties/Resources.Designer.cs +++ b/jRandomSkills - SRC Files/Properties/Resources.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace jRandomSkills.Properties { +namespace src.player.skills.Properties { using System; diff --git a/jRandomSkills - SRC Files/src/command/Command.cs b/jRandomSkills - SRC Files/src/command/Command.cs index 709aca4..1bfdd03 100644 --- a/jRandomSkills - SRC Files/src/command/Command.cs +++ b/jRandomSkills - SRC Files/src/command/Command.cs @@ -4,11 +4,13 @@ using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.utils; +using src.menu; +using src.player; +using src.utils; using System.Collections.Concurrent; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.command { public static class Command { @@ -24,7 +26,7 @@ namespace jRandomSkills lock (setLock) { - if (oldCommands.Count != 0) + if (!oldCommands.IsEmpty) { foreach (var command in oldCommands) Instance.RemoveCommand(command.Key, command.Value); @@ -119,7 +121,7 @@ namespace jRandomSkills } var skillName = command.ArgCount > 3 ? $"{command.GetArg(2)} {command.GetArg(3)}" : command.GetArg(2); - var skill = SkillData.Skills.FirstOrDefault(s => (player != null && player.GetSkillName(s.Skill).Equals(skillName, StringComparison.OrdinalIgnoreCase)) || s.Skill.ToString().Equals(skillName, StringComparison.OrdinalIgnoreCase)); + var skill = SkillData.Skills.FirstOrDefault(s => player != null && player.GetSkillName(s.Skill).Equals(skillName, StringComparison.OrdinalIgnoreCase) || s.Skill.ToString().Equals(skillName, StringComparison.OrdinalIgnoreCase)); if (skill == null) { @@ -281,7 +283,7 @@ namespace jRandomSkills private static void Shuffle() { - var players = Utilities.GetPlayers().FindAll(p => (Instance.IsPlayerValid(p) && new CsTeam[] { CsTeam.CounterTerrorist, CsTeam.Terrorist }.Contains(p.Team))); + var players = Utilities.GetPlayers().FindAll(p => Instance.IsPlayerValid(p) && new CsTeam[] { CsTeam.CounterTerrorist, CsTeam.Terrorist }.Contains(p.Team)); double CTlimit = Instance.Random.Next(0, 2) == 0 ? Math.Floor(players.Count / 2.0) : Math.Ceiling(players.Count / 2.0); foreach (var player in players.OrderBy(_ => Instance.Random.Next()).ToList()) @@ -394,7 +396,7 @@ namespace jRandomSkills } var skillName = command.ArgCount > 3 ? $"{command.GetArg(2)} {command.GetArg(3)}" : command.GetArg(2); - var skill = SkillData.Skills.FirstOrDefault(s => (player != null && player.GetSkillName(s.Skill).Equals(skillName, StringComparison.OrdinalIgnoreCase)) || s.Skill.ToString().Equals(skillName, StringComparison.OrdinalIgnoreCase)); + var skill = SkillData.Skills.FirstOrDefault(s => player != null && player.GetSkillName(s.Skill).Equals(skillName, StringComparison.OrdinalIgnoreCase) || s.Skill.ToString().Equals(skillName, StringComparison.OrdinalIgnoreCase)); if (skill == null) { @@ -458,7 +460,7 @@ namespace jRandomSkills if (player == null || !player.IsValid) return; if (!AdminManager.PlayerHasPermissions(player, config.NormalCommands.ChangeLanguageCommand.Permissions)) return; - string fileName = Config.LoadedConfig.LanguageSystem.DefaultLangCode; + string fileName; string newLangCode = command.GetArg(1).ToUpper(); foreach (var langInfo in Config.LoadedConfig.LanguageSystem.LanguageInfos) if (langInfo.IsoCodes.Contains(newLangCode)) @@ -481,7 +483,7 @@ namespace jRandomSkills Config.LoadConfig(); SkillsInfo.LoadSkillsInfo(); Localization.Load(); - Command.Load(); + Load(); foreach (var skill in SkillData.Skills) skill.Color = SkillsInfo.GetValue(skill.Skill, "color"); diff --git a/jRandomSkills - SRC Files/src/command/VoteSystem.cs b/jRandomSkills - SRC Files/src/command/VoteSystem.cs index c4aa232..fc8b944 100644 --- a/jRandomSkills - SRC Files/src/command/VoteSystem.cs +++ b/jRandomSkills - SRC Files/src/command/VoteSystem.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.utils; +using src.utils; using System.Collections.Concurrent; -namespace jRandomSkills +namespace src.command { public static class VoteSystem { diff --git a/jRandomSkills - SRC Files/src/jRandomSkills.cs b/jRandomSkills - SRC Files/src/jRandomSkills.cs index feb2be4..9e52685 100644 --- a/jRandomSkills - SRC Files/src/jRandomSkills.cs +++ b/jRandomSkills - SRC Files/src/jRandomSkills.cs @@ -2,20 +2,21 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Commands; using CounterStrikeSharp.API.Modules.Commands; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; +using src.command; +using src.player; +using src.utils; +using System.Collections.Concurrent; using System.Reflection; using WASDSharedAPI; -namespace jRandomSkills +namespace src { -#pragma warning disable IDE1006 // Style nazewnictwa public partial class jRandomSkills : BasePlugin -#pragma warning restore IDE1006 // Style nazewnictwa { - public static jRandomSkills Instance { get; private set; } - - public List SkillPlayer { get; } = []; +#pragma warning disable CS8618 + public static jRandomSkills Instance { get; private set; } +#pragma warning restore CS8618 + public ConcurrentBag SkillPlayer { get; set; } = []; public Random Random { get; } = new Random(); public CCSGameRules? GameRules { get; set; } public IWasdMenuManager? MenuManager; @@ -53,9 +54,7 @@ namespace jRandomSkills Debug.WriteToDebug($"Loaded: {skill.Skill}"); } -#pragma warning disable CA1822 // Oznaczaj elementy członkowskie jako statyczne internal void SkillAction(string skill, string methodName, object[]? param = null) -#pragma warning restore CA1822 // Oznaczaj elementy członkowskie jako statyczne { string className = $"jRandomSkills.{skill}"; Type? type = Type.GetType(className); @@ -86,9 +85,7 @@ namespace jRandomSkills CommandManager.RegisterCommand(definition); } -#pragma warning disable CA1822 // Oznaczaj elementy członkowskie jako statyczne internal bool IsPlayerValid(CCSPlayerController? player) -#pragma warning restore CA1822 // Oznaczaj elementy członkowskie jako statyczne { return player != null && player.IsValid && player.PlayerPawn?.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.LifeState == (byte)LifeState_t.LIFE_ALIVE; } @@ -97,9 +94,7 @@ namespace jRandomSkills public uint[] silentSoundEvents = [2551626319, 765706800, 765706800, 2860219006, 2162652424, 2551626319, 2162652424, 117596568, 117596568, 740474905, 1661204257, 3009312615, 1506215040, 115843229, 3299941720, 1016523349, 2684452812, 2067683805, 2067683805, 1016523349, 4160462271, 1543118744, 585390608, 3802757032, 2302139631, 2546391140, 144629619, 4152012084, 4113422219, 1627020521, 2899365092, 819435812, 3218103073, 961838155, 1535891875, 1826799645, 3460445620, 1818046345, 3666896632, 3099536373, 1440734007, 1409986305, 1939055066, 782454593, 4074593561, 1540837791, 3257325156]; } -#pragma warning disable IDE1006 public class jSkill_PlayerInfo -#pragma warning restore IDE1006 { public required ulong SteamID { get; set; } public required string PlayerName { get; set; } @@ -111,9 +106,7 @@ namespace jRandomSkills public string? PrintHTML { get; set; } } -#pragma warning disable IDE1006 public class jSkill_SkillInfo(Skills skill, string color, bool display) -#pragma warning restore IDE1006 { public Skills Skill { get; } = skill; public string Color { get; set; } = color; @@ -127,6 +120,6 @@ namespace jRandomSkills public static class SkillData { - public static List Skills { get; } = []; + public static ConcurrentBag Skills { get; } = []; } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/menu/Menu.cs b/jRandomSkills - SRC Files/src/menu/Menu.cs index 9955af7..02e1ad0 100644 --- a/jRandomSkills - SRC Files/src/menu/Menu.cs +++ b/jRandomSkills - SRC Files/src/menu/Menu.cs @@ -1,30 +1,28 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Menu; using CounterStrikeSharp.API.Modules.Utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Text.RegularExpressions; -using jRandomSkills.src.utils; +using src.utils; -namespace jRandomSkills +namespace src.menu { public static class Menu { public static void DisplaySkillsList(CCSPlayerController player) { - CenterHtmlMenu menu = new($"[ ★ {player.GetTranslation("skills_menu")} ★ ]"); + CenterHtmlMenu menu = new($"[ ★ {player.GetTranslation("skills_menu")} ★ ]", Instance); - for (int i = 0; i < SkillData.Skills.Count; i++) + foreach (var skillInfo in SkillData.Skills) { - var skill = SkillData.Skills[i]; - string skillName = $"{player.GetSkillName(skill.Skill)}"; + string skillName = $"{player.GetSkillName(skillInfo.Skill)}"; menu.AddMenuOption($" ★ {skillName}", (player, option) => { string selectedSkillName = option.Text; string pattern = "\\[/?color\\b[^\\]]*\\]"; string cleanSkillName = Regex.Replace(selectedSkillName, pattern, ""); string skillName = cleanSkillName.Replace($" ★ ", ""); - int intValue = Array.IndexOf(SkillData.Skills.Select(r => player.GetSkillName(r.Skill)).ToArray(), skillName); - string skillDesc = player.GetSkillDescription(SkillData.Skills[intValue].Skill); + string skillDesc = player.GetSkillDescription(skillInfo.Skill); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{skillName}{ChatColors.Lime}: {skillDesc}", false); MenuManager.CloseActiveMenu(player); }); diff --git a/jRandomSkills - SRC Files/src/player/Debug.cs b/jRandomSkills - SRC Files/src/player/Debug.cs index 1f84ebb..a6427b8 100644 --- a/jRandomSkills - SRC Files/src/player/Debug.cs +++ b/jRandomSkills - SRC Files/src/player/Debug.cs @@ -3,10 +3,11 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; +using src.utils; using static CounterStrikeSharp.API.Core.Listeners; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player { public static class Debug { @@ -15,12 +16,12 @@ namespace jRandomSkills public static void Load() { - Debug.sessionId = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}"; + sessionId = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}"; Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; if (player == null || !player.IsValid) return HookResult.Continue; - Debug.WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} joined the game."); + WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} joined the game."); return HookResult.Continue; }); @@ -28,7 +29,7 @@ namespace jRandomSkills { var player = @event.Userid; if (player == null || !player.IsValid) return HookResult.Continue; - Debug.WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} disconnected."); + WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} disconnected."); return HookResult.Continue; }); @@ -37,13 +38,13 @@ namespace jRandomSkills var teams = Utilities.FindAllEntitiesByDesignerName("cs_team_manager").Where(t => t != null).ToList(); var tTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.Terrorist); var ctTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.CounterTerrorist); - Debug.WriteToDebug($"Round #{tTeam?.Score + ctTeam?.Score + 1} (CT {ctTeam?.Score} : {tTeam?.Score} TT) started."); + WriteToDebug($"Round #{tTeam?.Score + ctTeam?.Score + 1} (CT {ctTeam?.Score} : {tTeam?.Score} TT) started."); return HookResult.Continue; }); Instance.RegisterEventHandler((@event, info) => { - Debug.WriteToDebug($"Freeze time ended."); + WriteToDebug($"Freeze time ended."); return HookResult.Continue; }); @@ -52,7 +53,7 @@ namespace jRandomSkills var teams = Utilities.FindAllEntitiesByDesignerName("cs_team_manager").Where(t => t != null).ToList(); var tTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.Terrorist); var ctTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.CounterTerrorist); - Debug.WriteToDebug($"Round #{tTeam?.Score + ctTeam?.Score} (CT {ctTeam?.Score} : {tTeam?.Score} TT) ended."); + WriteToDebug($"Round #{tTeam?.Score + ctTeam?.Score} (CT {ctTeam?.Score} : {tTeam?.Score} TT) ended."); return HookResult.Continue; }); @@ -63,35 +64,35 @@ namespace jRandomSkills if (victim != null) { if (attacker != null) - Debug.WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} died from {(attacker.IsBot ? "bot" : "player")} {attacker.PlayerName}."); + WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} died from {(attacker.IsBot ? "bot" : "player")} {attacker.PlayerName}."); else - Debug.WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} died."); + WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} died."); } return HookResult.Continue; }); Instance.RegisterEventHandler((@event, info) => { - Debug.WriteToDebug($"Bomb planted."); + WriteToDebug($"Bomb planted."); return HookResult.Continue; }); Instance.RegisterEventHandler((@event, info) => { - Debug.WriteToDebug($"Bomb defused."); + WriteToDebug($"Bomb defused."); return HookResult.Continue; }); - Instance.RegisterListener((string mapName) => + Instance.RegisterListener((mapName) => { - Debug.WriteToDebug($"Map changed: {mapName}."); + WriteToDebug($"Map changed: {mapName}."); }); Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; if (player == null || !player.IsValid) return HookResult.Continue; - Debug.WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} fired a shot."); + WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} fired a shot."); return HookResult.Continue; }); @@ -121,7 +122,7 @@ namespace jRandomSkills var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); if (playerInfo == null) return HookResult.Continue; - Debug.WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} took damage from {(attacker.IsBot ? "bot" : "player")} {attacker.PlayerName}."); + WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} took damage from {(attacker.IsBot ? "bot" : "player")} {attacker.PlayerName}."); return HookResult.Continue; } diff --git a/jRandomSkills - SRC Files/src/player/ISkill.cs b/jRandomSkills - SRC Files/src/player/ISkill.cs index 108cab3..cc5c5b6 100644 --- a/jRandomSkills - SRC Files/src/player/ISkill.cs +++ b/jRandomSkills - SRC Files/src/player/ISkill.cs @@ -3,7 +3,7 @@ using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.UserMessages; -namespace jRandomSkills.src.player; +namespace src.player; public interface ISkill { diff --git a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs index 3a36b78..37bac8f 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs @@ -6,32 +6,31 @@ using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; using static CounterStrikeSharp.API.Core.Listeners; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player { public static partial class Event { - public static DateTime freezeTimeEnd = DateTime.MinValue; - public static bool isTransmitRegistered = false; + private static DateTime freezeTimeEnd = DateTime.MinValue; + private static bool isTransmitRegistered = false; public static readonly jSkill_SkillInfo noneSkill = new(Skills.None, SkillsInfo.GetValue(Skills.None, "color"), false); private static jSkill_SkillInfo ctSkill = noneSkill; private static jSkill_SkillInfo tSkill = noneSkill; private static jSkill_SkillInfo allSkill = noneSkill; - private static List debugSkills = new(SkillData.Skills); + private static List debugSkills = [.. SkillData.Skills]; - public static readonly SkillsInfo.DefaultSkillInfo[] terroristSkills = SkillsInfo.LoadedConfig.Where(s => s.OnlyTeam == (int)CsTeam.Terrorist).ToArray(); - public static readonly SkillsInfo.DefaultSkillInfo[] counterterroristSkills = SkillsInfo.LoadedConfig.Where(s => s.OnlyTeam == (int)CsTeam.CounterTerrorist).ToArray(); - private static readonly SkillsInfo.DefaultSkillInfo[] allTeamsSkills = SkillsInfo.LoadedConfig.Where(s => s.OnlyTeam == 0).ToArray(); + public static readonly SkillsInfo.DefaultSkillInfo[] terroristSkills = [.. SkillsInfo.LoadedConfig.Where(s => s.OnlyTeam == (int)CsTeam.Terrorist)]; + public static readonly SkillsInfo.DefaultSkillInfo[] counterterroristSkills = [.. SkillsInfo.LoadedConfig.Where(s => s.OnlyTeam == (int)CsTeam.CounterTerrorist)]; + private static readonly SkillsInfo.DefaultSkillInfo[] allTeamsSkills = [.. SkillsInfo.LoadedConfig.Where(s => s.OnlyTeam == 0)]; - private static readonly ConcurrentDictionary> playersSkills = []; + private static readonly ConcurrentDictionary> playersSkills = []; public static readonly ConcurrentDictionary staticSkills = []; - private static readonly object setLock = new object(); + private static readonly object setLock = new(); public static void Load() { @@ -71,106 +70,145 @@ namespace jRandomSkills private static HookResult PlayerMakeSound(UserMessage um) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerMakeSound", [um]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerMakeSound", [um]); + return HookResult.Continue; + } } private static HookResult WeaponFire(EventWeaponFire @event, GameEventInfo info) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponFire", [@event]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponFire", [@event]); + return HookResult.Continue; + } } private static HookResult WeaponEquip(EventItemEquip @event, GameEventInfo info) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponEquip", [@event]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponEquip", [@event]); + return HookResult.Continue; + } } private static HookResult WeaponPickup(EventItemPickup @event, GameEventInfo info) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponPickup", [@event]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponPickup", [@event]); + return HookResult.Continue; + } } private static HookResult WeaponReload(EventWeaponReload @event, GameEventInfo info) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponReload", [@event]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponReload", [@event]); + return HookResult.Continue; + } } private static HookResult GrenadeThrown(EventGrenadeThrown @event, GameEventInfo info) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "GrenadeThrown", [@event]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "GrenadeThrown", [@event]); + return HookResult.Continue; + } } private static HookResult BombBeginplant(EventBombBeginplant @event, GameEventInfo info) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "BombBeginplant", [@event]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "BombBeginplant", [@event]); + return HookResult.Continue; + } } private static HookResult BombPlanted(EventBombPlanted @event, GameEventInfo info) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "BombPlanted", [@event]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "BombPlanted", [@event]); + return HookResult.Continue; + } } private static HookResult BombBegindefuse(EventBombBegindefuse @event, GameEventInfo info) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "BombBegindefuse", [@event]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "BombBegindefuse", [@event]); + return HookResult.Continue; + } } private static HookResult DecoyStarted(EventDecoyStarted @event, GameEventInfo info) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "DecoyStarted", [@event]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "DecoyStarted", [@event]); + return HookResult.Continue; + } } private static HookResult DecoyDetonate(EventDecoyDetonate @event, GameEventInfo info) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "DecoyDetonate", [@event]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "DecoyDetonate", [@event]); + return HookResult.Continue; + } } private static HookResult SmokegrenadeDetonate(EventSmokegrenadeDetonate @event, GameEventInfo info) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "SmokegrenadeDetonate", [@event]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "SmokegrenadeDetonate", [@event]); + return HookResult.Continue; + } } private static HookResult SmokegrenadeExpired(EventSmokegrenadeExpired @event, GameEventInfo info) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "SmokegrenadeExpired", [@event]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "SmokegrenadeExpired", [@event]); + return HookResult.Continue; + } } private static HookResult PlayerHurt(EventPlayerHurt @event, GameEventInfo info) @@ -186,139 +224,169 @@ namespace jRandomSkills private static HookResult PlayerJump(EventPlayerJump @event, GameEventInfo info) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerJump", [@event]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerJump", [@event]); + return HookResult.Continue; + } } private static HookResult PlayerBlind(EventPlayerBlind @event, GameEventInfo info) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerBlind", [@event]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerBlind", [@event]); + return HookResult.Continue; + } } private static HookResult OnTakeDamage(DynamicHook h) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "OnTakeDamage", [h]); - return HookResult.Continue; + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "OnTakeDamage", [h]); + return HookResult.Continue; + } } private static void OnTick() { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - if (SkillsInfo.GetValue(playerSkill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) - return; - else - Instance.SkillAction(playerSkill.Skill.ToString(), "OnTick"); + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + if (SkillsInfo.GetValue(playerSkill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) + return; + else + Instance.SkillAction(playerSkill.Skill.ToString(), "OnTick"); + } } private static HookResult PlayerConnectFull(EventPlayerConnectFull @event, GameEventInfo info) { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - - Instance.SkillPlayer.Add(new jSkill_PlayerInfo + lock (setLock) { - SteamID = player.SteamID, - PlayerName = player.PlayerName, - Skill = Skills.None, - SpecialSkill = Skills.None, - IsDrawing = false, - SkillChance = 1, - }); + var player = @event.Userid; + if (player == null || !player.IsValid) return HookResult.Continue; - string welcomeMsg = player.GetTranslation("welcome_message", "welcome"); - foreach (string line in welcomeMsg.Split("\n")) - player.PrintToChat($" {ChatColors.Green}" + line.Replace("{PLAYER}", $" {ChatColors.Red}{player.PlayerName}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) - .Replace("{SERVER_NAME}", $" {ChatColors.Red}{ConVar.Find("hostname")?.StringValue ?? "Default Server"}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) - .Replace("{VERSION}", $" {ChatColors.Red}v{Instance.ModuleVersion}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) - .Replace("{SKILLS_COUNT}", $" {ChatColors.Red}{SkillData.Skills.Count - 1}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) - .Replace("{AUTHOR1}", $" {ChatColors.Red}Jakub Bartosik (D3X){ChatColors.Green} ({ChatColors.Red}https://github.com/jakubbartosik/dRandomSkills{ChatColors.Green})", StringComparison.OrdinalIgnoreCase) - .Replace("{AUTHOR2}", $" {ChatColors.Red}Juzlus{ChatColors.Green} ({ChatColors.Red}https://github.com/Juzlus/jRandomSkills{ChatColors.Green})", StringComparison.OrdinalIgnoreCase)); - return HookResult.Continue; + Instance.SkillPlayer.Add(new jSkill_PlayerInfo + { + SteamID = player.SteamID, + PlayerName = player.PlayerName, + Skill = Skills.None, + SpecialSkill = Skills.None, + IsDrawing = false, + SkillChance = 1, + }); + + string welcomeMsg = player.GetTranslation("welcome_message", "welcome"); + foreach (string line in welcomeMsg.Split("\n")) + player.PrintToChat($" {ChatColors.Green}" + line.Replace("{PLAYER}", $" {ChatColors.Red}{player.PlayerName}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) + .Replace("{SERVER_NAME}", $" {ChatColors.Red}{ConVar.Find("hostname")?.StringValue ?? "Default Server"}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) + .Replace("{VERSION}", $" {ChatColors.Red}v{Instance.ModuleVersion}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) + .Replace("{SKILLS_COUNT}", $" {ChatColors.Red}{SkillData.Skills.Count - 1}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) + .Replace("{AUTHOR1}", $" {ChatColors.Red}Jakub Bartosik (D3X){ChatColors.Green} ({ChatColors.Red}https://github.com/jakubbartosik/dRandomSkills{ChatColors.Green})", StringComparison.OrdinalIgnoreCase) + .Replace("{AUTHOR2}", $" {ChatColors.Red}Juzlus{ChatColors.Green} ({ChatColors.Red}https://github.com/Juzlus/jRandomSkills{ChatColors.Green})", StringComparison.OrdinalIgnoreCase)); + return HookResult.Continue; + } } private static HookResult PlayerDisconnect(EventPlayerDisconnect @event, GameEventInfo info) { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; + lock (setLock) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return HookResult.Continue; - var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (skillPlayer != null) - Instance.SkillPlayer.Remove(skillPlayer); - return HookResult.Continue; + var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (skillPlayer == null) return HookResult.Continue; + + var items = Instance.SkillPlayer.ToList(); + Instance.SkillPlayer = [.. items.Where(p => p.SteamID != skillPlayer.SteamID)]; + + return HookResult.Continue; + } } private static HookResult RoundStart(EventRoundStart @event, GameEventInfo info) { - isTransmitRegistered = false; - Instance.AddTimer(.1f, () => DisableAll()); - foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) + lock (setLock) { - var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (skillPlayer == null) continue; - skillPlayer.IsDrawing = true; - skillPlayer.PrintHTML = null; - } + isTransmitRegistered = false; + Instance.AddTimer(.1f, () => DisableAll()); + foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) + { + var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (skillPlayer == null) continue; + skillPlayer.IsDrawing = true; + skillPlayer.PrintHTML = null; + } - Instance.RemoveListener(CheckTransmit); - int freezetime = ConVar.Find("mp_freezetime")?.GetPrimitiveValue() ?? 0; - freezeTimeEnd = DateTime.Now.AddSeconds(freezetime + (Instance?.GameRules?.TeamIntroPeriod == true ? 7 : 0)); - Instance?.AddTimer((Instance?.GameRules?.TeamIntroPeriod == true ? 7 : 0) + Math.Max(freezetime - Config.LoadedConfig.SkillTimeBeforeStart, 0) + .3f, SetSkill); - return HookResult.Continue; + Instance.RemoveListener(CheckTransmit); + int freezetime = ConVar.Find("mp_freezetime")?.GetPrimitiveValue() ?? 0; + freezeTimeEnd = DateTime.Now.AddSeconds(freezetime + (Instance?.GameRules?.TeamIntroPeriod == true ? 7 : 0)); + Instance?.AddTimer((Instance?.GameRules?.TeamIntroPeriod == true ? 7 : 0) + Math.Max(freezetime - Config.LoadedConfig.SkillTimeBeforeStart, 0) + .3f, SetSkill); + return HookResult.Continue; + } } private static void DisableAll() { - foreach (var player in Utilities.GetPlayers().Where(p => !p.IsBot)) + lock (setLock) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo == null) return; - Instance.SkillAction(playerInfo.Skill.ToString(), "DisableSkill", [player]); - Instance.SkillAction(playerInfo.Skill.ToString(), "NewRound"); + foreach (var player in Utilities.GetPlayers().Where(p => !p.IsBot)) + { + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; + Instance.SkillAction(playerInfo.Skill.ToString(), "DisableSkill", [player]); + Instance.SkillAction(playerInfo.Skill.ToString(), "NewRound"); + } } } private static HookResult RoundEnd(EventRoundEnd @event, GameEventInfo info) { - foreach (var player in Utilities.GetPlayers()) + lock (setLock) { - Instance.AddTimer(0.5f, () => + foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid)) { - var _players = Utilities.GetPlayers().Where(p => p.IsValid).OrderBy(p => p.Team); - - string skillsText = ""; - foreach (var _player in _players) + Instance.AddTimer(.5f, () => { - var _playerSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == _player.SteamID); - if (_playerSkill != null) + var _players = Utilities.GetPlayers().Where(p => p.IsValid && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist).OrderBy(p => p.Team); + + string skillsText = ""; + foreach (var _player in _players) { - var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == _playerSkill.Skill); - var specialSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == _playerSkill.SpecialSkill); - if (skillInfo == null) continue; - skillsText += $" {ChatColors.DarkRed}{_player.PlayerName}{ChatColors.Lime}: {(_playerSkill.SpecialSkill == Skills.None || specialSkillInfo == null ? player.GetSkillName(skillInfo.Skill, _playerSkill.SkillChance) : $"{player.GetSkillName(specialSkillInfo.Skill)} -> {player.GetSkillName(skillInfo.Skill, _playerSkill.SkillChance)}")}\n"; + var _playerSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == _player.SteamID); + if (_playerSkill != null) + { + var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == _playerSkill.Skill); + var specialSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == _playerSkill.SpecialSkill); + if (skillInfo == null) continue; + skillsText += $" {ChatColors.DarkRed}{_player.PlayerName}{ChatColors.Lime}: {(_playerSkill.SpecialSkill == Skills.None || specialSkillInfo == null ? player.GetSkillName(skillInfo.Skill, _playerSkill.SkillChance) : $"{player.GetSkillName(specialSkillInfo.Skill)} -> {player.GetSkillName(skillInfo.Skill, _playerSkill.SkillChance)}")}\n"; + } } - } - if (Config.LoadedConfig.SummaryAfterTheRound && !string.IsNullOrEmpty(skillsText)) - { - player.PrintToChat(" "); - player.PrintToChat($" {ChatColors.Lime}{player.GetTranslation("summary_start")}"); - foreach (string text in skillsText.Split("\n")) - if (!string.IsNullOrEmpty(text)) - player.PrintToChat(text); - player.PrintToChat($" {ChatColors.Lime}{player.GetTranslation("summary_end")}"); - player.PrintToChat(" \n"); - } - }); + if (Config.LoadedConfig.SummaryAfterTheRound && !string.IsNullOrEmpty(skillsText)) + { + player.PrintToChat(" "); + player.PrintToChat($" {ChatColors.Lime}{player.GetTranslation("summary_start")}"); + foreach (string text in skillsText.Split("\n")) + if (!string.IsNullOrEmpty(text)) + player.PrintToChat(text); + player.PrintToChat($" {ChatColors.Lime}{player.GetTranslation("summary_end")}"); + player.PrintToChat(" \n"); + } + }); + } + return HookResult.Continue; } - return HookResult.Continue; } private static HookResult PlayerDeath(EventPlayerDeath @event, GameEventInfo info) @@ -358,77 +426,209 @@ namespace jRandomSkills private static void CheckUseSkill(CCSPlayerController player, PlayerButtons pressed, PlayerButtons released) { - string? button = Config.LoadedConfig.AlternativeSkillButton; - if (string.IsNullOrEmpty(button)) return; - - if (Enum.TryParse(button, out var skillButton)) + lock (setLock) { - if (pressed != skillButton) return; - } else return; + string? button = Config.LoadedConfig.AlternativeSkillButton; + if (string.IsNullOrEmpty(button)) return; - if (player == null) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo == null || playerInfo.IsDrawing) return; + if (Enum.TryParse(button, out var skillButton)) + { + if (pressed != skillButton) return; + } + else return; - if (SkillsInfo.GetValue(playerInfo.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) - return; + if (player == null) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null || playerInfo.IsDrawing) return; - var playerPawn = player.PlayerPawn.Value; - if (playerPawn?.CBodyComponent == null) return; - if (!player.IsValid || !player.PawnIsAlive) return; + if (SkillsInfo.GetValue(playerInfo.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) + return; - Debug.WriteToDebug($"Player {player.PlayerName} used the skill: {playerInfo.Skill} by PlayerButtons: {pressed}"); - Instance.SkillAction(playerInfo.Skill.ToString(), "UseSkill", [player]); + var playerPawn = player.PlayerPawn.Value; + if (playerPawn?.CBodyComponent == null) return; + if (!player.IsValid || !player.PawnIsAlive) return; + + Debug.WriteToDebug($"Player {player.PlayerName} used the skill: {playerInfo.Skill} by PlayerButtons: {pressed}"); + Instance.SkillAction(playerInfo.Skill.ToString(), "UseSkill", [player]); + } } private static void EntitySpawned(CEntityInstance entity) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "OnEntitySpawned", [entity]); + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "OnEntitySpawned", [entity]); + } } private static void SetSkill() { - var validPlayers = Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p .Team is CsTeam.CounterTerrorist or CsTeam.Terrorist).ToList(); - - if (Config.LoadedConfig.GameMode == (int)Config.GameModes.TeamSkills) + lock (setLock) { - List tSkills = new(SkillData.Skills); - tSkills.RemoveAll(s => s.Skill == tSkill.Skill || s.Skill == Skills.None || counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - tSkill = tSkills.Count == 0 ? noneSkill : tSkills[Instance.Random.Next(tSkills.Count)]; + var validPlayers = Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist).ToList(); - List ctSkills = new(SkillData.Skills); - ctSkills.RemoveAll(s => s.Skill == ctSkill.Skill || s.Skill == Skills.None || terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - ctSkill = ctSkills.Count == 0 ? noneSkill : ctSkills[Instance.Random.Next(ctSkills.Count)]; + if (Config.LoadedConfig.GameMode == (int)Config.GameModes.TeamSkills) + { + List tSkills = [.. SkillData.Skills]; + tSkills.RemoveAll(s => s.Skill == tSkill.Skill || s.Skill == Skills.None || counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); + tSkill = tSkills.Count == 0 ? noneSkill : tSkills[Instance.Random.Next(tSkills.Count)]; + + List ctSkills = [.. SkillData.Skills]; + ctSkills.RemoveAll(s => s.Skill == ctSkill.Skill || s.Skill == Skills.None || terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); + ctSkill = ctSkills.Count == 0 ? noneSkill : ctSkills[Instance.Random.Next(ctSkills.Count)]; + } + else if (Config.LoadedConfig.GameMode == (int)Config.GameModes.SameSkills) + { + List allSkills = [.. SkillData.Skills]; + allSkills.RemoveAll(s => s.Skill == allSkill.Skill || s.Skill == Skills.None || !allTeamsSkills.Any(s2 => s2.Name == s.Skill.ToString())); + allSkill = allSkills.Count == 0 ? noneSkill : allSkills[Instance.Random.Next(allSkills.Count)]; + } + else if (Config.LoadedConfig.GameMode == (int)Config.GameModes.Debug && debugSkills.Count == 0) + debugSkills = [.. SkillData.Skills]; + + foreach (var player in validPlayers) + { + if (player == null) continue; + var teammates = validPlayers.Where(p => p.Team == player.Team && p != player); + string teammateSkills = ""; + + var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (skillPlayer == null) continue; + + if (player.PlayerPawn.Value == null || !player.PlayerPawn.IsValid) + { + skillPlayer.Skill = Skills.None; + continue; + } + + skillPlayer.IsDrawing = false; + jSkill_SkillInfo randomSkill = noneSkill; + + if (Instance?.GameRules != null && Instance?.GameRules.WarmupPeriod == false) + { + Config.GameModes gameMode = (Config.GameModes)Config.LoadedConfig.GameMode; + if (staticSkills.TryGetValue(player.SteamID, out var staticSkill)) + randomSkill = staticSkill; + else if (gameMode == Config.GameModes.Normal || gameMode == Config.GameModes.NoRepeat) + { + List skillList = [.. SkillData.Skills]; + skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None); + + if (validPlayers.Count(p => p.Team == player.Team) == 1) + { + SkillsInfo.DefaultSkillInfo[] skillsNeedsTeammates = [.. SkillsInfo.LoadedConfig.Where(s => s.NeedsTeammates)]; + skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString())); + } + + if (player.Team == CsTeam.Terrorist) + skillList.RemoveAll(s => counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); + else + skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); + + if (gameMode == Config.GameModes.NoRepeat && playersSkills.TryGetValue(player.SteamID, out ConcurrentBag? skills)) + { + skillList.RemoveAll(s => skills.Any(s2 => s2.Skill == s.Skill)); + if (skillList.Count == 0) skills.Clear(); + } + + randomSkill = skillList.Count == 0 ? noneSkill : skillList[Instance.Random.Next(skillList.Count)]; + if (gameMode == Config.GameModes.NoRepeat) + { + if (playersSkills.TryGetValue(player.SteamID, out ConcurrentBag? value)) + value.Add(randomSkill); + else + playersSkills.TryAdd(player.SteamID, [randomSkill]); + } + } + else if (gameMode == Config.GameModes.TeamSkills) + randomSkill = player.Team == CsTeam.Terrorist ? tSkill : ctSkill; + else if (gameMode == Config.GameModes.SameSkills) + randomSkill = allSkill; + else if (gameMode == Config.GameModes.Debug) + { + if (debugSkills.Count == 0) + debugSkills = [.. SkillData.Skills]; + randomSkill = debugSkills[0]; + debugSkills.RemoveAt(0); + player.PrintToChat($"{SkillData.Skills.Count - debugSkills.Count}/{SkillData.Skills.Count}"); + } + } + + if (randomSkill.Display) + SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(randomSkill.Skill)}{ChatColors.Lime}: {player.GetSkillDescription(randomSkill.Skill)}", false); + + skillPlayer.Skill = randomSkill.Skill; + skillPlayer.SpecialSkill = Skills.None; + + if (SkillsInfo.GetValue(randomSkill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) + Instance?.AddTimer(Config.LoadedConfig.SkillTimeBeforeStart, () => + { + if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == randomSkill.Skill) == null) return; + Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]); + }); + else + Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]); + + Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{player.GetSkillName(randomSkill.Skill)}\"."); + skillPlayer.SkillDescriptionHudExpired = DateTime.Now.AddSeconds(Config.LoadedConfig.SkillDescriptionDuration); + + if (Config.LoadedConfig.TeamMateSkillInfo) + { + Instance?.AddTimer(.5f, () => + { + foreach (var teammate in teammates) + { + var teammateInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == teammate.SteamID); + if (teammateInfo != null && teammateInfo?.Skill != null) + { + var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == teammateInfo.Skill); + teammateSkills += $" {ChatColors.DarkRed}{teammate.PlayerName}{ChatColors.Lime}: {(skillInfo == null ? player.GetSkillName(Skills.None) : player.GetSkillName(skillInfo.Skill, teammateInfo.SkillChance))}\n"; + } + } + + if (!string.IsNullOrEmpty(teammateSkills)) + { + SkillUtils.PrintToChat(player, $" {ChatColors.Lime}{player.GetTranslation("teammate_skills")}:", false); + foreach (string text in teammateSkills.Split("\n")) + if (!string.IsNullOrEmpty(text)) + player.PrintToChat(text); + } + }); + } + } } - else if (Config.LoadedConfig.GameMode == (int)Config.GameModes.SameSkills) - { - List allSkills = new(SkillData.Skills); - allSkills.RemoveAll(s => s.Skill == allSkill.Skill || s.Skill == Skills.None || !allTeamsSkills.Any(s2 => s2.Name == s.Skill.ToString())); - allSkill = allSkills.Count == 0 ? noneSkill : allSkills[Instance.Random.Next(allSkills.Count)]; - } - else if (Config.LoadedConfig.GameMode == (int)Config.GameModes.Debug && debugSkills.Count == 0) - debugSkills = new(SkillData.Skills); + } - foreach (var player in validPlayers) + public static void SetRandomSkill(CCSPlayerController player) + { + lock (setLock) { - if (player == null) continue; - var teammates = validPlayers.Where(p => p.Team == player.Team && p != player); - string teammateSkills = ""; + var validPlayers = Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist).ToList(); + if (Config.LoadedConfig.GameMode == (int)Config.GameModes.TeamSkills) + { + List tSkills = [.. SkillData.Skills]; + tSkills.RemoveAll(s => s.Skill == tSkill.Skill || s.Skill == Skills.None || counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); + tSkill = tSkills.Count == 0 ? noneSkill : tSkills[0]; + + List ctSkills = [.. SkillData.Skills]; + ctSkills.RemoveAll(s => s.Skill == ctSkill.Skill || s.Skill == Skills.None || terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); + ctSkill = ctSkills.Count == 0 ? noneSkill : ctSkills[0]; + } + + if (player == null) return; var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (skillPlayer == null) continue; + if (skillPlayer == null) return; if (player.PlayerPawn.Value == null || !player.PlayerPawn.IsValid) { skillPlayer.Skill = Skills.None; - continue; + return; } - skillPlayer.IsDrawing = false; jSkill_SkillInfo randomSkill = noneSkill; - if (Instance?.GameRules != null && Instance?.GameRules.WarmupPeriod == false) { Config.GameModes gameMode = (Config.GameModes)Config.LoadedConfig.GameMode; @@ -436,12 +636,12 @@ namespace jRandomSkills randomSkill = staticSkill; else if (gameMode == Config.GameModes.Normal || gameMode == Config.GameModes.NoRepeat) { - List skillList = new(SkillData.Skills); + List skillList = [.. SkillData.Skills]; skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None); if (validPlayers.Count(p => p.Team == player.Team) == 1) { - SkillsInfo.DefaultSkillInfo[] skillsNeedsTeammates = SkillsInfo.LoadedConfig.Where(s => s.NeedsTeammates).ToArray(); + SkillsInfo.DefaultSkillInfo[] skillsNeedsTeammates = [.. SkillsInfo.LoadedConfig.Where(s => s.NeedsTeammates)]; skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString())); } @@ -450,7 +650,7 @@ namespace jRandomSkills else skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - if (gameMode == Config.GameModes.NoRepeat && playersSkills.TryGetValue(player.SteamID, out List? skills)) + if (gameMode == Config.GameModes.NoRepeat && playersSkills.TryGetValue(player.SteamID, out ConcurrentBag? skills)) { skillList.RemoveAll(s => skills.Any(s2 => s2.Skill == s.Skill)); if (skillList.Count == 0) skills.Clear(); @@ -459,7 +659,7 @@ namespace jRandomSkills randomSkill = skillList.Count == 0 ? noneSkill : skillList[Instance.Random.Next(skillList.Count)]; if (gameMode == Config.GameModes.NoRepeat) { - if (playersSkills.TryGetValue(player.SteamID, out List? value)) + if (playersSkills.TryGetValue(player.SteamID, out ConcurrentBag? value)) value.Add(randomSkill); else playersSkills.TryAdd(player.SteamID, [randomSkill]); @@ -467,16 +667,8 @@ namespace jRandomSkills } else if (gameMode == Config.GameModes.TeamSkills) randomSkill = player.Team == CsTeam.Terrorist ? tSkill : ctSkill; - else if (gameMode == Config.GameModes.SameSkills) - randomSkill = allSkill; else if (gameMode == Config.GameModes.Debug) - { - if (debugSkills.Count == 0) - debugSkills = new List(SkillData.Skills); - randomSkill = debugSkills[0]; - debugSkills.RemoveAt(0); - player.PrintToChat($"{SkillData.Skills.Count - debugSkills.Count}/{SkillData.Skills.Count}"); - } + return; } if (randomSkill.Display) @@ -488,152 +680,59 @@ namespace jRandomSkills if (SkillsInfo.GetValue(randomSkill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) Instance?.AddTimer(Config.LoadedConfig.SkillTimeBeforeStart, () => { if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == randomSkill.Skill) == null) return; - Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", new[] { player }); + Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]); }); else - Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", new[] { player }); + Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]); Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{player.GetSkillName(randomSkill.Skill)}\"."); skillPlayer.SkillDescriptionHudExpired = DateTime.Now.AddSeconds(Config.LoadedConfig.SkillDescriptionDuration); - - if (Config.LoadedConfig.TeamMateSkillInfo) - { - Instance?.AddTimer(.5f, () => - { - foreach (var teammate in teammates) - { - var teammateInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == teammate.SteamID); - if (teammateInfo != null && teammateInfo?.Skill != null) - { - var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == teammateInfo.Skill); - teammateSkills += $" {ChatColors.DarkRed}{teammate.PlayerName}{ChatColors.Lime}: {(skillInfo == null ? player.GetSkillName(Skills.None) : player.GetSkillName(skillInfo.Skill, teammateInfo.SkillChance))}\n"; - } - } - - if (!string.IsNullOrEmpty(teammateSkills)) - { - SkillUtils.PrintToChat(player, $" {ChatColors.Lime}{player.GetTranslation("teammate_skills")}:", false); - foreach (string text in teammateSkills.Split("\n")) - if (!string.IsNullOrEmpty(text)) - player.PrintToChat(text); - } - }); - } } } - public static void SetRandomSkill(CCSPlayerController player) - { - var validPlayers = Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist).ToList(); - - if (Config.LoadedConfig.GameMode == (int)Config.GameModes.TeamSkills) - { - List tSkills = new(SkillData.Skills); - tSkills.RemoveAll(s => s.Skill == tSkill.Skill || s.Skill == Skills.None || counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - tSkill = tSkills.Count == 0 ? noneSkill : tSkills[0]; - - List ctSkills = new(SkillData.Skills); - ctSkills.RemoveAll(s => s.Skill == ctSkill.Skill || s.Skill == Skills.None || terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - ctSkill = ctSkills.Count == 0 ? noneSkill : ctSkills[0]; - } - - if (player == null) return; - var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (skillPlayer == null) return; - - if (player.PlayerPawn.Value == null || !player.PlayerPawn.IsValid) - { - skillPlayer.Skill = Skills.None; - return; - } - - jSkill_SkillInfo randomSkill = noneSkill; - if (Instance?.GameRules != null && Instance?.GameRules.WarmupPeriod == false) - { - Config.GameModes gameMode = (Config.GameModes)Config.LoadedConfig.GameMode; - if (staticSkills.TryGetValue(player.SteamID, out var staticSkill)) - randomSkill = staticSkill; - else if (gameMode == Config.GameModes.Normal || gameMode == Config.GameModes.NoRepeat) - { - List skillList = new(SkillData.Skills); - skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None); - - if (validPlayers.Count(p => p.Team == player.Team) == 1) - { - SkillsInfo.DefaultSkillInfo[] skillsNeedsTeammates = SkillsInfo.LoadedConfig.Where(s => s.NeedsTeammates).ToArray(); - skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString())); - } - - if (player.Team == CsTeam.Terrorist) - skillList.RemoveAll(s => counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - else - skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - - if (gameMode == Config.GameModes.NoRepeat && playersSkills.TryGetValue(player.SteamID, out List? skills)) - { - skillList.RemoveAll(s => skills.Any(s2 => s2.Skill == s.Skill)); - if (skillList.Count == 0) skills.Clear(); - } - - randomSkill = skillList.Count == 0 ? noneSkill : skillList[Instance.Random.Next(skillList.Count)]; - if (gameMode == Config.GameModes.NoRepeat) - { - if (playersSkills.TryGetValue(player.SteamID, out List? value)) - value.Add(randomSkill); - else - playersSkills.TryAdd(player.SteamID, [randomSkill]); - } - } - else if (gameMode == Config.GameModes.TeamSkills) - randomSkill = player.Team == CsTeam.Terrorist ? tSkill : ctSkill; - else if (gameMode == Config.GameModes.Debug) - return; - } - - if (randomSkill.Display) - SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(randomSkill.Skill)}{ChatColors.Lime}: {player.GetSkillDescription(randomSkill.Skill)}", false); - - skillPlayer.Skill = randomSkill.Skill; - skillPlayer.SpecialSkill = Skills.None; - - if (SkillsInfo.GetValue(randomSkill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) - Instance?.AddTimer(Config.LoadedConfig.SkillTimeBeforeStart, () => { - if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == randomSkill.Skill) == null) return; - Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", new[] { player }); - }); - else - Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", new[] { player }); - - Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{player.GetSkillName(randomSkill.Skill)}\"."); - skillPlayer.SkillDescriptionHudExpired = DateTime.Now.AddSeconds(Config.LoadedConfig.SkillDescriptionDuration); - } - public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) { - foreach (var playerSkill in Instance.SkillPlayer) - if (!playerSkill.IsDrawing) - Instance.SkillAction(playerSkill.Skill.ToString(), "CheckTransmit", [infoList]); + lock (setLock) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "CheckTransmit", [infoList]); + } } public static void UpdateSkillHUD(CCSPlayerController? player, string? headerLine, string? centerLine, string? extraLine, bool isDescription) { - if (player == null || !player.IsValid) return; - var config = Config.LoadedConfig.HtmlHudCustomisation; - var emptySymbol = $" "; - var emptySymbol2 = $" "; + lock (setLock) + { + if (player == null || !player.IsValid) return; + var config = Config.LoadedConfig.HtmlHudCustomisation; + var emptySymbol = $" "; + var emptySymbol2 = $" "; - string infoLine = string.IsNullOrEmpty(headerLine) - ? "" - : $"{headerLine}:
"; + string infoLine = string.IsNullOrEmpty(headerLine) + ? "" + : $"{headerLine}:
"; - string skillLine = $"{emptySymbol2}{centerLine}{emptySymbol2}"; + string skillLine = $"{emptySymbol2}{centerLine}{emptySymbol2}"; - string remainingLine = string.IsNullOrWhiteSpace(extraLine) - ? "" - : $"
{emptySymbol}{extraLine}{emptySymbol}"; + string remainingLine = string.IsNullOrWhiteSpace(extraLine) + ? "" + : $"
{emptySymbol}{extraLine}{emptySymbol}"; - var hudContent = infoLine + skillLine + remainingLine; - player.PrintToCenterHtml(hudContent); + var hudContent = infoLine + skillLine + remainingLine; + player.PrintToCenterHtml(hudContent); + } } + + public static void EnableTransmit() + { + if (!isTransmitRegistered) + { + Instance?.RegisterListener(CheckTransmit); + isTransmitRegistered = true; + } + } + + public static DateTime GetFreezeTimeEnd() => freezeTimeEnd; } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs index c104ec8..1a3061d 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; +using src.utils; using static CounterStrikeSharp.API.Core.Listeners; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player { public static class PlayerOnTick { @@ -57,14 +56,14 @@ namespace jRandomSkills bool showDescirptionHUD = skillPlayer.SkillDescriptionHudExpired >= DateTime.Now; bool isDescription = true; - if (SkillData.Skills.Count == 0) + if (SkillData.Skills.IsEmpty) { infoLine = player.GetTranslation("your_skill"); skillLine = player.GetTranslation("none"); } else if (skillPlayer.IsDrawing) { - var randomSkill = SkillData.Skills[Instance.Random.Next(SkillData.Skills.Count)]; + var randomSkill = SkillData.Skills.ToArray()[Instance.Random.Next(SkillData.Skills.Count)]; infoLine = player.GetTranslation("drawing_skill"); skillLine = $"{player.GetSkillName(randomSkill.Skill)}"; } diff --git a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs index 7fb09d3..44c7f89 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs @@ -1,12 +1,12 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; using System.Runtime.InteropServices; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Aimbot : ISkill { @@ -42,11 +42,11 @@ namespace jRandomSkills if (playerInfo == null) return; if (attacker.PawnIsAlive) - { - IntPtr hitGroupPointer = Marshal.ReadIntPtr(param2.Handle, GameData.GetOffset("CTakeDamageInfo_HitGroup")); + { + nint hitGroupPointer = Marshal.ReadIntPtr(param2.Handle, GameData.GetOffset("CTakeDamageInfo_HitGroup")); if (hitGroupPointer != nint.Zero) { - IntPtr hitGroupOffset = Marshal.ReadIntPtr(hitGroupPointer, 16); + nint hitGroupOffset = Marshal.ReadIntPtr(hitGroupPointer, 16); if (hitGroupOffset != nint.Zero) { if (playerInfo.Skill == skillName) diff --git a/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs b/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs index bceddb5..7f9cc0c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; +using src.utils; using System.Collections.Concurrent; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Anomaly : ISkill { @@ -40,12 +39,12 @@ namespace jRandomSkills if (pawn != null && pawn.IsValid && pawn.AbsOrigin != null) { if (skillInfo.LastRotations == null || skillInfo.LastPositions == null) continue; - skillInfo.LastPositions.Add(new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z)); - skillInfo.LastRotations.Add(new QAngle(pawn.EyeAngles.X, pawn.EyeAngles.Y, pawn.EyeAngles.Z)); + skillInfo.LastPositions.Enqueue(new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z)); + skillInfo.LastRotations.Enqueue(new QAngle(pawn.EyeAngles.X, pawn.EyeAngles.Y, pawn.EyeAngles.Z)); if (skillInfo.LastRotations.Count > SkillsInfo.GetValue(skillName, "secondsInBack")) { - skillInfo.LastPositions.RemoveAt(0); - skillInfo.LastRotations.RemoveAt(0); + skillInfo.LastPositions.TryDequeue(out _); + skillInfo.LastRotations.TryDequeue(out _); } } } @@ -103,7 +102,7 @@ namespace jRandomSkills { skillInfo.CanUse = false; skillInfo.Cooldown = DateTime.Now; - if (skillInfo.LastRotations == null || skillInfo.LastRotations.Count == 0 || skillInfo.LastPositions == null || skillInfo.LastPositions.Count == 0) return; + if (skillInfo.LastRotations == null || skillInfo.LastRotations.IsEmpty || skillInfo.LastPositions == null || skillInfo.LastPositions.IsEmpty) return; Vector? lastPosition = skillInfo.LastPositions.FirstOrDefault(); QAngle? lastRotation = skillInfo.LastRotations.FirstOrDefault(); if (lastPosition != null && lastRotation != null) @@ -117,8 +116,8 @@ namespace jRandomSkills public ulong SteamID { get; set; } public bool CanUse { get; set; } public DateTime Cooldown { get; set; } - public List? LastPositions { get; set; } - public List? LastRotations { get; set; } + public ConcurrentQueue? LastPositions { get; set; } + public ConcurrentQueue? LastRotations { get; set; } } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a86eff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = true, bool needsTeammates = false, int secondsInBack = 5, float cooldown = 15) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs b/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs index 418fb20..77d97c3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class AntyFlash : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs b/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs index e6a3ea5..809d221 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs @@ -1,9 +1,9 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class AntyHead : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs index 0ecfffd..e5baad9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class AreaReaper : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Armored.cs b/jRandomSkills - SRC Files/src/player/skills/Armored.cs index c7ec373..c50ff98 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Armored.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Armored.cs @@ -1,11 +1,10 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Armored : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Assassin.cs b/jRandomSkills - SRC Files/src/player/skills/Assassin.cs index 2496648..d57ff24 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Assassin.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Assassin.cs @@ -1,9 +1,9 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Assassin : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs b/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs index 3effa63..289a32b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs @@ -1,11 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Astronaut : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs b/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs index e500f20..1126498 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Bankrupt : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs index 8a21e90..f94b2f8 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs @@ -2,11 +2,11 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Baseball : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Behind.cs b/jRandomSkills - SRC Files/src/player/skills/Behind.cs index d658b64..1bc86ae 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Behind.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Behind.cs @@ -1,10 +1,9 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Behind : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs b/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs index fdd5054..64f3642 100644 --- a/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs +++ b/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class BladeMaster : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs index 6e12bc0..48b2582 100644 --- a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs +++ b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class BunnyHop : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs index 54035a0..58899bc 100644 --- a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs +++ b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs @@ -3,16 +3,16 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class C4Camouflage : ISkill { private const Skills skillName = Skills.C4Camouflage; - private static readonly ConcurrentDictionary> invisibleEntities = []; + private static readonly ConcurrentDictionary> invisibleEntities = []; public static void LoadSkill() { @@ -73,7 +73,7 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - SkillUtils.EnableTransmit(); + Event.EnableTransmit(); if (player == null || !player.IsValid) return; var playerPawn = player.PlayerPawn.Value; diff --git a/jRandomSkills - SRC Files/src/player/skills/Catapult.cs b/jRandomSkills - SRC Files/src/player/skills/Catapult.cs index a0d24b6..ba294bf 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Catapult.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Catapult.cs @@ -1,10 +1,9 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Catapult : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs index ef7f1c2..ac07e70 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs @@ -2,12 +2,11 @@ using System.Drawing; using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; -using jRandomSkills.src.utils; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Chicken : ISkill { @@ -53,7 +52,7 @@ namespace jRandomSkills var playerPawn = player.PlayerPawn?.Value; if (playerPawn != null && playerPawn.IsValid) { - SkillUtils.EnableTransmit(); + Event.EnableTransmit(); playerPawn.VelocityModifier = 1.1f; playerPawn.Health = 50; diff --git a/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs b/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs index 3231113..aab8ddb 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class ChillOut : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Cutter.cs b/jRandomSkills - SRC Files/src/player/skills/Cutter.cs index 4a4ee5b..642f958 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Cutter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Cutter.cs @@ -1,9 +1,9 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Cutter : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs index 0feb39a..05f814a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Darkness : ISkill { @@ -53,7 +52,7 @@ namespace jRandomSkills if (playerInfo == null || playerInfo.Skill != skillName) continue; var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); - ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); + ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))]; SkillUtils.UpdateMenu(player, menuItems); } } @@ -94,7 +93,7 @@ namespace jRandomSkills var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { - ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); + ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))]; SkillUtils.CreateMenu(player, menuItems); } else @@ -116,42 +115,45 @@ namespace jRandomSkills var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return; - if (!defaultPostProcessings.ContainsKey(player)) - defaultPostProcessings.TryAdd(player, []); - - int i = 0; - foreach (var postProcessingVolume in pawn.CameraServices.PostProcessingVolumes) + lock (setLock) { - if (postProcessingVolume == null || postProcessingVolume.Value == null) - return; + if (!defaultPostProcessings.ContainsKey(player)) + defaultPostProcessings.TryAdd(player, []); + int i = 0; + foreach (var postProcessingVolume in pawn.CameraServices.PostProcessingVolumes) + { + if (postProcessingVolume == null || postProcessingVolume.Value == null) + return; + + if (dontCreateNew) + { + if (defaultPostProcessings.TryGetValue(player, out var defaultList) && i < defaultList.Count) + postProcessingVolume.Raw = defaultList[i].EntityHandle.Raw; + } + else + { + if (defaultPostProcessings.TryGetValue(player, out var defaultList)) + defaultList.Add(postProcessingVolume.Value); + + var postProcessing = Utilities.CreateEntityByName("post_processing_volume"); + if (postProcessing == null) return; + + var brightness = SkillsInfo.GetValue(skillName, "brightness"); + postProcessing.ExposureControl = true; + postProcessing.MaxExposure = brightness; + postProcessing.MinExposure = brightness; + + newPostProcessing.Add(postProcessing); + postProcessingVolume.Raw = postProcessing.EntityHandle.Raw; + } + i++; + } + + Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices"); if (dontCreateNew) - { - if (defaultPostProcessings.TryGetValue(player, out var defaultList) && i < defaultList.Count) - postProcessingVolume.Raw = defaultList[i].EntityHandle.Raw; - } - else - { - if (defaultPostProcessings.TryGetValue(player, out var defaultList)) - defaultList.Add(postProcessingVolume.Value); - - var postProcessing = Utilities.CreateEntityByName("post_processing_volume"); - if (postProcessing == null) return; - - var brightness = SkillsInfo.GetValue(skillName, "brightness"); - postProcessing.ExposureControl = true; - postProcessing.MaxExposure = brightness; - postProcessing.MinExposure = brightness; - - newPostProcessing.Add(postProcessing); - postProcessingVolume.Raw = postProcessing.EntityHandle.Raw; - } - i++; + defaultPostProcessings.TryRemove(player, out _); } - - Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices"); - if (dontCreateNew) - defaultPostProcessings.TryRemove(player, out _); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#383838", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, float brightness = .01f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/Dash.cs b/jRandomSkills - SRC Files/src/player/skills/Dash.cs index a5039bd..ba16891 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dash.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Dash : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs index 627c38a..0767708 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Deactivator : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs index 1d6501d..7f6c65a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs @@ -2,12 +2,11 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Deaf : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs b/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs index cb84648..050c5cb 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs @@ -1,10 +1,9 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Disarmament : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Distancer.cs b/jRandomSkills - SRC Files/src/player/skills/Distancer.cs index 5e4a516..0952edb 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Distancer.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Distancer.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; +using src.utils; using System.Collections.Concurrent; -namespace jRandomSkills +namespace src.player.skills { public class Distancer : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Dracula.cs b/jRandomSkills - SRC Files/src/player/skills/Dracula.cs index a49474e..38ff228 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dracula.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dracula.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Dracula : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs index 7242187..a902bdb 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Duplicator : ISkill { @@ -75,7 +74,7 @@ namespace jRandomSkills var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p != player && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { - List skills = []; + ConcurrentBag skills = []; ConcurrentBag<(string, string)> menuItems = []; foreach (var enemy in enemies) { @@ -138,12 +137,12 @@ namespace jRandomSkills SkillUtils.CloseMenu(player); if (SkillsInfo.GetValue(enemySkill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) - Instance?.AddTimer(Math.Max((float)(Event.freezeTimeEnd - DateTime.Now).TotalSeconds, 0), () => { + Instance?.AddTimer(Math.Max((float)(Event.GetFreezeTimeEnd() - DateTime.Now).TotalSeconds, 0), () => { if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == enemySkill) == null) return; - Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", new[] { player }); + Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", [player]); }); else - Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", new[] { player }); + Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", [player]); }); player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("duplicator_player_info", enemy.PlayerName)); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs b/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs index 389776c..a8fcc66 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs @@ -1,11 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Dwarf : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Earthquake.cs b/jRandomSkills - SRC Files/src/player/skills/Earthquake.cs index 1c682df..b9f2296 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Earthquake.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Earthquake.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Earthquake : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs index e5c4768..9fff467 100644 --- a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs +++ b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class EnemySpawn : ISkill { @@ -44,7 +43,7 @@ namespace jRandomSkills { SteamID = player.SteamID, CanUse = false, - Cooldown = cooldownBeforeUse <= 0 ? DateTime.MinValue : Event.freezeTimeEnd.AddSeconds(cooldownBeforeUse - SkillsInfo.GetValue(skillName, "cooldown")), + Cooldown = cooldownBeforeUse <= 0 ? DateTime.MinValue : Event.GetFreezeTimeEnd().AddSeconds(cooldownBeforeUse - SkillsInfo.GetValue(skillName, "cooldown")), }); } diff --git a/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs b/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs index 0030720..7596a2a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs @@ -2,12 +2,11 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; -namespace jRandomSkills +namespace src.player.skills { public class ExplosiveShot : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs b/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs index 59cc02e..1ae6f58 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs @@ -1,12 +1,12 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; using System.Drawing; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class FalconEye : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/FastReload.cs b/jRandomSkills - SRC Files/src/player/skills/FastReload.cs index 64edfdc..8bb9dde 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FastReload.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FastReload.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class FastReload : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Flash.cs b/jRandomSkills - SRC Files/src/player/skills/Flash.cs index 50c0583..f4c99e5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Flash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Flash.cs @@ -2,12 +2,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Flash : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs index 799360a..113b0e3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs @@ -2,13 +2,12 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; using static CounterStrikeSharp.API.Core.Listeners; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Fortnite : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs b/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs index a4db055..6a4acab 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs @@ -3,11 +3,10 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class FragileBomb : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs b/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs index c399433..5787e98 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class FriendlyFire : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs index 2719d45..7f27541 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs @@ -2,15 +2,16 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using System.Collections.Concurrent; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class FrozenDecoy : ISkill { private const Skills skillName = Skills.FrozenDecoy; - private static readonly List decoys = []; + private static readonly ConcurrentDictionary decoys = []; public static void LoadSkill() { @@ -28,7 +29,7 @@ namespace jRandomSkills if (player == null || !player.IsValid) return; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; - decoys.Add(new Vector(@event.X, @event.Y, @event.Z)); + decoys.TryAdd(new Vector(@event.X, @event.Y, @event.Z), 0); } public static void DecoyDetonate(EventDecoyDetonate @event) @@ -37,12 +38,13 @@ namespace jRandomSkills if (player == null || !player.IsValid) return; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; - decoys.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z); + foreach (var decoy in decoys.Keys.Where(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z)) + decoys.TryRemove(decoy, out _); } public static void OnTick() { - foreach (Vector decoyPos in decoys) + foreach (Vector decoyPos in decoys.Keys) foreach (var player in Utilities.GetPlayers().Where(p => p.Team == CsTeam.Terrorist || p.Team == CsTeam.CounterTerrorist)) { var decoyRadius = SkillsInfo.GetValue(skillName, "triggerRadius"); diff --git a/jRandomSkills - SRC Files/src/player/skills/Gambler.cs b/jRandomSkills - SRC Files/src/player/skills/Gambler.cs index 178f60c..177d49a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Gambler.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Gambler.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Gambler : ISkill { @@ -52,12 +51,12 @@ namespace jRandomSkills playerInfo.SkillChance = 1; if (SkillsInfo.GetValue(skill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) - Instance?.AddTimer(Math.Max((float)(Event.freezeTimeEnd - DateTime.Now).TotalSeconds, 0), () => { + Instance?.AddTimer(Math.Max((float)(Event.GetFreezeTimeEnd() - DateTime.Now).TotalSeconds, 0), () => { if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == skill.Skill) == null) return; - Instance?.SkillAction(skill.Skill.ToString(), "EnableSkill", new[] { player }); + Instance?.SkillAction(skill.Skill.ToString(), "EnableSkill", [player]); }); else - Instance?.SkillAction(skill.Skill.ToString(), "EnableSkill", new[] { player }); + Instance?.SkillAction(skill.Skill.ToString(), "EnableSkill", [player]); }); } @@ -95,7 +94,7 @@ namespace jRandomSkills var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (skillPlayer == null) return [Event.noneSkill]; - List skillList = new(SkillData.Skills); + List skillList = [.. SkillData.Skills]; skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None); if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).Count == 1) diff --git a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs index 544be29..4bf17bb 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs @@ -4,12 +4,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Ghost : ISkill { @@ -26,7 +25,7 @@ namespace jRandomSkills "weapon_g3sg1", "weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_m249", "weapon_negev" ]; - private static readonly ConcurrentDictionary> invisibleEntities = []; + private static readonly ConcurrentDictionary> invisibleEntities = []; public static void LoadSkill() { @@ -78,7 +77,7 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - SkillUtils.EnableTransmit(); + Event.EnableTransmit(); SetPlayerVisibility(player, false); SetWeaponVisibility(player, false); SetWeaponAttack(player, true); diff --git a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs index 97199df..d024bec 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs @@ -3,11 +3,11 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; +using src.utils; using System.Collections.Concurrent; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Glaz : ISkill { @@ -54,7 +54,7 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - SkillUtils.EnableTransmit(); + Event.EnableTransmit(); SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs index ad3563e..31b2b71 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Glitch : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Glue.cs b/jRandomSkills - SRC Files/src/player/skills/Glue.cs index 746e01a..3a414f5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glue.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glue.cs @@ -1,9 +1,9 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Glue : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs index e1db45a..292c43d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs +++ b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class GodMode : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Grenadier.cs b/jRandomSkills - SRC Files/src/player/skills/Grenadier.cs index 83fcdfb..b34da1c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Grenadier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Grenadier.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Grenadier : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs index 590843b..1b3cdd1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs @@ -2,15 +2,16 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using System.Collections.Concurrent; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class HealingSmoke : ISkill { private const Skills skillName = Skills.HealingSmoke; - private static readonly List smokes = []; + private static readonly ConcurrentDictionary smokes = []; public static void LoadSkill() { @@ -28,7 +29,7 @@ namespace jRandomSkills if (player == null || !player.IsValid) return; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; - smokes.Add(new Vector(@event.X, @event.Y, @event.Z)); + smokes.TryAdd(new Vector(@event.X, @event.Y, @event.Z), 0); } public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event) @@ -37,7 +38,8 @@ namespace jRandomSkills if (player == null || !player.IsValid) return; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; - smokes.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z); + foreach (var smoke in smokes.Keys.Where(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z)) + smokes.TryRemove(smoke, out _); } public static void OnEntitySpawned(CEntityInstance entity) @@ -68,7 +70,7 @@ namespace jRandomSkills public static void OnTick() { - foreach (Vector smokePos in smokes) + foreach (Vector smokePos in smokes.Keys) foreach (var player in Utilities.GetPlayers()) if (Server.TickCount % 17 == 0) if (player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.AbsOrigin != null) diff --git a/jRandomSkills - SRC Files/src/player/skills/Hermit.cs b/jRandomSkills - SRC Files/src/player/skills/Hermit.cs index 7a92ecc..4b40e44 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Hermit.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Hermit.cs @@ -1,11 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Hermit : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs b/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs index 5458b32..9468811 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs @@ -2,10 +2,10 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class HolyHandGrenade : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Impostor.cs b/jRandomSkills - SRC Files/src/player/skills/Impostor.cs index 7008a15..0910e18 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Impostor.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Impostor.cs @@ -2,10 +2,10 @@ using System.Drawing; using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Impostor : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs b/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs index 452d4d0..a7640f9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs +++ b/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs @@ -1,9 +1,9 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class InfiniteAmmo : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs index fda9c6f..322a2f2 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs @@ -2,17 +2,17 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; using System.Drawing; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Jackal : ISkill { private const Skills skillName = Skills.Jackal; - private static readonly ConcurrentDictionary> stepBeams = []; + private static readonly ConcurrentDictionary> stepBeams = []; public static void LoadSkill() { @@ -49,12 +49,13 @@ namespace jRandomSkills var newBeam = CreateBeamStep(step.Key.Team, lastBeamVector, pawn.AbsOrigin); if (newBeam != null) - step.Value.Add(newBeam); + step.Value.Enqueue(newBeam); if (beams?.Count >= SkillsInfo.GetValue(skillName, "maxStepBeam")) { - beams[0].AcceptInput("Kill"); - step.Value.RemoveAt(0); + if (beams.TryPeek(out var beam)) + beam.AcceptInput("Kill"); + step.Value.TryDequeue(out _); } } } @@ -103,7 +104,7 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController _) { - SkillUtils.EnableTransmit(); + Event.EnableTransmit(); foreach (var _player in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.PawnIsAlive && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) if (!stepBeams.ContainsKey(_player)) stepBeams.TryAdd(_player, []); diff --git a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs index 341b68e..313d1b6 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Jammer : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Jester.cs b/jRandomSkills - SRC Files/src/player/skills/Jester.cs index e65c3bf..6543769 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jester.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jester.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; +using src.utils; using System.Drawing; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Jester : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs index 7761588..f40f4bb 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class JumpBan : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs b/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs index bed8eb9..991ac4e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs @@ -1,9 +1,9 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class JumpingJack : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs index bce8de5..fdeaa26 100644 --- a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class KillerFlash : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs b/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs index fd46fb6..cb2b935 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class LifeSwap : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs b/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs index 0aa9f2b..9e5e327 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs @@ -6,13 +6,13 @@ using CounterStrikeSharp.API.Modules.Utils; using CS2TraceRay.Class; using CS2TraceRay.Enum; using CS2TraceRay.Struct; -using jRandomSkills.src.player; +using src.utils; using System.Drawing; using System.Numerics; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; -namespace jRandomSkills +namespace src.player.skills { public class LongKnife : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs b/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs index c6fdcdd..838e714 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs @@ -5,13 +5,13 @@ using CounterStrikeSharp.API.Modules.Utils; using CS2TraceRay.Class; using CS2TraceRay.Enum; using CS2TraceRay.Struct; -using jRandomSkills.src.player; +using src.utils; using System.Drawing; using System.Numerics; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; -namespace jRandomSkills +namespace src.player.skills { public class LongZeus : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs index e3b939d..e09ab61 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Magnifier : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Medic.cs b/jRandomSkills - SRC Files/src/player/skills/Medic.cs index 502912b..003a643 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Medic.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Medic.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Medic : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs b/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs index 98b7559..ccaed58 100644 --- a/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class MoneySwap : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs b/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs index 89ce837..3aa64ec 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; -namespace jRandomSkills +namespace src.player.skills { public class Muhammed : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Mute.cs b/jRandomSkills - SRC Files/src/player/skills/Mute.cs index f6ea989..99d4351 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Mute.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Mute.cs @@ -1,9 +1,9 @@ /*using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; -using jRandomSkills.src.player; + using static jRandomSkills.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Mute : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs index b5f9f89..313f136 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs @@ -3,17 +3,17 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Ninja : ISkill { private const Skills skillName = Skills.Ninja; private static readonly ConcurrentDictionary invisibilityChanged = []; - private static readonly ConcurrentDictionary> invisibleEntities = []; + private static readonly ConcurrentDictionary> invisibleEntities = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -74,7 +74,7 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController _) { - SkillUtils.EnableTransmit(); + Event.EnableTransmit(); } public static void DisableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/NoNades.cs b/jRandomSkills - SRC Files/src/player/skills/NoNades.cs index 5d47669..766fe34 100644 --- a/jRandomSkills - SRC Files/src/player/skills/NoNades.cs +++ b/jRandomSkills - SRC Files/src/player/skills/NoNades.cs @@ -1,9 +1,9 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class NoNades : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs b/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs index 644f686..166c0ba 100644 --- a/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs +++ b/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class NoRecoil : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Noclip.cs b/jRandomSkills - SRC Files/src/player/skills/Noclip.cs index 9655772..ec4ddf1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Noclip.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Noclip.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Noclip : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/None.cs b/jRandomSkills - SRC Files/src/player/skills/None.cs index d77ddbe..6a51de9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/None.cs +++ b/jRandomSkills - SRC Files/src/player/skills/None.cs @@ -1,7 +1,7 @@ using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class None : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/OneShot.cs b/jRandomSkills - SRC Files/src/player/skills/OneShot.cs index dd57557..4d3b9e2 100644 --- a/jRandomSkills - SRC Files/src/player/skills/OneShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/OneShot.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class OneShot : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs b/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs index 4b81485..df1a84d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs +++ b/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class OnlyHead : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs index b702514..d1c8c3e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs @@ -1,11 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class PawelJumper : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs b/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs index 3e443be..eafa0e4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs @@ -1,10 +1,9 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Phoenix : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Pilot.cs b/jRandomSkills - SRC Files/src/player/skills/Pilot.cs index f7633eb..2afb56e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Pilot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Pilot.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Pilot : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Planter.cs b/jRandomSkills - SRC Files/src/player/skills/Planter.cs index b9133b8..a6d24c9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Planter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Planter.cs @@ -2,10 +2,10 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Planter : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Poison.cs b/jRandomSkills - SRC Files/src/player/skills/Poison.cs index 308df12..775ca85 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Poison.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Poison.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Poison : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs index e0c9c7c..92bb244 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class PrimaryBan : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs b/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs index d20c3e7..fffcc49 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Prosthesis : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs b/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs index 1dbf0e2..4ed6627 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class PsychicDefusing : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Push.cs b/jRandomSkills - SRC Files/src/player/skills/Push.cs index 440b205..df8f809 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Push.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Push.cs @@ -1,10 +1,9 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Push : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Pyro.cs b/jRandomSkills - SRC Files/src/player/skills/Pyro.cs index 0f28b55..3568c8c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Pyro.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Pyro.cs @@ -2,10 +2,10 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Pyro : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs b/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs index d2aa2d0..cdaa103 100644 --- a/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class QuickShot : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs b/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs index c0d26b7..7f3be69 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class RadarHack : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Rambo.cs b/jRandomSkills - SRC Files/src/player/skills/Rambo.cs index f2a0082..0c54074 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Rambo.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Rambo.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Rambo : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs b/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs index afcd260..9bc5ccb 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs @@ -1,13 +1,12 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; using System.Collections.Immutable; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class RandomWeapon : ISkill { @@ -104,21 +103,20 @@ namespace jRandomSkills var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return; - List playerWeapons = []; + ConcurrentBag playerWeapons = []; foreach (var item in pawn.WeaponServices.MyWeapons) if (item != null && item.IsValid && item.Value != null && item.Value.IsValid && !string.IsNullOrEmpty(item.Value.DesignerName)) playerWeapons.Add(item.Value.DesignerName); - if (playerWeapons.Count == 0) + if (playerWeapons.IsEmpty) return; - List weaponList = new(pistols.Concat(rifles)); - weaponList.RemoveAll(w => playerWeapons.Contains(w)); + ConcurrentBag weaponList = [.. pistols.Concat(rifles).Where(w => !playerWeapons.Contains(w))]; if (weaponList.Count == 0) return; - string weapon = weaponList[Instance.Random.Next(weaponList.Count)]; + string weapon = weaponList.ToArray()[Instance.Random.Next(weaponList.Count)]; bool isPistol = pistols.Contains(weapon); string? weaponToRemove = playerWeapons.FirstOrDefault(itemName => diff --git a/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs b/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs index deafdb3..3e7d45c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs @@ -1,12 +1,12 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; using System.Drawing; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class ReZombie : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs index b81da13..4b6ae24 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class ReactiveArmor : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs b/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs index 495d96e..cc54a4b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs @@ -1,9 +1,9 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Regeneration : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs index 2a9abd9..6a535c7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs @@ -2,12 +2,11 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Replicator : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs index f7f9b2e..b69140c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Retreat : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs b/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs index 37cc42b..c27b34c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs @@ -1,11 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class ReturnToSender : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs b/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs index 7cacadc..bbad6db 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class RichBoy : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs b/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs index cd9fda1..4570873 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class RobinHood : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Rubber.cs b/jRandomSkills - SRC Files/src/player/skills/Rubber.cs index 4baa918..b034fa9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Rubber.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Rubber.cs @@ -1,11 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Rubber: ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Saper.cs b/jRandomSkills - SRC Files/src/player/skills/Saper.cs index 23c1040..d713ba9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Saper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Saper.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Saper : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs index 8f00647..4a3f9fa 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs @@ -1,11 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class SecondLife : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Shade.cs b/jRandomSkills - SRC Files/src/player/skills/Shade.cs index fb4403a..5857f1b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Shade.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Shade.cs @@ -4,14 +4,13 @@ using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using CS2TraceRay.Class; using CS2TraceRay.Struct; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; using System.Numerics; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Shade : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs b/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs index 21cfd85..8af2119 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class ShortBomb : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Silent.cs b/jRandomSkills - SRC Files/src/player/skills/Silent.cs index 78845cf..ee553de 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Silent.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Silent.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Silent : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs b/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs index e880a0a..b999b41 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs @@ -1,11 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class SniperElite : ISkill { @@ -93,10 +93,13 @@ namespace jRandomSkills if (createdWeapon != null && createdWeapon.IsValid && createdWeapon.DesignerName == "weapon_awp") { - if (playerAWPs.TryGetValue(player.SteamID, out List? value)) - value.Add(createdWeapon); - else - playerAWPs.TryAdd(player.SteamID, [createdWeapon]); + lock (setLock) + { + if (playerAWPs.TryGetValue(player.SteamID, out var list)) + list.Add(createdWeapon); + else + playerAWPs.TryAdd(player.SteamID, [createdWeapon]); + } } DeleteDroppedAWP(player); }); @@ -111,23 +114,26 @@ namespace jRandomSkills var weaponServices = pawn.WeaponServices; if (weaponServices == null) return; - List playerWeapons = weaponServices.MyWeapons.Where(w => w != null && w.IsValid && w.Value != null && w.Value.IsValid) - .Select(w => w.Value!.Index).ToList(); + ConcurrentBag playerWeapons = [.. weaponServices.MyWeapons.Where(w => w != null && w.IsValid && w.Value != null && w.Value.IsValid) + .Select(w => w.Value!.Index)]; - if (playerAWPs.TryGetValue(player.SteamID, out var AWPs)) - foreach (var awp in AWPs.ToList()) - { - if (awp != null && awp.IsValid) + lock (setLock) + { + if (playerAWPs.TryGetValue(player.SteamID, out var AWPs)) + foreach (var awp in AWPs.ToList()) { - if (!playerWeapons.Contains(awp.Index)) + if (awp != null && awp.IsValid) { - awp.AcceptInput("Kill"); - AWPs.Remove(awp); + if (!playerWeapons.Contains(awp.Index)) + { + awp.AcceptInput("Kill"); + AWPs.Remove(awp); + } } + else + AWPs.Remove(awp!); } - else - AWPs.Remove(awp!); - } + } } private static CBasePlayerWeapon? GetActiveRifle(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Soldier.cs b/jRandomSkills - SRC Files/src/player/skills/Soldier.cs index 7e1aec2..263959d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Soldier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Soldier.cs @@ -1,11 +1,10 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Soldier : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs index ca1ce89..6b50822 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class SoundMaker : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Spectator.cs b/jRandomSkills - SRC Files/src/player/skills/Spectator.cs index 75774c2..3940508 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Spectator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Spectator.cs @@ -1,12 +1,12 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; using System.Drawing; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Spectator : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs b/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs index d9c3ea5..287db96 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class SwapPosition : ISkill { @@ -47,7 +46,7 @@ namespace jRandomSkills { SteamID = player.SteamID, CanUse = false, - Cooldown = cooldownBeforeUse <= 0 ? DateTime.MinValue : Event.freezeTimeEnd.AddSeconds(cooldownBeforeUse - SkillsInfo.GetValue(skillName, "cooldown")), + Cooldown = cooldownBeforeUse <= 0 ? DateTime.MinValue : Event.GetFreezeTimeEnd().AddSeconds(cooldownBeforeUse - SkillsInfo.GetValue(skillName, "cooldown")), LastClick = DateTime.MinValue, FindedEnemy = false, }); diff --git a/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs b/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs index 6919582..4c130f4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; -namespace jRandomSkills +namespace src.player.skills { public class Teleporter : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Thief.cs b/jRandomSkills - SRC Files/src/player/skills/Thief.cs index ceb88e0..697d4f0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Thief.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Thief.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class Thief : ISkill { @@ -75,7 +74,7 @@ namespace jRandomSkills var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { - List skills = []; + ConcurrentBag skills = []; ConcurrentBag<(string, string)> menuItems = []; foreach (var enemy in enemies) { @@ -140,7 +139,7 @@ namespace jRandomSkills player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("thief_player_info", enemy.PlayerName)); if (SkillsInfo.GetValue(enemySkill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) - Instance?.AddTimer(Math.Max((float)(Event.freezeTimeEnd - DateTime.Now).TotalSeconds, 0), () => { + Instance?.AddTimer(Math.Max((float)(Event.GetFreezeTimeEnd() - DateTime.Now).TotalSeconds, 0), () => { if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == enemySkill) == null) return; Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", new[] { player }); }); diff --git a/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs b/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs index d093621..05bcfb6 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs @@ -1,11 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; using System.Drawing; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class ThirdEye : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs index 2e13ede..10a0530 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs @@ -1,9 +1,9 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Thorns : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs index 366b9b4..58dceae 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs @@ -2,15 +2,16 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using System.Collections.Concurrent; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class ToxicSmoke : ISkill { private const Skills skillName = Skills.ToxicSmoke; - private static readonly List smokes = []; + private static readonly ConcurrentDictionary smokes = []; public static void LoadSkill() { @@ -59,7 +60,7 @@ namespace jRandomSkills if (player == null || !player.IsValid) return; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; - smokes.Add(new Vector(@event.X, @event.Y, @event.Z)); + smokes.TryAdd(new Vector(@event.X, @event.Y, @event.Z), 0); } public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event) @@ -68,7 +69,8 @@ namespace jRandomSkills if (player == null || !player.IsValid) return; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; - smokes.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z); + foreach (var smoke in smokes.Keys.Where(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z)) + smokes.TryRemove(smoke, out _); } private static void AddHealth(CCSPlayerPawn player, int health) @@ -86,7 +88,7 @@ namespace jRandomSkills public static void OnTick() { - foreach (Vector smokePos in smokes) + foreach (Vector smokePos in smokes.Keys) foreach (var player in Utilities.GetPlayers()) if (Server.TickCount % 17 == 0) if (player != null && player.IsValid && player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid) diff --git a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs index 406055b..631b9ee 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs @@ -2,16 +2,17 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; +using src.utils; +using System.Collections.Concurrent; using System.Drawing; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Wallhack : ISkill { private const Skills skillName = Skills.Wallhack; - private static readonly List<(CDynamicProp, CDynamicProp, CsTeam)> glows = []; + private static readonly ConcurrentBag<(CDynamicProp, CDynamicProp, CsTeam)> glows = []; public static void LoadSkill() { @@ -53,8 +54,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController _) { - SkillUtils.EnableTransmit(); - if (glows.Count == 0) + Event.EnableTransmit(); + if (glows.IsEmpty) SetGlowEffectForAll(); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs b/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs index 5c0bdb1..6ed3a68 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs @@ -1,11 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Watchmaker : ISkill { diff --git a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs index f6370df..da07321 100644 --- a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs @@ -1,12 +1,11 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; using System.Collections.Concurrent; +using src.utils; -namespace jRandomSkills +namespace src.player.skills { public class WeaponsSwap : ISkill { @@ -147,7 +146,7 @@ namespace jRandomSkills private static string[]? GetWeapons(CCSPlayerController player) { - List playerWeapons = []; + ConcurrentBag playerWeapons = []; var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return null; if (pawn.WeaponServices == null) return null; diff --git a/jRandomSkills - SRC Files/src/player/skills/Zeus.cs b/jRandomSkills - SRC Files/src/player/skills/Zeus.cs index 2547b3b..aa378a0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Zeus.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Zeus.cs @@ -1,10 +1,10 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using static jRandomSkills.jRandomSkills; +using src.utils; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.player.skills { public class Zeus : ISkill { diff --git a/jRandomSkills - SRC Files/src/utils/Config.cs b/jRandomSkills - SRC Files/src/utils/Config.cs index be089e9..0fae3f4 100644 --- a/jRandomSkills - SRC Files/src/utils/Config.cs +++ b/jRandomSkills - SRC Files/src/utils/Config.cs @@ -1,8 +1,8 @@ using Microsoft.Extensions.Logging; using Newtonsoft.Json; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.utils { public static class Config { diff --git a/jRandomSkills - SRC Files/src/utils/Findtarget.cs b/jRandomSkills - SRC Files/src/utils/Findtarget.cs index f3e5543..830af46 100644 --- a/jRandomSkills - SRC Files/src/utils/Findtarget.cs +++ b/jRandomSkills - SRC Files/src/utils/Findtarget.cs @@ -1,68 +1,68 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands.Targeting; -using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; -namespace jRandomSkills; - -public class FindTarget +namespace src.utils { - public static (List players, string targetname) Find - ( - CommandInfo command, - int minArgCount, - bool singletarget, - bool ignoreMessage = false - ) + public class FindTarget { - if (command.ArgCount < minArgCount) + public static (List players, string targetname) Find + ( + CommandInfo command, + int minArgCount, + bool singletarget, + bool ignoreMessage = false + ) { - return (new List(), string.Empty); - } - - TargetResult targetresult = command.GetArgTargetResult(1); - - if (targetresult.Players.Count == 0) - { - if (!ignoreMessage && command.CallingPlayer != null) - command.ReplyToCommand(command.CallingPlayer.GetTranslation("no_player")); - - return (new List(), string.Empty); - } - else if (singletarget && targetresult.Players.Count > 1) - { - if (command.CallingPlayer != null) - command.ReplyToCommand(command.CallingPlayer.GetTranslation("duplicate_player")); - return (new List(), string.Empty); - } - - string targetname; - - if (targetresult.Players.Count == 1) - { - targetname = targetresult.Players.Single().PlayerName; - } - else - { - Target.TargetTypeMap.TryGetValue(command.GetArg(1), out TargetType type); - - targetname = type switch + if (command.ArgCount < minArgCount) { - TargetType.GroupAll => Instance.Localizer["all"], - TargetType.GroupBots => Instance.Localizer["bots"], - TargetType.GroupHumans => Instance.Localizer["humans"], - TargetType.GroupAlive => Instance.Localizer["alive"], - TargetType.GroupDead => Instance.Localizer["dead"], - TargetType.GroupNotMe => Instance.Localizer["notme"], - TargetType.PlayerMe => targetresult.Players.First().PlayerName, - TargetType.TeamCt => Instance.Localizer["ct"], - TargetType.TeamT => Instance.Localizer["t"], - TargetType.TeamSpec => Instance.Localizer["spec"], - _ => targetresult.Players.First().PlayerName - }; - } + return (new List(), string.Empty); + } - return (targetresult.Players, targetname); + TargetResult targetresult = command.GetArgTargetResult(1); + + if (targetresult.Players.Count == 0) + { + if (!ignoreMessage && command.CallingPlayer != null) + command.ReplyToCommand(command.CallingPlayer.GetTranslation("no_player")); + + return (new List(), string.Empty); + } + else if (singletarget && targetresult.Players.Count > 1) + { + if (command.CallingPlayer != null) + command.ReplyToCommand(command.CallingPlayer.GetTranslation("duplicate_player")); + return (new List(), string.Empty); + } + + string targetname; + + if (targetresult.Players.Count == 1) + { + targetname = targetresult.Players.Single().PlayerName; + } + else + { + Target.TargetTypeMap.TryGetValue(command.GetArg(1), out TargetType type); + + targetname = type switch + { + TargetType.GroupAll => Instance.Localizer["all"], + TargetType.GroupBots => Instance.Localizer["bots"], + TargetType.GroupHumans => Instance.Localizer["humans"], + TargetType.GroupAlive => Instance.Localizer["alive"], + TargetType.GroupDead => Instance.Localizer["dead"], + TargetType.GroupNotMe => Instance.Localizer["notme"], + TargetType.PlayerMe => targetresult.Players.First().PlayerName, + TargetType.TeamCt => Instance.Localizer["ct"], + TargetType.TeamT => Instance.Localizer["t"], + TargetType.TeamSpec => Instance.Localizer["spec"], + _ => targetresult.Players.First().PlayerName + }; + } + + return (targetresult.Players, targetname); + } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/utils/Localization.cs b/jRandomSkills - SRC Files/src/utils/Localization.cs index 55e38d2..11818d9 100644 --- a/jRandomSkills - SRC Files/src/utils/Localization.cs +++ b/jRandomSkills - SRC Files/src/utils/Localization.cs @@ -1,14 +1,13 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; using MaxMind.Db; using Newtonsoft.Json; using System.Net; using System.Collections.Concurrent; -using System.Text.RegularExpressions; +using src.player; -namespace jRandomSkills.src.utils +namespace src.utils { public static class Localization { @@ -109,7 +108,7 @@ namespace jRandomSkills.src.utils var skilLDescription = desc2 == skillName ? player.GetTranslation($"{skill.ToString().ToLower()}_desc") - : (desc2.Contains('%') ? desc2.Replace(value.ToString(), Math.Round(value * 100, 0).ToString()) : desc2); + : desc2.Contains('%') ? desc2.Replace(value.ToString(), Math.Round(value * 100, 0).ToString()) : desc2; return skilLDescription; } @@ -124,14 +123,14 @@ namespace jRandomSkills.src.utils return; } - List translations = []; + ConcurrentBag translations = []; for (int i = 0; i < key.Length; i++) { - object[] currentArgs = (args != null && i < args.Length) ? args[i] : []; + object[] currentArgs = args != null && i < args.Length ? args[i] : []; string translation = GetTranslation(key[i], langCode, currentArgs); translations.Add(translation); } - player.PrintToChat(string.Format(message, translations.ToArray())); + player.PrintToChat(string.Format(message, [.. translations])); } } diff --git a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs index 6f7d2e4..2832385 100644 --- a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs +++ b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs @@ -5,18 +5,14 @@ using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; -using jRandomSkills.src.utils; using System.Runtime.InteropServices; using WASDMenuAPI.Classes; using WASDSharedAPI; using static CounterStrikeSharp.API.Core.Listeners; using System.Collections.Concurrent; -using System; -using static System.Net.Mime.MediaTypeNames; -using System.Drawing; +using src.player; -namespace jRandomSkills +namespace src.utils { public static class SkillUtils { @@ -150,15 +146,6 @@ namespace jRandomSkills return designerName; } - public static void EnableTransmit() - { - if (!Event.isTransmitRegistered) - { - jRandomSkills.Instance?.RegisterListener(Event.CheckTransmit); - Event.isTransmitRegistered = true; - } - } - private static IWasdMenuManager? GetMenuManager() { if (jRandomSkills.Instance.MenuManager == null) diff --git a/jRandomSkills - SRC Files/src/utils/SkillsInfo.cs b/jRandomSkills - SRC Files/src/utils/SkillsInfo.cs index d803fbb..c4bb68e 100644 --- a/jRandomSkills - SRC Files/src/utils/SkillsInfo.cs +++ b/jRandomSkills - SRC Files/src/utils/SkillsInfo.cs @@ -1,13 +1,13 @@ -using CounterStrikeSharp.API; -using CounterStrikeSharp.API.Modules.Utils; -using jRandomSkills.src.player; +using CounterStrikeSharp.API.Modules.Utils; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using src.player; +using System.Collections.Concurrent; using System.Reflection; -using static jRandomSkills.jRandomSkills; +using static src.jRandomSkills; -namespace jRandomSkills +namespace src.utils { public static class SkillsInfo { @@ -106,11 +106,11 @@ namespace jRandomSkills return default!; } - public class SkillsInfoModel : List + public class SkillsInfoModel : ConcurrentBag { public SkillsInfoModel() { - AddRange( + foreach (var skill in Assembly.GetExecutingAssembly().GetTypes() .Where(t => typeof(DefaultSkillInfo).IsAssignableFrom(t) && t.Name == "SkillConfig") .Select(t => @@ -121,9 +121,9 @@ namespace jRandomSkills return ctor.Invoke(args) as DefaultSkillInfo; }) .Where(instance => instance != null) - .Cast() - ); - } + .Cast()) + Add(skill); + } } public class DefaultSkillInfo(Skills skill, bool active = true, string color = "#ffffff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false) diff --git a/jRandomSkills - Server Files/plugins/!jRandomSkills/!jRandomSkills.dll b/jRandomSkills - Server Files/plugins/!jRandomSkills/!jRandomSkills.dll index d58ab4f..92ce4ee 100644 Binary files a/jRandomSkills - Server Files/plugins/!jRandomSkills/!jRandomSkills.dll and b/jRandomSkills - Server Files/plugins/!jRandomSkills/!jRandomSkills.dll differ diff --git a/readme.md b/readme.md index ee61999..3c90cfa 100644 --- a/readme.md +++ b/readme.md @@ -72,7 +72,7 @@ Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus. | Darkness | Applies a darkness effect to a chosen enemy | - | | Deactivator | Choose a player whose skill you want to disable | - | | Deaf | Choose a player to mute all sounds for | - | -| Disarmament | You have a random chance to make an enemy drop their weapon on hit | (65 - 85)% | +| Disarmament | You have a random chance to make an enemy drop their weapon on hit | (20 - 35)% | | Rangefinder | You can see the distance to the nearest enemy | - | | Dash | Perform a second jump to dash | - | | Dracula | Hitting an enemy restores health equal to a percentage of the damage dealt | - | @@ -292,6 +292,60 @@ This plugin uses content from the following projects: ## 📋 Changelog +
+v1.1.7 + +- #### General: + - ###### Update the dependency to the latest version. + - ###### Information about skills is available in `skillsInfo.json` instead of `config.json`. + - ###### Added the `jRandomSkills.gamedata.json` file. + - ###### Added the option to disable a specific power during freeze time (Disabled by default: ). + - ###### Added `LanguageSystem` options to the config for detailed language assignment management. + - ###### The `StartGameCommand` command now includes a changeable start parameter in config. + - ###### Added `DisplayAlwaysDescription` option to the config to show the description all the time. + - ###### Added `HtmlHudCustomisation` options to config for setting colours and font size. + - ###### Can be set to empty text: your_skill/drawing_skill/observer_skill/XXX_select_info. + - ###### Option to set the obtained value in the name/description of the skill (`{0}`). + - ###### Fixed skill cooldown time display (Rounding up). + - ###### The `!reload` command now refreshes all parameters from the all configs. + - ###### Most of the collection has been replaced with safe-threading to avoid server crashes (idea by: @ebat_kopat777). +- #### Skill improvements: + - ##### Long Knife: + - ###### A secondary knife attack also deals damage. + - ##### Wallhack: + - ###### Glows are created just once, instead of being created again for each player. + - ##### Position Swap: + - ###### Added a configurable cooldown at the start of the round. + - ##### Spectator: + - ###### The method used to attach the camera has changed. + - ##### Noclip: + - ###### Return to the last place where you used skill if you fall below 3,000 units. + - ###### Added an option to disable the noclip when it is active. + - ##### Ninja: + - ###### Fixed an issue with weapons not being visible after death. + - ##### Muhammed: + - ###### The message at the explosion is configurable (in languages/). + - ###### Fixed a bug with the grenade not detonating. + - ##### Ghost: + - ###### Fixed an issue with weapons not being visible after death. + - ##### Explosive Shot: + - ###### Fixed a bug with the grenade not detonating. + - ##### Enemy Spawn: + - ###### Added a configurable cooldown at the start of the round. + - ##### Disarmament: + - ###### Back to dropping weapons instead of changing to slot3. + - ###### The chance of dropping weapons has been reduced: (20–50)% → (20–35)% + - ##### Chicken: + - ###### The method used to attach the chicken has changed. + - ###### Player with skill can see a model of your chicken. + - ##### C4 Camouflage: + - ###### Fixed an issue with weapons not being visible after death. + - ##### Blade Master: + - ###### Movement speed with a knife has been reduced by 10% (configurable). + - ##### AntyFlash: + - ###### Added the option in config to change the flash duration of your flashes. +
+
v1.1.6