Merge pull request #58 from ByDexterTR/main

v1.2.4.b2
This commit is contained in:
Juzlus 2026-09-17 21:27:20 +02:00 • committed by GitHub
commit f73dd5a4df
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
33 changed files with 189 additions and 53 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.4.b1";
public override string ModuleVersion => "1.2.4.b2";
public override void Load(bool hotReload)
{

View file

@ -20,6 +20,9 @@ namespace src.player
public static partial class Event
{
private static Timer? setSkillTimer = null;
private const int MaxSetSkillRetries = 6;
private static int setSkillRetries;
private static int gameRulesPolls;
private static DateTime freezeTimeEnd = DateTime.MinValue;
private static bool isTransmitRegistered = false;
public static readonly jSkill_SkillInfo noneSkill = new(Skills.None, SkillsInfo.GetValue<string>(Skills.None, "color"), false);
@ -682,6 +685,10 @@ namespace src.player
var victim = @event.Userid;
if (victim == null || !victim.IsValid) return HookResult.Continue;
Ninja.RevealOnDeath(victim.Index);
Ghost.RevealOnDeath(victim.Index);
C4Camouflage.RevealOnDeath(victim.Index);
if (!SkillUtils.TryConsumeKillCredit(victim.Index, out uint attackerIndex, out string? weapon))
return HookResult.Continue;

View file

@ -26,7 +26,19 @@ namespace src.player
string flag = Config.LoadedConfig.VIPFlag;
if (string.IsNullOrWhiteSpace(flag)) return false;
return AdminManager.PlayerHasPermissions(player, flag);
return HasPermission(player, flag);
}
private static bool HasPermission(CCSPlayerController player, string permission)
{
try
{
return AdminManager.PlayerHasPermissions(player, permission);
}
catch
{
return false;
}
}
private static jSkill_SkillInfo ChooseSkillByRarityAndMax(List<jSkill_SkillInfo> candidates, Dictionary<Skills, int> assignmentCounts, Config.GameModes gameMode, bool vip)
@ -88,6 +100,7 @@ namespace src.player
{
bool isWarmup = Instance.GameRules == null || Instance.GameRules.WarmupPeriod == true;
isTransmitRegistered = false;
setSkillRetries = 0;
SkillUtils.ClearKillCredits();
SkillUtils.ClearCurses();
Instance.AddTimer(.1f, () => DisableAll(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
@ -336,7 +349,7 @@ namespace src.player
List<jSkill_SkillInfo> skillList = [.. ctx.BaseList];
if (!player.IsBot && ctx.RequiredPermissions.Count != 0)
skillList.RemoveAll(s => ctx.RequiredPermissions.TryGetValue(s.Skill, out var perm) && !AdminManager.PlayerHasPermissions(player, perm));
skillList.RemoveAll(s => ctx.RequiredPermissions.TryGetValue(s.Skill, out var perm) && !HasPermission(player, perm));
if (gameMode != Config.GameModes.FullRandom)
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill);
@ -419,12 +432,19 @@ namespace src.player
var skillPlayer = PlayerManager.GetPlayerByIndex(player.Index);
if (skillPlayer == null) continue;
try
{
var pick = PickSkillForPlayer(player, skillPlayer, ctx, assignmentCounts, gameMode);
nextRoundPicks[player.Index] = pick;
if (pick.Skill != Skills.None)
assignmentCounts[pick.Skill] = assignmentCounts.TryGetValue(pick.Skill, out var c) ? c + 1 : 1;
}
catch (Exception ex)
{
Debug.WriteToDebug($"PrecomputeSkills failed for {skillPlayer.PlayerName}: {ex.Message}", DebugCategory.Skill);
}
}
}
PerfLog.End("PrecomputeSkills total", perfStart, 2.0);
}
@ -450,6 +470,12 @@ namespace src.player
: DateTime.Now.AddSeconds(skillDescriptionHudExpired.Value);
}
private static int CountConnectedPlayers()
{
try { return Utilities.GetPlayers().Count(p => p != null && p.IsValid && !p.IsHLTV); }
catch { return 0; }
}
private static void SetSkillCore()
{
setSkillTimer = null;
@ -460,11 +486,16 @@ namespace src.player
// GameRules null = not ready; keep polling so skills land right after warmup ends.
if (Instance.GameRules == null || Instance.GameRules.WarmupPeriod == true)
{
if (++gameRulesPolls % 10 == 0)
Debug.WriteToDebug($"SetSkill waiting: gameRules={(Instance.GameRules == null ? "null" : "warmup")}, poll {gameRulesPolls}.", DebugCategory.Skill);
setSkillTimer?.Kill();
setSkillTimer = Instance.AddTimer(1f, SetSkill, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
return;
}
gameRulesPolls = 0;
var validPlayers = Utilities.GetPlayers()
.Where(p => p != null && p.IsValid && !p.IsHLTV)
.Where(p =>
@ -501,6 +532,7 @@ namespace src.player
}
PickContext? pickContext = null;
int assigned = 0;
foreach (var player in validPlayers)
{
@ -586,6 +618,7 @@ namespace src.player
Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{SkillNames.Get(randomSkill.Skill)}\".", DebugCategory.Skill);
UpdateSkillHudExpired(skillPlayer, randomSkill.Skill);
assigned++;
if (randomSkill.Display)
Instance?.AddTimer(.6f, () =>
@ -626,6 +659,20 @@ namespace src.player
}
nextRoundPicks.Clear();
if (assigned == 0 && CountConnectedPlayers() > 0)
{
if (setSkillRetries < MaxSetSkillRetries)
{
setSkillRetries++;
Debug.WriteToDebug($"SetSkill assigned nothing (valid={validPlayers.Count}, connected={CountConnectedPlayers()}); retry {setSkillRetries}/{MaxSetSkillRetries} in .5s.", DebugCategory.Skill);
setSkillTimer = Instance?.AddTimer(.5f, SetSkill, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
}
else
Debug.WriteToDebug($"SetSkill assigned nothing (valid={validPlayers.Count}, connected={CountConnectedPlayers()}) and gave up after {MaxSetSkillRetries} retries.", DebugCategory.Skill);
}
else
setSkillRetries = 0;
}
}
@ -668,7 +715,7 @@ namespace src.player
List<jSkill_SkillInfo> skillList = [.. SkillData.Skills];
skillList.RemoveAll(s => s?.Skill == Skills.None);
if (!player.IsBot)
skillList.RemoveAll(s => !string.IsNullOrEmpty(SkillsInfo.GetValue<string>(s.Skill, "requiredPermission")) && !AdminManager.PlayerHasPermissions(player, SkillsInfo.GetValue<string>(s.Skill, "requiredPermission")));
skillList.RemoveAll(s => !string.IsNullOrEmpty(SkillsInfo.GetValue<string>(s.Skill, "requiredPermission")) && !HasPermission(player, SkillsInfo.GetValue<string>(s.Skill, "requiredPermission")));
if (gameMode != Config.GameModes.FullRandom)
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill);

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Cvars;
using CounterStrikeSharp.API.Modules.Entities.Constants;
@ -53,6 +53,7 @@ namespace src.player.skills
if (SkillPlayerInfo.IsEmpty) return;
float cooldown = SkillsInfo.GetValue<float>(skillName, "cooldown");
bool freezeTime = SkillUtils.IsFreezeTime();
foreach (var player in PlayerManager.GetTickPlayers())
{
@ -67,7 +68,7 @@ namespace src.player.skills
var buttons = player.Buttons;
bool isAttack2 = (buttons & PlayerButtons.Attack2) != 0;
if (skillInfo.CanUse && isAttack2)
if (skillInfo.CanUse && isAttack2 && !freezeTime)
{
var weapon = playerPawn.WeaponServices?.ActiveWeapon?.Value;

View file

@ -99,6 +99,11 @@ namespace src.player.skills
}
}
public static void RevealOnDeath(uint playerIndex)
{
invisiblePlayers.TryRemove(playerIndex, out _);
}
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
{
if (invisiblePlayers.IsEmpty) return;

View file

@ -211,7 +211,7 @@ namespace src.player.skills
targetToPlayer.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (target != null && target.IsValid && target.PawnIsAlive)
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("carefulbullets_disable_info"));
}

View file

@ -294,6 +294,8 @@ namespace src.player.skills
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
{
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
return;

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Timers;
using CounterStrikeSharp.API.Modules.Utils;
@ -150,7 +150,7 @@ namespace src.player.skills
if (target != null && target.IsValid)
{
SetUpPostProcessing(target, true);
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (target.PawnIsAlive)
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("darkness_disable_info"));
}
playersInDark.TryRemove(targetIndex, out _);

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.UserMessages;
using CounterStrikeSharp.API.Modules.Utils;
@ -139,7 +139,7 @@ namespace src.player.skills
deafPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (target != null && target.IsValid && target.PawnIsAlive)
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("deaf_disable_info"));
}

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
@ -139,7 +139,7 @@ namespace src.player.skills
cursedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (target != null && target.IsValid && target.PawnIsAlive)
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("expensiveammo_disable_info"));
}

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Cvars;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
@ -171,6 +171,8 @@ namespace src.player.skills
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
{
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null) return;
if (HandleBarrelHit(damagedEntity)) return;

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils;
@ -121,6 +121,8 @@ namespace src.player.skills
public static void BulletImpact(EventBulletImpact @event)
{
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
var player = PlayerManager.GetPlayerEvent(@event.Userid);
if (player == null || !player.IsValid) return;

View file

@ -85,17 +85,38 @@ namespace src.player.skills
private static void ChangeCamera(CCSPlayerController player, bool forceToDefault = false)
{
uint orginalCameraRaw;
uint newCameraRaw;
var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return;
if (cameras.TryGetValue(player.Index, out var cameraInfo) && cameraInfo.Item2 != 0)
bool tracked = cameras.TryGetValue(player.Index, out var cameraInfo) && cameraInfo.Item2 != 0;
if (forceToDefault)
{
if (tracked)
{
pawn.CameraServices.ViewEntity.Raw = cameraInfo.Item1;
Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices");
}
BlockWeapon(player, false);
return;
}
uint orginalCameraRaw;
uint newCameraRaw;
if (tracked)
{
orginalCameraRaw = cameraInfo.Item1;
var camera = Utilities.GetEntityFromIndex<CDynamicProp>((int)cameraInfo.Item2);
if (camera == null || !camera.IsValid) return;
if (camera == null || !camera.IsValid)
{
pawn.CameraServices.ViewEntity.Raw = orginalCameraRaw;
Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices");
BlockWeapon(player, false);
return;
}
newCameraRaw = camera.EntityHandle.Raw;
}
@ -108,7 +129,7 @@ namespace src.player.skills
if (newCameraRaw == 0)
return;
bool defaultCam = forceToDefault || (pawn.CameraServices.ViewEntity.Raw != orginalCameraRaw);
bool defaultCam = pawn.CameraServices.ViewEntity.Raw != orginalCameraRaw;
pawn!.CameraServices!.ViewEntity.Raw = defaultCam ? orginalCameraRaw : newCameraRaw;
Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices");
BlockWeapon(player, !defaultCam);

View file

@ -143,6 +143,8 @@ namespace src.player.skills
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
{
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
return;

View file

@ -58,6 +58,11 @@ namespace src.player.skills
SetWeaponAttack(player!, true);
}
public static void RevealOnDeath(uint playerIndex)
{
invisiblePlayers.TryRemove(playerIndex, out _);
}
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
{
if (invisiblePlayers.IsEmpty) return;

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
@ -194,7 +194,7 @@ namespace src.player.skills
if (!notify) return;
var targetEvent = PlayerManager.GetPlayerFromEvent(target);
if (targetEvent != null && targetEvent.IsValid && targetEvent.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (targetEvent != null && targetEvent.IsValid && targetEvent.PawnIsAlive)
targetEvent.PrintToChat($" {ChatColors.Green}" + targetEvent.GetTranslation("giant_disable_info"));
}

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
@ -148,7 +148,7 @@ namespace src.player.skills
if (target != null && target.IsValid)
{
SkillUtils.SetRadarDisabled(target, ownerTag, false);
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (target.PawnIsAlive)
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("glitch_disable_info"));
}
glitchedPlayers.TryRemove(targetIndex, out _);

View file

@ -331,6 +331,8 @@ namespace src.player.skills
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
{
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null)
return;

View file

@ -185,6 +185,8 @@ namespace src.player.skills
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
{
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
return;

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
@ -166,7 +166,7 @@ namespace src.player.skills
SetCrosshair(target1, true);
SetCrosshair(target2, true);
if (target1.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (target1.PawnIsAlive)
target1.PrintToChat($" {ChatColors.Green}" + target1.GetTranslation("jammer_disable_info"));
}
jammedPlayers.TryRemove(targetIndex, out _);

View file

@ -135,7 +135,7 @@ namespace src.player.skills
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
if (target != null && target.IsValid)
{
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (target.PawnIsAlive)
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("jetkick_disable_info"));
}
targetedPlayers.TryRemove(targetIndex, out _);

View file

@ -41,9 +41,16 @@ namespace src.player.skills
var player = PlayerManager.GetPlayerEvent(@event.Userid);
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
if (!bannedPlayers.TryGetValue(player.Index, out _)) return;
bannedPlayers.AddOrUpdate(player.Index, Server.TickCount + 10, (k, v) => Server.TickCount + 10);
var pawn = player.PlayerPawn.Value;
if (pawn.AbsVelocity != null && pawn.AbsVelocity.Z > 0)
pawn.AbsVelocity.Z = 0;
bannedPlayers.AddOrUpdate(player.Index, Server.TickCount + JumpBlockTicks, (k, v) => Server.TickCount + JumpBlockTicks);
}
private const int JumpBlockTicks = 24;
public static void OnTick()
{
if (bannedPlayers.IsEmpty) return;
@ -59,8 +66,8 @@ namespace src.player.skills
var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid) continue;
if (time > Server.TickCount)
pawn.AbsVelocity.Z = -100;
if (time > Server.TickCount && pawn.AbsVelocity != null && pawn.AbsVelocity.Z > -300)
pawn.AbsVelocity.Z = -300;
}
if (Server.TickCount % 32 != 0) return;
@ -149,7 +156,7 @@ namespace src.player.skills
bannedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (target != null && target.IsValid)
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("jumpban_disable_info"));
}

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
@ -153,7 +153,7 @@ namespace src.player.skills
cursedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (target != null && target.IsValid && target.PawnIsAlive)
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("jumpcurse_disable_info"));
}

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
@ -168,7 +168,7 @@ namespace src.player.skills
Utilities.SetStateChanged(target, "CBasePlayerController", "m_iDesiredFOV");
}
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (target.PawnIsAlive)
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("magnifier_disable_info"));
}
playersWithFov.TryRemove(targetIndex, out _);

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.Utils;
@ -147,7 +147,7 @@ namespace src.player.skills
RemoveVolume(targetIndex);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (target != null && target.IsValid && target.PawnIsAlive)
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("nightmare_disable_info"));
}

View file

@ -56,6 +56,11 @@ namespace src.player.skills
UpdateNinja(player);
}
public static void RevealOnDeath(uint playerIndex)
{
invisiblePlayers.TryRemove(playerIndex, out _);
}
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
{
if (invisiblePlayers.IsEmpty) return;

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.utils;
@ -171,7 +171,7 @@ namespace src.player.skills
targetToPlayer.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (target != null && target.IsValid && target.PawnIsAlive)
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("poison_disable_info"));
}

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;
@ -142,7 +142,7 @@ namespace src.player.skills
bannedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (target != null && target.IsValid && target.PawnIsAlive)
{
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("primaryban_disable_info"));
SetWeaponAttack(target, false);

View file

@ -138,6 +138,8 @@ namespace src.player.skills
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo)
{
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
return;

View file

@ -77,7 +77,7 @@ namespace src.player.skills
List<CCSPlayerController> allowed = [];
if (emitter != null)
if (emitter != null && CanEmit(emitter, out _))
foreach (var recipient in um.Recipients)
{
if (recipient == null || !recipient.IsValid) continue;
@ -110,23 +110,47 @@ namespace src.player.skills
float volume = SkillsInfo.GetValue<float>(skillName, "soundVolume");
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))
foreach (var player in PlayerManager.GetTickPlayers())
{
if (!CanEmit(player, out var pawn)) continue;
var entities = EntityManager.GetPlayerEntities(player.Index, "empty_prop");
if (entities.Count == 0)
{
player.PlayerPawn.Value!.EmitSound(soundEventName, volume: volume);
pawn!.EmitSound(soundEventName, volume: volume);
continue;
}
var entity = Utilities.GetEntityFromIndex<CDynamicProp>((int)entities[0]);
if (entity != null && entity.IsValid)
if (entity == null || !entity.IsValid || IsAtWorldOrigin(entity.AbsOrigin)) continue;
entity.EmitSound(soundEventName, volume: volume);
}
}
private static bool CanEmit(CCSPlayerController? player, out CCSPlayerPawn? pawn)
{
pawn = null;
if (player == null || !player.IsValid || player.IsHLTV) return false;
if (player.Team != CsTeam.Terrorist && player.Team != CsTeam.CounterTerrorist) return false;
var playerPawn = player.PlayerPawn?.Value;
if (playerPawn == null || !playerPawn.IsValid) return false;
if (playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE || playerPawn.Health <= 0) return false;
if (IsAtWorldOrigin(playerPawn.AbsOrigin)) return false;
pawn = playerPawn;
return true;
}
private static bool IsAtWorldOrigin(Vector? origin)
{
if (origin == null) return true;
return MathF.Abs(origin.X) < 1f && MathF.Abs(origin.Y) < 1f && MathF.Abs(origin.Z) < 1f;
}
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#e3ed8c", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, int cooldown = 2, float soundVolume = 1f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
{
public float SoundVolume { get; set; } = soundVolume;

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
@ -59,7 +59,7 @@ namespace src.player.skills
infectedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
if (target != null && target.IsValid && target.PawnIsAlive && !SkillUtils.IsFreezeTime())
if (target != null && target.IsValid && target.PawnIsAlive)
target.PrintToChat($" {ChatColors.Green}{target.GetTranslation("wildthrow_disable_info")}");
}