This commit is contained in:
Juzlus 2025-09-12 02:24:04 +02:00
parent a7009be3e0
commit 898f86f888
137 changed files with 3553 additions and 3780 deletions

View file

@ -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<string, Action<CCSPlayerController, IWasdMenuOption>> list)
{
if (player == null)
return;
WASDMenuAPI.Players[player.SteamID].UpdateActiveMenu(list);
}
}

View file

@ -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<IWasdMenuOption>? Options { get; set; } = new();
public LinkedListNode<IWasdMenuOption>? Prev { get; set; } = null;
public LinkedListNode<IWasdMenuOption> Add(string display, Action<CCSPlayerController, IWasdMenuOption> onChoice)
{
if (Options == null)
Options = new();
WasdMenuOption newOption = new WasdMenuOption
{
OptionDisplay = display,
OnChoose = onChoice,
Index = Options.Count,
Parent = this
};
return Options.AddLast(newOption);
}
}

View file

@ -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<CCSPlayerController, IWasdMenuOption>? OnChoose { get; set; }
public int Index { get; set; }
}

View file

@ -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<IWasdMenuOption>? CurrentChoice = null;
public LinkedListNode<IWasdMenuOption>? 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<IWasdMenuOption>? 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<IWasdMenuOption>? option = MenuStart;
if (option?.Value?.Parent?.Title != "")
builder.AppendLine($"{option.Value.Parent?.Title}</u><font class='fontSize-m' color='white'><br>");
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(
$"<img src='https://raw.githubusercontent.com/oqyh/cs2-Kill-Sound-GoldKingZ/main/Resources/arrow.gif' class=''> <img src='https://raw.githubusercontent.com/oqyh/cs2-Kill-Sound-GoldKingZ/main/Resources/arrow.gif' class=''> <img src='https://raw.githubusercontent.com/oqyh/cs2-Kill-Sound-GoldKingZ/main/Resources/arrow.gif' class=''> <br>");
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($"</font><font color='purple'>[ </font><font color='orange'>{text}</font><font color='purple'> ]</font><font color='white'> <br>");
}
else
builder.AppendLine($"{text.Substring(0, maxLength)} <br>");
option = option.Next;
shown++;
}
if (!string.IsNullOrEmpty(endControl))
builder.AppendLine(endControl);
builder.AppendLine("</div>");
CenterHtml = builder.ToString();
}
public void UpdateActiveMenu(Dictionary<string, Action<CCSPlayerController, IWasdMenuOption>> 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();
}
}

View file

@ -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<IWasdMenuOption>? Options { get; set; }
// previous option node
public LinkedListNode<IWasdMenuOption>? Prev { get; set; }
public LinkedListNode<IWasdMenuOption> Add(string display, Action<CCSPlayerController, IWasdMenuOption> onChoice);
}

View file

@ -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<string, Action<CCSPlayerController, IWasdMenuOption>> list);
}

View file

@ -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<CCSPlayerController, IWasdMenuOption>? OnChoose { get; set; }
public int Index { get; set; }
}

View file

@ -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<ulong, WasdMenuPlayer> Players = [];
public static void LoadPlugin(BasePlugin basePlugin, bool hotReload)
{
var wasdMenuManager = new WasdManager();
basePlugin.RegisterEventHandler<EventPlayerActivate>((@event, info) =>
{
if (@event.Userid != null)
Players[@event.Userid.SteamID] = new WasdMenuPlayer
{
player = @event.Userid,
Buttons = 0
};
return HookResult.Continue;
});
basePlugin.RegisterEventHandler<EventPlayerDisconnect>((@event, info) =>
{
if (@event.Userid != null) Players.Remove(@event.Userid.SteamID);
return HookResult.Continue;
});
basePlugin.RegisterListener<Listeners.OnTick>(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)
);
}
}
}

View file

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.246" />
</ItemGroup>
</Project>

View file

@ -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

View file

@ -8,6 +8,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<None Remove="src\command\Command.cs~RF4f34d1e7.TMP" />
<None Remove="src\player\skills\RespWroga.cs~RF528d210.TMP" /> <None Remove="src\player\skills\RespWroga.cs~RF528d210.TMP" />
</ItemGroup> </ItemGroup>
@ -17,6 +18,12 @@
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Reference Include="WASDMenuAPI">
<HintPath>F:\CS2 Server\server\game\csgo\addons\counterstrikesharp\plugins\jRandomSkills\WASDMenuAPI.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Update="Properties\Resources.Designer.cs"> <Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime> <DesignTime>True</DesignTime>

View file

@ -48,7 +48,7 @@ namespace jRandomSkills
{ {
if (player == null) return; if (player == null) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return; if (playerInfo == null || playerInfo.IsDrawing) return;
var playerPawn = player.PlayerPawn.Value; var playerPawn = player.PlayerPawn.Value;
if (playerPawn?.CBodyComponent == null) return; if (playerPawn?.CBodyComponent == null) return;
@ -69,7 +69,7 @@ namespace jRandomSkills
if (player == null || !AdminManager.PlayerHasPermissions(player, config.SetSkillCommands.Permissions)) return; if (player == null || !AdminManager.PlayerHasPermissions(player, config.SetSkillCommands.Permissions)) return;
var targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => !p.IsBot var targetPlayer = Utilities.GetPlayers().FirstOrDefault(p => !p.IsBot
&& (p.SteamID.ToString().Equals(command.GetArg(1), StringComparison.CurrentCultureIgnoreCase) && (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) if (command.ArgCount < 2)
{ {
@ -106,6 +106,9 @@ namespace jRandomSkills
skillPlayer.SpecialSkill = src.player.Skills.None; skillPlayer.SpecialSkill = src.player.Skills.None;
Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [targetPlayer]); 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}―――――――――――"); 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); 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}―――――――――――"); player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
@ -175,17 +178,21 @@ namespace jRandomSkills
private static void StartGame(CommandInfo command) private static void StartGame(CommandInfo command)
{ {
int cheats = command.GetArg(1) == "sv" ? 1 : 0; int cheats = command.GetArg(1) == "sv" ? 1 : 0;
Server.ExecuteCommand($"mp_freezetime {(cheats == 1 ? 0 : 5)}"); Server.ExecuteCommand($"mp_freezetime {(cheats == 1 ? 0 : 15)}");
Server.ExecuteCommand("mp_warmup_end"); Server.ExecuteCommand("mp_overtime_enable 1");
Server.ExecuteCommand("mp_restartgame 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.PrintToChatAll($" {ChatColors.Green}{Localization.GetTranslation("game_start")}");
Server.ExecuteCommand("mp_forcecamera 0"); }
Server.ExecuteCommand($"mp_freezetime {(cheats == 1 ? 0 : 5)}"); else
Server.ExecuteCommand("mp_overtime_enable 1"); {
Server.ExecuteCommand($"sv_cheats {cheats}"); 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)] [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
@ -251,7 +258,7 @@ namespace jRandomSkills
private static void Pause() private static void Pause()
{ {
Server.PrintToChatAll($" {(gamePaused ? ChatColors.Green : ChatColors.Red)}{Localization.GetTranslation(gamePaused ? "unpause" : "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; gamePaused = !gamePaused;
} }
@ -299,7 +306,7 @@ namespace jRandomSkills
Server.ExecuteCommand(param); 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) private static void Command_SetStaticSkill(CCSPlayerController? player, CommandInfo command)
{ {
Debug.WriteToDebug($"Player {player?.PlayerPawn} used the css_setstaticskill {command.ArgString} 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); Event.staticSkills.Add(targetPlayer.SteamID, skill);
Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", [targetPlayer]); 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}―――――――――――"); 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); 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}―――――――――――"); player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");

View file

@ -5,6 +5,7 @@ using CounterStrikeSharp.API.Modules.Commands;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using System.Reflection; using System.Reflection;
using WASDSharedAPI;
namespace jRandomSkills namespace jRandomSkills
{ {
@ -19,6 +20,7 @@ namespace jRandomSkills
public List<jSkill_PlayerInfo> SkillPlayer { get; } = []; public List<jSkill_PlayerInfo> SkillPlayer { get; } = [];
public Random Random { get; } = new Random(); public Random Random { get; } = new Random();
public CCSGameRules? GameRules { get; set; } public CCSGameRules? GameRules { get; set; }
public IWasdMenuManager? MenuManager;
public override string ModuleName => "[CS2] [ jRandomSkills ]"; public override string ModuleName => "[CS2] [ jRandomSkills ]";
public override string ModuleAuthor => "D3X, Juzlus"; public override string ModuleAuthor => "D3X, Juzlus";
@ -32,9 +34,10 @@ namespace jRandomSkills
Config.Initialize(); Config.Initialize();
Localization.Load(); Localization.Load();
Debug.Load(); Debug.Load();
Event.Load();
PlayerOnTick.Load(); PlayerOnTick.Load();
Event.Load();
Command.Load(); Command.Load();
WASDMenuAPI.WASDMenuAPI.LoadPlugin(Instance, hotReload);
LoadAllSkills(); LoadAllSkills();
} }

View file

@ -18,7 +18,7 @@
"areareaper_desc": "You can choose a bomb site to deactivate", "areareaper_desc": "You can choose a bomb site to deactivate",
"areareaper_incorrect_site": "No such bomb site found.", "areareaper_incorrect_site": "No such bomb site found.",
"areareaper_no_site": "No bomb sites 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_site_disabled": "Bomb site {0} has been deactivated - no bombs can be planted there!",
"areareaper_used_info": "Your skill has already been used.", "areareaper_used_info": "Your skill has already been used.",
@ -66,19 +66,19 @@
"darkness_desc": "Applies a darkness effect to a chosen enemy", "darkness_desc": "Applies a darkness effect to a chosen enemy",
"darkness_enemy_info": "Let the lights go out.", "darkness_enemy_info": "Let the lights go out.",
"darkness_player_info": "Darkness has overtaken player '{0}'.", "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": "Deactivator",
"deactivator_desc": "Choose a player whose skill you want to disable", "deactivator_desc": "Choose a player whose skill you want to disable",
"deactivator_enemy_info": "Your skill has been disabled.", "deactivator_enemy_info": "Your skill has been disabled.",
"deactivator_player_info": "Player '{0}'s 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": "Deaf",
"deaf_desc": "Choose a player to mute all sounds for", "deaf_desc": "Choose a player to mute all sounds for",
"deaf_enemy_info": "Your headphones have left the game.", "deaf_enemy_info": "Your headphones have left the game.",
"deaf_player_info": "Sound has been disabled for player '{0}'.", "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": "Disarmament",
"disarmament_desc": "You have a random chance to make an enemy drop their weapon on hit", "disarmament_desc": "You have a random chance to make an enemy drop their weapon on hit",
@ -93,7 +93,7 @@
"duplicator": "Duplicator", "duplicator": "Duplicator",
"duplicator_desc": "Choose a player to copy their skill", "duplicator_desc": "Choose a player to copy their skill",
"duplicator_player_info": "Player '{0}'s skill has been copied.", "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": "Dwarf",
"dwarf_desc": "Random character size at the start of the round", "dwarf_desc": "Random character size at the start of the round",
@ -129,6 +129,11 @@
"frozendecoy": "Freezing Decoy", "frozendecoy": "Freezing Decoy",
"frozendecoy_desc": "Your decoy freezes all nearby players", "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": "<font class='fontSize-m' color='#00FF00'>Refresh for $100</font>",
"ghost": "Ghost", "ghost": "Ghost",
"ghost_desc": "You are completely invisible", "ghost_desc": "You are completely invisible",
@ -139,7 +144,7 @@
"glitch_desc": "Disables the radar for a chosen enemy", "glitch_desc": "Disables the radar for a chosen enemy",
"glitch_enemy_info": "Your radar has been disabled.", "glitch_enemy_info": "Your radar has been disabled.",
"glitch_player_info": "Player '{0}'s 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": "Glue",
"glue_desc": "Your grenades stick to walls", "glue_desc": "Your grenades stick to walls",
@ -171,13 +176,19 @@
"jammer_desc": "Choose a player to disable their crosshair", "jammer_desc": "Choose a player to disable their crosshair",
"jammer_enemy_info": "Your crosshair has been disabled.", "jammer_enemy_info": "Your crosshair has been disabled.",
"jammer_player_info": "Player '{0}'s 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": "Legless",
"jumpban_desc": "Choose a player who cannot jump", "jumpban_desc": "Choose a player who cannot jump",
"jumpban_enemy_info": "Someone cut off your legs.", "jumpban_enemy_info": "Someone cut off your legs.",
"jumpban_player_info": "Player '{0}' can no longer jump.", "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": "Jumping Jack",
"jumpingjack_desc": "Jumping restores health", "jumpingjack_desc": "Jumping restores health",
@ -189,7 +200,7 @@
"lifeswap_desc": "Choose a player to swap health with", "lifeswap_desc": "Choose a player to swap health with",
"lifeswap_enemy_info": "Someone borrowed your health.", "lifeswap_enemy_info": "Someone borrowed your health.",
"lifeswap_player_info": "You swapped health with player '{0}'.", "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": "Long Knife",
"longknife_desc": "A primary knife attack deals damage regardless of distance", "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_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_enemy_info": "Your field of view has been distorted!",
"magnifier_player_info": "Player '{0}' has been forced into zoom mode.", "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": "Medic",
"medic_desc": "Click [css_useSkill] to use a healing charge that restores 50 health", "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_desc": "Choose a player to swap money with",
"moneyswap_enemy_info": "The tax office got you.", "moneyswap_enemy_info": "The tax office got you.",
"moneyswap_player_info": "You swapped money with player '{0}'.", "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": "Muhammed",
"muhammed_desc": "You explode upon death, killing nearby players", "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_desc": "Choose a player who will take damage every few seconds",
"poison_enemy_info": "You have been poisoned.", "poison_enemy_info": "You have been poisoned.",
"poison_player_info": "Player '{0}' has 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": "No Rifles",
"primaryban_desc": "Choose a player who cannot use rifles", "primaryban_desc": "Choose a player who cannot use rifles",
"primaryban_enemy_info": "You can no longer use rifles.", "primaryban_enemy_info": "You can no longer use rifles.",
"primaryban_player_info": "Player '{0}' 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": "Prosthesis",
"prosthesis_desc": "Arms and legs are bulletproof", "prosthesis_desc": "Arms and legs are bulletproof",
@ -353,7 +364,7 @@
"thief_desc": "You can steal a skill from a chosen player", "thief_desc": "You can steal a skill from a chosen player",
"thief_enemy_info": "Your skill has been stolen.", "thief_enemy_info": "Your skill has been stolen.",
"thief_player_info": "Player '{0}'s 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": "Third Eye",
"thirdeye_desc": "Click [css_useSkill] to activate third-person view", "thirdeye_desc": "Click [css_useSkill] to activate third-person view",
@ -394,7 +405,7 @@
"no_player": "No matching player found.", "no_player": "No matching player found.",
"duplicate_player": "More than one player found with the same name.", "duplicate_player": "More than one player found with the same name.",
"selectplayerskill_command": "Type /t", "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", "skill_not_found_setskill": "No such CHATCOLORS.REDskill found",
"player_not_found_setskill": "No such CHATCOLORS.REDplayer found", "player_not_found_setskill": "No such CHATCOLORS.REDplayer found",
@ -420,7 +431,12 @@
"vote_alredy_voted": "You have already voted!", "vote_alredy_voted": "You have already voted!",
"vote_vote": "Vote", "vote_vote": "Vote",
"bombsite_a": "Bombsite A",
"bombsite_b": "Bombsite B",
"teammate_skills": "Your teammates' skills", "teammate_skills": "Your teammates' skills",
"summary_start": "======SUMMARY=OF=THE=LAST=ROUND======", "summary_start": "======SUMMARY=OF=THE=LAST=ROUND======",
"summary_end": "=======================================" "summary_end": "=======================================",
"menu_controlls": "<font class='fontSize-m' color='cyan'>W/S - Scroll</font> <font class='fontSize-m' color='white'> | </font> <font class='fontSize-m' color='green'>E - Select</font> <br>"
} }

View file

@ -18,7 +18,7 @@
"areareaper_desc": "Możesz wybrać strefę detonacji, którą chcesz dezaktywować", "areareaper_desc": "Możesz wybrać strefę detonacji, którą chcesz dezaktywować",
"areareaper_incorrect_site": "Nie znaleziono takiej strefy detonacji.", "areareaper_incorrect_site": "Nie znaleziono takiej strefy detonacji.",
"areareaper_no_site": "Nie znaleziono żadnej 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_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.", "areareaper_used_info": "Twoja moc została już wykorzystana.",
@ -66,19 +66,19 @@
"darkness_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi", "darkness_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi",
"darkness_enemy_info": "Niech zgasną światła.", "darkness_enemy_info": "Niech zgasną światła.",
"darkness_player_info": "Ciemność opanowała gracza '{0}'.", "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": "Deaktywator",
"deactivator_desc": "Wybierasz gracza, którego supermoc chcesz wyłączyć", "deactivator_desc": "Wybierasz gracza, którego supermoc chcesz wyłączyć",
"deactivator_enemy_info": "Twoja supermoc została wyłączona.", "deactivator_enemy_info": "Twoja supermoc została wyłączona.",
"deactivator_player_info": "Moc gracza '{0}' 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": "Głuchy",
"deaf_desc": "Wybierasz gracza, dla którego chcesz wyłączyć wszystkie dźwięki", "deaf_desc": "Wybierasz gracza, dla którego chcesz wyłączyć wszystkie dźwięki",
"deaf_enemy_info": "Słuchawki opuściły grę.", "deaf_enemy_info": "Słuchawki opuściły grę.",
"deaf_player_info": "Dźwięk został wyłączony dla gracza '{0}'.", "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": "Rozbrojenie",
"disarmament_desc": "Masz losową szanse na wyrzucenie broni wroga po trafieniu", "disarmament_desc": "Masz losową szanse na wyrzucenie broni wroga po trafieniu",
@ -93,7 +93,7 @@
"duplicator": "Duplikator", "duplicator": "Duplikator",
"duplicator_desc": "Wybierasz gracza, od którego chcesz skopiować supermoc", "duplicator_desc": "Wybierasz gracza, od którego chcesz skopiować supermoc",
"duplicator_player_info": "Moc gracza '{0}' została skopiowana.", "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": "Mini Majk",
"dwarf_desc": "Losowa wielkość postaci na początku rundy", "dwarf_desc": "Losowa wielkość postaci na początku rundy",
@ -129,6 +129,11 @@
"frozendecoy": "Zamrażający Wabik", "frozendecoy": "Zamrażający Wabik",
"frozendecoy_desc": "Twój decoy zamraża wszystkich graczy w pobliżu", "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": "<font class='fontSize-m' color='#00FF00'>Odśwież za $100</font>",
"ghost": "Duszek", "ghost": "Duszek",
"ghost_desc": "Jesteś całkowicie niewidzialny", "ghost_desc": "Jesteś całkowicie niewidzialny",
@ -139,7 +144,7 @@
"glitch_desc": "Wyłączasz radar wybranemu przeciwnikowi", "glitch_desc": "Wyłączasz radar wybranemu przeciwnikowi",
"glitch_enemy_info": "Twój radar został wyłączony.", "glitch_enemy_info": "Twój radar został wyłączony.",
"glitch_player_info": "Radar gracza '{0}' 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": "Klej",
"glue_desc": "Twoje granaty przyklejają się do ścian", "glue_desc": "Twoje granaty przyklejają się do ścian",
@ -171,13 +176,19 @@
"jammer_desc": "Wybierasz gracza, dla którego chcesz wyłączyć celownik", "jammer_desc": "Wybierasz gracza, dla którego chcesz wyłączyć celownik",
"jammer_enemy_info": "Twój celownik został wyłączony.", "jammer_enemy_info": "Twój celownik został wyłączony.",
"jammer_player_info": "Celownik gracza '{0}' została wyłączona.", "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": "Beznogi",
"jumpban_desc": "Wybierasz gracza, który nie będzie mógł skakać", "jumpban_desc": "Wybierasz gracza, który nie będzie mógł skakać",
"jumpban_enemy_info": "Ktoś odciął ci nogi.", "jumpban_enemy_info": "Ktoś odciął ci nogi.",
"jumpban_player_info": "Gracz '{0}' nie może teraz skakać.", "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": "Pajacyk",
"jumpingjack_desc": "Skakanie przywraca zdrowie", "jumpingjack_desc": "Skakanie przywraca zdrowie",
@ -189,7 +200,7 @@
"lifeswap_desc": "Wybierasz gracza, z którym chcesz wymienić się zdrowiem", "lifeswap_desc": "Wybierasz gracza, z którym chcesz wymienić się zdrowiem",
"lifeswap_enemy_info": "Ktoś pożyczył sobie twoje zdrowie.", "lifeswap_enemy_info": "Ktoś pożyczył sobie twoje zdrowie.",
"lifeswap_player_info": "Wymieniłeś się zdrowiem z graczem '{0}'.", "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": "Długi Nóż",
"longknife_desc": "Podstawowy atak nożem zadaje obrażenia niezależnie od odległości", "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_desc": "Przybiżasz ekran wybranemu przeciwnikowi",
"magnifier_enemy_info": "Twoje pole widzenia zostało zniekształcone!", "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_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": "Medyk",
"medic_desc": "Kliknij [css_useSkill], aby użyć ładunku leczniczego, który przywraca 50 punktów zdrowia", "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_desc": "Wybierasz gracza, z którym chcesz zamienić się pieniędzmi",
"moneyswap_enemy_info": "Urząd skarbowy cię dopadł.", "moneyswap_enemy_info": "Urząd skarbowy cię dopadł.",
"moneyswap_player_info": "Wymieniłeś swoje pieniądze z graczem '{0}'.", "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": "Muhammed",
"muhammed_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu", "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_desc": "Wybierasz gracza, który co kilka sekund będzie otrzymywał obrażenia",
"poison_enemy_info": "Zostałeś otruty.", "poison_enemy_info": "Zostałeś otruty.",
"poison_player_info": "Gracz '{0}' został 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": "Brak Karabinów",
"primaryban_desc": "Wybierasz gracza, który nie może używać 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_enemy_info": "Nie możesz już używać karabinów.",
"primaryban_player_info": "Gracz '{0}' nie może 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": "Proteza",
"prosthesis_desc": "Ramiona i nogi są kuloodporne", "prosthesis_desc": "Ramiona i nogi są kuloodporne",
@ -353,7 +364,7 @@
"thief_desc": "Możesz ukraść supermoc wybranemu graczowi", "thief_desc": "Możesz ukraść supermoc wybranemu graczowi",
"thief_enemy_info": "Twoja supermoc została skradziona.", "thief_enemy_info": "Twoja supermoc została skradziona.",
"thief_player_info": "Moc gracza '{0}' 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": "Trzecie Oko",
"thirdeye_desc": "Kliknij [css_useSkill], aby aktywować trzecią osobę", "thirdeye_desc": "Kliknij [css_useSkill], aby aktywować trzecią osobę",
@ -394,7 +405,7 @@
"no_player": "Nie znaleziono pasującego gracza.", "no_player": "Nie znaleziono pasującego gracza.",
"duplicate_player": "Znaleziono więcej niż jednego gracza o tej samej nazwie.", "duplicate_player": "Znaleziono więcej niż jednego gracza o tej samej nazwie.",
"selectplayerskill_command": "Wpisz /t", "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", "skill_not_found_setskill": "Nie znaleziono takiej CHATCOLORS.REDsupermocy",
"player_not_found_setskill": "Nie znaleziono takiego CHATCOLORS.REDgracza", "player_not_found_setskill": "Nie znaleziono takiego CHATCOLORS.REDgracza",
@ -420,7 +431,12 @@
"vote_alredy_voted": "Już zagłosowałeś!", "vote_alredy_voted": "Już zagłosowałeś!",
"vote_vote": "Głosowanie", "vote_vote": "Głosowanie",
"bombsite_a": "Strefa detonacji A",
"bombsite_b": "Strefa detonacji B",
"teammate_skills": "Supermoce twoich sojuszników", "teammate_skills": "Supermoce twoich sojuszników",
"summary_start": "======PODSUMOWANIE=Z=OSTATNIEJ=RUNDY======", "summary_start": "======PODSUMOWANIE=Z=OSTATNIEJ=RUNDY======",
"summary_end": "============================================" "summary_end": "============================================",
"menu_controlls": "<font class='fontSize-m' color='cyan'>W/S – Przewijanie</font> <font class='fontSize-m' color='white'> | </font> <font class='fontSize-m' color='green'>E - Wybierz</font> <br>"
} }

View file

@ -18,7 +18,7 @@
"areareaper_desc": "Você pode escolher um local de bomba para desativar", "areareaper_desc": "Você pode escolher um local de bomba para desativar",
"areareaper_incorrect_site": "Nenhum local de bomba encontrado.", "areareaper_incorrect_site": "Nenhum local de bomba encontrado.",
"areareaper_no_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_site_disabled": "Local de bomba {0} foi desativado - nenhuma bomba pode ser plantada lá!",
"areareaper_used_info": "Seu poder já foi usado.", "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_desc": "Aplica um efeito de escuridão a um inimigo escolhido",
"darkness_enemy_info": "Que as luzes se apaguem.", "darkness_enemy_info": "Que as luzes se apaguem.",
"darkness_player_info": "A escuridão tomou conta do jogador '{0}'.", "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": "Desativador",
"deactivator_desc": "Escolha um jogador cuja habilidade você deseja desativar", "deactivator_desc": "Escolha um jogador cuja habilidade você deseja desativar",
"deactivator_enemy_info": "Sua habilidade foi desativada.", "deactivator_enemy_info": "Sua habilidade foi desativada.",
"deactivator_player_info": "A habilidade do jogador '{0}' 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": "Surdo",
"deaf_desc": "Escolha um jogador para silenciar todos os sons", "deaf_desc": "Escolha um jogador para silenciar todos os sons",
"deaf_enemy_info": "Seus fones de ouvido saíram do jogo.", "deaf_enemy_info": "Seus fones de ouvido saíram do jogo.",
"deaf_player_info": "O som foi desativado para o jogador '{0}'.", "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": "Desarmamento",
"disarmament_desc": "Você tem uma chance aleatória de fazer um inimigo largar sua arma ao acertá-lo", "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": "Duplicador",
"duplicator_desc": "Escolha um jogador para copiar sua habilidade", "duplicator_desc": "Escolha um jogador para copiar sua habilidade",
"duplicator_player_info": "A habilidade do jogador '{0}' foi copiada.", "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": "Anão",
"dwarf_desc": "Tamanho de personagem aleatório no início da rodada", "dwarf_desc": "Tamanho de personagem aleatório no início da rodada",
@ -129,6 +129,11 @@
"frozendecoy": "Chamariz Congelante", "frozendecoy": "Chamariz Congelante",
"frozendecoy_desc": "Seu chamariz congela todos os jogadores próximos", "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": "<font class='fontSize-m' color='#00FF00'>Atualizar por $100</font>",
"ghost": "Fantasma", "ghost": "Fantasma",
"ghost_desc": "Você é completamente invisível", "ghost_desc": "Você é completamente invisível",
@ -139,7 +144,7 @@
"glitch_desc": "Desativa o radar de um inimigo escolhido", "glitch_desc": "Desativa o radar de um inimigo escolhido",
"glitch_enemy_info": "Seu radar foi desativado.", "glitch_enemy_info": "Seu radar foi desativado.",
"glitch_player_info": "O radar do jogador '{0}' 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": "Cola",
"glue_desc": "Suas granadas grudam nas paredes", "glue_desc": "Suas granadas grudam nas paredes",
@ -171,13 +176,19 @@
"jammer_desc": "Escolha um jogador para desativar sua mira", "jammer_desc": "Escolha um jogador para desativar sua mira",
"jammer_enemy_info": "Sua mira foi desativada.", "jammer_enemy_info": "Sua mira foi desativada.",
"jammer_player_info": "A mira do jogador '{0}' 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": "Sem Pernas",
"jumpban_desc": "Escolha um jogador que não poderá pular", "jumpban_desc": "Escolha um jogador que não poderá pular",
"jumpban_enemy_info": "Alguém cortou suas pernas.", "jumpban_enemy_info": "Alguém cortou suas pernas.",
"jumpban_player_info": "O jogador '{0}' não pode mais pular.", "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": "Pula-Pula",
"jumpingjack_desc": "Pular restaura saúde", "jumpingjack_desc": "Pular restaura saúde",
@ -189,7 +200,7 @@
"lifeswap_desc": "Escolha um jogador para trocar saúde com ele", "lifeswap_desc": "Escolha um jogador para trocar saúde com ele",
"lifeswap_enemy_info": "Alguém pegou sua saúde emprestada.", "lifeswap_enemy_info": "Alguém pegou sua saúde emprestada.",
"lifeswap_player_info": "Você trocou saúde com o jogador '{0}'.", "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": "Faca Longa",
"longknife_desc": "Um ataque com faca primária causa dano independentemente da distância", "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_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_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_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": "Médico",
"medic_desc": "Clique em [css_useSkill] para usar uma carga de cura que restaura 50 de saúde", "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_desc": "Escolha um jogador para trocar dinheiro com ele",
"moneyswap_enemy_info": "A receita federal te pegou.", "moneyswap_enemy_info": "A receita federal te pegou.",
"moneyswap_player_info": "Você trocou dinheiro com o jogador '{0}'.", "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": "Muhammed",
"muhammed_desc": "Você explode ao morrer, matando jogadores próximos", "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_desc": "Escolha um jogador que receberá dano a cada poucos segundos",
"poison_enemy_info": "Você foi envenenado.", "poison_enemy_info": "Você foi envenenado.",
"poison_player_info": "O jogador '{0}' 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": "Sem Rifles",
"primaryban_desc": "Escolha um jogador que não poderá usar rifles", "primaryban_desc": "Escolha um jogador que não poderá usar rifles",
"primaryban_enemy_info": "Você não pode mais 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_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": "Prótese",
"prosthesis_desc": "Braços e pernas são à prova de balas", "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_desc": "Você pode roubar uma habilidade de um jogador escolhido",
"thief_enemy_info": "Sua habilidade foi roubada.", "thief_enemy_info": "Sua habilidade foi roubada.",
"thief_player_info": "A habilidade do jogador '{0}' 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": "Terceiro Olho",
"thirdeye_desc": "Clique em [css_useSkill] para ativar a visão em terceira pessoa", "thirdeye_desc": "Clique em [css_useSkill] para ativar a visão em terceira pessoa",
@ -394,7 +405,7 @@
"no_player": "Nenhum jogador correspondente encontrado.", "no_player": "Nenhum jogador correspondente encontrado.",
"duplicate_player": "Mais de um jogador encontrado com o mesmo nome.", "duplicate_player": "Mais de um jogador encontrado com o mesmo nome.",
"selectplayerskill_command": "Digite /t", "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", "skill_not_found_setskill": "Nenhuma habilidade CHATCOLORS.RED encontrada",
"player_not_found_setskill": "Nenhum jogador CHATCOLORS.RED encontrado", "player_not_found_setskill": "Nenhum jogador CHATCOLORS.RED encontrado",
@ -420,7 +431,12 @@
"vote_alredy_voted": "Você já votou!", "vote_alredy_voted": "Você já votou!",
"vote_vote": "Votar", "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", "teammate_skills": "Habilidades dos seus companheiros de equipe",
"summary_start": "=======RESUMO=DA=ÚLTIMA=RODADA=======", "summary_start": "=======RESUMO=DA=ÚLTIMA=RODADA=======",
"summary_end": "=======================================" "summary_end": "=======================================",
"menu_controlls": "<font class='fontSize-m' color='cyan'>W/S - Rolar</font> <font class='fontSize-m' color='white'> | </font> <font class='fontSize-m' color='green'>E - Selecionar</font> <br>"
} }

View file

@ -129,6 +129,11 @@
"frozendecoy": "冰冻诱饵", "frozendecoy": "冰冻诱饵",
"frozendecoy_desc": "你的诱饵弹会冻结附近的所有玩家", "frozendecoy_desc": "你的诱饵弹会冻结附近的所有玩家",
"gambler": "赌徒",
"gambler_desc": "从提供的列表中选择一个技能。",
"gambler_select_info": "选择你的技能:",
"gambler_more": "<font class='fontSize-m' color='#00FF00'>刷新 $100</font>",
"ghost": "幽灵", "ghost": "幽灵",
"ghost_desc": "你完全隐形", "ghost_desc": "你完全隐形",
@ -173,6 +178,12 @@
"jammer_player_info": "玩家 '{0}' 的准星已被禁用。", "jammer_player_info": "玩家 '{0}' 的准星已被禁用。",
"jammer_select_info": "选择你想禁用其准星的玩家:", "jammer_select_info": "选择你想禁用其准星的玩家:",
"jester": "小丑",
"jester_desc": "在小丑模式下,你不能造成或受到任何伤害。此模式每隔几秒会变化。",
"jester_mode": "小丑模式",
"jester_on": "开",
"jester_off": "关",
"jumpban": "无腿", "jumpban": "无腿",
"jumpban_desc": "选择一个玩家使其无法跳跃", "jumpban_desc": "选择一个玩家使其无法跳跃",
"jumpban_enemy_info": "有人切断了你的腿。", "jumpban_enemy_info": "有人切断了你的腿。",
@ -394,7 +405,7 @@
"no_player": "未找到匹配的玩家。", "no_player": "未找到匹配的玩家。",
"duplicate_player": "找到多个同名玩家。", "duplicate_player": "找到多个同名玩家。",
"selectplayerskill_command": "输入 /t", "selectplayerskill_command": "输入 /t",
"selectplayerskill_incorrect_enemy_index": "未找到该索引的玩家。", "selectplayerskill_incorrect_enemy_index": "未找到可供选择的玩家。",
"skill_not_found_setskill": "未找到 CHATCOLORS.RED 技能", "skill_not_found_setskill": "未找到 CHATCOLORS.RED 技能",
"player_not_found_setskill": "未找到 CHATCOLORS.RED 玩家", "player_not_found_setskill": "未找到 CHATCOLORS.RED 玩家",
@ -420,7 +431,12 @@
"vote_alredy_voted": "您已投票!", "vote_alredy_voted": "您已投票!",
"vote_vote": "投票", "vote_vote": "投票",
"bombsite_a": "爆轰区A",
"bombsite_b": "爆轰区B",
"teammate_skills": "你队友的技能", "teammate_skills": "你队友的技能",
"summary_start": "=============上一回合总结==============", "summary_start": "=============上一回合总结==============",
"summary_end": "=======================================" "summary_end": "=======================================",
"menu_controlls": "<font class='fontSize-m' color='cyan'>W/S - 滚动</font> <font class='fontSize-m' color='white'> | </font> <font class='fontSize-m' color='green'>E - 选择</font> <br>"
} }

View file

@ -1,14 +1,47 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.UserMessages;
namespace jRandomSkills.src.player; namespace jRandomSkills.src.player;
public interface ISkill public interface ISkill
{ {
public static void LoadSkill() { } public static void LoadSkill() { }
public static void EnableSkill(CCSPlayerController player) { } public static void EnableSkill(CCSPlayerController _) { }
public static void DisableSkill(CCSPlayerController player) { } public static void DisableSkill(CCSPlayerController _) { }
public static void UseSkill(CCSPlayerController player) { } public static void UseSkill(CCSPlayerController _) { }
public static void TypeSkill(CCSPlayerController player, string[] commands) { } 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 public enum Skills
@ -48,6 +81,7 @@ public enum Skills
FragileBomb, FragileBomb,
FriendlyFire, FriendlyFire,
FrozenDecoy, FrozenDecoy,
Gambler,
Ghost, Ghost,
Glaz, Glaz,
Glitch, Glitch,
@ -60,6 +94,7 @@ public enum Skills
InfiniteAmmo, InfiniteAmmo,
Jackal, Jackal,
Jammer, Jammer,
Jester,
JumpBan, JumpBan,
JumpingJack, JumpingJack,
KillerFlash, KillerFlash,

View file

@ -1,297 +1,513 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes;
using CounterStrikeSharp.API.Modules.Cvars; 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 CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using static jRandomSkills.Config; using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
{ {
public static partial class Event public static partial class Event
{ {
private static readonly jSkill_SkillInfo noneSkill = new(Skills.None, Config.GetValue<string>(Skills.None, "color"), false); public static bool enableTransmit = false;
public static readonly jSkill_SkillInfo noneSkill = new(Skills.None, Config.GetValue<string>(Skills.None, "color"), false);
private static jSkill_SkillInfo ctSkill = noneSkill; private static jSkill_SkillInfo ctSkill = noneSkill;
private static jSkill_SkillInfo tSkill = noneSkill; private static jSkill_SkillInfo tSkill = noneSkill;
private static jSkill_SkillInfo allSkill = noneSkill; private static jSkill_SkillInfo allSkill = noneSkill;
private static List<jSkill_SkillInfo> debugSkills = new(SkillData.Skills); private static List<jSkill_SkillInfo> debugSkills = 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<ulong, List<jSkill_SkillInfo>> playersSkills = []; private static readonly Dictionary<ulong, List<jSkill_SkillInfo>> playersSkills = [];
public static readonly Dictionary<ulong, jSkill_SkillInfo> staticSkills = []; public static readonly Dictionary<ulong, jSkill_SkillInfo> staticSkills = [];
public static void Load() public static void Load()
{ {
Instance.RegisterEventHandler<EventPlayerConnectFull>((@event, info) => Instance.RegisterEventHandler<EventPlayerConnectFull>(PlayerConnectFull);
Instance.RegisterEventHandler<EventPlayerDisconnect>(PlayerDisconnect);
Instance.RegisterEventHandler<EventRoundStart>(RoundStart);
Instance.RegisterEventHandler<EventRoundEnd>(RoundEnd);
Instance.RegisterEventHandler<EventPlayerDeath>(PlayerDeath);
Instance.RegisterEventHandler<EventPlayerBlind>(PlayerBlind);
Instance.RegisterEventHandler<EventPlayerHurt>(PlayerHurt);
Instance.RegisterEventHandler<EventPlayerJump>(PlayerJump);
Instance.RegisterEventHandler<EventWeaponFire>(WeaponFire);
Instance.RegisterEventHandler<EventItemEquip>(WeaponEquip);
Instance.RegisterEventHandler<EventItemPickup>(WeaponPickup);
Instance.RegisterEventHandler<EventWeaponReload>(WeaponReload);
Instance.RegisterEventHandler<EventGrenadeThrown>(GrenadeThrown);
Instance.RegisterEventHandler<EventBombBeginplant>(BombBeginplant);
Instance.RegisterEventHandler<EventBombPlanted>(BombPlanted);
Instance.RegisterEventHandler<EventBombBegindefuse>(BombBegindefuse);
Instance.RegisterEventHandler<EventDecoyStarted>(DecoyStarted);
Instance.RegisterEventHandler<EventDecoyDetonate>(DecoyDetonate);
Instance.RegisterEventHandler<EventSmokegrenadeDetonate>(SmokegrenadeDetonate);
Instance.RegisterEventHandler<EventSmokegrenadeExpired>(SmokegrenadeExpired);
Instance.RegisterListener<OnPlayerButtonsChanged>(CheckUseSkill);
Instance.RegisterListener<OnEntitySpawned>(EntitySpawned);
Instance.RegisterListener<OnTick>(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; SteamID = player.SteamID,
PlayerName = player.PlayerName,
if (player == null || !player.IsValid) return HookResult.Continue; Skill = Skills.None,
SpecialSkill = Skills.None,
Instance.SkillPlayer.Add(new jSkill_PlayerInfo IsDrawing = false,
{ SkillChance = 1,
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;
}); });
Instance.RegisterEventHandler<EventPlayerDisconnect>((@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); var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (skillPlayer != null) if (skillPlayer == null) continue;
{ skillPlayer.IsDrawing = true;
Instance.SkillPlayer.Remove(skillPlayer); }
}
return HookResult.Continue; Instance.RemoveListener<CheckTransmit>(CheckTransmit);
}); int freezetime = ConVar.Find("mp_freezetime")?.GetPrimitiveValue<Int32>() ?? 0;
Instance.AddTimer(Math.Max(freezetime - Config.LoadedConfig.Settings.SkillTimeBeforeStart, 0) + .3f, SetSkill);
return HookResult.Continue;
}
Instance.RegisterEventHandler<EventRoundStart>((@event, info) => private static void DisableAll()
{
foreach (var player in Utilities.GetPlayers().Where(p => !p.IsBot))
{ {
foreach (var player in Utilities.GetPlayers()) var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
{ if (playerInfo == null) return;
var skillPlayer = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); Instance.SkillAction(playerInfo.Skill.ToString(), "DisableSkill", [player]);
if (skillPlayer != null) Instance.SkillAction(playerInfo.Skill.ToString(), "NewRound");
skillPlayer.IsDrawing = true; }
} }
return HookResult.Continue; private static HookResult RoundEnd(EventRoundEnd @event, GameEventInfo info)
}); {
foreach (var player in Utilities.GetPlayers())
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
{ {
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); var _playerSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == _player.SteamID);
if (_playerSkill != null)
string skillsText = "";
foreach (var _player in _players)
{ {
var _playerSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == _player.SteamID); var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == _playerSkill.Skill);
if (_playerSkill != null) 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<PlayerButtons>(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<jSkill_SkillInfo> 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<string>(Skills.None, "color"), false) : tSkills[Instance.Random.Next(tSkills.Count)];
List<jSkill_SkillInfo> 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<string>(Skills.None, "color"), false) : ctSkills[Instance.Random.Next(ctSkills.Count)];
}
else if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.SameSkills)
{
List<jSkill_SkillInfo> 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<string>(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<string>(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<jSkill_SkillInfo> 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<jSkill_SkillInfo>? 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<jSkill_SkillInfo>? 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<jSkill_SkillInfo>(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 skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == teammateSkill);
var specialSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == _playerSkill.SpecialSkill); teammateSkills += $" {ChatColors.DarkRed}{teammate.PlayerName}{ChatColors.Lime}: {(skillInfo == null ? Skills.None : skillInfo.Name)}\n";
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)) if (!string.IsNullOrEmpty(teammateSkills))
{ {
player.PrintToChat(" "); SkillUtils.PrintToChat(player, $" {ChatColors.Lime}{Localization.GetTranslation("teammate_skills")}:", false);
player.PrintToChat($" {ChatColors.Lime}{Localization.GetTranslation("summary_start")}"); foreach (string text in teammateSkills.Split("\n"))
foreach (string text in skillsText.Split("\n"))
if (!string.IsNullOrEmpty(text)) if (!string.IsNullOrEmpty(text))
player.PrintToChat(text); player.PrintToChat(text);
player.PrintToChat($" {ChatColors.Lime}{Localization.GetTranslation("summary_end")}");
player.PrintToChat(" \n");
} }
}); });
} }
}
if (enableTransmit)
Instance?.RegisterListener<CheckTransmit>(CheckTransmit);
}
return HookResult.Continue; public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
}); {
foreach (var playerSkill in Instance.SkillPlayer)
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => if (!playerSkill.IsDrawing)
{ Instance.SkillAction(playerSkill.Skill.ToString(), "CheckTransmit", [infoList]);
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<jSkill_SkillInfo> 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<string>(Skills.None, "color"), false) : tSkills[Instance.Random.Next(tSkills.Count)];
List<jSkill_SkillInfo> 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<string>(Skills.None, "color"), false) : ctSkills[Instance.Random.Next(ctSkills.Count)];
}
else if (Config.LoadedConfig.Settings.GameMode == (int)Config.GameModes.SameSkills)
{
List<jSkill_SkillInfo> 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<string>(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<string>(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<jSkill_SkillInfo> 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<jSkill_SkillInfo>? 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<jSkill_SkillInfo>? 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<jSkill_SkillInfo>(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<EventPlayerDeath>((@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<Listeners.OnPlayerButtonsChanged>((CCSPlayerController player, PlayerButtons pressed, PlayerButtons released) =>
{
string? button = Config.LoadedConfig.Settings.AlternativeSkillButton;
if (string.IsNullOrEmpty(button)) return;
if (Enum.TryParse<PlayerButtons>(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]);
});
} }
[GeneratedRegex(@"\{AUTHOR1\}", RegexOptions.IgnoreCase, "pl-PL")] [GeneratedRegex(@"\{AUTHOR1\}", RegexOptions.IgnoreCase, "pl-PL")]

View file

@ -84,14 +84,17 @@ namespace jRandomSkills
var observeredPlayerSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer.SteamID); var observeredPlayerSkill = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer.SteamID);
if (observeredPlayerSkill == null) return; if (observeredPlayerSkill == null) return;
var observeredPlayerSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == observeredPlayerSkill.Skill); var observeredPlayerSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == observeredPlayerSkill.Skill);
if (observeredPlayerSkillInfo == null) return; if (observeredPlayerSkillInfo == null) return;
var observeredPlayerSpecialSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == observeredPlayerSkill.SpecialSkill); var observeredPlayerSpecialSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == observeredPlayerSkill.SpecialSkill);
if (observeredPlayerSpecialSkillInfo == null) return; if (observeredPlayerSpecialSkillInfo == null) return;
infoLine = $"<font class='fontSize-l' class='fontWeight-Bold' color='#FFFFFF'>{Localization.GetTranslation("observer_skill")} {observeredPlayerSkill.PlayerName}:</font> <br>"; string pName = observeredPlayerSkill.PlayerName;
if (pName.Length > 18)
pName = $"{pName.Substring(0, 17)}...";
infoLine = $"<font class='fontSize-l' class='fontWeight-Bold' color='#FFFFFF'>{Localization.GetTranslation("observer_skill")} {pName}:</font> <br>";
skillLine = $"<font class='fontSize-l' class='fontWeight-Bold' color='{observeredPlayerSkillInfo.Color}'>{(observeredPlayerSkill.SpecialSkill == Skills.None ? observeredPlayerSkillInfo.Name : $"{observeredPlayerSpecialSkillInfo.Name}({observeredPlayerSkillInfo.Name})")}</font> <br>"; skillLine = $"<font class='fontSize-l' class='fontWeight-Bold' color='{observeredPlayerSkillInfo.Color}'>{(observeredPlayerSkill.SpecialSkill == Skills.None ? observeredPlayerSkillInfo.Name : $"{observeredPlayerSpecialSkillInfo.Name}({observeredPlayerSkillInfo.Name})")}</font> <br>";
} }
} }

View file

@ -1,5 +1,4 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
@ -16,31 +15,30 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(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<CEntityInstance>(0); CEntityInstance param = h.GetParam<CEntityInstance>(0);
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1); CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) 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 attackerPawn = new(param2.Attacker.Value.Handle);
CCSPlayerPawn victimPawn = new(param.Handle); CCSPlayerPawn victimPawn = new(param.Handle);
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
return HookResult.Continue; return;
if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
return HookResult.Continue; return;
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>(); CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
CCSPlayerController victim = victimPawn.Controller.Value.As<CCSPlayerController>(); CCSPlayerController victim = victimPawn.Controller.Value.As<CCSPlayerController>();
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
if (playerInfo == null) return HookResult.Continue; if (playerInfo == null) return;
if (attacker.PawnIsAlive) 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) 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)

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -19,64 +18,37 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundEnd>((@event, info) =>
{
SkillPlayerInfo.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName) if (playerInfo?.Skill == skillName)
SkillPlayerInfo.Remove(player.SteamID); if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
{
return HookResult.Continue; UpdateHUD(player, skillInfo);
}); if (Server.TickCount % tickRate != 0) return;
var pawn = player.PlayerPawn.Value;
Instance.RegisterListener<OnTick>(() => if (pawn != null && pawn.IsValid && pawn.AbsOrigin != null)
{
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 (skillInfo.LastRotations == null || skillInfo.LastPositions == null) continue;
if (Server.TickCount % tickRate != 0) return; skillInfo.LastPositions.Add(new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z));
var pawn = player.PlayerPawn.Value; skillInfo.LastRotations.Add(new QAngle(pawn.EyeAngles.X, pawn.EyeAngles.Y, pawn.EyeAngles.Z));
if (pawn != null && pawn.IsValid && pawn.AbsOrigin != null) if (skillInfo.LastRotations.Count > maxSize)
{ {
if (skillInfo.LastRotations == null || skillInfo.LastPositions == null) continue; skillInfo.LastPositions.RemoveAt(0);
skillInfo.LastPositions.Add(new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z)); skillInfo.LastRotations.RemoveAt(0);
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);
}
} }
} }
} }
}); }
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -1,4 +1,3 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
@ -14,44 +13,25 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void PlayerBlind(EventPlayerBlind @event)
{ {
Instance.AddTimer(0.1f, () => var player = @event.Userid;
{ var attacker = @event.Attacker;
foreach (var player in Utilities.GetPlayers()) if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return;
{ if (attacker == null || !attacker.IsValid) return;
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; var playerPawn = player.PlayerPawn.Value;
}); if (playerPawn == null || !playerPawn.IsValid) return;
Instance.RegisterEventHandler<EventPlayerBlind>((@event, info) => var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
{ var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
var player = @event.Userid;
var attacker = @event.Attacker;
if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return HookResult.Continue; if (playerInfo?.Skill == skillName)
if (attacker == null || !attacker.IsValid) return HookResult.Continue; playerPawn.FlashDuration = 0.0f;
else if (attackerInfo?.Skill == skillName)
var playerPawn = player.PlayerPawn.Value; playerPawn.FlashDuration = 7.0f;
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;
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -12,25 +12,18 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) => public static void PlayerHurt(EventPlayerHurt @event)
{ {
var attacker = @event.Attacker; var attacker = @event.Attacker;
var victim = @event.Userid; var victim = @event.Userid;
int hitgroup = @event.Hitgroup; int hitgroup = @event.Hitgroup;
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 == victim?.SteamID);
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); if (playerInfo?.Skill == skillName && hitgroup == (int)HitGroup_t.HITGROUP_HEAD)
ApplyIronHeadEffect(victim!, @event.DmgHealth);
if (playerInfo?.Skill == skillName && hitgroup == (int)HitGroup_t.HITGROUP_HEAD)
{
ApplyIronHeadEffect(victim!, @event.DmgHealth);
return HookResult.Stop;
}
return HookResult.Continue;
});
} }
private static void ApplyIronHeadEffect(CCSPlayerController victim, float damage) private static void ApplyIronHeadEffect(CCSPlayerController victim, float damage)

View file

@ -16,32 +16,13 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void NewRound()
{ {
Instance.AddTimer(0.1f, () => foreach (var player in Utilities.GetPlayers())
{ SkillUtils.CloseMenu(player);
foreach (var player in Utilities.GetPlayers()) Instance.AddTimer(0.1f, EnableBombsite);
{
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<EventRoundStart>((@event, info) =>
{
Instance.AddTimer(0.1f, () =>
{
EnableBombsite();
});
return HookResult.Continue;
});
} }
public static void TypeSkill(CCSPlayerController player, string[] commands) public static void TypeSkill(CCSPlayerController player, string[] commands)
@ -78,19 +59,16 @@ namespace jRandomSkills
if (playerInfo == null) return; if (playerInfo == null) return;
playerInfo.SkillChance = 0; playerInfo.SkillChance = 0;
SkillUtils.PrintToChat(player, Localization.GetTranslation("areareaper") + ":", false); HashSet<(string, string)> menuItems = [(Localization.GetTranslation("bombsite_a"), "a"), (Localization.GetTranslation("bombsite_b"), "b")];
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("areareaper_select_info")}"); SkillUtils.CreateMenu(player, menuItems);
player.PrintToChat($" {ChatColors.Green}· {ChatColors.Red}/t {ChatColors.Green}A");
player.PrintToChat($" {ChatColors.Green}· {ChatColors.Red}/t {ChatColors.Green}B");
} }
#pragma warning disable IDE0060 // Usuń nieużywany parametr
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
#pragma warning restore IDE0060 // Usuń nieużywany parametr
{ {
if (Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName) != null) SkillUtils.CloseMenu(player);
return; if (Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName) != null) return;
EnableBombsite(); EnableBombsite();
} }
private static void EnableBombsite() private static void EnableBombsite()

View file

@ -1,6 +1,4 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
@ -16,25 +14,6 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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) 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); 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<CEntityInstance>(0); CEntityInstance param = h.GetParam<CEntityInstance>(0);
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1); CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) 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 attackerPawn = new(param2.Attacker.Value.Handle);
CCSPlayerPawn victimPawn = new(param.Handle); CCSPlayerPawn victimPawn = new(param.Handle);
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
return HookResult.Continue; return;
if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
return HookResult.Continue; return;
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>(); CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
CCSPlayerController victim = victimPawn.Controller.Value.As<CCSPlayerController>(); CCSPlayerController victim = victimPawn.Controller.Value.As<CCSPlayerController>();
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID); 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) if (playerInfo.Skill == skillName && victim.PawnIsAlive)
{ {
float? skillChance = playerInfo.SkillChance; float? skillChance = playerInfo.SkillChance;
param2.Damage *= skillChance ?? 1f; 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) 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)

View file

@ -15,26 +15,24 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) => public static void PlayerHurt(EventPlayerHurt @event)
{ {
var damage = @event.DmgHealth; var damage = @event.DmgHealth;
var victim = @event.Userid; var victim = @event.Userid;
var attacker = @event.Attacker; var attacker = @event.Attacker;
var weapon = @event.Weapon; var weapon = @event.Weapon;
HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup; HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup;
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return;
if (nades.Contains(weapon)) return HookResult.Continue; if (nades.Contains(weapon)) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
if (playerInfo?.Skill != skillName) return HookResult.Continue; if (playerInfo?.Skill != skillName) return;
if (IsBehind(attacker!, victim!)) if (IsBehind(attacker!, victim!))
SkillUtils.TakeHealth(victim!.PlayerPawn.Value, (int)(damage * (damageMultiplier - 1f))); SkillUtils.TakeHealth(victim!.PlayerPawn.Value, (int)(damage * (damageMultiplier - 1f)));
return HookResult.Continue;
});
} }
private static bool IsBehind(CCSPlayerController attacker, CCSPlayerController victim) private static bool IsBehind(CCSPlayerController attacker, CCSPlayerController victim)

View file

@ -14,31 +14,6 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundFreezeEnd>((@event, info) =>
{
foreach (var player in Utilities.GetPlayers())
DisableSkill(player);
return HookResult.Continue;
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
@ -46,6 +21,12 @@ namespace jRandomSkills
ApplyGravityModifier(player); ApplyGravityModifier(player);
} }
public static void NewRound()
{
foreach (var player in Utilities.GetPlayers())
DisableSkill(player);
}
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;

View file

@ -18,77 +18,56 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventPlayerHurt>((@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<Listeners.OnEntitySpawned>(@event =>
{
var name = @event.DesignerName;
if (name != "decoy_projectile")
return;
var decoy = @event.As<CDecoyProjectile>();
if (decoy == null || !decoy.IsValid || decoy.OwnerEntity == null || decoy.OwnerEntity.Value == null || !decoy.OwnerEntity.Value.IsValid) return;
var pawn = decoy.OwnerEntity.Value.As<CCSPlayerPawn>();
if (pawn == null || !pawn.IsValid || pawn.Controller == null || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return;
var player = pawn.Controller.Value.As<CCSPlayerController>();
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<EventDecoyStarted>((@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<Listeners.OnTick>(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<CDecoyProjectile>();
if (decoy == null || !decoy.IsValid || decoy.OwnerEntity == null || decoy.OwnerEntity.Value == null || !decoy.OwnerEntity.Value.IsValid) return;
var pawn = decoy.OwnerEntity.Value.As<CCSPlayerPawn>();
if (pawn == null || !pawn.IsValid || pawn.Controller == null || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return;
var player = pawn.Controller.Value.As<CCSPlayerController>();
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) foreach (var decoy in decoys)
{ {

View file

@ -1,4 +1,3 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
@ -14,42 +13,19 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void PlayerHurt(EventPlayerHurt @event)
{ {
Instance.AddTimer(0.1f, () => var attacker = @event!.Attacker;
{ var victim = @event!.Userid;
foreach (var player in Utilities.GetPlayers())
{
if (!Instance.IsPlayerValid(player)) continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return;
if (playerInfo?.Skill != skillName) continue; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
EnableSkill(player);
}
});
return HookResult.Continue; if (playerInfo?.Skill == skillName && victim!.PawnIsAlive)
}); if (Instance.Random.NextDouble() <= playerInfo.SkillChance)
RotateEnemy(victim);
Instance.RegisterEventHandler<EventPlayerHurt>((@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;
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -16,38 +16,38 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventPlayerHurt>((@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; if (chance > legReflectionChance)
int damage = @event.DmgHealth; return;
HitGroup_t hitGroup = (HitGroup_t)@event.Hitgroup; }
string weapon = @event.Weapon; else
if (chance > torseReflectionChance)
return;
if (noReflectionWeapon.Contains(weapon) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; var pawn = victim!.PlayerPawn.Value;
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); if (pawn == null || !pawn.IsValid) return;
if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue;
int chance = Instance.Random.Next(0, 101); var weaponServices = pawn.WeaponServices;
if (hitGroup == HitGroup_t.HITGROUP_LEFTLEG || hitGroup == HitGroup_t.HITGROUP_RIGHTLEG) 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")
if (chance > legReflectionChance) return;
return HookResult.Continue;
}
else
if (chance > torseReflectionChance)
return HookResult.Continue;
var pawn = victim!.PlayerPawn.Value; RestoreHealth(victim, damage);
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;
});
} }
private static void RestoreHealth(CCSPlayerController victim, float damage) private static void RestoreHealth(CCSPlayerController victim, float damage)

View file

@ -2,7 +2,6 @@ using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -17,10 +16,9 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
Instance.RegisterListener<OnTick>(OnTick);
} }
private static void OnTick() public static void OnTick()
{ {
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
{ {
@ -34,6 +32,7 @@ namespace jRandomSkills
{ {
var playerPawn = player.PlayerPawn.Value; var playerPawn = player.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) return; if (playerPawn == null || !playerPawn.IsValid) return;
if (JumpBan.bannedPlayers.ContainsKey(playerPawn)) return;
var flags = (PlayerFlags)playerPawn.Flags; var flags = (PlayerFlags)playerPawn.Flags;
var buttons = player.Buttons; var buttons = player.Buttons;

View file

@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Core.Attributes;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -12,89 +11,41 @@ namespace jRandomSkills
public class C4Camouflage : ISkill public class C4Camouflage : ISkill
{ {
private const Skills skillName = Skills.C4Camouflage; private const Skills skillName = Skills.C4Camouflage;
private static bool exists = false;
private static readonly Dictionary<ulong, List<uint>> invisibleEntities = []; private static readonly Dictionary<ulong, List<uint>> invisibleEntities = [];
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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, () => SetPlayerVisibility(player!, false);
{ SetWeaponVisibility(player!, false);
foreach (var player in Utilities.GetPlayers()) }
{ else
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<EventPlayerDeath>((@event, info) =>
{ {
var player = @event.Userid; SetPlayerVisibility(player!, true);
if (player == null || !player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue; SetWeaponVisibility(player!, true);
}
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
DisableSkill(player);
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventItemPickup>((@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<EventItemEquip>((@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<EventRoundEnd>((@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>(CheckTransmit);
exists = false;
return HookResult.Continue;
});
} }
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
@ -111,10 +62,7 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
{ {
if (!exists) Event.enableTransmit = true;
Instance.RegisterListener<CheckTransmit>(CheckTransmit);
exists = true;
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var playerPawn = player.PlayerPawn.Value; var playerPawn = player.PlayerPawn.Value;
@ -129,7 +77,6 @@ namespace jRandomSkills
SetWeaponVisibility(player, false); SetWeaponVisibility(player, false);
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
SetPlayerVisibility(player, true); SetPlayerVisibility(player, true);

View file

@ -1,4 +1,3 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
@ -14,46 +13,23 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void PlayerHurt(EventPlayerHurt @event)
{ {
Instance.AddTimer(0.1f, () => 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()) var victimPawn = victim.PlayerPawn?.Value;
{ if (victimPawn != null)
if (!Instance.IsPlayerValid(player)) continue; victimPawn.AbsVelocity.Z = 300f;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) continue;
EnableSkill(player);
}
});
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerHurt>((@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;
}
}
} }
return HookResult.Continue;
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Core.Attributes;
@ -13,8 +12,6 @@ namespace jRandomSkills
public class Chicken : ISkill public class Chicken : ISkill
{ {
private const Skills skillName = Skills.Chicken; private const Skills skillName = Skills.Chicken;
private static bool roundEnd = false;
private static bool exists = false;
private static readonly string[] disabledWeapons = private static readonly string[] disabledWeapons =
[ [
"weapon_ak47", "weapon_m4a4", "weapon_m4a1", "weapon_m4a1_silencer", "weapon_ak47", "weapon_m4a4", "weapon_m4a1", "weapon_m4a1_silencer",
@ -30,70 +27,21 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundEnd>((@event, info) => public static void WeaponPickup(EventItemPickup @event)
{ {
foreach (var player in Utilities.GetPlayers()) var player = @event.Userid;
{ if (player == null || !player.IsValid) return;
if (!Instance.IsPlayerValid(player)) 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); SetWeaponAttack(player, true);
if (playerInfo?.Skill != skillName) continue;
DisableSkill(player);
}
roundEnd = true;
Instance.RemoveListener<CheckTransmit>(CheckTransmit);
exists = false;
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@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<EventItemPickup>((@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<EventRoundStart>((@event, info) =>
{
foreach (var player in Utilities.GetPlayers())
SetWeaponAttack(player, false);
return HookResult.Continue;
});
Instance.RegisterListener<OnTick>(OnTick);
} }
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
@ -112,10 +60,7 @@ namespace jRandomSkills
var playerPawn = player.PlayerPawn?.Value; var playerPawn = player.PlayerPawn?.Value;
if (playerPawn != null && playerPawn.IsValid) if (playerPawn != null && playerPawn.IsValid)
{ {
if (!exists) Event.enableTransmit = true;
Instance.RegisterListener<CheckTransmit>(CheckTransmit);
exists = true;
playerPawn.VelocityModifier = 1.1f; playerPawn.VelocityModifier = 1.1f;
playerPawn.Health = 50; playerPawn.Health = 50;
@ -165,7 +110,7 @@ namespace jRandomSkills
private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon) 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; var pawn = player?.PlayerPawn?.Value;
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null || pawn.WeaponServices.MyWeapons == null) return; 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)); Instance.AddTimer(1f, () => chickens.TryAdd(player, chickenModel));
} }
private static void OnTick() public static void OnTick()
{ {
foreach (var valuePair in chickens) foreach (var valuePair in chickens)
{ {

View file

@ -14,28 +14,24 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventBombBeginplant>((@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; var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList();
if (bombEntities.Count != 0)
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
var anyChillOut = Instance.SkillPlayer.FirstOrDefault(p => p.Skill == skillName);
if (anyChillOut != null)
{ {
var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList(); var bomb = bombEntities.FirstOrDefault();
if (bomb != null)
if (bombEntities.Count != 0) 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) 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)

View file

@ -12,23 +12,21 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) => public static void PlayerHurt(EventPlayerHurt @event)
{ {
var damage = @event.DmgHealth; var damage = @event.DmgHealth;
var attacker = @event.Attacker; var attacker = @event.Attacker;
var victim = @event.Userid; var victim = @event.Userid;
var weapon = @event.Weapon; 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 (weapon == "knife")
if (playerInfo?.Skill != skillName) return HookResult.Continue; SkillUtils.TakeHealth(victim!.PlayerPawn.Value, 9999);
if (weapon == "knife")
SkillUtils.TakeHealth(victim!.PlayerPawn.Value, 9999);
return HookResult.Continue;
});
} }
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) 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)

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using System.Collections.Generic;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -18,40 +17,33 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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, () => if (!SkillUtils.HasMenu(player)) continue;
{ var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
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; 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<EventRoundEnd>((@event, info) => HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
{ SkillUtils.UpdateMenu(player, menuItems);
foreach (var player in defaultPostProcessings.Keys) }
DisableSkill(player);
foreach (var postProcessing in newPostProcessing)
postProcessing.Remove();
newPostProcessing.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue;
SetUpPostProcessing(player, true);
return HookResult.Continue;
});
} }
public static void TypeSkill(CCSPlayerController player, string[] commands) public static void TypeSkill(CCSPlayerController player, string[] commands)
@ -87,23 +79,20 @@ namespace jRandomSkills
if (playerInfo == null) return; if (playerInfo == null) return;
playerInfo.SkillChance = 0; playerInfo.SkillChance = 0;
SkillUtils.PrintToChat(player, Localization.GetTranslation("darkness") + ":", false); 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();
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();
if (enemies.Length > 0) if (enemies.Length > 0)
{ {
foreach (var enemy in enemies) HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); SkillUtils.CreateMenu(player, menuItems);
} }
else else
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
SetUpPostProcessing(player, true); SetUpPostProcessing(player, true);
SkillUtils.CloseMenu(player);
} }
private static void SetUpPostProcessing(CCSPlayerController player, bool dontCreateNew = false) private static void SetUpPostProcessing(CCSPlayerController player, bool dontCreateNew = false)

View file

@ -13,34 +13,39 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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 enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (enemyInfo == null) continue;
if (playerInfo?.Skill != skillName) continue; var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill);
EnableSkill(player); if (skillData == null) continue;
menuItems.Add(($"{enemy.PlayerName} : {skillData.Name}", enemy.Index.ToString()));
} }
}); SkillUtils.CreateMenu(player, menuItems);
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
{
foreach (var player in Utilities.GetPlayers())
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
DisableSkill(player);
} }
return HookResult.Continue; }
});
} }
public static void TypeSkill(CCSPlayerController player, string[] commands) public static void TypeSkill(CCSPlayerController player, string[] commands)
@ -68,24 +73,22 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
{ {
SkillUtils.PrintToChat(player, Localization.GetTranslation("deactivator") + ":", false); 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();
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();
if (enemies.Length > 0) if (enemies.Length > 0)
{ {
HashSet<(string, string)> menuItems = [];
foreach (var enemy in enemies) foreach (var enemy in enemies)
{ {
var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
if (enemyInfo == null) continue; if (enemyInfo == null) continue;
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill);
if (skillData == null) continue; 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 else
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
@ -93,6 +96,7 @@ namespace jRandomSkills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return; if (playerInfo == null) return;
playerInfo.SpecialSkill = Skills.None; playerInfo.SpecialSkill = Skills.None;
SkillUtils.CloseMenu(player);
} }
private static void DeacitvateSkill(CCSPlayerController player, CCSPlayerController enemy) private static void DeacitvateSkill(CCSPlayerController player, CCSPlayerController enemy)

View file

@ -1,5 +1,6 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.UserMessages;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
@ -14,50 +15,38 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void NewRound()
{ {
deafPlayers.Clear(); foreach (var player in deafPlayers)
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<EventPlayerDeath>((@event, info) =>
{
var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue;
DisableSkill(player); DisableSkill(player);
return HookResult.Continue; deafPlayers.Clear();
}); foreach (var player in Utilities.GetPlayers())
SkillUtils.CloseMenu(player);
}
Instance.RegisterEventHandler<EventRoundEnd>((@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) if (!SkillUtils.HasMenu(player)) continue;
DisableSkill(player); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
return HookResult.Continue;
});
Instance.HookUserMessage(208, um => if (playerInfo == null || playerInfo.Skill != skillName) continue;
{ var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
var soundevent = um.ReadUInt("soundevent_hash");
var userIndex = um.ReadUInt("source_entity_index");
foreach (var player in deafPlayers) HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
um.Recipients.Remove(player); SkillUtils.UpdateMenu(player, menuItems);
}
return HookResult.Continue;
}, HookMode.Pre);
} }
public static void TypeSkill(CCSPlayerController player, string[] commands) public static void TypeSkill(CCSPlayerController player, string[] commands)
@ -93,23 +82,20 @@ namespace jRandomSkills
if (playerInfo == null) return; if (playerInfo == null) return;
playerInfo.SkillChance = 0; playerInfo.SkillChance = 0;
SkillUtils.PrintToChat(player, Localization.GetTranslation("deaf") + ":", false); 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();
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();
if (enemies.Length > 0) if (enemies.Length > 0)
{ {
foreach (var enemy in enemies) HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); SkillUtils.CreateMenu(player, menuItems);
} }
else else
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
deafPlayers.Remove(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) 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)

View file

@ -1,4 +1,3 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
@ -14,47 +13,29 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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()) var weaponServices = victim.PlayerPawn?.Value?.WeaponServices;
{ if (weaponServices?.ActiveWeapon == null) return;
if (!Instance.IsPlayerValid(player)) continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var weaponName = weaponServices?.ActiveWeapon?.Value?.DesignerName;
if (playerInfo?.Skill != skillName) continue; if (weaponName != null && !weaponName.Contains("weapon_knife") && !weaponName.Contains("weapon_c4"))
EnableSkill(player); victim.ExecuteClientCommand("slot3");
} //victim.DropActiveWeapon();
});
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerHurt>((@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();
}
} }
return HookResult.Continue; }
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
{ {
@ -15,34 +14,14 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundEnd>((@event, info) =>
{
foreach (var player in distancerPlayers)
DisableSkill(player);
return HookResult.Continue;
});
Instance.RegisterListener<Listeners.OnTick>(OnTick);
} }
private static void OnTick() public static void NewRound()
{
distancerPlayers.Clear();
}
public static void OnTick()
{ {
foreach (var player in distancerPlayers) foreach (var player in distancerPlayers)
{ {

View file

@ -14,22 +14,18 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventPlayerHurt>((@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) if (playerInfo?.Skill == skillName && victim!.PawnIsAlive)
{ HealAttacker(attacker!, @event.DmgHealth);
HealAttacker(attacker!, @event.DmgHealth);
}
return HookResult.Continue;
});
} }
private static void HealAttacker(CCSPlayerController attacker, float damage) private static void HealAttacker(CCSPlayerController attacker, float damage)

View file

@ -13,23 +13,39 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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);
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; 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) public static void TypeSkill(CCSPlayerController player, string[] commands)
@ -57,24 +73,22 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
{ {
SkillUtils.PrintToChat(player, Localization.GetTranslation("duplicator") + ":", false); 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();
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();
if (enemies.Length > 0) if (enemies.Length > 0)
{ {
HashSet<(string, string)> menuItems = [];
foreach (var enemy in enemies) foreach (var enemy in enemies)
{ {
var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID); var enemyInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
if (enemyInfo == null) continue; if (enemyInfo == null) continue;
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill);
if (skillData == null) continue; 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 else
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
@ -82,6 +96,7 @@ namespace jRandomSkills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return; if (playerInfo == null) return;
playerInfo.SpecialSkill = Skills.None; playerInfo.SpecialSkill = Skills.None;
SkillUtils.CloseMenu(player);
} }
private static void DuplicateSkill(CCSPlayerController player, CCSPlayerController enemy) private static void DuplicateSkill(CCSPlayerController player, CCSPlayerController enemy)
@ -91,10 +106,12 @@ namespace jRandomSkills
if (playerInfo != null && enemyInfo != null) if (playerInfo != null && enemyInfo != null)
{ {
playerInfo.Skill = enemyInfo.Skill; Instance.AddTimer(.1f, () =>
playerInfo.SpecialSkill = skillName; {
Instance.SkillAction(enemyInfo.Skill.ToString(), "EnableSkill", [player]); 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)); player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("duplicator_player_info", enemy.PlayerName));
} }
} }

View file

@ -14,49 +14,18 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundEnd>((@event, info) =>
{
Instance.AddTimer(0.1f, () =>
{
foreach (var player in Utilities.GetPlayers())
{
if (!Instance.IsPlayerValid(player)) continue;
DisableSkill(player);
}
});
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@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; var playerPawn = player.PlayerPawn?.Value;
if (playerPawn != null && player.IsValid) if (playerPawn != null && player.IsValid)
@ -67,6 +36,7 @@ namespace jRandomSkills
// playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = newSize; // playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = newSize;
if (playerPawn.CBodyComponent == null || playerPawn.CBodyComponent.SceneNode == null) return; if (playerPawn.CBodyComponent == null || playerPawn.CBodyComponent.SceneNode == null) return;
playerPawn.CBodyComponent.SceneNode.Scale = newSize; playerPawn.CBodyComponent.SceneNode.Scale = newSize;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent"); Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent");
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("dwarf")}{ChatColors.Lime}: " + Localization.GetTranslation("dwarf_desc2", newSize), false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("dwarf")}{ChatColors.Lime}: " + Localization.GetTranslation("dwarf_desc2", newSize), false);
} }

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -17,52 +16,22 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundEnd>((@event, info) =>
{
SkillPlayerInfo.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName) if (playerInfo?.Skill == skillName)
SkillPlayerInfo.Remove(player.SteamID); if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
UpdateHUD(player, skillInfo);
return HookResult.Continue; }
});
Instance.RegisterListener<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 EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -1,6 +1,5 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
@ -18,24 +17,6 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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) public static void EnableSkill(CCSPlayerController player)
@ -65,28 +46,27 @@ namespace jRandomSkills
heProjectile.DetonateTime = 0; heProjectile.DetonateTime = 0;
} }
private static HookResult OnTakeDamage(DynamicHook h) public static void OnTakeDamage(DynamicHook h)
{ {
CEntityInstance param = h.GetParam<CEntityInstance>(0); CEntityInstance param = h.GetParam<CEntityInstance>(0);
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1); CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) 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 attackerPawn = new(param2.Attacker.Value.Handle);
if (attackerPawn.DesignerName != "player") if (attackerPawn.DesignerName != "player")
return HookResult.Continue; return;
if (attackerPawn == null || attackerPawn.Controller?.Value == null) if (attackerPawn == null || attackerPawn.Controller?.Value == null)
return HookResult.Continue; return;
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>(); CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); 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) if (Instance.Random.NextDouble() <= playerInfo.SkillChance)
SpawnExplosion(param2.DamagePosition); 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) 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)

View file

@ -10,56 +10,40 @@ namespace jRandomSkills
public class FalconEye : ISkill public class FalconEye : ISkill
{ {
private const Skills skillName = Skills.FalconEye; private const Skills skillName = Skills.FalconEye;
private static bool blocked = false;
private static readonly float distance = Config.GetValue<float>(skillName, "distance"); private static readonly float distance = Config.GetValue<float>(skillName, "distance");
private static readonly Dictionary<ulong, (uint, CDynamicProp)> cameras = []; private static readonly Dictionary<ulong, (uint, CDynamicProp)> cameras = [];
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) => public static void NewRound()
{ {
blocked = true; foreach (var camera in cameras)
foreach (var player in Utilities.GetPlayers()) camera.Value.Item2.Remove();
if (cameras.TryGetValue(player.SteamID, out _)) cameras.Clear();
DisableSkill(player); }
foreach (var camera in cameras) public static void WeaponPickup(EventItemPickup @event)
camera.Value.Item2.Remove(); {
cameras.Clear(); var player = @event.Userid;
return HookResult.Continue; if (!Instance.IsPlayerValid(player)) return;
});
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
{ if (playerInfo?.Skill != skillName) return ;
blocked = false;
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventItemPickup>((@event, info) => var pawn = player!.PlayerPawn.Value;
{ if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return;
var player = @event.Userid;
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (cameras.TryGetValue(player!.SteamID, out var cameraInfo) && cameraInfo.Item1 == pawn.CameraServices.ViewEntity.Raw)
if (playerInfo?.Skill != skillName) return HookResult.Continue; BlockWeapon(player, true);
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<Listeners.OnTick>(OnTick);
} }
public static void UseSkill(CCSPlayerController player) public static void UseSkill(CCSPlayerController player)
{ {
var playerPawn = player.PlayerPawn.Value; var playerPawn = player.PlayerPawn.Value;
if (playerPawn?.CBodyComponent == null || blocked) return; if (playerPawn?.CBodyComponent == null) return;
ChangeCamera(player); ChangeCamera(player);
} }
@ -68,7 +52,7 @@ namespace jRandomSkills
ChangeCamera(player, true); ChangeCamera(player, true);
} }
private static void OnTick() public static void OnTick()
{ {
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2.IsValid) if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2.IsValid)

View file

@ -1,9 +1,9 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.UserMessages;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -15,50 +15,24 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
Instance.RegisterListener<OnTick>(UpdateSpeed); }
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void PlayerMakeSound(UserMessage um)
{ {
Instance.AddTimer(0.1f, () => var soundevent = um.ReadUInt("soundevent_hash");
{ var userIndex = um.ReadUInt("source_entity_index");
foreach (var player in Utilities.GetPlayers())
{
if (!Instance.IsPlayerValid(player)) continue;
var playerPawn = player.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) continue;
playerPawn.VelocityModifier = 1; if (userIndex == 0) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); if (!Instance.footstepSoundEvents.Contains(soundevent)) return;
if (playerInfo?.Skill != skillName) continue;
EnableSkill(player);
}
});
return HookResult.Continue;
});
Instance.HookUserMessage(208, um => 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 soundevent = um.ReadUInt("soundevent_hash");
var userIndex = um.ReadUInt("source_entity_index");
if (userIndex == 0) return HookResult.Continue; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
if (!Instance.footstepSoundEvents.Contains(soundevent)) return HookResult.Continue; if (playerInfo?.Skill != skillName) 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 (player!.Buttons.HasFlag(PlayerButtons.Speed) || player.Buttons.HasFlag(PlayerButtons.Duck))
if (playerInfo?.Skill != skillName) return HookResult.Continue; um.Recipients.Clear();
if (player!.Buttons.HasFlag(PlayerButtons.Speed) || player.Buttons.HasFlag(PlayerButtons.Duck))
{
um.Recipients.Clear();
return HookResult.Handled;
}
return HookResult.Continue;
}, HookMode.Pre);
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
@ -85,7 +59,7 @@ namespace jRandomSkills
playerPawn.VelocityModifier = 1; playerPawn.VelocityModifier = 1;
} }
private static void UpdateSpeed() public static void OnTick()
{ {
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
{ {

View file

@ -1,6 +1,5 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
@ -23,57 +22,24 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
Instance.RegisterListener<OnServerPrecacheResources>((ResourceManifest manifest) => manifest.AddResource(propModel));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundEnd>((@event, info) =>
{
SkillPlayerInfo.Clear();
barricades.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName) if (playerInfo?.Skill == skillName)
SkillPlayerInfo.Remove(player.SteamID); if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
return HookResult.Continue; UpdateHUD(player, skillInfo);
}); }
Instance.RegisterListener<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);
}
});
Instance.RegisterListener<OnServerPrecacheResources>((ResourceManifest manifest) =>
{
manifest.AddResource(propModel);
});
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
} }
public static void EnableSkill(CCSPlayerController player) 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<CEntityInstance>(0); CEntityInstance param = h.GetParam<CEntityInstance>(0);
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1); CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) 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 (string.IsNullOrEmpty(param.Entity.Name)) return;
if (!param.Entity.Name.StartsWith("FortniteWall")) return HookResult.Continue; if (!param.Entity.Name.StartsWith("FortniteWall")) return;
var box = param.As<CDynamicProp>(); var box = param.As<CDynamicProp>();
if (box == null || !box.IsValid) return HookResult.Continue; if (box == null || !box.IsValid) return;
box.EmitSound("Wood_Plank.BulletImpact", volume: 1f); box.EmitSound("Wood_Plank.BulletImpact", volume: 1f);
if (barricades.TryGetValue(box.Index, out int health)) if (barricades.TryGetValue(box.Index, out int health))
@ -175,7 +141,6 @@ namespace jRandomSkills
if (health <= 0) box.Remove(); if (health <= 0) box.Remove();
} }
else box.Remove(); else box.Remove();
return HookResult.Continue;
} }
public class PlayerSkillInfo public class PlayerSkillInfo

View file

@ -1,7 +1,6 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
@ -22,25 +21,21 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void NewRound()
{ {
bombHealth = maxBombHealth; bombHealth = maxBombHealth;
plantedC4 = null; plantedC4 = null;
triggerC4 = null; triggerC4 = null;
return HookResult.Continue; }
});
Instance.RegisterEventHandler<EventBombPlanted>((@event, info) => public static void BombPlanted(EventBombPlanted _)
{ {
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault(); var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
if (plantedBomb == null) return HookResult.Continue; if (plantedBomb == null) return;
plantedC4 = plantedBomb; plantedC4 = plantedBomb;
CreateTrigger(); CreateTrigger();
return HookResult.Continue;
});
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
} }
private static void CreateTrigger() private static void CreateTrigger()
@ -82,38 +77,37 @@ namespace jRandomSkills
SkillUtils.TerminateRound(CsTeam.CounterTerrorist); SkillUtils.TerminateRound(CsTeam.CounterTerrorist);
} }
private static HookResult OnTakeDamage(DynamicHook h) public static void OnTakeDamage(DynamicHook h)
{ {
CEntityInstance param = h.GetParam<CEntityInstance>(0); CEntityInstance param = h.GetParam<CEntityInstance>(0);
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1); CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) 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 attackerPawn = new(param2.Attacker.Value.Handle);
if (attackerPawn.DesignerName != "player" || param.DesignerName != "trigger_multiple") if (attackerPawn.DesignerName != "player" || param.DesignerName != "trigger_multiple")
return HookResult.Continue; return;
CTriggerMultiple trigger = new(param.Handle); CTriggerMultiple trigger = new(param.Handle);
if (attackerPawn == null || attackerPawn.Controller?.Value == null || trigger == null || !trigger.Globalname.StartsWith("planted_bomb_prop_")) 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<CCSPlayerController>(); CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); 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; bombHealth -= (int)param2.TotalledDamage;
if (bombHealth <= 0) if (bombHealth <= 0)
{ {
RemoveBomb(); RemoveBomb();
return HookResult.Continue; return;
} }
Server.PrintToChatAll($" {ChatColors.Gold}{Localization.GetTranslation("fragilebomb_bomb_health")}: {ChatColors.Red}{bombHealth}{ChatColors.Gold}/{ChatColors.Green}{maxBombHealth}"); 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) 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)

View file

@ -15,29 +15,27 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) => public static void PlayerHurt(EventPlayerHurt @event)
{ {
var damage = @event.DmgHealth; var damage = @event.DmgHealth;
var victim = @event.Userid; var victim = @event.Userid;
var attacker = @event.Attacker; var attacker = @event.Attacker;
var weapon = @event.Weapon; var weapon = @event.Weapon;
HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup; HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup;
if (nades.Contains(weapon)) return HookResult.Continue; if (nades.Contains(weapon)) return;
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); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
if (playerInfo?.Skill != skillName || attacker!.Team != victim!.Team) return HookResult.Continue; if (playerInfo?.Skill != skillName || attacker!.Team != victim!.Team) return;
Server.ExecuteCommand("mp_autokick 0"); Server.ExecuteCommand("mp_autokick 0");
var pawn = victim.PlayerPawn.Value; var pawn = victim.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid) return HookResult.Continue; if (pawn == null || !pawn.IsValid) return;
SkillUtils.AddHealth(pawn, damage + (int)(damage * healthMultiplier), pawn.MaxHealth); SkillUtils.AddHealth(pawn, damage + (int)(damage * healthMultiplier), pawn.MaxHealth);
return HookResult.Continue;
});
} }
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) 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)

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -18,64 +17,45 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundStart>((@event, info) => public static void NewRound()
{ {
decoys.Clear(); decoys.Clear();
return HookResult.Continue; }
});
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void DecoyStarted(EventDecoyStarted @event)
{ {
Instance.AddTimer(0.1f, () => 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; double modifier = Math.Clamp(distance / decoyRadius, 0f, 1f);
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); pawn.VelocityModifier = (float)Math.Pow(modifier, slownessMultiplier);
if (playerInfo?.Skill != skillName) continue;
EnableSkill(player);
} }
}); }
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventDecoyStarted>((@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<EventDecoyDetonate>((@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<OnTick>(() =>
{
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) public static void EnableSkill(CCSPlayerController player)

View file

@ -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<int>(skillName, "refreshPrice");
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(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<jSkill_SkillInfo> GetSkills(CCSPlayerController player)
{
var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (skillPlayer == null) return [Event.noneSkill];
List<jSkill_SkillInfo> 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;
}
}
}

View file

@ -6,7 +6,6 @@ using CounterStrikeSharp.API.Core.Attributes;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -14,8 +13,6 @@ namespace jRandomSkills
public class Ghost : ISkill public class Ghost : ISkill
{ {
private const Skills skillName = Skills.Ghost; private const Skills skillName = Skills.Ghost;
private static bool roundEnd = false;
private static bool exists = false;
private static readonly string[] disabledWeapons = private static readonly string[] disabledWeapons =
[ [
"weapon_deagle", "weapon_revolver", "weapon_glock", "weapon_usp_silencer", "weapon_deagle", "weapon_revolver", "weapon_glock", "weapon_usp_silencer",
@ -36,83 +33,34 @@ namespace jRandomSkills
return; return;
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void NewRound()
{ {
roundEnd = false; foreach (var player in Utilities.GetPlayers())
Instance.AddTimer(0.1f, () => SetWeaponAttack(player, false);
{ }
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 WeaponPickup(EventItemPickup @event)
}); {
var player = @event.Userid;
if (!Instance.IsPlayerValid(player)) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) => if (playerInfo?.Skill != skillName) return;
{ SetWeaponVisibility(player!, false);
foreach (var player in Utilities.GetPlayers()) SetWeaponAttack(player!, true);
{ }
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>(CheckTransmit);
exists = false;
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) => public static void WeaponEquip(EventItemEquip @event)
{ {
var player = @event.Userid; var player = @event.Userid;
if (player == null || !player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue; 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) return;
if (playerInfo?.Skill == skillName) SetWeaponVisibility(player!, false);
DisableSkill(player); SetWeaponAttack(player!, true);
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventItemPickup>((@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<EventItemEquip>((@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<EventRoundStart>((@event, info) =>
{
foreach (var player in Utilities.GetPlayers())
SetWeaponAttack(player, false);
return HookResult.Continue;
});
Instance.RegisterListener<OnTick>(OnTick);
} }
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
@ -129,10 +77,7 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
{ {
if (!exists) Event.enableTransmit = true;
Instance.RegisterListener<CheckTransmit>(CheckTransmit);
exists = true;
SetPlayerVisibility(player, false); SetPlayerVisibility(player, false);
SetWeaponVisibility(player, false); SetWeaponVisibility(player, false);
SetWeaponAttack(player, true); SetWeaponAttack(player, true);
@ -146,7 +91,7 @@ namespace jRandomSkills
invisibleEntities.Remove(player.SteamID); invisibleEntities.Remove(player.SteamID);
} }
private static void OnTick() public static void OnTick()
{ {
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
{ {
@ -207,7 +152,7 @@ namespace jRandomSkills
private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon) 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; var pawn = player?.PlayerPawn?.Value;
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return; if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return;

View file

@ -11,49 +11,26 @@ namespace jRandomSkills
public class Glaz : ISkill public class Glaz : ISkill
{ {
private const Skills skillName = Skills.Glaz; private const Skills skillName = Skills.Glaz;
private static bool exists = false;
private readonly static List<int> smokes = []; private readonly static List<int> smokes = [];
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, @info) => public static void NewRound()
{ {
smokes.Clear(); smokes.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); public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate @event)
if (playerInfo?.Skill == skillName) {
EnableSkill(player); smokes.Add(@event.Entityid);
} }
});
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventRoundEnd>((@event, @info) => public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event)
{ {
smokes.Clear(); smokes.Remove(@event.Entityid);
Instance.RemoveListener<Listeners.CheckTransmit>(CheckTransmit);
exists = false;
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventSmokegrenadeDetonate>((@event, @info) =>
{
smokes.Add(@event.Entityid);
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventSmokegrenadeExpired>((@event, @info) =>
{
smokes.Remove(@event.Entityid);
return HookResult.Continue;
});
} }
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
@ -74,9 +51,7 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
{ {
if (!exists) Event.enableTransmit = true;
Instance.RegisterListener<Listeners.CheckTransmit>(CheckTransmit);
exists = true;
SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade);
} }

View file

@ -14,30 +14,30 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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, () => if (!SkillUtils.HasMenu(player)) continue;
{ var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
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; 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<EventRoundEnd>((@event, info) => HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
{ SkillUtils.UpdateMenu(player, menuItems);
foreach (var player in glitchedPlayers) }
DisableSkill(player);
return HookResult.Continue;
});
} }
public static void TypeSkill(CCSPlayerController player, string[] commands) public static void TypeSkill(CCSPlayerController player, string[] commands)
@ -74,24 +74,21 @@ namespace jRandomSkills
if (playerInfo == null) return; if (playerInfo == null) return;
playerInfo.SkillChance = 0; playerInfo.SkillChance = 0;
SkillUtils.PrintToChat(player, Localization.GetTranslation("glitch") + ":", false); 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();
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();
if (enemies.Length > 0) if (enemies.Length > 0)
{ {
foreach (var enemy in enemies) HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); SkillUtils.CreateMenu(player, menuItems);
} }
else else
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
player.ReplicateConVar("sv_disable_radar", "0"); player.ReplicateConVar("sv_disable_radar", "0");
glitchedPlayers.Remove(player); 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) 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)

View file

@ -12,26 +12,26 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterListener<Listeners.OnEntitySpawned>(@event => public static void OnEntitySpawned(CEntityInstance entity)
{ {
var name = @event.DesignerName; var name = entity.DesignerName;
if (!name.EndsWith("_projectile")) if (!name.EndsWith("_projectile"))
return; return;
var grenade = @event.As<CBaseCSGrenadeProjectile>(); var grenade = entity.As<CBaseCSGrenadeProjectile>();
if (grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return; if (grenade.OwnerEntity.Value == null || !grenade.OwnerEntity.Value.IsValid) return;
var pawn = grenade.OwnerEntity.Value.As<CCSPlayerPawn>(); var pawn = grenade.OwnerEntity.Value.As<CCSPlayerPawn>();
if (pawn == null || !pawn.IsValid || pawn.Controller == null || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return; if (pawn == null || !pawn.IsValid || pawn.Controller == null || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return;
var player = pawn.Controller.Value.As<CCSPlayerController>(); var player = pawn.Controller.Value.As<CCSPlayerController>();
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return; if (playerInfo?.Skill != skillName) return;
grenade.Bounces = 555; 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) 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)

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -18,51 +17,11 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void NewRound()
{ {
Instance.AddTimer(0.1f, () => SkillPlayerInfo.Clear();
{
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<EventRoundEnd>((@event, info) =>
{
SkillPlayerInfo.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@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<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 EnableSkill(CCSPlayerController player) 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) public static void DisableSkill(CCSPlayerController player)
{ {
SkillPlayerInfo.Remove(player.SteamID); SkillPlayerInfo.Remove(player.SteamID);

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -18,84 +17,65 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundStart>((@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<CBaseCSGrenadeProjectile>();
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<CCSPlayerPawn>();
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<CCSPlayerController>();
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(); var smoke = entity.As<CSmokeGrenadeProjectile>();
return HookResult.Continue; smoke.SmokeColor.X = 0;
smoke.SmokeColor.Y = 255;
smoke.SmokeColor.Z = 0;
}); });
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void OnTick()
{ {
Instance.AddTimer(0.1f, () => foreach (Vector smokePos in smokes)
{ foreach (var player in Utilities.GetPlayers())
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 (!Instance.IsPlayerValid(player)) continue; if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= smokeRadius)
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); AddHealth(player.PlayerPawn.Value, smokeHeal);
if (playerInfo?.Skill != skillName) continue;
EnableSkill(player);
}
});
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventSmokegrenadeDetonate>((@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<EventSmokegrenadeExpired>((@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<OnEntitySpawned>(@event =>
{
var name = @event.DesignerName;
if (name != "smokegrenade_projectile") return;
var grenade = @event.As<CBaseCSGrenadeProjectile>();
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<CCSPlayerPawn>();
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<CCSPlayerController>();
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<CSmokeGrenadeProjectile>();
smoke.SmokeColor.X = 0;
smoke.SmokeColor.Y = 255;
smoke.SmokeColor.Z = 0;
});
});
Instance.RegisterListener<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) public static void EnableSkill(CCSPlayerController player)

View file

@ -11,41 +11,15 @@ namespace jRandomSkills
private const Skills skillName = Skills.Hermit; private const Skills skillName = Skills.Hermit;
private static readonly Dictionary<string, int> dictionary = new() private static readonly Dictionary<string, int> dictionary = new()
{ {
{ "weapon_glock", 120 }, { "weapon_glock", 120 }, { "weapon_usp_silencer", 24 }, { "weapon_hkp2000", 52 }, { "weapon_p250", 26 },
{ "weapon_usp_silencer", 24 }, { "weapon_cz75", 12 }, { "weapon_deagle", 35 }, { "weapon_fiveseven", 100 }, { "weapon_elite", 120 },
{ "weapon_hkp2000", 52 }, { "weapon_tec9", 90 }, { "weapon_revolver", 8 }, { "weapon_mac10", 100 }, { "weapon_mp9", 120 },
{ "weapon_p250", 26 }, { "weapon_mp7", 120 }, { "weapon_mp5", 120 }, { "weapon_mp5sd", 120 }, { "weapon_ump45", 100 },
{ "weapon_cz75", 12 }, { "weapon_p90", 100 }, { "weapon_bizon", 120 }, { "weapon_ak47", 90 }, { "weapon_m4a1", 90 },
{ "weapon_deagle", 35 }, { "weapon_m4a1_silencer", 80 }, { "weapon_galilar", 90 }, { "weapon_famas", 90 }, { "weapon_aug", 90 },
{ "weapon_fiveseven", 100 }, { "weapon_sg556", 90 }, { "weapon_ssg08", 90 }, { "weapon_awp", 30 }, { "weapon_scar20", 90 },
{ "weapon_elite", 120 }, { "weapon_g3sg1", 90 }, { "weapon_nova", 32 }, { "weapon_xm1014", 32 }, { "weapon_sawedoff", 32 },
{ "weapon_tec9", 90 }, { "weapon_mag7", 32 }, { "weapon_m249", 200 }, { "weapon_negev", 300 }
{ "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<string, int> maxReserveAmmo = dictionary; private static readonly Dictionary<string, int> maxReserveAmmo = dictionary;
@ -54,31 +28,29 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
var attacker = @event.Attacker;
if (!Instance.IsPlayerValid(attacker)) return HookResult.Continue;
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); public static void PlayerDeath(EventPlayerDeath @event)
if (attackerInfo?.Skill != skillName) return HookResult.Continue; {
var attacker = @event.Attacker;
if (!Instance.IsPlayerValid(attacker)) return;
var pawn = attacker!.PlayerPawn.Value; var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return HookResult.Continue; if (attackerInfo?.Skill != skillName) return;
var weapon = pawn.WeaponServices.ActiveWeapon.Value; var pawn = attacker!.PlayerPawn.Value;
if (weapon == null || !weapon.IsValid || weapon.VData == null) return HookResult.Continue; if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return;
var maxReserveAmmoClip = maxReserveAmmo.TryGetValue(weapon.DesignerName, out var reserve) ? reserve : 100; var weapon = pawn.WeaponServices.ActiveWeapon.Value;
weapon.Clip1 = weapon.VData.MaxClip1; if (weapon == null || !weapon.IsValid || weapon.VData == null) return;
weapon.ReserveAmmo.Fill(maxReserveAmmoClip);
Utilities.SetStateChanged(weapon, "CBasePlayerWeapon", "m_iClip1");
Utilities.SetStateChanged(weapon, "CBasePlayerWeapon", "m_pReserveAmmo");
SkillUtils.AddHealth(pawn, healthToAdd);
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) 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)

View file

@ -16,44 +16,28 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void OnEntitySpawned(CEntityInstance @event)
{
var name = @event.DesignerName;
if (!name.EndsWith("hegrenade_projectile"))
return;
Server.NextFrame(() =>
{ {
Instance.AddTimer(0.1f, () => var hegrenade = @event.As<CHEGrenadeProjectile>();
{ if (hegrenade == null || !hegrenade.IsValid) return;
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; var playerPawn = hegrenade.Thrower.Value;
}); if (playerPawn == null || !playerPawn.IsValid) return;
Instance.RegisterListener<Listeners.OnEntitySpawned>(@event => var player = Utilities.GetPlayers().FirstOrDefault(p => p.PlayerPawn.Index == playerPawn.Index);
{ var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
var name = @event.DesignerName; if (playerInfo?.Skill != skillName) return;
if (!name.EndsWith("hegrenade_projectile"))
return;
Server.NextFrame(() => hegrenade.Damage *= damageMultiplier;
{ hegrenade.DmgRadius *= damageRadiusMultiplier;
var hegrenade = @event.As<CHEGrenadeProjectile>();
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;
});
}); });
} }

View file

@ -16,25 +16,6 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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) public static void EnableSkill(CCSPlayerController player)

View file

@ -12,48 +12,38 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventWeaponFire>((@event, info) => public static void WeaponFire(EventWeaponFire @event)
{ {
var player = @event.Userid; 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) public static void GrenadeThrown(EventGrenadeThrown @event)
ApplyInfiniteAmmo(player!); {
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<EventGrenadeThrown>((@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); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
if (playerInfo?.Skill == skillName)
if (playerInfo?.Skill == skillName) ApplyInfiniteAmmo(player!);
player!.GiveNamedItem($"weapon_{@event.Weapon}");
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventWeaponReload>((@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;
});
} }
private static void ApplyInfiniteAmmo(CCSPlayerController player) private static void ApplyInfiniteAmmo(CCSPlayerController player)

View file

@ -18,39 +18,20 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundEnd>((@event, info) =>
{
foreach (var beams in stepBeams.Values)
foreach (var beam in beams)
if (beam != null && beam.IsValid)
beam.Remove();
stepBeams.Clear();
Instance.RemoveListener<Listeners.CheckTransmit>(CheckTransmit);
exists = false;
return HookResult.Continue;
});
Instance.RegisterListener<Listeners.OnTick>(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<Listeners.CheckTransmit>(CheckTransmit);
exists = false;
}
public static void OnTick()
{ {
if (Server.TickCount % 8 != 0) return; if (Server.TickCount % 8 != 0) return;
foreach (var step in stepBeams.ToList()) foreach (var step in stepBeams.ToList())

View file

@ -15,30 +15,31 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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, () => if (!SkillUtils.HasMenu(player)) continue;
{ var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
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; 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<EventRoundEnd>((@event, info) => HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
{ SkillUtils.UpdateMenu(player, menuItems);
foreach (var player in jammedPlayers) }
SetCrosshair(player, true);
jammedPlayers.Clear();
return HookResult.Continue;
});
} }
public static void TypeSkill(CCSPlayerController player, string[] commands) public static void TypeSkill(CCSPlayerController player, string[] commands)
@ -85,24 +86,21 @@ namespace jRandomSkills
if (playerInfo == null) return; if (playerInfo == null) return;
playerInfo.SkillChance = 0; playerInfo.SkillChance = 0;
SkillUtils.PrintToChat(player, Localization.GetTranslation("jammer") + ":", false); 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();
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();
if (enemies.Length > 0) if (enemies.Length > 0)
{ {
foreach (var enemy in enemies) HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); SkillUtils.CreateMenu(player, menuItems);
} }
else else
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
SetCrosshair(player, true); SetCrosshair(player, true);
jammedPlayers.Remove(player); 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) 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)

View file

@ -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<float>(skillName, "minTime");
private static readonly float maxTime = Config.GetValue<float>(skillName, "maxTime");
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(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 = $"<font class='fontSize-l' class='fontWeight-Bold' color='#FFFFFF'>{Localization.GetTranslation("your_skill")}:</font> <br>";
string skillLine = $"<font class='fontSize-l' class='fontWeight-Bold' color='{skillData.Color}'>{skillData.Name}</font> <br>";
string remainingLine = $"<font class='fontSize-m' color='#FFFFFF'>{Localization.GetTranslation("jester_mode")}: <font color='{(jesterMode ? "#00ff00" : "#ff0000")}'>{Localization.GetTranslation(jesterMode ? "jester_on" : "jester_off")}</font></font> <br>";
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;
}
}
}

View file

@ -10,54 +10,50 @@ namespace jRandomSkills
public class JumpBan : ISkill public class JumpBan : ISkill
{ {
private const Skills skillName = Skills.JumpBan; private const Skills skillName = Skills.JumpBan;
private static readonly Dictionary<CCSPlayerPawn, int> bannedPlayers = []; public static readonly Dictionary<CCSPlayerPawn, int> bannedPlayers = [];
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundEnd>((@event, info) =>
{
bannedPlayers.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerJump>((@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<Listeners.OnTick>(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) foreach (var item in bannedPlayers)
{ {
var pawn = item.Key; var pawn = item.Key;
var time = item.Value; var time = item.Value;
if (time > Server.TickCount) 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; if (playerInfo == null) return;
playerInfo.SkillChance = 0; playerInfo.SkillChance = 0;
SkillUtils.PrintToChat(player, Localization.GetTranslation("jumpban") + ":", false); 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();
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();
if (enemies.Length > 0) if (enemies.Length > 0)
{ {
foreach (var enemy in enemies) HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); SkillUtils.CreateMenu(player, menuItems);
} }
else else
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
bannedPlayers.Remove(player.PlayerPawn.Value); 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) 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)

View file

@ -13,17 +13,15 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventPlayerJump>((@event, info) => public static void PlayerJump(EventPlayerJump @event)
{ {
var player = @event.Userid; var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue; if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return HookResult.Continue; if (playerInfo?.Skill != skillName) return;
SkillUtils.AddHealth(player.PlayerPawn.Value, addHealth);
SkillUtils.AddHealth(player.PlayerPawn.Value, addHealth);
return HookResult.Continue;
});
} }
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) 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)

View file

@ -3,6 +3,7 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using Microsoft.Extensions.Logging;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -15,37 +16,19 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void PlayerBlind(EventPlayerBlind @event)
{ {
Instance.AddTimer(0.1f, () => var player = @event.Userid;
{ var attacker = @event.Attacker;
foreach (var player in Utilities.GetPlayers()) if (!Instance.IsPlayerValid(player) || !Instance.IsPlayerValid(attacker)) return;
{
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; var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
}); var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
Instance.RegisterEventHandler<EventPlayerBlind>((@event, info) => if (attackerInfo?.Skill == skillName && playerInfo?.Skill != Skills.AntyFlash && player!.PlayerPawn.Value!.FlashDuration >= flashDuration)
{ player?.PlayerPawn?.Value?.CommitSuicide(false, true);
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;
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -13,23 +13,29 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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);
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; 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) public static void TypeSkill(CCSPlayerController player, string[] commands)
@ -65,18 +71,14 @@ namespace jRandomSkills
if (playerInfo == null) return; if (playerInfo == null) return;
playerInfo.SkillChance = 0; playerInfo.SkillChance = 0;
SkillUtils.PrintToChat(player, Localization.GetTranslation("lifeswap") + ":", false); 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();
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();
if (enemies.Length > 0) if (enemies.Length > 0)
{ {
foreach (var enemy in enemies) HashSet<(string, string)> menuItems = enemies.Select(e => ($"{e.PlayerName} : {e.PawnHealth} HP", e.Index.ToString())).ToHashSet();
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); SkillUtils.CreateMenu(player, menuItems);
} }
else else
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
} }
private static void SwapHealth(CCSPlayerController player, CCSPlayerController enemy) private static void SwapHealth(CCSPlayerController player, CCSPlayerController enemy)
@ -92,6 +94,11 @@ namespace jRandomSkills
Utilities.SetStateChanged(enemyPawn, "CBaseEntity", "m_iHealth"); 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) 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)
{ {
} }

View file

@ -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.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using CS2TraceRay.Class; using CS2TraceRay.Class;
@ -16,52 +15,51 @@ namespace jRandomSkills
private const Skills skillName = Skills.LongKnife; private const Skills skillName = Skills.LongKnife;
private static readonly float maxDistance = Config.GetValue<float>(skillName, "maxDistance"); private static readonly float maxDistance = Config.GetValue<float>(skillName, "maxDistance");
public unsafe static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventWeaponFire>((@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; m_nObjectSetMask = 0xf,
if (!Instance.IsPlayerValid(player)) return HookResult.Continue; 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); filter.m_nHierarchyIds[0] = pawn.GetHierarchyId();
if (playerInfo?.Skill != skillName) return HookResult.Continue; filter.m_nHierarchyIds[1] = 0;
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
var pawn = player!.PlayerPawn.Value; if (!trace.HitPlayer(out CCSPlayerController? target) || target == null)
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null || pawn.WeaponServices == null) return HookResult.Continue; return;
var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value; if (target.Handle == player.Handle || target.PlayerPawn.Value == null || !target.PlayerPawn.Value.IsValid || trace.Distance() <= 70) return;
if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_knife") return HookResult.Continue; target.PlayerPawn.Value.EmitSound("Player.DamageBody.Onlooker");
SkillUtils.TakeHealth(target.PlayerPawn.Value, Instance.Random.Next(21, 34));
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;
});
} }
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) 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)

View file

@ -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.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using CS2TraceRay.Class; using CS2TraceRay.Class;
@ -16,67 +15,50 @@ namespace jRandomSkills
private const Skills skillName = Skills.LongZeus; private const Skills skillName = Skills.LongZeus;
private static readonly float maxDistance = Config.GetValue<float>(skillName, "maxDistance"); private static readonly float maxDistance = Config.GetValue<float>(skillName, "maxDistance");
public unsafe static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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, () => m_nObjectSetMask = 0xf,
{ m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT,
foreach (var player in Utilities.GetPlayers()) m_nInteractsWith = pawn.GetInteractsWith(),
{ m_nInteractsExclude = 0,
if (!Instance.IsPlayerValid(player)) continue; m_nBits = 11,
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); m_bIterateEntities = true,
if (playerInfo?.Skill != skillName) continue; m_bHitTriggers = false,
EnableSkill(player); 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<EventWeaponFire>((@event, info) => if (!trace.HitPlayer(out CCSPlayerController? target) || target == null)
{ return;
var player = @event.Userid;
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); if (target.Handle == player.Handle) return;
if (playerInfo?.Skill != skillName) return HookResult.Continue; SkillUtils.TakeHealth(target.PlayerPawn.Value, 9999);
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;
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -15,30 +15,30 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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, () => if (!SkillUtils.HasMenu(player)) continue;
{ var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
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; 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<EventRoundEnd>((@event, info) => HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
{ SkillUtils.UpdateMenu(player, menuItems);
foreach (var player in playersFOV.Keys) }
DisableSkill(player);
return HookResult.Continue;
});
} }
public static void TypeSkill(CCSPlayerController player, string[] commands) public static void TypeSkill(CCSPlayerController player, string[] commands)
@ -79,18 +79,14 @@ namespace jRandomSkills
if (playerInfo == null) return; if (playerInfo == null) return;
playerInfo.SkillChance = 0; playerInfo.SkillChance = 0;
SkillUtils.PrintToChat(player, Localization.GetTranslation("magnifier") + ":", false); 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();
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();
if (enemies.Length > 0) if (enemies.Length > 0)
{ {
foreach (var enemy in enemies) HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); SkillUtils.CreateMenu(player, menuItems);
} }
else else
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
@ -101,6 +97,7 @@ namespace jRandomSkills
Utilities.SetStateChanged(player, "CBasePlayerController", "m_iDesiredFOV"); Utilities.SetStateChanged(player, "CBasePlayerController", "m_iDesiredFOV");
} }
playersFOV.Remove(player); 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) 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)

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -19,49 +18,22 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundEnd>((@event, info) =>
{
SkillPlayerInfo.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName) if (playerInfo?.Skill == skillName)
SkillPlayerInfo.Remove(player.SteamID); if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
return HookResult.Continue; UpdateHUD(player, skillInfo);
}); }
Instance.RegisterListener<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 EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -13,23 +13,29 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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);
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; 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) public static void TypeSkill(CCSPlayerController player, string[] commands)
@ -65,19 +71,14 @@ namespace jRandomSkills
if (playerInfo == null) return; if (playerInfo == null) return;
playerInfo.SkillChance = 0; playerInfo.SkillChance = 0;
SkillUtils.PrintToChat(player, Localization.GetTranslation("moneyswap") + ":", false); 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();
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();
if (enemies.Length > 0) if (enemies.Length > 0)
{ {
foreach (var enemy in enemies) HashSet<(string, string)> menuItems = enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account)}$", e.Index.ToString())).ToHashSet();
if (enemy != null && enemy.IsValid && enemy.InGameMoneyServices != null) SkillUtils.CreateMenu(player, menuItems);
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: ${enemy.InGameMoneyServices.Account}");
} }
else else
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
} }
private static void SwapMoney(CCSPlayerController player, CCSPlayerController enemy) private static void SwapMoney(CCSPlayerController player, CCSPlayerController enemy)
@ -96,6 +97,11 @@ namespace jRandomSkills
Utilities.SetStateChanged(enemy, "CCSPlayerController", "m_pInGameMoneyServices"); 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) 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)
{ {
} }

View file

@ -1,7 +1,9 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using Microsoft.Extensions.Logging;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -15,18 +17,16 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
var player = @event.Userid;
if (!IsDeadPlayerValid(player)) return HookResult.Continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); public static void PlayerDeath(EventPlayerDeath @event)
if (playerInfo?.Skill == skillName) {
SpawnExplosion(player!); 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) private static void SpawnExplosion(CCSPlayerController player)

View file

@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Core.Attributes;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -12,7 +11,6 @@ namespace jRandomSkills
public class Ninja : ISkill public class Ninja : ISkill
{ {
private const Skills skillName = Skills.Ninja; private const Skills skillName = Skills.Ninja;
private static bool exists = false;
private static readonly float idlePercentInvisibility = Config.GetValue<float>(skillName, "idlePercentInvisibility"); private static readonly float idlePercentInvisibility = Config.GetValue<float>(skillName, "idlePercentInvisibility");
private static readonly float duckPercentInvisibility = Config.GetValue<float>(skillName, "duckPercentInvisibility"); private static readonly float duckPercentInvisibility = Config.GetValue<float>(skillName, "duckPercentInvisibility");
private static readonly float knifePercentInvisibility = Config.GetValue<float>(skillName, "knifePercentInvisibility"); private static readonly float knifePercentInvisibility = Config.GetValue<float>(skillName, "knifePercentInvisibility");
@ -22,83 +20,31 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void NewRound()
{ {
Instance.AddTimer(0.1f, () => invisibilityChanged.Clear();
{ }
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); public static void WeaponEquip(EventItemEquip @event)
if (playerInfo?.Skill != skillName) continue; {
EnableSkill(player); 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<EventRoundStart>((@event, info) => public static void WeaponPickup(EventItemPickup @event)
{ {
foreach (var player in Utilities.GetPlayers()) var player = @event.Userid;
DisableSkill(player); if (!Instance.IsPlayerValid(player)) return;
invisibilityChanged.Clear(); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) => if (playerInfo?.Skill != skillName) return;
{ UpdateNinja(player);
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<EventItemPickup>((@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<EventItemEquip>((@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<EventRoundEnd>((@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>(CheckTransmit);
exists = false;
return HookResult.Continue;
});
Instance.RegisterListener<OnTick>(OnTick);
} }
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) 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()) 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) Event.enableTransmit = true;
Instance.RegisterListener<CheckTransmit>(CheckTransmit);
exists = true;
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)

View file

@ -12,25 +12,20 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) => public static void PlayerHurt(EventPlayerHurt @event)
{ {
var damage = @event.DmgHealth; var damage = @event.DmgHealth;
var player = @event.Userid; var player = @event.Userid;
var weapon = @event.Weapon; var weapon = @event.Weapon;
if (!Instance.IsPlayerValid(player)) return HookResult.Continue; 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) return HookResult.Continue; if (playerInfo?.Skill != skillName) return;
if (weapon == "hegrenade" || weapon == "inferno") if (weapon == "hegrenade" || weapon == "inferno")
{ SkillUtils.AddHealth(player!.PlayerPawn.Value, damage);
SkillUtils.AddHealth(player!.PlayerPawn.Value, damage);
damage = 0;
return HookResult.Stop;
}
return HookResult.Continue;
});
} }
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) 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)

View file

@ -2,7 +2,6 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -14,43 +13,24 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundEnd>((@event, info) =>
{
Server.ExecuteCommand("weapon_accuracy_nospread 0");
return HookResult.Continue;
});
Instance.RegisterListener<OnTick>(OnTick);
} }
public static void EnableSkill(CCSPlayerController player) public static void NewRound()
{
Server.ExecuteCommand("weapon_accuracy_nospread 1");
}
public static void DisableSkill(CCSPlayerController player)
{ {
Server.ExecuteCommand("weapon_accuracy_nospread 0"); 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()) foreach (var player in Utilities.GetPlayers())
{ {

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -18,51 +17,22 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundEnd>((@event, info) =>
{
SkillPlayerInfo.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName) if (playerInfo?.Skill == skillName)
SkillPlayerInfo.Remove(player.SteamID); if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
UpdateHUD(player, skillInfo);
return HookResult.Continue; }
});
Instance.RegisterListener<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 EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -12,11 +12,8 @@ namespace jRandomSkills
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(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)
{
}
} }
} }
} }

View file

@ -1,5 +1,4 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
@ -14,35 +13,33 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(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<CEntityInstance>(0); CEntityInstance param = h.GetParam<CEntityInstance>(0);
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1); CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) 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 attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.Handle);
CCSPlayerPawn victimPawn = new CCSPlayerPawn(param.Handle); CCSPlayerPawn victimPawn = new CCSPlayerPawn(param.Handle);
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
return HookResult.Continue; return;
if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
return HookResult.Continue; return;
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>(); CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
CCSPlayerController victim = victimPawn.Controller.Value.As<CCSPlayerController>(); CCSPlayerController victim = victimPawn.Controller.Value.As<CCSPlayerController>();
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
if (playerInfo == null) return HookResult.Continue; if (playerInfo == null) return;
if (playerInfo.Skill == skillName && attacker.PawnIsAlive) if (playerInfo.Skill == skillName && attacker.PawnIsAlive)
param2.Damage = 1000f; param2.Damage = 1000f;
return HookResult.Changed;
} }
public class SkillConfig : Config.DefaultSkillInfo public class SkillConfig : Config.DefaultSkillInfo

View file

@ -13,23 +13,22 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) => public static void PlayerHurt(EventPlayerHurt @event)
{ {
var attacker = @event.Attacker; var attacker = @event.Attacker;
var victim = @event.Userid; var victim = @event.Userid;
int damage = @event.DmgHealth; int damage = @event.DmgHealth;
var hitgroup = (HitGroup_t)@event.Hitgroup; var hitgroup = (HitGroup_t)@event.Hitgroup;
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return;
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue; 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]; 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) if (hitgroup != HitGroup_t.HITGROUP_HEAD)
RestoreHealth(victim!, damage); RestoreHealth(victim!, damage);
return HookResult.Stop;
});
} }
private static void RestoreHealth(CCSPlayerController victim, float damage) private static void RestoreHealth(CCSPlayerController victim, float damage)

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -21,19 +20,17 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
}
Instance.RegisterListener<OnTick>(() =>
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 (!Instance.IsPlayerValid(player)) return; if (playerInfo?.Skill == skillName)
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); GiveAdditionalJump(player);
if (playerInfo?.Skill == skillName) }
{
GiveAdditionalJump(player);
}
}
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -1,4 +1,3 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
@ -14,42 +13,23 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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()) player.Respawn();
{ Instance.AddTimer(.2f, () => player.Respawn());
if (!IsDeadPlayerValid(player)) continue; SkillUtils.PrintToChat(player, Localization.GetTranslation("phoenix_respawn"), false); ;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) continue;
EnableSkill(player);
}
});
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@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); ;
}
} }
}
return HookResult.Continue;
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -17,42 +16,21 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventPlayerDeath>((@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); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName) if (playerInfo?.Skill == skillName)
PlayerPilotInfo.Remove(player.SteamID); HandlePilot(player);
}
return HookResult.Continue;
});
Instance.RegisterListener<OnTick>(() =>
{
foreach (var player in Utilities.GetPlayers())
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
HandlePilot(player);
}
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -16,33 +15,19 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundStart>((@event, @info) => public static void BombPlanted(EventBombPlanted @event)
{ {
foreach (var player in Utilities.GetPlayers()) var player = @event.Userid;
{ if (!Instance.IsPlayerValid(player)) return;
if (!Instance.IsPlayerValid(player)) continue;
Schema.SetSchemaValue<bool>(player!.PlayerPawn!.Value!.Handle, "CCSPlayerPawn", "m_bInBombZone", false);
}
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventBombPlanted>((@event, info) => var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
{ if (playerInfo?.Skill != skillName) return;
var player = @event.Userid;
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
if (playerInfo?.Skill != skillName) return HookResult.Continue; if (plantedBomb != null)
Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + extraC4BlowTime);
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
if (plantedBomb != null)
Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + extraC4BlowTime);
return HookResult.Continue;
});
Instance.RegisterListener<OnTick>(OnTick);
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
@ -51,7 +36,7 @@ namespace jRandomSkills
Schema.SetSchemaValue<bool>(player!.PlayerPawn.Value!.Handle, "CCSPlayerPawn", "m_bInBombZone", false); Schema.SetSchemaValue<bool>(player!.PlayerPawn.Value!.Handle, "CCSPlayerPawn", "m_bInBombZone", false);
} }
private static void OnTick() public static void OnTick()
{ {
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
{ {

View file

@ -17,41 +17,36 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundEnd>((@event, info) =>
{
foreach (var player in poisonedPlayers)
DisableSkill(player);
return HookResult.Continue;
});
Instance.RegisterListener<Listeners.OnTick>(OnTick);
} }
private static void OnTick() public static void NewRound()
{ {
if (Server.TickCount % (int)(64 * cooldown) != 0) return; poisonedPlayers.Clear();
foreach (var player in poisonedPlayers) }
public static void OnTick()
{
if (Server.TickCount % (int)(64 * cooldown) == 0)
{ {
var pawn = player.PlayerPawn.Value; foreach (var player in poisonedPlayers)
if (pawn == null || !pawn.IsValid) continue; {
SkillUtils.TakeHealth(pawn, healthToDamage); 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; if (playerInfo == null) return;
playerInfo.SkillChance = 0; playerInfo.SkillChance = 0;
SkillUtils.PrintToChat(player, Localization.GetTranslation("poison") + ":", false); 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();
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();
if (enemies.Length > 0) if (enemies.Length > 0)
{ {
foreach (var enemy in enemies) HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); SkillUtils.CreateMenu(player, menuItems);
} }
else else
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
poisonedPlayers.Remove(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) 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)

View file

@ -20,38 +20,38 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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, () => if (!SkillUtils.HasMenu(player)) continue;
{ var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
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; 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<EventRoundEnd>((@event, info) => HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
{ SkillUtils.UpdateMenu(player, menuItems);
bannedPlayers.Clear(); }
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventItemEquip>((@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;
});
} }
public static void TypeSkill(CCSPlayerController player, string[] commands) public static void TypeSkill(CCSPlayerController player, string[] commands)
@ -98,23 +98,20 @@ namespace jRandomSkills
if (playerInfo == null) return; if (playerInfo == null) return;
playerInfo.SkillChance = 0; playerInfo.SkillChance = 0;
SkillUtils.PrintToChat(player, Localization.GetTranslation("primaryban") + ":", false); 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();
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();
if (enemies.Length > 0) if (enemies.Length > 0)
{ {
foreach (var enemy in enemies) HashSet<(string, string)> menuItems = enemies.Select(e => (e.PlayerName, e.Index.ToString())).ToHashSet();
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}"); SkillUtils.CreateMenu(player, menuItems);
} }
else else
player.PrintToChat($" {ChatColors.Red}⠀⠀⠀{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}"); player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("selectplayerskill_command")} {ChatColors.Red}index");
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
bannedPlayers.Remove(player.SteamID); 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) 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)

View file

@ -13,23 +13,22 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) => public static void PlayerHurt(EventPlayerHurt @event)
{ {
var attacker = @event.Attacker; var attacker = @event.Attacker;
var victim = @event.Userid; var victim = @event.Userid;
int damage = @event.DmgHealth; int damage = @event.DmgHealth;
var hitgroup = (HitGroup_t)@event.Hitgroup; var hitgroup = (HitGroup_t)@event.Hitgroup;
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return;
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue; 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]; HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG];
if (disabledHitbox.Contains(hitgroup)) if (disabledHitbox.Contains(hitgroup))
RestoreHealth(victim!, damage); RestoreHealth(victim!, damage);
return HookResult.Stop;
});
} }
private static void RestoreHealth(CCSPlayerController victim, float damage) private static void RestoreHealth(CCSPlayerController victim, float damage)

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -20,90 +19,70 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<CPlantedC4>("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()) info.Defusing = false;
{ info.DefusingTime = defusingTime;
if (!Instance.IsPlayerValid(player)) continue; continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) continue;
EnableSkill(player);
}
});
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
{
SkillPlayerInfo.Clear();
bombLocation = null;
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@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<EventBombPlanted>((@event, info) =>
{
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
if (plantedBomb != null)
bombLocation = plantedBomb.AbsOrigin;
return HookResult.Continue;
});
Instance.RegisterListener<OnTick>(() =>
{
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<CPlantedC4>("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<CCSPlayerController>(), info);
} }
});
if (!info.Defusing)
player.EmitSound("c4.disarmstart");
info.Defusing = true;
info.DefusingTime -= (1f / tickRate);
if (info.DefusingTime <= 0)
{
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("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<CCSPlayerController>(), info);
}
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -1,4 +1,3 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
@ -16,42 +15,23 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"), false);
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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)
{ PushEnemy(victim, attacker!.PlayerPawn.Value!.EyeAngles);
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<EventPlayerHurt>((@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;
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -15,36 +15,19 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => public static void PlayerHurt(EventPlayerHurt @event)
{ {
Instance.AddTimer(0.1f, () => var victim = @event.Userid;
{ int damage = @event.DmgHealth;
foreach (var player in Utilities.GetPlayers()) string weapon = @event.Weapon;
{
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; 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<EventPlayerHurt>((@event, info) => RestoreHealth(victim!, damage * regenerationMultiplier);
{
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;
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -2,7 +2,6 @@
using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -14,10 +13,9 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
Instance.RegisterListener<OnTick>(OnTick);
} }
private static void OnTick() public static void OnTick()
{ {
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
{ {

View file

@ -2,7 +2,6 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -14,10 +13,9 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
Instance.RegisterListener<OnTick>(CheckRadarowiec);
} }
private static void CheckRadarowiec() public static void OnTick()
{ {
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
{ {

View file

@ -15,21 +15,6 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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) public static void EnableSkill(CCSPlayerController player)

View file

@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using System.Collections.Immutable; using System.Collections.Immutable;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -26,51 +25,22 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundEnd>((@event, info) =>
{
SkillPlayerInfo.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName) if (playerInfo?.Skill == skillName)
SkillPlayerInfo.Remove(player.SteamID); if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
UpdateHUD(player, skillInfo);
return HookResult.Continue; }
});
Instance.RegisterListener<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 EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

View file

@ -16,51 +16,6 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
Instance.RegisterEventHandler<EventItemEquip>((@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<EventRoundStart>((@event, info) =>
{
foreach(var player in zombies)
DisableSkill(player);
zombies.Clear();
return HookResult.Stop;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@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) public static void EnableSkill(CCSPlayerController player)
@ -75,6 +30,47 @@ namespace jRandomSkills
SetPlayerColor(player.PlayerPawn.Value, true); 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) private static void SetPlayerColor(CCSPlayerPawn pawn, bool normal)
{ {
var color = normal ? Color.FromArgb(255, 255, 255, 255) : Color.FromArgb(255, 255, 0, 0); var color = normal ? Color.FromArgb(255, 255, 255, 255) : Color.FromArgb(255, 255, 0, 0);

View file

@ -3,7 +3,6 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -17,68 +16,38 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, Config.GetValue<string>(skillName, "color"));
}
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@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<EventRoundEnd>((@event, info) =>
{
SkillPlayerInfo.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName) 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<OnTick>(() => if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return;
if (SkillPlayerInfo.TryGetValue(victim!.SteamID, out var skillInfo))
{ {
foreach (var player in Utilities.GetPlayers()) if (!victim.IsValid || !victim.PawnIsAlive || !skillInfo.CanUse) return;
{ skillInfo.CanUse = false;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); skillInfo.Cooldown = DateTime.Now;
if (playerInfo?.Skill == skillName) RestoreHealth(victim, damage);
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) }
UpdateHUD(player, skillInfo);
}
});
Instance.RegisterEventHandler<EventPlayerHurt>((@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;
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)

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