diff --git a/jRandomSkills - SRC Files/src/command/Command.cs b/jRandomSkills - SRC Files/src/command/Command.cs index 991d162..7e9bbcc 100644 --- a/jRandomSkills - SRC Files/src/command/Command.cs +++ b/jRandomSkills - SRC Files/src/command/Command.cs @@ -15,12 +15,12 @@ namespace jRandomSkills public static void Load() { - var config = Config.config?.Settings; + var config = Config.LoadedConfig?.Settings; if (config == null || config == null) return; var commands = new Dictionary, (string description, CommandInfo.CommandCallback handler)> { - { SplitCommands(config.SetSkillCommands), ("Delete record", Command_SetSkill) }, + { SplitCommands(config.SetSkillCommands), ("Set skill", Command_SetSkill) }, { SplitCommands(config.SkillsListCommands), ("Delete all records", Command_SkillsListMenu) }, { SplitCommands(config.UseSkillCommands), ("Use/Type skill", Command_UseTypeSkill) }, { SplitCommands(config.ChangeMapCommands), ("Change map", Command_ChangeMap) }, @@ -47,7 +47,8 @@ namespace jRandomSkills private static void Command_UseTypeSkill(CCSPlayerController? player, CommandInfo _) { if (player == null) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; @@ -56,9 +57,9 @@ namespace jRandomSkills string[] commands = _.ArgString.Trim().Split(" ", StringSplitOptions.RemoveEmptyEntries); Debug.WriteToDebug($"Player {player.PlayerName} used the skill: {playerInfo.Skill}"); if (commands == null || commands.Length == 0) - Instance.SkillAction(playerInfo!.Skill.ToString(), "UseSkill", new object[] { player }); + Instance.SkillAction(playerInfo.Skill.ToString(), "UseSkill", [player]); else - Instance.SkillAction(playerInfo!.Skill.ToString(), "TypeSkill", new object[] { player, commands }); + Instance.SkillAction(playerInfo.Skill.ToString(), "TypeSkill", [player, commands]); } [RequiresPermissions("@jRandmosSkills/admin")] @@ -66,8 +67,9 @@ namespace jRandomSkills private static void Command_SetSkill(CCSPlayerController? player, CommandInfo command) { if (player == null) return; - - (List players, string targetname) = FindTarget.Find(command, 2, false, true); + var targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => !p.IsBot + && (p.SteamID.ToString().Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase) + || p.PlayerName.Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase)) ); if (command.ArgCount < 2) { @@ -77,7 +79,7 @@ namespace jRandomSkills return; } - if (players.Count == 0) + if (targetPlayer == null) { player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); SkillUtils.PrintToChat(player, Localization.GetTranslation("player_not_found_setskill"), true); @@ -96,34 +98,30 @@ namespace jRandomSkills return; } - foreach (CCSPlayerController target in players) + var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == targetPlayer.SteamID); + if (skillPlayer != null) { - var skillPlayer = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == target.SteamID); - if (skillPlayer != null) - { + Instance.SkillAction(skillPlayer.Skill.ToString(), "DisableSkill", [targetPlayer]); + skillPlayer.Skill = skill.Skill; + Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [targetPlayer]); - Instance.SkillAction(skillPlayer.Skill.ToString(), "DisableSkill", new object[] { target }); - skillPlayer.Skill = skill.Skill; - Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", new object[] { target }); - - player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); - SkillUtils.PrintToChat(player, $"{Localization.GetTranslation("done_setskill")}: {ChatColors.LightRed}{skill.Name} {ChatColors.Lime}{Localization.GetTranslation("for_setskill")} {ChatColors.LightRed}{target.PlayerName}", false); - player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); - } - else - { - player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); - SkillUtils.PrintToChat(player, Localization.GetTranslation("error_setskill"), true); - player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); - } + player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); + SkillUtils.PrintToChat(player, $"{Localization.GetTranslation("done_setskill")}: {ChatColors.LightRed}{skill.Name} {ChatColors.Lime}{Localization.GetTranslation("for_setskill")} {ChatColors.LightRed}{targetPlayer.PlayerName}", false); + player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); + } + else + { + player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); + SkillUtils.PrintToChat(player, Localization.GetTranslation("error_setskill"), true); + player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); } - } [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)] private static void Command_SkillsListMenu(CCSPlayerController? player, CommandInfo command) { if (player == null) return; + Menu.DisplaySkillsList(player); } @@ -135,10 +133,10 @@ namespace jRandomSkills player.Vote(VoteType.ChangeMap, command.ArgString); return; } - ChangeMap(player, command); + ChangeMap(command); } - private static void ChangeMap(CCSPlayerController? player, CommandInfo command) + private static void ChangeMap(CommandInfo command) { string map = command.GetArg(1); @@ -163,13 +161,13 @@ namespace jRandomSkills { if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, "@TESTTEST/TESTAFD")) { - player.Vote(VoteType.StartGame, command.ArgString); + player.Vote(VoteType.StartGame); return; } - StartGame(player, command); + StartGame(command); } - private static void StartGame(CCSPlayerController? player, CommandInfo command) + private static void StartGame(CommandInfo command) { int cheats = command.GetArg(1) == "sv" ? 1 : 0; Server.ExecuteCommand($"mp_freezetime {(cheats == 1 ? 0 : 5)}"); @@ -190,13 +188,13 @@ namespace jRandomSkills { if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, "@TESTTEST/TESTAFD")) { - player.Vote(VoteType.SwapTeam, command.ArgString); + player.Vote(VoteType.SwapTeam); return; } - Swap(player, command); + Swap(); } - private static void Swap(CCSPlayerController? _player, CommandInfo command) + private static void Swap() { foreach (var player in Utilities.GetPlayers()) if (Instance.IsPlayerValid(player) && new CsTeam[] { CsTeam.CounterTerrorist, CsTeam.Terrorist }.Contains(player.Team)) @@ -209,13 +207,13 @@ namespace jRandomSkills { if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, "@TESTTEST/TESTAFD")) { - player.Vote(VoteType.ShuffleTeam, command.ArgString); + player.Vote(VoteType.ShuffleTeam); return; } - Shuffle(player, command); + Shuffle(); } - private static void Shuffle(CCSPlayerController? _player, CommandInfo command) + private static void Shuffle() { 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); @@ -233,13 +231,13 @@ namespace jRandomSkills { if (player != null && player.IsValid && !AdminManager.PlayerHasPermissions(player, "@TESTTEST/TESTAFD")) { - player.Vote(VoteType.PauseGame, command.ArgString); + player.Vote(VoteType.PauseGame); return; } - Pause(player, command); + Pause(); } - private static void Pause(CCSPlayerController? player, CommandInfo command) + private static void Pause() { Server.PrintToChatAll($" {(gamePaused ? ChatColors.Green : ChatColors.Red)}{Localization.GetTranslation(gamePaused ? "unpause" : "pause")}"); Server.ExecuteCommand( gamePaused ? "mp_unpause_match" : "mp_pause_match"); @@ -250,6 +248,7 @@ namespace jRandomSkills [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] private static void Command_Heal(CCSPlayerController? player, CommandInfo command) { + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; SkillUtils.AddHealth(player.PlayerPawn.Value, 100); player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("healed")}"); } @@ -269,7 +268,8 @@ namespace jRandomSkills { if (!int.TryParse(command.GetArg(1), out int ctScore) || !int.TryParse(command.GetArg(2), out int tScore)) { - SkillUtils.PrintToChat(player, Localization.GetTranslation("correct_form_setscore"), true); + if (player != null && player.IsValid) + SkillUtils.PrintToChat(player, Localization.GetTranslation("correct_form_setscore"), true); return; } diff --git a/jRandomSkills - SRC Files/src/command/VoteSystem.cs b/jRandomSkills - SRC Files/src/command/VoteSystem.cs index a52cdb5..8ebb56e 100644 --- a/jRandomSkills - SRC Files/src/command/VoteSystem.cs +++ b/jRandomSkills - SRC Files/src/command/VoteSystem.cs @@ -1,49 +1,75 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Events; using CounterStrikeSharp.API.Modules.Utils; +using jRandomSkills.src.utils; namespace jRandomSkills { public static class VoteSystem { - private static HashSet votes = new HashSet(); + private static readonly HashSet votes = []; - public static void Load() + private static VoteData? CreateVote(VoteType voteType, string? args = null) { - jRandomSkills.Instance.DeregisterEventHandler((@event, info) => - { - var player = @event.Userid; - var text = @event.Text; - return HookResult.Continue; - }); - } + var vote = new VoteData(10, + () => { + Server.ExecuteCommand($"{VoteTypeCommands.GetCommand(voteType)}{(!string.IsNullOrEmpty(args) ? $" {args}" : "")}"); + }, 60, 2, 5, 2, voteType, args); + + if (vote.MinimumPlayersToStartVoting > Utilities.GetPlayers().Count(p => !p.IsBot)) + return null; - private static VoteData CreateVote(VoteType voteType, string? args = null) - { - var vote = new VoteData(10, - () => { - Server.ExecuteCommand($"{VoteTypeCommands.GetCommand(voteType)}{(args != null ? $" {args}" : "")}"); - }, 60, voteType, args); votes.Add(vote); + string commandName = $"!{VoteTypeCommands.GetCommand(vote.Type)?.Replace("css_", "")}{(!string.IsNullOrEmpty(vote?.Args) ? $" {vote?.Args}" : "")}"; - jRandomSkills.Instance.AddTimer(vote?.TimeToVote ?? 0, () => + Server.PrintToChatAll($" {ChatColors.Lime}{Localization.GetTranslation("vote_started", commandName)}"); + foreach (var player in Utilities.GetPlayers()) + player.EmitSound("UIPanorama.tab_mainmenu_news"); + + if (vote == null) return vote; + jRandomSkills.Instance.AddTimer(vote.TimeToVote, () => + { + if (!votes.Contains(vote) || !vote.GetActive()) return; + vote.SetActive(false); + Server.PrintToChatAll($" {ChatColors.Red}{Localization.GetTranslation("vote_timeout", commandName)}"); + }); + + float[] times = [vote.TimeToVote, vote.TimeToVote + vote.TimeToNextVoting, vote.TimeToVote + vote.TimeToNextSameVoting]; + jRandomSkills.Instance.AddTimer(times.Max(), () => { if (!votes.Contains(vote)) return; votes.Remove(vote); - Server.PrintToChatAll($" {ChatColors.Red}Vote '!{VoteTypeCommands.GetCommand(vote.Type)?.Replace("css_", "")}' timed out!"); }); return vote; } public static void Vote(this CCSPlayerController player, VoteType voteType, string? args = null) { - var vote = votes.FirstOrDefault(v => v.Type == voteType); + var vote = votes.FirstOrDefault(v => v.Type == voteType && v.Args == args && v.GetActive()); if (vote == null) + { + if (votes.Any(v => v.NextVoting() > DateTime.Now)) + { + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("vote_wait")}"); + return; + } + else if (votes.Any(v => v.Type == voteType && v.NextSameVoting() > DateTime.Now)) + { + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("vote_same_wait")}"); + return; + } + vote = CreateVote(voteType, args); + } + + if (vote == null) + { + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("vote_not_enough_players")}"); + return; + } if (!vote.PlayersVoted.Add(player.SteamID)) - player.PrintToChat($" {ChatColors.Red}You have already voted!"); + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("vote_alredy_voted")}"); else CheckVote(vote); } @@ -56,30 +82,46 @@ namespace jRandomSkills if (voted >= playersNeeded) { vote.SuccessAction.Invoke(); - votes.Remove(vote); + vote.SetActive(false); } else - Server.PrintToChatAll($" {ChatColors.Yellow}Vote '!{VoteTypeCommands.GetCommand(vote.Type)?.Replace("css_", "")}': {ChatColors.Green}{voted}/{playersNeeded}"); + Server.PrintToChatAll($" {ChatColors.Yellow}{Localization.GetTranslation("vote_vote")} '!{VoteTypeCommands.GetCommand(vote.Type)?.Replace("css_", "")}{(!string.IsNullOrEmpty(vote?.Args) ? $" {vote?.Args}" : "")}': {ChatColors.Green}{voted}/{playersNeeded}"); } } - public class VoteData + public class VoteData(float timeToVote, Action successAction, float percentagesToSuccess, float timeToNextVoting, float timeToNextSameVoting, int minimumPlayersToStartVoting, VoteType type, string? args = null) { - public float TimeToVote { get; set; } - public Action SuccessAction { get; set; } - public float PercentagesToSuccess { get; set; } - public VoteType Type { get; set; } - public string Args { get; set; } - public HashSet PlayersVoted { get; set; } + private bool Active { get; set; } = true; + public float TimeToVote { get; set; } = timeToVote; + public Action SuccessAction { get; set; } = successAction; + public float PercentagesToSuccess { get; set; } = percentagesToSuccess; + public float TimeToNextVoting { get; set; } = timeToNextVoting; + public float TimeToNextSameVoting { get; set; } = timeToNextSameVoting; + public int MinimumPlayersToStartVoting { get; set; } = minimumPlayersToStartVoting; + public VoteType Type { get; set; } = type; + public string? Args { get; set; } = args; + public HashSet PlayersVoted { get; set; } = []; - public VoteData(float timeToVote, Action successAction, float percentagesToSuccess, VoteType type, string? args = null) + private DateTime CreatedTime { get; set; } = DateTime.Now; + + public void SetActive(bool active) { - TimeToVote = timeToVote; - SuccessAction = successAction; - PercentagesToSuccess = percentagesToSuccess; - Type = type; - Args = args; - PlayersVoted = new HashSet(); + Active = active; + } + + public bool GetActive() + { + return Active; + } + + public DateTime NextVoting() + { + return CreatedTime.AddSeconds(TimeToVote + TimeToNextVoting); + } + + public DateTime NextSameVoting() + { + return CreatedTime.AddSeconds(TimeToVote + TimeToNextSameVoting); } } @@ -95,7 +137,7 @@ namespace jRandomSkills public static class VoteTypeCommands { - private static readonly Dictionary names = new Dictionary() + private static readonly Dictionary names = new() { { VoteType.StartGame, "css_start" }, { VoteType.PauseGame, "css_pause" }, diff --git a/jRandomSkills - SRC Files/src/jRandomSkills.cs b/jRandomSkills - SRC Files/src/jRandomSkills.cs index 86251b4..1a99fee 100644 --- a/jRandomSkills - SRC Files/src/jRandomSkills.cs +++ b/jRandomSkills - SRC Files/src/jRandomSkills.cs @@ -8,13 +8,17 @@ using System.Reflection; namespace jRandomSkills { +#pragma warning disable IDE1006 // Style nazewnictwa public partial class jRandomSkills : BasePlugin +#pragma warning restore IDE1006 // Style nazewnictwa { +#pragma warning disable CS8618 // Pole niedopuszczające wartości null musi zawierać wartość inną niż null podczas kończenia działania konstruktora. Rozważ zadeklarowanie pola jako dopuszczającego wartość null. public static jRandomSkills Instance { get; private set; } +#pragma warning restore CS8618 // Pole niedopuszczające wartości null musi zawierać wartość inną niż null podczas kończenia działania konstruktora. Rozważ zadeklarowanie pola jako dopuszczającego wartość null. - public List skillPlayer { get; } = new List(); + public List SkillPlayer { get; } = []; public Random Random { get; } = new Random(); - public CCSGameRules GameRules { get; set; } + public CCSGameRules? GameRules { get; set; } public override string ModuleName => "[CS2] [ jRandomSkills ]"; public override string ModuleAuthor => "D3X, Juzlus"; @@ -40,13 +44,15 @@ namespace jRandomSkills if (Config.GetValue(skill, "active")) SkillAction(skill.ToString()!, "LoadSkill"); - Debug.WriteToDebug($"jRandomSkills v{Instance.ModuleVersion} ({SkillData.Skills.Count - 1}/{Config.config.SkillsInfo.Length - 1} Skills) loaded!"); - Debug.WriteToDebug($"GameModes: {(Config.GameModes)Config.config.Settings.GameMode}, Lang: {Config.config.Settings.LangCode}"); + Debug.WriteToDebug($"jRandomSkills v{Instance.ModuleVersion} ({SkillData.Skills.Count - 1}/{Config.LoadedConfig.SkillsInfo.Length - 1} Skills) loaded!"); + Debug.WriteToDebug($"GameModes: {(Config.GameModes)Config.LoadedConfig.Settings.GameMode}, Lang: {Config.LoadedConfig.Settings.LangCode}"); foreach (var skill in SkillData.Skills) Debug.WriteToDebug($"Loaded: {skill.Skill}"); } - internal void SkillAction(string skill, string methodName, object[] param = null) +#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); @@ -70,23 +76,27 @@ namespace jRandomSkills throw new NotImplementedException(); } - internal void AddCommand(string name, string description, CommandInfo.CommandCallback handler) + internal new void AddCommand(string name, string description, CommandInfo.CommandCallback handler) { var definition = new CommandDefinition(name, description, handler); CommandDefinitions.Add(definition); CommandManager.RegisterCommand(definition); } - internal bool IsPlayerValid(CCSPlayerController player) +#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.LifeState == (byte)LifeState_t.LIFE_ALIVE; + return player != null && player.IsValid && player.PlayerPawn?.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.LifeState == (byte)LifeState_t.LIFE_ALIVE; } - public uint[] footstepSoundEvents = { 3109879199, 70939233, 1342713723, 2722081556, 1909915699, 3193435079, 2300993891, 3847761506, 4084367249, 1342713723, 3847761506, 2026488395, 2745524735, 2684452812, 2265091453, 1269567645, 520432428, 3266483468, 1346129716, 2061955732, 2240518199, 2829617974, 1194677450, 1803111098, 3749333696, 29217150, 1692050905, 2207486967, 2633527058, 3342414459, 988265811, 540697918, 1763490157, 3755338324, 3161194970, 3753692454, 3166948458, 3997353267, 3161194970, 3753692454, 3166948458, 3997353267, 809738584, 3368720745, 3295206520, 3184465677, 123085364, 3123711576, 737696412, 1403457606, 1770765328, 892882552, 3023174225, 4163677892, 3952104171, 4082928848, 1019414932, 1485322532, 1161855519, 1557420499, 1163426340, 809738584, 3368720745, 2708661994, 2479376962, 3295206520, 1404198078, 1194093029, 1253503839, 2189706910, 1218015996, 96240187, 1116700262, 84876002, 1598540856, 2231399653 }; - 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 }; + public uint[] footstepSoundEvents = [3109879199, 70939233, 1342713723, 2722081556, 1909915699, 3193435079, 2300993891, 3847761506, 4084367249, 1342713723, 3847761506, 2026488395, 2745524735, 2684452812, 2265091453, 1269567645, 520432428, 3266483468, 1346129716, 2061955732, 2240518199, 2829617974, 1194677450, 1803111098, 3749333696, 29217150, 1692050905, 2207486967, 2633527058, 3342414459, 988265811, 540697918, 1763490157, 3755338324, 3161194970, 3753692454, 3166948458, 3997353267, 3161194970, 3753692454, 3166948458, 3997353267, 809738584, 3368720745, 3295206520, 3184465677, 123085364, 3123711576, 737696412, 1403457606, 1770765328, 892882552, 3023174225, 4163677892, 3952104171, 4082928848, 1019414932, 1485322532, 1161855519, 1557420499, 1163426340, 809738584, 3368720745, 2708661994, 2479376962, 3295206520, 1404198078, 1194093029, 1253503839, 2189706910, 1218015996, 96240187, 1116700262, 84876002, 1598540856, 2231399653]; + 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; } @@ -96,23 +106,16 @@ namespace jRandomSkills public bool IsDrawing { get; set; } } - public class jSkill_SkillInfo +#pragma warning disable IDE1006 + public class jSkill_SkillInfo(Skills skill, string color, bool display) +#pragma warning restore IDE1006 { - public Skills Skill { get; } - public string Name { get; } - public string Description { get; } - public string Color { get; } + public Skills Skill { get; } = skill; + public string Name { get; } = Localization.GetTranslation(skill.ToString().ToLower()); + public string Description { get; } = Localization.GetTranslation($"{skill.ToString().ToLower()}_desc"); + public string Color { get; } = color; - public bool Display { get; } - - public jSkill_SkillInfo(Skills skill, string color, bool display) - { - Skill = skill; - Name = Localization.GetTranslation(skill.ToString().ToLower()); - Description = Localization.GetTranslation($"{skill.ToString().ToLower()}_desc"); - Color = color; - Display = display; - } + public bool Display { get; } = display; public static implicit operator Skills(jSkill_SkillInfo v) { @@ -122,6 +125,6 @@ namespace jRandomSkills public static class SkillData { - public static List Skills { get; } = new List(); + public static List Skills { get; } = []; } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/lang/en.json b/jRandomSkills - SRC Files/src/lang/en.json index fc0aa2b..dff203f 100644 --- a/jRandomSkills - SRC Files/src/lang/en.json +++ b/jRandomSkills - SRC Files/src/lang/en.json @@ -414,6 +414,14 @@ "healed": "You have been healed.", "game_start": "Game started!", + "vote_started": "Vote started: '{0}'", + "vote_timeout": "Vote '{0}' timed out!", + "vote_wait": "You need to wait before starting another vote!", + "vote_same_wait": "You need to wait before starting the same vote again!", + "vote_not_enough_players": "Not enough players to start a vote!", + "vote_alredy_voted": "You have already voted!", + "vote_vote": "Vote", + "teammate_skills": "Your teammates' skills", "summary_start": "======SUMMARY=OF=THE=LAST=ROUND======", "summary_end": "=======================================" diff --git a/jRandomSkills - SRC Files/src/lang/pl.json b/jRandomSkills - SRC Files/src/lang/pl.json index 70741e1..6d461a8 100644 --- a/jRandomSkills - SRC Files/src/lang/pl.json +++ b/jRandomSkills - SRC Files/src/lang/pl.json @@ -414,6 +414,14 @@ "healed": "Zostałeś uleczony.", "game_start": "Gra rozpoczęta!", + "vote_started": "Głosowanie rozpoczęte: '{0}'", + "vote_timeout": "Głosowanie '{0}' przekroczyło limit czasu!", + "vote_wait": "Musisz poczekać, zanim rozpoczniesz kolejne głosowanie!", + "vote_same_wait": "Musisz poczekać, zanim ponownie rozpoczniesz to samo głosowanie!", + "vote_not_enough_players": "Za mało graczy, aby rozpocząć głosowanie!", + "vote_alredy_voted": "Już zagłosowałeś!", + "vote_vote": "Głosowanie", + "teammate_skills": "Supermoce twoich sojuszników", "summary_start": "======PODSUMOWANIE=Z=OSTATNIEJ=RUNDY======", "summary_end": "============================================" diff --git a/jRandomSkills - SRC Files/src/lang/pt-br.json b/jRandomSkills - SRC Files/src/lang/pt-br.json index ff42def..af41fee 100644 --- a/jRandomSkills - SRC Files/src/lang/pt-br.json +++ b/jRandomSkills - SRC Files/src/lang/pt-br.json @@ -414,6 +414,14 @@ "healed": "Você foi curado.", "game_start": "Jogo iniciado!", + "vote_started": "Votação iniciada: '{0}'", + "vote_timeout": "Votação '{0}' expirou!", + "vote_wait": "Você precisa esperar antes de iniciar outra votação!", + "vote_same_wait": "Você precisa esperar antes de iniciar a mesma votação novamente!", + "vote_not_enough_players": "Não há jogadores suficientes para iniciar uma votação!", + "vote_alredy_voted": "Você já votou!", + "vote_vote": "Votar", + "teammate_skills": "Habilidades dos seus companheiros de equipe", "summary_start": "=======RESUMO=DA=ÚLTIMA=RODADA=======", "summary_end": "=======================================" diff --git a/jRandomSkills - SRC Files/src/lang/zh.json b/jRandomSkills - SRC Files/src/lang/zh.json index f0e5b19..6ed2da3 100644 --- a/jRandomSkills - SRC Files/src/lang/zh.json +++ b/jRandomSkills - SRC Files/src/lang/zh.json @@ -414,6 +414,14 @@ "healed": "你已被治疗。", "game_start": "游戏开始!", + "vote_started": "投票开始:'{0}'", + "vote_timeout": "投票'{0}'超时!", + "vote_wait": "您需要等待才能开始另一轮投票!", + "vote_same_wait": "您需要等待才能再次发起相同投票!", + "vote_not_enough_players": "投票人数不足!", + "vote_alredy_voted": "您已投票!", + "vote_vote": "投票", + "teammate_skills": "你队友的技能", "summary_start": "=============上一回合总结==============", "summary_end": "=======================================" diff --git a/jRandomSkills - SRC Files/src/player/Debug.cs b/jRandomSkills - SRC Files/src/player/Debug.cs index ceddc30..71df826 100644 --- a/jRandomSkills - SRC Files/src/player/Debug.cs +++ b/jRandomSkills - SRC Files/src/player/Debug.cs @@ -9,7 +9,7 @@ namespace jRandomSkills { public static class Debug { - private static string sessionId; + private static string sessionId = "00000"; public static void Load() { @@ -83,6 +83,7 @@ namespace jRandomSkills 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."); return HookResult.Continue; }); @@ -98,8 +99,8 @@ namespace jRandomSkills if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) return HookResult.Continue; - CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.Handle); - CCSPlayerPawn victimPawn = new CCSPlayerPawn(param.Handle); + CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); + CCSPlayerPawn victimPawn = new(param.Handle); if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") return HookResult.Continue; @@ -110,7 +111,7 @@ namespace jRandomSkills CCSPlayerController attacker = attackerPawn.Controller.Value.As(); CCSPlayerController victim = victimPawn.Controller.Value.As(); - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + 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}."); @@ -119,7 +120,7 @@ namespace jRandomSkills public static void WriteToDebug(string message) { - if (Config.config.Settings.DebugMode != true) + if (Config.LoadedConfig.Settings.DebugMode != true) return; string filename = $"Debug_{sessionId}.txt"; diff --git a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs index e3d8181..00bd264 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs @@ -9,12 +9,12 @@ using static jRandomSkills.jRandomSkills; namespace jRandomSkills { - public static class Event + public static partial class Event { - private static jSkill_SkillInfo ctSkill = new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false); - private static jSkill_SkillInfo tSkill = new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false); - private static jSkill_SkillInfo allSkill = new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false); - private static List debugSkills = new List(SkillData.Skills); + private static jSkill_SkillInfo ctSkill = new(Skills.None, Config.GetValue(Skills.None, "color"), false); + private static jSkill_SkillInfo tSkill = new(Skills.None, Config.GetValue(Skills.None, "color"), false); + private static jSkill_SkillInfo allSkill = new(Skills.None, Config.GetValue(Skills.None, "color"), false); + private static List debugSkills = new(SkillData.Skills); public static void Load() { @@ -24,7 +24,7 @@ namespace jRandomSkills if (player == null || !player.IsValid) return HookResult.Continue; - Instance.skillPlayer.Add(new jSkill_PlayerInfo + Instance.SkillPlayer.Add(new jSkill_PlayerInfo { SteamID = player.SteamID, PlayerName = player.PlayerName, @@ -39,11 +39,11 @@ namespace jRandomSkills + "Original plugin created by:\n{AUTHOR1}\n" + "Modified and improved by:\n{AUTHOR2}"; string langWelcomeMsg = Localization.GetTranslation("welcome_message", "welcome"); - string welcomeMsg = Regex.IsMatch(langWelcomeMsg, @"\{AUTHOR1\}", RegexOptions.IgnoreCase) && Regex.IsMatch(langWelcomeMsg, @"\{AUTHOR2\}", RegexOptions.IgnoreCase) ? langWelcomeMsg : defaultWelcomeMsg; + string welcomeMsg = MyRegex().IsMatch(langWelcomeMsg) && MyRegex1().IsMatch(langWelcomeMsg) ? langWelcomeMsg : defaultWelcomeMsg; 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("{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) @@ -58,10 +58,10 @@ namespace jRandomSkills if (player == null || !player.IsValid) return HookResult.Continue; - var skillPlayer = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (skillPlayer != null) { - Instance.skillPlayer.Remove(skillPlayer); + Instance.SkillPlayer.Remove(skillPlayer); } return HookResult.Continue; @@ -71,7 +71,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var skillPlayer = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (skillPlayer != null) skillPlayer.IsDrawing = true; } @@ -90,16 +90,17 @@ namespace jRandomSkills string skillsText = ""; foreach (var _player in _players) { - var _playerSkill = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == _player.SteamID); + 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); - skillsText += $" {ChatColors.DarkRed}{_player.PlayerName}{ChatColors.Lime}: {(_playerSkill.SpecialSkill == Skills.None ? skillInfo.Name : $"{specialSkillInfo.Name} -> {skillInfo.Name}")}\n"; + if (skillInfo == null) continue; + skillsText += $" {ChatColors.DarkRed}{_player.PlayerName}{ChatColors.Lime}: {(_playerSkill.SpecialSkill == Skills.None || specialSkillInfo == null ? skillInfo.Name : $"{specialSkillInfo.Name} -> {skillInfo.Name}")}\n"; } } - if (Config.config.Settings.SummaryAfterTheRound && !string.IsNullOrEmpty(skillsText)) + if (Config.LoadedConfig.Settings.SummaryAfterTheRound && !string.IsNullOrEmpty(skillsText)) { player.PrintToChat(" "); player.PrintToChat($" {ChatColors.Lime}{Localization.GetTranslation("summary_start")}"); @@ -117,28 +118,28 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { - Config.DefaultSkillInfo[] terroristSkills = Config.config.SkillsInfo.Where(s => s.OnlyTeam == (int)CsTeam.Terrorist).ToArray(); - Config.DefaultSkillInfo[] counterterroristSkills = Config.config.SkillsInfo.Where(s => s.OnlyTeam == (int)CsTeam.CounterTerrorist).ToArray(); - Config.DefaultSkillInfo[] allTeamsSkills = Config.config.SkillsInfo.Where(s => s.OnlyTeam == 0).ToArray(); + Config.DefaultSkillInfo[] terroristSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == (int)CsTeam.Terrorist).ToArray(); + Config.DefaultSkillInfo[] counterterroristSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == (int)CsTeam.CounterTerrorist).ToArray(); + Config.DefaultSkillInfo[] allTeamsSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == 0).ToArray(); - if (Config.config.Settings.GameMode == (int)Config.GameModes.TeamSkills) + if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.TeamSkills) { - List tSkills = new List(SkillData.Skills); + 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 ? new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false) : tSkills[Instance.Random.Next(tSkills.Count)]; + tSkill = tSkills.Count == 0 ? new(Skills.None, Config.GetValue(Skills.None, "color"), false) : tSkills[Instance.Random.Next(tSkills.Count)]; - List ctSkills = new List(SkillData.Skills); + 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 ? new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false) : ctSkills[Instance.Random.Next(ctSkills.Count)]; + ctSkill = ctSkills.Count == 0 ? new(Skills.None, Config.GetValue(Skills.None, "color"), false) : ctSkills[Instance.Random.Next(ctSkills.Count)]; } - else if (Config.config.Settings.GameMode == (int)Config.GameModes.SameSkills) + else if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.SameSkills) { - List allSkills = new List(SkillData.Skills); + 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 ? new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false) : allSkills[Instance.Random.Next(allSkills.Count)]; + allSkill = allSkills.Count == 0 ? new(Skills.None, Config.GetValue(Skills.None, "color"), false) : allSkills[Instance.Random.Next(allSkills.Count)]; } - else if (Config.config.Settings.GameMode == (int)Config.GameModes.Debug && debugSkills.Count == 0) - debugSkills = new List(SkillData.Skills); + else if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.Debug && debugSkills.Count == 0) + debugSkills = new(SkillData.Skills); foreach (var player in Utilities.GetPlayers()) { @@ -146,23 +147,22 @@ namespace jRandomSkills var teammates = Utilities.GetPlayers().Where(p => p.Team == playerTeam && p != player); string teammateSkills = ""; - var skillPlayer = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - + var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (skillPlayer != null) { skillPlayer.IsDrawing = false; - jSkill_SkillInfo randomSkill = new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false); + jSkill_SkillInfo randomSkill = new(Skills.None, Config.GetValue(Skills.None, "color"), false); - if (Instance?.GameRules?.WarmupPeriod == false) + if (Instance?.GameRules != null && Instance?.GameRules.WarmupPeriod == false) { - if (Config.config.Settings.GameMode == (int)Config.GameModes.Normal) + if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.Normal) { - List skillList = new List(SkillData.Skills); + List skillList = new(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).Count == 1) { - Config.DefaultSkillInfo[] skillsNeedsTeammates = Config.config.SkillsInfo.Where(s => s.NeedsTeammates).ToArray(); + Config.DefaultSkillInfo[] skillsNeedsTeammates = Config.LoadedConfig.SkillsInfo.Where(s => s.NeedsTeammates).ToArray(); skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString())); } @@ -173,11 +173,11 @@ namespace jRandomSkills randomSkill = skillList.Count == 0 ? new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false) : skillList[Instance.Random.Next(skillList.Count)]; } - else if (Config.config.Settings.GameMode == (int)Config.GameModes.TeamSkills) + else if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.TeamSkills) randomSkill = player.Team == CsTeam.Terrorist ? tSkill : ctSkill; - else if (Config.config.Settings.GameMode == (int)Config.GameModes.SameSkills) + else if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.SameSkills) randomSkill = allSkill; - else if (Config.config.Settings.GameMode == (int)Config.GameModes.Debug) + else if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.Debug) { if (debugSkills.Count == 0) debugSkills = new List(SkillData.Skills); @@ -194,17 +194,17 @@ namespace jRandomSkills if (randomSkill.Display) SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{randomSkill.Name}{ChatColors.Lime}: {randomSkill.Description}", false); - if (Config.config.Settings.TeamMateSkillInfo) + if (Config.LoadedConfig.Settings.TeamMateSkillInfo) { - Instance.AddTimer(0.5f, () => + Instance?.AddTimer(0.5f, () => { foreach (var teammate in teammates) { - var teammateSkill = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == teammate.SteamID)?.Skill; + var teammateSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == teammate.SteamID)?.Skill; if (teammateSkill != null) { var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == teammateSkill); - teammateSkills += $" {ChatColors.DarkRed}{teammate.PlayerName}{ChatColors.Lime}: {skillInfo.Name}\n"; + teammateSkills += $" {ChatColors.DarkRed}{teammate.PlayerName}{ChatColors.Lime}: {(skillInfo == null ? Skills.None : skillInfo.Name)}\n"; } } @@ -231,14 +231,15 @@ namespace jRandomSkills if (victim == null || attacker == null || victim == attacker) return HookResult.Continue; - if(Config.config.Settings.KillerSkillInfo) + if(Config.LoadedConfig.Settings.KillerSkillInfo) { - var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); if (attackerInfo != null) { var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.Skill); var specialSkillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.SpecialSkill); - string skillDesc = skillData?.Description; + if (skillData == null || specialSkillData == null) return HookResult.Continue; + string skillDesc = skillData.Description; SkillUtils.PrintToChat(victim, $"{Localization.GetTranslation("enemy_skill")} {ChatColors.DarkRed}{attacker.PlayerName}{ChatColors.Lime}:", false); SkillUtils.PrintToChat(victim, $"{ChatColors.DarkRed}{(attackerInfo.SpecialSkill == Skills.None ? skillData.Name : $"{specialSkillData.Name} -> {skillData.Name}")}{ChatColors.Lime} - {skillDesc}", false); @@ -248,5 +249,10 @@ namespace jRandomSkills return HookResult.Continue; }); } + + [GeneratedRegex(@"\{AUTHOR1\}", RegexOptions.IgnoreCase, "pl-PL")] + private static partial Regex MyRegex(); + [GeneratedRegex(@"\{AUTHOR2\}", RegexOptions.IgnoreCase, "pl-PL")] + private static partial Regex MyRegex1(); } } \ 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 727d77e..f1d6470 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs @@ -2,7 +2,6 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using System.Reflection.Metadata; using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; @@ -40,15 +39,14 @@ namespace jRandomSkills { if (Instance?.GameRules == null || Instance?.GameRules?.Handle == IntPtr.Zero) InitializeGameRules(); - else - Instance.GameRules.GameRestart = Instance?.GameRules?.RestartRoundTime < Server.CurrentTime; + else if (Instance != null) + Instance.GameRules.GameRestart = Instance.GameRules?.RestartRoundTime < Server.CurrentTime; } private static void UpdatePlayerHud(CCSPlayerController player) { if (player == null) return; - - var skillPlayer = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (skillPlayer == null) return; string infoLine = ""; @@ -83,7 +81,7 @@ namespace jRandomSkills var observedPlayer = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == pawn?.ObserverServices?.ObserverTarget?.Value?.Handle); if (observedPlayer == null) return; - var observeredPlayerSkill = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer.SteamID); + var observeredPlayerSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer.SteamID); if (observeredPlayerSkill == null) return; var observeredPlayerSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == observeredPlayerSkill.Skill); @@ -97,10 +95,9 @@ namespace jRandomSkills } } - if (string.IsNullOrEmpty(infoLine) && string.IsNullOrEmpty(skillLine)) - return; - + if (string.IsNullOrEmpty(infoLine) && string.IsNullOrEmpty(skillLine)) return; var hudContent = infoLine + skillLine; + if (player == null || !player.IsValid) return; player.PrintToCenterHtml(hudContent); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs index 56cc90c..697c402 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs @@ -39,7 +39,7 @@ namespace jRandomSkills CCSPlayerController attacker = attackerPawn.Controller.Value.As(); CCSPlayerController victim = victimPawn.Controller.Value.As(); - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); if (playerInfo == null) return HookResult.Continue; if (attacker.PawnIsAlive) diff --git a/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs b/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs index 5875041..1625fd9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs @@ -11,10 +11,10 @@ namespace jRandomSkills public class Anomaly : ISkill { private const Skills skillName = Skills.Anomaly; - private static int maxSize = Config.GetValue(skillName, "secondsInBack"); - private static float tickRate = 64; - private static float timerCooldown = Config.GetValue(skillName, "cooldown"); - private static readonly Dictionary SkillPlayerInfo = new Dictionary(); + private static readonly int maxSize = Config.GetValue(skillName, "secondsInBack"); + private static readonly float tickRate = 64; + private static readonly float timerCooldown = Config.GetValue(skillName, "cooldown"); + private static readonly Dictionary SkillPlayerInfo = []; public static void LoadSkill() { @@ -26,7 +26,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) EnableSkill(player); } @@ -44,11 +44,10 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); return HookResult.Continue; }); @@ -57,15 +56,16 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) { UpdateHUD(player, skillInfo); if (Server.TickCount % tickRate != 0) return; var pawn = player.PlayerPawn.Value; - if (pawn != null && pawn.IsValid) + 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)); if (skillInfo.LastRotations.Count > maxSize) @@ -86,15 +86,14 @@ namespace jRandomSkills SteamID = player.SteamID, CanUse = true, Cooldown = DateTime.MinValue, - LastPositions = new List(), - LastRotations = new List(), + LastPositions = [], + LastRotations = [], }; } public static void DisableSkill(CCSPlayerController player) { - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) @@ -132,8 +131,9 @@ namespace jRandomSkills { skillInfo.CanUse = false; skillInfo.Cooldown = DateTime.Now; - Vector lastPosition = skillInfo.LastPositions.FirstOrDefault(); - QAngle lastRotation = skillInfo.LastRotations.FirstOrDefault(); + if (skillInfo.LastRotations == null || skillInfo.LastRotations.Count == 0 || skillInfo.LastPositions == null || skillInfo.LastPositions.Count == 0) return; + Vector? lastPosition = skillInfo.LastPositions.FirstOrDefault(); + QAngle? lastRotation = skillInfo.LastRotations.FirstOrDefault(); if (lastPosition != null && lastRotation != null) playerPawn.Teleport(lastPosition, lastRotation, null); } @@ -145,19 +145,14 @@ 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 List? LastPositions { get; set; } + public List? LastRotations { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a86eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int secondsInBack = 5, float cooldown = 15) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int SecondsInBack { get; set; } - public float Cooldown { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#a86eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int secondsInBack = 5, float cooldown = 15) : base(skill, active, color, onlyTeam, needsTeammates) - { - SecondsInBack = secondsInBack; - Cooldown = cooldown; - } + public int SecondsInBack { get; set; } = secondsInBack; + public float Cooldown { get; set; } = cooldown; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs b/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs index 9738fac..7b9ca80 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs @@ -22,7 +22,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -35,13 +35,15 @@ namespace jRandomSkills { var player = @event.Userid; var attacker = @event.Attacker; - + + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return HookResult.Continue; + if (attacker == null || !attacker.IsValid) return HookResult.Continue; + var playerPawn = player.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid) return HookResult.Continue; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); if (playerInfo?.Skill == skillName) playerPawn.FlashDuration = 0.0f; @@ -57,11 +59,8 @@ namespace jRandomSkills SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#D6E6FF", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#D6E6FF", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs b/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs index 44b5aa0..a099066 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs @@ -21,11 +21,11 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); if (playerInfo?.Skill == skillName && hitgroup == (int)HitGroup_t.HITGROUP_HEAD) { - ApplyIronHeadEffect(victim, @event.DmgHealth); + ApplyIronHeadEffect(victim!, @event.DmgHealth); return HookResult.Stop; } @@ -36,6 +36,7 @@ namespace jRandomSkills private static void ApplyIronHeadEffect(CCSPlayerController victim, float damage) { var playerPawn = victim.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid) return; var newHealth = playerPawn.Health + damage; if (newHealth > 100) @@ -44,11 +45,8 @@ namespace jRandomSkills playerPawn.Health = (int)newHealth; } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8B4513", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#8B4513", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs index 5296644..aab7ad2 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs @@ -10,6 +10,8 @@ namespace jRandomSkills public class AreaReaper : ISkill { private const Skills skillName = Skills.AreaReaper; + private static readonly string[] bombsiteA = ["A", "a"]; + private static readonly string[] bombsiteB = ["B", "b"]; public static void LoadSkill() { @@ -22,7 +24,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -44,7 +46,7 @@ namespace jRandomSkills public static void TypeSkill(CCSPlayerController player, string[] commands) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillChance == 1) @@ -53,7 +55,7 @@ namespace jRandomSkills return; } - int site = new string[]{ "A", "a" }.Contains(commands[0]) ? 0 : new string[] { "B", "b" }.Contains(commands[0]) ? 1 : -1; + int site = bombsiteA.Contains(commands[0]) ? 0 : bombsiteB.Contains(commands[0]) ? 1 : -1; if (site == -1) { player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("areareaper_incorrect_site")}"); return; @@ -72,7 +74,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SkillChance = 0; SkillUtils.PrintToChat(player, Localization.GetTranslation("areareaper") + ":", false); @@ -81,9 +84,11 @@ namespace jRandomSkills player.PrintToChat($" {ChatColors.Green}· {ChatColors.Red}/t {ChatColors.Green}B"); } +#pragma warning disable IDE0060 // Usuń nieużywany parametr public static void DisableSkill(CCSPlayerController player) +#pragma warning restore IDE0060 // Usuń nieużywany parametr { - if (Instance.skillPlayer.FirstOrDefault(p => p.Skill == skillName) != null) + if (Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName) != null) return; EnableBombsite(); } @@ -95,11 +100,8 @@ namespace jRandomSkills bombTarget.AcceptInput("Enable"); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#edf5b5", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#edf5b5", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Armored.cs b/jRandomSkills - SRC Files/src/player/skills/Armored.cs index 050d39f..2d8d5c1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Armored.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Armored.cs @@ -27,7 +27,7 @@ namespace jRandomSkills { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -39,7 +39,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; float newScale = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "ChanceTo") - Config.GetValue(skillName, "ChanceFrom")) + Config.GetValue(skillName, "ChanceFrom"); playerInfo.SkillChance = newScale; @@ -55,8 +56,8 @@ namespace jRandomSkills if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) return HookResult.Continue; - CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.Handle); - CCSPlayerPawn victimPawn = new CCSPlayerPawn(param.Handle); + CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); + CCSPlayerPawn victimPawn = new(param.Handle); if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") return HookResult.Continue; @@ -67,24 +68,22 @@ namespace jRandomSkills CCSPlayerController attacker = attackerPawn.Controller.Value.As(); CCSPlayerController victim = victimPawn.Controller.Value.As(); - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); if (playerInfo == null) return HookResult.Continue; if (playerInfo.Skill == skillName && victim.PawnIsAlive) - param2.Damage *= (float)playerInfo.SkillChance; + { + float? skillChance = playerInfo.SkillChance; + param2.Damage *= skillChance ?? 1f; + } return HookResult.Continue; } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#d1430a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .65f, float chanceTo = .85f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float ChanceFrom { get; set; } - public float ChanceTo { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#d1430a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .65f, float chanceTo = .85f) : base(skill, active, color, onlyTeam, needsTeammates) - { - ChanceFrom = chanceFrom; - ChanceTo = chanceTo; - } + public float ChanceFrom { get; set; } = chanceFrom; + public float ChanceTo { get; set; } = chanceTo; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Assassin.cs b/jRandomSkills - SRC Files/src/player/skills/Assassin.cs index e0be636..d2ba9d9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Assassin.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Assassin.cs @@ -8,9 +8,9 @@ namespace jRandomSkills public class Assassin : ISkill { private const Skills skillName = Skills.Assassin; - private static float damageMultiplier = Config.GetValue(skillName, "damageMultiplier"); - private static float toleranceDeg = Config.GetValue(skillName, "toleranceDeg"); - private static string[] nades = { "inferno", "flashbang", "smokegrenade", "decoy", "hegrenade" }; + private static readonly float damageMultiplier = Config.GetValue(skillName, "damageMultiplier"); + private static readonly float toleranceDeg = Config.GetValue(skillName, "toleranceDeg"); + private static readonly string[] nades = ["inferno", "flashbang", "smokegrenade", "decoy", "hegrenade"]; public static void LoadSkill() { @@ -27,11 +27,11 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; if (nades.Contains(weapon)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; - if (IsBehind(attacker, victim)) - SkillUtils.TakeHealth(victim.PlayerPawn.Value, (int)(damage * (damageMultiplier - 1f))); + if (IsBehind(attacker!, victim!)) + SkillUtils.TakeHealth(victim!.PlayerPawn.Value, (int)(damage * (damageMultiplier - 1f))); return HookResult.Continue; }); @@ -42,6 +42,7 @@ namespace jRandomSkills var attackerPawn = attacker.PlayerPawn.Value; var victimPawn = victim.PlayerPawn.Value; if (attackerPawn == null || !attackerPawn.IsValid || victimPawn == null || !victimPawn.IsValid) return false; + if (victimPawn.AbsRotation == null || attackerPawn.AbsRotation == null) return false; var angles = GetAngleRange(victimPawn.AbsRotation.Y); return IsBeetween(angles.Item1, angles.Item2, attackerPawn.AbsRotation.Y); } @@ -64,15 +65,10 @@ namespace jRandomSkills return (target >= a || target <= b); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#d9d9d9", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float damageMultiplier = 2f, float toleranceDeg = 45f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float DamageMultiplier { get; set; } - public float ToleranceDeg { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#d9d9d9", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float damageMultiplier = 2f, float toleranceDeg = 45f) : base(skill, active, color, onlyTeam, needsTeammates) - { - DamageMultiplier = damageMultiplier; - ToleranceDeg = toleranceDeg; - } + public float DamageMultiplier { get; set; } = damageMultiplier; + public float ToleranceDeg { get; set; } = toleranceDeg; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs b/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs index c8a6655..03711a6 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs @@ -21,7 +21,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerPawn = player.PlayerPawn.Value; if (playerInfo?.Skill == skillName && playerPawn != null) @@ -48,25 +48,22 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - player.Pawn.Value.ActualGravityScale = 1; + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; + player.PlayerPawn.Value.ActualGravityScale = 1; } private static void ApplyGravityModifier(CCSPlayerController player) { + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; float gravityModifier = (float)Math.Round(Instance.Random.NextDouble() * (Config.GetValue(skillName, "ChanceTo") - Config.GetValue(skillName, "chanceFrom")) + Config.GetValue(skillName, "chanceFrom"), 1); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("astronaut")}{ChatColors.Lime}: " + Localization.GetTranslation("astronaut_desc2", gravityModifier), false); - player.Pawn.Value.ActualGravityScale = gravityModifier; + player.PlayerPawn.Value.ActualGravityScale = gravityModifier; } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#7E10AD", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .1f, float chanceTo = .7f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float ChanceFrom { get; set; } - public float ChanceTo { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#7E10AD", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .1f, float chanceTo = .7f) : base(skill, active, color, onlyTeam, needsTeammates) - { - ChanceFrom = chanceFrom; - ChanceTo = chanceTo; - } + public float ChanceFrom { get; set; } = chanceFrom; + public float ChanceTo { get; set; } = chanceTo; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs index afebce6..b058f21 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs @@ -10,10 +10,10 @@ namespace jRandomSkills public class Baseball : ISkill { private const Skills skillName = Skills.Baseball; - private static float speedMultipier = Config.GetValue(skillName, "speedMultipier"); - private static float maxSpeed = Config.GetValue(skillName, "maxSpeed"); - private static int damageDeal = Config.GetValue(skillName, "damageDeal"); - private static HashSet decoys = new HashSet(); + private static readonly float speedMultipier = Config.GetValue(skillName, "speedMultipier"); + private static readonly float maxSpeed = Config.GetValue(skillName, "maxSpeed"); + private static readonly int damageDeal = Config.GetValue(skillName, "damageDeal"); + private static readonly HashSet decoys = []; public static void LoadSkill() { @@ -26,7 +26,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -44,10 +44,10 @@ namespace jRandomSkills if (weapon != "decoy") return HookResult.Continue; if (!Instance.IsPlayerValid(victim) || !Instance.IsPlayerValid(attacker)) return HookResult.Continue; - var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); if (attackerInfo?.Skill != skillName) return HookResult.Continue; - SkillUtils.TakeHealth(victim.PlayerPawn.Value, damageDeal); + SkillUtils.TakeHealth(victim!.PlayerPawn.Value, damageDeal); return HookResult.Continue; }); @@ -58,10 +58,15 @@ namespace jRandomSkills return; var decoy = @event.As(); + if (decoy == null || !decoy.IsValid || decoy.OwnerEntity == null || decoy.OwnerEntity.Value == null || !decoy.OwnerEntity.Value.IsValid) return; + var pawn = decoy.OwnerEntity.Value.As(); + if (pawn == null || !pawn.IsValid || pawn.Controller == null || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; + var player = pawn.Controller.Value.As(); + if (player == null || !player.IsValid) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; decoys.Add(decoy); }); @@ -69,7 +74,8 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; var decoy = decoys.FirstOrDefault(d => d.Index == @event.Entityid); @@ -86,7 +92,7 @@ namespace jRandomSkills { foreach (var decoy in decoys) { - if (decoy == null || !decoy.IsValid) + if (!decoy.IsValid) { decoys.Remove(decoy); continue; @@ -114,17 +120,11 @@ namespace jRandomSkills SkillUtils.TryGiveWeapon(player, CsItem.DecoyGrenade); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#2effc7", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float speedMultipier = 2f, float maxSpeed = 900f, int damageDeal = 9999) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float SpeedMultipier { get; set; } - public float MaxSpeed { get; set; } - public float DamageDeal { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#2effc7", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float speedMultipier = 2f, float maxSpeed = 900f, int damageDeal = 9999) : base(skill, active, color, onlyTeam, needsTeammates) - { - SpeedMultipier = speedMultipier; - MaxSpeed = maxSpeed; - DamageDeal = damageDeal; - } + public float SpeedMultipier { get; set; } = speedMultipier; + public float MaxSpeed { get; set; } = maxSpeed; + public float DamageDeal { get; set; } = damageDeal; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Behind.cs b/jRandomSkills - SRC Files/src/player/skills/Behind.cs index bc70b14..281fdaa 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Behind.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Behind.cs @@ -23,7 +23,7 @@ namespace jRandomSkills { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -40,9 +40,9 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (playerInfo?.Skill == skillName && victim.PawnIsAlive) + if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) { if (Instance.Random.NextDouble() <= playerInfo.SkillChance) RotateEnemy(victim); @@ -54,7 +54,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; float newChance = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "ChanceTo") - Config.GetValue(skillName, "ChanceFrom")) + Config.GetValue(skillName, "ChanceFrom"); playerInfo.SkillChance = newChance; newChance = (float)Math.Round(newChance, 2) * 100; @@ -64,30 +65,27 @@ namespace jRandomSkills private static void RotateEnemy(CCSPlayerController player) { - if (player.PlayerPawn.Value.LifeState != (int)LifeState_t.LIFE_ALIVE) - return; + if (player == null || !player.IsValid) return; + var pawn = player.PlayerPawn.Value; - var currentPosition = player.PlayerPawn.Value.AbsOrigin; - var currentAngles = player.PlayerPawn.Value.EyeAngles; + if (pawn == null || !pawn.IsValid || pawn.LifeState != (int)LifeState_t.LIFE_ALIVE) return; - QAngle newAngles = new QAngle( + var currentPosition = pawn.AbsOrigin; + var currentAngles = pawn.EyeAngles; + + QAngle newAngles = new( currentAngles.X, currentAngles.Y + 180, currentAngles.Z ); - player.PlayerPawn.Value.Teleport(currentPosition, newAngles, new Vector(0, 0, 0)); + pawn.Teleport(currentPosition, newAngles, new Vector(0, 0, 0)); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#00FF00", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .2f, float chanceTo = .4f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float ChanceFrom { get; set; } - public float ChanceTo { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#00FF00", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .2f, float chanceTo = .4f) : base(skill, active, color, onlyTeam, needsTeammates) - { - ChanceFrom = chanceFrom; - ChanceTo = chanceTo; - } + public float ChanceFrom { get; set; } = chanceFrom; + public float ChanceTo { get; set; } = chanceTo; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs b/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs index 0f91f24..e7f39ed 100644 --- a/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs +++ b/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs @@ -9,9 +9,9 @@ namespace jRandomSkills public class BladeMaster : ISkill { private const Skills skillName = Skills.BladeMaster; - private static string[] noReflectionWeapon = { "inferno", "flashbang", "smokegrenade", "decoy", "hegrenade", "knife", "taser" }; - private static float torseReflectionChance = Config.GetValue(skillName, "torseReflectionChance") * 100; - private static float legReflectionChance = Config.GetValue(skillName, "legReflectionChance") * 100; + private static readonly string[] noReflectionWeapon = ["inferno", "flashbang", "smokegrenade", "decoy", "hegrenade", "knife", "taser"]; + private static readonly float torseReflectionChance = Config.GetValue(skillName, "torseReflectionChance") * 100; + private static readonly float legReflectionChance = Config.GetValue(skillName, "legReflectionChance") * 100; public static void LoadSkill() { @@ -25,7 +25,7 @@ namespace jRandomSkills string weapon = @event.Weapon; if (noReflectionWeapon.Contains(weapon) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; - var victimInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue; int chance = Instance.Random.Next(0, 101); @@ -38,11 +38,12 @@ namespace jRandomSkills if (chance > torseReflectionChance) return HookResult.Continue; - var pawn = victim.PlayerPawn.Value; + var pawn = victim!.PlayerPawn.Value; if (pawn == null || !pawn.IsValid) return HookResult.Continue; - var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; - if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_knife") return HookResult.Continue; + var weaponServices = pawn.WeaponServices; + if (weaponServices == null) return HookResult.Continue; + if (weaponServices.ActiveWeapon == null || !weaponServices.ActiveWeapon.IsValid || weaponServices.ActiveWeapon.Value == null || !weaponServices.ActiveWeapon.Value.IsValid || weaponServices.ActiveWeapon.Value.DesignerName != "weapon_knife") return HookResult.Continue; RestoreHealth(victim, damage); return HookResult.Stop; @@ -52,6 +53,7 @@ namespace jRandomSkills private static void RestoreHealth(CCSPlayerController victim, float damage) { var playerPawn = victim.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid || playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; var newHealth = playerPawn.Health + damage; if (newHealth > 100) @@ -61,15 +63,10 @@ namespace jRandomSkills Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth"); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#cc7504", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float torseReflectionChance = .95f, float legReflectionChance = .80f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float TorseReflectionChance { get; set; } - public float LegReflectionChance { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#cc7504", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float torseReflectionChance = .95f, float legReflectionChance = .80f) : base(skill, active, color, onlyTeam, needsTeammates) - { - TorseReflectionChance = torseReflectionChance; - LegReflectionChance = legReflectionChance; - } + public float TorseReflectionChance { get; set; } = torseReflectionChance; + public float LegReflectionChance { get; set; } = legReflectionChance; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs index 7c35b37..0ea43c1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs +++ b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs @@ -24,7 +24,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) GiveBunnyHop(player); } diff --git a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs index 53aa562..95b9132 100644 --- a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs +++ b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs @@ -25,7 +25,7 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(player)) continue; var playerPawn = player.PlayerPawn?.Value; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -37,9 +37,9 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - if (!player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue; + if (player == null || !player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) DisableSkill(player); @@ -50,9 +50,9 @@ namespace jRandomSkills { var player = @event.Userid; if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; - EnableSkill(player); + EnableSkill(player!); return HookResult.Continue; }); @@ -62,18 +62,18 @@ namespace jRandomSkills var weapon = @event.Item; if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; if (weapon == "c4") { - SetPlayerVisibility(player, false); - SetWeaponVisibility(player, false); + SetPlayerVisibility(player!, false); + SetWeaponVisibility(player!, false); } else { - SetPlayerVisibility(player, true); - SetWeaponVisibility(player, true); + SetPlayerVisibility(player!, true); + SetWeaponVisibility(player!, true); } return HookResult.Continue; }); @@ -81,8 +81,16 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var activeWeapon = player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value; - if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_c4") return; + if (player == null || !player.IsValid) return; + var playerPawn = player.PlayerPawn.Value; + + if (playerPawn == null || !playerPawn.IsValid) return; + if (playerPawn.WeaponServices == null || playerPawn.WeaponServices.ActiveWeapon == null || !playerPawn.WeaponServices.ActiveWeapon.IsValid) return; + if (playerPawn.WeaponServices.ActiveWeapon.Value == null || !playerPawn.WeaponServices.ActiveWeapon.Value.IsValid) return; + + var activeWeapon = playerPawn.WeaponServices.ActiveWeapon.Value; + if (activeWeapon.DesignerName != "weapon_c4") return; + SetPlayerVisibility(player, false); SetWeaponVisibility(player, false); } @@ -97,7 +105,7 @@ namespace jRandomSkills private static void SetPlayerVisibility(CCSPlayerController player, bool enabled) { var playerPawn = player.PlayerPawn.Value; - if (playerPawn != null) + if (playerPawn != null && playerPawn.IsValid) { var color = Color.FromArgb(enabled ? 255 : 0, 255, 255, 255); playerPawn.Render = color; @@ -109,10 +117,12 @@ namespace jRandomSkills { if (!Instance.IsPlayerValid(player)) return; var playerPawn = player.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid) return; + var weaponServices = playerPawn.WeaponServices; + if (weaponServices == null) return; var color = Color.FromArgb(enabled ? 255 : 0, 255, 255, 255); - - foreach (var weapon in playerPawn.WeaponServices?.MyWeapons) + foreach (var weapon in weaponServices.MyWeapons) { if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) { @@ -122,11 +132,8 @@ namespace jRandomSkills } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#00911f", CsTeam onlyTeam = CsTeam.Terrorist, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#00911f", CsTeam onlyTeam = CsTeam.Terrorist, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Catapult.cs b/jRandomSkills - SRC Files/src/player/skills/Catapult.cs index 9f4b60b..cdde229 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Catapult.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Catapult.cs @@ -23,7 +23,7 @@ namespace jRandomSkills { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -38,9 +38,9 @@ namespace jRandomSkills var victim = @event.Userid; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (attackerInfo?.Skill == skillName && victim.PawnIsAlive) + if (attackerInfo?.Skill == skillName && victim!.PawnIsAlive) { if (Instance.Random.NextDouble() <= attackerInfo.SkillChance) { @@ -58,7 +58,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; float newChance = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "chanceTo") - Config.GetValue(skillName, "chanceFrom")) + Config.GetValue(skillName, "chanceFrom"); playerInfo.SkillChance = newChance; newChance = (float)Math.Round(newChance, 2) * 100; @@ -66,15 +67,10 @@ namespace jRandomSkills SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("catapult")}{ChatColors.Lime}: " + Localization.GetTranslation("catapult_desc2", newChance), false); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#FF4500", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .2f, float chanceTo = .4f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float ChanceFrom { get; set; } - public float ChanceTo { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#FF4500", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .2f, float chanceTo = .4f) : base(skill, active, color, onlyTeam, needsTeammates) - { - ChanceFrom = chanceFrom; - ChanceTo = chanceTo; - } + public float ChanceFrom { get; set; } = chanceFrom; + public float ChanceTo { get; set; } = chanceTo; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs index 2ff6a19..5d31d3a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs @@ -13,35 +13,17 @@ namespace jRandomSkills { private const Skills skillName = Skills.Chicken; private static bool roundEnd = false; - private static string[] disabledWeapons = - { - "weapon_ak47", - "weapon_m4a4", - "weapon_m4a1", - "weapon_m4a1_silencer", - "weapon_famas", - "weapon_galilar", - "weapon_aug", - "weapon_sg553", - "weapon_mp9", - "weapon_mac10", - "weapon_bizon", - "weapon_mp7", - "weapon_ump45", - "weapon_p90", - "weapon_mp5sd", - "weapon_ssg08", - "weapon_awp", - "weapon_scar20", - "weapon_g3sg1", - "weapon_nova", - "weapon_xm1014", - "weapon_mag7", - "weapon_sawedoff", - "weapon_m249", + private static readonly string[] disabledWeapons = + [ + "weapon_ak47", "weapon_m4a4", "weapon_m4a1", "weapon_m4a1_silencer", + "weapon_famas", "weapon_galilar", "weapon_aug", "weapon_sg553", + "weapon_mp9", "weapon_mac10", "weapon_bizon", "weapon_mp7", + "weapon_ump45", "weapon_p90", "weapon_mp5sd", "weapon_ssg08", + "weapon_awp", "weapon_scar20", "weapon_g3sg1", "weapon_nova", + "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_m249", "weapon_negev" - }; - private static Dictionary chickens = new Dictionary(); + ]; + private static readonly Dictionary chickens = []; public static void LoadSkill() { @@ -55,7 +37,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -70,7 +52,7 @@ namespace jRandomSkills { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; DisableSkill(player); } @@ -81,9 +63,9 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - if (!player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue; + if (player == null || !player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) DisableSkill(player); @@ -93,7 +75,8 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; SetWeaponAttack(player, true); return HookResult.Continue; @@ -112,13 +95,14 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { var playerPawn = player.PlayerPawn?.Value; - if (playerPawn != null) + if (playerPawn != null && playerPawn.IsValid) { playerPawn.VelocityModifier = 1.1f; playerPawn.Health = 50; Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth"); + if (playerPawn.CBodyComponent == null || playerPawn.CBodyComponent.SceneNode == null) return; playerPawn.CBodyComponent.SceneNode.Scale = 0.2f; Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent"); @@ -141,6 +125,7 @@ namespace jRandomSkills playerPawn.Health += 50; Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth"); + if (playerPawn.CBodyComponent == null || playerPawn.CBodyComponent.SceneNode == null) return; playerPawn.CBodyComponent.SceneNode.Scale = 1f; Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent"); @@ -163,11 +148,11 @@ namespace jRandomSkills { if (roundEnd || player == null || !player.IsValid) return; var pawn = player?.PlayerPawn?.Value; - if (pawn == null || !pawn.IsValid) return; + if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null || pawn.WeaponServices.MyWeapons == null) return; - foreach (var weapon in pawn?.WeaponServices?.MyWeapons) + foreach (var weapon in pawn.WeaponServices.MyWeapons) if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) - if (disabledWeapons.Contains(weapon?.Value?.DesignerName)) + if (disabledWeapons.Contains(weapon.Value.DesignerName)) { weapon.Value.NextPrimaryAttackTick = disableWeapon ? int.MaxValue : Server.TickCount; weapon.Value.NextSecondaryAttackTick = disableWeapon ? int.MaxValue : Server.TickCount; @@ -180,10 +165,11 @@ namespace jRandomSkills private static void CreateChicken(CCSPlayerController player) { var playerPawn = player.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid) return; var chickenModel = Utilities.CreateEntityByName("prop_dynamic"); if (chickenModel == null) return; - Vector pos = new Vector(0, 0, 0); + Vector pos = new(0, 0, 0); chickenModel.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(chickenModel.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); chickenModel.SetModel("models/chicken/chicken.vmdl"); @@ -195,22 +181,22 @@ namespace jRandomSkills Instance.AddTimer(1f, () => chickens.TryAdd(player, chickenModel)); } - private static async void OnTick() + private static void OnTick() { foreach (var valuePair in chickens) { var player = valuePair.Key; var chicken = valuePair.Value; if (player == null || !player.IsValid) continue; - if (chicken == null && !chicken.IsValid) continue; + if (chicken == null || !chicken.IsValid) continue; var pawn = player.Pawn.Value; - if (pawn == null && !pawn.IsValid) continue; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null || chicken.AbsOrigin == null) continue; float X = (float)Math.Round(pawn.AbsOrigin.X, 2); float Y = (float)Math.Round(pawn.AbsOrigin.Y, 2); float Z = (float)Math.Round(pawn.AbsOrigin.Z, 2); - Vector pos = new Vector(X, Y, Z); + Vector pos = new(X, Y, Z); if (chicken.AbsOrigin.X != pos.X || chicken.AbsOrigin.Y != pos.Y || chicken.AbsOrigin.Z != pos.Z) chicken.Teleport(pos, pawn.AbsRotation, null); UpdateHUD(player); @@ -219,10 +205,14 @@ namespace jRandomSkills private static void UpdateHUD(CCSPlayerController player) { + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; + var pawn = player.PlayerPawn.Value; + if (pawn.WeaponServices == null || pawn.WeaponServices.ActiveWeapon == null || !pawn.WeaponServices.ActiveWeapon.IsValid || pawn.WeaponServices.ActiveWeapon.Value == null || !pawn.WeaponServices.ActiveWeapon.Value.IsValid) return; + var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == skillName); if (skillData == null) return; - var weapon = player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value; + var weapon = pawn.WeaponServices.ActiveWeapon.Value; if (weapon == null || !disabledWeapons.Contains(weapon.DesignerName)) return; string infoLine = $"{Localization.GetTranslation("your_skill")}:
"; @@ -233,11 +223,8 @@ namespace jRandomSkills player.PrintToCenterHtml(hudContent); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#FF8B42", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#FF8B42", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs b/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs index 6c8a0e7..80876dc 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs @@ -9,7 +9,7 @@ namespace jRandomSkills public class ChillOut : ISkill { private const Skills skillName = Skills.ChillOut; - private static float bombArmedTime = Config.GetValue(skillName, "bombArmedTime"); + private static readonly float bombArmedTime = Config.GetValue(skillName, "bombArmedTime"); public static void LoadSkill() { @@ -21,12 +21,12 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var anyChillOut = Instance.skillPlayer.FirstOrDefault(p => p.Skill == skillName); + var anyChillOut = Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName); if (anyChillOut != null) { var bombEntities = Utilities.FindAllEntitiesByDesignerName("weapon_c4").ToList(); - if (bombEntities.Any()) + if (bombEntities.Count != 0) { var bomb = bombEntities.FirstOrDefault(); if (bomb != null) @@ -38,13 +38,9 @@ namespace jRandomSkills }); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#343deb", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false, float bombArmedTime = 10f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float BombArmedTime { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#343deb", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false, float bombArmedTime = 10f) : base(skill, active, color, onlyTeam, needsTeammates) - { - BombArmedTime = bombArmedTime; - } + public float BombArmedTime { get; set; } = bombArmedTime; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Cutter.cs b/jRandomSkills - SRC Files/src/player/skills/Cutter.cs index de36510..b89db55 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Cutter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Cutter.cs @@ -22,20 +22,17 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; if (weapon == "knife") - SkillUtils.TakeHealth(victim.PlayerPawn.Value, 9999); + SkillUtils.TakeHealth(victim!.PlayerPawn.Value, 9999); return HookResult.Continue; }); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#88a31a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#88a31a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs index 4448ee0..82a4ec1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs @@ -10,9 +10,9 @@ namespace jRandomSkills public class Darkness : ISkill { private const Skills skillName = Skills.Darkness; - private static float brightness = Config.GetValue(skillName, "brightness"); - private static Dictionary deafultPostProcessing = new Dictionary(); - private static List newPostProcessing = new List(); + private static readonly float brightness = Config.GetValue(skillName, "brightness"); + private static readonly Dictionary deafultPostProcessing = []; + private static readonly List newPostProcessing = []; public static void LoadSkill() { @@ -25,7 +25,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -46,7 +46,9 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { - SetUpPostProcessing(@event.Userid, true); + var player = @event.Userid; + if (player == null || !player.IsValid) return HookResult.Continue; + SetUpPostProcessing(player, true); return HookResult.Continue; }); } @@ -54,7 +56,7 @@ namespace jRandomSkills public static void TypeSkill(CCSPlayerController player, string[] commands) { if (player == null || !player.IsValid || !player.PawnIsAlive) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillChance == 1) @@ -80,7 +82,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SkillChance = 0; SkillUtils.PrintToChat(player, Localization.GetTranslation("darkness") + ":", false); @@ -104,11 +107,18 @@ namespace jRandomSkills private static void SetUpPostProcessing(CCSPlayerController player, bool dontCreateNew = false) { + if (player == null || !player.IsValid) return; + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return; + + var postProcessingVolumes = pawn.CameraServices.PostProcessingVolumes.FirstOrDefault(); + if (postProcessingVolumes == null || postProcessingVolumes.Value == null) return; + if (deafultPostProcessing.TryGetValue(player, out var oldPostProcessing)) { - player.PlayerPawn.Value.CameraServices.PostProcessingVolumes.FirstOrDefault().Raw = oldPostProcessing.EntityHandle.Raw; + postProcessingVolumes.Raw = oldPostProcessing.EntityHandle.Raw; deafultPostProcessing.Remove(player); - Utilities.SetStateChanged(player.PlayerPawn.Value, "CBasePlayerPawn", "m_pCameraServices"); + Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices"); return; } @@ -116,21 +126,19 @@ namespace jRandomSkills return; var postProcessing = Utilities.CreateEntityByName("post_processing_volume"); + if (postProcessing == null) return; + postProcessing.ExposureControl = true; postProcessing.MaxExposure = brightness; postProcessing.MinExposure = brightness; - deafultPostProcessing.TryAdd(player, player.PlayerPawn.Value.CameraServices.PostProcessingVolumes.FirstOrDefault().Value); - player.PlayerPawn.Value.CameraServices.PostProcessingVolumes.FirstOrDefault().Raw = postProcessing.EntityHandle.Raw; - Utilities.SetStateChanged(player.PlayerPawn.Value, "CBasePlayerPawn", "m_pCameraServices"); + deafultPostProcessing.TryAdd(player, postProcessingVolumes.Value); + postProcessingVolumes.Raw = postProcessing.EntityHandle.Raw; + Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices"); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#383838", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float brightness = .01f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Brightness { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#383838", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float brightness = .01f) : base(skill, active, color, onlyTeam, needsTeammates) - { - Brightness = brightness; - } + public float Brightness { get; set; } = brightness; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs index eaee80b..1be27ab 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs @@ -22,7 +22,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -35,7 +35,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) DisableSkill(player); } @@ -47,7 +47,7 @@ namespace jRandomSkills { if (player == null) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; var playerPawn = player.PlayerPawn.Value; @@ -76,9 +76,10 @@ namespace jRandomSkills { foreach (var enemy in enemies) { - var enemyInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); if (enemyInfo == null) continue; var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); + if (skillData == null) continue; player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: {ChatColors.Red}{skillData.Name}"); } } @@ -89,14 +90,15 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SpecialSkill = Skills.None; } private static void DeacitvateSkill(CCSPlayerController player, CCSPlayerController enemy) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - var enemyInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); if (playerInfo != null) { @@ -107,18 +109,15 @@ namespace jRandomSkills if (enemyInfo != null) { - Instance.SkillAction(enemyInfo.Skill.ToString(), "DisableSkill", new object[] { enemy }); + Instance.SkillAction(enemyInfo.Skill.ToString(), "DisableSkill", [enemy]); enemyInfo.SpecialSkill = enemyInfo.Skill; enemyInfo.Skill = Skills.None; enemy.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("deactivator_enemy_info")); } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#919191", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#919191", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs index 9b05858..4a0fd4d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs @@ -10,7 +10,7 @@ namespace jRandomSkills public class Deaf : ISkill { private const Skills skillName = Skills.Deaf; - private static HashSet deafPlayers = new HashSet(); + private static readonly HashSet deafPlayers = []; public static void LoadSkill() { @@ -24,7 +24,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -35,7 +35,9 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { - DisableSkill(@event.Userid); + var player = @event.Userid; + if (player == null || !player.IsValid) return HookResult.Continue; + DisableSkill(player); return HookResult.Continue; }); @@ -61,7 +63,7 @@ namespace jRandomSkills public static void TypeSkill(CCSPlayerController player, string[] commands) { if (player == null || !player.IsValid || !player.PawnIsAlive) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillChance == 1) @@ -87,7 +89,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SkillChance = 0; SkillUtils.PrintToChat(player, Localization.GetTranslation("deaf") + ":", false); @@ -109,11 +112,8 @@ namespace jRandomSkills deafPlayers.Remove(player); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#dae01f", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#dae01f", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs b/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs index 4bc8a2f..bc1aae9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs @@ -23,7 +23,7 @@ namespace jRandomSkills { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -38,9 +38,9 @@ namespace jRandomSkills var victim = @event.Userid; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (playerInfo?.Skill == skillName && victim.PawnIsAlive) + if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) { if (Instance.Random.NextDouble() <= playerInfo.SkillChance) { @@ -59,7 +59,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; float newChance = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "chanceTo") - Config.GetValue(skillName, "chanceFrom")) + Config.GetValue(skillName, "chanceFrom"); playerInfo.SkillChance = newChance; newChance = (float)Math.Round(newChance, 2) * 100; @@ -67,15 +68,10 @@ namespace jRandomSkills SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("disarmament")}{ChatColors.Lime}: " + Localization.GetTranslation("disarmament_desc2", newChance), false); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#FF4500", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .2f, float chanceTo = .5f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float ChanceFrom { get; set; } - public float ChanceTo { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#FF4500", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .2f, float chanceTo = .5f) : base(skill, active, color, onlyTeam, needsTeammates) - { - ChanceFrom = chanceFrom; - ChanceTo = chanceTo; - } + public float ChanceFrom { get; set; } = chanceFrom; + public float ChanceTo { get; set; } = chanceTo; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Distancer.cs b/jRandomSkills - SRC Files/src/player/skills/Distancer.cs index de5839d..fec7440 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Distancer.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Distancer.cs @@ -10,7 +10,7 @@ namespace jRandomSkills public class Distancer : ISkill { private const Skills skillName = Skills.Distancer; - private static HashSet distancerPlayers = new HashSet(); + private static readonly HashSet distancerPlayers = []; public static void LoadSkill() { @@ -23,7 +23,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -60,7 +60,7 @@ namespace jRandomSkills { var enemyPawn = enemy.PlayerPawn.Value; if (enemyPawn == null || !enemyPawn.IsValid) continue; - if (enemyPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) continue; + if (enemyPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE || playerPawn.AbsOrigin == null || enemyPawn.AbsOrigin == null) continue; double distance = (int)SkillUtils.GetDistance(playerPawn.AbsOrigin, enemyPawn.AbsOrigin); if (distance >= closetDistance) continue; closetDistance = distance; @@ -88,11 +88,8 @@ namespace jRandomSkills distancerPlayers.Remove(player); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#00f2ff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#00f2ff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Dracula.cs b/jRandomSkills - SRC Files/src/player/skills/Dracula.cs index 078e8ee..3261957 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dracula.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dracula.cs @@ -9,7 +9,7 @@ namespace jRandomSkills public class Dracula : ISkill { private const Skills skillName = Skills.Dracula; - private static float healthRegainScale = Config.GetValue(skillName, "healthRegainScale"); + private static readonly float healthRegainScale = Config.GetValue(skillName, "healthRegainScale"); public static void LoadSkill() { @@ -22,11 +22,11 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (playerInfo?.Skill == skillName && victim.PawnIsAlive) + if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) { - HealAttacker(attacker, @event.DmgHealth); + HealAttacker(attacker!, @event.DmgHealth); } return HookResult.Continue; }); @@ -46,13 +46,9 @@ namespace jRandomSkills Utilities.SetStateChanged(attackerPawn, "CBaseEntity", "m_iHealth"); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#FA050D", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float healthRegainScale = .3f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float HealthRegainScale { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#FA050D", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float healthRegainScale = .3f) : base(skill, active, color, onlyTeam, needsTeammates) - { - HealthRegainScale = healthRegainScale; - } + public float HealthRegainScale { get; set; } = healthRegainScale; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs index 15be89c..78171e8 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs @@ -22,7 +22,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -36,7 +36,7 @@ namespace jRandomSkills { if (player == null) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; var playerPawn = player.PlayerPawn.Value; @@ -65,8 +65,10 @@ namespace jRandomSkills { foreach (var enemy in enemies) { - var enemyInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + if (enemyInfo == null) continue; var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); + if (skillData == null) continue; player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: {ChatColors.Red}{skillData.Name}"); } } @@ -77,30 +79,28 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SpecialSkill = Skills.None; } private static void DuplicateSkill(CCSPlayerController player, CCSPlayerController enemy) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - var enemyInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); - if (playerInfo != null) + if (playerInfo != null && enemyInfo != null) { playerInfo.Skill = enemyInfo.Skill; playerInfo.SpecialSkill = skillName; - Instance.SkillAction(enemyInfo.Skill.ToString(), "EnableSkill", new object[] { player }); + Instance.SkillAction(enemyInfo.Skill.ToString(), "EnableSkill", [player]); player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("duplicator_player_info", enemy.PlayerName)); } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffb73b", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffb73b", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs b/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs index 692a35f..7f1ef0f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs @@ -23,7 +23,7 @@ namespace jRandomSkills { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); player.Respawn(); @@ -49,7 +49,9 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { - DisableSkill(@event.Userid); + var player = @event.Userid; + if (player == null || !player.IsValid) return HookResult.Continue; + DisableSkill(player); return HookResult.Continue; }); } @@ -57,12 +59,13 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { var playerPawn = player.PlayerPawn?.Value; - if (playerPawn != null) + if (playerPawn != null && player.IsValid) { float newSize = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "maxScale") - Config.GetValue(skillName, "minScale")) + Config.GetValue(skillName, "minScale"); newSize = (float)Math.Round(newSize, 2); // playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = newSize; + if (playerPawn.CBodyComponent == null || playerPawn.CBodyComponent.SceneNode == null) return; playerPawn.CBodyComponent.SceneNode.Scale = newSize; Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent"); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("dwarf")}{ChatColors.Lime}: " + Localization.GetTranslation("dwarf_desc2", newSize), false); @@ -75,21 +78,16 @@ namespace jRandomSkills if (playerPawn != null && playerPawn?.CBodyComponent != null) { // playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = 1; + if (playerPawn.CBodyComponent == null || playerPawn.CBodyComponent.SceneNode == null) return; playerPawn.CBodyComponent.SceneNode.Scale = 1; Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent"); } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffff00", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float minScale = .6f, float maxScale = .95f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float MinScale { get; set; } - public float MaxScale { get; set; } - - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffff00", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float minScale = .6f, float maxScale = .95f) : base(skill, active, color, onlyTeam, needsTeammates) - { - MinScale = minScale; - MaxScale = maxScale; - } + public float MinScale { get; set; } = minScale; + public float MaxScale { get; set; } = maxScale; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs index a58162f..35f44f0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs +++ b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs @@ -11,8 +11,8 @@ namespace jRandomSkills public class EnemySpawn : ISkill { private const Skills skillName = Skills.EnemySpawn; - private static float timerCooldown = Config.GetValue(skillName, "cooldown"); - private static readonly Dictionary SkillPlayerInfo = new Dictionary(); + private static readonly float timerCooldown = Config.GetValue(skillName, "cooldown"); + private static readonly Dictionary SkillPlayerInfo = []; public static void LoadSkill() { @@ -25,7 +25,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) { EnableSkill(player); @@ -45,11 +45,10 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); return HookResult.Continue; }); @@ -58,7 +57,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) UpdateHUD(player, skillInfo); @@ -78,22 +77,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); - } - - public static Vector GetEnemySpawn(CCSPlayerController player) - { - List enemy = Utilities.GetPlayers().FindAll(p => Instance.IsPlayerValid(p) && p.Team != player.Team && p.PawnIsAlive); - if (enemy.Count == 0) - { - var abs = player.PlayerPawn.Value.AbsOrigin; - return new Vector(abs.X, abs.Y, abs.Z); - } - - CCSPlayerController randomEnemy = enemy[Instance.Random.Next(0, enemy.Count)]; - var eAbs = randomEnemy.PlayerPawn.Value.AbsOrigin; - return new Vector(eAbs.X, eAbs.Y, eAbs.Z); + SkillPlayerInfo.Remove(player.SteamID); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) @@ -138,14 +122,15 @@ namespace jRandomSkills private static Vector GetEnemySpawnVector(CCSPlayerController player) { - var abs = player.PlayerPawn.Value.AbsOrigin; + var abs = player!.PlayerPawn!.Value?.AbsOrigin; var spawns = Utilities.FindAllEntitiesByDesignerName(player.Team == CsTeam.CounterTerrorist ? "info_player_terrorist" : "info_player_counterterrorist").ToList(); - if (spawns.Any()) + if (spawns.Count != 0) { var randomSpawn = spawns[Instance.Random.Next(spawns.Count)]; - return randomSpawn.AbsOrigin; + if (randomSpawn.AbsOrigin != null) + return randomSpawn.AbsOrigin; } - return new Vector(abs.X, abs.Y, abs.Z); + return abs == null ? new Vector(0, 0, 0) : new Vector(abs.X, abs.Y, abs.Z); } public class PlayerSkillInfo @@ -155,13 +140,9 @@ namespace jRandomSkills public DateTime Cooldown { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff8c92", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 15f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Cooldown { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff8c92", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 15f) : base(skill, active, color, onlyTeam, needsTeammates) - { - Cooldown = cooldown; - } + public float Cooldown { get; set; } = cooldown; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs b/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs index 4766f1e..e6b2b29 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs @@ -12,8 +12,8 @@ namespace jRandomSkills public class ExplosiveShot : ISkill { private const Skills skillName = Skills.ExplosiveShot; - private static float damage = Config.GetValue(skillName, "damage"); - private static float damageRadius = Config.GetValue(skillName, "damageRadius"); + private static readonly float damage = Config.GetValue(skillName, "damage"); + private static readonly float damageRadius = Config.GetValue(skillName, "damageRadius"); public static void LoadSkill() { @@ -26,7 +26,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -40,7 +40,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; float newChance = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "ChanceTo") - Config.GetValue(skillName, "ChanceFrom")) + Config.GetValue(skillName, "ChanceFrom"); playerInfo.SkillChance = newChance; newChance = (float)Math.Round(newChance, 2) * 100; @@ -72,7 +73,7 @@ namespace jRandomSkills if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) return HookResult.Continue; - CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.Handle); + CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); if (attackerPawn.DesignerName != "player") return HookResult.Continue; @@ -80,7 +81,7 @@ namespace jRandomSkills return HookResult.Continue; CCSPlayerController attacker = attackerPawn.Controller.Value.As(); - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); if (playerInfo == null || playerInfo.Skill != skillName) return HookResult.Continue; if (Instance.Random.NextDouble() <= playerInfo.SkillChance) @@ -88,19 +89,12 @@ namespace jRandomSkills return HookResult.Continue; } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#9c0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float damage = 10f, float damageRadius = 190f, float chanceFrom = .15f, float chanceTo = .3f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Damage { get; set; } - public float DamageRadius { get; set; } - public float ChanceFrom { get; set; } - public float ChanceTo { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#9c0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float damage = 10f, float damageRadius = 190f, float chanceFrom = .15f, float chanceTo = .3f) : base(skill, active, color, onlyTeam, needsTeammates) - { - Damage = damage; - DamageRadius = damageRadius; - ChanceFrom = chanceFrom; - ChanceTo = chanceTo; - } + public float Damage { get; set; } = damage; + public float DamageRadius { get; set; } = damageRadius; + public float ChanceFrom { get; set; } = chanceFrom; + public float ChanceTo { get; set; } = chanceTo; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs b/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs index 551ba5b..bab7080 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs @@ -11,8 +11,8 @@ namespace jRandomSkills { private const Skills skillName = Skills.FalconEye; private static bool blocked = false; - private static float distance = Config.GetValue(skillName, "distance"); - private static Dictionary cameras = new Dictionary(); + private static readonly float distance = Config.GetValue(skillName, "distance"); + private static readonly Dictionary cameras = []; public static void LoadSkill() { @@ -41,11 +41,14 @@ namespace jRandomSkills { var player = @event.Userid; if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; - if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item1 == player.PlayerPawn.Value.CameraServices!.ViewEntity!.Raw) + var pawn = player!.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return HookResult.Continue; + + if (cameras.TryGetValue(player!.SteamID, out var cameraInfo) && cameraInfo.Item1 == pawn.CameraServices.ViewEntity.Raw) BlockWeapon(player, true); return HookResult.Continue; }); @@ -71,13 +74,14 @@ namespace jRandomSkills if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2.IsValid) { var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue; if (pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) { ChangeCamera(player, true); continue; } - Vector pos = new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + 1000); - QAngle angle = new QAngle(90, 0, -pawn.V_angle.Y); + Vector pos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + 1000); + QAngle angle = new(90, 0, -pawn.V_angle.Y); cameraInfo.Item2.Teleport(pos, angle); } } @@ -87,6 +91,7 @@ namespace jRandomSkills uint orginalCameraRaw; uint newCameraRaw; var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return; if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2.IsValid) { orginalCameraRaw = cameraInfo.Item1; @@ -101,7 +106,7 @@ namespace jRandomSkills if (newCameraRaw == 0) return; - bool defaultCam = forceToDefault ? true : (pawn.CameraServices!.ViewEntity!.Raw == orginalCameraRaw ? false : true); + bool defaultCam = forceToDefault || (pawn.CameraServices.ViewEntity.Raw != orginalCameraRaw); pawn!.CameraServices!.ViewEntity.Raw = defaultCam ? orginalCameraRaw : newCameraRaw; Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices"); BlockWeapon(player, !defaultCam); @@ -113,7 +118,8 @@ namespace jRandomSkills if (camera == null || !camera.IsValid) return 0; var pawn = player.PlayerPawn.Value; - Vector pos = new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + distance); + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return 0; + Vector pos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + distance); camera.Render = Color.FromArgb(0, 255, 255, 255); camera.Teleport(pos, new QAngle(90, 0, 0)); @@ -124,7 +130,13 @@ namespace jRandomSkills private static void BlockWeapon(CCSPlayerController player, bool block) { - foreach (var weapon in player.Pawn.Value.WeaponServices?.MyWeapons) + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return; + + var weaponServices = pawn.WeaponServices; + if (weaponServices == null) return; + + foreach (var weapon in weaponServices.MyWeapons) if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) { weapon.Value.NextPrimaryAttackTick = block ? int.MaxValue : Server.TickCount; @@ -135,13 +147,9 @@ namespace jRandomSkills } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#d1f542", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float distance = 1000f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Distance { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#d1f542", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float distance = 1000f) : base(skill, active, color, onlyTeam, needsTeammates) - { - Distance = distance; - } + public float Distance { get; set; } = distance; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/FastReload.cs b/jRandomSkills - SRC Files/src/player/skills/FastReload.cs index 0c767bb..efbb244 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FastReload.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FastReload.cs @@ -20,7 +20,7 @@ namespace jRandomSkills var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; if (!player.IsValid || !player.PawnIsAlive) return; @@ -29,18 +29,19 @@ namespace jRandomSkills private static void InstaReload(CCSPlayerPawn pawn) { - var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; - if (activeWeapon == null || !activeWeapon.IsValid) return; + if (pawn == null || !pawn.IsValid) return; + var weaponServices = pawn.WeaponServices; + if (weaponServices == null || weaponServices.ActiveWeapon == null || !weaponServices.ActiveWeapon.IsValid) return; + + var activeWeapon = weaponServices.ActiveWeapon.Value; + if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.VData == null) return; activeWeapon.Clip1 = activeWeapon.VData.MaxClip1; Utilities.SetStateChanged(activeWeapon, "CBasePlayerWeapon", "m_iClip1"); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffc061", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffc061", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float distance = 1000f) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Flash.cs b/jRandomSkills - SRC Files/src/player/skills/Flash.cs index 8632182..b1d525d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Flash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Flash.cs @@ -24,10 +24,11 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerPawn = player.PlayerPawn?.Value; + var playerPawn = player.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid) continue; playerPawn.VelocityModifier = 1; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -47,10 +48,10 @@ namespace jRandomSkills var player = Utilities.GetPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex); if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; - if (player.Buttons.HasFlag(PlayerButtons.Speed) || player.Buttons.HasFlag(PlayerButtons.Duck)) + if (player!.Buttons.HasFlag(PlayerButtons.Speed) || player.Buttons.HasFlag(PlayerButtons.Duck)) { um.Recipients.Clear(); return HookResult.Handled; @@ -63,10 +64,10 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { var playerPawn = player.PlayerPawn.Value; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerPawn == null) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerPawn == null || playerInfo == null) return; - var skillConfig = Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString()); + var skillConfig = Config.LoadedConfig.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString()); if (skillConfig == null) return; float newSpeed = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "ChanceTo") - Config.GetValue(skillName, "ChanceFrom")) + Config.GetValue(skillName, "ChanceFrom"); @@ -90,24 +91,19 @@ namespace jRandomSkills { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; var playerPawn = player.PlayerPawn?.Value; if (playerPawn != null && playerPawn.VelocityModifier != 0) - playerPawn.VelocityModifier = Math.Max((float)playerInfo?.SkillChance, 1); + playerPawn.VelocityModifier = Math.Max((float)(playerInfo?.SkillChance ?? 1), 1); } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#A31912", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = 1.2f, float chanceTo = 3.0f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float ChanceFrom { get; set; } - public float ChanceTo { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#A31912", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = 1.2f, float chanceTo = 3.0f) : base(skill, active, color, onlyTeam, needsTeammates) - { - ChanceFrom = chanceFrom; - ChanceTo = chanceTo; - } + public float ChanceFrom { get; set; } = chanceFrom; + public float ChanceTo { get; set; } = chanceTo; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs index 68b576e..0843be1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs @@ -13,12 +13,12 @@ namespace jRandomSkills public class Fortnite : ISkill { private const Skills skillName = Skills.Fortnite; - private static float timerCooldown = Config.GetValue(skillName, "cooldown"); - private static int barricadeHealth = Config.GetValue(skillName, "barricadeHealth"); - private static string propModel = Config.GetValue(skillName, "propModel"); + private static readonly float timerCooldown = Config.GetValue(skillName, "cooldown"); + private static readonly int barricadeHealth = Config.GetValue(skillName, "barricadeHealth"); + private static readonly string propModel = Config.GetValue(skillName, "propModel"); - private static readonly Dictionary SkillPlayerInfo = new Dictionary(); - private static Dictionary barricades = new Dictionary(); + private static readonly Dictionary SkillPlayerInfo = []; + private static readonly Dictionary barricades = []; public static void LoadSkill() { @@ -31,7 +31,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) EnableSkill(player); } @@ -50,11 +50,10 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); return HookResult.Continue; }); @@ -62,7 +61,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) UpdateHUD(player, skillInfo); @@ -89,8 +88,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) @@ -137,13 +135,13 @@ namespace jRandomSkills { var playerPawn = player.PlayerPawn.Value; var box = Utilities.CreateEntityByName("prop_dynamic_override"); - if (box == null) return; + if (box == null || playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null || playerPawn.AbsRotation == null) return; float distance = 50; Vector pos = playerPawn.AbsOrigin + SkillUtils.GetForwardVector(playerPawn.AbsRotation) * distance; - QAngle angle = new QAngle(playerPawn.AbsRotation.X, playerPawn.AbsRotation.Y + 90, playerPawn.AbsRotation.Z); + QAngle angle = new(playerPawn.AbsRotation.X, playerPawn.AbsRotation.Y + 90, playerPawn.AbsRotation.Z); - box.Entity.Name = box.Globalname = $"FortniteWall_{Server.TickCount}"; + box.Entity!.Name = box.Globalname = $"FortniteWall_{Server.TickCount}"; box.Collision.SolidType = SolidType_t.SOLID_VPHYSICS; box.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(box.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); box.DispatchSpawn(); @@ -187,17 +185,11 @@ namespace jRandomSkills public DateTime Cooldown { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#1b04cc", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 2f, int barricadeHealth = 115, string propModel = "models/props/de_aztec/hr_aztec/aztec_scaffolding/aztec_scaffold_wall_support_128.vmdl") : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Cooldown { get; set; } - public int BarricadeHealth { get; set; } - public string PropModel { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#1b04cc", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 2f, int barricadeHealth = 115, string propModel = "models/props/de_aztec/hr_aztec/aztec_scaffolding/aztec_scaffold_wall_support_128.vmdl") : base(skill, active, color, onlyTeam, needsTeammates) - { - Cooldown = cooldown; - BarricadeHealth = barricadeHealth; - PropModel = propModel; - } + public float Cooldown { get; set; } = cooldown; + public int BarricadeHealth { get; set; } = barricadeHealth; + public string PropModel { get; set; } = propModel; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs b/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs index cd8a1db..6e0cee6 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs @@ -14,16 +14,13 @@ namespace jRandomSkills { private const Skills skillName = Skills.FragileBomb; private static int bombHealth = Config.GetValue(skillName, "maxBombHealth"); - private static int maxBombHealth = Config.GetValue(skillName, "maxBombHealth"); + private static readonly int maxBombHealth = Config.GetValue(skillName, "maxBombHealth"); - private static CPlantedC4 plantedC4; - private static CTriggerMultiple triggerC4; + private static CPlantedC4? plantedC4; + private static CTriggerMultiple? triggerC4; public static void LoadSkill() { - if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) - return; - SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); Instance.RegisterEventHandler((@event, info) => @@ -49,7 +46,7 @@ namespace jRandomSkills private static void CreateTrigger() { var trigger = Utilities.CreateEntityByName("trigger_multiple"); - if (trigger == null || plantedC4 == null) return; + if (trigger == null || plantedC4 == null || trigger.AbsOrigin == null || plantedC4.AbsOrigin == null) return; trigger.Collision.SolidType = SolidType_t.SOLID_CAPSULE; trigger.Collision.SolidFlags = 0; @@ -93,19 +90,19 @@ namespace jRandomSkills if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) return HookResult.Continue; - CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.Handle); + CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); if (attackerPawn.DesignerName != "player" || param.DesignerName != "trigger_multiple") return HookResult.Continue; - CTriggerMultiple trigger = new CTriggerMultiple(param.Handle); + CTriggerMultiple trigger = new(param.Handle); if (attackerPawn == null || attackerPawn.Controller?.Value == null || trigger == null || !trigger.Globalname.StartsWith("planted_bomb_prop_")) return HookResult.Continue; CCSPlayerController attacker = attackerPawn.Controller.Value.As(); - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); if (playerInfo == null || playerInfo.Skill != skillName) return HookResult.Continue; bombHealth -= (int)param2.TotalledDamage; @@ -119,13 +116,9 @@ namespace jRandomSkills return HookResult.Continue; } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#5d00ff", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false, int maxBombHealth = 1000) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int MaxBombHealth { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#5d00ff", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false, int maxBombHealth = 1000) : base(skill, active, color, onlyTeam, needsTeammates) - { - MaxBombHealth = maxBombHealth; - } + public int MaxBombHealth { get; set; } = maxBombHealth; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs b/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs index 0080b6f..39c2d58 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs @@ -9,14 +9,11 @@ namespace jRandomSkills public class FriendlyFire : ISkill { private const Skills skillName = Skills.FriendlyFire; - private static float healthMultiplier = Config.GetValue(skillName, "healthMultiplier"); - private static string[] nades = { "inferno", "flashbang", "smokegrenade", "decoy", "hegrenade" }; + private static readonly float healthMultiplier = Config.GetValue(skillName, "healthMultiplier"); + private static readonly string[] nades = ["inferno", "flashbang", "smokegrenade", "decoy", "hegrenade"]; public static void LoadSkill() { - if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) - return; - SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); Instance.RegisterEventHandler((@event, info) => @@ -30,25 +27,22 @@ namespace jRandomSkills if (nades.Contains(weapon)) return HookResult.Continue; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); - if (playerInfo?.Skill != skillName || attacker.Team != victim.Team) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + if (playerInfo?.Skill != skillName || attacker!.Team != victim!.Team) return HookResult.Continue; Server.ExecuteCommand("mp_autokick 0"); var pawn = victim.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return HookResult.Continue; SkillUtils.AddHealth(pawn, damage + (int)(damage * healthMultiplier), pawn.MaxHealth); return HookResult.Continue; }); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = true, float healthMultiplier = 1.5f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float HealthMultiplier { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = true, float healthMultiplier = 1.5f) : base(skill, active, color, onlyTeam, needsTeammates) - { - HealthMultiplier = healthMultiplier; - } + public float HealthMultiplier { get; set; } = healthMultiplier; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs index 75f5294..16120a1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs @@ -11,15 +11,12 @@ namespace jRandomSkills public class FrozenDecoy : ISkill { private const Skills skillName = Skills.FrozenDecoy; - private static float decoyRadius = Config.GetValue(skillName, "triggerRadius"); - private static int slownessMultiplier = Config.GetValue(skillName, "slownessMultiplier"); - private static List decoys = new List(); + private static readonly float decoyRadius = Config.GetValue(skillName, "triggerRadius"); + private static readonly int slownessMultiplier = Config.GetValue(skillName, "slownessMultiplier"); + private static readonly List decoys = []; public static void LoadSkill() { - if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) - return; - SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); Instance.RegisterEventHandler((@event, info) => @@ -35,7 +32,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -47,7 +44,8 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; decoys.Add(new Vector(@event.X, @event.Y, @event.Z)); return HookResult.Continue; @@ -56,7 +54,8 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, @info) => { var player = @event.Userid; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; decoys.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z); return HookResult.Continue; @@ -67,11 +66,13 @@ namespace jRandomSkills foreach (Vector decoyPos in decoys) foreach (var player in Utilities.GetPlayers()) { - double distance = SkillUtils.GetDistance(decoyPos, player.PlayerPawn.Value.AbsOrigin); + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return; + double distance = SkillUtils.GetDistance(decoyPos, pawn.AbsOrigin); if (distance <= decoyRadius) { double modifier = Math.Clamp(distance / decoyRadius, 0f, 1f); - player.PlayerPawn.Value.VelocityModifier = (float)Math.Pow(modifier, slownessMultiplier); + pawn.VelocityModifier = (float)Math.Pow(modifier, slownessMultiplier); } } }); @@ -82,15 +83,10 @@ namespace jRandomSkills SkillUtils.TryGiveWeapon(player, CsItem.DecoyGrenade); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#00eaff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float triggerRadius = 180, int slownessMultiplier = 5) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float TriggerRadius { get; set; } - public int SlownessMultiplier { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#00eaff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float triggerRadius = 180, int slownessMultiplier = 5) : base(skill, active, color, onlyTeam, needsTeammates) - { - TriggerRadius = triggerRadius; - SlownessMultiplier = slownessMultiplier; - } + public float TriggerRadius { get; set; } = triggerRadius; + public int SlownessMultiplier { get; set; } = slownessMultiplier; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs index 6833712..56cfdf3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs @@ -1,6 +1,8 @@ +using System.Collections.Immutable; using System.Drawing; 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; @@ -13,48 +15,23 @@ namespace jRandomSkills { private const Skills skillName = Skills.Ghost; private static bool roundEnd = false; - private static string[] disabledWeapons = - { - "weapon_deagle", - "weapon_revolver", - "weapon_glock", - "weapon_usp_silencer", - "weapon_cz75a", - "weapon_fiveseven", - "weapon_p250", - "weapon_tec9", - "weapon_elite", - "weapon_hkp2000", - "weapon_ak47", - "weapon_m4a1", - "weapon_m4a4", - "weapon_m4a1_silencer", - "weapon_famas", - "weapon_galilar", - "weapon_aug", - "weapon_sg553", - "weapon_mp9", - "weapon_mac10", - "weapon_bizon", - "weapon_mp7", - "weapon_ump45", - "weapon_p90", - "weapon_mp5sd", - "weapon_ssg08", - "weapon_awp", - "weapon_scar20", - "weapon_g3sg1", - "weapon_nova", - "weapon_xm1014", - "weapon_mag7", - "weapon_sawedoff", - "weapon_m249", - "weapon_negev" - }; + private static readonly string[] disabledWeapons = + [ + "weapon_deagle", "weapon_revolver", "weapon_glock", "weapon_usp_silencer", + "weapon_cz75a", "weapon_fiveseven", "weapon_p250", "weapon_tec9", + "weapon_elite", "weapon_hkp2000", "weapon_ak47", "weapon_m4a1", + "weapon_m4a4", "weapon_m4a1_silencer", "weapon_famas", "weapon_galilar", + "weapon_aug", "weapon_sg553", "weapon_mp9", "weapon_mac10", + "weapon_bizon", "weapon_mp7", "weapon_ump45", "weapon_p90", + "weapon_mp5sd", "weapon_ssg08", "weapon_awp", "weapon_scar20", + "weapon_g3sg1", "weapon_nova", "weapon_xm1014", "weapon_mag7", + "weapon_sawedoff", "weapon_m249", "weapon_negev" + ]; + private static readonly HashSet invisibleEntities = []; public static void LoadSkill() { - if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) + if (Config.LoadedConfig.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) return; SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); @@ -67,7 +44,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) EnableSkill(player); } @@ -81,7 +58,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) DisableSkill(player); } @@ -92,9 +69,9 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - if (!player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue; + if (player == null || !player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) DisableSkill(player); @@ -105,11 +82,12 @@ namespace jRandomSkills { var player = @event.Userid; if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; - SetWeaponVisibility(player, false); - SetWeaponAttack(player, true); + SetWeaponVisibility(player!, false); + SetWearablesVisibility(player!, false); + SetWeaponAttack(player!, true); return HookResult.Continue; }); @@ -121,12 +99,24 @@ namespace jRandomSkills }); Instance.RegisterListener(OnTick); + Instance.RegisterListener(CheckTransmit); + } + + public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) + { + foreach (var (info, player) in infoList) + { + if (player == null) continue; + foreach (var entity in invisibleEntities) + info.TransmitEntities.Remove((int)entity); + } } public static void EnableSkill(CCSPlayerController player) { SetPlayerVisibility(player, false); SetWeaponVisibility(player, false); + SetWearablesVisibility(player, false); SetWeaponAttack(player, true); } @@ -134,6 +124,7 @@ namespace jRandomSkills { SetPlayerVisibility(player, true); SetWeaponVisibility(player, true); + SetWearablesVisibility(player, true); SetWeaponAttack(player, false); } @@ -141,7 +132,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) UpdateHUD(player); } @@ -161,15 +152,36 @@ namespace jRandomSkills } } - private static void SetWeaponVisibility(CCSPlayerController player, bool visible) + private static void SetWearablesVisibility(CCSPlayerController player, bool visible) { if (!Instance.IsPlayerValid(player)) return; - var playerPawn = player.PlayerPawn.Value; + var playerPawn = player.PlayerPawn.Value!; var color = visible ? Color.FromArgb(255, 255, 255, 255) : Color.FromArgb(0, 255, 255, 255); var shadowStrength = visible ? 1.0f : 0.0f; - foreach (var weapon in playerPawn.WeaponServices?.MyWeapons) + foreach (var item in playerPawn.MyWearables) + { + if (item != null && item.IsValid && item.Value != null && item.Value.IsValid) + { + Server.PrintToChatAll($"NAME: {item.Value.DesignerName}"); + item.Value.Render = color; + item.Value.ShadowStrength = shadowStrength; + Utilities.SetStateChanged(item.Value, "CBaseModelEntity", "m_clrRender"); + } + } + } + + private static void SetWeaponVisibility(CCSPlayerController player, bool visible) + { + if (!Instance.IsPlayerValid(player)) return; + var playerPawn = player.PlayerPawn.Value!; + if (playerPawn.WeaponServices == null) return; + + var color = visible ? Color.FromArgb(255, 255, 255, 255) : Color.FromArgb(0, 255, 255, 255); + var shadowStrength = visible ? 1.0f : 0.0f; + + foreach (var weapon in playerPawn.WeaponServices.MyWeapons) { if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) { @@ -184,11 +196,11 @@ namespace jRandomSkills { if (roundEnd || player == null || !player.IsValid) return; var pawn = player?.PlayerPawn?.Value; - if (pawn == null || !pawn.IsValid) return; + if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return; - foreach (var weapon in pawn?.WeaponServices?.MyWeapons) + foreach (var weapon in pawn.WeaponServices.MyWeapons) if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) - if (disabledWeapons.Contains(weapon?.Value?.DesignerName)) + if (disabledWeapons.Contains(weapon.Value.DesignerName)) { weapon.Value.NextPrimaryAttackTick = disableWeapon ? int.MaxValue : Server.TickCount; weapon.Value.NextSecondaryAttackTick = disableWeapon ? int.MaxValue : Server.TickCount; @@ -200,11 +212,15 @@ namespace jRandomSkills private static void UpdateHUD(CCSPlayerController player) { + if (player == null || !player.IsValid) return; + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return; + var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == skillName); if (skillData == null) return; - var weapon = player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value; - if (weapon == null || !disabledWeapons.Contains(weapon.DesignerName)) return; + var weapon = pawn.WeaponServices.ActiveWeapon.Value; + if (weapon == null || !weapon.IsValid || !disabledWeapons.Contains(weapon.DesignerName)) return; string infoLine = $"{Localization.GetTranslation("your_skill")}:
"; string skillLine = $"{skillData.Name}
"; @@ -214,11 +230,8 @@ namespace jRandomSkills player.PrintToCenterHtml(hudContent); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#FFFFFF", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#FFFFFF", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs index 8f33c25..3ec8594 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs @@ -27,7 +27,7 @@ namespace jRandomSkills { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) EnableSkill(player); } @@ -61,10 +61,10 @@ namespace jRandomSkills foreach (var (info, player) in infoList) { if (player == null) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var observedPlayer = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == player?.Pawn?.Value?.ObserverServices?.ObserverTarget?.Value?.Handle); - var observerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer?.SteamID); + var observerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer?.SteamID); if (playerInfo?.Skill != skillName && observerInfo?.Skill != skillName) continue; foreach (var smoke in smokes) diff --git a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs index 7175200..d719cca 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs @@ -10,7 +10,7 @@ namespace jRandomSkills public class Glitch : ISkill { private const Skills skillName = Skills.Glitch; - private static HashSet glitchedPlayers = new HashSet(); + private static readonly HashSet glitchedPlayers = []; public static void LoadSkill() { @@ -23,7 +23,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -43,7 +43,7 @@ namespace jRandomSkills public static void TypeSkill(CCSPlayerController player, string[] commands) { if (player == null || !player.IsValid || !player.PawnIsAlive) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillChance == 1) @@ -70,7 +70,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SkillChance = 0; SkillUtils.PrintToChat(player, Localization.GetTranslation("glitch") + ":", false); @@ -93,11 +94,8 @@ namespace jRandomSkills glitchedPlayers.Remove(player); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#f542ef", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#f542ef", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Glue.cs b/jRandomSkills - SRC Files/src/player/skills/Glue.cs index 8be8517..c2612e2 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glue.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glue.cs @@ -23,19 +23,19 @@ namespace jRandomSkills if (grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return; var pawn = grenade.OwnerEntity.Value.As(); - var player = pawn.Controller.Value.As(); + if (pawn == null || !pawn.IsValid || pawn.Controller == null || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var player = pawn.Controller.Value.As(); + if (player == null || !player.IsValid) return; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; grenade.Bounces = 555; }); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#fff52e", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#fff52e", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs index 3cbc825..2b5e303 100644 --- a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs +++ b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs @@ -11,9 +11,9 @@ namespace jRandomSkills public class GodMode : ISkill { private const Skills skillName = Skills.GodMode; - private static float timerCooldown = Config.GetValue(skillName, "cooldown"); - private static float duration = Config.GetValue(skillName, "duration"); - private static readonly Dictionary SkillPlayerInfo = new Dictionary(); + private static readonly float timerCooldown = Config.GetValue(skillName, "cooldown"); + private static readonly float duration = Config.GetValue(skillName, "duration"); + private static readonly Dictionary SkillPlayerInfo = []; public static void LoadSkill() { @@ -25,7 +25,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) { EnableSkill(player); @@ -45,11 +45,10 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); return HookResult.Continue; }); @@ -58,7 +57,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) UpdateHUD(player, skillInfo); @@ -78,8 +77,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) @@ -112,7 +110,7 @@ namespace jRandomSkills if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) { - if (!player.IsValid || !player.PawnIsAlive) return; + if (!player.IsValid || !player.PawnIsAlive || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; if (skillInfo.CanUse) { skillInfo.CanUse = false; @@ -139,15 +137,10 @@ namespace jRandomSkills public DateTime Cooldown { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#e0d83a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 30f, float duration = 2f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Cooldown { get; set; } - public float Duration { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#e0d83a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 30f, float duration = 2f) : base(skill, active, color, onlyTeam, needsTeammates) - { - Cooldown = cooldown; - Duration = duration; - } + public float Cooldown { get; set; } = cooldown; + public float Duration { get; set; } = duration; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs index 314a385..a9dccdf 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs @@ -11,9 +11,9 @@ namespace jRandomSkills public class HealingSmoke : ISkill { private const Skills skillName = Skills.HealingSmoke; - private static int smokeHeal = Config.GetValue(skillName, "smokeHeal"); - private static float smokeRadius = Config.GetValue(skillName, "smokeRadius"); - private static List smokes = new List(); + private static readonly int smokeHeal = Config.GetValue(skillName, "smokeHeal"); + private static readonly float smokeRadius = Config.GetValue(skillName, "smokeRadius"); + private static readonly List smokes = []; public static void LoadSkill() { @@ -32,7 +32,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -44,7 +44,8 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; smokes.Add(new Vector(@event.X, @event.Y, @event.Z)); return HookResult.Continue; @@ -53,7 +54,8 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, @info) => { var player = @event.Userid; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; smokes.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z); return HookResult.Continue; @@ -65,10 +67,15 @@ namespace jRandomSkills if (name != "smokegrenade_projectile") return; var grenade = @event.As(); - var pawn = grenade.OwnerEntity.Value.As(); - var player = pawn.Controller.Value.As(); + if (grenade == null || !grenade.IsValid || grenade.OwnerEntity == null || !grenade.OwnerEntity.IsValid || grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var pawn = grenade.OwnerEntity.Value.As(); + if (pawn == null || !pawn.IsValid || pawn.Controller == null || !pawn.Controller.IsValid || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; + + var player = pawn.Controller.Value.As(); + if (player == null || !player.IsValid) return; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; Server.NextFrame(() => @@ -85,8 +92,9 @@ namespace jRandomSkills foreach (Vector smokePos in smokes) foreach (var player in Utilities.GetPlayers()) if (Server.TickCount % 17 == 0) - if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= smokeRadius) - AddHealth(player.PlayerPawn.Value, smokeHeal); + if (player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.AbsOrigin != null) + if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= smokeRadius) + AddHealth(player.PlayerPawn.Value, smokeHeal); }); } @@ -107,15 +115,10 @@ namespace jRandomSkills Utilities.SetStateChanged(player, "CBaseEntity", "m_iHealth"); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#1fe070", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int smokeHeal = 1, float smokeRadius = 180) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int SmokeHeal { get; set; } - public float SmokeRadius { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#1fe070", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int smokeHeal = 1, float smokeRadius = 180) : base(skill, active, color, onlyTeam, needsTeammates) - { - SmokeHeal = smokeHeal; - SmokeRadius = smokeRadius; - } + public int SmokeHeal { get; set; } = smokeHeal; + public float SmokeRadius { get; set; } = smokeRadius; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Hermit.cs b/jRandomSkills - SRC Files/src/player/skills/Hermit.cs index 917a57c..8774685 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Hermit.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Hermit.cs @@ -9,7 +9,7 @@ namespace jRandomSkills public class Hermit : ISkill { private const Skills skillName = Skills.Hermit; - private static readonly Dictionary maxReserveAmmo = new Dictionary + private static readonly Dictionary dictionary = new() { { "weapon_glock", 120 }, { "weapon_usp_silencer", 24 }, @@ -47,8 +47,9 @@ namespace jRandomSkills { "weapon_m249", 200 }, { "weapon_negev", 300 } }; + private static readonly Dictionary maxReserveAmmo = dictionary; - private static int healthToAdd = Config.GetValue(skillName, "healthToAdd"); + private static readonly int healthToAdd = Config.GetValue(skillName, "healthToAdd"); public static void LoadSkill() { @@ -59,14 +60,14 @@ namespace jRandomSkills var attacker = @event.Attacker; if (!Instance.IsPlayerValid(attacker)) return HookResult.Continue; - var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); if (attackerInfo?.Skill != skillName) return HookResult.Continue; - var pawn = attacker.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid) return HookResult.Continue; + var pawn = attacker!.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return HookResult.Continue; var weapon = pawn.WeaponServices.ActiveWeapon.Value; - if (weapon == null || !weapon.IsValid) return HookResult.Continue; + if (weapon == null || !weapon.IsValid || weapon.VData == null) return HookResult.Continue; var maxReserveAmmoClip = maxReserveAmmo.TryGetValue(weapon.DesignerName, out var reserve) ? reserve : 100; weapon.Clip1 = weapon.VData.MaxClip1; @@ -80,13 +81,9 @@ namespace jRandomSkills }); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ded678", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int healthToAdd = 25) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int HealthToAdd { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ded678", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int healthToAdd = 25) : base(skill, active, color, onlyTeam, needsTeammates) - { - HealthToAdd = healthToAdd; - } + public int HealthToAdd { get; set; } = healthToAdd; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs b/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs index 6579dcc..e14d7a8 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs @@ -10,8 +10,8 @@ namespace jRandomSkills public class HolyHandGrenade : ISkill { private const Skills skillName = Skills.HolyHandGrenade; - private static float damageMultiplier = Config.GetValue(skillName, "damageMultiplier"); - private static float damageRadiusMultiplier = Config.GetValue(skillName, "damageRadiusMultiplier"); + private static readonly float damageMultiplier = Config.GetValue(skillName, "damageMultiplier"); + private static readonly float damageRadiusMultiplier = Config.GetValue(skillName, "damageRadiusMultiplier"); public static void LoadSkill() { @@ -24,7 +24,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -42,13 +42,14 @@ namespace jRandomSkills Server.NextFrame(() => { var hegrenade = @event.As(); - var playerPawn = hegrenade.Thrower.Value; + if (hegrenade == null || !hegrenade.IsValid) return; + var playerPawn = hegrenade.Thrower.Value; if (playerPawn == null || !playerPawn.IsValid) return; + var player = Utilities.GetPlayers().FirstOrDefault(p => p.PlayerPawn.Index == playerPawn.Index); - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) - return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill != skillName) return; hegrenade.Damage *= damageMultiplier; hegrenade.DmgRadius *= damageRadiusMultiplier; @@ -61,15 +62,10 @@ namespace jRandomSkills SkillUtils.TryGiveWeapon(player, CsItem.HEGrenade); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffdd00", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float damageMultiplier = 2f, float damageRadiusMultiplier = 2f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float DamageMultiplier { get; set; } - public float DamageRadiusMultiplier { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffdd00", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float damageMultiplier = 2f, float damageRadiusMultiplier = 2f) : base(skill, active, color, onlyTeam, needsTeammates) - { - DamageMultiplier = damageMultiplier; - DamageRadiusMultiplier = damageRadiusMultiplier; - } + public float DamageMultiplier { get; set; } = damageMultiplier; + public float DamageRadiusMultiplier { get; set; } = damageRadiusMultiplier; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Impostor.cs b/jRandomSkills - SRC Files/src/player/skills/Impostor.cs index 005a5fe..02c7f93 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Impostor.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Impostor.cs @@ -24,7 +24,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) { string model = GetEnemyModel(player); @@ -50,11 +50,15 @@ namespace jRandomSkills private static string GetEnemyModel(CCSPlayerController player) { - CCSPlayerController[] models = Utilities.GetPlayers().FindAll(p => p.IsValid && p.PawnIsAlive && p.Team != player.Team).ToArray(); - if (models.Length > 0) + CCSPlayerController[] models = [.. Utilities.GetPlayers().FindAll(p => p.IsValid && p.PawnIsAlive && p.Team != player.Team)]; + if (models != null && models.Length > 0) { - string modelName = models[Instance.Random.Next(models.Length)].PlayerPawn.Value.CBodyComponent.SceneNode.GetSkeletonInstance().ModelState.ModelName; - if (modelName != null) return modelName; + var model = models[Instance.Random.Next(models.Length)]; + if (model != null && model.IsValid && model.PlayerPawn.Value != null && model.PlayerPawn.Value.IsValid && model.PlayerPawn.Value.CBodyComponent != null && model.PlayerPawn.Value.CBodyComponent.SceneNode != null) + { + string modelName = model.PlayerPawn.Value.CBodyComponent.SceneNode.GetSkeletonInstance().ModelState.ModelName; + if (!string.IsNullOrEmpty(modelName)) return modelName; + } } return player.Team == CsTeam.CounterTerrorist ? defaultTModel : defaultCTModel; } @@ -73,11 +77,8 @@ namespace jRandomSkills }); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#99140B", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#99140B", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs b/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs index e7f6462..12d1781 100644 --- a/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs +++ b/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs @@ -19,12 +19,10 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill == skillName) - { - ApplyInfiniteAmmo(player); - } + ApplyInfiniteAmmo(player!); return HookResult.Continue; }); @@ -35,10 +33,10 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill == skillName) - player.GiveNamedItem($"weapon_{@event.Weapon}"); + player!.GiveNamedItem($"weapon_{@event.Weapon}"); return HookResult.Continue; }); @@ -49,12 +47,10 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill == skillName) - { - ApplyInfiniteAmmo(player); - } + ApplyInfiniteAmmo(player!); return HookResult.Continue; }); @@ -64,16 +60,11 @@ namespace jRandomSkills { var activeWeaponHandle = player.PlayerPawn.Value?.WeaponServices?.ActiveWeapon; if (activeWeaponHandle?.Value != null) - { activeWeaponHandle.Value.Clip1 = 100; - } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#0000FF", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#0000FF", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs index f3b81fc..b1f44e5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs @@ -12,11 +12,11 @@ namespace jRandomSkills public class Jackal : ISkill { private const Skills skillName = Skills.Jackal; - private static int maxStepBeam = Config.GetValue(skillName, "maxStepBeam"); + private static readonly int maxStepBeam = Config.GetValue(skillName, "maxStepBeam"); private static bool exists = false; - private static Dictionary authorBeams = new Dictionary(); - private static Dictionary> stepBeams = new Dictionary>(); + private static readonly Dictionary authorBeams = []; + private static readonly Dictionary> stepBeams = []; public static void LoadSkill() { @@ -29,7 +29,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -63,7 +63,7 @@ namespace jRandomSkills foreach (var step in stepBeams.ToList()) { var player = step.Key; - if (player == null || !player.IsValid) + if (!player.IsValid) { stepBeams.Remove(player); continue; @@ -73,7 +73,8 @@ namespace jRandomSkills if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) continue; var beams = step.Value; - Vector lastBeamVector = beams?.LastOrDefault()?.EndPos ?? pawn?.AbsOrigin; + if (beams.Count == 0 || pawn.AbsOrigin == null) continue; + Vector lastBeamVector = beams.LastOrDefault()?.EndPos ?? pawn.AbsOrigin; var newBeam = CreateBeamStep(step.Key.Team, lastBeamVector, pawn.AbsOrigin); if (newBeam != null) @@ -109,7 +110,7 @@ namespace jRandomSkills } } - public static CBeam CreateBeamStep(CsTeam team, Vector start, Vector stop) + public static CBeam? CreateBeamStep(CsTeam team, Vector start, Vector stop) { CBeam beam = Utilities.CreateEntityByName("beam")!; if (beam == null) return null; @@ -131,7 +132,7 @@ namespace jRandomSkills public static void TypeSkill(CCSPlayerController player, string[] commands) { if (player == null || !player.IsValid || !player.PawnIsAlive) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillChance == 1) @@ -150,7 +151,7 @@ namespace jRandomSkills } authorBeams.Add(player.Index, enemy.Index); - stepBeams.Add(enemy, new List()); + stepBeams.Add(enemy, []); playerInfo.SkillChance = 1; player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("jackal_player_info", enemy.PlayerName)); } @@ -160,7 +161,8 @@ namespace jRandomSkills if (!exists) Instance.RegisterListener(CheckTransmit); exists = true; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SkillChance = 0; SkillUtils.PrintToChat(player, Localization.GetTranslation("jackal") + ":", false); @@ -183,13 +185,9 @@ namespace jRandomSkills stepBeams.Remove(player); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#f542ef", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int maxStepBeam = 50) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int MaxStepBeam { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#f542ef", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int maxStepBeam = 50) : base(skill, active, color, onlyTeam, needsTeammates) - { - MaxStepBeam = maxStepBeam; - } + public int MaxStepBeam { get; set; } = maxStepBeam; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs index cd016fc..4d1c1d1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs @@ -10,7 +10,7 @@ namespace jRandomSkills public class Jammer : ISkill { private const Skills skillName = Skills.Jammer; - private static HashSet jammedPlayers = new HashSet(); + private static readonly HashSet jammedPlayers = []; public static void LoadSkill() { @@ -23,7 +23,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -44,7 +44,7 @@ namespace jRandomSkills public static void TypeSkill(CCSPlayerController player, string[] commands) { if (player == null || !player.IsValid || !player.PawnIsAlive) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillChance == 1) @@ -72,6 +72,7 @@ namespace jRandomSkills private static void SetCrosshair(CCSPlayerController player, bool enabled) { var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return; pawn.HideHUD = (uint)(enabled ? (pawn.HideHUD & ~(1 << 8)) : (pawn.HideHUD | (1 << 8))); @@ -80,7 +81,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SkillChance = 0; SkillUtils.PrintToChat(player, Localization.GetTranslation("jammer") + ":", false); @@ -103,11 +105,8 @@ namespace jRandomSkills jammedPlayers.Remove(player); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#42f5a7", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#42f5a7", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs index 3af5346..9db54cd 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs @@ -10,7 +10,7 @@ namespace jRandomSkills public class JumpBan : ISkill { private const Skills skillName = Skills.JumpBan; - private static Dictionary bannedPlayers = new Dictionary(); + private static readonly Dictionary bannedPlayers = []; public static void LoadSkill() { @@ -23,7 +23,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -41,6 +41,7 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return HookResult.Continue; if (!bannedPlayers.TryGetValue(player.PlayerPawn.Value, out _)) return HookResult.Continue; bannedPlayers[player.PlayerPawn.Value] = Server.TickCount + 10; return HookResult.Stop; @@ -63,7 +64,7 @@ namespace jRandomSkills public static void TypeSkill(CCSPlayerController player, string[] commands) { if (player == null || !player.IsValid || !player.PawnIsAlive) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillChance == 1) @@ -75,7 +76,7 @@ namespace jRandomSkills string enemyId = commands[0]; var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); - if (enemy == null) + if (enemy == null || !enemy.IsValid || enemy.PlayerPawn.Value == null || !enemy.PlayerPawn.Value.IsValid) { player.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; @@ -89,7 +90,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SkillChance = 0; SkillUtils.PrintToChat(player, Localization.GetTranslation("jumpban") + ":", false); @@ -108,14 +110,12 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; bannedPlayers.Remove(player.PlayerPawn.Value); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#b01e5d", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#b01e5d", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs b/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs index 6156ef3..ba58cd7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs @@ -8,7 +8,7 @@ namespace jRandomSkills public class JumpingJack : ISkill { private const Skills skillName = Skills.JumpingJack; - private static int addHealth = Config.GetValue(skillName, "healthToAdd"); + private static readonly int addHealth = Config.GetValue(skillName, "healthToAdd"); public static void LoadSkill() { @@ -17,7 +17,8 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; SkillUtils.AddHealth(player.PlayerPawn.Value, addHealth); @@ -25,13 +26,9 @@ namespace jRandomSkills }); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a86eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int healthToAdd = 3) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int HealthToAdd { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#a86eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int healthToAdd = 3) : base(skill, active, color, onlyTeam, needsTeammates) - { - HealthToAdd = healthToAdd; - } + public int HealthToAdd { get; set; } = healthToAdd; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs index 1e60400..de64fa1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs @@ -10,7 +10,7 @@ namespace jRandomSkills public class KillerFlash : ISkill { private const Skills skillName = Skills.KillerFlash; - private static float flashDuration = Config.GetValue(skillName, "flashDuration"); + private static readonly float flashDuration = Config.GetValue(skillName, "flashDuration"); public static void LoadSkill() { @@ -23,7 +23,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -36,12 +36,12 @@ namespace jRandomSkills { var player = @event.Userid; var attacker = @event.Attacker; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; + if (!Instance.IsPlayerValid(player) || !Instance.IsPlayerValid(attacker)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (attackerInfo?.Skill == skillName && playerInfo?.Skill != Skills.AntyFlash && player?.PlayerPawn.Value.FlashDuration >= flashDuration) + if (attackerInfo?.Skill == skillName && playerInfo?.Skill != Skills.AntyFlash && player!.PlayerPawn.Value!.FlashDuration >= flashDuration) player?.PlayerPawn?.Value?.CommitSuicide(false, true); return HookResult.Continue; @@ -53,13 +53,9 @@ namespace jRandomSkills SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#57bcff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float flashDuration = 1f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float FlashDuration { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#57bcff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float flashDuration = 1f) : base(skill, active, color, onlyTeam, needsTeammates) - { - FlashDuration = flashDuration; - } + public float FlashDuration { get; set; } = flashDuration; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs b/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs index f497bcf..09c94ee 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs @@ -22,7 +22,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -35,7 +35,7 @@ namespace jRandomSkills public static void TypeSkill(CCSPlayerController player, string[] commands) { if (player == null || !player.IsValid || !player.PawnIsAlive) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillChance == 1) @@ -61,7 +61,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SkillChance = 0; SkillUtils.PrintToChat(player, Localization.GetTranslation("lifeswap") + ":", false); @@ -83,21 +84,16 @@ namespace jRandomSkills var playerPawn = player.PlayerPawn.Value; var enemyPawn = enemy.PlayerPawn.Value; - if (playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE || enemyPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) - return; + if (playerPawn == null || !playerPawn.IsValid || enemyPawn == null || !enemyPawn.IsValid) return; + if (playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE || enemyPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; - int playerHealth = playerPawn.Health; - playerPawn.Health = enemyPawn.Health; - enemyPawn.Health = playerHealth; + (enemyPawn.Health, playerPawn.Health) = (playerPawn.Health, enemyPawn.Health); Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth"); Utilities.SetStateChanged(enemyPawn, "CBaseEntity", "m_iHealth"); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a3651a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#a3651a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs b/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs index d6c90c6..c9bf356 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs @@ -14,7 +14,7 @@ namespace jRandomSkills public class LongKnife : ISkill { private const Skills skillName = Skills.LongKnife; - private static float maxDistance = Config.GetValue(skillName, "maxDistance"); + private static readonly float maxDistance = Config.GetValue(skillName, "maxDistance"); public unsafe static void LoadSkill() { @@ -25,18 +25,20 @@ namespace jRandomSkills var player = @event.Userid; if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; - var activeWeapon = player.Pawn.Value.WeaponServices.ActiveWeapon.Value; - if (activeWeapon?.DesignerName != "weapon_knife") return HookResult.Continue; + var pawn = player!.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null || pawn.WeaponServices == null) return HookResult.Continue; - var pawn = player.PlayerPawn.Value; - Vector eyePos = new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z); + var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; + if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_knife") return HookResult.Continue; + + Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z); Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * maxDistance; - Ray ray = new Ray(Vector3.Zero); - CTraceFilter filter = new CTraceFilter(pawn.Index, pawn.Index) + Ray ray = new(Vector3.Zero); + CTraceFilter filter = new(pawn.Index, pawn.Index) { m_nObjectSetMask = 0xf, m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT, @@ -55,20 +57,16 @@ namespace jRandomSkills if (!trace.HitPlayer(out CCSPlayerController? target) || target == null) return HookResult.Continue; - if (target.Handle == player.Handle || trace.Distance() <= 70) return HookResult.Continue; + if (target.Handle == player.Handle || target.PlayerPawn.Value == null || !target.PlayerPawn.Value.IsValid || trace.Distance() <= 70) return HookResult.Continue; target.PlayerPawn.Value.EmitSound("Player.DamageBody.Onlooker"); SkillUtils.TakeHealth(target.PlayerPawn.Value, Instance.Random.Next(21, 34)); return HookResult.Continue; }); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#c9f8ff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float maxDistance = 4096f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float MaxDistance { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#c9f8ff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float maxDistance = 4096f) : base(skill, active, color, onlyTeam, needsTeammates) - { - MaxDistance = maxDistance; - } + public float MaxDistance { get; set; } = maxDistance; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs b/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs index e7de918..3caf629 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs @@ -14,7 +14,7 @@ namespace jRandomSkills public class LongZeus : ISkill { private const Skills skillName = Skills.LongZeus; - private static float maxDistance = Config.GetValue(skillName, "maxDistance"); + private static readonly float maxDistance = Config.GetValue(skillName, "maxDistance"); public unsafe static void LoadSkill() { @@ -27,7 +27,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -41,18 +41,20 @@ namespace jRandomSkills var player = @event.Userid; if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; - var activeWeapon = player.Pawn.Value.WeaponServices.ActiveWeapon.Value; - if (activeWeapon?.DesignerName != "weapon_taser") return HookResult.Continue; + var pawn = player!.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null || pawn.WeaponServices == null) return HookResult.Continue; - var pawn = player.PlayerPawn.Value; - Vector eyePos = new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z); + var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; + if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_taser") return HookResult.Continue; + + Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z); Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * maxDistance; - Ray ray = new Ray(Vector3.Zero); - CTraceFilter filter = new CTraceFilter(pawn.Index, pawn.Index) + Ray ray = new(Vector3.Zero); + CTraceFilter filter = new(pawn.Index, pawn.Index) { m_nObjectSetMask = 0xf, m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT, @@ -82,13 +84,9 @@ namespace jRandomSkills SkillUtils.TryGiveWeapon(player, CsItem.Zeus); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#6effc7", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float maxDistance = 4096f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float MaxDistance { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#6effc7", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float maxDistance = 4096f) : base(skill, active, color, onlyTeam, needsTeammates) - { - MaxDistance = maxDistance; - } + public float MaxDistance { get; set; } = maxDistance; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs index b64f3a7..f434d5d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs @@ -10,8 +10,8 @@ namespace jRandomSkills public class Magnifier : ISkill { private const Skills skillName = Skills.Magnifier; - private static uint customFOV = Config.GetValue(skillName, "customFOV"); - private static Dictionary playersFOV = new Dictionary(); + private static readonly uint customFOV = Config.GetValue(skillName, "customFOV"); + private static readonly Dictionary playersFOV = []; public static void LoadSkill() { @@ -24,7 +24,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -44,7 +44,7 @@ namespace jRandomSkills public static void TypeSkill(CCSPlayerController player, string[] commands) { if (player == null || !player.IsValid || !player.PawnIsAlive) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillChance == 1) @@ -75,7 +75,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SkillChance = 0; SkillUtils.PrintToChat(player, Localization.GetTranslation("magnifier") + ":", false); @@ -102,13 +103,9 @@ namespace jRandomSkills playersFOV.Remove(player); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#9ba882", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, uint customFOV = 50) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public uint CustomFOV { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#9ba882", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, uint customFOV = 50) : base(skill, active, color, onlyTeam, needsTeammates) - { - CustomFOV = customFOV; - } + public uint CustomFOV { get; set; } = customFOV; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Medic.cs b/jRandomSkills - SRC Files/src/player/skills/Medic.cs index 321cd29..f99229c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Medic.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Medic.cs @@ -11,10 +11,10 @@ namespace jRandomSkills public class Medic : ISkill { private const Skills skillName = Skills.Medic; - private static int healthToAdd = Config.GetValue(skillName, "healthToAdd"); - private static int healthShotLimit = Config.GetValue(skillName, "healthShotLimit"); - private static float timerCooldown = Config.GetValue(skillName, "cooldown"); - private static readonly Dictionary SkillPlayerInfo = new Dictionary(); + private static readonly int healthToAdd = Config.GetValue(skillName, "healthToAdd"); + private static readonly int healthShotLimit = Config.GetValue(skillName, "healthShotLimit"); + private static readonly float timerCooldown = Config.GetValue(skillName, "cooldown"); + private static readonly Dictionary SkillPlayerInfo = []; public static void LoadSkill() { @@ -27,7 +27,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) EnableSkill(player); } @@ -45,11 +45,10 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); return HookResult.Continue; }); @@ -57,7 +56,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) UpdateHUD(player, skillInfo); @@ -78,8 +77,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) @@ -101,7 +99,7 @@ namespace jRandomSkills string skillLine = $"{skillData.Name}
"; string remainingLine = cooldown != 0 ? $"{Localization.GetTranslation("hud_info", $"{cooldown}")}
" - : $"{skillInfo.Count}/{healthShotLimit}
"; + : $"{(skillInfo == null ? 0 : skillInfo.Count)}/{healthShotLimit}
"; var hudContent = infoLine + skillLine + remainingLine; player.PrintToCenterHtml(hudContent); @@ -134,17 +132,11 @@ namespace jRandomSkills public DateTime Cooldown { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#10c212", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int healthToAdd = 50, int healthShotLimit = 3, float cooldown = 1f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int HealthToAdd { get; set; } - public int HealthShotLimit { get; set; } - public float Cooldown { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#10c212", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int healthToAdd = 50, int healthShotLimit = 3, float cooldown = 1f) : base(skill, active, color, onlyTeam, needsTeammates) - { - HealthToAdd = healthToAdd; - HealthShotLimit = healthShotLimit; - Cooldown = cooldown; - } + public int HealthToAdd { get; set; } = healthToAdd; + public int HealthShotLimit { get; set; } = healthShotLimit; + public float Cooldown { get; set; } = cooldown; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs b/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs index 2cb1c0d..2819b51 100644 --- a/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs @@ -22,7 +22,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -35,7 +35,7 @@ namespace jRandomSkills public static void TypeSkill(CCSPlayerController player, string[] commands) { if (player == null || !player.IsValid || !player.PawnIsAlive) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillChance == 1) @@ -61,7 +61,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SkillChance = 0; SkillUtils.PrintToChat(player, Localization.GetTranslation("moneyswap") + ":", false); @@ -71,7 +72,8 @@ namespace jRandomSkills if (enemies.Length > 0) { foreach (var enemy in enemies) - player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: ${enemy.InGameMoneyServices.Account}"); + if (enemy != null && enemy.IsValid && enemy.InGameMoneyServices != null) + player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: ${enemy.InGameMoneyServices.Account}"); } else player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); @@ -80,8 +82,10 @@ namespace jRandomSkills private static void SwapMoney(CCSPlayerController player, CCSPlayerController enemy) { - var playerMoneyServices = player?.InGameMoneyServices; - var enemyMoneyServices = enemy?.InGameMoneyServices; + if (player == null || !player.IsValid || enemy == null || !enemy.IsValid) return; + + var playerMoneyServices = player.InGameMoneyServices; + var enemyMoneyServices = enemy.InGameMoneyServices; if (playerMoneyServices == null || enemyMoneyServices == null) return; int playerMoney = playerMoneyServices.Account; @@ -92,11 +96,8 @@ namespace jRandomSkills Utilities.SetStateChanged(enemy, "CCSPlayerController", "m_pInGameMoneyServices"); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#52f54c", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#52f54c", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs b/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs index 28b9161..fd09fdc 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs @@ -9,8 +9,8 @@ namespace jRandomSkills public class Muhammed : ISkill { private const Skills skillName = Skills.Muhammed; - private static float explosionRadius = Config.GetValue(skillName, "explosionRadius"); - private static int explosionDamage = Config.GetValue(skillName, "explosionDamage"); + private static readonly float explosionRadius = Config.GetValue(skillName, "explosionRadius"); + private static readonly int explosionDamage = Config.GetValue(skillName, "explosionDamage"); public static void LoadSkill() { @@ -18,12 +18,12 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { - CCSPlayerController player = @event.Userid; + var player = @event.Userid; if (!IsDeadPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill == skillName) - SpawnExplosion(player); + SpawnExplosion(player!); return HookResult.Continue; }); @@ -34,7 +34,10 @@ namespace jRandomSkills var heProjectile = Utilities.CreateEntityByName("hegrenade_projectile"); if (heProjectile == null || !heProjectile.IsValid) return; - Vector pos = player.PlayerPawn.Value.AbsOrigin; + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return; + + Vector pos = pawn.AbsOrigin; pos.Z += 10; heProjectile.TicksAtZeroVelocity = 100; @@ -55,21 +58,15 @@ namespace jRandomSkills }); } - private static bool IsDeadPlayerValid(CCSPlayerController player) + private static bool IsDeadPlayerValid(CCSPlayerController? player) { return player != null && player.IsValid && player.PlayerPawn?.Value != null; } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#F5CB42", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float explosionRadius = 500.0f, int explosionDamage = 999) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float ExplosionRadius { get; set; } - public int ExplosionDamage { get; set; } - - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#F5CB42", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float explosionRadius = 500.0f, int explosionDamage = 999) : base(skill, active, color, onlyTeam, needsTeammates) - { - ExplosionRadius = explosionRadius; - ExplosionDamage = explosionDamage; - } + public float ExplosionRadius { get; set; } = explosionRadius; + public int ExplosionDamage { get; set; } = explosionDamage; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs index c9da2d8..b097cd9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs @@ -11,10 +11,10 @@ namespace jRandomSkills public class Ninja : ISkill { private const Skills skillName = Skills.Ninja; - private static float idlePercentInvisibility = Config.GetValue(skillName, "idlePercentInvisibility"); - private static float duckPercentInvisibility = Config.GetValue(skillName, "duckPercentInvisibility"); - private static float knifePercentInvisibility = Config.GetValue(skillName, "knifePercentInvisibility"); - private static Dictionary invisibilityChanged = new Dictionary(); + private static readonly float idlePercentInvisibility = Config.GetValue(skillName, "idlePercentInvisibility"); + private static readonly float duckPercentInvisibility = Config.GetValue(skillName, "duckPercentInvisibility"); + private static readonly float knifePercentInvisibility = Config.GetValue(skillName, "knifePercentInvisibility"); + private static readonly Dictionary invisibilityChanged = []; public static void LoadSkill() { @@ -31,9 +31,9 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - if (!player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue; + if (player == null || !player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) DisableSkill(player); @@ -44,7 +44,7 @@ namespace jRandomSkills { var player = @event.Userid; if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; UpdateNinja(player); @@ -58,7 +58,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) UpdateNinja(player); } @@ -70,16 +70,24 @@ namespace jRandomSkills SetWeaponVisibility(player, 0); } - private static void UpdateNinja(CCSPlayerController player) + private static void UpdateNinja(CCSPlayerController? player) { - var flags = (PlayerFlags)player.PlayerPawn.Value.Flags; + if (player == null || !player.IsValid) return; + var pawn = player.PlayerPawn?.Value; + if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + + var flags = (PlayerFlags)pawn.Flags; var buttons = player.Buttons; - var activeWeapon = player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value; + + var weaponServices = pawn.WeaponServices; + if (weaponServices == null) return; + + var activeWeapon = weaponServices.ActiveWeapon.Value; float percentInvisibility = 0; if (buttons.HasFlag(PlayerButtons.Duck)) percentInvisibility += duckPercentInvisibility; - if (activeWeapon.DesignerName == "weapon_knife") + if (activeWeapon != null && activeWeapon.DesignerName == "weapon_knife") percentInvisibility += knifePercentInvisibility; if (!buttons.HasFlag(PlayerButtons.Moveleft) && !buttons.HasFlag(PlayerButtons.Moveright) && !buttons.HasFlag(PlayerButtons.Forward) && !buttons.HasFlag(PlayerButtons.Back) && flags.HasFlag(PlayerFlags.FL_ONGROUND)) percentInvisibility += idlePercentInvisibility; @@ -108,10 +116,11 @@ namespace jRandomSkills { if (!Instance.IsPlayerValid(player)) return; var playerPawn = player.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid || playerPawn.WeaponServices == null) return; var color = Color.FromArgb(Math.Max(255 - (int)(255 * percentInvisibility * 2), 0), 255, 255, 255); - foreach (var weapon in playerPawn.WeaponServices?.MyWeapons) + foreach (var weapon in playerPawn.WeaponServices.MyWeapons) { if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) { @@ -121,17 +130,11 @@ namespace jRandomSkills } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#dedede", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float idlePercentInvisibility = .3f, float duckPercentInvisibility = .3f, float knifePercentInvisibility = .3f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float IdlePercentInvisibility { get; set; } - public float DuckPercentInvisibility { get; set; } - public float KnifePercentInvisibility { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#dedede", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float idlePercentInvisibility = .3f, float duckPercentInvisibility = .3f, float knifePercentInvisibility = .3f) : base(skill, active, color, onlyTeam, needsTeammates) - { - IdlePercentInvisibility = idlePercentInvisibility; - DuckPercentInvisibility = duckPercentInvisibility; - KnifePercentInvisibility = knifePercentInvisibility; - } + public float IdlePercentInvisibility { get; set; } = idlePercentInvisibility; + public float DuckPercentInvisibility { get; set; } = duckPercentInvisibility; + public float KnifePercentInvisibility { get; set; } = knifePercentInvisibility; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/NoNades.cs b/jRandomSkills - SRC Files/src/player/skills/NoNades.cs index a629ff6..2602f2d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/NoNades.cs +++ b/jRandomSkills - SRC Files/src/player/skills/NoNades.cs @@ -20,12 +20,12 @@ namespace jRandomSkills var weapon = @event.Weapon; if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; if (weapon == "hegrenade" || weapon == "inferno") { - SkillUtils.AddHealth(player.PlayerPawn.Value, damage); + SkillUtils.AddHealth(player!.PlayerPawn.Value, damage); damage = 0; return HookResult.Stop; } @@ -33,11 +33,8 @@ namespace jRandomSkills }); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a38c1a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#a38c1a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs b/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs index dc8e1d4..70b6d7f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs +++ b/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs @@ -22,7 +22,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -33,7 +33,7 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { - DisableSkill(null); + Server.ExecuteCommand("weapon_accuracy_nospread 0"); return HookResult.Continue; }); @@ -55,14 +55,12 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) { - var weapon = player.Pawn.Value.WeaponServices?.ActiveWeapon.Value; - if (weapon == null) continue; - var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) continue; pawn.AimPunchTickBase = 0; pawn.AimPunchTickFraction = 0f; pawn.CameraServices.CsViewPunchAngleTick = 0; @@ -71,11 +69,8 @@ namespace jRandomSkills } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8a42f5", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#8a42f5", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Noclip.cs b/jRandomSkills - SRC Files/src/player/skills/Noclip.cs index dc70125..6671767 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Noclip.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Noclip.cs @@ -11,9 +11,9 @@ namespace jRandomSkills public class Noclip : ISkill { private const Skills skillName = Skills.Noclip; - private static float timerCooldown = Config.GetValue(skillName, "cooldown"); - private static float duration = Config.GetValue(skillName, "duration"); - private static readonly Dictionary SkillPlayerInfo = new Dictionary(); + private static readonly float timerCooldown = Config.GetValue(skillName, "cooldown"); + private static readonly float duration = Config.GetValue(skillName, "duration"); + private static readonly Dictionary SkillPlayerInfo = []; public static void LoadSkill() { @@ -25,7 +25,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) { EnableSkill(player); @@ -45,11 +45,10 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); return HookResult.Continue; }); @@ -58,7 +57,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) UpdateHUD(player, skillInfo); @@ -78,8 +77,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) @@ -140,15 +138,10 @@ namespace jRandomSkills public DateTime Cooldown { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#44ebd4", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 30f, float duration = 2f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Cooldown { get; set; } - public float Duration { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#44ebd4", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 30f, float duration = 2f) : base(skill, active, color, onlyTeam, needsTeammates) - { - Cooldown = cooldown; - Duration = duration; - } + public float Cooldown { get; set; } = cooldown; + public float Duration { get; set; } = duration; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/OneShot.cs b/jRandomSkills - SRC Files/src/player/skills/OneShot.cs index 38ee1b1..ad84b18 100644 --- a/jRandomSkills - SRC Files/src/player/skills/OneShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/OneShot.cs @@ -37,7 +37,7 @@ namespace jRandomSkills CCSPlayerController attacker = attackerPawn.Controller.Value.As(); CCSPlayerController victim = victimPawn.Controller.Value.As(); - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); if (playerInfo == null) return HookResult.Continue; if (playerInfo.Skill == skillName && attacker.PawnIsAlive) diff --git a/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs b/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs index 9b382c4..beee8e9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs +++ b/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs @@ -22,12 +22,12 @@ namespace jRandomSkills var hitgroup = (HitGroup_t)@event.Hitgroup; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; - var victimInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue; - HitGroup_t[] disabledHitbox = { HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG }; + HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG]; if (hitgroup != HitGroup_t.HITGROUP_HEAD) - RestoreHealth(victim, damage); + RestoreHealth(victim!, damage); return HookResult.Stop; }); } @@ -35,6 +35,7 @@ namespace jRandomSkills private static void RestoreHealth(CCSPlayerController victim, float damage) { var playerPawn = victim.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid) return; var newHealth = playerPawn.Health + damage; if (newHealth > 100) @@ -44,11 +45,8 @@ namespace jRandomSkills Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth"); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#3c47de", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#3c47de", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs index 063ea09..45c9d62 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs @@ -11,8 +11,8 @@ namespace jRandomSkills public class PawelJumper : ISkill { private const Skills skillName = Skills.PawelJumper; - private static int extraJumpsMin = Config.GetValue(skillName, "extraJumpsMin"); - private static int extraJumpsMax = Config.GetValue(skillName, "extraJumpsMax"); + private static readonly int extraJumpsMin = Config.GetValue(skillName, "extraJumpsMin"); + private static readonly int extraJumpsMax = Config.GetValue(skillName, "extraJumpsMax"); private static readonly PlayerFlags[] LF = new PlayerFlags[64]; private static readonly int?[] J = new int?[64]; @@ -27,7 +27,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) { GiveAdditionalJump(player); @@ -39,10 +39,10 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { var playerPawn = player.PlayerPawn.Value; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerPawn == null) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerPawn == null || playerInfo == null) return; - var skillConfig = Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString()); + var skillConfig = Config.LoadedConfig.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString()); if (skillConfig == null) return; float extraJumps = (float)Instance.Random.Next(extraJumpsMin, extraJumpsMax + 1); @@ -53,11 +53,13 @@ namespace jRandomSkills private static void GiveAdditionalJump(CCSPlayerController player) { var playerPawn = player.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid) return; + var flags = (PlayerFlags)playerPawn.Flags; var buttons = player.Buttons; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerPawn == null) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerPawn == null || playerInfo == null) return; if ((LF[player.Slot] & PlayerFlags.FL_ONGROUND) != 0 && (flags & PlayerFlags.FL_ONGROUND) == 0 && (LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0) { @@ -77,15 +79,10 @@ namespace jRandomSkills LB[player.Slot] = buttons; } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#FFA500", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int extraJumpsMin = 1, int extraJumpsMax = 4) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int ExtraJumpsMin { get; set; } - public int ExtraJumpsMax { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#FFA500", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int extraJumpsMin = 1, int extraJumpsMax = 4) : base(skill, active, color, onlyTeam, needsTeammates) - { - ExtraJumpsMin = extraJumpsMin; - ExtraJumpsMax = extraJumpsMax; - } + public int ExtraJumpsMin { get; set; } = extraJumpsMin; + public int ExtraJumpsMax { get; set; } = extraJumpsMax; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs b/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs index 7fe7aaf..11c7e12 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs @@ -23,7 +23,7 @@ namespace jRandomSkills { if (!IsDeadPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -35,10 +35,9 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return HookResult.Continue; - if (player == null || !player.IsValid || !player.PlayerPawn.Value.IsValid) return HookResult.Continue; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) { if (Instance.Random.NextDouble() <= playerInfo.SkillChance) @@ -55,7 +54,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; float newChance = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "ChanceTo") - Config.GetValue(skillName, "ChanceFrom")) + Config.GetValue(skillName, "ChanceFrom"); playerInfo.SkillChance = newChance; newChance = (float)Math.Round(newChance, 2) * 100; @@ -68,15 +68,10 @@ namespace jRandomSkills return player != null && player.IsValid && player.PlayerPawn?.Value != null; } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff5C0A", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .2f, float chanceTo = .4f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float ChanceFrom { get; set; } - public float ChanceTo { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff5C0A", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .2f, float chanceTo = .4f) : base(skill, active, color, onlyTeam, needsTeammates) - { - ChanceFrom = chanceFrom; - ChanceTo = chanceTo; - } + public float ChanceFrom { get; set; } = chanceFrom; + public float ChanceTo { get; set; } = chanceTo; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Pilot.cs b/jRandomSkills - SRC Files/src/player/skills/Pilot.cs index b0facbc..73c6b44 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Pilot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Pilot.cs @@ -11,8 +11,8 @@ namespace jRandomSkills public class Pilot : ISkill { private const Skills skillName = Skills.Pilot; - private static float maximumFuel = Config.GetValue(skillName, "maximumFuel"); - private static readonly Dictionary PlayerPilotInfo = new Dictionary(); + private static readonly float maximumFuel = Config.GetValue(skillName, "maximumFuel"); + private static readonly Dictionary PlayerPilotInfo = []; public static void LoadSkill() { @@ -24,11 +24,9 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - { EnableSkill(player); - } } }); @@ -38,13 +36,10 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - { - if (PlayerPilotInfo.ContainsKey(player.SteamID)) - PlayerPilotInfo.Remove(player.SteamID); - } + PlayerPilotInfo.Remove(player.SteamID); return HookResult.Continue; }); @@ -53,7 +48,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) HandlePilot(player); } @@ -73,8 +68,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (PlayerPilotInfo.ContainsKey(player.SteamID)) - PlayerPilotInfo.Remove(player.SteamID); + PlayerPilotInfo.Remove(player.SteamID); } private static void HandlePilot(CCSPlayerController player) @@ -155,11 +149,11 @@ namespace jRandomSkills QAngle eye_angle = playerPawn.EyeAngles; double pitch = (Math.PI / 180) * eye_angle.X; double yaw = (Math.PI / 180) * eye_angle.Y; - Vector eye_vector = new Vector((float)(Math.Cos(yaw) * Math.Cos(pitch)), (float)(Math.Sin(yaw) * Math.Cos(pitch)), (float)(-Math.Sin(pitch))); + Vector eye_vector = new((float)(Math.Cos(yaw) * Math.Cos(pitch)), (float)(Math.Sin(yaw) * Math.Cos(pitch)), (float)(-Math.Sin(pitch))); Vector currentVelocity = playerPawn.AbsVelocity; - Vector jetpackVelocity = new Vector( + Vector jetpackVelocity = new( eye_vector.X * 5.0f, eye_vector.Y * 5.0f, 0.80f * 15.0f @@ -183,13 +177,9 @@ namespace jRandomSkills public DateTime PilotStartTime { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#1466F5", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float maximumFuel = 100f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float MaximumFuel { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#1466F5", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float maximumFuel = 100f) : base(skill, active, color, onlyTeam, needsTeammates) - { - MaximumFuel = maximumFuel; - } + public float MaximumFuel { get; set; } = maximumFuel; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Planter.cs b/jRandomSkills - SRC Files/src/player/skills/Planter.cs index fa4757f..0c11854 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Planter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Planter.cs @@ -11,7 +11,7 @@ namespace jRandomSkills public class Planter : ISkill { private const Skills skillName = Skills.Planter; - private static int extraC4BlowTime = Config.GetValue(skillName, "extraC4BlowTime"); + private static readonly int extraC4BlowTime = Config.GetValue(skillName, "extraC4BlowTime"); public static void LoadSkill() { @@ -22,7 +22,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - Schema.SetSchemaValue(player.Pawn.Value.Handle, "CCSPlayerPawn", "m_bInBombZone", false); + Schema.SetSchemaValue(player!.PlayerPawn!.Value!.Handle, "CCSPlayerPawn", "m_bInBombZone", false); } return HookResult.Continue; }); @@ -32,7 +32,7 @@ namespace jRandomSkills var player = @event.Userid; if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); @@ -47,7 +47,8 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - Schema.SetSchemaValue(player.Pawn.Value.Handle, "CCSPlayerPawn", "m_bInBombZone", false); + if (!Instance.IsPlayerValid(player)) return; + Schema.SetSchemaValue(player!.PlayerPawn.Value!.Handle, "CCSPlayerPawn", "m_bInBombZone", false); } private static void OnTick() @@ -55,20 +56,16 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - Schema.SetSchemaValue(player.Pawn.Value.Handle, "CCSPlayerPawn", "m_bInBombZone", true); + Schema.SetSchemaValue(player!.PlayerPawn.Value!.Handle, "CCSPlayerPawn", "m_bInBombZone", true); } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#7d7d7d", CsTeam onlyTeam = CsTeam.Terrorist, bool needsTeammates = false, int extraC4BlowTime = 60) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int ExtraC4BlowTime { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#7d7d7d", CsTeam onlyTeam = CsTeam.Terrorist, bool needsTeammates = false, int extraC4BlowTime = 60) : base(skill, active, color, onlyTeam, needsTeammates) - { - ExtraC4BlowTime = extraC4BlowTime; - } + public int ExtraC4BlowTime { get; set; } = extraC4BlowTime; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Poison.cs b/jRandomSkills - SRC Files/src/player/skills/Poison.cs index 7adfe29..19f7eb6 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Poison.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Poison.cs @@ -10,9 +10,9 @@ namespace jRandomSkills public class Poison : ISkill { private const Skills skillName = Skills.Poison; - private static float cooldown = Config.GetValue(skillName, "Cooldown"); - private static int healthToDamage = Config.GetValue(skillName, "Damage"); - private static HashSet poisonedPlayers = new HashSet(); + private static readonly float cooldown = Config.GetValue(skillName, "Cooldown"); + private static readonly int healthToDamage = Config.GetValue(skillName, "Damage"); + private static readonly HashSet poisonedPlayers = []; public static void LoadSkill() { @@ -25,7 +25,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -58,7 +58,7 @@ namespace jRandomSkills public static void TypeSkill(CCSPlayerController player, string[] commands) { if (player == null || !player.IsValid || !player.PawnIsAlive) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillChance == 1) @@ -84,7 +84,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SkillChance = 0; SkillUtils.PrintToChat(player, Localization.GetTranslation("poison") + ":", false); @@ -106,15 +107,10 @@ namespace jRandomSkills poisonedPlayers.Remove(player); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#902eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 1, int damage = 1) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int Damage { get; set; } - public float Cooldown { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#902eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 1, int damage = 1) : base(skill, active, color, onlyTeam, needsTeammates) - { - Damage = damage; - Cooldown = cooldown; - } + public int Damage { get; set; } = damage; + public float Cooldown { get; set; } = cooldown; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs index ec60098..e3e37d8 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs @@ -10,12 +10,12 @@ namespace jRandomSkills public class PrimaryBan : ISkill { private const Skills skillName = Skills.PrimaryBan; - private static HashSet bannedPlayers = new HashSet(); - private static string[] disabledWeapons = - { + private static readonly HashSet bannedPlayers = []; + private static readonly string[] disabledWeapons = + [ "ak47", "m4a1", "m4a4", "m4a1_silencer", "famas", "galilar", "aug", "sg553", "mp9", "mac10", "bizon", "mp7", "ump45", "p90", "mp5sd", "ssg08", "awp", "scar20", "g3sg1", "nova", "xm1014", "mag7", "sawedoff", "m249", "negev" - }; + ]; public static void LoadSkill() { @@ -28,7 +28,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -47,7 +47,7 @@ namespace jRandomSkills { var player = @event.Userid; var weapon = @event.Item; - + if (player == null || !player.IsValid) return HookResult.Continue; if (!bannedPlayers.Contains(player.SteamID) || !disabledWeapons.Contains(weapon)) return HookResult.Continue; player.ExecuteClientCommand("slot3"); return HookResult.Stop; @@ -57,7 +57,7 @@ namespace jRandomSkills public static void TypeSkill(CCSPlayerController player, string[] commands) { if (player == null || !player.IsValid || !player.PawnIsAlive) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillChance == 1) @@ -94,7 +94,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SkillChance = 0; SkillUtils.PrintToChat(player, Localization.GetTranslation("primaryban") + ":", false); @@ -116,11 +117,8 @@ namespace jRandomSkills bannedPlayers.Remove(player.SteamID); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffc061", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffc061", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs b/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs index 87bcbaf..2e72069 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs @@ -22,12 +22,12 @@ namespace jRandomSkills var hitgroup = (HitGroup_t)@event.Hitgroup; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; - var victimInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue; - HitGroup_t[] disabledHitbox = { HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG }; + HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG]; if (disabledHitbox.Contains(hitgroup)) - RestoreHealth(victim, damage); + RestoreHealth(victim!, damage); return HookResult.Stop; }); } @@ -35,6 +35,7 @@ namespace jRandomSkills private static void RestoreHealth(CCSPlayerController victim, float damage) { var playerPawn = victim.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid) return; var newHealth = playerPawn.Health + damage; if (newHealth > 100) @@ -44,11 +45,8 @@ namespace jRandomSkills Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth"); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#9c9c9c", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#9c9c9c", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs b/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs index ed12ec8..4365af1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs @@ -11,11 +11,11 @@ namespace jRandomSkills public class PsychicDefusing : ISkill { private const Skills skillName = Skills.PsychicDefusing; - private static readonly Dictionary SkillPlayerInfo = new Dictionary(); - private static Vector bombLocation = null; - private static float maxDefusingRange = Config.GetValue(skillName, "maxDefusingRange"); - private static float defusingTime = Config.GetValue(skillName, "defusingTime"); - private static float tickRate = 64f; + private static readonly Dictionary SkillPlayerInfo = []; + private static Vector? bombLocation = null; + private static readonly float maxDefusingRange = Config.GetValue(skillName, "maxDefusingRange"); + private static readonly float defusingTime = Config.GetValue(skillName, "defusingTime"); + private static readonly float tickRate = 64f; public static void LoadSkill() { @@ -28,7 +28,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -47,11 +47,14 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; + if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return HookResult.Continue; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.ContainsKey(player.PlayerPawn.Value)) - SkillPlayerInfo.Remove(player.PlayerPawn.Value); + SkillPlayerInfo.Remove(pawn); return HookResult.Continue; }); @@ -72,7 +75,7 @@ namespace jRandomSkills var player = skillInfo.Key; var info = skillInfo.Value; - if (SkillUtils.GetDistance(player.AbsOrigin, bombLocation) > maxDefusingRange) + if (player.AbsOrigin == null || SkillUtils.GetDistance(player.AbsOrigin, bombLocation) > maxDefusingRange) { info.Defusing = false; info.DefusingTime = defusingTime; @@ -96,14 +99,18 @@ namespace jRandomSkills SkillPlayerInfo.Clear(); } - UpdateHUD(player.Controller.Value.As(), info); + var playerController = player.Controller.Value; + if (playerController == null || !player.Controller.IsValid) return; + UpdateHUD(playerController.As(), info); } }); } public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo[player.PlayerPawn.Value] = new PlayerSkillInfo + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return; + SkillPlayerInfo[pawn] = new PlayerSkillInfo { SteamID = player.SteamID, Defusing = false, @@ -113,8 +120,9 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (SkillPlayerInfo.ContainsKey(player.PlayerPawn.Value)) - SkillPlayerInfo.Remove(player.PlayerPawn.Value); + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return; + SkillPlayerInfo.Remove(pawn); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) @@ -139,15 +147,10 @@ namespace jRandomSkills public float DefusingTime { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#507529", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false, float maxDefusingRange = 80f, float defusingTime = 10f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float MaxDefusingRange { get; set; } - public float DefusingTime { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#507529", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false, float maxDefusingRange = 80f, float defusingTime = 10f) : base(skill, active, color, onlyTeam, needsTeammates) - { - MaxDefusingRange = maxDefusingRange; - DefusingTime = defusingTime; - } + public float MaxDefusingRange { get; set; } = maxDefusingRange; + public float DefusingTime { get; set; } = defusingTime; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Push.cs b/jRandomSkills - SRC Files/src/player/skills/Push.cs index a0fa096..37ed4ac 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Push.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Push.cs @@ -10,8 +10,8 @@ namespace jRandomSkills public class Push : ISkill { private const Skills skillName = Skills.Push; - private static float jumpVelocity = Config.GetValue(skillName, "jumpVelocity"); - private static float pushVelocity = Config.GetValue(skillName, "pushVelocity"); + private static readonly float jumpVelocity = Config.GetValue(skillName, "jumpVelocity"); + private static readonly float pushVelocity = Config.GetValue(skillName, "pushVelocity"); public static void LoadSkill() { @@ -25,7 +25,7 @@ namespace jRandomSkills { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -42,12 +42,12 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (playerInfo?.Skill == skillName && victim.PawnIsAlive) + if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) { if (Instance.Random.NextDouble() <= playerInfo.SkillChance) - PushEnemy(victim, attacker.PlayerPawn.Value.EyeAngles); + PushEnemy(victim, attacker!.PlayerPawn.Value!.EyeAngles); } return HookResult.Continue; @@ -56,7 +56,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; float newChance = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "ChanceTo") - Config.GetValue(skillName, "ChanceFrom")) + Config.GetValue(skillName, "ChanceFrom"); playerInfo.SkillChance = newChance; newChance = (float)Math.Round(newChance, 2) * 100; @@ -66,7 +67,7 @@ namespace jRandomSkills private static void PushEnemy(CCSPlayerController player, QAngle attackerAngle) { - if (player.PlayerPawn.Value.LifeState != (int)LifeState_t.LIFE_ALIVE) + if (player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || player.PlayerPawn.Value.LifeState != (int)LifeState_t.LIFE_ALIVE) return; var currentPosition = player.PlayerPawn.Value.AbsOrigin; @@ -78,19 +79,12 @@ namespace jRandomSkills player.PlayerPawn.Value.Teleport(currentPosition, currentAngles, newVelocity); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#1e9ab0", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = 1f, float chanceTo = 1f, float jumpVelocity = 300f, float pushVelocity = 400f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float ChanceFrom { get; set; } - public float ChanceTo { get; set; } - public float JumpVelocity { get; set; } - public float PushVelocity { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#1e9ab0", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = 1f, float chanceTo = 1f, float jumpVelocity = 300f, float pushVelocity = 400f) : base(skill, active, color, onlyTeam, needsTeammates) - { - ChanceFrom = chanceFrom; - ChanceTo = chanceTo; - JumpVelocity = jumpVelocity; - PushVelocity = pushVelocity; - } + public float ChanceFrom { get; set; } = chanceFrom; + public float ChanceTo { get; set; } = chanceTo; + public float JumpVelocity { get; set; } = jumpVelocity; + public float PushVelocity { get; set; } = pushVelocity; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Pyro.cs b/jRandomSkills - SRC Files/src/player/skills/Pyro.cs index e013d3f..4cc479d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Pyro.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Pyro.cs @@ -10,7 +10,7 @@ namespace jRandomSkills public class Pyro : ISkill { private const Skills skillName = Skills.Pyro; - private static float regenerationMultiplier = Config.GetValue(skillName, "regenerationMultiplier"); + private static readonly float regenerationMultiplier = Config.GetValue(skillName, "regenerationMultiplier"); public static void LoadSkill() { @@ -23,7 +23,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -39,10 +39,10 @@ namespace jRandomSkills string weapon = @event.Weapon; if (weapon != "inferno" || !Instance.IsPlayerValid(victim)) return HookResult.Continue; - var victimInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue; - RestoreHealth(victim, damage * regenerationMultiplier); + RestoreHealth(victim!, damage * regenerationMultiplier); return HookResult.Stop; }); } @@ -55,6 +55,7 @@ namespace jRandomSkills private static void RestoreHealth(CCSPlayerController victim, float damage) { var playerPawn = victim.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid) return; var newHealth = playerPawn.Health + damage; if (newHealth > 100) @@ -64,13 +65,9 @@ namespace jRandomSkills Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth"); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#3c47de", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float regenerationMultiplier = 1.5f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float RegenerationMultiplier { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#3c47de", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float regenerationMultiplier = 1.5f) : base(skill, active, color, onlyTeam, needsTeammates) - { - RegenerationMultiplier = regenerationMultiplier; - } + public float RegenerationMultiplier { get; set; } = regenerationMultiplier; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs b/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs index 53a630e..bf73ffa 100644 --- a/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs @@ -22,14 +22,17 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) { - var weapon = player.Pawn.Value.WeaponServices?.ActiveWeapon.Value; - if (weapon == null) continue; - - var pawn = player.PlayerPawn.Value; + var pawn = player.PlayerPawn.Value!; + var weaponServices = pawn.WeaponServices; + if (weaponServices == null || weaponServices.ActiveWeapon == null || !weaponServices.ActiveWeapon.IsValid) continue; + + var weapon = weaponServices.ActiveWeapon.Value; + if (weapon == null || !weapon.IsValid || pawn.CameraServices == null) continue; + pawn.AimPunchTickBase = 0; pawn.AimPunchTickFraction = 0f; pawn.CameraServices.CsViewPunchAngleTick = 0; @@ -41,11 +44,8 @@ namespace jRandomSkills } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8a42f5", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#8a42f5", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs b/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs index 7ebfb32..c42689b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs @@ -23,7 +23,7 @@ namespace jRandomSkills { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) { SetEnemiesVisibleOnRadar(player); diff --git a/jRandomSkills - SRC Files/src/player/skills/Rambo.cs b/jRandomSkills - SRC Files/src/player/skills/Rambo.cs index b0a0b7a..e912568 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Rambo.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Rambo.cs @@ -23,7 +23,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) EnableSkill(player); } diff --git a/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs b/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs index d8bac25..210cadd 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs @@ -12,16 +12,16 @@ namespace jRandomSkills public class RandomWeapon : ISkill { private const Skills skillName = Skills.RandomWeapon; - private static float timerCooldown = Config.GetValue(skillName, "cooldown"); - private static readonly Dictionary SkillPlayerInfo = new Dictionary(); + private static readonly float timerCooldown = Config.GetValue(skillName, "cooldown"); + private static readonly Dictionary SkillPlayerInfo = []; - private static string[] pistols = { "weapon_deagle", "weapon_revolver", "weapon_glock", "weapon_usp_silencer", - "weapon_cz75a", "weapon_fiveseven", "weapon_p250", "weapon_tec9", "weapon_elite", "weapon_hkp2000" }; + private static readonly string[] pistols = [ "weapon_deagle", "weapon_revolver", "weapon_glock", "weapon_usp_silencer", + "weapon_cz75a", "weapon_fiveseven", "weapon_p250", "weapon_tec9", "weapon_elite", "weapon_hkp2000" ]; - private static string[] rifles = { "weapon_mp9", "weapon_mac10", "weapon_bizon", "weapon_mp7", "weapon_ump45", "weapon_p90", + private static readonly string[] rifles = [ "weapon_mp9", "weapon_mac10", "weapon_bizon", "weapon_mp7", "weapon_ump45", "weapon_p90", "weapon_mp5sd", "weapon_famas", "weapon_galilar", "weapon_m4a1", "weapon_m4a1_silencer", "weapon_ak47", "weapon_aug", "weapon_sg553", "weapon_ssg08", "weapon_awp", "weapon_scar20", "weapon_g3sg1", - "weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_m249", "weapon_negev" }; + "weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_m249", "weapon_negev" ]; public static void LoadSkill() { @@ -33,7 +33,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) { EnableSkill(player); @@ -53,11 +53,10 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); return HookResult.Continue; }); @@ -66,7 +65,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) UpdateHUD(player, skillInfo); @@ -86,8 +85,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) @@ -132,15 +130,18 @@ namespace jRandomSkills private static void RemoveAndGiveWeapon(CCSPlayerController player) { - List playerWeapons = new List(); - foreach (var item in player?.PlayerPawn?.Value?.WeaponServices?.MyWeapons) - if (!string.IsNullOrEmpty(item?.Value?.DesignerName)) - playerWeapons.Add(item?.Value?.DesignerName); + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return; + + List 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) return; - List weaponList = new List(pistols.Concat(rifles)); + List weaponList = new(pistols.Concat(rifles)); weaponList.RemoveAll(w => playerWeapons.Contains(w)); if (weaponList.Count == 0) @@ -154,9 +155,9 @@ namespace jRandomSkills if (!string.IsNullOrEmpty(weaponToRemove)) { - foreach (var item in player.PlayerPawn.Value.WeaponServices.MyWeapons) + foreach (var item in pawn.WeaponServices.MyWeapons) { - if (item != null && item.Value != null && item.Value.DesignerName == weaponToRemove) + if (item != null && item.IsValid && item.Value != null && item.Value.IsValid && item.Value.DesignerName == weaponToRemove) item.Value.Remove(); } } @@ -174,13 +175,9 @@ namespace jRandomSkills public DateTime Cooldown { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#e0873a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 15f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Cooldown { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#e0873a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 15f) : base(skill, active, color, onlyTeam, needsTeammates) - { - Cooldown = cooldown; - } + public float Cooldown { get; set; } = cooldown; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs b/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs index 9fca7f0..08e5423 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs @@ -10,8 +10,8 @@ namespace jRandomSkills public class ReZombie : ISkill { private const Skills skillName = Skills.ReZombie; - private static int zombieHealth = Config.GetValue(skillName, "zombieHealth"); - private static HashSet zombies = new HashSet(); + private static readonly int zombieHealth = Config.GetValue(skillName, "zombieHealth"); + private static readonly HashSet zombies = []; public static void LoadSkill() { @@ -21,7 +21,7 @@ namespace jRandomSkills { var player = @event.Userid; var weapon = @event.Item; - + if (player == null || !player.IsValid) return HookResult.Continue; if (!zombies.Contains(player) || weapon == "c4") return HookResult.Continue; player.ExecuteClientCommand("slot3"); return HookResult.Stop; @@ -38,14 +38,15 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - if (player == null || !player.IsValid || !player.PlayerPawn.Value.IsValid || zombies.Contains(player)) return HookResult.Continue; + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || zombies.Contains(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; var pawn = player.PlayerPawn.Value; - Vector deadPosition = new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z); - QAngle deadRotation = new QAngle(pawn.EyeAngles.X, pawn.EyeAngles.Y, pawn.EyeAngles.Z); + if (pawn.AbsOrigin == null) return HookResult.Continue; + Vector deadPosition = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z); + QAngle deadRotation = new(pawn.EyeAngles.X, pawn.EyeAngles.Y, pawn.EyeAngles.Z); player.Respawn(); Instance.AddTimer(.2f, () => { @@ -69,6 +70,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; zombies.Remove(player); SetPlayerColor(player.PlayerPawn.Value, true); } @@ -80,13 +82,9 @@ namespace jRandomSkills Utilities.SetStateChanged(pawn, "CBaseModelEntity", "m_clrRender"); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff5C0A", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int zombieHealth = 200) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int ZombieHealth { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff5C0A", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int zombieHealth = 200) : base(skill, active, color, onlyTeam, needsTeammates) - { - ZombieHealth = zombieHealth; - } + public int ZombieHealth { get; set; } = zombieHealth; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs index c1b12b1..095f878 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs @@ -11,8 +11,8 @@ namespace jRandomSkills public class ReactiveArmor : ISkill { private const Skills skillName = Skills.ReactiveArmor; - private static float timerCooldown = Config.GetValue(skillName, "cooldown"); - private static readonly Dictionary SkillPlayerInfo = new Dictionary(); + private static readonly float timerCooldown = Config.GetValue(skillName, "cooldown"); + private static readonly Dictionary SkillPlayerInfo = []; public static void LoadSkill() { @@ -24,7 +24,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) EnableSkill(player); } @@ -42,11 +42,10 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); return HookResult.Continue; }); @@ -55,7 +54,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) UpdateHUD(player, skillInfo); @@ -69,7 +68,7 @@ namespace jRandomSkills int damage = @event.DmgHealth; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; - if (SkillPlayerInfo.TryGetValue(victim.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(victim!.SteamID, out var skillInfo)) { if (!victim.IsValid || !victim.PawnIsAlive || !skillInfo.CanUse) return HookResult.Continue; skillInfo.CanUse = false; @@ -94,8 +93,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) @@ -124,6 +122,7 @@ namespace jRandomSkills private static void RestoreHealth(CCSPlayerController victim, float damage) { var playerPawn = victim.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid) return; var newHealth = playerPawn.Health + damage; if (newHealth > 100) @@ -140,13 +139,9 @@ namespace jRandomSkills public DateTime Cooldown { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#3cded3", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 15) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Cooldown { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#3cded3", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 15) : base(skill, active, color, onlyTeam, needsTeammates) - { - Cooldown = cooldown; - } + public float Cooldown { get; set; } = cooldown; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs b/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs index 269418b..d0ffde9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs @@ -23,7 +23,7 @@ namespace jRandomSkills if (Server.TickCount % (int)(64 * cooldown) != 0) return; foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; var pawn = player.PlayerPawn.Value; diff --git a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs index 2237e76..8ae04fa 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs @@ -13,8 +13,8 @@ namespace jRandomSkills public class Replicator : ISkill { private const Skills skillName = Skills.Replicator; - private static float timerCooldown = Config.GetValue(skillName, "cooldown"); - private static readonly Dictionary SkillPlayerInfo = new Dictionary(); + private static readonly float timerCooldown = Config.GetValue(skillName, "cooldown"); + private static readonly Dictionary SkillPlayerInfo = []; public static void LoadSkill() { @@ -27,7 +27,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) EnableSkill(player); } @@ -45,11 +45,10 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); return HookResult.Continue; }); @@ -57,7 +56,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) UpdateHUD(player, skillInfo); @@ -79,8 +78,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) @@ -127,7 +125,7 @@ namespace jRandomSkills { var playerPawn = player.PlayerPawn.Value; var replica = Utilities.CreateEntityByName("prop_dynamic"); - if (replica == null) + if (replica == null || playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null || playerPawn.AbsRotation == null) return; float distance = 40; @@ -140,7 +138,7 @@ namespace jRandomSkills replica.Flags |= (uint)Flags_t.FL_DUCKING; replica.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(replica.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); replica.SetModel(playerPawn!.CBodyComponent!.SceneNode!.GetSkeletonInstance().ModelState.ModelName); - replica.Entity.Name = replica.Globalname = $"Replica_{Server.TickCount}_{(player.Team == CsTeam.CounterTerrorist ? "CT" : "TT")}"; + replica.Entity!.Name = replica.Globalname = $"Replica_{Server.TickCount}_{(player.Team == CsTeam.CounterTerrorist ? "CT" : "TT")}"; replica.Teleport(pos, playerPawn.AbsRotation, null); replica.DispatchSpawn(); replica.AcceptInput("EnableCollision"); @@ -154,7 +152,7 @@ namespace jRandomSkills if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) return HookResult.Continue; - CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.Handle); + CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); if (string.IsNullOrEmpty(param.Entity.Name)) return HookResult.Continue; if (!param.Entity.Name.StartsWith("Replica_")) return HookResult.Continue; @@ -176,13 +174,9 @@ namespace jRandomSkills public DateTime Cooldown { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a3000b", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 15f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Cooldown { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#a3000b", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 15f) : base(skill, active, color, onlyTeam, needsTeammates) - { - Cooldown = cooldown; - } + public float Cooldown { get; set; } = cooldown; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs index 1200982..dbde6cd 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs @@ -11,8 +11,8 @@ namespace jRandomSkills public class Retreat : ISkill { private const Skills skillName = Skills.Retreat; - private static float timerCooldown = Config.GetValue(skillName, "cooldown"); - private static readonly Dictionary SkillPlayerInfo = new Dictionary(); + private static readonly float timerCooldown = Config.GetValue(skillName, "cooldown"); + private static readonly Dictionary SkillPlayerInfo = []; public static void LoadSkill() { @@ -24,7 +24,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) { EnableSkill(player); @@ -44,11 +44,10 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); return HookResult.Continue; }); @@ -57,7 +56,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) UpdateHUD(player, skillInfo); @@ -77,8 +76,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) @@ -121,16 +119,15 @@ namespace jRandomSkills } } - private static Vector GetSpawnVector(CCSPlayerController player) + private static Vector? GetSpawnVector(CCSPlayerController player) { - var abs = player.PlayerPawn.Value.AbsOrigin; var spawns = Utilities.FindAllEntitiesByDesignerName(player.Team == CsTeam.Terrorist ? "info_player_terrorist" : "info_player_counterterrorist").ToList(); - if (spawns.Any()) + if (spawns.Count != 0) { var randomSpawn = spawns[Instance.Random.Next(spawns.Count)]; return randomSpawn.AbsOrigin; } - return new Vector(abs.X, abs.Y, abs.Z); + return null; } public class PlayerSkillInfo @@ -140,13 +137,9 @@ namespace jRandomSkills public DateTime Cooldown { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a86eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 15f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Cooldown { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#a86eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 15f) : base(skill, active, color, onlyTeam, needsTeammates) - { - Cooldown = cooldown; - } + public float Cooldown { get; set; } = cooldown; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs b/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs index 3cad616..9f3cbd9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs @@ -9,7 +9,7 @@ namespace jRandomSkills public class ReturnToSender : ISkill { private const Skills skillName = Skills.ReturnToSender; - private static HashSet playersToSender = new HashSet(); + private static readonly HashSet playersToSender = []; public static void LoadSkill() { @@ -28,13 +28,15 @@ namespace jRandomSkills int damage = @event.DmgHealth; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); if (attackerInfo == null || attackerInfo.Skill != skillName) return HookResult.Continue; - if (playersToSender.TryGetValue(victim.Handle, out _)) + if (playersToSender.TryGetValue(victim!.Handle, out _)) return HookResult.Continue; - victim.PlayerPawn.Value.Teleport(GetSpawnVector(victim)); + var spawn = GetSpawnVector(victim); + if (spawn == null) return HookResult.Continue; + victim!.PlayerPawn!.Value!.Teleport(spawn); playersToSender.Add(victim.Handle); return HookResult.Stop; }); @@ -45,23 +47,19 @@ namespace jRandomSkills playersToSender.Remove(player.Handle); } - private static Vector GetSpawnVector(CCSPlayerController player) + private static Vector? GetSpawnVector(CCSPlayerController player) { - var abs = player.PlayerPawn.Value.AbsOrigin; var spawns = Utilities.FindAllEntitiesByDesignerName(player.Team == CsTeam.Terrorist ? "info_player_terrorist" : "info_player_counterterrorist").ToList(); - if (spawns.Any()) + if (spawns.Count != 0) { var randomSpawn = spawns[Instance.Random.Next(spawns.Count)]; return randomSpawn.AbsOrigin; } - return new Vector(abs.X, abs.Y, abs.Z); + return null; } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a68132", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#a68132", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs b/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs index d9409a4..b2c5d45 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs @@ -9,8 +9,8 @@ namespace jRandomSkills public class RichBoy : ISkill { private const Skills skillName = Skills.RichBoy; - private static int minMoney = Config.GetValue(skillName, "minMoney"); - private static int maxMoney = Config.GetValue(skillName, "maxMoney"); + private static readonly int minMoney = Config.GetValue(skillName, "minMoney"); + private static readonly int maxMoney = Config.GetValue(skillName, "maxMoney"); public static void LoadSkill() { @@ -22,7 +22,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) { @@ -38,7 +38,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; int moneyBonus = Instance.Random.Next(minMoney, maxMoney); playerInfo.SkillChance = moneyBonus; AddMoney(player, moneyBonus); @@ -46,29 +47,25 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - AddMoney(player, -(int)playerInfo.SkillChance); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; + AddMoney(player, -(int)(playerInfo.SkillChance ?? 0)); } private static void AddMoney(CCSPlayerController player, int money) { - var moneyServices = player?.InGameMoneyServices; - + if (player == null || !player.IsValid) return; + var moneyServices = player.InGameMoneyServices; if (moneyServices == null) return; moneyServices.Account = Math.Max(moneyServices.Account + money, 0); Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInGameMoneyServices"); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#D4AF37", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int minMoney = 5000, int maxMoney = 15000) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int MinMoney { get; set; } - public int MaxMoney { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#D4AF37", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int minMoney = 5000, int maxMoney = 15000) : base(skill, active, color, onlyTeam, needsTeammates) - { - MinMoney = minMoney; - MaxMoney = maxMoney; - } + public int MinMoney { get; set; } = minMoney; + public int MaxMoney { get; set; } = maxMoney; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs b/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs index 0433638..40da2f7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs @@ -9,7 +9,7 @@ namespace jRandomSkills public class RobinHood : ISkill { private const Skills skillName = Skills.RobinHood; - private static int moneyMultiplier = Config.GetValue(skillName, "moneyMultiplier"); + private static readonly int moneyMultiplier = Config.GetValue(skillName, "moneyMultiplier"); public static void LoadSkill() { @@ -22,11 +22,11 @@ namespace jRandomSkills var damage = @event.DmgHealth; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); if (attackerInfo?.Skill != skillName) return HookResult.Continue; int moneyToSteal = damage * moneyMultiplier; - StealMoney(victim, attacker, moneyToSteal); + StealMoney(victim!, attacker!, moneyToSteal); return HookResult.Continue; }); @@ -40,19 +40,15 @@ namespace jRandomSkills var moneyToAdd = victimMoneyServices.Account < money ? victimMoneyServices.Account : money; victimMoneyServices.Account = Math.Max(victimMoneyServices.Account - money, 0); - Utilities.SetStateChanged(victim, "CCSPlayerController", "m_pInGameMoneyServices"); + Utilities.SetStateChanged(victim!, "CCSPlayerController", "m_pInGameMoneyServices"); attackerMoneyServices.Account = Math.Min(attackerMoneyServices.Account + moneyToAdd, 16000); - Utilities.SetStateChanged(attacker, "CCSPlayerController", "m_pInGameMoneyServices"); + Utilities.SetStateChanged(attacker!, "CCSPlayerController", "m_pInGameMoneyServices"); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#119125", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int moneyMultiplier = 35) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int MoneyMultiplier { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#119125", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int moneyMultiplier = 35) : base(skill, active, color, onlyTeam, needsTeammates) - { - MoneyMultiplier = moneyMultiplier; - } + public int MoneyMultiplier { get; set; } = moneyMultiplier; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Rubber.cs b/jRandomSkills - SRC Files/src/player/skills/Rubber.cs index 75cc42f..6de65f1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Rubber.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Rubber.cs @@ -9,10 +9,10 @@ namespace jRandomSkills public class Rubber: ISkill { private const Skills skillName = Skills.Rubber; - private static float rubberTime = Config.GetValue(skillName, "slownessTime"); - private static float rubberModifier = Config.GetValue(skillName, "slownessModifier"); + private static readonly float rubberTime = Config.GetValue(skillName, "slownessTime"); + private static readonly float rubberModifier = Config.GetValue(skillName, "slownessModifier"); - private static Dictionary playersToSlow = new Dictionary(); + private static readonly Dictionary playersToSlow = []; public static void LoadSkill() { @@ -24,9 +24,9 @@ namespace jRandomSkills var victim = @event.Userid; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - var victimPawn = victim.PlayerPawn.Value; + var victimPawn = victim!.PlayerPawn.Value; if (victimPawn == null || !victimPawn.IsValid) return HookResult.Continue; if (attackerInfo?.Skill == skillName) @@ -65,15 +65,10 @@ namespace jRandomSkills pawn.VelocityModifier = rubberModifier; } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8B4513", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float slownessTime = 2f, float slownessModifier = .2f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float SlownessTime { get; set; } - public float SlownessModifier { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#8B4513", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float slownessTime = 2f, float slownessModifier = .2f) : base(skill, active, color, onlyTeam, needsTeammates) - { - SlownessTime = slownessTime; - SlownessModifier = slownessModifier; - } + public float SlownessTime { get; set; } = slownessTime; + public float SlownessModifier { get; set; } = slownessModifier; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Saper.cs b/jRandomSkills - SRC Files/src/player/skills/Saper.cs index acfc79c..437f3be 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Saper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Saper.cs @@ -20,12 +20,12 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill == skillName) { var bombEntities = Utilities.FindAllEntitiesByDesignerName("weapon_c4").ToList(); - if (bombEntities.Any()) + if (bombEntities.Count != 0) { var bomb = bombEntities.FirstOrDefault(); if (bomb != null) @@ -45,7 +45,7 @@ namespace jRandomSkills if (Instance.IsPlayerValid(player)) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill == skillName) { var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); @@ -63,11 +63,8 @@ namespace jRandomSkills }); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8A2BE2", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#8A2BE2", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs index a1e2b81..913d1d4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs @@ -9,8 +9,8 @@ namespace jRandomSkills public class SecondLife : ISkill { private const Skills skillName = Skills.SecondLife; - private static int secondLifeHealth = Config.GetValue(skillName, "startHealth"); - private static HashSet secondLifePlayers = new HashSet(); + private static readonly int secondLifeHealth = Config.GetValue(skillName, "startHealth"); + private static readonly HashSet secondLifePlayers = []; public static void LoadSkill() { @@ -24,7 +24,7 @@ namespace jRandomSkills { if (player == null || !player.IsValid || player.PlayerPawn?.Value == null) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -45,16 +45,18 @@ namespace jRandomSkills int damage = @event.DmgHealth; if (!Instance.IsPlayerValid(victim)) return HookResult.Continue; - var victimInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue; - var victimPawn = victim.PlayerPawn.Value; - if (victimPawn.Health > 0 || secondLifePlayers.TryGetValue(victim.Handle, out _) == true) + var victimPawn = victim!.PlayerPawn.Value; + if (victimPawn!.Health > 0 || secondLifePlayers.TryGetValue(victim.Handle, out _) == true) return HookResult.Continue; secondLifePlayers.Add(victim.Handle); SetHealth(victim, secondLifeHealth); - victimPawn.Teleport(GetSpawnVector(victim), victimPawn.AbsRotation, null); + var spawn = GetSpawnVector(victim); + if (spawn != null) + victimPawn.Teleport(spawn, victimPawn.AbsRotation, null); return HookResult.Stop; }); } @@ -83,25 +85,24 @@ namespace jRandomSkills Utilities.SetStateChanged(pawn, "CCSPlayerPawn", "m_ArmorValue"); } - private static Vector GetSpawnVector(CCSPlayerController player) + private static Vector? GetSpawnVector(CCSPlayerController player) { - var abs = player.PlayerPawn.Value.AbsOrigin; + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return null; + + var abs = pawn.AbsOrigin; var spawns = Utilities.FindAllEntitiesByDesignerName(player.Team == CsTeam.Terrorist ? "info_player_terrorist" : "info_player_counterterrorist").ToList(); - if (spawns.Any()) + if (spawns.Count != 0) { var randomSpawn = spawns[Instance.Random.Next(spawns.Count)]; return randomSpawn.AbsOrigin; } - return new Vector(abs.X, abs.Y, abs.Z); + return abs == null ? null : new Vector(abs.X, abs.Y, abs.Z); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#d41c1c", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int startHealth = 50) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int StartHealth { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#d41c1c", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int startHealth = 50) : base(skill, active, color, onlyTeam, needsTeammates) - { - StartHealth = startHealth; - } + public int StartHealth { get; set; } = startHealth; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Shade.cs b/jRandomSkills - SRC Files/src/player/skills/Shade.cs index 43fd3e7..7246ec0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Shade.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Shade.cs @@ -16,8 +16,8 @@ namespace jRandomSkills public class Shade : ISkill { private const Skills skillName = Skills.Shade; - private static float teleportDistance = Config.GetValue(skillName, "teleportDistance"); - private static Dictionary noSpace = new Dictionary(); + private static readonly float teleportDistance = Config.GetValue(skillName, "teleportDistance"); + private static readonly Dictionary noSpace = []; public static void LoadSkill() { @@ -30,11 +30,11 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; - var victimInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); - var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); if (attackerInfo?.Skill == skillName) - TeleportAttackerBehindVictim(attacker, victim); + TeleportAttackerBehindVictim(attacker!, victim!); return HookResult.Continue; }); @@ -55,8 +55,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (noSpace.ContainsKey(player)) - noSpace.Remove(player); + noSpace.Remove(player); } private static void UpdateHUD(CCSPlayerController player) @@ -74,8 +73,9 @@ namespace jRandomSkills private unsafe static bool CheckTeleport(CCSPlayerController player, Vector startPos, Vector endPos) { var pawn = player.PlayerPawn.Value; - Ray ray = new Ray(new Vector3(-16, -16, -0), new Vector3(16, 16, 72)); - CTraceFilter filter = new CTraceFilter(pawn.Index, pawn.Index) + if (pawn == null || !pawn.IsValid) return false; + Ray ray = new(new Vector3(-16, -16, -0), new Vector3(16, 16, 72)); + CTraceFilter filter = new(pawn.Index, pawn.Index) { m_nObjectSetMask = 0xf, m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT, @@ -98,19 +98,19 @@ namespace jRandomSkills var victimPawn = victim.PlayerPawn.Value; var attackerPawn = attacker.PlayerPawn.Value; - if (victimPawn == null || attackerPawn == null) return; + if (victimPawn == null || attackerPawn == null || victimPawn.AbsOrigin == null || victimPawn.AbsRotation == null) return; QAngle victimAngles = victimPawn.AbsRotation; - Vector victimEyePos = new Vector(victimPawn.AbsOrigin.X, victimPawn.AbsOrigin.Y, victimPawn.AbsOrigin.Z + victimPawn.ViewOffset.Z); - int[] angles = { 0, 90, -90 }; + Vector victimEyePos = new(victimPawn.AbsOrigin.X, victimPawn.AbsOrigin.Y, victimPawn.AbsOrigin.Z + victimPawn.ViewOffset.Z); + int[] angles = [0, 90, -90]; bool teleported = false; foreach (int extraAngle in angles) { - QAngle newAngle = new QAngle(victimAngles.X, victimAngles.Y + extraAngle, victimAngles.Z); + QAngle newAngle = new(victimAngles.X, victimAngles.Y + extraAngle, victimAngles.Z); Vector behindPosition = victimEyePos - SkillUtils.GetForwardVector(newAngle) * teleportDistance; if (!CheckTeleport(victim, victimEyePos, behindPosition)) continue; - attackerPawn.Teleport(behindPosition, newAngle, new Vector(0, 0, 0)); + attackerPawn.Teleport(behindPosition, newAngle, new(0, 0, 0)); teleported = true; break; } @@ -118,13 +118,9 @@ namespace jRandomSkills noSpace[attacker] = Server.TickCount + (64 * 2); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#4d4d4d", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float teleportDistance = 100f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float TeleportDistance { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#4d4d4d", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float teleportDistance = 100f) : base(skill, active, color, onlyTeam, needsTeammates) - { - TeleportDistance = teleportDistance; - } + public float TeleportDistance { get; set; } = teleportDistance; } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs b/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs index 17946bf..933b9ec 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs @@ -9,7 +9,7 @@ namespace jRandomSkills public class ShortBomb : ISkill { private const Skills skillName = Skills.ShortBomb; - private static int detonationTime = Config.GetValue(skillName, "detonationTime"); + private static readonly int detonationTime = Config.GetValue(skillName, "detonationTime"); public static void LoadSkill() { @@ -20,7 +20,7 @@ namespace jRandomSkills var player = @event.Userid; if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); @@ -31,13 +31,9 @@ namespace jRandomSkills }); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#f5b74c", CsTeam onlyTeam = CsTeam.Terrorist, bool needsTeammates = false, int detonationTime = 20) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int DetonationTime { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#f5b74c", CsTeam onlyTeam = CsTeam.Terrorist, bool needsTeammates = false, int detonationTime = 20) : base(skill, active, color, onlyTeam, needsTeammates) - { - DetonationTime = detonationTime; - } + public int DetonationTime { get; set; } = detonationTime; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Silent.cs b/jRandomSkills - SRC Files/src/player/skills/Silent.cs index 602c098..fad4919 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Silent.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Silent.cs @@ -27,7 +27,7 @@ namespace jRandomSkills var player = Utilities.GetPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex); if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; um.Recipients.Clear(); @@ -35,11 +35,8 @@ namespace jRandomSkills }, HookMode.Pre); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#333333", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#333333", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs b/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs index d49d013..abe4937 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs @@ -9,12 +9,12 @@ namespace jRandomSkills public class SniperElite : ISkill { private const Skills skillName = Skills.SniperElite; - private static readonly Dictionary sniperElites = new Dictionary(); + private static readonly Dictionary sniperElites = []; - private static string[] rifles = { "weapon_mp9", "weapon_mac10", "weapon_bizon", "weapon_mp7", "weapon_ump45", "weapon_p90", + private static readonly string[] rifles = [ "weapon_mp9", "weapon_mac10", "weapon_bizon", "weapon_mp7", "weapon_ump45", "weapon_p90", "weapon_mp5sd", "weapon_famas", "weapon_galilar", "weapon_m4a1", "weapon_m4a1_silencer", "weapon_ak47", "weapon_aug", "weapon_sg553", "weapon_ssg08", "weapon_awp", "weapon_scar20", "weapon_g3sg1", - "weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_m249", "weapon_negev" }; + "weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_m249", "weapon_negev" ]; public static void LoadSkill() { @@ -26,7 +26,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) EnableSkill(player); } @@ -44,11 +44,10 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - if (sniperElites.ContainsKey(player.SteamID)) - sniperElites.Remove(player.SteamID); + sniperElites.Remove(player.SteamID); return HookResult.Continue; }); @@ -61,8 +60,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (sniperElites.ContainsKey(player.SteamID)) - sniperElites.Remove(player.SteamID); + sniperElites.Remove(player.SteamID); } public static void UseSkill(CCSPlayerController player) @@ -77,41 +75,38 @@ namespace jRandomSkills private static void RemoveAndGiveWeapon(CCSPlayerController player) { string holdedWeapon = "weapon_awp"; - if (sniperElites.TryGetValue(player.SteamID, out string weapon)) - holdedWeapon = weapon; + if (sniperElites.TryGetValue(player.SteamID, out string? weapon)) + if (!string.IsNullOrEmpty(weapon)) + holdedWeapon = weapon; try { - string activeRifle = GetActiveRifle(player); - if (activeRifle != null) + string? activeRifle = GetActiveRifle(player); + if (!string.IsNullOrEmpty(activeRifle)) player.RemoveItemByDesignerName(activeRifle, true); - sniperElites[player.SteamID] = activeRifle; - Server.NextFrame(() => - { - player.GiveNamedItem(holdedWeapon ?? "weapon_awp"); - }); + sniperElites[player.SteamID] = activeRifle ?? "weapon_awp"; + Server.NextFrame(() => player.GiveNamedItem(holdedWeapon ?? "weapon_awp") ); } catch { } } - private static string GetActiveRifle(CCSPlayerController player) + private static string? GetActiveRifle(CCSPlayerController player) { - string rifle = null; - var weapons = player.PlayerPawn.Value.WeaponServices.MyWeapons; - if (weapons == null) return rifle; + string rifle = string.Empty; + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return rifle; + var weaponServices = pawn.WeaponServices; + if (weaponServices == null) return rifle; - foreach (var weapon in weapons) + foreach (var weapon in weaponServices.MyWeapons) if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) if (rifles.Contains(weapon.Value.DesignerName)) - rifle = weapon.Value.DesignerName; + rifle = SkillUtils.GetDesignerName(weapon.Value); return rifle; } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = false, string color = "#e0873a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = false, string color = "#e0873a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Soldier.cs b/jRandomSkills - SRC Files/src/player/skills/Soldier.cs index 4bbe417..b00c922 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Soldier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Soldier.cs @@ -26,7 +26,7 @@ namespace jRandomSkills { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -38,7 +38,8 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; float newScale = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "ChanceTo") - Config.GetValue(skillName, "ChanceFrom")) + Config.GetValue(skillName, "ChanceFrom"); playerInfo.SkillChance = newScale; newScale = (float)Math.Round(newScale, 2); @@ -53,8 +54,8 @@ namespace jRandomSkills if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) return HookResult.Continue; - CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.Handle); - CCSPlayerPawn victimPawn = new CCSPlayerPawn(param.Handle); + CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); + CCSPlayerPawn victimPawn = new(param.Handle); if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") return HookResult.Continue; @@ -65,26 +66,22 @@ namespace jRandomSkills CCSPlayerController attacker = attackerPawn.Controller.Value.As(); CCSPlayerController victim = victimPawn.Controller.Value.As(); - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); if (playerInfo == null) return HookResult.Continue; if (playerInfo.Skill == skillName && attacker.PawnIsAlive) { - param2.Damage *= (float)playerInfo.SkillChance; + float? skillChance = playerInfo.SkillChance; + param2.Damage *= skillChance ?? 1f; } return HookResult.Continue; } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#09ba00", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = 1.15f, float chanceTo = 1.35f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float ChanceFrom { get; set; } - public float ChanceTo { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#09ba00", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = 1.15f, float chanceTo = 1.35f) : base(skill, active, color, onlyTeam, needsTeammates) - { - ChanceFrom = chanceFrom; - ChanceTo = chanceTo; - } + public float ChanceFrom { get; set; } = chanceFrom; + public float ChanceTo { get; set; } = chanceTo; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs index ca4c3dd..3b49863 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs @@ -11,8 +11,8 @@ namespace jRandomSkills public class SoundMaker : ISkill { private const Skills skillName = Skills.SoundMaker; - private static float timerCooldown = Config.GetValue(skillName, "Cooldown"); - private static readonly Dictionary SkillPlayerInfo = new Dictionary(); + private static readonly float timerCooldown = Config.GetValue(skillName, "Cooldown"); + private static readonly Dictionary SkillPlayerInfo = []; public static void LoadSkill() { @@ -25,7 +25,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) EnableSkill(player); } @@ -43,11 +43,10 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); return HookResult.Continue; }); @@ -55,7 +54,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) UpdateHUD(player, skillInfo); @@ -75,8 +74,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) @@ -122,7 +120,7 @@ namespace jRandomSkills private static void MakeSound(CCSPlayerController player) { foreach (var enemy in Utilities.GetPlayers().Where(p => p.Team != player.Team)) - if (enemy != null && enemy.IsValid && enemy.PawnIsAlive) + if (enemy != null && enemy.IsValid && enemy.PawnIsAlive && enemy.PlayerPawn.Value != null && enemy.PlayerPawn.Value.IsValid) enemy.PlayerPawn.Value.EmitSound($"C4.PlantSoundB", volume: 1f); } @@ -133,13 +131,9 @@ namespace jRandomSkills public DateTime Cooldown { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#e3ed8c", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 5f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Cooldown { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#e3ed8c", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 5f) : base(skill, active, color, onlyTeam, needsTeammates) - { - Cooldown = cooldown; - } + public float Cooldown { get; set; } = cooldown; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Spectator.cs b/jRandomSkills - SRC Files/src/player/skills/Spectator.cs index fdbb773..684f08f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Spectator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Spectator.cs @@ -11,8 +11,8 @@ namespace jRandomSkills { private const Skills skillName = Skills.Spectator; private static bool blocked = false; - private static float distance = Config.GetValue(skillName, "distance"); - private static Dictionary cameras = new Dictionary(); + private static readonly float distance = Config.GetValue(skillName, "distance"); + private static readonly Dictionary cameras = []; public static void LoadSkill() { @@ -41,11 +41,12 @@ namespace jRandomSkills { var player = @event.Userid; if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; - if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item1 != player.PlayerPawn.Value.CameraServices!.ViewEntity!.Raw) + var pawn = player!.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return HookResult.Continue; + if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item1 != pawn.CameraServices.ViewEntity.Raw) BlockWeapon(player, true); return HookResult.Continue; }); @@ -76,6 +77,7 @@ namespace jRandomSkills ChangeCamera(player, true); continue; } + if (pawn.AbsOrigin == null) continue; var pos = pawn.AbsOrigin - SkillUtils.GetForwardVector(pawn.EyeAngles) * distance; pos.Z += pawn.ViewOffset.Z; cameraInfo.Item2.Teleport(pos, pawn.V_angle); @@ -87,6 +89,8 @@ namespace jRandomSkills uint orginalCameraRaw; uint newCameraRaw; var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return; + if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2.IsValid) { orginalCameraRaw = cameraInfo.Item1; @@ -94,15 +98,14 @@ namespace jRandomSkills newCameraRaw = CreateCamera(player); } else { - orginalCameraRaw = pawn!.CameraServices!.ViewEntity.Raw; + orginalCameraRaw = pawn.CameraServices.ViewEntity.Raw; newCameraRaw = CreateCamera(player); } - if (newCameraRaw == 0) - return; + if (newCameraRaw == 0) return; - bool defaultCam = forceToDefault ? true : (pawn.CameraServices!.ViewEntity!.Raw == orginalCameraRaw ? false : true); - pawn!.CameraServices!.ViewEntity.Raw = defaultCam ? orginalCameraRaw : newCameraRaw; + bool defaultCam = forceToDefault || (pawn.CameraServices.ViewEntity.Raw != orginalCameraRaw); + pawn.CameraServices.ViewEntity.Raw = defaultCam ? orginalCameraRaw : newCameraRaw; Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices"); BlockWeapon(player, !defaultCam); } @@ -118,19 +121,25 @@ namespace jRandomSkills var enemy = enemies[Instance.Random.Next(enemies.Count)]; var pawn = enemy.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return 0; + camera.Render = Color.FromArgb(0, 255, 255, 255); camera.Teleport(pawn!.AbsOrigin, pawn.EyeAngles); camera.DispatchSpawn(); if (cameras.TryGetValue(player.SteamID, out var cameraInfo)) cameras[player.SteamID] = (cameraInfo.Item1, camera, pawn); else - cameras[player.SteamID] = (player.PlayerPawn.Value.CameraServices!.ViewEntity.Raw, camera, pawn); + cameras[player.SteamID] = (pawn.CameraServices.ViewEntity.Raw, camera, pawn); return camera.EntityHandle.Raw; } private static void BlockWeapon(CCSPlayerController player, bool block) { - foreach (var weapon in player.Pawn.Value.WeaponServices?.MyWeapons) + if (player == null || !player.IsValid) return; + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return; + + foreach (var weapon in pawn.WeaponServices.MyWeapons) if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) { weapon.Value.NextPrimaryAttackTick = block ? int.MaxValue : Server.TickCount; @@ -141,13 +150,9 @@ namespace jRandomSkills } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#42f5da", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float distance = 100f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Distance { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#42f5da", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float distance = 100f) : base(skill, active, color, onlyTeam, needsTeammates) - { - Distance = distance; - } + public float Distance { get; set; } = distance; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs b/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs index 4bf6219..63b7027 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs @@ -11,8 +11,8 @@ namespace jRandomSkills public class SwapPosition : ISkill { private const Skills skillName = Skills.SwapPosition; - private static float timerCooldown = Config.GetValue(skillName, "cooldown"); - private static readonly Dictionary SkillPlayerInfo = new Dictionary(); + private static readonly float timerCooldown = Config.GetValue(skillName, "cooldown"); + private static readonly Dictionary SkillPlayerInfo = []; public static void LoadSkill() { @@ -24,7 +24,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) { EnableSkill(player); @@ -44,11 +44,11 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; + if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); return HookResult.Continue; }); @@ -57,7 +57,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) if (skillInfo.LastClick.AddSeconds(4) >= DateTime.Now) @@ -82,8 +82,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); } private static void UpdateHUD(CCSPlayerController player, ZamianaMiejsc_PlayerInfo skillInfo, bool showInfo) @@ -107,7 +106,7 @@ namespace jRandomSkills if (showInfo) remainingLine = cooldown != 0 ? $"{Localization.GetTranslation("hud_info", $"{cooldown}")}
" - : !skillInfo.FindedEnemy ? $"{Localization.GetTranslation("hud_info_no_enemy")}
" + : skillInfo != null && !skillInfo.FindedEnemy ? $"{Localization.GetTranslation("hud_info_no_enemy")}
" : ""; else remainingLine = cooldown != 0 ? $"{Localization.GetTranslation("hud_info", $"{cooldown}")}
" : ""; @@ -149,14 +148,16 @@ namespace jRandomSkills { var attackerPawn = attacker.PlayerPawn.Value; var victimPawn = victim.PlayerPawn.Value; + if (attackerPawn == null || !attackerPawn.IsValid || victimPawn == null || !victimPawn.IsValid) return; + if (attackerPawn.AbsOrigin == null || attackerPawn.AbsRotation == null || victimPawn.AbsOrigin == null || victimPawn.AbsRotation == null) return; - Vector attackerPosition = new Vector(attackerPawn.AbsOrigin.X, attackerPawn.AbsOrigin.Y, attackerPawn.AbsOrigin.Z); - QAngle attackerAngles = new QAngle(attackerPawn.AbsRotation.X, attackerPawn.AbsRotation.Y, attackerPawn.AbsRotation.Z); - Vector attackerVelocity = new Vector(attackerPawn.AbsVelocity.X, attackerPawn.AbsVelocity.Y, attackerPawn.AbsVelocity.Z); + Vector attackerPosition = new(attackerPawn.AbsOrigin.X, attackerPawn.AbsOrigin.Y, attackerPawn.AbsOrigin.Z); + QAngle attackerAngles = new(attackerPawn.AbsRotation.X, attackerPawn.AbsRotation.Y, attackerPawn.AbsRotation.Z); + Vector attackerVelocity = new(attackerPawn.AbsVelocity.X, attackerPawn.AbsVelocity.Y, attackerPawn.AbsVelocity.Z); - Vector victimPosition = new Vector(victimPawn.AbsOrigin.X, victimPawn.AbsOrigin.Y, victimPawn.AbsOrigin.Z); - QAngle victimAngles = new QAngle(victimPawn.AbsRotation.X, victimPawn.AbsRotation.Y, victimPawn.AbsRotation.Z); - Vector victimVelocity = new Vector(victimPawn.AbsVelocity.X, victimPawn.AbsVelocity.Y, victimPawn.AbsVelocity.Z); + Vector victimPosition = new(victimPawn.AbsOrigin.X, victimPawn.AbsOrigin.Y, victimPawn.AbsOrigin.Z); + QAngle victimAngles = new(victimPawn.AbsRotation.X, victimPawn.AbsRotation.Y, victimPawn.AbsRotation.Z); + Vector victimVelocity = new(victimPawn.AbsVelocity.X, victimPawn.AbsVelocity.Y, victimPawn.AbsVelocity.Z); victimPawn.Teleport(attackerPosition, attackerAngles, attackerVelocity); attackerPawn.Teleport(victimPosition, victimAngles, victimVelocity); @@ -171,13 +172,9 @@ namespace jRandomSkills public bool FindedEnemy { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#1466F5", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 30f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Cooldown { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#1466F5", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 30f) : base(skill, active, color, onlyTeam, needsTeammates) - { - Cooldown = cooldown; - } + public float Cooldown { get; set; } = cooldown; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs b/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs index 5777541..0a71943 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs @@ -21,11 +21,11 @@ namespace jRandomSkills if (!Instance.IsPlayerValid(victim) || !Instance.IsPlayerValid(attacker)) return HookResult.Continue; - var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); if (attackerInfo?.Skill == skillName) { - TeleportPlayers(attacker, victim); + TeleportPlayers(attacker!, victim!); } return HookResult.Continue; @@ -36,24 +36,23 @@ namespace jRandomSkills { var attackerPawn = attacker.PlayerPawn.Value; var victimPawn = victim.PlayerPawn.Value; + if (attackerPawn == null || !attackerPawn.IsValid || victimPawn == null || !victimPawn.IsValid) return; + if (attackerPawn.AbsOrigin == null || victimPawn.AbsOrigin == null || attackerPawn.AbsRotation == null || victimPawn.AbsRotation == null) return; - Vector attackerPosition = new Vector(attackerPawn.AbsOrigin.X, attackerPawn.AbsOrigin.Y, attackerPawn.AbsOrigin.Z); - QAngle attackerAngles = new QAngle(attackerPawn.AbsRotation.X, attackerPawn.AbsRotation.Y, attackerPawn.AbsRotation.Z); - Vector attackerVelocity = new Vector(attackerPawn.AbsVelocity.X, attackerPawn.AbsVelocity.Y, attackerPawn.AbsVelocity.Z); + Vector attackerPosition = new(attackerPawn.AbsOrigin.X, attackerPawn.AbsOrigin.Y, attackerPawn.AbsOrigin.Z); + QAngle attackerAngles = new(attackerPawn.AbsRotation.X, attackerPawn.AbsRotation.Y, attackerPawn.AbsRotation.Z); + Vector attackerVelocity = new(attackerPawn.AbsVelocity.X, attackerPawn.AbsVelocity.Y, attackerPawn.AbsVelocity.Z); - Vector victimPosition = new Vector(victimPawn.AbsOrigin.X, victimPawn.AbsOrigin.Y, victimPawn.AbsOrigin.Z); - QAngle victimAngles = new QAngle(victimPawn.AbsRotation.X, victimPawn.AbsRotation.Y, victimPawn.AbsRotation.Z); - Vector victimVelocity = new Vector(victimPawn.AbsVelocity.X, victimPawn.AbsVelocity.Y, victimPawn.AbsVelocity.Z); + Vector victimPosition = new(victimPawn.AbsOrigin.X, victimPawn.AbsOrigin.Y, victimPawn.AbsOrigin.Z); + QAngle victimAngles = new(victimPawn.AbsRotation.X, victimPawn.AbsRotation.Y, victimPawn.AbsRotation.Z); + Vector victimVelocity = new(victimPawn.AbsVelocity.X, victimPawn.AbsVelocity.Y, victimPawn.AbsVelocity.Z); victimPawn.Teleport(attackerPosition, attackerAngles, attackerVelocity); attackerPawn.Teleport(victimPosition, victimAngles, victimVelocity); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8A2BE2", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#8A2BE2", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Thief.cs b/jRandomSkills - SRC Files/src/player/skills/Thief.cs index 5b8a679..9d3dac5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Thief.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Thief.cs @@ -22,7 +22,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -36,7 +36,7 @@ namespace jRandomSkills { if (player == null) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; var playerPawn = player.PlayerPawn.Value; @@ -65,8 +65,10 @@ namespace jRandomSkills { foreach (var enemy in enemies) { - var enemyInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + if (enemyInfo == null) continue; var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); + if (skillData == null) continue; player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: {ChatColors.Red}{skillData.Name}"); } } @@ -77,37 +79,36 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; playerInfo.SpecialSkill = Skills.None; } private static void DeacitvateSkill(CCSPlayerController player, CCSPlayerController enemy) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - var enemyInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + if (playerInfo == null || enemyInfo == null) return; if (playerInfo != null) { playerInfo.Skill = enemyInfo.Skill; playerInfo.SpecialSkill = skillName; - Instance.SkillAction(enemyInfo.Skill.ToString(), "EnableSkill", new object[] { player }); + Instance.SkillAction(enemyInfo.Skill.ToString(), "EnableSkill", [player]); player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("thief_player_info", enemy.PlayerName)); } if (enemyInfo != null) { - Instance.SkillAction(enemyInfo.Skill.ToString(), "DisableSkill", new object[] { enemy }); + Instance.SkillAction(enemyInfo.Skill.ToString(), "DisableSkill", [enemy]); enemyInfo.SpecialSkill = enemyInfo.Skill; enemyInfo.Skill = Skills.None; enemy.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("thief_enemy_info")); } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#adaec7", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#adaec7", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs b/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs index e0bcffe..8efd738 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs @@ -11,8 +11,8 @@ namespace jRandomSkills { private const Skills skillName = Skills.ThirdEye; private static bool blocked = false; - private static float distance = Config.GetValue(skillName, "distance"); - private static Dictionary cameras = new Dictionary(); + private static readonly float distance = Config.GetValue(skillName, "distance"); + private static readonly Dictionary cameras = []; public static void LoadSkill() { @@ -58,6 +58,7 @@ namespace jRandomSkills if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2.IsValid) { var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue; if (pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) { ChangeCamera(player, true); @@ -110,13 +111,9 @@ namespace jRandomSkills return camera.EntityHandle.Raw; } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#1b04cc", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float distance = 100f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Distance { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#1b04cc", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float distance = 100f) : base(skill, active, color, onlyTeam, needsTeammates) - { - Distance = distance; - } + public float Distance { get; set; } = distance; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs index 5955b48..53ab4e1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs @@ -8,7 +8,7 @@ namespace jRandomSkills public class Thorns : ISkill { private const Skills skillName = Skills.Thorns; - private static float healthTakenScale = Config.GetValue(skillName, "healthTakenScale"); + private static readonly float healthTakenScale = Config.GetValue(skillName, "healthTakenScale"); public static void LoadSkill() { @@ -20,8 +20,8 @@ namespace jRandomSkills var victim = @event.Userid; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var victimInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); - if (victimInfo?.Skill == skillName && victim.PawnIsAlive && attacker.PawnIsAlive) + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + if (victimInfo?.Skill == skillName && victim!.PawnIsAlive && attacker!.PawnIsAlive) { SkillUtils.TakeHealth(attacker.PlayerPawn.Value, (int)(@event.DmgHealth * healthTakenScale)); attacker.EmitSound("Player.DamageBody.Onlooker"); @@ -30,13 +30,9 @@ namespace jRandomSkills }); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#962631", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float healthTakenScale = .3f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float HealthTakenScale { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#962631", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float healthTakenScale = .3f) : base(skill, active, color, onlyTeam, needsTeammates) - { - HealthTakenScale = healthTakenScale; - } + public float HealthTakenScale { get; set; } = healthTakenScale; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs index 16caee9..1d6bdf3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs @@ -11,9 +11,9 @@ namespace jRandomSkills public class ToxicSmoke : ISkill { private const Skills skillName = Skills.ToxicSmoke; - private static int smokeDamage = Config.GetValue(skillName, "smokeDamage"); - private static float smokeRadius = Config.GetValue(skillName, "smokeRadius"); - private static List smokes = new List(); + private static readonly int smokeDamage = Config.GetValue(skillName, "smokeDamage"); + private static readonly float smokeRadius = Config.GetValue(skillName, "smokeRadius"); + private static readonly List smokes = []; public static void LoadSkill() { @@ -32,7 +32,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -44,7 +44,8 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; smokes.Add(new Vector(@event.X, @event.Y, @event.Z)); return HookResult.Continue; @@ -53,7 +54,8 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, @info) => { var player = @event.Userid; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return HookResult.Continue; smokes.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z); return HookResult.Continue; @@ -65,10 +67,15 @@ namespace jRandomSkills if (name != "smokegrenade_projectile") return; var grenade = @event.As(); - var pawn = grenade.OwnerEntity.Value.As(); - var player = pawn.Controller.Value.As(); + if (grenade == null || !grenade.IsValid || grenade.OwnerEntity == null || !grenade.OwnerEntity.IsValid || grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var pawn = grenade.OwnerEntity.Value.As(); + if (pawn == null || !pawn.IsValid || pawn.Controller == null || !pawn.Controller.IsValid || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; + + var player = pawn.Controller.Value.As(); + if (player == null || !player.IsValid) return; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) return; Server.NextFrame(() => @@ -85,8 +92,10 @@ namespace jRandomSkills foreach (Vector smokePos in smokes) foreach (var player in Utilities.GetPlayers()) if (Server.TickCount % 17 == 0) - if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= smokeRadius) - AddHealth(player.PlayerPawn.Value, -smokeDamage); + if (player != null && player.IsValid && player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid) + if (player.PlayerPawn.Value.LifeState == (byte)LifeState_t.LIFE_ALIVE && player.PlayerPawn.Value.AbsOrigin != null) + if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= smokeRadius) + AddHealth(player.PlayerPawn.Value, -smokeDamage); }); } @@ -108,15 +117,10 @@ namespace jRandomSkills player.CommitSuicide(false, true); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#507529", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int smokeDamage = 2, float smokeRadius = 180) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int SmokeDamage { get; set; } - public float SmokeRadius { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#507529", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int smokeDamage = 2, float smokeRadius = 180) : base(skill, active, color, onlyTeam, needsTeammates) - { - SmokeDamage = smokeDamage; - SmokeRadius = smokeRadius; - } + public int SmokeDamage { get; set; } = smokeDamage; + public float SmokeRadius { get; set; } = smokeRadius; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs index bdc5625..de951be 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs @@ -12,7 +12,7 @@ namespace jRandomSkills { private const Skills skillName = Skills.Wallhack; private static bool exists = false; - private static List<(CDynamicProp, CDynamicProp)> glows = new List<(CDynamicProp, CDynamicProp)>(); + private static readonly List<(CDynamicProp, CDynamicProp)> glows = []; public static void LoadSkill() { @@ -27,7 +27,7 @@ namespace jRandomSkills { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) EnableSkill(player); } @@ -55,10 +55,10 @@ namespace jRandomSkills foreach (var (info, player) in infoList) { if (player == null) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var observedPlayer = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == player?.Pawn?.Value?.ObserverServices?.ObserverTarget?.Value?.Handle); - var observerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer?.SteamID); + var observerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer?.SteamID); if (playerInfo?.Skill == skillName || (observerInfo != null && observerInfo?.Skill == skillName)) continue; @@ -79,12 +79,12 @@ namespace jRandomSkills SetGlowEffectForEnemies(player); } - private static async void SetGlowEffectForEnemies(CCSPlayerController player) + private static void SetGlowEffectForEnemies(CCSPlayerController player) { CsTeam originalTeam = player.Team; foreach (var enemy in Utilities.GetPlayers().FindAll(p => p.Team != originalTeam && p.PawnIsAlive)) { - var enemyInfo = Instance.skillPlayer.FirstOrDefault(e => e.SteamID == enemy.SteamID); + var enemyInfo = Instance.SkillPlayer.FirstOrDefault(e => e.SteamID == enemy.SteamID); if (enemyInfo?.Skill == Skills.Ghost) return; @@ -119,11 +119,8 @@ namespace jRandomSkills } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#5d00ff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#5d00ff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs b/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs index 9938bbc..592c430 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs @@ -11,7 +11,7 @@ namespace jRandomSkills public class Watchmaker : ISkill { private const Skills skillName = Skills.Watchmaker; - private static int roundTime = Config.GetValue(skillName, "changeRoundTime"); + private static readonly int roundTime = Config.GetValue(skillName, "changeRoundTime"); private static bool bombPlanted = false; public static void LoadSkill() @@ -40,10 +40,11 @@ namespace jRandomSkills if (grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return; var pawn = grenade.OwnerEntity.Value.As(); + if (pawn == null || !pawn.IsValid || pawn.Controller == null || !pawn.Controller.IsValid || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; var player = pawn.Controller.Value.As(); - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName || Instance.GameRules == null) return; Instance.GameRules.RoundTime += player.Team == CsTeam.Terrorist ? roundTime : -roundTime; if (player.Team == CsTeam.Terrorist) @@ -60,7 +61,7 @@ namespace jRandomSkills if (bombPlanted) return; foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) UpdateHUD(player); } @@ -81,13 +82,9 @@ namespace jRandomSkills player.PrintToCenterHtml(hudContent); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff462e", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int changeRoundTime = 10) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public int ChangeRoundTime { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff462e", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int changeRoundTime = 10) : base(skill, active, color, onlyTeam, needsTeammates) - { - ChangeRoundTime = changeRoundTime; - } + public int ChangeRoundTime { get; set; } = changeRoundTime; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs index dfc7c27..8de19b4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs @@ -11,15 +11,15 @@ namespace jRandomSkills public class WeaponsSwap : ISkill { private const Skills skillName = Skills.WeaponsSwap; - private static float timerCooldown = Config.GetValue(skillName, "cooldown"); - private static readonly Dictionary SkillPlayerInfo = new Dictionary(); + private static readonly float timerCooldown = Config.GetValue(skillName, "cooldown"); + private static readonly Dictionary SkillPlayerInfo = []; - private static string[] weapons = { "weapon_deagle", "weapon_revolver", "weapon_glock", "weapon_usp_silencer", + private static readonly string[] weapons = [ "weapon_deagle", "weapon_revolver", "weapon_glock", "weapon_usp_silencer", "weapon_cz75a", "weapon_fiveseven", "weapon_p250", "weapon_tec9", "weapon_elite", "weapon_hkp2000", "weapon_mp9", "weapon_mac10", "weapon_bizon", "weapon_mp7", "weapon_ump45", "weapon_p90", "weapon_mp5sd", "weapon_famas", "weapon_galilar", "weapon_m4a4", "weapon_m4a1_silencer", "weapon_ak47", "weapon_aug", "weapon_sg553", "weapon_ssg08", "weapon_awp", "weapon_scar20", "weapon_g3sg1", - "weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_m249", "weapon_negev" }; + "weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_m249", "weapon_negev" ]; public static void LoadSkill() { @@ -31,7 +31,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) { EnableSkill(player); @@ -51,11 +51,13 @@ namespace jRandomSkills Instance.RegisterEventHandler((@event, info) => { var player = @event.Userid; + if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return HookResult.Continue; + + if (playerInfo.Skill == skillName) + SkillPlayerInfo.Remove(player.SteamID); return HookResult.Continue; }); @@ -64,7 +66,7 @@ namespace jRandomSkills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) if (skillInfo.LastClick.AddSeconds(4) >= DateTime.Now) @@ -90,8 +92,7 @@ namespace jRandomSkills public static void DisableSkill(CCSPlayerController player) { - if (SkillPlayerInfo.ContainsKey(player.SteamID)) - SkillPlayerInfo.Remove(player.SteamID); + SkillPlayerInfo.Remove(player.SteamID); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo, bool showInfo) @@ -115,8 +116,8 @@ namespace jRandomSkills if (showInfo) remainingLine = cooldown != 0 ? $"{Localization.GetTranslation("hud_info", $"{cooldown}")}
" - : !skillInfo.FindedEnemy ? $"{Localization.GetTranslation("hud_info_no_enemy")}
" - : !skillInfo.HaveWeapon ? $"{Localization.GetTranslation("weaponsswap_hud_info2")}
" + : skillInfo != null && !skillInfo.FindedEnemy ? $"{Localization.GetTranslation("hud_info_no_enemy")}
" + : skillInfo != null && !skillInfo.HaveWeapon ? $"{Localization.GetTranslation("weaponsswap_hud_info2")}
" : ""; else remainingLine = cooldown != 0 ? $"{Localization.GetTranslation("hud_info", $"{cooldown}")}
" : ""; @@ -135,7 +136,7 @@ namespace jRandomSkills if (!player.IsValid || !player.PawnIsAlive) return; if (skillInfo.CanUse) { - CCSPlayerController enemy = GetRandomEnemy(player); + CCSPlayerController? enemy = GetRandomEnemy(player); if (enemy == null) { skillInfo.FindedEnemy = false; @@ -146,7 +147,7 @@ namespace jRandomSkills string[]? playerWeapon = GetWeapons(player); string[]? enemyWeapon = GetWeapons(enemy); - if (playerWeapon.FirstOrDefault(w => weapons.Contains(w)) == null) + if (playerWeapon == null || playerWeapon.FirstOrDefault(w => weapons.Contains(w)) == null) { skillInfo.FindedEnemy = true; skillInfo.HaveWeapon = false; @@ -162,7 +163,7 @@ namespace jRandomSkills player.RemoveWeapons(); enemy.RemoveWeapons(); GiveWeapons(player, enemyWeapon, playerWeapon.Contains("weapon_c4")); - GiveWeapons(enemy, playerWeapon, enemyWeapon.Contains("weapon_c4")); + GiveWeapons(enemy, playerWeapon, (enemyWeapon != null && enemyWeapon.Contains("weapon_c4"))); } else skillInfo.LastClick = DateTime.Now; @@ -171,15 +172,20 @@ namespace jRandomSkills private static string[]? GetWeapons(CCSPlayerController player) { - List playerWeapons = new List(); - foreach (var weapon in player.PlayerPawn.Value.WeaponServices.MyWeapons) + List 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; + + foreach (var weapon in pawn.WeaponServices.MyWeapons) if (weapon.Value != null && weapon.Value.IsValid) playerWeapons.Add(SkillUtils.GetDesignerName(weapon.Value)); - return playerWeapons.Count == 0 ? null : playerWeapons.ToArray(); + return playerWeapons.Count == 0 ? null : [.. playerWeapons]; } - private static void GiveWeapons(CCSPlayerController player, string[] weapons, bool addC4) + private static void GiveWeapons(CCSPlayerController player, string[]? weapons, bool addC4) { + if (weapons == null) return; foreach (var weapon in weapons) if (weapon != "weapon_c4") player.GiveNamedItem(weapon); @@ -187,9 +193,9 @@ namespace jRandomSkills player.GiveNamedItem("weapon_c4"); } - private static CCSPlayerController GetRandomEnemy(CCSPlayerController player) + private static CCSPlayerController? GetRandomEnemy(CCSPlayerController player) { - CCSPlayerController[] enemies = Utilities.GetPlayers().FindAll(e => e.Team != player.Team).ToArray(); + CCSPlayerController[] enemies = [.. Utilities.GetPlayers().FindAll(e => e.Team != player.Team)]; if (enemies.Length == 0) return null; return enemies[Instance.Random.Next(enemies.Length)]; } @@ -204,13 +210,9 @@ namespace jRandomSkills public bool HaveWeapon { get; set; } } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#c7e03a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 30f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public float Cooldown { get; set; } - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#c7e03a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 30f) : base(skill, active, color, onlyTeam, needsTeammates) - { - Cooldown = cooldown; - } + public float Cooldown { get; set; } = cooldown; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Zeus.cs b/jRandomSkills - SRC Files/src/player/skills/Zeus.cs index bce41c1..f5d4c33 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Zeus.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Zeus.cs @@ -22,7 +22,7 @@ namespace jRandomSkills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill != skillName) continue; EnableSkill(player); } @@ -36,12 +36,16 @@ namespace jRandomSkills var player = @event.Userid; if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill == skillName) { - var activeWeapon = player.Pawn.Value.WeaponServices.ActiveWeapon.Value; - if (activeWeapon?.DesignerName != "weapon_taser") return HookResult.Continue; + var pawn = player!.PlayerPawn!.Value!; + if (pawn.WeaponServices == null || pawn.WeaponServices.ActiveWeapon == null || !pawn.WeaponServices.ActiveWeapon.IsValid) return HookResult.Continue; + if (pawn.WeaponServices.ActiveWeapon.Value == null || !pawn.WeaponServices.ActiveWeapon.Value.IsValid) return HookResult.Continue; + + var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; + if (activeWeapon.DesignerName != "weapon_taser") return HookResult.Continue; var taser = activeWeapon.As(); Instance.AddTimer(.1f, () => { @@ -62,11 +66,8 @@ namespace jRandomSkills SkillUtils.TryGiveWeapon(player, CsItem.Zeus); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#fbff00", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#fbff00", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/utils/Config.cs b/jRandomSkills - SRC Files/src/utils/Config.cs index 44c8672..eec8f90 100644 --- a/jRandomSkills - SRC Files/src/utils/Config.cs +++ b/jRandomSkills - SRC Files/src/utils/Config.cs @@ -11,14 +11,13 @@ namespace jRandomSkills public static class Config { private static readonly string configPath = Path.Combine(Instance.ModuleDirectory, "Config.json"); - public static ConfigModel config; - private static FileSystemWatcher fileWatcher; + private static ConfigModel config = LoadConfig(); + private static FileSystemWatcher? fileWatcher; public static ConfigModel LoadedConfig => config; public static void Initialize() { - config = LoadConfig(); SetupFileWatcher(); } @@ -38,21 +37,24 @@ namespace jRandomSkills try { var root = JsonConvert.DeserializeObject(json); + if (root == null) return config; var settings = root["Settings"]; if (settings != null) JsonConvert.PopulateObject(settings.ToString(), config.Settings); - var skillsArray = (JArray)root["SkillsInfo"]; - foreach (var skillObj in skillsArray) - { - string name = skillObj["Name"]?.ToString(); - var instance = config.SkillsInfo.FirstOrDefault(x => x.Name == name); - if (instance != null) JsonConvert.PopulateObject(skillObj.ToString(), instance); - } + var skillsArray = (JArray?)root["SkillsInfo"]; + if (skillsArray != null) + foreach (var skillObj in skillsArray) + { + var name = skillObj["Name"]; + if (name == null) continue; + var instance = config.SkillsInfo.FirstOrDefault(x => x.Name == name.ToString()); + if (instance != null) JsonConvert.PopulateObject(skillObj.ToString(), instance); + } } - catch (Exception ex) + catch { - Instance.Logger.LogError($"Error when loading the config file: {ex.Message}"); + Instance.Logger.LogError("Error when loading the config file."); } return config; @@ -65,15 +67,17 @@ namespace jRandomSkills string json = JsonConvert.SerializeObject(config, Formatting.Indented); File.WriteAllText(configPath, json); } - catch (Exception ex) + catch { - Instance.Logger.LogError($"Error when saving the config file: {ex.Message}"); + Instance.Logger.LogError("Error when saving the config file."); } } private static void SetupFileWatcher() { - fileWatcher = new FileSystemWatcher(Path.GetDirectoryName(configPath)) + string? path = Path.GetDirectoryName(configPath); + if (string.IsNullOrEmpty(path)) return; + fileWatcher = new FileSystemWatcher(path) { Filter = Path.GetFileName(configPath), NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.Size @@ -86,6 +90,7 @@ namespace jRandomSkills public static T GetValue(object skill, string key) { var skillConfig = config.SkillsInfo.FirstOrDefault(s => s.Name == skill.ToString()); + if (skillConfig == null) return default!; var prop = skillConfig.GetType().GetProperty(key, BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase); if (prop != null) @@ -146,6 +151,7 @@ namespace jRandomSkills public string PauseCommands { get; set; } public string HealCommands { get; set; } public string SetScoreCommands { get; set; } + public VotingCommand[] VotingCommand { get; set; } public Settings() { @@ -159,34 +165,41 @@ namespace jRandomSkills SetSkillCommands = "ustawskill, setskill, definirhabilidade, configurarhabilidade, 设置技能, 配置技能"; SkillsListCommands = "supermoc, skille, listamocy, supermoce, skills, listaHabilidades, habilidades, 技能列表, 超能力列表"; UseSkillCommands = "t, useSkill, usarHabilidade, 技能使用, 使用技能"; - ChangeMapCommands = "map, mapa, changemap, zmienmape, zmienmape, mudarMapa, trocarMapa, 更换地图, 更改地图"; - StartGameCommands = "start, go, começar, iniciar, 开始, 启动"; - ConsoleCommands = "console, sv, 控制台, 服务器"; - SwapCommands = "swap, zmiana, trocar, 交换, 切换"; - ShuffleCommands = "shuffle, embaralhar, 随机排序, 洗牌"; - PauseCommands = "pause, unpause, pausar, despausar, 暂停, 恢复"; HealCommands = "heal, ulecz, curar, tratar, 治疗, 治愈"; - SetScoreCommands = "setscore, wynik, definirPontuacao, configurarPontos, 设置分数, 调整分数"; + ConsoleCommands = "console, sv, 控制台, 服务器"; + + VotingCommand = [ + new VotingCommand("StartGameCommands", true, "start, go, começar, iniciar, 开始, 启动", "@jRandmosSkills/admin", 15, 60, 15, 500, 2), + new VotingCommand("ChangeMapCommands", true, "map, mapa, changemap, zmienmape, zmienmape, mudarMapa, trocarMapa, 更换地图, 更改地图", "@jRandmosSkills/admin", 25, 90, 15, 500, 2), + new VotingCommand("SwapCommands", true, "swap, zmiana, trocar, 交换, 切换", "@jRandmosSkills/admin", 15, 90, 15, 20, 2), + new VotingCommand("ShuffleCommands", true, "shuffle, embaralhar, 随机排序, 洗牌", "@jRandmosSkills/admin", 15, 90, 15, 90, 2), + new VotingCommand("PauseCommands", true, "pause, unpause, pausar, despausar, 暂停, 恢复", "@jRandmosSkills/admin", 15, 60, 15, 90, 2), + new VotingCommand("SetScoreCommands", true, "setscore, wynik, definirPontuacao, configurarPontos, 设置分数, 调整分数", "@jRandmosSkills/root", 15, 90, 15, 90, 2), + ]; } } - public class DefaultSkillInfo + public class VotingCommand(string name, bool enableVoting, string alias, string permissions, float timeToVote, float percentagesToSuccess, float timeToNextVoting, float timeToNextSameVoting, int minimumPlayersToStartVoting) { - public bool NeedsTeammates { get; set; } - public int OnlyTeam { get; set; } - public string Color { get; set; } - public bool Active { get; set; } - public string Name { get; set; } + public string Name { get; set; } = name; + public bool EnableVoting { get; set; } = enableVoting; + public string Alias { get; set; } = alias; + public string Permissions { get; set; } = permissions; + public float TimeToVote { get; set; } = timeToVote; + public float PercentagesToSuccess { get; set; } = percentagesToSuccess; + public float TimeToNextVoting { get; set; } = timeToNextVoting; + public float TimeToNextSameVoting { get; set; } = timeToNextSameVoting; + public int MinimumPlayersToStartVoting { get; set; } = minimumPlayersToStartVoting; + } - public DefaultSkillInfo(Skills skill, bool active = true, string color = "#ffffff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) - { - Name = skill.ToString(); - Active = active; - Color = color; - OnlyTeam = (int)onlyTeam; - NeedsTeammates = needsTeammates; - } + public class DefaultSkillInfo(Skills skill, bool active = true, string color = "#ffffff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) + { + public bool NeedsTeammates { get; set; } = needsTeammates; + public int OnlyTeam { get; set; } = (int)onlyTeam; + public string Color { get; set; } = color; + public bool Active { get; set; } = active; + public string Name { get; set; } = skill.ToString(); } public enum GameModes diff --git a/jRandomSkills - SRC Files/src/utils/Localization.cs b/jRandomSkills - SRC Files/src/utils/Localization.cs index 6189611..b7c32e3 100644 --- a/jRandomSkills - SRC Files/src/utils/Localization.cs +++ b/jRandomSkills - SRC Files/src/utils/Localization.cs @@ -6,7 +6,7 @@ namespace jRandomSkills.src.utils public static class Localization { private static readonly string path = Path.Combine(jRandomSkills.Instance.ModuleDirectory, "lang"); - private static readonly Dictionary> _translations = new Dictionary>(); + private static readonly Dictionary> _translations = []; private static string langCode = "pl"; public static void Load() @@ -18,7 +18,7 @@ namespace jRandomSkills.src.utils private static void SetLangCode() { - langCode = Config.config.Settings.LangCode; + langCode = Config.LoadedConfig.Settings.LangCode; } private static void LoadAllLanguages() @@ -46,7 +46,7 @@ namespace jRandomSkills.src.utils public static string GetTranslation(string key, params object[] args) { if (_translations.TryGetValue(langCode, out var langDict) && langDict.TryGetValue(key, out var translation)) - if (args.Length != 0 && args[0] == "welcome") + if (args.Length != 0 && args[0].ToString() == "welcome") return translation; else return string.Format(translation, args).Replace("CHATCOLORS.RED", ChatColors.Red.ToString()); diff --git a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs index 1c655fb..275b4dd 100644 --- a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs +++ b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs @@ -12,7 +12,7 @@ namespace jRandomSkills { public static class SkillUtils { - private static MemoryFunctionVoid TerminateRoundFunc = new(GameData.GetSignature("CCSGameRules_TerminateRound")); + private static readonly MemoryFunctionVoid TerminateRoundFunc = new(GameData.GetSignature("CCSGameRules_TerminateRound")); public static void PrintToChat(CCSPlayerController player, string msg, bool isError) { @@ -31,7 +31,11 @@ namespace jRandomSkills string? itemString = EnumUtils.GetEnumMemberAttributeValue(item); if (string.IsNullOrWhiteSpace(itemString)) return; - var exists = player.PlayerPawn.Value.WeaponServices.MyWeapons.FirstOrDefault(w => w.Value.DesignerName == itemString); + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; + if (player.PlayerPawn.Value.WeaponServices == null) return; + + var exists = player.PlayerPawn.Value.WeaponServices.MyWeapons + .FirstOrDefault(w => w != null && w.IsValid && w.Value != null && w.Value.IsValid && w.Value.DesignerName == itemString); if (exists == null) for (int i = 0; i < count; i++) player.GiveNamedItem(item); @@ -62,9 +66,9 @@ namespace jRandomSkills return new Vector(x, y, z); } - public static void TakeHealth(CCSPlayerPawn pawn, int damage) + public static void TakeHealth(CCSPlayerPawn? pawn, int damage) { - if (pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) + if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; int newHealth = (int)(pawn.Health - damage); @@ -78,9 +82,9 @@ namespace jRandomSkills }); } - public static void AddHealth(CCSPlayerPawn pawn, int extraHealth, int maxHealth = 100) + public static void AddHealth(CCSPlayerPawn? pawn, int extraHealth, int maxHealth = 100) { - if (pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) + if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; int newHealth = (int)(pawn.Health + extraHealth); @@ -110,12 +114,14 @@ namespace jRandomSkills public static void SetTeamScores(short ctScore, short tScore, RoundEndReason roundEndReason) { + if (jRandomSkills.Instance == null || jRandomSkills.Instance.GameRules == null) return; UpdateServerTeamScores(ctScore, tScore); TerminateRoundFunc.Invoke(jRandomSkills.Instance.GameRules.Handle, 5f, roundEndReason, 0, 0); } public static void TerminateRound(CsTeam winnerTeam) { + if (jRandomSkills.Instance == null || jRandomSkills.Instance.GameRules == null) return; var teams = Utilities.FindAllEntitiesByDesignerName("cs_team_manager"); var ctTeam = teams.First(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.CounterTerrorist); var tTeams = teams.First(t => t.IsValid && (CsTeam)t.TeamNum == CsTeam.Terrorist); @@ -130,6 +136,7 @@ namespace jRandomSkills private static void UpdateServerTeamScores(short ctScore, short tScore) { + if (jRandomSkills.Instance == null || jRandomSkills.Instance.GameRules == null) return; int totalRoundsPlayed = ctScore + tScore; int maxRounds = ConVar.Find("mp_maxrounds")?.GetPrimitiveValue() ?? 24; int halfRounds = maxRounds / 2;