v1.2.3.b1

Revive skills (Second Chance / Phoenix / Re-Zombie) — unified "on death" logic:
- Intercept the lethal hit before it is applied. Previously they reacted after the death was already committed, so one-shots, fall damage and skill-based kills were missed (Phoenix and Re-Zombie were rewritten from a post-death handler to pre-damage interception).

Killer Flash:
- Kills through real damage instead of forcing a suicide, so revive skills can intercept.

Baseball:
- Fixed a rare server crash from decoy grenades: a freed decoy's entity index could be reused by another entity and written to (use-after-free). Decoy tracking is now validated per tick (DesignerName gate) and cleared every round.

Native crash hardening:
- Aimbot: guard the hit-group native pointer before writing (avoids writing to freed/null memory).
- Wallhack: detach the glow when the target dies or disconnects (stale FollowEntity on a freed pawn).
- Spectator / Cypher / FalconEye / ThirdEye: null-guard the camera SceneNode walk and re-validate the target before teleport/parent (cross-frame freed-entity deref).
- CServerSideClient.ForceFullUpdate now bails on a null client handle.

Performance:
- Added a per-tick player/bomb cache (PlayerManager.GetTickPlayers / GetTickBomb).
- Migrated 82 skills from per-skill Utilities.GetPlayers() to the one shared per-tick scan, and the HUD loop reuses it. Much lower per-tick cost at high player counts (verified 10v10).

RayTrace:
- Prints a single notice when the module is not installed; dependent skills (Long Zeus, Long Knife, Iana, Cypher, Noclip, Shade + the skill-use aim check) no-op instead of failing silently (#43).
This commit is contained in:
ByDexter 2026-07-26 17:49:36 +03:00
parent c7ee500957
commit 0e86f54e0a
113 changed files with 717 additions and 437 deletions

View file

@ -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)
{

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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<Skills> 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<float?>(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);
}

View file

@ -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);

View file

@ -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();

View file

@ -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<nint, int> 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<CCSPlayerController>())!;
var attacker = PlayerManager.GetPlayerEvent(attackerController.As<CCSPlayerController>());
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)

View file

@ -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;

View file

@ -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"));
}

View file

@ -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)

View file

@ -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;
}

View file

@ -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()))];

View file

@ -18,6 +18,12 @@ namespace src.player.skills
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(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<CDecoyProjectile>();
if (decoy == null || !decoy.IsValid || decoy.OwnerEntity == null || decoy.OwnerEntity.Value == null || !decoy.OwnerEntity.Value.IsValid) return;
var pawn = decoy.OwnerEntity.Value.As<CCSPlayerPawn>();
if (pawn == null || !pawn.IsValid || pawn.Controller == null || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return;
var player = pawn.Controller.Value.As<CCSPlayerController>();
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<CDecoyProjectile>((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<float>(skillName, "speedMultipier"), SkillsInfo.GetValue<float>(skillName, "maxSpeed"));

View file

@ -35,7 +35,7 @@ namespace src.player.skills
float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(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)

View file

@ -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<float>(skillName, "velocityModifier");
foreach (var player in Utilities.GetPlayers())
foreach (var player in PlayerManager.GetTickPlayers())
{
if (player == null || !player.IsValid) continue;

View file

@ -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;

View file

@ -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<CC4>("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<CC4>("weapon_c4").FirstOrDefault();
if (bomb != null && !bomb.IsValid) bomb = null;
var bomb = PlayerManager.GetTickBomb();
foreach (var (info, player) in infoList)
{

View file

@ -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<int>(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 _);

View file

@ -39,7 +39,7 @@ namespace src.player.skills
float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "chanceTo") - SkillsInfo.GetValue<float>(skillName, "chanceFrom")) + SkillsInfo.GetValue<float>(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)

View file

@ -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();

View file

@ -73,7 +73,7 @@ namespace src.player.skills
float currentTime = Server.CurrentTime;
float extraTime = SkillsInfo.GetValue<float>(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;

View file

@ -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");
});

View file

@ -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();

View file

@ -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;

View file

@ -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 = [];

View file

@ -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())));

View file

@ -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)];

View file

@ -44,7 +44,7 @@ namespace src.player.skills
float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "chanceTo") - SkillsInfo.GetValue<float>(skillName, "chanceFrom")) + SkillsInfo.GetValue<float>(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)

View file

@ -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;

View file

@ -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<string> 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<bool>(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;

View file

@ -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");
}
}

View file

@ -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);
//}

View file

@ -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);
}
}

View file

@ -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<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(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)
{

View file

@ -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));

View file

@ -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;

View file

@ -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 _);

View file

@ -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;

View file

@ -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<bool>(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<jSkill_SkillInfo> 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()));

View file

@ -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<CC4>("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)

View file

@ -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;

View file

@ -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())));

View file

@ -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<float>(skillName, "duration"), () => {
Instance.AddTimer(SkillsInfo.GetValue<float>(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; }
}

View file

@ -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<int>(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;

View file

@ -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;

View file

@ -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<CBaseCSGrenadeProjectile>((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<float>(skillName, "detonationRange"))
{

View file

@ -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<int>(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"));
}
}

View file

@ -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<CDynamicProp>((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<float>(skillName, "Duration"), () =>
jRandomSkills.Instance.AddTimer(SkillsInfo.GetValue<float>(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;

View file

@ -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 &&

View file

@ -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)

View file

@ -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)];

View file

@ -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);
}

View file

@ -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())));

View file

@ -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;

View file

@ -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())));

View file

@ -30,7 +30,7 @@ namespace src.player.skills
if (!SkillsInfo.GetValue<bool>(skillName, "friendlyFire") && player!.Team == attacker!.Team) return;
if (attackerInfo?.Skill == skillName && playerInfo?.Skill != Skills.AntyFlash && player!.PlayerPawn.Value!.FlashDuration >= SkillsInfo.GetValue<float>(skillName, "flashDuration"))
player?.PlayerPawn?.Value?.CommitSuicide(false, true);
SkillUtils.TakeHealth(player.PlayerPawn.Value, 9999);
}
public static void GrenadeThrown(EventGrenadeThrown @event)

View file

@ -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())));

View file

@ -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;
}
}
}

View file

@ -38,7 +38,7 @@ namespace src.player.skills
if (target.Handle == player.Handle) return;
if (!SkillsInfo.GetValue<bool>(skillName, "friendlyFire") && player.Team == target.Team) return;
SkillUtils.TakeHealth(target.PlayerPawn.Value, 9999);
}

View file

@ -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();

View file

@ -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<uint>(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())));

View file

@ -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)

View file

@ -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;

View file

@ -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()))];

View file

@ -60,7 +60,7 @@ namespace src.player.skills
{
if (invisiblePlayers.IsEmpty) return;
var bomb = Utilities.FindAllEntitiesByDesignerName<CC4>("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;

View file

@ -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);

View file

@ -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<float>(skillName, "cooldown") + SkillsInfo.GetValue<float>(skillName, "cooldownWhenStuck"));
return hasGround ? stuckVector : null;

View file

@ -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<int>(skillName, "extraJumpsMin"), SkillsInfo.GetValue<int>(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)

View file

@ -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<uint, int> phoenixTicks = new();
public static void LoadSkill()
@ -17,38 +19,61 @@ namespace src.player.skills
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(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<CEntityInstance>(0);
var info = h.GetParam<CTakeDamageInfo>(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<CCSPlayerPawn>();
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<CCSPlayerController>();
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<CCSWeaponBase>();
if (weapon == null || !weapon.IsValid) return DefaultHeadshotMultiplier;
var vdata = weapon.GetVData<CCSWeaponBaseVData>();
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<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(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)

View file

@ -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")}: <font color='{fuelColor}'>{(pilotInfo.Fuel/maximumFuel)*100:F0}%</font>";
playerInfo.PrintHTML = $"{player.GetTranslation("pilot_hud_info")}: <font color='{fuelColor}'>{(pilotInfo.Fuel / maximumFuel) * 100:F0}%</font>";
}
private static string GetFuelColor(float fuelPercentage)
{
var maximumFuel = SkillsInfo.GetValue<float>(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;

View file

@ -57,18 +57,19 @@ namespace src.player.skills
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
if (plantedBomb != null)
Server.NextFrame(() => {
Server.NextFrame(() =>
{
if (plantedBomb != null && plantedBomb.IsValid)
plantedBomb.C4Blow = Server.CurrentTime + SkillsInfo.GetValue<int>(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<int>(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;

View file

@ -43,7 +43,7 @@ namespace src.player.skills
public static void OnTick()
{
int cooldown = Math.Max(1, (int)(64 * SkillsInfo.GetValue<float>(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())));

View file

@ -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;

View file

@ -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<float>(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", $"<font color='#00d5ff'>{cooldown}</font>")}";
}
public class PlayerSkillInfo

View file

@ -39,7 +39,7 @@ namespace src.player.skills
float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(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)

View file

@ -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;

View file

@ -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<CC4>("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

View file

@ -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);

View file

@ -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<uint, int> 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<CEntityInstance>(0);
var info = h.GetParam<CTakeDamageInfo>(1);
if (victimEntity == null || !victimEntity.IsValid || info == null) return;
var pawn = victim.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid) return;
var victimPawn = victimEntity.As<CCSPlayerPawn>();
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<CCSPlayerController>();
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<int>(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<int>(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<CCSWeaponBase>();
if (weapon == null || !weapon.IsValid) return DefaultHeadshotMultiplier;
var vdata = weapon.GetVData<CCSWeaponBaseVData>();
if (vdata == null || vdata.HeadshotMultiplier <= 0) return DefaultHeadshotMultiplier;
return vdata.HeadshotMultiplier;
}
private static void DropAllBotWeapons(CCSPlayerController player)

View file

@ -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)

View file

@ -18,7 +18,7 @@ namespace src.player.skills
{
int cooldown = Math.Max(1, (int)(64 * SkillsInfo.GetValue<float>(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;

View file

@ -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)

View file

@ -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);
}
}
}
}

View file

@ -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<uint, float> 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;

View file

@ -25,7 +25,8 @@ namespace src.player.skills
{
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
if (plantedBomb != null)
Server.NextFrame(() => {
Server.NextFrame(() =>
{
if (plantedBomb != null && plantedBomb.IsValid)
plantedBomb.DefuseCountDown = 0;
});

View file

@ -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<nint, int> 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<CCSWeaponBase>();
if (weapon == null || !weapon.IsValid) return DefaultHeadshotMultiplier;
var vdata = weapon.GetVData<CCSWeaponBaseVData>();
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<int>(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;
}
}

View file

@ -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<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(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)

View file

@ -45,12 +45,13 @@ namespace src.player.skills
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
if (plantedBomb != null)
Server.NextFrame(() => {
Server.NextFrame(() =>
{
if (plantedBomb != null && plantedBomb.IsValid)
plantedBomb.C4Blow = Server.CurrentTime + SkillsInfo.GetValue<int>(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<int>(skillName, "detonationTime")));
}

View file

@ -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));

View file

@ -81,7 +81,7 @@ namespace src.player.skills
foreach (var index in AWPs.ToList())
SkillUtils.SafeKillEntity<CBasePlayerWeapon>(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;

View file

@ -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)

View file

@ -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<int>(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");

View file

@ -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");
});

View file

@ -12,7 +12,7 @@ namespace src.player.skills
private const Skills skillName = Skills.SwapPosition;
private static readonly ConcurrentDictionary<uint, ZamianaMiejsc_PlayerInfo> SkillPlayerInfo = [];
private static readonly object setLock = new();
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(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
? $"<font color='#FF0000'>{player.GetTranslation("hud_info_no_enemy")}</font>" : null;
else
SkillUtils.ResetPrintHTML(player);
@ -103,7 +103,7 @@ namespace src.player.skills
if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo))
{
List<CCSPlayerController> enemy = Utilities.GetPlayers().FindAll(p => Instance.IsPlayerValid(p) && p.Team != player.Team && p.PawnIsAlive);
List<CCSPlayerController> enemy = PlayerManager.GetTickPlayers().FindAll(p => Instance.IsPlayerValid(p) && p.Team != player.Team && p.PawnIsAlive);
if (enemy.Count == 0)
{
skillInfo.FindedEnemy = false;

View file

@ -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)

View file

@ -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"));

View file

@ -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();
});

View file

@ -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;

View file

@ -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<CBaseEntity>(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<CCSPlayerController>();
bool friendlyFire = SkillsInfo.GetValue<bool>(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)

View file

@ -82,7 +82,7 @@ namespace src.player.skills
int smokeDamage = SkillsInfo.GetValue<int>(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;

Some files were not shown because too many files have changed in this diff Show more