v1.2.2.b4

- #### General:
    - ###### Updated the GitHub source code to implement the changes introduced in merge request (https://github.com/Juzlus/jRandomSkills/pull/32).

- #### Skill improvements:
    - ###### Ninja:
        - ###### Removed debug chat messages that were used for testing.
This commit is contained in:
Juzlus 2026-06-29 16:10:59 +02:00
parent 36bd85ef06
commit 42e5453fd4
25 changed files with 212 additions and 268 deletions

View file

@ -46,7 +46,7 @@ namespace src.player
Instance.RegisterEventHandler<EventPlayerSpawned>(PlayerSpawned);
Instance.RegisterEventHandler<EventRoundStart>(RoundStart);
Instance.RegisterEventHandler<EventRoundEnd>(RoundEnd);
Instance.RegisterEventHandler<EventPlayerDeath>(PlayerDeath);
Instance.RegisterEventHandler<EventPlayerBlind>(PlayerBlind);
Instance.RegisterEventHandler<EventPlayerHurt>(PlayerHurt);
@ -138,17 +138,21 @@ namespace src.player
return candidates[Random.Shared.Next(candidates.Count)];
}
private static void DispatchToActiveSkills(string methodName, params object[] args)
{
var seen = new HashSet<Skills>();
foreach (var p in Instance.SkillPlayer)
{
if (p.IsDrawing || !seen.Add(p.Skill)) continue;
Instance.SkillAction(p.Skill.ToString(), methodName, args);
}
}
private static HookResult PlayerMakeSound(UserMessage um)
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "PlayerMakeSound", [um]);
DispatchToActiveSkills("PlayerMakeSound", um);
return HookResult.Continue;
}
}
@ -157,13 +161,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "WeaponFire", [@event]);
DispatchToActiveSkills("WeaponFire", @event);
return HookResult.Continue;
}
}
@ -172,13 +170,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "WeaponEquip", [@event]);
DispatchToActiveSkills("WeaponEquip", @event);
return HookResult.Continue;
}
}
@ -187,13 +179,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "WeaponPickup", [@event]);
DispatchToActiveSkills("WeaponPickup", @event);
return HookResult.Continue;
}
}
@ -202,13 +188,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "WeaponReload", [@event]);
DispatchToActiveSkills("WeaponReload", @event);
return HookResult.Continue;
}
}
@ -217,13 +197,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "GrenadeThrown", [@event]);
DispatchToActiveSkills("GrenadeThrown", @event);
return HookResult.Continue;
}
}
@ -232,13 +206,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "BombBeginplant", [@event]);
DispatchToActiveSkills("BombBeginplant", @event);
return HookResult.Continue;
}
}
@ -247,13 +215,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "BombAbortplant", [@event]);
DispatchToActiveSkills("BombAbortplant", @event);
return HookResult.Continue;
}
}
@ -262,13 +224,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "BombPlanted", [@event]);
DispatchToActiveSkills("BombPlanted", @event);
return HookResult.Continue;
}
}
@ -277,13 +233,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "BombBegindefuse", [@event]);
DispatchToActiveSkills("BombBegindefuse", @event);
return HookResult.Continue;
}
}
@ -292,13 +242,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "DecoyStarted", [@event]);
DispatchToActiveSkills("DecoyStarted", @event);
return HookResult.Continue;
}
}
@ -307,13 +251,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "DecoyDetonate", [@event]);
DispatchToActiveSkills("DecoyDetonate", @event);
return HookResult.Continue;
}
}
@ -322,13 +260,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "SmokegrenadeDetonate", [@event]);
DispatchToActiveSkills("SmokegrenadeDetonate", @event);
return HookResult.Continue;
}
}
@ -337,13 +269,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "SmokegrenadeExpired", [@event]);
DispatchToActiveSkills("SmokegrenadeExpired", @event);
return HookResult.Continue;
}
}
@ -352,13 +278,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "PlayerHurt", [@event]);
DispatchToActiveSkills("PlayerHurt", @event);
return HookResult.Continue;
}
}
@ -367,13 +287,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "PlayerJump", [@event]);
DispatchToActiveSkills("PlayerJump", @event);
return HookResult.Continue;
}
}
@ -391,13 +305,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "PlayerBlind", [@event]);
DispatchToActiveSkills("PlayerBlind", @event);
return HookResult.Continue;
}
}
@ -406,15 +314,10 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
DispatchToActiveSkills("OnTakeDamage", h);
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "OnTakeDamage", [h]);
if (Fortnite.skillInThisRound == true && !activeSkills.Any(s => s == "Fortnite"))
if (Fortnite.skillInThisRound == true &&
!Instance.SkillPlayer.Any(p => !p.IsDrawing && p.Skill == Skills.Fortnite))
Instance.SkillAction("Fortnite", "OnTakeDamage", [h]);
return HookResult.Continue;
@ -428,13 +331,7 @@ namespace src.player
CBaseTrigger trigger = hook.GetParam<CBaseTrigger>(0);
CBaseEntity entity = hook.GetParam<CBaseEntity>(1);
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "OnTriggerEnter", [trigger, entity]);
DispatchToActiveSkills("OnTriggerEnter", trigger, entity);
return HookResult.Continue;
}
}
@ -446,13 +343,7 @@ namespace src.player
CBaseTrigger trigger = hook.GetParam<CBaseTrigger>(0);
CBaseEntity entity = hook.GetParam<CBaseEntity>(1);
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "OnTriggerExit", [trigger, entity]);
DispatchToActiveSkills("OnTriggerExit", trigger, entity);
return HookResult.Continue;
}
}
@ -539,9 +430,9 @@ namespace src.player
foreach (var skill in activeSkills)
if (SkillsInfo.GetValue<bool>(skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime())
continue;
else
Instance.SkillAction(skill.ToString(), "OnTick");
continue;
else
Instance.SkillAction(skill.ToString(), "OnTick");
}
}
@ -555,6 +446,13 @@ namespace src.player
if (player.IsBot && !Config.LoadedConfig.EnableBotSkills)
return;
var existing = Instance.SkillPlayer.FirstOrDefault(p => p.PlayerIndex == player.Index);
if (existing != null)
{
PlayerManager.Register(existing);
return;
}
var playerInfo = new jSkill_PlayerInfo
{
IsBot = player.IsBot,
@ -617,11 +515,11 @@ namespace src.player
{
var userID = @event.Userid;
if (userID == 0 || string.IsNullOrEmpty(@event.Text)) return HookResult.Continue;
string text = @event.Text.Split(' ')[0].Trim();
string commandName = text.StartsWith('!') || text.StartsWith('/') ? text[1..] : text;
var player = Utilities.GetPlayerFromUserid(userID);
if (player == null || !player.IsValid) return HookResult.Continue;
@ -630,7 +528,7 @@ namespace src.player
var temp = skillPlayer.SkillHudExpired;
skillPlayer.SkillHudExpired = DateTime.MinValue;
;
;
Instance.AddTimer(5f, () =>
{
if (skillPlayer.SkillHudExpired == DateTime.MinValue)
@ -709,7 +607,6 @@ namespace src.player
if (playerInfo == null) continue;
Instance.SkillAction(playerInfo.Skill.ToString(), "DisableSkill", [player]);
Instance.SkillAction(playerInfo.Skill.ToString(), "NewRound");
playerInfo.Skill = noneSkill.Skill;
playerInfo.SpecialSkill = noneSkill.Skill;
@ -719,6 +616,9 @@ namespace src.player
RestorePlayer(player);
}
foreach (var skill in SkillData.Skills)
Instance.SkillAction(skill.Skill.ToString(), "NewRound");
}
}
@ -743,23 +643,24 @@ namespace src.player
lock (setLock)
{
isTransmitRegistered = false;
Instance.AddTimer(.1f, () => {
DisableAll();
ConVar.Find("sv_legacy_jump")?.SetValue("1");
}, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE);
Instance.RemoveListener<CheckTransmit>(CheckTransmit);
Fortnite.skillInThisRound = false;
EntityManager.DestroyAllTracked();
foreach (var skill in SkillData.Skills)
Instance.SkillAction(skill.Skill.ToString(), "NewRound");
playersSkills.Clear();
staticSkills.Clear();
ctSkill = noneSkill;
tSkill = noneSkill;
allSkill = noneSkill;
Instance.SkillPlayer.Clear();
PlayerManager.Clear();
ConVar.Find("sv_legacy_jump")?.SetValue("1");
}
}
@ -813,13 +714,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "PlayerDeath", [@event]);
DispatchToActiveSkills("PlayerDeath", @event);
var victim = PlayerManager.GetPlayerEvent(@event.Userid);
var attacker = PlayerManager.GetPlayerEvent(@event.Attacker);
@ -840,7 +735,7 @@ namespace src.player
if (skillData == null || specialSkillData == null) return HookResult.Continue;
string skillDesc = victim.GetSkillDescription(skillData.Skill);
SkillUtils.PrintToChat(victim,
SkillUtils.PrintToChat(victim,
$"{ChatColors.DarkRed}{(attackerInfo.SpecialSkill == Skills.None ? victim.GetSkillName(skillData.Skill) : $"{victim.GetSkillName(specialSkillData.Skill)} -> {victim.GetSkillName(skillData.Skill)}")}{ChatColors.Lime} - {skillDesc}",
title: $"{victim.GetTranslation("enemy_skill")} {ChatColors.DarkRed}\u202A{attacker.PlayerName}\u202C{ChatColors.Lime}");
}
@ -858,11 +753,13 @@ namespace src.player
string? button = Config.LoadedConfig.AlternativeSkillButton;
if (string.IsNullOrEmpty(button) || button.Length < 2) return;
string buttonName = $"{char.ToUpper(button[0])}{button[1..].ToLower()}";
string buttonName = $"{char.ToUpperInvariant(button[0])}{button[1..].ToLowerInvariant()}";
if (!Enum.TryParse<PlayerButtons>(buttonName, out var skillButton)) return;
if ((pressed & skillButton) == 0) return;
if (SkillUtils.HasMenu(player)) return;
var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
if (playerInfo == null || playerInfo.IsDrawing) return;
@ -903,13 +800,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "OnEntitySpawned", [entity]);
DispatchToActiveSkills("OnEntitySpawned", entity);
}
}
@ -917,13 +808,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "BulletImpact", [@event]);
DispatchToActiveSkills("BulletImpact", @event);
return HookResult.Continue;
}
}
@ -1059,7 +944,7 @@ namespace src.player
Instance?.AddTimer(.2f, () =>
{
if(player == null || !player.IsValid) return;
if (player == null || !player.IsValid) return;
if (randomSkill.Display)
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(randomSkill.Skill)}{ChatColors.Lime}: {player.GetSkillDescription(randomSkill.Skill)}",
@ -1084,7 +969,7 @@ namespace src.player
float descriptionHudExpired = Config.LoadedConfig.SkillDescriptionDuration;
skillPlayer.SkillDescriptionHudExpired = descriptionHudExpired == -1 ? DateTime.MaxValue : DateTime.Now.AddSeconds(descriptionHudExpired);
if (Config.LoadedConfig.TeamMateSkillChatInfo)
{
Instance?.AddTimer(.6f, () =>
@ -1200,6 +1085,7 @@ namespace src.player
}
}
Instance?.SkillAction(skillPlayer.Skill.ToString(), "DisableSkill", [player]);
skillPlayer.Skill = randomSkill.Skill;
skillPlayer.SpecialSkill = Skills.None;
@ -1231,13 +1117,7 @@ namespace src.player
{
lock (setLock)
{
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
foreach (string skillName in activeSkills)
Instance.SkillAction(skillName, "CheckTransmit", [infoList]);
DispatchToActiveSkills("CheckTransmit", infoList);
}
}
@ -1285,4 +1165,4 @@ namespace src.player
public static DateTime GetFreezeTimeEnd() => freezeTimeEnd;
}
}
}

View file

@ -63,6 +63,10 @@ namespace src.player.skills
playerInfo.SkillUsed = true;
playersToTarget[player.Index] = targetSite.Index;
string siteLetter = site == 0 ? "A" : "B";
foreach (var ct in Utilities.GetPlayers().Where(p => p != null && p.IsValid && !p.IsHLTV && p.Team == CsTeam.CounterTerrorist))
ct.PrintToChat($" {ChatColors.Green}" + ct.GetTranslation("areareaper_teammates_info", siteLetter));
}
}
}

View file

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

View file

@ -123,6 +123,7 @@ namespace src.player.skills
public static void DisableSkill(CCSPlayerController player)
{
if (playersToTarget.TryRemove(player.Index, out uint targetIndex))
{
deafPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));

View file

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

View file

@ -131,6 +131,7 @@ namespace src.player.skills
return;
if (playersToTarget.TryRemove(player.Index, out uint targetIndex))
{
bannedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));

View file

@ -134,11 +134,16 @@ namespace src.player.skills
{
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
if (target != null && target.IsValid)
{
if (playersFOV.TryGetValue(targetIndex, out uint fov))
{
target.DesiredFOV = fov;
Utilities.SetStateChanged(target, "CBasePlayerController", "m_iDesiredFOV");
}
if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("magnifier_disable_info"));
}
playersFOV.TryRemove(targetIndex, out _);
}

View file

@ -184,8 +184,6 @@ namespace src.player.skills
if (player.PlayerPawn?.Value?.Health <= 0)
return;
Server.PrintToChatAll($"Update ninja for {player.PlayerName}");
var playerEvent = PlayerManager.GetPlayerEvent(player);
if (playerEvent == null || !playerEvent.IsValid) return;

View file

@ -130,6 +130,7 @@ namespace src.player.skills
public static void DisableSkill(CCSPlayerController player)
{
if (playersToTarget.TryRemove(player.Index, out uint targetIndex))
{
poisonedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));

View file

@ -132,6 +132,7 @@ namespace src.player.skills
public static void DisableSkill(CCSPlayerController player)
{
if (playersToTarget.TryRemove(player.Index, out uint targetIndex))
{
bannedPlayers.TryRemove(targetIndex, out _);
var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));

View file

@ -112,7 +112,10 @@ namespace src.player.skills
playersInAction.TryRemove(player.Index, out _);
if (playersInAction.IsEmpty)
{
NewRound();
return;
}
SkillUtils.ForceFullUpdateToAll();
}