diff --git a/jRandomSkills - SRC Files/src/jRandomSkills.cs b/jRandomSkills - SRC Files/src/jRandomSkills.cs index 4c452b7..f24938e 100644 --- a/jRandomSkills - SRC Files/src/jRandomSkills.cs +++ b/jRandomSkills - SRC Files/src/jRandomSkills.cs @@ -31,7 +31,7 @@ namespace src public override string ModuleName => "[CS2] [ jRandomSkills ]"; public override string ModuleAuthor => "D3X (Original), Juzlus (Modifier), ByDexterTR (Contributor)"; public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus."; - public override string ModuleVersion => "1.2.2.b9"; + public override string ModuleVersion => "1.2.3.b1"; public override void Load(bool hotReload) { diff --git a/jRandomSkills - SRC Files/src/player/BotManager.cs b/jRandomSkills - SRC Files/src/player/BotManager.cs index a406f0a..30f8bdc 100644 --- a/jRandomSkills - SRC Files/src/player/BotManager.cs +++ b/jRandomSkills - SRC Files/src/player/BotManager.cs @@ -24,7 +24,7 @@ namespace src.utils _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); } diff --git a/jRandomSkills - SRC Files/src/player/Debug.cs b/jRandomSkills - SRC Files/src/player/Debug.cs index 89e451a..70dcc0e 100644 --- a/jRandomSkills - SRC Files/src/player/Debug.cs +++ b/jRandomSkills - SRC Files/src/player/Debug.cs @@ -102,7 +102,7 @@ namespace src.player WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} fired a shot."); return HookResult.Continue; }); - + VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); } diff --git a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs index cc2a7fc..c119c53 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs @@ -138,7 +138,7 @@ namespace src.player return candidates[Random.Shared.Next(candidates.Count)]; } - private static readonly Skills[] lateDamageSkills = [Skills.SecondLife]; + private static readonly Skills[] lateDamageSkills = [Skills.SecondLife, Skills.Phoenix, Skills.ReZombie]; private static readonly HashSet tickFailuresLogged = []; @@ -611,7 +611,7 @@ namespace src.player var temp = skillPlayer.SkillHudExpired; skillPlayer.SkillHudExpired = DateTime.MinValue; - + Instance.AddTimer(5f, () => { if (skillPlayer.SkillHudExpired == DateTime.MinValue) @@ -1051,7 +1051,7 @@ namespace src.player float? skillHudExpired = SkillsInfo.GetValue(skill, "hudDuration"); skillPlayer.SkillHudExpired = - !skillHudExpired.HasValue ? + !skillHudExpired.HasValue ? (globalHudExpired == -1 ? DateTime.MaxValue : DateTime.Now.AddSeconds(globalHudExpired)) : skillHudExpired.Value == -1 ? DateTime.MaxValue : DateTime.Now.AddSeconds(skillHudExpired.Value); @@ -1083,7 +1083,8 @@ namespace src.player var validPlayers = Utilities.GetPlayers() .Where(p => p != null && p.IsValid && !p.IsHLTV) - .Where(p => { + .Where(p => + { try { return p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist; } catch { return false; } }).ToList(); @@ -1350,18 +1351,25 @@ namespace src.player long perfStart = PerfLog.Start(); lock (setLock) { - // Keep dying entities out of snapshots until the engine processes the kill. - var dying = EntityManager.GetRecentlyDestroyedSnapshot(); - if (dying.Count > 0) + try { - foreach (var (info, player) in infoList) + // Keep dying entities out of snapshots until the engine processes the kill. + var dying = EntityManager.GetRecentlyDestroyedSnapshot(); + if (dying.Count > 0) { - if (player == null || !player.IsValid) continue; - foreach (var entityIndex in dying) - if (info.TransmitEntities.Contains(entityIndex)) - info.TransmitEntities.Remove(entityIndex); + foreach (var (info, player) in infoList) + { + if (player == null || !player.IsValid) continue; + foreach (var entityIndex in dying) + if (info.TransmitEntities.Contains(entityIndex)) + info.TransmitEntities.Remove(entityIndex); + } } } + catch (Exception ex) + { + Server.PrintToConsole($"[jRandomSkills] CheckTransmit dying-filter failed: {ex.Message}"); + } DispatchToActiveSkills("CheckTransmit", infoList); } diff --git a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs index 043dba4..520b593 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs @@ -25,7 +25,9 @@ namespace src.player } long perfStart = PerfLog.Start(); - foreach (var player in Utilities.GetPlayers()) + // Shared per-tick controller snapshot: the skill OnTick loop already scans the + // player list this frame, so reuse that native scan instead of running a second one. + foreach (var player in PlayerManager.GetTickPlayers()) { if (player != null && player.IsValid) UpdatePlayerHud(player); diff --git a/jRandomSkills - SRC Files/src/player/skills/AimLock.cs b/jRandomSkills - SRC Files/src/player/skills/AimLock.cs index 5145d17..f88c27d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AimLock.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AimLock.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using System.Collections.Concurrent; @@ -25,7 +25,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (player == null || !player.IsValid) continue; @@ -105,7 +105,7 @@ namespace src.player.skills var myEyePos = new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z); - var enemy = Utilities.GetPlayers() + var enemy = PlayerManager.GetTickPlayers() .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(); diff --git a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs index de633b9..0d12b1e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs @@ -2,7 +2,6 @@ using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using System.Runtime.InteropServices; -using System.Collections.Concurrent; using src.utils; using CounterStrikeSharp.API; @@ -11,7 +10,6 @@ namespace src.player.skills public class Aimbot : ISkill { private const Skills skillName = Skills.Aimbot; - private static readonly ConcurrentDictionary hitGroups = []; public static void LoadSkill() { @@ -35,10 +33,11 @@ namespace src.player.skills var attackerController = attackerPawn.Controller.Value; if (attackerController == null || !attackerController.IsValid) return; - var attacker = PlayerManager.GetPlayerEvent(attackerController.As())!; + var attacker = PlayerManager.GetPlayerEvent(attackerController.As()); + if (attacker == null) return; var playerInfo = PlayerManager.GetPlayerByIndex(attacker.Index); - if (playerInfo == null) return; + if (playerInfo == null || playerInfo.Skill != skillName) return; int offset = GameData.GetOffset("CTakeDamageInfo_HitGroup"); if (offset <= 0) return; @@ -46,32 +45,10 @@ namespace src.player.skills nint hitGroupPointer = Marshal.ReadIntPtr(param2.Handle, offset); if (hitGroupPointer == nint.Zero) return; - nint hitGroupOffset = Marshal.ReadIntPtr(hitGroupPointer, 16); - if (hitGroupOffset == nint.Zero) return; + nint hitGroupData = Marshal.ReadIntPtr(hitGroupPointer, 16); + if (hitGroupData == nint.Zero) return; - if (playerInfo.Skill == skillName) - { - hitGroups.TryAdd(hitGroupOffset, Marshal.ReadInt32(hitGroupOffset, 56)); - Marshal.WriteInt32(hitGroupOffset, 56, (int)HitGroup_t.HITGROUP_HEAD); - } - else if (hitGroups.TryGetValue(hitGroupOffset, out var hitGroup)) - Marshal.WriteInt32(hitGroupOffset, 56, hitGroup); - } - - public static void NewRound() - { - hitGroups.Clear(); - } - - public static void DisableSkill(CCSPlayerController _) - { - foreach (var hit in hitGroups) - { - if (hit.Key != nint.Zero) - Marshal.WriteInt32(hit.Key, 56, hit.Value); - } - - hitGroups.Clear(); + Marshal.WriteInt32(hitGroupData, 56, (int)HitGroup_t.HITGROUP_HEAD); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs b/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs index 1f63f1f..7232d9d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -27,7 +27,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (player == null || !player.IsValid) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs index 3332dcc..0331bc3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -20,7 +20,7 @@ namespace src.player.skills public static void NewRound() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (player != null && player.IsValid) SkillUtils.CloseMenu(player); @@ -65,7 +65,7 @@ namespace src.player.skills playersToTarget[player.Index] = targetSite.Index; string siteLetter = site == 0 ? "A" : "B"; - foreach (var ct in Utilities.GetPlayers().Where(p => p != null && p.IsValid && !p.IsHLTV && p.Team == CsTeam.CounterTerrorist)) + foreach (var ct in PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid && !p.IsHLTV && p.Team == CsTeam.CounterTerrorist)) ct.PrintToChat($" {ChatColors.Green}" + ct.GetTranslation("areareaper_teammates_info", siteLetter)); } } @@ -111,7 +111,7 @@ namespace src.player.skills { if (Server.TickCount % 16 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid || player == null || !player.IsValid || player.Team != CsTeam.Terrorist || player.PlayerPawn?.Value?.Health <= 0) continue; @@ -124,7 +124,7 @@ namespace src.player.skills var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_c4") continue; - + if (!pawn.InBombZone && pawn.InBombZoneTrigger) playerEvent.PrintToCenterAlert(playerEvent.GetTranslation("areareaper_bombsite_disabled")); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Armored.cs b/jRandomSkills - SRC Files/src/player/skills/Armored.cs index 43a34f1..4a3205b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Armored.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Armored.cs @@ -28,7 +28,7 @@ namespace src.player.skills 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.IsValid && p.Team == player.Team && p != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().Any(p => p.IsValid && p.Team == player.Team && p != player) ? "tb" : "t"); } public static void OnTakeDamage(DynamicHook h) diff --git a/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs b/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs index c1f599c..3465a7a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs @@ -22,7 +22,7 @@ namespace src.player.skills public static void NewRound() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (player != null && player.IsValid) DisableSkill(player); @@ -54,7 +54,7 @@ namespace src.player.skills playerInfo.SkillChance = gravityModifier; SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, gravityModifier)}", - border: !Utilities.GetPlayers().Any(p => p.IsValid && p.Team == player.Team && p != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().Any(p => p.IsValid && p.Team == player.Team && p != player) ? "tb" : "t"); pawn.ActualGravityScale = gravityModifier; } diff --git a/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs b/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs index 02dd550..67b009d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs @@ -17,7 +17,7 @@ namespace src.player.skills public static void NewRound() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (player != null && player.IsValid) SkillUtils.CloseMenu(player); @@ -28,14 +28,14 @@ namespace src.player.skills { if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { 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 != 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(); + var enemies = PlayerManager.GetTickPlayers().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) @@ -58,7 +58,7 @@ namespace src.player.skills playerInfo.SkillUsed = false; - var enemies = Utilities.GetPlayers().Where(p => p.IsValid && p.PlayerPawn?.Value?.Health > 0 && p.Team != player.Team && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = PlayerManager.GetTickPlayers().Where(p => p.IsValid && p.PlayerPawn?.Value?.Health > 0 && 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 => ($"\u202A{e.PlayerName}\u202C : {(e.InGameMoneyServices?.Account ?? 0)}$", e.Index.ToString()))]; diff --git a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs index 1a6f7dd..774343c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs @@ -18,6 +18,12 @@ namespace src.player.skills SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); } + public static void NewRound() + { + decoys.Clear(); + playersWithSkill.Clear(); + } + public static void PlayerHurt(EventPlayerHurt @event) { var victim = PlayerManager.GetPlayerEvent(@event.Userid); @@ -50,17 +56,17 @@ 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 = PlayerManager.GetPlayerByIndex((PlayerManager.GetPlayerEvent(player)?.Index ?? 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; } @@ -69,7 +75,7 @@ namespace src.player.skills { var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; @@ -93,14 +99,14 @@ namespace src.player.skills { var decoy = Utilities.GetEntityFromIndex((int)decoyIndex); - if (decoy == null || !decoy.IsValid) + if (decoy == null || !decoy.IsValid || decoy.DesignerName != "decoy_projectile") { decoys.TryRemove(decoyIndex, out _); continue; } decoy.Bounces = 0; - + var vel = decoy.AbsVelocity; float speed = vel.Length(); float targetSpeed = Math.Min(speed * SkillsInfo.GetValue(skillName, "speedMultipier"), SkillsInfo.GetValue(skillName, "maxSpeed")); diff --git a/jRandomSkills - SRC Files/src/player/skills/Behind.cs b/jRandomSkills - SRC Files/src/player/skills/Behind.cs index c1886f6..c767b15 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Behind.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Behind.cs @@ -35,7 +35,7 @@ namespace src.player.skills 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 != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().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 9be183d..b828798 100644 --- a/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs +++ b/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -20,7 +20,7 @@ namespace src.player.skills { var modifier = SkillsInfo.GetValue(skillName, "velocityModifier"); - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (player == null || !player.IsValid) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs index 0b7d078..a096b1c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs +++ b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs @@ -18,7 +18,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (player == null || !player.IsValid) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs index a7b7938..f76803b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs +++ b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs @@ -32,7 +32,7 @@ namespace src.player.skills { var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; - + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; @@ -67,11 +67,9 @@ namespace src.player.skills { if (Server.TickCount % 2 != 0) return; - var bomb = invisiblePlayers.IsEmpty - ? null - : Utilities.FindAllEntitiesByDesignerName("weapon_c4").FirstOrDefault(); + var bomb = invisiblePlayers.IsEmpty ? null : PlayerManager.GetTickBomb(); - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (player.PlayerPawn?.Value?.Health <= 0 && invisiblePlayers.ContainsKey(player.Index)) { @@ -105,8 +103,7 @@ namespace src.player.skills { if (invisiblePlayers.IsEmpty) return; - var bomb = Utilities.FindAllEntitiesByDesignerName("weapon_c4").FirstOrDefault(); - if (bomb != null && !bomb.IsValid) bomb = null; + var bomb = PlayerManager.GetTickBomb(); foreach (var (info, player) in infoList) { diff --git a/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs b/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs index b7e991d..89a5c09 100644 --- a/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs +++ b/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs @@ -26,7 +26,7 @@ namespace src.player.skills { lock (setLock) { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { DisableSkill(player); SkillUtils.CloseMenu(player); @@ -42,13 +42,13 @@ namespace src.player.skills public static void OnTick() { if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!SkillUtils.HasMenu(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - 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(); + var enemies = PlayerManager.GetTickPlayers().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); @@ -72,7 +72,8 @@ namespace src.player.skills string enemyId = commands[0]; - if (!uint.TryParse(enemyId, out uint enemyIndex)) { + if (!uint.TryParse(enemyId, out uint enemyIndex)) + { playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } @@ -105,7 +106,7 @@ namespace src.player.skills var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; - 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(); + var enemies = PlayerManager.GetTickPlayers().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()))]; @@ -121,7 +122,7 @@ namespace src.player.skills if (eventPlayer == null || !eventPlayer.IsValid) return; var player = PlayerManager.GetPlayerEvent(@event.Userid); - if (player == null || !player.IsValid) return; + if (player == null || !player.IsValid) return; var playerPawn = player.PlayerPawn.Value; if (playerPawn == null || !playerPawn.IsValid) return; @@ -146,7 +147,7 @@ namespace src.player.skills { if (lastShot.TryRemove(playerIndex, out bool didHit) && !didHit) { - eventPlayer.ExecuteClientCommand($"play player/player_damagebody_0{Instance.Random.Next(4,8)}"); + eventPlayer.ExecuteClientCommand($"play player/player_damagebody_0{Instance.Random.Next(4, 8)}"); SkillUtils.TakeHealth(playerPawn, SkillsInfo.GetValue(skillName, "damageAfterMiss")); } lastShot.TryRemove(playerIndex, out _); @@ -187,7 +188,7 @@ namespace src.player.skills 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 _); diff --git a/jRandomSkills - SRC Files/src/player/skills/Catapult.cs b/jRandomSkills - SRC Files/src/player/skills/Catapult.cs index 53bd53e..53c17b2 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Catapult.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Catapult.cs @@ -39,7 +39,7 @@ namespace src.player.skills 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 != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().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 = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, float chanceFrom = .2f, float chanceTo = .4f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs index f1a6401..c90be66 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs @@ -29,7 +29,7 @@ namespace src.player.skills public static void NewRound() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) SetWeaponAttack(player, false); var chickenIndices = chickens.Values.ToArray(); diff --git a/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs b/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs index 061b263..1c88ed1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs @@ -73,7 +73,7 @@ namespace src.player.skills float currentTime = Server.CurrentTime; float extraTime = SkillsInfo.GetValue(skillName, "bombArmedTime"); - foreach (var player in Utilities.GetPlayers().Where(p => p.Team == CsTeam.Terrorist)) + foreach (var player in PlayerManager.GetTickPlayers().Where(p => p.Team == CsTeam.Terrorist)) { if (player == null || !player.IsValid) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/Cypher.cs b/jRandomSkills - SRC Files/src/player/skills/Cypher.cs index 3614536..c8e9a11 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Cypher.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Cypher.cs @@ -136,7 +136,7 @@ namespace src.player.skills var newProp = CreateCameraProp(player); playerInfo.CameraProp = newProp?.Index ?? null; - + if (playerInfo.CameraProp == null) { playerInfo.NoSpace = Server.TickCount + (64 * 2); @@ -144,7 +144,7 @@ namespace src.player.skills } else playerInfo.CameraView = CreateCameraView(newProp)?.Index ?? null; - + if (playerInfo.CameraView == null) return; } @@ -194,7 +194,7 @@ namespace src.player.skills Timer? cameraTimer = null; cameraTimer = jRandomSkills.Instance.AddTimer(2f, () => { - var target = Utilities.GetPlayers().FirstOrDefault(p => p.IsValid && p.Index == playerIndex); + var target = PlayerManager.GetTickPlayers().FirstOrDefault(p => p.IsValid && p.Index == playerIndex); if (target == null || !target.IsValid || target.LifeState != (byte)LifeState_t.LIFE_ALIVE) { cameraTimer?.Kill(); @@ -259,6 +259,7 @@ namespace src.player.skills Vector diffVector = SkillUtils.GetForwardVector(cameraProp.AbsRotation) * 25; Vector finalPos = cameraProp.AbsOrigin + diffVector; + var camRot = new QAngle(cameraProp.AbsRotation.X, cameraProp.AbsRotation.Y, cameraProp.AbsRotation.Z); uint ownerIndex = EntityManager.SystemOwnerIndex; if (!string.IsNullOrEmpty(cameraProp.Globalname)) @@ -274,11 +275,15 @@ 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)); + + var camNode = camera.CBodyComponent?.SceneNode?.Owner?.Entity; + if (camNode != null) + camNode.Flags = (uint)(camNode.Flags & ~(1 << 2)); + camera.SetModel(cameraViewModel); camera.Render = Color.FromArgb(1, 255, 255, 255); - camera.Teleport(finalPos, cameraProp.AbsRotation); + camera.Teleport(finalPos, camRot); camera.DispatchSpawn(); EntityManager.RegisterExisting(camera, ownerIndex, "prop_dynamic"); }); diff --git a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs index af1cda6..5c6bde7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs @@ -38,7 +38,7 @@ namespace src.player.skills { lock (setLock) { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (playersInDark.ContainsKey(player.Index)) DisableSkill(player); @@ -52,13 +52,13 @@ namespace src.player.skills public static void OnTick() { if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!SkillUtils.HasMenu(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - 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(); + var enemies = PlayerManager.GetTickPlayers().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); @@ -82,7 +82,8 @@ namespace src.player.skills string enemyId = commands[0]; - if (!uint.TryParse(enemyId, out uint enemyIndex)) { + if (!uint.TryParse(enemyId, out uint enemyIndex)) + { playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } @@ -128,7 +129,7 @@ namespace src.player.skills var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; - 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(); + var enemies = PlayerManager.GetTickPlayers().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()))]; @@ -183,7 +184,8 @@ namespace src.player.skills ApplyColor(player); Timer? darkTimer = null; - darkTimer = Instance.AddTimer(5f, () => { + darkTimer = Instance.AddTimer(5f, () => + { if (!playersInDark.ContainsKey(playerIndex)) { darkTimer?.Kill(); diff --git a/jRandomSkills - SRC Files/src/player/skills/Dash.cs b/jRandomSkills - SRC Files/src/player/skills/Dash.cs index 0b37639..22505ea 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dash.cs @@ -67,7 +67,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (player == null || !player.IsValid) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs index 6b0b890..6817938 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs @@ -18,20 +18,20 @@ namespace src.player.skills public static void NewRound() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) SkillUtils.CloseMenu(player); } public static void OnTick() { if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!SkillUtils.HasMenu(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - 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(); + var enemies = PlayerManager.GetTickPlayers().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) @@ -62,7 +62,8 @@ namespace src.player.skills string enemyId = commands[0]; - if (!uint.TryParse(enemyId, out uint enemyIndex)) { + if (!uint.TryParse(enemyId, out uint enemyIndex)) + { playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } @@ -83,7 +84,7 @@ namespace src.player.skills var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; - 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(); + var enemies = PlayerManager.GetTickPlayers().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 = []; diff --git a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs index e9431f1..6b57b6e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs @@ -40,7 +40,7 @@ namespace src.player.skills deafPlayers.Clear(); playersToTarget.Clear(); - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) SkillUtils.CloseMenu(player); } @@ -57,13 +57,13 @@ namespace src.player.skills public static void OnTick() { if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!SkillUtils.HasMenu(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - 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(); + var enemies = PlayerManager.GetTickPlayers().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); @@ -87,7 +87,8 @@ namespace src.player.skills string enemyId = commands[0]; - if (!uint.TryParse(enemyId, out uint enemyIndex)) { + if (!uint.TryParse(enemyId, out uint enemyIndex)) + { playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } @@ -120,7 +121,7 @@ namespace src.player.skills var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; - 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(); + var enemies = PlayerManager.GetTickPlayers().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()))); diff --git a/jRandomSkills - SRC Files/src/player/skills/DeathBomb.cs b/jRandomSkills - SRC Files/src/player/skills/DeathBomb.cs index 69df754..425c028 100644 --- a/jRandomSkills - SRC Files/src/player/skills/DeathBomb.cs +++ b/jRandomSkills - SRC Files/src/player/skills/DeathBomb.cs @@ -37,7 +37,7 @@ namespace src.player.skills if (player == null || !player.IsValid || player.Team != lastTeam) return; var pawn = player.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid || pawn.Health == pawn.MaxHealth) return; + if (pawn == null || !pawn.IsValid || pawn.Health == pawn.MaxHealth) return; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) @@ -54,10 +54,10 @@ namespace src.player.skills pos.Z += 10; 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)) + + foreach (var _p in PlayerManager.GetTickPlayers().Where(p => p.IsValid && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) SkillUtils.PrintToChat(_p, $"{ChatColors.DarkRed}\u202A{player.PlayerName}\u202C: {ChatColors.Lime}{_p.GetTranslation("deathbomb_explosion")}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().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/Disarmament.cs b/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs index 6ab44e2..260941b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs @@ -44,7 +44,7 @@ namespace src.player.skills 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 != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().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 = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, float chanceFrom = .2f, float chanceTo = .35f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Distancer.cs b/jRandomSkills - SRC Files/src/player/skills/Distancer.cs index f1f34f5..92ab05e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Distancer.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Distancer.cs @@ -41,7 +41,7 @@ namespace src.player.skills string closetEnemy = "Bot"; double closetDistance = double.MaxValue; - foreach (var enemy in Utilities.GetPlayers().Where(p => p.Team != player.Team)) + foreach (var enemy in PlayerManager.GetTickPlayers().Where(p => p.Team != player.Team)) { var enemyPawn = enemy.PlayerPawn.Value; if (enemyPawn == null || !enemyPawn.IsValid) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs index 886f1df..7d01917 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -18,20 +18,20 @@ namespace src.player.skills public static void NewRound() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) SkillUtils.CloseMenu(player); } public static void OnTick() { if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!SkillUtils.HasMenu(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Index != player.Index && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Index != player.Index && 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) @@ -63,7 +63,7 @@ namespace src.player.skills if (playerEvent == null || !playerEvent.IsValid) return; string enemyId = commands[0]; - var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Index.ToString() == enemyId); + var enemy = PlayerManager.GetTickPlayers().FirstOrDefault(p => p.Index.ToString() == enemyId); if (enemy == null) { @@ -79,7 +79,7 @@ namespace src.player.skills var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; - var enemies = Utilities.GetPlayers().Where(p => p != null && p.IsValid && p != player && p.PlayerPawn?.Value?.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid && p != player && p.PlayerPawn?.Value?.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { ConcurrentBag skills = []; @@ -91,14 +91,14 @@ namespace src.player.skills var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; - + skills.Add(skillData.Skill.ToString()); menuItems.Add(($"\u202A{enemy.PlayerName}\u202C : {playerEvent.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); @@ -107,7 +107,7 @@ namespace src.player.skills SkillUtils.CreateMenu(player, menuItems); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{playerEvent.GetSkillName(skillName)}{ChatColors.Lime}: {playerEvent.GetSkillDescription(skillName)}", - border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } else playerEvent.PrintToChat($" {ChatColors.Red}{playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); @@ -160,7 +160,8 @@ namespace src.player.skills SkillUtils.CloseMenu(player); if (SkillsInfo.GetValue(enemySkill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) - Instance?.AddTimer(Math.Max((float)(Event.GetFreezeTimeEnd() - DateTime.Now).TotalSeconds, 0), () => { + Instance?.AddTimer(Math.Max((float)(Event.GetFreezeTimeEnd() - DateTime.Now).TotalSeconds, 0), () => + { var player = Utilities.GetPlayerFromIndex((int)playerIndex); if (player == null || !player.IsValid) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs b/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs index afc299a..3c848d0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs @@ -17,7 +17,7 @@ namespace src.player.skills public static void NewRound() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!Instance.IsPlayerValid(player)) continue; DisableSkill(player); @@ -38,7 +38,7 @@ 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 != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Earthquake.cs b/jRandomSkills - SRC Files/src/player/skills/Earthquake.cs index 737d524..89a8b5c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Earthquake.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Earthquake.cs @@ -51,7 +51,7 @@ namespace src.player.skills //public static void OnTick() //{ - // foreach (var player in Utilities.GetPlayers()) + // foreach (var player in PlayerManager.GetTickPlayers()) // { // var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); // if (playerInfo?.Skill == skillName) @@ -100,7 +100,7 @@ namespace src.player.skills //private static void MakeShake(CCSPlayerController player) //{ - // foreach (var enemy in Utilities.GetPlayers().Where(p => p != null && p.IsValid && p.PawnIsAlive)) + // foreach (var enemy in PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid && p.PawnIsAlive)) // CreateShake(player); //} diff --git a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs index 9cfa6a9..6f724fe 100644 --- a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs +++ b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs @@ -26,12 +26,12 @@ namespace src.player.skills public static void OnTick() { if (SkillUtils.IsFreezeTime()) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) - UpdateHUD(player, skillInfo); + UpdateHUD(player, skillInfo); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs b/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs index e4ca1a5..f4eceb3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs @@ -23,12 +23,12 @@ namespace src.player.skills { 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 != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } private static void SpawnExplosion(Vector vector) @@ -58,7 +58,7 @@ namespace src.player.skills }); } - private static bool NearlyEquals(float a, float b, float epsilon = 0.001f) => Math.Abs(a -b) < epsilon; + private static bool NearlyEquals(float a, float b, float epsilon = 0.001f) => Math.Abs(a - b) < epsilon; public static void BulletImpact(EventBulletImpact @event) { diff --git a/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs b/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs index 955433f..68d29f2 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs @@ -32,7 +32,7 @@ namespace src.player.skills if (!Instance.IsPlayerValid(player)) return; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); - if (playerInfo?.Skill != skillName) return ; + if (playerInfo?.Skill != skillName) return; var pawn = player!.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return; @@ -58,11 +58,11 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) 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; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue; if (pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) { @@ -122,7 +122,11 @@ 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)); + + var camNode = camera.CBodyComponent?.SceneNode?.Owner?.Entity; + if (camNode != null) + camNode.Flags = (uint)(camNode.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)); diff --git a/jRandomSkills - SRC Files/src/player/skills/Flash.cs b/jRandomSkills - SRC Files/src/player/skills/Flash.cs index 88c6455..b5daafc 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Flash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Flash.cs @@ -31,7 +31,7 @@ namespace src.player.skills if (userIndex == 0) return; if (!Instance.footstepSoundEvents.Contains(soundevent)) return; - var player = Utilities.GetPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex); + var player = PlayerManager.GetTickPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex); if (!Instance.IsPlayerValid(player)) return; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); @@ -62,7 +62,7 @@ namespace src.player.skills 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 != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } public static void DisableSkill(CCSPlayerController player) @@ -75,7 +75,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!Instance.IsPlayerValid(player)) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs index cecd03b..c6e7987 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs @@ -34,7 +34,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) @@ -140,7 +140,7 @@ namespace src.player.skills if (barricades.TryGetValue(box.Index, out int health)) { int newHealth = health - (int)param2.Damage; - + if (newHealth <= 0) { barricades.TryRemove(box.Index, out _); diff --git a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs index 50bf9f8..24af06a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs @@ -49,7 +49,7 @@ 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.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) + foreach (var player in PlayerManager.GetTickPlayers().Where(p => p.IsValid && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) { var eventPlayer = PlayerManager.GetPlayerEvent(player); if (eventPlayer == null || !eventPlayer.IsValid) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/Gambler.cs b/jRandomSkills - SRC Files/src/player/skills/Gambler.cs index 6a253fe..224fb55 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Gambler.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Gambler.cs @@ -18,7 +18,7 @@ namespace src.player.skills public static void NewRound() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) SkillUtils.CloseMenu(player); } @@ -60,7 +60,8 @@ namespace src.player.skills playerInfo.SkillUsed = true; if (SkillsInfo.GetValue(skill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) - Instance?.AddTimer(Math.Max((float)(Event.GetFreezeTimeEnd() - DateTime.Now).TotalSeconds, 0), () => { + Instance?.AddTimer(Math.Max((float)(Event.GetFreezeTimeEnd() - DateTime.Now).TotalSeconds, 0), () => + { var player = Utilities.GetPlayerFromIndex((int)playerIndex); if (player == null || !player.IsValid) return; @@ -120,7 +121,7 @@ namespace src.player.skills List skillList = [.. SkillData.Skills]; skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None); - if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsHLTV && p.Team != CsTeam.Spectator).Count == 1) + if (PlayerManager.GetTickPlayers().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 b8da8c3..7d5079a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs @@ -29,7 +29,7 @@ namespace src.player.skills public static void NewRound() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) SetWeaponAttack(player, false); invisiblePlayers.Clear(); } @@ -58,7 +58,7 @@ namespace src.player.skills { if (invisiblePlayers.IsEmpty) return; - var bomb = Utilities.FindAllEntitiesByDesignerName("weapon_c4").FirstOrDefault(); + var bomb = PlayerManager.GetTickBomb(); uint? bombOwnerIndex = bomb != null && bomb.IsValid ? bomb.OwnerEntity?.Index : null; foreach (var (info, player) in infoList) @@ -151,7 +151,7 @@ namespace src.player.skills { if (Server.TickCount % 2 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) diff --git a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs index 8cf382b..37bb474 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs @@ -41,10 +41,10 @@ namespace src.player.skills { foreach (var (info, player) in infoList) { - if (player == null) continue; + if (player == null || !player.IsValid) continue; var playerInfo = PlayerManager.GetPlayerByIndex((PlayerManager.GetPlayerEvent(player)?.Index ?? player.Index)); - var observedPlayer = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == player?.Pawn?.Value?.ObserverServices?.ObserverTarget?.Value?.Handle); + var observedPlayer = PlayerManager.GetTickPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == player?.Pawn?.Value?.ObserverServices?.ObserverTarget?.Value?.Handle); var observerInfo = observedPlayer != null ? PlayerManager.GetPlayerByIndex(observedPlayer.Index) : null; if (playerInfo?.Skill != skillName && observerInfo?.Skill != skillName) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs index dd90650..6cf7b34 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs @@ -35,7 +35,7 @@ namespace src.player.skills { lock (setLock) { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { DisableSkill(player); SkillUtils.CloseMenu(player); @@ -49,13 +49,13 @@ namespace src.player.skills public static void OnTick() { if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!SkillUtils.HasMenu(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - 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(); + var enemies = PlayerManager.GetTickPlayers().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); @@ -79,7 +79,8 @@ namespace src.player.skills string enemyId = commands[0]; - if (!uint.TryParse(enemyId, out uint enemyIndex)) { + if (!uint.TryParse(enemyId, out uint enemyIndex)) + { playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } @@ -127,7 +128,7 @@ namespace src.player.skills var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; - 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(); + var enemies = PlayerManager.GetTickPlayers().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()))); diff --git a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs index e618e63..1206331 100644 --- a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs +++ b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs @@ -22,7 +22,7 @@ namespace src.player.skills public static void NewRound() { - lock (setLock) + lock (setLock) SkillPlayerInfo.Clear(); } @@ -42,7 +42,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) @@ -101,7 +101,8 @@ namespace src.player.skills PlayerManager.GetPlayerFromEvent(player)?.PrintToChat($" {ChatColors.Green} {player.GetTranslation("godmode_on")}"); player.PlayerPawn.Value.TakesDamage = false; - Instance.AddTimer(SkillsInfo.GetValue(skillName, "duration"), () => { + Instance.AddTimer(SkillsInfo.GetValue(skillName, "duration"), () => + { if (SkillPlayerInfo.TryGetValue(playerIndex, out var skillInfo)) skillInfo.HaveGodMode = false; @@ -125,7 +126,7 @@ namespace src.player.skills { public ulong SteamID { get; set; } public bool CanUse { get; set; } - public bool HaveGodMode { get; set; } + public bool HaveGodMode { get; set; } public DateTime Cooldown { get; set; } } diff --git a/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs index 9cae5c3..a88370c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs @@ -42,7 +42,7 @@ namespace src.player.skills 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)) + foreach (var smoke in smokes.Keys.Where(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z)) smokes.TryRemove(smoke, out _); } @@ -82,7 +82,7 @@ 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)) + foreach (var player in PlayerManager.GetTickPlayers().Where(p => p.IsValid)) { var eventPlayer = PlayerManager.GetPlayerEvent(player); if (eventPlayer == null || !eventPlayer.IsValid) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs b/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs index 5e19820..80aac0d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs @@ -32,7 +32,7 @@ namespace src.player.skills var playerPawn = hegrenade.Thrower.Value; if (playerPawn == null || !playerPawn.IsValid) return; - var player = Utilities.GetPlayers().FirstOrDefault(p => p.PlayerPawn.Index == playerPawn.Index); + var player = PlayerManager.GetTickPlayers().FirstOrDefault(p => p.PlayerPawn.Index == playerPawn.Index); var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/HomingNades.cs b/jRandomSkills - SRC Files/src/player/skills/HomingNades.cs index 9e214d1..592ceab 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HomingNades.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HomingNades.cs @@ -26,12 +26,12 @@ namespace src.player.skills public static void OnTick() { if (Server.TickCount % 10 != 0) return; - + foreach (var index in nades.Keys.ToList()) { if (!nades.TryGetValue(index, out var data)) continue; Vector oldPos = data; - + var nade = Utilities.GetEntityFromIndex((int)index); if (nade == null || !nade.IsValid || nade.AbsOrigin == null) { @@ -49,7 +49,7 @@ namespace src.player.skills { nade.DetonateTime = isZero ? 0f : nade.CreateTime + 1.5f; Utilities.SetStateChanged(nade, "CBaseGrenade", "m_flDetonateTime"); - + nades.TryRemove(index, out _); continue; } @@ -75,11 +75,11 @@ namespace src.player.skills double minDistance = int.MaxValue; Vector nadePos = nade.AbsOrigin; - foreach (var enemy in Utilities.GetPlayers().Where(p => p.IsValid && p.PawnIsAlive && p.TeamNum != team)) + foreach (var enemy in PlayerManager.GetTickPlayers().Where(p => p.IsValid && p.PawnIsAlive && p.TeamNum != team)) { var pawn = enemy.PlayerPawn.Value; if (pawn?.IsValid != true || pawn.AbsOrigin == null) continue; - + double dist = SkillUtils.GetDistance(nadePos, pawn.AbsOrigin); if (dist < SkillsInfo.GetValue(skillName, "detonationRange")) { diff --git a/jRandomSkills - SRC Files/src/player/skills/HotBomb.cs b/jRandomSkills - SRC Files/src/player/skills/HotBomb.cs index 263a456..28bd3fa 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HotBomb.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HotBomb.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Commands.Targeting; using CounterStrikeSharp.API.Modules.Utils; @@ -26,7 +26,7 @@ namespace src.player.skills if (players.IsEmpty || jRandomSkills.Instance.GameRules?.FreezePeriod == true) return; int damage = SkillsInfo.GetValue(skillName, "damage"); - foreach (var player in Utilities.GetPlayers().Where(p => p != null && p.IsValid && p.Team == CsTeam.Terrorist && p.PlayerPawn?.Value?.Health > 0)) + foreach (var player in PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid && p.Team == CsTeam.Terrorist && p.PlayerPawn?.Value?.Health > 0)) { var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) continue; @@ -91,7 +91,7 @@ namespace src.player.skills if (players.IsEmpty) { ChangeC4Color(Color.Red); - foreach (var enemy in Utilities.GetPlayers().Where(p => p.IsValid && p.Team == CsTeam.Terrorist && p.PlayerPawn?.Value?.Health > 0)) + foreach (var enemy in PlayerManager.GetTickPlayers().Where(p => p.IsValid && p.Team == CsTeam.Terrorist && p.PlayerPawn?.Value?.Health > 0)) enemy.PrintToCenterAlert(enemy.GetTranslation("hotbomb_hint")); } @@ -105,7 +105,7 @@ namespace src.player.skills if (players.IsEmpty && !SkillUtils.IsFreezeTime()) { ChangeC4Color(Color.White); - foreach (var enemy in Utilities.GetPlayers().Where(p => p.IsValid && p.Team == CsTeam.Terrorist && p.PlayerPawn?.Value?.Health > 0)) + foreach (var enemy in PlayerManager.GetTickPlayers().Where(p => p.IsValid && p.Team == CsTeam.Terrorist && p.PlayerPawn?.Value?.Health > 0)) enemy.PrintToCenterAlert(enemy.GetTranslation("hotbomb_disable_info")); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Iana.cs b/jRandomSkills - SRC Files/src/player/skills/Iana.cs index 48e691d..432f323 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Iana.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Iana.cs @@ -25,7 +25,7 @@ namespace src.player.skills { foreach (var playerSkill in playersInfo.Values) KillClone(playerSkill); - + lock (setLock) playersInfo.Clear(); } @@ -107,11 +107,11 @@ namespace src.player.skills if (player == null || !player.IsValid) return; player.EmitSound("SolidMetal.BulletImpact"); - + CDynamicProp? cloneProp = null; if (playerSkill.CloneProp != null) cloneProp = Utilities.GetEntityFromIndex((int)playerSkill.CloneProp); - + if (cloneProp != null && cloneProp.IsValid && cloneProp.AbsOrigin != null && cloneProp.AbsRotation != null) { var playerPawn = player.PlayerPawn.Value; @@ -203,7 +203,7 @@ namespace src.player.skills playerSkill.NextUse = Server.TickCount + 64000; playerSkill.CloneProp = clone.Index; - jRandomSkills.Instance.AddTimer(SkillsInfo.GetValue(skillName, "Duration"), () => + jRandomSkills.Instance.AddTimer(SkillsInfo.GetValue(skillName, "Duration"), () => { if (playerSkill.CloneProp != null) KillClone(playerSkill); @@ -250,7 +250,7 @@ namespace src.player.skills if (!result.HasValue) return false; - + return !result.Value.DidHit; } @@ -313,7 +313,7 @@ namespace src.player.skills { Vector pos = param2.DamagePosition; Vector posCl = cloneProp.AbsOrigin; - + bool isHead = false; float viewOffset = 63.27f; float diff = 2f; diff --git a/jRandomSkills - SRC Files/src/player/skills/Illiterate.cs b/jRandomSkills - SRC Files/src/player/skills/Illiterate.cs index b36d9b2..9704203 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Illiterate.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Illiterate.cs @@ -52,7 +52,7 @@ namespace src.player.skills 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( + return PlayerManager.GetTickPlayers().Any( p => p != null && p.IsValid && p.Pawn?.Value != null && diff --git a/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs b/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs index c721b51..ac68ad7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs @@ -42,9 +42,9 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { - if (player == null || !player.IsValid ) continue; + if (player == null || !player.IsValid) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) @@ -115,7 +115,7 @@ namespace src.player.skills replica.Collision.SolidType = SolidType_t.SOLID_VPHYSICS; replica.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(replica.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); - + replica.SetModel(playerPawn!.CBodyComponent!.SceneNode!.GetSkeletonInstance().ModelState.ModelName); replica.Entity!.Name = replica.Globalname = $"Illusionist_{Server.TickCount}_{(player.Team == CsTeam.CounterTerrorist ? "CT" : "TT")}"; @@ -137,7 +137,8 @@ namespace src.player.skills Vector forwardVec = SkillUtils.GetForwardVector(angle); int replicaIndex = (int)replica.Index; - Instance.AddTickTimer(10, () => { + Instance.AddTickTimer(10, () => + { var moveTimer = Instance.AddTickTimer(1, () => { if (replica == null || !replica.IsValid) diff --git a/jRandomSkills - SRC Files/src/player/skills/Impostor.cs b/jRandomSkills - SRC Files/src/player/skills/Impostor.cs index 20c0be8..6425564 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Impostor.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Impostor.cs @@ -43,7 +43,7 @@ namespace src.player.skills private static string GetEnemyModel(CCSPlayerController player) { - CCSPlayerController[] models = [.. Utilities.GetPlayers().FindAll(p => p.IsValid && p.PawnIsAlive && p.Team != player.Team)]; + CCSPlayerController[] models = [.. PlayerManager.GetTickPlayers().FindAll(p => p.IsValid && p.PawnIsAlive && p.Team != player.Team)]; if (models != null && models.Length > 0) { var model = models[Instance.Random.Next(models.Length)]; diff --git a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs index 4a57218..df00716 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jackal.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; @@ -54,7 +54,7 @@ namespace src.player.skills var targetHandle = player.Pawn.Value?.ObserverServices?.ObserverTarget.Value?.Handle ?? nint.Zero; if (targetHandle != nint.Zero) { - var observed = Utilities.GetPlayers() + var observed = PlayerManager.GetTickPlayers() .FirstOrDefault(p => p?.Pawn?.Value?.Handle == targetHandle); if (observed != null && observed.IsValid) { @@ -135,7 +135,7 @@ namespace src.player.skills Event.EnableTransmit(); playersInAction.TryAdd(player.Index, 0); - var opponents = Utilities.GetPlayers() + var opponents = PlayerManager.GetTickPlayers() .Where(p => p != null && p.IsValid && p.Team != player.Team @@ -151,7 +151,7 @@ namespace src.player.skills private static void UpdateAllTrails() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) CreatePlayerTrail(player); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs index 3e3ced6..3471ab7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs @@ -50,20 +50,20 @@ namespace src.player.skills jammerToTarget.Clear(); } - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) SkillUtils.CloseMenu(player); } public static void OnTick() { if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!SkillUtils.HasMenu(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - 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(); + var enemies = PlayerManager.GetTickPlayers().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); @@ -87,7 +87,8 @@ namespace src.player.skills string enemyId = commands[0]; - if (!uint.TryParse(enemyId, out uint enemyIndex)) { + if (!uint.TryParse(enemyId, out uint enemyIndex)) + { playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } @@ -149,7 +150,7 @@ namespace src.player.skills var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; - 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(); + var enemies = PlayerManager.GetTickPlayers().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()))); diff --git a/jRandomSkills - SRC Files/src/player/skills/Jester.cs b/jRandomSkills - SRC Files/src/player/skills/Jester.cs index 9d11fb2..ed4aa7d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jester.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jester.cs @@ -73,7 +73,7 @@ namespace src.player.skills { SkillUtils.ResetPrintHTML(player); SetPlayerColor(player, true); - + }); } @@ -92,7 +92,8 @@ namespace src.player.skills jester.Timer = null; } - jester.Timer = Instance.AddTimer(1, () => { + jester.Timer = Instance.AddTimer(1, () => + { ChangeMode(playerIndex, false); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } @@ -112,7 +113,8 @@ namespace src.player.skills jester.Timer = null; } - jester.Timer = Instance.AddTimer(1, () => { + jester.Timer = Instance.AddTimer(1, () => + { if (player != null && player.IsValid) ChangeMode(playerIndex, false); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); @@ -211,7 +213,7 @@ namespace src.player.skills if (jester.Active != previousState) { SetPlayerColor(player); - + var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent != null && playerEvent.IsValid) playerEvent.ExecuteClientCommand("play sounds/weapons/taser/taser_charge_ready"); @@ -254,7 +256,7 @@ namespace src.player.skills public static void OnTick() { if (SkillUtils.IsFreezeTime()) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { var playeEvent = PlayerManager.GetPlayerEvent(player); if (playeEvent == null || !playeEvent.IsValid || playeEvent.PlayerPawn.Value == null || !playeEvent.PlayerPawn.Value.IsValid) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs index 8896316..7dd38ed 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs @@ -32,7 +32,7 @@ namespace src.player.skills bannedPlayers.Clear(); playersToTarget.Clear(); - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) SkillUtils.CloseMenu(player); } @@ -62,13 +62,13 @@ namespace src.player.skills } if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!SkillUtils.HasMenu(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - 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(); + var enemies = PlayerManager.GetTickPlayers().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); @@ -92,7 +92,8 @@ namespace src.player.skills string enemyId = commands[0]; - if (!uint.TryParse(enemyId, out uint enemyIndex)) { + if (!uint.TryParse(enemyId, out uint enemyIndex)) + { playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } @@ -125,7 +126,7 @@ namespace src.player.skills var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; - 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(); + var enemies = PlayerManager.GetTickPlayers().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()))); diff --git a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs index 0552c7b..c88d8d5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs @@ -30,7 +30,7 @@ namespace src.player.skills if (!SkillsInfo.GetValue(skillName, "friendlyFire") && player!.Team == attacker!.Team) return; if (attackerInfo?.Skill == skillName && playerInfo?.Skill != Skills.AntyFlash && player!.PlayerPawn.Value!.FlashDuration >= SkillsInfo.GetValue(skillName, "flashDuration")) - player?.PlayerPawn?.Value?.CommitSuicide(false, true); + SkillUtils.TakeHealth(player.PlayerPawn.Value, 9999); } public static void GrenadeThrown(EventGrenadeThrown @event) diff --git a/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs b/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs index 5b3ebc8..eed8587 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs @@ -17,20 +17,20 @@ namespace src.player.skills public static void NewRound() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) SkillUtils.CloseMenu(player); } public static void OnTick() { if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!SkillUtils.HasMenu(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - 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(); + var enemies = PlayerManager.GetTickPlayers().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 => ($"\u202A{e.PlayerName}\u202C : {e?.PlayerPawn?.Value?.Health ?? 0} HP", e.Index.ToString()))); SkillUtils.UpdateMenu(player, menuItems); @@ -55,7 +55,8 @@ namespace src.player.skills string enemyId = commands[0]; - if (!uint.TryParse(enemyId, out uint enemyIndex)) { + if (!uint.TryParse(enemyId, out uint enemyIndex)) + { playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } @@ -84,7 +85,7 @@ namespace src.player.skills if (playerInfo == null) return; playerInfo.SkillUsed = false; - 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(); + var enemies = PlayerManager.GetTickPlayers().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 => ($"\u202A{e.PlayerName}\u202C : {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 ab419eb..c0ecbf8 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs @@ -125,7 +125,7 @@ namespace src.player.skills public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#c9f8ff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, float maxDistance = 4096f, bool friendlyFire = true) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity) { public float MaxDistance { get; set; } = maxDistance; - public bool FriendlyFire { get; set; } = friendlyFire; + public bool FriendlyFire { get; set; } = friendlyFire; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs b/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs index 80acce4..c3dbe8c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs @@ -38,7 +38,7 @@ namespace src.player.skills if (target.Handle == player.Handle) return; if (!SkillsInfo.GetValue(skillName, "friendlyFire") && player.Team == target.Team) return; - + SkillUtils.TakeHealth(target.PlayerPawn.Value, 9999); } diff --git a/jRandomSkills - SRC Files/src/player/skills/MagneticDecoy.cs b/jRandomSkills - SRC Files/src/player/skills/MagneticDecoy.cs index e24a3d4..a5a4a1a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/MagneticDecoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/MagneticDecoy.cs @@ -49,7 +49,7 @@ 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.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) + foreach (var player in PlayerManager.GetTickPlayers().Where(p => p.IsValid && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) { var eventPlayer = PlayerManager.GetPlayerEvent(player); if (eventPlayer == null || !eventPlayer.IsValid) continue; @@ -60,7 +60,7 @@ namespace src.player.skills if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue; double distance = SkillUtils.GetDistance(decoyPos, pawn.AbsOrigin); - if (distance <= decoyRadius && distance > 10) + if (distance <= decoyRadius && distance > 10) { Vector direction = new(decoyPos.X - pawn.AbsOrigin.X, decoyPos.Y - pawn.AbsOrigin.Y, 0); float length = direction.Length(); diff --git a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs index b40af0a..6cf331d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs @@ -35,24 +35,24 @@ namespace src.player.skills if (player == null || !player.IsValid) continue; DisableSkill(player); } - + playersFOV.Clear(); playersToTarget.Clear(); - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) SkillUtils.CloseMenu(player); } public static void OnTick() { if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!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.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = PlayerManager.GetTickPlayers().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); @@ -70,17 +70,18 @@ namespace src.player.skills if (playerInfo.SkillUsed) { - playerEvent.PrintToChat($" {ChatColors.Red}{playerEvent.GetTranslation("areareaper_used_info")}" ); + playerEvent.PrintToChat($" {ChatColors.Red}{playerEvent.GetTranslation("areareaper_used_info")}"); return; } string enemyId = commands[0]; - if (!uint.TryParse(enemyId, out uint enemyIndex)) { + if (!uint.TryParse(enemyId, out uint enemyIndex)) + { playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } - + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) @@ -112,7 +113,7 @@ namespace src.player.skills if (player == null || !player.IsValid) return; if (!playersFOV.ContainsKey(bot.Index)) return; - + player.DesiredFOV = SkillsInfo.GetValue(skillName, "customFOV"); Utilities.SetStateChanged(player, "CBasePlayerController", "m_iDesiredFOV"); } @@ -126,7 +127,7 @@ namespace src.player.skills var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; - 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(); + var enemies = PlayerManager.GetTickPlayers().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()))); diff --git a/jRandomSkills - SRC Files/src/player/skills/Medic.cs b/jRandomSkills - SRC Files/src/player/skills/Medic.cs index 43165ed..481308a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Medic.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Medic.cs @@ -27,7 +27,7 @@ namespace src.player.skills public static void OnTick() { if (SkillUtils.IsFreezeTime()) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) diff --git a/jRandomSkills - SRC Files/src/player/skills/Miner.cs b/jRandomSkills - SRC Files/src/player/skills/Miner.cs index 5e7a590..3c8d452 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Miner.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Miner.cs @@ -42,7 +42,7 @@ namespace src.player.skills if (nade.CreateTime + 3 > currentTime) return; Vector currentPos = new(nade.AbsOrigin.X, nade.AbsOrigin.Y, nade.AbsOrigin.Z); - foreach (var enemy in Utilities.GetPlayers().Where(p => p.IsValid && p.PawnIsAlive && p.TeamNum != nade.TeamNum)) + foreach (var enemy in PlayerManager.GetTickPlayers().Where(p => p.IsValid && p.PawnIsAlive && p.TeamNum != nade.TeamNum)) { var enemyPawn = enemy.PlayerPawn.Value; if (enemyPawn == null || !enemyPawn.IsValid || enemyPawn.AbsOrigin == null) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs b/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs index 874cc15..ef811af 100644 --- a/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs @@ -17,20 +17,20 @@ namespace src.player.skills public static void NewRound() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) SkillUtils.CloseMenu(player); } public static void OnTick() { if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!SkillUtils.HasMenu(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - 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(); + var enemies = PlayerManager.GetTickPlayers().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 => ($"\u202A{e.PlayerName}\u202C : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account + e.InGameMoneyServices.CashSpentThisRound)}$", e.Index.ToString()))]; SkillUtils.UpdateMenu(player, menuItems); @@ -40,14 +40,14 @@ namespace src.player.skills public static void TypeSkill(CCSPlayerController player, string[] commands) { if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; - + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) return; var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; - if (playerInfo.SkillUsed) + if (playerInfo.SkillUsed) { playerEvent.PrintToChat($" {ChatColors.Red}{playerEvent.GetTranslation("areareaper_used_info")}"); return; @@ -55,7 +55,8 @@ namespace src.player.skills string enemyId = commands[0]; - if (!uint.TryParse(enemyId, out uint enemyIndex)) { + if (!uint.TryParse(enemyId, out uint enemyIndex)) + { playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } @@ -83,7 +84,7 @@ namespace src.player.skills if (playerInfo == null) return; playerInfo.SkillUsed = false; - 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(); + var enemies = PlayerManager.GetTickPlayers().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 => ($"\u202A{e.PlayerName}\u202C : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account + e.InGameMoneyServices.CashSpentThisRound)}$", e.Index.ToString()))]; diff --git a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs index 2789c86..1144946 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs @@ -60,7 +60,7 @@ namespace src.player.skills { if (invisiblePlayers.IsEmpty) return; - var bomb = Utilities.FindAllEntitiesByDesignerName("weapon_c4").FirstOrDefault(); + var bomb = PlayerManager.GetTickBomb(); uint? bombOwnerIndex = bomb != null && bomb.IsValid ? bomb.OwnerEntity?.Index : null; foreach (var (info, player) in infoList) @@ -103,7 +103,7 @@ namespace src.player.skills { if (Server.TickCount % 2 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (player.PlayerPawn?.Value == null || player.PlayerPawn?.Value?.Health <= 0) invisiblePlayers.TryRemove(player.Index, out _); @@ -137,7 +137,7 @@ namespace src.player.skills SkillUtils.ForceFullUpdateToAll(); } - + public static void DisableSkill(CCSPlayerController player) { SkillUtils.SetPlayerInvisibility(player, 0); @@ -182,7 +182,7 @@ namespace src.player.skills var pawn = playerEvent.PlayerPawn?.Value; if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; - + var flags = (PlayerFlags)pawn.Flags; var buttons = player.Buttons; diff --git a/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs b/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs index 79154c3..8c47cc5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs +++ b/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs @@ -52,7 +52,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!Instance.IsPlayerValid(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); diff --git a/jRandomSkills - SRC Files/src/player/skills/Noclip.cs b/jRandomSkills - SRC Files/src/player/skills/Noclip.cs index 6619d12..90a4e75 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Noclip.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Noclip.cs @@ -29,7 +29,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) @@ -110,7 +110,7 @@ namespace src.player.skills skillInfo.IsFlying = true; skillInfo.Cooldown = DateTime.Now; skillInfo.LastPosition = playerPawn.AbsOrigin == null ? null : new Vector(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z); - + SetNoclip(player, true); skillInfo.Timer?.Kill(); @@ -211,7 +211,7 @@ namespace src.player.skills if (result.HasValue && !result.Value.DidHit) return newPos; } - + if (hasGround) skillInfo.Cooldown = DateTime.Now.AddSeconds(-SkillsInfo.GetValue(skillName, "cooldown") + SkillsInfo.GetValue(skillName, "cooldownWhenStuck")); return hasGround ? stuckVector : null; diff --git a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs index b50493c..66c8270 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs @@ -19,7 +19,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (player == null || !player.IsValid) return; var playerEvent = PlayerManager.GetPlayerEvent(player); @@ -42,7 +42,7 @@ 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 != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } private static void GiveAdditionalJump(CCSPlayerController player, CCSPlayerController playerEvent) diff --git a/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs b/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs index 66c8bfe..fe7b8ad 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs @@ -1,5 +1,6 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; @@ -10,6 +11,7 @@ namespace src.player.skills public class Phoenix : ISkill { private const Skills skillName = Skills.Phoenix; + private const float DefaultHeadshotMultiplier = 4f; private static readonly ConcurrentDictionary phoenixTicks = new(); public static void LoadSkill() @@ -17,38 +19,61 @@ namespace src.player.skills SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color"), false); } - public static void PlayerHurt(EventPlayerHurt @event) + public static void OnTakeDamage(DynamicHook h) { - var user = @event.Userid; - if (user == null || !user.IsValid) return; + var victimEntity = h.GetParam(0); + var info = h.GetParam(1); + if (victimEntity == null || !victimEntity.IsValid || info == null) return; - var victim = PlayerManager.GetPlayerEvent(@event.Userid); - if (victim == null || !victim.IsValid) return; + var victimPawn = victimEntity.As(); + if (victimPawn == null || !victimPawn.IsValid || victimPawn.DesignerName != "player") return; - var pawn = victim.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid) return; + var victimController = victimPawn.Controller.Value; + if (victimController == null || !victimController.IsValid) return; - bool isProtected = phoenixTicks.TryGetValue(victim.Index, out int tick); - if (isProtected && tick + 4 > Server.TickCount) - { - SkillUtils.AddHealth(pawn, 100 - pawn.Health); - return; - } + var victim = victimController.As(); + if (victim == null || !victim.IsValid || !victim.PawnIsAlive) return; - var playerInfo = PlayerManager.GetPlayerByIndex(victim.Index); - if (playerInfo?.Skill != skillName || pawn.Health > 0) return; + var victimInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(victim)?.Index ?? victim.Index); + if (victimInfo == null || victimInfo.Skill != skillName) return; - if (Instance.Random.NextDouble() > playerInfo.SkillChance) return; - if (victim.TeamChanged) return; + if (SkillUtils.IsFriendlyFireBlocked(info, victimPawn)) return; + + float effectiveDamage = info.Damage; + if (SkillUtils.GetHitGroup(info) == HitGroup_t.HITGROUP_HEAD) + effectiveDamage *= GetHeadshotMultiplier(info); + + if (effectiveDamage < victimPawn.Health) return; + + if (TryConsumeRevive(victim, victimPawn)) + info.Damage = 0; + } + + public static bool TryConsumeRevive(CCSPlayerController? victim, CCSPlayerPawn? victimPawn) + { + if (victim == null || !victim.IsValid || !victim.PawnIsAlive) return false; + if (victimPawn == null || !victimPawn.IsValid) return false; + + var victimInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(victim)?.Index ?? victim.Index); + if (victimInfo == null || victimInfo.Skill != skillName) return false; + + if (phoenixTicks.TryGetValue(victim.Index, out int savedTick) && savedTick + 4 > Server.TickCount) + return true; + + if (victim.TeamChanged) return false; + if (victimInfo.SkillChance is float chance && Instance.Random.NextDouble() > chance) return false; // roll failed -> die phoenixTicks[victim.Index] = Server.TickCount; - SkillUtils.AddHealth(pawn, 100 - pawn.Health); - SkillUtils.PrintToChat(user, user.GetTranslation("phoenix_respawn")); + victimPawn.Health = 100; + Utilities.SetStateChanged(victimPawn, "CBaseEntity", "m_iHealth"); + + SkillUtils.PrintToChat(victim, victim.GetTranslation("phoenix_respawn")); Server.NextFrame(() => { if (victim == null || !victim.IsValid) return; + var pawn = victim.PlayerPawn.Value; if (pawn == null || !pawn.IsValid) return; var spawnpoint = SkillUtils.GetSpawnPointVector(victim); @@ -56,6 +81,22 @@ namespace src.player.skills pawn.Teleport(spawnpoint); }); + + return true; + } + + private static float GetHeadshotMultiplier(CTakeDamageInfo info) + { + var ability = info.Ability?.Value; + if (ability == null || !ability.IsValid) return DefaultHeadshotMultiplier; + + var weapon = ability.As(); + if (weapon == null || !weapon.IsValid) return DefaultHeadshotMultiplier; + + var vdata = weapon.GetVData(); + if (vdata == null || vdata.HeadshotMultiplier <= 0) return DefaultHeadshotMultiplier; + + return vdata.HeadshotMultiplier; } public static void EnableSkill(CCSPlayerController player) @@ -65,9 +106,9 @@ namespace src.player.skills 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 != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().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 = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, float chanceFrom = .2f, float chanceTo = .4f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Pilot.cs b/jRandomSkills - SRC Files/src/player/skills/Pilot.cs index 3f19aac..0f162d3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Pilot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Pilot.cs @@ -24,7 +24,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) @@ -121,14 +121,14 @@ namespace src.player.skills float fuelPercentage = maximumFuel; string fuelColor = GetFuelColor(pilotInfo.Fuel); - playerInfo.PrintHTML = $"{player.GetTranslation("pilot_hud_info")}: {(pilotInfo.Fuel/maximumFuel)*100:F0}%"; + playerInfo.PrintHTML = $"{player.GetTranslation("pilot_hud_info")}: {(pilotInfo.Fuel / maximumFuel) * 100:F0}%"; } private static string GetFuelColor(float fuelPercentage) { var maximumFuel = SkillsInfo.GetValue(skillName, "maximumFuel"); - if (fuelPercentage > (maximumFuel/2f)) return "#00FF00"; - if (fuelPercentage > (maximumFuel/4f)) return "#FFFF00"; + if (fuelPercentage > (maximumFuel / 2f)) return "#00FF00"; + if (fuelPercentage > (maximumFuel / 4f)) return "#FFFF00"; return "#FF0000"; } @@ -136,7 +136,7 @@ namespace src.player.skills { var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; - + QAngle eye_angle = playerPawn.EyeAngles; double pitch = (Math.PI / 180) * eye_angle.X; double yaw = (Math.PI / 180) * eye_angle.Y; diff --git a/jRandomSkills - SRC Files/src/player/skills/Planter.cs b/jRandomSkills - SRC Files/src/player/skills/Planter.cs index bfa09d8..48de162 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Planter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Planter.cs @@ -57,18 +57,19 @@ namespace src.player.skills var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); if (plantedBomb != null) - Server.NextFrame(() => { + Server.NextFrame(() => + { if (plantedBomb != null && plantedBomb.IsValid) plantedBomb.C4Blow = Server.CurrentTime + SkillsInfo.GetValue(skillName, "extraC4BlowTime"); }); - foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid)) + foreach (var p in PlayerManager.GetTickPlayers().Where(p => p.IsValid)) p.PrintToCenterAlert(p.GetTranslation("bombplanted", SkillsInfo.GetValue(skillName, "extraC4BlowTime"))); } public static void NewRound() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) DisableSkill(player); plantingPlayers.Clear(); @@ -93,7 +94,7 @@ namespace src.player.skills public static void OnTick() { float currentTime = Server.CurrentTime; - foreach (var player in Utilities.GetPlayers().Where(p => p.Team == CsTeam.Terrorist)) + foreach (var player in PlayerManager.GetTickPlayers().Where(p => p.Team == CsTeam.Terrorist)) { if (!Instance.IsPlayerValid(player)) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/Poison.cs b/jRandomSkills - SRC Files/src/player/skills/Poison.cs index 5351837..ad1f883 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Poison.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Poison.cs @@ -43,7 +43,7 @@ namespace src.player.skills public static void OnTick() { int cooldown = Math.Max(1, (int)(64 * SkillsInfo.GetValue(skillName, "Cooldown"))); - + if (Server.TickCount % cooldown == 0) { int cooldown2 = cooldown * 2; @@ -67,13 +67,13 @@ namespace src.player.skills } if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!SkillUtils.HasMenu(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - 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(); + var enemies = PlayerManager.GetTickPlayers().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); @@ -97,11 +97,12 @@ namespace src.player.skills string enemyId = commands[0]; - if (!uint.TryParse(enemyId, out uint enemyIndex)) { + if (!uint.TryParse(enemyId, out uint enemyIndex)) + { playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } - + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) @@ -130,7 +131,7 @@ namespace src.player.skills var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; - 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(); + var enemies = PlayerManager.GetTickPlayers().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()))); diff --git a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs index fdbc57a..e7cb2a6 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs @@ -48,7 +48,7 @@ namespace src.player.skills bannedPlayers.Clear(); playersToTarget.Clear(); - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) SkillUtils.CloseMenu(player); } } @@ -68,13 +68,13 @@ namespace src.player.skills public static void OnTick() { if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!SkillUtils.HasMenu(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - 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(); + var enemies = PlayerManager.GetTickPlayers().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); @@ -98,11 +98,12 @@ namespace src.player.skills string enemyId = commands[0]; - if (!uint.TryParse(enemyId, out uint enemyIndex)) { + if (!uint.TryParse(enemyId, out uint enemyIndex)) + { playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } - + var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex); if (enemy == null) @@ -132,7 +133,7 @@ namespace src.player.skills var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; - 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(); + var enemies = PlayerManager.GetTickPlayers().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()))); @@ -180,7 +181,7 @@ namespace src.player.skills if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid && !string.IsNullOrEmpty(weapon.Value.DesignerName)) { string weaponName = weapon.Value.DesignerName; - if (disabledWeapons.Contains(weaponName)) + if (disabledWeapons.Contains(weaponName)) { weapon.Value.NextPrimaryAttackTick = disableWeapon ? int.MaxValue : Server.TickCount; weapon.Value.NextSecondaryAttackTick = disableWeapon ? int.MaxValue : Server.TickCount; diff --git a/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs b/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs index 1c6b920..a3bc7ce 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs @@ -59,7 +59,7 @@ namespace src.player.skills var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid) continue; - + if (pawn.AbsOrigin == null || SkillUtils.GetDistance(pawn.AbsOrigin, bombLocation) > SkillsInfo.GetValue(skillName, "maxDefusingRange")) { info.Defusing = false; @@ -118,7 +118,7 @@ namespace src.player.skills if (cooldown == 0) playerInfo.PrintHTML = null; - else + else playerInfo.PrintHTML = $"{player.GetTranslation("psychicdefusing_hud_info", $"{cooldown}")}"; } public class PlayerSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/Push.cs b/jRandomSkills - SRC Files/src/player/skills/Push.cs index 88b30f8..28bf9ab 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Push.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Push.cs @@ -39,7 +39,7 @@ namespace src.player.skills 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 != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().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/QuickShot.cs b/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs index d768e06..f8ce6ec 100644 --- a/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs @@ -17,7 +17,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!Instance.IsPlayerValid(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); @@ -27,7 +27,7 @@ namespace src.player.skills var pawn = player.PlayerPawn.Value!; var weaponServices = pawn.WeaponServices; if (weaponServices == null || weaponServices.ActiveWeapon == null || !weaponServices.ActiveWeapon.IsValid) continue; - + var weapon = weaponServices.ActiveWeapon.Value; if (weapon == null || !weapon.IsValid || pawn.CameraServices == null) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs b/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs index 5ac1620..b544c5f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs @@ -18,7 +18,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { var playerEvent = PlayerManager.GetPlayerEvent(player); if (!Instance.IsPlayerValid(playerEvent)) continue; @@ -28,7 +28,7 @@ namespace src.player.skills SetEnemiesVisibleOnRadar(player); } } - + private static void SetEnemiesVisibleOnRadar(CCSPlayerController player) { if (player == null || !player.IsValid || player.PlayerPawn?.Value == null) return; @@ -36,7 +36,7 @@ namespace src.player.skills // SpottedByMask is indexed by player slot (0-63), not entity index. int slot = player.Slot; - foreach (var enemy in Utilities.GetPlayers().FindAll(p => p.Team != player.Team)) + foreach (var enemy in PlayerManager.GetTickPlayers().FindAll(p => p.Team != player.Team)) { var enemyEvent = PlayerManager.GetPlayerEvent(enemy); if (enemyEvent == null || !enemyEvent.IsValid) continue; @@ -52,13 +52,9 @@ namespace src.player.skills enemyPawn.EntitySpottedState.SpottedByMask[0] |= (1u << (slot % 32)); } - var bombEntities = Utilities.FindAllEntitiesByDesignerName("weapon_c4").ToList(); - if (bombEntities.Count != 0) - { - var bomb = bombEntities.FirstOrDefault(); - if (bomb != null && bomb.IsValid) - bomb.EntitySpottedState.SpottedByMask[0] |= (1u << (slot % 32)); - } + var bomb = PlayerManager.GetTickBomb(); + if (bomb != null && bomb.IsValid) + bomb.EntitySpottedState.SpottedByMask[0] |= (1u << (slot % 32)); } public class SkillConfig : SkillsInfo.DefaultSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs b/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs index 70126b3..92bce0e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs @@ -40,7 +40,7 @@ namespace src.player.skills public static void OnTick() { - var players = Utilities.GetPlayers().ToArray(); + var players = PlayerManager.GetTickPlayers().ToArray(); foreach (var player in players) { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); diff --git a/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs b/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs index aa64142..0b14a89 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs @@ -11,6 +11,7 @@ namespace src.player.skills public class ReZombie : ISkill { private const Skills skillName = Skills.ReZombie; + private const float DefaultHeadshotMultiplier = 4f; private static readonly ConcurrentDictionary zombies = []; private static readonly object setLock = new(); @@ -68,40 +69,73 @@ namespace src.player.skills zombies.Clear(); } - public static void PlayerHurt(EventPlayerHurt @event) + public static void OnTakeDamage(DynamicHook h) { - var victim = PlayerManager.GetPlayerEvent(@event.Userid); - if (victim == null || !victim.IsValid) return; + var victimEntity = h.GetParam(0); + var info = h.GetParam(1); + if (victimEntity == null || !victimEntity.IsValid || info == null) return; - var pawn = victim.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid) return; + var victimPawn = victimEntity.As(); + if (victimPawn == null || !victimPawn.IsValid || victimPawn.DesignerName != "player") return; - bool isZombie = zombies.TryGetValue(victim.Index, out int tick); + var victimController = victimPawn.Controller.Value; + if (victimController == null || !victimController.IsValid) return; - if (isZombie && tick + 4 < Server.TickCount) - return; + var victim = victimController.As(); + if (victim == null || !victim.IsValid || !victim.PawnIsAlive) return; - var playerInfo = PlayerManager.GetPlayerByIndex(victim.Index); - if (playerInfo?.Skill != skillName) return; + var victimInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(victim)?.Index ?? victim.Index); + if (victimInfo == null || victimInfo.Skill != skillName) return; - var zombieHealth = SkillsInfo.GetValue(skillName, "zombieHealth"); + // Friendly-fire-off teammate hit deals 0 damage; don't zombify over a hit that never lands. + if (SkillUtils.IsFriendlyFireBlocked(info, victimPawn)) return; - if (pawn.Health <= 0) + float effectiveDamage = info.Damage; + if (SkillUtils.GetHitGroup(info) == HitGroup_t.HITGROUP_HEAD) + effectiveDamage *= GetHeadshotMultiplier(info); + + if (effectiveDamage < victimPawn.Health) return; // survivable, let it through + + if (TryBecomeZombie(victim, victimPawn)) + info.Damage = 0; + } + + public static bool TryBecomeZombie(CCSPlayerController? victim, CCSPlayerPawn? victimPawn) + { + if (victim == null || !victim.IsValid || !victim.PawnIsAlive) return false; + if (victimPawn == null || !victimPawn.IsValid) return false; + + var victimInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(victim)?.Index ?? victim.Index); + if (victimInfo == null || victimInfo.Skill != skillName) return false; + + lock (setLock) { - bool isBlock = victim.TeamChanged; + if (zombies.ContainsKey(victim.Index)) return false; + if (victim.TeamChanged) return false; zombies[victim.Index] = Server.TickCount; - if (isBlock) return; - + int zombieHealth = SkillsInfo.GetValue(skillName, "zombieHealth"); DropAllBotWeapons(victim); - SetPlayerColor(pawn, false); - SkillUtils.SetHealth(pawn, zombieHealth, zombieHealth); - + SetPlayerColor(victimPawn, false); + SkillUtils.SetHealth(victimPawn, zombieHealth, zombieHealth); victim.ExecuteClientCommand("slot3"); + return true; } - else if (isZombie && tick + 4 > Server.TickCount) - SkillUtils.SetHealth(pawn, zombieHealth, zombieHealth); + } + + private static float GetHeadshotMultiplier(CTakeDamageInfo info) + { + var ability = info.Ability?.Value; + if (ability == null || !ability.IsValid) return DefaultHeadshotMultiplier; + + var weapon = ability.As(); + if (weapon == null || !weapon.IsValid) return DefaultHeadshotMultiplier; + + var vdata = weapon.GetVData(); + if (vdata == null || vdata.HeadshotMultiplier <= 0) return DefaultHeadshotMultiplier; + + return vdata.HeadshotMultiplier; } private static void DropAllBotWeapons(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs index 55774a8..4f0f282 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs @@ -25,7 +25,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) diff --git a/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs b/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs index abe6edb..b9462fe 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs @@ -18,7 +18,7 @@ namespace src.player.skills { int cooldown = Math.Max(1, (int)(64 * SkillsInfo.GetValue(skillName, "cooldown"))); if (Server.TickCount % cooldown != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs index e83fffc..2ed1b03 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs @@ -37,7 +37,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) diff --git a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs index 04eb058..8f44e51 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs @@ -26,7 +26,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill == skillName) @@ -84,11 +84,11 @@ namespace src.player.skills { skillInfo.CanUse = false; skillInfo.Cooldown = DateTime.Now; - + var spawnpoint = SkillUtils.GetSpawnPointVector(player); if (spawnpoint == null) return; playerPawn.Teleport(spawnpoint); - } + } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Rubber.cs b/jRandomSkills - SRC Files/src/player/skills/Rubber.cs index 0efeeba..80d1b6f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Rubber.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Rubber.cs @@ -7,7 +7,7 @@ using src.utils; namespace src.player.skills { - public class Rubber: ISkill + public class Rubber : ISkill { private const Skills skillName = Skills.Rubber; private static readonly ConcurrentDictionary playersToSlow = []; @@ -40,7 +40,7 @@ namespace src.player.skills public static void OnTick() { - foreach(var item in playersToSlow) + foreach (var item in playersToSlow) { var playerIndex = item.Key; var time = item.Value; diff --git a/jRandomSkills - SRC Files/src/player/skills/Saper.cs b/jRandomSkills - SRC Files/src/player/skills/Saper.cs index 1b96633..3aece77 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Saper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Saper.cs @@ -25,7 +25,8 @@ namespace src.player.skills { var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); if (plantedBomb != null) - Server.NextFrame(() => { + Server.NextFrame(() => + { if (plantedBomb != null && plantedBomb.IsValid) plantedBomb.DefuseCountDown = 0; }); diff --git a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs index 511d87a..3e25769 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs @@ -11,6 +11,7 @@ namespace src.player.skills public class SecondLife : ISkill { private const Skills skillName = Skills.SecondLife; + private const float DefaultHeadshotMultiplier = 4f; private static readonly ConcurrentDictionary usedThisRound = []; private static readonly object setLock = new(); @@ -44,7 +45,13 @@ namespace src.player.skills var victimInfo = PlayerManager.GetPlayerByIndex((PlayerManager.GetPlayerEvent(victim)?.Index ?? victim.Index)); if (victimInfo == null || victimInfo.Skill != skillName) return; - if (info.Damage < victimPawn.Health) return; + if (SkillUtils.IsFriendlyFireBlocked(info, victimPawn)) return; + + float effectiveDamage = info.Damage; + if (SkillUtils.GetHitGroup(info) == HitGroup_t.HITGROUP_HEAD) + effectiveDamage *= GetHeadshotMultiplier(info); + + if (effectiveDamage < victimPawn.Health) return; if (usedThisRound.TryGetValue(victim.Handle, out int savedTick)) { @@ -53,15 +60,39 @@ namespace src.player.skills return; } + if (TryConsumeRevive(victim, victimPawn)) + info.Damage = 0; + } + + private static float GetHeadshotMultiplier(CTakeDamageInfo info) + { + var ability = info.Ability?.Value; + if (ability == null || !ability.IsValid) return DefaultHeadshotMultiplier; + + var weapon = ability.As(); + if (weapon == null || !weapon.IsValid) return DefaultHeadshotMultiplier; + + var vdata = weapon.GetVData(); + if (vdata == null || vdata.HeadshotMultiplier <= 0) return DefaultHeadshotMultiplier; + + return vdata.HeadshotMultiplier; + } + + public static bool TryConsumeRevive(CCSPlayerController? victim, CCSPlayerPawn? victimPawn) + { + if (victim == null || !victim.IsValid) return false; + if (victimPawn == null || !victimPawn.IsValid) return false; + + if (SkillUtils.IsFreezeTime()) return false; + lock (setLock) { - if (usedThisRound.ContainsKey(victim.Handle)) return; + if (usedThisRound.ContainsKey(victim.Handle)) return false; var spawnpoint = SkillUtils.GetSpawnPointVector(victim); - if (spawnpoint == null) return; // no clean respawn point -> let the normal death happen + if (spawnpoint == null) return false; // no clean respawn point -> let the normal death happen usedThisRound.TryAdd(victim.Handle, Server.TickCount); - info.Damage = 0; victimPawn.Health = SkillsInfo.GetValue(skillName, "startHealth"); Utilities.SetStateChanged(victimPawn, "CBaseEntity", "m_iHealth"); @@ -69,11 +100,14 @@ namespace src.player.skills Server.NextFrame(() => { if (victim == null || !victim.IsValid) return; + if (SkillUtils.IsFreezeTime()) return; var pawn = victim.PlayerPawn.Value; if (pawn == null || !pawn.IsValid) return; pawn.Teleport(spawnpoint, null, new Vector(0, 0, 0)); }); + + return true; } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Shade.cs b/jRandomSkills - SRC Files/src/player/skills/Shade.cs index ee64732..9f13ffc 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Shade.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Shade.cs @@ -43,12 +43,12 @@ namespace src.player.skills { 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 != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } public static void DisableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs b/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs index 88dd75d..d315095 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs @@ -45,12 +45,13 @@ namespace src.player.skills var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); if (plantedBomb != null) - Server.NextFrame(() => { + Server.NextFrame(() => + { if (plantedBomb != null && plantedBomb.IsValid) plantedBomb.C4Blow = Server.CurrentTime + SkillsInfo.GetValue(skillName, "detonationTime"); }); - foreach (var p in Utilities.GetPlayers().Where(p => p.IsValid)) + foreach (var p in PlayerManager.GetTickPlayers().Where(p => p.IsValid)) p.PrintToCenterAlert(p.GetTranslation("bombplanted", SkillsInfo.GetValue(skillName, "detonationTime"))); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Silent.cs b/jRandomSkills - SRC Files/src/player/skills/Silent.cs index 7d8bb9e..4d6dcd0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Silent.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Silent.cs @@ -24,7 +24,7 @@ namespace src.player.skills if (!Instance.footstepSoundEvents.Contains(soundevent) && !Instance.silentSoundEvents.Contains(soundevent)) return; - var player = Utilities.GetPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex); + var player = PlayerManager.GetTickPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex); if (player == null || !player.IsValid) return; var playerInfo = PlayerManager.GetPlayerByIndex((PlayerManager.GetPlayerEvent(player)?.Index ?? player.Index)); diff --git a/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs b/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs index 20ac8da..e8cb71e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs @@ -81,7 +81,7 @@ namespace src.player.skills foreach (var index in AWPs.ToList()) SkillUtils.SafeKillEntity(index); - if (savedWeapons.TryGetValue(player.Index, 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.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; @@ -162,7 +162,8 @@ namespace src.player.skills weaponToGive = weapon_awp + "_script"; } - Instance.AddTimer(.15f, () => { + Instance.AddTimer(.15f, () => + { var player = Utilities.GetPlayerFromIndex((int)playerIndex); if (player == null || !player.IsValid) return; @@ -180,7 +181,7 @@ namespace src.player.skills { if (!playerAWPIndexes.ContainsKey(playerIndex)) playerAWPIndexes.TryAdd(playerIndex, []); - + if (playerAWPIndexes.TryGetValue(playerIndex, out var list)) list.Add(createdWeapon.Index); } @@ -191,7 +192,8 @@ namespace src.player.skills isProcessing.TryRemove(playerIndex, out _); }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } - catch { + catch + { isProcessing.TryRemove(playerIndex, out _); } } @@ -227,7 +229,7 @@ namespace src.player.skills { var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return null; - + var activeWeapon = pawn.WeaponServices?.ActiveWeapon.Value; if (activeWeapon != null && activeWeapon.IsValid && rifles.Contains(activeWeapon.DesignerName)) return activeWeapon; diff --git a/jRandomSkills - SRC Files/src/player/skills/Soldier.cs b/jRandomSkills - SRC Files/src/player/skills/Soldier.cs index 8e8f4d4..83dcd3a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Soldier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Soldier.cs @@ -26,7 +26,7 @@ namespace src.player.skills 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 != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } public static void OnTakeDamage(DynamicHook h) diff --git a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs index 19e3fdf..a80826c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs @@ -57,7 +57,7 @@ namespace src.player.skills if (entityIndex == 0) return; CCSPlayerController? emitter = null; - foreach (var p in Utilities.GetPlayers().Where(p => p != null && p.IsValid)) + foreach (var p in PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid)) { if (p.PlayerPawn.Value?.Index == entityIndex) { @@ -75,12 +75,12 @@ namespace src.player.skills if (emitter == null) { - foreach (var p in Utilities.GetPlayers().Where(p => p != null && p.IsValid)) + foreach (var p in PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid)) um.Recipients.Remove(p); return; } - foreach (var recipient in Utilities.GetPlayers().Where(p => p != null && p.IsValid)) + foreach (var recipient in PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid)) { bool hasSkill = SkillPlayerInfo.ContainsKey(recipient.Index); @@ -98,7 +98,7 @@ namespace src.player.skills { if (Server.TickCount % (60 * SkillsInfo.GetValue(skillName, "cooldown")) != 0) return; - foreach (var player in Utilities.GetPlayers() + foreach (var player in PlayerManager.GetTickPlayers() .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"); diff --git a/jRandomSkills - SRC Files/src/player/skills/Spectator.cs b/jRandomSkills - SRC Files/src/player/skills/Spectator.cs index dcabd47..273b776 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Spectator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Spectator.cs @@ -56,7 +56,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) if (cameras.TryGetValue(player.Index, out var cameraInfo) && cameraInfo.Item2 != 0) { if (player == null || !player.IsValid) continue; @@ -86,7 +86,7 @@ namespace src.player.skills uint orginalCameraRaw; uint newCameraRaw = 0; - + var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return; @@ -100,7 +100,8 @@ namespace src.player.skills if (!forceToDefault) newCameraRaw = CreateCamera(player); - } else + } + else { orginalCameraRaw = pawn.CameraServices.ViewEntity.Raw; if (!forceToDefault) @@ -129,14 +130,14 @@ namespace src.player.skills var camera = EntityManager.CreateTrackedDynamicProp(player.Index); if (camera == null || !camera.IsValid) return 0; - var enemies = Utilities.GetPlayers().Where(p => + var enemies = PlayerManager.GetTickPlayers().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; @@ -153,13 +154,17 @@ 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)); + + var camNode = camera.CBodyComponent?.SceneNode?.Owner?.Entity; + if (camNode != null) + camNode.Flags = (uint)(camNode.Flags & ~(1 << 2)); + camera.SetModel("models/sprays/spray_plane.vmdl"); camera.Render = Color.FromArgb(1, 255, 255, 255); camera.Teleport(pos, angle); camera.DispatchSpawn(); - CBaseEntity target = pawn; + CBaseEntity? target = pawn != null && pawn.IsValid ? pawn : null; var entities = EntityManager.GetPlayerEntities(enemy.Index, "empty_prop"); if (entities.Count > 0) @@ -169,6 +174,7 @@ namespace src.player.skills target = entity; } + if (target == null || !target.IsValid) return; camera.AcceptInput("SetParent", target, target, "!activator"); }); diff --git a/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs b/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs index f56667a..e99cb36 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs @@ -12,7 +12,7 @@ namespace src.player.skills private const Skills skillName = Skills.SwapPosition; private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); - + public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); @@ -27,7 +27,7 @@ namespace src.player.skills public static void OnTick() { if (SkillUtils.IsFreezeTime()) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (player == null || !player.IsValid) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); @@ -68,7 +68,7 @@ namespace src.player.skills private static void UpdateHUD(CCSPlayerController player, ZamianaMiejsc_PlayerInfo skillInfo, bool showInfo) { - if(player == null || !player.IsValid) return; + if (player == null || !player.IsValid) return; float cooldown = 0; if (skillInfo != null) @@ -86,7 +86,7 @@ namespace src.player.skills if (cooldown == 0) { if (showInfo) - playerInfo.PrintHTML = skillInfo != null && !skillInfo.FindedEnemy + playerInfo.PrintHTML = skillInfo != null && !skillInfo.FindedEnemy ? $"{player.GetTranslation("hud_info_no_enemy")}" : null; else SkillUtils.ResetPrintHTML(player); @@ -103,7 +103,7 @@ namespace src.player.skills if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) { - List enemy = Utilities.GetPlayers().FindAll(p => Instance.IsPlayerValid(p) && p.Team != player.Team && p.PawnIsAlive); + List enemy = PlayerManager.GetTickPlayers().FindAll(p => Instance.IsPlayerValid(p) && p.Team != player.Team && p.PawnIsAlive); if (enemy.Count == 0) { skillInfo.FindedEnemy = false; diff --git a/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs b/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs index 1d017de..66eead3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs @@ -25,7 +25,7 @@ namespace src.player.skills 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 != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); } public static void PlayerHurt(EventPlayerHurt @event) diff --git a/jRandomSkills - SRC Files/src/player/skills/Thief.cs b/jRandomSkills - SRC Files/src/player/skills/Thief.cs index 7a81bb3..536d276 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Thief.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Thief.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using static src.jRandomSkills; @@ -19,13 +19,13 @@ namespace src.player.skills public static void OnTick() { if (Server.TickCount % 32 != 0) return; - - foreach (var player in Utilities.GetPlayers().Where(p => p != null && p.IsValid && SkillUtils.HasMenu(p))) + + foreach (var player in PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid && SkillUtils.HasMenu(p))) { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo?.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => + var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid) .Select(p => PlayerManager.GetPlayerEvent(p)) @@ -46,10 +46,10 @@ namespace src.player.skills { 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(($"\u202A{enemy.PlayerName}\u202C : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); } SkillUtils.UpdateMenu(player, menuItems); @@ -58,7 +58,7 @@ namespace src.player.skills public static void NewRound() { - foreach (var player in Utilities.GetPlayers().Where(p => p != null && p.IsValid)) + foreach (var player in PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid)) SkillUtils.CloseMenu(player); } @@ -106,12 +106,12 @@ namespace src.player.skills var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; - var enemies = Utilities.GetPlayers() + var enemies = PlayerManager.GetTickPlayers() .Where(p => p != null && p.IsValid - && p.Team != player.Team + && p.Team != player.Team && p.PlayerPawn?.Value?.Health > 0 - && p.Team != CsTeam.Spectator + && p.Team != CsTeam.Spectator && p.Team != CsTeam.None) .ToArray(); @@ -122,16 +122,16 @@ namespace src.player.skills { 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(($"\u202A{enemy.PlayerName}\u202C : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); } SkillUtils.CreateMenu(player, menuItems); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName)}", - border: !Utilities.GetPlayers().Any(p => p != null && p.Team == player.Team && p != player) ? "tb" : "t"); + border: !PlayerManager.GetTickPlayers().Any(p => p != null && p.Team == player.Team && p != player) ? "tb" : "t"); } else playerEvent.PrintToChat($" {ChatColors.Red}{playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); @@ -143,7 +143,7 @@ namespace src.player.skills var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; - + playerInfo.SpecialSkill = Skills.None; SkillUtils.CloseMenu(player); } @@ -155,7 +155,7 @@ namespace src.player.skills 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()); @@ -236,7 +236,7 @@ namespace src.player.skills if (enemyEvent == null || !enemyEvent.IsValid) return; Instance.SkillAction(enemySkill.ToString(), "DisableSkill", [e]); - + eInfo.SpecialSkill = enemySkill; eInfo.Skill = Skills.None; enemyEvent.PrintToChat($" {ChatColors.Red}" + enemyEvent.GetTranslation("thief_enemy_info")); diff --git a/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs b/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs index 4feb475..2a24519 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs @@ -44,7 +44,7 @@ namespace src.player.skills public static void OnTick() { - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) if (cameras.TryGetValue(player.Index, out var cameraInfo) && cameraInfo.Item2 != 0) { var pawn = player.PlayerPawn.Value; @@ -108,10 +108,15 @@ 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)); + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return; + + var camNode = camera.CBodyComponent?.SceneNode?.Owner?.Entity; + if (camNode != null) + camNode.Flags = (uint)(camNode.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.Teleport(pawn.AbsOrigin, pawn.EyeAngles); camera.DispatchSpawn(); }); diff --git a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs index 71108a4..bcac47f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs @@ -25,7 +25,7 @@ namespace src.player.skills var victimEvent = PlayerManager.GetPlayerEvent(victim); if (attackerEvent == null || !attackerEvent.IsValid) return; - if (victimEvent == null || !victimEvent.IsValid ) return; + if (victimEvent == null || !victimEvent.IsValid) return; var attackerPawn = attackerEvent.PlayerPawn.Value; if (attackerPawn == null || !attackerPawn.IsValid || attackerPawn.Health == 0) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs b/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs index 6920435..5057631 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs @@ -28,7 +28,7 @@ namespace src.player.skills { foreach (var knifeInfo in knivesInfo.Values.ToArray()) DisableKnifeSkill(knifeInfo); - + knivesInfo.Clear(); } @@ -50,18 +50,19 @@ namespace src.player.skills float y = BitConverter.ToSingle(packedParams, 11); float z = BitConverter.ToSingle(packedParams, 15); soundPos = new Vector(x, y, z); - } catch { } + } + catch { } } if (soundPos == null) return; (var knife, var knifeInfo) = GetClosetKnife(soundPos); - + if (knife == null || !knife.IsValid || knife.AbsRotation == null) return; - + if (knifeInfo == null || knifeInfo.InitialLook == null || knife.Collision == null) return; - + knifeInfo.IsDropped = false; QAngle rotation = new(knifeInfo.InitialLook?.X, knifeInfo.InitialLook?.Y, knife.AbsRotation.Z); Vector offset = SkillUtils.GetForwardVector(new QAngle(rotation.X - 90, rotation.Y, rotation.Z)) * 2; @@ -74,11 +75,11 @@ namespace src.player.skills 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(); @@ -136,6 +137,12 @@ namespace src.player.skills DisableKnifeSkill(knifeInfo); } + public static void PlayerDisconnect(uint playerIndex) + { + if (knivesInfo.TryRemove(playerIndex, out KnifeInfo? knifeInfo) && knifeInfo != null) + DisableKnifeSkill(knifeInfo); + } + public static void DisableKnifeSkill(KnifeInfo knifeInfo) { if (knifeInfo.Timer != null) @@ -185,7 +192,8 @@ namespace src.player.skills if (weapon == null || !weapon.IsValid || (!weapon.DesignerName.Contains("knife") && !weapon.DesignerName.Contains("bayonet"))) return; player.DropActiveWeapon(); - Server.NextFrame(() => { + Server.NextFrame(() => + { if (player == null || !player.IsValid) return; if (weapon == null || !weapon.IsValid) return; ThrowKnife(player, weapon); @@ -243,10 +251,10 @@ namespace src.player.skills { if (player == null || !player.IsValid) return null; if (knife == null || !knife.IsValid || knife.AbsOrigin == null) return null; - + var trigger = SkillUtils.CreateTrigger($"trowingknife", 10, knife.AbsOrigin); if (trigger == null || !trigger.IsValid) return null; - + trigger.AcceptInput("SetParent", knife, knife, "!activator"); return trigger.Index; } @@ -312,8 +320,14 @@ namespace src.player.skills if (victimPawn.Index == throwerPawn.Index) return; + var victimController = victimPawn.Controller.Value?.As(); + bool friendlyFire = SkillsInfo.GetValue(skillName, "friendlyFire"); - if (!friendlyFire && thrower.TeamNum == victimPawn.TeamNum) return; + if (!friendlyFire) + { + if (thrower.TeamNum == victimPawn.TeamNum) return; + if (victimController != null && victimController.IsValid && thrower.Team == victimController.Team) return; + } if (CheckHasKnife(thrower!)) return; @@ -371,7 +385,7 @@ namespace src.player.skills var obs = playerPawn.ObserverServices?.ObserverTarget?.Value; if (obs != null && obs.IsValid) { - var observed = Utilities.GetPlayers().FirstOrDefault(p => + var observed = PlayerManager.GetTickPlayers().FirstOrDefault(p => p != null && p.IsValid && p.Pawn?.Value?.Handle == obs.Handle); if (observed != null) diff --git a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs index fcba7e8..847ddae 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs @@ -82,7 +82,7 @@ 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)) + foreach (var player in PlayerManager.GetTickPlayers().Where(p => p.IsValid)) { var eventPlayer = PlayerManager.GetPlayerEvent(player); if (eventPlayer == null || !eventPlayer.IsValid) continue; diff --git a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs index 2483d20..95655f1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs @@ -30,7 +30,7 @@ namespace src.player.skills // One pawn->info map per frame instead of a GetPlayers scan per client. var infoByPawnHandle = new Dictionary(); - foreach (var p in Utilities.GetPlayers()) + foreach (var p in PlayerManager.GetTickPlayers()) { var h = p?.Pawn?.Value?.Handle; if (p != null && p.IsValid && h != null) @@ -108,6 +108,29 @@ namespace src.player.skills playersInAction.Clear(); } + public static void PlayerDeath(EventPlayerDeath @event) + { + var victim = @event.Userid; + if (victim == null || !victim.IsValid) return; + RemoveGlow(victim.Index); + } + + public static void PlayerDisconnect(uint playerIndex) + { + RemoveGlow(playerIndex); + } + + private static void RemoveGlow(uint enemyIndex) + { + if (!glows.TryRemove(enemyIndex, out var glowInfo)) return; + + SkillUtils.SafeKillEntity(glowInfo.GlowIndex); + SkillUtils.SafeKillEntity(glowInfo.RelayIndex); + + temporaryBlockList.TryAdd(glowInfo.RelayIndex, DateTime.Now.AddSeconds(2)); + temporaryBlockList.TryAdd(glowInfo.GlowIndex, DateTime.Now.AddSeconds(2)); + } + public static void EnableSkill(CCSPlayerController player) { Event.EnableTransmit(); @@ -132,14 +155,14 @@ namespace src.player.skills private static void SetGlowEffectForAll() { - var enemies = Utilities.GetPlayers().Where(p => + var enemies = PlayerManager.GetTickPlayers().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 = PlayerManager.GetPlayerByIndex(enemy.Index); diff --git a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs index cc9c4fc..fadf1b5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs @@ -52,7 +52,7 @@ namespace src.player.skills public static void OnTick() { - var players = Utilities.GetPlayers().ToArray(); + var players = PlayerManager.GetTickPlayers().ToArray(); foreach (var player in players) { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); @@ -154,7 +154,7 @@ namespace src.player.skills var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return (null, haveC4); - + if (pawn.WeaponServices == null) return (null, haveC4); var list = new List(); @@ -186,7 +186,7 @@ namespace src.player.skills foreach (var weapon in weapons) player.GiveNamedItem(weapon.Name); - + if (addC4) player.GiveNamedItem("weapon_c4"); @@ -222,7 +222,7 @@ namespace src.player.skills private static CCSPlayerController? GetRandomEnemy(CCSPlayerController player) { - CCSPlayerController[] enemies = [.. Utilities.GetPlayers().FindAll(e => e.Team != player.Team && e.PawnIsAlive)]; + CCSPlayerController[] enemies = [.. PlayerManager.GetTickPlayers().FindAll(e => e.Team != player.Team && e.PawnIsAlive)]; if (enemies.Length == 0) return null; return enemies[Instance.Random.Next(enemies.Length)]; } diff --git a/jRandomSkills - SRC Files/src/player/skills/Weightless.cs b/jRandomSkills - SRC Files/src/player/skills/Weightless.cs index c7c458c..f420e7a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Weightless.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Weightless.cs @@ -39,7 +39,7 @@ namespace src.player.skills if (nade.Bounces != 0) { nade.ActualGravityScale = 2; - + nade.DetonateTime = 0; Utilities.SetStateChanged(nade, "CBaseGrenade", "m_flDetonateTime"); @@ -65,10 +65,11 @@ namespace src.player.skills var playerInfo = PlayerManager.GetPlayerByIndex((PlayerManager.GetPlayerEvent(player)?.Index ?? player.Index)); if (playerInfo?.Skill != skillName) return; - Server.NextFrame(() => { + Server.NextFrame(() => + { if (grenade == null || !grenade.IsValid) return; grenade.ActualGravityScale = .0001f; - + Vector currentVelocity = new(grenade.AbsVelocity.X, grenade.AbsVelocity.Y, grenade.AbsVelocity.Z); float speed = currentVelocity.Length() * 2; diff --git a/jRandomSkills - SRC Files/src/player/skills/WildThrow.cs b/jRandomSkills - SRC Files/src/player/skills/WildThrow.cs index 56c0b0d..3cadbe4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/WildThrow.cs +++ b/jRandomSkills - SRC Files/src/player/skills/WildThrow.cs @@ -25,7 +25,7 @@ namespace src.player.skills { if (infectedPlayers.IsEmpty && playersToTarget.IsEmpty) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) DisableSkill(player); infectedPlayers.Clear(); @@ -42,7 +42,7 @@ namespace src.player.skills var playerEvent = PlayerManager.GetPlayerFromEvent(player); if (playerEvent == null || !playerEvent.IsValid) return; - 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(); + var enemies = PlayerManager.GetTickPlayers().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()))); @@ -78,17 +78,17 @@ namespace src.player.skills public static void OnTick() { if (Server.TickCount % 32 != 0) return; - foreach (var player in Utilities.GetPlayers()) + foreach (var player in PlayerManager.GetTickPlayers()) { if (!SkillUtils.HasMenu(player)) continue; var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => + var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid) .Select(p => PlayerManager.GetPlayerEvent(p)) - .Where(p => + .Where(p => p != null && p.IsValid && p.Team != player.Team && @@ -122,7 +122,8 @@ namespace src.player.skills string enemyId = commands[0]; - if (!uint.TryParse(enemyId, out uint enemyIndex)) { + if (!uint.TryParse(enemyId, out uint enemyIndex)) + { playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")); return; } @@ -166,7 +167,8 @@ namespace src.player.skills if (!infectedPlayers.ContainsKey(player.Index)) return; - Server.NextFrame(() => { + Server.NextFrame(() => + { if (grenade == null || !grenade.IsValid) return; float forceMultiplier = (float)(Instance.Random.NextDouble() * .6 + .7); diff --git a/jRandomSkills - SRC Files/src/utils/CServerSideClient.cs b/jRandomSkills - SRC Files/src/utils/CServerSideClient.cs index 02701b6..f57c68f 100644 --- a/jRandomSkills - SRC Files/src/utils/CServerSideClient.cs +++ b/jRandomSkills - SRC Files/src/utils/CServerSideClient.cs @@ -100,7 +100,11 @@ namespace jRandomSkills.src.utils set => Field(m_nDeltaTick) = value; } - public void ForceFullUpdate() => DeltaTick = -1; + public void ForceFullUpdate() + { + if (Handle == nint.Zero) return; + DeltaTick = -1; + } } #endregion diff --git a/jRandomSkills - SRC Files/src/utils/Config.cs b/jRandomSkills - SRC Files/src/utils/Config.cs index b6abcf0..9d1a873 100644 --- a/jRandomSkills - SRC Files/src/utils/Config.cs +++ b/jRandomSkills - SRC Files/src/utils/Config.cs @@ -91,7 +91,7 @@ namespace src.utils public string DisableHUDOnDeathPermission { get; set; } public bool DisableSkillsOnRoundEnd { get; set; } public LanguageSystem LanguageSystem { get; set; } - public HtmlHudCustomisation HtmlHudCustomisation { get; set; } + public HtmlHudCustomisation HtmlHudCustomisation { get; set; } public ChatMessage ChatMessage { get; set; } public NormalCommands NormalCommands { get; set; } public VotingCommands VotingCommands { get; set; } diff --git a/jRandomSkills - SRC Files/src/utils/CustomTraceResult.cs b/jRandomSkills - SRC Files/src/utils/CustomTraceResult.cs index 8a41399..85ea933 100644 --- a/jRandomSkills - SRC Files/src/utils/CustomTraceResult.cs +++ b/jRandomSkills - SRC Files/src/utils/CustomTraceResult.cs @@ -4,7 +4,7 @@ using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; namespace jRandomSkills.src.utils { - public struct CustomTraceResult (TraceResult result, Vector startPos, ulong mask, ulong contents, bool drawBeam) + public struct CustomTraceResult(TraceResult result, Vector startPos, ulong mask, ulong contents, bool drawBeam) { public float StartPosX = startPos.X; public float StartPosY = startPos.Y; diff --git a/jRandomSkills - SRC Files/src/utils/Localization.cs b/jRandomSkills - SRC Files/src/utils/Localization.cs index 6eb28b2..5047116 100644 --- a/jRandomSkills - SRC Files/src/utils/Localization.cs +++ b/jRandomSkills - SRC Files/src/utils/Localization.cs @@ -30,7 +30,7 @@ namespace src.utils LoadAllLanguages(); LoadPlayersLanguage(); } - + private static void SetLangCode() { defaultLangCode = Config.LoadedConfig.LanguageSystem.DefaultLangCode; @@ -82,10 +82,10 @@ namespace src.utils var translation = GetTranslation(skill.ToString().ToLowerInvariant(), langCode); if (!translation.Contains("{0}")) return translation; - + if (!translation.Contains(' ')) return translation.Replace("{0}", "").Trim(); - + var parts = translation.Split(' ', StringSplitOptions.RemoveEmptyEntries); var filtered = parts.Where(p => !p.Contains("{0}")); return string.Join(' ', filtered); @@ -279,7 +279,7 @@ namespace src.utils public static void ChangePlayerLanguage(CCSPlayerController? player, string language) { if (player == null || !player.IsValid) return; - _playersLanguage.AddOrUpdate(player.SteamID, language, (k,v) => language); + _playersLanguage.AddOrUpdate(player.SteamID, language, (k, v) => language); SavePlayersLanguage(); } } diff --git a/jRandomSkills - SRC Files/src/utils/PlayerManager.cs b/jRandomSkills - SRC Files/src/utils/PlayerManager.cs index 6b67a5c..ccd971c 100644 --- a/jRandomSkills - SRC Files/src/utils/PlayerManager.cs +++ b/jRandomSkills - SRC Files/src/utils/PlayerManager.cs @@ -10,6 +10,31 @@ namespace src.utils { private static readonly ConcurrentDictionary playersByIndex = []; + private static int cachedTick = int.MinValue; + private static List cachedControllers = []; + private static CC4? cachedBomb; + + private static void EnsureTickCache() + { + int tick = Server.TickCount; + if (tick == cachedTick) return; + cachedTick = tick; + cachedControllers = Utilities.GetPlayers(); + cachedBomb = Utilities.FindAllEntitiesByDesignerName("weapon_c4").FirstOrDefault(); + } + + public static List GetTickPlayers() + { + EnsureTickCache(); + return cachedControllers; + } + + public static CC4? GetTickBomb() + { + EnsureTickCache(); + return cachedBomb != null && cachedBomb.IsValid ? cachedBomb : null; + } + public static void Register(jSkill_PlayerInfo playerInfo) { if (playerInfo == null) return; @@ -37,7 +62,7 @@ namespace src.utils if (!player.ControllingBot) return player; - return Utilities.GetPlayers().FirstOrDefault(p => + return Utilities.GetPlayers().FirstOrDefault(p => p != null && p.IsValid && p.IsBot && diff --git a/jRandomSkills - SRC Files/src/utils/RayTrace.cs b/jRandomSkills - SRC Files/src/utils/RayTrace.cs index 96bd90e..5ac6e22 100644 --- a/jRandomSkills - SRC Files/src/utils/RayTrace.cs +++ b/jRandomSkills - SRC Files/src/utils/RayTrace.cs @@ -15,6 +15,30 @@ namespace src.utils { private static PluginCapability RayTraceInterface { get; } = new("raytrace:craytraceinterface"); + private static bool missingModuleLogged; + + private static CRayTraceInterface? GetInterface() + { + try + { + var rayTrace = RayTraceInterface.Get(); + if (rayTrace != null) return rayTrace; + } + catch { } + + if (!missingModuleLogged) + { + missingModuleLogged = true; + Server.PrintToConsole("[jRandomSkills] RayTrace module not found - skills that need it do nothing: " + + "LongZeus, LongKnife, Iana, Cypher, Noclip, Shade (and the skill-use button's aim check). " + + "Install RayTrace-CSS-API and RayTrace-MM: https://github.com/FUNPLAY-pro-CS2/Ray-Trace/releases"); + } + + return null; + } + + public static bool IsAvailable => GetInterface() != null; + public static CustomTraceResult? TraceShape(CCSPlayerController player, Vector startPos, Vector endPos, ulong? mask = null, ulong? contents = null) { if (player == null || !player.IsValid) return null; @@ -28,10 +52,7 @@ namespace src.utils playerPawn.CBodyComponent?.SceneNode == null) return null; - CRayTraceInterface? rayTrace; - try { rayTrace = RayTraceInterface.Get(); } - catch { return null; } - + var rayTrace = GetInterface(); if (rayTrace == null) return null; @@ -114,10 +135,7 @@ namespace src.utils playerPawn.CBodyComponent?.SceneNode == null) return null; - CRayTraceInterface? rayTrace; - try { rayTrace = RayTraceInterface.Get(); } - catch { return null; } - + var rayTrace = GetInterface(); if (rayTrace == null) return null; diff --git a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs index 26c1409..cfd55b1 100644 --- a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs +++ b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs @@ -275,6 +275,22 @@ namespace src.utils return null; } + public static HitGroup_t GetHitGroup(CTakeDamageInfo? info) + { + if (info == null || info.Handle == nint.Zero) return HitGroup_t.HITGROUP_GENERIC; + + int offset = GameData.GetOffset("CTakeDamageInfo_HitGroup"); + if (offset <= 0) return HitGroup_t.HITGROUP_GENERIC; + + nint hitGroupPointer = Marshal.ReadIntPtr(info.Handle, offset); + if (hitGroupPointer == nint.Zero) return HitGroup_t.HITGROUP_GENERIC; + + nint hitGroupData = Marshal.ReadIntPtr(hitGroupPointer, 16); + if (hitGroupData == nint.Zero) return HitGroup_t.HITGROUP_GENERIC; + + return (HitGroup_t)Marshal.ReadInt32(hitGroupData, 56); + } + public static void CreateHEGrenadeProjectile(Vector pos, QAngle angle, Vector vel, int teamNum) { HEGrenadeProjectile_CreateFunc.Value?.Invoke(pos.Handle, angle.Handle, vel.Handle, vel.Handle, IntPtr.Zero, 44, teamNum); @@ -285,15 +301,40 @@ namespace src.utils SmokeGrenadeProjectile_CreateFunc.Value?.Invoke(pos.Handle, angle.Handle, vel.Handle, vel.Handle, IntPtr.Zero, 45, teamNum); } + // True when this hit would be nullified by the server's friendly-fire rules (same-team hit, + // mp_friendlyfire 0 and mp_teammates_are_enemies 0). The TakeDamage pre-hook still sees the raw + // damage, so lethal victim-side skills (SecondLife/Phoenix) must skip it — otherwise they "revive" + // a teammate that was never going to take damage. + public static bool IsFriendlyFireBlocked(CTakeDamageInfo? info, CCSPlayerPawn? victimPawn) + { + if (info == null || victimPawn == null || !victimPawn.IsValid) return false; + + var attackerEnt = info.Attacker?.Value; + if (attackerEnt == null || !attackerEnt.IsValid) return false; // world/no attacker -> real damage + if (attackerEnt.Handle == victimPawn.Handle) return false; // self damage applies + + var attackerPawn = new CCSPlayerPawn(attackerEnt.Handle); + if (!attackerPawn.IsValid || attackerPawn.DesignerName != "player") return false; // non-player inflictor + if (attackerPawn.TeamNum != victimPawn.TeamNum) return false; // enemy -> real damage + + bool ff = ConVar.Find("mp_friendlyfire")?.GetPrimitiveValue() ?? false; + bool tae = ConVar.Find("mp_teammates_are_enemies")?.GetPrimitiveValue() ?? false; + return !ff && !tae; // same team + FF off -> engine will zero this damage + } + public static bool TakeHealth(CCSPlayerPawn? pawn, int damage) { if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return false; + CCSPlayerController? victim = null; + jSkill_PlayerInfo? playerInfo = null; + var player = pawn.Controller.Value; - if (player != null && player.IsValid && player.SteamID != 0) + if (player != null && player.IsValid) { - var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + victim = player.As(); + playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return false; if (playerInfo.Skill == Skills.Jester && Jester.GetJesterInfo(player.Index)?.Active == true) @@ -301,9 +342,22 @@ namespace src.utils if (playerInfo.Skill == Skills.GodMode && GodMode.HaveHodMode(player.Index)) return false; + + if (playerInfo.Skill == Skills.Armored) + damage = (int)Math.Round(damage * (playerInfo.SkillChance ?? 1f)); } int newHealth = (int)(pawn.Health - damage); + if (newHealth <= 0 && playerInfo != null) + { + if (playerInfo.Skill == Skills.SecondLife && SecondLife.TryConsumeRevive(victim, pawn)) + return true; + if (playerInfo.Skill == Skills.Phoenix && Phoenix.TryConsumeRevive(victim, pawn)) + return true; + if (playerInfo.Skill == Skills.ReZombie && ReZombie.TryBecomeZombie(victim, pawn)) + return true; + } + pawn.Health = newHealth; Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth"); @@ -336,7 +390,7 @@ namespace src.utils public static void ForceFullUpdate(CCSPlayerController player, List<(uint PlayerIndex, QAngle LastAngle)>? batchList = null, INetworkGameServer? networkGameServer = null) { if (!Config.LoadedConfig.EnableFullForceUpdate) return; - if (player == null || !player.IsValid) return; + if (player == null || !player.IsValid || player.IsBot) return; var pawn = player.PlayerPawn?.Value; if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return; diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll index f5929ad..ba4d9ab 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 f2ae8aa..fc47e69 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll differ