This commit is contained in:
Juzlus 2025-08-21 02:12:25 +02:00
parent e44af68309
commit 6b8988ade4
77 changed files with 3033 additions and 391 deletions

View file

@ -4,6 +4,7 @@
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@ -11,7 +12,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.305" /> <PackageReference Include="CounterStrikeSharp.API" Version="1.0.336" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup> </ItemGroup>

View file

@ -4,12 +4,15 @@ using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Commands;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using System;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
{ {
public static class Command public static class Command
{ {
private static bool gamePaused = false;
public static void Load() public static void Load()
{ {
var config = Config.config?.Settings; var config = Config.config?.Settings;
@ -18,7 +21,8 @@ namespace jRandomSkills
var commands = new Dictionary<IEnumerable<string>, (string description, CommandInfo.CommandCallback handler)> var commands = new Dictionary<IEnumerable<string>, (string description, CommandInfo.CommandCallback handler)>
{ {
{ SplitCommands(config.Set_Skill), ("Delete record", Command_SetSkill) }, { SplitCommands(config.Set_Skill), ("Delete record", Command_SetSkill) },
{ SplitCommands(config.SkillsList_Menu), ("Delete all records", Command_SkillsListMenu) } { SplitCommands(config.SkillsList_Menu), ("Delete all records", Command_SkillsListMenu) },
{ SplitCommands("t, useSkill"), ("Use/Type Skill", Command_UseTypeSkill) }
}; };
foreach (var commandPair in commands) foreach (var commandPair in commands)
@ -32,6 +36,9 @@ namespace jRandomSkills
Instance.AddCommand($"css_map", "", Command_ChangeMap); Instance.AddCommand($"css_map", "", Command_ChangeMap);
Instance.AddCommand($"css_console", "", Command_CustomCommand); Instance.AddCommand($"css_console", "", Command_CustomCommand);
Instance.AddCommand($"css_start", "", Command_StartGame); Instance.AddCommand($"css_start", "", Command_StartGame);
Instance.AddCommand($"css_swap", "", Command_Swap);
Instance.AddCommand($"css_shuffle", "", Command_Shuffle);
Instance.AddCommand($"css_pause", "", Command_Pause);
} }
private static IEnumerable<string> SplitCommands(string commands) private static IEnumerable<string> SplitCommands(string commands)
@ -47,6 +54,23 @@ namespace jRandomSkills
} }
} }
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)]
public static void Command_UseTypeSkill(CCSPlayerController? player, CommandInfo _)
{
if (player == null) return;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
var playerPawn = player.PlayerPawn.Value;
if (playerPawn?.CBodyComponent == null) return;
if (!player.IsValid || !player.PawnIsAlive) return;
string[] commands = _.ArgString.Trim().Split(" ", StringSplitOptions.RemoveEmptyEntries);
if (commands == null || commands.Length == 0)
Instance.SkillAction(playerInfo!.Skill.ToString(), "UseSkill", new object[] { player });
else
Instance.SkillAction(playerInfo!.Skill.ToString(), "TypeSkill", new object[] { player, commands });
}
[RequiresPermissions("@css/root")] [RequiresPermissions("@css/root")]
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)] [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)]
public static void Command_SetSkill(CCSPlayerController? player, CommandInfo command) public static void Command_SetSkill(CCSPlayerController? player, CommandInfo command)
@ -58,7 +82,15 @@ namespace jRandomSkills
if (command.ArgCount < 2) if (command.ArgCount < 2)
{ {
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
Utils.PrintToChat(player, Localization.GetTranslation("correct_form_setskill"), true); SkillUtils.PrintToChat(player, Localization.GetTranslation("correct_form_setskill"), true);
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
return;
}
if (players.Count == 0)
{
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
SkillUtils.PrintToChat(player, Localization.GetTranslation("player_not_found_setskill"), true);
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
return; return;
} }
@ -69,7 +101,7 @@ namespace jRandomSkills
if (skill == null) if (skill == null)
{ {
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
Utils.PrintToChat(player, Localization.GetTranslation("skill_not_found_setskill"), true); SkillUtils.PrintToChat(player, Localization.GetTranslation("skill_not_found_setskill"), true);
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
return; return;
} }
@ -85,13 +117,13 @@ namespace jRandomSkills
Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", new object[] { target }); Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", new object[] { target });
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
Utils.PrintToChat(player, $"{Localization.GetTranslation("done_setskill")}: {ChatColors.LightRed}{skill.Name} {ChatColors.Lime}{Localization.GetTranslation("for_setskill")} {ChatColors.LightRed}{target.PlayerName}", false); SkillUtils.PrintToChat(player, $"{Localization.GetTranslation("done_setskill")}: {ChatColors.LightRed}{skill.Name} {ChatColors.Lime}{Localization.GetTranslation("for_setskill")} {ChatColors.LightRed}{target.PlayerName}", false);
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
} }
else else
{ {
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
Utils.PrintToChat(player, Localization.GetTranslation("error_setskill"), true); SkillUtils.PrintToChat(player, Localization.GetTranslation("error_setskill"), true);
player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――"); player.PrintToChat($" {ChatColors.Green}―――――――――――{ChatColors.DarkRed}◥◣◆◢◤{ChatColors.Green}―――――――――――");
} }
} }
@ -156,5 +188,39 @@ namespace jRandomSkills
string param = command.GetArg(1); string param = command.GetArg(1);
Server.ExecuteCommand(param); Server.ExecuteCommand(param);
} }
[RequiresPermissions("@css/root")]
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public static void Command_Swap(CCSPlayerController? _player, CommandInfo command)
{
foreach (var player in Utilities.GetPlayers())
if (Instance.IsPlayerValid(player) && new CsTeam[] { CsTeam.CounterTerrorist, CsTeam.Terrorist }.Contains(player.Team))
player.SwitchTeam(player.Team == CsTeam.Terrorist ? CsTeam.CounterTerrorist : CsTeam.Terrorist);
Server.ExecuteCommand($"mp_restartgame 1");
}
[RequiresPermissions("@css/root")]
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public static void Command_Shuffle(CCSPlayerController? _player, CommandInfo command)
{
var players = Utilities.GetPlayers().FindAll(p => (Instance.IsPlayerValid(p) && new CsTeam[] { CsTeam.CounterTerrorist, CsTeam.Terrorist }.Contains(p.Team)));
double CTlimit = Instance.Random.Next(0, 2) == 0 ? Math.Floor(players.Count / 2.0) : Math.Ceiling(players.Count / 2.0);
foreach (var player in players.OrderBy(_ => Instance.Random.Next()).ToList())
{
player?.SwitchTeam(CTlimit > 0 ? CsTeam.CounterTerrorist : CsTeam.Terrorist);
CTlimit--;
}
Server.ExecuteCommand($"mp_restartgame 1");
}
[RequiresPermissions("@css/root")]
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
public static void Command_Pause(CCSPlayerController? player, CommandInfo command)
{
Server.PrintToChatAll($" {(gamePaused ? ChatColors.Green : ChatColors.Red)}{Localization.GetTranslation(gamePaused ? "unpause" : "pause")}");
Server.ExecuteCommand( gamePaused ? "mp_unpause_match" : "mp_pause_match");
gamePaused = !gamePaused;
}
} }
} }

View file

@ -18,7 +18,7 @@ namespace jRandomSkills
public override string ModuleName => "[CS2] [ jRandomSkills ]"; public override string ModuleName => "[CS2] [ jRandomSkills ]";
public override string ModuleAuthor => "D3X, Juzlus"; public override string ModuleAuthor => "D3X, Juzlus";
public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus."; public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus.";
public override string ModuleVersion => "1.0.3"; public override string ModuleVersion => "1.0.4";
public override void Load(bool hotReload) public override void Load(bool hotReload)
{ {
@ -26,10 +26,23 @@ namespace jRandomSkills
Config.Initialize(); Config.Initialize();
Localization.Load(); Localization.Load();
// Debug.Load();
Event.Load(); Event.Load();
PlayerOnTick.Load(); PlayerOnTick.Load();
Command.Load(); Command.Load();
None.LoadSkill();
// -> Mute.LoadSkill();;
// -> ToxicSmoke.LoadSkill();
// Shade.LoadSkill();
// FrozenDecoy.LoadSkill();
// Medic.LoadSkill();
return;
foreach (var skill in Enum.GetValues(typeof(Skills))) foreach (var skill in Enum.GetValues(typeof(Skills)))
SkillAction(skill.ToString(), "LoadSkill"); SkillAction(skill.ToString(), "LoadSkill");
} }
@ -53,7 +66,7 @@ namespace jRandomSkills
throw new NotImplementedException(); throw new NotImplementedException();
} }
internal void RegisterListener<T>(Action<object, object> value) internal void RegisterListener<T>(Action<object, object> value, HookMode pre)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }
@ -79,6 +92,7 @@ namespace jRandomSkills
public required ulong SteamID { get; set; } public required ulong SteamID { get; set; }
public required string PlayerName { get; set; } public required string PlayerName { get; set; }
public Skills Skill { get; set; } public Skills Skill { get; set; }
public Skills SpecialSkill { get; set; }
public float? SkillChance { get; set; } public float? SkillChance { get; set; }
public bool IsDrawing { get; set; } public bool IsDrawing { get; set; }
} }

View file

@ -1,66 +1,200 @@
{ {
"none": "Brak",
"none_desc": "Nie posiadasz żadnej supermocy", "none_desc": "Nie posiadasz żadnej supermocy",
"aimbot": "Aimbot",
"aimbot_desc": "Każdy twój trafiony pocisk jest liczony jako głowa", "aimbot_desc": "Każdy twój trafiony pocisk jest liczony jako głowa",
"antyflash": "Anty Flash",
"antyflash_desc": "Posiadasz odporność na flashe i 7 sekund trwają twoje flash'e", "antyflash_desc": "Posiadasz odporność na flashe i 7 sekund trwają twoje flash'e",
"astronaut": "Astronauta",
"astronaut_desc": "Otrzymujesz losową ilość grawitacji na start rundy", "astronaut_desc": "Otrzymujesz losową ilość grawitacji na start rundy",
"astronaut_desc2": "Twoja losowa grawitacja wynosi: {0}x", "astronaut_desc2": "Twoja losowa grawitacja wynosi: {0}x",
"richboy": "Bogacz",
"richboy_desc": "Otrzymujesz losową ilość kasy na start rundy", "richboy_desc": "Otrzymujesz losową ilość kasy na start rundy",
"bunnyhop": "Królik",
"bunnyhop_desc": "Otrzymujesz auto \"BunnyHopa\"", "bunnyhop_desc": "Otrzymujesz auto \"BunnyHopa\"",
"silent": "Cichociemny",
"silent_desc": "Twoje kroki i skoki są niesłyszalne dla INNYCH graczy", "silent_desc": "Twoje kroki i skoki są niesłyszalne dla INNYCH graczy",
"shade": "Cień",
"shade_desc": "Teleportujesz się za plecy trafionego wroga", "shade_desc": "Teleportujesz się za plecy trafionego wroga",
"dracula": "Drakula",
"dracula_desc": "Po trafieniu ofiary otrzymujesz zwrot zdrowia w postaci danego procentu zadanych obrażeń", "dracula_desc": "Po trafieniu ofiary otrzymujesz zwrot zdrowia w postaci danego procentu zadanych obrażeń",
"ghost": "Duszek",
"ghost_desc": "Jesteś całkowicie niewidzialny", "ghost_desc": "Jesteś całkowicie niewidzialny",
"flash": "Flash",
"flash_desc": "Losowa prędkośc postaci na początku rundy", "flash_desc": "Losowa prędkośc postaci na początku rundy",
"flash_desc2": "Twój mnożnik prędkości to {0}x", "flash_desc2": "Twój mnożnik prędkości to {0}x",
"godmode": "Nieśmiertelność",
"godmode_desc": "Jesteś nieśmiertelny przez 2 sekundy. Kliknij [css_useSkill], cooldown 30s", "godmode_desc": "Jesteś nieśmiertelny przez 2 sekundy. Kliknij [css_useSkill], cooldown 30s",
"godmode_on": "Nieśmiertelność włączona", "godmode_on": "Nieśmiertelność włączona",
"godmode_off": "Nieśmiertelność wyłączona", "godmode_off": "Nieśmiertelność wyłączona",
"armored": "Gruby",
"armored_desc": "Masz losowy mnożnik otrzymywanych obrażeń", "armored_desc": "Masz losowy mnożnik otrzymywanych obrażeń",
"armored_desc2": "Twój mnożnik otrzymywanych obrażeń wynosi: {0}x", "armored_desc2": "Twój mnożnik otrzymywanych obrażeń wynosi: {0}x",
"muhammed": "Muhammed",
"muhammed_desc": "Po śmierci wybucha i zabija graczy w obrębie", "muhammed_desc": "Po śmierci wybucha i zabija graczy w obrębie",
"dwarf": "MiniMajk",
"dwarf_desc": "Losowa wielkość postaci na początku rundy", "dwarf_desc": "Losowa wielkość postaci na początku rundy",
"dwarf_desc2": "Twój mnożnik wielkości to {0}x", "dwarf_desc2": "Twój mnożnik wielkości to {0}x",
"medic": "Medyk",
"medic_desc": "Otrzymujesz losową ilość apteczek na start rundy", "medic_desc": "Otrzymujesz losową ilość apteczek na start rundy",
"randomweapon": "Losowa Broń",
"randomweapon_desc": "Dostajesz losową broń. Kliknij [css_useSkill], cooldown 15s", "randomweapon_desc": "Dostajesz losową broń. Kliknij [css_useSkill], cooldown 15s",
"chicken": "Kurczak",
"chicken_desc": "Otrzymujesz model kurczaka + jesteś o 10% szybszy - 50hp", "chicken_desc": "Otrzymujesz model kurczaka + jesteś o 10% szybszy - 50hp",
"impostor": "Szpieg",
"impostor_desc": "Otrzymujesz na start rundy model postaci wroga", "impostor_desc": "Otrzymujesz na start rundy model postaci wroga",
"catapult": "Katapulta",
"catapult_desc": "Masz losową szanse na podrzucenie wroga", "catapult_desc": "Masz losową szanse na podrzucenie wroga",
"catapult_desc2": "Twoje szanse na podrzucenie wroga po trafieniu to: {0}%", "catapult_desc2": "Twoje szanse na podrzucenie wroga po trafieniu to: {0}%",
"infiniteammo": "Nieskończone Ammo",
"infiniteammo_desc": "Otrzymujesz nieskończoną ilość ammo do wszystkich swoich broni", "infiniteammo_desc": "Otrzymujesz nieskończoną ilość ammo do wszystkich swoich broni",
"behind": "Obrót Wroga",
"behind_desc": "Masz losową szanse na obrócenie wroga o 180 stopni po trafieniu", "behind_desc": "Masz losową szanse na obrócenie wroga o 180 stopni po trafieniu",
"behind_desc2": "Twoje szanse na obrócenie wroga po trafieniu to: {0}%", "behind_desc2": "Twoje szanse na obrócenie wroga po trafieniu to: {0}%",
"retreat": "Odwrót",
"retreat_desc": "Powrót na spawna. Kliknij [css_useSkill], cooldown 15s", "retreat_desc": "Powrót na spawna. Kliknij [css_useSkill], cooldown 15s",
"oneshot": "Jednostrzałowiec",
"oneshot_desc": "Po trafieniu od razu zabija przeciwnika", "oneshot_desc": "Po trafieniu od razu zabija przeciwnika",
"paweljumper": "Pawel Jumper",
"paweljumper_desc": "Otrzymujesz dodatkowy skok", "paweljumper_desc": "Otrzymujesz dodatkowy skok",
"phoenix": "Phoenix",
"phoenix_desc": "Masz losową szans na odrodzenie się po śmierci", "phoenix_desc": "Masz losową szans na odrodzenie się po śmierci",
"phoenix_desc2": "Twoje szanse na odrodzenie się po śmierci: {0}%", "phoenix_desc2": "Twoje szanse na odrodzenie się po śmierci: {0}%",
"phoenix_respawn": "Zostałeś odrodzony z popiołów dzięki mocy: CHATCOLORS.REDPhoenix", "phoenix_respawn": "Zostałeś odrodzony z popiołów dzięki mocy: CHATCOLORS.REDPhoenix",
"pilot": "Pilot",
"pilot_desc": "Latanie przez określony czas. Przytrzymaj [USE - E], aby latać", "pilot_desc": "Latanie przez określony czas. Przytrzymaj [USE - E], aby latać",
"pilot_hud_info": "W trakcie odnawiania", "pilot_hud_info": "W trakcie odnawiania",
"radarhack": "Radarowiec",
"radarhack_desc": "Widzisz wrogów na radarze", "radarhack_desc": "Widzisz wrogów na radarze",
"rambo": "Rambo",
"rambo_desc": "Otrzymujesz losową ilość zdrowia na start rundy", "rambo_desc": "Otrzymujesz losową ilość zdrowia na start rundy",
"enemyspawn": "Resp Wroga",
"enemyspawn_desc": "Teleportacja na spawn wroga. Kliknij [css_useSkill], cooldown 15s", "enemyspawn_desc": "Teleportacja na spawn wroga. Kliknij [css_useSkill], cooldown 15s",
"disarmament": "Rozbrojenie",
"disarmament_desc": "Masz losową szanse na wyrzucenie broni wroga po trafieniu", "disarmament_desc": "Masz losową szanse na wyrzucenie broni wroga po trafieniu",
"disarmament_desc2": "Twoje szanse na wyrzucenie broni wroga to: {0}%", "disarmament_desc2": "Twoje szanse na wyrzucenie broni wroga to: {0}%",
"planter": "Samowolka",
"planter_desc": "Możesz podłożyć bombę w dowolnym miejscu, czas detonacji bomby trwa 60s", "planter_desc": "Możesz podłożyć bombę w dowolnym miejscu, czas detonacji bomby trwa 60s",
"saper": "Saper",
"saper_desc": "Możesz szybciej podłożyć bombę oraz ją zdefować", "saper_desc": "Możesz szybciej podłożyć bombę oraz ją zdefować",
"timemanipulator": "Spowlnienie Czasu",
"timemanipulator_desc": "Spowolnienie czasu dla wszystkich na 6 sekundy. Kliknij [css_useSkill], cooldown 30s", "timemanipulator_desc": "Spowolnienie czasu dla wszystkich na 6 sekundy. Kliknij [css_useSkill], cooldown 30s",
"quickshot": "Szybkostrzelność",
"quickshot_desc": "Brak cooldown przy strzelaniu", "quickshot_desc": "Brak cooldown przy strzelaniu",
"teleporter": "Teleporter",
"teleporter_desc": "Zamieniasz się miejscami z trafionym wrogiem", "teleporter_desc": "Zamieniasz się miejscami z trafionym wrogiem",
"wallhack": "Wallhack",
"wallhack_desc": "Widzisz wrogów przez ściany", "wallhack_desc": "Widzisz wrogów przez ściany",
"killerflash": "Zabójczy Flash",
"killerflash_desc": "Każdy całkowicie oślepiony twoim granatem umiera (również ty)", "killerflash_desc": "Każdy całkowicie oślepiony twoim granatem umiera (również ty)",
"weaponsswap": "Zamiana Broni",
"weaponsswap_desc": "Zamieniasz się bronią z losowym wrogiem. Kliknij [css_useSkill], cooldown 30s", "weaponsswap_desc": "Zamieniasz się bronią z losowym wrogiem. Kliknij [css_useSkill], cooldown 30s",
"weaponsswap_hud_info2": "Nie posiadasz broni na zamiane", "weaponsswap_hud_info2": "Nie posiadasz broni na zamiane",
"hud_info_no_enemy": "Nie znaleziono przeciwnika", "hud_info_no_enemy": "Nie znaleziono przeciwnika",
"zeus": "Zeus",
"zeus_desc": "Zeus x27 natychmiastowo się odnawia", "zeus_desc": "Zeus x27 natychmiastowo się odnawia",
"frozendecoy": "Zamrażający Decoy",
"frozendecoy_desc": "Twój decoy zamraża wszystkich pobliskich graczy", "frozendecoy_desc": "Twój decoy zamraża wszystkich pobliskich graczy",
"antyhead": "Żelazna Głowa",
"antyhead_desc": "Nie otrzymujesz obrażeń w głowę", "antyhead_desc": "Nie otrzymujesz obrażeń w głowę",
"soldier": "Żołnierz",
"soldier_desc": "Masz losowy mnożnik obrażeń", "soldier_desc": "Masz losowy mnożnik obrażeń",
"soldier_desc2": "Twój mnożnik obrażeń wynosi: {0}x", "soldier_desc2": "Twój mnożnik obrażeń wynosi: {0}x",
"swapposition": "Zamiana Miejsc",
"swapposition_desc": "Zamiana miejscami z losowym wrogiem. Kliknij [css_useSkill], cooldown 30s", "swapposition_desc": "Zamiana miejscami z losowym wrogiem. Kliknij [css_useSkill], cooldown 30s",
"holyhandgrenade": "Święty granat ręczny",
"holyhandgrenade_desc": "Twoje granaty uderzeniowe mają podwójne obrażenia i zasięg",
"areareaper": "Niszczyciel stref",
"areareaper_desc": "Możesz wybrać strefę detonacji do dezaktywowania",
"areareaper_incorrect_site": "Nie znaleziono takiej strefy detonacji.",
"areareaper_no_site": "Nie znaleziono żadnej strefy detonacji.",
"areareaper_used_info": "Twoja moc została już wykorzystana.",
"areareaper_site_disabled": "Strefa detonacji {0} została dezaktywowana - nie można na nią podłożyć bomby!",
"areareaper_select_info": "Wybierz strefę detonacji, którą chcesz dezaktywować:",
"deactivator": "Deaktywator",
"deactivator_desc": "",
"deactivator_enemy_info": "Twoja supermoc została wyłączona.",
"deactivator_player_info": "Moc gracza '{0}' została wyłączona.",
"deactivator_select_info": "Wybierz gracza któremu chcesz wyłączyć supermoc:",
"glitch": "Glitch",
"jammer_enemy_info": "Twój radar został wyłączony.",
"glitch_desc": "Wyłącza radar wybranemu przeciwnikowi",
"glitch_player_info": "Radar gracza '{0}' został wyłączony.",
"glitch_select_info": "Wybierz gracza któremu chcesz wyłączyć radar:",
"jammer": "Zakłócacz",
"jammer_desc": "",
"jammer_enemy_info": "Twój celownik został wyłączony.",
"jammer_player_info": "Celownik gracza '{0}' została wyłączona.",
"jammer_select_info": "Wybierz gracza któremu chcesz wyłączyć celownik:",
"duplicator": "Duplikator",
"duplicator_desc": "",
"duplicator_player_info": "Moc gracza '{0}' została skopiowana.",
"duplicator_select_info": "Wybierz gracza od którego chcesz skopiować supermoc:",
"thief": "Złodziej",
"thief_desc": "",
"thief_enemy_info": "Twoja supermoc została ukradziona.",
"thief_player_info": "Moc gracza '{0}' została ukradziona.",
"thief_select_info": "Wybierz gracza któremu chcesz ukraść supermoc:",
"selectplayerskill_incorrect_enemy_index": "Nie znaleziono gracza o takim index'ie.",
"selectplayerskill_not_found": "Nie znaleziono graczy!",
"selectplayerskill_command": "Wpisz /t",
"pause": "Mecz został zapauzowany.",
"unpause": "Mecz został wznowiony.",
"welcome_message": "Witaj {PLAYER} na serwerze {SERVER_NAME}!\nAktualna wersja jRandomSkills: {VERSION} ({SKILLS_COUNT} supermocy).\n\nPierwotnie plugin stworzona przez:\n{AUTHOR1}\nZmodyfikowany i ulepszony przez:\n{AUTHOR2}", "welcome_message": "Witaj {PLAYER} na serwerze {SERVER_NAME}!\nAktualna wersja jRandomSkills: {VERSION} ({SKILLS_COUNT} supermocy).\n\nPierwotnie plugin stworzona przez:\n{AUTHOR1}\nZmodyfikowany i ulepszony przez:\n{AUTHOR2}",
"hud_info": "Poczekaj jeszcze {0} sekund", "hud_info": "Poczekaj jeszcze {0} sekund",
"disabled_weapon": "Nie możesz używać tej broni",
"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.",
"drawing_skill": "Losowanie mocy", "drawing_skill": "Losowanie mocy",
@ -75,53 +209,9 @@
"loading_map": "Ładowanie nowej mapy", "loading_map": "Ładowanie nowej mapy",
"skills_menu": "Lista Super Mocy", "skills_menu": "Lista Super Mocy",
"correct_form_setskill": "Poprawne użycie: CHATCOLORS.RED!setskill <nick> <supermoc>", "correct_form_setskill": "Poprawne użycie: CHATCOLORS.RED!setskill <nick> <supermoc>",
"player_not_found_setskill": "Nie znaleziono takiego CHATCOLORS.REDgracza",
"skill_not_found_setskill": "Nie znaleziono takiej CHATCOLORS.REDsupermocy", "skill_not_found_setskill": "Nie znaleziono takiej CHATCOLORS.REDsupermocy",
"error_setskill": "Nie udało się ustawić CHATCOLORS.REDsupermocy", "error_setskill": "Nie udało się ustawić CHATCOLORS.REDsupermocy",
"done_setskill": "Ustawiono Supermoc", "done_setskill": "Ustawiono Supermoc",
"for_setskill": "dla", "for_setskill": "dla"
"none": "Brak",
"dwarf": "MiniMajk",
"swapoosition": "Zamiana Miejsc",
"killerflash": "Zabójczy Flash",
"soldier": "Żołnierz",
"armored": "Gruby",
"aimbot": "Aimbot",
"retreat": "Odwrót",
"enemyspawn": "Resp Wroga",
"zeus": "Zeus",
"radarhack": "Radarowiec",
"quickshot": "Szybkostrzelność",
"planter": "Samowolka",
"silent": "Cichociemny",
"frozendecoy": "Zamrażający Decoy",
"timemanipulator": "Spowlnienie Czasu",
"godmode": "Nieśmiertelność",
"randomweapon": "Losowa Broń",
"weaponsswap": "Zamiana Broni",
"wallhack": "Wallhack",
"flash": "Flash",
"paweljumper": "Pawel Jumper",
"bunnyhop": "Królik",
"impostor": "Szpieg",
"oneshot": "Jednostrzałowiec",
"muhammed": "Muhammed",
"richboy": "Bogacz",
"rambo": "Rambo",
"medic": "Medyk",
"ghost": "Duszek",
"chicken": "Kurczak",
"astronaut": "Astronauta",
"disarmament": "Rozbrojenie",
"antyflash": "Anty Flash",
"behind": "Obrót Wroga",
"infiniteammo": "Nieskończone Ammo",
"catapult": "Katapulta",
"dracula": "Drakula",
"teleporter": "Teleporter",
"saper": "Saper",
"phoenix": "Phoenix",
"pilot": "Pilot",
"shade": "Cień",
"antyhead": "Żelazna Głowa"
} }

View file

@ -25,7 +25,7 @@ namespace jRandomSkills
string skillName = cleanSkillName.Replace($" ★ ", ""); string skillName = cleanSkillName.Replace($" ★ ", "");
int intValue = Array.IndexOf(SkillData.Skills.Select(r => r.Name).ToArray(), skillName); int intValue = Array.IndexOf(SkillData.Skills.Select(r => r.Name).ToArray(), skillName);
string skillDesc = SkillData.Skills[intValue].Description; string skillDesc = SkillData.Skills[intValue].Description;
Utils.PrintToChat(player, $"{ChatColors.DarkRed}{skillName}{ChatColors.Lime}: {skillDesc}", false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{skillName}{ChatColors.Lime}: {skillDesc}", false);
MenuManager.CloseActiveMenu(player); MenuManager.CloseActiveMenu(player);
}); });
} }

View file

@ -0,0 +1,135 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils;
using System.Numerics;
using System.Runtime.InteropServices;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public static class Debug
{
private static string sessionId;
public static void Load()
{
Debug.sessionId = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}";
Debug.WriteToDebug($"jRandomSkills v{Instance.ModuleVersion} loaded!");
Instance.RegisterEventHandler<EventPlayerConnectFull>((@event, info) =>
{
var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue;
Debug.WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} joined the game.");
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDisconnect>((@event, info) =>
{
var player = @event.Userid;
if (player == null || !player.IsValid) return HookResult.Continue;
Debug.WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} disconnected.");
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventRoundStart>((@event, info) =>
{
var teams = Utilities.FindAllEntitiesByDesignerName<CCSTeam>("cs_team_manager").Where(t => t != null).ToList();
var tTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.Terrorist);
var ctTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.CounterTerrorist);
Debug.WriteToDebug($"Round #{tTeam?.Score + ctTeam?.Score + 1} (CT {ctTeam?.Score} : {tTeam?.Score} TT) started.");
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{
Debug.WriteToDebug($"Freeze time ended.");
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
{
var teams = Utilities.FindAllEntitiesByDesignerName<CCSTeam>("cs_team_manager").Where(t => t != null).ToList();
var tTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.Terrorist);
var ctTeam = teams.FirstOrDefault(t => t.TeamNum == (int)CsTeam.CounterTerrorist);
Debug.WriteToDebug($"Round #{tTeam?.Score + ctTeam?.Score} (CT {ctTeam?.Score} : {tTeam?.Score} TT) ended.");
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
var victim = @event.Userid;
var attacker = @event.Attacker;
if (victim != null)
{
if (attacker != null)
Debug.WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} died from {(attacker.IsBot ? "bot" : "player")} {attacker.PlayerName}.");
else
Debug.WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} died.");
}
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventBombPlanted>((@event, info) =>
{
Debug.WriteToDebug($"Bomb planted.");
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventBombDefused>((@event, info) =>
{
Debug.WriteToDebug($"Bomb defused.");
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerShoot>((@event, info) =>
{
var player = @event.Userid;
Debug.WriteToDebug($"{(player.IsBot ? "Bot" : "Player")} {player.PlayerName} fired a shot.");
return HookResult.Continue;
});
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
}
private static HookResult OnTakeDamage(DynamicHook h)
{
CEntityInstance param = h.GetParam<CEntityInstance>(0);
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
return HookResult.Continue;
CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.Handle);
CCSPlayerPawn victimPawn = new CCSPlayerPawn(param.Handle);
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
return HookResult.Continue;
if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
return HookResult.Continue;
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
CCSPlayerController victim = victimPawn.Controller.Value.As<CCSPlayerController>();
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
if (playerInfo == null) return HookResult.Continue;
Debug.WriteToDebug($"{(victim.IsBot ? "Bot" : "Player")} {victim.PlayerName} took damage from {(attacker.IsBot ? "bot" : "player")} {attacker.PlayerName}.");
return HookResult.Continue;
}
public static void WriteToDebug(string message)
{
string filename = $"Debug_{sessionId}.txt";
string pluginFolder = Path.Combine(Server.GameDirectory, "csgo", "addons", "counterstrikesharp", "plugins", "jRandomSkills");
string debugFolder = Path.Combine(pluginFolder, "Debug");
string path = Path.Combine(debugFolder, filename);
Directory.CreateDirectory(debugFolder);
File.AppendAllText(path, $"[{DateTime.Now:dd.MM.yyyy HH:mm:ss}] {message}{Environment.NewLine}", System.Text.Encoding.UTF8);
}
}
}

View file

@ -5,15 +5,10 @@ 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 player) { }
{ public static void DisableSkill(CCSPlayerController player) { }
public static void UseSkill(CCSPlayerController player) { }
} public static void TypeSkill(CCSPlayerController player, string[] commands) { }
public static void DisableSkill(CCSPlayerController player)
{
}
} }
public enum Skills public enum Skills
@ -38,6 +33,27 @@ public enum Skills
RandomWeapon, RandomWeapon,
WeaponsSwap, WeaponsSwap,
Wallhack, Wallhack,
Mute,
HolyHandGrenade,
Replicator,
ToxicSmoke,
Deactivator,
Thief,
Duplicator,
AreaReaper,
Hermit,
RobinHood,
Jammer,
Glitch,
ReturnToSender,
ReactiveArmor,
OnlyHead,
Prosthesis,
SoundMaker,
Ninja,
C4Camouflage,
SecondLife,
NoRecoil,
Flash, Flash,
PawelJumper, PawelJumper,

View file

@ -24,6 +24,7 @@ namespace jRandomSkills
SteamID = player.SteamID, SteamID = player.SteamID,
PlayerName = player.PlayerName, PlayerName = player.PlayerName,
Skill = src.player.Skills.None, Skill = src.player.Skills.None,
SpecialSkill = Skills.None,
IsDrawing = false, IsDrawing = false,
SkillChance = 1, SkillChance = 1,
}); });
@ -84,11 +85,12 @@ namespace jRandomSkills
string skillsText = ""; string skillsText = "";
foreach (var _player in _players) foreach (var _player in _players)
{ {
var _playerSkill = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == _player.SteamID)?.Skill; var _playerSkill = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == _player.SteamID);
if (_playerSkill != null) if (_playerSkill != null)
{ {
var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == _playerSkill); var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == _playerSkill.Skill);
skillsText += $" {ChatColors.DarkRed}{_player.PlayerName}{ChatColors.Lime}: {skillInfo.Name}\n"; var specialSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == _playerSkill.SpecialSkill);
skillsText += $" {ChatColors.DarkRed}{_player.PlayerName}{ChatColors.Lime}: {(_playerSkill.SpecialSkill == Skills.None ? skillInfo.Name : $"{specialSkillInfo.Name} -> {skillInfo.Name}")}\n";
} }
} }
@ -123,9 +125,10 @@ namespace jRandomSkills
skillPlayer.IsDrawing = false; skillPlayer.IsDrawing = false;
List<dSkill_SkillInfo> skillList = new List<dSkill_SkillInfo>(SkillData.Skills); List<dSkill_SkillInfo> skillList = new List<dSkill_SkillInfo>(SkillData.Skills);
skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == src.player.Skills.None); skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None);
if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsBot).Count != 1) { if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsBot).Count != 1)
{
Config.SkillInfo[] skillsOnly1v1 = Config.config.SkillsInfo.Where(s => s.Only1v1).ToArray(); Config.SkillInfo[] skillsOnly1v1 = Config.config.SkillsInfo.Where(s => s.Only1v1).ToArray();
skillList.RemoveAll(s => skillsOnly1v1.Any(s2 => s2.Name == s.Skill.ToString())); skillList.RemoveAll(s => skillsOnly1v1.Any(s2 => s2.Name == s.Skill.ToString()));
} }
@ -139,9 +142,11 @@ namespace jRandomSkills
var randomSkill = skillList.Count == 0 ? new dSkill_SkillInfo(Skills.None, "#ffffff", false) : skillList[Instance.Random.Next(skillList.Count)]; var randomSkill = skillList.Count == 0 ? new dSkill_SkillInfo(Skills.None, "#ffffff", false) : skillList[Instance.Random.Next(skillList.Count)];
skillPlayer.Skill = randomSkill.Skill; skillPlayer.Skill = randomSkill.Skill;
skillPlayer.SpecialSkill = Skills.None;
Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{randomSkill.Name}\".");
if (randomSkill.Display) if (randomSkill.Display)
Utils.PrintToChat(player, $"{ChatColors.DarkRed}{randomSkill.Name}{ChatColors.Lime}: {randomSkill.Description}", false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{randomSkill.Name}{ChatColors.Lime}: {randomSkill.Description}", false);
if (Config.config.Settings.TeamMateSkillInfo) if (Config.config.Settings.TeamMateSkillInfo)
{ {
@ -159,7 +164,7 @@ namespace jRandomSkills
if (!string.IsNullOrEmpty(teammateSkills)) if (!string.IsNullOrEmpty(teammateSkills))
{ {
Utils.PrintToChat(player, $" {ChatColors.Lime}{Localization.GetTranslation("teammate_skills")}:", false); SkillUtils.PrintToChat(player, $" {ChatColors.Lime}{Localization.GetTranslation("teammate_skills")}:", false);
foreach (string text in teammateSkills.Split("\n")) foreach (string text in teammateSkills.Split("\n"))
if (!string.IsNullOrEmpty(text)) if (!string.IsNullOrEmpty(text))
player.PrintToChat(text); player.PrintToChat(text);
@ -172,6 +177,7 @@ namespace jRandomSkills
return HookResult.Continue; return HookResult.Continue;
}); });
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) => Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{ {
var victim = @event.Userid; var victim = @event.Userid;
@ -185,10 +191,11 @@ namespace jRandomSkills
if (attackerInfo != null) if (attackerInfo != null)
{ {
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.Skill); var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.Skill);
var specialSkillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.SpecialSkill);
string skillDesc = skillData?.Description; string skillDesc = skillData?.Description;
Utils.PrintToChat(victim, $"{Localization.GetTranslation("enemy_skill")} {ChatColors.DarkRed}{attacker.PlayerName}{ChatColors.Lime}:", false); SkillUtils.PrintToChat(victim, $"{Localization.GetTranslation("enemy_skill")} {ChatColors.DarkRed}{attacker.PlayerName}{ChatColors.Lime}:", false);
Utils.PrintToChat(victim, $"{ChatColors.DarkRed}{skillData.Name}{ChatColors.Lime} - {skillDesc}", false); SkillUtils.PrintToChat(victim, $"{ChatColors.DarkRed}{(attackerInfo.SpecialSkill == Skills.None ? skillData.Name : $"{specialSkillData.Name} -> {skillData.Name}")}{ChatColors.Lime} - {skillDesc}", false);
} }
} }

View file

@ -1,7 +1,9 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using jRandomSkills.src.player;
using jRandomSkills.src.utils; using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners; using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.Config;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -67,8 +69,11 @@ namespace jRandomSkills
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);
if (observeredPlayerSpecialSkillInfo == null) return;
infoLine = $"<font class='fontSize-l' class='fontWeight-Bold' color='#FFFFFF'>{Localization.GetTranslation("observer_skill")} {observeredPlayerSkill.PlayerName}:</font> <br>"; infoLine = $"<font class='fontSize-l' class='fontWeight-Bold' color='#FFFFFF'>{Localization.GetTranslation("observer_skill")} {observeredPlayerSkill.PlayerName}:</font> <br>";
skillLine = $"<font class='fontSize-l' class='fontWeight-Bold' color='{observeredPlayerSkillInfo.Color}'>{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,4 +1,5 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using jRandomSkills.src.player; using jRandomSkills.src.player;
@ -17,7 +18,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#ff0000"); SkillUtils.RegisterSkill(skillName, "#ff0000");
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
} }
@ -26,16 +27,16 @@ namespace jRandomSkills
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 || param2 == null || param2.Attacker == null) if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
return HookResult.Continue; return HookResult.Continue;
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 == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
return HookResult.Continue; return HookResult.Continue;
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
return HookResult.Continue; return HookResult.Continue;
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>(); CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
@ -46,7 +47,7 @@ namespace jRandomSkills
if (attacker.PawnIsAlive) if (attacker.PawnIsAlive)
{ {
IntPtr hitGroupPointer = Marshal.ReadIntPtr(param2.Handle, 0x78); IntPtr hitGroupPointer = Marshal.ReadIntPtr(param2.Handle, GameData.GetOffset("CTakeDamageInfo_HitGroup"));
if (hitGroupPointer != nint.Zero) if (hitGroupPointer != nint.Zero)
{ {
IntPtr hitGroupOffset = Marshal.ReadIntPtr(hitGroupPointer, 16); IntPtr hitGroupOffset = Marshal.ReadIntPtr(hitGroupPointer, 16);

View file

@ -13,7 +13,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#D6E6FF"); SkillUtils.RegisterSkill(skillName, "#D6E6FF");
Instance.RegisterEventHandler<EventPlayerBlind>((@event, info) => Instance.RegisterEventHandler<EventPlayerBlind>((@event, info) =>
{ {

View file

@ -13,7 +13,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#8B4513"); SkillUtils.RegisterSkill(skillName, "#8B4513");
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) => Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
{ {

View file

@ -0,0 +1,98 @@
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 AreaReaper : ISkill
{
private static Skills skillName = Skills.AreaReaper;
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, "#edf5b5", 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<EventRoundStart>((@event, info) =>
{
Instance.AddTimer(0.1f, () =>
{
EnableBombsite();
});
return HookResult.Continue;
});
}
public static void TypeSkill(CCSPlayerController player, string[] commands)
{
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;
}
int site = new string[]{ "A", "a" }.Contains(commands[0]) ? 0 : new string[] { "B", "b" }.Contains(commands[0]) ? 1 : -1;
if (site == -1) {
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("areareaper_incorrect_site")}");
return;
}
var bombTargets = Utilities.FindAllEntitiesByDesignerName<CBombTarget>("func_bomb_target").ToArray();
if (bombTargets.Length == 2)
{
bombTargets[site].AcceptInput("Disable");
playerInfo.SkillChance = 1;
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("areareaper_site_disabled", (site == 0 ? 'A' : 'B'))}");
}
else
player.PrintToChat($" {ChatColors.Red}{Localization.GetTranslation("areareaper_no_site")}");
}
public static void EnableSkill(CCSPlayerController player)
{
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
playerInfo.SkillChance = 0;
SkillUtils.PrintToChat(player, Localization.GetTranslation("areareaper") + ":", false);
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("areareaper_select_info")}");
player.PrintToChat($" {ChatColors.Green}· {ChatColors.Red}/t {ChatColors.Green}A");
player.PrintToChat($" {ChatColors.Green}· {ChatColors.Red}/t {ChatColors.Green}B");
}
public static void DisableSkill(CCSPlayerController player)
{
if (Instance.skillPlayer.FirstOrDefault(p => p.Skill == skillName) != null)
return;
EnableBombsite();
}
private static void EnableBombsite()
{
var bombTargets = Utilities.FindAllEntitiesByDesignerName<CBombTarget>("func_bomb_target");
foreach (var bombTarget in bombTargets)
bombTarget.AcceptInput("Enable");
}
}
}

View file

@ -18,7 +18,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#d1430a", false); SkillUtils.RegisterSkill(skillName, "#d1430a", false);
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
@ -50,7 +50,7 @@ namespace jRandomSkills
float newScale = (float)Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom; float newScale = (float)Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom;
playerInfo.SkillChance = newScale; playerInfo.SkillChance = newScale;
newScale = (float)Math.Round(newScale, 2); newScale = (float)Math.Round(newScale, 2);
Utils.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) private static HookResult OnTakeDamage(DynamicHook h)
@ -58,16 +58,16 @@ namespace jRandomSkills
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 || param2 == null || param2.Attacker == null) if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
return HookResult.Continue; return HookResult.Continue;
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 == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
return HookResult.Continue; return HookResult.Continue;
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
return HookResult.Continue; return HookResult.Continue;
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>(); CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();

View file

@ -16,7 +16,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#7E10AD", false); SkillUtils.RegisterSkill(skillName, "#7E10AD", false);
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -53,7 +53,7 @@ namespace jRandomSkills
if (skillConfig == null) return; if (skillConfig == null) return;
float gravityModifier = (float)Math.Round(Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom, 1); float gravityModifier = (float)Math.Round(Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom, 1);
Utils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("astronaut")}{ChatColors.Lime}: " + Localization.GetTranslation("astronaut_desc2", gravityModifier), false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("astronaut")}{ChatColors.Lime}: " + Localization.GetTranslation("astronaut_desc2", gravityModifier), false);
player.Pawn.Value.GravityScale = gravityModifier; player.Pawn.Value.GravityScale = gravityModifier;
} }
} }

View file

@ -16,7 +16,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#00FF00", false); SkillUtils.RegisterSkill(skillName, "#00FF00", false);
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -65,7 +65,7 @@ namespace jRandomSkills
playerInfo.SkillChance = newChance; playerInfo.SkillChance = newChance;
newChance = (float)Math.Round(newChance, 2) * 100; newChance = (float)Math.Round(newChance, 2) * 100;
newChance = (float)Math.Round(newChance); newChance = (float)Math.Round(newChance);
Utils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("behind")}{ChatColors.Lime}: " + Localization.GetTranslation("behind_desc2", newChance), false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("behind")}{ChatColors.Lime}: " + Localization.GetTranslation("behind_desc2", newChance), false);
} }
private static void RotateEnemy(CCSPlayerController player) private static void RotateEnemy(CCSPlayerController player)

View file

@ -18,7 +18,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#EB4034"); SkillUtils.RegisterSkill(skillName, "#EB4034");
Instance.RegisterListener<OnTick>(OnTick); Instance.RegisterListener<OnTick>(OnTick);
} }

View file

@ -0,0 +1,121 @@
using System.Drawing;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class C4Camouflage : ISkill
{
private static Skills skillName = Skills.C4Camouflage;
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#00911f");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{
Instance.AddTimer(0.1f, () =>
{
foreach (var player in Utilities.GetPlayers())
{
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<EventRoundEnd>((@event, info) =>
{
foreach (var player in Utilities.GetPlayers())
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;
});
}
public static void EnableSkill(CCSPlayerController player)
{
var activeWeapon = player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value;
if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_c4") return;
SetPlayerVisibility(player, false);
SetWeaponVisibility(player, false);
}
public static void DisableSkill(CCSPlayerController player)
{
SetPlayerVisibility(player, true);
SetWeaponVisibility(player, true);
}
private static void SetPlayerVisibility(CCSPlayerController player, bool enabled)
{
var playerPawn = player.PlayerPawn.Value;
if (playerPawn != null)
{
var color = Color.FromArgb(enabled ? 255 : 0, 255, 255, 255);
playerPawn.Render = color;
Utilities.SetStateChanged(playerPawn, "CBaseModelEntity", "m_clrRender");
}
}
private static void SetWeaponVisibility(CCSPlayerController player, bool enabled)
{
if (!Instance.IsPlayerValid(player)) return;
var playerPawn = player.PlayerPawn.Value;
var color = Color.FromArgb(enabled ? 255 : 0, 255, 255, 255);
foreach (var weapon in playerPawn.WeaponServices?.MyWeapons)
{
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
{
weapon.Value.Render = color;
Utilities.SetStateChanged(weapon.Value, "CBaseModelEntity", "m_clrRender");
}
}
}
}
}

View file

@ -16,7 +16,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#FF4500", false); SkillUtils.RegisterSkill(skillName, "#FF4500", false);
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -72,7 +72,7 @@ namespace jRandomSkills
playerInfo.SkillChance = newChance; playerInfo.SkillChance = newChance;
newChance = (float)Math.Round(newChance, 2) * 100; newChance = (float)Math.Round(newChance, 2) * 100;
newChance = (float)Math.Round(newChance); newChance = (float)Math.Round(newChance);
Utils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("catapult")}{ChatColors.Lime}: " + Localization.GetTranslation("catapult_desc2", newChance), false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("catapult")}{ChatColors.Lime}: " + Localization.GetTranslation("catapult_desc2", newChance), false);
} }
} }
} }

View file

@ -3,37 +3,51 @@ 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 jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners; using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
using jRandomSkills.src.utils;
namespace jRandomSkills namespace jRandomSkills
{ {
public class Chicken : ISkill public class Chicken : ISkill
{ {
private static Skills skillName = Skills.Chicken; private static Skills skillName = Skills.Chicken;
private static string[] pistols = private static string[] disabledWeapons =
{ {
"weapon_deagle", "weapon_ak47",
"weapon_revolver", "weapon_m4a4",
"weapon_glock", "weapon_m4a1",
"weapon_usp_silencer", "weapon_m4a1_silencer",
"weapon_cz75a", "weapon_famas",
"weapon_fiveseven", "weapon_galilar",
"weapon_p250", "weapon_aug",
"weapon_tec9", "weapon_sg553",
"weapon_elite", "weapon_mp9",
"weapon_hkp2000" "weapon_mac10",
"weapon_bizon",
"weapon_mp7",
"weapon_ump45",
"weapon_p90",
"weapon_mp5sd",
"weapon_ssg08",
"weapon_awp",
"weapon_scar20",
"weapon_g3sg1",
"weapon_nova",
"weapon_xm1014",
"weapon_mag7",
"weapon_sawedoff",
"weapon_m249",
"weapon_negev"
}; };
private static readonly string defaultCTModel = "characters/models/ctm_sas/ctm_sas.vmdl"; private static Dictionary<CCSPlayerController, CBaseModelEntity> chickens = new Dictionary<CCSPlayerController, CBaseModelEntity>();
private static readonly string defaultTModel = "characters/models/tm_phoenix_heavy/tm_phoenix_heavy.vmdl";
public static void LoadSkill() public static void LoadSkill()
{ {
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#FF8B42"); SkillUtils.RegisterSkill(skillName, "#FF8B42");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -52,6 +66,35 @@ namespace jRandomSkills
return HookResult.Continue; 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) continue;
DisableSkill(player);
}
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
DisableSkill(@event.Userid);
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventItemPickup>((@event, info) =>
{
var player = @event.Userid;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return HookResult.Continue;
SetWeaponAttack(player, true);
return HookResult.Continue;
});
Instance.RegisterListener<OnTick>(OnTick); Instance.RegisterListener<OnTick>(OnTick);
} }
@ -60,13 +103,21 @@ namespace jRandomSkills
var playerPawn = player.PlayerPawn?.Value; var playerPawn = player.PlayerPawn?.Value;
if (playerPawn != null) if (playerPawn != null)
{ {
SetPlayerModel(player, "models/chicken/chicken.vmdl");
playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().MaterialGroup.Value = (uint)Instance.Random.Next(1, 4);
playerPawn.VelocityModifier = 1.1f; playerPawn.VelocityModifier = 1.1f;
Utilities.SetStateChanged(player, "CCSPlayerPawn", "m_flVelocityModifier"); Utilities.SetStateChanged(player, "CCSPlayerPawn", "m_flVelocityModifier");
playerPawn.Health = 50; playerPawn.Health = 50;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth"); Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
playerPawn.CBodyComponent.SceneNode.Scale = 0.2f;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent");
playerPawn.Render = Color.FromArgb(0, 255, 255, 255);
playerPawn.ShadowStrength = 0.0f;
Utilities.SetStateChanged(playerPawn, "CBaseModelEntity", "m_clrRender");
SetWeaponAttack(player, true);
CreateChicken(player);
} }
} }
@ -75,45 +126,98 @@ namespace jRandomSkills
var playerPawn = player.PlayerPawn?.Value; var playerPawn = player.PlayerPawn?.Value;
if (playerPawn != null) if (playerPawn != null)
{ {
SetPlayerModel(player, player.Team == CsTeam.CounterTerrorist ? defaultCTModel : defaultTModel);
playerPawn.VelocityModifier = 1f; playerPawn.VelocityModifier = 1f;
Utilities.SetStateChanged(player, "CCSPlayerPawn", "m_flVelocityModifier"); Utilities.SetStateChanged(player, "CCSPlayerPawn", "m_flVelocityModifier");
playerPawn.Health += 50; playerPawn.Health += 50;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth"); Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
playerPawn.CBodyComponent.SceneNode.Scale = 1f;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent");
playerPawn.Render = Color.FromArgb(255, 255, 255, 255);
playerPawn.ShadowStrength = 1.0f;
Utilities.SetStateChanged(playerPawn, "CBaseModelEntity", "m_clrRender");
SetWeaponAttack(player, false);
}
foreach (var chicken in chickens)
{
if (chicken.Value != null && chicken.Value.IsValid)
chicken.Value.Remove();
chickens.Remove(chicken.Key);
} }
} }
private static void OnTick() private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon)
{ {
foreach (var player in Utilities.GetPlayers()) foreach (var weapon in player.Pawn.Value.WeaponServices?.MyWeapons)
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
if (disabledWeapons.Contains(weapon?.Value?.DesignerName))
{ {
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); weapon.Value.NextPrimaryAttackTick = disableWeapon ? int.MaxValue : Server.TickCount;
weapon.Value.NextSecondaryAttackTick = disableWeapon ? int.MaxValue : Server.TickCount;
if (playerInfo?.Skill == skillName) Utilities.SetStateChanged(weapon.Value, "CBasePlayerWeapon", "m_nNextPrimaryAttackTick");
{ Utilities.SetStateChanged(weapon.Value, "CBasePlayerWeapon", "m_nNextSecondaryAttackTick");
var activeWeapon = player.Pawn.Value.WeaponServices?.ActiveWeapon.Value;
if (activeWeapon != null && activeWeapon.IsValid && activeWeapon.Clip1 != 0 && !pistols.Contains(activeWeapon?.DesignerName))
{
activeWeapon.Clip1 = 0;
activeWeapon.Clip2 = 0;
}
}
} }
} }
public static void SetPlayerModel(CCSPlayerController player, string model) private static void CreateChicken(CCSPlayerController player)
{ {
var pawn = player.PlayerPawn?.Value; var playerPawn = player.PlayerPawn.Value;
if (pawn == null) return; var chickenModel = Utilities.CreateEntityByName<CDynamicProp>("prop_dynamic");
if (chickenModel == null)
return;
Vector pos = new Vector(0, 0, 0);
Server.NextFrame(() => chickenModel.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(chickenModel.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2));
chickenModel.SetModel("models/chicken/chicken.vmdl");
chickenModel.Render = Color.FromArgb(255, 255, 255, 255);
chickenModel.Teleport(pos, playerPawn.AbsRotation, null);
chickenModel.DispatchSpawn();
chickenModel.AcceptInput("InitializeSpawnFromWorld", playerPawn, playerPawn, "");
Utilities.SetStateChanged(chickenModel, "CBaseEntity", "m_CBodyComponent");
Instance.AddTimer(1f, () => chickens.TryAdd(player, chickenModel));
}
private static async void OnTick()
{ {
pawn.SetModel(model); foreach (var valuePair in chickens)
{
var player = valuePair.Key;
var chicken = valuePair.Value;
if (player == null || !player.IsValid) continue;
if (chicken == null && !chicken.IsValid) continue;
Color originalRender = pawn.Render; var pawn = player.Pawn.Value;
pawn.Render = Color.FromArgb(255, originalRender.R, originalRender.G, originalRender.B); if (pawn == null && !pawn.IsValid) continue;
});
float X = (float)Math.Round(pawn.AbsOrigin.X, 2);
float Y = (float)Math.Round(pawn.AbsOrigin.Y, 2);
float Z = (float)Math.Round(pawn.AbsOrigin.Z, 2);
Vector pos = new Vector(X, Y, Z);
if (chicken.AbsOrigin.X != pos.X || chicken.AbsOrigin.Y != pos.Y || chicken.AbsOrigin.Z != pos.Z)
chicken.Teleport(pos, pawn.AbsRotation, null);
UpdateHUD(player);
}
}
private static void UpdateHUD(CCSPlayerController player)
{
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == skillName);
if (skillData == null) return;
var weapon = player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value;
if (weapon == null || !disabledWeapons.Contains(weapon.DesignerName)) 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='#FF0000'>{Localization.GetTranslation("disabled_weapon")}</font> <br>";
var hudContent = infoLine + skillLine + remainingLine;
player.PrintToCenterHtml(hudContent);
} }
} }
} }

View file

@ -0,0 +1,121 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class Deactivator : ISkill
{
private static Skills skillName = Skills.Deactivator;
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#919191", 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 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)
{
if (player == null) return;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
var playerPawn = player.PlayerPawn.Value;
if (playerPawn?.CBodyComponent == null) return;
if (!player.IsValid || !player.PawnIsAlive) return;
string enemyId = commands[0];
var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId);
if (enemy == null)
{
player.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("selectplayerskill_incorrect_enemy_index"));
return;
}
DeacitvateSkill(player, enemy);
}
public static void EnableSkill(CCSPlayerController player)
{
SkillUtils.PrintToChat(player, Localization.GetTranslation("deactivator") + ":", false);
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("deactivator_select_info")}");
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot).ToArray();
if (enemies.Length > 0)
{
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);
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: {ChatColors.Red}{skillData.Name}");
}
}
else
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)
{
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
playerInfo.SpecialSkill = Skills.None;
}
private static void DeacitvateSkill(CCSPlayerController player, CCSPlayerController enemy)
{
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
var enemyInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
if (playerInfo != null)
{
playerInfo.Skill = Skills.None;
playerInfo.SpecialSkill = skillName;
player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("deactivator_player_info", enemy.PlayerName));
}
if (enemyInfo != null)
{
Instance.SkillAction(enemyInfo.Skill.ToString(), "DisableSkill", new object[] { enemy });
enemyInfo.SpecialSkill = enemyInfo.Skill;
enemyInfo.Skill = Skills.None;
enemy.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("deactivator_enemy_info"));
}
}
}
}

View file

@ -16,7 +16,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#FF4500", false); SkillUtils.RegisterSkill(skillName, "#FF4500", false);
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -72,7 +72,7 @@ namespace jRandomSkills
playerInfo.SkillChance = newChance; playerInfo.SkillChance = newChance;
newChance = (float)Math.Round(newChance, 2) * 100; newChance = (float)Math.Round(newChance, 2) * 100;
newChance = (float)Math.Round(newChance); newChance = (float)Math.Round(newChance);
Utils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("disarmament")}{ChatColors.Lime}: " + Localization.GetTranslation("disarmament_desc2", newChance), false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("disarmament")}{ChatColors.Lime}: " + Localization.GetTranslation("disarmament_desc2", newChance), false);
} }
} }
} }

View file

@ -14,7 +14,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#FA050D"); SkillUtils.RegisterSkill(skillName, "#FA050D");
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) => Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
{ {

View file

@ -0,0 +1,102 @@
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 Duplicator : ISkill
{
private static Skills skillName = Skills.Duplicator;
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#ffb73b", 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;
});
}
public static void TypeSkill(CCSPlayerController player, string[] commands)
{
if (player == null) return;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
var playerPawn = player.PlayerPawn.Value;
if (playerPawn?.CBodyComponent == null) return;
if (!player.IsValid || !player.PawnIsAlive) return;
string enemyId = commands[0];
var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Index.ToString() == enemyId);
if (enemy == null)
{
player.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("selectplayerskill_incorrect_enemy_index"));
return;
}
DuplicateSkill(player, enemy);
}
public static void EnableSkill(CCSPlayerController player)
{
SkillUtils.PrintToChat(player, Localization.GetTranslation("duplicator") + ":", false);
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("duplicator_select_info")}");
var enemies = Utilities.GetPlayers().Where(p => p != player && p.IsValid && !p.IsBot).ToArray();
if (enemies.Length > 0)
{
foreach (var enemy in enemies)
{
var enemyInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill);
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: {ChatColors.Red}{skillData.Name}");
}
}
else
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)
{
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
playerInfo.SpecialSkill = Skills.None;
}
private static void DuplicateSkill(CCSPlayerController player, CCSPlayerController enemy)
{
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
var enemyInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
if (playerInfo != null)
{
playerInfo.Skill = enemyInfo.Skill;
playerInfo.SpecialSkill = skillName;
Instance.SkillAction(enemyInfo.Skill.ToString(), "EnableSkill", new object[] { player });
player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("duplicator_player_info", enemy.PlayerName));
}
}
}
}

View file

@ -16,7 +16,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#ffff00", false); SkillUtils.RegisterSkill(skillName, "#ffff00", false);
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -49,6 +49,12 @@ namespace jRandomSkills
return HookResult.Continue; return HookResult.Continue;
}); });
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
DisableSkill(@event.Userid);
return HookResult.Continue;
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
@ -62,10 +68,11 @@ namespace jRandomSkills
float newSize = (float)Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom; float newSize = (float)Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom;
newSize = (float)Math.Round(newSize, 2); newSize = (float)Math.Round(newSize, 2);
playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = newSize; // playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = newSize;
player.PlayerPawn.Value.CBodyComponent.SceneNode.Scale = newSize;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent"); Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent");
Utils.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);
} }
} }
@ -74,7 +81,8 @@ namespace jRandomSkills
var playerPawn = player.PlayerPawn?.Value; var playerPawn = player.PlayerPawn?.Value;
if (playerPawn != null && playerPawn?.CBodyComponent != null) if (playerPawn != null && playerPawn?.CBodyComponent != null)
{ {
playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = 1; // playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = 1;
player.PlayerPawn.Value.CBodyComponent.SceneNode.Scale = 1;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent"); Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent");
} }
} }

View file

@ -19,7 +19,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#ff8c92"); SkillUtils.RegisterSkill(skillName, "#ff8c92");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -67,14 +67,6 @@ namespace jRandomSkills
UpdateHUD(player, skillInfo); UpdateHUD(player, skillInfo);
} }
}); });
Instance.AddCommand("css_useSkill", "Use Skill", (player, _) =>
{
if (player == null) return;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
UseSkill(player);
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
@ -139,7 +131,7 @@ namespace jRandomSkills
} }
} }
private 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) return; if (playerPawn?.CBodyComponent == null) return;

View file

@ -17,7 +17,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#A31912", false); SkillUtils.RegisterSkill(skillName, "#A31912", false);
Instance.RegisterListener<OnTick>(UpdateSpeed); Instance.RegisterListener<OnTick>(UpdateSpeed);
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
@ -80,7 +80,7 @@ namespace jRandomSkills
playerPawn.VelocityModifier = newSpeed; playerPawn.VelocityModifier = newSpeed;
Utilities.SetStateChanged(playerPawn, "CCSPlayerPawn", "m_flVelocityModifier"); Utilities.SetStateChanged(playerPawn, "CCSPlayerPawn", "m_flVelocityModifier");
Utils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("flash")}{ChatColors.Lime}: " + Localization.GetTranslation("flash_desc2", newSpeed), false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("flash")}{ChatColors.Lime}: " + Localization.GetTranslation("flash_desc2", newSpeed), false);
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)

View file

@ -5,7 +5,6 @@ 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;
using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners; using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
@ -23,7 +22,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#00eaff"); SkillUtils.RegisterSkill(skillName, "#00eaff");
Instance.RegisterEventHandler<EventRoundStart>((@event, info) => Instance.RegisterEventHandler<EventRoundStart>((@event, info) =>
{ {
@ -32,6 +31,22 @@ namespace jRandomSkills
return HookResult.Continue; return HookResult.Continue;
}); });
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<EventDecoyStarted>((@event, @info) => Instance.RegisterEventHandler<EventDecoyStarted>((@event, @info) =>
{ {
var player = @event.Userid; var player = @event.Userid;
@ -99,6 +114,11 @@ namespace jRandomSkills
VirtualFunctions.CBaseTrigger_EndTouchFunc.Hook(EndTouchFunc, HookMode.Post); VirtualFunctions.CBaseTrigger_EndTouchFunc.Hook(EndTouchFunc, HookMode.Post);
} }
public static void EnableSkill(CCSPlayerController player)
{
SkillUtils.TryGiveWeapon(player, CsItem.DecoyGrenade);
}
private static HookResult StartTouchFun(DynamicHook h) private static HookResult StartTouchFun(DynamicHook h)
{ {
CBaseTrigger trigger = h.GetParam<CBaseTrigger>(0); CBaseTrigger trigger = h.GetParam<CBaseTrigger>(0);

View file

@ -2,6 +2,7 @@ using System.Drawing;
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners; using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
@ -10,13 +11,51 @@ namespace jRandomSkills
public class Ghost : ISkill public class Ghost : ISkill
{ {
private static Skills skillName = Skills.Ghost; private static Skills skillName = Skills.Ghost;
private static string[] disabledWeapons =
{
"weapon_deagle",
"weapon_revolver",
"weapon_glock",
"weapon_usp_silencer",
"weapon_cz75a",
"weapon_fiveseven",
"weapon_p250",
"weapon_tec9",
"weapon_elite",
"weapon_hkp2000",
"weapon_ak47",
"weapon_m4a1",
"weapon_m4a4",
"weapon_m4a1_silencer",
"weapon_famas",
"weapon_galilar",
"weapon_aug",
"weapon_sg553",
"weapon_mp9",
"weapon_mac10",
"weapon_bizon",
"weapon_mp7",
"weapon_ump45",
"weapon_p90",
"weapon_mp5sd",
"weapon_ssg08",
"weapon_awp",
"weapon_scar20",
"weapon_g3sg1",
"weapon_nova",
"weapon_xm1014",
"weapon_mag7",
"weapon_sawedoff",
"weapon_m249",
"weapon_negev"
};
public static void LoadSkill() public static void LoadSkill()
{ {
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#FFFFFF"); SkillUtils.RegisterSkill(skillName, "#FFFFFF");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -28,9 +67,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?.Skill == skillName) if (playerInfo?.Skill == skillName)
{ EnableSkill(player);
SetPlayerVisibility(player, false);
}
} }
}); });
@ -44,7 +81,7 @@ namespace jRandomSkills
if (!Instance.IsPlayerValid(player)) continue; if (!Instance.IsPlayerValid(player)) 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)
SetPlayerVisibility(player, true); DisableSkill(player);
} }
return HookResult.Continue; return HookResult.Continue;
}); });
@ -56,12 +93,12 @@ namespace jRandomSkills
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)
SetPlayerVisibility(player, true); DisableSkill(player);
return HookResult.Continue; return HookResult.Continue;
}); });
Instance.RegisterEventHandler<EventItemEquip>((@event, info) => Instance.RegisterEventHandler<EventItemPickup>((@event, info) =>
{ {
var player = @event.Userid; var player = @event.Userid;
if (!Instance.IsPlayerValid(player)) return HookResult.Continue; if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
@ -69,6 +106,7 @@ namespace jRandomSkills
if (playerInfo?.Skill != skillName) return HookResult.Continue; if (playerInfo?.Skill != skillName) return HookResult.Continue;
SetWeaponVisibility(player, false); SetWeaponVisibility(player, false);
SetWeaponAttack(player, true);
return HookResult.Continue; return HookResult.Continue;
}); });
@ -78,11 +116,15 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
{ {
SetPlayerVisibility(player, false); SetPlayerVisibility(player, false);
SetWeaponVisibility(player, false);
SetWeaponAttack(player, true);
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
SetPlayerVisibility(player, true); SetPlayerVisibility(player, true);
SetWeaponVisibility(player, true);
SetWeaponAttack(player, false);
} }
private static void OnTick() private static void OnTick()
@ -90,16 +132,8 @@ namespace jRandomSkills
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
{ {
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)
{ UpdateHUD(player);
var activeWeapon = player.Pawn.Value.WeaponServices?.ActiveWeapon.Value;
if (activeWeapon != null && activeWeapon.IsValid && activeWeapon.Clip1 != 0)
{
activeWeapon.Clip1 = 0;
activeWeapon.Clip2 = 0;
}
}
} }
} }
@ -114,8 +148,6 @@ namespace jRandomSkills
playerPawn.Render = color; playerPawn.Render = color;
playerPawn.ShadowStrength = shadowStrength; playerPawn.ShadowStrength = shadowStrength;
Utilities.SetStateChanged(playerPawn, "CBaseModelEntity", "m_clrRender"); Utilities.SetStateChanged(playerPawn, "CBaseModelEntity", "m_clrRender");
SetWeaponVisibility(player, visible);
} }
} }
@ -127,28 +159,45 @@ namespace jRandomSkills
var color = visible ? Color.FromArgb(255, 255, 255, 255) : Color.FromArgb(0, 255, 255, 255); var color = visible ? Color.FromArgb(255, 255, 255, 255) : Color.FromArgb(0, 255, 255, 255);
var shadowStrength = visible ? 1.0f : 0.0f; var shadowStrength = visible ? 1.0f : 0.0f;
var activeWeapon = playerPawn.WeaponServices?.ActiveWeapon.Value; foreach (var weapon in playerPawn.WeaponServices?.MyWeapons)
if (activeWeapon != null && activeWeapon.IsValid)
{ {
activeWeapon.Render = color; if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
activeWeapon.ShadowStrength = shadowStrength; {
Utilities.SetStateChanged(activeWeapon, "CBaseModelEntity", "m_clrRender"); weapon.Value.Render = color;
weapon.Value.ShadowStrength = shadowStrength;
Utilities.SetStateChanged(weapon.Value, "CBaseModelEntity", "m_clrRender");
}
}
} }
var myWeapons = playerPawn.WeaponServices?.MyWeapons; private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon)
if (myWeapons != null)
{ {
foreach (var gun in myWeapons) foreach (var weapon in player.Pawn.Value.WeaponServices?.MyWeapons)
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
if (disabledWeapons.Contains(weapon?.Value?.DesignerName))
{ {
var weapon = gun.Value; weapon.Value.NextPrimaryAttackTick = disableWeapon ? int.MaxValue : Server.TickCount;
if (weapon != null) weapon.Value.NextSecondaryAttackTick = disableWeapon ? int.MaxValue : Server.TickCount;
Utilities.SetStateChanged(weapon.Value, "CBasePlayerWeapon", "m_nNextPrimaryAttackTick");
Utilities.SetStateChanged(weapon.Value, "CBasePlayerWeapon", "m_nNextSecondaryAttackTick");
}
}
private static void UpdateHUD(CCSPlayerController player)
{ {
weapon.Render = color; var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == skillName);
weapon.ShadowStrength = shadowStrength; if (skillData == null) return;
Utilities.SetStateChanged(weapon, "CBaseModelEntity", "m_clrRender");
} var weapon = player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value;
} if (weapon == null || !disabledWeapons.Contains(weapon.DesignerName)) 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='#FF0000'>{Localization.GetTranslation("disabled_weapon")}</font> <br>";
var hudContent = infoLine + skillLine + remainingLine;
player.PrintToCenterHtml(hudContent);
} }
} }
} }

View file

@ -0,0 +1,96 @@
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 Glitch : ISkill
{
private static Skills skillName = Skills.Glitch;
private static HashSet<CCSPlayerController> glitchedPlayers = new HashSet<CCSPlayerController>();
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, "#f542ef", 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 glitchedPlayers)
DisableSkill(player);
return HookResult.Continue;
});
}
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;
}
string enemyId = commands[0];
var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId);
if (enemy == null)
{
player.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("selectplayerskill_incorrect_enemy_index"));
return;
}
glitchedPlayers.Add(enemy);
enemy.ReplicateConVar("sv_disable_radar", "1");
playerInfo.SkillChance = 1;
player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("glitch_player_info", enemy.PlayerName));
enemy.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("glitch_enemy_info"));
}
public static void EnableSkill(CCSPlayerController player)
{
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
playerInfo.SkillChance = 0;
SkillUtils.PrintToChat(player, Localization.GetTranslation("glitch") + ":", false);
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("glitch_select_info")}");
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot).ToArray();
if (enemies.Length > 0)
{
foreach (var enemy in enemies)
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}");
}
else
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)
{
player.ReplicateConVar("sv_disable_radar", "0");
glitchedPlayers.Remove(player);
}
}
}

View file

@ -19,7 +19,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#e0d83a"); SkillUtils.RegisterSkill(skillName, "#e0d83a");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -66,14 +66,6 @@ namespace jRandomSkills
UpdateHUD(player, skillInfo); UpdateHUD(player, skillInfo);
} }
}); });
Instance.AddCommand("css_useSkill", "Use Skill", (player, _) =>
{
if (player == null) return;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
UseSkill(player);
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
@ -119,12 +111,10 @@ namespace jRandomSkills
private static void ActiveUse(CCSPlayerController player) private static void ActiveUse(CCSPlayerController player)
{ {
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
{
skillInfo.CanUse = true; skillInfo.CanUse = true;
} }
}
private 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) return; if (playerPawn?.CBodyComponent == null) return;
@ -139,6 +129,7 @@ namespace jRandomSkills
player.PrintToChat($" {ChatColors.Green} {Localization.GetTranslation("godmode_on")}"); player.PrintToChat($" {ChatColors.Green} {Localization.GetTranslation("godmode_on")}");
player.PlayerPawn.Value.TakesDamage = false; player.PlayerPawn.Value.TakesDamage = false;
Instance.AddTimer(2, () => { Instance.AddTimer(2, () => {
if (player.IsValid && player.PawnIsAlive) if (player.IsValid && player.PawnIsAlive)
{ {

View file

@ -0,0 +1,83 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class Hermit : ISkill
{
private static Skills skillName = Skills.Hermit;
private static readonly Dictionary<string, int> maxReserveAmmo = new Dictionary<string, int>
{
{ "weapon_glock", 120 },
{ "weapon_usp_silencer", 24 },
{ "weapon_hkp2000", 52 },
{ "weapon_p250", 26 },
{ "weapon_cz75", 12 },
{ "weapon_deagle", 35 },
{ "weapon_fiveseven", 100 },
{ "weapon_elite", 120 },
{ "weapon_tec9", 90 },
{ "weapon_revolver", 8 },
{ "weapon_mac10", 100 },
{ "weapon_mp9", 120 },
{ "weapon_mp7", 120 },
{ "weapon_mp5", 120 },
{ "weapon_mp5sd", 120 },
{ "weapon_ump45", 100 },
{ "weapon_p90", 100 },
{ "weapon_bizon", 120 },
{ "weapon_ak47", 90 },
{ "weapon_m4a1", 90 },
{ "weapon_m4a1_silencer", 80 },
{ "weapon_galilar", 90 },
{ "weapon_famas", 90 },
{ "weapon_aug", 90 },
{ "weapon_sg556", 90 },
{ "weapon_ssg08", 90 },
{ "weapon_awp", 30 },
{ "weapon_scar20", 90 },
{ "weapon_g3sg1", 90 },
{ "weapon_nova", 32 },
{ "weapon_xm1014", 32 },
{ "weapon_sawedoff", 32 },
{ "weapon_mag7", 32 },
{ "weapon_m249", 200 },
{ "weapon_negev", 300 }
};
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#ded678");
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);
if (attackerInfo?.Skill != skillName) return HookResult.Continue;
var pawn = attacker.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid) return HookResult.Continue;
var weapon = pawn.WeaponServices.ActiveWeapon.Value;
if (weapon == null || !weapon.IsValid) 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, 25);
return HookResult.Continue;
});
}
}
}

View file

@ -0,0 +1,63 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class HolyHandGrenade : ISkill
{
private static Skills skillName = Skills.HolyHandGrenade;
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#ffdd00");
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.RegisterListener<Listeners.OnEntitySpawned>(@event =>
{
var name = @event.DesignerName;
if (!name.EndsWith("hegrenade_projectile"))
return;
Server.NextFrame(() =>
{
var hegrenade = @event.As<CHEGrenadeProjectile>();
var playerPawn = hegrenade.Thrower.Value;
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 *= 2;
hegrenade.DmgRadius *= 2;
});
});
}
public static void EnableSkill(CCSPlayerController player)
{
SkillUtils.TryGiveWeapon(player, CsItem.HEGrenade);
}
}
}

View file

@ -18,7 +18,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#99140B"); SkillUtils.RegisterSkill(skillName, "#99140B");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {

View file

@ -13,7 +13,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#0000FF"); SkillUtils.RegisterSkill(skillName, "#0000FF");
Instance.RegisterEventHandler<EventWeaponFire>((@event, info) => Instance.RegisterEventHandler<EventWeaponFire>((@event, info) =>
{ {

View file

@ -0,0 +1,106 @@
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 Jammer : ISkill
{
private static Skills skillName = Skills.Jammer;
private static HashSet<CCSPlayerController> jammedPlayers = new HashSet<CCSPlayerController>();
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, "#42f5a7", 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 jammedPlayers)
SetCrosshair(player, true);
jammedPlayers.Clear();
return HookResult.Continue;
});
}
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;
}
string enemyId = commands[0];
var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId);
if (enemy == null)
{
player.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("selectplayerskill_incorrect_enemy_index"));
return;
}
jammedPlayers.Add(enemy);
SetCrosshair(enemy, false);
playerInfo.SkillChance = 1;
player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("jammer_player_info", enemy.PlayerName));
enemy.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("jammer_enemy_info"));
}
private static void SetCrosshair(CCSPlayerController player, bool enabled)
{
var pawn = player.PlayerPawn.Value;
pawn.HideHUD = (uint)(enabled
? (pawn.HideHUD & ~(1 << 8))
: (pawn.HideHUD | (1 << 8)));
Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_iHideHUD");
}
public static void EnableSkill(CCSPlayerController player)
{
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
playerInfo.SkillChance = 0;
SkillUtils.PrintToChat(player, Localization.GetTranslation("jammer") + ":", false);
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("jammer_select_info")}");
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot).ToArray();
if (enemies.Length > 0)
{
foreach (var enemy in enemies)
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}");
}
else
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)
{
SetCrosshair(player, true);
jammedPlayers.Remove(player);
}
}
}

View file

@ -1,6 +1,7 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -14,7 +15,23 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#57bcff"); SkillUtils.RegisterSkill(skillName, "#57bcff");
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<EventPlayerBlind>((@event, info) => Instance.RegisterEventHandler<EventPlayerBlind>((@event, info) =>
{ {
@ -31,5 +48,10 @@ namespace jRandomSkills
return HookResult.Continue; return HookResult.Continue;
}); });
} }
public static void EnableSkill(CCSPlayerController player)
{
SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade);
}
} }
} }

View file

@ -1,5 +1,6 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
@ -14,7 +15,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#42FF5F"); SkillUtils.RegisterSkill(skillName, "#42FF5F");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -48,8 +49,7 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
{ {
int healthshot = Instance.Random.Next(1, 10); int healthshot = Instance.Random.Next(1, 10);
for (int i = 0; i < healthshot; i++) SkillUtils.TryGiveWeapon(player, CsItem.Healthshot, healthshot);
player.GiveNamedItem("weapon_healthshot");
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)

View file

@ -17,19 +17,16 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#F5CB42"); SkillUtils.RegisterSkill(skillName, "#F5CB42");
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) => Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{ {
CCSPlayerController player = @event.Userid; CCSPlayerController player = @event.Userid;
if (!IsDeadPlayerValid(player)) return HookResult.Continue;
if (!Instance.IsPlayerValid(player)) 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)
{
SpawnExplosion(player); SpawnExplosion(player);
}
return HookResult.Continue; return HookResult.Continue;
}); });
@ -51,7 +48,6 @@ namespace jRandomSkills
heProjectile.DispatchSpawn(); heProjectile.DispatchSpawn();
heProjectile.AcceptInput("InitializeSpawnFromWorld", player.PlayerPawn.Value, player.PlayerPawn.Value, ""); heProjectile.AcceptInput("InitializeSpawnFromWorld", player.PlayerPawn.Value, player.PlayerPawn.Value, "");
heProjectile.DetonateTime = 0; heProjectile.DetonateTime = 0;
Server.PrintToChatAll($" {ChatColors.DarkRed}► {ChatColors.Green}[{ChatColors.DarkRed} qRandomSkills {ChatColors.Green}] {ChatColors.DarkRed}{player.PlayerName}: {ChatColors.Lime}ALLAHU AKBAR!!!"); Server.PrintToChatAll($" {ChatColors.DarkRed}► {ChatColors.Green}[{ChatColors.DarkRed} qRandomSkills {ChatColors.Green}] {ChatColors.DarkRed}{player.PlayerName}: {ChatColors.Lime}ALLAHU AKBAR!!!");
var fileNames = new[] { "radiobotfallback01", "radiobotfallback02", "radiobotfallback04" }; var fileNames = new[] { "radiobotfallback01", "radiobotfallback02", "radiobotfallback04" };
@ -61,5 +57,10 @@ namespace jRandomSkills
player.ExecuteClientCommand($"play vo/agents/balkan/{randomFile}.vsnd"); player.ExecuteClientCommand($"play vo/agents/balkan/{randomFile}.vsnd");
}); });
} }
private static bool IsDeadPlayerValid(CCSPlayerController player)
{
return player != null && player.IsValid && player.PlayerPawn?.Value != null;
}
} }
} }

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 jRandomSkills.src.player; using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
@ -8,50 +7,57 @@ namespace jRandomSkills
{ {
public class Mute : ISkill public class Mute : ISkill
{ {
private static Skills skillName = Skills.None; private static Skills skillName = Skills.AntyHead;
private const float ExplosionRadius = 500.0f;
private const int ExplosionDamage = 999;
public static void LoadSkill() public static void LoadSkill()
{ {
return;
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#F5CB42"); SkillUtils.RegisterSkill(skillName, "#2fc468");
Instance.RegisterListener<Listeners.OnEntitySpawned>(@event => Instance.RegisterListener<Listeners.OnEntitySpawned>(@event =>
{ {
var name = @event.DesignerName; var name = @event.DesignerName;
if (!name.EndsWith("_projectile")) if (!name.EndsWith("_projectile") && name != "instanced_scripted_scene")
return; return;
// mp_freezetime 0; mp_warmup_end if (@event.DesignerName == "instanced_scripted_scene")
Server.PrintToChatAll("-> " + name); {
@event.AcceptInput("Kill");
@event.Remove();
return;
}
Server.NextFrame(() => {
switch (name) switch (name)
{ {
case "flashbang_projectile":
var flash = @event.As<CFlashbangProjectile>();
break;
case "smokegrenade_projectile": case "smokegrenade_projectile":
var smoke = @event.As<CSmokeGrenadeProjectile>(); var smoke = @event.As<CSmokeGrenadeProjectile>();
Schema.SetSchemaValue<int>(smoke.Handle, "CSmokeGrenadeProjectile", "m_nSmokeEffectTickBegin", int.MaxValue); smoke.SmokeEffectTickBegin = int.MaxValue;
Schema.SetSchemaValue<bool>(smoke.Handle, "CSmokeGrenadeProjectile", "m_bDidSmokeEffect", true);
break;
case "hegrenade_projectile":
var hegrenade = @event.As<CHEGrenadeProjectile>();
hegrenade.DetonateTime = 0;
break; break;
case "molotov_projectile": case "molotov_projectile":
var molotov = @event.As<CMolotovProjectile>(); var molotov = @event.As<CMolotovProjectile>();
molotov.StillTimer.Timestamp = 0; molotov.Detonated = true;
break; break;
case "decoy_projectile": case "decoy_projectile":
var decoy = @event.As<CDecoyProjectile>(); var decoy = @event.As<CDecoyProjectile>();
decoy.ExpireTime = int.MaxValue;
decoy.DecoyShotTick = int.MaxValue;
decoy.ShotsRemaining = int.MaxValue;
break;
default:
var grenade = @event.As<CBaseCSGrenadeProjectile>();
grenade.DetonateTime = float.MaxValue;
break; break;
} }
Instance.AddTimer(5f, () =>
{
if (@event != null && @event.IsValid)
@event.Remove();
});
});
}); });
} }
} }

View file

@ -0,0 +1,115 @@
using System.Drawing;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class Ninja : ISkill
{
private static Skills skillName = Skills.Ninja;
private static float idlePercentInvisibility = 0.3f;
private static float duckPercentInvisibility = 0.3f;
private static float knifePercentInvisibility = 0.3f;
private static Dictionary<nint, float> invisibilityChanged = new Dictionary<nint, float>();
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#dedede");
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
{
foreach (var player in Utilities.GetPlayers())
DisableSkill(player);
invisibilityChanged.Clear();
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.RegisterListener<OnTick>(OnTick);
}
private static void OnTick()
{
foreach (var player in Utilities.GetPlayers())
{
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
UpdateNinja(player);
}
}
public static void DisableSkill(CCSPlayerController player)
{
SetPlayerVisibility(player, 0);
SetWeaponVisibility(player, 0);
}
private static void UpdateNinja(CCSPlayerController player)
{
var flags = (PlayerFlags)player.PlayerPawn.Value.Flags;
var buttons = player.Buttons;
var activeWeapon = player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value;
float percentInvisibility = 0;
if (buttons.HasFlag(PlayerButtons.Duck))
percentInvisibility += duckPercentInvisibility;
if (activeWeapon.DesignerName == "weapon_knife")
percentInvisibility += knifePercentInvisibility;
if (!buttons.HasFlag(PlayerButtons.Moveleft) && !buttons.HasFlag(PlayerButtons.Moveright) && !buttons.HasFlag(PlayerButtons.Forward) && !buttons.HasFlag(PlayerButtons.Back) && flags.HasFlag(PlayerFlags.FL_ONGROUND))
percentInvisibility += idlePercentInvisibility;
if (invisibilityChanged.TryGetValue(player.Handle, out float oldInvisibility))
if (percentInvisibility == oldInvisibility)
return;
invisibilityChanged[player.Handle] = percentInvisibility;
SetPlayerVisibility(player, percentInvisibility);
SetWeaponVisibility(player, percentInvisibility);
}
private static void SetPlayerVisibility(CCSPlayerController player, float percentInvisibility)
{
var playerPawn = player.PlayerPawn.Value;
if (playerPawn != null)
{
var color = Color.FromArgb(Math.Max(255 - (int)(255 * percentInvisibility), 0), 255, 255, 255);
playerPawn.Render = color;
Utilities.SetStateChanged(playerPawn, "CBaseModelEntity", "m_clrRender");
}
}
private static void SetWeaponVisibility(CCSPlayerController player, float percentInvisibility)
{
if (!Instance.IsPlayerValid(player)) return;
var playerPawn = player.PlayerPawn.Value;
var color = Color.FromArgb(Math.Max(255 - (int)(255 * percentInvisibility * 2), 0), 255, 255, 255);
foreach (var weapon in playerPawn.WeaponServices?.MyWeapons)
{
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
{
weapon.Value.Render = color;
Utilities.SetStateChanged(weapon.Value, "CBaseModelEntity", "m_clrRender");
}
}
}
}
}

View file

@ -0,0 +1,77 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using jRandomSkills.src.player;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class NoRecoil : ISkill
{
private static Skills skillName = Skills.NoRecoil;
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#8a42f5");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{
Instance.AddTimer(0.1f, () =>
{
foreach (var player in Utilities.GetPlayers())
{
if (!Instance.IsPlayerValid(player)) continue;
player.RemoveItemByDesignerName("weapon_healthshot");
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) =>
{
DisableSkill(null);
return HookResult.Continue;
});
Instance.RegisterListener<OnTick>(OnTick);
}
public static void EnableSkill(CCSPlayerController player)
{
Server.ExecuteCommand("weapon_accuracy_nospread 1");
}
public static void DisableSkill(CCSPlayerController player)
{
Server.ExecuteCommand("weapon_accuracy_nospread 0");
}
private static void OnTick()
{
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)
{
var weapon = player.Pawn.Value.WeaponServices?.ActiveWeapon.Value;
if (weapon == null) continue;
var pawn = player.PlayerPawn.Value;
pawn.AimPunchTickBase = 0;
pawn.AimPunchTickFraction = 0f;
pawn.CameraServices.CsViewPunchAngleTick = 0;
pawn.CameraServices.CsViewPunchAngleTickRatio = 0f;
}
}
}
}
}

View file

@ -8,7 +8,7 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
Utils.RegisterSkill(skillName, "#FFFFFF", false); SkillUtils.RegisterSkill(skillName, "#FFFFFF", false);
} }
} }
} }

View file

@ -1,4 +1,5 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using jRandomSkills.src.player; using jRandomSkills.src.player;
@ -15,7 +16,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#ff5CD9"); SkillUtils.RegisterSkill(skillName, "#ff5CD9");
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
} }
@ -24,16 +25,16 @@ namespace jRandomSkills
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 || param2 == null || param2.Attacker == null) if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
return HookResult.Continue; return HookResult.Continue;
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 == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
return HookResult.Continue; return HookResult.Continue;
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
return HookResult.Continue; return HookResult.Continue;
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>(); CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();

View file

@ -0,0 +1,49 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class OnlyHead : ISkill
{
private static Skills skillName = Skills.OnlyHead;
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#3c47de");
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
{
var attacker = @event.Attacker;
var victim = @event.Userid;
int damage = @event.DmgHealth;
var hitgroup = (HitGroup_t)@event.Hitgroup;
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue;
var victimInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID);
if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue;
HitGroup_t[] disabledHitbox = { HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG };
if (hitgroup != HitGroup_t.HITGROUP_HEAD)
RestoreHealth(victim, damage);
return HookResult.Stop;
});
}
private static void RestoreHealth(CCSPlayerController victim, float damage)
{
var playerPawn = victim.PlayerPawn.Value;
var newHealth = playerPawn.Health + damage;
if (newHealth > 100)
newHealth = 100;
playerPawn.Health = (int)newHealth;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
}
}
}

View file

@ -19,7 +19,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#FFA500"); SkillUtils.RegisterSkill(skillName, "#FFA500");
Instance.RegisterListener<OnTick>(() => Instance.RegisterListener<OnTick>(() =>
{ {

View file

@ -16,7 +16,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#ff5C0A", false); SkillUtils.RegisterSkill(skillName, "#ff5C0A", false);
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -24,7 +24,7 @@ namespace jRandomSkills
{ {
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
{ {
if (!Instance.IsPlayerValid(player)) continue; if (!IsDeadPlayerValid(player)) 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) continue; if (playerInfo?.Skill != skillName) continue;
@ -48,7 +48,7 @@ namespace jRandomSkills
{ {
player.Respawn(); player.Respawn();
Instance.AddTimer(.2f, () => player.Respawn()); Instance.AddTimer(.2f, () => player.Respawn());
Utils.PrintToChat(player, Localization.GetTranslation("phoenix_respawn"), false); ; SkillUtils.PrintToChat(player, Localization.GetTranslation("phoenix_respawn"), false); ;
} }
} }
@ -66,7 +66,12 @@ namespace jRandomSkills
playerInfo.SkillChance = newChance; playerInfo.SkillChance = newChance;
newChance = (float)Math.Round(newChance, 2) * 100; newChance = (float)Math.Round(newChance, 2) * 100;
newChance = (float)Math.Round(newChance); newChance = (float)Math.Round(newChance);
Utils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("phoenix")}{ChatColors.Lime}: " + Localization.GetTranslation("phoenix_desc2", newChance), false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("phoenix")}{ChatColors.Lime}: " + Localization.GetTranslation("phoenix_desc2", newChance), false);
}
private static bool IsDeadPlayerValid(CCSPlayerController player)
{
return player != null && player.IsValid && player.PlayerPawn?.Value != null;
} }
} }
} }

View file

@ -18,7 +18,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#1466F5"); SkillUtils.RegisterSkill(skillName, "#1466F5");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {

View file

@ -17,7 +17,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#7d7d7d"); SkillUtils.RegisterSkill(skillName, "#7d7d7d");
Instance.RegisterEventHandler<EventRoundStart>((@event, @info) => Instance.RegisterEventHandler<EventRoundStart>((@event, @info) =>
{ {

View file

@ -0,0 +1,51 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class Prosthesis : ISkill
{
private static Skills skillName = Skills.Prosthesis;
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#9c9c9c");
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
{
var attacker = @event.Attacker;
var victim = @event.Userid;
int damage = @event.DmgHealth;
var hitgroup = (HitGroup_t)@event.Hitgroup;
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue;
var victimInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID);
if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue;
HitGroup_t[] disabledHitbox = { HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG };
if (disabledHitbox.Contains(hitgroup))
RestoreHealth(victim, damage);
return HookResult.Stop;
});
}
private static void RestoreHealth(CCSPlayerController victim, float damage)
{
var playerPawn = victim.PlayerPawn.Value;
var newHealth = playerPawn.Health + damage;
if (newHealth > 100)
newHealth = 100;
playerPawn.Health = (int)newHealth;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
}
}
}

View file

@ -1,7 +1,6 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners; using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
@ -16,7 +15,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#8a42f5"); SkillUtils.RegisterSkill(skillName, "#8a42f5");
Instance.RegisterListener<OnTick>(OnTick); Instance.RegisterListener<OnTick>(OnTick);
} }
@ -32,6 +31,12 @@ namespace jRandomSkills
var weapon = player.Pawn.Value.WeaponServices?.ActiveWeapon.Value; var weapon = player.Pawn.Value.WeaponServices?.ActiveWeapon.Value;
if (weapon == null) continue; if (weapon == null) continue;
var pawn = player.PlayerPawn.Value;
pawn.AimPunchTickBase = 0;
pawn.AimPunchTickFraction = 0f;
pawn.CameraServices.CsViewPunchAngleTick = 0;
pawn.CameraServices.CsViewPunchAngleTickRatio = 0f;
Schema.SetSchemaValue<Int32>(weapon.Handle, "CBasePlayerWeapon", "m_nNextPrimaryAttackTick", Server.TickCount); Schema.SetSchemaValue<Int32>(weapon.Handle, "CBasePlayerWeapon", "m_nNextPrimaryAttackTick", Server.TickCount);
Schema.SetSchemaValue<Int32>(weapon.Handle, "CBasePlayerWeapon", "m_nNextSecondaryAttackTick", Server.TickCount); Schema.SetSchemaValue<Int32>(weapon.Handle, "CBasePlayerWeapon", "m_nNextSecondaryAttackTick", Server.TickCount);
} }

View file

@ -15,7 +15,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#2effcb"); SkillUtils.RegisterSkill(skillName, "#2effcb");
Instance.RegisterListener<OnTick>(CheckRadarowiec); Instance.RegisterListener<OnTick>(CheckRadarowiec);
} }

View file

@ -14,7 +14,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#009905"); SkillUtils.RegisterSkill(skillName, "#009905");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {

View file

@ -27,7 +27,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#e0873a"); SkillUtils.RegisterSkill(skillName, "#e0873a");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -74,14 +74,6 @@ namespace jRandomSkills
UpdateHUD(player, skillInfo); UpdateHUD(player, skillInfo);
} }
}); });
Instance.AddCommand("css_useSkill", "Use Skill", (player, _) =>
{
if (player == null) return;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
UseSkill(player);
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
@ -124,7 +116,7 @@ namespace jRandomSkills
player.PrintToCenterHtml(hudContent); player.PrintToCenterHtml(hudContent);
} }
private 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) return; if (playerPawn?.CBodyComponent == null) return;

View file

@ -0,0 +1,150 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using jRandomSkills.src.player;
using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class ReactiveArmor : ISkill
{
private static Skills skillName = Skills.ReactiveArmor;
private static float timerCooldown = (float)(Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Cooldown);
private static readonly Dictionary<ulong, PlayerSkillInfo> SkillPlayerInfo = new Dictionary<ulong, PlayerSkillInfo>();
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#3cded3");
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;
});
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
{
SkillPlayerInfo.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
var player = @event.Userid;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
if (SkillPlayerInfo.ContainsKey(player.SteamID))
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);
}
});
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)
{
SkillPlayerInfo[player.SteamID] = new PlayerSkillInfo
{
SteamID = player.SteamID,
CanUse = true,
Cooldown = DateTime.MinValue,
LastClick = DateTime.MinValue,
};
}
public static void DisableSkill(CCSPlayerController player)
{
if (SkillPlayerInfo.ContainsKey(player.SteamID))
SkillPlayerInfo.Remove(player.SteamID);
}
private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo)
{
float cooldown = 0;
if (skillInfo != null)
{
float time = (int)(skillInfo.Cooldown.AddSeconds(timerCooldown) - DateTime.Now).TotalSeconds;
cooldown = Math.Max(time, 0);
if (cooldown == 0 && skillInfo?.CanUse == false)
skillInfo.CanUse = true;
}
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 = cooldown != 0 ? $"<font class='fontSize-m' color='#FFFFFF'>{Localization.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}</font> <br>" : "";
var hudContent = infoLine + skillLine + remainingLine;
player.PrintToCenterHtml(hudContent);
}
private static void RestoreHealth(CCSPlayerController victim, float damage)
{
var playerPawn = victim.PlayerPawn.Value;
var newHealth = playerPawn.Health + damage;
if (newHealth > 100)
newHealth = 100;
playerPawn.Health = (int)newHealth;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
}
public class PlayerSkillInfo
{
public ulong SteamID { get; set; }
public bool CanUse { get; set; }
public DateTime Cooldown { get; set; }
public DateTime LastClick { get; set; }
}
}
}

View file

@ -0,0 +1,187 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class Replicator : ISkill
{
private static Skills skillName = Skills.Replicator;
private static float timerCooldown = (float)(Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Cooldown);
private static readonly Dictionary<ulong, PlayerSkillInfo> SkillPlayerInfo = new Dictionary<ulong, PlayerSkillInfo>();
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#a3000b");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{
Instance.AddTimer(0.1f, () =>
{
foreach (var player in Utilities.GetPlayers())
{
if (!Instance.IsPlayerValid(player)) return;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
EnableSkill(player);
}
});
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
{
SkillPlayerInfo.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
var player = @event.Userid;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
if (SkillPlayerInfo.ContainsKey(player.SteamID))
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);
}
});
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
}
public static void EnableSkill(CCSPlayerController player)
{
SkillPlayerInfo[player.SteamID] = new PlayerSkillInfo
{
SteamID = player.SteamID,
CanUse = true,
Cooldown = DateTime.MinValue,
LastClick = DateTime.MinValue,
};
}
public static void DisableSkill(CCSPlayerController player)
{
if (SkillPlayerInfo.ContainsKey(player.SteamID))
SkillPlayerInfo.Remove(player.SteamID);
}
private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo)
{
float cooldown = 0;
if (skillInfo != null)
{
float time = (int)(skillInfo.Cooldown.AddSeconds(timerCooldown) - DateTime.Now).TotalSeconds;
cooldown = Math.Max(time, 0);
if (cooldown == 0 && skillInfo?.CanUse == false)
skillInfo.CanUse = true;
}
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 = cooldown != 0 ? $"<font class='fontSize-m' color='#FFFFFF'>{Localization.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}</font> <br>" : "";
var hudContent = infoLine + skillLine + remainingLine;
player.PrintToCenterHtml(hudContent);
}
public static void UseSkill(CCSPlayerController player)
{
var playerPawn = player.PlayerPawn.Value;
if (playerPawn?.CBodyComponent == null) return;
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
{
if (!player.IsValid || !player.PawnIsAlive) return;
if (skillInfo.CanUse)
{
skillInfo.CanUse = false;
skillInfo.Cooldown = DateTime.Now;
CreateReplica(player);
}
else
skillInfo.LastClick = DateTime.Now;
}
}
private static void CreateReplica(CCSPlayerController player)
{
var playerPawn = player.PlayerPawn.Value;
var replica = Utilities.CreateEntityByName<CDynamicProp>("prop_dynamic");
if (replica == null)
return;
float distance = 40;
Vector pos = playerPawn.AbsOrigin + SkillUtils.GetForwardVector(playerPawn.AbsRotation) * distance;
if (((PlayerFlags)playerPawn.Flags).HasFlag(PlayerFlags.FL_DUCKING))
pos.Z -= 19;
replica.Flags = playerPawn.Flags;
replica.Flags |= (uint)Flags_t.FL_DUCKING;
replica.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(replica.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2));
replica.SetModel(playerPawn!.CBodyComponent!.SceneNode!.GetSkeletonInstance().ModelState.ModelName);
replica.Entity.Name = replica.Globalname = $"Replica_{Server.TickCount}_{(player.Team == CsTeam.CounterTerrorist ? "CT" : "TT")}";
replica.Teleport(pos, playerPawn.AbsRotation, null);
replica.DispatchSpawn();
replica.AcceptInput("EnableCollision");
}
private static HookResult OnTakeDamage(DynamicHook h)
{
CEntityInstance param = h.GetParam<CEntityInstance>(0);
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
return HookResult.Continue;
CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.Handle);
if (string.IsNullOrEmpty(param.Entity.Name)) return HookResult.Continue;
if (!param.Entity.Name.StartsWith("Replica_")) return HookResult.Continue;
var replica = param.As<CPhysicsPropMultiplayer>();
if (replica == null || !replica.IsValid) return HookResult.Continue;
replica.EmitSound("GlassBottle.BulletImpact", volume: 1f);
var attackerTeam = attackerPawn.TeamNum;
var replicaTeam = replica.Globalname.EndsWith("CT") ? 3 : 2;
SkillUtils.TakeHealth(attackerPawn, attackerTeam != replicaTeam ? 15 : 5);
replica.Remove();
return HookResult.Continue;
}
public class PlayerSkillInfo
{
public ulong SteamID { get; set; }
public bool CanUse { get; set; }
public DateTime Cooldown { get; set; }
public DateTime LastClick { get; set; }
}
}
}

View file

@ -19,7 +19,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#a86eff"); SkillUtils.RegisterSkill(skillName, "#a86eff");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -66,14 +66,6 @@ namespace jRandomSkills
UpdateHUD(player, skillInfo); UpdateHUD(player, skillInfo);
} }
}); });
Instance.AddCommand("css_useSkill", "Use Skill", (player, _) =>
{
if (player == null) return;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
UseSkill(player);
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
@ -116,15 +108,7 @@ namespace jRandomSkills
player.PrintToCenterHtml(hudContent); player.PrintToCenterHtml(hudContent);
} }
private static void ActiveUse(CCSPlayerController player) public static void UseSkill(CCSPlayerController player)
{
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
{
skillInfo.CanUse = true;
}
}
private static void UseSkill(CCSPlayerController player)
{ {
var playerPawn = player.PlayerPawn.Value; var playerPawn = player.PlayerPawn.Value;
if (playerPawn?.CBodyComponent == null) return; if (playerPawn?.CBodyComponent == null) return;

View file

@ -0,0 +1,65 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class ReturnToSender : ISkill
{
private static Skills skillName = Skills.ReturnToSender;
private static HashSet<nint> playersToSender = new HashSet<nint>();
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#a68132");
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
{
playersToSender.Clear();
return HookResult.Continue;
});
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;
var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
if (attackerInfo == null || attackerInfo.Skill != skillName) return HookResult.Continue;
if (playersToSender.TryGetValue(victim.Handle, out _))
return HookResult.Continue;
victim.PlayerPawn.Value.Teleport(GetSpawnVector(victim));
playersToSender.Add(victim.Handle);
return HookResult.Stop;
});
}
public static void DisableSkill(CCSPlayerController player)
{
playersToSender.Remove(player.Handle);
}
private static Vector GetSpawnVector(CCSPlayerController player)
{
var abs = player.PlayerPawn.Value.AbsOrigin;
var spawns = Utilities.FindAllEntitiesByDesignerName<SpawnPoint>(player.Team == CsTeam.Terrorist ? "info_player_terrorist" : "info_player_counterterrorist").ToList();
if (spawns.Any())
{
var randomSpawn = spawns[Instance.Random.Next(spawns.Count)];
return randomSpawn.AbsOrigin;
}
return new Vector(abs.X, abs.Y, abs.Z);
}
}
}

View file

@ -14,7 +14,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#D4AF37"); SkillUtils.RegisterSkill(skillName, "#D4AF37");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {

View file

@ -0,0 +1,49 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class RobinHood : ISkill
{
private static Skills skillName = Skills.RobinHood;
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#119125");
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
{
var victim = @event.Userid;
var attacker = @event.Attacker;
var damage = @event.DmgHealth;
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;
int moneyToSteal = damage * 35;
StealMoney(victim, attacker, moneyToSteal);
return HookResult.Continue;
});
}
private static void StealMoney(CCSPlayerController victim, CCSPlayerController attacker, int money)
{
var victimMoneyServices = victim?.InGameMoneyServices;
var attackerMoneyServices = attacker?.InGameMoneyServices;
if (victimMoneyServices == null || attackerMoneyServices == null) return;
var moneyToAdd = victimMoneyServices.Account < money ? victimMoneyServices.Account : money;
victimMoneyServices.Account = Math.Max(victimMoneyServices.Account - money, 0);
Utilities.SetStateChanged(victim, "CCSPlayerController", "m_pInGameMoneyServices");
attackerMoneyServices.Account = Math.Min(attackerMoneyServices.Account + moneyToAdd, 16000);
Utilities.SetStateChanged(attacker, "CCSPlayerController", "m_pInGameMoneyServices");
}
}
}

View file

@ -12,7 +12,7 @@ namespace jRandomSkills
public static void LoadSkill() public static void LoadSkill()
{ {
Utils.RegisterSkill(skillName, "#8A2BE2"); SkillUtils.RegisterSkill(skillName, "#8A2BE2");
Instance.RegisterEventHandler<EventBombBeginplant>((@event, info) => Instance.RegisterEventHandler<EventBombBeginplant>((@event, info) =>
{ {

View file

@ -0,0 +1,102 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class SecondLife : ISkill
{
private static Skills skillName = Skills.SecondLife;
private static int secondLifeHealth = 50;
private static HashSet<nint> secondLifePlayers = new HashSet<nint>();
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#d41c1c");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{
Instance.AddTimer(0.1f, () =>
{
foreach (var player in Utilities.GetPlayers())
{
if (player == null || !player.IsValid || player.PlayerPawn?.Value == null) 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) =>
{
secondLifePlayers.Clear();
return HookResult.Continue;
});
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;
var victimInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID);
if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue;
var victimPawn = victim.PlayerPawn.Value;
if (victimPawn.Health - damage >= 0 || secondLifePlayers.TryGetValue(victim.Handle, out _))
return HookResult.Continue;
secondLifePlayers.Add(victim.Handle);
SetHealth(victim, secondLifeHealth);
victimPawn.Teleport(GetSpawnVector(victim));
return HookResult.Stop;
});
}
public static void EnableSkill(CCSPlayerController player)
{
SetHealth(player, secondLifeHealth);
}
public static void DisableSkill(CCSPlayerController player)
{
secondLifePlayers.Remove(player.Handle);
}
private static void SetHealth(CCSPlayerController player, int health)
{
var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid) return;
pawn.Health = health;
pawn.MaxHealth = health;
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth");
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iMaxHealth");
pawn.ArmorValue = 0;
Utilities.SetStateChanged(pawn, "CCSPlayerPawn", "m_ArmorValue");
}
private static Vector GetSpawnVector(CCSPlayerController player)
{
var abs = player.PlayerPawn.Value.AbsOrigin;
var spawns = Utilities.FindAllEntitiesByDesignerName<SpawnPoint>(player.Team == CsTeam.Terrorist ? "info_player_terrorist" : "info_player_counterterrorist").ToList();
if (spawns.Any())
{
var randomSpawn = spawns[Instance.Random.Next(spawns.Count)];
return randomSpawn.AbsOrigin;
}
return new Vector(abs.X, abs.Y, abs.Z);
}
}
}

View file

@ -1,6 +1,8 @@
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
@ -15,7 +17,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#18171A"); SkillUtils.RegisterSkill(skillName, "#18171A");
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) => Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
{ {
@ -32,6 +34,13 @@ namespace jRandomSkills
return HookResult.Continue; return HookResult.Continue;
}); });
Instance.RegisterListener<OnTick>(() =>
{
var skillInfo = Instance.skillPlayer.FirstOrDefault(p => p.Skill == skillName);
if (skillInfo == null) return;
var player = Utilities.GetPlayerFromSteamId(skillInfo.SteamID);
});
} }
private static void TeleportAttackerBehindVictim(CCSPlayerController attacker, CCSPlayerController victim) private static void TeleportAttackerBehindVictim(CCSPlayerController attacker, CCSPlayerController victim)
@ -44,21 +53,8 @@ namespace jRandomSkills
Vector victimPosition = victimPawn.AbsOrigin; Vector victimPosition = victimPawn.AbsOrigin;
QAngle victimAngles = victimPawn.AbsRotation; QAngle victimAngles = victimPawn.AbsRotation;
Vector behindPosition = victimPosition - GetForwardVector(victimAngles) * TeleportDistance; Vector behindPosition = victimPosition - SkillUtils.GetForwardVector(victimAngles) * TeleportDistance;
attackerPawn.Teleport(behindPosition, victimAngles, new Vector(0, 0, 0)); attackerPawn.Teleport(behindPosition, victimAngles, new Vector(0, 0, 0));
} }
private static Vector GetForwardVector(QAngle angles)
{
float pitch = angles.X * (float)(Math.PI / 180);
float yaw = angles.Y * (float)(Math.PI / 180);
float x = (float)(Math.Cos(pitch) * Math.Cos(yaw));
float y = (float)(Math.Cos(pitch) * Math.Sin(yaw));
float z = (float)Math.Sin(pitch);
return new Vector(x, y, z);
}
} }
} }

View file

@ -1,7 +1,6 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using jRandomSkills.src.utils;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -15,7 +14,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#333333"); SkillUtils.RegisterSkill(skillName, "#333333");
Instance.HookUserMessage(208, um => Instance.HookUserMessage(208, um =>
{ {

View file

@ -18,7 +18,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#09ba00", false); SkillUtils.RegisterSkill(skillName, "#09ba00", false);
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre); VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
@ -49,7 +49,7 @@ namespace jRandomSkills
float newScale = (float)Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom; float newScale = (float)Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom;
playerInfo.SkillChance = newScale; playerInfo.SkillChance = newScale;
newScale = (float)Math.Round(newScale, 2); newScale = (float)Math.Round(newScale, 2);
Utils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("soldier")}{ChatColors.Lime}: " + Localization.GetTranslation("soldier_desc2", newScale), false); SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("soldier")}{ChatColors.Lime}: " + Localization.GetTranslation("soldier_desc2", newScale), false);
} }
private static HookResult OnTakeDamage(DynamicHook h) private static HookResult OnTakeDamage(DynamicHook h)
@ -57,16 +57,16 @@ namespace jRandomSkills
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 || param2 == null || param2.Attacker == null) if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null)
return HookResult.Continue; return HookResult.Continue;
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 == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
return HookResult.Continue; return HookResult.Continue;
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
return HookResult.Continue; return HookResult.Continue;
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>(); CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();

View file

@ -0,0 +1,145 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using jRandomSkills.src.player;
using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class SoundMaker : ISkill
{
private static Skills skillName = Skills.SoundMaker;
private static float timerCooldown = (float)(Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Cooldown);
private static readonly Dictionary<ulong, PlayerSkillInfo> SkillPlayerInfo = new Dictionary<ulong, PlayerSkillInfo>();
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#e3ed8c");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{
Instance.AddTimer(0.1f, () =>
{
foreach (var player in Utilities.GetPlayers())
{
if (!Instance.IsPlayerValid(player)) return;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
EnableSkill(player);
}
});
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventRoundEnd>((@event, info) =>
{
SkillPlayerInfo.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
{
var player = @event.Userid;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
if (SkillPlayerInfo.ContainsKey(player.SteamID))
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)
{
SkillPlayerInfo[player.SteamID] = new PlayerSkillInfo
{
SteamID = player.SteamID,
CanUse = true,
Cooldown = DateTime.MinValue,
LastClick = DateTime.MinValue,
};
}
public static void DisableSkill(CCSPlayerController player)
{
if (SkillPlayerInfo.ContainsKey(player.SteamID))
SkillPlayerInfo.Remove(player.SteamID);
}
private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo)
{
float cooldown = 0;
if (skillInfo != null)
{
float time = (int)(skillInfo.Cooldown.AddSeconds(timerCooldown) - DateTime.Now).TotalSeconds;
cooldown = Math.Max(time, 0);
if (cooldown == 0 && skillInfo?.CanUse == false)
skillInfo.CanUse = true;
}
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 = cooldown != 0 ? $"<font class='fontSize-m' color='#FFFFFF'>{Localization.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}</font> <br>" : "";
var hudContent = infoLine + skillLine + remainingLine;
player.PrintToCenterHtml(hudContent);
}
public static void UseSkill(CCSPlayerController player)
{
var playerPawn = player.PlayerPawn.Value;
if (playerPawn?.CBodyComponent == null) return;
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
{
if (!player.IsValid || !player.PawnIsAlive) return;
if (skillInfo.CanUse)
{
skillInfo.CanUse = false;
skillInfo.Cooldown = DateTime.Now;
MakeSound(player);
}
else
skillInfo.LastClick = DateTime.Now;
}
}
private static void MakeSound(CCSPlayerController player)
{
foreach (var enemy in Utilities.GetPlayers().Where(p => p.Team != player.Team))
if (enemy != null && enemy.IsValid && enemy.PawnIsAlive)
{
Server.PrintToChatAll($"Sound event on {enemy.PlayerName}");
enemy.PlayerPawn.Value.EmitSound($"weapon.C4Beep.Impact", volume: 1f);
}
}
public class PlayerSkillInfo
{
public ulong SteamID { get; set; }
public bool CanUse { get; set; }
public DateTime Cooldown { get; set; }
public DateTime LastClick { get; set; }
}
}
}

View file

@ -19,7 +19,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#1466F5"); SkillUtils.RegisterSkill(skillName, "#1466F5");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -69,14 +69,6 @@ namespace jRandomSkills
UpdateHUD(player, skillInfo, false); UpdateHUD(player, skillInfo, false);
} }
}); });
Instance.AddCommand("css_useSkill", "Use Skill", (player, _) =>
{
if (player == null) return;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
UseSkill(player);
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
@ -127,7 +119,7 @@ namespace jRandomSkills
player.PrintToCenterHtml(hudContent); player.PrintToCenterHtml(hudContent);
} }
private 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) return; if (playerPawn?.CBodyComponent == null) return;

View file

@ -15,7 +15,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#8A2BE2"); SkillUtils.RegisterSkill(skillName, "#8A2BE2");
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) => Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
{ {

View file

@ -0,0 +1,110 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
using jRandomSkills.src.utils;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class Thief : ISkill
{
private static Skills skillName = Skills.Thief;
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#adaec7", 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;
});
}
public static void TypeSkill(CCSPlayerController player, string[] commands)
{
if (player == null) return;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
var playerPawn = player.PlayerPawn.Value;
if (playerPawn?.CBodyComponent == null) return;
if (!player.IsValid || !player.PawnIsAlive) return;
string enemyId = commands[0];
var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Index.ToString() == enemyId);
if (enemy == null)
{
player.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("selectplayerskill_incorrect_enemy_index"));
return;
}
DeacitvateSkill(player, enemy);
}
public static void EnableSkill(CCSPlayerController player)
{
SkillUtils.PrintToChat(player, Localization.GetTranslation("thief") + ":", false);
player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("thief_select_info")}");
var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot).ToArray();
if (enemies.Length > 0)
{
foreach (var enemy in enemies)
{
var enemyInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill);
player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: {ChatColors.Red}{skillData.Name}");
}
}
else
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)
{
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
playerInfo.SpecialSkill = Skills.None;
}
private static void DeacitvateSkill(CCSPlayerController player, CCSPlayerController enemy)
{
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
var enemyInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == enemy.SteamID);
if (playerInfo != null)
{
playerInfo.Skill = enemyInfo.Skill;
playerInfo.SpecialSkill = skillName;
Instance.SkillAction(enemyInfo.Skill.ToString(), "EnableSkill", new object[] { player });
player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("thief_player_info", enemy.PlayerName));
}
if (enemyInfo != null)
{
Instance.SkillAction(enemyInfo.Skill.ToString(), "DisableSkill", new object[] { enemy });
enemyInfo.SpecialSkill = enemyInfo.Skill;
enemyInfo.Skill = Skills.None;
enemy.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("thief_enemy_info"));
}
}
}
}

View file

@ -18,7 +18,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#2ec761"); SkillUtils.RegisterSkill(skillName, "#2ec761");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -65,14 +65,6 @@ namespace jRandomSkills
UpdateHUD(player, skillInfo); UpdateHUD(player, skillInfo);
} }
}); });
Instance.AddCommand("css_useSkill", "Use Skill", (player, _) =>
{
if (player == null) return;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
UseSkill(player);
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
@ -115,7 +107,7 @@ namespace jRandomSkills
player.PrintToCenterHtml(hudContent); player.PrintToCenterHtml(hudContent);
} }
private 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) return; if (playerPawn?.CBodyComponent == null) return;

View file

@ -0,0 +1,147 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
using static CounterStrikeSharp.API.Core.Listeners;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
{
public class ToxicSmoke : ISkill
{
private static Skills skillName = Skills.ToxicSmoke;
private static List<CCSPlayerPawn> players = new List<CCSPlayerPawn>();
private static Dictionary<int, CTriggerMultiple> triggers = new Dictionary<int, CTriggerMultiple>();
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
SkillUtils.RegisterSkill(skillName, "#507529");
Instance.RegisterEventHandler<EventRoundStart>((@event, info) =>
{
players.Clear();
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventSmokegrenadeDetonate>((@event, @info) =>
{
var player = @event.Userid;
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return HookResult.Continue;
var trigger = Utilities.CreateEntityByName<CTriggerMultiple>("trigger_multiple");
if (trigger == null) return HookResult.Continue;
trigger.Collision.SolidType = SolidType_t.SOLID_CAPSULE;
trigger.Collision.SolidFlags = 0;
trigger.Spawnflags = 1;
trigger.Globalname = $"toxic_smoke_{trigger.Index}";
trigger.Collision.SolidFlags = 1;
trigger.AbsOrigin.X = @event.X;
trigger.AbsOrigin.Y = @event.Y;
trigger.AbsOrigin.Z = @event.Z;
trigger.Collision.CapsuleRadius = 160;
trigger.Collision.BoundingRadius = 160;
trigger.Collision.CollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_TRIGGER;
trigger.Collision.EnablePhysics = 1;
trigger.Collision.TriggerBloat = 0;
trigger.Collision.SurroundType = SurroundingBoundsType_t.USE_OBB_COLLISION_BOUNDS;
trigger.Collision.CollisionAttribute.CollisionFunctionMask = 39;
trigger.Collision.CollisionAttribute.CollisionGroup = 2;
trigger.DispatchSpawn();
triggers.Add(@event.Entityid, trigger);
return HookResult.Continue;
});
Instance.RegisterEventHandler<EventSmokegrenadeExpired>((@event, @info) =>
{
var player = @event.Userid;
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
if (triggers.TryGetValue(@event.Entityid, out var existingTrigger))
{
existingTrigger.AcceptInput("Kill");
triggers.Remove(@event.Entityid);
}
return HookResult.Continue;
});
Instance.RegisterListener<OnTick>(() =>
{
foreach (CCSPlayerPawn player in players)
{
if (Server.TickCount % 10 == 0)
AddHealth(player, -2);
}
});
VirtualFunctions.CBaseTrigger_StartTouchFunc.Hook(StartTouchFun, HookMode.Post);
VirtualFunctions.CBaseTrigger_EndTouchFunc.Hook(EndTouchFunc, HookMode.Post);
}
private static void AddHealth(CCSPlayerPawn player, int health)
{
if (player.LifeState != (byte)LifeState_t.LIFE_ALIVE)
return;
player.Health += health;
Utilities.SetStateChanged(player, "CBaseEntity", "m_iHealth");
player.EmitSound("");
if (player.Health <= 0)
player.CommitSuicide(false, true);
}
private static HookResult StartTouchFun(DynamicHook h)
{
CBaseTrigger trigger = h.GetParam<CBaseTrigger>(0);
CBaseEntity entity = h.GetParam<CBaseEntity>(1);
if (trigger == null || entity == null)
return HookResult.Continue;
CCSPlayerPawn player = new CCSPlayerPawn(entity.Handle);
if (player == null) return HookResult.Continue;
if (string.IsNullOrEmpty(trigger?.Globalname) || trigger?.Globalname?.StartsWith("toxic_smoke_") == false)
return HookResult.Continue;
if (!players.Contains(player))
players.Add(player);
return HookResult.Continue;
}
private static HookResult EndTouchFunc(DynamicHook h)
{
var trigger = h.GetParam<CBaseTrigger>(0);
var entity = h.GetParam<CBaseEntity>(1);
if (trigger == null || entity == null) return HookResult.Continue;
CCSPlayerPawn player = new CCSPlayerPawn(entity.Handle);
if (player == null) return HookResult.Continue;
if (string.IsNullOrEmpty(trigger?.Globalname) || trigger?.Globalname?.StartsWith("toxic_smoke_") == false)
return HookResult.Continue;
if (players.Contains(player))
players.Remove(player);
return HookResult.Continue;
}
}
}

View file

@ -1,8 +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 jRandomSkills.src.utils; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
@ -12,18 +13,19 @@ namespace jRandomSkills
{ {
private static Skills skillName = Skills.Wallhack; private static Skills skillName = Skills.Wallhack;
private static List<CDynamicProp> glows = new List<CDynamicProp>(); private static List<CDynamicProp> glows = new List<CDynamicProp>();
private static Dictionary<CCSPlayerController, byte> orginalTeams = new Dictionary<CCSPlayerController, byte>();
public static void LoadSkill() public static void LoadSkill()
{ {
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#5d00ff"); SkillUtils.RegisterSkill(skillName, "#5d00ff");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, @info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, @info) =>
{ {
glows.Clear(); glows.Clear();
Instance.AddTimer(.1f, () => Instance.AddTimer(2f, () =>
{ {
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
{ {
@ -38,11 +40,19 @@ namespace jRandomSkills
}); });
return HookResult.Continue; return HookResult.Continue;
}); });
Instance.RegisterEventHandler<EventRoundEnd>((@event, @info) =>
{
DisableSkill(null);
return HookResult.Continue;
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
{ {
SetGlowEffectForEnemies(player); SetGlowEffectForEnemies(player);
orginalTeams.TryAdd(player, player.TeamNum);
player.PlayerPawn.Value.TeamNum = 1;
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
@ -52,12 +62,24 @@ namespace jRandomSkills
glows.Remove(glow); glows.Remove(glow);
glow.Remove(); glow.Remove();
} }
foreach (var orginalTeam in orginalTeams)
{
if (orginalTeam.Key != null)
orginalTeam.Key.PlayerPawn.Value.TeamNum = orginalTeam.Value;
orginalTeams.Remove(orginalTeam.Key);
}
} }
private static void SetGlowEffectForEnemies(CCSPlayerController player) private static async void SetGlowEffectForEnemies(CCSPlayerController player)
{ {
foreach (var enemy in Utilities.GetPlayers().FindAll(p => p.Team != player.Team && p.PawnIsAlive)) CsTeam originalTeam = player.Team;
foreach (var enemy in Utilities.GetPlayers().FindAll(p => p.Team != originalTeam && p.PawnIsAlive))
{ {
var enemyInfo = Instance.skillPlayer.FirstOrDefault(e => e.SteamID == enemy.SteamID);
if (enemyInfo?.Skill == Skills.Ghost)
return;
var enemyPawn = enemy.PlayerPawn.Value; var enemyPawn = enemy.PlayerPawn.Value;
var modelGlow = Utilities.CreateEntityByName<CDynamicProp>("prop_dynamic"); var modelGlow = Utilities.CreateEntityByName<CDynamicProp>("prop_dynamic");
var modelRelay = Utilities.CreateEntityByName<CDynamicProp>("prop_dynamic"); var modelRelay = Utilities.CreateEntityByName<CDynamicProp>("prop_dynamic");
@ -79,7 +101,7 @@ namespace jRandomSkills
modelGlow.Glow.GlowColorOverride = enemy.Team == CsTeam.Terrorist ? Color.FromArgb(255, 255, 165, 0) : Color.FromArgb(255, 173, 216, 230); modelGlow.Glow.GlowColorOverride = enemy.Team == CsTeam.Terrorist ? Color.FromArgb(255, 255, 165, 0) : Color.FromArgb(255, 173, 216, 230);
modelGlow.Glow.GlowRange = 5000; modelGlow.Glow.GlowRange = 5000;
modelGlow.Glow.GlowTeam = (int)player.Team; modelGlow.Glow.GlowTeam = (int)CsTeam.Spectator;
modelGlow.Glow.GlowType = 3; modelGlow.Glow.GlowType = 3;
modelGlow.Glow.GlowRangeMin = 100; modelGlow.Glow.GlowRangeMin = 100;

View file

@ -25,7 +25,7 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#c7e03a"); SkillUtils.RegisterSkill(skillName, "#c7e03a");
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) => Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
{ {
@ -75,14 +75,6 @@ namespace jRandomSkills
UpdateHUD(player, skillInfo, false); UpdateHUD(player, skillInfo, false);
} }
}); });
Instance.AddCommand("css_useSkill", "Use Skill", (player, _) =>
{
if (player == null) return;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
UseSkill(player);
});
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
@ -126,7 +118,7 @@ namespace jRandomSkills
if (showInfo) if (showInfo)
remainingLine = cooldown != 0 ? $"<font class='fontSize-m' color='#FFFFFF'>{Localization.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}</font> <br>" remainingLine = cooldown != 0 ? $"<font class='fontSize-m' color='#FFFFFF'>{Localization.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}</font> <br>"
: !skillInfo.FindedEnemy ? $"<font class='fontSize-m' color='#FF0000'>{Localization.GetTranslation("hud_info_no_enemy")}</font> <br>" : !skillInfo.FindedEnemy ? $"<font class='fontSize-m' color='#FF0000'>{Localization.GetTranslation("hud_info_no_enemy")}</font> <br>"
: !skillInfo.HaveWeapon ? $"<font class='fontSize-m' color='#FF0000'>{Localization.GetTranslation("weaponsswap_hud_info")}</font> <br>" : !skillInfo.HaveWeapon ? $"<font class='fontSize-m' color='#FF0000'>{Localization.GetTranslation("weaponsswap_hud_info2")}</font> <br>"
: ""; : "";
else else
remainingLine = cooldown != 0 ? $"<font class='fontSize-m' color='#FFFFFF'>{Localization.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}</font> <br>" : ""; remainingLine = cooldown != 0 ? $"<font class='fontSize-m' color='#FFFFFF'>{Localization.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}</font> <br>" : "";
@ -143,7 +135,7 @@ namespace jRandomSkills
} }
} }
private 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) return; if (playerPawn?.CBodyComponent == null) return;

View file

@ -1,4 +1,6 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using jRandomSkills.src.player; using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
@ -13,7 +15,23 @@ namespace jRandomSkills
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return; return;
Utils.RegisterSkill(skillName, "#fbff00"); SkillUtils.RegisterSkill(skillName, "#fbff00");
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<EventWeaponFire>((@event, info) => Instance.RegisterEventHandler<EventWeaponFire>((@event, info) =>
{ {
@ -40,5 +58,10 @@ namespace jRandomSkills
return HookResult.Continue; return HookResult.Continue;
}); });
} }
public static void EnableSkill(CCSPlayerController player)
{
SkillUtils.TryGiveWeapon(player, CsItem.Zeus);
}
} }
} }

View file

@ -1,7 +1,6 @@
using jRandomSkills.src.player; using jRandomSkills.src.player;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Diagnostics.Metrics;
using static jRandomSkills.jRandomSkills; using static jRandomSkills.jRandomSkills;
namespace jRandomSkills namespace jRandomSkills
@ -69,9 +68,32 @@ namespace jRandomSkills
public class ConfigModel public class ConfigModel
{ {
// Team: 2 - TT, 3 - CT
public Settings Settings { get; set; } = new Settings(); public Settings Settings { get; set; } = new Settings();
public SkillInfo[] SkillsInfo = { public SkillInfo[] SkillsInfo = {
new SkillInfo(Skills.None), new SkillInfo(Skills.None),
new SkillInfo(Skills.NoRecoil),
new SkillInfo(Skills.SecondLife),
new SkillInfo(Skills.C4Camouflage),
new SkillInfo(Skills.Ninja),
new SkillInfo(Skills.SoundMaker, cooldown: 5),
new SkillInfo(Skills.Prosthesis),
new SkillInfo(Skills.OnlyHead),
new SkillInfo(Skills.ReactiveArmor, cooldown: 15),
new SkillInfo(Skills.ReturnToSender),
new SkillInfo(Skills.Jammer),
new SkillInfo(Skills.RobinHood),
new SkillInfo(Skills.Hermit),
new SkillInfo(Skills.AreaReaper, team: 3),
new SkillInfo(Skills.Mute),
new SkillInfo(Skills.HolyHandGrenade),
new SkillInfo(Skills.Replicator, cooldown: 15),
new SkillInfo(Skills.ToxicSmoke),
new SkillInfo(Skills.Duplicator),
new SkillInfo(Skills.Thief),
new SkillInfo(Skills.Deactivator),
new SkillInfo(Skills.Dwarf, chanceFrom: .6f, chanceTo : .95f), new SkillInfo(Skills.Dwarf, chanceFrom: .6f, chanceTo : .95f),
new SkillInfo(Skills.SwapPosition, cooldown: 30), new SkillInfo(Skills.SwapPosition, cooldown: 30),
new SkillInfo(Skills.FrozenDecoy), new SkillInfo(Skills.FrozenDecoy),

View file

@ -0,0 +1,75 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
namespace jRandomSkills
{
public static class SkillUtils
{
public static void PrintToChat(CCSPlayerController player, string msg, bool isError)
{
string checkIcon = isError ? $"{ChatColors.DarkRed}✖{ChatColors.LightRed}" : $"{ChatColors.Green}✔{ChatColors.Lime}";
player.PrintToChat($" {ChatColors.DarkRed}► {ChatColors.Green}[{ChatColors.DarkRed} jRadnomSkills {ChatColors.Green}] {checkIcon} {msg}");
}
public static void RegisterSkill(Skills skill, string color, bool display = true)
{
if (!SkillData.Skills.Any(s => s.Skill == skill))
SkillData.Skills.Add(new dSkill_SkillInfo(skill, color, display));
}
public static void TryGiveWeapon(CCSPlayerController player, CsItem item, int count = 1)
{
string? itemString = EnumUtils.GetEnumMemberAttributeValue(item);
if (string.IsNullOrWhiteSpace(itemString)) return;
var exists = player.PlayerPawn.Value.WeaponServices.MyWeapons.FirstOrDefault(w => w.Value.DesignerName == itemString);
if (exists == null)
for (int i = 0; i < count; i++)
player.GiveNamedItem(item);
}
public static Vector GetForwardVector(QAngle angles)
{
float pitch = angles.X * (float)(Math.PI / 180);
float yaw = angles.Y * (float)(Math.PI / 180);
float x = (float)(Math.Cos(pitch) * Math.Cos(yaw));
float y = (float)(Math.Cos(pitch) * Math.Sin(yaw));
float z = (float)Math.Sin(pitch);
return new Vector(x, y, z);
}
public static void TakeHealth(CCSPlayerPawn pawn, int damage)
{
if (pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE)
return;
int newHealth = (int)(pawn.Health - damage);
pawn.Health = newHealth;
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth");
if (pawn.Health <= 0)
Server.NextFrame(() =>
{
pawn?.CommitSuicide(false, true);
});
}
public static void AddHealth(CCSPlayerPawn pawn, int extraHealth, int maxHealth = 100)
{
if (pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE)
return;
int newHealth = (int)(pawn.Health + extraHealth);
pawn.Health = Math.Min(newHealth, maxHealth);
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth");
pawn.MaxHealth = maxHealth;
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iMaxHealth");
}
}
}

View file

@ -1,23 +0,0 @@
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
namespace jRandomSkills
{
public static class Utils
{
public static void PrintToChat(CCSPlayerController player, string msg, bool isError)
{
string checkIcon = isError ? $"{ChatColors.DarkRed}✖{ChatColors.LightRed}" : $"{ChatColors.Green}✔{ChatColors.Lime}";
player.PrintToChat($" {ChatColors.DarkRed}► {ChatColors.Green}[{ChatColors.DarkRed} jRadnomSkills {ChatColors.Green}] {checkIcon} {msg}");
}
public static void RegisterSkill(Skills skill, string color, bool display = true)
{
if (!SkillData.Skills.Any(s => s.Skill == skill))
{
SkillData.Skills.Add(new dSkill_SkillInfo(skill, color, display));
}
}
}
}