This commit is contained in:
Juzlus 2025-09-24 03:18:32 +02:00
parent 04a4fdce0d
commit ac53655184
129 changed files with 1087 additions and 978 deletions

View file

@ -0,0 +1,12 @@
// This file is used by Code Analysis to maintain SuppressMessage
// attributes that are applied to this project.
// Project-level suppressions either have no target or are given
// a specific target and scoped to a namespace, type, member, etc.
using System.Diagnostics.CodeAnalysis;
[assembly: SuppressMessage("Style", "IDE1006:Style nazewnictwa", Justification = "<Oczekujące>", Scope = "type", Target = "~T:src.jRandomSkills")]
[assembly: SuppressMessage("Performance", "CA1822:Oznaczaj elementy członkowskie jako statyczne", Justification = "<Oczekujące>", Scope = "member", Target = "~M:src.jRandomSkills.SkillAction(System.String,System.String,System.Object[])")]
[assembly: SuppressMessage("Performance", "CA1822:Oznaczaj elementy członkowskie jako statyczne", Justification = "<Oczekujące>", Scope = "member", Target = "~M:src.jRandomSkills.IsPlayerValid(CounterStrikeSharp.API.Core.CCSPlayerController)~System.Boolean")]
[assembly: SuppressMessage("Style", "IDE1006:Style nazewnictwa", Justification = "<Oczekujące>", Scope = "type", Target = "~T:src.jSkill_PlayerInfo")]
[assembly: SuppressMessage("Style", "IDE1006:Style nazewnictwa", Justification = "<Oczekujące>", Scope = "type", Target = "~T:src.jSkill_SkillInfo")]

View file

@ -8,7 +8,7 @@
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace jRandomSkills.Properties { namespace src.player.skills.Properties {
using System; using System;

View file

@ -4,11 +4,13 @@ using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.utils; using src.menu;
using src.player;
using src.utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.command
{ {
public static class Command public static class Command
{ {
@ -24,7 +26,7 @@ namespace jRandomSkills
lock (setLock) lock (setLock)
{ {
if (oldCommands.Count != 0) if (!oldCommands.IsEmpty)
{ {
foreach (var command in oldCommands) foreach (var command in oldCommands)
Instance.RemoveCommand(command.Key, command.Value); Instance.RemoveCommand(command.Key, command.Value);
@ -119,7 +121,7 @@ namespace jRandomSkills
} }
var skillName = command.ArgCount > 3 ? $"{command.GetArg(2)} {command.GetArg(3)}" : command.GetArg(2); var skillName = command.ArgCount > 3 ? $"{command.GetArg(2)} {command.GetArg(3)}" : command.GetArg(2);
var skill = SkillData.Skills.FirstOrDefault(s => (player != null && player.GetSkillName(s.Skill).Equals(skillName, StringComparison.OrdinalIgnoreCase)) || s.Skill.ToString().Equals(skillName, StringComparison.OrdinalIgnoreCase)); var skill = SkillData.Skills.FirstOrDefault(s => player != null && player.GetSkillName(s.Skill).Equals(skillName, StringComparison.OrdinalIgnoreCase) || s.Skill.ToString().Equals(skillName, StringComparison.OrdinalIgnoreCase));
if (skill == null) if (skill == null)
{ {
@ -281,7 +283,7 @@ namespace jRandomSkills
private static void Shuffle() private static void Shuffle()
{ {
var players = Utilities.GetPlayers().FindAll(p => (Instance.IsPlayerValid(p) && new CsTeam[] { CsTeam.CounterTerrorist, CsTeam.Terrorist }.Contains(p.Team))); var players = Utilities.GetPlayers().FindAll(p => Instance.IsPlayerValid(p) && new CsTeam[] { CsTeam.CounterTerrorist, CsTeam.Terrorist }.Contains(p.Team));
double CTlimit = Instance.Random.Next(0, 2) == 0 ? Math.Floor(players.Count / 2.0) : Math.Ceiling(players.Count / 2.0); double CTlimit = Instance.Random.Next(0, 2) == 0 ? Math.Floor(players.Count / 2.0) : Math.Ceiling(players.Count / 2.0);
foreach (var player in players.OrderBy(_ => Instance.Random.Next()).ToList()) foreach (var player in players.OrderBy(_ => Instance.Random.Next()).ToList())
@ -394,7 +396,7 @@ namespace jRandomSkills
} }
var skillName = command.ArgCount > 3 ? $"{command.GetArg(2)} {command.GetArg(3)}" : command.GetArg(2); var skillName = command.ArgCount > 3 ? $"{command.GetArg(2)} {command.GetArg(3)}" : command.GetArg(2);
var skill = SkillData.Skills.FirstOrDefault(s => (player != null && player.GetSkillName(s.Skill).Equals(skillName, StringComparison.OrdinalIgnoreCase)) || s.Skill.ToString().Equals(skillName, StringComparison.OrdinalIgnoreCase)); var skill = SkillData.Skills.FirstOrDefault(s => player != null && player.GetSkillName(s.Skill).Equals(skillName, StringComparison.OrdinalIgnoreCase) || s.Skill.ToString().Equals(skillName, StringComparison.OrdinalIgnoreCase));
if (skill == null) if (skill == null)
{ {
@ -458,7 +460,7 @@ namespace jRandomSkills
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
if (!AdminManager.PlayerHasPermissions(player, config.NormalCommands.ChangeLanguageCommand.Permissions)) return; if (!AdminManager.PlayerHasPermissions(player, config.NormalCommands.ChangeLanguageCommand.Permissions)) return;
string fileName = Config.LoadedConfig.LanguageSystem.DefaultLangCode; string fileName;
string newLangCode = command.GetArg(1).ToUpper(); string newLangCode = command.GetArg(1).ToUpper();
foreach (var langInfo in Config.LoadedConfig.LanguageSystem.LanguageInfos) foreach (var langInfo in Config.LoadedConfig.LanguageSystem.LanguageInfos)
if (langInfo.IsoCodes.Contains(newLangCode)) if (langInfo.IsoCodes.Contains(newLangCode))
@ -481,7 +483,7 @@ namespace jRandomSkills
Config.LoadConfig(); Config.LoadConfig();
SkillsInfo.LoadSkillsInfo(); SkillsInfo.LoadSkillsInfo();
Localization.Load(); Localization.Load();
Command.Load(); Load();
foreach (var skill in SkillData.Skills) foreach (var skill in SkillData.Skills)
skill.Color = SkillsInfo.GetValue<string>(skill.Skill, "color"); skill.Color = SkillsInfo.GetValue<string>(skill.Skill, "color");

View file

@ -1,10 +1,10 @@
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 src.utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
namespace jRandomSkills namespace src.command
{ {
public static class VoteSystem public static class VoteSystem
{ {

View file

@ -2,20 +2,21 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Commands; using CounterStrikeSharp.API.Core.Commands;
using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands;
using jRandomSkills.src.player; using src.command;
using jRandomSkills.src.utils; using src.player;
using src.utils;
using System.Collections.Concurrent;
using System.Reflection; using System.Reflection;
using WASDSharedAPI; using WASDSharedAPI;
namespace jRandomSkills namespace src
{ {
#pragma warning disable IDE1006 // Style nazewnictwa
public partial class jRandomSkills : BasePlugin public partial class jRandomSkills : BasePlugin
#pragma warning restore IDE1006 // Style nazewnictwa
{ {
#pragma warning disable CS8618
public static jRandomSkills Instance { get; private set; } public static jRandomSkills Instance { get; private set; }
#pragma warning restore CS8618
public List<jSkill_PlayerInfo> SkillPlayer { get; } = []; public ConcurrentBag<jSkill_PlayerInfo> SkillPlayer { get; set; } = [];
public Random Random { get; } = new Random(); public Random Random { get; } = new Random();
public CCSGameRules? GameRules { get; set; } public CCSGameRules? GameRules { get; set; }
public IWasdMenuManager? MenuManager; public IWasdMenuManager? MenuManager;
@ -53,9 +54,7 @@ namespace jRandomSkills
Debug.WriteToDebug($"Loaded: {skill.Skill}"); Debug.WriteToDebug($"Loaded: {skill.Skill}");
} }
#pragma warning disable CA1822 // Oznaczaj elementy członkowskie jako statyczne
internal void SkillAction(string skill, string methodName, object[]? param = null) internal void SkillAction(string skill, string methodName, object[]? param = null)
#pragma warning restore CA1822 // Oznaczaj elementy członkowskie jako statyczne
{ {
string className = $"jRandomSkills.{skill}"; string className = $"jRandomSkills.{skill}";
Type? type = Type.GetType(className); Type? type = Type.GetType(className);
@ -86,9 +85,7 @@ namespace jRandomSkills
CommandManager.RegisterCommand(definition); CommandManager.RegisterCommand(definition);
} }
#pragma warning disable CA1822 // Oznaczaj elementy członkowskie jako statyczne
internal bool IsPlayerValid(CCSPlayerController? player) internal bool IsPlayerValid(CCSPlayerController? player)
#pragma warning restore CA1822 // Oznaczaj elementy członkowskie jako statyczne
{ {
return player != null && player.IsValid && player.PlayerPawn?.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.LifeState == (byte)LifeState_t.LIFE_ALIVE; return player != null && player.IsValid && player.PlayerPawn?.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.LifeState == (byte)LifeState_t.LIFE_ALIVE;
} }
@ -97,9 +94,7 @@ namespace jRandomSkills
public uint[] silentSoundEvents = [2551626319, 765706800, 765706800, 2860219006, 2162652424, 2551626319, 2162652424, 117596568, 117596568, 740474905, 1661204257, 3009312615, 1506215040, 115843229, 3299941720, 1016523349, 2684452812, 2067683805, 2067683805, 1016523349, 4160462271, 1543118744, 585390608, 3802757032, 2302139631, 2546391140, 144629619, 4152012084, 4113422219, 1627020521, 2899365092, 819435812, 3218103073, 961838155, 1535891875, 1826799645, 3460445620, 1818046345, 3666896632, 3099536373, 1440734007, 1409986305, 1939055066, 782454593, 4074593561, 1540837791, 3257325156]; public uint[] silentSoundEvents = [2551626319, 765706800, 765706800, 2860219006, 2162652424, 2551626319, 2162652424, 117596568, 117596568, 740474905, 1661204257, 3009312615, 1506215040, 115843229, 3299941720, 1016523349, 2684452812, 2067683805, 2067683805, 1016523349, 4160462271, 1543118744, 585390608, 3802757032, 2302139631, 2546391140, 144629619, 4152012084, 4113422219, 1627020521, 2899365092, 819435812, 3218103073, 961838155, 1535891875, 1826799645, 3460445620, 1818046345, 3666896632, 3099536373, 1440734007, 1409986305, 1939055066, 782454593, 4074593561, 1540837791, 3257325156];
} }
#pragma warning disable IDE1006
public class jSkill_PlayerInfo public class jSkill_PlayerInfo
#pragma warning restore IDE1006
{ {
public required ulong SteamID { get; set; } public required ulong SteamID { get; set; }
public required string PlayerName { get; set; } public required string PlayerName { get; set; }
@ -111,9 +106,7 @@ namespace jRandomSkills
public string? PrintHTML { get; set; } public string? PrintHTML { get; set; }
} }
#pragma warning disable IDE1006
public class jSkill_SkillInfo(Skills skill, string color, bool display) public class jSkill_SkillInfo(Skills skill, string color, bool display)
#pragma warning restore IDE1006
{ {
public Skills Skill { get; } = skill; public Skills Skill { get; } = skill;
public string Color { get; set; } = color; public string Color { get; set; } = color;
@ -127,6 +120,6 @@ namespace jRandomSkills
public static class SkillData public static class SkillData
{ {
public static List<jSkill_SkillInfo> Skills { get; } = []; public static ConcurrentBag<jSkill_SkillInfo> Skills { get; } = [];
} }
} }

View file

@ -1,30 +1,28 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Menu; using CounterStrikeSharp.API.Modules.Menu;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using jRandomSkills.src.utils; using src.utils;
namespace jRandomSkills namespace src.menu
{ {
public static class Menu public static class Menu
{ {
public static void DisplaySkillsList(CCSPlayerController player) public static void DisplaySkillsList(CCSPlayerController player)
{ {
CenterHtmlMenu menu = new($"[ ★ {player.GetTranslation("skills_menu")} ★ ]"); CenterHtmlMenu menu = new($"[ ★ {player.GetTranslation("skills_menu")} ★ ]", Instance);
for (int i = 0; i < SkillData.Skills.Count; i++) foreach (var skillInfo in SkillData.Skills)
{ {
var skill = SkillData.Skills[i]; string skillName = $"{player.GetSkillName(skillInfo.Skill)}";
string skillName = $"{player.GetSkillName(skill.Skill)}";
menu.AddMenuOption($" ★ {skillName}", (player, option) => menu.AddMenuOption($" ★ {skillName}", (player, option) =>
{ {
string selectedSkillName = option.Text; string selectedSkillName = option.Text;
string pattern = "\\[/?color\\b[^\\]]*\\]"; string pattern = "\\[/?color\\b[^\\]]*\\]";
string cleanSkillName = Regex.Replace(selectedSkillName, pattern, ""); string cleanSkillName = Regex.Replace(selectedSkillName, pattern, "");
string skillName = cleanSkillName.Replace($" ★ ", ""); string skillName = cleanSkillName.Replace($" ★ ", "");
int intValue = Array.IndexOf(SkillData.Skills.Select(r => player.GetSkillName(r.Skill)).ToArray(), skillName); string skillDesc = player.GetSkillDescription(skillInfo.Skill);
string skillDesc = player.GetSkillDescription(SkillData.Skills[intValue].Skill);
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{skillName}{ChatColors.Lime}: {skillDesc}", false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{skillName}{ChatColors.Lime}: {skillDesc}", false);
MenuManager.CloseActiveMenu(player); MenuManager.CloseActiveMenu(player);
}); });

View file

@ -3,10 +3,11 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
using static CounterStrikeSharp.API.Core.Listeners; using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player
{ {
public static class Debug public static class Debug
{ {
@ -15,12 +16,12 @@ namespace jRandomSkills
public static void Load() public static void Load()
{ {
Debug.sessionId = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}"; sessionId = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}";
Instance.RegisterEventHandler<EventPlayerConnectFull>((@event, info) => Instance.RegisterEventHandler<EventPlayerConnectFull>((@event, info) =>
{ {
var player = @event.Userid; var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue; if (player == null || !player.IsValid) return HookResult.Continue;
Debug.WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} joined the game."); WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} joined the game.");
return HookResult.Continue; return HookResult.Continue;
}); });
@ -28,7 +29,7 @@ namespace jRandomSkills
{ {
var player = @event.Userid; var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue; if (player == null || !player.IsValid) return HookResult.Continue;
Debug.WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} disconnected."); WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} disconnected.");
return HookResult.Continue; return HookResult.Continue;
}); });
@ -37,13 +38,13 @@ namespace jRandomSkills
var teams = Utilities.FindAllEntitiesByDesignerName<CCSTeam>("cs_team_manager").Where(t => t != null).ToList(); var teams = Utilities.FindAllEntitiesByDesignerName<CCSTeam>("cs_team_manager").Where(t => t != null).ToList();
var tTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.Terrorist); var tTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.Terrorist);
var ctTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.CounterTerrorist); var ctTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.CounterTerrorist);
Debug.WriteToDebug($"Round #{tTeam?.Score + ctTeam?.Score + 1} (CT {ctTeam?.Score} : {tTeam?.Score} TT) started."); WriteToDebug($"Round #{tTeam?.Score + ctTeam?.Score + 1} (CT {ctTeam?.Score} : {tTeam?.Score} TT) started.");
return HookResult.Continue; return HookResult.Continue;
}); });
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
Debug.WriteToDebug($"Freeze time ended."); WriteToDebug($"Freeze time ended.");
return HookResult.Continue; return HookResult.Continue;
}); });
@ -52,7 +53,7 @@ namespace jRandomSkills
var teams = Utilities.FindAllEntitiesByDesignerName<CCSTeam>("cs_team_manager").Where(t => t != null).ToList(); var teams = Utilities.FindAllEntitiesByDesignerName<CCSTeam>("cs_team_manager").Where(t => t != null).ToList();
var tTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.Terrorist); var tTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.Terrorist);
var ctTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.CounterTerrorist); var ctTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.CounterTerrorist);
Debug.WriteToDebug($"Round #{tTeam?.Score + ctTeam?.Score} (CT {ctTeam?.Score} : {tTeam?.Score} TT) ended."); WriteToDebug($"Round #{tTeam?.Score + ctTeam?.Score} (CT {ctTeam?.Score} : {tTeam?.Score} TT) ended.");
return HookResult.Continue; return HookResult.Continue;
}); });
@ -63,35 +64,35 @@ namespace jRandomSkills
if (victim != null) if (victim != null)
{ {
if (attacker != null) if (attacker != null)
Debug.WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} died from {(attacker.IsBot ? "bot" : "player")} {attacker.PlayerName}."); WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} died from {(attacker.IsBot ? "bot" : "player")} {attacker.PlayerName}.");
else else
Debug.WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} died."); WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} died.");
} }
return HookResult.Continue; return HookResult.Continue;
}); });
Instance.RegisterEventHandler<EventBombPlanted>((@event, info) => Instance.RegisterEventHandler<EventBombPlanted>((@event, info) =>
{ {
Debug.WriteToDebug($"Bomb planted."); WriteToDebug($"Bomb planted.");
return HookResult.Continue; return HookResult.Continue;
}); });
Instance.RegisterEventHandler<EventBombDefused>((@event, info) => Instance.RegisterEventHandler<EventBombDefused>((@event, info) =>
{ {
Debug.WriteToDebug($"Bomb defused."); WriteToDebug($"Bomb defused.");
return HookResult.Continue; return HookResult.Continue;
}); });
Instance.RegisterListener<OnMapStart>((string mapName) => Instance.RegisterListener<OnMapStart>((mapName) =>
{ {
Debug.WriteToDebug($"Map changed: {mapName}."); WriteToDebug($"Map changed: {mapName}.");
}); });
Instance.RegisterEventHandler<EventPlayerShoot>((@event, info) => Instance.RegisterEventHandler<EventPlayerShoot>((@event, info) =>
{ {
var player = @event.Userid; var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue; if (player == null || !player.IsValid) return HookResult.Continue;
Debug.WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} fired a shot."); WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} fired a shot.");
return HookResult.Continue; return HookResult.Continue;
}); });
@ -121,7 +122,7 @@ namespace jRandomSkills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
if (playerInfo == null) return HookResult.Continue; if (playerInfo == null) return HookResult.Continue;
Debug.WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} took damage from {(attacker.IsBot ? "bot" : "player")} {attacker.PlayerName}."); WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} took damage from {(attacker.IsBot ? "bot" : "player")} {attacker.PlayerName}.");
return HookResult.Continue; return HookResult.Continue;
} }

View file

@ -3,7 +3,7 @@ using CounterStrikeSharp.API.Core.Attributes;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.UserMessages;
namespace jRandomSkills.src.player; namespace src.player;
public interface ISkill public interface ISkill
{ {

View file

@ -6,32 +6,31 @@ using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.UserMessages;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners; using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player
{ {
public static partial class Event public static partial class Event
{ {
public static DateTime freezeTimeEnd = DateTime.MinValue; private static DateTime freezeTimeEnd = DateTime.MinValue;
public 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);
private static jSkill_SkillInfo ctSkill = noneSkill; private static jSkill_SkillInfo ctSkill = noneSkill;
private static jSkill_SkillInfo tSkill = noneSkill; private static jSkill_SkillInfo tSkill = noneSkill;
private static jSkill_SkillInfo allSkill = noneSkill; private static jSkill_SkillInfo allSkill = noneSkill;
private static List<jSkill_SkillInfo> debugSkills = new(SkillData.Skills); private static List<jSkill_SkillInfo> debugSkills = [.. SkillData.Skills];
public static readonly SkillsInfo.DefaultSkillInfo[] terroristSkills = SkillsInfo.LoadedConfig.Where(s => s.OnlyTeam == (int)CsTeam.Terrorist).ToArray(); public static readonly SkillsInfo.DefaultSkillInfo[] terroristSkills = [.. SkillsInfo.LoadedConfig.Where(s => s.OnlyTeam == (int)CsTeam.Terrorist)];
public static readonly SkillsInfo.DefaultSkillInfo[] counterterroristSkills = SkillsInfo.LoadedConfig.Where(s => s.OnlyTeam == (int)CsTeam.CounterTerrorist).ToArray(); public static readonly SkillsInfo.DefaultSkillInfo[] counterterroristSkills = [.. SkillsInfo.LoadedConfig.Where(s => s.OnlyTeam == (int)CsTeam.CounterTerrorist)];
private static readonly SkillsInfo.DefaultSkillInfo[] allTeamsSkills = SkillsInfo.LoadedConfig.Where(s => s.OnlyTeam == 0).ToArray(); private static readonly SkillsInfo.DefaultSkillInfo[] allTeamsSkills = [.. SkillsInfo.LoadedConfig.Where(s => s.OnlyTeam == 0)];
private static readonly ConcurrentDictionary<ulong, List<jSkill_SkillInfo>> playersSkills = []; private static readonly ConcurrentDictionary<ulong, ConcurrentBag<jSkill_SkillInfo>> playersSkills = [];
public static readonly ConcurrentDictionary<ulong, jSkill_SkillInfo> staticSkills = []; public static readonly ConcurrentDictionary<ulong, jSkill_SkillInfo> staticSkills = [];
private static readonly object setLock = new object(); private static readonly object setLock = new();
public static void Load() public static void Load()
{ {
@ -70,108 +69,147 @@ namespace jRandomSkills
} }
private static HookResult PlayerMakeSound(UserMessage um) private static HookResult PlayerMakeSound(UserMessage um)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerMakeSound", [um]); Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerMakeSound", [um]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult WeaponFire(EventWeaponFire @event, GameEventInfo info) private static HookResult WeaponFire(EventWeaponFire @event, GameEventInfo info)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponFire", [@event]); Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponFire", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult WeaponEquip(EventItemEquip @event, GameEventInfo info) private static HookResult WeaponEquip(EventItemEquip @event, GameEventInfo info)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponEquip", [@event]); Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponEquip", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult WeaponPickup(EventItemPickup @event, GameEventInfo info) private static HookResult WeaponPickup(EventItemPickup @event, GameEventInfo info)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponPickup", [@event]); Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponPickup", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult WeaponReload(EventWeaponReload @event, GameEventInfo info) private static HookResult WeaponReload(EventWeaponReload @event, GameEventInfo info)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponReload", [@event]); Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponReload", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult GrenadeThrown(EventGrenadeThrown @event, GameEventInfo info) private static HookResult GrenadeThrown(EventGrenadeThrown @event, GameEventInfo info)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "GrenadeThrown", [@event]); Instance.SkillAction(playerSkill.Skill.ToString(), "GrenadeThrown", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult BombBeginplant(EventBombBeginplant @event, GameEventInfo info) private static HookResult BombBeginplant(EventBombBeginplant @event, GameEventInfo info)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "BombBeginplant", [@event]); Instance.SkillAction(playerSkill.Skill.ToString(), "BombBeginplant", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult BombPlanted(EventBombPlanted @event, GameEventInfo info) private static HookResult BombPlanted(EventBombPlanted @event, GameEventInfo info)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "BombPlanted", [@event]); Instance.SkillAction(playerSkill.Skill.ToString(), "BombPlanted", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult BombBegindefuse(EventBombBegindefuse @event, GameEventInfo info) private static HookResult BombBegindefuse(EventBombBegindefuse @event, GameEventInfo info)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "BombBegindefuse", [@event]); Instance.SkillAction(playerSkill.Skill.ToString(), "BombBegindefuse", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult DecoyStarted(EventDecoyStarted @event, GameEventInfo info) private static HookResult DecoyStarted(EventDecoyStarted @event, GameEventInfo info)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "DecoyStarted", [@event]); Instance.SkillAction(playerSkill.Skill.ToString(), "DecoyStarted", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult DecoyDetonate(EventDecoyDetonate @event, GameEventInfo info) private static HookResult DecoyDetonate(EventDecoyDetonate @event, GameEventInfo info)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "DecoyDetonate", [@event]); Instance.SkillAction(playerSkill.Skill.ToString(), "DecoyDetonate", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult SmokegrenadeDetonate(EventSmokegrenadeDetonate @event, GameEventInfo info) private static HookResult SmokegrenadeDetonate(EventSmokegrenadeDetonate @event, GameEventInfo info)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "SmokegrenadeDetonate", [@event]); Instance.SkillAction(playerSkill.Skill.ToString(), "SmokegrenadeDetonate", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult SmokegrenadeExpired(EventSmokegrenadeExpired @event, GameEventInfo info) private static HookResult SmokegrenadeExpired(EventSmokegrenadeExpired @event, GameEventInfo info)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "SmokegrenadeExpired", [@event]); Instance.SkillAction(playerSkill.Skill.ToString(), "SmokegrenadeExpired", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult PlayerHurt(EventPlayerHurt @event, GameEventInfo info) private static HookResult PlayerHurt(EventPlayerHurt @event, GameEventInfo info)
{ {
@ -185,30 +223,41 @@ namespace jRandomSkills
} }
private static HookResult PlayerJump(EventPlayerJump @event, GameEventInfo info) private static HookResult PlayerJump(EventPlayerJump @event, GameEventInfo info)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerJump", [@event]); Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerJump", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult PlayerBlind(EventPlayerBlind @event, GameEventInfo info) private static HookResult PlayerBlind(EventPlayerBlind @event, GameEventInfo info)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerBlind", [@event]); Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerBlind", [@event]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult OnTakeDamage(DynamicHook h) private static HookResult OnTakeDamage(DynamicHook h)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "OnTakeDamage", [h]); Instance.SkillAction(playerSkill.Skill.ToString(), "OnTakeDamage", [h]);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static void OnTick() private static void OnTick()
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
@ -217,8 +266,11 @@ namespace jRandomSkills
else else
Instance.SkillAction(playerSkill.Skill.ToString(), "OnTick"); Instance.SkillAction(playerSkill.Skill.ToString(), "OnTick");
} }
}
private static HookResult PlayerConnectFull(EventPlayerConnectFull @event, GameEventInfo info) private static HookResult PlayerConnectFull(EventPlayerConnectFull @event, GameEventInfo info)
{
lock (setLock)
{ {
var player = @event.Userid; var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue; if (player == null || !player.IsValid) return HookResult.Continue;
@ -243,19 +295,28 @@ namespace jRandomSkills
.Replace("{AUTHOR2}", $" {ChatColors.Red}Juzlus{ChatColors.Green} ({ChatColors.Red}https://github.com/Juzlus/jRandomSkills{ChatColors.Green})", StringComparison.OrdinalIgnoreCase)); .Replace("{AUTHOR2}", $" {ChatColors.Red}Juzlus{ChatColors.Green} ({ChatColors.Red}https://github.com/Juzlus/jRandomSkills{ChatColors.Green})", StringComparison.OrdinalIgnoreCase));
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult PlayerDisconnect(EventPlayerDisconnect @event, GameEventInfo info) private static HookResult PlayerDisconnect(EventPlayerDisconnect @event, GameEventInfo info)
{
lock (setLock)
{ {
var player = @event.Userid; var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue; if (player == null || !player.IsValid) return HookResult.Continue;
var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (skillPlayer != null) if (skillPlayer == null) return HookResult.Continue;
Instance.SkillPlayer.Remove(skillPlayer);
var items = Instance.SkillPlayer.ToList();
Instance.SkillPlayer = [.. items.Where(p => p.SteamID != skillPlayer.SteamID)];
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult RoundStart(EventRoundStart @event, GameEventInfo info) private static HookResult RoundStart(EventRoundStart @event, GameEventInfo info)
{
lock (setLock)
{ {
isTransmitRegistered = false; isTransmitRegistered = false;
Instance.AddTimer(.1f, () => DisableAll()); Instance.AddTimer(.1f, () => DisableAll());
@ -273,8 +334,11 @@ namespace jRandomSkills
Instance?.AddTimer((Instance?.GameRules?.TeamIntroPeriod == true ? 7 : 0) + Math.Max(freezetime - Config.LoadedConfig.SkillTimeBeforeStart, 0) + .3f, SetSkill); Instance?.AddTimer((Instance?.GameRules?.TeamIntroPeriod == true ? 7 : 0) + Math.Max(freezetime - Config.LoadedConfig.SkillTimeBeforeStart, 0) + .3f, SetSkill);
return HookResult.Continue; return HookResult.Continue;
} }
}
private static void DisableAll() private static void DisableAll()
{
lock (setLock)
{ {
foreach (var player in Utilities.GetPlayers().Where(p => !p.IsBot)) foreach (var player in Utilities.GetPlayers().Where(p => !p.IsBot))
{ {
@ -284,14 +348,17 @@ namespace jRandomSkills
Instance.SkillAction(playerInfo.Skill.ToString(), "NewRound"); Instance.SkillAction(playerInfo.Skill.ToString(), "NewRound");
} }
} }
}
private static HookResult RoundEnd(EventRoundEnd @event, GameEventInfo info) private static HookResult RoundEnd(EventRoundEnd @event, GameEventInfo info)
{ {
foreach (var player in Utilities.GetPlayers()) lock (setLock)
{ {
Instance.AddTimer(0.5f, () => foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid))
{ {
var _players = Utilities.GetPlayers().Where(p => p.IsValid).OrderBy(p => p.Team); Instance.AddTimer(.5f, () =>
{
var _players = Utilities.GetPlayers().Where(p => p.IsValid && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist).OrderBy(p => p.Team);
string skillsText = ""; string skillsText = "";
foreach (var _player in _players) foreach (var _player in _players)
@ -320,6 +387,7 @@ namespace jRandomSkills
} }
return HookResult.Continue; return HookResult.Continue;
} }
}
private static HookResult PlayerDeath(EventPlayerDeath @event, GameEventInfo info) private static HookResult PlayerDeath(EventPlayerDeath @event, GameEventInfo info)
{ {
@ -357,6 +425,8 @@ namespace jRandomSkills
} }
private static void CheckUseSkill(CCSPlayerController player, PlayerButtons pressed, PlayerButtons released) private static void CheckUseSkill(CCSPlayerController player, PlayerButtons pressed, PlayerButtons released)
{
lock (setLock)
{ {
string? button = Config.LoadedConfig.AlternativeSkillButton; string? button = Config.LoadedConfig.AlternativeSkillButton;
if (string.IsNullOrEmpty(button)) return; if (string.IsNullOrEmpty(button)) return;
@ -364,7 +434,8 @@ namespace jRandomSkills
if (Enum.TryParse<PlayerButtons>(button, out var skillButton)) if (Enum.TryParse<PlayerButtons>(button, out var skillButton))
{ {
if (pressed != skillButton) return; if (pressed != skillButton) return;
} else return; }
else return;
if (player == null) return; if (player == null) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
@ -380,36 +451,42 @@ namespace jRandomSkills
Debug.WriteToDebug($"Player {player.PlayerName} used the skill: {playerInfo.Skill} by PlayerButtons: {pressed}"); Debug.WriteToDebug($"Player {player.PlayerName} used the skill: {playerInfo.Skill} by PlayerButtons: {pressed}");
Instance.SkillAction(playerInfo.Skill.ToString(), "UseSkill", [player]); Instance.SkillAction(playerInfo.Skill.ToString(), "UseSkill", [player]);
} }
}
private static void EntitySpawned(CEntityInstance entity) private static void EntitySpawned(CEntityInstance entity)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "OnEntitySpawned", [entity]); Instance.SkillAction(playerSkill.Skill.ToString(), "OnEntitySpawned", [entity]);
} }
}
private static void SetSkill() private static void SetSkill()
{ {
var validPlayers = Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p .Team is CsTeam.CounterTerrorist or CsTeam.Terrorist).ToList(); lock (setLock)
{
var validPlayers = Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist).ToList();
if (Config.LoadedConfig.GameMode == (int)Config.GameModes.TeamSkills) if (Config.LoadedConfig.GameMode == (int)Config.GameModes.TeamSkills)
{ {
List<jSkill_SkillInfo> tSkills = new(SkillData.Skills); List<jSkill_SkillInfo> tSkills = [.. SkillData.Skills];
tSkills.RemoveAll(s => s.Skill == tSkill.Skill || s.Skill == Skills.None || counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); tSkills.RemoveAll(s => s.Skill == tSkill.Skill || s.Skill == Skills.None || counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString()));
tSkill = tSkills.Count == 0 ? noneSkill : tSkills[Instance.Random.Next(tSkills.Count)]; tSkill = tSkills.Count == 0 ? noneSkill : tSkills[Instance.Random.Next(tSkills.Count)];
List<jSkill_SkillInfo> ctSkills = new(SkillData.Skills); List<jSkill_SkillInfo> ctSkills = [.. SkillData.Skills];
ctSkills.RemoveAll(s => s.Skill == ctSkill.Skill || s.Skill == Skills.None || terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); ctSkills.RemoveAll(s => s.Skill == ctSkill.Skill || s.Skill == Skills.None || terroristSkills.Any(s2 => s2.Name == s.Skill.ToString()));
ctSkill = ctSkills.Count == 0 ? noneSkill : ctSkills[Instance.Random.Next(ctSkills.Count)]; ctSkill = ctSkills.Count == 0 ? noneSkill : ctSkills[Instance.Random.Next(ctSkills.Count)];
} }
else if (Config.LoadedConfig.GameMode == (int)Config.GameModes.SameSkills) else if (Config.LoadedConfig.GameMode == (int)Config.GameModes.SameSkills)
{ {
List<jSkill_SkillInfo> allSkills = new(SkillData.Skills); List<jSkill_SkillInfo> allSkills = [.. SkillData.Skills];
allSkills.RemoveAll(s => s.Skill == allSkill.Skill || s.Skill == Skills.None || !allTeamsSkills.Any(s2 => s2.Name == s.Skill.ToString())); allSkills.RemoveAll(s => s.Skill == allSkill.Skill || s.Skill == Skills.None || !allTeamsSkills.Any(s2 => s2.Name == s.Skill.ToString()));
allSkill = allSkills.Count == 0 ? noneSkill : allSkills[Instance.Random.Next(allSkills.Count)]; allSkill = allSkills.Count == 0 ? noneSkill : allSkills[Instance.Random.Next(allSkills.Count)];
} }
else if (Config.LoadedConfig.GameMode == (int)Config.GameModes.Debug && debugSkills.Count == 0) else if (Config.LoadedConfig.GameMode == (int)Config.GameModes.Debug && debugSkills.Count == 0)
debugSkills = new(SkillData.Skills); debugSkills = [.. SkillData.Skills];
foreach (var player in validPlayers) foreach (var player in validPlayers)
{ {
@ -436,12 +513,12 @@ namespace jRandomSkills
randomSkill = staticSkill; randomSkill = staticSkill;
else if (gameMode == Config.GameModes.Normal || gameMode == Config.GameModes.NoRepeat) else if (gameMode == Config.GameModes.Normal || gameMode == Config.GameModes.NoRepeat)
{ {
List<jSkill_SkillInfo> skillList = new(SkillData.Skills); List<jSkill_SkillInfo> skillList = [.. SkillData.Skills];
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None); skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None);
if (validPlayers.Count(p => p.Team == player.Team) == 1) if (validPlayers.Count(p => p.Team == player.Team) == 1)
{ {
SkillsInfo.DefaultSkillInfo[] skillsNeedsTeammates = SkillsInfo.LoadedConfig.Where(s => s.NeedsTeammates).ToArray(); SkillsInfo.DefaultSkillInfo[] skillsNeedsTeammates = [.. SkillsInfo.LoadedConfig.Where(s => s.NeedsTeammates)];
skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString())); skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString()));
} }
@ -450,7 +527,7 @@ namespace jRandomSkills
else else
skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString()));
if (gameMode == Config.GameModes.NoRepeat && playersSkills.TryGetValue(player.SteamID, out List<jSkill_SkillInfo>? skills)) if (gameMode == Config.GameModes.NoRepeat && playersSkills.TryGetValue(player.SteamID, out ConcurrentBag<jSkill_SkillInfo>? skills))
{ {
skillList.RemoveAll(s => skills.Any(s2 => s2.Skill == s.Skill)); skillList.RemoveAll(s => skills.Any(s2 => s2.Skill == s.Skill));
if (skillList.Count == 0) skills.Clear(); if (skillList.Count == 0) skills.Clear();
@ -459,7 +536,7 @@ namespace jRandomSkills
randomSkill = skillList.Count == 0 ? noneSkill : skillList[Instance.Random.Next(skillList.Count)]; randomSkill = skillList.Count == 0 ? noneSkill : skillList[Instance.Random.Next(skillList.Count)];
if (gameMode == Config.GameModes.NoRepeat) if (gameMode == Config.GameModes.NoRepeat)
{ {
if (playersSkills.TryGetValue(player.SteamID, out List<jSkill_SkillInfo>? value)) if (playersSkills.TryGetValue(player.SteamID, out ConcurrentBag<jSkill_SkillInfo>? value))
value.Add(randomSkill); value.Add(randomSkill);
else else
playersSkills.TryAdd(player.SteamID, [randomSkill]); playersSkills.TryAdd(player.SteamID, [randomSkill]);
@ -472,7 +549,7 @@ namespace jRandomSkills
else if (gameMode == Config.GameModes.Debug) else if (gameMode == Config.GameModes.Debug)
{ {
if (debugSkills.Count == 0) if (debugSkills.Count == 0)
debugSkills = new List<jSkill_SkillInfo>(SkillData.Skills); debugSkills = [.. SkillData.Skills];
randomSkill = debugSkills[0]; randomSkill = debugSkills[0];
debugSkills.RemoveAt(0); debugSkills.RemoveAt(0);
player.PrintToChat($"{SkillData.Skills.Count - debugSkills.Count}/{SkillData.Skills.Count}"); player.PrintToChat($"{SkillData.Skills.Count - debugSkills.Count}/{SkillData.Skills.Count}");
@ -486,12 +563,13 @@ namespace jRandomSkills
skillPlayer.SpecialSkill = Skills.None; skillPlayer.SpecialSkill = Skills.None;
if (SkillsInfo.GetValue<bool>(randomSkill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) if (SkillsInfo.GetValue<bool>(randomSkill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime())
Instance?.AddTimer(Config.LoadedConfig.SkillTimeBeforeStart, () => { Instance?.AddTimer(Config.LoadedConfig.SkillTimeBeforeStart, () =>
{
if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == randomSkill.Skill) == null) return; if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == randomSkill.Skill) == null) return;
Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", new[] { player }); Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]);
}); });
else else
Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", new[] { player }); Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]);
Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{player.GetSkillName(randomSkill.Skill)}\"."); Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{player.GetSkillName(randomSkill.Skill)}\".");
skillPlayer.SkillDescriptionHudExpired = DateTime.Now.AddSeconds(Config.LoadedConfig.SkillDescriptionDuration); skillPlayer.SkillDescriptionHudExpired = DateTime.Now.AddSeconds(Config.LoadedConfig.SkillDescriptionDuration);
@ -521,18 +599,21 @@ namespace jRandomSkills
} }
} }
} }
}
public static void SetRandomSkill(CCSPlayerController player) public static void SetRandomSkill(CCSPlayerController player)
{
lock (setLock)
{ {
var validPlayers = Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist).ToList(); var validPlayers = Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist).ToList();
if (Config.LoadedConfig.GameMode == (int)Config.GameModes.TeamSkills) if (Config.LoadedConfig.GameMode == (int)Config.GameModes.TeamSkills)
{ {
List<jSkill_SkillInfo> tSkills = new(SkillData.Skills); List<jSkill_SkillInfo> tSkills = [.. SkillData.Skills];
tSkills.RemoveAll(s => s.Skill == tSkill.Skill || s.Skill == Skills.None || counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); tSkills.RemoveAll(s => s.Skill == tSkill.Skill || s.Skill == Skills.None || counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString()));
tSkill = tSkills.Count == 0 ? noneSkill : tSkills[0]; tSkill = tSkills.Count == 0 ? noneSkill : tSkills[0];
List<jSkill_SkillInfo> ctSkills = new(SkillData.Skills); List<jSkill_SkillInfo> ctSkills = [.. SkillData.Skills];
ctSkills.RemoveAll(s => s.Skill == ctSkill.Skill || s.Skill == Skills.None || terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); ctSkills.RemoveAll(s => s.Skill == ctSkill.Skill || s.Skill == Skills.None || terroristSkills.Any(s2 => s2.Name == s.Skill.ToString()));
ctSkill = ctSkills.Count == 0 ? noneSkill : ctSkills[0]; ctSkill = ctSkills.Count == 0 ? noneSkill : ctSkills[0];
} }
@ -555,12 +636,12 @@ namespace jRandomSkills
randomSkill = staticSkill; randomSkill = staticSkill;
else if (gameMode == Config.GameModes.Normal || gameMode == Config.GameModes.NoRepeat) else if (gameMode == Config.GameModes.Normal || gameMode == Config.GameModes.NoRepeat)
{ {
List<jSkill_SkillInfo> skillList = new(SkillData.Skills); List<jSkill_SkillInfo> skillList = [.. SkillData.Skills];
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None); skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None);
if (validPlayers.Count(p => p.Team == player.Team) == 1) if (validPlayers.Count(p => p.Team == player.Team) == 1)
{ {
SkillsInfo.DefaultSkillInfo[] skillsNeedsTeammates = SkillsInfo.LoadedConfig.Where(s => s.NeedsTeammates).ToArray(); SkillsInfo.DefaultSkillInfo[] skillsNeedsTeammates = [.. SkillsInfo.LoadedConfig.Where(s => s.NeedsTeammates)];
skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString())); skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString()));
} }
@ -569,7 +650,7 @@ namespace jRandomSkills
else else
skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString()));
if (gameMode == Config.GameModes.NoRepeat && playersSkills.TryGetValue(player.SteamID, out List<jSkill_SkillInfo>? skills)) if (gameMode == Config.GameModes.NoRepeat && playersSkills.TryGetValue(player.SteamID, out ConcurrentBag<jSkill_SkillInfo>? skills))
{ {
skillList.RemoveAll(s => skills.Any(s2 => s2.Skill == s.Skill)); skillList.RemoveAll(s => skills.Any(s2 => s2.Skill == s.Skill));
if (skillList.Count == 0) skills.Clear(); if (skillList.Count == 0) skills.Clear();
@ -578,7 +659,7 @@ namespace jRandomSkills
randomSkill = skillList.Count == 0 ? noneSkill : skillList[Instance.Random.Next(skillList.Count)]; randomSkill = skillList.Count == 0 ? noneSkill : skillList[Instance.Random.Next(skillList.Count)];
if (gameMode == Config.GameModes.NoRepeat) if (gameMode == Config.GameModes.NoRepeat)
{ {
if (playersSkills.TryGetValue(player.SteamID, out List<jSkill_SkillInfo>? value)) if (playersSkills.TryGetValue(player.SteamID, out ConcurrentBag<jSkill_SkillInfo>? value))
value.Add(randomSkill); value.Add(randomSkill);
else else
playersSkills.TryAdd(player.SteamID, [randomSkill]); playersSkills.TryAdd(player.SteamID, [randomSkill]);
@ -599,23 +680,29 @@ namespace jRandomSkills
if (SkillsInfo.GetValue<bool>(randomSkill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) if (SkillsInfo.GetValue<bool>(randomSkill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime())
Instance?.AddTimer(Config.LoadedConfig.SkillTimeBeforeStart, () => { Instance?.AddTimer(Config.LoadedConfig.SkillTimeBeforeStart, () => {
if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == randomSkill.Skill) == null) return; if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == randomSkill.Skill) == null) return;
Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", new[] { player }); Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]);
}); });
else else
Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", new[] { player }); Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", [player]);
Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{player.GetSkillName(randomSkill.Skill)}\"."); Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{player.GetSkillName(randomSkill.Skill)}\".");
skillPlayer.SkillDescriptionHudExpired = DateTime.Now.AddSeconds(Config.LoadedConfig.SkillDescriptionDuration); skillPlayer.SkillDescriptionHudExpired = DateTime.Now.AddSeconds(Config.LoadedConfig.SkillDescriptionDuration);
} }
}
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
{
lock (setLock)
{ {
foreach (var playerSkill in Instance.SkillPlayer) foreach (var playerSkill in Instance.SkillPlayer)
if (!playerSkill.IsDrawing) if (!playerSkill.IsDrawing)
Instance.SkillAction(playerSkill.Skill.ToString(), "CheckTransmit", [infoList]); Instance.SkillAction(playerSkill.Skill.ToString(), "CheckTransmit", [infoList]);
} }
}
public static void UpdateSkillHUD(CCSPlayerController? player, string? headerLine, string? centerLine, string? extraLine, bool isDescription) public static void UpdateSkillHUD(CCSPlayerController? player, string? headerLine, string? centerLine, string? extraLine, bool isDescription)
{
lock (setLock)
{ {
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var config = Config.LoadedConfig.HtmlHudCustomisation; var config = Config.LoadedConfig.HtmlHudCustomisation;
@ -636,4 +723,16 @@ namespace jRandomSkills
player.PrintToCenterHtml(hudContent); player.PrintToCenterHtml(hudContent);
} }
} }
public static void EnableTransmit()
{
if (!isTransmitRegistered)
{
Instance?.RegisterListener<CheckTransmit>(CheckTransmit);
isTransmitRegistered = true;
}
}
public static DateTime GetFreezeTimeEnd() => freezeTimeEnd;
}
} }

View file

@ -1,12 +1,11 @@
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.player; using src.utils;
using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners; using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player
{ {
public static class PlayerOnTick public static class PlayerOnTick
{ {
@ -57,14 +56,14 @@ namespace jRandomSkills
bool showDescirptionHUD = skillPlayer.SkillDescriptionHudExpired >= DateTime.Now; bool showDescirptionHUD = skillPlayer.SkillDescriptionHudExpired >= DateTime.Now;
bool isDescription = true; bool isDescription = true;
if (SkillData.Skills.Count == 0) if (SkillData.Skills.IsEmpty)
{ {
infoLine = player.GetTranslation("your_skill"); infoLine = player.GetTranslation("your_skill");
skillLine = player.GetTranslation("none"); skillLine = player.GetTranslation("none");
} }
else if (skillPlayer.IsDrawing) else if (skillPlayer.IsDrawing)
{ {
var randomSkill = SkillData.Skills[Instance.Random.Next(SkillData.Skills.Count)]; var randomSkill = SkillData.Skills.ToArray()[Instance.Random.Next(SkillData.Skills.Count)];
infoLine = player.GetTranslation("drawing_skill"); infoLine = player.GetTranslation("drawing_skill");
skillLine = $"<font color='{randomSkill.Color}'>{player.GetSkillName(randomSkill.Skill)}</font>"; skillLine = $"<font color='{randomSkill.Color}'>{player.GetSkillName(randomSkill.Skill)}</font>";
} }

View file

@ -1,12 +1,12 @@
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;
using jRandomSkills.src.player;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Aimbot : ISkill public class Aimbot : ISkill
{ {
@ -43,10 +43,10 @@ namespace jRandomSkills
if (attacker.PawnIsAlive) if (attacker.PawnIsAlive)
{ {
IntPtr hitGroupPointer = Marshal.ReadIntPtr(param2.Handle, GameData.GetOffset("CTakeDamageInfo_HitGroup")); nint hitGroupPointer = Marshal.ReadIntPtr(param2.Handle, GameData.GetOffset("CTakeDamageInfo_HitGroup"));
if (hitGroupPointer != nint.Zero) if (hitGroupPointer != nint.Zero)
{ {
IntPtr hitGroupOffset = Marshal.ReadIntPtr(hitGroupPointer, 16); nint hitGroupOffset = Marshal.ReadIntPtr(hitGroupPointer, 16);
if (hitGroupOffset != nint.Zero) if (hitGroupOffset != nint.Zero)
{ {
if (playerInfo.Skill == skillName) if (playerInfo.Skill == skillName)

View file

@ -1,12 +1,11 @@
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.player; using src.utils;
using jRandomSkills.src.utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Anomaly : ISkill public class Anomaly : ISkill
{ {
@ -40,12 +39,12 @@ namespace jRandomSkills
if (pawn != null && pawn.IsValid && pawn.AbsOrigin != null) if (pawn != null && pawn.IsValid && pawn.AbsOrigin != null)
{ {
if (skillInfo.LastRotations == null || skillInfo.LastPositions == null) continue; if (skillInfo.LastRotations == null || skillInfo.LastPositions == null) continue;
skillInfo.LastPositions.Add(new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z)); skillInfo.LastPositions.Enqueue(new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z));
skillInfo.LastRotations.Add(new QAngle(pawn.EyeAngles.X, pawn.EyeAngles.Y, pawn.EyeAngles.Z)); skillInfo.LastRotations.Enqueue(new QAngle(pawn.EyeAngles.X, pawn.EyeAngles.Y, pawn.EyeAngles.Z));
if (skillInfo.LastRotations.Count > SkillsInfo.GetValue<int>(skillName, "secondsInBack")) if (skillInfo.LastRotations.Count > SkillsInfo.GetValue<int>(skillName, "secondsInBack"))
{ {
skillInfo.LastPositions.RemoveAt(0); skillInfo.LastPositions.TryDequeue(out _);
skillInfo.LastRotations.RemoveAt(0); skillInfo.LastRotations.TryDequeue(out _);
} }
} }
} }
@ -103,7 +102,7 @@ namespace jRandomSkills
{ {
skillInfo.CanUse = false; skillInfo.CanUse = false;
skillInfo.Cooldown = DateTime.Now; skillInfo.Cooldown = DateTime.Now;
if (skillInfo.LastRotations == null || skillInfo.LastRotations.Count == 0 || skillInfo.LastPositions == null || skillInfo.LastPositions.Count == 0) return; if (skillInfo.LastRotations == null || skillInfo.LastRotations.IsEmpty || skillInfo.LastPositions == null || skillInfo.LastPositions.IsEmpty) return;
Vector? lastPosition = skillInfo.LastPositions.FirstOrDefault(); Vector? lastPosition = skillInfo.LastPositions.FirstOrDefault();
QAngle? lastRotation = skillInfo.LastRotations.FirstOrDefault(); QAngle? lastRotation = skillInfo.LastRotations.FirstOrDefault();
if (lastPosition != null && lastRotation != null) if (lastPosition != null && lastRotation != null)
@ -117,8 +116,8 @@ namespace jRandomSkills
public ulong SteamID { get; set; } public ulong SteamID { get; set; }
public bool CanUse { get; set; } public bool CanUse { get; set; }
public DateTime Cooldown { get; set; } public DateTime Cooldown { get; set; }
public List<Vector>? LastPositions { get; set; } public ConcurrentQueue<Vector>? LastPositions { get; set; }
public List<QAngle>? LastRotations { get; set; } public ConcurrentQueue<QAngle>? LastRotations { get; set; }
} }
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a86eff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = true, bool needsTeammates = false, int secondsInBack = 5, float cooldown = 15) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a86eff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = true, bool needsTeammates = false, int secondsInBack = 5, float cooldown = 15) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates)

View file

@ -1,10 +1,10 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class AntyFlash : ISkill public class AntyFlash : ISkill
{ {

View file

@ -1,9 +1,9 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class AntyHead : ISkill public class AntyHead : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class AreaReaper : ISkill public class AreaReaper : ISkill
{ {

View file

@ -1,11 +1,10 @@
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;
using jRandomSkills.src.player; using src.utils;
using jRandomSkills.src.utils; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Armored : ISkill public class Armored : ISkill
{ {

View file

@ -1,9 +1,9 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Assassin : ISkill public class Assassin : ISkill
{ {

View file

@ -1,11 +1,10 @@
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.player; using src.utils;
using jRandomSkills.src.utils; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Astronaut : ISkill public class Astronaut : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Bankrupt : ISkill public class Bankrupt : ISkill
{ {

View file

@ -2,11 +2,11 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Baseball : ISkill public class Baseball : ISkill
{ {

View file

@ -1,10 +1,9 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using jRandomSkills.src.utils; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Behind : ISkill public class Behind : ISkill
{ {

View file

@ -1,10 +1,10 @@
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.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class BladeMaster : ISkill public class BladeMaster : ISkill
{ {

View file

@ -1,10 +1,10 @@
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.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class BunnyHop : ISkill public class BunnyHop : ISkill
{ {

View file

@ -3,16 +3,16 @@ 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;
using jRandomSkills.src.player; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class C4Camouflage : ISkill public class C4Camouflage : ISkill
{ {
private const Skills skillName = Skills.C4Camouflage; private const Skills skillName = Skills.C4Camouflage;
private static readonly ConcurrentDictionary<ulong, List<uint>> invisibleEntities = []; private static readonly ConcurrentDictionary<ulong, ConcurrentBag<uint>> invisibleEntities = [];
public static void LoadSkill() public static void LoadSkill()
{ {
@ -73,7 +73,7 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
{ {
SkillUtils.EnableTransmit(); Event.EnableTransmit();
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var playerPawn = player.PlayerPawn.Value; var playerPawn = player.PlayerPawn.Value;

View file

@ -1,10 +1,9 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using jRandomSkills.src.utils; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Catapult : ISkill public class Catapult : ISkill
{ {

View file

@ -2,12 +2,11 @@ using System.Drawing;
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.player; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
using jRandomSkills.src.utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Chicken : ISkill public class Chicken : ISkill
{ {
@ -53,7 +52,7 @@ namespace jRandomSkills
var playerPawn = player.PlayerPawn?.Value; var playerPawn = player.PlayerPawn?.Value;
if (playerPawn != null && playerPawn.IsValid) if (playerPawn != null && playerPawn.IsValid)
{ {
SkillUtils.EnableTransmit(); Event.EnableTransmit();
playerPawn.VelocityModifier = 1.1f; playerPawn.VelocityModifier = 1.1f;
playerPawn.Health = 50; playerPawn.Health = 50;

View file

@ -1,10 +1,10 @@
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.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class ChillOut : ISkill public class ChillOut : ISkill
{ {

View file

@ -1,9 +1,9 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Cutter : ISkill public class Cutter : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Darkness : ISkill public class Darkness : ISkill
{ {
@ -53,7 +52,7 @@ namespace jRandomSkills
if (playerInfo == null || playerInfo.Skill != skillName) continue; if (playerInfo == null || playerInfo.Skill != skillName) continue;
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
SkillUtils.UpdateMenu(player, menuItems); SkillUtils.UpdateMenu(player, menuItems);
} }
} }
@ -94,7 +93,7 @@ namespace jRandomSkills
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
if (enemies.Length > 0) if (enemies.Length > 0)
{ {
ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString()))); ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
SkillUtils.CreateMenu(player, menuItems); SkillUtils.CreateMenu(player, menuItems);
} }
else else
@ -116,6 +115,8 @@ namespace jRandomSkills
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;
lock (setLock)
{
if (!defaultPostProcessings.ContainsKey(player)) if (!defaultPostProcessings.ContainsKey(player))
defaultPostProcessings.TryAdd(player, []); defaultPostProcessings.TryAdd(player, []);
@ -153,6 +154,7 @@ namespace jRandomSkills
if (dontCreateNew) if (dontCreateNew)
defaultPostProcessings.TryRemove(player, out _); defaultPostProcessings.TryRemove(player, out _);
} }
}
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#383838", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, float brightness = .01f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#383838", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, float brightness = .01f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates)
{ {

View file

@ -1,10 +1,10 @@
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.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Dash : ISkill public class Dash : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Deactivator : ISkill public class Deactivator : ISkill
{ {

View file

@ -2,12 +2,11 @@
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;
using jRandomSkills.src.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Deaf : ISkill public class Deaf : ISkill
{ {

View file

@ -1,10 +1,9 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using jRandomSkills.src.utils; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Disarmament : ISkill public class Disarmament : ISkill
{ {

View file

@ -1,10 +1,10 @@
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.player; using src.utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
namespace jRandomSkills namespace src.player.skills
{ {
public class Distancer : ISkill public class Distancer : ISkill
{ {

View file

@ -1,10 +1,10 @@
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.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Dracula : ISkill public class Dracula : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Duplicator : ISkill public class Duplicator : ISkill
{ {
@ -75,7 +74,7 @@ namespace jRandomSkills
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p != player && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p != player && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
if (enemies.Length > 0) if (enemies.Length > 0)
{ {
List<string> skills = []; ConcurrentBag<string> skills = [];
ConcurrentBag<(string, string)> menuItems = []; ConcurrentBag<(string, string)> menuItems = [];
foreach (var enemy in enemies) foreach (var enemy in enemies)
{ {
@ -138,12 +137,12 @@ namespace jRandomSkills
SkillUtils.CloseMenu(player); SkillUtils.CloseMenu(player);
if (SkillsInfo.GetValue<bool>(enemySkill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) if (SkillsInfo.GetValue<bool>(enemySkill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime())
Instance?.AddTimer(Math.Max((float)(Event.freezeTimeEnd - DateTime.Now).TotalSeconds, 0), () => { Instance?.AddTimer(Math.Max((float)(Event.GetFreezeTimeEnd() - DateTime.Now).TotalSeconds, 0), () => {
if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == enemySkill) == null) return; if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == enemySkill) == null) return;
Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", new[] { player }); Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", [player]);
}); });
else else
Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", new[] { player }); Instance?.SkillAction(enemySkill.ToString(), "EnableSkill", [player]);
}); });
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("duplicator_player_info", enemy.PlayerName)); player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("duplicator_player_info", enemy.PlayerName));
} }

View file

@ -1,11 +1,10 @@
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.player; using src.utils;
using jRandomSkills.src.utils; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Dwarf : ISkill public class Dwarf : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Earthquake : ISkill public class Earthquake : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class EnemySpawn : ISkill public class EnemySpawn : ISkill
{ {
@ -44,7 +43,7 @@ namespace jRandomSkills
{ {
SteamID = player.SteamID, SteamID = player.SteamID,
CanUse = false, CanUse = false,
Cooldown = cooldownBeforeUse <= 0 ? DateTime.MinValue : Event.freezeTimeEnd.AddSeconds(cooldownBeforeUse - SkillsInfo.GetValue<float>(skillName, "cooldown")), Cooldown = cooldownBeforeUse <= 0 ? DateTime.MinValue : Event.GetFreezeTimeEnd().AddSeconds(cooldownBeforeUse - SkillsInfo.GetValue<float>(skillName, "cooldown")),
}); });
} }

View file

@ -2,12 +2,11 @@
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;
using jRandomSkills.src.player; using src.utils;
using jRandomSkills.src.utils; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
namespace jRandomSkills namespace src.player.skills
{ {
public class ExplosiveShot : ISkill public class ExplosiveShot : ISkill
{ {

View file

@ -1,12 +1,12 @@
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.player;
using System.Drawing; using System.Drawing;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class FalconEye : ISkill public class FalconEye : ISkill
{ {

View file

@ -1,10 +1,10 @@
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.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class FastReload : ISkill public class FastReload : ISkill
{ {

View file

@ -2,12 +2,11 @@ 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;
using jRandomSkills.src.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Flash : ISkill public class Flash : ISkill
{ {

View file

@ -2,13 +2,12 @@
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;
using jRandomSkills.src.player;
using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners; using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Fortnite : ISkill public class Fortnite : ISkill
{ {

View file

@ -3,11 +3,10 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using jRandomSkills.src.utils; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class FragileBomb : ISkill public class FragileBomb : ISkill
{ {

View file

@ -1,10 +1,10 @@
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.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class FriendlyFire : ISkill public class FriendlyFire : ISkill
{ {

View file

@ -2,15 +2,16 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using System.Collections.Concurrent;
using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class FrozenDecoy : ISkill public class FrozenDecoy : ISkill
{ {
private const Skills skillName = Skills.FrozenDecoy; private const Skills skillName = Skills.FrozenDecoy;
private static readonly List<Vector> decoys = []; private static readonly ConcurrentDictionary<Vector, byte> decoys = [];
public static void LoadSkill() public static void LoadSkill()
{ {
@ -28,7 +29,7 @@ namespace jRandomSkills
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return; if (playerInfo?.Skill != skillName) return;
decoys.Add(new Vector(@event.X, @event.Y, @event.Z)); decoys.TryAdd(new Vector(@event.X, @event.Y, @event.Z), 0);
} }
public static void DecoyDetonate(EventDecoyDetonate @event) public static void DecoyDetonate(EventDecoyDetonate @event)
@ -37,12 +38,13 @@ namespace jRandomSkills
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return; if (playerInfo?.Skill != skillName) return;
decoys.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z); foreach (var decoy in decoys.Keys.Where(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z))
decoys.TryRemove(decoy, out _);
} }
public static void OnTick() public static void OnTick()
{ {
foreach (Vector decoyPos in decoys) foreach (Vector decoyPos in decoys.Keys)
foreach (var player in Utilities.GetPlayers().Where(p => p.Team == CsTeam.Terrorist || p.Team == CsTeam.CounterTerrorist)) foreach (var player in Utilities.GetPlayers().Where(p => p.Team == CsTeam.Terrorist || p.Team == CsTeam.CounterTerrorist))
{ {
var decoyRadius = SkillsInfo.GetValue<float>(skillName, "triggerRadius"); var decoyRadius = SkillsInfo.GetValue<float>(skillName, "triggerRadius");

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Gambler : ISkill public class Gambler : ISkill
{ {
@ -52,12 +51,12 @@ namespace jRandomSkills
playerInfo.SkillChance = 1; playerInfo.SkillChance = 1;
if (SkillsInfo.GetValue<bool>(skill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime()) if (SkillsInfo.GetValue<bool>(skill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime())
Instance?.AddTimer(Math.Max((float)(Event.freezeTimeEnd - DateTime.Now).TotalSeconds, 0), () => { Instance?.AddTimer(Math.Max((float)(Event.GetFreezeTimeEnd() - DateTime.Now).TotalSeconds, 0), () => {
if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == skill.Skill) == null) return; if (Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID && p.Skill == skill.Skill) == null) return;
Instance?.SkillAction(skill.Skill.ToString(), "EnableSkill", new[] { player }); Instance?.SkillAction(skill.Skill.ToString(), "EnableSkill", [player]);
}); });
else else
Instance?.SkillAction(skill.Skill.ToString(), "EnableSkill", new[] { player }); Instance?.SkillAction(skill.Skill.ToString(), "EnableSkill", [player]);
}); });
} }
@ -95,7 +94,7 @@ namespace jRandomSkills
var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (skillPlayer == null) return [Event.noneSkill]; if (skillPlayer == null) return [Event.noneSkill];
List<jSkill_SkillInfo> skillList = new(SkillData.Skills); List<jSkill_SkillInfo> skillList = [.. SkillData.Skills];
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None); skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None);
if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).Count == 1) if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).Count == 1)

View file

@ -4,12 +4,11 @@ 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;
using jRandomSkills.src.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Ghost : ISkill public class Ghost : ISkill
{ {
@ -26,7 +25,7 @@ namespace jRandomSkills
"weapon_g3sg1", "weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_g3sg1", "weapon_nova", "weapon_xm1014", "weapon_mag7",
"weapon_sawedoff", "weapon_m249", "weapon_negev" "weapon_sawedoff", "weapon_m249", "weapon_negev"
]; ];
private static readonly ConcurrentDictionary<ulong, List<uint>> invisibleEntities = []; private static readonly ConcurrentDictionary<ulong, ConcurrentBag<uint>> invisibleEntities = [];
public static void LoadSkill() public static void LoadSkill()
{ {
@ -78,7 +77,7 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
{ {
SkillUtils.EnableTransmit(); Event.EnableTransmit();
SetPlayerVisibility(player, false); SetPlayerVisibility(player, false);
SetWeaponVisibility(player, false); SetWeaponVisibility(player, false);
SetWeaponAttack(player, true); SetWeaponAttack(player, true);

View file

@ -3,11 +3,11 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Core.Attributes;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Glaz : ISkill public class Glaz : ISkill
{ {
@ -54,7 +54,7 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
{ {
SkillUtils.EnableTransmit(); Event.EnableTransmit();
SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade);
} }

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Glitch : ISkill public class Glitch : ISkill
{ {

View file

@ -1,9 +1,9 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Glue : ISkill public class Glue : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class GodMode : ISkill public class GodMode : ISkill
{ {

View file

@ -1,10 +1,10 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Grenadier : ISkill public class Grenadier : ISkill
{ {

View file

@ -2,15 +2,16 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using System.Collections.Concurrent;
using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class HealingSmoke : ISkill public class HealingSmoke : ISkill
{ {
private const Skills skillName = Skills.HealingSmoke; private const Skills skillName = Skills.HealingSmoke;
private static readonly List<Vector> smokes = []; private static readonly ConcurrentDictionary<Vector, byte> smokes = [];
public static void LoadSkill() public static void LoadSkill()
{ {
@ -28,7 +29,7 @@ namespace jRandomSkills
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return; if (playerInfo?.Skill != skillName) return;
smokes.Add(new Vector(@event.X, @event.Y, @event.Z)); smokes.TryAdd(new Vector(@event.X, @event.Y, @event.Z), 0);
} }
public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event) public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event)
@ -37,7 +38,8 @@ namespace jRandomSkills
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return; if (playerInfo?.Skill != skillName) return;
smokes.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z); foreach (var smoke in smokes.Keys.Where(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z))
smokes.TryRemove(smoke, out _);
} }
public static void OnEntitySpawned(CEntityInstance entity) public static void OnEntitySpawned(CEntityInstance entity)
@ -68,7 +70,7 @@ namespace jRandomSkills
public static void OnTick() public static void OnTick()
{ {
foreach (Vector smokePos in smokes) foreach (Vector smokePos in smokes.Keys)
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
if (Server.TickCount % 17 == 0) if (Server.TickCount % 17 == 0)
if (player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.AbsOrigin != null) if (player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.AbsOrigin != null)

View file

@ -1,11 +1,11 @@
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.player; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Hermit : ISkill public class Hermit : ISkill
{ {

View file

@ -2,10 +2,10 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class HolyHandGrenade : ISkill public class HolyHandGrenade : ISkill
{ {

View file

@ -2,10 +2,10 @@ using System.Drawing;
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.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Impostor : ISkill public class Impostor : ISkill
{ {

View file

@ -1,9 +1,9 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class InfiniteAmmo : ISkill public class InfiniteAmmo : ISkill
{ {

View file

@ -2,17 +2,17 @@
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;
using jRandomSkills.src.player;
using System.Drawing; using System.Drawing;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Jackal : ISkill public class Jackal : ISkill
{ {
private const Skills skillName = Skills.Jackal; private const Skills skillName = Skills.Jackal;
private static readonly ConcurrentDictionary<CCSPlayerController, List<CBeam>> stepBeams = []; private static readonly ConcurrentDictionary<CCSPlayerController, ConcurrentQueue<CBeam>> stepBeams = [];
public static void LoadSkill() public static void LoadSkill()
{ {
@ -49,12 +49,13 @@ namespace jRandomSkills
var newBeam = CreateBeamStep(step.Key.Team, lastBeamVector, pawn.AbsOrigin); var newBeam = CreateBeamStep(step.Key.Team, lastBeamVector, pawn.AbsOrigin);
if (newBeam != null) if (newBeam != null)
step.Value.Add(newBeam); step.Value.Enqueue(newBeam);
if (beams?.Count >= SkillsInfo.GetValue<int>(skillName, "maxStepBeam")) if (beams?.Count >= SkillsInfo.GetValue<int>(skillName, "maxStepBeam"))
{ {
beams[0].AcceptInput("Kill"); if (beams.TryPeek(out var beam))
step.Value.RemoveAt(0); beam.AcceptInput("Kill");
step.Value.TryDequeue(out _);
} }
} }
} }
@ -103,7 +104,7 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController _) public static void EnableSkill(CCSPlayerController _)
{ {
SkillUtils.EnableTransmit(); Event.EnableTransmit();
foreach (var _player in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.PawnIsAlive && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) foreach (var _player in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.PawnIsAlive && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist))
if (!stepBeams.ContainsKey(_player)) if (!stepBeams.ContainsKey(_player))
stepBeams.TryAdd(_player, []); stepBeams.TryAdd(_player, []);

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Jammer : ISkill public class Jammer : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using src.utils;
using jRandomSkills.src.utils;
using System.Drawing; using System.Drawing;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Jester : ISkill public class Jester : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class JumpBan : ISkill public class JumpBan : ISkill
{ {

View file

@ -1,9 +1,9 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class JumpingJack : ISkill public class JumpingJack : ISkill
{ {

View file

@ -1,10 +1,10 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class KillerFlash : ISkill public class KillerFlash : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class LifeSwap : ISkill public class LifeSwap : ISkill
{ {

View file

@ -6,13 +6,13 @@ using CounterStrikeSharp.API.Modules.Utils;
using CS2TraceRay.Class; using CS2TraceRay.Class;
using CS2TraceRay.Enum; using CS2TraceRay.Enum;
using CS2TraceRay.Struct; using CS2TraceRay.Struct;
using jRandomSkills.src.player; using src.utils;
using System.Drawing; using System.Drawing;
using System.Numerics; using System.Numerics;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
namespace jRandomSkills namespace src.player.skills
{ {
public class LongKnife : ISkill public class LongKnife : ISkill
{ {

View file

@ -5,13 +5,13 @@ using CounterStrikeSharp.API.Modules.Utils;
using CS2TraceRay.Class; using CS2TraceRay.Class;
using CS2TraceRay.Enum; using CS2TraceRay.Enum;
using CS2TraceRay.Struct; using CS2TraceRay.Struct;
using jRandomSkills.src.player; using src.utils;
using System.Drawing; using System.Drawing;
using System.Numerics; using System.Numerics;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
namespace jRandomSkills namespace src.player.skills
{ {
public class LongZeus : ISkill public class LongZeus : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Magnifier : ISkill public class Magnifier : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Medic : ISkill public class Medic : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class MoneySwap : ISkill public class MoneySwap : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using src.utils;
using jRandomSkills.src.utils; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
namespace jRandomSkills namespace src.player.skills
{ {
public class Muhammed : ISkill public class Muhammed : ISkill
{ {

View file

@ -1,9 +1,9 @@
/*using CounterStrikeSharp.API; /*using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Mute : ISkill public class Mute : ISkill
{ {

View file

@ -3,17 +3,17 @@ 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;
using jRandomSkills.src.player; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Ninja : ISkill public class Ninja : ISkill
{ {
private const Skills skillName = Skills.Ninja; private const Skills skillName = Skills.Ninja;
private static readonly ConcurrentDictionary<nint, float> invisibilityChanged = []; private static readonly ConcurrentDictionary<nint, float> invisibilityChanged = [];
private static readonly ConcurrentDictionary<ulong, List<uint>> invisibleEntities = []; private static readonly ConcurrentDictionary<ulong, ConcurrentBag<uint>> invisibleEntities = [];
private static readonly object setLock = new(); private static readonly object setLock = new();
public static void LoadSkill() public static void LoadSkill()
@ -74,7 +74,7 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController _) public static void EnableSkill(CCSPlayerController _)
{ {
SkillUtils.EnableTransmit(); Event.EnableTransmit();
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)

View file

@ -1,9 +1,9 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class NoNades : ISkill public class NoNades : ISkill
{ {

View file

@ -1,10 +1,10 @@
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.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class NoRecoil : ISkill public class NoRecoil : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Noclip : ISkill public class Noclip : ISkill
{ {

View file

@ -1,7 +1,7 @@
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class None : ISkill public class None : ISkill
{ {

View file

@ -1,10 +1,10 @@
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;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class OneShot : ISkill public class OneShot : ISkill
{ {

View file

@ -1,10 +1,10 @@
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.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class OnlyHead : ISkill public class OnlyHead : ISkill
{ {

View file

@ -1,11 +1,10 @@
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.player; using src.utils;
using jRandomSkills.src.utils; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class PawelJumper : ISkill public class PawelJumper : ISkill
{ {

View file

@ -1,10 +1,9 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using jRandomSkills.src.utils; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Phoenix : ISkill public class Phoenix : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Pilot : ISkill public class Pilot : ISkill
{ {

View file

@ -2,10 +2,10 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Planter : ISkill public class Planter : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Poison : ISkill public class Poison : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class PrimaryBan : ISkill public class PrimaryBan : ISkill
{ {

View file

@ -1,10 +1,10 @@
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.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Prosthesis : ISkill public class Prosthesis : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class PsychicDefusing : ISkill public class PsychicDefusing : ISkill
{ {

View file

@ -1,10 +1,9 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using jRandomSkills.src.utils; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Push : ISkill public class Push : ISkill
{ {

View file

@ -2,10 +2,10 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Pyro : ISkill public class Pyro : ISkill
{ {

View file

@ -1,10 +1,10 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class QuickShot : ISkill public class QuickShot : ISkill
{ {

View file

@ -1,10 +1,10 @@
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.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class RadarHack : ISkill public class RadarHack : ISkill
{ {

View file

@ -1,10 +1,10 @@
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.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Rambo : ISkill public class Rambo : ISkill
{ {

View file

@ -1,13 +1,12 @@
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.player;
using jRandomSkills.src.utils;
using System.Collections.Immutable; using System.Collections.Immutable;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class RandomWeapon : ISkill public class RandomWeapon : ISkill
{ {
@ -104,21 +103,20 @@ namespace jRandomSkills
var pawn = player.PlayerPawn.Value; var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return; if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return;
List<string> playerWeapons = []; ConcurrentBag<string> playerWeapons = [];
foreach (var item in pawn.WeaponServices.MyWeapons) foreach (var item in pawn.WeaponServices.MyWeapons)
if (item != null && item.IsValid && item.Value != null && item.Value.IsValid && !string.IsNullOrEmpty(item.Value.DesignerName)) if (item != null && item.IsValid && item.Value != null && item.Value.IsValid && !string.IsNullOrEmpty(item.Value.DesignerName))
playerWeapons.Add(item.Value.DesignerName); playerWeapons.Add(item.Value.DesignerName);
if (playerWeapons.Count == 0) if (playerWeapons.IsEmpty)
return; return;
List<string> weaponList = new(pistols.Concat(rifles)); ConcurrentBag<string> weaponList = [.. pistols.Concat(rifles).Where(w => !playerWeapons.Contains(w))];
weaponList.RemoveAll(w => playerWeapons.Contains(w));
if (weaponList.Count == 0) if (weaponList.Count == 0)
return; return;
string weapon = weaponList[Instance.Random.Next(weaponList.Count)]; string weapon = weaponList.ToArray()[Instance.Random.Next(weaponList.Count)];
bool isPistol = pistols.Contains(weapon); bool isPistol = pistols.Contains(weapon);
string? weaponToRemove = playerWeapons.FirstOrDefault(itemName => string? weaponToRemove = playerWeapons.FirstOrDefault(itemName =>

View file

@ -1,12 +1,12 @@
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.player;
using System.Drawing; using System.Drawing;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class ReZombie : ISkill public class ReZombie : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class ReactiveArmor : ISkill public class ReactiveArmor : ISkill
{ {

View file

@ -1,9 +1,9 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using src.utils;
using static jRandomSkills.jRandomSkills; using static src.jRandomSkills;
namespace jRandomSkills namespace src.player.skills
{ {
public class Regeneration : ISkill public class Regeneration : ISkill
{ {

View file

@ -2,12 +2,11 @@
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;
using jRandomSkills.src.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Replicator : ISkill public class Replicator : ISkill
{ {

View file

@ -1,12 +1,11 @@
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.player; using static src.jRandomSkills;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class Retreat : ISkill public class Retreat : ISkill
{ {

View file

@ -1,11 +1,11 @@
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.player; using static src.jRandomSkills;
using static jRandomSkills.jRandomSkills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using src.utils;
namespace jRandomSkills namespace src.player.skills
{ {
public class ReturnToSender : ISkill public class ReturnToSender : ISkill
{ {

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