diff --git a/WASDMenuAPI - SRC Files/Classes/WasdManager.cs b/WASDMenuAPI - SRC Files/Classes/WasdManager.cs new file mode 100644 index 0000000..f6322ea --- /dev/null +++ b/WASDMenuAPI - SRC Files/Classes/WasdManager.cs @@ -0,0 +1,66 @@ +using CounterStrikeSharp.API.Core; +using WASDSharedAPI; + +namespace WASDMenuAPI.Classes; + +public class WasdManager : IWasdMenuManager +{ + public void OpenMainMenu(CCSPlayerController? player, IWasdMenu? menu) + { + if(player == null) + return; + WASDMenuAPI.Players[player.SteamID].OpenMainMenu((WasdMenu?)menu); + } + + public void CloseMenu(CCSPlayerController? player) + { + if(player == null) + return; + WASDMenuAPI.Players[player.SteamID].OpenMainMenu(null); + } + + public void CloseSubMenu(CCSPlayerController? player) + { + if(player == null) + return; + WASDMenuAPI.Players[player.SteamID].CloseSubMenu(); + } + + public void CloseAllSubMenus(CCSPlayerController? player) + { + if(player == null) + return; + WASDMenuAPI.Players[player.SteamID].CloseAllSubMenus(); + } + + public void OpenSubMenu(CCSPlayerController? player, IWasdMenu? menu) + { + if (player == null) + return; + WASDMenuAPI.Players[player.SteamID].OpenSubMenu(menu); + } + + public IWasdMenu CreateMenu(string title = "", string controlText = "") + { + WasdMenu menu = new WasdMenu + { + Title = title, + ControlText = controlText + }; + return menu; + } + + public bool HasMenu(CCSPlayerController? player) + { + if (player == null) + return false; + return WASDMenuAPI.Players.ContainsKey(player.SteamID); + } + + public void UpdateActiveMenu(CCSPlayerController? player, Dictionary> list) + { + if (player == null) + return; + WASDMenuAPI.Players[player.SteamID].UpdateActiveMenu(list); + } +} \ No newline at end of file diff --git a/WASDMenuAPI - SRC Files/Classes/WasdMenu.cs b/WASDMenuAPI - SRC Files/Classes/WasdMenu.cs new file mode 100644 index 0000000..b84d9be --- /dev/null +++ b/WASDMenuAPI - SRC Files/Classes/WasdMenu.cs @@ -0,0 +1,25 @@ +using CounterStrikeSharp.API.Core; +using WASDSharedAPI; + +namespace WASDMenuAPI.Classes; + +public class WasdMenu : IWasdMenu +{ + public string Title { get; set; } = ""; + public string ControlText { get; set; } = ""; + public LinkedList? Options { get; set; } = new(); + public LinkedListNode? Prev { get; set; } = null; + public LinkedListNode Add(string display, Action onChoice) + { + if (Options == null) + Options = new(); + WasdMenuOption newOption = new WasdMenuOption + { + OptionDisplay = display, + OnChoose = onChoice, + Index = Options.Count, + Parent = this + }; + return Options.AddLast(newOption); + } +} \ No newline at end of file diff --git a/WASDMenuAPI - SRC Files/Classes/WasdMenuOption.cs b/WASDMenuAPI - SRC Files/Classes/WasdMenuOption.cs new file mode 100644 index 0000000..fcc5daa --- /dev/null +++ b/WASDMenuAPI - SRC Files/Classes/WasdMenuOption.cs @@ -0,0 +1,13 @@ +using CounterStrikeSharp.API.Core; +using WASDMenuAPI.Classes; +using WASDSharedAPI; + +namespace WASDMenuAPI; + +public class WasdMenuOption : IWasdMenuOption +{ + public IWasdMenu? Parent { get; set; } + public string? OptionDisplay { get; set; } + public Action? OnChoose { get; set; } + public int Index { get; set; } +} \ No newline at end of file diff --git a/WASDMenuAPI - SRC Files/Classes/WasdMenuPlayer.cs b/WASDMenuAPI - SRC Files/Classes/WasdMenuPlayer.cs new file mode 100644 index 0000000..6056ba9 --- /dev/null +++ b/WASDMenuAPI - SRC Files/Classes/WasdMenuPlayer.cs @@ -0,0 +1,229 @@ +using System.Text; +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using WASDMenuAPI.Classes; +using WASDSharedAPI; + +namespace WASDMenuAPI; + +public class WasdMenuPlayer +{ + public CCSPlayerController player { get; set; } + public WasdMenu? MainMenu = null; + public LinkedListNode? CurrentChoice = null; + public LinkedListNode? MenuStart = null; + public string CenterHtml = ""; + public int VisibleOptions = 3; + public PlayerButtons Buttons { get; set; } + + public int scrollIndex = 0; + public int maxLength = 21; + public int scrollJump = 3; + + public void OpenMainMenu(WasdMenu? menu) + { + if (menu == null) + { + MainMenu = null; + CurrentChoice = null; + CenterHtml = ""; + return; + } + MainMenu = menu; + CurrentChoice = MainMenu.Options?.First; + MenuStart = CurrentChoice; + UpdateCenterHtml(); + } + + public void OpenSubMenu(IWasdMenu? menu) + { + if (menu == null) + { + CurrentChoice = MainMenu?.Options?.First; + MenuStart = CurrentChoice; + UpdateCenterHtml(); + return; + } + + CurrentChoice = menu.Options?.First; + MenuStart = CurrentChoice; + UpdateCenterHtml(); + } + public void GoBackToPrev(LinkedListNode? menu) + { + if (menu == null) + { + CurrentChoice = MainMenu?.Options?.First; + MenuStart = CurrentChoice; + UpdateCenterHtml(); + return; + } + + CurrentChoice = menu; + if (CurrentChoice.Value.Index >= 5 ) + { + MenuStart = CurrentChoice; + for (int i = 0; i < VisibleOptions; i++) + { + MenuStart = MenuStart?.Previous; + } + } + else + MenuStart = CurrentChoice.List?.First; + UpdateCenterHtml(); + } + + public void CloseSubMenu() + { + if (CurrentChoice?.Value.Parent?.Prev == null) + return; + GoBackToPrev(CurrentChoice?.Value.Parent.Prev); + } + + public void CloseAllSubMenus() + { + OpenSubMenu(null); + } + + public void Choose() + { + CurrentChoice?.Value.OnChoose?.Invoke(player, CurrentChoice.Value); + } + + public void ScrollDown() + { + if(CurrentChoice == null || MainMenu == null) + return; + scrollIndex = 0; + CurrentChoice = CurrentChoice.Next ?? CurrentChoice.List?.First; + MenuStart = CurrentChoice!.Value.Index >= VisibleOptions ? MenuStart!.Next : CurrentChoice.List?.First; + UpdateCenterHtml(); + } + + public void ScrollUp() + { + if(CurrentChoice == null || MainMenu == null) + return; + scrollIndex = 0; + CurrentChoice = CurrentChoice.Previous ?? CurrentChoice.List?.Last; + if (CurrentChoice == CurrentChoice?.List?.Last && CurrentChoice?.Value.Index >= VisibleOptions) + { + MenuStart = CurrentChoice; + for (int i = 0; i < VisibleOptions - 1; i++) + MenuStart = MenuStart?.Previous; + } + else + MenuStart = CurrentChoice!.Value.Index >= VisibleOptions ? MenuStart!.Previous : CurrentChoice.List?.First; + UpdateCenterHtml(); + } + + private void UpdateCenterHtml() + { + if (CurrentChoice == null || MainMenu == null || MenuStart == null) + return; + + StringBuilder builder = new(); + string endControl = ""; + LinkedListNode? option = MenuStart; + + if (option?.Value?.Parent?.Title != "") + builder.AppendLine($"{option.Value.Parent?.Title}
"); + + if (option?.Value?.Parent?.ControlText != "") + endControl = option?.Value?.Parent?.ControlText ?? ""; + + int shown = 0; + int maxOptions = VisibleOptions; + + while (shown < maxOptions && option != null && option.Value != null) + { + /* if (shown == maxOptions - 1 && option.Next != null) + { + builder.AppendLine( + $"
"); + break; + }*/ + string text = option.Value.OptionDisplay!; + if (option == CurrentChoice) + { + if (text.Length > maxLength) + { + if (scrollIndex >= text.Length - maxLength) + { + text = text.Substring(scrollIndex); + if (Server.TickCount % 32 == 0) + scrollIndex = 0; + } + else + { + text = text.Substring(scrollIndex, maxLength); + if (Server.TickCount % 32 == 0) + scrollIndex += scrollJump; + } + } + + builder.AppendLine($"
[ {text} ]
"); + } + else + builder.AppendLine($"{text.Substring(0, maxLength)}
"); + + option = option.Next; + shown++; + } + + if (!string.IsNullOrEmpty(endControl)) + builder.AppendLine(endControl); + + builder.AppendLine(""); + CenterHtml = builder.ToString(); + } + + public void UpdateActiveMenu(Dictionary> list) + { + if (list.Count == 0) + { + OpenMainMenu(null); + return; + } + + if (MainMenu == null || MainMenu.Options == null) + return; + + MainMenu.Options.Clear(); + bool choiceExists = false; + + foreach (var item in list) + { + WasdMenuOption newOption = new WasdMenuOption + { + OptionDisplay = item.Key, + OnChoose = item.Value, + Index = MainMenu.Options.Count, + Parent = MainMenu + }; + MainMenu.Options.AddLast(newOption); + + if (CurrentChoice?.Value?.OptionDisplay == item.Key) + { + CurrentChoice = MainMenu.Options?.Last; + choiceExists = true; + } + } + if (!choiceExists) + CurrentChoice = MainMenu.Options?.First; + + if (CurrentChoice != null) + { + if (CurrentChoice.Value.Index >= VisibleOptions) + { + MenuStart = CurrentChoice; + for (int i = 0; i < VisibleOptions - 1; i++) + MenuStart = MenuStart?.Previous; + } + else + MenuStart = MainMenu.Options?.First; + } + + UpdateCenterHtml(); + } +} \ No newline at end of file diff --git a/WASDMenuAPI - SRC Files/Interfaces/IWasdMenu.cs b/WASDMenuAPI - SRC Files/Interfaces/IWasdMenu.cs new file mode 100644 index 0000000..b884854 --- /dev/null +++ b/WASDMenuAPI - SRC Files/Interfaces/IWasdMenu.cs @@ -0,0 +1,13 @@ +using CounterStrikeSharp.API.Core; + +namespace WASDSharedAPI; + +public interface IWasdMenu +{ + public string? Title { get; set; } + public string? ControlText { get; set; } + public LinkedList? Options { get; set; } + // previous option node + public LinkedListNode? Prev { get; set; } + public LinkedListNode Add(string display, Action onChoice); +} \ No newline at end of file diff --git a/WASDMenuAPI - SRC Files/Interfaces/IWasdMenuManager.cs b/WASDMenuAPI - SRC Files/Interfaces/IWasdMenuManager.cs new file mode 100644 index 0000000..b895851 --- /dev/null +++ b/WASDMenuAPI - SRC Files/Interfaces/IWasdMenuManager.cs @@ -0,0 +1,21 @@ +using CounterStrikeSharp.API.Core; + +namespace WASDSharedAPI; + +public interface IWasdMenuManager +{ + //open the menu as main menu + public void OpenMainMenu(CCSPlayerController? player, IWasdMenu? menu); + //close all menus + public void CloseMenu(CCSPlayerController? player); + //close current submenu and go to previous menu/submenu + public void CloseSubMenu(CCSPlayerController? player); + //close all submenus and go to main menu + public void CloseAllSubMenus(CCSPlayerController? player); + //open menu as submenu + public void OpenSubMenu(CCSPlayerController? player, IWasdMenu? menu); + //create new menu object + public IWasdMenu CreateMenu(string title = "", string ControlText = ""); + public bool HasMenu(CCSPlayerController? player); + public void UpdateActiveMenu(CCSPlayerController? player, Dictionary> list); +} \ No newline at end of file diff --git a/WASDMenuAPI - SRC Files/Interfaces/IWasdMenuOption.cs b/WASDMenuAPI - SRC Files/Interfaces/IWasdMenuOption.cs new file mode 100644 index 0000000..be5bedb --- /dev/null +++ b/WASDMenuAPI - SRC Files/Interfaces/IWasdMenuOption.cs @@ -0,0 +1,11 @@ +using CounterStrikeSharp.API.Core; + +namespace WASDSharedAPI; + +public interface IWasdMenuOption +{ + public IWasdMenu? Parent { get; set; } + public string? OptionDisplay { get; set; } + public Action? OnChoose { get; set; } + public int Index { get; set; } +} \ No newline at end of file diff --git a/WASDMenuAPI - SRC Files/WASDMenuAPI.cs b/WASDMenuAPI - SRC Files/WASDMenuAPI.cs new file mode 100644 index 0000000..0f1897c --- /dev/null +++ b/WASDMenuAPI - SRC Files/WASDMenuAPI.cs @@ -0,0 +1,73 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using WASDMenuAPI.Classes; + +namespace WASDMenuAPI; + +public class WASDMenuAPI +{ + public string ModuleName => "WASDMenuAPI"; + public string ModuleVersion => "1.0.2"; + public string ModuleAuthor => "Interesting"; + + public static readonly Dictionary Players = []; + + public static void LoadPlugin(BasePlugin basePlugin, bool hotReload) + { + var wasdMenuManager = new WasdManager(); + basePlugin.RegisterEventHandler((@event, info) => + { + if (@event.Userid != null) + Players[@event.Userid.SteamID] = new WasdMenuPlayer + { + player = @event.Userid, + Buttons = 0 + }; + return HookResult.Continue; + }); + basePlugin.RegisterEventHandler((@event, info) => + { + if (@event.Userid != null) Players.Remove(@event.Userid.SteamID); + return HookResult.Continue; + }); + + basePlugin.RegisterListener(OnTick); + + if(hotReload) + foreach (var pl in Utilities.GetPlayers()) + { + Players[pl.SteamID] = new WasdMenuPlayer + { + player = pl, + Buttons = pl.Buttons + }; + } + } + + public static void OnTick() + { + foreach (var player in Players.Values.Where(p => p.MainMenu != null)) + { + if ((player.Buttons & PlayerButtons.Forward) == 0 && (player.player.Buttons & PlayerButtons.Forward) != 0) + { + player.ScrollUp(); + } + else if((player.Buttons & PlayerButtons.Back) == 0 && (player.player.Buttons & PlayerButtons.Back) != 0) + { + player.ScrollDown(); + } + else if((player.Buttons & PlayerButtons.Use) == 0 && (player.player.Buttons & PlayerButtons.Use) != 0) + { + player.Choose(); + } + + player.Buttons = player.player.Buttons; + if(player.CenterHtml != "") + Server.NextFrame(() => + player.player.PrintToCenterHtml(player.CenterHtml) + ); + } + } + + +} diff --git a/WASDMenuAPI - SRC Files/WASDMenuAPI.csproj b/WASDMenuAPI - SRC Files/WASDMenuAPI.csproj new file mode 100644 index 0000000..31757ff --- /dev/null +++ b/WASDMenuAPI - SRC Files/WASDMenuAPI.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/WASDMenuAPI - SRC Files/WASDMenuAPI.sln b/WASDMenuAPI - SRC Files/WASDMenuAPI.sln new file mode 100644 index 0000000..0d39d89 --- /dev/null +++ b/WASDMenuAPI - SRC Files/WASDMenuAPI.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34728.123 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WASDMenuAPI", "WASDMenuAPI.csproj", "{0119D01B-2F71-4918-B638-795C423E143F}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0119D01B-2F71-4918-B638-795C423E143F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0119D01B-2F71-4918-B638-795C423E143F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0119D01B-2F71-4918-B638-795C423E143F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0119D01B-2F71-4918-B638-795C423E143F}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {33517EB0-9056-4518-864C-37D0AFF4124B} + EndGlobalSection +EndGlobal diff --git a/jRandomSkills - SRC Files/jRandomSkills.csproj b/jRandomSkills - SRC Files/jRandomSkills.csproj index b07a38b..725b60b 100644 --- a/jRandomSkills - SRC Files/jRandomSkills.csproj +++ b/jRandomSkills - SRC Files/jRandomSkills.csproj @@ -8,6 +8,7 @@ + @@ -17,6 +18,12 @@ + + + F:\CS2 Server\server\game\csgo\addons\counterstrikesharp\plugins\jRandomSkills\WASDMenuAPI.dll + + + True diff --git a/jRandomSkills - SRC Files/src/command/Command.cs b/jRandomSkills - SRC Files/src/command/Command.cs index e45902b..cc35b03 100644 --- a/jRandomSkills - SRC Files/src/command/Command.cs +++ b/jRandomSkills - SRC Files/src/command/Command.cs @@ -48,7 +48,7 @@ namespace jRandomSkills { if (player == null) return; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo == null) return; + if (playerInfo == null || playerInfo.IsDrawing) return; var playerPawn = player.PlayerPawn.Value; if (playerPawn?.CBodyComponent == null) return; @@ -69,7 +69,7 @@ namespace jRandomSkills if (player == null || !AdminManager.PlayerHasPermissions(player, config.SetSkillCommands.Permissions)) return; var targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => !p.IsBot && (p.SteamID.ToString().Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase) - || p.PlayerName.Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase)) ); + || p.PlayerName.Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase))); if (command.ArgCount < 2) { @@ -106,6 +106,9 @@ namespace jRandomSkills skillPlayer.SpecialSkill = src.player.Skills.None; Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [targetPlayer]); + if (skill.Display) + SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{skill.Name}{ChatColors.Lime}: {skill.Description}", false); + player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); SkillUtils.PrintToChat(player, $"{Localization.GetTranslation("done_setskill")}: {ChatColors.LightRed}{skill.Name} {ChatColors.Lime}{Localization.GetTranslation("for_setskill")} {ChatColors.LightRed}{targetPlayer.PlayerName}", false); player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); @@ -175,17 +178,21 @@ namespace jRandomSkills private static void StartGame(CommandInfo command) { int cheats = command.GetArg(1) == "sv" ? 1 : 0; - Server.ExecuteCommand($"mp_freezetime {(cheats == 1 ? 0 : 5)}"); - Server.ExecuteCommand("mp_warmup_end"); - Server.ExecuteCommand("mp_restartgame 1"); + Server.ExecuteCommand($"mp_freezetime {(cheats == 1 ? 0 : 15)}"); + Server.ExecuteCommand("mp_overtime_enable 1"); + Server.ExecuteCommand($"sv_cheats {cheats}"); + Server.ExecuteCommand("mp_forcecamera 0"); - Instance.AddTimer(2.0f, () => { + if (Instance?.GameRules?.WarmupPeriod == true) + { + Server.ExecuteCommand("mp_warmup_end"); Server.PrintToChatAll($" {ChatColors.Green}{Localization.GetTranslation("game_start")}"); - Server.ExecuteCommand("mp_forcecamera 0"); - Server.ExecuteCommand($"mp_freezetime {(cheats == 1 ? 0 : 5)}"); - Server.ExecuteCommand("mp_overtime_enable 1"); - Server.ExecuteCommand($"sv_cheats {cheats}"); - }); + } + else + { + Server.ExecuteCommand("mp_restartgame 2"); + Instance?.AddTimer(2.0f, () => Server.PrintToChatAll($" {ChatColors.Green}{Localization.GetTranslation("game_start")}")); + } } [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] @@ -251,7 +258,7 @@ namespace jRandomSkills private static void Pause() { Server.PrintToChatAll($" {(gamePaused ? ChatColors.Green : ChatColors.Red)}{Localization.GetTranslation(gamePaused ? "unpause" : "pause")}"); - Server.ExecuteCommand( gamePaused ? "mp_unpause_match" : "mp_pause_match"); + Server.ExecuteCommand(gamePaused ? "mp_unpause_match" : "mp_pause_match"); gamePaused = !gamePaused; } @@ -299,7 +306,7 @@ namespace jRandomSkills Server.ExecuteCommand(param); } - [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)] + [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)] private static void Command_SetStaticSkill(CCSPlayerController? player, CommandInfo command) { Debug.WriteToDebug($"Player {player?.PlayerPawn} used the css_setstaticskill {command.ArgString} command."); @@ -348,6 +355,9 @@ namespace jRandomSkills Event.staticSkills.Add(targetPlayer.SteamID, skill); Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [targetPlayer]); + if (skill.Display) + SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{skill.Name}{ChatColors.Lime}: {skill.Description}", false); + player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); SkillUtils.PrintToChat(player, $"{Localization.GetTranslation("done_setskill")}: {ChatColors.LightRed}{skill.Name} {ChatColors.Lime}{Localization.GetTranslation("for_setskill")} {ChatColors.LightRed}{targetPlayer.PlayerName}", false); player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); diff --git a/jRandomSkills - SRC Files/src/jRandomSkills.cs b/jRandomSkills - SRC Files/src/jRandomSkills.cs index ee1be57..9443f4f 100644 --- a/jRandomSkills - SRC Files/src/jRandomSkills.cs +++ b/jRandomSkills - SRC Files/src/jRandomSkills.cs @@ -5,6 +5,7 @@ using CounterStrikeSharp.API.Modules.Commands; using jRandomSkills.src.player; using jRandomSkills.src.utils; using System.Reflection; +using WASDSharedAPI; namespace jRandomSkills { @@ -19,6 +20,7 @@ namespace jRandomSkills public List SkillPlayer { get; } = []; public Random Random { get; } = new Random(); public CCSGameRules? GameRules { get; set; } + public IWasdMenuManager? MenuManager; public override string ModuleName => "[CS2] [ jRandomSkills ]"; public override string ModuleAuthor => "D3X, Juzlus"; @@ -32,9 +34,10 @@ namespace jRandomSkills Config.Initialize(); Localization.Load(); Debug.Load(); - Event.Load(); PlayerOnTick.Load(); + Event.Load(); Command.Load(); + WASDMenuAPI.WASDMenuAPI.LoadPlugin(Instance, hotReload); LoadAllSkills(); } diff --git a/jRandomSkills - SRC Files/src/lang/en.json b/jRandomSkills - SRC Files/src/lang/en.json index 54a88e7..c9938d1 100644 --- a/jRandomSkills - SRC Files/src/lang/en.json +++ b/jRandomSkills - SRC Files/src/lang/en.json @@ -18,7 +18,7 @@ "areareaper_desc": "You can choose a bomb site to deactivate", "areareaper_incorrect_site": "No such bomb site found.", "areareaper_no_site": "No bomb sites found.", - "areareaper_select_info": "Choose the bomb site you want to deactivate:", + "areareaper_select_info": "Select site to deactivate:", "areareaper_site_disabled": "Bomb site {0} has been deactivated - no bombs can be planted there!", "areareaper_used_info": "Your skill has already been used.", @@ -66,19 +66,19 @@ "darkness_desc": "Applies a darkness effect to a chosen enemy", "darkness_enemy_info": "Let the lights go out.", "darkness_player_info": "Darkness has overtaken player '{0}'.", - "darkness_select_info": "Choose the player you want to apply the darkness effect to:", + "darkness_select_info": "Select player for darkness:", "deactivator": "Deactivator", "deactivator_desc": "Choose a player whose skill you want to disable", "deactivator_enemy_info": "Your skill has been disabled.", "deactivator_player_info": "Player '{0}'s skill has been disabled.", - "deactivator_select_info": "Choose the player whose skill you want to disable:", + "deactivator_select_info": "Disable a player's skill:", "deaf": "Deaf", "deaf_desc": "Choose a player to mute all sounds for", "deaf_enemy_info": "Your headphones have left the game.", "deaf_player_info": "Sound has been disabled for player '{0}'.", - "deaf_select_info": "Choose the player for whom you want to mute all sounds:", + "deaf_select_info": "Mute all sounds for player:", "disarmament": "Disarmament", "disarmament_desc": "You have a random chance to make an enemy drop their weapon on hit", @@ -93,7 +93,7 @@ "duplicator": "Duplicator", "duplicator_desc": "Choose a player to copy their skill", "duplicator_player_info": "Player '{0}'s skill has been copied.", - "duplicator_select_info": "Choose the player whose skill you want to copy:", + "duplicator_select_info": "Copy a player's skill:", "dwarf": "Dwarf", "dwarf_desc": "Random character size at the start of the round", @@ -129,6 +129,11 @@ "frozendecoy": "Freezing Decoy", "frozendecoy_desc": "Your decoy freezes all nearby players", + "gambler": "Gambler", + "gambler_desc": "Select a skill from the list provided.", + "gambler_select_info": "Select your skill:", + "gambler_more": "Refresh for $100", + "ghost": "Ghost", "ghost_desc": "You are completely invisible", @@ -139,7 +144,7 @@ "glitch_desc": "Disables the radar for a chosen enemy", "glitch_enemy_info": "Your radar has been disabled.", "glitch_player_info": "Player '{0}'s radar has been disabled.", - "glitch_select_info": "Choose the player whose radar you want to disable:", + "glitch_select_info": "Turn off player's radar:", "glue": "Glue", "glue_desc": "Your grenades stick to walls", @@ -171,13 +176,19 @@ "jammer_desc": "Choose a player to disable their crosshair", "jammer_enemy_info": "Your crosshair has been disabled.", "jammer_player_info": "Player '{0}'s crosshair has been disabled.", - "jammer_select_info": "Choose the player whose crosshair you want to disable:", + "jammer_select_info": "Disable player's crosshair:", + + "jester": "Jester", + "jester_desc": "In jester mode, you cannot get or take any damage. This mode changes every few seconds.", + "jester_mode": "Jester Mode", + "jester_on": "ON", + "jester_off": "OFF", "jumpban": "Legless", "jumpban_desc": "Choose a player who cannot jump", "jumpban_enemy_info": "Someone cut off your legs.", "jumpban_player_info": "Player '{0}' can no longer jump.", - "jumpban_select_info": "Choose the player who cannot jump:", + "jumpban_select_info": "Ban player from jumping:", "jumpingjack": "Jumping Jack", "jumpingjack_desc": "Jumping restores health", @@ -189,7 +200,7 @@ "lifeswap_desc": "Choose a player to swap health with", "lifeswap_enemy_info": "Someone borrowed your health.", "lifeswap_player_info": "You swapped health with player '{0}'.", - "lifeswap_select_info": "Choose the player to swap health with:", + "lifeswap_select_info": "Swap health with player:", "longknife": "Long Knife", "longknife_desc": "A primary knife attack deals damage regardless of distance", @@ -201,7 +212,7 @@ "magnifier_desc": "Forces the enemy's screen to zoom in, reducing their field of view", "magnifier_enemy_info": "Your field of view has been distorted!", "magnifier_player_info": "Player '{0}' has been forced into zoom mode.", - "magnifier_select_info": "Select the player whose screen you want to magnify:", + "magnifier_select_info": "Magnify player's screen:", "medic": "Medic", "medic_desc": "Click [css_useSkill] to use a healing charge that restores 50 health", @@ -210,7 +221,7 @@ "moneyswap_desc": "Choose a player to swap money with", "moneyswap_enemy_info": "The tax office got you.", "moneyswap_player_info": "You swapped money with player '{0}'.", - "moneyswap_select_info": "Choose the player to swap money with:", + "moneyswap_select_info": "Swap money with player:", "muhammed": "Muhammed", "muhammed_desc": "You explode upon death, killing nearby players", @@ -257,13 +268,13 @@ "poison_desc": "Choose a player who will take damage every few seconds", "poison_enemy_info": "You have been poisoned.", "poison_player_info": "Player '{0}' has been poisoned.", - "poison_select_info": "Choose the player who will take damage every few seconds:", + "poison_select_info": "Poison a player:", "primaryban": "No Rifles", "primaryban_desc": "Choose a player who cannot use rifles", "primaryban_enemy_info": "You can no longer use rifles.", "primaryban_player_info": "Player '{0}' can no longer use rifles.", - "primaryban_select_info": "Choose the player to ban from using rifles:", + "primaryban_select_info": "Ban rifles for player:", "prosthesis": "Prosthesis", "prosthesis_desc": "Arms and legs are bulletproof", @@ -353,7 +364,7 @@ "thief_desc": "You can steal a skill from a chosen player", "thief_enemy_info": "Your skill has been stolen.", "thief_player_info": "Player '{0}'s skill has been stolen.", - "thief_select_info": "Choose the player whose skill you want to steal:", + "thief_select_info": "Steal a player's skill:", "thirdeye": "Third Eye", "thirdeye_desc": "Click [css_useSkill] to activate third-person view", @@ -394,7 +405,7 @@ "no_player": "No matching player found.", "duplicate_player": "More than one player found with the same name.", "selectplayerskill_command": "Type /t", - "selectplayerskill_incorrect_enemy_index": "No player found with that index.", + "selectplayerskill_incorrect_enemy_index": "No players were found to select.", "skill_not_found_setskill": "No such CHATCOLORS.REDskill found", "player_not_found_setskill": "No such CHATCOLORS.REDplayer found", @@ -420,7 +431,12 @@ "vote_alredy_voted": "You have already voted!", "vote_vote": "Vote", + "bombsite_a": "Bombsite A", + "bombsite_b": "Bombsite B", + "teammate_skills": "Your teammates' skills", "summary_start": "======SUMMARY=OF=THE=LAST=ROUND======", - "summary_end": "=======================================" + "summary_end": "=======================================", + + "menu_controlls": "W/S - Scroll | E - Select
" } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/lang/pl.json b/jRandomSkills - SRC Files/src/lang/pl.json index 62ec12e..cbe52c8 100644 --- a/jRandomSkills - SRC Files/src/lang/pl.json +++ b/jRandomSkills - SRC Files/src/lang/pl.json @@ -18,7 +18,7 @@ "areareaper_desc": "Możesz wybrać strefę detonacji, którą chcesz dezaktywować", "areareaper_incorrect_site": "Nie znaleziono takiej strefy detonacji.", "areareaper_no_site": "Nie znaleziono żadnej strefy detonacji.", - "areareaper_select_info": "Wybierz strefę detonacji, którą chcesz dezaktywować:", + "areareaper_select_info": "Wybierz strefę do dezaktyw.:", "areareaper_site_disabled": "Strefa detonacji {0} została dezaktywowana - nie można na niej podłożyć bomby!", "areareaper_used_info": "Twoja moc została już wykorzystana.", @@ -66,19 +66,19 @@ "darkness_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi", "darkness_enemy_info": "Niech zgasną światła.", "darkness_player_info": "Ciemność opanowała gracza '{0}'.", - "darkness_select_info": "Wybierz gracza, któremu chcesz nadać efekt ciemności:", + "darkness_select_info": "Nałóż efekt ciemności:", "deactivator": "Deaktywator", "deactivator_desc": "Wybierasz gracza, którego supermoc chcesz wyłączyć", "deactivator_enemy_info": "Twoja supermoc została wyłączona.", "deactivator_player_info": "Moc gracza '{0}' została wyłączona.", - "deactivator_select_info": "Wybierz gracza, którego supermoc chcesz wyłączyć:", + "deactivator_select_info": "Wyłącz moc gracza:", "deaf": "Głuchy", "deaf_desc": "Wybierasz gracza, dla którego chcesz wyłączyć wszystkie dźwięki", "deaf_enemy_info": "Słuchawki opuściły grę.", "deaf_player_info": "Dźwięk został wyłączony dla gracza '{0}'.", - "deaf_select_info": "Wybierz gracza, dla którego chcesz wyłączyć wszystkie dźwięki:", + "deaf_select_info": "Wycisz dźwięki gracza:", "disarmament": "Rozbrojenie", "disarmament_desc": "Masz losową szanse na wyrzucenie broni wroga po trafieniu", @@ -93,7 +93,7 @@ "duplicator": "Duplikator", "duplicator_desc": "Wybierasz gracza, od którego chcesz skopiować supermoc", "duplicator_player_info": "Moc gracza '{0}' została skopiowana.", - "duplicator_select_info": "Wybierz gracza, od którego chcesz skopiować supermoc:", + "duplicator_select_info": "Skopiuj moc gracza:", "dwarf": "Mini Majk", "dwarf_desc": "Losowa wielkość postaci na początku rundy", @@ -129,6 +129,11 @@ "frozendecoy": "Zamrażający Wabik", "frozendecoy_desc": "Twój decoy zamraża wszystkich graczy w pobliżu", + "gambler": "Hazardzista", + "gambler_desc": "Wybierz umiejętność z podanej listy.", + "gambler_select_info": "Wybierz umiejętność:", + "gambler_more": "Odśwież za $100", + "ghost": "Duszek", "ghost_desc": "Jesteś całkowicie niewidzialny", @@ -139,7 +144,7 @@ "glitch_desc": "Wyłączasz radar wybranemu przeciwnikowi", "glitch_enemy_info": "Twój radar został wyłączony.", "glitch_player_info": "Radar gracza '{0}' został wyłączony.", - "glitch_select_info": "Wybierz gracza, dla którego chcesz wyłączyć radar:", + "glitch_select_info": "Wyłącz radar dla gracza:", "glue": "Klej", "glue_desc": "Twoje granaty przyklejają się do ścian", @@ -171,13 +176,19 @@ "jammer_desc": "Wybierasz gracza, dla którego chcesz wyłączyć celownik", "jammer_enemy_info": "Twój celownik został wyłączony.", "jammer_player_info": "Celownik gracza '{0}' została wyłączona.", - "jammer_select_info": "Wybierz gracza, dla którego chcesz wyłączyć celownik:", + "jammer_select_info": "Wyłącz celownik dla gracza:", + + "jester": "Błazen", + "jester_desc": "W trybie błazna nie możesz zadawać ani otrzymywać obrażeń. Tryb zmienia się co kilka sekund.", + "jester_mode": "Tryb Błazna", + "jester_on": "WŁ.", + "jester_off": "WYŁ.", "jumpban": "Beznogi", "jumpban_desc": "Wybierasz gracza, który nie będzie mógł skakać", "jumpban_enemy_info": "Ktoś odciął ci nogi.", "jumpban_player_info": "Gracz '{0}' nie może teraz skakać.", - "jumpban_select_info": "Wybierz gracza, który nie będzie mógł skakać:", + "jumpban_select_info": "Zablokuj skok dla gracza:", "jumpingjack": "Pajacyk", "jumpingjack_desc": "Skakanie przywraca zdrowie", @@ -189,7 +200,7 @@ "lifeswap_desc": "Wybierasz gracza, z którym chcesz wymienić się zdrowiem", "lifeswap_enemy_info": "Ktoś pożyczył sobie twoje zdrowie.", "lifeswap_player_info": "Wymieniłeś się zdrowiem z graczem '{0}'.", - "lifeswap_select_info": "Wybierz gracza, z którym chcesz wymienić się zdrowiem:", + "lifeswap_select_info": "Zamień się zdrowiem z graczem:", "longknife": "Długi Nóż", "longknife_desc": "Podstawowy atak nożem zadaje obrażenia niezależnie od odległości", @@ -201,7 +212,7 @@ "magnifier_desc": "Przybiżasz ekran wybranemu przeciwnikowi", "magnifier_enemy_info": "Twoje pole widzenia zostało zniekształcone!", "magnifier_player_info": "Gracz '{0}' został zmuszony do przejścia w tryb powiększenia.", - "magnifier_select_info": "Wybierz gracza, którego ekran chcesz powiększyć:", + "magnifier_select_info": "Powiększ ekran gracza:", "medic": "Medyk", "medic_desc": "Kliknij [css_useSkill], aby użyć ładunku leczniczego, który przywraca 50 punktów zdrowia", @@ -210,7 +221,7 @@ "moneyswap_desc": "Wybierasz gracza, z którym chcesz zamienić się pieniędzmi", "moneyswap_enemy_info": "Urząd skarbowy cię dopadł.", "moneyswap_player_info": "Wymieniłeś swoje pieniądze z graczem '{0}'.", - "moneyswap_select_info": "Wybierz gracza, z którym chcesz zamienić się pieniędzmi:", + "moneyswap_select_info": "Zamień się kasą z graczem:", "muhammed": "Muhammed", "muhammed_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu", @@ -257,13 +268,13 @@ "poison_desc": "Wybierasz gracza, który co kilka sekund będzie otrzymywał obrażenia", "poison_enemy_info": "Zostałeś otruty.", "poison_player_info": "Gracz '{0}' został otruty.", - "poison_select_info": "Wybierz gracza, który co kilka sekund będzie otrzymywał obrażenia:", + "poison_select_info": "Zatruj gracza:", "primaryban": "Brak Karabinów", "primaryban_desc": "Wybierasz gracza, który nie może używać karabinów", "primaryban_enemy_info": "Nie możesz już używać karabinów.", "primaryban_player_info": "Gracz '{0}' nie może już używać karabinów.", - "primaryban_select_info": "Wybierz gracza, któremu chcesz zabronić używania karabinów:", + "primaryban_select_info": "Zablokuj karabiny dla gracza:", "prosthesis": "Proteza", "prosthesis_desc": "Ramiona i nogi są kuloodporne", @@ -353,7 +364,7 @@ "thief_desc": "Możesz ukraść supermoc wybranemu graczowi", "thief_enemy_info": "Twoja supermoc została skradziona.", "thief_player_info": "Moc gracza '{0}' została skradziona.", - "thief_select_info": "Wybierz gracza, którego supermoc chcesz ukraść:", + "thief_select_info": "Ukradnij moc gracza:", "thirdeye": "Trzecie Oko", "thirdeye_desc": "Kliknij [css_useSkill], aby aktywować trzecią osobę", @@ -394,7 +405,7 @@ "no_player": "Nie znaleziono pasującego gracza.", "duplicate_player": "Znaleziono więcej niż jednego gracza o tej samej nazwie.", "selectplayerskill_command": "Wpisz /t", - "selectplayerskill_incorrect_enemy_index": "Nie znaleziono gracza o takim index'ie.", + "selectplayerskill_incorrect_enemy_index": "Nie znaleziono graczy do wyboru.", "skill_not_found_setskill": "Nie znaleziono takiej CHATCOLORS.REDsupermocy", "player_not_found_setskill": "Nie znaleziono takiego CHATCOLORS.REDgracza", @@ -420,7 +431,12 @@ "vote_alredy_voted": "Już zagłosowałeś!", "vote_vote": "Głosowanie", + "bombsite_a": "Strefa detonacji A", + "bombsite_b": "Strefa detonacji B", + "teammate_skills": "Supermoce twoich sojuszników", "summary_start": "======PODSUMOWANIE=Z=OSTATNIEJ=RUNDY======", - "summary_end": "============================================" + "summary_end": "============================================", + + "menu_controlls": "W/S – Przewijanie | E - Wybierz
" } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/lang/pt-br.json b/jRandomSkills - SRC Files/src/lang/pt-br.json index 4800a5f..cfe3369 100644 --- a/jRandomSkills - SRC Files/src/lang/pt-br.json +++ b/jRandomSkills - SRC Files/src/lang/pt-br.json @@ -18,7 +18,7 @@ "areareaper_desc": "Você pode escolher um local de bomba para desativar", "areareaper_incorrect_site": "Nenhum local de bomba encontrado.", "areareaper_no_site": "Nenhum local de bomba encontrado.", - "areareaper_select_info": "Escolha o local de bomba que deseja desativar:", + "areareaper_select_info": "Escolha área p/ desativar:", "areareaper_site_disabled": "Local de bomba {0} foi desativado - nenhuma bomba pode ser plantada lá!", "areareaper_used_info": "Seu poder já foi usado.", @@ -66,19 +66,19 @@ "darkness_desc": "Aplica um efeito de escuridão a um inimigo escolhido", "darkness_enemy_info": "Que as luzes se apaguem.", "darkness_player_info": "A escuridão tomou conta do jogador '{0}'.", - "darkness_select_info": "Escolha o jogador ao qual deseja aplicar o efeito de escuridão:", + "darkness_select_info": "Escolha jogador: escuridão:", "deactivator": "Desativador", "deactivator_desc": "Escolha um jogador cuja habilidade você deseja desativar", "deactivator_enemy_info": "Sua habilidade foi desativada.", "deactivator_player_info": "A habilidade do jogador '{0}' foi desativada.", - "deactivator_select_info": "Escolha o jogador cuja habilidade você deseja desativar:", + "deactivator_select_info": "Desativar skill do jogador:", "deaf": "Surdo", "deaf_desc": "Escolha um jogador para silenciar todos os sons", "deaf_enemy_info": "Seus fones de ouvido saíram do jogo.", "deaf_player_info": "O som foi desativado para o jogador '{0}'.", - "deaf_select_info": "Escolha o jogador para quem deseja silenciar todos os sons:", + "deaf_select_info": "Silenciar jogador:", "disarmament": "Desarmamento", "disarmament_desc": "Você tem uma chance aleatória de fazer um inimigo largar sua arma ao acertá-lo", @@ -93,7 +93,7 @@ "duplicator": "Duplicador", "duplicator_desc": "Escolha um jogador para copiar sua habilidade", "duplicator_player_info": "A habilidade do jogador '{0}' foi copiada.", - "duplicator_select_info": "Escolha o jogador cuja habilidade você deseja copiar:", + "duplicator_select_info": "Copiar skill do jogador:", "dwarf": "Anão", "dwarf_desc": "Tamanho de personagem aleatório no início da rodada", @@ -129,6 +129,11 @@ "frozendecoy": "Chamariz Congelante", "frozendecoy_desc": "Seu chamariz congela todos os jogadores próximos", + "gambler": "Apostador", + "gambler_desc": "Selecione uma habilidade da lista.", + "gambler_select_info": "Escolha sua habilidade:", + "gambler_more": "Atualizar por $100", + "ghost": "Fantasma", "ghost_desc": "Você é completamente invisível", @@ -139,7 +144,7 @@ "glitch_desc": "Desativa o radar de um inimigo escolhido", "glitch_enemy_info": "Seu radar foi desativado.", "glitch_player_info": "O radar do jogador '{0}' foi desativado.", - "glitch_select_info": "Escolha o jogador cujo radar você deseja desativar:", + "glitch_select_info": "Desativar radar do jogador:", "glue": "Cola", "glue_desc": "Suas granadas grudam nas paredes", @@ -171,13 +176,19 @@ "jammer_desc": "Escolha um jogador para desativar sua mira", "jammer_enemy_info": "Sua mira foi desativada.", "jammer_player_info": "A mira do jogador '{0}' foi desativada.", - "jammer_select_info": "Escolha o jogador cuja mira você deseja desativar:", + "jammer_select_info": "Desativar mira do jogador:", + + "jester": "Bobo", + "jester_desc": "No modo bobo você não pode causar nem receber dano. Esse modo muda a cada poucos segundos.", + "jester_mode": "Modo Bobo", + "jester_on": "LIG.", + "jester_off": "DESL.", "jumpban": "Sem Pernas", "jumpban_desc": "Escolha um jogador que não poderá pular", "jumpban_enemy_info": "Alguém cortou suas pernas.", "jumpban_player_info": "O jogador '{0}' não pode mais pular.", - "jumpban_select_info": "Escolha o jogador que não poderá pular:", + "jumpban_select_info": "Banir pulo do jogador:", "jumpingjack": "Pula-Pula", "jumpingjack_desc": "Pular restaura saúde", @@ -189,7 +200,7 @@ "lifeswap_desc": "Escolha um jogador para trocar saúde com ele", "lifeswap_enemy_info": "Alguém pegou sua saúde emprestada.", "lifeswap_player_info": "Você trocou saúde com o jogador '{0}'.", - "lifeswap_select_info": "Escolha o jogador com quem deseja trocar saúde:", + "lifeswap_select_info": "Trocar vida com jogador:", "longknife": "Faca Longa", "longknife_desc": "Um ataque com faca primária causa dano independentemente da distância", @@ -201,7 +212,7 @@ "magnifier_desc": "Força a tela do inimigo a ampliar, reduzindo seu campo de visão", "magnifier_enemy_info": "Seu campo de visão foi distorcido!", "magnifier_player_info": "O jogador ‘{0}’ foi forçado a entrar no modo de zoom.", - "magnifier_select_info": "Selecione o jogador cuja tela você deseja ampliar:", + "magnifier_select_info": "Ampliar tela do jogador:", "medic": "Médico", "medic_desc": "Clique em [css_useSkill] para usar uma carga de cura que restaura 50 de saúde", @@ -210,7 +221,7 @@ "moneyswap_desc": "Escolha um jogador para trocar dinheiro com ele", "moneyswap_enemy_info": "A receita federal te pegou.", "moneyswap_player_info": "Você trocou dinheiro com o jogador '{0}'.", - "moneyswap_select_info": "Escolha o jogador com quem deseja trocar dinheiro:", + "moneyswap_select_info": "Trocar dinheiro c/ jogador:", "muhammed": "Muhammed", "muhammed_desc": "Você explode ao morrer, matando jogadores próximos", @@ -257,13 +268,13 @@ "poison_desc": "Escolha um jogador que receberá dano a cada poucos segundos", "poison_enemy_info": "Você foi envenenado.", "poison_player_info": "O jogador '{0}' foi envenenado.", - "poison_select_info": "Escolha o jogador que receberá dano a cada poucos segundos:", + "poison_select_info": "Envenenar jogador:", "primaryban": "Sem Rifles", "primaryban_desc": "Escolha um jogador que não poderá usar rifles", "primaryban_enemy_info": "Você não pode mais usar rifles.", "primaryban_player_info": "O jogador '{0}' não pode mais usar rifles.", - "primaryban_select_info": "Escolha o jogador para proibir de usar rifles:", + "primaryban_select_info": "Banir rifles do jogador:", "prosthesis": "Prótese", "prosthesis_desc": "Braços e pernas são à prova de balas", @@ -353,7 +364,7 @@ "thief_desc": "Você pode roubar uma habilidade de um jogador escolhido", "thief_enemy_info": "Sua habilidade foi roubada.", "thief_player_info": "A habilidade do jogador '{0}' foi roubada.", - "thief_select_info": "Escolha o jogador cuja habilidade você deseja roubar:", + "thief_select_info": "Roubar skill do jogador:", "thirdeye": "Terceiro Olho", "thirdeye_desc": "Clique em [css_useSkill] para ativar a visão em terceira pessoa", @@ -394,7 +405,7 @@ "no_player": "Nenhum jogador correspondente encontrado.", "duplicate_player": "Mais de um jogador encontrado com o mesmo nome.", "selectplayerskill_command": "Digite /t", - "selectplayerskill_incorrect_enemy_index": "Nenhum jogador encontrado com esse índice.", + "selectplayerskill_incorrect_enemy_index": "Não foram encontrados jogadores para selecionar.", "skill_not_found_setskill": "Nenhuma habilidade CHATCOLORS.RED encontrada", "player_not_found_setskill": "Nenhum jogador CHATCOLORS.RED encontrado", @@ -420,7 +431,12 @@ "vote_alredy_voted": "Você já votou!", "vote_vote": "Votar", + "bombsite_a": "Zona de detonação A", + "bombsite_b": "Zona de detonação B", + "teammate_skills": "Habilidades dos seus companheiros de equipe", "summary_start": "=======RESUMO=DA=ÚLTIMA=RODADA=======", - "summary_end": "=======================================" + "summary_end": "=======================================", + + "menu_controlls": "W/S - Rolar | E - Selecionar
" } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/lang/zh.json b/jRandomSkills - SRC Files/src/lang/zh.json index 84855f6..a4aed64 100644 --- a/jRandomSkills - SRC Files/src/lang/zh.json +++ b/jRandomSkills - SRC Files/src/lang/zh.json @@ -129,6 +129,11 @@ "frozendecoy": "冰冻诱饵", "frozendecoy_desc": "你的诱饵弹会冻结附近的所有玩家", + "gambler": "赌徒", + "gambler_desc": "从提供的列表中选择一个技能。", + "gambler_select_info": "选择你的技能:", + "gambler_more": "刷新 $100", + "ghost": "幽灵", "ghost_desc": "你完全隐形", @@ -173,6 +178,12 @@ "jammer_player_info": "玩家 '{0}' 的准星已被禁用。", "jammer_select_info": "选择你想禁用其准星的玩家:", + "jester": "小丑", + "jester_desc": "在小丑模式下,你不能造成或受到任何伤害。此模式每隔几秒会变化。", + "jester_mode": "小丑模式", + "jester_on": "开", + "jester_off": "关", + "jumpban": "无腿", "jumpban_desc": "选择一个玩家使其无法跳跃", "jumpban_enemy_info": "有人切断了你的腿。", @@ -394,7 +405,7 @@ "no_player": "未找到匹配的玩家。", "duplicate_player": "找到多个同名玩家。", "selectplayerskill_command": "输入 /t", - "selectplayerskill_incorrect_enemy_index": "未找到该索引的玩家。", + "selectplayerskill_incorrect_enemy_index": "未找到可供选择的玩家。", "skill_not_found_setskill": "未找到 CHATCOLORS.RED 技能", "player_not_found_setskill": "未找到 CHATCOLORS.RED 玩家", @@ -420,7 +431,12 @@ "vote_alredy_voted": "您已投票!", "vote_vote": "投票", + "bombsite_a": "爆轰区A", + "bombsite_b": "爆轰区B", + "teammate_skills": "你队友的技能", "summary_start": "=============上一回合总结==============", - "summary_end": "=======================================" + "summary_end": "=======================================", + + "menu_controlls": "W/S - 滚动 | E - 选择
" } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/ISkill.cs b/jRandomSkills - SRC Files/src/player/ISkill.cs index ee6c6e3..c699e10 100644 --- a/jRandomSkills - SRC Files/src/player/ISkill.cs +++ b/jRandomSkills - SRC Files/src/player/ISkill.cs @@ -1,14 +1,47 @@ using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core.Attributes; +using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; +using CounterStrikeSharp.API.Modules.UserMessages; namespace jRandomSkills.src.player; public interface ISkill { public static void LoadSkill() { } - public static void EnableSkill(CCSPlayerController player) { } - public static void DisableSkill(CCSPlayerController player) { } - public static void UseSkill(CCSPlayerController player) { } - public static void TypeSkill(CCSPlayerController player, string[] commands) { } + public static void EnableSkill(CCSPlayerController _) { } + public static void DisableSkill(CCSPlayerController _) { } + public static void UseSkill(CCSPlayerController _) { } + public static void TypeSkill(CCSPlayerController _, string[] __) { } + + public static void OnTakeDamage(DynamicHook _) { } + public static void OnEntitySpawned(CEntityInstance _) { } + public static void OnTick() { } + public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList _) { } + + public static void NewRound() { } + public static void PlayerMakeSound(UserMessage _) { } + public static void PlayerBlind(EventPlayerBlind _) { } + public static void PlayerHurt(EventPlayerHurt _) { } + public static void PlayerDeath(EventPlayerDeath _) { } + public static void PlayerJump(EventPlayerJump _) { } + + public static void WeaponFire(EventWeaponFire _) { } + public static void WeaponEquip(EventItemEquip _) { } + public static void WeaponPickup(EventItemPickup _) { } + public static void WeaponReload(EventWeaponReload _) { } + public static void GrenadeThrown(EventGrenadeThrown _) { } + + public static void BombBeginplant(EventBombBeginplant _) { } + public static void BombPlanted(EventBombPlanted _) { } + public static void BombBegindefuse(EventBombBegindefuse _) { } + + public static void DecoyStarted(EventDecoyStarted _) { } + public static void DecoyDetonate(EventDecoyDetonate _) { } + + public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate _) { } + public static void SmokegrenadeExpired(EventSmokegrenadeExpired _) { } + + public class SkillConfig { } } public enum Skills @@ -48,6 +81,7 @@ public enum Skills FragileBomb, FriendlyFire, FrozenDecoy, + Gambler, Ghost, Glaz, Glitch, @@ -60,6 +94,7 @@ public enum Skills InfiniteAmmo, Jackal, Jammer, + Jester, JumpBan, JumpingJack, KillerFlash, diff --git a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs index 425529c..2b4352f 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs @@ -1,297 +1,513 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Cvars; +using CounterStrikeSharp.API.Modules.Memory; +using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; +using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; using System.Text.RegularExpressions; -using static jRandomSkills.Config; +using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills { public static partial class Event { - private static readonly jSkill_SkillInfo noneSkill = new(Skills.None, Config.GetValue(Skills.None, "color"), false); + public static bool enableTransmit = false; + public static readonly jSkill_SkillInfo noneSkill = new(Skills.None, Config.GetValue(Skills.None, "color"), false); private static jSkill_SkillInfo ctSkill = noneSkill; private static jSkill_SkillInfo tSkill = noneSkill; private static jSkill_SkillInfo allSkill = noneSkill; private static List debugSkills = new(SkillData.Skills); + public static readonly Config.DefaultSkillInfo[] terroristSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == (int)CsTeam.Terrorist).ToArray(); + public static readonly Config.DefaultSkillInfo[] counterterroristSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == (int)CsTeam.CounterTerrorist).ToArray(); + private static readonly Config.DefaultSkillInfo[] allTeamsSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == 0).ToArray(); + private static readonly Dictionary> playersSkills = []; public static readonly Dictionary staticSkills = []; public static void Load() { - Instance.RegisterEventHandler((@event, info) => + Instance.RegisterEventHandler(PlayerConnectFull); + Instance.RegisterEventHandler(PlayerDisconnect); + Instance.RegisterEventHandler(RoundStart); + Instance.RegisterEventHandler(RoundEnd); + + Instance.RegisterEventHandler(PlayerDeath); + Instance.RegisterEventHandler(PlayerBlind); + Instance.RegisterEventHandler(PlayerHurt); + Instance.RegisterEventHandler(PlayerJump); + + Instance.RegisterEventHandler(WeaponFire); + Instance.RegisterEventHandler(WeaponEquip); + Instance.RegisterEventHandler(WeaponPickup); + Instance.RegisterEventHandler(WeaponReload); + Instance.RegisterEventHandler(GrenadeThrown); + + Instance.RegisterEventHandler(BombBeginplant); + Instance.RegisterEventHandler(BombPlanted); + Instance.RegisterEventHandler(BombBegindefuse); + + Instance.RegisterEventHandler(DecoyStarted); + Instance.RegisterEventHandler(DecoyDetonate); + + Instance.RegisterEventHandler(SmokegrenadeDetonate); + Instance.RegisterEventHandler(SmokegrenadeExpired); + + Instance.RegisterListener(CheckUseSkill); + Instance.RegisterListener(EntitySpawned); + Instance.RegisterListener(OnTick); + + Instance.HookUserMessage(208, PlayerMakeSound); + VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); + } + + private static HookResult PlayerMakeSound(UserMessage um) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerMakeSound", [um]); + return HookResult.Continue; + } + + private static HookResult WeaponFire(EventWeaponFire @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponFire", [@event]); + return HookResult.Continue; + } + + private static HookResult WeaponEquip(EventItemEquip @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponEquip", [@event]); + return HookResult.Continue; + } + + private static HookResult WeaponPickup(EventItemPickup @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponPickup", [@event]); + return HookResult.Continue; + } + + private static HookResult WeaponReload(EventWeaponReload @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "WeaponReload", [@event]); + return HookResult.Continue; + } + + private static HookResult GrenadeThrown(EventGrenadeThrown @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "GrenadeThrown", [@event]); + return HookResult.Continue; + } + + private static HookResult BombBeginplant(EventBombBeginplant @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "BombBeginplant", [@event]); + return HookResult.Continue; + } + + private static HookResult BombPlanted(EventBombPlanted @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "BombPlanted", [@event]); + return HookResult.Continue; + } + + private static HookResult BombBegindefuse(EventBombBegindefuse @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "BombBegindefuse", [@event]); + return HookResult.Continue; + } + + private static HookResult DecoyStarted(EventDecoyStarted @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "DecoyStarted", [@event]); + return HookResult.Continue; + } + + private static HookResult DecoyDetonate(EventDecoyDetonate @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "DecoyDetonate", [@event]); + return HookResult.Continue; + } + + private static HookResult SmokegrenadeDetonate(EventSmokegrenadeDetonate @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "SmokegrenadeDetonate", [@event]); + return HookResult.Continue; + } + + private static HookResult SmokegrenadeExpired(EventSmokegrenadeExpired @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "SmokegrenadeExpired", [@event]); + return HookResult.Continue; + } + + private static HookResult PlayerHurt(EventPlayerHurt @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerHurt", [@event]); + return HookResult.Continue; + } + + private static HookResult PlayerJump(EventPlayerJump @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerJump", [@event]); + return HookResult.Continue; + } + + private static HookResult PlayerBlind(EventPlayerBlind @event, GameEventInfo info) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "PlayerBlind", [@event]); + return HookResult.Continue; + } + + private static HookResult OnTakeDamage(DynamicHook h) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "OnTakeDamage", [h]); + return HookResult.Continue; + } + + private static void OnTick() + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "OnTick"); + } + + private static HookResult PlayerConnectFull(EventPlayerConnectFull @event, GameEventInfo info) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return HookResult.Continue; + + Instance.SkillPlayer.Add(new jSkill_PlayerInfo { - var player = @event.Userid; - - if (player == null || !player.IsValid) return HookResult.Continue; - - Instance.SkillPlayer.Add(new jSkill_PlayerInfo - { - SteamID = player.SteamID, - PlayerName = player.PlayerName, - Skill = Skills.None, - SpecialSkill = Skills.None, - IsDrawing = false, - SkillChance = 1, - }); - - const string defaultWelcomeMsg = "Welcome {PLAYER}, to the {SERVER_NAME} server!\n" - + "The current version of the jRandomSkills: {VERSION} ({SKILLS_COUNT} skills).\n\n" - + "Original plugin created by:\n{AUTHOR1}\n" - + "Modified and improved by:\n{AUTHOR2}"; - string langWelcomeMsg = Localization.GetTranslation("welcome_message", "welcome"); - string welcomeMsg = MyRegex().IsMatch(langWelcomeMsg) && MyRegex1().IsMatch(langWelcomeMsg) ? langWelcomeMsg : defaultWelcomeMsg; - - foreach (string line in welcomeMsg.Split("\n")) - player.PrintToChat($" {ChatColors.Green}" + line.Replace("{PLAYER}", $" {ChatColors.Red}{player.PlayerName}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) - .Replace("{SERVER_NAME}", $" {ChatColors.Red}{ConVar.Find("hostname")?.StringValue ?? "Default Server"}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) - .Replace("{VERSION}", $" {ChatColors.Red}v{Instance.ModuleVersion}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) - .Replace("{SKILLS_COUNT}", $" {ChatColors.Red}{SkillData.Skills.Count - 1}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) - .Replace("{AUTHOR1}", $" {ChatColors.Red}Jakub Bartosik (D3X){ChatColors.Green} ({ChatColors.Red}https://github.com/jakubbartosik/dRandomSkills{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; + SteamID = player.SteamID, + PlayerName = player.PlayerName, + Skill = Skills.None, + SpecialSkill = Skills.None, + IsDrawing = false, + SkillChance = 1, }); - Instance.RegisterEventHandler((@event, info) => + const string defaultWelcomeMsg = "Welcome {PLAYER}, to the {SERVER_NAME} server!\n" + + "The current version of the jRandomSkills: {VERSION} ({SKILLS_COUNT} skills).\n\n" + + "Original plugin created by:\n{AUTHOR1}\n" + + "Modified and improved by:\n{AUTHOR2}"; + string langWelcomeMsg = Localization.GetTranslation("welcome_message", "welcome"); + string welcomeMsg = MyRegex().IsMatch(langWelcomeMsg) && MyRegex1().IsMatch(langWelcomeMsg) ? langWelcomeMsg : defaultWelcomeMsg; + + foreach (string line in welcomeMsg.Split("\n")) + player.PrintToChat($" {ChatColors.Green}" + line.Replace("{PLAYER}", $" {ChatColors.Red}{player.PlayerName}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) + .Replace("{SERVER_NAME}", $" {ChatColors.Red}{ConVar.Find("hostname")?.StringValue ?? "Default Server"}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) + .Replace("{VERSION}", $" {ChatColors.Red}v{Instance.ModuleVersion}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) + .Replace("{SKILLS_COUNT}", $" {ChatColors.Red}{SkillData.Skills.Count - 1}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) + .Replace("{AUTHOR1}", $" {ChatColors.Red}Jakub Bartosik (D3X){ChatColors.Green} ({ChatColors.Red}https://github.com/jakubbartosik/dRandomSkills{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; + } + + private static HookResult PlayerDisconnect(EventPlayerDisconnect @event, GameEventInfo info) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return HookResult.Continue; + + var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (skillPlayer != null) + Instance.SkillPlayer.Remove(skillPlayer); + return HookResult.Continue; + } + + private static HookResult RoundStart(EventRoundStart @event, GameEventInfo info) + { + enableTransmit = false; + Instance.AddTimer(.1f, () => DisableAll()); + foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid && !p.IsBot && !p.IsHLTV && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) { - var player = @event.Userid; - - if (player == null || !player.IsValid) return HookResult.Continue; - var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (skillPlayer != null) - { - Instance.SkillPlayer.Remove(skillPlayer); - } + if (skillPlayer == null) continue; + skillPlayer.IsDrawing = true; + } - return HookResult.Continue; - }); + Instance.RemoveListener(CheckTransmit); + int freezetime = ConVar.Find("mp_freezetime")?.GetPrimitiveValue() ?? 0; + Instance.AddTimer(Math.Max(freezetime - Config.LoadedConfig.Settings.SkillTimeBeforeStart, 0) + .3f, SetSkill); + return HookResult.Continue; + } - Instance.RegisterEventHandler((@event, info) => + private static void DisableAll() + { + foreach (var player in Utilities.GetPlayers().Where(p => !p.IsBot)) { - foreach (var player in Utilities.GetPlayers()) - { - var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (skillPlayer != null) - skillPlayer.IsDrawing = true; - } + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; + Instance.SkillAction(playerInfo.Skill.ToString(), "DisableSkill", [player]); + Instance.SkillAction(playerInfo.Skill.ToString(), "NewRound"); + } + } - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => + private static HookResult RoundEnd(EventRoundEnd @event, GameEventInfo info) + { + foreach (var player in Utilities.GetPlayers()) { - foreach (var player in Utilities.GetPlayers()) + Instance.AddTimer(0.5f, () => { - Instance.AddTimer(0.5f, () => + var _players = Utilities.GetPlayers().Where(p => p.IsValid).OrderBy(p => p.Team); + + string skillsText = ""; + foreach (var _player in _players) { - var _players = Utilities.GetPlayers().Where(p => p.IsValid).OrderBy(p => p.Team); - - string skillsText = ""; - foreach (var _player in _players) + var _playerSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == _player.SteamID); + if (_playerSkill != null) { - var _playerSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == _player.SteamID); - if (_playerSkill != null) + var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == _playerSkill.Skill); + var specialSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == _playerSkill.SpecialSkill); + if (skillInfo == null) continue; + skillsText += $" {ChatColors.DarkRed}{_player.PlayerName}{ChatColors.Lime}: {(_playerSkill.SpecialSkill == Skills.None || specialSkillInfo == null ? skillInfo.Name : $"{specialSkillInfo.Name} -> {skillInfo.Name}")}\n"; + } + } + + if (Config.LoadedConfig.Settings.SummaryAfterTheRound && !string.IsNullOrEmpty(skillsText)) + { + player.PrintToChat(" "); + player.PrintToChat($" {ChatColors.Lime}{Localization.GetTranslation("summary_start")}"); + foreach (string text in skillsText.Split("\n")) + if (!string.IsNullOrEmpty(text)) + player.PrintToChat(text); + player.PrintToChat($" {ChatColors.Lime}{Localization.GetTranslation("summary_end")}"); + player.PrintToChat(" \n"); + } + }); + } + return HookResult.Continue; + } + + private static HookResult PlayerDeath(EventPlayerDeath @event, GameEventInfo info) + { + var victim = @event.Userid; + var attacker = @event.Attacker; + if (victim == null || attacker == null) return HookResult.Continue; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); + if (playerInfo == null || playerInfo.IsDrawing) return HookResult.Continue; + Instance.SkillAction(playerInfo.Skill.ToString(), "PlayerDeath", [@event]); + Instance.SkillAction(playerInfo.Skill.ToString(), "DisableSkill", [victim]); + + if (victim == attacker) return HookResult.Continue; + if (Config.LoadedConfig.Settings.KillerSkillInfo) + { + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); + if (attackerInfo != null) + { + var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.Skill); + var specialSkillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.SpecialSkill); + if (skillData == null || specialSkillData == null) return HookResult.Continue; + string skillDesc = skillData.Description; + + SkillUtils.PrintToChat(victim, $"{Localization.GetTranslation("enemy_skill")} {ChatColors.DarkRed}{attacker.PlayerName}{ChatColors.Lime}:", false); + SkillUtils.PrintToChat(victim, $"{ChatColors.DarkRed}{(attackerInfo.SpecialSkill == Skills.None ? skillData.Name : $"{specialSkillData.Name} -> {skillData.Name}")}{ChatColors.Lime} - {skillDesc}", false); + } + } + return HookResult.Continue; + } + + private static void CheckUseSkill(CCSPlayerController player, PlayerButtons pressed, PlayerButtons released) + { + string? button = Config.LoadedConfig.Settings.AlternativeSkillButton; + if (string.IsNullOrEmpty(button)) return; + + if (Enum.TryParse(button, out var skillButton)) + { + if (pressed != skillButton) return; + } else return; + + if (player == null) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null || playerInfo.IsDrawing) return; + + var playerPawn = player.PlayerPawn.Value; + if (playerPawn?.CBodyComponent == null) return; + if (!player.IsValid || !player.PawnIsAlive) return; + + Debug.WriteToDebug($"Player {player.PlayerName} used the skill: {playerInfo.Skill} by PlayerButtons: {pressed}"); + Instance.SkillAction(playerInfo.Skill.ToString(), "UseSkill", [player]); + } + + private static void EntitySpawned(CEntityInstance entity) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "OnEntitySpawned", [entity]); + } + + 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(); + + if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.TeamSkills) + { + List tSkills = new(SkillData.Skills); + tSkills.RemoveAll(s => s.Skill == tSkill.Skill || s.Skill == Skills.None || counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); + tSkill = tSkills.Count == 0 ? new(Skills.None, Config.GetValue(Skills.None, "color"), false) : tSkills[Instance.Random.Next(tSkills.Count)]; + + List ctSkills = new(SkillData.Skills); + ctSkills.RemoveAll(s => s.Skill == ctSkill.Skill || s.Skill == Skills.None || terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); + ctSkill = ctSkills.Count == 0 ? new(Skills.None, Config.GetValue(Skills.None, "color"), false) : ctSkills[Instance.Random.Next(ctSkills.Count)]; + } + else if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.SameSkills) + { + List allSkills = new(SkillData.Skills); + allSkills.RemoveAll(s => s.Skill == allSkill.Skill || s.Skill == Skills.None || !allTeamsSkills.Any(s2 => s2.Name == s.Skill.ToString())); + allSkill = allSkills.Count == 0 ? new(Skills.None, Config.GetValue(Skills.None, "color"), false) : allSkills[Instance.Random.Next(allSkills.Count)]; + } + else if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.Debug && debugSkills.Count == 0) + debugSkills = new(SkillData.Skills); + + foreach (var player in validPlayers) + { + if (player == null) continue; + var teammates = validPlayers.Where(p => p.Team == player.Team && p != player); + string teammateSkills = ""; + + var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (skillPlayer == null) continue; + + if (player.PlayerPawn.Value == null || !player.PlayerPawn.IsValid) + { + skillPlayer.Skill = Skills.None; + continue; + } + + skillPlayer.IsDrawing = false; + jSkill_SkillInfo randomSkill = new(Skills.None, Config.GetValue(Skills.None, "color"), false); + + if (Instance?.GameRules != null && Instance?.GameRules.WarmupPeriod == false) + { + Config.GameModes gameMode = (Config.GameModes)Config.LoadedConfig.Settings.GameMode; + if (staticSkills.TryGetValue(player.SteamID, out var staticSkill)) + randomSkill = staticSkill; + else if (gameMode == Config.GameModes.Normal || gameMode == Config.GameModes.NoRepeat) + { + List skillList = new(SkillData.Skills); + skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None); + + if (validPlayers.Count(p => p.Team == player.Team) == 1) + { + Config.DefaultSkillInfo[] skillsNeedsTeammates = Config.LoadedConfig.SkillsInfo.Where(s => s.NeedsTeammates).ToArray(); + skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString())); + } + + if (player.Team == CsTeam.Terrorist) + skillList.RemoveAll(s => counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); + else + skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); + + if (gameMode == Config.GameModes.NoRepeat && playersSkills.TryGetValue(player.SteamID, out List? skills)) + { + skillList.RemoveAll(s => skills.Any(s2 => s2.Skill == s.Skill)); + if (skillList.Count == 0) skills.Clear(); + } + + randomSkill = skillList.Count == 0 ? noneSkill : skillList[Instance.Random.Next(skillList.Count)]; + if (gameMode == Config.GameModes.NoRepeat) + { + if (playersSkills.TryGetValue(player.SteamID, out List? value)) + value.Add(randomSkill); + else + playersSkills.Add(player.SteamID, [randomSkill]); + } + } + else if (gameMode == Config.GameModes.TeamSkills) + randomSkill = player.Team == CsTeam.Terrorist ? tSkill : ctSkill; + else if (gameMode == Config.GameModes.SameSkills) + randomSkill = allSkill; + else if (gameMode == Config.GameModes.Debug) + { + if (debugSkills.Count == 0) + debugSkills = new List(SkillData.Skills); + randomSkill = debugSkills[0]; + debugSkills.RemoveAt(0); + player.PrintToChat($"{SkillData.Skills.Count - debugSkills.Count}/{SkillData.Skills.Count}"); + } + } + + if (randomSkill.Display) + SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{randomSkill.Name}{ChatColors.Lime}: {randomSkill.Description}", false); + + skillPlayer.Skill = randomSkill.Skill; + skillPlayer.SpecialSkill = Skills.None; + Instance?.SkillAction(randomSkill.Skill.ToString(), "EnableSkill", new [] { player }); + Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{randomSkill.Name}\"."); + + if (Config.LoadedConfig.Settings.TeamMateSkillInfo) + { + Instance?.AddTimer(0.5f, () => + { + foreach (var teammate in teammates) + { + var teammateSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == teammate.SteamID)?.Skill; + if (teammateSkill != null) { - var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == _playerSkill.Skill); - var specialSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == _playerSkill.SpecialSkill); - if (skillInfo == null) continue; - skillsText += $" {ChatColors.DarkRed}{_player.PlayerName}{ChatColors.Lime}: {(_playerSkill.SpecialSkill == Skills.None || specialSkillInfo == null ? skillInfo.Name : $"{specialSkillInfo.Name} -> {skillInfo.Name}")}\n"; + var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == teammateSkill); + teammateSkills += $" {ChatColors.DarkRed}{teammate.PlayerName}{ChatColors.Lime}: {(skillInfo == null ? Skills.None : skillInfo.Name)}\n"; } } - if (Config.LoadedConfig.Settings.SummaryAfterTheRound && !string.IsNullOrEmpty(skillsText)) + if (!string.IsNullOrEmpty(teammateSkills)) { - player.PrintToChat(" "); - player.PrintToChat($" {ChatColors.Lime}{Localization.GetTranslation("summary_start")}"); - foreach (string text in skillsText.Split("\n")) + SkillUtils.PrintToChat(player, $" {ChatColors.Lime}{Localization.GetTranslation("teammate_skills")}:", false); + foreach (string text in teammateSkills.Split("\n")) if (!string.IsNullOrEmpty(text)) player.PrintToChat(text); - player.PrintToChat($" {ChatColors.Lime}{Localization.GetTranslation("summary_end")}"); - player.PrintToChat(" \n"); } }); } + } + if (enableTransmit) + Instance?.RegisterListener(CheckTransmit); + } - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - Config.DefaultSkillInfo[] terroristSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == (int)CsTeam.Terrorist).ToArray(); - Config.DefaultSkillInfo[] counterterroristSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == (int)CsTeam.CounterTerrorist).ToArray(); - Config.DefaultSkillInfo[] allTeamsSkills = Config.LoadedConfig.SkillsInfo.Where(s => s.OnlyTeam == 0).ToArray(); - - if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.TeamSkills) - { - List tSkills = new(SkillData.Skills); - tSkills.RemoveAll(s => s.Skill == tSkill.Skill || s.Skill == Skills.None || counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - tSkill = tSkills.Count == 0 ? new(Skills.None, Config.GetValue(Skills.None, "color"), false) : tSkills[Instance.Random.Next(tSkills.Count)]; - - List ctSkills = new(SkillData.Skills); - ctSkills.RemoveAll(s => s.Skill == ctSkill.Skill || s.Skill == Skills.None || terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - ctSkill = ctSkills.Count == 0 ? new(Skills.None, Config.GetValue(Skills.None, "color"), false) : ctSkills[Instance.Random.Next(ctSkills.Count)]; - } - else if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.SameSkills) - { - List allSkills = new(SkillData.Skills); - allSkills.RemoveAll(s => s.Skill == allSkill.Skill || s.Skill == Skills.None || !allTeamsSkills.Any(s2 => s2.Name == s.Skill.ToString())); - allSkill = allSkills.Count == 0 ? new(Skills.None, Config.GetValue(Skills.None, "color"), false) : allSkills[Instance.Random.Next(allSkills.Count)]; - } - else if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.Debug && debugSkills.Count == 0) - debugSkills = new(SkillData.Skills); - - foreach (var player in Utilities.GetPlayers()) - { - var playerTeam = player.Team; - var teammates = Utilities.GetPlayers().Where(p => p.Team == playerTeam && p != player); - string teammateSkills = ""; - - var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (skillPlayer != null) - { - skillPlayer.IsDrawing = false; - jSkill_SkillInfo randomSkill = new(Skills.None, Config.GetValue(Skills.None, "color"), false); - - if (Instance?.GameRules != null && Instance?.GameRules.WarmupPeriod == false) - { - Config.GameModes gameMode = (Config.GameModes)Config.LoadedConfig.Settings.GameMode; - if (staticSkills.TryGetValue(player.SteamID, out var staticSkill)) - randomSkill = staticSkill; - else if (gameMode == Config.GameModes.Normal || gameMode == Config.GameModes.NoRepeat) - { - List skillList = new(SkillData.Skills); - 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) - { - Config.DefaultSkillInfo[] skillsNeedsTeammates = Config.LoadedConfig.SkillsInfo.Where(s => s.NeedsTeammates).ToArray(); - skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString())); - } - - if (player.Team == CsTeam.Terrorist) - skillList.RemoveAll(s => counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - else - skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); - - if (gameMode == Config.GameModes.NoRepeat && playersSkills.TryGetValue(player.SteamID, out List? skills)) - { - skillList.RemoveAll(s => skills.Any(s2 => s2.Skill == s.Skill)); - if (skillList.Count == 0) skills.Clear(); - } - - randomSkill = skillList.Count == 0 ? noneSkill : skillList[Instance.Random.Next(skillList.Count)]; - if (gameMode == Config.GameModes.NoRepeat) - { - if (playersSkills.TryGetValue(player.SteamID, out List? value)) - value.Add(randomSkill); - else - playersSkills.Add(player.SteamID, [randomSkill]); - } - } - else if (gameMode == Config.GameModes.TeamSkills) - randomSkill = player.Team == CsTeam.Terrorist ? tSkill : ctSkill; - else if (gameMode == Config.GameModes.SameSkills) - randomSkill = allSkill; - else if (gameMode == Config.GameModes.Debug) - { - if (debugSkills.Count == 0) - debugSkills = new List(SkillData.Skills); - randomSkill = debugSkills[0]; - debugSkills.RemoveAt(0); - player.PrintToChat($"{SkillData.Skills.Count - debugSkills.Count}/{SkillData.Skills.Count}"); - } - } - - skillPlayer.Skill = randomSkill.Skill; - skillPlayer.SpecialSkill = Skills.None; - Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{randomSkill.Name}\"."); - - if (randomSkill.Display) - SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{randomSkill.Name}{ChatColors.Lime}: {randomSkill.Description}", false); - - if (Config.LoadedConfig.Settings.TeamMateSkillInfo) - { - Instance?.AddTimer(0.5f, () => - { - foreach (var teammate in teammates) - { - var teammateSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == teammate.SteamID)?.Skill; - if (teammateSkill != null) - { - var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == teammateSkill); - teammateSkills += $" {ChatColors.DarkRed}{teammate.PlayerName}{ChatColors.Lime}: {(skillInfo == null ? Skills.None : skillInfo.Name)}\n"; - } - } - - if (!string.IsNullOrEmpty(teammateSkills)) - { - SkillUtils.PrintToChat(player, $" {ChatColors.Lime}{Localization.GetTranslation("teammate_skills")}:", false); - foreach (string text in teammateSkills.Split("\n")) - if (!string.IsNullOrEmpty(text)) - player.PrintToChat(text); - } - }); - } - } - } - - return HookResult.Continue; - }); - - - Instance.RegisterEventHandler((@event, info) => - { - var victim = @event.Userid; - var attacker = @event.Attacker; - - if (victim == null || attacker == null || victim == attacker) return HookResult.Continue; - - if(Config.LoadedConfig.Settings.KillerSkillInfo) - { - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); - if (attackerInfo != null) - { - var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.Skill); - var specialSkillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.SpecialSkill); - if (skillData == null || specialSkillData == null) return HookResult.Continue; - string skillDesc = skillData.Description; - - SkillUtils.PrintToChat(victim, $"{Localization.GetTranslation("enemy_skill")} {ChatColors.DarkRed}{attacker.PlayerName}{ChatColors.Lime}:", false); - SkillUtils.PrintToChat(victim, $"{ChatColors.DarkRed}{(attackerInfo.SpecialSkill == Skills.None ? skillData.Name : $"{specialSkillData.Name} -> {skillData.Name}")}{ChatColors.Lime} - {skillDesc}", false); - } - } - - return HookResult.Continue; - }); - - Instance.RegisterListener((CCSPlayerController player, PlayerButtons pressed, PlayerButtons released) => - { - string? button = Config.LoadedConfig.Settings.AlternativeSkillButton; - if (string.IsNullOrEmpty(button)) return; - - if (Enum.TryParse(button, out var skillButton)) - { - if (pressed != skillButton) return; - } else return; - - if (player == null) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo == null) return; - - var playerPawn = player.PlayerPawn.Value; - if (playerPawn?.CBodyComponent == null) return; - if (!player.IsValid || !player.PawnIsAlive) return; - - Debug.WriteToDebug($"Player {player.PlayerName} used the skill: {playerInfo.Skill} by PlayerButtons: {pressed}"); - Instance.SkillAction(playerInfo.Skill.ToString(), "UseSkill", [player]); - }); + public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) + { + foreach (var playerSkill in Instance.SkillPlayer) + if (!playerSkill.IsDrawing) + Instance.SkillAction(playerSkill.Skill.ToString(), "CheckTransmit", [infoList]); } [GeneratedRegex(@"\{AUTHOR1\}", RegexOptions.IgnoreCase, "pl-PL")] diff --git a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs index f177ed9..eb32f6c 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs @@ -84,14 +84,17 @@ namespace jRandomSkills var observeredPlayerSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer.SteamID); if (observeredPlayerSkill == null) return; - + var observeredPlayerSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == observeredPlayerSkill.Skill); if (observeredPlayerSkillInfo == null) return; var observeredPlayerSpecialSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == observeredPlayerSkill.SpecialSkill); if (observeredPlayerSpecialSkillInfo == null) return; - infoLine = $"{Localization.GetTranslation("observer_skill")} {observeredPlayerSkill.PlayerName}:
"; + string pName = observeredPlayerSkill.PlayerName; + if (pName.Length > 18) + pName = $"{pName.Substring(0, 17)}..."; + infoLine = $"{Localization.GetTranslation("observer_skill")} {pName}:
"; skillLine = $"{(observeredPlayerSkill.SpecialSkill == Skills.None ? observeredPlayerSkillInfo.Name : $"{observeredPlayerSpecialSkillInfo.Name}({observeredPlayerSkillInfo.Name})")}
"; } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs index 5c6fcf5..c6e3df5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs @@ -1,5 +1,4 @@ using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; @@ -16,31 +15,30 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); } - private static HookResult OnTakeDamage(DynamicHook h) + public static void OnTakeDamage(DynamicHook h) { CEntityInstance param = h.GetParam(0); CTakeDamageInfo param2 = h.GetParam(1); if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) - return HookResult.Continue; + return; CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); CCSPlayerPawn victimPawn = new(param.Handle); if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") - return HookResult.Continue; + return; if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) - return HookResult.Continue; + return; CCSPlayerController attacker = attackerPawn.Controller.Value.As(); CCSPlayerController victim = victimPawn.Controller.Value.As(); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); - if (playerInfo == null) return HookResult.Continue; + if (playerInfo == null) return; if (attacker.PawnIsAlive) { @@ -60,8 +58,12 @@ namespace jRandomSkills } } } + } - return HookResult.Continue; + public static void DisableSkill(CCSPlayerController _) + { + foreach (var hit in hitGroups) + Marshal.WriteInt32(hit.Key, 56, hit.Value); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs b/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs index 1625fd9..38cd2d4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -19,64 +18,37 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + SkillPlayerInfo.Clear(); + } + + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - SkillPlayerInfo.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - SkillPlayerInfo.Remove(player.SteamID); - - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + { + UpdateHUD(player, skillInfo); + if (Server.TickCount % tickRate != 0) return; + var pawn = player.PlayerPawn.Value; + if (pawn != null && pawn.IsValid && pawn.AbsOrigin != null) { - UpdateHUD(player, skillInfo); - if (Server.TickCount % tickRate != 0) return; - var pawn = player.PlayerPawn.Value; - if (pawn != null && pawn.IsValid && pawn.AbsOrigin != null) + if (skillInfo.LastRotations == null || skillInfo.LastPositions == null) continue; + skillInfo.LastPositions.Add(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)); + if (skillInfo.LastRotations.Count > maxSize) { - if (skillInfo.LastRotations == null || skillInfo.LastPositions == null) continue; - skillInfo.LastPositions.Add(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)); - if (skillInfo.LastRotations.Count > maxSize) - { - skillInfo.LastPositions.RemoveAt(0); - skillInfo.LastRotations.RemoveAt(0); - } + skillInfo.LastPositions.RemoveAt(0); + skillInfo.LastRotations.RemoveAt(0); } } - } - }); + } + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs b/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs index 7b9ca80..1aa710c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs @@ -1,4 +1,3 @@ -using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; @@ -14,44 +13,25 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + public static void PlayerBlind(EventPlayerBlind @event) + { + var player = @event.Userid; + var attacker = @event.Attacker; + if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return; + if (attacker == null || !attacker.IsValid) return; - return HookResult.Continue; - }); + var playerPawn = player.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid) return; - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - var attacker = @event.Attacker; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); - if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return HookResult.Continue; - if (attacker == null || !attacker.IsValid) return HookResult.Continue; - - var playerPawn = player.PlayerPawn.Value; - if (playerPawn == null || !playerPawn.IsValid) return HookResult.Continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); - - if (playerInfo?.Skill == skillName) - playerPawn.FlashDuration = 0.0f; - else if (attackerInfo?.Skill == skillName) - playerPawn.FlashDuration = 7.0f; - - return HookResult.Continue; - }); + if (playerInfo?.Skill == skillName) + playerPawn.FlashDuration = 0.0f; + else if (attackerInfo?.Skill == skillName) + playerPawn.FlashDuration = 7.0f; } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs b/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs index a099066..0b49459 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs @@ -12,25 +12,18 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - var attacker = @event.Attacker; - var victim = @event.Userid; - int hitgroup = @event.Hitgroup; + public static void PlayerHurt(EventPlayerHurt @event) + { + var attacker = @event.Attacker; + var victim = @event.Userid; + int hitgroup = @event.Hitgroup; - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); - - if (playerInfo?.Skill == skillName && hitgroup == (int)HitGroup_t.HITGROUP_HEAD) - { - ApplyIronHeadEffect(victim!, @event.DmgHealth); - return HookResult.Stop; - } - - return HookResult.Continue; - }); + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + if (playerInfo?.Skill == skillName && hitgroup == (int)HitGroup_t.HITGROUP_HEAD) + ApplyIronHeadEffect(victim!, @event.DmgHealth); } private static void ApplyIronHeadEffect(CCSPlayerController victim, float damage) diff --git a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs index aab7ad2..3d76682 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs @@ -16,32 +16,13 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - EnableBombsite(); - }); - - return HookResult.Continue; - }); + public static void NewRound() + { + foreach (var player in Utilities.GetPlayers()) + SkillUtils.CloseMenu(player); + Instance.AddTimer(0.1f, EnableBombsite); } public static void TypeSkill(CCSPlayerController player, string[] commands) @@ -78,19 +59,16 @@ namespace jRandomSkills if (playerInfo == null) return; playerInfo.SkillChance = 0; - SkillUtils.PrintToChat(player, Localization.GetTranslation("areareaper") + ":", false); - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("areareaper_select_info")}"); - player.PrintToChat($" {ChatColors.Green}· {ChatColors.Red}/t {ChatColors.Green}A"); - player.PrintToChat($" {ChatColors.Green}· {ChatColors.Red}/t {ChatColors.Green}B"); + HashSet<(string, string)> menuItems = [(Localization.GetTranslation("bombsite_a"), "a"), (Localization.GetTranslation("bombsite_b"), "b")]; + SkillUtils.CreateMenu(player, menuItems); } -#pragma warning disable IDE0060 // Usuń nieużywany parametr public static void DisableSkill(CCSPlayerController player) -#pragma warning restore IDE0060 // Usuń nieużywany parametr { - if (Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName) != null) - return; + SkillUtils.CloseMenu(player); + if (Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName) != null) return; EnableBombsite(); + } private static void EnableBombsite() diff --git a/jRandomSkills - SRC Files/src/player/skills/Armored.cs b/jRandomSkills - SRC Files/src/player/skills/Armored.cs index 2d8d5c1..08a534a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Armored.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Armored.cs @@ -1,6 +1,4 @@ -using CounterStrikeSharp.API; -using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Memory; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; @@ -16,25 +14,6 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); - - VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); } public static void EnableSkill(CCSPlayerController player) @@ -48,36 +27,34 @@ namespace jRandomSkills SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("armored")}{ChatColors.Lime}: " + Localization.GetTranslation("armored_desc2", newScale), false); } - private static HookResult OnTakeDamage(DynamicHook h) + public static void OnTakeDamage(DynamicHook h) { CEntityInstance param = h.GetParam(0); CTakeDamageInfo param2 = h.GetParam(1); if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) - return HookResult.Continue; + return; CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); CCSPlayerPawn victimPawn = new(param.Handle); if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") - return HookResult.Continue; + return; if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) - return HookResult.Continue; + return; CCSPlayerController attacker = attackerPawn.Controller.Value.As(); CCSPlayerController victim = victimPawn.Controller.Value.As(); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); - if (playerInfo == null) return HookResult.Continue; + if (playerInfo == null) return; if (playerInfo.Skill == skillName && victim.PawnIsAlive) { float? skillChance = playerInfo.SkillChance; param2.Damage *= skillChance ?? 1f; } - - return HookResult.Continue; } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#d1430a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .65f, float chanceTo = .85f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/Assassin.cs b/jRandomSkills - SRC Files/src/player/skills/Assassin.cs index d2ba9d9..344dc56 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Assassin.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Assassin.cs @@ -15,26 +15,24 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - var damage = @event.DmgHealth; - var victim = @event.Userid; - var attacker = @event.Attacker; - var weapon = @event.Weapon; - HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup; + public static void PlayerHurt(EventPlayerHurt @event) + { + var damage = @event.DmgHealth; + var victim = @event.Userid; + var attacker = @event.Attacker; + var weapon = @event.Weapon; + HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup; - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - if (nades.Contains(weapon)) return HookResult.Continue; + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; + if (nades.Contains(weapon)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + if (playerInfo?.Skill != skillName) return; - if (IsBehind(attacker!, victim!)) - SkillUtils.TakeHealth(victim!.PlayerPawn.Value, (int)(damage * (damageMultiplier - 1f))); - - return HookResult.Continue; - }); + if (IsBehind(attacker!, victim!)) + SkillUtils.TakeHealth(victim!.PlayerPawn.Value, (int)(damage * (damageMultiplier - 1f))); } private static bool IsBehind(CCSPlayerController attacker, CCSPlayerController victim) diff --git a/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs b/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs index 03711a6..b84953f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs @@ -14,31 +14,6 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - var playerPawn = player.PlayerPawn.Value; - - if (playerInfo?.Skill == skillName && playerPawn != null) - { - EnableSkill(player); - } - } - }); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in Utilities.GetPlayers()) - DisableSkill(player); - return HookResult.Continue; - }); } public static void EnableSkill(CCSPlayerController player) @@ -46,6 +21,12 @@ namespace jRandomSkills ApplyGravityModifier(player); } + public static void NewRound() + { + foreach (var player in Utilities.GetPlayers()) + DisableSkill(player); + } + public static void DisableSkill(CCSPlayerController player) { if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs index b058f21..0131df0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs @@ -18,77 +18,56 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var victim = @event.Userid; - var attacker = @event.Attacker; - var weapon = @event.Weapon; - - if (weapon != "decoy") return HookResult.Continue; - if (!Instance.IsPlayerValid(victim) || !Instance.IsPlayerValid(attacker)) return HookResult.Continue; - - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (attackerInfo?.Skill != skillName) return HookResult.Continue; - - SkillUtils.TakeHealth(victim!.PlayerPawn.Value, damageDeal); - return HookResult.Continue; - }); - - Instance.RegisterListener(@event => - { - var name = @event.DesignerName; - if (name != "decoy_projectile") - return; - - var decoy = @event.As(); - if (decoy == null || !decoy.IsValid || decoy.OwnerEntity == null || decoy.OwnerEntity.Value == null || !decoy.OwnerEntity.Value.IsValid) return; - - var pawn = decoy.OwnerEntity.Value.As(); - if (pawn == null || !pawn.IsValid || pawn.Controller == null || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; - - var player = pawn.Controller.Value.As(); - if (player == null || !player.IsValid) return; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return; - decoys.Add(decoy); - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - - var decoy = decoys.FirstOrDefault(d => d.Index == @event.Entityid); - if (decoy != null && decoy.IsValid) - decoy.Remove(); - - return HookResult.Continue; - }); - - Instance.RegisterListener(OnTick); } - private static void OnTick() + public static void PlayerHurt(EventPlayerHurt @event) + { + var victim = @event.Userid; + var attacker = @event.Attacker; + var weapon = @event.Weapon; + + if (weapon != "decoy") return; + if (!Instance.IsPlayerValid(victim) || !Instance.IsPlayerValid(attacker)) return; + + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + if (attackerInfo?.Skill != skillName) return; + + SkillUtils.TakeHealth(victim!.PlayerPawn.Value, damageDeal); + } + + public static void OnEntitySpawned(CEntityInstance entity) + { + var name = entity.DesignerName; + if (name != "decoy_projectile") + return; + + var decoy = entity.As(); + if (decoy == null || !decoy.IsValid || decoy.OwnerEntity == null || decoy.OwnerEntity.Value == null || !decoy.OwnerEntity.Value.IsValid) return; + + var pawn = decoy.OwnerEntity.Value.As(); + if (pawn == null || !pawn.IsValid || pawn.Controller == null || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; + + var player = pawn.Controller.Value.As(); + if (player == null || !player.IsValid) return; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + decoys.Add(decoy); + } + + public static void DecoyStarted(EventDecoyStarted @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + + var decoy = decoys.FirstOrDefault(d => d.Index == @event.Entityid); + if (decoy != null && decoy.IsValid) + decoy.Remove(); + } + + public static void OnTick() { foreach (var decoy in decoys) { diff --git a/jRandomSkills - SRC Files/src/player/skills/Behind.cs b/jRandomSkills - SRC Files/src/player/skills/Behind.cs index 281fdaa..93f2049 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Behind.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Behind.cs @@ -1,4 +1,3 @@ -using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; @@ -14,42 +13,19 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; + public static void PlayerHurt(EventPlayerHurt @event) + { + var attacker = @event!.Attacker; + var victim = @event!.Userid; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var attacker = @event!.Attacker; - var victim = @event!.Userid; - - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) - return HookResult.Continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - - if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) - { - if (Instance.Random.NextDouble() <= playerInfo.SkillChance) - RotateEnemy(victim); - } - - return HookResult.Continue; - }); + if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) + if (Instance.Random.NextDouble() <= playerInfo.SkillChance) + RotateEnemy(victim); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs b/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs index e7f39ed..28fe9ce 100644 --- a/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs +++ b/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs @@ -16,38 +16,38 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void PlayerHurt(EventPlayerHurt @event) + { + var victim = @event.Userid; + int damage = @event.DmgHealth; + HitGroup_t hitGroup = (HitGroup_t)@event.Hitgroup; + string weapon = @event.Weapon; + + if (noReflectionWeapon.Contains(weapon) || !Instance.IsPlayerValid(victim)) return; + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + if (victimInfo == null || victimInfo.Skill != skillName) return; + + int chance = Instance.Random.Next(0, 101); + if (hitGroup == HitGroup_t.HITGROUP_LEFTLEG || hitGroup == HitGroup_t.HITGROUP_RIGHTLEG) { - var victim = @event.Userid; - int damage = @event.DmgHealth; - HitGroup_t hitGroup = (HitGroup_t)@event.Hitgroup; - string weapon = @event.Weapon; + if (chance > legReflectionChance) + return; + } + else + if (chance > torseReflectionChance) + return; - if (noReflectionWeapon.Contains(weapon) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; - var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); - if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue; + var pawn = victim!.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return; - int chance = Instance.Random.Next(0, 101); - if (hitGroup == HitGroup_t.HITGROUP_LEFTLEG || hitGroup == HitGroup_t.HITGROUP_RIGHTLEG) - { - if (chance > legReflectionChance) - return HookResult.Continue; - } - else - if (chance > torseReflectionChance) - return HookResult.Continue; + var weaponServices = pawn.WeaponServices; + if (weaponServices == null) return; + if (weaponServices.ActiveWeapon == null || !weaponServices.ActiveWeapon.IsValid || weaponServices.ActiveWeapon.Value == null || !weaponServices.ActiveWeapon.Value.IsValid || weaponServices.ActiveWeapon.Value.DesignerName != "weapon_knife") + return; - var pawn = victim!.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid) return HookResult.Continue; - - var weaponServices = pawn.WeaponServices; - if (weaponServices == null) return HookResult.Continue; - if (weaponServices.ActiveWeapon == null || !weaponServices.ActiveWeapon.IsValid || weaponServices.ActiveWeapon.Value == null || !weaponServices.ActiveWeapon.Value.IsValid || weaponServices.ActiveWeapon.Value.DesignerName != "weapon_knife") return HookResult.Continue; - - RestoreHealth(victim, damage); - return HookResult.Stop; - }); + RestoreHealth(victim, damage); } private static void RestoreHealth(CCSPlayerController victim, float damage) diff --git a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs index 2042e85..c243ddf 100644 --- a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs +++ b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs @@ -2,7 +2,6 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -17,10 +16,9 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - Instance.RegisterListener(OnTick); } - private static void OnTick() + public static void OnTick() { foreach (var player in Utilities.GetPlayers()) { @@ -34,6 +32,7 @@ namespace jRandomSkills { var playerPawn = player.PlayerPawn.Value; if (playerPawn == null || !playerPawn.IsValid) return; + if (JumpBan.bannedPlayers.ContainsKey(playerPawn)) return; var flags = (PlayerFlags)playerPawn.Flags; var buttons = player.Buttons; diff --git a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs index 2599a54..69ab6c3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs +++ b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs @@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -12,89 +11,41 @@ namespace jRandomSkills public class C4Camouflage : ISkill { private const Skills skillName = Skills.C4Camouflage; - private static bool exists = false; private static readonly Dictionary> invisibleEntities = []; public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void WeaponPickup(EventItemPickup @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill != skillName) return; + EnableSkill(player!); + } + + public static void WeaponEquip(EventItemEquip @event) + { + var player = @event.Userid; + var weapon = @event.Item; + + if (!Instance.IsPlayerValid(player)) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill != skillName) return; + + if (weapon == "c4") { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - DisableSkill(player); - if (!Instance.IsPlayerValid(player)) continue; - var playerPawn = player.PlayerPawn?.Value; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => + SetPlayerVisibility(player!, false); + SetWeaponVisibility(player!, false); + } + else { - var player = @event.Userid; - if (player == null || !player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - DisableSkill(player); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - EnableSkill(player!); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - var weapon = @event.Item; - - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - - if (weapon == "c4") - { - SetPlayerVisibility(player!, false); - SetWeaponVisibility(player!, false); - } - else - { - SetPlayerVisibility(player!, true); - SetWeaponVisibility(player!, true); - } - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - DisableSkill(player); - } - Instance.RemoveListener(CheckTransmit); - exists = false; - return HookResult.Continue; - }); + SetPlayerVisibility(player!, true); + SetWeaponVisibility(player!, true); + } } public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) @@ -111,10 +62,7 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - if (!exists) - Instance.RegisterListener(CheckTransmit); - exists = true; - + Event.enableTransmit = true; if (player == null || !player.IsValid) return; var playerPawn = player.PlayerPawn.Value; @@ -129,7 +77,6 @@ namespace jRandomSkills SetWeaponVisibility(player, false); } - public static void DisableSkill(CCSPlayerController player) { SetPlayerVisibility(player, true); diff --git a/jRandomSkills - SRC Files/src/player/skills/Catapult.cs b/jRandomSkills - SRC Files/src/player/skills/Catapult.cs index cdde229..b7690cc 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Catapult.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Catapult.cs @@ -1,4 +1,3 @@ -using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; @@ -14,46 +13,23 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => + public static void PlayerHurt(EventPlayerHurt @event) + { + var attacker = @event.Attacker; + var victim = @event.Userid; + + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + + if (attackerInfo?.Skill == skillName && victim!.PawnIsAlive) + if (Instance.Random.NextDouble() <= attackerInfo.SkillChance) { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var attacker = @event.Attacker; - var victim = @event.Userid; - - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - - if (attackerInfo?.Skill == skillName && victim!.PawnIsAlive) - { - if (Instance.Random.NextDouble() <= attackerInfo.SkillChance) - { - var victimPawn = victim.PlayerPawn?.Value; - if (victimPawn != null) - { - victimPawn.AbsVelocity.Z = 300f; - } - } + var victimPawn = victim.PlayerPawn?.Value; + if (victimPawn != null) + victimPawn.AbsVelocity.Z = 300f; } - - return HookResult.Continue; - }); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs index d9d73ae..a0485bf 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; using jRandomSkills.src.utils; using CounterStrikeSharp.API.Core.Attributes; @@ -13,8 +12,6 @@ namespace jRandomSkills public class Chicken : ISkill { private const Skills skillName = Skills.Chicken; - private static bool roundEnd = false; - private static bool exists = false; private static readonly string[] disabledWeapons = [ "weapon_ak47", "weapon_m4a4", "weapon_m4a1", "weapon_m4a1_silencer", @@ -30,70 +27,21 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - roundEnd = false; - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + } - return HookResult.Continue; - }); + public static void NewRound() + { + foreach (var player in Utilities.GetPlayers()) + SetWeaponAttack(player, false); + } - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - DisableSkill(player); - } - roundEnd = true; - Instance.RemoveListener(CheckTransmit); - exists = false; - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - DisableSkill(player); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - SetWeaponAttack(player, true); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in Utilities.GetPlayers()) - SetWeaponAttack(player, false); - return HookResult.Continue; - }); - - Instance.RegisterListener(OnTick); + public static void WeaponPickup(EventItemPickup @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + SetWeaponAttack(player, true); } public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) @@ -112,10 +60,7 @@ namespace jRandomSkills var playerPawn = player.PlayerPawn?.Value; if (playerPawn != null && playerPawn.IsValid) { - if (!exists) - Instance.RegisterListener(CheckTransmit); - exists = true; - + Event.enableTransmit = true; playerPawn.VelocityModifier = 1.1f; playerPawn.Health = 50; @@ -165,7 +110,7 @@ namespace jRandomSkills private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon) { - if (roundEnd || player == null || !player.IsValid) return; + if (player == null || !player.IsValid) return; var pawn = player?.PlayerPawn?.Value; if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null || pawn.WeaponServices.MyWeapons == null) return; @@ -200,7 +145,7 @@ namespace jRandomSkills Instance.AddTimer(1f, () => chickens.TryAdd(player, chickenModel)); } - private static void OnTick() + public static void OnTick() { foreach (var valuePair in chickens) { diff --git a/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs b/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs index 80876dc..864705e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs @@ -14,28 +14,24 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => + } + + public static void BombBeginplant(EventBombBeginplant @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; + + var anyChillOut = Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName); + if (anyChillOut != null) { - var player = @event.Userid; - - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - - var anyChillOut = Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName); - if (anyChillOut != null) + var bombEntities = Utilities.FindAllEntitiesByDesignerName("weapon_c4").ToList(); + if (bombEntities.Count != 0) { - var bombEntities = Utilities.FindAllEntitiesByDesignerName("weapon_c4").ToList(); - - if (bombEntities.Count != 0) - { - var bomb = bombEntities.FirstOrDefault(); - if (bomb != null) - bomb.ArmedTime = Server.CurrentTime + bombArmedTime; - } + var bomb = bombEntities.FirstOrDefault(); + if (bomb != null) + bomb.ArmedTime = Server.CurrentTime + bombArmedTime; } - - return HookResult.Continue; - }); + } } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#343deb", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false, float bombArmedTime = 10f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/Cutter.cs b/jRandomSkills - SRC Files/src/player/skills/Cutter.cs index b89db55..5403b4c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Cutter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Cutter.cs @@ -12,23 +12,21 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - var damage = @event.DmgHealth; - var attacker = @event.Attacker; - var victim = @event.Userid; - var weapon = @event.Weapon; + public static void PlayerHurt(EventPlayerHurt @event) + { + var damage = @event.DmgHealth; + var attacker = @event.Attacker; + var victim = @event.Userid; + var weapon = @event.Weapon; - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + if (playerInfo?.Skill != skillName) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - - if (weapon == "knife") - SkillUtils.TakeHealth(victim!.PlayerPawn.Value, 9999); - return HookResult.Continue; - }); + if (weapon == "knife") + SkillUtils.TakeHealth(victim!.PlayerPawn.Value, 9999); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#88a31a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs index 8a3b907..12258c2 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using System.Collections.Generic; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -18,40 +17,33 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + foreach (var player in defaultPostProcessings.Keys) + DisableSkill(player); + foreach (var postProcessing in newPostProcessing) + postProcessing.Remove(); + newPostProcessing.Clear(); + foreach (var player in Utilities.GetPlayers()) + SkillUtils.CloseMenu(player); + } + + public static void OnTick() + { + if (Server.TickCount % 32 != 0) return; + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + if (!SkillUtils.HasMenu(player)) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - return HookResult.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(); - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in defaultPostProcessings.Keys) - DisableSkill(player); - foreach (var postProcessing in newPostProcessing) - postProcessing.Remove(); - newPostProcessing.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - SetUpPostProcessing(player, true); - return HookResult.Continue; - }); + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.UpdateMenu(player, menuItems); + } } public static void TypeSkill(CCSPlayerController player, string[] commands) @@ -87,23 +79,20 @@ namespace jRandomSkills if (playerInfo == null) return; playerInfo.SkillChance = 0; - SkillUtils.PrintToChat(player, Localization.GetTranslation("darkness") + ":", false); - - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("darkness_select_info")}"); - var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).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) { - foreach (var enemy in enemies) - player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.CreateMenu(player, menuItems); } else - player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index"); + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } public static void DisableSkill(CCSPlayerController player) { SetUpPostProcessing(player, true); + SkillUtils.CloseMenu(player); } private static void SetUpPostProcessing(CCSPlayerController player, bool dontCreateNew = false) diff --git a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs index d06ad3c..c356d39 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs @@ -13,34 +13,39 @@ namespace jRandomSkills public static void LoadSkill() { - SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + foreach (var player in Utilities.GetPlayers()) + SkillUtils.CloseMenu(player); + } + + public static void OnTick() + { + if (Server.TickCount % 32 != 0) return; + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => + if (!SkillUtils.HasMenu(player)) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + + 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(); + if (enemies.Length > 0) { - foreach (var player in Utilities.GetPlayers()) + HashSet<(string, string)> menuItems = []; + foreach (var enemy in enemies) { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); + var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + if (enemyInfo == null) continue; + var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); + if (skillData == null) continue; + menuItems.Add(($"{enemy.PlayerName} : {skillData.Name}", enemy.Index.ToString())); } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - DisableSkill(player); + SkillUtils.CreateMenu(player, menuItems); } - return HookResult.Continue; - }); + } } public static void TypeSkill(CCSPlayerController player, string[] commands) @@ -68,24 +73,22 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - SkillUtils.PrintToChat(player, Localization.GetTranslation("deactivator") + ":", false); - - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("deactivator_select_info")}"); - var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).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) { + HashSet<(string, string)> menuItems = []; foreach (var enemy in enemies) { var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); if (enemyInfo == null) continue; var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; - player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: {ChatColors.Red}{skillData.Name}"); + menuItems.Add(($"{enemy.PlayerName} : {skillData.Name}", enemy.Index.ToString())); } + SkillUtils.CreateMenu(player, menuItems); } else - player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index"); + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } public static void DisableSkill(CCSPlayerController player) @@ -93,6 +96,7 @@ namespace jRandomSkills var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo == null) return; playerInfo.SpecialSkill = Skills.None; + SkillUtils.CloseMenu(player); } private static void DeacitvateSkill(CCSPlayerController player, CCSPlayerController enemy) diff --git a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs index 421e58a..faa37c0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs @@ -1,5 +1,6 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; @@ -14,50 +15,38 @@ namespace jRandomSkills public static void LoadSkill() { - SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - deafPlayers.Clear(); - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; + public static void NewRound() + { + foreach (var player in deafPlayers) DisableSkill(player); - return HookResult.Continue; - }); + deafPlayers.Clear(); + foreach (var player in Utilities.GetPlayers()) + SkillUtils.CloseMenu(player); + } - Instance.RegisterEventHandler((@event, info) => + public static void PlayerMakeSound(UserMessage um) + { + foreach (var player in deafPlayers) + um.Recipients.Remove(player); + } + + public static void OnTick() + { + if (Server.TickCount % 32 != 0) return; + foreach (var player in Utilities.GetPlayers()) { - foreach (var player in deafPlayers) - DisableSkill(player); - return HookResult.Continue; - }); + if (!SkillUtils.HasMenu(player)) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - Instance.HookUserMessage(208, um => - { - var soundevent = um.ReadUInt("soundevent_hash"); - var userIndex = um.ReadUInt("source_entity_index"); + 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(); - foreach (var player in deafPlayers) - um.Recipients.Remove(player); - - return HookResult.Continue; - }, HookMode.Pre); + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.UpdateMenu(player, menuItems); + } } public static void TypeSkill(CCSPlayerController player, string[] commands) @@ -93,23 +82,20 @@ namespace jRandomSkills if (playerInfo == null) return; playerInfo.SkillChance = 0; - SkillUtils.PrintToChat(player, Localization.GetTranslation("deaf") + ":", false); - - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("deaf_select_info")}"); - var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).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) { - foreach (var enemy in enemies) - player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.CreateMenu(player, menuItems); } else - player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index"); + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } public static void DisableSkill(CCSPlayerController player) { deafPlayers.Remove(player); + SkillUtils.CloseMenu(player); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#dae01f", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs b/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs index bc1aae9..60c9d9e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs @@ -1,4 +1,3 @@ -using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; @@ -14,47 +13,29 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + } - Instance.RegisterEventHandler((@event, info) => + public static void PlayerHurt(EventPlayerHurt @event) + { + var attacker = @event.Attacker; + var victim = @event.Userid; + + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + + if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) { - Instance.AddTimer(0.1f, () => + if (Instance.Random.NextDouble() <= playerInfo?.SkillChance) { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; + var weaponServices = victim.PlayerPawn?.Value?.WeaponServices; + if (weaponServices?.ActiveWeapon == null) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var attacker = @event.Attacker; - var victim = @event.Userid; - - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - - if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) - { - if (Instance.Random.NextDouble() <= playerInfo.SkillChance) - { - var weaponServices = victim.PlayerPawn?.Value?.WeaponServices; - if (weaponServices?.ActiveWeapon == null) return HookResult.Continue; - - var weaponName = weaponServices?.ActiveWeapon?.Value?.DesignerName; - if (weaponName != null && !weaponName.Contains("weapon_knife") && !weaponName.Contains("weapon_c4")) - victim.ExecuteClientCommand("slot3"); - //victim.DropActiveWeapon(); - } + var weaponName = weaponServices?.ActiveWeapon?.Value?.DesignerName; + if (weaponName != null && !weaponName.Contains("weapon_knife") && !weaponName.Contains("weapon_c4")) + victim.ExecuteClientCommand("slot3"); + //victim.DropActiveWeapon(); } - return HookResult.Continue; - }); + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Distancer.cs b/jRandomSkills - SRC Files/src/player/skills/Distancer.cs index fec7440..b04d44a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Distancer.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Distancer.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static jRandomSkills.jRandomSkills; namespace jRandomSkills { @@ -15,34 +14,14 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in distancerPlayers) - DisableSkill(player); - return HookResult.Continue; - }); - - Instance.RegisterListener(OnTick); } - private static void OnTick() + public static void NewRound() + { + distancerPlayers.Clear(); + } + + public static void OnTick() { foreach (var player in distancerPlayers) { diff --git a/jRandomSkills - SRC Files/src/player/skills/Dracula.cs b/jRandomSkills - SRC Files/src/player/skills/Dracula.cs index 3261957..3fcb8c8 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dracula.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dracula.cs @@ -14,22 +14,18 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - var attacker = @event.Attacker; - var victim = @event.Userid; + } - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; + public static void PlayerHurt(EventPlayerHurt @event) + { + var attacker = @event.Attacker; + var victim = @event.Userid; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) - { - HealAttacker(attacker!, @event.DmgHealth); - } - return HookResult.Continue; - }); + if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) + HealAttacker(attacker!, @event.DmgHealth); } private static void HealAttacker(CCSPlayerController attacker, float damage) diff --git a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs index 9cc1211..00289d0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs @@ -13,23 +13,39 @@ namespace jRandomSkills public static void LoadSkill() { - SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + foreach (var player in Utilities.GetPlayers()) + SkillUtils.CloseMenu(player); + } + + public static void OnTick() + { + if (Server.TickCount % 32 != 0) return; + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + if (!SkillUtils.HasMenu(player)) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - return HookResult.Continue; - }); + if (playerInfo == null || playerInfo.Skill != skillName) continue; + 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) + { + HashSet<(string, string)> menuItems = []; + foreach (var enemy in enemies) + { + var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + if (enemyInfo == null) continue; + var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); + if (skillData == null) continue; + menuItems.Add(($"{enemy.PlayerName} : {skillData.Name}", enemy.Index.ToString())); + } + SkillUtils.CreateMenu(player, menuItems); + } + } } public static void TypeSkill(CCSPlayerController player, string[] commands) @@ -57,24 +73,22 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - SkillUtils.PrintToChat(player, Localization.GetTranslation("duplicator") + ":", false); - - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("duplicator_select_info")}"); - var enemies = Utilities.GetPlayers().Where(p => p != player && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).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) { + HashSet<(string, string)> menuItems = []; foreach (var enemy in enemies) { var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); if (enemyInfo == null) continue; var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; - player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: {ChatColors.Red}{skillData.Name}"); + menuItems.Add(($"{enemy.PlayerName} : {skillData.Name}", enemy.Index.ToString())); } + SkillUtils.CreateMenu(player, menuItems); } else - player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index"); + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } public static void DisableSkill(CCSPlayerController player) @@ -82,6 +96,7 @@ namespace jRandomSkills var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo == null) return; playerInfo.SpecialSkill = Skills.None; + SkillUtils.CloseMenu(player); } private static void DuplicateSkill(CCSPlayerController player, CCSPlayerController enemy) @@ -91,10 +106,12 @@ namespace jRandomSkills if (playerInfo != null && enemyInfo != null) { - playerInfo.Skill = enemyInfo.Skill; - playerInfo.SpecialSkill = skillName; - Instance.SkillAction(enemyInfo.Skill.ToString(), "EnableSkill", [player]); - + Instance.AddTimer(.1f, () => + { + playerInfo.Skill = enemyInfo.Skill; + playerInfo.SpecialSkill = skillName; + Instance.SkillAction(enemyInfo.Skill.ToString(), "EnableSkill", [player]); + }); player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("duplicator_player_info", enemy.PlayerName)); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs b/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs index 7f1ef0f..0faca5c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs @@ -14,49 +14,18 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - player.Respawn(); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - DisableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - DisableSkill(player); - return HookResult.Continue; - }); } - public static void EnableSkill(CCSPlayerController player) + public static void NewRound() + { + foreach (var player in Utilities.GetPlayers()) + { + if (!Instance.IsPlayerValid(player)) continue; + DisableSkill(player); + } + } + + public static unsafe void EnableSkill(CCSPlayerController player) { var playerPawn = player.PlayerPawn?.Value; if (playerPawn != null && player.IsValid) @@ -67,6 +36,7 @@ namespace jRandomSkills // playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = newSize; if (playerPawn.CBodyComponent == null || playerPawn.CBodyComponent.SceneNode == null) return; playerPawn.CBodyComponent.SceneNode.Scale = newSize; + Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent"); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("dwarf")}{ChatColors.Lime}: " + Localization.GetTranslation("dwarf_desc2", newSize), false); } diff --git a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs index 35f44f0..e7ec994 100644 --- a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs +++ b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -17,52 +16,22 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + SkillPlayerInfo.Clear(); + } + + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - { - EnableSkill(player); - } - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - SkillPlayerInfo.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - SkillPlayerInfo.Remove(player.SteamID); - - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) - UpdateHUD(player, skillInfo); - } - }); + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + UpdateHUD(player, skillInfo); + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs b/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs index e6b2b29..d6c0ead 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs @@ -1,6 +1,5 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; @@ -18,24 +17,6 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); } public static void EnableSkill(CCSPlayerController player) @@ -65,28 +46,27 @@ namespace jRandomSkills heProjectile.DetonateTime = 0; } - private static HookResult OnTakeDamage(DynamicHook h) + public static void OnTakeDamage(DynamicHook h) { CEntityInstance param = h.GetParam(0); CTakeDamageInfo param2 = h.GetParam(1); if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) - return HookResult.Continue; + return; CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); if (attackerPawn.DesignerName != "player") - return HookResult.Continue; + return; if (attackerPawn == null || attackerPawn.Controller?.Value == null) - return HookResult.Continue; + return; CCSPlayerController attacker = attackerPawn.Controller.Value.As(); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); - if (playerInfo == null || playerInfo.Skill != skillName) return HookResult.Continue; + if (playerInfo == null || playerInfo.Skill != skillName) return; if (Instance.Random.NextDouble() <= playerInfo.SkillChance) SpawnExplosion(param2.DamagePosition); - return HookResult.Continue; } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#9c0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float damage = 10f, float damageRadius = 190f, float chanceFrom = .15f, float chanceTo = .3f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs b/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs index bab7080..f611b06 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs @@ -10,56 +10,40 @@ namespace jRandomSkills public class FalconEye : ISkill { private const Skills skillName = Skills.FalconEye; - private static bool blocked = false; private static readonly float distance = Config.GetValue(skillName, "distance"); private static readonly Dictionary cameras = []; public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - blocked = true; - foreach (var player in Utilities.GetPlayers()) - if (cameras.TryGetValue(player.SteamID, out _)) - DisableSkill(player); + public static void NewRound() + { + foreach (var camera in cameras) + camera.Value.Item2.Remove(); + cameras.Clear(); + } - foreach (var camera in cameras) - camera.Value.Item2.Remove(); - cameras.Clear(); - return HookResult.Continue; - }); + public static void WeaponPickup(EventItemPickup @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; - Instance.RegisterEventHandler((@event, info) => - { - blocked = false; - return HookResult.Continue; - }); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill != skillName) return ; - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; + var pawn = player!.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - - var pawn = player!.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return HookResult.Continue; - - if (cameras.TryGetValue(player!.SteamID, out var cameraInfo) && cameraInfo.Item1 == pawn.CameraServices.ViewEntity.Raw) - BlockWeapon(player, true); - return HookResult.Continue; - }); - - Instance.RegisterListener(OnTick); + if (cameras.TryGetValue(player!.SteamID, out var cameraInfo) && cameraInfo.Item1 == pawn.CameraServices.ViewEntity.Raw) + BlockWeapon(player, true); } public static void UseSkill(CCSPlayerController player) { var playerPawn = player.PlayerPawn.Value; - if (playerPawn?.CBodyComponent == null || blocked) return; + if (playerPawn?.CBodyComponent == null) return; ChangeCamera(player); } @@ -68,7 +52,7 @@ namespace jRandomSkills ChangeCamera(player, true); } - private static void OnTick() + public static void OnTick() { foreach (var player in Utilities.GetPlayers()) if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2.IsValid) diff --git a/jRandomSkills - SRC Files/src/player/skills/Flash.cs b/jRandomSkills - SRC Files/src/player/skills/Flash.cs index b1d525d..66f3b60 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Flash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Flash.cs @@ -1,9 +1,9 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -15,50 +15,24 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); - Instance.RegisterListener(UpdateSpeed); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerPawn = player.PlayerPawn.Value; - if (playerPawn == null || !playerPawn.IsValid) continue; + public static void PlayerMakeSound(UserMessage um) + { + var soundevent = um.ReadUInt("soundevent_hash"); + var userIndex = um.ReadUInt("source_entity_index"); - playerPawn.VelocityModifier = 1; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); + if (userIndex == 0) return; + if (!Instance.footstepSoundEvents.Contains(soundevent)) return; - Instance.HookUserMessage(208, um => - { - var soundevent = um.ReadUInt("soundevent_hash"); - var userIndex = um.ReadUInt("source_entity_index"); + var player = Utilities.GetPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex); + if (!Instance.IsPlayerValid(player)) return; - if (userIndex == 0) return HookResult.Continue; - if (!Instance.footstepSoundEvents.Contains(soundevent)) return HookResult.Continue; - - var player = Utilities.GetPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex); - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill != skillName) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - - if (player!.Buttons.HasFlag(PlayerButtons.Speed) || player.Buttons.HasFlag(PlayerButtons.Duck)) - { - um.Recipients.Clear(); - return HookResult.Handled; - } - - return HookResult.Continue; - }, HookMode.Pre); + if (player!.Buttons.HasFlag(PlayerButtons.Speed) || player.Buttons.HasFlag(PlayerButtons.Duck)) + um.Recipients.Clear(); } public static void EnableSkill(CCSPlayerController player) @@ -85,7 +59,7 @@ namespace jRandomSkills playerPawn.VelocityModifier = 1; } - private static void UpdateSpeed() + public static void OnTick() { foreach (var player in Utilities.GetPlayers()) { diff --git a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs index 0843be1..3046bea 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs @@ -1,6 +1,5 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; @@ -23,57 +22,24 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + Instance.RegisterListener((ResourceManifest manifest) => manifest.AddResource(propModel)); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + SkillPlayerInfo.Clear(); + barricades.Clear(); + } + + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - SkillPlayerInfo.Clear(); - barricades.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - SkillPlayerInfo.Remove(player.SteamID); - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) - UpdateHUD(player, skillInfo); - } - }); - - Instance.RegisterListener((ResourceManifest manifest) => - { - manifest.AddResource(propModel); - }); - - VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + UpdateHUD(player, skillInfo); + } } public static void EnableSkill(CCSPlayerController player) @@ -153,19 +119,19 @@ namespace jRandomSkills }); } - private static HookResult OnTakeDamage(DynamicHook h) + public static void OnTakeDamage(DynamicHook h) { CEntityInstance param = h.GetParam(0); CTakeDamageInfo param2 = h.GetParam(1); if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) - return HookResult.Continue; + return; - if (string.IsNullOrEmpty(param.Entity.Name)) return HookResult.Continue; - if (!param.Entity.Name.StartsWith("FortniteWall")) return HookResult.Continue; + if (string.IsNullOrEmpty(param.Entity.Name)) return; + if (!param.Entity.Name.StartsWith("FortniteWall")) return; var box = param.As(); - if (box == null || !box.IsValid) return HookResult.Continue; + if (box == null || !box.IsValid) return; box.EmitSound("Wood_Plank.BulletImpact", volume: 1f); if (barricades.TryGetValue(box.Index, out int health)) @@ -175,7 +141,6 @@ namespace jRandomSkills if (health <= 0) box.Remove(); } else box.Remove(); - return HookResult.Continue; } public class PlayerSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs b/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs index 6e0cee6..335f414 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs @@ -1,7 +1,6 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; -using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; @@ -22,25 +21,21 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - bombHealth = maxBombHealth; - plantedC4 = null; - triggerC4 = null; - return HookResult.Continue; - }); + public static void NewRound() + { + bombHealth = maxBombHealth; + plantedC4 = null; + triggerC4 = null; + } - Instance.RegisterEventHandler((@event, info) => - { - var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); - if (plantedBomb == null) return HookResult.Continue; - plantedC4 = plantedBomb; - CreateTrigger(); - return HookResult.Continue; - }); - - VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); + public static void BombPlanted(EventBombPlanted _) + { + var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); + if (plantedBomb == null) return; + plantedC4 = plantedBomb; + CreateTrigger(); } private static void CreateTrigger() @@ -82,38 +77,37 @@ namespace jRandomSkills SkillUtils.TerminateRound(CsTeam.CounterTerrorist); } - private static HookResult OnTakeDamage(DynamicHook h) + public static void OnTakeDamage(DynamicHook h) { CEntityInstance param = h.GetParam(0); CTakeDamageInfo param2 = h.GetParam(1); if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) - return HookResult.Continue; + return; CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); if (attackerPawn.DesignerName != "player" || param.DesignerName != "trigger_multiple") - return HookResult.Continue; + return; CTriggerMultiple trigger = new(param.Handle); if (attackerPawn == null || attackerPawn.Controller?.Value == null || trigger == null || !trigger.Globalname.StartsWith("planted_bomb_prop_")) - return HookResult.Continue; + return; CCSPlayerController attacker = attackerPawn.Controller.Value.As(); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); - if (playerInfo == null || playerInfo.Skill != skillName) return HookResult.Continue; + if (playerInfo == null || playerInfo.Skill != skillName) return; bombHealth -= (int)param2.TotalledDamage; if (bombHealth <= 0) { RemoveBomb(); - return HookResult.Continue; + return; } Server.PrintToChatAll($" {ChatColors.Gold}{Localization.GetTranslation("fragilebomb_bomb_health")}: {ChatColors.Red}{bombHealth}{ChatColors.Gold}/{ChatColors.Green}{maxBombHealth}"); - return HookResult.Continue; } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#5d00ff", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false, int maxBombHealth = 1000) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs b/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs index 39c2d58..464c496 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs @@ -15,29 +15,27 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - var damage = @event.DmgHealth; - var victim = @event.Userid; - var attacker = @event.Attacker; - var weapon = @event.Weapon; - HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup; + public static void PlayerHurt(EventPlayerHurt @event) + { + var damage = @event.DmgHealth; + var victim = @event.Userid; + var attacker = @event.Attacker; + var weapon = @event.Weapon; + HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup; - if (nades.Contains(weapon)) return HookResult.Continue; - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; + if (nades.Contains(weapon)) return; + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (playerInfo?.Skill != skillName || attacker!.Team != victim!.Team) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + if (playerInfo?.Skill != skillName || attacker!.Team != victim!.Team) return; - Server.ExecuteCommand("mp_autokick 0"); + Server.ExecuteCommand("mp_autokick 0"); - var pawn = victim.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid) return HookResult.Continue; - SkillUtils.AddHealth(pawn, damage + (int)(damage * healthMultiplier), pawn.MaxHealth); - - return HookResult.Continue; - }); + var pawn = victim.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return; + SkillUtils.AddHealth(pawn, damage + (int)(damage * healthMultiplier), pawn.MaxHealth); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = true, float healthMultiplier = 1.5f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs index 16120a1..cd80bec 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -18,64 +17,45 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - decoys.Clear(); - return HookResult.Continue; - }); + public static void NewRound() + { + decoys.Clear(); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => + public static void DecoyStarted(EventDecoyStarted @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + decoys.Add(new Vector(@event.X, @event.Y, @event.Z)); + } + + public static void DecoyDetonate(EventDecoyDetonate @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + decoys.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z); + } + + public static void OnTick() + { + foreach (Vector decoyPos in decoys) + foreach (var player in Utilities.GetPlayers().Where(p => p.Team == CsTeam.Terrorist || p.Team == CsTeam.CounterTerrorist)) { - foreach (var player in Utilities.GetPlayers()) + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return; + double distance = SkillUtils.GetDistance(decoyPos, pawn.AbsOrigin); + if (distance <= decoyRadius) { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); + double modifier = Math.Clamp(distance / decoyRadius, 0f, 1f); + pawn.VelocityModifier = (float)Math.Pow(modifier, slownessMultiplier); } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - decoys.Add(new Vector(@event.X, @event.Y, @event.Z)); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, @info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - decoys.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z); - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (Vector decoyPos in decoys) - foreach (var player in Utilities.GetPlayers()) - { - var pawn = player.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return; - double distance = SkillUtils.GetDistance(decoyPos, pawn.AbsOrigin); - if (distance <= decoyRadius) - { - double modifier = Math.Clamp(distance / decoyRadius, 0f, 1f); - pawn.VelocityModifier = (float)Math.Pow(modifier, slownessMultiplier); - } - } - }); + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Gambler.cs b/jRandomSkills - SRC Files/src/player/skills/Gambler.cs new file mode 100644 index 0000000..e803fec --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/Gambler.cs @@ -0,0 +1,112 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Utils; +using jRandomSkills.src.player; +using jRandomSkills.src.utils; +using static jRandomSkills.jRandomSkills; + +namespace jRandomSkills +{ + public class Gambler : ISkill + { + private const Skills skillName = Skills.Gambler; + private static readonly int refreshPrice = Config.GetValue(skillName, "refreshPrice"); + + public static void LoadSkill() + { + SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } + + public static void NewRound() + { + foreach (var player in Utilities.GetPlayers()) + SkillUtils.CloseMenu(player); + } + + public static void TypeSkill(CCSPlayerController player, string[] commands) + { + if (player == null || !player.IsValid || !player.PawnIsAlive) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + + if (playerInfo.SkillChance == 1) + { + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("areareaper_used_info")}"); + return; + } + + var skill = SkillData.Skills.FirstOrDefault(s => s.Name.Equals(commands[0], StringComparison.OrdinalIgnoreCase) || s.Skill.ToString().Equals(commands[0], StringComparison.OrdinalIgnoreCase)); + if (skill == null) + { + player.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("skill_not_found_setskill")); + return; + } + + if (skill.Skill == skillName) + TakeMoney(player); + Instance.AddTimer(.1f, () => + { + playerInfo.Skill = skill.Skill; + playerInfo.SkillChance = 1; + Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [player]); + }); + } + + private static void TakeMoney(CCSPlayerController player) + { + if (player == null || !player.IsValid || player.InGameMoneyServices == null) return; + var account = player.InGameMoneyServices.Account; + player.InGameMoneyServices.Account = Math.Max(0, account - refreshPrice); + Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInGameMoneyServices"); + } + + public static void EnableSkill(CCSPlayerController player) + { + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; + playerInfo.SkillChance = 0; + + var skills = GetSkills(player); + var firstSkill = skills[Instance.Random.Next(skills.Count)]; + skills.Remove(firstSkill); + var secondSkill = skills[Instance.Random.Next(skills.Count)]; + + HashSet<(string, string)> menuItems = [(firstSkill.Name, firstSkill.Skill.ToString()), + (secondSkill.Name, secondSkill.Skill.ToString()), + (Localization.GetTranslation("gambler_more"), skillName.ToString())]; + SkillUtils.CreateMenu(player, menuItems); + } + + public static void DisableSkill(CCSPlayerController player) + { + SkillUtils.CloseMenu(player); + } + + private static List GetSkills(CCSPlayerController player) + { + var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (skillPlayer == null) return [Event.noneSkill]; + + List skillList = new(SkillData.Skills); + 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) + { + Config.DefaultSkillInfo[] skillsNeedsTeammates = Config.LoadedConfig.SkillsInfo.Where(s => s.NeedsTeammates).ToArray(); + skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString())); + } + + if (player.Team == CsTeam.Terrorist) + skillList.RemoveAll(s => Event.counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); + else + skillList.RemoveAll(s => Event.terroristSkills.Any(s2 => s2.Name == s.Skill.ToString())); + + return skillList.Count == 0 ? [Event.noneSkill] : skillList; + } + + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#7eff47", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int refreshPrice = 150) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) + { + public int RefreshPrice { get; set; } = refreshPrice; + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs index 2969798..59b49c9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs @@ -6,7 +6,6 @@ using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -14,8 +13,6 @@ namespace jRandomSkills public class Ghost : ISkill { private const Skills skillName = Skills.Ghost; - private static bool roundEnd = false; - private static bool exists = false; private static readonly string[] disabledWeapons = [ "weapon_deagle", "weapon_revolver", "weapon_glock", "weapon_usp_silencer", @@ -36,83 +33,34 @@ namespace jRandomSkills return; SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - roundEnd = false; - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - EnableSkill(player); - } - }); + public static void NewRound() + { + foreach (var player in Utilities.GetPlayers()) + SetWeaponAttack(player, false); + } - return HookResult.Continue; - }); + public static void WeaponPickup(EventItemPickup @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - DisableSkill(player); - } - roundEnd = true; - Instance.RemoveListener(CheckTransmit); - exists = false; - return HookResult.Continue; - }); + if (playerInfo?.Skill != skillName) return; + SetWeaponVisibility(player!, false); + SetWeaponAttack(player!, true); + } - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue; + public static void WeaponEquip(EventItemEquip @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) 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) - DisableSkill(player); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - - if (playerInfo?.Skill != skillName) return HookResult.Continue; - SetWeaponVisibility(player!, false); - SetWeaponAttack(player!, true); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - - if (playerInfo?.Skill != skillName) return HookResult.Continue; - SetWeaponVisibility(player!, false); - SetWeaponAttack(player!, true); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in Utilities.GetPlayers()) - SetWeaponAttack(player, false); - return HookResult.Continue; - }); - - Instance.RegisterListener(OnTick); + if (playerInfo?.Skill != skillName) return; + SetWeaponVisibility(player!, false); + SetWeaponAttack(player!, true); } public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) @@ -129,10 +77,7 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - if (!exists) - Instance.RegisterListener(CheckTransmit); - exists = true; - + Event.enableTransmit = true; SetPlayerVisibility(player, false); SetWeaponVisibility(player, false); SetWeaponAttack(player, true); @@ -146,7 +91,7 @@ namespace jRandomSkills invisibleEntities.Remove(player.SteamID); } - private static void OnTick() + public static void OnTick() { foreach (var player in Utilities.GetPlayers()) { @@ -207,7 +152,7 @@ namespace jRandomSkills private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon) { - if (roundEnd || player == null || !player.IsValid) return; + if (player == null || !player.IsValid) return; var pawn = player?.PlayerPawn?.Value; if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs index 0e46c35..e6e23bd 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs @@ -11,49 +11,26 @@ namespace jRandomSkills public class Glaz : ISkill { private const Skills skillName = Skills.Glaz; - private static bool exists = false; private readonly static List smokes = []; public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, @info) => - { - smokes.Clear(); - Instance.AddTimer(2f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; + public static void NewRound() + { + smokes.Clear(); + } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - EnableSkill(player); - } - }); - return HookResult.Continue; - }); + public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate @event) + { + smokes.Add(@event.Entityid); + } - Instance.RegisterEventHandler((@event, @info) => - { - smokes.Clear(); - Instance.RemoveListener(CheckTransmit); - exists = false; - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, @info) => - { - smokes.Add(@event.Entityid); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, @info) => - { - smokes.Remove(@event.Entityid); - return HookResult.Continue; - }); + public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event) + { + smokes.Remove(@event.Entityid); } public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) @@ -74,9 +51,7 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - if (!exists) - Instance.RegisterListener(CheckTransmit); - exists = true; + Event.enableTransmit = true; SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs index a8fa430..a0b5a91 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs @@ -14,30 +14,30 @@ namespace jRandomSkills public static void LoadSkill() { - SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + glitchedPlayers.Clear(); + foreach (var player in Utilities.GetPlayers()) + SkillUtils.CloseMenu(player); + } + + public static void OnTick() + { + if (Server.TickCount % 32 != 0) return; + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + if (!SkillUtils.HasMenu(player)) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - return HookResult.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(); - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in glitchedPlayers) - DisableSkill(player); - return HookResult.Continue; - }); + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.UpdateMenu(player, menuItems); + } } public static void TypeSkill(CCSPlayerController player, string[] commands) @@ -74,24 +74,21 @@ namespace jRandomSkills if (playerInfo == null) return; playerInfo.SkillChance = 0; - SkillUtils.PrintToChat(player, Localization.GetTranslation("glitch") + ":", false); - - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("glitch_select_info")}"); - var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).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) { - foreach (var enemy in enemies) - player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.CreateMenu(player, menuItems); } else - player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index"); + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } public static void DisableSkill(CCSPlayerController player) { player.ReplicateConVar("sv_disable_radar", "0"); glitchedPlayers.Remove(player); + SkillUtils.CloseMenu(player); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#f542ef", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/Glue.cs b/jRandomSkills - SRC Files/src/player/skills/Glue.cs index c2612e2..3bed166 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glue.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glue.cs @@ -12,26 +12,26 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterListener(@event => - { - var name = @event.DesignerName; - if (!name.EndsWith("_projectile")) - return; + public static void OnEntitySpawned(CEntityInstance entity) + { + var name = entity.DesignerName; + if (!name.EndsWith("_projectile")) + return; - var grenade = @event.As(); - if (grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return; + var grenade = entity.As(); + if (grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return; - var pawn = grenade.OwnerEntity.Value.As(); - if (pawn == null || !pawn.IsValid || pawn.Controller == null || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; + var pawn = grenade.OwnerEntity.Value.As(); + if (pawn == null || !pawn.IsValid || pawn.Controller == null || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; - var player = pawn.Controller.Value.As(); - if (player == null || !player.IsValid) return; + var player = pawn.Controller.Value.As(); + if (player == null || !player.IsValid) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return; - grenade.Bounces = 555; - }); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + grenade.Bounces = 555; } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#fff52e", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs index 2b5e303..e8d6ad7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs +++ b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -18,51 +17,11 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - { - EnableSkill(player); - } - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - SkillPlayerInfo.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - SkillPlayerInfo.Remove(player.SteamID); - - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) - UpdateHUD(player, skillInfo); - } - }); + public static void NewRound() + { + SkillPlayerInfo.Clear(); } public static void EnableSkill(CCSPlayerController player) @@ -75,6 +34,17 @@ namespace jRandomSkills }; } + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) + { + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == skillName) + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + UpdateHUD(player, skillInfo); + } + } + public static void DisableSkill(CCSPlayerController player) { SkillPlayerInfo.Remove(player.SteamID); diff --git a/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs index a9dccdf..6520f20 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -18,84 +17,65 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + smokes.Clear(); + } + + public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + smokes.Add(new Vector(@event.X, @event.Y, @event.Z)); + } + + public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + smokes.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z); + } + + public static void OnEntitySpawned(CEntityInstance entity) + { + var name = entity.DesignerName; + if (name != "smokegrenade_projectile") return; + + var grenade = entity.As(); + if (grenade == null || !grenade.IsValid || grenade.OwnerEntity == null || !grenade.OwnerEntity.IsValid || grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return; + + var pawn = grenade.OwnerEntity.Value.As(); + if (pawn == null || !pawn.IsValid || pawn.Controller == null || !pawn.Controller.IsValid || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; + + var player = pawn.Controller.Value.As(); + if (player == null || !player.IsValid) return; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + + Server.NextFrame(() => { - smokes.Clear(); - return HookResult.Continue; + var smoke = entity.As(); + smoke.SmokeColor.X = 0; + smoke.SmokeColor.Y = 255; + smoke.SmokeColor.Z = 0; }); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - smokes.Add(new Vector(@event.X, @event.Y, @event.Z)); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, @info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - smokes.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z); - return HookResult.Continue; - }); - - Instance.RegisterListener(@event => - { - var name = @event.DesignerName; - if (name != "smokegrenade_projectile") return; - - var grenade = @event.As(); - if (grenade == null || !grenade.IsValid || grenade.OwnerEntity == null || !grenade.OwnerEntity.IsValid || grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return; - - var pawn = grenade.OwnerEntity.Value.As(); - if (pawn == null || !pawn.IsValid || pawn.Controller == null || !pawn.Controller.IsValid || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; - - var player = pawn.Controller.Value.As(); - if (player == null || !player.IsValid) return; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return; - - Server.NextFrame(() => - { - var smoke = @event.As(); - smoke.SmokeColor.X = 0; - smoke.SmokeColor.Y = 255; - smoke.SmokeColor.Z = 0; - }); - }); - - Instance.RegisterListener(() => - { - foreach (Vector smokePos in smokes) - foreach (var player in Utilities.GetPlayers()) - if (Server.TickCount % 17 == 0) - if (player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.AbsOrigin != null) - if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= smokeRadius) - AddHealth(player.PlayerPawn.Value, smokeHeal); - }); + public static void OnTick() + { + foreach (Vector smokePos in smokes) + foreach (var player in Utilities.GetPlayers()) + if (Server.TickCount % 17 == 0) + if (player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.AbsOrigin != null) + if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= smokeRadius) + AddHealth(player.PlayerPawn.Value, smokeHeal); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Hermit.cs b/jRandomSkills - SRC Files/src/player/skills/Hermit.cs index 8774685..307f802 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Hermit.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Hermit.cs @@ -11,41 +11,15 @@ namespace jRandomSkills private const Skills skillName = Skills.Hermit; private static readonly Dictionary dictionary = new() { - { "weapon_glock", 120 }, - { "weapon_usp_silencer", 24 }, - { "weapon_hkp2000", 52 }, - { "weapon_p250", 26 }, - { "weapon_cz75", 12 }, - { "weapon_deagle", 35 }, - { "weapon_fiveseven", 100 }, - { "weapon_elite", 120 }, - { "weapon_tec9", 90 }, - { "weapon_revolver", 8 }, - { "weapon_mac10", 100 }, - { "weapon_mp9", 120 }, - { "weapon_mp7", 120 }, - { "weapon_mp5", 120 }, - { "weapon_mp5sd", 120 }, - { "weapon_ump45", 100 }, - { "weapon_p90", 100 }, - { "weapon_bizon", 120 }, - { "weapon_ak47", 90 }, - { "weapon_m4a1", 90 }, - { "weapon_m4a1_silencer", 80 }, - { "weapon_galilar", 90 }, - { "weapon_famas", 90 }, - { "weapon_aug", 90 }, - { "weapon_sg556", 90 }, - { "weapon_ssg08", 90 }, - { "weapon_awp", 30 }, - { "weapon_scar20", 90 }, - { "weapon_g3sg1", 90 }, - { "weapon_nova", 32 }, - { "weapon_xm1014", 32 }, - { "weapon_sawedoff", 32 }, - { "weapon_mag7", 32 }, - { "weapon_m249", 200 }, - { "weapon_negev", 300 } + { "weapon_glock", 120 }, { "weapon_usp_silencer", 24 }, { "weapon_hkp2000", 52 }, { "weapon_p250", 26 }, + { "weapon_cz75", 12 }, { "weapon_deagle", 35 }, { "weapon_fiveseven", 100 }, { "weapon_elite", 120 }, + { "weapon_tec9", 90 }, { "weapon_revolver", 8 }, { "weapon_mac10", 100 }, { "weapon_mp9", 120 }, + { "weapon_mp7", 120 }, { "weapon_mp5", 120 }, { "weapon_mp5sd", 120 }, { "weapon_ump45", 100 }, + { "weapon_p90", 100 }, { "weapon_bizon", 120 }, { "weapon_ak47", 90 }, { "weapon_m4a1", 90 }, + { "weapon_m4a1_silencer", 80 }, { "weapon_galilar", 90 }, { "weapon_famas", 90 }, { "weapon_aug", 90 }, + { "weapon_sg556", 90 }, { "weapon_ssg08", 90 }, { "weapon_awp", 30 }, { "weapon_scar20", 90 }, + { "weapon_g3sg1", 90 }, { "weapon_nova", 32 }, { "weapon_xm1014", 32 }, { "weapon_sawedoff", 32 }, + { "weapon_mag7", 32 }, { "weapon_m249", 200 }, { "weapon_negev", 300 } }; private static readonly Dictionary maxReserveAmmo = dictionary; @@ -54,31 +28,29 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - var attacker = @event.Attacker; - if (!Instance.IsPlayerValid(attacker)) return HookResult.Continue; + } - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (attackerInfo?.Skill != skillName) return HookResult.Continue; + public static void PlayerDeath(EventPlayerDeath @event) + { + var attacker = @event.Attacker; + if (!Instance.IsPlayerValid(attacker)) return; - var pawn = attacker!.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return HookResult.Continue; + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + if (attackerInfo?.Skill != skillName) return; - var weapon = pawn.WeaponServices.ActiveWeapon.Value; - if (weapon == null || !weapon.IsValid || weapon.VData == null) return HookResult.Continue; + var pawn = attacker!.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return; - var maxReserveAmmoClip = maxReserveAmmo.TryGetValue(weapon.DesignerName, out var reserve) ? reserve : 100; - weapon.Clip1 = weapon.VData.MaxClip1; - weapon.ReserveAmmo.Fill(maxReserveAmmoClip); - - Utilities.SetStateChanged(weapon, "CBasePlayerWeapon", "m_iClip1"); - Utilities.SetStateChanged(weapon, "CBasePlayerWeapon", "m_pReserveAmmo"); - SkillUtils.AddHealth(pawn, healthToAdd); + var weapon = pawn.WeaponServices.ActiveWeapon.Value; + if (weapon == null || !weapon.IsValid || weapon.VData == null) return; - return HookResult.Continue; - }); + var maxReserveAmmoClip = maxReserveAmmo.TryGetValue(weapon.DesignerName, out var reserve) ? reserve : 100; + weapon.Clip1 = weapon.VData.MaxClip1; + weapon.ReserveAmmo.Fill(maxReserveAmmoClip); + + Utilities.SetStateChanged(weapon, "CBasePlayerWeapon", "m_iClip1"); + Utilities.SetStateChanged(weapon, "CBasePlayerWeapon", "m_pReserveAmmo"); + SkillUtils.AddHealth(pawn, healthToAdd); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ded678", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int healthToAdd = 25) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs b/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs index e14d7a8..8bd53c0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs @@ -16,44 +16,28 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void OnEntitySpawned(CEntityInstance @event) + { + var name = @event.DesignerName; + if (!name.EndsWith("hegrenade_projectile")) + return; + + Server.NextFrame(() => { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + var hegrenade = @event.As(); + if (hegrenade == null || !hegrenade.IsValid) return; - return HookResult.Continue; - }); + var playerPawn = hegrenade.Thrower.Value; + if (playerPawn == null || !playerPawn.IsValid) return; - Instance.RegisterListener(@event => - { - var name = @event.DesignerName; - if (!name.EndsWith("hegrenade_projectile")) - return; + var player = Utilities.GetPlayers().FirstOrDefault(p => p.PlayerPawn.Index == playerPawn.Index); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill != skillName) return; - Server.NextFrame(() => - { - var hegrenade = @event.As(); - if (hegrenade == null || !hegrenade.IsValid) return; - - var playerPawn = hegrenade.Thrower.Value; - if (playerPawn == null || !playerPawn.IsValid) return; - - var player = Utilities.GetPlayers().FirstOrDefault(p => p.PlayerPawn.Index == playerPawn.Index); - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - if (playerInfo?.Skill != skillName) return; - - hegrenade.Damage *= damageMultiplier; - hegrenade.DmgRadius *= damageRadiusMultiplier; - }); + hegrenade.Damage *= damageMultiplier; + hegrenade.DmgRadius *= damageRadiusMultiplier; }); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Impostor.cs b/jRandomSkills - SRC Files/src/player/skills/Impostor.cs index 02c7f93..39956b9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Impostor.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Impostor.cs @@ -16,25 +16,6 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - { - string model = GetEnemyModel(player); - SetPlayerModel(player, model); - } - } - }); - - return HookResult.Continue; - }); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs b/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs index 12d1781..805b9dd 100644 --- a/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs +++ b/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs @@ -12,48 +12,38 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; + public static void WeaponFire(EventWeaponFire @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill == skillName) + ApplyInfiniteAmmo(player!); - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + } - if (playerInfo?.Skill == skillName) - ApplyInfiniteAmmo(player!); + public static void GrenadeThrown(EventGrenadeThrown @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; - return HookResult.Continue; - }); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill == skillName) + player!.GiveNamedItem($"weapon_{@event.Weapon}"); - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; + } - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; + public static void WeaponReload(EventWeaponReload @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - - if (playerInfo?.Skill == skillName) - player!.GiveNamedItem($"weapon_{@event.Weapon}"); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - - if (playerInfo?.Skill == skillName) - ApplyInfiniteAmmo(player!); - - return HookResult.Continue; - }); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill == skillName) + ApplyInfiniteAmmo(player!); } private static void ApplyInfiniteAmmo(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs index a56247f..87c380e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs @@ -18,39 +18,20 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - foreach (var beams in stepBeams.Values) - foreach (var beam in beams) - if (beam != null && beam.IsValid) - beam.Remove(); - stepBeams.Clear(); - Instance.RemoveListener(CheckTransmit); - exists = false; - return HookResult.Continue; - }); - - Instance.RegisterListener(OnTick); } - private static void OnTick() + public static void NewRound() + { + foreach (var beams in stepBeams.Values) + foreach (var beam in beams) + if (beam != null && beam.IsValid) + beam.Remove(); + stepBeams.Clear(); + Instance.RemoveListener(CheckTransmit); + exists = false; + } + + public static void OnTick() { if (Server.TickCount % 8 != 0) return; foreach (var step in stepBeams.ToList()) diff --git a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs index 7c6cef3..9c2628c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs @@ -15,30 +15,31 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + foreach (var player in jammedPlayers) + SetCrosshair(player, true); + jammedPlayers.Clear(); + foreach (var player in Utilities.GetPlayers()) + SkillUtils.CloseMenu(player); + } + + public static void OnTick() + { + if (Server.TickCount % 32 != 0) return; + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + if (!SkillUtils.HasMenu(player)) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - return HookResult.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(); - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in jammedPlayers) - SetCrosshair(player, true); - jammedPlayers.Clear(); - return HookResult.Continue; - }); + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.UpdateMenu(player, menuItems); + } } public static void TypeSkill(CCSPlayerController player, string[] commands) @@ -85,24 +86,21 @@ namespace jRandomSkills if (playerInfo == null) return; playerInfo.SkillChance = 0; - SkillUtils.PrintToChat(player, Localization.GetTranslation("jammer") + ":", false); - - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("jammer_select_info")}"); - var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).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) { - foreach (var enemy in enemies) - player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.CreateMenu(player, menuItems); } else - player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index"); + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } public static void DisableSkill(CCSPlayerController player) { SetCrosshair(player, true); jammedPlayers.Remove(player); + SkillUtils.CloseMenu(player); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#42f5a7", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/Jester.cs b/jRandomSkills - SRC Files/src/player/skills/Jester.cs new file mode 100644 index 0000000..f4294b3 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/Jester.cs @@ -0,0 +1,123 @@ +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Utils; +using jRandomSkills.src.player; +using jRandomSkills.src.utils; +using System.Drawing; +using static jRandomSkills.jRandomSkills; + +namespace jRandomSkills +{ + public class Jester : ISkill + { + private const Skills skillName = Skills.Jester; + private static bool jesterMode = false; + private static bool jesterStarted = false; + private static readonly float minTime = Config.GetValue(skillName, "minTime"); + private static readonly float maxTime = Config.GetValue(skillName, "maxTime"); + + public static void LoadSkill() + { + SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } + + public static void NewRound() + { + jesterStarted = false; + } + + public static void PlayerHurt(EventPlayerHurt @event) + { + if (!jesterMode) return; + var attacker = @event.Attacker; + var victim = @event.Userid; + int hitgroup = @event.Hitgroup; + + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return; + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + + if (attackerInfo?.Skill == skillName || victimInfo?.Skill == skillName) + RestoreHealth(victim!, @event.DmgHealth); + } + + private static void RestoreHealth(CCSPlayerController victim, float damage) + { + var playerPawn = victim.PlayerPawn.Value; + if (playerPawn == null || !playerPawn.IsValid) return; + var newHealth = playerPawn.Health + damage; + + if (newHealth > 100) + newHealth = 100; + + playerPawn.Health = (int)newHealth; + } + + public static void EnableSkill(CCSPlayerController _) + { + if (!jesterStarted) + { + float wait = (float)Instance.Random.NextDouble() * (maxTime - minTime) + minTime; + Instance.AddTimer(wait, ChangeMode); + jesterStarted = true; + } + } + + private static void ChangeMode() + { + if (Instance.SkillPlayer.Any(p => p.Skill == skillName)) + { + jesterMode = !jesterMode; + foreach (var player in Utilities.GetPlayers().Where(p => !p.IsBot && p.PawnIsAlive)) + { + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill == skillName) + { + SetPlayerColor(player.PlayerPawn.Value); + player.ExecuteClientCommand("play sounds/weapons/taser/taser_charge_ready"); + } + } + float wait = (float)Instance.Random.NextDouble() * (maxTime - minTime) + minTime; + Instance.AddTimer(wait, ChangeMode); + } + } + + private static void SetPlayerColor(CCSPlayerPawn pawn) + { + var color = jesterMode ? Color.FromArgb(255, 128, 0, 128) : Color.FromArgb(255, 255, 255, 255); + pawn.Render = color; + Utilities.SetStateChanged(pawn, "CBaseModelEntity", "m_clrRender"); + } + + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers().Where(p => !p.IsBot && p.PawnIsAlive)) + { + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill == skillName) + UpdateHUD(player); + } + } + + private static void UpdateHUD(CCSPlayerController player) + { + var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == skillName); + if (skillData == null) return; + + string infoLine = $"{Localization.GetTranslation("your_skill")}:
"; + string skillLine = $"{skillData.Name}
"; + string remainingLine = $"{Localization.GetTranslation("jester_mode")}: {Localization.GetTranslation(jesterMode ? "jester_on" : "jester_off")}
"; + + var hudContent = infoLine + skillLine + remainingLine; + player.PrintToCenterHtml(hudContent); + } + + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8f108f", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float minTime = 10f, float maxTime = 25f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) + { + public float MinTime { get; set; } = minTime; + public float MaxTime { get; set; } = maxTime; + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs index 6dbd7ae..e5854e1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JumpBan.cs @@ -10,54 +10,50 @@ namespace jRandomSkills public class JumpBan : ISkill { private const Skills skillName = Skills.JumpBan; - private static readonly Dictionary bannedPlayers = []; + public static readonly Dictionary bannedPlayers = []; public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - bannedPlayers.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return HookResult.Continue; - if (!bannedPlayers.TryGetValue(player.PlayerPawn.Value, out _)) return HookResult.Continue; - bannedPlayers[player.PlayerPawn.Value] = Server.TickCount + 10; - return HookResult.Stop; - }); - - Instance.RegisterListener(OnTick); } - private static void OnTick() + public static void NewRound() + { + bannedPlayers.Clear(); + foreach (var player in Utilities.GetPlayers()) + SkillUtils.CloseMenu(player); + } + + public static void PlayerJump(EventPlayerJump @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; + if (!bannedPlayers.TryGetValue(player.PlayerPawn.Value, out _)) return; + bannedPlayers[player.PlayerPawn.Value] = Server.TickCount + 10; + } + + public static void OnTick() { foreach (var item in bannedPlayers) { var pawn = item.Key; var time = item.Value; if (time > Server.TickCount) - pawn.AbsVelocity.Z = -100; + if (pawn != null && pawn.IsValid) + pawn.AbsVelocity.Z = -100; + } + + if (Server.TickCount % 32 != 0) return; + foreach (var player in Utilities.GetPlayers()) + { + if (!SkillUtils.HasMenu(player)) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + + 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(); + + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.UpdateMenu(player, menuItems); } } @@ -94,24 +90,21 @@ namespace jRandomSkills if (playerInfo == null) return; playerInfo.SkillChance = 0; - SkillUtils.PrintToChat(player, Localization.GetTranslation("jumpban") + ":", false); - - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("jumpban_select_info")}"); - var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).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) { - foreach (var enemy in enemies) - player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.CreateMenu(player, menuItems); } else - player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index"); + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } public static void DisableSkill(CCSPlayerController player) { if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; bannedPlayers.Remove(player.PlayerPawn.Value); + SkillUtils.CloseMenu(player); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#b01e5d", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs b/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs index ba58cd7..f7fd383 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs @@ -13,17 +13,15 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - - SkillUtils.AddHealth(player.PlayerPawn.Value, addHealth); - return HookResult.Continue; - }); + public static void PlayerJump(EventPlayerJump @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + SkillUtils.AddHealth(player.PlayerPawn.Value, addHealth); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a86eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int healthToAdd = 3) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs index de64fa1..b85ec6d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs @@ -3,6 +3,7 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; +using Microsoft.Extensions.Logging; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -15,37 +16,19 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + public static void PlayerBlind(EventPlayerBlind @event) + { + var player = @event.Userid; + var attacker = @event.Attacker; + if (!Instance.IsPlayerValid(player) || !Instance.IsPlayerValid(attacker)) return; - return HookResult.Continue; - }); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - var attacker = @event.Attacker; - if (!Instance.IsPlayerValid(player) || !Instance.IsPlayerValid(attacker)) return HookResult.Continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - - if (attackerInfo?.Skill == skillName && playerInfo?.Skill != Skills.AntyFlash && player!.PlayerPawn.Value!.FlashDuration >= flashDuration) - player?.PlayerPawn?.Value?.CommitSuicide(false, true); - - return HookResult.Continue; - }); + if (attackerInfo?.Skill == skillName && playerInfo?.Skill != Skills.AntyFlash && player!.PlayerPawn.Value!.FlashDuration >= flashDuration) + player?.PlayerPawn?.Value?.CommitSuicide(false, true); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs b/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs index c7a8be6..1d3a3ce 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs @@ -13,23 +13,29 @@ namespace jRandomSkills public static void LoadSkill() { - SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + foreach (var player in Utilities.GetPlayers()) + SkillUtils.CloseMenu(player); + } + + public static void OnTick() + { + if (Server.TickCount % 32 != 0) return; + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + if (!SkillUtils.HasMenu(player)) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - return HookResult.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(); + + HashSet<(string, string)> menuItems = enemies.Select(e => ($"{e.PlayerName} : {e.PawnHealth} HP", e.Index.ToString())).ToHashSet(); + SkillUtils.UpdateMenu(player, menuItems); + } } public static void TypeSkill(CCSPlayerController player, string[] commands) @@ -65,18 +71,14 @@ namespace jRandomSkills if (playerInfo == null) return; playerInfo.SkillChance = 0; - SkillUtils.PrintToChat(player, Localization.GetTranslation("lifeswap") + ":", false); - - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("lifeswap_select_info")}"); - var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).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) { - foreach (var enemy in enemies) - player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); + HashSet<(string, string)> menuItems = enemies.Select(e => ($"{e.PlayerName} : {e.PawnHealth} HP", e.Index.ToString())).ToHashSet(); + SkillUtils.CreateMenu(player, menuItems); } else - player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index"); + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } private static void SwapHealth(CCSPlayerController player, CCSPlayerController enemy) @@ -92,6 +94,11 @@ namespace jRandomSkills Utilities.SetStateChanged(enemyPawn, "CBaseEntity", "m_iHealth"); } + public static void DisableSkill(CCSPlayerController player) + { + SkillUtils.CloseMenu(player); + } + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a3651a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { } diff --git a/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs b/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs index c9bf356..c4a350d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs @@ -1,5 +1,4 @@ -using CounterStrikeSharp.API; -using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using CS2TraceRay.Class; @@ -16,52 +15,51 @@ namespace jRandomSkills private const Skills skillName = Skills.LongKnife; private static readonly float maxDistance = Config.GetValue(skillName, "maxDistance"); - public unsafe static void LoadSkill() + public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public unsafe static void WeaponFire(EventWeaponFire @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill != skillName) return; + + var pawn = player!.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null || pawn.WeaponServices == null) return; + + var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; + if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_knife") return; + + Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z); + Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * maxDistance; + + Ray ray = new(Vector3.Zero); + CTraceFilter filter = new(pawn.Index, pawn.Index) { - var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; + m_nObjectSetMask = 0xf, + m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT, + m_nInteractsWith = pawn.GetInteractsWith(), + m_nInteractsExclude = 0, + m_nBits = 11, + m_bIterateEntities = true, + m_bHitTriggers = false, + m_nInteractsAs = 0x40000 + }; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; + filter.m_nHierarchyIds[0] = pawn.GetHierarchyId(); + filter.m_nHierarchyIds[1] = 0; + CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray); - var pawn = player!.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null || pawn.WeaponServices == null) return HookResult.Continue; + if (!trace.HitPlayer(out CCSPlayerController? target) || target == null) + return; - var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; - if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_knife") return HookResult.Continue; - - Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z); - Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * maxDistance; - - Ray ray = new(Vector3.Zero); - CTraceFilter filter = new(pawn.Index, pawn.Index) - { - m_nObjectSetMask = 0xf, - m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT, - m_nInteractsWith = pawn.GetInteractsWith(), - m_nInteractsExclude = 0, - m_nBits = 11, - m_bIterateEntities = true, - m_bHitTriggers = false, - m_nInteractsAs = 0x40000 - }; - - filter.m_nHierarchyIds[0] = pawn.GetHierarchyId(); - filter.m_nHierarchyIds[1] = 0; - CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray); - - if (!trace.HitPlayer(out CCSPlayerController? target) || target == null) - return HookResult.Continue; - - if (target.Handle == player.Handle || target.PlayerPawn.Value == null || !target.PlayerPawn.Value.IsValid || trace.Distance() <= 70) return HookResult.Continue; - target.PlayerPawn.Value.EmitSound("Player.DamageBody.Onlooker"); - SkillUtils.TakeHealth(target.PlayerPawn.Value, Instance.Random.Next(21, 34)); - return HookResult.Continue; - }); + if (target.Handle == player.Handle || target.PlayerPawn.Value == null || !target.PlayerPawn.Value.IsValid || trace.Distance() <= 70) return; + target.PlayerPawn.Value.EmitSound("Player.DamageBody.Onlooker"); + SkillUtils.TakeHealth(target.PlayerPawn.Value, Instance.Random.Next(21, 34)); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#c9f8ff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float maxDistance = 4096f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs b/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs index 3caf629..51921d3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs @@ -1,5 +1,4 @@ -using CounterStrikeSharp.API; -using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using CS2TraceRay.Class; @@ -16,67 +15,50 @@ namespace jRandomSkills private const Skills skillName = Skills.LongZeus; private static readonly float maxDistance = Config.GetValue(skillName, "maxDistance"); - public unsafe static void LoadSkill() + public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public unsafe static void WeaponFire(EventWeaponFire @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill != skillName) return; + + var pawn = player!.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null || pawn.WeaponServices == null) return; + + var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; + if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_taser") return; + + Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z); + Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * maxDistance; + + Ray ray = new(Vector3.Zero); + CTraceFilter filter = new(pawn.Index, pawn.Index) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + m_nObjectSetMask = 0xf, + m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT, + m_nInteractsWith = pawn.GetInteractsWith(), + m_nInteractsExclude = 0, + m_nBits = 11, + m_bIterateEntities = true, + m_bHitTriggers = false, + m_nInteractsAs = 0x40000 + }; - return HookResult.Continue; - }); + filter.m_nHierarchyIds[0] = pawn.GetHierarchyId(); + filter.m_nHierarchyIds[1] = 0; + CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray); - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; + if (!trace.HitPlayer(out CCSPlayerController? target) || target == null) + return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - - var pawn = player!.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null || pawn.WeaponServices == null) return HookResult.Continue; - - var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; - if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_taser") return HookResult.Continue; - - Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z); - Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * maxDistance; - - Ray ray = new(Vector3.Zero); - CTraceFilter filter = new(pawn.Index, pawn.Index) - { - m_nObjectSetMask = 0xf, - m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT, - m_nInteractsWith = pawn.GetInteractsWith(), - m_nInteractsExclude = 0, - m_nBits = 11, - m_bIterateEntities = true, - m_bHitTriggers = false, - m_nInteractsAs = 0x40000 - }; - - filter.m_nHierarchyIds[0] = pawn.GetHierarchyId(); - filter.m_nHierarchyIds[1] = 0; - CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray); - - if (!trace.HitPlayer(out CCSPlayerController? target) || target == null) - return HookResult.Continue; - - if (target.Handle == player.Handle) return HookResult.Continue; - SkillUtils.TakeHealth(target.PlayerPawn.Value, 9999); - return HookResult.Continue; - }); + if (target.Handle == player.Handle) return; + SkillUtils.TakeHealth(target.PlayerPawn.Value, 9999); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs index 4103a0a..89d344f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Magnifier.cs @@ -15,30 +15,30 @@ namespace jRandomSkills public static void LoadSkill() { - SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + playersFOV.Clear(); + foreach (var player in Utilities.GetPlayers()) + SkillUtils.CloseMenu(player); + } + + public static void OnTick() + { + if (Server.TickCount % 32 != 0) return; + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + if (!SkillUtils.HasMenu(player)) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - return HookResult.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(); - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in playersFOV.Keys) - DisableSkill(player); - return HookResult.Continue; - }); + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.UpdateMenu(player, menuItems); + } } public static void TypeSkill(CCSPlayerController player, string[] commands) @@ -79,18 +79,14 @@ namespace jRandomSkills if (playerInfo == null) return; playerInfo.SkillChance = 0; - SkillUtils.PrintToChat(player, Localization.GetTranslation("magnifier") + ":", false); - - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("magnifier_select_info")}"); - var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).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) { - foreach (var enemy in enemies) - player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.CreateMenu(player, menuItems); } else - player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index"); + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } public static void DisableSkill(CCSPlayerController player) @@ -101,6 +97,7 @@ namespace jRandomSkills Utilities.SetStateChanged(player, "CBasePlayerController", "m_iDesiredFOV"); } playersFOV.Remove(player); + SkillUtils.CloseMenu(player); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#9ba882", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, uint customFOV = 50) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/Medic.cs b/jRandomSkills - SRC Files/src/player/skills/Medic.cs index f99229c..f2dce9b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Medic.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Medic.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -19,49 +18,22 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + SkillPlayerInfo.Clear(); + } + + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - SkillPlayerInfo.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - SkillPlayerInfo.Remove(player.SteamID); - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) - UpdateHUD(player, skillInfo); - } - }); + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + UpdateHUD(player, skillInfo); + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs b/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs index ec6f257..07a6eec 100644 --- a/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs @@ -13,23 +13,29 @@ namespace jRandomSkills public static void LoadSkill() { - SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + foreach (var player in Utilities.GetPlayers()) + SkillUtils.CloseMenu(player); + } + + public static void OnTick() + { + if (Server.TickCount % 32 != 0) return; + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + if (!SkillUtils.HasMenu(player)) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - return HookResult.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(); + + HashSet<(string, string)> menuItems = enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account)}$", e.Index.ToString())).ToHashSet(); + SkillUtils.UpdateMenu(player, menuItems); + } } public static void TypeSkill(CCSPlayerController player, string[] commands) @@ -65,19 +71,14 @@ namespace jRandomSkills if (playerInfo == null) return; playerInfo.SkillChance = 0; - SkillUtils.PrintToChat(player, Localization.GetTranslation("moneyswap") + ":", false); - - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("moneyswap_select_info")}"); - var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).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) { - foreach (var enemy in enemies) - if (enemy != null && enemy.IsValid && enemy.InGameMoneyServices != null) - player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: ${enemy.InGameMoneyServices.Account}"); + HashSet<(string, string)> menuItems = enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account)}$", e.Index.ToString())).ToHashSet(); + SkillUtils.CreateMenu(player, menuItems); } else - player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index"); + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } private static void SwapMoney(CCSPlayerController player, CCSPlayerController enemy) @@ -96,6 +97,11 @@ namespace jRandomSkills Utilities.SetStateChanged(enemy, "CCSPlayerController", "m_pInGameMoneyServices"); } + public static void DisableSkill(CCSPlayerController player) + { + SkillUtils.CloseMenu(player); + } + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#52f54c", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { } diff --git a/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs b/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs index fd09fdc..ea7f5d4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs @@ -1,7 +1,9 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; +using Microsoft.Extensions.Logging; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -15,18 +17,16 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (!IsDeadPlayerValid(player)) return HookResult.Continue; + } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - if (playerInfo?.Skill == skillName) - SpawnExplosion(player!); + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (!IsDeadPlayerValid(player)) return; - return HookResult.Continue; - }); + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill == skillName) + SpawnExplosion(player!); } private static void SpawnExplosion(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs index 68fd922..0529f56 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs @@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -12,7 +11,6 @@ namespace jRandomSkills public class Ninja : ISkill { private const Skills skillName = Skills.Ninja; - private static bool exists = false; private static readonly float idlePercentInvisibility = Config.GetValue(skillName, "idlePercentInvisibility"); private static readonly float duckPercentInvisibility = Config.GetValue(skillName, "duckPercentInvisibility"); private static readonly float knifePercentInvisibility = Config.GetValue(skillName, "knifePercentInvisibility"); @@ -22,83 +20,31 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - DisableSkill(player); - if (!Instance.IsPlayerValid(player)) continue; - var playerPawn = player.PlayerPawn?.Value; + public static void NewRound() + { + invisibilityChanged.Clear(); + } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + public static void WeaponEquip(EventItemEquip @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - return HookResult.Continue; - }); + if (playerInfo?.Skill != skillName) return; + UpdateNinja(player); + } - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in Utilities.GetPlayers()) - DisableSkill(player); - invisibilityChanged.Clear(); - return HookResult.Continue; - }); + public static void WeaponPickup(EventItemPickup @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - DisableSkill(player); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - - if (playerInfo?.Skill != skillName) return HookResult.Continue; - UpdateNinja(player); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - - if (playerInfo?.Skill != skillName) return HookResult.Continue; - UpdateNinja(player); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - DisableSkill(player); - } - Instance.RemoveListener(CheckTransmit); - exists = false; - return HookResult.Continue; - }); - - Instance.RegisterListener(OnTick); + if (playerInfo?.Skill != skillName) return; + UpdateNinja(player); } public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) @@ -113,7 +59,7 @@ namespace jRandomSkills } } - private static void OnTick() + public static void OnTick() { foreach (var player in Utilities.GetPlayers()) { @@ -123,11 +69,9 @@ namespace jRandomSkills } } - public static void EnableSkill(CCSPlayerController player) + public static void EnableSkill(CCSPlayerController _) { - if (!exists) - Instance.RegisterListener(CheckTransmit); - exists = true; + Event.enableTransmit = true; } public static void DisableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/NoNades.cs b/jRandomSkills - SRC Files/src/player/skills/NoNades.cs index 2602f2d..98a56ba 100644 --- a/jRandomSkills - SRC Files/src/player/skills/NoNades.cs +++ b/jRandomSkills - SRC Files/src/player/skills/NoNades.cs @@ -12,25 +12,20 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - var damage = @event.DmgHealth; - var player = @event.Userid; - var weapon = @event.Weapon; + public static void PlayerHurt(EventPlayerHurt @event) + { + var damage = @event.DmgHealth; + var player = @event.Userid; + var weapon = @event.Weapon; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; + if (!Instance.IsPlayerValid(player)) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill != skillName) return; - if (weapon == "hegrenade" || weapon == "inferno") - { - SkillUtils.AddHealth(player!.PlayerPawn.Value, damage); - damage = 0; - return HookResult.Stop; - } - return HookResult.Continue; - }); + if (weapon == "hegrenade" || weapon == "inferno") + SkillUtils.AddHealth(player!.PlayerPawn.Value, damage); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a38c1a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs b/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs index 70b6d7f..f7520c0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs +++ b/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs @@ -2,7 +2,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -14,43 +13,24 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - Server.ExecuteCommand("weapon_accuracy_nospread 0"); - return HookResult.Continue; - }); - - Instance.RegisterListener(OnTick); } - public static void EnableSkill(CCSPlayerController player) - { - Server.ExecuteCommand("weapon_accuracy_nospread 1"); - } - - public static void DisableSkill(CCSPlayerController player) + public static void NewRound() { Server.ExecuteCommand("weapon_accuracy_nospread 0"); } - private static void OnTick() + public static void EnableSkill(CCSPlayerController _) + { + Server.ExecuteCommand("weapon_accuracy_nospread 1"); + } + + public static void DisableSkill(CCSPlayerController _) + { + Server.ExecuteCommand("weapon_accuracy_nospread 0"); + } + + public static void OnTick() { foreach (var player in Utilities.GetPlayers()) { diff --git a/jRandomSkills - SRC Files/src/player/skills/Noclip.cs b/jRandomSkills - SRC Files/src/player/skills/Noclip.cs index 6671767..6b71602 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Noclip.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Noclip.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -18,51 +17,22 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + SkillPlayerInfo.Clear(); + } + + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - { - EnableSkill(player); - } - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - SkillPlayerInfo.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - SkillPlayerInfo.Remove(player.SteamID); - - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) - UpdateHUD(player, skillInfo); - } - }); + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + UpdateHUD(player, skillInfo); + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/None.cs b/jRandomSkills - SRC Files/src/player/skills/None.cs index 6769331..16995fe 100644 --- a/jRandomSkills - SRC Files/src/player/skills/None.cs +++ b/jRandomSkills - SRC Files/src/player/skills/None.cs @@ -12,11 +12,8 @@ namespace jRandomSkills SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); } - public class SkillConfig : Config.DefaultSkillInfo + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#FFFFFF", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { - public SkillConfig(Skills skill = skillName, bool active = true, string color = "#FFFFFF", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates) - { - } } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/OneShot.cs b/jRandomSkills - SRC Files/src/player/skills/OneShot.cs index ad84b18..a8c39b4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/OneShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/OneShot.cs @@ -1,5 +1,4 @@ using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; @@ -14,35 +13,33 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); } - private static HookResult OnTakeDamage(DynamicHook h) + public static void OnTakeDamage(DynamicHook h) { CEntityInstance param = h.GetParam(0); CTakeDamageInfo param2 = h.GetParam(1); if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) - return HookResult.Continue; + return; CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.Handle); CCSPlayerPawn victimPawn = new CCSPlayerPawn(param.Handle); if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") - return HookResult.Continue; + return; if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) - return HookResult.Continue; + return; CCSPlayerController attacker = attackerPawn.Controller.Value.As(); CCSPlayerController victim = victimPawn.Controller.Value.As(); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); - if (playerInfo == null) return HookResult.Continue; + if (playerInfo == null) return; if (playerInfo.Skill == skillName && attacker.PawnIsAlive) param2.Damage = 1000f; - return HookResult.Changed; } public class SkillConfig : Config.DefaultSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs b/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs index beee8e9..7009f5b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs +++ b/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs @@ -13,23 +13,22 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - var attacker = @event.Attacker; - var victim = @event.Userid; - int damage = @event.DmgHealth; - var hitgroup = (HitGroup_t)@event.Hitgroup; + public static void PlayerHurt(EventPlayerHurt @event) + { + var attacker = @event.Attacker; + var victim = @event.Userid; + int damage = @event.DmgHealth; + var hitgroup = (HitGroup_t)@event.Hitgroup; - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; - var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); - if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue; + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return; + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + if (victimInfo == null || victimInfo.Skill != skillName) return; - HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG]; - if (hitgroup != HitGroup_t.HITGROUP_HEAD) - RestoreHealth(victim!, damage); - return HookResult.Stop; - }); + HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG]; + if (hitgroup != HitGroup_t.HITGROUP_HEAD) + RestoreHealth(victim!, damage); } private static void RestoreHealth(CCSPlayerController victim, float damage) diff --git a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs index 28c686c..1050cbb 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -21,19 +20,17 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); - - Instance.RegisterListener(() => + } + + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - { - GiveAdditionalJump(player); - } - } - }); + if (!Instance.IsPlayerValid(player)) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == skillName) + GiveAdditionalJump(player); + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs b/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs index 11c7e12..22a201e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs @@ -1,4 +1,3 @@ -using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; @@ -14,42 +13,23 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + } - Instance.RegisterEventHandler((@event, info) => + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == skillName) { - Instance.AddTimer(0.1f, () => + if (Instance.Random.NextDouble() <= playerInfo.SkillChance) { - foreach (var player in Utilities.GetPlayers()) - { - if (!IsDeadPlayerValid(player)) continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return HookResult.Continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - { - if (Instance.Random.NextDouble() <= playerInfo.SkillChance) - { - player.Respawn(); - Instance.AddTimer(.2f, () => player.Respawn()); - SkillUtils.PrintToChat(player, Localization.GetTranslation("phoenix_respawn"), false); ; - } + player.Respawn(); + Instance.AddTimer(.2f, () => player.Respawn()); + SkillUtils.PrintToChat(player, Localization.GetTranslation("phoenix_respawn"), false); ; } - - return HookResult.Continue; - }); + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Pilot.cs b/jRandomSkills - SRC Files/src/player/skills/Pilot.cs index 73c6b44..3fc9159 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Pilot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Pilot.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -17,42 +16,21 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - EnableSkill(player); - } - }); + } - return HookResult.Continue; - }); + public static void NewRound() + { + PlayerPilotInfo.Clear(); + } - Instance.RegisterEventHandler((@event, info) => + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - PlayerPilotInfo.Remove(player.SteamID); - - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - HandlePilot(player); - } - }); + HandlePilot(player); + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Planter.cs b/jRandomSkills - SRC Files/src/player/skills/Planter.cs index 0c11854..8f3c318 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Planter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Planter.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -16,33 +15,19 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, @info) => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - Schema.SetSchemaValue(player!.PlayerPawn!.Value!.Handle, "CCSPlayerPawn", "m_bInBombZone", false); - } - return HookResult.Continue; - }); + public static void BombPlanted(EventBombPlanted @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill != skillName) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - - var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); - if (plantedBomb != null) - Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + extraC4BlowTime); - - return HookResult.Continue; - }); - - Instance.RegisterListener(OnTick); + var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); + if (plantedBomb != null) + Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + extraC4BlowTime); } public static void DisableSkill(CCSPlayerController player) @@ -51,7 +36,7 @@ namespace jRandomSkills Schema.SetSchemaValue(player!.PlayerPawn.Value!.Handle, "CCSPlayerPawn", "m_bInBombZone", false); } - private static void OnTick() + public static void OnTick() { foreach (var player in Utilities.GetPlayers()) { diff --git a/jRandomSkills - SRC Files/src/player/skills/Poison.cs b/jRandomSkills - SRC Files/src/player/skills/Poison.cs index 8643db5..c67cb7c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Poison.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Poison.cs @@ -17,41 +17,36 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - foreach (var player in poisonedPlayers) - DisableSkill(player); - return HookResult.Continue; - }); - - Instance.RegisterListener(OnTick); } - private static void OnTick() + public static void NewRound() { - if (Server.TickCount % (int)(64 * cooldown) != 0) return; - foreach (var player in poisonedPlayers) + poisonedPlayers.Clear(); + } + + public static void OnTick() + { + if (Server.TickCount % (int)(64 * cooldown) == 0) { - var pawn = player.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid) continue; - SkillUtils.TakeHealth(pawn, healthToDamage); + foreach (var player in poisonedPlayers) + { + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) continue; + SkillUtils.TakeHealth(pawn, healthToDamage); + } + } + + if (Server.TickCount % 32 != 0) return; + foreach (var player in Utilities.GetPlayers()) + { + if (!SkillUtils.HasMenu(player)) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + + 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(); + + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.UpdateMenu(player, menuItems); } } @@ -88,23 +83,20 @@ namespace jRandomSkills if (playerInfo == null) return; playerInfo.SkillChance = 0; - SkillUtils.PrintToChat(player, Localization.GetTranslation("poison") + ":", false); - - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("poison_select_info")}"); - var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).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) { - foreach (var enemy in enemies) - player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.CreateMenu(player, menuItems); } else - player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index"); + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } public static void DisableSkill(CCSPlayerController player) { poisonedPlayers.Remove(player); + SkillUtils.CloseMenu(player); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#902eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 1, int damage = 1) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs index 68cbc38..074c795 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PrimaryBan.cs @@ -20,38 +20,38 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + bannedPlayers.Clear(); + foreach (var player in Utilities.GetPlayers()) + SkillUtils.CloseMenu(player); + } + + public static void WeaponEquip(EventItemEquip @event) + { + var player = @event.Userid; + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + if (!bannedPlayers.Contains(player.SteamID) || !disabledWeapons.Contains(weapon)) return; + player.ExecuteClientCommand("slot3"); + } + + public static void OnTick() + { + if (Server.TickCount % 32 != 0) return; + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + if (!SkillUtils.HasMenu(player)) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - return HookResult.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(); - Instance.RegisterEventHandler((@event, info) => - { - bannedPlayers.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - var weapon = @event.Item; - if (player == null || !player.IsValid) return HookResult.Continue; - if (!bannedPlayers.Contains(player.SteamID) || !disabledWeapons.Contains(weapon)) return HookResult.Continue; - player.ExecuteClientCommand("slot3"); - return HookResult.Stop; - }); + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.UpdateMenu(player, menuItems); + } } public static void TypeSkill(CCSPlayerController player, string[] commands) @@ -98,23 +98,20 @@ namespace jRandomSkills if (playerInfo == null) return; playerInfo.SkillChance = 0; - SkillUtils.PrintToChat(player, Localization.GetTranslation("primaryban") + ":", false); - - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("primaryban_select_info")}"); - var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).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) { - foreach (var enemy in enemies) - player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); + HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet(); + SkillUtils.CreateMenu(player, menuItems); } else - player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index"); + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } public static void DisableSkill(CCSPlayerController player) { bannedPlayers.Remove(player.SteamID); + SkillUtils.CloseMenu(player); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffc061", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs b/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs index 2e72069..9f4a9c7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs @@ -13,23 +13,22 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - var attacker = @event.Attacker; - var victim = @event.Userid; - int damage = @event.DmgHealth; - var hitgroup = (HitGroup_t)@event.Hitgroup; + public static void PlayerHurt(EventPlayerHurt @event) + { + var attacker = @event.Attacker; + var victim = @event.Userid; + int damage = @event.DmgHealth; + var hitgroup = (HitGroup_t)@event.Hitgroup; - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; - var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); - if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue; + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return; + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + if (victimInfo == null || victimInfo.Skill != skillName) return; - HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG]; - if (disabledHitbox.Contains(hitgroup)) - RestoreHealth(victim!, damage); - return HookResult.Stop; - }); + HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG]; + if (disabledHitbox.Contains(hitgroup)) + RestoreHealth(victim!, damage); } private static void RestoreHealth(CCSPlayerController victim, float damage) diff --git a/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs b/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs index 4365af1..a5a11b2 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PsychicDefusing.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -20,90 +19,70 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + SkillPlayerInfo.Clear(); + bombLocation = null; + } + + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == skillName) + SkillPlayerInfo.Remove(pawn); + } + + public static void BombPlanted(EventBombPlanted _) + { + var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); + if (plantedBomb != null) + bombLocation = plantedBomb.AbsOrigin; + } + + public static void OnTick() + { + if (bombLocation == null) return; + foreach (var skillInfo in SkillPlayerInfo) { - Instance.AddTimer(0.1f, () => + var player = skillInfo.Key; + var info = skillInfo.Value; + + if (player.AbsOrigin == null || SkillUtils.GetDistance(player.AbsOrigin, bombLocation) > maxDefusingRange) { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - SkillPlayerInfo.Clear(); - bombLocation = null; - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - - var pawn = player.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid) return HookResult.Continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - SkillPlayerInfo.Remove(pawn); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); - if (plantedBomb != null) - bombLocation = plantedBomb.AbsOrigin; - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - if (bombLocation == null) return; - foreach (var skillInfo in SkillPlayerInfo) - { - var player = skillInfo.Key; - var info = skillInfo.Value; - - if (player.AbsOrigin == null || SkillUtils.GetDistance(player.AbsOrigin, bombLocation) > maxDefusingRange) - { - info.Defusing = false; - info.DefusingTime = defusingTime; - continue; - } - - if (!info.Defusing) - player.EmitSound("c4.disarmstart"); - info.Defusing = true; - info.DefusingTime -= (1f / tickRate); - - if (info.DefusingTime <= 0) - { - var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); - if (plantedBomb != null) - { - plantedBomb.Remove(); - SkillUtils.TerminateRound(CsTeam.CounterTerrorist); - } - - SkillPlayerInfo.Clear(); - } - - var playerController = player.Controller.Value; - if (playerController == null || !player.Controller.IsValid) return; - UpdateHUD(playerController.As(), info); + info.Defusing = false; + info.DefusingTime = defusingTime; + continue; } - }); + + if (!info.Defusing) + player.EmitSound("c4.disarmstart"); + info.Defusing = true; + info.DefusingTime -= (1f / tickRate); + + if (info.DefusingTime <= 0) + { + var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); + if (plantedBomb != null) + { + plantedBomb.Remove(); + SkillUtils.TerminateRound(CsTeam.CounterTerrorist); + } + + SkillPlayerInfo.Clear(); + } + + var playerController = player.Controller.Value; + if (playerController == null || !player.Controller.IsValid) return; + UpdateHUD(playerController.As(), info); + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Push.cs b/jRandomSkills - SRC Files/src/player/skills/Push.cs index 37ed4ac..db05d9d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Push.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Push.cs @@ -1,4 +1,3 @@ -using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; @@ -16,42 +15,23 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + } - Instance.RegisterEventHandler((@event, info) => + public static void PlayerHurt(EventPlayerHurt @event) + { + var attacker = @event.Attacker; + var victim = @event.Userid; + + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) + return; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + + if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var attacker = @event!.Attacker; - var victim = @event!.Userid; - - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) - return HookResult.Continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - - if (playerInfo?.Skill == skillName && victim!.PawnIsAlive) - { - if (Instance.Random.NextDouble() <= playerInfo.SkillChance) - PushEnemy(victim, attacker!.PlayerPawn.Value!.EyeAngles); - } - - return HookResult.Continue; - }); + if (Instance.Random.NextDouble() <= playerInfo.SkillChance) + PushEnemy(victim, attacker!.PlayerPawn.Value!.EyeAngles); + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Pyro.cs b/jRandomSkills - SRC Files/src/player/skills/Pyro.cs index 4cc479d..0c54dd0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Pyro.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Pyro.cs @@ -15,36 +15,19 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + public static void PlayerHurt(EventPlayerHurt @event) + { + var victim = @event.Userid; + int damage = @event.DmgHealth; + string weapon = @event.Weapon; - return HookResult.Continue; - }); + if (weapon != "inferno" || !Instance.IsPlayerValid(victim)) return; + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + if (victimInfo == null || victimInfo.Skill != skillName) return ; - Instance.RegisterEventHandler((@event, info) => - { - var victim = @event.Userid; - int damage = @event.DmgHealth; - string weapon = @event.Weapon; - - if (weapon != "inferno" || !Instance.IsPlayerValid(victim)) return HookResult.Continue; - var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); - if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue; - - RestoreHealth(victim!, damage * regenerationMultiplier); - return HookResult.Stop; - }); + RestoreHealth(victim!, damage * regenerationMultiplier); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs b/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs index bf73ffa..dbc44d7 100644 --- a/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs @@ -2,7 +2,6 @@ using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -14,10 +13,9 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - Instance.RegisterListener(OnTick); } - private static void OnTick() + public static void OnTick() { foreach (var player in Utilities.GetPlayers()) { diff --git a/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs b/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs index c42689b..954d159 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs @@ -2,7 +2,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -14,10 +13,9 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - Instance.RegisterListener(CheckRadarowiec); } - private static void CheckRadarowiec() + public static void OnTick() { foreach (var player in Utilities.GetPlayers()) { diff --git a/jRandomSkills - SRC Files/src/player/skills/Rambo.cs b/jRandomSkills - SRC Files/src/player/skills/Rambo.cs index e912568..8ed1a7f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Rambo.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Rambo.cs @@ -15,21 +15,6 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - EnableSkill(player); - } - }); - return HookResult.Continue; - }); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs b/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs index 210cadd..99b797c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs @@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; using System.Collections.Immutable; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -26,51 +25,22 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + SkillPlayerInfo.Clear(); + } + + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - { - EnableSkill(player); - } - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - SkillPlayerInfo.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - SkillPlayerInfo.Remove(player.SteamID); - - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) - UpdateHUD(player, skillInfo); - } - }); + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + UpdateHUD(player, skillInfo); + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs b/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs index 08e5423..739f96b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs @@ -16,51 +16,6 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - var weapon = @event.Item; - if (player == null || !player.IsValid) return HookResult.Continue; - if (!zombies.Contains(player) || weapon == "c4") return HookResult.Continue; - player.ExecuteClientCommand("slot3"); - return HookResult.Stop; - }); - - Instance.RegisterEventHandler((@event, info) => - { - foreach(var player in zombies) - DisableSkill(player); - zombies.Clear(); - return HookResult.Stop; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || zombies.Contains(player)) return HookResult.Continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - - var pawn = player.PlayerPawn.Value; - if (pawn.AbsOrigin == null) return HookResult.Continue; - Vector deadPosition = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z); - QAngle deadRotation = new(pawn.EyeAngles.X, pawn.EyeAngles.Y, pawn.EyeAngles.Z); - - player.Respawn(); - Instance.AddTimer(.2f, () => { - player.Respawn(); - zombies.Add(player); - SetPlayerColor(pawn, false); - SkillUtils.AddHealth(pawn, zombieHealth - 100, zombieHealth); - pawn.Teleport(deadPosition, deadRotation); - player.ExecuteClientCommand("slot3"); - Instance.AddTimer(1, () => player.ExecuteClientCommand("slot3")); - }); - - return HookResult.Continue; - }); } public static void EnableSkill(CCSPlayerController player) @@ -75,6 +30,47 @@ namespace jRandomSkills SetPlayerColor(player.PlayerPawn.Value, true); } + public static void WeaponEquip(EventItemEquip @event) + { + var player = @event.Userid; + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + if (!zombies.Contains(player) || weapon == "c4") return; + player.ExecuteClientCommand("slot3"); + } + + public static void NewRound() + { + foreach (var player in zombies) + DisableSkill(player); + zombies.Clear(); + } + + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || zombies.Contains(player)) return; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + + var pawn = player.PlayerPawn.Value; + if (pawn.AbsOrigin == null) return; + Vector deadPosition = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z); + QAngle deadRotation = new(pawn.EyeAngles.X, pawn.EyeAngles.Y, pawn.EyeAngles.Z); + + player.Respawn(); + Instance.AddTimer(.2f, () => { + player.Respawn(); + zombies.Add(player); + SetPlayerColor(pawn, false); + SkillUtils.AddHealth(pawn, zombieHealth - 100, zombieHealth); + pawn.Teleport(deadPosition, deadRotation); + player.ExecuteClientCommand("slot3"); + Instance.AddTimer(1, () => player.ExecuteClientCommand("slot3")); + }); + } + private static void SetPlayerColor(CCSPlayerPawn pawn, bool normal) { var color = normal ? Color.FromArgb(255, 255, 255, 255) : Color.FromArgb(255, 255, 0, 0); diff --git a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs index 095f878..faabb2e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -17,68 +16,38 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + SkillPlayerInfo.Clear(); + } + + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - SkillPlayerInfo.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - SkillPlayerInfo.Remove(player.SteamID); + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + UpdateHUD(player, skillInfo); + } + } - return HookResult.Continue; - }); + public static void PlayerHurt(EventPlayerHurt @event) + { + var attacker = @event.Attacker; + var victim = @event.Userid; + int damage = @event.DmgHealth; - Instance.RegisterListener(() => + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return; + if (SkillPlayerInfo.TryGetValue(victim!.SteamID, out var skillInfo)) { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) - UpdateHUD(player, skillInfo); - } - }); - - Instance.RegisterEventHandler((@event, info) => - { - var attacker = @event.Attacker; - var victim = @event.Userid; - int damage = @event.DmgHealth; - - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; - if (SkillPlayerInfo.TryGetValue(victim!.SteamID, out var skillInfo)) - { - if (!victim.IsValid || !victim.PawnIsAlive || !skillInfo.CanUse) return HookResult.Continue; - skillInfo.CanUse = false; - skillInfo.Cooldown = DateTime.Now; - RestoreHealth(victim, damage); - return HookResult.Stop; - } - - return HookResult.Continue; - }); + if (!victim.IsValid || !victim.PawnIsAlive || !skillInfo.CanUse) return; + skillInfo.CanUse = false; + skillInfo.Cooldown = DateTime.Now; + RestoreHealth(victim, damage); + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs b/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs index d0ffde9..7710f44 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Regeneration.cs @@ -1,5 +1,4 @@ using CounterStrikeSharp.API; -using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using static jRandomSkills.jRandomSkills; @@ -15,10 +14,9 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - Instance.RegisterListener(OnTick); } - private static void OnTick() + public static void OnTick() { if (Server.TickCount % (int)(64 * cooldown) != 0) return; foreach (var player in Utilities.GetPlayers()) diff --git a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs index 8ae04fa..fa66000 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs @@ -1,11 +1,9 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -19,51 +17,22 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + SkillPlayerInfo.Clear(); + } + + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - SkillPlayerInfo.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - SkillPlayerInfo.Remove(player.SteamID); - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) - UpdateHUD(player, skillInfo); - } - }); - - VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + UpdateHUD(player, skillInfo); + } } public static void EnableSkill(CCSPlayerController player) @@ -144,27 +113,26 @@ namespace jRandomSkills replica.AcceptInput("EnableCollision"); } - private static HookResult OnTakeDamage(DynamicHook h) + public static void OnTakeDamage(DynamicHook h) { CEntityInstance param = h.GetParam(0); CTakeDamageInfo param2 = h.GetParam(1); if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) - return HookResult.Continue; + return; CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); - if (string.IsNullOrEmpty(param.Entity.Name)) return HookResult.Continue; - if (!param.Entity.Name.StartsWith("Replica_")) return HookResult.Continue; + if (string.IsNullOrEmpty(param.Entity.Name)) return; + if (!param.Entity.Name.StartsWith("Replica_")) return; var replica = param.As(); - if (replica == null || !replica.IsValid) return HookResult.Continue; + if (replica == null || !replica.IsValid) return; replica.EmitSound("GlassBottle.BulletImpact", volume: 1f); var attackerTeam = attackerPawn.TeamNum; var replicaTeam = replica.Globalname.EndsWith("CT") ? 3 : 2; SkillUtils.TakeHealth(attackerPawn, attackerTeam != replicaTeam ? 15 : 5); replica.Remove(); - return HookResult.Continue; } public class PlayerSkillInfo diff --git a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs index dbde6cd..e88d1fb 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -17,51 +16,22 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + SkillPlayerInfo.Clear(); + } + + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - { - EnableSkill(player); - } - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - SkillPlayerInfo.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - SkillPlayerInfo.Remove(player.SteamID); - - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) - UpdateHUD(player, skillInfo); - } - }); + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + UpdateHUD(player, skillInfo); + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs b/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs index 9f3cbd9..1535400 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs @@ -14,32 +14,30 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - playersToSender.Clear(); - return HookResult.Continue; - }); + public static void NewRound() + { + playersToSender.Clear(); + } - Instance.RegisterEventHandler((@event, info) => - { - var attacker = @event.Attacker; - var victim = @event.Userid; - int damage = @event.DmgHealth; + public static void PlayerHurt(EventPlayerHurt @event) + { + var attacker = @event.Attacker; + var victim = @event.Userid; + int damage = @event.DmgHealth; - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (attackerInfo == null || attackerInfo.Skill != skillName) return HookResult.Continue; + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + if (attackerInfo == null || attackerInfo.Skill != skillName) return; - if (playersToSender.TryGetValue(victim!.Handle, out _)) - return HookResult.Continue; + if (playersToSender.TryGetValue(victim!.Handle, out _)) + return; - var spawn = GetSpawnVector(victim); - if (spawn == null) return HookResult.Continue; - victim!.PlayerPawn!.Value!.Teleport(spawn); - playersToSender.Add(victim.Handle); - return HookResult.Stop; - }); + var spawn = GetSpawnVector(victim); + if (spawn == null) return; + victim!.PlayerPawn!.Value!.Teleport(spawn); + playersToSender.Add(victim.Handle); } public static void DisableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs b/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs index b2c5d45..f73cad6 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs @@ -15,25 +15,6 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - - if (playerInfo?.Skill == skillName) - { - int moneyBonus = Instance.Random.Next(minMoney, maxMoney); - playerInfo.SkillChance = moneyBonus; - AddMoney(player, moneyBonus); - } - } - }); - return HookResult.Continue; - }); } public static void EnableSkill(CCSPlayerController player) @@ -50,6 +31,7 @@ namespace jRandomSkills var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo == null) return; AddMoney(player, -(int)(playerInfo.SkillChance ?? 0)); + playerInfo.SkillChance = 0; } private static void AddMoney(CCSPlayerController player, int money) diff --git a/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs b/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs index 40da2f7..f4bfbd9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs @@ -14,22 +14,20 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - var victim = @event.Userid; - var attacker = @event.Attacker; - var damage = @event.DmgHealth; - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; + } - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (attackerInfo?.Skill != skillName) return HookResult.Continue; + public static void PlayerHurt(EventPlayerHurt @event) + { + var victim = @event.Userid; + var attacker = @event.Attacker; + var damage = @event.DmgHealth; + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; - int moneyToSteal = damage * moneyMultiplier; - StealMoney(victim!, attacker!, moneyToSteal); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + if (attackerInfo?.Skill != skillName) return; - return HookResult.Continue; - }); + int moneyToSteal = damage * moneyMultiplier; + StealMoney(victim!, attacker!, moneyToSteal); } private static void StealMoney(CCSPlayerController victim, CCSPlayerController attacker, int money) diff --git a/jRandomSkills - SRC Files/src/player/skills/Rubber.cs b/jRandomSkills - SRC Files/src/player/skills/Rubber.cs index 6de65f1..48bd1d4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Rubber.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Rubber.cs @@ -17,36 +17,32 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - var attacker = @event.Attacker; - var victim = @event.Userid; - - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - - var victimPawn = victim!.PlayerPawn.Value; - if (victimPawn == null || !victimPawn.IsValid) return HookResult.Continue; - - if (attackerInfo?.Skill == skillName) - if (playersToSlow.ContainsKey(victimPawn)) - playersToSlow[victimPawn] = Server.TickCount + (64 * rubberTime); - else playersToSlow.TryAdd(victimPawn, Server.TickCount + (64 * rubberTime)); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - playersToSlow.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterListener(OnTick); } - private static void OnTick() + public static void NewRound() + { + playersToSlow.Clear(); + } + + public static void PlayerHurt(EventPlayerHurt @event) + { + var attacker = @event.Attacker; + var victim = @event.Userid; + + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + + var victimPawn = victim!.PlayerPawn.Value; + if (victimPawn == null || !victimPawn.IsValid) return; + + if (attackerInfo?.Skill == skillName) + if (playersToSlow.ContainsKey(victimPawn)) + playersToSlow[victimPawn] = Server.TickCount + (64 * rubberTime); + else playersToSlow.TryAdd(victimPawn, Server.TickCount + (64 * rubberTime)); + + } + + public static void OnTick() { foreach(var item in playersToSlow) { diff --git a/jRandomSkills - SRC Files/src/player/skills/Saper.cs b/jRandomSkills - SRC Files/src/player/skills/Saper.cs index 437f3be..2798f72 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Saper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Saper.cs @@ -13,54 +13,42 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => + } + + public static void BombBegindefuse(EventBombBegindefuse @event) + { + var player = @event.Userid; + if (Instance.IsPlayerValid(player)) { - var player = @event.Userid; - - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (playerInfo?.Skill == skillName) { - var bombEntities = Utilities.FindAllEntitiesByDesignerName("weapon_c4").ToList(); - - if (bombEntities.Count != 0) - { - var bomb = bombEntities.FirstOrDefault(); - if (bomb != null) - { - bomb.BombPlacedAnimation = false; - bomb.ArmedTime = 0.0f; - } - } + var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); + if (plantedBomb != null) + Server.NextFrame(() => plantedBomb.DefuseCountDown = 0); } + } + } - return HookResult.Continue; - }); + public static void BombBeginplant(EventBombBeginplant @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; - Instance.RegisterEventHandler((@event, info) => + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill == skillName) { - var player = @event.Userid; - - if (Instance.IsPlayerValid(player)) + var bombEntities = Utilities.FindAllEntitiesByDesignerName("weapon_c4").ToList(); + if (bombEntities.Count != 0) { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - if (playerInfo?.Skill == skillName) + var bomb = bombEntities.FirstOrDefault(); + if (bomb != null) { - var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); - if (plantedBomb != null) - { - Server.NextFrame(() => - { - plantedBomb.DefuseCountDown = 0; - }); - } + bomb.BombPlacedAnimation = false; + bomb.ArmedTime = 0.0f; } } - - return HookResult.Continue; - }); + } } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8A2BE2", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs index 913d1d4..5754129 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs @@ -15,50 +15,31 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (player == null || !player.IsValid || player.PlayerPawn?.Value == null) continue; + public static void NewRound() + { + secondLifePlayers.Clear(); + } - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + public static void PlayerHurt(EventPlayerHurt @event) + { + var victim = @event.Userid; + int damage = @event.DmgHealth; - return HookResult.Continue; - }); + if (!Instance.IsPlayerValid(victim)) return; + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + if (victimInfo == null || victimInfo.Skill != skillName) return; - Instance.RegisterEventHandler((@event, info) => - { - secondLifePlayers.Clear(); - return HookResult.Continue; - }); + var victimPawn = victim!.PlayerPawn.Value; + if (victimPawn!.Health > 0 || secondLifePlayers.TryGetValue(victim.Handle, out _) == true) + return; - Instance.RegisterEventHandler((@event, info) => - { - var victim = @event.Userid; - int damage = @event.DmgHealth; - - if (!Instance.IsPlayerValid(victim)) return HookResult.Continue; - var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); - if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue; - - var victimPawn = victim!.PlayerPawn.Value; - if (victimPawn!.Health > 0 || secondLifePlayers.TryGetValue(victim.Handle, out _) == true) - return HookResult.Continue; - - secondLifePlayers.Add(victim.Handle); - SetHealth(victim, secondLifeHealth); - var spawn = GetSpawnVector(victim); - if (spawn != null) - victimPawn.Teleport(spawn, victimPawn.AbsRotation, null); - return HookResult.Stop; - }); + secondLifePlayers.Add(victim.Handle); + SetHealth(victim, secondLifeHealth); + var spawn = GetSpawnVector(victim); + if (spawn != null) + victimPawn.Teleport(spawn, victimPawn.AbsRotation, null); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Shade.cs b/jRandomSkills - SRC Files/src/player/skills/Shade.cs index 7246ec0..6de2739 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Shade.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Shade.cs @@ -7,7 +7,6 @@ using CS2TraceRay.Struct; using jRandomSkills.src.player; using jRandomSkills.src.utils; using System.Numerics; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; @@ -22,35 +21,25 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - var attacker = @event.Attacker; - var victim = @event.Userid; + } - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; + public static void NewRound() + { + noSpace.Clear(); + } - var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + public static void PlayerHurt(EventPlayerHurt @event) + { + var attacker = @event.Attacker; + var victim = @event.Userid; - if (attackerInfo?.Skill == skillName) - TeleportAttackerBehindVictim(attacker!, victim!); + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return; - return HookResult.Continue; - }); + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - Instance.RegisterEventHandler((@event, info) => - { - noSpace.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (var item in noSpace) - if (item.Value >= Server.TickCount) - UpdateHUD(item.Key); - }); + if (attackerInfo?.Skill == skillName) + TeleportAttackerBehindVictim(attacker!, victim!); } public static void DisableSkill(CCSPlayerController player) @@ -58,6 +47,13 @@ namespace jRandomSkills noSpace.Remove(player); } + public static void OnTick() + { + foreach (var item in noSpace) + if (item.Value >= Server.TickCount) + UpdateHUD(item.Key); + } + private static void UpdateHUD(CCSPlayerController player) { var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == skillName); diff --git a/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs b/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs index 933b9ec..966e14a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs @@ -14,21 +14,19 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; + public static void BombPlanted(EventBombPlanted @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill != skillName) return; - var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); - if (plantedBomb != null) - Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + detonationTime); - - return HookResult.Continue; - }); + var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); + if (plantedBomb != null) + Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + detonationTime); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#f5b74c", CsTeam onlyTeam = CsTeam.Terrorist, bool needsTeammates = false, int detonationTime = 20) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/Silent.cs b/jRandomSkills - SRC Files/src/player/skills/Silent.cs index fad4919..79df00e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Silent.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Silent.cs @@ -1,5 +1,5 @@ using CounterStrikeSharp.API; -using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using static jRandomSkills.jRandomSkills; @@ -13,26 +13,24 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.HookUserMessage(208, um => - { - var soundevent = um.ReadUInt("soundevent_hash"); - var userIndex = um.ReadUInt("source_entity_index"); + public static void PlayerMakeSound(UserMessage um) + { + var soundevent = um.ReadUInt("soundevent_hash"); + var userIndex = um.ReadUInt("source_entity_index"); + if (userIndex == 0) return; - if (userIndex == 0) return HookResult.Continue; + if (!Instance.footstepSoundEvents.Contains(soundevent) && !Instance.silentSoundEvents.Contains(soundevent)) + return; - if (!Instance.footstepSoundEvents.Contains(soundevent) && !Instance.silentSoundEvents.Contains(soundevent)) - return HookResult.Continue; + var player = Utilities.GetPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex); + if (!Instance.IsPlayerValid(player)) return; - var player = Utilities.GetPlayers().FirstOrDefault(p => p.Pawn?.Value != null && p.Pawn.Value.IsValid && p.Pawn.Value.Index == userIndex); - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill != skillName) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - - um.Recipients.Clear(); - return HookResult.Handled; - }, HookMode.Pre); + um.Recipients.Clear(); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#333333", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs b/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs index abe4937..be7caa6 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs @@ -19,38 +19,21 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - EnableSkill(player); - } - }); + public static void NewRound() + { + sniperElites.Clear(); + } - return HookResult.Continue; - }); + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == skillName) + sniperElites.Remove(player.SteamID); - Instance.RegisterEventHandler((@event, info) => - { - sniperElites.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - sniperElites.Remove(player.SteamID); - - return HookResult.Continue; - }); } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Soldier.cs b/jRandomSkills - SRC Files/src/player/skills/Soldier.cs index b00c922..60fdf05 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Soldier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Soldier.cs @@ -1,6 +1,4 @@ -using CounterStrikeSharp.API; -using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Memory; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; @@ -16,24 +14,6 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); - VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); } public static void EnableSkill(CCSPlayerController player) @@ -46,36 +26,34 @@ namespace jRandomSkills SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("soldier")}{ChatColors.Lime}: " + Localization.GetTranslation("soldier_desc2", newScale), false); } - private static HookResult OnTakeDamage(DynamicHook h) + public static void OnTakeDamage(DynamicHook h) { CEntityInstance param = h.GetParam(0); CTakeDamageInfo param2 = h.GetParam(1); if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) - return HookResult.Continue; + return; CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); CCSPlayerPawn victimPawn = new(param.Handle); if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") - return HookResult.Continue; + return; if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) - return HookResult.Continue; + return; CCSPlayerController attacker = attackerPawn.Controller.Value.As(); CCSPlayerController victim = victimPawn.Controller.Value.As(); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); - if (playerInfo == null) return HookResult.Continue; + if (playerInfo == null) return; if (playerInfo.Skill == skillName && attacker.PawnIsAlive) { float? skillChance = playerInfo.SkillChance; param2.Damage *= skillChance ?? 1f; } - - return HookResult.Continue; } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#09ba00", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = 1.15f, float chanceTo = 1.35f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs index 3b49863..aaab644 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -17,49 +16,11 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) return; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - SkillPlayerInfo.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - SkillPlayerInfo.Remove(player.SteamID); - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) - UpdateHUD(player, skillInfo); - } - }); + public static void NewRound() + { + SkillPlayerInfo.Clear(); } public static void EnableSkill(CCSPlayerController player) @@ -77,6 +38,26 @@ namespace jRandomSkills SkillPlayerInfo.Remove(player.SteamID); } + public static void PlayerDeath(EventPlayerDeath @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == skillName) + SkillPlayerInfo.Remove(player.SteamID); + } + + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) + { + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == skillName) + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + UpdateHUD(player, skillInfo); + } + } + private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo) { float cooldown = 0; diff --git a/jRandomSkills - SRC Files/src/player/skills/Spectator.cs b/jRandomSkills - SRC Files/src/player/skills/Spectator.cs index 684f08f..caf8cbf 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Spectator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Spectator.cs @@ -10,54 +10,38 @@ namespace jRandomSkills public class Spectator : ISkill { private const Skills skillName = Skills.Spectator; - private static bool blocked = false; private static readonly float distance = Config.GetValue(skillName, "distance"); private static readonly Dictionary cameras = []; public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - blocked = true; - foreach (var player in Utilities.GetPlayers()) - if (cameras.TryGetValue(player.SteamID, out _)) - DisableSkill(player); + public static void NewRound() + { + foreach (var camera in cameras) + camera.Value.Item2.Remove(); + cameras.Clear(); + } - foreach (var camera in cameras) - camera.Value.Item2.Remove(); - cameras.Clear(); - return HookResult.Continue; - }); + public static void WeaponPickup(EventItemPickup @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + if (playerInfo?.Skill != skillName) return; - Instance.RegisterEventHandler((@event, info) => - { - blocked = false; - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - - var pawn = player!.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return HookResult.Continue; - if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item1 != pawn.CameraServices.ViewEntity.Raw) - BlockWeapon(player, true); - return HookResult.Continue; - }); - - Instance.RegisterListener(OnTick); + var pawn = player!.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return; + if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item1 != pawn.CameraServices.ViewEntity.Raw) + BlockWeapon(player, true); } public static void UseSkill(CCSPlayerController player) { var playerPawn = player.PlayerPawn.Value; - if (playerPawn?.CBodyComponent == null || blocked) return; + if (playerPawn?.CBodyComponent == null) return; ChangeCamera(player); } @@ -66,7 +50,7 @@ namespace jRandomSkills ChangeCamera(player, true); } - private static void OnTick() + public static void OnTick() { foreach (var player in Utilities.GetPlayers()) if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2.IsValid) diff --git a/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs b/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs index 63b7027..fac4e05 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -17,55 +16,25 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void NewRound() + { + SkillPlayerInfo.Clear(); + } + + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - { - EnableSkill(player); - } - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - SkillPlayerInfo.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo?.Skill == skillName) - SkillPlayerInfo.Remove(player.SteamID); - - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) - if (skillInfo.LastClick.AddSeconds(4) >= DateTime.Now) - UpdateHUD(player, skillInfo, true); - else - UpdateHUD(player, skillInfo, false); - } - }); + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (skillInfo.LastClick.AddSeconds(4) >= DateTime.Now) + UpdateHUD(player, skillInfo, true); + else + UpdateHUD(player, skillInfo, false); + } } public static void EnableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs b/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs index 0a71943..0a32317 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs @@ -13,23 +13,18 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - var victim = @event.Userid; - var attacker = @event.Attacker; + } - if (!Instance.IsPlayerValid(victim) || !Instance.IsPlayerValid(attacker)) return HookResult.Continue; + public static void PlayerHurt(EventPlayerHurt @event) + { + var victim = @event.Userid; + var attacker = @event.Attacker; - var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); + if (!Instance.IsPlayerValid(victim) || !Instance.IsPlayerValid(attacker)) return; + var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); - if (attackerInfo?.Skill == skillName) - { - TeleportPlayers(attacker!, victim!); - } - - return HookResult.Continue; - }); + if (attackerInfo?.Skill == skillName) + TeleportPlayers(attacker!, victim!); } private static void TeleportPlayers(CCSPlayerController attacker, CCSPlayerController victim) diff --git a/jRandomSkills - SRC Files/src/player/skills/Thief.cs b/jRandomSkills - SRC Files/src/player/skills/Thief.cs index 0ab1717..e758fe0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Thief.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Thief.cs @@ -13,23 +13,39 @@ namespace jRandomSkills public static void LoadSkill() { - SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false); + SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => + public static void OnTick() + { + if (Server.TickCount % 32 != 0) return; + foreach (var player in Utilities.GetPlayers()) { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); + if (!SkillUtils.HasMenu(player)) continue; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - return HookResult.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(); + if (enemies.Length > 0) + { + HashSet<(string, string)> menuItems = []; + foreach (var enemy in enemies) + { + var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); + if (enemyInfo == null) continue; + var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); + if (skillData == null) continue; + menuItems.Add(($"{enemy.PlayerName} : {skillData.Name}", enemy.Index.ToString())); + } + SkillUtils.CreateMenu(player, menuItems); + } + } + } + + public static void NewRound() + { + foreach (var player in Utilities.GetPlayers()) + SkillUtils.CloseMenu(player); } public static void TypeSkill(CCSPlayerController player, string[] commands) @@ -57,24 +73,22 @@ namespace jRandomSkills public static void EnableSkill(CCSPlayerController player) { - SkillUtils.PrintToChat(player, Localization.GetTranslation("thief") + ":", false); - - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("thief_select_info")}"); - var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator).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) { + HashSet<(string, string)> menuItems = []; foreach (var enemy in enemies) { var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); if (enemyInfo == null) continue; var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; - player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: {ChatColors.Red}{skillData.Name}"); + menuItems.Add(($"{enemy.PlayerName} : {skillData.Name}", enemy.Index.ToString())); } + SkillUtils.CreateMenu(player, menuItems); } else - player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); - player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index"); + player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); } public static void DisableSkill(CCSPlayerController player) @@ -82,6 +96,7 @@ namespace jRandomSkills var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (playerInfo == null) return; playerInfo.SpecialSkill = Skills.None; + SkillUtils.CloseMenu(player); } private static void DeacitvateSkill(CCSPlayerController player, CCSPlayerController enemy) @@ -92,9 +107,12 @@ namespace jRandomSkills if (playerInfo != null) { - playerInfo.Skill = enemyInfo.Skill; - playerInfo.SpecialSkill = skillName; - Instance.SkillAction(enemyInfo.Skill.ToString(), "EnableSkill", [player]); + Instance.AddTimer(.1f, () => + { + playerInfo.Skill = enemyInfo.Skill; + playerInfo.SpecialSkill = skillName; + Instance.SkillAction(enemyInfo.Skill.ToString(), "EnableSkill", [player]); + }); player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("thief_player_info", enemy.PlayerName)); } diff --git a/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs b/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs index 8efd738..f213201 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ThirdEye.cs @@ -3,47 +3,31 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using System.Drawing; -using static jRandomSkills.jRandomSkills; namespace jRandomSkills { public class ThirdEye : ISkill { private const Skills skillName = Skills.ThirdEye; - private static bool blocked = false; private static readonly float distance = Config.GetValue(skillName, "distance"); private static readonly Dictionary cameras = []; public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - blocked = true; - foreach (var player in Utilities.GetPlayers()) - if (cameras.TryGetValue(player.SteamID, out _)) - DisableSkill(player); - - foreach (var camera in cameras) - camera.Value.Item2.Remove(); - cameras.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - blocked = false; - return HookResult.Continue; - }); - - Instance.RegisterListener(OnTick); + public static void NewRound() + { + foreach (var camera in cameras) + camera.Value.Item2.Remove(); + cameras.Clear(); } public static void UseSkill(CCSPlayerController player) { var playerPawn = player.PlayerPawn.Value; - if (playerPawn?.CBodyComponent == null || blocked) return; + if (playerPawn?.CBodyComponent == null) return; ChangeCamera(player); } @@ -52,7 +36,7 @@ namespace jRandomSkills ChangeCamera(player, true); } - private static void OnTick() + public static void OnTick() { foreach (var player in Utilities.GetPlayers()) if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2.IsValid) diff --git a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs index 53ab4e1..2c09c30 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs @@ -13,21 +13,20 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - var attacker = @event.Attacker; - var victim = @event.Userid; + } - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; - var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); - if (victimInfo?.Skill == skillName && victim!.PawnIsAlive && attacker!.PawnIsAlive) - { - SkillUtils.TakeHealth(attacker.PlayerPawn.Value, (int)(@event.DmgHealth * healthTakenScale)); - attacker.EmitSound("Player.DamageBody.Onlooker"); - } - return HookResult.Continue; - }); + public static void PlayerHurt(EventPlayerHurt @event) + { + var attacker = @event.Attacker; + var victim = @event.Userid; + + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; + var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); + if (victimInfo?.Skill == skillName && victim!.PawnIsAlive && attacker!.PawnIsAlive) + { + SkillUtils.TakeHealth(attacker.PlayerPawn.Value, (int)(@event.DmgHealth * healthTakenScale)); + attacker.EmitSound("Player.DamageBody.Onlooker"); + } } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#962631", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float healthTakenScale = .3f) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) diff --git a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs index 1d6bdf3..151124a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -18,85 +17,11 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - smokes.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - smokes.Add(new Vector(@event.X, @event.Y, @event.Z)); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, @info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return HookResult.Continue; - smokes.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z); - return HookResult.Continue; - }); - - Instance.RegisterListener(@event => - { - var name = @event.DesignerName; - if (name != "smokegrenade_projectile") return; - - var grenade = @event.As(); - if (grenade == null || !grenade.IsValid || grenade.OwnerEntity == null || !grenade.OwnerEntity.IsValid || grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return; - - var pawn = grenade.OwnerEntity.Value.As(); - if (pawn == null || !pawn.IsValid || pawn.Controller == null || !pawn.Controller.IsValid || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; - - var player = pawn.Controller.Value.As(); - if (player == null || !player.IsValid) return; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) return; - - Server.NextFrame(() => - { - var smoke = @event.As(); - smoke.SmokeColor.X = 255; - smoke.SmokeColor.Y = 0; - smoke.SmokeColor.Z = 255; - }); - }); - - Instance.RegisterListener(() => - { - foreach (Vector smokePos in smokes) - foreach (var player in Utilities.GetPlayers()) - if (Server.TickCount % 17 == 0) - if (player != null && player.IsValid && player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid) - if (player.PlayerPawn.Value.LifeState == (byte)LifeState_t.LIFE_ALIVE && player.PlayerPawn.Value.AbsOrigin != null) - if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= smokeRadius) - AddHealth(player.PlayerPawn.Value, -smokeDamage); - }); + public static void NewRound() + { + smokes.Clear(); } public static void EnableSkill(CCSPlayerController player) @@ -104,6 +29,50 @@ namespace jRandomSkills SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); } + public static void OnEntitySpawned(CEntityInstance entity) + { + var name = entity.DesignerName; + if (name != "smokegrenade_projectile") return; + + var grenade = entity.As(); + if (grenade == null || !grenade.IsValid || grenade.OwnerEntity == null || !grenade.OwnerEntity.IsValid || grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return; + + var pawn = grenade.OwnerEntity.Value.As(); + if (pawn == null || !pawn.IsValid || pawn.Controller == null || !pawn.Controller.IsValid || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; + + var player = pawn.Controller.Value.As(); + if (player == null || !player.IsValid) return; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + + Server.NextFrame(() => + { + var smoke = entity.As(); + smoke.SmokeColor.X = 255; + smoke.SmokeColor.Y = 0; + smoke.SmokeColor.Z = 255; + }); + } + + public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + smokes.Add(new Vector(@event.X, @event.Y, @event.Z)); + } + + public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event) + { + var player = @event.Userid; + if (player == null || !player.IsValid) return; + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return; + smokes.RemoveAll(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z); + } + private static void AddHealth(CCSPlayerPawn player, int health) { if (player.LifeState != (byte)LifeState_t.LIFE_ALIVE) @@ -117,6 +86,17 @@ namespace jRandomSkills player.CommitSuicide(false, true); } + public static void OnTick() + { + foreach (Vector smokePos in smokes) + foreach (var player in Utilities.GetPlayers()) + if (Server.TickCount % 17 == 0) + if (player != null && player.IsValid && player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid) + if (player.PlayerPawn.Value.LifeState == (byte)LifeState_t.LIFE_ALIVE && player.PlayerPawn.Value.AbsOrigin != null) + if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= smokeRadius) + AddHealth(player.PlayerPawn.Value, -smokeDamage); + } + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#507529", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int smokeDamage = 2, float smokeRadius = 180) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { public int SmokeDamage { get; set; } = smokeDamage; diff --git a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs index de951be..873a5fd 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs @@ -11,43 +11,11 @@ namespace jRandomSkills public class Wallhack : ISkill { private const Skills skillName = Skills.Wallhack; - private static bool exists = false; private static readonly List<(CDynamicProp, CDynamicProp)> glows = []; public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, @info) => - { - glows.Clear(); - Instance.AddTimer(2f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - EnableSkill(player); - } - }); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, @info) => - { - foreach (var glow in glows) - { - glow.Item1.Remove(); - glow.Item2.Remove(); - } - glows.Clear(); - - Instance.RemoveListener(CheckTransmit); - exists = false; - return HookResult.Continue; - }); } public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) @@ -71,11 +39,19 @@ namespace jRandomSkills } } + public static void NewRound() + { + foreach (var glow in glows) + { + glow.Item1.Remove(); + glow.Item2.Remove(); + } + glows.Clear(); + } + public static void EnableSkill(CCSPlayerController player) { - if (!exists) - Instance.RegisterListener(CheckTransmit); - exists = true; + Event.enableTransmit = true; SetGlowEffectForEnemies(player); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs b/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs index 592c430..024d0ff 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -17,46 +16,43 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - bombPlanted = false; - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - bombPlanted = true; - return HookResult.Continue; - }); - - Instance.RegisterListener(@event => - { - var name = @event.DesignerName; - if (!name.EndsWith("_projectile")) - return; - - var grenade = @event.As(); - if (grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return; - - var pawn = grenade.OwnerEntity.Value.As(); - if (pawn == null || !pawn.IsValid || pawn.Controller == null || !pawn.Controller.IsValid || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; - var player = pawn.Controller.Value.As(); - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName || Instance.GameRules == null) return; - - Instance.GameRules.RoundTime += player.Team == CsTeam.Terrorist ? roundTime : -roundTime; - if (player.Team == CsTeam.Terrorist) - Server.PrintToChatAll($" {ChatColors.Orange}{Localization.GetTranslation("watchmaker_tt", roundTime)}"); - else - Server.PrintToChatAll($" {ChatColors.LightBlue}{Localization.GetTranslation("watchmaker_ct", roundTime)}"); - }); - - Instance.RegisterListener(OnTick); } - private static void OnTick() + public static void NewRound() + { + bombPlanted = false; + } + + public static void BombPlanted(EventBombPlanted _) + { + bombPlanted = true; + } + + public static void OnEntitySpawned(CEntityInstance entity) + { + if (bombPlanted) return; + var name = entity.DesignerName; + if (!name.EndsWith("_projectile")) + return; + + var grenade = entity.As(); + if (grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return; + + var pawn = grenade.OwnerEntity.Value.As(); + if (pawn == null || !pawn.IsValid || pawn.Controller == null || !pawn.Controller.IsValid || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; + var player = pawn.Controller.Value.As(); + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName || Instance.GameRules == null) return; + + Instance.GameRules.RoundTime += player.Team == CsTeam.Terrorist ? roundTime : -roundTime; + if (player.Team == CsTeam.Terrorist) + Server.PrintToChatAll($" {ChatColors.Orange}{Localization.GetTranslation("watchmaker_tt", roundTime)}"); + else + Server.PrintToChatAll($" {ChatColors.LightBlue}{Localization.GetTranslation("watchmaker_ct", roundTime)}"); + } + + public static void OnTick() { if (bombPlanted) return; foreach (var player in Utilities.GetPlayers()) diff --git a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs index 8de19b4..32f9e44 100644 --- a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs @@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; using jRandomSkills.src.utils; -using static CounterStrikeSharp.API.Core.Listeners; using static jRandomSkills.jRandomSkills; namespace jRandomSkills @@ -24,57 +23,11 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); + } - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - { - EnableSkill(player); - } - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - SkillPlayerInfo.Clear(); - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (player == null || !player.IsValid) return HookResult.Continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo == null) return HookResult.Continue; - - if (playerInfo.Skill == skillName) - SkillPlayerInfo.Remove(player.SteamID); - - return HookResult.Continue; - }); - - Instance.RegisterListener(() => - { - foreach (var player in Utilities.GetPlayers()) - { - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill == skillName) - if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) - if (skillInfo.LastClick.AddSeconds(4) >= DateTime.Now) - UpdateHUD(player, skillInfo, true); - else - UpdateHUD(player, skillInfo, false); - } - }); + public static void NewRound() + { + SkillPlayerInfo.Clear(); } public static void EnableSkill(CCSPlayerController player) @@ -95,6 +48,20 @@ namespace jRandomSkills SkillPlayerInfo.Remove(player.SteamID); } + public static void OnTick() + { + foreach (var player in Utilities.GetPlayers()) + { + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == skillName) + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + if (skillInfo.LastClick.AddSeconds(4) >= DateTime.Now) + UpdateHUD(player, skillInfo, true); + else + UpdateHUD(player, skillInfo, false); + } + } + private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo, bool showInfo) { float cooldown = 0; diff --git a/jRandomSkills - SRC Files/src/player/skills/Zeus.cs b/jRandomSkills - SRC Files/src/player/skills/Zeus.cs index f5d4c33..80c182f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Zeus.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Zeus.cs @@ -1,5 +1,4 @@ -using CounterStrikeSharp.API; -using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; @@ -14,51 +13,6 @@ namespace jRandomSkills public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color")); - - Instance.RegisterEventHandler((@event, info) => - { - Instance.AddTimer(0.1f, () => - { - foreach (var player in Utilities.GetPlayers()) - { - if (!Instance.IsPlayerValid(player)) continue; - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); - if (playerInfo?.Skill != skillName) continue; - EnableSkill(player); - } - }); - - return HookResult.Continue; - }); - - Instance.RegisterEventHandler((@event, info) => - { - var player = @event.Userid; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - - var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); - - if (playerInfo?.Skill == skillName) - { - var pawn = player!.PlayerPawn!.Value!; - if (pawn.WeaponServices == null || pawn.WeaponServices.ActiveWeapon == null || !pawn.WeaponServices.ActiveWeapon.IsValid) return HookResult.Continue; - if (pawn.WeaponServices.ActiveWeapon.Value == null || !pawn.WeaponServices.ActiveWeapon.Value.IsValid) return HookResult.Continue; - - var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; - if (activeWeapon.DesignerName != "weapon_taser") return HookResult.Continue; - var taser = activeWeapon.As(); - Instance.AddTimer(.1f, () => - { - if (taser.IsValid) - { - taser.LastAttackTick = 0; - taser.FireTime = 0; - } - }); - } - - return HookResult.Continue; - }); } public static void EnableSkill(CCSPlayerController player) @@ -66,6 +20,34 @@ namespace jRandomSkills SkillUtils.TryGiveWeapon(player, CsItem.Zeus); } + public static void WeaponFire(EventWeaponFire @event) + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return; + + var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); + + if (playerInfo?.Skill == skillName) + { + var pawn = player!.PlayerPawn!.Value!; + if (pawn.WeaponServices == null || pawn.WeaponServices.ActiveWeapon == null || !pawn.WeaponServices.ActiveWeapon.IsValid) return; + if (pawn.WeaponServices.ActiveWeapon.Value == null || !pawn.WeaponServices.ActiveWeapon.Value.IsValid) return; + + var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; + if (activeWeapon.DesignerName != "weapon_taser") return; + var taser = activeWeapon.As(); + Instance.AddTimer(.1f, () => + { + if (taser.IsValid) + { + taser.LastAttackTick = 0; + taser.FireTime = 0; + } + }); + } + + } + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#fbff00", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : Config.DefaultSkillInfo(skill, active, color, onlyTeam, needsTeammates) { } diff --git a/jRandomSkills - SRC Files/src/utils/Config.cs b/jRandomSkills - SRC Files/src/utils/Config.cs index d10de69..5b8984c 100644 --- a/jRandomSkills - SRC Files/src/utils/Config.cs +++ b/jRandomSkills - SRC Files/src/utils/Config.cs @@ -141,6 +141,7 @@ namespace jRandomSkills public bool SummaryAfterTheRound { get; set; } public bool DebugMode { get; set; } public string? AlternativeSkillButton { get; set; } + public float SkillTimeBeforeStart { get; set; } public NormalCommand SetSkillCommands { get; set; } public NormalCommand SkillsListCommands { get; set; } public NormalCommand UseSkillCommands { get; set; } @@ -163,6 +164,7 @@ namespace jRandomSkills SummaryAfterTheRound = true; DebugMode = true; AlternativeSkillButton = null; + SkillTimeBeforeStart = 7; SetSkillCommands = new NormalCommand("ustawskill, ustaw_skill, setskill, set_skill, definirhabilidade, configurarhabilidade, 设置技能, 配置技能", "@jRandmosSkills/admin"); SkillsListCommands = new NormalCommand("supermoc, skille, listamocy, supermoce, skills, listaHabilidades, habilidades, 技能列表, 超能力列表", "@jRandmosSkills/admin"); diff --git a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs index 275b4dd..76940fd 100644 --- a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs +++ b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs @@ -6,7 +6,10 @@ using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using jRandomSkills.src.player; +using jRandomSkills.src.utils; using System.Runtime.InteropServices; +using WASDMenuAPI.Classes; +using WASDSharedAPI; namespace jRandomSkills { @@ -112,6 +115,75 @@ namespace jRandomSkills return designerName; } + private static IWasdMenuManager? GetMenuManager() + { + if (jRandomSkills.Instance.MenuManager == null) + jRandomSkills.Instance.MenuManager = new WasdManager(); + return jRandomSkills.Instance.MenuManager; + } + + public static void CloseMenu(CCSPlayerController? player) + { + var manager = GetMenuManager(); + if (manager == null) return; + manager.CloseMenu(player); + } + + public static bool HasMenu(CCSPlayerController? player) + { + var manager = GetMenuManager(); + if (manager == null) return false; + return manager.HasMenu(player); + } + + public static void UpdateMenu(CCSPlayerController? player, HashSet<(string, string)> items) + { + if (player == null) return; + + var manager = GetMenuManager(); + if (manager == null) return; + + var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; + + Dictionary> list = []; + foreach (var item in items) + list.Add(item.Item1, (p, option) => + { + jRandomSkills.Instance.SkillAction(playerInfo.Skill.ToString(), "TypeSkill", [p, new[] { item.Item2 }]); + manager.CloseMenu(p); + }); + + manager.UpdateActiveMenu(player, list); + } + + public static void CreateMenu(CCSPlayerController? player, HashSet<(string, string)> enemies) + { + if (player == null || !player.IsValid) return; + + var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo == null) return; + + var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == playerInfo.Skill); + if (skillData == null) return; + + string infoLine = $"{Localization.GetTranslation("your_skill")}:
"; + string skillLine = $"{skillData.Name}
" + + $"{Localization.GetTranslation($"{playerInfo.Skill.ToString().ToLower()}_select_info")}"; + + var manager = GetMenuManager(); + if (manager == null) return; + + IWasdMenu menu = manager.CreateMenu(infoLine + skillLine, "W/S - Scroll | E - Select
"); + foreach (var enemy in enemies) + menu.Add(enemy.Item1, (p, option) => + { + jRandomSkills.Instance.SkillAction(playerInfo.Skill.ToString(), "TypeSkill", [p, new[] { enemy.Item2 }]); + manager.CloseMenu(p); + }); + manager.OpenMainMenu(player, menu); + } + public static void SetTeamScores(short ctScore, short tScore, RoundEndReason roundEndReason) { if (jRandomSkills.Instance == null || jRandomSkills.Instance.GameRules == null) return; diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/Config.json b/jRandomSkills - Server Files/plugins/jRandomSkills/Config.json index 3e4cf69..12d3754 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/Config.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/Config.json @@ -7,6 +7,7 @@ "SummaryAfterTheRound": true, "DebugMode": true, "AlternativeSkillButton": null, + "SkillTimeBeforeStart": 7.0, "SetSkillCommands": { "Alias": "ustawskill, ustaw_skill, setskill, set_skill, definirhabilidade, configurarhabilidade, 设置技能, 配置技能", "Permissions": "@jRandmosSkills/admin" @@ -373,6 +374,14 @@ "Active": true, "Name": "FrozenDecoy" }, + { + "RefreshPrice": 150, + "NeedsTeammates": false, + "OnlyTeam": 0, + "Color": "#7eff47", + "Active": true, + "Name": "Gambler" + }, { "NeedsTeammates": false, "OnlyTeam": 0, @@ -465,6 +474,15 @@ "Active": true, "Name": "Jammer" }, + { + "MinTime": 10.0, + "MaxTime": 25.0, + "NeedsTeammates": false, + "OnlyTeam": 0, + "Color": "#8f108f", + "Active": true, + "Name": "Jester" + }, { "NeedsTeammates": false, "OnlyTeam": 0, diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll new file mode 100644 index 0000000..6004f57 Binary files /dev/null and b/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll differ diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll index 0a03c1c..0e88154 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll differ diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/en.json b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/en.json index 54a88e7..c9938d1 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/en.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/en.json @@ -18,7 +18,7 @@ "areareaper_desc": "You can choose a bomb site to deactivate", "areareaper_incorrect_site": "No such bomb site found.", "areareaper_no_site": "No bomb sites found.", - "areareaper_select_info": "Choose the bomb site you want to deactivate:", + "areareaper_select_info": "Select site to deactivate:", "areareaper_site_disabled": "Bomb site {0} has been deactivated - no bombs can be planted there!", "areareaper_used_info": "Your skill has already been used.", @@ -66,19 +66,19 @@ "darkness_desc": "Applies a darkness effect to a chosen enemy", "darkness_enemy_info": "Let the lights go out.", "darkness_player_info": "Darkness has overtaken player '{0}'.", - "darkness_select_info": "Choose the player you want to apply the darkness effect to:", + "darkness_select_info": "Select player for darkness:", "deactivator": "Deactivator", "deactivator_desc": "Choose a player whose skill you want to disable", "deactivator_enemy_info": "Your skill has been disabled.", "deactivator_player_info": "Player '{0}'s skill has been disabled.", - "deactivator_select_info": "Choose the player whose skill you want to disable:", + "deactivator_select_info": "Disable a player's skill:", "deaf": "Deaf", "deaf_desc": "Choose a player to mute all sounds for", "deaf_enemy_info": "Your headphones have left the game.", "deaf_player_info": "Sound has been disabled for player '{0}'.", - "deaf_select_info": "Choose the player for whom you want to mute all sounds:", + "deaf_select_info": "Mute all sounds for player:", "disarmament": "Disarmament", "disarmament_desc": "You have a random chance to make an enemy drop their weapon on hit", @@ -93,7 +93,7 @@ "duplicator": "Duplicator", "duplicator_desc": "Choose a player to copy their skill", "duplicator_player_info": "Player '{0}'s skill has been copied.", - "duplicator_select_info": "Choose the player whose skill you want to copy:", + "duplicator_select_info": "Copy a player's skill:", "dwarf": "Dwarf", "dwarf_desc": "Random character size at the start of the round", @@ -129,6 +129,11 @@ "frozendecoy": "Freezing Decoy", "frozendecoy_desc": "Your decoy freezes all nearby players", + "gambler": "Gambler", + "gambler_desc": "Select a skill from the list provided.", + "gambler_select_info": "Select your skill:", + "gambler_more": "Refresh for $100", + "ghost": "Ghost", "ghost_desc": "You are completely invisible", @@ -139,7 +144,7 @@ "glitch_desc": "Disables the radar for a chosen enemy", "glitch_enemy_info": "Your radar has been disabled.", "glitch_player_info": "Player '{0}'s radar has been disabled.", - "glitch_select_info": "Choose the player whose radar you want to disable:", + "glitch_select_info": "Turn off player's radar:", "glue": "Glue", "glue_desc": "Your grenades stick to walls", @@ -171,13 +176,19 @@ "jammer_desc": "Choose a player to disable their crosshair", "jammer_enemy_info": "Your crosshair has been disabled.", "jammer_player_info": "Player '{0}'s crosshair has been disabled.", - "jammer_select_info": "Choose the player whose crosshair you want to disable:", + "jammer_select_info": "Disable player's crosshair:", + + "jester": "Jester", + "jester_desc": "In jester mode, you cannot get or take any damage. This mode changes every few seconds.", + "jester_mode": "Jester Mode", + "jester_on": "ON", + "jester_off": "OFF", "jumpban": "Legless", "jumpban_desc": "Choose a player who cannot jump", "jumpban_enemy_info": "Someone cut off your legs.", "jumpban_player_info": "Player '{0}' can no longer jump.", - "jumpban_select_info": "Choose the player who cannot jump:", + "jumpban_select_info": "Ban player from jumping:", "jumpingjack": "Jumping Jack", "jumpingjack_desc": "Jumping restores health", @@ -189,7 +200,7 @@ "lifeswap_desc": "Choose a player to swap health with", "lifeswap_enemy_info": "Someone borrowed your health.", "lifeswap_player_info": "You swapped health with player '{0}'.", - "lifeswap_select_info": "Choose the player to swap health with:", + "lifeswap_select_info": "Swap health with player:", "longknife": "Long Knife", "longknife_desc": "A primary knife attack deals damage regardless of distance", @@ -201,7 +212,7 @@ "magnifier_desc": "Forces the enemy's screen to zoom in, reducing their field of view", "magnifier_enemy_info": "Your field of view has been distorted!", "magnifier_player_info": "Player '{0}' has been forced into zoom mode.", - "magnifier_select_info": "Select the player whose screen you want to magnify:", + "magnifier_select_info": "Magnify player's screen:", "medic": "Medic", "medic_desc": "Click [css_useSkill] to use a healing charge that restores 50 health", @@ -210,7 +221,7 @@ "moneyswap_desc": "Choose a player to swap money with", "moneyswap_enemy_info": "The tax office got you.", "moneyswap_player_info": "You swapped money with player '{0}'.", - "moneyswap_select_info": "Choose the player to swap money with:", + "moneyswap_select_info": "Swap money with player:", "muhammed": "Muhammed", "muhammed_desc": "You explode upon death, killing nearby players", @@ -257,13 +268,13 @@ "poison_desc": "Choose a player who will take damage every few seconds", "poison_enemy_info": "You have been poisoned.", "poison_player_info": "Player '{0}' has been poisoned.", - "poison_select_info": "Choose the player who will take damage every few seconds:", + "poison_select_info": "Poison a player:", "primaryban": "No Rifles", "primaryban_desc": "Choose a player who cannot use rifles", "primaryban_enemy_info": "You can no longer use rifles.", "primaryban_player_info": "Player '{0}' can no longer use rifles.", - "primaryban_select_info": "Choose the player to ban from using rifles:", + "primaryban_select_info": "Ban rifles for player:", "prosthesis": "Prosthesis", "prosthesis_desc": "Arms and legs are bulletproof", @@ -353,7 +364,7 @@ "thief_desc": "You can steal a skill from a chosen player", "thief_enemy_info": "Your skill has been stolen.", "thief_player_info": "Player '{0}'s skill has been stolen.", - "thief_select_info": "Choose the player whose skill you want to steal:", + "thief_select_info": "Steal a player's skill:", "thirdeye": "Third Eye", "thirdeye_desc": "Click [css_useSkill] to activate third-person view", @@ -394,7 +405,7 @@ "no_player": "No matching player found.", "duplicate_player": "More than one player found with the same name.", "selectplayerskill_command": "Type /t", - "selectplayerskill_incorrect_enemy_index": "No player found with that index.", + "selectplayerskill_incorrect_enemy_index": "No players were found to select.", "skill_not_found_setskill": "No such CHATCOLORS.REDskill found", "player_not_found_setskill": "No such CHATCOLORS.REDplayer found", @@ -420,7 +431,12 @@ "vote_alredy_voted": "You have already voted!", "vote_vote": "Vote", + "bombsite_a": "Bombsite A", + "bombsite_b": "Bombsite B", + "teammate_skills": "Your teammates' skills", "summary_start": "======SUMMARY=OF=THE=LAST=ROUND======", - "summary_end": "=======================================" + "summary_end": "=======================================", + + "menu_controlls": "W/S - Scroll | E - Select
" } \ No newline at end of file diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pl.json b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pl.json index 62ec12e..cbe52c8 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pl.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pl.json @@ -18,7 +18,7 @@ "areareaper_desc": "Możesz wybrać strefę detonacji, którą chcesz dezaktywować", "areareaper_incorrect_site": "Nie znaleziono takiej strefy detonacji.", "areareaper_no_site": "Nie znaleziono żadnej strefy detonacji.", - "areareaper_select_info": "Wybierz strefę detonacji, którą chcesz dezaktywować:", + "areareaper_select_info": "Wybierz strefę do dezaktyw.:", "areareaper_site_disabled": "Strefa detonacji {0} została dezaktywowana - nie można na niej podłożyć bomby!", "areareaper_used_info": "Twoja moc została już wykorzystana.", @@ -66,19 +66,19 @@ "darkness_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi", "darkness_enemy_info": "Niech zgasną światła.", "darkness_player_info": "Ciemność opanowała gracza '{0}'.", - "darkness_select_info": "Wybierz gracza, któremu chcesz nadać efekt ciemności:", + "darkness_select_info": "Nałóż efekt ciemności:", "deactivator": "Deaktywator", "deactivator_desc": "Wybierasz gracza, którego supermoc chcesz wyłączyć", "deactivator_enemy_info": "Twoja supermoc została wyłączona.", "deactivator_player_info": "Moc gracza '{0}' została wyłączona.", - "deactivator_select_info": "Wybierz gracza, którego supermoc chcesz wyłączyć:", + "deactivator_select_info": "Wyłącz moc gracza:", "deaf": "Głuchy", "deaf_desc": "Wybierasz gracza, dla którego chcesz wyłączyć wszystkie dźwięki", "deaf_enemy_info": "Słuchawki opuściły grę.", "deaf_player_info": "Dźwięk został wyłączony dla gracza '{0}'.", - "deaf_select_info": "Wybierz gracza, dla którego chcesz wyłączyć wszystkie dźwięki:", + "deaf_select_info": "Wycisz dźwięki gracza:", "disarmament": "Rozbrojenie", "disarmament_desc": "Masz losową szanse na wyrzucenie broni wroga po trafieniu", @@ -93,7 +93,7 @@ "duplicator": "Duplikator", "duplicator_desc": "Wybierasz gracza, od którego chcesz skopiować supermoc", "duplicator_player_info": "Moc gracza '{0}' została skopiowana.", - "duplicator_select_info": "Wybierz gracza, od którego chcesz skopiować supermoc:", + "duplicator_select_info": "Skopiuj moc gracza:", "dwarf": "Mini Majk", "dwarf_desc": "Losowa wielkość postaci na początku rundy", @@ -129,6 +129,11 @@ "frozendecoy": "Zamrażający Wabik", "frozendecoy_desc": "Twój decoy zamraża wszystkich graczy w pobliżu", + "gambler": "Hazardzista", + "gambler_desc": "Wybierz umiejętność z podanej listy.", + "gambler_select_info": "Wybierz umiejętność:", + "gambler_more": "Odśwież za $100", + "ghost": "Duszek", "ghost_desc": "Jesteś całkowicie niewidzialny", @@ -139,7 +144,7 @@ "glitch_desc": "Wyłączasz radar wybranemu przeciwnikowi", "glitch_enemy_info": "Twój radar został wyłączony.", "glitch_player_info": "Radar gracza '{0}' został wyłączony.", - "glitch_select_info": "Wybierz gracza, dla którego chcesz wyłączyć radar:", + "glitch_select_info": "Wyłącz radar dla gracza:", "glue": "Klej", "glue_desc": "Twoje granaty przyklejają się do ścian", @@ -171,13 +176,19 @@ "jammer_desc": "Wybierasz gracza, dla którego chcesz wyłączyć celownik", "jammer_enemy_info": "Twój celownik został wyłączony.", "jammer_player_info": "Celownik gracza '{0}' została wyłączona.", - "jammer_select_info": "Wybierz gracza, dla którego chcesz wyłączyć celownik:", + "jammer_select_info": "Wyłącz celownik dla gracza:", + + "jester": "Błazen", + "jester_desc": "W trybie błazna nie możesz zadawać ani otrzymywać obrażeń. Tryb zmienia się co kilka sekund.", + "jester_mode": "Tryb Błazna", + "jester_on": "WŁ.", + "jester_off": "WYŁ.", "jumpban": "Beznogi", "jumpban_desc": "Wybierasz gracza, który nie będzie mógł skakać", "jumpban_enemy_info": "Ktoś odciął ci nogi.", "jumpban_player_info": "Gracz '{0}' nie może teraz skakać.", - "jumpban_select_info": "Wybierz gracza, który nie będzie mógł skakać:", + "jumpban_select_info": "Zablokuj skok dla gracza:", "jumpingjack": "Pajacyk", "jumpingjack_desc": "Skakanie przywraca zdrowie", @@ -189,7 +200,7 @@ "lifeswap_desc": "Wybierasz gracza, z którym chcesz wymienić się zdrowiem", "lifeswap_enemy_info": "Ktoś pożyczył sobie twoje zdrowie.", "lifeswap_player_info": "Wymieniłeś się zdrowiem z graczem '{0}'.", - "lifeswap_select_info": "Wybierz gracza, z którym chcesz wymienić się zdrowiem:", + "lifeswap_select_info": "Zamień się zdrowiem z graczem:", "longknife": "Długi Nóż", "longknife_desc": "Podstawowy atak nożem zadaje obrażenia niezależnie od odległości", @@ -201,7 +212,7 @@ "magnifier_desc": "Przybiżasz ekran wybranemu przeciwnikowi", "magnifier_enemy_info": "Twoje pole widzenia zostało zniekształcone!", "magnifier_player_info": "Gracz '{0}' został zmuszony do przejścia w tryb powiększenia.", - "magnifier_select_info": "Wybierz gracza, którego ekran chcesz powiększyć:", + "magnifier_select_info": "Powiększ ekran gracza:", "medic": "Medyk", "medic_desc": "Kliknij [css_useSkill], aby użyć ładunku leczniczego, który przywraca 50 punktów zdrowia", @@ -210,7 +221,7 @@ "moneyswap_desc": "Wybierasz gracza, z którym chcesz zamienić się pieniędzmi", "moneyswap_enemy_info": "Urząd skarbowy cię dopadł.", "moneyswap_player_info": "Wymieniłeś swoje pieniądze z graczem '{0}'.", - "moneyswap_select_info": "Wybierz gracza, z którym chcesz zamienić się pieniędzmi:", + "moneyswap_select_info": "Zamień się kasą z graczem:", "muhammed": "Muhammed", "muhammed_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu", @@ -257,13 +268,13 @@ "poison_desc": "Wybierasz gracza, który co kilka sekund będzie otrzymywał obrażenia", "poison_enemy_info": "Zostałeś otruty.", "poison_player_info": "Gracz '{0}' został otruty.", - "poison_select_info": "Wybierz gracza, który co kilka sekund będzie otrzymywał obrażenia:", + "poison_select_info": "Zatruj gracza:", "primaryban": "Brak Karabinów", "primaryban_desc": "Wybierasz gracza, który nie może używać karabinów", "primaryban_enemy_info": "Nie możesz już używać karabinów.", "primaryban_player_info": "Gracz '{0}' nie może już używać karabinów.", - "primaryban_select_info": "Wybierz gracza, któremu chcesz zabronić używania karabinów:", + "primaryban_select_info": "Zablokuj karabiny dla gracza:", "prosthesis": "Proteza", "prosthesis_desc": "Ramiona i nogi są kuloodporne", @@ -353,7 +364,7 @@ "thief_desc": "Możesz ukraść supermoc wybranemu graczowi", "thief_enemy_info": "Twoja supermoc została skradziona.", "thief_player_info": "Moc gracza '{0}' została skradziona.", - "thief_select_info": "Wybierz gracza, którego supermoc chcesz ukraść:", + "thief_select_info": "Ukradnij moc gracza:", "thirdeye": "Trzecie Oko", "thirdeye_desc": "Kliknij [css_useSkill], aby aktywować trzecią osobę", @@ -394,7 +405,7 @@ "no_player": "Nie znaleziono pasującego gracza.", "duplicate_player": "Znaleziono więcej niż jednego gracza o tej samej nazwie.", "selectplayerskill_command": "Wpisz /t", - "selectplayerskill_incorrect_enemy_index": "Nie znaleziono gracza o takim index'ie.", + "selectplayerskill_incorrect_enemy_index": "Nie znaleziono graczy do wyboru.", "skill_not_found_setskill": "Nie znaleziono takiej CHATCOLORS.REDsupermocy", "player_not_found_setskill": "Nie znaleziono takiego CHATCOLORS.REDgracza", @@ -420,7 +431,12 @@ "vote_alredy_voted": "Już zagłosowałeś!", "vote_vote": "Głosowanie", + "bombsite_a": "Strefa detonacji A", + "bombsite_b": "Strefa detonacji B", + "teammate_skills": "Supermoce twoich sojuszników", "summary_start": "======PODSUMOWANIE=Z=OSTATNIEJ=RUNDY======", - "summary_end": "============================================" + "summary_end": "============================================", + + "menu_controlls": "W/S – Przewijanie | E - Wybierz
" } \ No newline at end of file diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pt-br.json b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pt-br.json index 4800a5f..cfe3369 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pt-br.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/pt-br.json @@ -18,7 +18,7 @@ "areareaper_desc": "Você pode escolher um local de bomba para desativar", "areareaper_incorrect_site": "Nenhum local de bomba encontrado.", "areareaper_no_site": "Nenhum local de bomba encontrado.", - "areareaper_select_info": "Escolha o local de bomba que deseja desativar:", + "areareaper_select_info": "Escolha área p/ desativar:", "areareaper_site_disabled": "Local de bomba {0} foi desativado - nenhuma bomba pode ser plantada lá!", "areareaper_used_info": "Seu poder já foi usado.", @@ -66,19 +66,19 @@ "darkness_desc": "Aplica um efeito de escuridão a um inimigo escolhido", "darkness_enemy_info": "Que as luzes se apaguem.", "darkness_player_info": "A escuridão tomou conta do jogador '{0}'.", - "darkness_select_info": "Escolha o jogador ao qual deseja aplicar o efeito de escuridão:", + "darkness_select_info": "Escolha jogador: escuridão:", "deactivator": "Desativador", "deactivator_desc": "Escolha um jogador cuja habilidade você deseja desativar", "deactivator_enemy_info": "Sua habilidade foi desativada.", "deactivator_player_info": "A habilidade do jogador '{0}' foi desativada.", - "deactivator_select_info": "Escolha o jogador cuja habilidade você deseja desativar:", + "deactivator_select_info": "Desativar skill do jogador:", "deaf": "Surdo", "deaf_desc": "Escolha um jogador para silenciar todos os sons", "deaf_enemy_info": "Seus fones de ouvido saíram do jogo.", "deaf_player_info": "O som foi desativado para o jogador '{0}'.", - "deaf_select_info": "Escolha o jogador para quem deseja silenciar todos os sons:", + "deaf_select_info": "Silenciar jogador:", "disarmament": "Desarmamento", "disarmament_desc": "Você tem uma chance aleatória de fazer um inimigo largar sua arma ao acertá-lo", @@ -93,7 +93,7 @@ "duplicator": "Duplicador", "duplicator_desc": "Escolha um jogador para copiar sua habilidade", "duplicator_player_info": "A habilidade do jogador '{0}' foi copiada.", - "duplicator_select_info": "Escolha o jogador cuja habilidade você deseja copiar:", + "duplicator_select_info": "Copiar skill do jogador:", "dwarf": "Anão", "dwarf_desc": "Tamanho de personagem aleatório no início da rodada", @@ -129,6 +129,11 @@ "frozendecoy": "Chamariz Congelante", "frozendecoy_desc": "Seu chamariz congela todos os jogadores próximos", + "gambler": "Apostador", + "gambler_desc": "Selecione uma habilidade da lista.", + "gambler_select_info": "Escolha sua habilidade:", + "gambler_more": "Atualizar por $100", + "ghost": "Fantasma", "ghost_desc": "Você é completamente invisível", @@ -139,7 +144,7 @@ "glitch_desc": "Desativa o radar de um inimigo escolhido", "glitch_enemy_info": "Seu radar foi desativado.", "glitch_player_info": "O radar do jogador '{0}' foi desativado.", - "glitch_select_info": "Escolha o jogador cujo radar você deseja desativar:", + "glitch_select_info": "Desativar radar do jogador:", "glue": "Cola", "glue_desc": "Suas granadas grudam nas paredes", @@ -171,13 +176,19 @@ "jammer_desc": "Escolha um jogador para desativar sua mira", "jammer_enemy_info": "Sua mira foi desativada.", "jammer_player_info": "A mira do jogador '{0}' foi desativada.", - "jammer_select_info": "Escolha o jogador cuja mira você deseja desativar:", + "jammer_select_info": "Desativar mira do jogador:", + + "jester": "Bobo", + "jester_desc": "No modo bobo você não pode causar nem receber dano. Esse modo muda a cada poucos segundos.", + "jester_mode": "Modo Bobo", + "jester_on": "LIG.", + "jester_off": "DESL.", "jumpban": "Sem Pernas", "jumpban_desc": "Escolha um jogador que não poderá pular", "jumpban_enemy_info": "Alguém cortou suas pernas.", "jumpban_player_info": "O jogador '{0}' não pode mais pular.", - "jumpban_select_info": "Escolha o jogador que não poderá pular:", + "jumpban_select_info": "Banir pulo do jogador:", "jumpingjack": "Pula-Pula", "jumpingjack_desc": "Pular restaura saúde", @@ -189,7 +200,7 @@ "lifeswap_desc": "Escolha um jogador para trocar saúde com ele", "lifeswap_enemy_info": "Alguém pegou sua saúde emprestada.", "lifeswap_player_info": "Você trocou saúde com o jogador '{0}'.", - "lifeswap_select_info": "Escolha o jogador com quem deseja trocar saúde:", + "lifeswap_select_info": "Trocar vida com jogador:", "longknife": "Faca Longa", "longknife_desc": "Um ataque com faca primária causa dano independentemente da distância", @@ -201,7 +212,7 @@ "magnifier_desc": "Força a tela do inimigo a ampliar, reduzindo seu campo de visão", "magnifier_enemy_info": "Seu campo de visão foi distorcido!", "magnifier_player_info": "O jogador ‘{0}’ foi forçado a entrar no modo de zoom.", - "magnifier_select_info": "Selecione o jogador cuja tela você deseja ampliar:", + "magnifier_select_info": "Ampliar tela do jogador:", "medic": "Médico", "medic_desc": "Clique em [css_useSkill] para usar uma carga de cura que restaura 50 de saúde", @@ -210,7 +221,7 @@ "moneyswap_desc": "Escolha um jogador para trocar dinheiro com ele", "moneyswap_enemy_info": "A receita federal te pegou.", "moneyswap_player_info": "Você trocou dinheiro com o jogador '{0}'.", - "moneyswap_select_info": "Escolha o jogador com quem deseja trocar dinheiro:", + "moneyswap_select_info": "Trocar dinheiro c/ jogador:", "muhammed": "Muhammed", "muhammed_desc": "Você explode ao morrer, matando jogadores próximos", @@ -257,13 +268,13 @@ "poison_desc": "Escolha um jogador que receberá dano a cada poucos segundos", "poison_enemy_info": "Você foi envenenado.", "poison_player_info": "O jogador '{0}' foi envenenado.", - "poison_select_info": "Escolha o jogador que receberá dano a cada poucos segundos:", + "poison_select_info": "Envenenar jogador:", "primaryban": "Sem Rifles", "primaryban_desc": "Escolha um jogador que não poderá usar rifles", "primaryban_enemy_info": "Você não pode mais usar rifles.", "primaryban_player_info": "O jogador '{0}' não pode mais usar rifles.", - "primaryban_select_info": "Escolha o jogador para proibir de usar rifles:", + "primaryban_select_info": "Banir rifles do jogador:", "prosthesis": "Prótese", "prosthesis_desc": "Braços e pernas são à prova de balas", @@ -353,7 +364,7 @@ "thief_desc": "Você pode roubar uma habilidade de um jogador escolhido", "thief_enemy_info": "Sua habilidade foi roubada.", "thief_player_info": "A habilidade do jogador '{0}' foi roubada.", - "thief_select_info": "Escolha o jogador cuja habilidade você deseja roubar:", + "thief_select_info": "Roubar skill do jogador:", "thirdeye": "Terceiro Olho", "thirdeye_desc": "Clique em [css_useSkill] para ativar a visão em terceira pessoa", @@ -394,7 +405,7 @@ "no_player": "Nenhum jogador correspondente encontrado.", "duplicate_player": "Mais de um jogador encontrado com o mesmo nome.", "selectplayerskill_command": "Digite /t", - "selectplayerskill_incorrect_enemy_index": "Nenhum jogador encontrado com esse índice.", + "selectplayerskill_incorrect_enemy_index": "Não foram encontrados jogadores para selecionar.", "skill_not_found_setskill": "Nenhuma habilidade CHATCOLORS.RED encontrada", "player_not_found_setskill": "Nenhum jogador CHATCOLORS.RED encontrado", @@ -420,7 +431,12 @@ "vote_alredy_voted": "Você já votou!", "vote_vote": "Votar", + "bombsite_a": "Zona de detonação A", + "bombsite_b": "Zona de detonação B", + "teammate_skills": "Habilidades dos seus companheiros de equipe", "summary_start": "=======RESUMO=DA=ÚLTIMA=RODADA=======", - "summary_end": "=======================================" + "summary_end": "=======================================", + + "menu_controlls": "W/S - Rolar | E - Selecionar
" } \ No newline at end of file diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/zh.json b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/zh.json index 84855f6..a4aed64 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/lang/zh.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/lang/zh.json @@ -129,6 +129,11 @@ "frozendecoy": "冰冻诱饵", "frozendecoy_desc": "你的诱饵弹会冻结附近的所有玩家", + "gambler": "赌徒", + "gambler_desc": "从提供的列表中选择一个技能。", + "gambler_select_info": "选择你的技能:", + "gambler_more": "刷新 $100", + "ghost": "幽灵", "ghost_desc": "你完全隐形", @@ -173,6 +178,12 @@ "jammer_player_info": "玩家 '{0}' 的准星已被禁用。", "jammer_select_info": "选择你想禁用其准星的玩家:", + "jester": "小丑", + "jester_desc": "在小丑模式下,你不能造成或受到任何伤害。此模式每隔几秒会变化。", + "jester_mode": "小丑模式", + "jester_on": "开", + "jester_off": "关", + "jumpban": "无腿", "jumpban_desc": "选择一个玩家使其无法跳跃", "jumpban_enemy_info": "有人切断了你的腿。", @@ -394,7 +405,7 @@ "no_player": "未找到匹配的玩家。", "duplicate_player": "找到多个同名玩家。", "selectplayerskill_command": "输入 /t", - "selectplayerskill_incorrect_enemy_index": "未找到该索引的玩家。", + "selectplayerskill_incorrect_enemy_index": "未找到可供选择的玩家。", "skill_not_found_setskill": "未找到 CHATCOLORS.RED 技能", "player_not_found_setskill": "未找到 CHATCOLORS.RED 玩家", @@ -420,7 +431,12 @@ "vote_alredy_voted": "您已投票!", "vote_vote": "投票", + "bombsite_a": "爆轰区A", + "bombsite_b": "爆轰区B", + "teammate_skills": "你队友的技能", "summary_start": "=============上一回合总结==============", - "summary_end": "=======================================" + "summary_end": "=======================================", + + "menu_controlls": "W/S - 滚动 | E - 选择
" } \ No newline at end of file diff --git a/readme-pl.md b/readme-pl.md index d7e008a..1c0fb7b 100644 --- a/readme-pl.md +++ b/readme-pl.md @@ -37,7 +37,7 @@ Dołącz do serwera testowego 3v3 i wypróbuj plugin jRandomSkills: Kupujesz serwer na pukawce? Skorzystaj z mojego [kodu polecającego](https://pukawka.pl/pp,juzlus.html). -## ✨ Aktualne Supermoce (104) +## ✨ Aktualne Supermoce (106)
Poniższa tabela przedstawia wszystkie dostępne supermoce w grze, wraz z ich opisami. @@ -77,6 +77,7 @@ Kupujesz serwer na pukawce? Skorzystaj z mojego [kodu polecającego](https://puk | Krucha Bomba | Strzelanie do bomby powoduje jej uszkodzenie | - | | Ogień Przyjacielski | Strzelanie do członków drużyny leczy ich | - | | Zamrażający Wabik | Twój decoy zamraża wszystkich graczy w pobliżu | - | +| Hazardzista | Wybierz umiejętność z podanej listy | - | | Duszek | Jesteś całkowicie niewidzialny | - | | Glaz | Nie widzisz granatów dymnych | - | | Glitch | Wyłączasz radar wybranemu przeciwnikowi | - | @@ -89,6 +90,7 @@ Kupujesz serwer na pukawce? Skorzystaj z mojego [kodu polecającego](https://puk | Nieskończone Ammo | Otrzymujesz nieskończoną ilość amunicji do wszystkich broni | - | | Stópkarz | Wybierasz gracza, który pozostawi za sobą ślad | - | | Zakłócacz | Wybierasz gracza, dla którego chcesz wyłączyć celownik | - | +| Błazen | W trybie błazna nie możesz zadawać ani otrzymywać obrażeń. Tryb zmienia się co kilka sekund | (10 - 25) s | | Beznogi | Wybierasz gracza, który nie będzie mógł skakać | - | | Pajacyk | Skakanie przywraca zdrowie | - | | Zabójczy Flash | Każdy całkowicie oślepiony twoim granatem umiera (również ty) | - | @@ -240,6 +242,8 @@ Wszystkie sypermoce można dostosować w pliku **`Config.cfg`** znajdującym si // "Alt2", "Speed", "Walk", "Zoom", "Weapon1", // "Weapon2", "Bullrush", "Grenade1", "Grenade2", // "Attack3", "Scoreboard", "Inspect" + "SkillTimeBeforeStart": 7.0, // Ile sekund przed końcem freeze time należy zakończyć + // losowanie umiejętności? (freezetime - SkillTimeBeforeStart) ... }, "SkillsInfo": [ @@ -260,12 +264,34 @@ Wszystkie sypermoce można dostosować w pliku **`Config.cfg`** znajdującym si ## 🔗 Uwzględniona Zależność Plugin korzysta z zawartości następujących projektów: +- [dRandomSkills](https://github.com/jakubbartosik/dRandomSkills) by [Jakub Bartosik (D3X)](https://github.com/jakubbartosik) - system losowych umiejętności - [CS2TraceRay](https://github.com/schwarper/CS2TraceRay) autorstwa [schwarper](https://github.com/schwarper) - system śledzenia promieni (Trace Ray) - [CS2FlashingHtmlHudFix](https://github.com/girlglock/CS2FlashingHtmlHudFix) autorstwa [girlglock](https://github.com/girlglock) - poprawka migotania okienka z supermocą - [ChaseMod](https://github.com/ipsvn/ChaseMod/blob/master/Utils/Memory/CCSMatch.cs) autorstwa [ipsvn](https://github.com/ipsvn) - ustawianie wyniku rund +- [WASDMenuAPI](https://github.com/Interesting-exe/WASDMenuAPI) by [Interesting-exe](https://github.com/Interesting-exe) - API do łatwego tworzenia menu za pomocą klawiszy WASD ## 📋 Lista Zmian +
+v1.1.4 + +- #### Ogólne: + - ###### Do pliku konfiguracyjnego dodano opcję `SkillTimeBeforeStart`, która określa, na ile sekund przed końcem freezetime powinno się zakończyć losowanie umiejętności. + - ###### Umiejętności nie są już wyłączane pod koniec rundy. + - ###### Zmieniono logikę przyznawania umiejętności. + - ###### Zbyt długie pseudonimy są skracane podczas oglądania graczy. + - ###### Wybór gracza został zmieniony z Chat Menu na WSAD Menu. + - ###### Opisy umiejętności z wyborem gracza zostały skrócone. +- #### Poprawki mocy: + - ##### Beznogi + - ###### Umiejętność Beznogi całkowicie wyłącza umiejętność Królik. +- #### Nowe moce: + - ##### Błazen: + - ###### W trybie błazna nie możesz zadawać ani otrzymywać obrażeń. Tryb zmienia się co kilka sekund. + - ##### Hazardzista: + - ###### Wybierz umiejętność z podanej listy. +
+
v1.1.3 diff --git a/readme.md b/readme.md index ebcefe6..8e6791f 100644 --- a/readme.md +++ b/readme.md @@ -38,7 +38,7 @@ Join the 3v3 test server and try out the jRandomSkills plugin: Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus.html). -## ✨ Current Skills (104) +## ✨ Current Skills (106)
The table below lists all available skills in the game, along with their descriptions. @@ -78,6 +78,7 @@ Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus. | Fragile Bomb | Shooting the bomb damages it | - | | Friendly Fire | Shooting teammates heals them | - | | Freezing Decoy | Your decoy freezes all nearby players | - | +| Gambler | Select a skill from the list provided | - | | Ghost | You are completely invisible | - | | Glaz | You can see through smoke grenades | - | | Glitch | Disables the radar for a chosen enemy | - | @@ -90,6 +91,7 @@ Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus. | Infinite Ammo | You receive infinite ammo for all your weapons | - | | Tracker | Choose a player who will leave a trail behind them | - | | Jammer | Choose a player to disable their crosshair | - | +| Jester | In jester mode, you cannot get or take any damage. This mode changes every few seconds | (10 - 25) s | | Legless | Choose a player who cannot jump | - | | Jumping Jack | Jumping restores health | - | | Killer Flash | Anyone fully blinded by your flashbang dies (including you) | - | @@ -240,6 +242,8 @@ All skills can be customized in the **`Config.cfg`** file located in the **`game // "Alt2", "Speed", "Walk", "Zoom", "Weapon1", // "Weapon2", "Bullrush", "Grenade1", "Grenade2", // "Attack3", "Scoreboard", "Inspect" + "SkillTimeBeforeStart": 7.0, // How many seconds before freeze time ends should skills + // drawing be completed? (freezetime - SkillTimeBeforeStart) ... }, "SkillsInfo": [ @@ -260,12 +264,34 @@ All skills can be customized in the **`Config.cfg`** file located in the **`game ## 🔗 Dependency Includes This plugin uses content from the following projects: +- [dRandomSkills](https://github.com/jakubbartosik/dRandomSkills) by [Jakub Bartosik (D3X)](https://github.com/jakubbartosik) - random skills system - [CS2TraceRay](https://github.com/schwarper/CS2TraceRay) by [schwarper](https://github.com/schwarper) - Trace Ray system - [CS2FlashingHtmlHudFix](https://github.com/girlglock/CS2FlashingHtmlHudFix) by [girlglock](https://github.com/girlglock) - a fix for window flickering - [ChaseMod](https://github.com/ipsvn/ChaseMod/blob/master/Utils/Memory/CCSMatch.cs) by [ipsvn](https://github.com/ipsvn) - round score management +- [WASDMenuAPI](https://github.com/Interesting-exe/WASDMenuAPI) by [Interesting-exe](https://github.com/Interesting-exe) - API to easily create WASD menus ## 📋 Changelog +
+v1.1.4 + +- #### General: + - ###### The `SkillTimeBeforeStart` option has been added to the config file, which specifies how many seconds before the end of freeze time the skills drawing should stop. + - ###### Skills are no longer disabled at the end of the round. + - ###### The logic for granting skills has been changed. + - ###### Nicknames that are too long are shortened when spectating players. + - ###### The player selection has been changed via the Chat Menu to the WSAD Menu. + - ###### Skill descriptions with player selection have been shortened. +- #### Skill improvements: + - ##### Legless + - ###### Legless's skill completely disables Bunny's skill. +- #### New skills: + - ##### Jester: + - ###### In jester mode, you cannot get or take any damage. This mode changes every few seconds. + - ##### Gambler: + - ###### Select a skill from the list provided. +
+
v1.1.3