diff --git a/jRandomSkills - SRC Files/jRandomSkills.csproj b/jRandomSkills - SRC Files/jRandomSkills.csproj index 0953faa..818771c 100644 --- a/jRandomSkills - SRC Files/jRandomSkills.csproj +++ b/jRandomSkills - SRC Files/jRandomSkills.csproj @@ -6,17 +6,20 @@ enable true true + false + + - - + + @@ -29,7 +32,7 @@ - + diff --git a/jRandomSkills - SRC Files/src/command/Command.cs b/jRandomSkills - SRC Files/src/command/Command.cs index 50f922a..623fe45 100644 --- a/jRandomSkills - SRC Files/src/command/Command.cs +++ b/jRandomSkills - SRC Files/src/command/Command.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Entities.Constants; -using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using src.menu; using src.player; @@ -76,19 +75,23 @@ namespace src.command [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)] private static void Command_UseTypeSkill(CCSPlayerController? player, CommandInfo _) { - if (player == null) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + player = PlayerManager.GetPlayerEvent(player); + if (player == null || !player.IsValid) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo == null || playerInfo.IsDrawing) return; var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - if (!player.IsValid || !player.PawnIsAlive) return; + + if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; if (SkillsInfo.GetValue(playerInfo.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return; 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", [player]); else @@ -100,9 +103,9 @@ namespace src.command { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_setskill {command.ArgString} command."); if (!string.IsNullOrEmpty(config.NormalCommands.SetSkillCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.SetSkillCommand.Permissions)) return; - var targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => !p.IsBot + var targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => p != null && p.IsValid && (p.SteamID.ToString().Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase) - || p.PlayerName.Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase))); + || p.PlayerName.Equals(command.GetArg(1), StringComparison.OrdinalIgnoreCase))); if (command.ArgCount < 2) { @@ -140,7 +143,7 @@ namespace src.command return; } - var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == targetPlayer.SteamID); + var skillPlayer = PlayerManager.GetPlayerByIndex(targetPlayer.Index); if (skillPlayer != null) { Instance.SkillAction(skillPlayer.Skill.ToString(), "DisableSkill", [targetPlayer]); @@ -246,7 +249,7 @@ namespace src.command else { Server.ExecuteCommand("mp_restartgame 2"); - Instance?.AddTimer(2.0f, () => Localization.PrintTranslationToChatAll($" {ChatColors.Green}{{0}}", ["game_start"])); + Instance?.AddTimer(2.0f, () => Localization.PrintTranslationToChatAll($" {ChatColors.Green}{{0}}", ["game_start"]), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } } @@ -269,7 +272,7 @@ namespace src.command foreach (var player in Utilities.GetPlayers()) if (Instance.IsPlayerValid(player) && new CsTeam[] { CsTeam.CounterTerrorist, CsTeam.Terrorist }.Contains(player.Team)) player.SwitchTeam(player.Team == CsTeam.Terrorist ? CsTeam.CounterTerrorist : CsTeam.Terrorist); - Server.ExecuteCommand($"mp_restartgame 1"); + Server.ExecuteCommand($"endround"); } [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -374,7 +377,7 @@ namespace src.command if (!string.IsNullOrEmpty(config.NormalCommands.BotPlace.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.BotPlace.Permissions)) return; var pawn = player.PlayerPawn.Value; - if (!player.PawnIsAlive || pawn.AbsOrigin == null || pawn.AbsRotation == null) return; + if (player.LifeState != (byte)LifeState_t.LIFE_ALIVE || pawn.AbsOrigin == null || pawn.AbsRotation == null) return; if (!int.TryParse(command.GetArg(1), out int botSlot)) botSlot = -1; @@ -403,7 +406,7 @@ namespace src.command if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; if (!string.IsNullOrEmpty(config.NormalCommands.HudCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.HudCommand.Permissions)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo == null) return; playerInfo.DisplayHUD = !playerInfo.DisplayHUD; @@ -452,9 +455,9 @@ namespace src.command { Debug.WriteToDebug($"Player {player?.PlayerName} used the css_setstaticskill {command.ArgString} command."); if (!string.IsNullOrEmpty(config.NormalCommands.SetStaticSkillCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.SetStaticSkillCommand.Permissions)) return; - var targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => !p.IsBot + var targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => p != null && p.IsValid && (p.SteamID.ToString().Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase) - || p.PlayerName.Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase))); + || p.PlayerName.Equals(command.GetArg(1), StringComparison.OrdinalIgnoreCase))); if (command.ArgCount < 2) { @@ -495,7 +498,7 @@ namespace src.command return; } - var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == targetPlayer.SteamID); + var skillPlayer = PlayerManager.GetPlayerByIndex(targetPlayer.Index); if (skillPlayer != null) { Instance.SkillAction(skillPlayer.Skill.ToString(), "DisableSkill", [targetPlayer]); @@ -504,9 +507,9 @@ namespace src.command skillPlayer.SkillDescriptionHudExpired = DateTime.Now.AddSeconds(Config.LoadedConfig.SkillDescriptionDuration); if (skill.Skill == src.player.Skills.None) - Event.staticSkills.TryRemove(targetPlayer.SteamID, out _); + Event.staticSkills.TryRemove(targetPlayer.Index, out _); else - Event.staticSkills.TryAdd(targetPlayer.SteamID, skill); + Event.staticSkills.TryAdd(targetPlayer.Index, skill); Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [targetPlayer]); if (player == null) @@ -593,32 +596,58 @@ namespace src.command var skillsList = SkillData.Skills.OrderBy(s => s.Skill.ToString()).ToList(); if (skillsList.Count == 0) return; - nextSkill.TryGetValue(player.Index, out int currentIndex); + string playerString = command.GetArg(1); + CCSPlayerController? targetPlayer = null; + + if (!string.IsNullOrEmpty(playerString)) + { + targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => p != null && p.IsValid + && (p.SteamID.ToString().Equals(playerString, StringComparison.CurrentCultureIgnoreCase) + || p.PlayerName.Equals(playerString, StringComparison.OrdinalIgnoreCase))); + + if (targetPlayer == null) + { + if (player == null) + { + Server.PrintToConsole(Localization.GetTranslation("player_not_found_setskill")); + return; + } + SkillUtils.PrintToChat(player, player.GetTranslation("player_not_found_setskill")); + return; + } + } + + if (targetPlayer == null) + return; + + nextSkill.TryGetValue(targetPlayer.Index, out int currentIndex); int nextIndex = (currentIndex + 1) % skillsList.Count; - string arg = command.GetArg(1); + string arg = command.GetArg(2); if (!string.IsNullOrEmpty(arg)) { if (arg == "-1") nextIndex--; + else if (int.TryParse(arg, out int newIndex)) + nextIndex = newIndex; else - nextIndex = int.Parse(arg); + return; } var skill = skillsList[nextIndex]; player.PrintToChat(nextIndex.ToString()); - var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var skillPlayer = PlayerManager.GetPlayerByIndex(targetPlayer!.Index); if (skillPlayer == null) return; - Instance.SkillAction(skillPlayer.Skill.ToString(), "DisableSkill", [player]); + Instance.SkillAction(skillPlayer.Skill.ToString(), "DisableSkill", [targetPlayer]); skillPlayer.Skill = skill.Skill; skillPlayer.SpecialSkill = Skills.None; - nextSkill[player.Index] = nextIndex; + nextSkill[targetPlayer.Index] = nextIndex; - Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [player]); + Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [targetPlayer]); skillPlayer.SkillDescriptionHudExpired = DateTime.Now.AddSeconds(Config.LoadedConfig.SkillDescriptionDuration); if (skill.Display) diff --git a/jRandomSkills - SRC Files/src/command/VoteSystem.cs b/jRandomSkills - SRC Files/src/command/VoteSystem.cs index 801b7c0..b6908f8 100644 --- a/jRandomSkills - SRC Files/src/command/VoteSystem.cs +++ b/jRandomSkills - SRC Files/src/command/VoteSystem.cs @@ -22,7 +22,7 @@ namespace src.command vote.SetActive(false); vote.TimeToNextSameVoting = vote.TimeToNextVoting; Localization.PrintTranslationToChatAll($" {ChatColors.Red}{{0}}", ["vote_timeout"], [commandName]); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } private static VoteData? CreateVote(VoteType voteType, string? args = null) @@ -49,7 +49,7 @@ namespace src.command { if (!votes.ContainsKey(vote)) return; votes.TryRemove(vote, out _); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); return vote; } diff --git a/jRandomSkills - SRC Files/src/jRandomSkills.cs b/jRandomSkills - SRC Files/src/jRandomSkills.cs index edde5c6..7db762b 100644 --- a/jRandomSkills - SRC Files/src/jRandomSkills.cs +++ b/jRandomSkills - SRC Files/src/jRandomSkills.cs @@ -28,7 +28,7 @@ namespace src public override string ModuleName => "[CS2] [ jRandomSkills ]"; public override string ModuleAuthor => "D3X, Juzlus"; public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus."; - public override string ModuleVersion => "1.2.1.b9"; + public override string ModuleVersion => "1.2.2.b1"; public override void Load(bool hotReload) { @@ -43,6 +43,7 @@ namespace src Command.Load(); WASDMenuAPI.WASDMenuAPI.LoadPlugin(Instance, hotReload); LoadAllSkills(); + PlayerManager.SyncWithPlugin(Instance); Instance.RegisterListener(LoadManifest); @@ -217,7 +218,7 @@ namespace src Console.ForegroundColor = (ConsoleColor)CS2ConsoleColors.Cyan; Console.Write(", HtmlHudFix: "); Console.ForegroundColor = (ConsoleColor)CS2ConsoleColors.LightBlue; - Console.WriteLine(Config.LoadedConfig.FlashingHtmlHudFix); + Console.WriteLine(Config.LoadedConfig.EnableFlashingHtmlHudFix); // Dependences Console.ForegroundColor = (ConsoleColor)CS2ConsoleColors.Cyan; @@ -295,12 +296,21 @@ namespace src return null; } } + + /// + /// Gets a player info by index. O(n) lookup - consider caching if called frequently. + /// + internal jSkill_PlayerInfo? GetPlayerInfoByIndex(uint playerIndex) + { + return SkillPlayer.FirstOrDefault(p => p.PlayerIndex == playerIndex); + } } public class jSkill_PlayerInfo { - public required ulong SteamID { get; set; } + public required bool IsBot { get; set; } public required string PlayerName { get; set; } + public required uint PlayerIndex { get; set; } public Skills Skill { get; set; } public Skills SpecialSkill { get; set; } public float? SkillChance { get; set; } diff --git a/jRandomSkills - SRC Files/src/player/BotManager.cs b/jRandomSkills - SRC Files/src/player/BotManager.cs new file mode 100644 index 0000000..3a0d2cd --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/BotManager.cs @@ -0,0 +1,77 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Timers; +using CounterStrikeSharp.API.Modules.Utils; +using static src.jRandomSkills; +using Timer = CounterStrikeSharp.API.Modules.Timers.Timer; + +namespace src.utils +{ + public static class BotManager + { + private static Timer? _skillTimer; + private static Timer? _rotationTimer; + private static readonly Random _random = new(); + + private const float SkillInterval = 2f; + private const float RotationInterval = 45f; + + public static void Initialize() + { + if (!Config.LoadedConfig.EnableBotSkills) return; + + Stop(); + _skillTimer = Instance.AddTimer(SkillInterval, OnBotUseSkillTimer, TimerFlags.REPEAT | TimerFlags.STOP_ON_MAPCHANGE); + + if (!Config.LoadedConfig.EnableBotKickDebug) return; + + _rotationTimer = Instance.AddTimer(RotationInterval, OnBotRotationTimer, TimerFlags.REPEAT | TimerFlags.STOP_ON_MAPCHANGE); + } + + public static void Stop() + { + if (!Config.LoadedConfig.EnableBotSkills) return; + + _skillTimer?.Kill(); + _skillTimer = null; + + if (!Config.LoadedConfig.EnableBotKickDebug) return; + + _rotationTimer?.Kill(); + _rotationTimer = null; + } + + private static void OnBotUseSkillTimer() + { + var activeBots = Utilities.GetPlayers() + .Where(p => p != null && p.IsValid && p.IsBot && !p.IsHLTV && p.LifeState == (byte)LifeState_t.LIFE_ALIVE && p.Team != CsTeam.Spectator) + .ToList(); + + if (activeBots.Count == 0) return; + + var randomBot = activeBots[_random.Next(activeBots.Count)]; + if (randomBot == null || !randomBot.IsValid) return; + if (randomBot.PlayerPawn?.Value == null || !randomBot.PlayerPawn.Value.IsValid || randomBot.PlayerPawn.Value.IsDefusing) return; + + var bot_info = PlayerManager.GetPlayerByIndex(randomBot.Index); + if (bot_info == null) return; + + Instance.SkillAction(bot_info.Skill.ToString(), "UseSkill", [randomBot]); + } + + private static void OnBotRotationTimer() + { + var allBots = Utilities.GetPlayers() + .Where(p => p != null && p.IsValid && p.IsBot && !p.IsHLTV) + .ToList(); + + if (allBots.Count > 0) + { + var botToKick = allBots[_random.Next(allBots.Count)]; + Server.ExecuteCommand($"kickid {botToKick.UserId}"); + } + + Server.NextFrame(() => Server.ExecuteCommand("bot_add")); + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/Debug.cs b/jRandomSkills - SRC Files/src/player/Debug.cs index a6427b8..c6b91fc 100644 --- a/jRandomSkills - SRC Files/src/player/Debug.cs +++ b/jRandomSkills - SRC Files/src/player/Debug.cs @@ -19,7 +19,7 @@ namespace src.player sessionId = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}"; Instance.RegisterEventHandler((@event, info) => { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return HookResult.Continue; WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} joined the game."); return HookResult.Continue; @@ -27,7 +27,7 @@ namespace src.player Instance.RegisterEventHandler((@event, info) => { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return HookResult.Continue; WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} disconnected."); return HookResult.Continue; @@ -59,8 +59,8 @@ namespace src.player Instance.RegisterEventHandler((@event, info) => { - var victim = @event.Userid; - var attacker = @event.Attacker; + var victim = PlayerManager.GetPlayerEvent(@event.Userid); + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); if (victim != null) { if (attacker != null) @@ -90,7 +90,7 @@ namespace src.player Instance.RegisterEventHandler((@event, info) => { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return HookResult.Continue; WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} fired a shot."); return HookResult.Continue; @@ -116,10 +116,10 @@ namespace src.player if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) return HookResult.Continue; - CCSPlayerController attacker = attackerPawn.Controller.Value.As(); - CCSPlayerController victim = victimPawn.Controller.Value.As(); + CCSPlayerController attacker = PlayerManager.GetPlayerEvent(attackerPawn.Controller.Value.As())!; + CCSPlayerController victim = PlayerManager.GetPlayerEvent(victimPawn.Controller.Value.As())!; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (playerInfo == null) return HookResult.Continue; WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} took damage from {(attacker.IsBot ? "bot" : "player")} {attacker.PlayerName}."); @@ -131,11 +131,33 @@ namespace src.player if (Config.LoadedConfig.DebugMode != true) return; + // GetAllEntityIndexes(); + string filename = $"debug_{sessionId}.txt"; string path = Path.Combine(debugFolder, filename); Directory.CreateDirectory(debugFolder); File.AppendAllText(path, $"[{DateTime.Now:dd.MM.yyyy HH:mm:ss}] {message}{Environment.NewLine}", System.Text.Encoding.UTF8); } + + private static void GetAllEntityIndexes() + { + if (Instance.GameRules == null) return; + + var entities = Utilities.GetAllEntities(); + + foreach (var entity in entities) + if (entity != null && entity.IsValid && !string.IsNullOrEmpty(entity.DesignerName)) + { + string text = $"Entity: {entity.DesignerName}, ID: {entity.Index}"; + Console.WriteLine(text); + + string filename = $"debug_{sessionId}.txt"; + string path = Path.Combine(debugFolder, filename); + + Directory.CreateDirectory(debugFolder); + File.AppendAllText(path, text, System.Text.Encoding.UTF8); + } + } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/ISkill.cs b/jRandomSkills - SRC Files/src/player/ISkill.cs index 969fdf8..f1df3a4 100644 --- a/jRandomSkills - SRC Files/src/player/ISkill.cs +++ b/jRandomSkills - SRC Files/src/player/ISkill.cs @@ -85,7 +85,6 @@ public enum Skills Dracula, Duplicator, Dwarf, - Earthquake, EnemySpawn, ExplosiveShot, FalconEye, @@ -102,7 +101,6 @@ public enum Skills Glue, GodMode, Grenadier, - HealingChicken, HealingSmoke, Hermit, HolyHandGrenade, diff --git a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs index b394b35..23a1cd6 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs @@ -2,12 +2,14 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Admin; +using CounterStrikeSharp.API.Modules.Commands.Targeting; using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Events; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; +using Microsoft.Extensions.Logging; using RayTraceAPI; using src.player.skills; using src.utils; @@ -34,8 +36,8 @@ namespace src.player public static readonly SkillsInfo.DefaultSkillInfo[] counterterroristSkills = [.. SkillsInfo.LoadedConfig.Where(s => s.OnlyTeam == (int)CsTeam.CounterTerrorist)]; private static readonly SkillsInfo.DefaultSkillInfo[] allTeamsSkills = [.. SkillsInfo.LoadedConfig.Where(s => s.OnlyTeam == 0)]; - private static readonly ConcurrentDictionary> playersSkills = []; - public static readonly ConcurrentDictionary staticSkills = []; + private static readonly ConcurrentDictionary> playersSkills = []; + public static readonly ConcurrentDictionary staticSkills = []; private static readonly object setLock = new(); private static readonly MemoryFunctionVoid DropWeaponFunc = new(GameData.GetSignature("CCSPlayerController_HandleCommandDrop")); @@ -74,6 +76,7 @@ namespace src.player Instance.RegisterListener(CheckUseSkill); Instance.RegisterListener(EntitySpawned); Instance.RegisterListener(OnTick); + Instance.RegisterListener(OnPlayerConnectedBot); Instance.HookUserMessage(208, PlayerMakeSound); VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); @@ -96,7 +99,7 @@ namespace src.player const int attempts = 6; for (int attempt = 0; attempt < attempts; attempt++) { - var rolled = RarityManager.RollRarity(); + var (roll, rolled) = RarityManager.RollRarity(); var filtered = candidates.Where(s => { @@ -117,7 +120,7 @@ namespace src.player }).ToList(); if (filtered.Count > 0) - return filtered[Instance.Random.Next(filtered.Count)]; + return filtered[Random.Shared.Next(filtered.Count)]; } var fallback = candidates.Where(s => @@ -131,9 +134,9 @@ namespace src.player }).ToList(); if (fallback.Count > 0) - return fallback[Instance.Random.Next(fallback.Count)]; + return fallback[Random.Shared.Next(fallback.Count)]; - return candidates[Instance.Random.Next(candidates.Count)]; + return candidates[Random.Shared.Next(candidates.Count)]; } private static HookResult PlayerMakeSound(UserMessage um) @@ -402,6 +405,10 @@ namespace src.player foreach (string skillName in activeSkills) Instance.SkillAction(skillName, "OnTakeDamage", [h]); + + if (Fortnite.skillInThisRound == true && !activeSkills.Any(s => s == "Fortnite")) + Instance.SkillAction("Fortnite", "OnTakeDamage", [h]); + return HookResult.Continue; } } @@ -526,17 +533,21 @@ namespace src.player } } - private static HookResult PlayerConnectFull(EventPlayerConnectFull @event, GameEventInfo info) + private static void OnPlayerConnectedBot(int playerSlot) { lock (setLock) { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; + var player = Utilities.GetPlayerFromSlot(playerSlot); + if (player == null || !player.IsValid) return; - Instance.SkillPlayer.Add(new jSkill_PlayerInfo + if (player.IsBot && !Config.LoadedConfig.EnableBotSkills) + return; + + var playerInfo = new jSkill_PlayerInfo { - SteamID = player.SteamID, + IsBot = player.IsBot, PlayerName = player.PlayerName, + PlayerIndex = player.Index, Skill = Skills.None, SpecialSkill = Skills.None, IsDrawing = false, @@ -544,7 +555,18 @@ namespace src.player PrintHTML = null, DisplayHUD = true, SkillUsed = false, - }); + }; + Instance.SkillPlayer.Add(playerInfo); + PlayerManager.Register(playerInfo); + } + } + + private static HookResult PlayerConnectFull(EventPlayerConnectFull @event, GameEventInfo info) + { + lock (setLock) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return HookResult.Continue; string welcomeMsg = player.GetTranslation("welcome_message", "welcome"); foreach (string line in welcomeMsg.Split("\n")) @@ -562,16 +584,18 @@ namespace src.player { lock (setLock) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return HookResult.Continue; - var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var skillPlayer = PlayerManager.GetPlayerByIndex(player!.Index); if (skillPlayer == null) return HookResult.Continue; Instance.SkillAction(skillPlayer.Skill.ToString(), "DisableSkill", [player]); var items = Instance.SkillPlayer.ToList(); - Instance.SkillPlayer = [.. items.Where(p => p.SteamID != skillPlayer.SteamID)]; + Instance.SkillPlayer = [.. items.Where(p => p.PlayerIndex != player.Index)]; + PlayerManager.UnregisterPlayer(player.Index); + EntityManager.DestroyPlayerEntities(player.Index); return HookResult.Continue; } @@ -586,16 +610,10 @@ namespace src.player string commandName = text.StartsWith('!') || text.StartsWith('/') ? text[1..] : text; - foreach (var cmd in Instance.CommandDefinitions) - Server.PrintToChatAll("1. " + cmd.Name); - - foreach (var cmd in Instance.CommandListeners.Keys) - Server.PrintToChatAll("2. " + cmd?.Target?.ToString()); - var player = Utilities.GetPlayerFromUserid(userID); if (player == null || !player.IsValid) return HookResult.Continue; - var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var skillPlayer = PlayerManager.GetPlayerByIndex(player!.Index); if (skillPlayer == null) return HookResult.Continue; var temp = skillPlayer.SkillHudExpired; @@ -605,7 +623,7 @@ namespace src.player { if (skillPlayer.SkillHudExpired == DateTime.MinValue) skillPlayer.SkillHudExpired = temp; - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); return HookResult.Continue; } @@ -614,10 +632,10 @@ namespace src.player { lock (setLock) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return HookResult.Continue; - var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var skillPlayer = PlayerManager.GetPlayerByIndex(player!.Index); if (skillPlayer == null) return HookResult.Continue; if (setSkillTimer != null) @@ -642,11 +660,11 @@ namespace src.player { bool isWarmup = Instance.GameRules != null && Instance.GameRules.WarmupPeriod == true; isTransmitRegistered = false; - Instance.AddTimer(.1f, () => DisableAll()); + Instance.AddTimer(.1f, () => DisableAll(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) + foreach (var player in Utilities.GetPlayers().Where(p => p != null && p.IsValid && !p.IsHLTV && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) { - var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var skillPlayer = PlayerManager.GetPlayerByIndex(player!.Index); if (skillPlayer == null) continue; skillPlayer.IsDrawing = !isWarmup; skillPlayer.PrintHTML = null; @@ -659,7 +677,7 @@ namespace src.player setSkillTimer?.Kill(); float timeToDraw = (Instance?.GameRules?.TeamIntroPeriod == true ? 7 : 0) + Math.Max(freezetime - Config.LoadedConfig.SkillTimeBeforeStart, 0) + .3f; - setSkillTimer = Instance?.AddTimer(timeToDraw, SetSkill); + setSkillTimer = Instance?.AddTimer(timeToDraw, SetSkill, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); return HookResult.Continue; } } @@ -668,9 +686,14 @@ namespace src.player { lock (setLock) { - foreach (var player in Utilities.GetPlayers().Where(p => p != null && !p.IsBot && p.IsValid)) + Fortnite.skillInThisRound = false; + EntityManager.DestroyAllTracked(); + + foreach (var player in Utilities.GetPlayers().Where(p => p != null && p.IsValid)) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) continue; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) continue; Instance.SkillAction(playerInfo.Skill.ToString(), "DisableSkill", [player]); @@ -681,10 +704,28 @@ namespace src.player playerInfo.PrintHTML = null; playerInfo.SkillChance = 1; playerInfo.SkillUsed = false; + + RestorePlayer(player); } } } + public static void RestorePlayer(CCSPlayerController? player) + { + if (player == null || !player.IsValid) return; + + var pawn = player.PlayerPawn?.Value; + if (pawn == null || !pawn.IsValid) return; + + pawn.HideHUD = (uint)(pawn.HideHUD & ~(1 << 8)); + Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_iHideHUD"); + + player.ReplicateConVar("sv_disable_radar", "0"); + + player.DesiredFOV = 0; + Utilities.SetStateChanged(player, "CBasePlayerController", "m_iDesiredFOV"); + } + public static void OnMapChange() { lock (setLock) @@ -693,19 +734,21 @@ namespace src.player Instance.AddTimer(.1f, () => { DisableAll(); ConVar.Find("sv_legacy_jump")?.SetValue("1"); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); Instance.RemoveListener(CheckTransmit); playersSkills.Clear(); staticSkills.Clear(); ctSkill = noneSkill; tSkill = noneSkill; allSkill = noneSkill; + PlayerManager.Clear(); } } private static HookResult RoundEnd(EventRoundEnd @event, GameEventInfo info) { Illiterate.Disable(); + lock (setLock) { foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid)) @@ -717,7 +760,7 @@ namespace src.player string skillsText = ""; foreach (var _player in _players) { - var _playerSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == _player.SteamID); + var _playerSkill = PlayerManager.GetPlayerByIndex(_player.Index); if (_playerSkill != null) { var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == _playerSkill.Skill); @@ -735,13 +778,13 @@ namespace src.player SkillUtils.PrintToChat(player, text, title: player.GetTranslation("teammate_skills"), border: ""); SkillUtils.PrintToChat(player, string.Empty, border: "b"); } - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } if (Config.LoadedConfig.DisableSkillsOnRoundEnd) { isTransmitRegistered = false; - Instance.AddTimer(1f, () => DisableAll()); + Instance.AddTimer(1f, () => DisableAll(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); Instance.RemoveListener(CheckTransmit); } return HookResult.Continue; @@ -760,18 +803,18 @@ namespace src.player foreach (string skillName in activeSkills) Instance.SkillAction(skillName, "PlayerDeath", [@event]); - var victim = @event.Userid; - var attacker = @event.Attacker; + var victim = PlayerManager.GetPlayerEvent(@event.Userid); + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); if (victim == null || attacker == null) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(victim.Index); if (playerInfo == null || playerInfo.IsDrawing) return HookResult.Continue; Instance.SkillAction(playerInfo.Skill.ToString(), "DisableSkill", [victim]); if (victim == attacker) return HookResult.Continue; if (Config.LoadedConfig.KillerSkillChatInfo) { - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var attackerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (attackerInfo != null) { var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.Skill); @@ -790,7 +833,7 @@ namespace src.player private static void CheckUseSkill(CCSPlayerController player, PlayerButtons pressed, PlayerButtons released) { - if (player == null || !player.IsValid || !player.PawnIsAlive) return; + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; lock (setLock) { @@ -802,7 +845,7 @@ namespace src.player if ((pressed & skillButton) == 0) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.IsDrawing) return; if (SkillsInfo.GetValue(playerInfo.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) @@ -872,14 +915,16 @@ namespace src.player setSkillTimer = null; lock (setLock) { - if (Instance?.GameRules != null && Instance.GameRules.WarmupPeriod == true) + if (Instance == null) return; + + if (Instance.GameRules != null && Instance.GameRules.WarmupPeriod == true) { setSkillTimer?.Kill(); return; } var validPlayers = Utilities.GetPlayers() - .Where(p => p != null && p.IsValid && !p.IsBot && !p.IsHLTV) + .Where(p => p != null && p.IsValid && !p.IsHLTV) .Where(p => { try { return p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist; } catch { return false; } @@ -918,7 +963,7 @@ namespace src.player var teammates = validPlayers.Where(p => p != null && p.IsValid && p.Team == player.Team && p != player).ToList(); string teammateSkills = ""; - var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var skillPlayer = PlayerManager.GetPlayerByIndex(player!.Index); if (skillPlayer == null) continue; skillPlayer.IsDrawing = false; @@ -935,7 +980,8 @@ namespace src.player { List skillList = [.. SkillData.Skills]; skillList.RemoveAll(s => s?.Skill == Skills.None); - skillList.RemoveAll(s => !string.IsNullOrEmpty(SkillsInfo.GetValue(s.Skill, "requiredPermission")) && !AdminManager.PlayerHasPermissions(player, SkillsInfo.GetValue(s.Skill, "requiredPermission"))); + if (!player.IsBot) + skillList.RemoveAll(s => !string.IsNullOrEmpty(SkillsInfo.GetValue(s.Skill, "requiredPermission")) && !AdminManager.PlayerHasPermissions(player, SkillsInfo.GetValue(s.Skill, "requiredPermission"))); if (gameMode != Config.GameModes.FullRandom) skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill); @@ -951,7 +997,7 @@ namespace src.player else skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - if (gameMode == Config.GameModes.NoRepeat && playersSkills.TryGetValue(player.SteamID, out ConcurrentBag? skills)) + if (gameMode == Config.GameModes.NoRepeat && playersSkills.TryGetValue(player.Index, out ConcurrentBag? skills)) { skillList.RemoveAll(s => skills.Any(s2 => s2.Skill == s.Skill)); if (skillList.Count == 0) skills.Clear(); @@ -961,10 +1007,10 @@ namespace src.player if (gameMode == Config.GameModes.NoRepeat) { - if (playersSkills.TryGetValue(player.SteamID, out ConcurrentBag? value)) + if (playersSkills.TryGetValue(player.Index, out ConcurrentBag? value)) value.Add(randomSkill); else - playersSkills.TryAdd(player.SteamID, [randomSkill]); + playersSkills.TryAdd(player.Index, [randomSkill]); } } else if (gameMode == Config.GameModes.TeamSkills) @@ -984,7 +1030,7 @@ namespace src.player skillPlayer.Skill = randomSkill.Skill; skillPlayer.SpecialSkill = Skills.None; - if (randomSkill != null && randomSkill.Skill != Skills.None) + if (randomSkill.Skill != Skills.None) { if (assignmentCounts.TryGetValue(randomSkill.Skill, out var cnt)) assignmentCounts[randomSkill.Skill] = cnt + 1; else assignmentCounts[randomSkill.Skill] = 1; @@ -999,17 +1045,19 @@ namespace src.player if (randomSkill.Display) SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(randomSkill.Skill)}{ChatColors.Lime}: {player.GetSkillDescription(randomSkill.Skill)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p != null && p.IsValid && p.Team == player.Team && p != player) ? "tb" : "t"); if (SkillsInfo.GetValue(randomSkill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) Instance?.AddTimer(Config.LoadedConfig.SkillTimeBeforeStart, () => { - if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == randomSkill.Skill) == null) return; + if (PlayerManager.GetPlayerByIndex(player!.Index)?.Skill != randomSkill.Skill) return; Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); else + { Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]); - }); + } + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{player.GetSkillName(randomSkill.Skill)}\"."); @@ -1027,7 +1075,7 @@ namespace src.player foreach (var teammate in teammates) { - var teammateInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == teammate.SteamID); + var teammateInfo = PlayerManager.GetPlayerByIndex(teammate.Index); if (teammateInfo != null && teammateInfo?.Skill != null) { var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == teammateInfo.Skill); @@ -1043,7 +1091,7 @@ namespace src.player SkillUtils.PrintToChat(player, text, title: player.GetTranslation("teammate_skills"), border: ""); SkillUtils.PrintToChat(player, string.Empty, title: player.GetTranslation("teammate_skills"), border: "b"); } - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } } } @@ -1053,7 +1101,7 @@ namespace src.player { lock (setLock) { - var validPlayers = Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist).ToList(); + var validPlayers = Utilities.GetPlayers().Where(p => p != null && p.IsValid && !p.IsHLTV && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist).ToList(); if (Config.LoadedConfig.GameMode == (int)Config.GameModes.TeamSkills) { @@ -1067,7 +1115,7 @@ namespace src.player } if (player == null) return; - var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var skillPlayer = PlayerManager.GetPlayerByIndex(player!.Index); if (skillPlayer == null) return; skillPlayer.IsDrawing = false; @@ -1081,13 +1129,14 @@ namespace src.player if (Instance?.GameRules != null && Instance?.GameRules.WarmupPeriod == false) { Config.GameModes gameMode = (Config.GameModes)Config.LoadedConfig.GameMode; - if (staticSkills.TryGetValue(player.SteamID, out var staticSkill)) + if (staticSkills.TryGetValue(player.Index, out var staticSkill)) randomSkill = staticSkill; else if (gameMode == Config.GameModes.Normal || gameMode == Config.GameModes.FullRandom || gameMode == Config.GameModes.NoRepeat) { List skillList = [.. SkillData.Skills]; skillList.RemoveAll(s => s?.Skill == Skills.None); - skillList.RemoveAll(s => !string.IsNullOrEmpty(SkillsInfo.GetValue(s.Skill, "requiredPermission")) && !AdminManager.PlayerHasPermissions(player, SkillsInfo.GetValue(s.Skill, "requiredPermission"))); + if (!player.IsBot) + skillList.RemoveAll(s => !string.IsNullOrEmpty(SkillsInfo.GetValue(s.Skill, "requiredPermission")) && !AdminManager.PlayerHasPermissions(player, SkillsInfo.GetValue(s.Skill, "requiredPermission"))); if (gameMode != Config.GameModes.FullRandom) skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill); @@ -1103,7 +1152,7 @@ namespace src.player else skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - if (gameMode == Config.GameModes.NoRepeat && playersSkills.TryGetValue(player.SteamID, out ConcurrentBag? skills)) + if (gameMode == Config.GameModes.NoRepeat && playersSkills.TryGetValue(player.Index, out ConcurrentBag? skills)) { skillList.RemoveAll(s => skills.Any(s2 => s2.Skill == s.Skill)); if (skillList.Count == 0) skills.Clear(); @@ -1133,13 +1182,13 @@ namespace src.player } } - if (randomSkill.Display && Config.LoadedConfig.YourSkillChatInfo) - SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(randomSkill.Skill)}{ChatColors.Lime}: {player.GetSkillDescription(randomSkill.Skill)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); - skillPlayer.Skill = randomSkill.Skill; skillPlayer.SpecialSkill = Skills.None; + if (randomSkill.Display && Config.LoadedConfig.YourSkillChatInfo) + SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(randomSkill.Skill)}{ChatColors.Lime}: {player.GetSkillDescription(randomSkill.Skill)}", + border: !Utilities.GetPlayers().Any(p => p != null && p.IsValid && p.Team == player.Team && p != player) ? "tb" : "t"); + if (randomSkill.Skill == Skills.Illiterate) Illiterate.Enable(); @@ -1148,12 +1197,12 @@ namespace src.player if (SkillsInfo.GetValue(randomSkill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) Instance?.AddTimer(Config.LoadedConfig.SkillTimeBeforeStart, () => { - if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == randomSkill.Skill) == null) return; + if (PlayerManager.GetPlayerByIndex(player!.Index)?.Skill != randomSkill.Skill) return; Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); else Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{player.GetSkillName(randomSkill.Skill)}\"."); skillPlayer.SkillDescriptionHudExpired = DateTime.Now.AddSeconds(Config.LoadedConfig.SkillDescriptionDuration); diff --git a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs index 7219e93..ba7ac98 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Utils; using src.utils; -using System.Linq; using static CounterStrikeSharp.API.Core.Listeners; using static src.jRandomSkills; @@ -16,49 +15,62 @@ namespace src.player Instance.RegisterListener(() => { UpdateGameRules(); - var players = Utilities.GetPlayers().ToArray(); - foreach (var player in players) + + foreach (var player in Utilities.GetPlayers()) + { if (player != null && player.IsValid) UpdatePlayerHud(player); + } }); Instance.RegisterListener(OnMapStart); + Instance.RegisterListener(OnMapEnd); } private static void OnMapStart(string mapName) { Instance.GameRules = null; Event.OnMapChange(); + BotManager.Initialize(); + } + + private static void OnMapEnd() + { + BotManager.Stop(); } private static void InitializeGameRules() { if (Instance.GameRules != null) return; var gameRulesProxy = Utilities.FindAllEntitiesByDesignerName("cs_gamerules").FirstOrDefault(); + if (gameRulesProxy != null) - Instance.GameRules = gameRulesProxy?.GameRules; + Instance.GameRules = gameRulesProxy.GameRules; } private static void UpdateGameRules() { - if (Instance?.GameRules == null || Instance?.GameRules?.Handle == IntPtr.Zero) + if (Instance?.GameRules == null || Instance.GameRules.Handle == IntPtr.Zero) InitializeGameRules(); - else if (Instance != null && Config.LoadedConfig.FlashingHtmlHudFix && !Instance.GameRules.WarmupPeriod) - Instance.GameRules.GameRestart = Instance.GameRules?.RestartRoundTime < Server.CurrentTime; + else if (Instance != null && Config.LoadedConfig.EnableFlashingHtmlHudFix && !Instance.GameRules.WarmupPeriod) + Instance.GameRules.GameRestart = Instance.GameRules.RestartRoundTime < Server.CurrentTime; } private static void UpdatePlayerHud(CCSPlayerController player) { - if (player == null || !player.IsValid) return; + if (player == null || !player.IsValid || player.IsBot) return; + + var skillPlayer = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); + if (skillPlayer == null || !skillPlayer.DisplayHUD) return; var now = DateTime.Now; - var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (skillPlayer == null || !skillPlayer.DisplayHUD) return; + if (player.PawnIsAlive && skillPlayer.SkillHudExpired < now) return; string infoLine = string.Empty; string skillLine = string.Empty; string remainingLine = string.Empty; + bool showDescriptionHUD = skillPlayer.SkillDescriptionHudExpired >= now; bool isDescription = true; @@ -72,10 +84,12 @@ namespace src.player else if (skillPlayer.IsDrawing && player.PawnIsAlive) { int skillCount = skills.Count; + if (skillCount > 0) { var skillsArray = skills.ToArray(); var randomSkill = skillsArray[Instance.Random.Next(skillCount)]; + infoLine = player.GetTranslation("drawing_skill"); skillLine = $"{player.GetSkillName(randomSkill.Skill)}"; } @@ -85,61 +99,70 @@ namespace src.player if (player.PawnIsAlive) { var skillInfo = skills.FirstOrDefault(s => s.Skill == skillPlayer.Skill); + if (skillInfo != null) { infoLine = player.GetTranslation("your_skill"); skillLine = $"{player.GetSkillName(skillInfo.Skill, skillPlayer.SkillChance)}"; + if (skillInfo.Skill != Skills.None) { remainingLine = string.IsNullOrEmpty(skillPlayer.PrintHTML) ? (showDescriptionHUD ? player.GetSkillDescription(skillInfo.Skill, skillPlayer.SkillChance) : "") : skillPlayer.PrintHTML; + isDescription = string.IsNullOrEmpty(skillPlayer.PrintHTML); } } } else { - if ((player.Team is CsTeam.Spectator or CsTeam.None && Config.LoadedConfig.DisableSpectateHUD) || AdminManager.PlayerHasPermissions(player, Config.LoadedConfig.DisableHUDOnDeathPermission)) + if ((player.Team is CsTeam.Spectator or CsTeam.None && Config.LoadedConfig.DisableSpectateHUD) + || AdminManager.PlayerHasPermissions(player, Config.LoadedConfig.DisableHUDOnDeathPermission)) return; var pawn = player.Pawn.Value; - if (pawn == null || pawn.ObserverServices == null) return; + if (pawn?.ObserverServices == null) return; var observerTarget = pawn.ObserverServices.ObserverTarget?.Value; if (observerTarget == null || !observerTarget.IsValid) return; - var players = Utilities.GetPlayers(); - var targetHandle = observerTarget.Handle; - var observedPlayer = players.FirstOrDefault(p => p?.IsValid == true && p?.Pawn?.Value?.Handle == targetHandle); + var observedPlayer = Utilities.GetPlayers().FirstOrDefault(p => + p != null && p.IsValid && p.Pawn?.Value?.Handle == observerTarget.Handle); + if (observedPlayer == null) return; - var observeredPlayerSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer.SteamID); - if (observeredPlayerSkill == null) return; + var observedEvent = PlayerManager.GetPlayerEvent(observedPlayer); + if (observedEvent == null || !observedEvent.IsValid) return; - var observeredPlayerSkillInfo = skills.FirstOrDefault(s => s.Skill == observeredPlayerSkill.Skill); - var observeredPlayerSpecialSkillInfo = observeredPlayerSkill.SpecialSkill != Skills.None ? skills.FirstOrDefault(s => s.Skill == observeredPlayerSkill.SpecialSkill) : null; + var observedSkill = PlayerManager.GetPlayerByIndex(observedEvent.Index); + if (observedSkill == null) return; - string primaryName = player.GetSkillName(observeredPlayerSkill.Skill, observeredPlayerSkill.SkillChance); - string primaryColor = observeredPlayerSkillInfo?.Color ?? SkillsInfo.GetValue(Skills.None, "color"); + var observedSkillInfo = skills.FirstOrDefault(s => s.Skill == observedSkill.Skill); + var observedSpecialInfo = observedSkill.SpecialSkill != Skills.None + ? skills.FirstOrDefault(s => s.Skill == observedSkill.SpecialSkill) + : null; + + string primaryName = player.GetSkillName(observedSkill.Skill, observedSkill.SkillChance); + string primaryColor = observedSkillInfo?.Color ?? SkillsInfo.GetValue(Skills.None, "color"); + string pName = System.Net.WebUtility.HtmlEncode(observedSkill.PlayerName); - string pName = System.Net.WebUtility.HtmlEncode(observeredPlayerSkill.PlayerName); if (pName.Length > 18) pName = $"{pName[..17]}..."; var observerSkill = player.GetTranslation("observer_skill"); infoLine = string.IsNullOrEmpty(observerSkill) ? pName : $"{observerSkill} {pName}"; - if (observeredPlayerSkill.SpecialSkill == Skills.None || observeredPlayerSpecialSkillInfo == null) + if (observedSkill.SpecialSkill == Skills.None || observedSpecialInfo == null) skillLine = $"{primaryName}"; else { - string specialName = player.GetSkillName(observeredPlayerSpecialSkillInfo.Skill); - skillLine = $"{specialName}({primaryName})"; + string specialName = player.GetSkillName(observedSpecialInfo.Skill); + skillLine = $"{specialName}({primaryName})"; } if (showDescriptionHUD) - remainingLine = player.GetSkillDescription(observeredPlayerSkill.Skill, observeredPlayerSkill.SkillChance); + remainingLine = player.GetSkillDescription(observedSkill.Skill, observedSkill.SkillChance); } } @@ -149,4 +172,4 @@ namespace src.player Event.UpdateSkillHUD(player, infoLine, skillLine, remainingLine, isDescription); } } -} \ No newline at end of file +} diff --git a/jRandomSkills - SRC Files/src/player/skills/AimLock.cs b/jRandomSkills - SRC Files/src/player/skills/AimLock.cs index 51ffcae..2244b3e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AimLock.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AimLock.cs @@ -1,7 +1,6 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using static src.jRandomSkills; using System.Collections.Concurrent; using src.utils; @@ -10,7 +9,7 @@ namespace src.player.skills public class AimLock : ISkill { private const Skills skillName = Skills.AimLock; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; + private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -28,23 +27,28 @@ namespace src.player.skills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) continue; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + { + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) { UpdateHUD(player, skillInfo); if (skillInfo.Cooldown.AddSeconds(SkillsInfo.GetValue(skillName, "duration")) > DateTime.Now) - LookAtEnemey(player); + LookAtEnemy(player); } + } } } public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo + if (player == null || !player.IsValid) return; + SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + PlayerIndex = player.Index, CanUse = true, Cooldown = DateTime.MinValue, }); @@ -52,23 +56,22 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + if (player == null || !player.IsValid) return; + SkillPlayerInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) { - float cooldown = 0; - if (skillInfo != null) - { - float time = (int)Math.Ceiling((skillInfo.Cooldown.AddSeconds(SkillsInfo.GetValue(skillName, "cooldown")) - DateTime.Now).TotalSeconds); - cooldown = Math.Max(time, 0); + if (player == null || !player.IsValid || skillInfo == null) return; - if (cooldown == 0 && skillInfo?.CanUse == false) - skillInfo.CanUse = true; - } + float time = (int)Math.Ceiling((skillInfo.Cooldown.AddSeconds(SkillsInfo.GetValue(skillName, "cooldown")) - DateTime.Now).TotalSeconds); + float cooldown = Math.Max(time, 0); - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + if (cooldown == 0 && !skillInfo.CanUse) + skillInfo.CanUse = true; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; if (cooldown == 0) @@ -79,61 +82,50 @@ namespace src.player.skills public static void UseSkill(CCSPlayerController player) { - var playerPawn = player.PlayerPawn.Value; - if (playerPawn?.CBodyComponent == null) return; + if (player == null || !player.IsValid) return; - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) { - if (!player.IsValid || !player.PawnIsAlive) return; - if (skillInfo.CanUse) - { - skillInfo.CanUse = false; - skillInfo.Cooldown = DateTime.Now; - LookAtEnemey(player); - } + if (!skillInfo.CanUse) return; + + skillInfo.Cooldown = DateTime.Now; + skillInfo.CanUse = false; } } - private static void LookAtEnemey(CCSPlayerController player) + private static void LookAtEnemy(CCSPlayerController player) { + if (player == null || !player.IsValid) return; + var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return; - CCSPlayerController? closetEnemy = null; - double minDist = double.MaxValue; + var myEyePos = new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z); - foreach (var enemy in Utilities.GetPlayers().Where(p => p.IsValid && p.PawnIsAlive && p.Team != player.Team)) - { - var enemyPawn = enemy.PlayerPawn.Value; - if (enemyPawn == null || !enemyPawn.IsValid || enemyPawn.AbsOrigin == null) continue; + var enemy = Utilities.GetPlayers() + .Where(p => p.IsValid && p.PawnIsAlive && p.Team != player.Team && p.PlayerPawn.Value != null && p.PlayerPawn.Value.AbsOrigin != null) + .OrderBy(p => (p.PlayerPawn.Value!.AbsOrigin! - pawn.AbsOrigin).LengthSqr()) + .FirstOrDefault(); - double dist = SkillUtils.GetDistance(enemyPawn.AbsOrigin, pawn.AbsOrigin); - if (dist < minDist) - { - minDist = dist; - closetEnemy = enemy; - } - } + if (enemy == null) return; - if (closetEnemy != null) - { - var enemyPawn = closetEnemy.PlayerPawn.Value; - if (enemyPawn == null || enemyPawn.AbsOrigin == null) return; + var enemyPawn = enemy.PlayerPawn.Value; + if (enemyPawn == null || !enemyPawn.IsValid || enemyPawn.AbsOrigin == null || enemyPawn.ViewOffset == null) return; - Vector myEyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z); + Vector diff = SkillUtils.GetForwardVector(enemyPawn.AbsRotation!) * 5; + Vector enemyHead = new( + enemyPawn.AbsOrigin.X + diff.X, + enemyPawn.AbsOrigin.Y + diff.Y, + enemyPawn.AbsOrigin.Z + enemyPawn.ViewOffset.Z + 2 + ); - Vector diff = SkillUtils.GetForwardVector(enemyPawn.AbsRotation!) * 5; - Vector enemyHead = new( - enemyPawn.AbsOrigin.X + diff.X, - enemyPawn.AbsOrigin.Y + diff.Y, - enemyPawn.AbsOrigin.Z + enemyPawn.ViewOffset.Z + 2 - ); + Vector direction = enemyHead - myEyePos; + QAngle angle = VectorToAngle(direction); - Vector direction = enemyHead - myEyePos; - QAngle angle = VectorToAngle(direction); - - pawn.Look(angle); - } + pawn.Look(angle); } private static QAngle VectorToAngle(Vector direction) @@ -146,7 +138,7 @@ namespace src.player.skills public class PlayerSkillInfo { - public ulong SteamID { get; set; } + public uint PlayerIndex { get; set; } public bool CanUse { get; set; } public DateTime Cooldown { get; set; } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs index 1c88526..b70316c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs @@ -2,9 +2,9 @@ using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using System.Runtime.InteropServices; -using static src.jRandomSkills; using System.Collections.Concurrent; using src.utils; +using CounterStrikeSharp.API; namespace src.player.skills { @@ -23,61 +23,35 @@ namespace src.player.skills CEntityInstance param = h.GetParam(0); CTakeDamageInfo param2 = h.GetParam(1); - if (param == null || !param.IsValid || param.Entity == null) - return; + if (param == null || !param.IsValid || param2 == null || param2.Handle == nint.Zero) return; + if (param2.Attacker == null || !param2.Attacker.IsValid || param2.Attacker.Value == null) return; - if (param2 == null || param2.Handle == nint.Zero || param2.Attacker == null || !param2.Attacker.IsValid) - return; + var attackerEnt = param2.Attacker.Value; + if (attackerEnt == null || !attackerEnt.IsValid) return; - var attackerHandle = param2.Attacker; - if (attackerHandle.Value == null || !attackerHandle.IsValid) - return; + var attackerPawn = attackerEnt.As(); + if (attackerPawn == null || !attackerPawn.IsValid) return; - var attackerEnt = attackerHandle.Value; - var victimEnt = param; + var attackerController = attackerPawn.Controller.Value; + if (attackerController == null || !attackerController.IsValid) return; - if (attackerEnt == null || victimEnt == null || !victimEnt.IsValid || !attackerEnt.IsValid) - return; + var attacker = PlayerManager.GetPlayerEvent(attackerController.As())!; - CCSPlayerPawn attackerPawn = new(attackerEnt.Handle); - CCSPlayerPawn victimPawn = new(victimEnt.Handle); - - if (attackerPawn == null || !attackerPawn.IsValid || victimPawn == null || !victimPawn.IsValid) - return; - - if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") - return; - - var attackerController = attackerPawn.Controller?.Value; - var victimController = victimPawn.Controller?.Value; - - if (!attackerController.IsValid() || !victimController.IsValid()) - return; - - CCSPlayerController attacker = attackerController!.As(); - CCSPlayerController victim = victimController!.As(); - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(attacker.Index); if (playerInfo == null) return; - if (!attacker.CheckPlayer()) - return; - int offset = GameData.GetOffset("CTakeDamageInfo_HitGroup"); - if (offset <= 0) - return; + if (offset <= 0) return; nint hitGroupPointer = Marshal.ReadIntPtr(param2.Handle, offset); - if (hitGroupPointer == nint.Zero) - return; + if (hitGroupPointer == nint.Zero) return; nint hitGroupOffset = Marshal.ReadIntPtr(hitGroupPointer, 16); - if (hitGroupOffset == nint.Zero) - return; + if (hitGroupOffset == nint.Zero) return; if (playerInfo.Skill == skillName) { - hitGroups[hitGroupOffset] = Marshal.ReadInt32(hitGroupOffset, 56); + hitGroups.TryAdd(hitGroupOffset, Marshal.ReadInt32(hitGroupOffset, 56)); Marshal.WriteInt32(hitGroupOffset, 56, (int)HitGroup_t.HITGROUP_HEAD); } else if (hitGroups.TryGetValue(hitGroupOffset, out var hitGroup)) @@ -87,10 +61,13 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController _) { foreach (var hit in hitGroups) - Marshal.WriteInt32(hit.Key, 56, hit.Value); + { + if (hit.Key != nint.Zero) + Marshal.WriteInt32(hit.Key, 56, hit.Value); + } } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Epic) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs b/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs index c9b4833..3f3005f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; -using static src.jRandomSkills; namespace src.player.skills { @@ -11,7 +10,8 @@ namespace src.player.skills { private const Skills skillName = Skills.Anomaly; private static readonly float tickRate = 64; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; + + private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -29,18 +29,24 @@ namespace src.player.skills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) continue; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + { + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) { UpdateHUD(player, skillInfo); - if (Server.TickCount % tickRate != 0) return; + if (Server.TickCount % tickRate != 0) continue; + var pawn = player.PlayerPawn.Value; if (pawn != null && pawn.IsValid && pawn.AbsOrigin != null) { if (skillInfo.LastRotations == null || skillInfo.LastPositions == null) continue; + skillInfo.LastPositions.Enqueue(new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z)); skillInfo.LastRotations.Enqueue(new QAngle(pawn.V_angle.X, pawn.V_angle.Y, 0)); + if (skillInfo.LastRotations.Count > SkillsInfo.GetValue(skillName, "secondsInBack")) { skillInfo.LastPositions.TryDequeue(out _); @@ -48,40 +54,42 @@ namespace src.player.skills } } } + } } } public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo + if (player == null || !player.IsValid) return; + SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + PlayerIndex = player.Index, CanUse = true, Cooldown = DateTime.MinValue, - LastPositions = [], - LastRotations = [], + LastPositions = new ConcurrentQueue(), + LastRotations = new ConcurrentQueue() }); } public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + if (player == null || !player.IsValid) return; + SkillPlayerInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) { + if (player == null || !player.IsValid || skillInfo == null) return; + float cooldown = 0; - if (skillInfo != null) - { - float time = (int)Math.Ceiling((skillInfo.Cooldown.AddSeconds(SkillsInfo.GetValue(skillName, "cooldown")) - DateTime.Now).TotalSeconds); - cooldown = Math.Max(time, 0); + float time = (int)Math.Ceiling((skillInfo.Cooldown.AddSeconds(SkillsInfo.GetValue(skillName, "cooldown")) - DateTime.Now).TotalSeconds); + cooldown = Math.Max(time, 0); - if (cooldown == 0 && skillInfo?.CanUse == false) - skillInfo.CanUse = true; - } + if (cooldown == 0 && !skillInfo.CanUse) + skillInfo.CanUse = true; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; if (cooldown == 0) @@ -92,19 +100,27 @@ namespace src.player.skills public static void UseSkill(CCSPlayerController player) { - var playerPawn = player.PlayerPawn.Value; - if (playerPawn?.CBodyComponent == null) return; + if (player == null || !player.IsValid) return; - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) { - if (!player.IsValid || !player.PawnIsAlive) return; - if (skillInfo.CanUse) + if (!skillInfo.CanUse) return; + + skillInfo.Cooldown = DateTime.Now; + skillInfo.CanUse = false; + + var playerPawn = player.PlayerPawn.Value; + if (playerPawn != null && playerPawn.IsValid) { - skillInfo.CanUse = false; - skillInfo.Cooldown = DateTime.Now; - if (skillInfo.LastRotations == null || skillInfo.LastRotations.IsEmpty || skillInfo.LastPositions == null || skillInfo.LastPositions.IsEmpty) return; + if (skillInfo.LastPositions == null || skillInfo.LastPositions.IsEmpty) return; + if (skillInfo.LastRotations == null || skillInfo.LastRotations.IsEmpty) return; + Vector? lastPosition = skillInfo.LastPositions.FirstOrDefault(); QAngle? lastRotation = skillInfo.LastRotations.FirstOrDefault(); + if (lastPosition != null && lastRotation != null) { playerPawn.Teleport(lastPosition, null, null); @@ -116,7 +132,7 @@ namespace src.player.skills public class PlayerSkillInfo { - public ulong SteamID { get; set; } + public uint PlayerIndex { get; set; } public bool CanUse { get; set; } public DateTime Cooldown { get; set; } public ConcurrentQueue? LastPositions { get; set; } diff --git a/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs b/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs index ec8c2f6..8025f0c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs @@ -2,7 +2,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; -using static src.jRandomSkills; namespace src.player.skills { @@ -17,25 +16,31 @@ namespace src.player.skills public static void PlayerBlind(EventPlayerBlind @event) { - var player = @event.Userid; - var attacker = @event.Attacker; + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; - if (attacker == null || !attacker.IsValid) return; var playerPawn = player.PlayerPawn.Value; if (playerPawn == null || !playerPawn.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) + { playerPawn.FlashDuration = 0.0f; - else if (attackerInfo?.Skill == skillName) - playerPawn.FlashDuration = SkillsInfo.GetValue(skillName, "flashDuration"); + } + else if (attacker != null && attacker.IsValid) + { + var attackerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); + if (attackerInfo?.Skill == skillName) + playerPawn.FlashDuration = SkillsInfo.GetValue(skillName, "flashDuration"); + } } public static void EnableSkill(CCSPlayerController player) { + if (player == null || !player.IsValid) return; SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade); } diff --git a/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs b/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs index 32aaa63..76e0fdb 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs @@ -1,7 +1,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; -using static src.jRandomSkills; namespace src.player.skills { @@ -16,12 +15,13 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var attacker = @event.Attacker; - var victim = @event.Userid; + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + var victim = PlayerManager.GetPlayerEvent(@event.Userid); int hitgroup = @event.Hitgroup; - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + if (victim == null || !victim.IsValid || attacker == null || !attacker.IsValid || attacker == victim) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(victim.Index); if (playerInfo?.Skill == skillName && hitgroup == (int)HitGroup_t.HITGROUP_HEAD) SkillUtils.RestoreHealth(victim); } diff --git a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs index 15acfc6..25881ec 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs @@ -2,7 +2,7 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; -using static src.jRandomSkills; +using System.Collections.Concurrent; namespace src.player.skills { @@ -11,6 +11,7 @@ namespace src.player.skills private const Skills skillName = Skills.AreaReaper; private static readonly string[] bombsiteA = ["A", "a"]; private static readonly string[] bombsiteB = ["B", "b"]; + private static readonly ConcurrentDictionary playersToTarget = []; public static void LoadSkill() { @@ -20,12 +21,19 @@ namespace src.player.skills public static void NewRound() { foreach (var player in Utilities.GetPlayers()) - SkillUtils.CloseMenu(player); + { + if (player != null && player.IsValid) + SkillUtils.CloseMenu(player); + } + + playersToTarget.Clear(); } public static void TypeSkill(CCSPlayerController player, string[] commands) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid || commands == null || commands.Length == 0) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillUsed) @@ -35,66 +43,74 @@ namespace src.player.skills } int site = bombsiteA.Contains(commands[0]) ? 0 : bombsiteB.Contains(commands[0]) ? 1 : -1; - if (site == -1) { + if (site == -1) + { player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_incorrect_site")}"); return; } - + var bombTargets = Utilities.FindAllEntitiesByDesignerName("func_bomb_target").ToArray(); if (bombTargets.Length == 2) { - bombTargets[site].BombPlantedHere = true; - Utilities.SetStateChanged(bombTargets[site], "CBombTarget", "m_bBombPlantedHere"); + var targetSite = bombTargets[site]; + if (targetSite != null && targetSite.IsValid) + { + targetSite.BombPlantedHere = true; + Utilities.SetStateChanged(targetSite, "CBombTarget", "m_bBombPlantedHere"); + playerInfo.SkillUsed = true; - playerInfo.SkillUsed = true; - player.PrintToChat($" {ChatColors.Green}{player.GetTranslation("areareaper_site_disabled", (site == 0 ? 'A' : 'B'))}"); + playersToTarget[player.Index] = targetSite.Index; + } } - else - player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_no_site")}"); } public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player.Index); if (playerInfo == null) return; + playerInfo.SkillUsed = false; SkillUtils.CreateMenu(player, [(player.GetTranslation("bombsite_a"), "a")], (player.GetTranslation("bombsite_b"), "b", true)); } public static void DisableSkill(CCSPlayerController player) { - SkillUtils.CloseMenu(player); Server.NextWorldUpdate(() => { - if (Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName) != null) return; + if (PlayerManager.GetPlayerCountBySkill(skillName) != 0) return; EnableBombsite(); }); + + SkillUtils.CloseMenu(player); } - private static void EnableBombsite() + private static void EnableBombsite(uint? bombsiteIndex = null) { var bombTargets = Utilities.FindAllEntitiesByDesignerName("func_bomb_target"); foreach (var bombTarget in bombTargets) - { - bombTarget.BombPlantedHere = false; - Utilities.SetStateChanged(bombTarget, "CBombTarget", "m_bBombPlantedHere"); - } + if (bombTarget != null && bombTarget.IsValid) + { + bombTarget.BombPlantedHere = false; + Utilities.SetStateChanged(bombTarget, "CBombTarget", "m_bBombPlantedHere"); + } } public static void OnTick() { - var bombTargets = Utilities.FindAllEntitiesByDesignerName("func_bomb_target"); - foreach (var player in Utilities.GetPlayers().Where(p => p.Team == CsTeam.Terrorist)) - { - if (!Instance.IsPlayerValid(player)) continue; + if (Server.TickCount % 16 != 0) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + foreach (var player in Utilities.GetPlayers()) + { + if (player == null || !player.IsValid || player.Team != CsTeam.Terrorist) continue; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == null) continue; var pawn = player.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid) continue; + if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) continue; - if (pawn.WeaponServices == null) continue; var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_c4") continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/Armored.cs b/jRandomSkills - SRC Files/src/player/skills/Armored.cs index d799c92..4530d17 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Armored.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Armored.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; @@ -18,14 +18,17 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; float newScale = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue(skillName, "ChanceTo") - SkillsInfo.GetValue(skillName, "ChanceFrom")) + SkillsInfo.GetValue(skillName, "ChanceFrom"); playerInfo.SkillChance = newScale; newScale = (float)Math.Round(newScale, 2); + SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newScale)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.IsValid && p.Team == player.Team && p != player) ? "tb" : "t"); } public static void OnTakeDamage(DynamicHook h) @@ -33,22 +36,18 @@ namespace src.player.skills CEntityInstance param = h.GetParam(0); CTakeDamageInfo param2 = h.GetParam(1); - if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) - return; + if (param == null || !param.IsValid || param2 == null) return; - CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); - CCSPlayerPawn victimPawn = new(param.Handle); + var victimPawn = param.As(); + if (victimPawn == null || !victimPawn.IsValid || victimPawn.DesignerName != "player") return; - if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") - return; + var victimController = victimPawn.Controller.Value; + if (victimController == null || !victimController.IsValid) return; - if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) - return; + var victim = victimController.As(); + if (victim == null || !victim.IsValid) return; - CCSPlayerController attacker = attackerPawn.Controller.Value.As(); - CCSPlayerController victim = victimPawn.Controller.Value.As(); - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(victim)!.Index); if (playerInfo == null) return; if (playerInfo.Skill == skillName && victim.PawnIsAlive) diff --git a/jRandomSkills - SRC Files/src/player/skills/Assassin.cs b/jRandomSkills - SRC Files/src/player/skills/Assassin.cs index 7f20c72..7075c35 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Assassin.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Assassin.cs @@ -1,7 +1,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; -using static src.jRandomSkills; namespace src.player.skills { @@ -18,29 +17,34 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { var damage = @event.DmgHealth; - var victim = @event.Userid; - var attacker = @event.Attacker; + var victim = PlayerManager.GetPlayerEvent(@event.Userid); + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); var weapon = @event.Weapon; - HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup; - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - if (nades.Contains(weapon)) return; + if (victim == null || !victim.IsValid || attacker == null || !attacker.IsValid || attacker == victim) return; + if (string.IsNullOrEmpty(weapon) || nades.Contains(weapon)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (playerInfo?.Skill != skillName) return; - if (IsBehind(attacker!, victim!)) - SkillUtils.TakeHealth(victim!.PlayerPawn.Value, (int)(damage * (SkillsInfo.GetValue(skillName, "damageMultiplier") - 1f))); + if (IsBehind(attacker, victim)) + { + var victimPawn = victim.PlayerPawn.Value; + if (victimPawn != null && victimPawn.IsValid) + SkillUtils.TakeHealth(victimPawn, (int)(damage * (SkillsInfo.GetValue(skillName, "damageMultiplier") - 1))); + } } private static bool IsBehind(CCSPlayerController attacker, CCSPlayerController victim) { 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); + return IsBetween(angles.Item1, angles.Item2, attackerPawn.AbsRotation.Y); } private static (float, float) GetAngleRange(float angle) @@ -55,7 +59,7 @@ namespace src.player.skills return (min, max); } - private static bool IsBeetween(float a, float b, float target) + private static bool IsBetween(float a, float b, float target) { if (a <= b) return (target >= a && target <= b); diff --git a/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs b/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs index c2678f6..9e1d116 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs @@ -23,29 +23,40 @@ namespace src.player.skills public static void NewRound() { foreach (var player in Utilities.GetPlayers()) - DisableSkill(player); + { + if (player != null && player.IsValid) + DisableSkill(player); + } } public static void DisableSkill(CCSPlayerController player) { - if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return; + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; - player.PlayerPawn.Value.ActualGravityScale = 1; + pawn.ActualGravityScale = 1.0f; } private static void ApplyGravityModifier(CCSPlayerController player) { - if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return; + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; float gravityModifier = (float)Math.Round(Instance.Random.NextDouble() * (SkillsInfo.GetValue(skillName, "ChanceTo") - SkillsInfo.GetValue(skillName, "chanceFrom")) + SkillsInfo.GetValue(skillName, "chanceFrom"), 1); playerInfo.SkillChance = gravityModifier; + SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, gravityModifier)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); - player.PlayerPawn.Value.ActualGravityScale = gravityModifier; + border: !Utilities.GetPlayers().Any(p => p.IsValid && p.Team == player.Team && p != player) ? "tb" : "t"); + + pawn.ActualGravityScale = gravityModifier; } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#7E10AD", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float chanceFrom = .1f, float chanceTo = .7f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs b/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs index b12e951..a450d07 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs @@ -1,9 +1,8 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using static src.jRandomSkills; -using System.Collections.Concurrent; using src.utils; +using System.Collections.Concurrent; namespace src.player.skills { @@ -19,66 +18,88 @@ namespace src.player.skills public static void NewRound() { foreach (var player in Utilities.GetPlayers()) - SkillUtils.CloseMenu(player); + { + if (player != null && player.IsValid) + SkillUtils.CloseMenu(player); + } } public static void OnTick() { if (Server.TickCount % 32 != 0) return; + foreach (var player in Utilities.GetPlayers()) { - if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid || !SkillUtils.HasMenu(player)) continue; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); - ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account)}$", e.Index.ToString()))); - SkillUtils.UpdateMenu(player, menuItems); + var enemies = Utilities.GetPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + ConcurrentBag<(string, string)> menuItems = []; + + foreach (var e in enemies) + { + int money = e.InGameMoneyServices?.Account ?? 0; + menuItems.Add(($"{e.PlayerName} : {money}$", e.Index.ToString())); + } + + if (!menuItems.IsEmpty) + SkillUtils.UpdateMenu(player, menuItems); + } + } + + public static void EnableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + playerInfo.SkillUsed = false; + + var enemies = Utilities.GetPlayers().Where(p => p.IsValid && p.PawnIsAlive && p.Team != player.Team && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + if (enemies.Length > 0) + { + ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices?.Account ?? 0)}$", e.Index.ToString()))]; + SkillUtils.CreateMenu(player, menuItems); + } + else + { + player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } } 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); + if (player == null || !player.IsValid || commands.Length < 1) return; + + string option = commands[0]; + if (string.IsNullOrEmpty(option)) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillUsed) { - player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}"); + player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("selectplayerskill_used_info")}"); return; } - string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); - - if (enemy == null) + if (uint.TryParse(option, out uint enemyIndex)) { - player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); - return; + var enemy = Utilities.GetEntityFromIndex((int)enemyIndex); + if (enemy != null && enemy.IsValid && enemy.PawnIsAlive && enemy.Team != player.Team) + { + ResetMoney(enemy); + playerInfo.SkillUsed = true; + SkillUtils.CloseMenu(player); + player.PrintToChat($" {ChatColors.Lime}{player.GetTranslation("bankrupt_player_info", enemy.PlayerName)}"); + enemy.PrintToChat($" {ChatColors.Red}{enemy.GetTranslation("bankrupt_enemy_info")}"); + return; + } } - - ResetMoney(enemy); - playerInfo.SkillUsed = true; - player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("bankrupt_player_info", enemy.PlayerName)); - enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("bankrupt_enemy_info")); - } - - public static void EnableSkill(CCSPlayerController player) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo == null) return; - playerInfo.SkillUsed = false; - - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); - if (enemies.Length > 0) - { - ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account)}$", e.Index.ToString()))); - SkillUtils.CreateMenu(player, menuItems); - } - else - player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); + player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } private static void ResetMoney(CCSPlayerController enemy) @@ -93,7 +114,8 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - SkillUtils.CloseMenu(player); + if (player != null && player.IsValid) + SkillUtils.CloseMenu(player); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#abab33", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs index 478f85e..e79fa38 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs @@ -1,10 +1,10 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; -using static src.jRandomSkills; -using System.Collections.Concurrent; using src.utils; +using System.Collections.Concurrent; +using static src.jRandomSkills; namespace src.player.skills { @@ -20,14 +20,14 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var victim = @event.Userid; - var attacker = @event.Attacker; + var victim = PlayerManager.GetPlayerEvent(@event.Userid); + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); var weapon = @event.Weapon; if (weapon != "decoy") return; if (!Instance.IsPlayerValid(victim) || !Instance.IsPlayerValid(attacker)) return; - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var attackerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(attacker)!.Index); if (attackerInfo?.Skill != skillName) return; SkillUtils.TakeHealth(victim!.PlayerPawn.Value, SkillsInfo.GetValue(skillName, "damageDeal")); @@ -41,27 +41,27 @@ namespace src.player.skills var decoy = entity.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 = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo?.Skill != skillName) return; decoys.TryAdd(decoy.Index, 0); - + decoy.Collision.CollisionAttribute.InteractsWith = pawn.Collision.CollisionAttribute.InteractsWith; decoy.Collision.CollisionGroup = pawn.Collision.CollisionGroup; } public static void DecoyStarted(EventDecoyStarted @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; uint key = (uint)@event.Entityid; @@ -69,7 +69,7 @@ namespace src.player.skills { var decoy = Utilities.GetEntityFromIndex(@event.Entityid); if (decoy != null && decoy.IsValid) - decoy.AcceptInput("Kill"); + decoy.AddEntityIOEvent("Kill", decoy, delay: 0.1f); decoys.TryRemove(key, out _); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Behind.cs b/jRandomSkills - SRC Files/src/player/skills/Behind.cs index 8e9845e..3677c39 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Behind.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Behind.cs @@ -17,11 +17,11 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var attacker = @event!.Attacker; - var victim = @event!.Userid; + var attacker = PlayerManager.GetPlayerEvent(@event!.Attacker); + var victim = PlayerManager.GetPlayerEvent(@event!.Userid); if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) if (Instance.Random.NextDouble() <= playerInfo.SkillChance) @@ -30,12 +30,12 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue(skillName, "ChanceTo") - SkillsInfo.GetValue(skillName, "ChanceFrom")) + SkillsInfo.GetValue(skillName, "ChanceFrom"); playerInfo.SkillChance = newChance; SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } private static void RotateEnemy(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs b/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs index 7fe4f7c..5681759 100644 --- a/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs +++ b/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs @@ -18,58 +18,71 @@ namespace src.player.skills public static void OnTick() { + var modifier = SkillsInfo.GetValue(skillName, "velocityModifier"); + foreach (var player in Utilities.GetPlayers()) { - if (!Instance.IsPlayerValid(player)) continue; + if (player == null || !player.IsValid) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) continue; var playerPawn = player.PlayerPawn?.Value; if (playerPawn == null || !playerPawn.IsValid || playerPawn.VelocityModifier == 0) continue; var weaponServices = playerPawn.WeaponServices; - if (weaponServices == null) return; - if (weaponServices.ActiveWeapon == null || !weaponServices.ActiveWeapon.IsValid || weaponServices.ActiveWeapon.Value == null || !weaponServices.ActiveWeapon.Value.IsValid || (weaponServices.ActiveWeapon.Value.DesignerName != "weapon_knife" && weaponServices.ActiveWeapon.Value.DesignerName != "weapon_bayonet")) - return; + if (weaponServices == null) continue; - playerPawn.VelocityModifier = SkillsInfo.GetValue(skillName, "velocityModifier"); + if (weaponServices.ActiveWeapon == null + || !weaponServices.ActiveWeapon.IsValid + || weaponServices.ActiveWeapon.Value == null + || !weaponServices.ActiveWeapon.Value.IsValid + || (weaponServices.ActiveWeapon.Value.DesignerName != "weapon_knife" + && weaponServices.ActiveWeapon.Value.DesignerName != "weapon_bayonet")) + continue; + + playerPawn.VelocityModifier = modifier; } } public static void PlayerHurt(EventPlayerHurt @event) { - var victim = @event.Userid; - int damage = @event.DmgHealth; - HitGroup_t hitGroup = (HitGroup_t)@event.Hitgroup; - string weapon = @event.Weapon; + var damage = @event.DmgHealth; + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + var victim = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Weapon; + int hitgroup = @event.Hitgroup; - if (noReflectionWeapon.Contains(weapon) || !Instance.IsPlayerValid(victim)) return; - var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); - if (victimInfo == null || victimInfo.Skill != skillName) return; + if (victim == null || !victim.IsValid || attacker == null || !attacker.IsValid || attacker == victim) return; - int chance = Instance.Random.Next(0, 101); - if (hitGroup == HitGroup_t.HITGROUP_LEFTLEG || hitGroup == HitGroup_t.HITGROUP_RIGHTLEG) - { - if (chance > SkillsInfo.GetValue(skillName, "legReflectionChance") * 100) - return; - } - else - if (chance > SkillsInfo.GetValue(skillName, "torseReflectionChance") * 100) - return; + var playerInfo = PlayerManager.GetPlayerByIndex(victim.Index); + if (playerInfo?.Skill != skillName) return; - var pawn = victim!.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid) return; + if (string.IsNullOrEmpty(weapon) || noReflectionWeapon.Contains(weapon)) return; - var weaponServices = pawn.WeaponServices; + float chance = (hitgroup == (int)HitGroup_t.HITGROUP_LEFTLEG || hitgroup == (int)HitGroup_t.HITGROUP_RIGHTLEG) + ? SkillsInfo.GetValue(skillName, "legReflectionChance") + : SkillsInfo.GetValue(skillName, "torseReflectionChance"); + + var victimPawn = victim.PlayerPawn?.Value; + if (victimPawn == null || !victimPawn.IsValid || Instance.Random.NextDouble() > chance) + return; + + var weaponServices = victimPawn.WeaponServices; if (weaponServices == null) return; - if (weaponServices.ActiveWeapon == null || !weaponServices.ActiveWeapon.IsValid || weaponServices.ActiveWeapon.Value == null || !weaponServices.ActiveWeapon.Value.IsValid || (weaponServices.ActiveWeapon.Value.DesignerName != "weapon_knife" && weaponServices.ActiveWeapon.Value.DesignerName != "weapon_bayonet")) + + if (weaponServices.ActiveWeapon == null + || !weaponServices.ActiveWeapon.IsValid + || weaponServices.ActiveWeapon.Value == null + || !weaponServices.ActiveWeapon.Value.IsValid + || (weaponServices.ActiveWeapon.Value.DesignerName != "weapon_knife" + && weaponServices.ActiveWeapon.Value.DesignerName != "weapon_bayonet")) return; SkillUtils.RestoreHealth(victim); } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#cc7504", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float torseReflectionChance = .95f, float legReflectionChance = .80f, float velocityModifier = .85f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#cc7504", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float torseReflectionChance = .95f, float legReflectionChance = .70f, float velocityModifier = .85f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public float TorseReflectionChance { get; set; } = torseReflectionChance; public float LegReflectionChance { get; set; } = legReflectionChance; diff --git a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs index a8a1b84..71067d5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs +++ b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs @@ -3,14 +3,13 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; -using static src.jRandomSkills; namespace src.player.skills { public class BunnyHop : ISkill { private const Skills skillName = Skills.BunnyHop; - private static readonly ConcurrentDictionary playersLastJump = []; + private static readonly ConcurrentDictionary playersLastJump = []; public static void LoadSkill() { @@ -21,7 +20,9 @@ namespace src.player.skills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) continue; + + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo?.Skill == skillName) GiveBunnyHop(player); } @@ -29,26 +30,31 @@ namespace src.player.skills private static void GiveBunnyHop(CCSPlayerController player) { + var eventPlayer = PlayerManager.GetPlayerEvent(player); + var eventPlayerPawn = eventPlayer?.PlayerPawn?.Value; + if (eventPlayerPawn == null || !eventPlayerPawn.IsValid) return; + var playerPawn = player.PlayerPawn.Value; if (playerPawn == null || !playerPawn.IsValid) return; + if (JumpBan.bannedPlayers.ContainsKey(player.Index)) return; - var flags = (PlayerFlags)playerPawn.Flags; + var flags = (PlayerFlags)eventPlayerPawn.Flags; var buttons = player.Buttons; if ((playerPawn.MovementServices?.QueuedButtonChangeMask & (ulong)PlayerButtons.Jump) != 0) - playersLastJump.AddOrUpdate(player.SteamID, Server.TickCount, (_, _) => Server.TickCount); + playersLastJump.AddOrUpdate(eventPlayer!.Index, Server.TickCount, (_, _) => Server.TickCount); bool jumpPressed = buttons.HasFlag(PlayerButtons.Jump) - || (playersLastJump.TryGetValue(player.SteamID, out int tick) && tick + 20 >= Server.TickCount); + || (playersLastJump.TryGetValue(eventPlayer!.Index, out int tick) && tick + 20 >= Server.TickCount); - if (jumpPressed && flags.HasFlag(PlayerFlags.FL_ONGROUND) && !playerPawn.MoveType.HasFlag(MoveType_t.MOVETYPE_LADDER)) + if (jumpPressed && flags.HasFlag(PlayerFlags.FL_ONGROUND) && !eventPlayerPawn.MoveType.HasFlag(MoveType_t.MOVETYPE_LADDER)) { - playerPawn.AbsVelocity.Z = SkillsInfo.GetValue(skillName, "jumpVelocity"); + eventPlayerPawn.AbsVelocity.Z = SkillsInfo.GetValue(skillName, "jumpVelocity"); var maxSpeed = SkillsInfo.GetValue(skillName, "maxSpeed"); - var vX = playerPawn.AbsVelocity.X; - var vY = playerPawn.AbsVelocity.Y; + var vX = eventPlayerPawn.AbsVelocity.X; + var vY = eventPlayerPawn.AbsVelocity.Y; var speed2D = Math.Sqrt(vX * vX + vY * vY); var scale = 1d; @@ -60,8 +66,8 @@ namespace src.player.skills else if (speed2D > maxSpeed) scale = maxSpeed / speed2D; - playerPawn.AbsVelocity.X = (float)(vX * scale); - playerPawn.AbsVelocity.Y = (float)(vY * scale); + eventPlayerPawn.AbsVelocity.X = (float)(vX * scale); + eventPlayerPawn.AbsVelocity.Y = (float)(vY * scale); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs index a923065..add268f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs +++ b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs @@ -4,6 +4,7 @@ using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; +using System.Drawing; using static src.jRandomSkills; namespace src.player.skills @@ -13,11 +14,13 @@ namespace src.player.skills private const Skills skillName = Skills.C4Camouflage; private static readonly ConcurrentDictionary invisiblePlayers = []; private const string bloodParticle = "particles/blood_impact/blood_impact_high.vpcf"; + private const string cameraViewModel = "models/sprays/spray_plane.vmdl"; public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); Instance.AddToManifest(bloodParticle); + Instance.AddToManifest(cameraViewModel); } public static void NewRound() @@ -27,40 +30,74 @@ namespace src.player.skills public static void WeaponPickup(EventItemPickup @event) { - var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; - EnableSkill(player!); + + Event.EnableTransmit(); + if (EntityManager.GetPlayerEntities(player.Index, "empty_prop").Count == 0) + CreatePlayerPosProp(player); } public static void WeaponEquip(EventItemEquip @event) { - var player = @event.Userid!; + var player = PlayerManager.GetPlayerEvent(@event.Userid); var weapon = @event.Item; - if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (player == null || !player.IsValid) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (weapon == "c4") + { invisiblePlayers.TryAdd(player.Index, 0); + SkillUtils.SetPlayerInvisibility(player, .5f); + } else + { invisiblePlayers.TryRemove(player.Index, out _); + SkillUtils.SetPlayerInvisibility(player, 0); + } } public static void OnTick() { + if (Server.TickCount % 2 != 0) return; + foreach (var player in Utilities.GetPlayers()) - if (!player.PawnIsAlive) + { + if (player.LifeState != (byte)LifeState_t.LIFE_ALIVE && invisiblePlayers.ContainsKey(player.Index)) + { invisiblePlayers.TryRemove(player.Index, out _); + SkillUtils.SetPlayerInvisibility(player, 0); + } + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) continue; + + var props = EntityManager.GetPlayerEntities(player.Index, "empty_prop"); + if (props.Count == 0) continue; + + var prop = Utilities.GetEntityFromIndex((int)props[0]); + if (prop == null || !prop.IsValid) continue; + + var pawn = player.PlayerPawn?.Value; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue; + + Vector newPos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + 30); + QAngle newAngle = new(0, pawn.V_angle.Y, 0); + prop.Teleport(newPos, newAngle, null); + } } public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) { foreach (var (info, player) in infoList) { - if (player == null || !player.IsValid) continue; + if (player == null || !player.IsValid || player.Team == CsTeam.Spectator) continue; var targetHandle = player.Pawn.Value?.ObserverServices?.ObserverTarget.Value?.Handle ?? nint.Zero; bool isObservingC4Camouflage = false; @@ -68,14 +105,17 @@ namespace src.player.skills if (targetHandle != nint.Zero) { var target = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == targetHandle); - var targetInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == target?.SteamID); + var targetInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(target)?.Index); if (targetInfo?.Skill == skillName) isObservingC4Camouflage = true; } foreach (var playerIndex in invisiblePlayers.Keys) { - var playerController = Utilities.GetPlayerFromIndex((int)playerIndex); - if (playerController == null || !playerController.IsValid || playerController.SteamID == player.SteamID) + var playerController = PlayerManager.GetPlayerEvent(Utilities.GetPlayerFromIndex((int)playerIndex)); + if (playerController == null || !playerController.IsValid || playerController.Index == player.Index) + continue; + + if (player.Team == playerController.Team) continue; if (!isObservingC4Camouflage) @@ -105,6 +145,10 @@ namespace src.player.skills var playerPawn = player.PlayerPawn.Value; if (playerPawn == null || !playerPawn.IsValid) return; + + if (EntityManager.GetPlayerEntities(player.Index, "empty_prop").Count == 0) + CreatePlayerPosProp(player); + 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; @@ -112,32 +156,55 @@ namespace src.player.skills if (activeWeapon.DesignerName != "weapon_c4") return; invisiblePlayers.TryAdd(player.Index, 0); + SkillUtils.SetPlayerInvisibility(player, .5f); } public static void DisableSkill(CCSPlayerController player) { invisiblePlayers.TryRemove(player.Index, out _); + SkillUtils.SetPlayerInvisibility(player, 0); + EntityManager.DestroyPlayerEntities(player.Index); + } + + private static void CreatePlayerPosProp(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + var emptyProp = EntityManager.CreateTrackedDynamicProp(player.Index); + if (emptyProp == null || !emptyProp.IsValid) return; + + var playerPawn = player.PlayerPawn?.Value; + if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null || playerPawn.AbsRotation == null) return; + + emptyProp.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(emptyProp.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); + emptyProp.SetModel(cameraViewModel); + emptyProp.Render = Color.FromArgb(1, 255, 255, 255); + + Vector newPos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + 30); + QAngle newAngle = new(playerPawn.AbsRotation.X, playerPawn.AbsRotation.Y, playerPawn.AbsRotation.Z); + + emptyProp.Teleport(newPos, newAngle); + emptyProp.DispatchSpawn(); + + Utilities.SetStateChanged(emptyProp, "CBaseEntity", "m_CBodyComponent"); + + EntityManager.RegisterExisting(emptyProp, player.Index, "empty_prop"); } public static void PlayerHurt(EventPlayerHurt @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; if (!invisiblePlayers.ContainsKey(player.Index)) return; var playerPawn = player.PlayerPawn.Value; if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null) return; - CParticleSystem particle = Utilities.CreateEntityByName("info_particle_system")!; + var particle = EntityManager.CreateTrackedParticleSystem(player.Index, bloodParticle, autoDestroySeconds: 3f); if (particle == null) return; - particle.EffectName = bloodParticle; - particle.StartActive = true; - Vector pos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + 50); particle.Teleport(pos); - particle.DispatchSpawn(); - particle.AcceptInput("Start"); } diff --git a/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs b/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs index 899b63f..eacdae7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs +++ b/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; @@ -11,9 +11,10 @@ namespace src.player.skills public class CarefulBullets : ISkill { private const Skills skillName = Skills.CarefulBullets; - private static readonly ConcurrentDictionary targetPlayers = []; - private static readonly ConcurrentDictionary lastShot = []; - private static readonly ConcurrentDictionary hitPlayer = []; + private static readonly ConcurrentDictionary targetPlayers = []; + private static readonly ConcurrentDictionary lastShot = []; + private static readonly ConcurrentDictionary hitPlayer = []; + private static readonly ConcurrentDictionary playersToTarget = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -25,22 +26,17 @@ namespace src.player.skills { lock (setLock) { + foreach (var player in Utilities.GetPlayers()) + { + DisableSkill(player); + SkillUtils.CloseMenu(player); + } + targetPlayers.Clear(); lastShot.Clear(); hitPlayer.Clear(); + playersToTarget.Clear(); } - foreach (var player in Utilities.GetPlayers()) - { - DisableSkill(player); - SkillUtils.CloseMenu(player); - } - } - - public static void PlayerDeath(EventPlayerDeath @event) - { - var player = @event.Userid; - if (player == null) return; - DisableSkill(player); } public static void OnTick() @@ -49,10 +45,10 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers()) { if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))]; SkillUtils.UpdateMenu(player, menuItems); @@ -61,8 +57,8 @@ namespace src.player.skills 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); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillUsed) @@ -72,7 +68,8 @@ namespace src.player.skills } string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); + if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) { @@ -80,19 +77,21 @@ namespace src.player.skills return; } - targetPlayers.TryAdd(enemy.SteamID, 0); + targetPlayers.TryAdd(enemy.Index, 0); + playersToTarget[player.Index] = enemy.Index; playerInfo.SkillUsed = true; + player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("carefulbullets_player_info", enemy.PlayerName)); enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("carefulbullets_enemy_info")); } public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SkillUsed = false; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))]; @@ -104,37 +103,37 @@ namespace src.player.skills public static void BulletImpact(EventBulletImpact @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; var playerPawn = player.PlayerPawn.Value; if (playerPawn == null || !playerPawn.IsValid) return; - if (!targetPlayers.ContainsKey(player.SteamID) || !player.PawnIsAlive) + if (!targetPlayers.ContainsKey(player.Index) || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; - ulong steamID = player.SteamID; + uint playerIndex = player.Index; Server.NextFrame(() => { if (player == null || !player.IsValid) return; if (playerPawn == null || !playerPawn.IsValid) return; - bool ishitPlayer = hitPlayer.TryGetValue(steamID, out int tick) && tick + 10 >= Server.TickCount; + bool ishitPlayer = hitPlayer.TryGetValue(playerIndex, out int tick) && tick + 10 >= Server.TickCount; - if (!lastShot.ContainsKey(steamID)) + if (!lastShot.ContainsKey(playerIndex)) { - lastShot.TryAdd(steamID, ishitPlayer); + lastShot.TryAdd(playerIndex, ishitPlayer); Instance.AddTickTimer(1, () => { - if (lastShot.TryRemove(steamID, out bool didHit) && !didHit) + if (lastShot.TryRemove(playerIndex, out bool didHit) && !didHit) SkillUtils.TakeHealth(playerPawn, SkillsInfo.GetValue(skillName, "damageAfterMiss")); - lastShot.TryRemove(steamID, out _); + lastShot.TryRemove(playerIndex, out _); }); } else if (ishitPlayer) - lastShot.TryUpdate(steamID, true, false); + lastShot.TryUpdate(playerIndex, true, false); }); } @@ -155,17 +154,37 @@ namespace src.player.skills if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) return; - CCSPlayerController attacker = attackerPawn.Controller.Value.As(); - if (!targetPlayers.ContainsKey(attacker.SteamID)) return; + CCSPlayerController attacker = PlayerManager.GetPlayerEvent(attackerPawn.Controller.Value.As())!; + if (!targetPlayers.ContainsKey(attacker.Index)) return; - hitPlayer.AddOrUpdate(attacker.SteamID, Server.TickCount, (_, _) => Server.TickCount); + hitPlayer.AddOrUpdate(attacker.Index, Server.TickCount, (_, _) => Server.TickCount); } public static void DisableSkill(CCSPlayerController player) { - targetPlayers.TryRemove(player.SteamID, out _); - lastShot.TryRemove(player.SteamID, out _); - hitPlayer.TryRemove(player.SteamID, out _); + targetPlayers.TryRemove(player.Index, out _); + lastShot.TryRemove(player.Index, out _); + hitPlayer.TryRemove(player.Index, out _); + + if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) + { + targetPlayers.TryRemove(targetIndex, out _); + lastShot.TryRemove(targetIndex, out _); + hitPlayer.TryRemove(targetIndex, out _); + } + + SkillUtils.CloseMenu(player); + } + + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + + targetPlayers.TryRemove(player.Index, out _); + lastShot.TryRemove(player.Index, out _); + hitPlayer.TryRemove(player.Index, out _); + SkillUtils.CloseMenu(player); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Catapult.cs b/jRandomSkills - SRC Files/src/player/skills/Catapult.cs index afb0644..f731f08 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Catapult.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Catapult.cs @@ -17,11 +17,11 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var attacker = @event.Attacker; - var victim = @event.Userid; + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + var victim = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var attackerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (attackerInfo?.Skill == skillName && victim!.PawnIsAlive) if (Instance.Random.NextDouble() <= attackerInfo.SkillChance) @@ -34,12 +34,12 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue(skillName, "chanceTo") - SkillsInfo.GetValue(skillName, "chanceFrom")) + SkillsInfo.GetValue(skillName, "chanceFrom"); playerInfo.SkillChance = newChance; SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#FF4500", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float chanceFrom = .2f, float chanceTo = .4f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs index dda31eb..379af4c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs @@ -42,10 +42,10 @@ namespace src.player.skills public static void WeaponPickup(EventItemPickup @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; SetWeaponAttack(player, true); @@ -120,7 +120,7 @@ namespace src.player.skills { var playerPawn = player.PlayerPawn.Value; if (playerPawn == null || !playerPawn.IsValid) return; - var chickenModel = Utilities.CreateEntityByName("prop_dynamic"); + var chickenModel = EntityManager.CreateTrackedDynamicProp(player.Index); if (chickenModel == null) return; @@ -172,7 +172,7 @@ namespace src.player.skills 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 playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; var weapon = pawn.WeaponServices.ActiveWeapon.Value; diff --git a/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs b/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs index e3a3704..30b4a0b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs @@ -1,6 +1,7 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; +using Microsoft.Extensions.Logging; using src.utils; using System.Collections.Concurrent; using static src.jRandomSkills; @@ -10,7 +11,7 @@ namespace src.player.skills public class ChillOut : ISkill { private const Skills skillName = Skills.ChillOut; - private static readonly ConcurrentDictionary plantingPlayers = []; + private static readonly ConcurrentDictionary plantingPlayers = []; public static void LoadSkill() { @@ -25,25 +26,27 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { if (player == null || !player.IsValid) return; - plantingPlayers.TryRemove(player.SteamID, out _); + plantingPlayers.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } public static void BombAbortplant(EventBombAbortplant @event) { - var user = @event.Userid; - if (user == null || !user.IsValid || !user.PawnIsAlive) return; - plantingPlayers.TryRemove(user.SteamID, out _); + var user = PlayerManager.GetPlayerEvent(@event.Userid); + if (!Instance.IsPlayerValid(user)) return; + + plantingPlayers.TryRemove(user.Index, out _); SkillUtils.ResetPrintHTML(user); } public static void BombBeginplant(EventBombBeginplant @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - plantingPlayers.TryAdd(player!.SteamID, Server.CurrentTime); - var anyChillOut = Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName); + plantingPlayers.TryAdd(player!.Index, Server.CurrentTime); + + var anyChillOut = PlayerManager.GetAllPlayers().FirstOrDefault(p => p.Skill == skillName); if (anyChillOut != null) { var bombEntities = Utilities.FindAllEntitiesByDesignerName("weapon_c4").ToList(); @@ -58,9 +61,10 @@ namespace src.player.skills public static void BombPlanted(EventBombPlanted @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - plantingPlayers.TryRemove(player!.SteamID, out _); + + plantingPlayers.TryRemove(player!.Index, out _); SkillUtils.ResetPrintHTML(player); } @@ -71,9 +75,9 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers().Where(p => p.Team == CsTeam.Terrorist)) { - if (!Instance.IsPlayerValid(player)) continue; + if (player == null || !player.IsValid) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo == null) continue; var pawn = player.PlayerPawn.Value; @@ -83,7 +87,7 @@ namespace src.player.skills var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_c4") continue; - if (plantingPlayers.TryGetValue(player.SteamID, out float plantTime)) + if (plantingPlayers.TryGetValue(player.Index, out float plantTime)) { float remaining = plantTime + extraTime - currentTime; playerInfo.PrintHTML = $"{player.GetTranslation("planter_planting", $"{Math.Max(0, remaining):0.0}s")}"; diff --git a/jRandomSkills - SRC Files/src/player/skills/Cutter.cs b/jRandomSkills - SRC Files/src/player/skills/Cutter.cs index b917712..43515ef 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Cutter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Cutter.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using static src.jRandomSkills; @@ -17,12 +17,12 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { var damage = @event.DmgHealth; - var attacker = @event.Attacker; - var victim = @event.Userid; + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + var victim = PlayerManager.GetPlayerEvent(@event.Userid); var weapon = @event.Weapon; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (playerInfo?.Skill != skillName) return; if (weapon == "knife" || weapon == "bayonet") diff --git a/jRandomSkills - SRC Files/src/player/skills/Cypher.cs b/jRandomSkills - SRC Files/src/player/skills/Cypher.cs index 2fc2f1c..ea73bf2 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Cypher.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Cypher.cs @@ -1,5 +1,6 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Commands.Targeting; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Timers; using CounterStrikeSharp.API.Modules.Utils; @@ -178,15 +179,18 @@ namespace src.player.skills if (cameraView == null || !cameraView.IsValid) return; pawn!.CameraServices!.ViewEntity.Raw = cameraView.EntityHandle.Raw; - SkillUtils.ApplyScreenColor(player, 0, 0, 255, 20, 100, 1020); - ulong playerSteamID = player.SteamID; + var eventTarget = PlayerManager.GetPlayerFromEvent(player); + if (eventTarget != null && eventTarget.IsValid) + SkillUtils.ApplyScreenColor(eventTarget, 0, 0, 255, 20, 100, 1020); + + uint playerIndex = player.Index; Timer? cameraTimer = null; cameraTimer = jRandomSkills.Instance.AddTimer(2f, () => { - var target = Utilities.GetPlayers().FirstOrDefault(p => p.IsValid && p.SteamID == playerSteamID); - if (target == null || !target.IsValid || !target.PawnIsAlive) + var target = Utilities.GetPlayers().FirstOrDefault(p => p.IsValid && p.Index == playerIndex); + if (target == null || !target.IsValid || target.LifeState != (byte)LifeState_t.LIFE_ALIVE) { cameraTimer?.Kill(); return; @@ -198,7 +202,14 @@ namespace src.player.skills return; } - SkillUtils.ApplyScreenColor(target, 0, 0, 255, 20, 100, 1020); + var eventTarget = PlayerManager.GetPlayerFromEvent(player); + if (eventTarget == null || !eventTarget.IsValid) + { + cameraTimer?.Kill(); + return; + } + + SkillUtils.ApplyScreenColor(eventTarget, 0, 0, 255, 20, 100, 1020); }, TimerFlags.STOP_ON_MAPCHANGE | TimerFlags.REPEAT); } else @@ -222,12 +233,12 @@ namespace src.player.skills if (!CheckCameraPosition(finalPos, player)) return null; - var camera = Utilities.CreateEntityByName("prop_dynamic_override"); + var camera = EntityManager.CreateTrackedPropOverride(player.Index); if (camera == null || !camera.IsValid) return null; camera.Collision.SolidType = SolidType_t.SOLID_VPHYSICS; camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); - camera.Entity!.Name = camera.Globalname = $"CypherCamera_{Server.TickCount}_{player.SteamID}"; + camera.Entity!.Name = camera.Globalname = $"CypherCamera_{Server.TickCount}_{player.Index}"; camera.SetModel(cameraPropModel); camera.Teleport(cameraVector, new QAngle(0, playerPawn.V_angle.Y + 180, 0)); @@ -244,17 +255,27 @@ namespace src.player.skills Vector diffVector = SkillUtils.GetForwardVector(cameraProp.AbsRotation) * 25; Vector finalPos = cameraProp.AbsOrigin + diffVector; - var camera = Utilities.CreateEntityByName("prop_dynamic"); + uint ownerIndex = EntityManager.SystemOwnerIndex; + if (!string.IsNullOrEmpty(cameraProp.Globalname)) + { + var parts = cameraProp.Globalname.Split('_'); + if (parts.Length >= 3 && uint.TryParse(parts[^1], out var idx)) + ownerIndex = idx; + } + + var camera = EntityManager.CreateTrackedDynamicProp(ownerIndex); if (camera == null || !camera.IsValid) return null; Server.NextFrame(() => { if (camera == null || !camera.IsValid) return; + camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); camera.SetModel(cameraViewModel); camera.Render = Color.FromArgb(1, 255, 255, 255); camera.Teleport(finalPos, cameraProp.AbsRotation); camera.DispatchSpawn(); + EntityManager.RegisterExisting(camera, ownerIndex, "prop_dynamic"); }); return camera; @@ -272,10 +293,10 @@ namespace src.player.skills if (!param.Entity.Name.StartsWith("CypherCamera_")) return; var nameParams = param.Entity.Name.Split('_')[2]; - _ = ulong.TryParse(nameParams, out ulong steamID); - if (steamID == 0) return; + _ = uint.TryParse(nameParams, out uint userIndex); + if (userIndex == 0) return; - var player = Utilities.GetPlayerFromSteamId(steamID); + var player = Utilities.GetPlayerFromIndex((int)userIndex); if (player == null) return; if (playersInfo.TryGetValue(player.Index, out var playerSkill)) @@ -355,7 +376,7 @@ namespace src.player.skills var player = Utilities.GetPlayerFromIndex((int)playerSkill.Player); if (player == null || !player.IsValid) return; - var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; float ticksLeft = playerSkill.NextCamera - Server.TickCount; diff --git a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs index f9fddd2..c7c044a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Timers; using CounterStrikeSharp.API.Modules.Utils; @@ -12,7 +12,8 @@ namespace src.player.skills public class Darkness : ISkill { private const Skills skillName = Skills.Darkness; - private static readonly ConcurrentDictionary playersInDark = []; + private static readonly ConcurrentDictionary playersInDark = []; + private static readonly ConcurrentDictionary playersToTarget = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -26,31 +27,25 @@ namespace src.player.skills { foreach (var player in Utilities.GetPlayers()) { - if (playersInDark.ContainsKey(player.SteamID)) + if (playersInDark.ContainsKey(player.Index)) DisableSkill(player); SkillUtils.CloseMenu(player); } playersInDark.Clear(); + playersToTarget.Clear(); } } - public static void PlayerDeath(EventPlayerDeath @event) - { - var player = @event.Userid; - if (player == null) return; - DisableSkill(player); - } - public static void OnTick() { if (Server.TickCount % 32 != 0) return; foreach (var player in Utilities.GetPlayers()) { if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))]; SkillUtils.UpdateMenu(player, menuItems); @@ -59,8 +54,8 @@ namespace src.player.skills 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); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillUsed) @@ -70,7 +65,8 @@ namespace src.player.skills } string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); + if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) { @@ -79,18 +75,20 @@ namespace src.player.skills } SetUpPostProcessing(enemy); + playersToTarget[player.Index] = enemy.Index; playerInfo.SkillUsed = true; + player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("darkness_player_info", enemy.PlayerName)); enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("darkness_enemy_info")); } public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SkillUsed = false; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))]; @@ -104,34 +102,50 @@ namespace src.player.skills { lock (setLock) { - SetUpPostProcessing(player, true); + if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) + { + var target = Utilities.GetPlayerFromIndex((int)targetIndex); + if (target != null && target.IsValid) + SetUpPostProcessing(target, true); + playersInDark.TryRemove(targetIndex, out _); + } + SkillUtils.CloseMenu(player); } } + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + + SetUpPostProcessing(player, true); + playersInDark.TryRemove(player.Index, out _); + SkillUtils.CloseMenu(player); + } + private static void SetUpPostProcessing(CCSPlayerController player, bool turnOff = false) { if (player == null || !player.IsValid) return; - ulong? playerSteamID = player?.SteamID; - if (playerSteamID == null) return; + uint playerIndex = player.Index; lock (setLock) { if (!turnOff) { - playersInDark.TryAdd((ulong)playerSteamID, 0); + playersInDark.TryAdd(playerIndex, 0); ApplyColor(player); Timer? darkTimer = null; darkTimer = Instance.AddTimer(5f, () => { - if (!playersInDark.ContainsKey((ulong)playerSteamID)) + if (!playersInDark.ContainsKey(playerIndex)) { darkTimer?.Kill(); return; } - var target = Utilities.GetPlayers().FirstOrDefault(p => p.IsValid && p.SteamID == playerSteamID); + var target = Utilities.GetPlayerFromIndex((int)playerIndex); if (target == null || !target.IsValid) { darkTimer?.Kill(); @@ -145,7 +159,7 @@ namespace src.player.skills else { SkillUtils.ApplyScreenColor(player, r: 0, g: 0, b: 0, a: 0, duration: 200, holdTime: 0); - playersInDark.TryRemove((ulong)playerSteamID, out _); + playersInDark.TryRemove(playerIndex, out _); } } } @@ -161,7 +175,7 @@ namespace src.player.skills holdTime: 3000); } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#383838", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Uncommon, int r = 0, int g = 0, int b = 0, int a = 230) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#383838", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Rare, int r = 0, int g = 0, int b = 0, int a = 230) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public int R { get; set; } = r; public int G { get; set; } = g; diff --git a/jRandomSkills - SRC Files/src/player/skills/Dash.cs b/jRandomSkills - SRC Files/src/player/skills/Dash.cs index 9bd4284..b84424f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dash.cs @@ -1,16 +1,15 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; -using static src.jRandomSkills; namespace src.player.skills { public class Dash : ISkill { private const Skills skillName = Skills.Dash; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; + private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -26,37 +25,22 @@ namespace src.player.skills } } - public static void OnTick() - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) return; - 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); - HandleDash(player, skillInfo); - } - } - } - public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo + SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + Username = player.PlayerName, CanUse = true, Cooldown = DateTime.MinValue, - LastFlags = 0, Jumps = 0, - LastButtons = 0 + WasOnGround = true, + JumpReleasedTicks = 10 }); } public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + SkillPlayerInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } @@ -72,7 +56,7 @@ namespace src.player.skills skillInfo.CanUse = true; } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; if (cooldown == 0) @@ -81,31 +65,49 @@ namespace src.player.skills playerInfo.PrintHTML = $"{player.GetTranslation("hud_info", $"{cooldown}")}"; } + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) + { + if (player == null || !player.IsValid) return; + + var eventPlayer = PlayerManager.GetPlayerEvent(player); + var playerInfo = PlayerManager.GetPlayerByIndex(eventPlayer!.Index); + + if (playerInfo?.Skill == skillName) + if (SkillPlayerInfo.TryGetValue(eventPlayer!.Index, out var skillInfo)) + { + UpdateHUD(player, skillInfo); + HandleDash(player, skillInfo); + } + } + } + private static void HandleDash(CCSPlayerController player, PlayerSkillInfo skillInfo) { - var playerPawn = player.PlayerPawn.Value; + var eventPlayer = PlayerManager.GetPlayerEvent(player); + var eventPlayerPawn = eventPlayer?.PlayerPawn?.Value; + if (eventPlayerPawn == null || !eventPlayerPawn.IsValid) return; + + var playerPawn = player.PlayerPawn?.Value; if (playerPawn == null || !playerPawn.IsValid) return; - var flags = (PlayerFlags)playerPawn.Flags; var buttons = player.Buttons; bool jumpPressed = (buttons & PlayerButtons.Jump) != 0 || (playerPawn.MovementServices?.QueuedButtonChangeMask & (ulong)PlayerButtons.Jump) != 0; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerPawn == null || playerInfo == null) return; + bool isOnGround = + eventPlayerPawn.GroundEntity != null + && eventPlayerPawn.GroundEntity.IsValid; - bool wasOnGround = (skillInfo.LastFlags & PlayerFlags.FL_ONGROUND) != 0; - bool isOnGround = (flags & PlayerFlags.FL_ONGROUND) != 0; - - if (wasOnGround && !isOnGround && jumpPressed) + if (skillInfo.WasOnGround && !isOnGround && jumpPressed) skillInfo.Jumps = 0; else if (isOnGround) skillInfo.Jumps = 0; else if (!isOnGround && jumpPressed && skillInfo.Jumps < 1) { - bool lastJumpPressed = (skillInfo.LastButtons & PlayerButtons.Jump) != 0; - if (!lastJumpPressed && skillInfo.CanUse) + if (skillInfo.JumpReleasedTicks >= 3 && skillInfo.CanUse) { skillInfo.Jumps++; skillInfo.CanUse = false; @@ -133,29 +135,33 @@ namespace src.player.skills moveY = 1; float moveAngle = MathF.Atan2(moveX, moveY) * (180f / MathF.PI); - QAngle dashAngles = new(0, playerPawn.EyeAngles.Y + moveAngle, 0); + QAngle dashAngles = new(0, eventPlayerPawn.EyeAngles.Y + moveAngle, 0); Vector newVelocity = SkillUtils.GetForwardVector(dashAngles) * SkillsInfo.GetValue(skillName, "pushVelocity"); - newVelocity.Z = playerPawn.AbsVelocity.Z + SkillsInfo.GetValue(skillName, "jumpVelocity"); + newVelocity.Z = eventPlayerPawn.AbsVelocity.Z + SkillsInfo.GetValue(skillName, "jumpVelocity"); - playerPawn.AbsVelocity.X = newVelocity.X; - playerPawn.AbsVelocity.Y = newVelocity.Y; - playerPawn.AbsVelocity.Z = newVelocity.Z; + eventPlayerPawn.AbsVelocity.X = newVelocity.X; + eventPlayerPawn.AbsVelocity.Y = newVelocity.Y; + eventPlayerPawn.AbsVelocity.Z = newVelocity.Z; } } - skillInfo.LastFlags = flags; - skillInfo.LastButtons = buttons; + skillInfo.WasOnGround = isOnGround; + + if (!jumpPressed) + skillInfo.JumpReleasedTicks++; + else + skillInfo.JumpReleasedTicks = 0; } public class PlayerSkillInfo { - public ulong SteamID { get; set; } + public string? Username { get; set; } public bool CanUse { get; set; } public DateTime Cooldown { get; set; } - public PlayerFlags LastFlags { get; set; } public int Jumps { get; set; } - public PlayerButtons LastButtons { get; set; } + public bool WasOnGround { get; set; } + public int JumpReleasedTicks { get; set; } } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#42bbfc", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float jumpVelocity = 150f, float pushVelocity = 600f, bool anyDirection = true, float cooldown = 2f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs index 12d44f7..a36fe35 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using static src.jRandomSkills; @@ -28,15 +28,15 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers()) { if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); ConcurrentBag<(string, string)> menuItems = []; foreach (var enemy in enemies) { - var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + var enemyInfo = PlayerManager.GetPlayerByIndex(enemy.Index); if (enemyInfo == null) continue; var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; @@ -50,15 +50,16 @@ namespace src.player.skills { if (player == null) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - if (!player.IsValid || !player.PawnIsAlive) return; + if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); + if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) { @@ -71,13 +72,13 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag<(string, string)> menuItems = []; foreach (var enemy in enemies) { - var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + var enemyInfo = PlayerManager.GetPlayerByIndex(enemy.Index); if (enemyInfo == null) continue; var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; @@ -91,7 +92,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SpecialSkill = Skills.None; SkillUtils.CloseMenu(player); @@ -99,8 +100,8 @@ namespace src.player.skills 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 = PlayerManager.GetPlayerByIndex(player!.Index); + var enemyInfo = PlayerManager.GetPlayerByIndex(enemy.Index); if (playerInfo != null) { diff --git a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs index 19bb414..e791b66 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs @@ -1,8 +1,7 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; -using static src.jRandomSkills; using System.Collections.Concurrent; using src.utils; @@ -12,6 +11,7 @@ namespace src.player.skills { private const Skills skillName = Skills.Deaf; private static readonly ConcurrentDictionary deafPlayers = []; + private static readonly ConcurrentDictionary playersToTarget = []; public static void LoadSkill() { @@ -28,6 +28,8 @@ namespace src.player.skills } deafPlayers.Clear(); + playersToTarget.Clear(); + foreach (var player in Utilities.GetPlayers()) SkillUtils.CloseMenu(player); } @@ -48,10 +50,10 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers()) { if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))]; SkillUtils.UpdateMenu(player, menuItems); @@ -60,8 +62,8 @@ namespace src.player.skills 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); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillUsed) @@ -71,7 +73,8 @@ namespace src.player.skills } string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); + if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) { @@ -80,18 +83,20 @@ namespace src.player.skills } deafPlayers.TryAdd(enemy.Index, 0); + playersToTarget[player.Index] = enemy.Index; playerInfo.SkillUsed = true; + player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("deaf_player_info", enemy.PlayerName)); enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("deaf_enemy_info")); } public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SkillUsed = false; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); @@ -103,8 +108,19 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { + if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) + deafPlayers.TryRemove(targetIndex, out _); + SkillUtils.CloseMenu(player); + } + + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + deafPlayers.TryRemove(player.Index, out _); + SkillUtils.CloseMenu(player); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#dae01f", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs b/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs index ed78c84..83e942b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs @@ -17,11 +17,11 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var attacker = @event.Attacker; - var victim = @event.Userid; + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + var victim = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) { @@ -39,12 +39,12 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue(skillName, "chanceTo") - SkillsInfo.GetValue(skillName, "chanceFrom")) + SkillsInfo.GetValue(skillName, "chanceFrom"); playerInfo.SkillChance = newChance; SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#FF4500", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float chanceFrom = .2f, float chanceTo = .35f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Distancer.cs b/jRandomSkills - SRC Files/src/player/skills/Distancer.cs index e604abf..9793565 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Distancer.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Distancer.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -31,7 +31,7 @@ namespace src.player.skills var player = Utilities.GetPlayerFromIndex((int)playerIndex); if (player == null || !player.IsValid) continue; - var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) continue; var playerPawn = player.PlayerPawn.Value; diff --git a/jRandomSkills - SRC Files/src/player/skills/Dracula.cs b/jRandomSkills - SRC Files/src/player/skills/Dracula.cs index 8135a09..310152c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dracula.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dracula.cs @@ -17,11 +17,11 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var attacker = @event.Attacker; - var victim = @event.Userid; + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + var victim = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) HealAttacker(attacker!, @event.DmgHealth); diff --git a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs index 333948b..3b9f2b9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs @@ -1,6 +1,5 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; @@ -29,18 +28,20 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers()) { if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p != player && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); ConcurrentBag<(string, string)> menuItems = []; foreach (var enemy in enemies) { - var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + var enemyInfo = PlayerManager.GetPlayerByIndex(enemy.Index); if (enemyInfo == null) continue; + var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; + menuItems.Add(($"{enemy.PlayerName} : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); } SkillUtils.UpdateMenu(player, menuItems); @@ -51,12 +52,12 @@ namespace src.player.skills { if (player == null) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - if (!player.IsValid || !player.PawnIsAlive) return; + if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; string enemyId = commands[0]; var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Index.ToString() == enemyId); @@ -72,14 +73,14 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p != player && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p != player && p.IsValid && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag skills = []; ConcurrentBag<(string, string)> menuItems = []; foreach (var enemy in enemies) { - var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + var enemyInfo = PlayerManager.GetPlayerByIndex(enemy.Index); if (enemyInfo == null) continue; var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; @@ -89,6 +90,7 @@ namespace src.player.skills int ctSkills = Event.counterterroristSkills.Count(s => skills.Contains(s.Name)); int ttSkills = Event.terroristSkills.Count(s => skills.Contains(s.Name)); + if ((player.Team == CsTeam.Terrorist && ctSkills == skills.Count) || (player.Team == CsTeam.CounterTerrorist && ttSkills == skills.Count)) { Event.SetRandomSkill(player); @@ -97,7 +99,7 @@ namespace src.player.skills SkillUtils.CreateMenu(player, menuItems); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } else player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); @@ -105,7 +107,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SpecialSkill = Skills.None; SkillUtils.CloseMenu(player); @@ -113,27 +115,27 @@ namespace src.player.skills 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 = PlayerManager.GetPlayerByIndex(player!.Index); + var enemyInfo = PlayerManager.GetPlayerByIndex(enemy.Index); if (playerInfo == null || enemyInfo == null) return; var enemySkill = enemyInfo.Skill; bool ctSkill = Event.counterterroristSkills.Any(s => s.Name == enemySkill.ToString()); bool ttSkill = Event.terroristSkills.Any(s => s.Name == enemySkill.ToString()); - ulong steamID = player.SteamID; + uint playerIndex = player.Index; string enemyName = enemy.PlayerName; if ((player.Team == CsTeam.Terrorist && ctSkill) || (player.Team == CsTeam.CounterTerrorist && ttSkill)) { Instance.AddTimer(.1f, () => { - var player = Utilities.GetPlayerFromSteamId(steamID); + var player = Utilities.GetPlayerFromIndex((int)playerIndex); if (player == null || !player.IsValid) return; Instance.SkillAction(skillName.ToString(), "EnableSkill", [player]); player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("thief_incorrect_skill", enemyName)); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); return; } @@ -146,15 +148,16 @@ namespace src.player.skills if (SkillsInfo.GetValue(enemySkill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) Instance?.AddTimer(Math.Max((float)(Event.GetFreezeTimeEnd() - DateTime.Now).TotalSeconds, 0), () => { - var player = Utilities.GetPlayerFromSteamId(steamID); + var player = Utilities.GetPlayerFromIndex((int)playerIndex); if (player == null || !player.IsValid) return; - if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == enemySkill) == null) return; + var dupInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (dupInfo == null || dupInfo.Skill != enemySkill) return; Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", [player]); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); else Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", [player]); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("duplicator_player_info", enemy.PlayerName)); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs b/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs index 997bab7..8720009 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -26,7 +26,7 @@ namespace src.player.skills public static unsafe void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; var playerPawn = player.PlayerPawn?.Value; @@ -38,13 +38,13 @@ namespace src.player.skills SkillUtils.ChangePlayerScale(player, newSize); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newSize)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } } public static void DisableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; var playerPawn = player.PlayerPawn?.Value; diff --git a/jRandomSkills - SRC Files/src/player/skills/Earthquake.cs b/jRandomSkills - SRC Files/src/player/skills/Earthquake.cs index 162a94b..ce7adb4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Earthquake.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Earthquake.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using static src.jRandomSkills; @@ -9,136 +9,133 @@ namespace src.player.skills { public class Earthquake : ISkill { - private const Skills skillName = Skills.Earthquake; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; - private static readonly object setLock = new(); + //private const Skills skillName = Skills.Earthquake; + //private static readonly ConcurrentDictionary SkillPlayerInfo = []; + //private static readonly object setLock = new(); - public static void LoadSkill() - { - // SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); - } + //public static void LoadSkill() + //{ + // SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); + //} - public static void NewRound() - { - lock (setLock) - SkillPlayerInfo.Clear(); - } + //public static void NewRound() + //{ + // lock (setLock) + // SkillPlayerInfo.Clear(); + //} - public static void EnableSkill(CCSPlayerController player) - { - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo - { - SteamID = player.SteamID, - CanUse = true, - Cooldown = DateTime.MinValue, - }); - } + //public static void EnableSkill(CCSPlayerController player) + //{ + // SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo + // { + // SteamID = player.Index, + // CanUse = true, + // Cooldown = DateTime.MinValue, + // }); + //} - public static void DisableSkill(CCSPlayerController player) - { - SkillPlayerInfo.TryRemove(player.SteamID, out _); - SkillUtils.ResetPrintHTML(player); - } + //public static void DisableSkill(CCSPlayerController player) + //{ + // SkillPlayerInfo.TryRemove(player.Index, out _); + // SkillUtils.ResetPrintHTML(player); + //} - public static void PlayerDeath(EventPlayerDeath @event) - { - var player = @event.Userid; - if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - SkillPlayerInfo.TryRemove(player.SteamID, out _); - } + //public static void PlayerDeath(EventPlayerDeath @event) + //{ + // var player = PlayerManager.GetPlayerEvent(@event.Userid); + // if (player == null || !player.IsValid) return; + // var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + // if (playerInfo?.Skill == skillName) + // SkillPlayerInfo.TryRemove(player.Index, out _); + //} - public static void OnTick() - { - foreach (var player in Utilities.GetPlayers()) - { - 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); - } - } + //public static void OnTick() + //{ + // foreach (var player in Utilities.GetPlayers()) + // { + // var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + // if (playerInfo?.Skill == skillName) + // if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) + // UpdateHUD(player, skillInfo); + // } + //} - private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) - { - float cooldown = 0; - if (skillInfo != null) - { - float time = (int)Math.Ceiling((skillInfo.Cooldown.AddSeconds(SkillsInfo.GetValue(skillName, "cooldown")) - DateTime.Now).TotalSeconds); - cooldown = Math.Max(time, 0); + //private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) + //{ + // float cooldown = 0; + // if (skillInfo != null) + // { + // float time = (int)Math.Ceiling((skillInfo.Cooldown.AddSeconds(SkillsInfo.GetValue(skillName, "cooldown")) - DateTime.Now).TotalSeconds); + // cooldown = Math.Max(time, 0); - if (cooldown == 0 && skillInfo?.CanUse == false) - skillInfo.CanUse = true; - } + // if (cooldown == 0 && skillInfo?.CanUse == false) + // skillInfo.CanUse = true; + // } - if (cooldown == 0) - return; + // if (cooldown == 0) + // return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); - if (playerInfo == null) return; + // var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + // if (playerInfo == null) return; - string remainingLine = $"{player.GetTranslation("hud_info", $"{cooldown}")}"; - } + // string remainingLine = $"{player.GetTranslation("hud_info", $"{cooldown}")}"; + //} - public static void UseSkill(CCSPlayerController player) - { - var playerPawn = player.PlayerPawn.Value; - if (playerPawn?.CBodyComponent == null) return; + //public static void UseSkill(CCSPlayerController player) + //{ + // var playerPawn = player.PlayerPawn.Value; + // if (playerPawn?.CBodyComponent == null) return; - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) - { - if (!player.IsValid || !player.PawnIsAlive) return; - if (skillInfo.CanUse) - { - skillInfo.CanUse = false; - skillInfo.Cooldown = DateTime.Now; - MakeShake(player); - } - } - } + // if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) + // { + // if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + // if (skillInfo.CanUse) + // { + // skillInfo.CanUse = false; + // skillInfo.Cooldown = DateTime.Now; + // MakeShake(player); + // } + // } + //} - private static void MakeShake(CCSPlayerController player) - { - foreach (var enemy in Utilities.GetPlayers().Where(p => p != null && p.IsValid && p.PawnIsAlive)) - CreateShake(player); - } + //private static void MakeShake(CCSPlayerController player) + //{ + // foreach (var enemy in Utilities.GetPlayers().Where(p => p != null && p.IsValid && p.PawnIsAlive)) + // CreateShake(player); + //} - private static void CreateShake(CCSPlayerController player) - { - var pawn = player.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return; + //private static void CreateShake(CCSPlayerController player) + //{ + // var pawn = player.PlayerPawn.Value; + // if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return; - var shake = Utilities.CreateEntityByName("env_shake"); - if (shake == null) return; + // var shake = EntityManager.CreateTrackedEnvShake(player.Index); + // if (shake == null || !shake.IsValid) return; - shake.DispatchSpawn(); - if (!shake.IsValid) return; + // shake.Amplitude = SkillsInfo.GetValue(skillName, "amplitude"); + // shake.Frequency = SkillsInfo.GetValue(skillName, "frequency"); + // shake.Duration = SkillsInfo.GetValue(skillName, "duration"); + // shake.Radius = SkillsInfo.GetValue(skillName, "radius"); - shake.Amplitude = SkillsInfo.GetValue(skillName, "amplitude"); - shake.Frequency = SkillsInfo.GetValue(skillName, "frequency"); - shake.Duration = SkillsInfo.GetValue(skillName, "duration"); - shake.Radius = SkillsInfo.GetValue(skillName, "radius"); + // shake.Teleport(new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z)); + // shake.AcceptInput("SetParent", pawn, pawn, "!activator"); + // shake.AcceptInput("StartShake"); + //} - shake.Teleport(new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z)); - shake.AcceptInput("SetParent", pawn, pawn, "!activator"); - shake.AcceptInput("StartShake"); - } + //public class PlayerSkillInfo + //{ + // public ulong SteamID { get; set; } + // public bool CanUse { get; set; } + // public DateTime Cooldown { get; set; } + //} - public class PlayerSkillInfo - { - public ulong SteamID { get; set; } - public bool CanUse { get; set; } - public DateTime Cooldown { get; set; } - } - - public class SkillConfig(Skills skill = skillName, bool active = false, string color = "#42f59b", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float cooldown = 16f, float amplitude = 15f, float frequency = 500f, float duration = 8f, float radius = 50f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) - { - public float Cooldown { get; set; } = cooldown; - public float Amplitude { get; set; } = amplitude; - public float Frequency { get; set; } = frequency; - public float Duration { get; set; } = duration; - public float Radius { get; set; } = radius; - } + //public class SkillConfig(Skills skill = skillName, bool active = false, string color = "#42f59b", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float cooldown = 16f, float amplitude = 15f, float frequency = 500f, float duration = 8f, float radius = 50f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + //{ + // public float Cooldown { get; set; } = cooldown; + // public float Amplitude { get; set; } = amplitude; + // public float Frequency { get; set; } = frequency; + // public float Duration { get; set; } = duration; + // public float Radius { get; set; } = radius; + //} } } \ 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 06b79a7..f126a1b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs +++ b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs @@ -1,7 +1,6 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using static src.jRandomSkills; using System.Collections.Concurrent; using src.utils; @@ -10,7 +9,7 @@ namespace src.player.skills public class EnemySpawn : ISkill { private const Skills skillName = Skills.EnemySpawn; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; + private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -29,9 +28,9 @@ namespace src.player.skills if (SkillUtils.IsFreezeTime()) return; foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) UpdateHUD(player, skillInfo); } } @@ -39,9 +38,9 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { var cooldownBeforeUse = SkillsInfo.GetValue(skillName, "cooldownBeforeUse"); - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo + SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + SteamID = player.Index, CanUse = false, Cooldown = cooldownBeforeUse <= 0 ? DateTime.MinValue : Event.GetFreezeTimeEnd().AddSeconds(cooldownBeforeUse - SkillsInfo.GetValue(skillName, "cooldown")), }); @@ -49,7 +48,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + SkillPlayerInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } @@ -65,7 +64,7 @@ namespace src.player.skills skillInfo.CanUse = true; } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; if (cooldown == 0) @@ -79,9 +78,9 @@ namespace src.player.skills var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) { - if (!player.IsValid || !player.PawnIsAlive) return; + if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; if (skillInfo.CanUse) { skillInfo.CanUse = false; diff --git a/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs b/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs index 88f877f..1824f20 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -21,14 +21,14 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue(skillName, "ChanceTo") - SkillsInfo.GetValue(skillName, "ChanceFrom")) + SkillsInfo.GetValue(skillName, "ChanceFrom"); playerInfo.SkillChance = newChance; SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } private static void SpawnExplosion(Vector vector) @@ -64,12 +64,12 @@ namespace src.player.skills { if (lastTick == Server.TickCount) return; - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; var pos = new Vector(@event.X, @event.Y, @event.Z); - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) return; if (Instance.Random.NextDouble() <= playerInfo.SkillChance) diff --git a/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs b/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs index ba8bf02..f4528a2 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using System.Drawing; @@ -11,7 +11,7 @@ namespace src.player.skills public class FalconEye : ISkill { private const Skills skillName = Skills.FalconEye; - private static readonly ConcurrentDictionary cameras = []; + private static readonly ConcurrentDictionary cameras = []; public static void LoadSkill() { @@ -21,28 +21,23 @@ namespace src.player.skills public static void NewRound() { foreach (var cameraIndex in cameras.Values) - { - var camera = Utilities.GetEntityFromIndex((int)cameraIndex.Item2); - if (camera == null || !camera.IsValid) continue; - - camera.AcceptInput("Kill"); - } + EntityManager.DestroyEntity(cameraIndex.Item2); cameras.Clear(); } public static void WeaponPickup(EventItemPickup @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return ; var pawn = player!.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return; - if (cameras.TryGetValue(player!.SteamID, out var cameraInfo) && cameraInfo.Item1 == pawn.CameraServices.ViewEntity.Raw) + if (cameras.TryGetValue(player!.Index, out var cameraInfo) && cameraInfo.Item1 == pawn.CameraServices.ViewEntity.Raw) BlockWeapon(player, true); } @@ -55,13 +50,15 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { + if (player == null) return; ChangeCamera(player, true); + EntityManager.DestroyPlayerEntities(player.Index); } public static void OnTick() { foreach (var player in Utilities.GetPlayers()) - if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2 != 0) + if (cameras.TryGetValue(player.Index, out var cameraInfo) && cameraInfo.Item2 != 0) { var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue; @@ -88,7 +85,7 @@ namespace src.player.skills var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return; - if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2 != 0) + if (cameras.TryGetValue(player.Index, out var cameraInfo) && cameraInfo.Item2 != 0) { orginalCameraRaw = cameraInfo.Item1; @@ -114,7 +111,7 @@ namespace src.player.skills private static uint CreateCamera(CCSPlayerController player) { - var camera = Utilities.CreateEntityByName("prop_dynamic"); + var camera = EntityManager.CreateTrackedDynamicProp(player.Index); if (camera == null || !camera.IsValid) return 0; var pawn = player.PlayerPawn.Value; @@ -124,13 +121,14 @@ namespace src.player.skills Server.NextFrame(() => { if (camera == null || !camera.IsValid) return; + camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); camera.SetModel("models/sprays/spray_plane.vmdl"); camera.Render = Color.FromArgb(0, 255, 255, 255); camera.Teleport(pos, new QAngle(90, 0, 0)); camera.DispatchSpawn(); }); - cameras.AddOrUpdate(player.SteamID, (pawn.CameraServices!.ViewEntity.Raw, camera.Index), (k, v) => (pawn.CameraServices!.ViewEntity.Raw, camera.Index)); + cameras.AddOrUpdate(player.Index, (pawn.CameraServices!.ViewEntity.Raw, camera.Index), (k, v) => (pawn.CameraServices!.ViewEntity.Raw, camera.Index)); return camera.EntityHandle.Raw; } diff --git a/jRandomSkills - SRC Files/src/player/skills/FastReload.cs b/jRandomSkills - SRC Files/src/player/skills/FastReload.cs index b4c7603..176e5e7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FastReload.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FastReload.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -20,9 +20,9 @@ namespace src.player.skills var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; - if (!player.IsValid || !player.PawnIsAlive) return; + if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; InstaReload(playerPawn); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Flash.cs b/jRandomSkills - SRC Files/src/player/skills/Flash.cs index 71a807a..1957898 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Flash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Flash.cs @@ -11,7 +11,7 @@ namespace src.player.skills public class Flash : ISkill { private const Skills skillName = Skills.Flash; - public static readonly ConcurrentDictionary jumpedPlayers = []; + public static readonly ConcurrentDictionary jumpedPlayers = []; public static void LoadSkill() { @@ -34,7 +34,7 @@ namespace src.player.skills var player = Utilities.GetPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex); if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (player!.Buttons.HasFlag(PlayerButtons.Speed) || player.Buttons.HasFlag(PlayerButtons.Duck)) @@ -43,26 +43,26 @@ namespace src.player.skills public static void PlayerJump(EventPlayerJump @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - if (!jumpedPlayers.TryGetValue(player.SteamID, out _)) return; - jumpedPlayers.AddOrUpdate(player.SteamID, Server.TickCount + 20, (k, v) => Server.TickCount + 20); + if (!jumpedPlayers.TryGetValue(player.Index, out _)) return; + jumpedPlayers.AddOrUpdate(player.Index, Server.TickCount + 20, (k, v) => Server.TickCount + 20); } public static void EnableSkill(CCSPlayerController player) { var playerPawn = player.PlayerPawn.Value; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerPawn == null || playerInfo == null) return; float newSpeed = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue(skillName, "ChanceTo") - SkillsInfo.GetValue(skillName, "ChanceFrom")) + SkillsInfo.GetValue(skillName, "ChanceFrom"); newSpeed = (float)Math.Round(newSpeed, 2); playerInfo.SkillChance = newSpeed; - jumpedPlayers.TryAdd(player.SteamID, 0); + jumpedPlayers.TryAdd(player.Index, 0); playerPawn.VelocityModifier = newSpeed; SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newSpeed)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } public static void DisableSkill(CCSPlayerController player) @@ -70,7 +70,7 @@ namespace src.player.skills var playerPawn = player.PlayerPawn.Value; if (playerPawn == null) return; playerPawn.VelocityModifier = 1; - jumpedPlayers.TryRemove(player.SteamID, out _); + jumpedPlayers.TryRemove(player.Index, out _); } public static void OnTick() @@ -79,7 +79,7 @@ namespace src.player.skills { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) continue; var playerPawn = player.PlayerPawn?.Value; @@ -90,7 +90,7 @@ namespace src.player.skills if (buttons.HasFlag(PlayerButtons.Moveleft) || buttons.HasFlag(PlayerButtons.Moveright) || buttons.HasFlag(PlayerButtons.Forward) || buttons.HasFlag(PlayerButtons.Back)) playerPawn.VelocityModifier = newVelocity; - if (jumpedPlayers.TryGetValue(player.SteamID, out var time) && time > Server.TickCount) + if (jumpedPlayers.TryGetValue(player.Index, out var time) && time > Server.TickCount) continue; if (!((PlayerFlags)player.Flags).HasFlag(PlayerFlags.FL_ONGROUND)) diff --git a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs index b96a6b1..f405ae0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; @@ -11,8 +11,9 @@ namespace src.player.skills public class Fortnite : ISkill { private const Skills skillName = Skills.Fortnite; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; - private static readonly ConcurrentDictionary barricades = []; + private static readonly ConcurrentDictionary SkillPlayerInfo = []; + private static readonly ConcurrentDictionary barricades = []; + public static bool skillInThisRound = false; private static readonly object setLock = new(); public static void LoadSkill() @@ -23,6 +24,7 @@ namespace src.player.skills public static void NewRound() { + skillInThisRound = false; lock (setLock) { SkillPlayerInfo.Clear(); @@ -34,18 +36,19 @@ namespace src.player.skills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) UpdateHUD(player, skillInfo); } } public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo + skillInThisRound = true; + SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + SteamID = player.Index, CanUse = true, Cooldown = DateTime.MinValue, }); @@ -53,7 +56,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + SkillPlayerInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } @@ -69,7 +72,7 @@ namespace src.player.skills skillInfo.CanUse = true; } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; if (cooldown == 0) @@ -83,9 +86,10 @@ namespace src.player.skills var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) { - if (!player.IsValid || !player.PawnIsAlive) return; + if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + if (skillInfo.CanUse) { skillInfo.CanUse = false; @@ -98,7 +102,7 @@ namespace src.player.skills private static void CreateBox(CCSPlayerController player) { var playerPawn = player.PlayerPawn.Value; - var box = Utilities.CreateEntityByName("prop_dynamic_override"); + var box = EntityManager.CreateTrackedPropOverride(player.Index); if (box == null || playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null || playerPawn.AbsRotation == null) return; float distance = 50; @@ -140,12 +144,12 @@ namespace src.player.skills if (newHealth <= 0) { barricades.TryRemove(box.Index, out _); - box.AcceptInput("Kill"); + EntityManager.DestroyEntity(box.Index); } else barricades.AddOrUpdate(box.Index, newHealth, (k, v) => newHealth); } - else box.AcceptInput("Kill"); + else EntityManager.DestroyEntity(box.Index); } public class PlayerSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs b/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs index 434797f..8a8a4e6 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -40,7 +40,7 @@ namespace src.player.skills plantedC4 = null; var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); if (plantedBomb != null && plantedBomb.IsValid) - plantedBomb.AcceptInput("Kill"); + plantedBomb.AddEntityIOEvent("Kill", plantedBomb, delay: 0.1f); SkillUtils.TerminateRound(CsTeam.CounterTerrorist); } @@ -48,12 +48,12 @@ namespace src.player.skills { if (lastTick == Server.TickCount) return; - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid || plantedC4 == null) return; var pos = new Vector(@event.X, @event.Y, @event.Z); - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) return; if (SkillUtils.Distance(plantedC4, pos) >= 8) diff --git a/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs b/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs index 4acd791..2e2481e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs @@ -1,6 +1,5 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using static src.jRandomSkills; @@ -20,15 +19,14 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { var damage = @event.DmgHealth; - var victim = @event.Userid; - var attacker = @event.Attacker; + var victim = PlayerManager.GetPlayerEvent(@event.Userid); + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); var weapon = @event.Weapon; - HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup; if (nades.Contains(weapon)) return; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (playerInfo?.Skill != skillName || attacker!.Team != victim!.Team) return; Server.ExecuteCommand("mp_autokick 0"); diff --git a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs index a9bc602..1a07aa9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs @@ -1,10 +1,9 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; -using static src.jRandomSkills; namespace src.player.skills { @@ -25,10 +24,10 @@ namespace src.player.skills public static void DecoyStarted(EventDecoyStarted @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; decoys.TryAdd(new Vector(@event.X, @event.Y, @event.Z), 0); @@ -36,10 +35,10 @@ namespace src.player.skills public static void DecoyDetonate(EventDecoyDetonate @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; foreach (var decoy in decoys.Keys.Where(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z)) @@ -49,11 +48,16 @@ namespace src.player.skills public static void OnTick() { foreach (Vector decoyPos in decoys.Keys) - foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid && p.PawnIsAlive && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) + foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) { + var eventPlayer = PlayerManager.GetPlayerEvent(player); + if (eventPlayer == null || !eventPlayer.IsValid) continue; + var decoyRadius = SkillsInfo.GetValue(skillName, "triggerRadius"); - var pawn = player.PlayerPawn.Value; + + var pawn = eventPlayer.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue; + double distance = SkillUtils.GetDistance(decoyPos, pawn.AbsOrigin); if (distance <= decoyRadius) { diff --git a/jRandomSkills - SRC Files/src/player/skills/Gambler.cs b/jRandomSkills - SRC Files/src/player/skills/Gambler.cs index 1c067e7..ac48132 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Gambler.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Gambler.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using static src.jRandomSkills; @@ -24,11 +24,11 @@ namespace src.player.skills 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); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; - ulong steamID = player.SteamID; + uint playerIndex = player.Index; if (playerInfo.SkillUsed) { @@ -58,15 +58,16 @@ namespace src.player.skills if (SkillsInfo.GetValue(skill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) Instance?.AddTimer(Math.Max((float)(Event.GetFreezeTimeEnd() - DateTime.Now).TotalSeconds, 0), () => { - var player = Utilities.GetPlayerFromSteamId(steamID); + var player = Utilities.GetPlayerFromIndex((int)playerIndex); if (player == null || !player.IsValid) return; - if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == steamID && p.Skill == skill.Skill) == null) return; + var pi = PlayerManager.GetPlayerByIndex(playerIndex); + if (pi == null || pi.Skill != skill.Skill) return; Instance?.SkillAction(skill.Skill.ToString(), "EnableSkill", [player]); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); else Instance?.SkillAction(skill.Skill.ToString(), "EnableSkill", [player]); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } private static bool TakeMoney(CCSPlayerController player) @@ -86,7 +87,7 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SkillUsed = false; @@ -107,13 +108,13 @@ namespace src.player.skills private static List GetSkills(CCSPlayerController player) { - var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var skillPlayer = PlayerManager.GetPlayerByIndex(player!.Index); if (skillPlayer == null) return [Event.noneSkill]; List skillList = [.. SkillData.Skills]; skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None); - if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).Count == 1) + if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsHLTV && p.Team != CsTeam.Spectator).Count == 1) { SkillsInfo.DefaultSkillInfo[] skillsNeedsTeammates = SkillsInfo.LoadedConfig.Where(s => s.NeedsTeammates).ToArray(); skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString())); diff --git a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs index c4ac52c..6bbbc05 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs @@ -5,6 +5,7 @@ using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; using System.Collections.Immutable; +using System.Drawing; using static src.jRandomSkills; namespace src.player.skills @@ -26,11 +27,13 @@ namespace src.player.skills ]; private static readonly ConcurrentDictionary invisiblePlayers = []; private const string bloodParticle = "particles/blood_impact/blood_impact_high.vpcf"; + private const string cameraViewModel = "models/sprays/spray_plane.vmdl"; public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); Instance.AddToManifest(bloodParticle); + Instance.AddToManifest(cameraViewModel); } public static void NewRound() @@ -42,9 +45,9 @@ namespace src.player.skills public static void WeaponPickup(EventItemPickup @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; SetWeaponAttack(player!, true); @@ -52,9 +55,9 @@ namespace src.player.skills public static void WeaponEquip(EventItemEquip @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; SetWeaponAttack(player!, true); @@ -64,7 +67,7 @@ namespace src.player.skills { foreach (var (info, player) in infoList) { - if (player == null || !player.IsValid) continue; + if (player == null || !player.IsValid || player.Team == CsTeam.Spectator) continue; var targetHandle = player.Pawn.Value?.ObserverServices?.ObserverTarget.Value?.Handle ?? nint.Zero; bool isObservingGhost = false; @@ -72,14 +75,17 @@ namespace src.player.skills if (targetHandle != nint.Zero) { var target = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == targetHandle); - var targetInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == target?.SteamID); + var targetInfo = PlayerManager.GetPlayerByIndex(target?.Index); if (targetInfo?.Skill == skillName) isObservingGhost = true; } foreach (var playerIndex in invisiblePlayers.Keys) { var playerController = Utilities.GetPlayerFromIndex((int)playerIndex); - if (playerController == null || !playerController.IsValid || playerController.SteamID == player.SteamID) + if (playerController == null || !playerController.IsValid || playerController.Index == player.Index) + continue; + + if (player.Team == playerController.Team) continue; if (!isObservingGhost) @@ -108,48 +114,92 @@ namespace src.player.skills { Event.EnableTransmit(); SetWeaponAttack(player, true); + SkillUtils.SetPlayerInvisibility(player, .5f); invisiblePlayers.TryAdd(player.Index, 0); + + if (EntityManager.GetPlayerEntities(player.Index, "empty_prop").Count == 0) + CreatePlayerPosProp(player); + } + + private static void CreatePlayerPosProp(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + var emptyProp = EntityManager.CreateTrackedDynamicProp(player.Index); + if (emptyProp == null || !emptyProp.IsValid) return; + + var playerPawn = player.PlayerPawn?.Value; + if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null || playerPawn.AbsRotation == null) return; + + emptyProp.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(emptyProp.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); + emptyProp.SetModel(cameraViewModel); + emptyProp.Render = Color.FromArgb(1, 255, 255, 255); + + Vector newPos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + 30); + QAngle newAngle = new(playerPawn.AbsRotation.X, playerPawn.AbsRotation.Y, playerPawn.AbsRotation.Z); + + emptyProp.Teleport(newPos, newAngle); + emptyProp.DispatchSpawn(); + + Utilities.SetStateChanged(emptyProp, "CBaseEntity", "m_CBodyComponent"); + + EntityManager.RegisterExisting(emptyProp, player.Index, "empty_prop"); } public static void DisableSkill(CCSPlayerController player) { SkillUtils.ResetPrintHTML(player); SetWeaponAttack(player, false); + SkillUtils.SetPlayerInvisibility(player, 0); + invisiblePlayers.TryRemove(player.Index, out _); + EntityManager.DestroyPlayerEntities(player.Index); } public static void OnTick() { + if (Server.TickCount % 2 != 0) return; + foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) UpdateHUD(player); - if (!player.PawnIsAlive) + if (player.LifeState != (byte)LifeState_t.LIFE_ALIVE) invisiblePlayers.TryRemove(player.Index, out _); + + if (!invisiblePlayers.ContainsKey(player.Index)) continue; + + var props = EntityManager.GetPlayerEntities(player.Index, "empty_prop"); + if (props.Count == 0) continue; + + var prop = Utilities.GetEntityFromIndex((int)props[0]); + if (prop == null || !prop.IsValid) continue; + + var pawn = player.PlayerPawn?.Value; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue; + + Vector newPos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + 30); + QAngle newAngle = new(0, pawn.V_angle.Y, 0); + prop.Teleport(newPos, newAngle, null); } } public static void PlayerHurt(EventPlayerHurt @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; if (!invisiblePlayers.ContainsKey(player.Index)) return; var playerPawn = player.PlayerPawn.Value; if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null) return; - CParticleSystem particle = Utilities.CreateEntityByName("info_particle_system")!; + var particle = EntityManager.CreateTrackedParticleSystem(player.Index, bloodParticle, autoDestroySeconds: 3f); if (particle == null) return; - particle.EffectName = bloodParticle; - particle.StartActive = true; - Vector pos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + 50); particle.Teleport(pos); - particle.DispatchSpawn(); - particle.AcceptInput("Start"); } @@ -177,7 +227,7 @@ namespace src.player.skills var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; var weapon = pawn.WeaponServices.ActiveWeapon.Value; diff --git a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs index fadc0c5..f6bb458 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Entities.Constants; @@ -41,10 +41,10 @@ namespace src.player.skills foreach (var (info, player) in infoList) { if (player == null) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); 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 = observedPlayer != null ? PlayerManager.GetPlayerByIndex(observedPlayer.Index) : null; if (playerInfo?.Skill != skillName && observerInfo?.Skill != skillName) continue; foreach (var entityIndex in smokes.Keys) diff --git a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs index e95be07..912e13e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs @@ -1,16 +1,17 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Commands.Targeting; using CounterStrikeSharp.API.Modules.Utils; -using static src.jRandomSkills; -using System.Collections.Concurrent; using src.utils; +using System.Collections.Concurrent; namespace src.player.skills { public class Glitch : ISkill { private const Skills skillName = Skills.Glitch; - private static readonly ConcurrentDictionary glitchedPlayers = []; + private static readonly ConcurrentDictionary glitchedPlayers = []; + private static readonly ConcurrentDictionary playersToTarget = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -21,30 +22,28 @@ namespace src.player.skills public static void NewRound() { lock (setLock) - glitchedPlayers.Clear(); - foreach (var player in Utilities.GetPlayers()) { - DisableSkill(player); - SkillUtils.CloseMenu(player); + foreach (var player in Utilities.GetPlayers()) + { + DisableSkill(player); + SkillUtils.CloseMenu(player); + } + + glitchedPlayers.Clear(); + playersToTarget.Clear(); } } - public static void PlayerDeath(EventPlayerDeath @event) - { - var player = @event.Userid; - if (player == null) return; - DisableSkill(player); - } public static void OnTick() { if (Server.TickCount % 32 != 0) return; foreach (var player in Utilities.GetPlayers()) { if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); SkillUtils.UpdateMenu(player, menuItems); @@ -53,8 +52,8 @@ namespace src.player.skills 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); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillUsed) @@ -64,7 +63,8 @@ namespace src.player.skills } string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); + if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) { @@ -72,20 +72,23 @@ namespace src.player.skills return; } - glitchedPlayers.TryAdd(enemy, 0); + glitchedPlayers.TryAdd(enemy.Index, 0); + playersToTarget[player.Index] = enemy.Index; + enemy.ReplicateConVar("sv_disable_radar", "1"); playerInfo.SkillUsed = true; + player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("glitch_player_info", enemy.PlayerName)); enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("glitch_enemy_info")); } public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SkillUsed = false; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); @@ -97,8 +100,24 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { + if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) + { + var target = Utilities.GetPlayerFromIndex((int)targetIndex); + if (target != null && target.IsValid) + target.ReplicateConVar("sv_disable_radar", "0"); + glitchedPlayers.TryRemove(targetIndex, out _); + } + + SkillUtils.CloseMenu(player); + } + + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + player.ReplicateConVar("sv_disable_radar", "0"); - glitchedPlayers.TryRemove(player, out _); + glitchedPlayers.TryRemove(player.Index, out _); SkillUtils.CloseMenu(player); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Glue.cs b/jRandomSkills - SRC Files/src/player/skills/Glue.cs index e2589df..52c8268 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glue.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glue.cs @@ -1,7 +1,6 @@ -using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; -using static src.jRandomSkills; namespace src.player.skills { @@ -29,7 +28,7 @@ namespace src.player.skills var player = pawn.Controller.Value.As(); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo?.Skill != skillName) return; grenade.Bounces = 555; } diff --git a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs index 775fa4c..05cc683 100644 --- a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs +++ b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs @@ -1,6 +1,5 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; @@ -11,7 +10,7 @@ namespace src.player.skills public class GodMode : ISkill { private const Skills skillName = Skills.GodMode; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; + private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -27,9 +26,9 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo + SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + SteamID = player.Index, CanUse = true, Cooldown = DateTime.MinValue, }); @@ -39,16 +38,16 @@ namespace src.player.skills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) UpdateHUD(player, skillInfo); } } public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + SkillPlayerInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); var playerPawn = player.PlayerPawn.Value; @@ -68,7 +67,7 @@ namespace src.player.skills skillInfo.CanUse = true; } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; if (cooldown == 0) @@ -82,29 +81,29 @@ namespace src.player.skills var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - ulong steamID = player.SteamID; + uint playerIndex = player.Index; - if (SkillPlayerInfo.TryGetValue(steamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(playerIndex, out var skillInfo)) { - if (!player.IsValid || !player.PawnIsAlive || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; + if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; if (skillInfo.CanUse) { skillInfo.CanUse = false; skillInfo.Cooldown = DateTime.Now; - player.PrintToChat($" {ChatColors.Green} {player.GetTranslation("godmode_on")}"); + PlayerManager.GetPlayerFromEvent(player)?.PrintToChat($" {ChatColors.Green} {player.GetTranslation("godmode_on")}"); player.PlayerPawn.Value.TakesDamage = false; Instance.AddTimer(SkillsInfo.GetValue(skillName, "duration"), () => { - - var player = Utilities.GetPlayerFromSteamId(steamID); - if (player != null && player.IsValid && player.PawnIsAlive) + var player = Utilities.GetPlayerFromIndex((int)playerIndex); + if (player != null && player.IsValid) { if (player.PlayerPawn == null || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; + player.PlayerPawn.Value.TakesDamage = true; - player.PrintToChat($" {ChatColors.Red} {player.GetTranslation("godmode_off")}"); + PlayerManager.GetPlayerFromEvent(player)?.PrintToChat($" {ChatColors.Red} {player.GetTranslation("godmode_off")}"); } - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Grenadier.cs b/jRandomSkills - SRC Files/src/player/skills/Grenadier.cs index c866a6d..85d649c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Grenadier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Grenadier.cs @@ -24,11 +24,11 @@ namespace src.player.skills public static void GrenadeThrown(EventGrenadeThrown @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); var weapon = @event.Weapon; if (weapon != "hegrenade" || !Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) player!.GiveNamedItem($"weapon_{weapon}"); } diff --git a/jRandomSkills - SRC Files/src/player/skills/HealingChicken.cs b/jRandomSkills - SRC Files/src/player/skills/HealingChicken.cs index 84ef9dd..72337ec 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HealingChicken.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HealingChicken.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Timers; @@ -13,72 +13,70 @@ namespace src.player.skills { public class HealingChicken : ISkill { - private const Skills skillName = Skills.HealingChicken; - private readonly static ConcurrentDictionary> playerSmokes = []; - private static readonly object setLock = new(); + //private const Skills skillName = Skills.HealingChicken; + //private readonly static ConcurrentDictionary> playerSmokes = []; + //private static readonly object setLock = new(); - public static void LoadSkill() - { - // SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); - } + //public static void LoadSkill() + //{ + // SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); + //} - public static void NewRound() - { + //public static void NewRound() + //{ - } + //} - public static void EnableSkill(CCSPlayerController player) - { - SpawnChicken(player); - } + //public static void EnableSkill(CCSPlayerController player) + //{ + // SpawnChicken(player); + //} - public static void DisableSkill(CCSPlayerController player) - { + //public static void DisableSkill(CCSPlayerController player) + //{ - } + //} - private static void SpawnChicken(CCSPlayerController player) - { - if (player == null || !player.IsValid) return; + //private static void SpawnChicken(CCSPlayerController player) + //{ + // if (player == null || !player.IsValid) return; - var pawn = player.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return; + // var pawn = player.PlayerPawn.Value; + // if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return; - int amount = SkillsInfo.GetValue(skillName, "amount"); - for (int i = 0; i < 1; i++) - { - CChicken? chicken = Utilities.CreateEntityByName("chicken"); - if (chicken == null || !chicken.IsValid) continue; + // int amount = SkillsInfo.GetValue(skillName, "amount"); + // for (int i = 0; i < 1; i++) + // { + // CChicken? chicken = EntityManager.CreateTrackedChicken(player.Index); + // if (chicken == null || !chicken.IsValid) continue; - chicken.Render = Color.Green; - Vector offset = new ( - (float)(100 * Math.Cos(2 * Math.PI * i / amount)), - (float)(100 * Math.Sin(2 * Math.PI * i / amount)), - 0 - ); + // chicken.Render = Color.Green; + // Vector offset = new ( + // (float)(100 * Math.Cos(2 * Math.PI * i / amount)), + // (float)(100 * Math.Sin(2 * Math.PI * i / amount)), + // 0 + // ); - chicken.DispatchSpawn(); - chicken.Teleport(pawn.AbsOrigin + offset); + // chicken.Teleport(pawn.AbsOrigin + offset); - // Schema.SetSchemaValue(chicken.Handle, "CChicken", "m_leader", player.PlayerPawn.Raw); - Vector spawn = SkillUtils.GetSpawnPointVector(player); - Schema.SetSchemaValue(chicken.Handle, "CChicken", "m_vecPathGoal", spawn); + // // Schema.SetSchemaValue(chicken.Handle, "CChicken", "m_leader", player.PlayerPawn.Raw); + // Vector? spawn = SkillUtils.GetSpawnPointVector(player); + // Schema.SetSchemaValue(chicken.Handle, "CChicken", "m_vecPathGoal", spawn); - float speed = 50; - Instance.AddTickTimer(1, () => - { - if (chicken == null || !chicken.IsValid) return; + // Instance.AddTickTimer(1, () => + // { + // if (chicken == null || !chicken.IsValid) return; - Server.PrintToChatAll($"{chicken.PathGoal}, {chicken.UpdateTimer.Duration}, {chicken.UpdateTimer.Timescale}"); - }, TimerFlags.REPEAT | TimerFlags.STOP_ON_MAPCHANGE); - } - } + // Server.PrintToChatAll($"{chicken.PathGoal}, {chicken.UpdateTimer.Duration}, {chicken.UpdateTimer.Timescale}"); + // }, TimerFlags.REPEAT | TimerFlags.STOP_ON_MAPCHANGE); + // } + //} - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#b5ab8f", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, int amount = 3, int heal = 2, int tickCooldown = 16) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) - { - public int Amount { get; set; } = amount; - public int Heal { get; set; } = heal; - public int TickCooldown { get; set; } = tickCooldown; - } + //public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#b5ab8f", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, int amount = 3, int heal = 2, int tickCooldown = 16) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + //{ + // public int Amount { get; set; } = amount; + // public int Heal { get; set; } = heal; + // public int TickCooldown { get; set; } = tickCooldown; + //} } } \ 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 5642387..9f19cb7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs @@ -1,10 +1,9 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; -using static src.jRandomSkills; namespace src.player.skills { @@ -25,10 +24,10 @@ namespace src.player.skills public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; smokes.TryAdd(new Vector(@event.X, @event.Y, @event.Z), 0); @@ -36,10 +35,10 @@ namespace src.player.skills public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; foreach (var smoke in smokes.Keys.Where(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z)) @@ -60,7 +59,7 @@ namespace src.player.skills var player = pawn.Controller.Value.As(); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo?.Skill != skillName) return; Server.NextFrame(() => @@ -82,13 +81,17 @@ namespace src.player.skills int smokeHeal = SkillsInfo.GetValue(skillName, "smokeHeal"); foreach (Vector smokePos in smokes.Keys) - foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid && p.PawnIsAlive)) + foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid)) { - var pawn = player.PlayerPawn.Value; + var eventPlayer = PlayerManager.GetPlayerEvent(player); + if (eventPlayer == null || !eventPlayer.IsValid) continue; + + var pawn = eventPlayer.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue; if (SkillUtils.GetDistance(smokePos, pawn.AbsOrigin) <= smokeRadius) - AddHealth(pawn, smokeHeal); + if (SkillUtils.AddHealth(pawn, smokeHeal)) + player.EmitSound("Healthshot.Success"); } } @@ -97,18 +100,6 @@ namespace src.player.skills SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); } - private static void AddHealth(CCSPlayerPawn player, int health) - { - if (player.LifeState != (byte)LifeState_t.LIFE_ALIVE) - return; - - if (player.Health != player.MaxHealth) - player.EmitSound("Healthshot.Success"); - - player.Health = Math.Min(player.Health + health, player.MaxHealth); - Utilities.SetStateChanged(player, "CBaseEntity", "m_iHealth"); - } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#1fe070", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, int smokeHeal = 1, float smokeRadius = 180, int tickCooldown = 16) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public int SmokeHeal { get; set; } = smokeHeal; diff --git a/jRandomSkills - SRC Files/src/player/skills/Hermit.cs b/jRandomSkills - SRC Files/src/player/skills/Hermit.cs index 1033c5b..c225c22 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Hermit.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Hermit.cs @@ -31,10 +31,10 @@ namespace src.player.skills public static void PlayerDeath(EventPlayerDeath @event) { - var attacker = @event.Attacker; + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); if (!Instance.IsPlayerValid(attacker)) return; - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var attackerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (attackerInfo?.Skill != skillName) return; var pawn = attacker!.PlayerPawn.Value; diff --git a/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs b/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs index d82d848..6d8f2e6 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; @@ -32,7 +32,7 @@ namespace src.player.skills 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); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; hegrenade.Damage *= SkillsInfo.GetValue(skillName, "damageMultiplier"); diff --git a/jRandomSkills - SRC Files/src/player/skills/HomingNades.cs b/jRandomSkills - SRC Files/src/player/skills/HomingNades.cs index 9d5275f..f8d1093 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HomingNades.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HomingNades.cs @@ -1,10 +1,9 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; -using static src.jRandomSkills; namespace src.player.skills { @@ -41,13 +40,13 @@ namespace src.player.skills Vector currentPos = new(nade.AbsOrigin.X, nade.AbsOrigin.Y, nade.AbsOrigin.Z); double distanceMoved = SkillUtils.GetDistance(currentPos, oldPos); - Vector calculatedVelocity = CalculateVelocity(nade, nade.TeamNum); + Vector? calculatedVelocity = CalculateVelocity(nade, nade.TeamNum); - bool isZero = calculatedVelocity.IsZero(); + bool isZero = calculatedVelocity?.IsZero() == true; - if (distanceMoved < 4 || isZero) + if (distanceMoved < 4 || calculatedVelocity == null || isZero) { - nade.DetonateTime = isZero ? 0 : nade.CreateTime + 3; + nade.DetonateTime = isZero ? 0f : nade.CreateTime + 1.5f; Utilities.SetStateChanged(nade, "CBaseGrenade", "m_flDetonateTime"); nades.TryRemove(index, out _); @@ -67,9 +66,9 @@ namespace src.player.skills } } - private static Vector CalculateVelocity(CBaseCSGrenadeProjectile nade, int team) + private static Vector? CalculateVelocity(CBaseCSGrenadeProjectile nade, int team) { - if (nade.AbsOrigin == null) return Vector.Zero; + if (nade.AbsOrigin == null) return null; Vector? closetEnemyPos = null; double minDistance = int.MaxValue; @@ -95,7 +94,7 @@ namespace src.player.skills } if (closetEnemyPos == null) - return Vector.Zero; + return null; Vector direction = closetEnemyPos - nadePos; float length = direction.Length(); @@ -127,7 +126,7 @@ namespace src.player.skills if (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); + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo?.Skill != skillName) return; Vector pos = new(grenade.AbsOrigin?.X, grenade.AbsOrigin?.Y, grenade.AbsOrigin?.Z); @@ -136,7 +135,7 @@ namespace src.player.skills Server.NextWorldUpdate(() => { if (grenade == null || !grenade.IsValid) return; - grenade.DetonateTime += 100f; + grenade.DetonateTime += 30f; Utilities.SetStateChanged(grenade, "CBaseGrenade", "m_flDetonateTime"); }); } diff --git a/jRandomSkills - SRC Files/src/player/skills/HotBomb.cs b/jRandomSkills - SRC Files/src/player/skills/HotBomb.cs index 07c1359..41ee1ff 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HotBomb.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HotBomb.cs @@ -27,7 +27,10 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid && p.Team == CsTeam.Terrorist && p.PawnIsAlive)) { - var pawn = player.PlayerPawn.Value; + var playerEvent = PlayerManager.GetPlayerEvent(player); + if (playerEvent == null || !playerEvent.IsValid) continue; + + var pawn = playerEvent.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) continue; bool hasC4 = pawn.WeaponServices.MyWeapons.Any(w => w.Value?.DesignerName == "weapon_c4"); @@ -40,7 +43,7 @@ namespace src.player.skills public static void WeaponPickup(EventItemPickup @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; var weapon = @event.Item; @@ -66,7 +69,7 @@ namespace src.player.skills public static void PlayerDeath(EventPlayerDeath @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; players.TryRemove(player.Index, out _); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Iana.cs b/jRandomSkills - SRC Files/src/player/skills/Iana.cs index b4b9be7..aa1805a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Iana.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Iana.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Timers; @@ -25,14 +25,16 @@ namespace src.player.skills { foreach (var playerSkill in playersInfo.Values) KillClone(playerSkill); + lock (setLock) playersInfo.Clear(); } public static void WeaponPickup(EventItemPickup @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null) return; + if (playersInfo.TryGetValue(player.Index, out var playerSkill)) if (playerSkill.CloneProp != null) BlockWeapon(player, true); @@ -40,8 +42,9 @@ namespace src.player.skills public static void WeaponEquip(EventItemEquip @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null) return; + if (playersInfo.TryGetValue(player.Index, out var playerSkill)) if (playerSkill.CloneProp != null) BlockWeapon(player, true); @@ -77,9 +80,11 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { + if (player == null) return; if (playersInfo.TryGetValue(player.Index, out var playerSkill)) KillClone(playerSkill); playersInfo.TryRemove(player.Index, out _); + EntityManager.DestroyPlayerEntities(player.Index); } private static void UpdateWeapons(CCSPlayerController player, PlayerSkill playerSkill) @@ -119,12 +124,16 @@ namespace src.player.skills playerPawn.Teleport(pos); }); } - cloneProp.AcceptInput("Kill"); + EntityManager.DestroyEntity(cloneProp.Index); playerSkill.CloneProp = null; } - SkillUtils.ApplyScreenColor(player, 0, 0, 0, 0, 10, 0, 2); + var eventTarget = PlayerManager.GetPlayerFromEvent(player); + if (eventTarget != null && eventTarget.IsValid) + SkillUtils.ApplyScreenColor(eventTarget, 0, 0, 0, 0, 10, 0, 2); + SkillUtils.SetPlayerCollisions(player, true); + BlockWeapon(player, false); playerSkill.NextUse = Server.TickCount + SkillsInfo.GetValue(skillName, "Cooldown") * 64; playerSkill.UseTime = 0; @@ -164,12 +173,12 @@ namespace src.player.skills } } - var clone = Utilities.CreateEntityByName("prop_dynamic"); + var clone = EntityManager.CreateTrackedDynamicProp(player.Index); if (clone == null || !clone.IsValid) return null; clone.Collision.SolidType = SolidType_t.SOLID_VPHYSICS; clone.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(clone.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); - clone.Entity!.Name = clone.Globalname = $"IanaClone_{Server.TickCount}_{player.SteamID}"; + clone.Entity!.Name = clone.Globalname = $"IanaClone_{Server.TickCount}_{player.Index}"; clone.DispatchSpawn(); Server.NextFrame(() => @@ -183,7 +192,11 @@ namespace src.player.skills clone.Teleport(playerPawn.AbsOrigin, new QAngle(0, playerPawn.V_angle.Y, 0)); playerPawn.Teleport(pos); - SkillUtils.ApplyScreenColor(player, r: 255, g: 255, b: 0, a: 20, duration: 100, holdTime: 1020); + + var eventTarget = PlayerManager.GetPlayerFromEvent(player); + if (eventTarget != null && eventTarget.IsValid) + SkillUtils.ApplyScreenColor(eventTarget, r: 255, g: 255, b: 0, a: 20, duration: 100, holdTime: 1020); + BlockWeapon(player, true); playerSkill.UseTime = Server.TickCount; @@ -194,16 +207,15 @@ namespace src.player.skills { if (playerSkill.CloneProp != null) KillClone(playerSkill); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); - ulong? playerSteamID = player?.SteamID; - if (playerSteamID == null) return; + uint playerIndex = player.Index; Timer? cloneTimer = null; cloneTimer = jRandomSkills.Instance.AddTimer(2f, () => { - var target = Utilities.GetPlayers().FirstOrDefault(p => p.IsValid && p.SteamID == playerSteamID); - if (target == null || !target.IsValid || !target.PawnIsAlive) + var target = Utilities.GetPlayerFromIndex((int)playerIndex); + if (target == null || !target.IsValid || target.LifeState != (byte)LifeState_t.LIFE_ALIVE) { cloneTimer?.Kill(); return; @@ -215,7 +227,14 @@ namespace src.player.skills return; } - SkillUtils.ApplyScreenColor(target, r: 255, g: 255, b: 0, a: 20, duration: 100, holdTime: 1020); + var eventTarget = PlayerManager.GetPlayerFromEvent(player); + if (eventTarget == null || !eventTarget.IsValid) + { + cloneTimer?.Kill(); + return; + } + + SkillUtils.ApplyScreenColor(eventTarget, r: 255, g: 255, b: 0, a: 20, duration: 100, holdTime: 1020); }, TimerFlags.STOP_ON_MAPCHANGE | TimerFlags.REPEAT); }); @@ -247,14 +266,18 @@ namespace src.player.skills float penetration = vdata.ArmorRatio * .5f; + var eventPlayer = PlayerManager.GetPlayerFromEvent(player); + if (eventPlayer == null || !eventPlayer.IsValid) + return calculatedDamage; + if (isHeadshot) { calculatedDamage *= vdata.HeadshotMultiplier; - if (player.PawnHasHelmet) + if (eventPlayer.PawnHasHelmet) calculatedDamage *= penetration; } else - if (player.PawnArmor > 0) + if (eventPlayer.PawnArmor > 0) calculatedDamage *= penetration; return calculatedDamage; @@ -272,11 +295,11 @@ namespace src.player.skills if (!param.Entity.Name.StartsWith("IanaClone_")) return; var nameParams = param.Entity.Name.Split('_')[2]; - _ = ulong.TryParse(nameParams, out ulong steamID); - if (steamID == 0) return; + _ = uint.TryParse(nameParams, out uint userIndex); + if (userIndex == 0) return; - var player = Utilities.GetPlayerFromSteamId(steamID); - if (player == null) return; + var player = Utilities.GetPlayerFromIndex((int)userIndex); + if (player == null || !player.IsValid) return; float dealDamage = param2.Damage; @@ -314,8 +337,8 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var victim = @event.Userid!; - if (!jRandomSkills.Instance.IsPlayerValid(victim)) return; + var victim = PlayerManager.GetPlayerEvent(@event.Userid); + if (victim == null || !victim.IsValid) return; if (playersInfo.TryGetValue(victim.Index, out var playerSkill) && playerSkill.CloneProp != null) { @@ -356,7 +379,7 @@ namespace src.player.skills float time2 = SkillsInfo.GetValue(skillName, "Duration") - (Server.TickCount - playerSkill.UseTime) / 64; duration = (int)Math.Ceiling(Math.Max(time2, 0)); - var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; if (playerSkill.InfoTime + (64 * 2) > Server.TickCount) @@ -374,7 +397,7 @@ namespace src.player.skills string weaponName = vdata.Name; if (string.IsNullOrEmpty(weaponName)) return false; - var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return false; if (playersInfo.TryGetValue(player.Index, out var playerSkill)) diff --git a/jRandomSkills - SRC Files/src/player/skills/Illiterate.cs b/jRandomSkills - SRC Files/src/player/skills/Illiterate.cs index 32ec688..dcde9b7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Illiterate.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Illiterate.cs @@ -10,6 +10,7 @@ namespace src.player.skills private const Skills skillName = Skills.Illiterate; private static bool isActive = false; private static int offset = 5; + private static int lastChange = 0; private static readonly object offsetLock = new(); public static void LoadSkill() @@ -28,7 +29,7 @@ namespace src.player.skills } } - public static void EnableSkill(CCSPlayerController player) + public static void EnableSkill(CCSPlayerController _) { isActive = true; } @@ -48,24 +49,28 @@ namespace src.player.skills if (!isActive || player == null || !player.IsValid) return false; if (player.Team == CsTeam.Spectator) return false; - var playersWithSkill = jRandomSkills.Instance.SkillPlayer.Where(p => p.Skill == skillName).Select(p => p.SteamID).ToHashSet(); + var playersWithSkill = jRandomSkills.Instance.SkillPlayer.Where(p => p.Skill == skillName).Select(p => p.PlayerIndex).ToHashSet(); if (playersWithSkill.Count == 0) return false; return Utilities.GetPlayers().Any( p => p != null && p.IsValid && p.Pawn?.Value != null && - p.PawnIsAlive && + p.PlayerPawn?.Value != null && + p.PlayerPawn.Value.Health > 0 && p.Team != player.Team && - playersWithSkill.Contains(p.SteamID)); + playersWithSkill.Contains(p.Index)); } public static string? GetRandomText(string? input) { if (string.IsNullOrEmpty(input)) return null; - if (Server.TickCount % 64 == 0 || offset == 0) + if (Server.TickCount - lastChange > 64 || offset == 0) + { EnsureOffset(); + lastChange = Server.TickCount; + } var chars = input.Select(c => { @@ -84,7 +89,6 @@ namespace src.player.skills { lock (offsetLock) { - if (offset != 0) return; try { offset = jRandomSkills.Instance?.Random?.Next(1, 26) ?? new Random().Next(1, 26); diff --git a/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs b/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs index 6d0f496..c0cae21 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; @@ -13,7 +13,7 @@ namespace src.player.skills public class Illusionist : ISkill { private const Skills skillName = Skills.Illusionist; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; + private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly ConcurrentDictionary ActiveTimers = []; private static readonly object setLock = new(); @@ -37,27 +37,27 @@ namespace src.player.skills var entities = Utilities.FindAllEntitiesByDesignerName("prop_dynamic_override"); foreach (var entity in entities) if (entity != null && entity.IsValid && entity.Entity != null && !string.IsNullOrEmpty(entity.Entity.Name) && (entity.Entity.Name?.StartsWith("Illusionist_") ?? false)) - entity.AcceptInput("Kill"); + EntityManager.DestroyEntity(entity.Index); } public static void OnTick() { foreach (var player in Utilities.GetPlayers()) { - if (player == null || !player.IsValid || player.IsBot) continue; + if (player == null || !player.IsValid ) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) UpdateHUD(player, skillInfo); } } public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo + SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + SteamID = player.Index, CanUse = true, Cooldown = DateTime.MinValue, }); @@ -65,7 +65,9 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + if (player == null) return; + SkillPlayerInfo.TryRemove(player.Index, out _); + EntityManager.DestroyPlayerEntities(player.Index); SkillUtils.ResetPrintHTML(player); } @@ -81,7 +83,7 @@ namespace src.player.skills skillInfo.CanUse = true; } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; if (cooldown == 0) @@ -92,9 +94,9 @@ namespace src.player.skills public static void UseSkill(CCSPlayerController player) { - if (player == null || !player.IsValid || !player.PawnIsAlive) return; + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo) && skillInfo.CanUse) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo) && skillInfo.CanUse) { skillInfo.CanUse = false; skillInfo.Cooldown = DateTime.Now; @@ -108,7 +110,7 @@ namespace src.player.skills if (playerPawn == null || !playerPawn.IsValid) return; if (playerPawn.AbsOrigin == null || playerPawn.AbsRotation == null) return; - var replica = Utilities.CreateEntityByName("prop_dynamic_override"); + var replica = EntityManager.CreateTrackedPropOverride(player.Index); if (replica == null || !replica.IsValid) return; replica.Collision.SolidType = SolidType_t.SOLID_VPHYSICS; @@ -166,10 +168,10 @@ namespace src.player.skills { if (replica != null && replica.IsValid) { - replica.AcceptInput("Kill"); + EntityManager.DestroyEntity(replica.Index); if (ActiveTimers.TryRemove(replicaIndex, out var timer)) timer?.Kill(); } - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } public static void OnTakeDamage(DynamicHook h) @@ -188,7 +190,7 @@ namespace src.player.skills replica.EmitSound("GlassBottle.BulletImpact", volume: 1f); if (ActiveTimers.TryRemove((int)replica.Index, out var timer)) timer?.Kill(); - replica.AcceptInput("Kill"); + EntityManager.DestroyEntity(replica.Index); CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); if (attackerPawn.DesignerName != "player") return; diff --git a/jRandomSkills - SRC Files/src/player/skills/Impostor.cs b/jRandomSkills - SRC Files/src/player/skills/Impostor.cs index f91dd6e..82abd97 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Impostor.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Impostor.cs @@ -13,7 +13,7 @@ namespace src.player.skills private const Skills skillName = Skills.Impostor; private static readonly string defaultCTModel = "agents/models/ctm_sas/ctm_sas.vmdl"; private static readonly string defaultTModel = "agents/models/tm_phoenix/tm_phoenix.vmdl"; - private static readonly ConcurrentDictionary originalModels = []; + private static readonly ConcurrentDictionary originalModels = []; public static void LoadSkill() { @@ -29,16 +29,16 @@ namespace src.player.skills { string model = GetEnemyModel(player); if (player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.CBodyComponent != null && player.PlayerPawn.Value.CBodyComponent.SceneNode != null) - originalModels.TryAdd(player.SteamID, player.PlayerPawn.Value.CBodyComponent.SceneNode.GetSkeletonInstance().ModelState.ModelName); + originalModels.TryAdd(player.Index, player.PlayerPawn.Value.CBodyComponent.SceneNode.GetSkeletonInstance().ModelState.ModelName); SetPlayerModel(player, model); } public static void DisableSkill(CCSPlayerController player) { - var model = originalModels.TryGetValue(player.SteamID, out var originalModel) && !string.IsNullOrEmpty(originalModel) ? originalModel : + var model = originalModels.TryGetValue(player.Index, out var originalModel) && !string.IsNullOrEmpty(originalModel) ? originalModel : player.Team == CsTeam.Terrorist ? defaultTModel : defaultCTModel; SetPlayerModel(player, model); - originalModels.TryRemove(player.SteamID, out _); + originalModels.TryRemove(player.Index, out _); } private static string GetEnemyModel(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs b/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs index ee106d7..fdd149f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs +++ b/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs @@ -16,10 +16,10 @@ namespace src.player.skills public static void WeaponFire(EventWeaponFire @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) ApplyInfiniteAmmo(player!); @@ -27,10 +27,10 @@ namespace src.player.skills public static void GrenadeThrown(EventGrenadeThrown @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) player!.GiveNamedItem($"weapon_{@event.Weapon}"); @@ -38,10 +38,10 @@ namespace src.player.skills public static void WeaponReload(EventWeaponReload @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) ApplyInfiniteAmmo(player!); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs index 44dc28e..d8bddc7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs @@ -1,9 +1,9 @@ -using System.Collections.Concurrent; -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Utils; using src.utils; +using System.Collections.Concurrent; using static src.jRandomSkills; using Timer = CounterStrikeSharp.API.Modules.Timers.Timer; @@ -12,9 +12,9 @@ namespace src.player.skills public class Jackal : ISkill { private const Skills skillName = Skills.Jackal; - private static readonly ConcurrentDictionary playersInAction = new(); - private static readonly ConcurrentDictionary playersStep = new(); - private static readonly ConcurrentDictionary activeTimers = new(); + private static Timer? mainSkillTimer = null; + private static readonly ConcurrentDictionary activeTrails = []; + private static readonly ConcurrentDictionary playersInAction = []; public static void LoadSkill() { @@ -24,134 +24,141 @@ namespace src.player.skills public static void NewRound() { - var particleIds = playersStep.Values.Where(v => v.HasValue).Select(v => v!.Value).ToArray(); - foreach (var pid in particleIds) - SkillUtils.SafeKillEntity(pid); + if (mainSkillTimer != null) + { + mainSkillTimer.Kill(); + mainSkillTimer = null; + } - var timers = activeTimers.Values.ToArray(); - foreach (var t in timers) - t?.Kill(); + foreach (var index in activeTrails.Keys) + EntityManager.DestroyPlayerEntities(index); - playersStep.Clear(); + activeTrails.Clear(); playersInAction.Clear(); - activeTimers.Clear(); } public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) { + var snapshot = activeTrails.ToArray(); + foreach (var (info, player) in infoList) { if (player == null || !player.IsValid) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - var targetHandle = player.Pawn.Value?.ObserverServices?.ObserverTarget.Value?.Handle ?? nint.Zero; - bool isObservingJackal = false; + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); + bool isJackalOwner = playerInfo?.Skill == skillName; - if (targetHandle != nint.Zero) + if (!isJackalOwner) { - var target = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == targetHandle); - var targetInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == target?.SteamID); - if (targetInfo?.Skill == skillName) isObservingJackal = true; + var targetHandle = player.Pawn.Value?.ObserverServices?.ObserverTarget.Value?.Handle ?? nint.Zero; + if (targetHandle != nint.Zero) + { + var observed = Utilities.GetPlayers() + .FirstOrDefault(p => p?.Pawn?.Value?.Handle == targetHandle); + if (observed != null && observed.IsValid) + { + var observedInfo = PlayerManager.GetPlayerByIndex(observed.Index); + if (observedInfo?.Skill == skillName) + isJackalOwner = true; + } + } } - bool hasSkill = playerInfo?.Skill == skillName || isObservingJackal; - - foreach (var kv in playersStep.ToArray()) + foreach (var (trackedPlayerIndex, relayIndex) in snapshot) { - var enemyIndex = kv.Key; - var particleIndex = kv.Value; - if (particleIndex == null) continue; + if (relayIndex == null) continue; - var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); - if (enemy == null || !enemy.IsValid) continue; + var trailOwner = Utilities.GetPlayerFromIndex((int)trackedPlayerIndex); + if (trailOwner == null || !trailOwner.IsValid) continue; - var entity = Utilities.GetEntityFromIndex((int)particleIndex); - if (entity == null || !entity.IsValid) continue; + var relayEntity = Utilities.GetEntityFromIndex((int)relayIndex); + if (relayEntity == null || !relayEntity.IsValid) continue; - if (!hasSkill || enemy.Team == player.Team) - info.TransmitEntities.Remove(entity.Index); + if (player.Team == trailOwner.Team || !isJackalOwner) + info.TransmitEntities.Remove(relayEntity.Index); } } } public static void CreatePlayerTrail(CCSPlayerController? player) { - if (player == null) return; + if (player == null || !player.IsValid) return; + var playerPawn = player.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null + || playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE || playerPawn.Health <= 0) return; ; - ulong steamID = player.SteamID; - if (activeTimers.TryRemove(steamID, out var oldTimer)) - oldTimer?.Kill(); + var relay = EntityManager.CreateTrackedPhysicsProp(player.Index); + if (relay == null || !relay.IsValid) return; - if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null || playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; - if (!playersStep.ContainsKey(player.Index)) return; + CBaseEntity target = playerPawn; + var entities = EntityManager.GetPlayerEntities(player.Index, "empty_prop"); - CParticleSystem particle = Utilities.CreateEntityByName("info_particle_system")!; - if (particle == null) return; - - particle.EffectName = SkillsInfo.GetValue(skillName, "particleName"); - particle.StartActive = true; - - particle.Teleport(playerPawn.AbsOrigin); - particle.DispatchSpawn(); - - particle.AcceptInput("SetParent", playerPawn, particle, "!activator"); - particle.AcceptInput("Start"); - - uint particleId = particle.Index; - playersStep.AddOrUpdate(player.Index, particle.Index, (k, v) => particle.Index); - - var timer = Instance.AddTimer(2.5f, () => + if (entities.Count > 0) { - SkillUtils.SafeKillEntity(particleId); + var entity = Utilities.GetEntityFromIndex((int)entities[0]); + if (entity != null && entity.IsValid) + target = entity; + } - var pl = Utilities.GetPlayerFromSteamId(steamID); - if (pl != null && pl.IsValid && playersStep.ContainsKey(pl.Index)) - CreatePlayerTrail(pl); - }); + relay.AcceptInput("SetParent", target, relay, "!activator"); - activeTimers.AddOrUpdate(player.SteamID, timer, (_, prev) => + var particle = EntityManager.CreateTrackedParticleSystem( + player.Index, + SkillsInfo.GetValue(skillName, "particleName")); + + if (particle != null && particle.IsValid && target.AbsOrigin != null) { - prev?.Kill(); - return timer; - }); + Vector pos = new(target.AbsOrigin.X, target.AbsOrigin.Y, target.AbsOrigin.Z); + if (entities.Count > 0) pos.Z -= 30; + + particle.Teleport(pos); + particle.AcceptInput("SetParent", relay, particle, "!activator"); + particle.AcceptInput("Start"); + } + + activeTrails[player.Index] = relay.Index; } public static void EnableSkill(CCSPlayerController player) { + if (player == null || !player.IsValid) return; + Event.EnableTransmit(); - playersInAction.TryAdd(player.SteamID, 0); + playersInAction.TryAdd(player.Index, 0); var opponents = Utilities.GetPlayers() - .Where(p => p.Team != player.Team - && p.IsValid - && !p.IsBot - && !p.IsHLTV - && p.PawnIsAlive - && (p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) + .Where(p => p != null + && p.IsValid + && p.Team != player.Team + && p.PawnIsAlive + && (p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) .ToArray(); - foreach (var _player in opponents) - { - playersStep.TryAdd(_player.Index, null); - CreatePlayerTrail(_player); - } + mainSkillTimer ??= Instance.AddTimer(2.5f, () => UpdateAllTrails(), + CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } + + private static void UpdateAllTrails() + { + foreach (var player in Utilities.GetPlayers()) + CreatePlayerTrail(player); } public static void DisableSkill(CCSPlayerController player) { - playersInAction.TryRemove(player.SteamID, out _); + if (player == null || !player.IsValid) return; + uint playerIndex = player.Index; - if (playersStep.TryRemove(player.Index, out var particleIndex) && particleIndex != null) + playersInAction.TryRemove(playerIndex, out _); + EntityManager.DestroyPlayerEntities(playerIndex); + activeTrails.TryRemove(playerIndex, out _); + + if (playersInAction.IsEmpty && mainSkillTimer != null) { - SkillUtils.SafeKillEntity(particleIndex); + mainSkillTimer.Kill(); + mainSkillTimer = null; } - - if (activeTimers.TryRemove(player.SteamID, out var t)) - t?.Kill(); - - if (playersInAction.IsEmpty) - NewRound(); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#f542ef", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = 1, Rarity rarity = Rarity.Common, string particleName = "particles/ui/hud/ui_map_def_utility_trail.vpcf") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs index 28fe0a2..bc6a582 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs @@ -1,9 +1,9 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Commands.Targeting; using CounterStrikeSharp.API.Modules.Utils; -using static src.jRandomSkills; -using System.Collections.Concurrent; using src.utils; +using System.Collections.Concurrent; namespace src.player.skills { @@ -11,6 +11,7 @@ namespace src.player.skills { private const Skills skillName = Skills.Jammer; private static readonly ConcurrentDictionary jammedPlayers = []; + private static readonly ConcurrentDictionary jammerToTarget = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -29,7 +30,9 @@ namespace src.player.skills SetCrosshair(player, true); } jammedPlayers.Clear(); + jammerToTarget.Clear(); } + foreach (var player in Utilities.GetPlayers()) SkillUtils.CloseMenu(player); } @@ -40,10 +43,10 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers()) { if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); SkillUtils.UpdateMenu(player, menuItems); @@ -52,8 +55,8 @@ namespace src.player.skills 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); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillUsed) @@ -63,7 +66,8 @@ namespace src.player.skills } string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); + if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) { @@ -72,8 +76,11 @@ namespace src.player.skills } jammedPlayers.TryAdd(enemy.Index, 0); + jammerToTarget[player.Index] = enemy.Index; + SetCrosshair(enemy, false); playerInfo.SkillUsed = true; + player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("jammer_player_info", enemy.PlayerName)); enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("jammer_enemy_info")); } @@ -90,11 +97,11 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SkillUsed = false; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); @@ -106,6 +113,22 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { + if (jammerToTarget.TryRemove(player.Index, out uint targetIndex)) + { + var target = Utilities.GetPlayerFromIndex((int)targetIndex); + if (target != null && target.IsValid) + SetCrosshair(target, true); + jammedPlayers.TryRemove(targetIndex, out _); + } + + SkillUtils.CloseMenu(player); + } + + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + SetCrosshair(player, true); jammedPlayers.TryRemove(player.Index, out _); SkillUtils.CloseMenu(player); diff --git a/jRandomSkills - SRC Files/src/player/skills/Jester.cs b/jRandomSkills - SRC Files/src/player/skills/Jester.cs index 1301e9b..7601b25 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jester.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jester.cs @@ -1,6 +1,5 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; @@ -13,7 +12,7 @@ namespace src.player.skills public class Jester : ISkill { private const Skills skillName = Skills.Jester; - private static readonly ConcurrentDictionary jesters = []; + private static readonly ConcurrentDictionary jesters = []; public static void LoadSkill() { @@ -32,13 +31,13 @@ namespace src.player.skills jester.Timer = null; } - var player = Utilities.GetPlayerFromSteamId(jester.SteamId); + var player = Utilities.GetPlayerFromIndex((int)jester.PlayerIndex); if (player != null && player.IsValid) { SkillUtils.ResetPrintHTML(player); var pawn = player.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid || !player.PawnIsAlive) return; + if (pawn == null || !pawn.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; var color = Color.FromArgb(255, 255, 255, 255); pawn.Render = color; @@ -51,7 +50,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - var jester = GetJesterInfo(player.SteamID); + var jester = GetJesterInfo(player.Index); if (jester == null) return; Server.NextWorldUpdate(() => @@ -69,11 +68,11 @@ namespace src.player.skills public static void BombBegindefuse(EventBombBegindefuse @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - ulong steamId = player.SteamID; - var jester = GetJesterInfo(steamId); + uint playerIndex = player.Index; + var jester = GetJesterInfo(playerIndex); if (jester == null) return; if (jester.Timer != null) @@ -83,17 +82,17 @@ namespace src.player.skills } jester.Timer = Instance.AddTimer(1, () => { - ChangeMode(steamId, false); - }); + ChangeMode(playerIndex, false); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } public static void BombBeginplant(EventBombBeginplant @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - ulong steamId = player.SteamID; - var jester = GetJesterInfo(steamId); + uint playerIndex = player.Index; + var jester = GetJesterInfo(playerIndex); if (jester == null) return; if (jester.Timer != null) @@ -104,18 +103,17 @@ namespace src.player.skills jester.Timer = Instance.AddTimer(1, () => { if (player != null && player.IsValid) - ChangeMode(steamId, false); - }); + ChangeMode(playerIndex, false); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } public static void PlayerHurt(EventPlayerHurt @event) { - var attacker = @event.Attacker; - var victim = @event.Userid; - int hitgroup = @event.Hitgroup; + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + var victim = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(victim)) return; - var jesterVictim = GetJesterInfo(victim!.SteamID); + var jesterVictim = GetJesterInfo(victim!.Index); if (!Instance.IsPlayerValid(attacker)) { @@ -124,7 +122,7 @@ namespace src.player.skills return; } - var jesterAttacker = GetJesterInfo(attacker!.SteamID); + var jesterAttacker = GetJesterInfo(attacker!.Index); if ((jesterVictim != null && jesterVictim.Active) || (jesterAttacker != null && jesterAttacker.Active)) SkillUtils.RestoreHealth(victim); } @@ -135,18 +133,18 @@ namespace src.player.skills var maxTime = SkillsInfo.GetValue(skillName, "maxTime"); float wait = (float)Instance.Random.NextDouble() * (maxTime - minTime) + minTime; - ulong steamId = player.SteamID; + uint playerIndex = player.Index; - jesters.TryAdd(steamId, new JesterInfo { - SteamId = steamId, + jesters.TryAdd(playerIndex, new JesterInfo { + PlayerIndex = playerIndex, Active = false, - Timer = Instance.AddTimer(wait, () => ChangeMode(steamId)) + Timer = Instance.AddTimer(wait, () => ChangeMode(playerIndex), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE) }); } - private static void ChangeMode(ulong steamId, bool? forceActive = null) + private static void ChangeMode(uint playerIndex, bool? forceActive = null) { - if (!jesters.TryGetValue(steamId, out var jester)) return; + if (!jesters.TryGetValue(playerIndex, out var jester)) return; if (jester.Timer != null) { @@ -154,10 +152,10 @@ namespace src.player.skills jester.Timer = null; } - var player = Utilities.GetPlayerFromSteamId(steamId); - if (player == null || !player.IsValid || !player.PawnIsAlive) + var player = Utilities.GetPlayerFromIndex((int)playerIndex); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) { - jesters.TryRemove(steamId, out _); + jesters.TryRemove(playerIndex, out _); return; } @@ -167,14 +165,17 @@ namespace src.player.skills if (jester.Active != previousState) { SetPlayerColor(player); - player.ExecuteClientCommand("play sounds/weapons/taser/taser_charge_ready"); + + var playerEvent = PlayerManager.GetPlayerFromEvent(player); + if (playerEvent != null && playerEvent.IsValid) + playerEvent.ExecuteClientCommand("play sounds/weapons/taser/taser_charge_ready"); } var minTime = SkillsInfo.GetValue(skillName, "minTime"); var maxTime = SkillsInfo.GetValue(skillName, "maxTime"); float wait = (float)Instance.Random.NextDouble() * (maxTime - minTime) + minTime; - jester.Timer = Instance.AddTimer(wait, () => ChangeMode(steamId)); + jester.Timer = Instance.AddTimer(wait, () => ChangeMode(playerIndex), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } private static void SetPlayerColor(CCSPlayerController? player, bool forceDisable = false) @@ -184,7 +185,7 @@ namespace src.player.skills var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid) return; - var jester = GetJesterInfo(player.SteamID); + var jester = GetJesterInfo(player.Index); if (jester == null) return; var color = jester.Active && !forceDisable ? Color.FromArgb(255, 128, 0, 128) : Color.FromArgb(255, 255, 255, 255); @@ -195,36 +196,39 @@ namespace src.player.skills public static void OnTick() { if (SkillUtils.IsFreezeTime()) return; - foreach (var player in Utilities.GetPlayers().Where(p => !p.IsBot && p.PawnIsAlive)) + foreach (var player in Utilities.GetPlayers()) { - if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playeEvent = PlayerManager.GetPlayerEvent(player); + if (playeEvent == null || !playeEvent.IsValid || playeEvent.PlayerPawn.Value == null || !playeEvent.PlayerPawn.Value.IsValid) continue; + + var playerInfo = PlayerManager.GetPlayerByIndex(playeEvent.Index); + if (playerInfo?.Skill == skillName) - UpdateHUD(player); + UpdateHUD(playeEvent); } } private static void UpdateHUD(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; - var jester = GetJesterInfo(player.SteamID); + var jester = GetJesterInfo(player.Index); if (jester == null) return; playerInfo.PrintHTML = $"{player.GetTranslation("jester_mode")}: {player.GetTranslation(jester.Active ? "jester_on" : "jester_off")}"; } - public static JesterInfo? GetJesterInfo(ulong steamID) + public static JesterInfo? GetJesterInfo(uint playerIndex) { - if (jesters.TryGetValue(steamID, value: out var info)) + if (jesters.TryGetValue(playerIndex, value: out var info)) return info; return null; } public class JesterInfo() { - public required ulong SteamId { get; set; } + public required uint PlayerIndex { get; set; } public bool Active { get; set; } = false; public Timer? Timer { get; set; } = null; } diff --git a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs index aaf85f0..7410f32 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs @@ -1,7 +1,6 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using static src.jRandomSkills; using System.Collections.Concurrent; using src.utils; @@ -11,6 +10,7 @@ namespace src.player.skills { private const Skills skillName = Skills.JumpBan; public static readonly ConcurrentDictionary bannedPlayers = []; + private static readonly ConcurrentDictionary playersToTarget = []; public static void LoadSkill() { @@ -20,13 +20,15 @@ namespace src.player.skills public static void NewRound() { bannedPlayers.Clear(); + playersToTarget.Clear(); + foreach (var player in Utilities.GetPlayers()) SkillUtils.CloseMenu(player); } public static void PlayerJump(EventPlayerJump @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; if (!bannedPlayers.TryGetValue(player.Index, out _)) return; bannedPlayers.AddOrUpdate(player.Index, Server.TickCount + 10, (k, v) => Server.TickCount + 10); @@ -53,10 +55,10 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers()) { if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))]; SkillUtils.UpdateMenu(player, menuItems); @@ -65,8 +67,8 @@ namespace src.player.skills 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); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillUsed) @@ -76,7 +78,8 @@ namespace src.player.skills } string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); + if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null || !enemy.IsValid || enemy.PlayerPawn.Value == null || !enemy.PlayerPawn.Value.IsValid) { @@ -85,18 +88,20 @@ namespace src.player.skills } bannedPlayers.AddOrUpdate(enemy.Index, 0, (k, v) => 0); + playersToTarget[player.Index] = enemy.Index; playerInfo.SkillUsed = true; + player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("jumpban_player_info", enemy.PlayerName)); enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("jumpban_enemy_info")); } public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SkillUsed = false; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); @@ -108,7 +113,20 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) + return; + + if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) + bannedPlayers.TryRemove(targetIndex, out _); + + SkillUtils.CloseMenu(player); + } + + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + bannedPlayers.TryRemove(player.Index, out _); SkillUtils.CloseMenu(player); } diff --git a/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs b/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs index f360aee..d0a4acd 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs @@ -1,8 +1,6 @@ -using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; -using static src.jRandomSkills; namespace src.player.skills { @@ -19,9 +17,14 @@ namespace src.player.skills { var player = @event.Userid; if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + + var playerEvent = PlayerManager.GetPlayerEvent(player); + if (playerEvent == null || !playerEvent.IsValid) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(playerEvent.Index); if (playerInfo?.Skill != skillName) return; - SkillUtils.AddHealth(player.PlayerPawn.Value, SkillsInfo.GetValue(skillName, "healthToAdd")); + + SkillUtils.AddHealth(playerEvent.PlayerPawn.Value, SkillsInfo.GetValue(skillName, "healthToAdd")); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a86eff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, int healthToAdd = 3) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs index da38057..c525751 100644 --- a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Commands.Targeting; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; @@ -18,12 +18,12 @@ namespace src.player.skills public static void PlayerBlind(EventPlayerBlind @event) { - var player = @event.Userid; - var attacker = @event.Attacker; + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); if (!Instance.IsPlayerValid(player) || !Instance.IsPlayerValid(attacker)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + var attackerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (!SkillsInfo.GetValue(skillName, "friendlyFire") && player!.Team == attacker!.Team) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs b/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs index eb07b98..e588f5f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using static src.jRandomSkills; @@ -28,20 +28,20 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers()) { if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); - ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => ($"{e.PlayerName} : {e.PawnHealth} HP", e.Index.ToString()))); + ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => ($"{e.PlayerName} : {e?.PlayerPawn?.Value?.Health ?? 0} HP", e.Index.ToString()))); SkillUtils.UpdateMenu(player, menuItems); } } 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); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillUsed) @@ -51,7 +51,8 @@ namespace src.player.skills } string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); + if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) { @@ -67,11 +68,11 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SkillUsed = false; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => ($"{e.PlayerName} : {e.PawnHealth} HP", e.Index.ToString()))); diff --git a/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs b/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs index 9e99497..9847792 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; @@ -14,7 +14,7 @@ namespace src.player.skills private static bool hooked = false; private const int actionCode = 503; - private static readonly ConcurrentDictionary playersInAction = []; + private static readonly ConcurrentDictionary playersInAction = []; private static readonly MemoryFunctionVoid Shoot_Secondary = new(GameData.GetSignature("Shoot_Secondary")); public static void LoadSkill() @@ -34,12 +34,12 @@ namespace src.player.skills if (hooked) return; hooked = true; Shoot_Secondary.Hook(ShootSecondary, HookMode.Pre); - playersInAction.TryAdd(player.SteamID, 0); + playersInAction.TryAdd(player.Index, 0); } public static void DisableSkill(CCSPlayerController player) { - playersInAction.TryRemove(player.SteamID, out _); + playersInAction.TryRemove(player.Index, out _); if (playersInAction.IsEmpty) { Shoot_Secondary.Unhook(ShootSecondary, HookMode.Pre); @@ -61,19 +61,22 @@ namespace src.player.skills var player = pawn.Controller.Value.As(); if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var eventPlayer = PlayerManager.GetPlayerEvent(player); + if (eventPlayer == null || !eventPlayer.IsValid) return HookResult.Continue; + + var playerInfo = PlayerManager.GetPlayerByIndex(eventPlayer.Index); if (playerInfo == null || playerInfo.Skill != skillName) return HookResult.Continue; - KnifeHit(player, true); + KnifeHit(eventPlayer, true); return HookResult.Continue; } public static void WeaponFire(EventWeaponFire @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; var pawn = player!.PlayerPawn.Value; @@ -97,10 +100,10 @@ namespace src.player.skills if (!result.Value.HitPlayer(out CCSPlayerController? target) || target == null) return; - + if (target.Handle == player.Handle || result.Value.Distance() <= 70) return; - + if (target.PlayerPawn.Value == null || !target.PlayerPawn.Value.IsValid) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs b/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs index 5c8396b..e72e403 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -17,10 +17,10 @@ namespace src.player.skills public unsafe static void WeaponFire(EventWeaponFire @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; var pawn = player!.PlayerPawn.Value; diff --git a/jRandomSkills - SRC Files/src/player/skills/MagneticDecoy.cs b/jRandomSkills - SRC Files/src/player/skills/MagneticDecoy.cs index 450c81b..8a3815c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/MagneticDecoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/MagneticDecoy.cs @@ -1,10 +1,9 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; -using static src.jRandomSkills; namespace src.player.skills { @@ -25,10 +24,10 @@ namespace src.player.skills public static void DecoyStarted(EventDecoyStarted @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; decoys.TryAdd(new Vector(@event.X, @event.Y, @event.Z), 0); @@ -36,10 +35,10 @@ namespace src.player.skills public static void DecoyDetonate(EventDecoyDetonate @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; foreach (var decoy in decoys.Keys.Where(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z)) @@ -49,11 +48,14 @@ namespace src.player.skills public static void OnTick() { foreach (Vector decoyPos in decoys.Keys) - foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid && p.PawnIsAlive && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) + foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) { + var eventPlayer = PlayerManager.GetPlayerEvent(player); + if (eventPlayer == null || !eventPlayer.IsValid) continue; + var decoyRadius = SkillsInfo.GetValue(skillName, "triggerRadius"); - var pawn = player.PlayerPawn.Value; + var pawn = eventPlayer.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue; double distance = SkillUtils.GetDistance(decoyPos, pawn.AbsOrigin); diff --git a/jRandomSkills - SRC Files/src/player/skills/Magneto.cs b/jRandomSkills - SRC Files/src/player/skills/Magneto.cs index 3de5505..4bb1c52 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Magneto.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Magneto.cs @@ -40,7 +40,7 @@ namespace src.player.skills foreach (var playerIndex in players.Keys) { var player = Utilities.GetPlayerFromIndex((int)playerIndex); - if (player == null || !player.IsValid || !player.PawnIsAlive || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) { players.TryRemove(playerIndex, out _); continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs index cde207e..7b1b264 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs @@ -1,9 +1,8 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using static src.jRandomSkills; -using System.Collections.Concurrent; using src.utils; +using System.Collections.Concurrent; namespace src.player.skills { @@ -11,6 +10,7 @@ namespace src.player.skills { private const Skills skillName = Skills.Magnifier; private static readonly ConcurrentDictionary playersFOV = []; + private static readonly ConcurrentDictionary playersToTarget = []; public static void LoadSkill() { @@ -27,27 +27,22 @@ namespace src.player.skills } playersFOV.Clear(); + playersToTarget.Clear(); + foreach (var player in Utilities.GetPlayers()) SkillUtils.CloseMenu(player); } - public static void PlayerDeath(EventPlayerDeath @event) - { - var player = @event.Userid; - if (player == null) return; - DisableSkill(player); - } - public static void OnTick() { if (Server.TickCount % 32 != 0) return; foreach (var player in Utilities.GetPlayers()) { if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); SkillUtils.UpdateMenu(player, menuItems); @@ -56,18 +51,19 @@ namespace src.player.skills 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); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillUsed) { - player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}"); + player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}" ); return; } string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); + if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) { @@ -75,23 +71,24 @@ namespace src.player.skills return; } - if (!playersFOV.ContainsKey(enemy.Index)) - playersFOV.TryAdd(enemy.Index, enemy.DesiredFOV); + playersFOV.AddOrUpdate(enemy.Index, enemy.DesiredFOV, (k, v) => enemy.DesiredFOV); + playersToTarget[player.Index] = enemy.Index; + enemy.DesiredFOV = SkillsInfo.GetValue(skillName, "customFOV"); Utilities.SetStateChanged(enemy, "CBasePlayerController", "m_iDesiredFOV"); - playerInfo.SkillUsed = true; + player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("magnifier_player_info", enemy.PlayerName)); enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("magnifier_enemy_info")); } public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SkillUsed = false; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); @@ -103,13 +100,31 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - if (playersFOV.TryGetValue(player.Index, out uint fov)) + if (player == null || !player.IsValid) return; + + if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) { - player.DesiredFOV = fov; - Utilities.SetStateChanged(player, "CBasePlayerController", "m_iDesiredFOV"); + var target = Utilities.GetPlayerFromIndex((int)targetIndex); + if (target != null && target.IsValid) + if (playersFOV.TryGetValue(targetIndex, out uint fov)) + { + target.DesiredFOV = fov; + Utilities.SetStateChanged(target, "CBasePlayerController", "m_iDesiredFOV"); + } + playersFOV.TryRemove(targetIndex, out _); } - playersFOV.TryRemove(player.Index, out _); - SkillUtils.CloseMenu(player); + + SkillUtils.ResetPrintHTML(player); + } + + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + + player.DesiredFOV = 0; + Utilities.SetStateChanged(player, "CBasePlayerController", "m_iDesiredFOV"); + SkillUtils.ResetPrintHTML(player); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#9ba882", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, uint customFOV = 50) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Medic.cs b/jRandomSkills - SRC Files/src/player/skills/Medic.cs index 20b1cc0..ecba7d3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Medic.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Medic.cs @@ -10,7 +10,7 @@ namespace src.player.skills public class Medic : ISkill { private const Skills skillName = Skills.Medic; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; + private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -29,18 +29,18 @@ namespace src.player.skills if (SkillUtils.IsFreezeTime()) return; foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) UpdateHUD(player, skillInfo); } } public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo + SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + SteamID = player.Index, CanUse = true, Cooldown = DateTime.MinValue, Count = SkillsInfo.GetValue(skillName, "healthShotLimit"), @@ -49,7 +49,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + SkillPlayerInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } @@ -68,7 +68,7 @@ namespace src.player.skills var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == skillName); if (skillData == null) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; string remainingLine = cooldown != 0 @@ -83,9 +83,9 @@ namespace src.player.skills var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) { - if (!player.IsValid || !player.PawnIsAlive) return; + if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; if (skillInfo.CanUse && skillInfo.Count != 0) { skillInfo.CanUse = false; diff --git a/jRandomSkills - SRC Files/src/player/skills/Miner.cs b/jRandomSkills - SRC Files/src/player/skills/Miner.cs index d3862dd..5f02cdf 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Miner.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Miner.cs @@ -1,10 +1,9 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; -using static src.jRandomSkills; namespace src.player.skills { @@ -87,7 +86,7 @@ namespace src.player.skills if (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); + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo?.Skill != skillName) return; nades.TryAdd(grenade.Index, 0); diff --git a/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs b/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs index 0c90f2f..8c138e2 100644 --- a/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using static src.jRandomSkills; @@ -28,10 +28,10 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers()) { if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account + e.InGameMoneyServices.CashSpentThisRound)}$", e.Index.ToString()))]; SkillUtils.UpdateMenu(player, menuItems); @@ -40,8 +40,8 @@ namespace src.player.skills 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); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillUsed) @@ -51,7 +51,8 @@ namespace src.player.skills } string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); + if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) { @@ -67,11 +68,11 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SkillUsed = false; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account + e.InGameMoneyServices.CashSpentThisRound)}$", e.Index.ToString()))]; diff --git a/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs b/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs index 9fd0d66..07f2f92 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs @@ -27,7 +27,7 @@ namespace src.player.skills public static void PlayerDeath(EventPlayerDeath @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!IsDeadPlayerValid(player)) return; CsTeam lastTeam = player!.Team; @@ -40,7 +40,7 @@ namespace src.player.skills var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.Health == pawn.MaxHealth) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) SpawnExplosion(player!); }); @@ -56,9 +56,9 @@ namespace src.player.skills SkillUtils.CreateHEGrenadeProjectile(pos, angle, new Vector(0, 0, -10), player.TeamNum); - foreach (var _p in Utilities.GetPlayers().Where(p => p.IsValid && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist && !p.IsBot)) + foreach (var _p in Utilities.GetPlayers().Where(p => p.IsValid && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) SkillUtils.PrintToChat(_p, $"{ChatColors.DarkRed}{player.PlayerName}: {ChatColors.Lime}{_p.GetTranslation("muhammed_explosion")}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); var fileNames = new[] { "radiobotfallback01", "radiobotfallback02", "radiobotfallback04" }; var randomFile = fileNames[new Random().Next(fileNames.Length)]; diff --git a/jRandomSkills - SRC Files/src/player/skills/Mute.cs b/jRandomSkills - SRC Files/src/player/skills/Mute.cs index 99d4351..a783e48 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Mute.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Mute.cs @@ -1,4 +1,4 @@ -/*using CounterStrikeSharp.API; +/*using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using static jRandomSkills.jRandomSkills; @@ -26,7 +26,7 @@ namespace src.player.skills var pawn = grenade.OwnerEntity.Value.As(); var player = pawn.Controller.Value.As(); - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; Server.NextFrame(() => { @@ -55,8 +55,8 @@ namespace src.player.skills Instance.AddTimer(5f, () => { if (@event != null && @event.IsValid) - @event.AcceptInput("Kill"); - }); + @event.AddEntityIOEvent("Kill", ent, delay: 0.1f); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); }); }); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs index a7a7d32..036080c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs @@ -15,12 +15,14 @@ namespace src.player.skills private static readonly ConcurrentDictionary invisibilityChanged = []; private static readonly ConcurrentDictionary invisiblePlayers = []; private const string bloodParticle = "particles/blood_impact/blood_impact_high.vpcf"; + private const string cameraViewModel = "models/sprays/spray_plane.vmdl"; private static readonly object setLock = new(); public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); Instance.AddToManifest(bloodParticle); + Instance.AddToManifest(cameraViewModel); } public static void NewRound() @@ -35,8 +37,9 @@ namespace src.player.skills public static void WeaponEquip(EventItemEquip @event) { var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (player == null || !player.IsValid) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo?.Skill != skillName) return; UpdateNinja(player); @@ -45,8 +48,9 @@ namespace src.player.skills public static void WeaponPickup(EventItemPickup @event) { var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (player == null || !player.IsValid) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo?.Skill != skillName) return; UpdateNinja(player); @@ -56,7 +60,7 @@ namespace src.player.skills { foreach (var (info, player) in infoList) { - if (player == null || !player.IsValid) continue; + if (player == null || !player.IsValid || player.Team == CsTeam.Spectator) continue; var targetHandle = player.Pawn.Value?.ObserverServices?.ObserverTarget.Value?.Handle ?? nint.Zero; bool isObservingNinja = false; @@ -64,14 +68,17 @@ namespace src.player.skills if (targetHandle != nint.Zero) { var target = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == targetHandle); - var targetInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == target?.SteamID); + var targetInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(target)?.Index); if (targetInfo?.Skill == skillName) isObservingNinja = true; } foreach (var playerIndex in invisiblePlayers.Keys) { - var playerController = Utilities.GetPlayerFromIndex((int)playerIndex); - if (playerController == null || !playerController.IsValid || playerController.SteamID == player.SteamID) + var playerController = PlayerManager.GetPlayerEvent(Utilities.GetPlayerFromIndex((int)playerIndex)); + if (playerController == null || !playerController.IsValid || playerController.Index == player.Index) + continue; + + if (player.Team == playerController.Team) continue; if (!isObservingNinja) @@ -95,31 +102,81 @@ namespace src.player.skills public static void OnTick() { + if (Server.TickCount % 2 != 0) return; + foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - UpdateNinja(player); - if (!player.PawnIsAlive) + if (player.LifeState != (byte)LifeState_t.LIFE_ALIVE) invisiblePlayers.TryRemove(player.Index, out _); + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) continue; + + UpdateNinja(PlayerManager.GetPlayerFromEvent(player)); + + var props = EntityManager.GetPlayerEntities(PlayerManager.GetPlayerEvent(player)!.Index, "empty_prop"); + if (props.Count == 0) continue; + + var prop = Utilities.GetEntityFromIndex((int)props[0]); + if (prop == null || !prop.IsValid) continue; + + var pawn = player.PlayerPawn?.Value; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue; + + Vector newPos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + 30); + QAngle newAngle = new(0, pawn.V_angle.Y, 0); + prop.Teleport(newPos, newAngle, null); } } - public static void EnableSkill(CCSPlayerController _) + public static void EnableSkill(CCSPlayerController player) { Event.EnableTransmit(); + + if (EntityManager.GetPlayerEntities(player.Index, "empty_prop").Count == 0) + CreatePlayerPosProp(player); } public static void DisableSkill(CCSPlayerController player) { - SetPlayerVisibility(player, 0); + SkillUtils.SetPlayerInvisibility(player, 0); invisiblePlayers.TryRemove(player.Index, out _); + EntityManager.DestroyPlayerEntities(player.Index); + } + + private static void CreatePlayerPosProp(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + var emptyProp = EntityManager.CreateTrackedDynamicProp(player.Index); + if (emptyProp == null || !emptyProp.IsValid) return; + + var playerPawn = player.PlayerPawn?.Value; + if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null || playerPawn.AbsRotation == null) return; + + emptyProp.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(emptyProp.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); + emptyProp.SetModel(cameraViewModel); + emptyProp.Render = Color.FromArgb(1, 255, 255, 255); + + Vector newPos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + 30); + QAngle newAngle = new(playerPawn.AbsRotation.X, playerPawn.AbsRotation.Y, playerPawn.AbsRotation.Z); + + emptyProp.Teleport(newPos, newAngle); + emptyProp.DispatchSpawn(); + + Utilities.SetStateChanged(emptyProp, "CBaseEntity", "m_CBodyComponent"); + + EntityManager.RegisterExisting(emptyProp, player.Index, "empty_prop"); } private static void UpdateNinja(CCSPlayerController? player) { if (player == null || !player.IsValid) return; - var pawn = player.PlayerPawn?.Value; + + var playerEvent = PlayerManager.GetPlayerEvent(player); + if (playerEvent == null || !playerEvent.IsValid) return; + + var pawn = playerEvent.PlayerPawn?.Value; if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; var flags = (PlayerFlags)pawn.Flags; @@ -138,51 +195,35 @@ namespace src.player.skills if (!buttons.HasFlag(PlayerButtons.Moveleft) && !buttons.HasFlag(PlayerButtons.Moveright) && !buttons.HasFlag(PlayerButtons.Forward) && !buttons.HasFlag(PlayerButtons.Back) && flags.HasFlag(PlayerFlags.FL_ONGROUND)) percentInvisibility += SkillsInfo.GetValue(skillName, "idlePercentInvisibility"); - if (invisibilityChanged.TryGetValue(player.Handle, out float oldInvisibility)) + if (invisibilityChanged.TryGetValue(playerEvent.Handle, out float oldInvisibility)) if (percentInvisibility == oldInvisibility) return; - invisibilityChanged.AddOrUpdate(player.Handle, percentInvisibility, (_, _) => percentInvisibility); + invisibilityChanged.AddOrUpdate(playerEvent.Handle, percentInvisibility, (_, _) => percentInvisibility); if (percentInvisibility > .9) - invisiblePlayers.TryAdd(player.Index, 0); + invisiblePlayers.TryAdd(playerEvent.Index, 0); else { - SetPlayerVisibility(player, percentInvisibility); - invisiblePlayers.TryRemove(player.Index, out _); - } - } - - private static void SetPlayerVisibility(CCSPlayerController player, float percentInvisibility) - { - var playerPawn = player.PlayerPawn.Value; - if (playerPawn != null) - { - var color = Color.FromArgb(Math.Max(255 - (int)(255 * percentInvisibility), 0), 255, 255, 255); - playerPawn.Render = color; - Utilities.SetStateChanged(playerPawn, "CBaseModelEntity", "m_clrRender"); + SkillUtils.SetPlayerInvisibility(playerEvent, percentInvisibility); + invisiblePlayers.TryRemove(playerEvent.Index, out _); } } public static void PlayerHurt(EventPlayerHurt @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; if (!invisiblePlayers.ContainsKey(player.Index)) return; var playerPawn = player.PlayerPawn.Value; if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null) return; - CParticleSystem particle = Utilities.CreateEntityByName("info_particle_system")!; + var particle = EntityManager.CreateTrackedParticleSystem(player.Index, bloodParticle, autoDestroySeconds: 3f); if (particle == null) return; - particle.EffectName = bloodParticle; - particle.StartActive = true; - Vector pos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + 50); particle.Teleport(pos); - particle.DispatchSpawn(); - particle.AcceptInput("Start"); } diff --git a/jRandomSkills - SRC Files/src/player/skills/NoNades.cs b/jRandomSkills - SRC Files/src/player/skills/NoNades.cs index 3c1a90c..5ef9aa3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/NoNades.cs +++ b/jRandomSkills - SRC Files/src/player/skills/NoNades.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -18,11 +18,11 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { var damage = @event.DmgHealth; - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); var weapon = @event.Weapon; if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (weapon == "hegrenade" || weapon == "inferno" || weapon == "decoy" || weapon == "flashbang" || weapon == "smokegrenade" || weapon == "molotov") diff --git a/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs b/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs index b4f65c0..fa52b5b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs +++ b/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -25,13 +25,13 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { if (player == null || !player.IsValid) return; - player.ReplicateConVar("weapon_accuracy_nospread", "1"); + Server.ExecuteCommand("weapon_accuracy_nospread 1"); } public static void DisableSkill(CCSPlayerController player) { if (player == null || !player.IsValid) return; - player.ReplicateConVar("weapon_accuracy_nospread", "0"); + Server.ExecuteCommand("weapon_accuracy_nospread 0"); } public static void OnTick() @@ -39,7 +39,7 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) { diff --git a/jRandomSkills - SRC Files/src/player/skills/Noclip.cs b/jRandomSkills - SRC Files/src/player/skills/Noclip.cs index 9dbe466..540d564 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Noclip.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Noclip.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Memory; @@ -13,7 +13,7 @@ namespace src.player.skills public class Noclip : ISkill { private const Skills skillName = Skills.Noclip; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; + private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -31,18 +31,18 @@ namespace src.player.skills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) UpdateHUD(player, skillInfo); } } public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo + SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + SteamID = player.Index, CanUse = true, IsFlying = false, Cooldown = DateTime.MinValue, @@ -52,7 +52,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + SkillPlayerInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } @@ -72,7 +72,7 @@ namespace src.player.skills skillInfo.CanUse = true; } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; if (cooldown == 0) @@ -92,9 +92,9 @@ namespace src.player.skills var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - ulong steamId = player.SteamID; + uint playerIndex = player.Index; - if (SkillPlayerInfo.TryGetValue(steamId, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(playerIndex, out var skillInfo)) { if (skillInfo.IsFlying) { @@ -116,14 +116,14 @@ namespace src.player.skills skillInfo.Timer = Instance.AddTimer(duration, () => { - var player = Utilities.GetPlayerFromSteamId(steamId); + var player = Utilities.GetPlayerFromIndex((int)playerIndex); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == steamId); + var playerInfo = PlayerManager.GetPlayerByIndex(playerIndex); if (playerInfo == null) return; StopFlying(player, skillInfo); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } } } @@ -133,7 +133,7 @@ namespace src.player.skills if (player == null || !player.IsValid) return; var playerPawn = player.PlayerPawn.Value; - if (playerPawn == null || !playerPawn.IsValid || !player.PawnIsAlive) return; + if (playerPawn == null || !playerPawn.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; playerPawn.MoveType = noclip ? MoveType_t.MOVETYPE_NOCLIP : MoveType_t.MOVETYPE_WALK; Schema.SetSchemaValue(playerPawn.Handle, "CBaseEntity", "m_nActualMoveType", (int)playerPawn.MoveType); @@ -148,7 +148,7 @@ namespace src.player.skills if (!skillInfo.IsFlying) return; skillInfo.IsFlying = false; - if (player == null || !player.IsValid || !player.PawnIsAlive) return; + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; SetNoclip(player, false); var playerPawn = player.PlayerPawn.Value; diff --git a/jRandomSkills - SRC Files/src/player/skills/OneShot.cs b/jRandomSkills - SRC Files/src/player/skills/OneShot.cs index c76815b..e3e0c23 100644 --- a/jRandomSkills - SRC Files/src/player/skills/OneShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/OneShot.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -32,13 +32,12 @@ namespace src.player.skills if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) return; - CCSPlayerController attacker = attackerPawn.Controller.Value.As(); - CCSPlayerController victim = victimPawn.Controller.Value.As(); + CCSPlayerController attacker = PlayerManager.GetPlayerEvent(attackerPawn.Controller.Value.As())!; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(attacker)!.Index); if (playerInfo == null) return; - if (playerInfo.Skill == skillName && attacker.PawnIsAlive) + if (playerInfo.Skill == skillName) param2.Damage = 1000f; } diff --git a/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs b/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs index 0a774aa..dfe00b4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs +++ b/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -17,13 +17,13 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var attacker = @event.Attacker; - var victim = @event.Userid; + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + var victim = PlayerManager.GetPlayerEvent(@event.Userid); int damage = @event.DmgHealth; var hitgroup = (HitGroup_t)@event.Hitgroup; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return; - var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + var victimInfo = PlayerManager.GetPlayerByIndex(victim!.Index); if (victimInfo == null || victimInfo.Skill != skillName) return; HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG]; diff --git a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs index 5dd232d..463d689 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs @@ -21,17 +21,19 @@ namespace src.player.skills { foreach (var player in Utilities.GetPlayers()) { - if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return; + var playerEvent = PlayerManager.GetPlayerEvent(player); + var playerInfo = PlayerManager.GetPlayerByIndex(playerEvent!.Index); + if (playerInfo?.Skill == skillName) - GiveAdditionalJump(player); + GiveAdditionalJump(player, playerEvent); } } public static void EnableSkill(CCSPlayerController player) { var playerPawn = player.PlayerPawn.Value; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerPawn == null || playerInfo == null) return; var skillConfig = SkillsInfo.LoadedConfig.FirstOrDefault(s => s.Name == skillName.ToString()); @@ -40,15 +42,18 @@ namespace src.player.skills float extraJumps = (float)Instance.Random.Next(SkillsInfo.GetValue(skillName, "extraJumpsMin"), SkillsInfo.GetValue(skillName, "extraJumpsMax") + 1); playerInfo.SkillChance = extraJumps; SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, extraJumps)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } - private static void GiveAdditionalJump(CCSPlayerController player) + private static void GiveAdditionalJump(CCSPlayerController player, CCSPlayerController playerEvent) { var playerPawn = player.PlayerPawn.Value; if (playerPawn == null || !playerPawn.IsValid) return; - var flags = (PlayerFlags)playerPawn.Flags; + var playerEventPawn = playerEvent.PlayerPawn.Value; + if (playerEventPawn == null || !playerEventPawn.IsValid) return; + + var flags = (PlayerFlags)playerEventPawn.Flags; var buttons = player.Buttons; bool isJumpDown = (playerPawn.MovementServices?.Buttons?.ButtonStates[0] & (ulong)PlayerButtons.Jump) != 0 || (buttons & PlayerButtons.Jump) != 0; @@ -57,8 +62,8 @@ namespace src.player.skills bool jumpPressed = (isJumpDown && !wasJumpDown) || (playerPawn.MovementServices?.QueuedButtonChangeMask & (ulong)PlayerButtons.Jump) != 0; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerPawn == null || playerInfo == null) return; + var playerInfo = PlayerManager.GetPlayerByIndex(playerEvent!.Index); + if (playerInfo == null) return; bool isOnGround = (flags & PlayerFlags.FL_ONGROUND) != 0; @@ -67,7 +72,7 @@ namespace src.player.skills else if (jumpPressed && J[player.Slot] < playerInfo.SkillChance + 1) { J[player.Slot]++; - playerPawn.AbsVelocity.Z = 300; + playerEventPawn.AbsVelocity.Z = 300; } LB[player.Slot] = buttons; diff --git a/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs b/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs index 53c12d4..61a41bc 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs @@ -1,122 +1,60 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Timers; using CounterStrikeSharp.API.Modules.Utils; using src.utils; -using System.Collections.Concurrent; using static src.jRandomSkills; -using Timer = CounterStrikeSharp.API.Modules.Timers.Timer; namespace src.player.skills { public class Phoenix : ISkill { private const Skills skillName = Skills.Phoenix; - private static readonly object setLock = new(); - private static readonly ConcurrentDictionary timers = []; public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color"), false); } - public static void PlayerDeath(EventPlayerDeath @event) + public static void PlayerHurt(EventPlayerHurt @event) { - var player = @event.Userid; - if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; + var user = @event.Userid; + if (user == null || !user.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) + var victim = PlayerManager.GetPlayerEvent(@event.Userid); + if (victim == null || !victim.IsValid) return; + + var pawn = victim.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(victim.Index); + if (playerInfo?.Skill != skillName || pawn.Health > 0) return; + + if (Instance.Random.NextDouble() > playerInfo.SkillChance) return; + if (victim.TeamChanged) return; + + SkillUtils.AddHealth(pawn, 100 - pawn.Health); + SkillUtils.PrintToChat(user, user.GetTranslation("phoenix_respawn")); + + Server.NextFrame(() => { - if (Instance.Random.NextDouble() <= playerInfo.SkillChance) - { - lock (setLock) - { - ulong steamID = player.SteamID; - int team = player.TeamNum; + if (victim == null || !victim.IsValid) return; + if (pawn == null || !pawn.IsValid) return; - if (team != 2 && team != 3) return; + var spawnpoint = SkillUtils.GetSpawnPointVector(victim); + if (spawnpoint == null) return; - player.Respawn(); - - Server.NextFrame(() => { - lock (setLock) - { - var player = Utilities.GetPlayerFromSteamId(steamID); - if (player == null || !player.IsValid || !player.PlayerPawn.IsValid) return; - - var pawn = player.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid) return; - - bool isBlock = team != player.TeamNum || player.TeamChanged; - - player.Respawn(); - - if (isBlock) - { - pawn.Flags |= (uint)Flags_t.FL_FROZEN; - pawn.Teleport(new Vector(0, 0, -1000), new QAngle(90, 0, 0)); - - bool isFreezeTime = Instance.GameRules != null && Instance.GameRules.FreezePeriod == true; - - if (!isFreezeTime) - { - Server.NextFrame(() => - { - if (pawn == null || !pawn.IsValid) return; - pawn.CommitSuicide(false, true); - }); - return; - } - - ulong steamId = player.SteamID; - - if (!timers.ContainsKey(player.SteamID)) - { - var timer = Instance.AddTimer(1f, () => - { - if (player == null || !player.IsValid || pawn == null || !pawn.IsValid) - { - if (timers.TryRemove(steamId, out var t)) - t.Kill(); - return; - } - - bool isFreezeTime = Instance.GameRules != null && Instance.GameRules.FreezePeriod == true; - - if (!isFreezeTime) - { - if (timers.TryRemove(steamId, out var t)) - t.Kill(); - - pawn.CommitSuicide(false, true); - return; - } - - }, TimerFlags.STOP_ON_MAPCHANGE | TimerFlags.REPEAT); - - timers.TryAdd(player.SteamID, timer); - } - - return; - } - } - }); - - SkillUtils.PrintToChat(player, player.GetTranslation("phoenix_respawn")); - } - } - } + pawn.Teleport(spawnpoint); + }); } public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue(skillName, "ChanceTo") - SkillsInfo.GetValue(skillName, "ChanceFrom")) + SkillsInfo.GetValue(skillName, "ChanceFrom"); playerInfo.SkillChance = newChance; SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff5C0A", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float chanceFrom = .2f, float chanceTo = .4f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Pilot.cs b/jRandomSkills - SRC Files/src/player/skills/Pilot.cs index 9078bf9..a67c2d0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Pilot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Pilot.cs @@ -10,7 +10,7 @@ namespace src.player.skills public class Pilot : ISkill { private const Skills skillName = Skills.Pilot; - private static readonly ConcurrentDictionary PlayerPilotInfo = []; + private static readonly ConcurrentDictionary PlayerPilotInfo = []; public static void LoadSkill() { @@ -26,7 +26,7 @@ namespace src.player.skills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) HandlePilot(player); } @@ -34,12 +34,12 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - PlayerPilotInfo.TryAdd(player.SteamID, new Pilot_PlayerInfo { SteamID = player.SteamID }); + PlayerPilotInfo.TryAdd(player.Index, new Pilot_PlayerInfo { SteamID = player.Index }); } public static void DisableSkill(CCSPlayerController player) { - PlayerPilotInfo.TryRemove(player.SteamID, out _); + PlayerPilotInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } @@ -48,7 +48,7 @@ namespace src.player.skills var playerPawn = player.PlayerPawn.Value; if (playerPawn == null || !playerPawn.IsValid) return; - if (!PlayerPilotInfo.TryGetValue(player.SteamID, out var pilotInfo)) return; + if (!PlayerPilotInfo.TryGetValue(player.Index, out var pilotInfo)) return; var flags = (PlayerFlags)playerPawn.Flags; var buttons = player.Buttons; @@ -107,7 +107,7 @@ namespace src.player.skills private static void UpdateHUD(CCSPlayerController player, Pilot_PlayerInfo pilotInfo) { if (pilotInfo == null) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; var maximumFuel = SkillsInfo.GetValue(skillName, "maximumFuel"); diff --git a/jRandomSkills - SRC Files/src/player/skills/Planter.cs b/jRandomSkills - SRC Files/src/player/skills/Planter.cs index 4059c9b..e7f5a78 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Planter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Planter.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; @@ -11,7 +11,7 @@ namespace src.player.skills public class Planter : ISkill { private const Skills skillName = Skills.Planter; - private static readonly ConcurrentDictionary plantingPlayers = []; + private static readonly ConcurrentDictionary plantingPlayers = []; public static void LoadSkill() { @@ -20,26 +20,26 @@ namespace src.player.skills public static void BombBeginplant(EventBombBeginplant @event) { - var user = @event.Userid; + var user = PlayerManager.GetPlayerEvent(@event.Userid); if (user == null || !user.IsValid || !user.PawnIsAlive) return; - plantingPlayers.TryAdd(user.SteamID, Server.CurrentTime); + plantingPlayers.TryAdd(user.Index, Server.CurrentTime); } public static void BombAbortplant(EventBombAbortplant @event) { - var user = @event.Userid; + var user = PlayerManager.GetPlayerEvent(@event.Userid); if (user == null || !user.IsValid || !user.PawnIsAlive) return; - plantingPlayers.TryRemove(user.SteamID, out _); + plantingPlayers.TryRemove(user.Index, out _); SkillUtils.ResetPrintHTML(user); } public static void BombPlanted(EventBombPlanted @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - plantingPlayers.TryRemove(player!.SteamID, out _); + plantingPlayers.TryRemove(player!.Index, out _); - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; playerInfo.PrintHTML = null; @@ -64,7 +64,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { if (player == null || !player.IsValid) return; - plantingPlayers.TryRemove(player.SteamID, out _); + plantingPlayers.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); var pawn = player.PlayerPawn.Value; @@ -80,7 +80,7 @@ namespace src.player.skills { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) continue; var pawn = player.PlayerPawn.Value; @@ -93,7 +93,7 @@ namespace src.player.skills pawn.InBombZone = true; Schema.SetSchemaValue(pawn.Handle, "CCSPlayerPawn", "m_bInBombZone", true); - if (plantingPlayers.TryGetValue(player.SteamID, out float plantTime)) + if (plantingPlayers.TryGetValue(player.Index, out float plantTime)) { float remaining = plantTime + 3f - currentTime; playerInfo.PrintHTML = $"{player.GetTranslation("planter_planting", $"{Math.Max(0, remaining):0.0}s")}"; diff --git a/jRandomSkills - SRC Files/src/player/skills/Poison.cs b/jRandomSkills - SRC Files/src/player/skills/Poison.cs index fd385be..6b9f619 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Poison.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Poison.cs @@ -1,7 +1,6 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using static src.jRandomSkills; using System.Collections.Concurrent; using src.utils; @@ -11,6 +10,7 @@ namespace src.player.skills { private const Skills skillName = Skills.Poison; private static readonly ConcurrentDictionary poisonedPlayers = []; + private static readonly ConcurrentDictionary playersToTarget = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -21,7 +21,10 @@ namespace src.player.skills public static void NewRound() { lock (setLock) + { poisonedPlayers.Clear(); + playersToTarget.Clear(); + } } public static void OnTick() @@ -45,10 +48,10 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers()) { if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); SkillUtils.UpdateMenu(player, menuItems); @@ -57,8 +60,8 @@ namespace src.player.skills 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); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillUsed) @@ -68,7 +71,8 @@ namespace src.player.skills } string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); + if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) { @@ -77,18 +81,20 @@ namespace src.player.skills } poisonedPlayers.TryAdd(enemy.Index, 0); + playersToTarget[player.Index] = enemy.Index; playerInfo.SkillUsed = true; + player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("poison_player_info", enemy.PlayerName)); enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("poison_enemy_info")); } public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SkillUsed = false; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); @@ -100,6 +106,17 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { + if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) + poisonedPlayers.TryRemove(targetIndex, out _); + + SkillUtils.CloseMenu(player); + } + + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + poisonedPlayers.TryRemove(player.Index, out _); SkillUtils.CloseMenu(player); } diff --git a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs index 1f7af04..1cf624d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs @@ -1,7 +1,6 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using static src.jRandomSkills; using System.Collections.Concurrent; using src.utils; @@ -10,7 +9,8 @@ namespace src.player.skills public class PrimaryBan : ISkill { private const Skills skillName = Skills.PrimaryBan; - private static readonly ConcurrentDictionary bannedPlayers = []; + private static readonly ConcurrentDictionary bannedPlayers = []; + private static readonly ConcurrentDictionary playersToTarget = []; private static readonly object setLock = new(); private static readonly string[] disabledWeapons = [ @@ -28,6 +28,8 @@ namespace src.player.skills lock (setLock) { bannedPlayers.Clear(); + playersToTarget.Clear(); + foreach (var player in Utilities.GetPlayers()) SkillUtils.CloseMenu(player); } @@ -35,10 +37,10 @@ namespace src.player.skills public static void WeaponEquip(EventItemEquip @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); var weapon = @event.Item; if (player == null || !player.IsValid) return; - if (!bannedPlayers.ContainsKey(player.SteamID) || !disabledWeapons.Contains(weapon)) return; + if (!bannedPlayers.ContainsKey(player.Index) || !disabledWeapons.Contains(weapon)) return; player.ExecuteClientCommand("slot3"); } @@ -48,10 +50,10 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers()) { if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); SkillUtils.UpdateMenu(player, menuItems); @@ -60,8 +62,8 @@ namespace src.player.skills 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); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillUsed) @@ -71,7 +73,8 @@ namespace src.player.skills } string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); + if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) { @@ -79,9 +82,11 @@ namespace src.player.skills return; } - bannedPlayers.TryAdd(enemy.SteamID, 0); + bannedPlayers.TryAdd(enemy.Index, 0); + playersToTarget[player.Index] = enemy.Index; CheckWeapon(enemy); playerInfo.SkillUsed = true; + player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("primaryban_player_info", enemy.PlayerName)); enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("primaryban_enemy_info")); } @@ -92,17 +97,17 @@ namespace src.player.skills if (activeWeapon == null || !activeWeapon.IsValid) return; if (activeWeapon.DesignerName == null || string.IsNullOrEmpty(activeWeapon.DesignerName)) return; - if (!bannedPlayers.ContainsKey(player.SteamID) || !disabledWeapons.Contains(activeWeapon.DesignerName?.Replace("weapon_", ""))) return; + if (!bannedPlayers.ContainsKey(player.Index) || !disabledWeapons.Contains(activeWeapon.DesignerName?.Replace("weapon_", ""))) return; player.ExecuteClientCommand("slot3"); } public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SkillUsed = false; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); @@ -114,7 +119,18 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - bannedPlayers.TryRemove(player.SteamID, out _); + if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) + bannedPlayers.TryRemove(targetIndex, out _); + + SkillUtils.CloseMenu(player); + } + + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + + bannedPlayers.TryRemove(player.Index, out _); SkillUtils.CloseMenu(player); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs b/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs index f953c21..732ca08 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs @@ -1,4 +1,3 @@ -using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -17,13 +16,12 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var attacker = @event.Attacker; - var victim = @event.Userid; - int damage = @event.DmgHealth; + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + var victim = PlayerManager.GetPlayerEvent(@event.Userid); var hitgroup = (HitGroup_t)@event.Hitgroup; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return; - var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + var victimInfo = PlayerManager.GetPlayerByIndex(victim!.Index); if (victimInfo == null || victimInfo.Skill != skillName) return; HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG]; diff --git a/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs b/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs index 9694651..d9d58aa 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using static src.jRandomSkills; @@ -31,10 +31,10 @@ namespace src.player.skills public static void PlayerDeath(EventPlayerDeath @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) SkillPlayerInfo.TryRemove(player.Index, out _); } @@ -78,7 +78,7 @@ namespace src.player.skills var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); if (plantedBomb != null) { - plantedBomb.AcceptInput("Kill"); + plantedBomb.AddEntityIOEvent("Kill", plantedBomb, delay: 0.1f); SkillUtils.TerminateRound(CsTeam.CounterTerrorist); } SkillUtils.ResetPrintHTML(player); @@ -96,7 +96,7 @@ namespace src.player.skills SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + SteamID = player.Index, Defusing = false, DefusingTime = SkillsInfo.GetValue(skillName, "defusingTime"), }); @@ -113,7 +113,7 @@ namespace src.player.skills if (!skillInfo.Defusing) return; int cooldown = (int)Math.Ceiling(skillInfo.DefusingTime); - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; if (cooldown == 0) diff --git a/jRandomSkills - SRC Files/src/player/skills/Push.cs b/jRandomSkills - SRC Files/src/player/skills/Push.cs index cba1b44..faee6b9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Push.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Push.cs @@ -17,13 +17,13 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var attacker = @event.Attacker; - var victim = @event.Userid; + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + var victim = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) { @@ -34,12 +34,12 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue(skillName, "ChanceTo") - SkillsInfo.GetValue(skillName, "ChanceFrom")) + SkillsInfo.GetValue(skillName, "ChanceFrom"); playerInfo.SkillChance = newChance; SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } private static void PushEnemy(CCSPlayerController player, QAngle attackerAngle) diff --git a/jRandomSkills - SRC Files/src/player/skills/Pyro.cs b/jRandomSkills - SRC Files/src/player/skills/Pyro.cs index c23d9bf..021dd8c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Pyro.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Pyro.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; @@ -18,13 +18,14 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var victim = @event.Userid; + var victim = PlayerManager.GetPlayerEvent(@event.Userid); int damage = @event.DmgHealth; string weapon = @event.Weapon; if (weapon != "inferno" || !Instance.IsPlayerValid(victim)) return; - var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); - if (victimInfo == null || victimInfo.Skill != skillName) return ; + var victimInfo = PlayerManager.GetPlayerByIndex(victim!.Index); + + if (victimInfo == null || victimInfo.Skill != skillName) return; var pawn = victim!.PlayerPawn.Value; SkillUtils.AddHealth(pawn, (int)(damage * SkillsInfo.GetValue(skillName, "regenerationMultiplier"))); diff --git a/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs b/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs index 036c1b9..b1b7e7f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -20,7 +20,7 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers()) { if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) { diff --git a/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs b/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs index 9ba19d7..ae6ecc9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -19,13 +19,12 @@ namespace src.player.skills { foreach (var player in Utilities.GetPlayers()) { - if (!Instance.IsPlayerValid(player)) continue; + var playerEvent = PlayerManager.GetPlayerEvent(player); + if (!Instance.IsPlayerValid(playerEvent)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(playerEvent!.Index); if (playerInfo?.Skill == skillName) - { SetEnemiesVisibleOnRadar(player); - } } } @@ -34,19 +33,22 @@ namespace src.player.skills if (player == null || !player.IsValid || player.PlayerPawn?.Value == null) return; int playerIndex = (int)player.Index - 1; - foreach (var enemy in Utilities.GetPlayers().FindAll(p => p.Team != player.Team && p.PawnIsAlive)) + foreach (var enemy in Utilities.GetPlayers().FindAll(p => p.Team != player.Team)) { - var enemyPawn = enemy.PlayerPawn.Value; + var enemyEvent = PlayerManager.GetPlayerEvent(enemy); + if (enemyEvent == null || !enemyEvent.IsValid) continue; + + var enemyPawn = enemyEvent.PlayerPawn.Value; if (enemyPawn == null) continue; + enemyPawn.EntitySpottedState.SpottedByMask[0] |= (1u << (int)(playerIndex % 32)); - } - + var bombEntities = Utilities.FindAllEntitiesByDesignerName("weapon_c4").ToList(); - if (bombEntities.Any()) + if (bombEntities.Count != 0) { var bomb = bombEntities.FirstOrDefault(); - if (bomb != null) + if (bomb != null && bomb.IsValid) bomb.EntitySpottedState.SpottedByMask[0] |= (1u << (int)(playerIndex % 32)); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs b/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs index aa055c4..7691e18 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs @@ -1,4 +1,4 @@ -using System.Collections.Concurrent; +using System.Collections.Concurrent; using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; @@ -10,7 +10,7 @@ namespace src.player.skills public class RandomWeapon : ISkill { private const Skills skillName = Skills.RandomWeapon; - private static readonly ConcurrentDictionary SkillPlayerInfo = new(); + private static readonly ConcurrentDictionary SkillPlayerInfo = new(); private static readonly object setLock = new(); private static readonly HashSet pistols = new(StringComparer.Ordinal) @@ -43,17 +43,17 @@ namespace src.player.skills var players = Utilities.GetPlayers().ToArray(); foreach (var player in players) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName && SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill == skillName && SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) UpdateHUD(player, skillInfo); } } public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo + SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + SteamID = player.Index, CanUse = true, Cooldown = DateTime.MinValue, }); @@ -61,7 +61,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + SkillPlayerInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } @@ -77,7 +77,7 @@ namespace src.player.skills skillInfo.CanUse = true; } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.PrintHTML = cooldown == 0 @@ -90,8 +90,8 @@ namespace src.player.skills var pawn = player.PlayerPawn.Value; if (pawn?.CBodyComponent == null) return; - if (!SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) return; - if (!player.IsValid || !player.PawnIsAlive) return; + if (!SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) return; + if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; if (!skillInfo.CanUse) { @@ -146,13 +146,13 @@ namespace src.player.skills } } - ulong steamId = player.SteamID; + uint playerIndex = player.Index; Instance.AddTimer(.1f, () => { - var pl = Utilities.GetPlayerFromSteamId(steamId); + var pl = Utilities.GetPlayerFromIndex((int)playerIndex); if (pl == null || !pl.IsValid) return; pl.GiveNamedItem(newWeapon); - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } public class PlayerSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs b/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs index 5d3a50d..c93b08c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs @@ -1,13 +1,10 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; -using CounterStrikeSharp.API.Modules.Timers; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; using System.Drawing; -using static src.jRandomSkills; -using Timer = CounterStrikeSharp.API.Modules.Timers.Timer; namespace src.player.skills { @@ -15,7 +12,6 @@ namespace src.player.skills { private const Skills skillName = Skills.ReZombie; private static readonly ConcurrentDictionary zombies = []; - private static readonly ConcurrentDictionary timers = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -50,10 +46,13 @@ namespace src.player.skills public static void WeaponEquip(EventItemEquip @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); var weapon = @event.Item; if (player == null || !player.IsValid) return; - if (!zombies.ContainsKey(player.Index) || weapon == "c4") return; + + if (!zombies.ContainsKey(player.Index) || weapon == "c4" || weapon.Contains("knife") || weapon.Contains("bayonet")) + return; + player.ExecuteClientCommand("slot3"); } @@ -69,106 +68,33 @@ namespace src.player.skills zombies.Clear(); } - public static void PlayerDeath(EventPlayerDeath @event) + public static void PlayerHurt(EventPlayerHurt @event) { - var player = @event.Userid; - if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || zombies.ContainsKey(player.Index)) return; + var victim = PlayerManager.GetPlayerEvent(@event.Userid); + if (victim == null || !victim.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return; + var pawn = victim.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return; - var pawn = player.PlayerPawn.Value; - if (pawn.AbsOrigin == null) return; + if (zombies.ContainsKey(victim.Index)) return; - Vector deadPosition = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z); - QAngle angle = new(pawn.V_angle.X, pawn.V_angle.Y, 0); + var playerInfo = PlayerManager.GetPlayerByIndex(victim.Index); + if (playerInfo?.Skill != skillName || pawn.Health > 0) return; - ulong steamID = player.SteamID; - int team = player.TeamNum; - if (team != 2 && team != 3) return; + lock (setLock) + { + var zombieHealth = SkillsInfo.GetValue(skillName, "zombieHealth"); + bool isBlock = victim.TeamChanged; - player.Respawn(); + zombies.TryAdd(victim.Index, 0); - Server.NextFrame(() => { - lock (setLock) - { - var player = Utilities.GetPlayerFromSteamId(steamID); - if (player == null || !player.IsValid || !player.PlayerPawn.IsValid) return; + if (isBlock) return; - var pawn = player.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid) return; + SetPlayerColor(pawn, false); + SkillUtils.AddHealth(pawn, zombieHealth - pawn.Health, zombieHealth); - var zombieHealth = SkillsInfo.GetValue(skillName, "zombieHealth"); - - bool isBlock = team != player.TeamNum || player.TeamChanged; - - player.Respawn(); - zombies.TryAdd(player.Index, 0); - - if (isBlock) - { - pawn.Flags |= (uint)Flags_t.FL_FROZEN; - pawn.Teleport(new Vector(0, 0, -1000), new QAngle(90, 0, 0)); - - bool isFreezeTime = Instance.GameRules != null && Instance.GameRules.FreezePeriod == true; - - if (!isFreezeTime) - { - Server.NextFrame(() => - { - if (pawn == null || !pawn.IsValid) return; - pawn.CommitSuicide(false, true); - }); - return; - } - - ulong steamId = player.SteamID; - - if (!timers.ContainsKey(player.SteamID)) - { - var timer = Instance.AddTimer(1f, () => - { - if (player == null || !player.IsValid || pawn == null || !pawn.IsValid) - { - if (timers.TryRemove(steamId, out var t)) - t.Kill(); - return; - } - - bool isFreezeTime = Instance.GameRules != null && Instance.GameRules.FreezePeriod == true; - - if (!isFreezeTime) - { - if (timers.TryRemove(steamId, out var t)) - t.Kill(); - - pawn.CommitSuicide(false, true); - return; - } - - }, TimerFlags.STOP_ON_MAPCHANGE | TimerFlags.REPEAT); - - timers.TryAdd(player.SteamID, timer); - } - - return; - } - - SetPlayerColor(pawn, false); - SkillUtils.AddHealth(pawn, zombieHealth - 100, zombieHealth); - - pawn.Teleport(deadPosition); - pawn.Look(angle); - player.ExecuteClientCommand("slot3"); - - Instance.AddTimer(1, () => { - var player = Utilities.GetPlayerFromSteamId(steamID); - if (player == null || !player.IsValid || !player.PlayerPawn.IsValid) return; - - player.ExecuteClientCommand("slot3"); - }); - } - }); + victim.ExecuteClientCommand("slot3"); + } } public static bool OnWeaponCanAcquire(DynamicHook hook, CCSPlayerController player, CEconItemView econItem, CCSWeaponBaseVData vdata) @@ -182,7 +108,7 @@ namespace src.player.skills if (weaponName.Contains("knife") || weaponName.Contains("bayonet")) return false; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return false; hook.SetReturn(AcquireResult.InvalidItem); diff --git a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs index c0eb6bb..9ceab70 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs @@ -1,7 +1,6 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using static src.jRandomSkills; using System.Collections.Concurrent; using src.utils; @@ -10,7 +9,7 @@ namespace src.player.skills public class ReactiveArmor : ISkill { private const Skills skillName = Skills.ReactiveArmor; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; + private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -28,34 +27,38 @@ namespace src.player.skills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) UpdateHUD(player, skillInfo); } } public static void PlayerHurt(EventPlayerHurt @event) { - var attacker = @event.Attacker; var victim = @event.Userid; - int damage = @event.DmgHealth; + if (victim == null || !victim.IsValid) return; - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return; - if (SkillPlayerInfo.TryGetValue(victim!.SteamID, out var skillInfo)) + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + var victimEvent = PlayerManager.GetPlayerEvent(victim); + + if (attacker == null || !attacker.IsValid) return; + if (victimEvent == null || !victimEvent.IsValid || !victim.PawnIsAlive) return; + + if (SkillPlayerInfo.TryGetValue(victimEvent!.Index, out var skillInfo)) { - if (!victim.IsValid || !victim.PawnIsAlive || !skillInfo.CanUse) return; + if (!skillInfo.CanUse) return; skillInfo.CanUse = false; skillInfo.Cooldown = DateTime.Now; - SkillUtils.RestoreHealth(victim); + SkillUtils.RestoreHealth(victimEvent); } } public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo + SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + SteamID = player.Index, CanUse = true, Cooldown = DateTime.MinValue, }); @@ -63,7 +66,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + SkillPlayerInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } @@ -79,7 +82,7 @@ namespace src.player.skills skillInfo.CanUse = true; } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; if (cooldown == 0) diff --git a/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs b/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs index 36326c8..f644a26 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using static src.jRandomSkills; @@ -19,7 +19,7 @@ namespace src.player.skills if (Server.TickCount % (int)(64 * SkillsInfo.GetValue(skillName, "cooldown")) != 0) return; foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); 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 1521609..a9c4be5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; @@ -12,7 +12,7 @@ namespace src.player.skills public class Replicator : ISkill { private const Skills skillName = Skills.Replicator; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; + private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -32,25 +32,25 @@ namespace src.player.skills var entities = Utilities.FindAllEntitiesByDesignerName("prop_dynamic_override"); foreach (var entity in entities) if (entity != null && entity.IsValid && entity.Entity != null && !string.IsNullOrEmpty(entity.Entity.Name) && (entity.Entity.Name?.StartsWith("Replica_") ?? false)) - entity.AcceptInput("Kill"); + EntityManager.DestroyEntity(entity.Index); } public static void OnTick() { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) UpdateHUD(player, skillInfo); } } public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo + SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + SteamID = player.Index, CanUse = true, Cooldown = DateTime.MinValue, }); @@ -58,7 +58,9 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + if (player == null) return; + SkillPlayerInfo.TryRemove(player.Index, out _); + EntityManager.DestroyPlayerEntities(player.Index); SkillUtils.ResetPrintHTML(player); } @@ -74,7 +76,7 @@ namespace src.player.skills skillInfo.CanUse = true; } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; if (cooldown == 0) @@ -88,9 +90,9 @@ namespace src.player.skills var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) { - if (!player.IsValid || !player.PawnIsAlive) return; + if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; if (skillInfo.CanUse) { skillInfo.CanUse = false; @@ -106,7 +108,7 @@ namespace src.player.skills if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null || playerPawn.AbsRotation == null) return; - var replica = Utilities.CreateEntityByName("prop_dynamic_override"); + var replica = EntityManager.CreateTrackedPropOverride(player.Index); if (replica == null || !replica.IsValid) return; @@ -142,7 +144,7 @@ namespace src.player.skills var replica = param.As(); if (replica == null || !replica.IsValid) return; replica.EmitSound("GlassBottle.BulletImpact", volume: 1f); - replica.AcceptInput("Kill"); + EntityManager.DestroyEntity(replica.Index); CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); if (attackerPawn.DesignerName != "player") diff --git a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs index ca787a1..28191a3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using static src.jRandomSkills; @@ -10,7 +10,7 @@ namespace src.player.skills public class Retreat : ISkill { private const Skills skillName = Skills.Retreat; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; + private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -28,18 +28,18 @@ namespace src.player.skills { foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) UpdateHUD(player, skillInfo); } } public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo + SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + SteamID = player.Index, CanUse = true, Cooldown = DateTime.MinValue, }); @@ -47,7 +47,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + SkillPlayerInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } @@ -63,7 +63,7 @@ namespace src.player.skills skillInfo.CanUse = true; } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; if (cooldown == 0) @@ -77,9 +77,9 @@ namespace src.player.skills var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) { - if (!player.IsValid || !player.PawnIsAlive) return; + if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; if (skillInfo.CanUse) { skillInfo.CanUse = false; diff --git a/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs b/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs index f504875..253ec3c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using static src.jRandomSkills; @@ -24,12 +24,12 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var attacker = @event.Attacker; - var victim = @event.Userid; + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + var victim = PlayerManager.GetPlayerEvent(@event.Userid); int damage = @event.DmgHealth; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var attackerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (attackerInfo == null || attackerInfo.Skill != skillName) return; if (playersToSender.ContainsKey(victim!.Handle)) diff --git a/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs b/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs index 39d6f03..3a046b8 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs @@ -17,7 +17,7 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; int moneyBonus = Instance.Random.Next(SkillsInfo.GetValue(skillName, "minMoney"), SkillsInfo.GetValue(skillName, "maxMoney")); @@ -32,7 +32,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; var moneyServices = player.InGameMoneyServices; diff --git a/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs b/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs index 4446e05..91a6565 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs @@ -17,12 +17,12 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var victim = @event.Userid; - var attacker = @event.Attacker; + var victim = PlayerManager.GetPlayerEvent(@event.Userid); + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); var damage = @event.DmgHealth; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var attackerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (attackerInfo?.Skill != skillName) return; int moneyToSteal = damage * SkillsInfo.GetValue(skillName, "moneyMultiplier"); diff --git a/jRandomSkills - SRC Files/src/player/skills/Rubber.cs b/jRandomSkills - SRC Files/src/player/skills/Rubber.cs index 03c4b35..d0c775c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Rubber.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Rubber.cs @@ -24,11 +24,11 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var attacker = @event.Attacker; - var victim = @event.Userid; + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + var victim = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var attackerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); var victimPawn = victim!.PlayerPawn.Value; if (victimPawn == null || !victimPawn.IsValid) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/Saper.cs b/jRandomSkills - SRC Files/src/player/skills/Saper.cs index f21eb58..ee91aee 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Saper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Saper.cs @@ -17,10 +17,10 @@ namespace src.player.skills public static void BombBegindefuse(EventBombBegindefuse @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (Instance.IsPlayerValid(player)) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) { var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); @@ -35,10 +35,10 @@ namespace src.player.skills public static void BombBeginplant(EventBombBeginplant @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) { var bombEntities = Utilities.FindAllEntitiesByDesignerName("weapon_c4").ToList(); diff --git a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs index 82721b9..b18ccaf 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs @@ -25,11 +25,11 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var victim = @event.Userid; + var victim = PlayerManager.GetPlayerEvent(@event.Userid); int damage = @event.DmgHealth; if (!Instance.IsPlayerValid(victim)) return; - var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + var victimInfo = PlayerManager.GetPlayerByIndex(victim!.Index); if (victimInfo == null || victimInfo.Skill != skillName) return; var victimPawn = victim!.PlayerPawn.Value; @@ -66,9 +66,6 @@ namespace src.player.skills pawn.Health = health; Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth"); - - pawn.ArmorValue = 0; - Utilities.SetStateChanged(pawn, "CCSPlayerPawn", "m_ArmorValue"); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#d41c1c", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, int startHealth = 50) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Shade.cs b/jRandomSkills - SRC Files/src/player/skills/Shade.cs index b0b78a8..e4c8b9a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Shade.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Shade.cs @@ -26,13 +26,13 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var attacker = @event.Attacker; - var victim = @event.Userid; + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); + var victim = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return; - var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var victimInfo = PlayerManager.GetPlayerByIndex(victim!.Index); + var attackerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (attackerInfo?.Skill == skillName) if (Instance.Random.NextDouble() <= attackerInfo.SkillChance) @@ -41,14 +41,14 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue(skillName, "ChanceTo") - SkillsInfo.GetValue(skillName, "ChanceFrom")) + SkillsInfo.GetValue(skillName, "ChanceFrom"); playerInfo.SkillChance = newChance; SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } public static void DisableSkill(CCSPlayerController player) @@ -73,7 +73,7 @@ namespace src.player.skills private static void UpdateHUD(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.PrintHTML = $"{player.GetTranslation("shade_nospace")}"; } diff --git a/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs b/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs index d920c2c..9191387 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -17,10 +17,10 @@ namespace src.player.skills public static void BombPlanted(EventBombPlanted @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); diff --git a/jRandomSkills - SRC Files/src/player/skills/Silent.cs b/jRandomSkills - SRC Files/src/player/skills/Silent.cs index 3ee884c..a255218 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Silent.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Silent.cs @@ -1,9 +1,8 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using static src.jRandomSkills; -using static src.utils.RarityManager; namespace src.player.skills { @@ -26,9 +25,9 @@ namespace src.player.skills return; var player = Utilities.GetPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex); - if (!Instance.IsPlayerValid(player)) return; + if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo?.Skill != skillName) return; um.Recipients.Clear(); diff --git a/jRandomSkills - SRC Files/src/player/skills/Smoker.cs b/jRandomSkills - SRC Files/src/player/skills/Smoker.cs index da3fb6b..dc787f6 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Smoker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Smoker.cs @@ -1,6 +1,5 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Timers; using CounterStrikeSharp.API.Modules.Utils; @@ -14,7 +13,7 @@ namespace src.player.skills public class Smoker : ISkill { private const Skills skillName = Skills.Smoker; - private readonly static ConcurrentDictionary> playerSmokes = []; + private readonly static ConcurrentDictionary> playerSmokes = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -39,19 +38,19 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - if (playerSmokes.TryRemove(player.SteamID, out var timers)) + if (playerSmokes.TryRemove(player.Index, out var timers)) timers.ForEach(t => t?.Kill()); } public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; - ulong steamID = player.SteamID; + uint playerIndex = player.Index; Vector pos = new(@event.X, @event.Y, @event.Z); float refillInterval = 15.5f; @@ -59,7 +58,7 @@ namespace src.player.skills Timer? smokeTimer = null; smokeTimer = Instance.AddTimer(refillInterval, () => { - var player = Utilities.GetPlayerFromSteamId(steamID); + var player = Utilities.GetPlayerFromIndex((int)playerIndex); if (player == null || !player.IsValid) { @@ -70,7 +69,7 @@ namespace src.player.skills SkillUtils.CreateSmokeGrenadeProjectile(pos, QAngle.Zero, Vector.Zero, player.TeamNum); }, TimerFlags.REPEAT | TimerFlags.STOP_ON_MAPCHANGE); - playerSmokes.AddOrUpdate(player.SteamID, [smokeTimer], (_, list) => { list.Add(smokeTimer); return list; }); + playerSmokes.AddOrUpdate(player.Index, [smokeTimer], (_, list) => { list.Add(smokeTimer); return list; }); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#b5ab8f", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = 1, Rarity rarity = Rarity.Common) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs b/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs index 97fbcec..124b841 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -10,9 +10,9 @@ namespace src.player.skills public class SniperElite : ISkill { private const Skills skillName = Skills.SniperElite; - private static readonly ConcurrentDictionary> playerAWPIndexes = []; - private static readonly ConcurrentDictionary savedWeapons = []; - private static readonly ConcurrentDictionary isProcessing = []; + private static readonly ConcurrentDictionary> playerAWPIndexes = []; + private static readonly ConcurrentDictionary savedWeapons = []; + private static readonly ConcurrentDictionary isProcessing = []; private static readonly object setLock = new(); private const string weapon_awp = "weapon_awp"; @@ -46,45 +46,45 @@ namespace src.player.skills public static void PlayerDeath(EventPlayerDeath @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) DisableSkill(player); } public static void WeaponEquip(EventItemEquip @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) { if (rifles.Contains(@event.Item) && @event.Item != weapon_awp) - savedWeapons.AddOrUpdate(player.SteamID, string.Empty, (_, _) => string.Empty); + savedWeapons.AddOrUpdate(player.Index, string.Empty, (_, _) => string.Empty); DeleteDroppedAWP(player); } } public static void EnableSkill(CCSPlayerController player) { - savedWeapons.TryAdd(player.SteamID, string.Empty); + savedWeapons.TryAdd(player.Index, string.Empty); } public static void DisableSkill(CCSPlayerController player) { player.ExecuteClientCommand("slot3"); - if (playerAWPIndexes.TryGetValue(player.SteamID, out var AWPs)) + if (playerAWPIndexes.TryGetValue(player.Index, out var AWPs)) foreach (var index in AWPs.ToList()) SkillUtils.SafeKillEntity(index); - if (savedWeapons.TryGetValue(player.SteamID, out string? savedWeapon) && !string.IsNullOrWhiteSpace(savedWeapon)) + if (savedWeapons.TryGetValue(player.Index, out string? savedWeapon) && !string.IsNullOrWhiteSpace(savedWeapon)) Server.NextFrame(() => { - if (player == null || !player.IsValid || !player.PawnIsAlive) return; + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid) return; @@ -100,24 +100,24 @@ namespace src.player.skills player.ExecuteClientCommand("lastinv"); }); - savedWeapons.TryRemove(player.SteamID, out _); - playerAWPIndexes.TryRemove(player.SteamID, out _); - isProcessing.TryRemove(player.SteamID, out _); + savedWeapons.TryRemove(player.Index, out _); + playerAWPIndexes.TryRemove(player.Index, out _); + isProcessing.TryRemove(player.Index, out _); } public static void UseSkill(CCSPlayerController player) { - if (player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || isProcessing.ContainsKey(player.SteamID)) return; - if (savedWeapons.ContainsKey(player.SteamID)) + if (player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || isProcessing.ContainsKey(player.Index)) return; + if (savedWeapons.ContainsKey(player.Index)) RemoveAndGiveWeapon(player); } private static void RemoveAndGiveWeapon(CCSPlayerController player) { - ulong steamID = player.SteamID; + uint playerIndex = player.Index; try { - if (!isProcessing.TryAdd(steamID, 0)) return; + if (!isProcessing.TryAdd(playerIndex, 0)) return; CBasePlayerWeapon? activeRifle = GetActiveRifle(player); string weaponToGive = weapon_awp; @@ -128,24 +128,24 @@ namespace src.player.skills bool isScriptAWP = false; lock (setLock) - isScriptAWP = playerAWPIndexes.TryGetValue(steamID, out var indexes) && indexes.Contains(activeRifle.Index); + isScriptAWP = playerAWPIndexes.TryGetValue(playerIndex, out var indexes) && indexes.Contains(activeRifle.Index); if (isScriptAWP) { - if (savedWeapons.TryGetValue(steamID, out var savedWeapon) && !string.IsNullOrEmpty(savedWeapon)) + if (savedWeapons.TryGetValue(playerIndex, out var savedWeapon) && !string.IsNullOrEmpty(savedWeapon)) { weaponToGive = savedWeapon; - savedWeapons.AddOrUpdate(steamID, string.Empty, (_, _) => string.Empty); + savedWeapons.AddOrUpdate(playerIndex, string.Empty, (_, _) => string.Empty); } else { - isProcessing.TryRemove(steamID, out _); + isProcessing.TryRemove(playerIndex, out _); return; } } else { - savedWeapons.AddOrUpdate(steamID, currentWeaponName, (_, _) => currentWeaponName); + savedWeapons.AddOrUpdate(playerIndex, currentWeaponName, (_, _) => currentWeaponName); weaponToGive = weapon_awp + "_script"; } @@ -153,17 +153,17 @@ namespace src.player.skills } else { - if (savedWeapons.TryGetValue(steamID, out string? savedWeapon) && !string.IsNullOrEmpty(savedWeapon)) + if (savedWeapons.TryGetValue(playerIndex, out string? savedWeapon) && !string.IsNullOrEmpty(savedWeapon)) { weaponToGive = savedWeapon; - savedWeapons.AddOrUpdate(steamID, string.Empty, (_, _) => string.Empty); + savedWeapons.AddOrUpdate(playerIndex, string.Empty, (_, _) => string.Empty); } else weaponToGive = weapon_awp + "_script"; } Instance.AddTimer(.15f, () => { - var player = Utilities.GetPlayerFromSteamId(steamID); + var player = Utilities.GetPlayerFromIndex((int)playerIndex); if (player == null || !player.IsValid) return; if (player != null && player.IsValid && player.PlayerPawn != null && player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid) @@ -178,21 +178,21 @@ namespace src.player.skills lock (setLock) { - if (!playerAWPIndexes.ContainsKey(steamID)) - playerAWPIndexes.TryAdd(steamID, []); + if (!playerAWPIndexes.ContainsKey(playerIndex)) + playerAWPIndexes.TryAdd(playerIndex, []); - if (playerAWPIndexes.TryGetValue(steamID, out var list)) + if (playerAWPIndexes.TryGetValue(playerIndex, out var list)) list.Add(createdWeapon.Index); } } } DeleteDroppedAWP(player); - isProcessing.TryRemove(steamID, out _); + isProcessing.TryRemove(playerIndex, out _); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } catch { - isProcessing.TryRemove(steamID, out _); + isProcessing.TryRemove(playerIndex, out _); } } @@ -210,7 +210,7 @@ namespace src.player.skills lock (setLock) { - if (playerAWPIndexes.TryGetValue(player.SteamID, out var AWPs)) + if (playerAWPIndexes.TryGetValue(player.Index, out var AWPs)) foreach (var index in AWPs.ToList()) if (!myWeaponsIndexes.Contains(index)) { diff --git a/jRandomSkills - SRC Files/src/player/skills/Soldier.cs b/jRandomSkills - SRC Files/src/player/skills/Soldier.cs index e60d283..9184e55 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Soldier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Soldier.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; @@ -18,13 +18,15 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; + float newScale = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue(skillName, "ChanceTo") - SkillsInfo.GetValue(skillName, "ChanceFrom")) + SkillsInfo.GetValue(skillName, "ChanceFrom"); playerInfo.SkillChance = newScale; + newScale = (float)Math.Round(newScale, 2); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newScale)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } public static void OnTakeDamage(DynamicHook h) @@ -44,13 +46,12 @@ namespace src.player.skills if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) return; - CCSPlayerController attacker = attackerPawn.Controller.Value.As(); - CCSPlayerController victim = victimPawn.Controller.Value.As(); + CCSPlayerController attacker = PlayerManager.GetPlayerEvent(attackerPawn.Controller.Value.As())!; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (playerInfo == null) return; - if (playerInfo.Skill == skillName && attacker.PawnIsAlive) + if (playerInfo.Skill == skillName) { float? skillChance = playerInfo.SkillChance; param2.Damage *= skillChance ?? 1f; diff --git a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs index a2d9399..54f07da 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs @@ -1,17 +1,16 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; -using static src.jRandomSkills; namespace src.player.skills { public class SoundMaker : ISkill { private const Skills skillName = Skills.SoundMaker; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; + private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); private const string soundEventName = "Hostage.Pain"; @@ -30,22 +29,23 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryAdd(player.SteamID, 0); + SkillPlayerInfo.TryAdd(player.Index, 0); } public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + SkillPlayerInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } public static void PlayerDeath(EventPlayerDeath @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) - SkillPlayerInfo.TryRemove(player.SteamID, out _); + SkillPlayerInfo.TryRemove(player.Index, out _); } public static void PlayerMakeSound(UserMessage um) @@ -53,21 +53,45 @@ namespace src.player.skills var soundevent = um.ReadUInt("soundevent_hash"); if (soundevent != soundEventHash) return; - var userIndex = um.ReadUInt("source_entity_index"); - if (userIndex == 0) return; + var entityIndex = um.ReadUInt("source_entity_index"); + if (entityIndex == 0) return; - var sourcePlayer = Utilities.GetPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex); - if (sourcePlayer == null || !sourcePlayer.IsValid) return; - - var toRemove = um.Recipients.Where(r => + CCSPlayerController? emitter = null; + foreach (var p in Utilities.GetPlayers().Where(p => p != null && p.IsValid)) { - if (r.Team == sourcePlayer.Team) return true; - if (SkillPlayerInfo.ContainsKey(r.SteamID)) return false; - return true; - }).ToList(); + if (p.PlayerPawn.Value?.Index == entityIndex) + { + emitter = p; + break; + } - foreach (var player in toRemove) - um.Recipients.Remove(player); + var entities = EntityManager.GetPlayerEntities(p.Index, "empty_prop"); + if (entities.Count > 0 && entities[0] == entityIndex) + { + emitter = p; + break; + } + } + + if (emitter == null) + { + foreach (var p in Utilities.GetPlayers().Where(p => p != null && p.IsValid)) + um.Recipients.Remove(p); + return; + } + + foreach (var recipient in Utilities.GetPlayers().Where(p => p != null && p.IsValid)) + { + bool hasSkill = SkillPlayerInfo.ContainsKey(recipient.Index); + + var bot = PlayerManager.GetPlayerEvent(recipient); + bool botSkill = bot != null && SkillPlayerInfo.ContainsKey(bot.Index); + + bool isTeammate = recipient.Team == emitter.Team; + + if ((!hasSkill && !botSkill) || isTeammate) + um.Recipients.Remove(recipient); + } } public static void OnTick() @@ -75,8 +99,20 @@ namespace src.player.skills if (Server.TickCount % (60 * SkillsInfo.GetValue(skillName, "cooldown")) != 0) return; foreach (var player in Utilities.GetPlayers() - .Where(p => p != null && p.IsValid && p.PawnIsAlive && p.PlayerPawn.Value != null && p.PlayerPawn.Value.IsValid)) + .Where(p => p != null && p.IsValid && p.PlayerPawn.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0)) + { + var entities = EntityManager.GetPlayerEntities(player.Index, "empty_prop"); + + if (entities.Count == 0) + { player.PlayerPawn.Value!.EmitSound(soundEventName, volume: 1f); + continue; + } + + var entity = Utilities.GetEntityFromIndex((int)entities[0]); + if (entity != null && entity.IsValid) + entity.EmitSound(soundEventName, volume: 1f); + } } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#e3ed8c", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, int cooldown = 2) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Spectator.cs b/jRandomSkills - SRC Files/src/player/skills/Spectator.cs index c72e22d..7ed2915 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Spectator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Spectator.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using System.Drawing; @@ -11,7 +11,7 @@ namespace src.player.skills public class Spectator : ISkill { private const Skills skillName = Skills.Spectator; - private static readonly ConcurrentDictionary cameras = []; + private static readonly ConcurrentDictionary cameras = []; public static void LoadSkill() { @@ -21,25 +21,21 @@ namespace src.player.skills public static void NewRound() { foreach (var info in cameras) - { - var cam = Utilities.GetEntityFromIndex((int)info.Value.Item2); - if (cam != null && cam.IsValid) - cam.AcceptInput("Kill"); - } - + EntityManager.DestroyEntity(info.Value.Item2); + cameras.Clear(); } public static void WeaponPickup(EventItemPickup @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; var pawn = player!.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return; - if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item1 != pawn.CameraServices.ViewEntity.Raw) + if (cameras.TryGetValue(player.Index, out var cameraInfo) && cameraInfo.Item1 != pawn.CameraServices.ViewEntity.Raw) BlockWeapon(player, true); } @@ -52,13 +48,15 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { + if (player == null) return; ChangeCamera(player, true); + EntityManager.DestroyPlayerEntities(player.Index); } public static void OnTick() { foreach (var player in Utilities.GetPlayers()) - if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2 != 0) + if (cameras.TryGetValue(player.Index, out var cameraInfo) && cameraInfo.Item2 != 0) { var enemy = Utilities.GetPlayerFromIndex((int)cameraInfo.Item3); @@ -68,7 +66,7 @@ namespace src.player.skills return; } - var enemyPawn = player.PlayerPawn.Value; + var enemyPawn = enemy.PlayerPawn.Value; if (enemyPawn == null || !enemyPawn.IsValid) { ChangeCamera(player, true); @@ -88,13 +86,13 @@ namespace src.player.skills var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return; - if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2 != 0) + if (cameras.TryGetValue(player.Index, out var cameraInfo) && cameraInfo.Item2 != 0) { orginalCameraRaw = cameraInfo.Item1; var cam = Utilities.GetEntityFromIndex((int)cameraInfo.Item2); if (cam != null && cam.IsValid) - cam.AcceptInput("Kill"); + EntityManager.DestroyEntity(cam.Index); if (!forceToDefault) newCameraRaw = CreateCamera(player); @@ -120,12 +118,20 @@ namespace src.player.skills private static uint CreateCamera(CCSPlayerController player) { - var camera = Utilities.CreateEntityByName("prop_dynamic"); + var camera = EntityManager.CreateTrackedDynamicProp(player.Index); if (camera == null || !camera.IsValid) return 0; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team).ToList(); + var enemies = Utilities.GetPlayers().Where(p => + p != null && + p.IsValid && + p.Team != player.Team && + p.PlayerPawn?.Value != null && + p.PlayerPawn.Value.IsValid && + p.PlayerPawn.Value.Health > 0).ToList(); + if (enemies.Count == 0) return 0; + var enemy = enemies[Instance.Random.Next(enemies.Count)]; var pawn = enemy.PlayerPawn.Value; @@ -139,17 +145,29 @@ namespace src.player.skills Server.NextFrame(() => { if (camera == null || !camera.IsValid) return; + camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); camera.SetModel("models/sprays/spray_plane.vmdl"); - camera.Render = Color.FromArgb(0, 255, 255, 255); + camera.Render = Color.FromArgb(1, 255, 255, 255); camera.Teleport(pos, angle); camera.DispatchSpawn(); - camera.AcceptInput("SetParent", pawn, pawn, "!activator"); + + CBaseEntity target = pawn; + var entities = EntityManager.GetPlayerEntities(enemy.Index, "empty_prop"); + + if (entities.Count > 0) + { + var entity = Utilities.GetEntityFromIndex((int)entities[0]); + if (entity != null && entity.IsValid) + target = entity; + } + + camera.AcceptInput("SetParent", target, target, "!activator"); }); - if (cameras.TryGetValue(player.SteamID, out var cameraInfo)) - cameras.AddOrUpdate(player.SteamID, (cameraInfo.Item1, camera.Index, player.Index), (k, v) => (cameraInfo.Item1, camera.Index, player.Index)); + if (cameras.TryGetValue(player.Index, out var cameraInfo)) + cameras.AddOrUpdate(player.Index, (cameraInfo.Item1, camera.Index, player.Index), (k, v) => (cameraInfo.Item1, camera.Index, player.Index)); else - cameras.AddOrUpdate(player.SteamID, (pawn.CameraServices.ViewEntity.Raw, camera.Index, player.Index), (k, v) => (pawn.CameraServices.ViewEntity.Raw, camera.Index, player.Index)); + cameras.AddOrUpdate(player.Index, (pawn.CameraServices.ViewEntity.Raw, camera.Index, player.Index), (k, v) => (pawn.CameraServices.ViewEntity.Raw, camera.Index, player.Index)); return camera.EntityHandle.Raw; } diff --git a/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs b/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs index b0c9de6..b8e23b4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using static src.jRandomSkills; @@ -10,7 +10,7 @@ namespace src.player.skills public class SwapPosition : ISkill { private const Skills skillName = Skills.SwapPosition; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; + private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -29,22 +29,29 @@ namespace src.player.skills if (SkillUtils.IsFreezeTime()) return; foreach (var player in Utilities.GetPlayers()) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) continue; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + { + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) + { if (skillInfo.LastClick.AddSeconds(4) >= DateTime.Now) UpdateHUD(player, skillInfo, true); else UpdateHUD(player, skillInfo, false); + } + } } } public static void EnableSkill(CCSPlayerController player) { + if (player == null || !player.IsValid) return; + var cooldownBeforeUse = SkillsInfo.GetValue(skillName, "cooldownBeforeUse"); - SkillPlayerInfo.TryAdd(player.SteamID, new ZamianaMiejsc_PlayerInfo + SkillPlayerInfo.TryAdd(player.Index, new ZamianaMiejsc_PlayerInfo { - SteamID = player.SteamID, + SteamID = player.Index, CanUse = false, Cooldown = cooldownBeforeUse <= 0 ? DateTime.MinValue : Event.GetFreezeTimeEnd().AddSeconds(cooldownBeforeUse - SkillsInfo.GetValue(skillName, "cooldown")), LastClick = DateTime.MinValue, @@ -54,12 +61,15 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + if (player == null) return; + SkillPlayerInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } private static void UpdateHUD(CCSPlayerController player, ZamianaMiejsc_PlayerInfo skillInfo, bool showInfo) { + if(player == null || !player.IsValid) return; + float cooldown = 0; if (skillInfo != null) { @@ -70,7 +80,7 @@ namespace src.player.skills skillInfo.CanUse = true; } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player.Index); if (playerInfo == null) return; if (cooldown == 0) @@ -91,7 +101,7 @@ namespace src.player.skills var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) { List enemy = Utilities.GetPlayers().FindAll(p => Instance.IsPlayerValid(p) && p.Team != player.Team && p.PawnIsAlive); if (enemy.Count == 0) @@ -102,7 +112,7 @@ namespace src.player.skills } CCSPlayerController randomEnemy = enemy[Instance.Random.Next(0, enemy.Count)]; - if (!player.IsValid || !player.PawnIsAlive || !randomEnemy.IsValid || !randomEnemy.PawnIsAlive) return; + if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE || !randomEnemy.IsValid || !randomEnemy.PawnIsAlive) return; if (skillInfo.CanUse) { skillInfo.FindedEnemy = true; diff --git a/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs b/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs index 5267bce..6da0cf8 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs @@ -18,23 +18,23 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue(skillName, "ChanceTo") - SkillsInfo.GetValue(skillName, "ChanceFrom")) + SkillsInfo.GetValue(skillName, "ChanceFrom"); playerInfo.SkillChance = newChance; SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } public static void PlayerHurt(EventPlayerHurt @event) { - var victim = @event.Userid; - var attacker = @event.Attacker; + var victim = PlayerManager.GetPlayerEvent(@event.Userid); + var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); if (!Instance.IsPlayerValid(victim) || !Instance.IsPlayerValid(attacker)) return; - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var attackerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); if (attackerInfo?.Skill == skillName) if (Instance.Random.NextDouble() <= attackerInfo.SkillChance) diff --git a/jRandomSkills - SRC Files/src/player/skills/Thief.cs b/jRandomSkills - SRC Files/src/player/skills/Thief.cs index cc26800..ded984e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Thief.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Thief.cs @@ -19,21 +19,37 @@ namespace src.player.skills public static void OnTick() { if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + + foreach (var player in Utilities.GetPlayers().Where(p => p != null && p.IsValid && SkillUtils.HasMenu(p))) { - if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) continue; - if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p => + p != null && + p.IsValid) + .Select(p => PlayerManager.GetPlayerEvent(p)) + .Where(p => + p != null && + p.IsValid && + p.Team != player.Team && + p.PlayerPawn?.Value != null && + p.PlayerPawn.Value.IsValid && + p.PlayerPawn.Value.Health > 0 && + !p.IsHLTV && + p.Team != CsTeam.Spectator + && p.Team != CsTeam.None + ).ToArray(); ConcurrentBag<(string, string)> menuItems = []; foreach (var enemy in enemies) { - var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + var enemyInfo = PlayerManager.GetPlayerByIndex(enemy.Index); if (enemyInfo == null) continue; + var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; + menuItems.Add(($"{enemy.PlayerName} : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); } SkillUtils.UpdateMenu(player, menuItems); @@ -42,25 +58,36 @@ namespace src.player.skills public static void NewRound() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in Utilities.GetPlayers().Where(p => p != null && p.IsValid)) SkillUtils.CloseMenu(player); } public static void TypeSkill(CCSPlayerController player, string[] commands) { - if (player == null) return; + if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - if (!player.IsValid || !player.PawnIsAlive) return; + if (player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + + if (commands == null || commands.Length == 0) + { + player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); + return; + } string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Index.ToString() == enemyId); + if (!uint.TryParse(enemyId, out uint enemyIndex)) + { + player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); + return; + } - if (enemy == null) + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); + if (enemy == null || !enemy.IsValid) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; @@ -71,32 +98,34 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + if (player == null || !player.IsValid) return; + + var enemies = Utilities.GetPlayers() + .Where(p => p != null + && p.PawnIsAlive + && p.Team != player.Team + && p.IsValid + && p.Team != CsTeam.Spectator + && p.Team != CsTeam.None) + .ToArray(); + if (enemies.Length > 0) { - ConcurrentBag skills = []; ConcurrentBag<(string, string)> menuItems = []; foreach (var enemy in enemies) { - var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + var enemyInfo = PlayerManager.GetPlayerByIndex(enemy.Index); if (enemyInfo == null) continue; + var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; - skills.Add(skillData.Skill.ToString()); + menuItems.Add(($"{enemy.PlayerName} : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); } - int ctSkills = Event.counterterroristSkills.Count(s => skills.Contains(s.Name)); - int ttSkills = Event.terroristSkills.Count(s => skills.Contains(s.Name)); - if ((player.Team == CsTeam.Terrorist && ctSkills == skills.Count) || (player.Team == CsTeam.CounterTerrorist && ttSkills == skills.Count)) - { - Event.SetRandomSkill(player); - return; - } - SkillUtils.CreateMenu(player, menuItems); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t"); + border: !Utilities.GetPlayers().Any(p => p != null && p.Team == player.Team && p != player) ? "tb" : "t"); } else player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); @@ -104,84 +133,97 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; + playerInfo.SpecialSkill = Skills.None; SkillUtils.CloseMenu(player); } private static void StealSkill(CCSPlayerController player, CCSPlayerController enemy) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + if (player == null || enemy == null) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + var enemyInfo = PlayerManager.GetPlayerByIndex(enemy.Index); if (playerInfo == null || enemyInfo == null) return; var enemySkill = enemyInfo.Skill; bool ctSkill = Event.counterterroristSkills.Any(s => s.Name == enemySkill.ToString()); bool ttSkill = Event.terroristSkills.Any(s => s.Name == enemySkill.ToString()); - ulong enemySteamId = enemy.SteamID; - ulong playerSteamId = player.SteamID; + uint playerIndex = player.Index; + uint enemyIndex = enemy.Index; if ((player.Team == CsTeam.Terrorist && ctSkill) || (player.Team == CsTeam.CounterTerrorist && ttSkill)) { Instance.AddTimer(.1f, () => { - var enemy = Utilities.GetPlayerFromSteamId(enemySteamId); - if (enemy == null || !enemy.IsValid) return; + var e = Utilities.GetPlayerFromIndex((int)enemyIndex); + if (e == null || !e.IsValid) return; - var player = Utilities.GetPlayerFromSteamId(playerSteamId); - if (player == null || !player.IsValid) return; + var p = Utilities.GetPlayerFromIndex((int)playerIndex); + if (p == null || !p.IsValid) return; - Instance.SkillAction(skillName.ToString(), "EnableSkill", [player]); - player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("thief_incorrect_skill", enemy.PlayerName)); - }); + Instance.SkillAction(skillName.ToString(), "EnableSkill", [p]); + p.PrintToChat($" {ChatColors.Red}" + p.GetTranslation("thief_incorrect_skill", e.PlayerName)); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); return; } SkillUtils.CloseMenu(player); Instance.AddTimer(.1f, () => { - var enemy = Utilities.GetPlayerFromSteamId(enemySteamId); - if (enemy == null || !enemy.IsValid) return; + var e = Utilities.GetPlayerFromIndex((int)enemyIndex); + if (e == null || !e.IsValid) return; - var player = Utilities.GetPlayerFromSteamId(playerSteamId); - if (player == null || !player.IsValid) return; + var p = Utilities.GetPlayerFromIndex((int)playerIndex); + if (p == null || !p.IsValid) return; - playerInfo.Skill = enemySkill; - playerInfo.SpecialSkill = skillName; + var pInfo = PlayerManager.GetPlayerByIndex(p.Index); + if (pInfo == null) return; - SkillUtils.CloseMenu(player); - Instance.SkillAction(enemySkill.ToString(), "EnableSkill", [player]); + pInfo.Skill = enemySkill; + pInfo.SpecialSkill = skillName; - player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("thief_player_info", enemy.PlayerName)); + SkillUtils.CloseMenu(p); + Instance.SkillAction(enemySkill.ToString(), "EnableSkill", [p]); + + p.PrintToChat($" {ChatColors.Green}" + p.GetTranslation("thief_player_info", e.PlayerName)); if (SkillsInfo.GetValue(enemySkill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) - Instance?.AddTimer(Math.Max((float)(Event.GetFreezeTimeEnd() - DateTime.Now).TotalSeconds, 0), () => { - var player = Utilities.GetPlayerFromSteamId(playerSteamId); + { + float delay = Math.Max((float)(Event.GetFreezeTimeEnd() - DateTime.Now).TotalSeconds, 0); + Instance?.AddTimer(delay, () => + { + var player = Utilities.GetPlayerFromIndex((int)playerIndex); if (player == null || !player.IsValid) return; - if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == enemySkill) == null) return; - Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", [player]); - }); + var info = PlayerManager.GetPlayerByIndex(player!.Index); + if (info?.Skill == enemySkill) + Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", [player]); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } else - Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", [player]); - }); + Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", [p]); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); Instance.AddTimer(.1f, () => { - var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemySteamId); - if (enemyInfo == null) return; + var eInfo = PlayerManager.GetPlayerByIndex(enemyIndex); + if (eInfo == null) return; - var enemy = Utilities.GetPlayerFromSteamId(enemySteamId); - if (enemy == null || !enemy.IsValid) return; + var e = Utilities.GetPlayerFromIndex((int)enemyIndex); + if (e == null || !e.IsValid) return; - Instance.SkillAction(enemySkill.ToString(), "DisableSkill", [enemy]); + Instance.SkillAction(enemySkill.ToString(), "DisableSkill", [e]); - enemyInfo.SpecialSkill = enemySkill; - enemyInfo.Skill = Skills.None; - enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("thief_enemy_info")); - }); + eInfo.SpecialSkill = enemySkill; + eInfo.Skill = Skills.None; + e.PrintToChat($" {ChatColors.Red}" + e.GetTranslation("thief_enemy_info")); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#adaec7", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs b/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs index 9a5090f..8fc906e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using System.Drawing; @@ -10,7 +10,7 @@ namespace src.player.skills public class ThirdEye : ISkill { private const Skills skillName = Skills.ThirdEye; - private static readonly ConcurrentDictionary cameras = []; + private static readonly ConcurrentDictionary cameras = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -21,11 +21,7 @@ namespace src.player.skills public static void NewRound() { foreach (var cameraIndex in cameras.Values) - { - var camera = Utilities.GetEntityFromIndex((int)cameraIndex.Item2); - if (camera != null && camera.IsValid) - camera.AcceptInput("Kill"); - } + EntityManager.DestroyEntity(cameraIndex.Item2); lock (setLock) cameras.Clear(); @@ -40,13 +36,15 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { + if (player == null) return; ChangeCamera(player, true); + EntityManager.DestroyPlayerEntities(player.Index); } public static void OnTick() { foreach (var player in Utilities.GetPlayers()) - if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2 != 0) + if (cameras.TryGetValue(player.Index, out var cameraInfo) && cameraInfo.Item2 != 0) { var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue; @@ -70,7 +68,7 @@ namespace src.player.skills uint orginalCameraRaw; uint newCameraRaw; var pawn = player.PlayerPawn.Value; - if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2 != 0) + if (cameras.TryGetValue(player.Index, out var cameraInfo) && cameraInfo.Item2 != 0) { orginalCameraRaw = cameraInfo.Item1; @@ -100,7 +98,7 @@ namespace src.player.skills private static uint CreateCamera(CCSPlayerController player) { - var camera = Utilities.CreateEntityByName("prop_dynamic"); + var camera = EntityManager.CreateTrackedDynamicProp(player.Index); if (camera == null || !camera.IsValid) return 0; var pawn = player.PlayerPawn.Value; @@ -109,13 +107,14 @@ namespace src.player.skills Server.NextFrame(() => { if (camera == null || !camera.IsValid) return; + camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); camera.SetModel("models/sprays/spray_plane.vmdl"); camera.Render = Color.FromArgb(0, 255, 255, 255); camera.Teleport(pawn!.AbsOrigin, pawn.EyeAngles); camera.DispatchSpawn(); }); - cameras.AddOrUpdate(player.SteamID, (pawn.CameraServices!.ViewEntity.Raw, camera.Index), (v, k) => (pawn.CameraServices!.ViewEntity.Raw, camera.Index)); + cameras.AddOrUpdate(player.Index, (pawn.CameraServices!.ViewEntity.Raw, camera.Index), (v, k) => (pawn.CameraServices!.ViewEntity.Raw, camera.Index)); return camera.EntityHandle.Raw; } diff --git a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs index d5fe360..3ea7b3c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs @@ -1,7 +1,7 @@ +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; -using static src.jRandomSkills; namespace src.player.skills { @@ -16,15 +16,28 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { - var attacker = @event.Attacker; var victim = @event.Userid; + if (victim == null || !victim.IsValid) return; - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); - if (victimInfo?.Skill == skillName && victim!.PawnIsAlive && attacker!.PawnIsAlive) + var attacker = @event.Attacker; + if (attacker == null || !attacker.IsValid) return; + + var attackerEvent = PlayerManager.GetPlayerEvent(attacker); + var victimEvent = PlayerManager.GetPlayerEvent(victim); + + if (attackerEvent == null || !attackerEvent.IsValid) return; + if (victimEvent == null || !victimEvent.IsValid ) return; + + var attackerPawn = attackerEvent.PlayerPawn.Value; + if (attackerPawn == null || !attackerPawn.IsValid || attackerPawn.Health == 0) return; + + if (attackerEvent.Index == victimEvent.Index) return; + + var victimInfo = PlayerManager.GetPlayerByIndex(victimEvent!.Index); + if (victimInfo?.Skill == skillName) { - SkillUtils.TakeHealth(attacker.PlayerPawn.Value, (int)(@event.DmgHealth * SkillsInfo.GetValue(skillName, "healthTakenScale"))); - attacker.EmitSound("Player.DamageBody.Onlooker"); + SkillUtils.TakeHealth(attackerEvent.PlayerPawn.Value, (int)(@event.DmgHealth * SkillsInfo.GetValue(skillName, "healthTakenScale"))); + attackerEvent.EmitSound("Player.DamageBody.Onlooker"); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs b/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs index 31fb650..8b28f73 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs @@ -58,7 +58,7 @@ namespace src.player.skills if (knife == null || !knife.IsValid || knife.AbsRotation == null) return; - if (knifeInfo == null || knifeInfo.InitialLook == null) + if (knifeInfo == null || knifeInfo.InitialLook == null || knife.Collision == null) return; knifeInfo.IsDropped = false; @@ -71,19 +71,25 @@ namespace src.player.skills Vector.Zero ); + knife.Collision.CollisionAttribute.InteractsWith = knifeInfo.OriginalCollisionMask; + Utilities.SetStateChanged(knife, "CCollisionProperty", "m_collisionAttribute"); + var world = Utilities.GetEntityFromIndex(0); if (world != null && world.IsValid) knife.AcceptInput("SetParent", world, world, "!activator"); - + if (knifeInfo.Timer != null) knifeInfo.Timer?.Kill(); - - knifeInfo.Timer = - Instance.AddTimer(3f, () => - { - if (knife != null && knife.IsValid) - knife.AcceptInput("ClearParent"); - }, TimerFlags.STOP_ON_MAPCHANGE); + + knifeInfo.Timer = Instance.AddTimer(3f, () => + { + if (knife == null || !knife.IsValid) return; + + var player = Utilities.GetPlayerFromIndex((int)knifeInfo.PlayerIndex); + if (player != null && player.IsValid && CheckHasKnife(player)) return; + + knife.AcceptInput("ClearParent"); + }, TimerFlags.STOP_ON_MAPCHANGE); } public static bool OnWeaponCanAcquire(DynamicHook hook, CCSPlayerController player, CEconItemView econItem, CCSWeaponBaseVData vdata) @@ -94,7 +100,7 @@ namespace src.player.skills if (!weaponName.Contains("knife") && !weaponName.Contains("bayonet")) return false; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return false; if (knivesInfo.TryGetValue(player.Index, out KnifeInfo? knifeInfo) && knifeInfo != null && knifeInfo.KnifeId == econItem.ItemID) @@ -147,14 +153,21 @@ namespace src.player.skills public static void UseSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; + DropKnife(player); } private static void DropKnife(CCSPlayerController player) { - player.ExecuteClientCommand("slot3"); + var playerEvent = PlayerManager.GetPlayerFromEvent(player); + if (playerEvent == null || !player.IsValid) return; + + playerEvent.ExecuteClientCommand("slot3"); + Instance.AddTickTimer(8, () => { if (player == null || !player.IsValid) return; @@ -188,10 +201,14 @@ namespace src.player.skills QAngle angle = new(0, 0, 0); Vector vel = SkillUtils.GetForwardVector(pawn.EyeAngles) * force; - knife.Collision.CollisionAttribute.InteractsWith = pawn.Collision.CollisionAttribute.InteractsWith; - knife.Teleport(pos, angle, vel); + if (knife.Collision == null) + return; + + ulong originalMask = knife.Collision.CollisionAttribute.InteractsWith; + knife.Collision.CollisionAttribute.InteractsWith = pawn.Collision.CollisionAttribute.InteractsWith; + if (!knivesInfo.ContainsKey(player.Index)) { uint? triggerIndex = CreateTrigger(player, knife); @@ -204,7 +221,8 @@ namespace src.player.skills KnifeId = knife.AttributeManager.Item.ItemID, TriggerIndex = triggerIndex, GlowIndex = glowIndex, - RelayIndex = relayIndex + RelayIndex = relayIndex, + OriginalCollisionMask = originalMask }); } @@ -232,7 +250,7 @@ namespace src.player.skills if (player == null || !player.IsValid) return (null, null); if (knife == null || !knife.IsValid || knife.AbsOrigin == null) return (null, null); - var modelRelay = Utilities.CreateEntityByName("prop_physics_multiplayer"); + var modelRelay = EntityManager.CreateTrackedPhysicsProp(player.Index); if (modelRelay == null) return (null, null); modelRelay.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(modelRelay.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); @@ -244,7 +262,7 @@ namespace src.player.skills modelRelay.Teleport(knife.AbsOrigin, knife.AbsRotation, knife.AbsVelocity); modelRelay.AcceptInput("SetParent", knife, modelRelay, "!activator"); - var modelGlow = Utilities.CreateEntityByName("prop_physics_multiplayer"); + var modelGlow = EntityManager.CreateTrackedPhysicsProp(player.Index); if (modelGlow == null) return (null, null); modelGlow.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(modelGlow.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); @@ -301,6 +319,7 @@ namespace src.player.skills { var pawn = player.PlayerPawn?.Value; if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return false; + return pawn.WeaponServices.MyWeapons.Any(w => w != null && w.IsValid && w.Value != null && w.Value.IsValid && (w.Value.DesignerName.Contains("knife") || w.Value.DesignerName.Contains("bayonet"))); @@ -339,37 +358,23 @@ namespace src.player.skills { if (player == null || !player.IsValid) continue; + uint? observedPlayerIndex = null; var playerPawn = player.Pawn?.Value; - if (playerPawn == null) - continue; - - var observerServices = playerPawn.ObserverServices; - if (observerServices == null) - continue; - - var observerTarget = observerServices.ObserverTarget; - if (observerTarget == null || !observerTarget.IsValid) - continue; - - var target = observerTarget.Value; - if (target == null || !target.IsValid) - continue; - - var observedPlayer = Utilities.GetPlayers() - .FirstOrDefault(p => - p.CheckPlayer() && - - p.Pawn != null && p.Pawn.IsValid && - p.Pawn.Value != null && p.Pawn.Value.IsValid && - - p.Pawn.Value.Handle == target.Handle); - - foreach ((uint playerIndex, KnifeInfo knifeInfo) in snapshot) + if (playerPawn != null && playerPawn.IsValid) { - if (playerIndex == player.Index || - (observedPlayer != null && observedPlayer.IsValid && - playerIndex == observedPlayer.Index)) continue; + var obs = playerPawn.ObserverServices?.ObserverTarget?.Value; + if (obs != null && obs.IsValid) + { + var observed = Utilities.GetPlayers().FirstOrDefault(p => + p != null && p.IsValid && + p.Pawn?.Value?.Handle == obs.Handle); + if (observed != null) + observedPlayerIndex = observed.Index; + } + } + foreach ((uint knifeOwnerIndex, KnifeInfo knifeInfo) in snapshot) + { if (knifeInfo.GlowIndex == null) continue; var glowEntity = Utilities.GetEntityFromIndex((int)knifeInfo.GlowIndex); @@ -379,7 +384,11 @@ namespace src.player.skills continue; } - info.TransmitEntities.Remove(glowEntity.Index); + bool isOwner = knifeOwnerIndex == PlayerManager.GetPlayerEvent(player)!.Index; + bool isObservingOwner = observedPlayerIndex.HasValue && observedPlayerIndex.Value == knifeOwnerIndex; + + if (!isOwner && !isObservingOwner) + info.TransmitEntities.Remove(glowEntity.Index); } } } @@ -392,6 +401,7 @@ namespace src.player.skills public required uint? TriggerIndex { get; set; } public required uint? GlowIndex { get; set; } public required uint? RelayIndex { get; set; } + public ulong OriginalCollisionMask { get; set; } public bool IsDropped { get; set; } = false; public QAngle? InitialLook { get; set; } = null; public Timer? Timer { get; set; } = null; diff --git a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs index 13230f2..1ce09b7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs @@ -1,10 +1,9 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; -using static src.jRandomSkills; namespace src.player.skills { @@ -25,10 +24,10 @@ namespace src.player.skills public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; smokes.TryAdd(new Vector(@event.X, @event.Y, @event.Z), 0); @@ -36,10 +35,10 @@ namespace src.player.skills public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; foreach (var smoke in smokes.Keys.Where(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z)) @@ -60,7 +59,7 @@ namespace src.player.skills var player = pawn.Controller.Value.As(); if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo?.Skill != skillName) return; Server.NextFrame(() => @@ -82,13 +81,17 @@ namespace src.player.skills int smokeDamage = SkillsInfo.GetValue(skillName, "smokeDamage"); foreach (Vector smokePos in smokes.Keys) - foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid && p.PawnIsAlive)) + foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid)) { - var pawn = player.PlayerPawn.Value; + var eventPlayer = PlayerManager.GetPlayerEvent(player); + if (eventPlayer == null || !eventPlayer.IsValid) continue; + + var pawn = eventPlayer.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue; if (SkillUtils.GetDistance(smokePos, pawn.AbsOrigin) <= smokeRadius) - AddHealth(pawn, -smokeDamage); + if (SkillUtils.TakeHealth(pawn, smokeDamage)) + player.EmitSound("Player.DamageBody.Onlooker"); } } @@ -97,19 +100,6 @@ namespace src.player.skills SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); } - private static void AddHealth(CCSPlayerPawn player, int health) - { - if (player.LifeState != (byte)LifeState_t.LIFE_ALIVE) - return; - - player.Health += health; - Utilities.SetStateChanged(player, "CBaseEntity", "m_iHealth"); - - player.EmitSound("Player.DamageBody.Onlooker"); - if (player.Health <= 0) - player.CommitSuicide(false, true); - } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#507529", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, int smokeDamage = 2, float smokeRadius = 180, int tickCooldown = 17) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public int SmokeDamage { get; set; } = smokeDamage; diff --git a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs index 9424452..9d9a270 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs @@ -1,18 +1,17 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; using System.Drawing; -using static src.jRandomSkills; namespace src.player.skills { public class Wallhack : ISkill { private const Skills skillName = Skills.Wallhack; - private static readonly ConcurrentDictionary playersInAction = new(); + private static readonly ConcurrentDictionary playersInAction = new(); private static ConcurrentDictionary glows = new(); public static void LoadSkill() @@ -24,29 +23,39 @@ namespace src.player.skills { foreach (var (info, player) in infoList) { - if (player == null) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (player == null || !player.IsValid) continue; + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); 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 = observedPlayer != null ? PlayerManager.GetPlayerByIndex(observedPlayer.Index) : null; foreach (var kvp in glows) { var enemyIndex = kvp.Key; var glowInfo = kvp.Value; + var enemy = Utilities.GetPlayers().FirstOrDefault(e => e != null && e.IsValid && e.Index == enemyIndex); - var enemy = Utilities.GetPlayers().FirstOrDefault(e => e.IsValid && e.Index == enemyIndex); + bool hasSkill = playerInfo?.Skill == skillName; + bool observerHasSkill = observerInfo != null && observerInfo?.Skill == skillName; + bool differentTeam = glowInfo.Team != player.Team; - if (enemy != null && enemy.PawnIsAlive) - if (glowInfo.Team != player.Team && (playerInfo?.Skill == skillName || (observerInfo != null && observerInfo?.Skill == skillName))) + if (enemy != null && enemy.IsValid) + { + var enemyPawn = enemy.PlayerPawn?.Value; + bool pawnValid = enemyPawn != null && enemyPawn.IsValid; + bool alive = pawnValid && enemyPawn!.Health > 0; + bool notInvisible = pawnValid && enemyPawn!.Render.A != 102 && enemyPawn!.Render.A != 128; + + bool shouldShow = alive && notInvisible && differentTeam && (hasSkill || observerHasSkill); + + if (shouldShow) continue; + } var glowEntity1 = Utilities.GetEntityFromIndex((int)glowInfo.RelayIndex); if (glowEntity1 == null || !glowEntity1.IsValid) continue; - var glowEntity2 = Utilities.GetEntityFromIndex((int)glowInfo.GlowIndex); if (glowEntity2 == null || !glowEntity2.IsValid) continue; - info.TransmitEntities.Remove(glowEntity1.Index); info.TransmitEntities.Remove(glowEntity2.Index); } @@ -71,24 +80,31 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { Event.EnableTransmit(); - playersInAction.TryAdd(player.SteamID, 0); + playersInAction.TryAdd(player.Index, 0); if (glows.IsEmpty) SetGlowEffectForAll(); } public static void DisableSkill(CCSPlayerController player) { - playersInAction.TryRemove(player.SteamID, out _); + playersInAction.TryRemove(player.Index, out _); if (playersInAction.IsEmpty) NewRound(); } private static void SetGlowEffectForAll() { - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && (p.Team == CsTeam.Terrorist || p.Team == CsTeam.CounterTerrorist)).ToList(); + var enemies = Utilities.GetPlayers().Where(p => + p != null && + p.IsValid && + p.PlayerPawn?.Value != null && + p.PlayerPawn.Value.IsValid && + p.PlayerPawn.Value.Health > 0 && + (p.Team == CsTeam.Terrorist || p.Team == CsTeam.CounterTerrorist)).ToList(); + foreach (var enemy in enemies) { - var enemyInfo = Instance.SkillPlayer.FirstOrDefault(e => e.SteamID == enemy.SteamID); + var enemyInfo = PlayerManager.GetPlayerByIndex(enemy.Index); if (enemyInfo?.Skill == Skills.Ghost) continue; @@ -99,8 +115,8 @@ namespace src.player.skills var modelName = skeleton?.ModelState?.ModelName; if (string.IsNullOrEmpty(modelName)) continue; - var modelGlow = Utilities.CreateEntityByName("prop_dynamic"); - var modelRelay = Utilities.CreateEntityByName("prop_dynamic"); + var modelGlow = EntityManager.CreateTrackedDynamicProp(enemy.Index); + var modelRelay = EntityManager.CreateTrackedDynamicProp(enemy.Index); if (modelGlow == null || !modelGlow.IsValid || modelRelay == null || !modelRelay.IsValid) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs b/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs index af65c97..66401d4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -39,7 +39,7 @@ namespace src.player.skills 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); + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo?.Skill != skillName || Instance.GameRules == null) return; var roundTime = SkillsInfo.GetValue(skillName, "changeRoundTime"); @@ -49,6 +49,7 @@ namespace src.player.skills Localization.PrintTranslationToChatAll($" {ChatColors.Orange}{{0}}", ["watchmaker_tt"], [roundTime]); else Localization.PrintTranslationToChatAll($" {ChatColors.LightBlue}{{0}}", ["watchmaker_ct"], [roundTime]); + player.EmitSound(SkillsInfo.GetValue(skillName, "SoundEvent")); var proxy = Utilities.FindAllEntitiesByDesignerName("cs_gamerules").FirstOrDefault(); diff --git a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs index 44b263f..78f490b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using static src.jRandomSkills; @@ -10,7 +10,7 @@ namespace src.player.skills public class WeaponsSwap : ISkill { private const Skills skillName = Skills.WeaponsSwap; - private static readonly ConcurrentDictionary SkillPlayerInfo = []; + private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); private static readonly HashSet weapons = [ "weapon_deagle", "weapon_revolver", "weapon_glock", "weapon_usp_silencer", @@ -33,9 +33,9 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo + SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo { - SteamID = player.SteamID, + SteamID = player.Index, CanUse = true, Cooldown = DateTime.MinValue, LastClick = DateTime.MinValue, @@ -46,7 +46,7 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - SkillPlayerInfo.TryRemove(player.SteamID, out _); + SkillPlayerInfo.TryRemove(player.Index, out _); SkillUtils.ResetPrintHTML(player); } @@ -55,10 +55,10 @@ namespace src.player.skills var players = Utilities.GetPlayers().ToArray(); foreach (var player in players) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) continue; - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) { bool recentClick = skillInfo.LastClick.AddSeconds(4) >= DateTime.Now; UpdateHUD(player, skillInfo, recentClick); @@ -78,7 +78,7 @@ namespace src.player.skills skillInfo.CanUse = true; } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; if (cooldown == 0) @@ -101,9 +101,9 @@ namespace src.player.skills var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) { - if (!player.IsValid || !player.PawnIsAlive) return; + if (!player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; if (skillInfo.CanUse) { CCSPlayerController? enemy = GetRandomEnemy(player); diff --git a/jRandomSkills - SRC Files/src/player/skills/Weightless.cs b/jRandomSkills - SRC Files/src/player/skills/Weightless.cs index c05ed64..0df985b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Weightless.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Weightless.cs @@ -1,10 +1,9 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; -using static src.jRandomSkills; namespace src.player.skills { @@ -62,7 +61,7 @@ namespace src.player.skills if (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); + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(player)!.Index); if (playerInfo?.Skill != skillName) return; Server.NextFrame(() => { diff --git a/jRandomSkills - SRC Files/src/player/skills/WildThrow.cs b/jRandomSkills - SRC Files/src/player/skills/WildThrow.cs index 6515026..ebb7ca2 100644 --- a/jRandomSkills - SRC Files/src/player/skills/WildThrow.cs +++ b/jRandomSkills - SRC Files/src/player/skills/WildThrow.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -10,7 +10,8 @@ namespace src.player.skills public class WildThrow : ISkill { private const Skills skillName = Skills.WildThrow; - private readonly static ConcurrentDictionary infectedPlayers = []; + private readonly static ConcurrentDictionary infectedPlayers = []; + private static readonly ConcurrentDictionary playersToTarget = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -21,25 +22,22 @@ namespace src.player.skills public static void NewRound() { lock (setLock) - infectedPlayers.Clear(); - foreach (var player in Utilities.GetPlayers()) - DisableSkill(player); - } + { + foreach (var player in Utilities.GetPlayers()) + DisableSkill(player); - public static void PlayerDeath(EventPlayerDeath @event) - { - var player = @event.Userid; - if (player == null) return; - DisableSkill(player); + infectedPlayers.Clear(); + playersToTarget.Clear(); + } } public static void EnableSkill(CCSPlayerController player) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.SkillUsed = false; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); @@ -51,7 +49,18 @@ namespace src.player.skills public static void DisableSkill(CCSPlayerController player) { - infectedPlayers.TryRemove(player.SteamID, out _); + if (playersToTarget.TryRemove(player.Index, out uint targetIndex)) + infectedPlayers.TryRemove(targetIndex, out _); + + SkillUtils.CloseMenu(player); + } + + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + + infectedPlayers.TryRemove(player.Index, out _); SkillUtils.CloseMenu(player); } @@ -61,10 +70,24 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers()) { if (!SkillUtils.HasMenu(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p => + p != null && + p.IsValid) + .Select(p => PlayerManager.GetPlayerEvent(p)) + .Where(p => + p != null && + p.IsValid && + p.Team != player.Team && + p.PlayerPawn?.Value != null && + p.PlayerPawn.Value.IsValid && + p.PlayerPawn.Value.Health > 0 && + !p.IsHLTV && + p.Team != CsTeam.Spectator + && p.Team != CsTeam.None + ).ToArray(); ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); SkillUtils.UpdateMenu(player, menuItems); @@ -73,8 +96,8 @@ namespace src.player.skills 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); + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; if (playerInfo.SkillUsed) @@ -84,7 +107,8 @@ namespace src.player.skills } string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId); + if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) { @@ -92,7 +116,8 @@ namespace src.player.skills return; } - infectedPlayers.TryAdd(enemy.SteamID, 0); + infectedPlayers.TryAdd(enemy.Index, 0); + playersToTarget[player.Index] = enemy.Index; playerInfo.SkillUsed = true; player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("wildthrow_player_info", enemy.PlayerName)); @@ -112,7 +137,7 @@ namespace src.player.skills if (pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; var player = pawn.Controller.Value.As(); - if (!infectedPlayers.ContainsKey(player.SteamID)) return; + if (!infectedPlayers.ContainsKey(player.Index)) return; Server.NextFrame(() => { if (grenade == null || !grenade.IsValid) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/Zeus.cs b/jRandomSkills - SRC Files/src/player/skills/Zeus.cs index c4eb520..dbc0bf7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Zeus.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Zeus.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -22,10 +22,10 @@ namespace src.player.skills public static void WeaponFire(EventWeaponFire @event) { - var player = @event.Userid; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) { @@ -43,7 +43,7 @@ namespace src.player.skills taser.LastAttackTick = 0; taser.FireTime = 0; } - }); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } } diff --git a/jRandomSkills - SRC Files/src/utils/Config.cs b/jRandomSkills - SRC Files/src/utils/Config.cs index 043ce3c..9b1027b 100644 --- a/jRandomSkills - SRC Files/src/utils/Config.cs +++ b/jRandomSkills - SRC Files/src/utils/Config.cs @@ -80,6 +80,8 @@ namespace src.utils public bool KillerSkillChatInfo { get; set; } public bool TeamMateSkillChatInfo { get; set; } public bool SummaryAfterTheRound { get; set; } + public bool EnableBotSkills { get; set; } + public bool EnableBotKickDebug { get; set; } public bool DebugMode { get; set; } public string? AlternativeSkillButton { get; set; } public float SkillTimeBeforeStart { get; set; } @@ -87,7 +89,7 @@ namespace src.utils public float SkillDescriptionDuration { get; set; } public bool DisplayAlwaysDescription { get; set; } public bool DisableSpectateHUD { get; set; } - public bool FlashingHtmlHudFix { get; set; } + public bool EnableFlashingHtmlHudFix { get; set; } public bool TraceRayBeam { get; set; } public string DisableHUDOnDeathPermission { get; set; } public bool DisableSkillsOnRoundEnd { get; set; } @@ -105,13 +107,15 @@ namespace src.utils KillerSkillChatInfo = true; TeamMateSkillChatInfo = true; SummaryAfterTheRound = true; + EnableBotSkills = true; + EnableBotKickDebug = false; DebugMode = false; AlternativeSkillButton = null; SkillTimeBeforeStart = 7; SkillHudDuration = -1; SkillDescriptionDuration = 7; DisplayAlwaysDescription = false; - FlashingHtmlHudFix = true; + EnableFlashingHtmlHudFix = false; TraceRayBeam = false; DisableSpectateHUD = false; DisableHUDOnDeathPermission = "@jRandomSkills/death"; diff --git a/jRandomSkills - SRC Files/src/utils/EntityManager.cs b/jRandomSkills - SRC Files/src/utils/EntityManager.cs new file mode 100644 index 0000000..26f9df3 --- /dev/null +++ b/jRandomSkills - SRC Files/src/utils/EntityManager.cs @@ -0,0 +1,273 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Entities.Constants; +using CounterStrikeSharp.API.Modules.Utils; +using System.Collections.Concurrent; +using System.Drawing; +using static src.jRandomSkills; + +namespace src.utils +{ + public static class EntityManager + { + public const uint SystemOwnerIndex = uint.MaxValue; + private static readonly ConcurrentDictionary trackedEntities = []; + + private struct EntityData + { + public uint EntityIndex; + public uint PlayerIndex; + public string EntityType; + public DateTime CreatedAt; + } + + public static void RegisterEntity(uint entityIndex, uint playerIndex, string entityType) + { + if (entityIndex == 0) return; + + trackedEntities[entityIndex] = new EntityData + { + EntityIndex = entityIndex, + PlayerIndex = playerIndex, + EntityType = entityType, + CreatedAt = DateTime.UtcNow + }; + } + + public static void RegisterExisting(CBaseEntity? entity, uint playerIndex, string entityType) + { + if (entity == null || !entity.IsValid) return; + RegisterEntity(entity.Index, playerIndex, entityType); + } + + public static List GetPlayerEntities(uint playerIndex, string? entityType = null) + { + return [.. trackedEntities + .Where(kvp => kvp.Value.PlayerIndex == playerIndex && (string.IsNullOrEmpty(entityType) || kvp.Value.EntityType == entityType)) + .Select(kvp => kvp.Key)]; + } + + public static int GetTrackedCount(uint playerIndex) => GetPlayerEntities(playerIndex).Count; + + public static (int totalTracked, int ownerCount) GetStatistics() + { + return (trackedEntities.Count, trackedEntities.Values.Select(e => e.PlayerIndex).Distinct().Count()); + } + + + public static CParticleSystem? CreateTrackedParticleSystem(uint playerIndex, string particleName, float? autoDestroySeconds = null) + { + try + { + var particle = Utilities.CreateEntityByName("info_particle_system"); + if (particle == null || !particle.IsValid) return null; + + particle.EffectName = particleName; + particle.StartActive = true; + particle.DispatchSpawn(); + + RegisterEntity(particle.Index, playerIndex, "particle_system"); + ScheduleAutoDestroy(particle.Index, autoDestroySeconds); + return particle; + } + catch (Exception ex) + { + Server.PrintToConsole($"[EntityManager] CreateTrackedParticleSystem: {ex.Message}"); + return null; + } + } + + public static CDynamicProp? CreateTrackedDynamicProp(uint playerIndex, string designerName = "prop_dynamic") + { + try + { + var prop = Utilities.CreateEntityByName(designerName); + if (prop == null || !prop.IsValid) return null; + + RegisterEntity(prop.Index, playerIndex, designerName); + return prop; + } + catch (Exception ex) + { + Server.PrintToConsole($"[EntityManager] CreateTrackedDynamicProp: {ex.Message}"); + return null; + } + } + + public static CDynamicProp? CreateTrackedPropOverride(uint playerIndex) + { + return CreateTrackedDynamicProp(playerIndex, "prop_dynamic_override"); + } + + public static CEnvShake? CreateTrackedEnvShake(uint playerIndex) + { + try + { + var shake = Utilities.CreateEntityByName("env_shake"); + if (shake == null || !shake.IsValid) return null; + + shake.DispatchSpawn(); + RegisterEntity(shake.Index, playerIndex, "env_shake"); + return shake; + } + catch (Exception ex) + { + Server.PrintToConsole($"[EntityManager] CreateTrackedEnvShake: {ex.Message}"); + return null; + } + } + + public static CChicken? CreateTrackedChicken(uint playerIndex) + { + try + { + var chicken = Utilities.CreateEntityByName("chicken"); + if (chicken == null || !chicken.IsValid) return null; + + chicken.DispatchSpawn(); + RegisterEntity(chicken.Index, playerIndex, "chicken"); + return chicken; + } + catch (Exception ex) + { + Server.PrintToConsole($"[EntityManager] CreateTrackedChicken: {ex.Message}"); + return null; + } + } + + public static CPhysicsPropMultiplayer? CreateTrackedPhysicsProp(uint playerIndex) + { + try + { + var prop = Utilities.CreateEntityByName("prop_physics_multiplayer"); + if (prop == null || !prop.IsValid) return null; + + RegisterEntity(prop.Index, playerIndex, "prop_physics_multiplayer"); + return prop; + } + catch (Exception ex) + { + Server.PrintToConsole($"[EntityManager] CreateTrackedPhysicsProp: {ex.Message}"); + return null; + } + } + + public static CTriggerMultiple? CreateTrackedTrigger(uint playerIndex, string name, float radius, Vector pos) + { + if (pos == null) return null; + + try + { + var trigger = Utilities.CreateEntityByName("trigger_multiple"); + if (trigger == null || trigger.AbsOrigin == null) return null; + + trigger.Collision.SolidType = SolidType_t.SOLID_CAPSULE; + trigger.Collision.SolidFlags = 0; + trigger.Spawnflags = 1; + trigger.Globalname = $"{name}_{trigger.Index}"; + trigger.Collision.SolidFlags = 1; + + trigger.AbsOrigin.X = pos.X; + trigger.AbsOrigin.Y = pos.Y; + trigger.AbsOrigin.Z = pos.Z; + + trigger.Collision.CapsuleRadius = radius; + trigger.Collision.BoundingRadius = radius; + trigger.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_TRIGGER; + trigger.Collision.EnablePhysics = 1; + trigger.Collision.TriggerBloat = 0; + trigger.Collision.SurroundType = SurroundingBoundsType_t.USE_OBB_COLLISION_BOUNDS; + trigger.Collision.CollisionAttribute.CollisionFunctionMask = 39; + trigger.Collision.CollisionAttribute.CollisionGroup = 2; + + trigger.DispatchSpawn(); + RegisterEntity(trigger.Index, playerIndex, "trigger_multiple"); + return trigger; + } + catch (Exception ex) + { + Server.PrintToConsole($"[EntityManager] CreateTrackedTrigger: {ex.Message}"); + return null; + } + } + + public static CBeam? CreateTrackedBeam(uint playerIndex, Vector start, Vector end, Color color) + { + try + { + var beam = Utilities.CreateEntityByName("beam"); + if (beam == null || !beam.IsValid) return null; + + beam.Render = color; + beam.Width = 2.0f; + beam.EndWidth = 2.0f; + beam.Teleport(start); + + beam.EndPos.X = end.X; + beam.EndPos.Y = end.Y; + beam.EndPos.Z = end.Z; + + beam.DispatchSpawn(); + RegisterEntity(beam.Index, playerIndex, "beam"); + return beam; + } + catch (Exception ex) + { + Server.PrintToConsole($"[EntityManager] CreateTrackedBeam: {ex.Message}"); + return null; + } + } + + public static bool DestroyEntity(uint entityIndex) + { + trackedEntities.TryRemove(entityIndex, out _); + + try + { + var entity = Utilities.GetEntityFromIndex((int)entityIndex); + if (entity != null && entity.IsValid) + { + entity.AddEntityIOEvent("Kill", entity, delay: 0.1f); + return true; + } + } + catch (Exception ex) + { + Server.PrintToConsole($"[EntityManager] DestroyEntity {entityIndex}: {ex.Message}"); + } + + return false; + } + + public static bool DestroyEntity(uint? entityIndex) where T : CBaseEntity + { + if (entityIndex == null) return false; + return DestroyEntity(entityIndex.Value); + } + + public static void DestroyPlayerEntities(uint playerIndex) + { + foreach (var entityIndex in GetPlayerEntities(playerIndex).ToList()) + DestroyEntity(entityIndex); + } + + public static void DestroyAllTracked() + { + foreach (var entityIndex in trackedEntities.Keys.ToList()) + DestroyEntity(entityIndex); + + trackedEntities.Clear(); + } + + public static void Clear() + { + DestroyAllTracked(); + } + + private static void ScheduleAutoDestroy(uint entityIndex, float? seconds) + { + if (seconds is not > 0) return; + Instance?.AddTimer(seconds.Value, () => DestroyEntity(entityIndex), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + } + } +} diff --git a/jRandomSkills - SRC Files/src/utils/Localization.cs b/jRandomSkills - SRC Files/src/utils/Localization.cs index c29a751..f61b72a 100644 --- a/jRandomSkills - SRC Files/src/utils/Localization.cs +++ b/jRandomSkills - SRC Files/src/utils/Localization.cs @@ -166,7 +166,7 @@ namespace src.utils private static string GetLangCode(CCSPlayerController? player) { - if (player == null || !player.IsValid) return defaultLangCode; + if (player == null || !player.IsValid || player.IsBot) return defaultLangCode; string? fileLangCode = GetLangCodeFromFile(player.SteamID); if (!string.IsNullOrEmpty(fileLangCode)) diff --git a/jRandomSkills - SRC Files/src/utils/PlayerManager.cs b/jRandomSkills - SRC Files/src/utils/PlayerManager.cs new file mode 100644 index 0000000..6b67a5c --- /dev/null +++ b/jRandomSkills - SRC Files/src/utils/PlayerManager.cs @@ -0,0 +1,135 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Modules.Utils; +using System.Collections.Concurrent; +using src.player; +using CounterStrikeSharp.API.Core; + +namespace src.utils +{ + public static class PlayerManager + { + private static readonly ConcurrentDictionary playersByIndex = []; + + public static void Register(jSkill_PlayerInfo playerInfo) + { + if (playerInfo == null) return; + playersByIndex[playerInfo.PlayerIndex] = playerInfo; + } + + public static void UnregisterPlayer(uint playerIndex) + { + playersByIndex.TryRemove(playerIndex, out _); + } + + public static jSkill_PlayerInfo? GetPlayerByIndex(uint? playerIndex) + { + if (playerIndex == null) return null; + + playersByIndex.TryGetValue((uint)playerIndex, out var playerInfo); + return playerInfo; + } + + public static CCSPlayerController? GetPlayerEvent(CCSPlayerController? player) + { + if (player == null || !player.IsValid) + return null; + + if (!player.ControllingBot) + return player; + + return Utilities.GetPlayers().FirstOrDefault(p => + p != null && + p.IsValid && + p.IsBot && + p.OriginalControllerOfCurrentPawn.Value != null && p.OriginalControllerOfCurrentPawn.Value == player) + ?? player; + } + + public static CCSPlayerController? GetPlayerFromEvent(CCSPlayerController? player) + { + if (player == null || !player.IsValid) + return null; + + if (!player.IsBot) + return player; + + return Utilities.GetPlayers().FirstOrDefault(p => + p != null && + p.IsValid && + !p.IsBot && + player.OriginalControllerOfCurrentPawn.Value != null && player.OriginalControllerOfCurrentPawn.Value == p) + ?? player; + } + + public static IEnumerable GetAllPlayers() + { + return playersByIndex.Values; + } + + public static IEnumerable GetAlivePlayers() + { + return playersByIndex.Values.Where(p => + { + try + { + var controller = Utilities.GetPlayerFromIndex((int)p.PlayerIndex); + return controller != null && controller.IsValid && controller.PawnIsAlive; + } + catch + { + return false; + } + }); + } + + public static IEnumerable GetPlayersByTeam(CsTeam team) + { + return playersByIndex.Values.Where(p => + { + try + { + var controller = Utilities.GetPlayerFromIndex((int)p.PlayerIndex); + return controller != null && controller.IsValid && controller.Team == team; + } + catch + { + return false; + } + }); + } + + public static int GetTeamPlayerCount(CsTeam team) + { + return GetPlayersByTeam(team).Count(); + } + + public static int GetPlayerCountBySkill(Skills skills) + { + return playersByIndex.Values.Count(p => p.Skill == skills); + } + + public static bool UpdatePlayerSkill(uint playerIndex, Skills skill, Skills specialSkill = Skills.None) + { + if (playersByIndex.TryGetValue(playerIndex, out var playerInfo)) + { + playerInfo.Skill = skill; + playerInfo.SpecialSkill = specialSkill; + return true; + } + return false; + } + + public static void Clear() + { + playersByIndex.Clear(); + } + + public static void SyncWithPlugin(jRandomSkills instance) + { + if (instance?.SkillPlayer == null) return; + + foreach (var player in instance.SkillPlayer) + Register(player); + } + } +} diff --git a/jRandomSkills - SRC Files/src/utils/RarityManager.cs b/jRandomSkills - SRC Files/src/utils/RarityManager.cs index cde8b92..002a8f2 100644 --- a/jRandomSkills - SRC Files/src/utils/RarityManager.cs +++ b/jRandomSkills - SRC Files/src/utils/RarityManager.cs @@ -1,4 +1,6 @@ -namespace src.utils +using System.Drawing; + +namespace src.utils { public enum Rarity { @@ -14,11 +16,11 @@ private static readonly object rarityLock = new(); private static Dictionary rarityPercentages = new() { - { Rarity.Common, 40f }, - { Rarity.Uncommon, 25f }, - { Rarity.Rare, 20f }, - { Rarity.Epic, 10f }, - { Rarity.Legendary, 5f } + { Rarity.Common, 70f }, + { Rarity.Uncommon, 14f }, + { Rarity.Rare, 10f }, + { Rarity.Epic, 5f }, + { Rarity.Legendary, 1f } }; public static IReadOnlyDictionary RarityPercentages @@ -60,23 +62,23 @@ return rarityPercentages.TryGetValue(rarity, out var v) ? v : 0f; } - public static Rarity RollRarity() + public static (double, Rarity) RollRarity() { - var random = jRandomSkills.Instance?.Random ?? new Random(); - double roll = (random.NextDouble()) * 100.0; + double roll = Random.Shared.NextDouble() * 100.0; double accum = 0.0; lock (rarityLock) { foreach (var r in Enum.GetValues(typeof(Rarity)).Cast()) { - accum += GetRarityPercentage(r); + float chance = rarityPercentages.TryGetValue(r, out var val) ? val : 0f; + accum += chance; if (roll <= accum) - return r; + return (roll, r); } } - return Rarity.Common; + return (roll, Rarity.Common); } } } diff --git a/jRandomSkills - SRC Files/src/utils/RayTrace.cs b/jRandomSkills - SRC Files/src/utils/RayTrace.cs index 74c934f..5b67078 100644 --- a/jRandomSkills - SRC Files/src/utils/RayTrace.cs +++ b/jRandomSkills - SRC Files/src/utils/RayTrace.cs @@ -17,8 +17,15 @@ namespace src.utils public static CustomTraceResult? TraceShape(CCSPlayerController player, Vector startPos, Vector endPos, ulong? mask = null, ulong? contents = null) { - var playerPawn = player.PlayerPawn.Value; - if (playerPawn == null) + if (player == null || !player.IsValid) return null; + + var playerPawn = player.PlayerPawn?.Value; + if (playerPawn == null || + !playerPawn.IsValid || + playerPawn.Handle == IntPtr.Zero || + playerPawn.Collision == null || + playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE || + playerPawn.CBodyComponent?.SceneNode == null) return null; var rayTrace = RayTraceInterface.Get(); @@ -27,10 +34,22 @@ namespace src.utils if (mask == null) { - mask = playerPawn.Collision.CollisionAttribute.InteractsWith | (ulong)InteractionLayers.Hitboxes; - mask &= ~(ulong)InteractionLayers.PlayerClip; + try + { + if (playerPawn.Collision?.CollisionAttribute != null) + { + mask = playerPawn.Collision.CollisionAttribute.InteractsWith | (ulong)InteractionLayers.Hitboxes; + mask &= ~(ulong)InteractionLayers.PlayerClip; + } + else + mask = (ulong)(InteractionLayers.Solid | InteractionLayers.Hitboxes); + } + catch + { + mask = (ulong)(InteractionLayers.Solid | InteractionLayers.Hitboxes); + } } - contents ??= 0; // playerPawn.Collision.CollisionGroup; + contents ??= 0; bool drawBeam = Config.LoadedConfig.TraceRayBeam; @@ -41,28 +60,39 @@ namespace src.utils DrawBeam = drawBeam == true ? 1 : 0, }; - rayTrace.TraceEndShape(startPos, endPos, playerPawn, options, out TraceResult result); - var customResult = new CustomTraceResult(result, startPos, (ulong)mask, (ulong)contents, drawBeam); + Vector mins = new(-0.5f, -0.5f, -0.5f); + Vector maxs = new(0.5f, 0.5f, 0.5f); - if (drawBeam) - Server.PrintToChatAll($"start: {startPos}, end: {result.EndPos}, didHit: {result.DidHit}, hit: {(customResult.HitEntity(out var entity) && !string.IsNullOrEmpty(entity?.DesignerName) ? entity.DesignerName : "None")}, mask: {(InteractionLayers)mask}, contents: {(InteractionLayers)contents}"); + TraceResult result = default; - return customResult; + try + { + rayTrace.TraceHullShape(startPos, endPos, mins, maxs, playerPawn, options, out result); + } + catch (Exception ex) + { + Console.WriteLine($"[jRandomSkills] A memory error was caught during RayTrace: {ex.Message}"); + return null; + } + + return new CustomTraceResult(result, startPos, (ulong)mask, (ulong)contents, drawBeam); } public static CustomTraceResult? EyeTrace(CCSPlayerController player) { - var playerPawn = player.PlayerPawn.Value; - if (playerPawn == null) + if (player == null || !player.IsValid) return null; + + var playerPawn = player.PlayerPawn?.Value; + if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null) return null; - var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player.Index); if (playerInfo == null) return null; float maxDistance = SkillsInfo.GetValue(playerInfo.Skill, "maxDistance"); if (maxDistance == 0) maxDistance = 4096f; - Vector startPos = new(playerPawn.AbsOrigin!.X, playerPawn.AbsOrigin!.Y, playerPawn.AbsOrigin!.Z + playerPawn.ViewOffset.Z); + Vector startPos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + playerPawn.ViewOffset.Z); Vector endPos = startPos + SkillUtils.GetForwardVector(playerPawn.EyeAngles) * maxDistance; return TraceShape(player, startPos, endPos); @@ -70,38 +100,57 @@ namespace src.utils public static CustomTraceResult? TraceHullShape(Vector startPos, Vector endPos, CCSPlayerController player, Vector? mins = null, Vector? maxs = null, ulong? mask = null, ulong? contents = null, QAngle? angle = null) { - var playerPawn = player.PlayerPawn.Value; - if (playerPawn == null) + if (player == null || !player.IsValid) return null; + + var playerPawn = player.PlayerPawn?.Value; + if (playerPawn == null || + !playerPawn.IsValid || + playerPawn.Handle == IntPtr.Zero || + playerPawn.Collision == null || + playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE || + playerPawn.CBodyComponent?.SceneNode == null) return null; var rayTrace = RayTraceInterface.Get(); if (rayTrace == null) return null; - mask ??= playerPawn.Collision.CollisionAttribute.InteractsWith; - contents ??= 0; // playerPawn.Collision.CollisionGroup; + Vector safeMins = mins ?? playerPawn.Collision.Mins; + Vector safeMaxs = maxs ?? playerPawn.Collision.Maxs; + + ulong safeMask = mask ?? playerPawn.Collision.CollisionAttribute.InteractsWith; + ulong safeContents = contents ?? 0; bool drawBeam = Config.LoadedConfig.TraceRayBeam; + TraceResult result = default; TraceOptions options = new() { - InteractsWith = (ulong)mask, - InteractsExclude = (ulong)contents, + InteractsWith = safeMask, + InteractsExclude = safeContents, DrawBeam = drawBeam == true ? 1 : 0, }; - mins ??= playerPawn.Collision.Mins; - maxs ??= playerPawn.Collision.Maxs; + CEntityInstance? entityToIgnore = (playerPawn.LifeState == (byte)LifeState_t.LIFE_ALIVE) + ? playerPawn + : null; - rayTrace.TraceHullShape(startPos, endPos, mins, maxs, playerPawn, options, out TraceResult result); + try + { + rayTrace.TraceHullShape(startPos, endPos, safeMins, safeMaxs, entityToIgnore, options, out result); + } + catch (Exception) + { + return null; + } if (drawBeam) { angle ??= new(0, playerPawn.EyeAngles.Y, 0); - DrawBoxEdges(startPos, endPos, angle, mins, maxs, Color.Green); + DrawBoxEdges(startPos, endPos, angle, safeMins, safeMaxs, Color.Green); } - return new CustomTraceResult(result, startPos, (ulong)mask, (ulong)contents, drawBeam); + return new CustomTraceResult(result, startPos, safeMask, safeContents, drawBeam); } private static void DrawBoxEdges(Vector start, Vector end, QAngle angles, Vector mins, Vector maxs, Color color) @@ -112,7 +161,7 @@ namespace src.utils Vector visualStart = start - (forward * halfLength); Vector visualEnd = end + (forward * halfLength); - + Vector GetVertex(Vector center, float rx, float ux) { return center + (right * rx) + (up * ux); @@ -300,4 +349,4 @@ namespace src.utils EndsWith } } -} +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs index 78c27d9..b24c1a6 100644 --- a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs +++ b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs @@ -105,11 +105,7 @@ namespace src.utils public static void SafeKillEntity(uint? index) where T : CBaseEntity { if (index == null) return; - - var ent = Utilities.GetEntityFromIndex((int)index); - if (ent == null || !ent.IsValid) return; - - ent.AddEntityIOEvent("Kill", ent, delay: 0.1f); + EntityManager.DestroyEntity(index.Value); } public static bool IsValid(this CHandle? handle) where T : NativeEntity @@ -150,23 +146,9 @@ namespace src.utils SnapViewAngles.Invoke(pawn, angle); } - public static CBeam? CreateLine(Vector start, Vector end, Color color) + public static CBeam? CreateLine(Vector start, Vector end, Color color, uint ownerPlayerIndex = EntityManager.SystemOwnerIndex) { - CBeam beam = Utilities.CreateEntityByName("beam")!; - if (beam == null) return null; - - beam.Render = color; - beam.Width = 2.0f; - beam.EndWidth = 2.0f; - beam.Teleport(start); - - beam.EndPos.X = end.X; - beam.EndPos.Y = end.Y; - beam.EndPos.Z = end.Z; - - beam.DispatchSpawn(); - - return beam; + return EntityManager.CreateTrackedBeam(ownerPlayerIndex, start, end, color); } public static void SetPlayerCollisions(CCSPlayerController? player, bool enable) @@ -176,7 +158,7 @@ namespace src.utils if (player == null || !player.IsValid) return; var pawn = player.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid || !player.PawnIsAlive || pawn.CBodyComponent == null) return; + if (pawn == null || !pawn.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE || pawn.CBodyComponent == null) return; var collision = pawn.Collision; if (collision == null) return; @@ -264,21 +246,19 @@ namespace src.utils SmokeGrenadeProjectile_CreateFunc.Invoke(pos.Handle, angle.Handle, vel.Handle, vel.Handle, IntPtr.Zero, 45, teamNum); } - public static void TakeHealth(CCSPlayerPawn? pawn, int damage) + public static bool TakeHealth(CCSPlayerPawn? pawn, int damage) { if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) - return; + return false; var player = pawn.Controller.Value; if (player != null && player.IsValid && player.SteamID != 0) { - ulong steamId = player.SteamID; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo == null) return false; - var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == steamId); - if (playerInfo == null) return; - - var jester = Jester.GetJesterInfo(steamId); - if (jester?.Active == true) return; + var jester = Jester.GetJesterInfo(player.Index); + if (jester?.Active == true) return false; } int newHealth = (int)(pawn.Health - damage); @@ -286,65 +266,49 @@ namespace src.utils Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth"); if (pawn.Health <= 0) + { Server.NextFrame(() => { if (pawn == null || !pawn.IsValid) return; pawn?.CommitSuicide(false, true); }); + return false; + } + + return true; } public static void ResetPrintHTML(CCSPlayerController? player) { - var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); + if (player == null || !player.IsValid) return; + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; playerInfo.PrintHTML = null; } - public static CTriggerMultiple? CreateTrigger(string name, float radius, Vector pos) + public static CTriggerMultiple? CreateTrigger(string name, float radius, Vector pos, uint ownerPlayerIndex = EntityManager.SystemOwnerIndex) { - if (pos == null) return null; - - var trigger = Utilities.CreateEntityByName("trigger_multiple"); - if (trigger == null || trigger.AbsOrigin == null) return null; - - trigger.Collision.SolidType = SolidType_t.SOLID_CAPSULE; - trigger.Collision.SolidFlags = 0; - trigger.Spawnflags = 1; - trigger.Globalname = $"{name}_{trigger.Index}"; - trigger.Collision.SolidFlags = 1; - - trigger.AbsOrigin.X = pos.X; - trigger.AbsOrigin.Y = pos.Y; - trigger.AbsOrigin.Z = pos.Z; - - trigger.Collision.CapsuleRadius = radius; - trigger.Collision.BoundingRadius = radius; - - trigger.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_TRIGGER; - trigger.Collision.EnablePhysics = 1; - trigger.Collision.TriggerBloat = 0; - - trigger.Collision.SurroundType = SurroundingBoundsType_t.USE_OBB_COLLISION_BOUNDS; - trigger.Collision.CollisionAttribute.CollisionFunctionMask = 39; - trigger.Collision.CollisionAttribute.CollisionGroup = 2; - - trigger.DispatchSpawn(); - return trigger; + return EntityManager.CreateTrackedTrigger(ownerPlayerIndex, name, radius, pos); } - public static void AddHealth(CCSPlayerPawn? pawn, int extraHealth, int? maxHealth = null) + public static bool AddHealth(CCSPlayerPawn? pawn, int extraHealth, int? maxHealth = null) { if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) - return; + return false; maxHealth ??= pawn.MaxHealth; + if (pawn.Health == maxHealth) + return false; + int newHealth = (int)(pawn.Health + extraHealth); pawn.Health = Math.Min(newHealth, (int)maxHealth); Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth"); pawn.MaxHealth = (int)maxHealth; Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iMaxHealth"); + + return true; } public static void RestoreHealth(CCSPlayerController? player) @@ -356,10 +320,28 @@ namespace src.utils if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; - pawn.Health = (int)player.PawnHealth; + var p = PlayerManager.GetPlayerFromEvent(player); + if (p == null || !p.IsValid) + return; + + pawn.Health = (int)p.PawnHealth; Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth"); } + public static void SetPlayerInvisibility(CCSPlayerController player, float percentInvisibility) + { + if (player == null || !player.IsValid || player.PlayerPawn == null) + return; + + var playerPawn = player.PlayerPawn.Value; + if (playerPawn != null) + { + var color = Color.FromArgb(Math.Max(255 - (int)(255 * percentInvisibility), 0), 255, 255, 255); + playerPawn.Render = color; + Utilities.SetStateChanged(playerPawn, "CBaseModelEntity", "m_clrRender"); + } + } + public static string GetDesignerName(CBasePlayerWeapon? weapon) { if (weapon == null || !weapon.IsValid) return string.Empty; @@ -406,7 +388,7 @@ namespace src.utils var manager = GetMenuManager(); if (manager == null) return; - var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; bool isIlliterate = Illiterate.CheckIlliterateSkill(player); @@ -428,9 +410,29 @@ namespace src.utils { if (player == null || !player.IsValid) return; - var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || !playerInfo.DisplayHUD) return; + if (player.IsBot) + { + var pool = new List(); + + foreach (var enemy in enemies) + if (!string.IsNullOrEmpty(enemy.Item2)) + pool.Add(enemy.Item2); + + if (lastElement != null && !string.IsNullOrEmpty(lastElement.Value.Item2)) + pool.Add(lastElement.Value.Item2); + + if (pool.Count > 0) + { + string randomTarget = pool[Random.Shared.Next(pool.Count)]; + jRandomSkills.Instance.SkillAction(playerInfo.Skill.ToString(), "TypeSkill", [player, new[] { randomTarget }]); + } + + return; + } + var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == playerInfo.Skill); if (skillData == null) return; @@ -454,8 +456,6 @@ namespace src.utils ? "" : $"{skill_select_info}
"; - - var hudContent = infoLine + skillLine + remainingLine; string controllsLine = diff --git a/jRandomSkills - SRC Files/tools/RefactorSkills/Program.cs b/jRandomSkills - SRC Files/tools/RefactorSkills/Program.cs new file mode 100644 index 0000000..5149960 --- /dev/null +++ b/jRandomSkills - SRC Files/tools/RefactorSkills/Program.cs @@ -0,0 +1,148 @@ +using System; +using System.IO; +using System.Text.RegularExpressions; + +var skillsDir = args.Length > 0 + ? args[0] + : Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "..", "src", "player", "skills")); + +if (!Directory.Exists(skillsDir)) +{ + Console.Error.WriteLine($"Skills directory not found: {skillsDir}"); + return 1; +} + +Console.WriteLine($"Refactoring skills in: {skillsDir}"); + +var skipFiles = new HashSet(StringComparer.OrdinalIgnoreCase) +{ + "OPTIMIZED_SKILL_TEMPLATE.cs", + "OPTIMIZATION_SUMMARY.cs" +}; + +var files = Directory.GetFiles(skillsDir, "*.cs"); +int updated = 0; + +foreach (var file in files) +{ + if (skipFiles.Contains(Path.GetFileName(file))) continue; + + var text = File.ReadAllText(file); + var original = text; + + text = ApplyRefactoring(text, file); + + if (text != original) + { + File.WriteAllText(file, text); + updated++; + Console.WriteLine($"Updated: {Path.GetFileName(file)}"); + } +} + +Console.WriteLine($"Refactor complete. Files updated: {updated}"); +return 0; + +static string ApplyRefactoring(string text, string filePath) +{ + // --- PlayerManager lookups (all FirstOrDefault variants) --- + text = Regex.Replace(text, + @"Instance\.SkillPlayer\.FirstOrDefault\(p => p\.SteamID == (\w+)\?\.SteamID\)", + "PlayerManager.GetPlayerByIndex($1.Index)"); + + text = Regex.Replace(text, + @"Instance\.SkillPlayer\.FirstOrDefault\(p => p\.SteamID == (\w+)\.SteamID\)", + "PlayerManager.GetPlayerByIndex($1.Index)"); + + text = Regex.Replace(text, + @"Instance\.SkillPlayer\.FirstOrDefault\([a-z]\s*=>\s*[a-z]\.SteamID\s*==\s*(\w+)\?\.SteamID\)", + "PlayerManager.GetPlayerByIndex($1.Index)"); + + text = Regex.Replace(text, + @"jRandomSkills\.Instance\.SkillPlayer\.FirstOrDefault\([a-z]\s*=>\s*[a-z]\.SteamID\s*==\s*(\w+)\?\.SteamID\)", + "PlayerManager.GetPlayerByIndex($1.Index)"); + + text = Regex.Replace(text, + @"jRandomSkills\.Instance\.SkillPlayer\.FirstOrDefault\([a-z]\s*=>\s*[a-z]\.SteamID\s*==\s*(\w+)\.Index\)", + "PlayerManager.GetPlayerByIndex($1.Index)"); + + text = Regex.Replace(text, + @"Instance\.SkillPlayer\.FirstOrDefault\([a-z]\s*=>\s*[a-z]\.Index\s*==\s*(\w+)\.Index\)", + "PlayerManager.GetPlayerByIndex($1.Index)"); + + text = Regex.Replace(text, + @"Instance\.SkillPlayer\.FirstOrDefault\([a-z]\s*=>\s*[a-z]\.Index\s*==\s*playerIndex\s*&&\s*[a-z]\.Skill\s*==\s*(\w+)\)", + "PlayerManager.GetPlayerByIndex(playerIndex) is { Skill: $1 } playerInfo ? playerInfo : null"); + + // --- ConcurrentDictionary ulong -> uint --- + text = Regex.Replace(text, @"ConcurrentDictionary<\s*ulong\s*,", "ConcurrentDictionary .Index for common player variables --- + foreach (var varName in new[] { "player", "enemy", "attacker", "victim", "target", "pl", "p", "e" }) + { + text = text.Replace($"{varName}.SteamID", $"{varName}.Index"); + } + + // --- ulong steamID local vars used as keys --- + text = Regex.Replace(text, @"ulong\s+steamID\s*=\s*(\w+)\.Index", "uint playerIndex = $1.Index"); + text = Regex.Replace(text, @"ulong\s+steamID\s*=\s*player\.Index", "uint playerIndex = player.Index"); + + // Replace steamID variable references with playerIndex when it was renamed + if (text.Contains("uint playerIndex = ")) + { + text = Regex.Replace(text, @"\bsteamID\b", "playerIndex"); + } + + // --- Remove bot restrictions from player filters --- + text = Regex.Replace(text, @"\s*&&\s*!p\.IsBot", "", RegexOptions.Multiline); + text = Regex.Replace(text, @"\s*&&\s*!(\w+)\.IsBot", "", RegexOptions.Multiline); + text = Regex.Replace(text, @"!p\.IsBot\s*&&\s*", "", RegexOptions.Multiline); + text = Regex.Replace(text, @"!(\w+)\.IsBot\s*&&\s*", "", RegexOptions.Multiline); + text = Regex.Replace(text, @"\|\|\s*(\w+)\.IsBot", "", RegexOptions.Multiline); + text = Regex.Replace(text, @"(\w+)\.IsBot\s*\|\|", "", RegexOptions.Multiline); + text = Regex.Replace(text, @"if\s*\([^)]*\.IsBot\)\s*continue;", "", RegexOptions.Multiline); + + // --- Menu enemy lookup: SteamID string -> index TryParse --- + text = Regex.Replace(text, + @"var\s+enemy\s*=\s*Utilities\.GetPlayers\(\)\.FirstOrDefault\(p\s*=>\s*p\.SteamID\.ToString\(\)\s*==\s*enemyId\)", + @"if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($"" {ChatColors.Red}"" + player.GetTranslation(""selectplayerskill_incorrect_enemy_index"")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex)"); + + text = Regex.Replace(text, + @"var\s+enemy\s*=\s*Utilities\.GetPlayers\(\)\.FirstOrDefault\(p\s*=>\s*p\.Team\s*!=\s*player\.Team\s*&&\s*p\.Index\.ToString\(\)\s*==\s*enemyId\)", + @"if (!uint.TryParse(enemyId, out uint enemyIndex)) { player.PrintToChat($"" {ChatColors.Red}"" + player.GetTranslation(""selectplayerskill_incorrect_enemy_index"")); return; } + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex)"); + + // --- Add using src.utils if PlayerManager/EntityManager used but missing --- + if ((text.Contains("PlayerManager.") || text.Contains("EntityManager.")) + && !text.Contains("using src.utils;")) + { + var lastUsing = text.LastIndexOf("using ", StringComparison.Ordinal); + if (lastUsing >= 0) + { + var lineEnd = text.IndexOf('\n', lastUsing); + if (lineEnd >= 0) + text = text.Insert(lineEnd + 1, "using src.utils;\n"); + } + } + + // --- Null safety: common EnableSkill/DisableSkill entry points --- + if (text.Contains("public static void EnableSkill(CCSPlayerController player)") + && !text.Contains("if (player == null || !player.IsValid) return;") + && !text.Contains("if (player == null) return;")) + { + text = text.Replace( + "public static void EnableSkill(CCSPlayerController player)\n {", + "public static void EnableSkill(CCSPlayerController player)\n {\n if (player == null || !player.IsValid) return;"); + } + + if (text.Contains("public static void DisableSkill(CCSPlayerController player)") + && !Regex.IsMatch(text, @"DisableSkill\(CCSPlayerController player\)\s*\{[^}]*if \(player == null")) + { + text = text.Replace( + "public static void DisableSkill(CCSPlayerController player)\n {", + "public static void DisableSkill(CCSPlayerController player)\n {\n if (player == null) return;"); + } + + return text; +} diff --git a/jRandomSkills - SRC Files/tools/RefactorSkills/RefactorSkills.csproj b/jRandomSkills - SRC Files/tools/RefactorSkills/RefactorSkills.csproj new file mode 100644 index 0000000..c76b054 --- /dev/null +++ b/jRandomSkills - SRC Files/tools/RefactorSkills/RefactorSkills.csproj @@ -0,0 +1,8 @@ + + + Exe + net8.0 + enable + enable + + \ No newline at end of file diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/MaxMind.Db.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/MaxMind.Db.dll index 01695fd..522a3f2 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/MaxMind.Db.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/MaxMind.Db.dll differ diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll index 5768ad4..bc20c50 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll differ diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll index 50be93d..26993a2 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll differ