diff --git a/jRandomSkills - SRC Files/src/jRandomSkills.cs b/jRandomSkills - SRC Files/src/jRandomSkills.cs index 976d1ae..bc39f3a 100644 --- a/jRandomSkills - SRC Files/src/jRandomSkills.cs +++ b/jRandomSkills - SRC Files/src/jRandomSkills.cs @@ -31,7 +31,7 @@ namespace src public override string ModuleName => "[CS2] [ jRandomSkills ]"; public override string ModuleAuthor => "D3X (Original), Juzlus (Modifier), ByDexterTR (Contributor)"; public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus."; - public override string ModuleVersion => "1.2.4.b1"; + public override string ModuleVersion => "1.2.4.b2"; public override void Load(bool hotReload) { diff --git a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs index 8467a6c..2d8b1b1 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs @@ -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(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; diff --git a/jRandomSkills - SRC Files/src/player/RoundEvents.cs b/jRandomSkills - SRC Files/src/player/RoundEvents.cs index a51a3e9..5021177 100644 --- a/jRandomSkills - SRC Files/src/player/RoundEvents.cs +++ b/jRandomSkills - SRC Files/src/player/RoundEvents.cs @@ -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 candidates, Dictionary 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 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,11 +432,18 @@ namespace src.player var skillPlayer = PlayerManager.GetPlayerByIndex(player.Index); if (skillPlayer == null) continue; - var pick = PickSkillForPlayer(player, skillPlayer, ctx, assignmentCounts, gameMode); - nextRoundPicks[player.Index] = pick; + 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; + 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 skillList = [.. SkillData.Skills]; skillList.RemoveAll(s => s?.Skill == Skills.None); if (!player.IsBot) - skillList.RemoveAll(s => !string.IsNullOrEmpty(SkillsInfo.GetValue(s.Skill, "requiredPermission")) && !AdminManager.PlayerHasPermissions(player, SkillsInfo.GetValue(s.Skill, "requiredPermission"))); + skillList.RemoveAll(s => !string.IsNullOrEmpty(SkillsInfo.GetValue(s.Skill, "requiredPermission")) && !HasPermission(player, SkillsInfo.GetValue(s.Skill, "requiredPermission"))); if (gameMode != Config.GameModes.FullRandom) skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill); diff --git a/jRandomSkills - SRC Files/src/player/skills/BlastShot.cs b/jRandomSkills - SRC Files/src/player/skills/BlastShot.cs index 9fcb878..2a2b233 100644 --- a/jRandomSkills - SRC Files/src/player/skills/BlastShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/BlastShot.cs @@ -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(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; diff --git a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs index b8b0ba5..7f3ddfc 100644 --- a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs +++ b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs @@ -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; diff --git a/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs b/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs index b1ae6b2..f1fdf0b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs +++ b/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs @@ -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")); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Cypher.cs b/jRandomSkills - SRC Files/src/player/skills/Cypher.cs index 44baa5b..152f113 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Cypher.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Cypher.cs @@ -294,6 +294,8 @@ namespace src.player.skills public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo) { + if (SkillsInfo.GetValue(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return; + if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs index 66216c0..e05f24a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Timers; using CounterStrikeSharp.API.Modules.Utils; @@ -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 _); diff --git a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs index 9576610..2536c5e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs @@ -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")); } diff --git a/jRandomSkills - SRC Files/src/player/skills/ExpensiveAmmo.cs b/jRandomSkills - SRC Files/src/player/skills/ExpensiveAmmo.cs index 232aecb..c6731d0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ExpensiveAmmo.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ExpensiveAmmo.cs @@ -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")); } diff --git a/jRandomSkills - SRC Files/src/player/skills/ExplodingBarrel.cs b/jRandomSkills - SRC Files/src/player/skills/ExplodingBarrel.cs index c25881e..165c6c1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ExplodingBarrel.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ExplodingBarrel.cs @@ -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(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return; + if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null) return; if (HandleBarrelHit(damagedEntity)) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs b/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs index 7bdedc6..5e4802f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; @@ -121,6 +121,8 @@ namespace src.player.skills public static void BulletImpact(EventBulletImpact @event) { + if (SkillsInfo.GetValue(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return; + var player = PlayerManager.GetPlayerEvent(@event.Userid); if (player == null || !player.IsValid) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs b/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs index 78f2a18..d2ba357 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs @@ -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((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); diff --git a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs index 3d802ab..b48c6a6 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs @@ -143,6 +143,8 @@ namespace src.player.skills public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo) { + if (SkillsInfo.GetValue(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return; + if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs index 2923a48..c2c4622 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs @@ -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; diff --git a/jRandomSkills - SRC Files/src/player/skills/Giant.cs b/jRandomSkills - SRC Files/src/player/skills/Giant.cs index 9c56055..ba540f9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Giant.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Giant.cs @@ -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")); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs index 2291daa..ab70306 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs @@ -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 _); diff --git a/jRandomSkills - SRC Files/src/player/skills/Iana.cs b/jRandomSkills - SRC Files/src/player/skills/Iana.cs index f21f33d..a47d433 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Iana.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Iana.cs @@ -331,6 +331,8 @@ namespace src.player.skills public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo) { + if (SkillsInfo.GetValue(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return; + if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs b/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs index 7b31561..021e138 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs @@ -185,6 +185,8 @@ namespace src.player.skills public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo) { + if (SkillsInfo.GetValue(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return; + if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs index 69666d3..6657e81 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs @@ -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 _); diff --git a/jRandomSkills - SRC Files/src/player/skills/JetKick.cs b/jRandomSkills - SRC Files/src/player/skills/JetKick.cs index acaded1..64eac16 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JetKick.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JetKick.cs @@ -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 _); diff --git a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs index f034845..9a5ae55 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs @@ -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")); } diff --git a/jRandomSkills - SRC Files/src/player/skills/JumpCurse.cs b/jRandomSkills - SRC Files/src/player/skills/JumpCurse.cs index 74e8310..0481707 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JumpCurse.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JumpCurse.cs @@ -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")); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs index 8d50b72..5d3d3ad 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs @@ -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 _); diff --git a/jRandomSkills - SRC Files/src/player/skills/Nightmare.cs b/jRandomSkills - SRC Files/src/player/skills/Nightmare.cs index d564014..95959b7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Nightmare.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Nightmare.cs @@ -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")); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs index 8c238b0..3591da5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs @@ -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; diff --git a/jRandomSkills - SRC Files/src/player/skills/Poison.cs b/jRandomSkills - SRC Files/src/player/skills/Poison.cs index 6fae45d..74a11f7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Poison.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Poison.cs @@ -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")); } diff --git a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs index d26a8cc..ba6bb95 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs @@ -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); diff --git a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs index d23a8b9..06e7741 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs @@ -138,6 +138,8 @@ namespace src.player.skills public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo) { + if (SkillsInfo.GetValue(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return; + if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs index e143579..8186c26 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs @@ -77,7 +77,7 @@ namespace src.player.skills List 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(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((int)entities[0]); - if (entity != null && entity.IsValid) - entity.EmitSound(soundEventName, volume: volume); + 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; diff --git a/jRandomSkills - SRC Files/src/player/skills/WildThrow.cs b/jRandomSkills - SRC Files/src/player/skills/WildThrow.cs index 7a67f3b..87fbc9b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/WildThrow.cs +++ b/jRandomSkills - SRC Files/src/player/skills/WildThrow.cs @@ -1,4 +1,4 @@ -using CounterStrikeSharp.API; +using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -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")}"); } diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll index 04041cc..5265c1b 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll differ diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll index 860a603..e33d4b1 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll differ