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 ModuleName => "[CS2] [ jRandomSkills ]";
public override string ModuleAuthor => "D3X (Original), Juzlus (Modifier), ByDexterTR (Contributor)"; 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 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) public override void Load(bool hotReload)
{ {

View file

@ -20,6 +20,9 @@ namespace src.player
public static partial class Event public static partial class Event
{ {
private static Timer? setSkillTimer = null; 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 DateTime freezeTimeEnd = DateTime.MinValue;
private static bool isTransmitRegistered = false; private static bool isTransmitRegistered = false;
public static readonly jSkill_SkillInfo noneSkill = new(Skills.None, SkillsInfo.GetValue<string>(Skills.None, "color"), 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; var victim = @event.Userid;
if (victim == null || !victim.IsValid) return HookResult.Continue; 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)) if (!SkillUtils.TryConsumeKillCredit(victim.Index, out uint attackerIndex, out string? weapon))
return HookResult.Continue; return HookResult.Continue;

View file

@ -26,7 +26,19 @@ namespace src.player
string flag = Config.LoadedConfig.VIPFlag; string flag = Config.LoadedConfig.VIPFlag;
if (string.IsNullOrWhiteSpace(flag)) return false; 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) 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; bool isWarmup = Instance.GameRules == null || Instance.GameRules.WarmupPeriod == true;
isTransmitRegistered = false; isTransmitRegistered = false;
setSkillRetries = 0;
SkillUtils.ClearKillCredits(); SkillUtils.ClearKillCredits();
SkillUtils.ClearCurses(); SkillUtils.ClearCurses();
Instance.AddTimer(.1f, () => DisableAll(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); 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]; List<jSkill_SkillInfo> skillList = [.. ctx.BaseList];
if (!player.IsBot && ctx.RequiredPermissions.Count != 0) 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) if (gameMode != Config.GameModes.FullRandom)
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill); skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill);
@ -419,12 +432,19 @@ namespace src.player
var skillPlayer = PlayerManager.GetPlayerByIndex(player.Index); var skillPlayer = PlayerManager.GetPlayerByIndex(player.Index);
if (skillPlayer == null) continue; if (skillPlayer == null) continue;
try
{
var pick = PickSkillForPlayer(player, skillPlayer, ctx, assignmentCounts, gameMode); var pick = PickSkillForPlayer(player, skillPlayer, ctx, assignmentCounts, gameMode);
nextRoundPicks[player.Index] = pick; nextRoundPicks[player.Index] = pick;
if (pick.Skill != Skills.None) if (pick.Skill != Skills.None)
assignmentCounts[pick.Skill] = assignmentCounts.TryGetValue(pick.Skill, out var c) ? c + 1 : 1; 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); PerfLog.End("PrecomputeSkills total", perfStart, 2.0);
} }
@ -450,6 +470,12 @@ namespace src.player
: DateTime.Now.AddSeconds(skillDescriptionHudExpired.Value); : 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() private static void SetSkillCore()
{ {
setSkillTimer = null; setSkillTimer = null;
@ -460,11 +486,16 @@ namespace src.player
// GameRules null = not ready; keep polling so skills land right after warmup ends. // GameRules null = not ready; keep polling so skills land right after warmup ends.
if (Instance.GameRules == null || Instance.GameRules.WarmupPeriod == true) 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?.Kill();
setSkillTimer = Instance.AddTimer(1f, SetSkill, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); setSkillTimer = Instance.AddTimer(1f, SetSkill, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
return; return;
} }
gameRulesPolls = 0;
var validPlayers = Utilities.GetPlayers() var validPlayers = Utilities.GetPlayers()
.Where(p => p != null && p.IsValid && !p.IsHLTV) .Where(p => p != null && p.IsValid && !p.IsHLTV)
.Where(p => .Where(p =>
@ -501,6 +532,7 @@ namespace src.player
} }
PickContext? pickContext = null; PickContext? pickContext = null;
int assigned = 0;
foreach (var player in validPlayers) 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); Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{SkillNames.Get(randomSkill.Skill)}\".", DebugCategory.Skill);
UpdateSkillHudExpired(skillPlayer, randomSkill.Skill); UpdateSkillHudExpired(skillPlayer, randomSkill.Skill);
assigned++;
if (randomSkill.Display) if (randomSkill.Display)
Instance?.AddTimer(.6f, () => Instance?.AddTimer(.6f, () =>
@ -626,6 +659,20 @@ namespace src.player
} }
nextRoundPicks.Clear(); 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]; List<jSkill_SkillInfo> skillList = [.. SkillData.Skills];
skillList.RemoveAll(s => s?.Skill == Skills.None); skillList.RemoveAll(s => s?.Skill == Skills.None);
if (!player.IsBot) 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) if (gameMode != Config.GameModes.FullRandom)
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill); 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.Core;
using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Cvars;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
@ -53,6 +53,7 @@ namespace src.player.skills
if (SkillPlayerInfo.IsEmpty) return; if (SkillPlayerInfo.IsEmpty) return;
float cooldown = SkillsInfo.GetValue<float>(skillName, "cooldown"); float cooldown = SkillsInfo.GetValue<float>(skillName, "cooldown");
bool freezeTime = SkillUtils.IsFreezeTime();
foreach (var player in PlayerManager.GetTickPlayers()) foreach (var player in PlayerManager.GetTickPlayers())
{ {
@ -67,7 +68,7 @@ namespace src.player.skills
var buttons = player.Buttons; var buttons = player.Buttons;
bool isAttack2 = (buttons & PlayerButtons.Attack2) != 0; bool isAttack2 = (buttons & PlayerButtons.Attack2) != 0;
if (skillInfo.CanUse && isAttack2) if (skillInfo.CanUse && isAttack2 && !freezeTime)
{ {
var weapon = playerPawn.WeaponServices?.ActiveWeapon?.Value; 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) public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
{ {
if (invisiblePlayers.IsEmpty) return; if (invisiblePlayers.IsEmpty) return;

View file

@ -211,7 +211,7 @@ namespace src.player.skills
targetToPlayer.TryRemove(targetIndex, out _); targetToPlayer.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)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("carefulbullets_disable_info")); 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) 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) if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
return; return;

View file

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

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.UserMessages;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
@ -139,7 +139,7 @@ namespace src.player.skills
deafPlayers.TryRemove(targetIndex, out _); deafPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)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("deaf_disable_info")); 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.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.utils; using src.utils;
@ -139,7 +139,7 @@ namespace src.player.skills
cursedPlayers.TryRemove(targetIndex, out _); cursedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)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("expensiveammo_disable_info")); 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.Core;
using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Cvars;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
@ -171,6 +171,8 @@ namespace src.player.skills
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo) 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 (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null) return;
if (HandleBarrelHit(damagedEntity)) return; if (HandleBarrelHit(damagedEntity)) return;

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
@ -121,6 +121,8 @@ namespace src.player.skills
public static void BulletImpact(EventBulletImpact @event) public static void BulletImpact(EventBulletImpact @event)
{ {
if (SkillsInfo.GetValue<bool>(skillName, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) return;
var player = PlayerManager.GetPlayerEvent(@event.Userid); var player = PlayerManager.GetPlayerEvent(@event.Userid);
if (player == null || !player.IsValid) return; 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) private static void ChangeCamera(CCSPlayerController player, bool forceToDefault = false)
{ {
uint orginalCameraRaw;
uint newCameraRaw;
var pawn = player.PlayerPawn.Value; var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return; 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; orginalCameraRaw = cameraInfo.Item1;
var camera = Utilities.GetEntityFromIndex<CDynamicProp>((int)cameraInfo.Item2); 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; newCameraRaw = camera.EntityHandle.Raw;
} }
@ -108,7 +129,7 @@ namespace src.player.skills
if (newCameraRaw == 0) if (newCameraRaw == 0)
return; return;
bool defaultCam = forceToDefault || (pawn.CameraServices.ViewEntity.Raw != orginalCameraRaw); bool defaultCam = pawn.CameraServices.ViewEntity.Raw != orginalCameraRaw;
pawn!.CameraServices!.ViewEntity.Raw = defaultCam ? orginalCameraRaw : newCameraRaw; pawn!.CameraServices!.ViewEntity.Raw = defaultCam ? orginalCameraRaw : newCameraRaw;
Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices"); Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices");
BlockWeapon(player, !defaultCam); BlockWeapon(player, !defaultCam);

View file

@ -143,6 +143,8 @@ namespace src.player.skills
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo) 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) if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
return; return;

View file

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

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.utils; using src.utils;
@ -194,7 +194,7 @@ namespace src.player.skills
if (!notify) return; if (!notify) return;
var targetEvent = PlayerManager.GetPlayerFromEvent(target); 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")); 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.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.utils; using src.utils;
@ -148,7 +148,7 @@ namespace src.player.skills
if (target != null && target.IsValid) if (target != null && target.IsValid)
{ {
SkillUtils.SetRadarDisabled(target, ownerTag, false); SkillUtils.SetRadarDisabled(target, ownerTag, false);
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime()) if (target.PawnIsAlive)
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("glitch_disable_info")); target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("glitch_disable_info"));
} }
glitchedPlayers.TryRemove(targetIndex, out _); glitchedPlayers.TryRemove(targetIndex, out _);

View file

@ -331,6 +331,8 @@ namespace src.player.skills
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo) 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) if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null)
return; return;

View file

@ -185,6 +185,8 @@ namespace src.player.skills
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo) 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) if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
return; return;

View file

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

View file

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

View file

@ -41,9 +41,16 @@ namespace src.player.skills
var player = PlayerManager.GetPlayerEvent(@event.Userid); var player = PlayerManager.GetPlayerEvent(@event.Userid);
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
if (!bannedPlayers.TryGetValue(player.Index, out _)) 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() public static void OnTick()
{ {
if (bannedPlayers.IsEmpty) return; if (bannedPlayers.IsEmpty) return;
@ -59,8 +66,8 @@ namespace src.player.skills
var pawn = player.PlayerPawn.Value; var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid) continue; if (pawn == null || !pawn.IsValid) continue;
if (time > Server.TickCount) if (time > Server.TickCount && pawn.AbsVelocity != null && pawn.AbsVelocity.Z > -300)
pawn.AbsVelocity.Z = -100; pawn.AbsVelocity.Z = -300;
} }
if (Server.TickCount % 32 != 0) return; if (Server.TickCount % 32 != 0) return;
@ -149,7 +156,7 @@ namespace src.player.skills
bannedPlayers.TryRemove(targetIndex, out _); bannedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex)); 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")); 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.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.utils; using src.utils;
@ -153,7 +153,7 @@ namespace src.player.skills
cursedPlayers.TryRemove(targetIndex, out _); cursedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)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("jumpcurse_disable_info")); 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.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.utils; using src.utils;
@ -168,7 +168,7 @@ namespace src.player.skills
Utilities.SetStateChanged(target, "CBasePlayerController", "m_iDesiredFOV"); Utilities.SetStateChanged(target, "CBasePlayerController", "m_iDesiredFOV");
} }
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime()) if (target.PawnIsAlive)
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("magnifier_disable_info")); target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("magnifier_disable_info"));
} }
playersWithFov.TryRemove(targetIndex, out _); playersWithFov.TryRemove(targetIndex, out _);

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Core.Attributes;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
@ -147,7 +147,7 @@ namespace src.player.skills
RemoveVolume(targetIndex); RemoveVolume(targetIndex);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)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")); target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("nightmare_disable_info"));
} }

View file

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

View file

@ -1,4 +1,4 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
@ -171,7 +171,7 @@ namespace src.player.skills
targetToPlayer.TryRemove(targetIndex, out _); targetToPlayer.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)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("poison_disable_info")); 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.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
@ -142,7 +142,7 @@ namespace src.player.skills
bannedPlayers.TryRemove(targetIndex, out _); bannedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)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("primaryban_disable_info")); target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("primaryban_disable_info"));
SetWeaponAttack(target, false); SetWeaponAttack(target, false);

View file

@ -138,6 +138,8 @@ namespace src.player.skills
public static void OnTakeDamage(CBaseEntity damagedEntity, CTakeDamageInfo damageInfo) 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) if (damagedEntity == null || damagedEntity.Entity == null || damageInfo == null || damageInfo.Attacker == null || damageInfo.Attacker.Value == null)
return; return;

View file

@ -77,7 +77,7 @@ namespace src.player.skills
List<CCSPlayerController> allowed = []; List<CCSPlayerController> allowed = [];
if (emitter != null) if (emitter != null && CanEmit(emitter, out _))
foreach (var recipient in um.Recipients) foreach (var recipient in um.Recipients)
{ {
if (recipient == null || !recipient.IsValid) continue; if (recipient == null || !recipient.IsValid) continue;
@ -110,23 +110,47 @@ namespace src.player.skills
float volume = SkillsInfo.GetValue<float>(skillName, "soundVolume"); float volume = SkillsInfo.GetValue<float>(skillName, "soundVolume");
foreach (var player in PlayerManager.GetTickPlayers() 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))
{ {
if (!CanEmit(player, out var pawn)) continue;
var entities = EntityManager.GetPlayerEntities(player.Index, "empty_prop"); var entities = EntityManager.GetPlayerEntities(player.Index, "empty_prop");
if (entities.Count == 0) if (entities.Count == 0)
{ {
player.PlayerPawn.Value!.EmitSound(soundEventName, volume: volume); pawn!.EmitSound(soundEventName, volume: volume);
continue; continue;
} }
var entity = Utilities.GetEntityFromIndex<CDynamicProp>((int)entities[0]); 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); 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 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; 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.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.utils; using src.utils;
@ -59,7 +59,7 @@ namespace src.player.skills
infectedPlayers.TryRemove(targetIndex, out _); infectedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)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("wildthrow_disable_info")}"); target.PrintToChat($" {ChatColors.Green}{target.GetTranslation("wildthrow_disable_info")}");
} }