WIP
This commit is contained in:
parent
e44af68309
commit
6b8988ade4
77 changed files with 3033 additions and 391 deletions
|
|
@ -4,6 +4,7 @@
|
|||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
@ -11,7 +12,7 @@
|
|||
</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" />
|
||||
</ItemGroup>
|
||||
|
||||
|
|
|
|||
|
|
@ -4,12 +4,15 @@ using CounterStrikeSharp.API.Modules.Admin;
|
|||
using CounterStrikeSharp.API.Modules.Commands;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using jRandomSkills.src.utils;
|
||||
using System;
|
||||
using static jRandomSkills.jRandomSkills;
|
||||
|
||||
namespace jRandomSkills
|
||||
{
|
||||
public static class Command
|
||||
{
|
||||
private static bool gamePaused = false;
|
||||
|
||||
public static void Load()
|
||||
{
|
||||
var config = Config.config?.Settings;
|
||||
|
|
@ -18,7 +21,8 @@ namespace jRandomSkills
|
|||
var commands = new Dictionary<IEnumerable<string>, (string description, CommandInfo.CommandCallback handler)>
|
||||
{
|
||||
{ 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)
|
||||
|
|
@ -32,6 +36,9 @@ namespace jRandomSkills
|
|||
Instance.AddCommand($"css_map", "", Command_ChangeMap);
|
||||
Instance.AddCommand($"css_console", "", Command_CustomCommand);
|
||||
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)
|
||||
|
|
@ -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")]
|
||||
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)]
|
||||
public static void Command_SetSkill(CCSPlayerController? player, CommandInfo command)
|
||||
|
|
@ -58,7 +82,15 @@ namespace jRandomSkills
|
|||
if (command.ArgCount < 2)
|
||||
{
|
||||
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}―――――――――――");
|
||||
return;
|
||||
}
|
||||
|
|
@ -69,7 +101,7 @@ namespace jRandomSkills
|
|||
if (skill == null)
|
||||
{
|
||||
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}―――――――――――");
|
||||
return;
|
||||
}
|
||||
|
|
@ -85,13 +117,13 @@ namespace jRandomSkills
|
|||
Instance.SkillAction(skill.Skill.ToString(), "EnableSkill", new object[] { target });
|
||||
|
||||
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}―――――――――――");
|
||||
}
|
||||
else
|
||||
{
|
||||
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}―――――――――――");
|
||||
}
|
||||
}
|
||||
|
|
@ -156,5 +188,39 @@ namespace jRandomSkills
|
|||
string param = command.GetArg(1);
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -18,7 +18,7 @@ namespace jRandomSkills
|
|||
public override string ModuleName => "[CS2] [ jRandomSkills ]";
|
||||
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 ModuleVersion => "1.0.3";
|
||||
public override string ModuleVersion => "1.0.4";
|
||||
|
||||
public override void Load(bool hotReload)
|
||||
{
|
||||
|
|
@ -26,10 +26,23 @@ namespace jRandomSkills
|
|||
|
||||
Config.Initialize();
|
||||
Localization.Load();
|
||||
// Debug.Load();
|
||||
Event.Load();
|
||||
PlayerOnTick.Load();
|
||||
Command.Load();
|
||||
|
||||
|
||||
None.LoadSkill();
|
||||
// -> Mute.LoadSkill();;
|
||||
// -> ToxicSmoke.LoadSkill();
|
||||
|
||||
// Shade.LoadSkill();
|
||||
// FrozenDecoy.LoadSkill();
|
||||
// Medic.LoadSkill();
|
||||
|
||||
|
||||
return;
|
||||
|
||||
foreach (var skill in Enum.GetValues(typeof(Skills)))
|
||||
SkillAction(skill.ToString(), "LoadSkill");
|
||||
}
|
||||
|
|
@ -53,7 +66,7 @@ namespace jRandomSkills
|
|||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
internal void RegisterListener<T>(Action<object, object> value)
|
||||
internal void RegisterListener<T>(Action<object, object> value, HookMode pre)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
|
@ -79,6 +92,7 @@ namespace jRandomSkills
|
|||
public required ulong SteamID { get; set; }
|
||||
public required string PlayerName { get; set; }
|
||||
public Skills Skill { get; set; }
|
||||
public Skills SpecialSkill { get; set; }
|
||||
public float? SkillChance { get; set; }
|
||||
public bool IsDrawing { get; set; }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,66 +1,200 @@
|
|||
{
|
||||
"none": "Brak",
|
||||
"none_desc": "Nie posiadasz żadnej supermocy",
|
||||
|
||||
"aimbot": "Aimbot",
|
||||
"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",
|
||||
|
||||
"astronaut": "Astronauta",
|
||||
"astronaut_desc": "Otrzymujesz losową ilość grawitacji na start rundy",
|
||||
"astronaut_desc2": "Twoja losowa grawitacja wynosi: {0}x",
|
||||
|
||||
"richboy": "Bogacz",
|
||||
"richboy_desc": "Otrzymujesz losową ilość kasy na start rundy",
|
||||
|
||||
"bunnyhop": "Królik",
|
||||
"bunnyhop_desc": "Otrzymujesz auto \"BunnyHopa\"",
|
||||
|
||||
"silent": "Cichociemny",
|
||||
"silent_desc": "Twoje kroki i skoki są niesłyszalne dla INNYCH graczy",
|
||||
|
||||
"shade": "Cień",
|
||||
"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ń",
|
||||
|
||||
"ghost": "Duszek",
|
||||
"ghost_desc": "Jesteś całkowicie niewidzialny",
|
||||
|
||||
"flash": "Flash",
|
||||
"flash_desc": "Losowa prędkośc postaci na początku rundy",
|
||||
"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_on": "Nieśmiertelność włączona",
|
||||
"godmode_off": "Nieśmiertelność wyłączona",
|
||||
|
||||
"armored": "Gruby",
|
||||
"armored_desc": "Masz losowy mnożnik otrzymywanych obrażeń",
|
||||
"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",
|
||||
|
||||
"dwarf": "MiniMajk",
|
||||
"dwarf_desc": "Losowa wielkość postaci na początku rundy",
|
||||
"dwarf_desc2": "Twój mnożnik wielkości to {0}x",
|
||||
|
||||
"medic": "Medyk",
|
||||
"medic_desc": "Otrzymujesz losową ilość apteczek na start rundy",
|
||||
|
||||
"randomweapon": "Losowa Broń",
|
||||
"randomweapon_desc": "Dostajesz losową broń. Kliknij [css_useSkill], cooldown 15s",
|
||||
|
||||
"chicken": "Kurczak",
|
||||
"chicken_desc": "Otrzymujesz model kurczaka + jesteś o 10% szybszy - 50hp",
|
||||
|
||||
"impostor": "Szpieg",
|
||||
"impostor_desc": "Otrzymujesz na start rundy model postaci wroga",
|
||||
|
||||
"catapult": "Katapulta",
|
||||
"catapult_desc": "Masz losową szanse na podrzucenie wroga",
|
||||
"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",
|
||||
|
||||
"behind": "Obrót Wroga",
|
||||
"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}%",
|
||||
|
||||
"retreat": "Odwrót",
|
||||
"retreat_desc": "Powrót na spawna. Kliknij [css_useSkill], cooldown 15s",
|
||||
|
||||
"oneshot": "Jednostrzałowiec",
|
||||
"oneshot_desc": "Po trafieniu od razu zabija przeciwnika",
|
||||
|
||||
"paweljumper": "Pawel Jumper",
|
||||
"paweljumper_desc": "Otrzymujesz dodatkowy skok",
|
||||
|
||||
"phoenix": "Phoenix",
|
||||
"phoenix_desc": "Masz losową szans na odrodzenie się po śmierci",
|
||||
"phoenix_desc2": "Twoje szanse na odrodzenie się po śmierci: {0}%",
|
||||
"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_hud_info": "W trakcie odnawiania",
|
||||
|
||||
"radarhack": "Radarowiec",
|
||||
"radarhack_desc": "Widzisz wrogów na radarze",
|
||||
|
||||
"rambo": "Rambo",
|
||||
"rambo_desc": "Otrzymujesz losową ilość zdrowia na start rundy",
|
||||
|
||||
"enemyspawn": "Resp Wroga",
|
||||
"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_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",
|
||||
|
||||
"saper": "Saper",
|
||||
"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",
|
||||
|
||||
"quickshot": "Szybkostrzelność",
|
||||
"quickshot_desc": "Brak cooldown przy strzelaniu",
|
||||
|
||||
"teleporter": "Teleporter",
|
||||
"teleporter_desc": "Zamieniasz się miejscami z trafionym wrogiem",
|
||||
|
||||
"wallhack": "Wallhack",
|
||||
"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)",
|
||||
|
||||
"weaponsswap": "Zamiana Broni",
|
||||
"weaponsswap_desc": "Zamieniasz się bronią z losowym wrogiem. Kliknij [css_useSkill], cooldown 30s",
|
||||
"weaponsswap_hud_info2": "Nie posiadasz broni na zamiane",
|
||||
"hud_info_no_enemy": "Nie znaleziono przeciwnika",
|
||||
|
||||
"zeus": "Zeus",
|
||||
"zeus_desc": "Zeus x27 natychmiastowo się odnawia",
|
||||
|
||||
"frozendecoy": "Zamrażający Decoy",
|
||||
"frozendecoy_desc": "Twój decoy zamraża wszystkich pobliskich graczy",
|
||||
|
||||
"antyhead": "Żelazna Głowa",
|
||||
"antyhead_desc": "Nie otrzymujesz obrażeń w głowę",
|
||||
|
||||
"soldier": "Żołnierz",
|
||||
"soldier_desc": "Masz losowy mnożnik obrażeń",
|
||||
"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",
|
||||
|
||||
"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}",
|
||||
"hud_info": "Poczekaj jeszcze {0} sekund",
|
||||
"disabled_weapon": "Nie możesz używać tej broni",
|
||||
"no_player": "Nie znaleziono pasującego gracza.",
|
||||
"duplicate_player": "Znaleziono więcej niż jednego gracza o tej samej nazwie.",
|
||||
"drawing_skill": "Losowanie mocy",
|
||||
|
|
@ -75,53 +209,9 @@
|
|||
"loading_map": "Ładowanie nowej mapy",
|
||||
"skills_menu": "Lista Super Mocy",
|
||||
"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",
|
||||
"error_setskill": "Nie udało się ustawić CHATCOLORS.REDsupermocy",
|
||||
"done_setskill": "Ustawiono Supermoc",
|
||||
"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"
|
||||
"for_setskill": "dla"
|
||||
}
|
||||
|
|
@ -25,7 +25,7 @@ namespace jRandomSkills
|
|||
string skillName = cleanSkillName.Replace($" ★ ", "");
|
||||
int intValue = Array.IndexOf(SkillData.Skills.Select(r => r.Name).ToArray(), skillName);
|
||||
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);
|
||||
});
|
||||
}
|
||||
|
|
|
|||
135
jRandomSkills - SRC Files/src/player/Debug.cs
Normal file
135
jRandomSkills - SRC Files/src/player/Debug.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -5,15 +5,10 @@ namespace jRandomSkills.src.player;
|
|||
public interface ISkill
|
||||
{
|
||||
public static void LoadSkill() { }
|
||||
public static void EnableSkill(CCSPlayerController player)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public static void DisableSkill(CCSPlayerController player)
|
||||
{
|
||||
|
||||
}
|
||||
public static void EnableSkill(CCSPlayerController player) { }
|
||||
public static void DisableSkill(CCSPlayerController player) { }
|
||||
public static void UseSkill(CCSPlayerController player) { }
|
||||
public static void TypeSkill(CCSPlayerController player, string[] commands) { }
|
||||
}
|
||||
|
||||
public enum Skills
|
||||
|
|
@ -38,6 +33,27 @@ public enum Skills
|
|||
RandomWeapon,
|
||||
WeaponsSwap,
|
||||
Wallhack,
|
||||
Mute,
|
||||
HolyHandGrenade,
|
||||
Replicator,
|
||||
ToxicSmoke,
|
||||
Deactivator,
|
||||
Thief,
|
||||
Duplicator,
|
||||
AreaReaper,
|
||||
Hermit,
|
||||
RobinHood,
|
||||
Jammer,
|
||||
Glitch,
|
||||
ReturnToSender,
|
||||
ReactiveArmor,
|
||||
OnlyHead,
|
||||
Prosthesis,
|
||||
SoundMaker,
|
||||
Ninja,
|
||||
C4Camouflage,
|
||||
SecondLife,
|
||||
NoRecoil,
|
||||
|
||||
Flash,
|
||||
PawelJumper,
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@ namespace jRandomSkills
|
|||
SteamID = player.SteamID,
|
||||
PlayerName = player.PlayerName,
|
||||
Skill = src.player.Skills.None,
|
||||
SpecialSkill = Skills.None,
|
||||
IsDrawing = false,
|
||||
SkillChance = 1,
|
||||
});
|
||||
|
|
@ -84,11 +85,12 @@ namespace jRandomSkills
|
|||
string skillsText = "";
|
||||
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)
|
||||
{
|
||||
var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == _playerSkill);
|
||||
skillsText += $" {ChatColors.DarkRed}{_player.PlayerName}{ChatColors.Lime}: {skillInfo.Name}\n";
|
||||
var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == _playerSkill.Skill);
|
||||
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;
|
||||
|
||||
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();
|
||||
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)];
|
||||
skillPlayer.Skill = randomSkill.Skill;
|
||||
skillPlayer.SpecialSkill = Skills.None;
|
||||
Debug.WriteToDebug($"Player {skillPlayer.PlayerName} has got the skill \"{randomSkill.Name}\".");
|
||||
|
||||
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)
|
||||
{
|
||||
|
|
@ -159,7 +164,7 @@ namespace jRandomSkills
|
|||
|
||||
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"))
|
||||
if (!string.IsNullOrEmpty(text))
|
||||
player.PrintToChat(text);
|
||||
|
|
@ -172,6 +177,7 @@ namespace jRandomSkills
|
|||
return HookResult.Continue;
|
||||
});
|
||||
|
||||
|
||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
||||
{
|
||||
var victim = @event.Userid;
|
||||
|
|
@ -185,10 +191,11 @@ namespace jRandomSkills
|
|||
if (attackerInfo != null)
|
||||
{
|
||||
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.Skill);
|
||||
var specialSkillData = SkillData.Skills.FirstOrDefault(s => s.Skill == attackerInfo.SpecialSkill);
|
||||
string skillDesc = skillData?.Description;
|
||||
|
||||
Utils.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, $"{Localization.GetTranslation("enemy_skill")} {ChatColors.DarkRed}{attacker.PlayerName}{ChatColors.Lime}:", false);
|
||||
SkillUtils.PrintToChat(victim, $"{ChatColors.DarkRed}{(attackerInfo.SpecialSkill == Skills.None ? skillData.Name : $"{specialSkillData.Name} -> {skillData.Name}")}{ChatColors.Lime} - {skillDesc}", false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using jRandomSkills.src.player;
|
||||
using jRandomSkills.src.utils;
|
||||
using static CounterStrikeSharp.API.Core.Listeners;
|
||||
using static jRandomSkills.Config;
|
||||
using static jRandomSkills.jRandomSkills;
|
||||
|
||||
namespace jRandomSkills
|
||||
|
|
@ -67,8 +69,11 @@ namespace jRandomSkills
|
|||
var observeredPlayerSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == observeredPlayerSkill.Skill);
|
||||
if (observeredPlayerSkillInfo == null) return;
|
||||
|
||||
var observeredPlayerSpecialSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == observeredPlayerSkill.SpecialSkill);
|
||||
if (observeredPlayerSpecialSkillInfo == null) return;
|
||||
|
||||
infoLine = $"<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>";
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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.DynamicFunctions;
|
||||
using jRandomSkills.src.player;
|
||||
|
|
@ -17,7 +18,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#ff0000");
|
||||
SkillUtils.RegisterSkill(skillName, "#ff0000");
|
||||
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
|
||||
}
|
||||
|
||||
|
|
@ -26,16 +27,16 @@ namespace jRandomSkills
|
|||
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
||||
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;
|
||||
|
||||
CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.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;
|
||||
|
||||
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
|
||||
if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
|
||||
return HookResult.Continue;
|
||||
|
||||
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
||||
|
|
@ -46,7 +47,7 @@ namespace jRandomSkills
|
|||
|
||||
if (attacker.PawnIsAlive)
|
||||
{
|
||||
IntPtr hitGroupPointer = Marshal.ReadIntPtr(param2.Handle, 0x78);
|
||||
IntPtr hitGroupPointer = Marshal.ReadIntPtr(param2.Handle, GameData.GetOffset("CTakeDamageInfo_HitGroup"));
|
||||
if (hitGroupPointer != nint.Zero)
|
||||
{
|
||||
IntPtr hitGroupOffset = Marshal.ReadIntPtr(hitGroupPointer, 16);
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#D6E6FF");
|
||||
SkillUtils.RegisterSkill(skillName, "#D6E6FF");
|
||||
|
||||
Instance.RegisterEventHandler<EventPlayerBlind>((@event, info) =>
|
||||
{
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#8B4513");
|
||||
SkillUtils.RegisterSkill(skillName, "#8B4513");
|
||||
|
||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
||||
{
|
||||
|
|
|
|||
98
jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs
Normal file
98
jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs
Normal 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -18,7 +18,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#d1430a", false);
|
||||
SkillUtils.RegisterSkill(skillName, "#d1430a", false);
|
||||
|
||||
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;
|
||||
playerInfo.SkillChance = newScale;
|
||||
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)
|
||||
|
|
@ -58,16 +58,16 @@ namespace jRandomSkills
|
|||
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
||||
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;
|
||||
|
||||
CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.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;
|
||||
|
||||
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
|
||||
if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
|
||||
return HookResult.Continue;
|
||||
|
||||
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#7E10AD", false);
|
||||
SkillUtils.RegisterSkill(skillName, "#7E10AD", false);
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -53,7 +53,7 @@ namespace jRandomSkills
|
|||
if (skillConfig == null) return;
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#00FF00", false);
|
||||
SkillUtils.RegisterSkill(skillName, "#00FF00", false);
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -65,7 +65,7 @@ namespace jRandomSkills
|
|||
playerInfo.SkillChance = newChance;
|
||||
newChance = (float)Math.Round(newChance, 2) * 100;
|
||||
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)
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#EB4034");
|
||||
SkillUtils.RegisterSkill(skillName, "#EB4034");
|
||||
Instance.RegisterListener<OnTick>(OnTick);
|
||||
}
|
||||
|
||||
|
|
|
|||
121
jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs
Normal file
121
jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs
Normal 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -16,7 +16,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#FF4500", false);
|
||||
SkillUtils.RegisterSkill(skillName, "#FF4500", false);
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -72,7 +72,7 @@ namespace jRandomSkills
|
|||
playerInfo.SkillChance = newChance;
|
||||
newChance = (float)Math.Round(newChance, 2) * 100;
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -3,37 +3,51 @@ 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;
|
||||
using jRandomSkills.src.utils;
|
||||
|
||||
namespace jRandomSkills
|
||||
{
|
||||
public class Chicken : ISkill
|
||||
{
|
||||
private static Skills skillName = Skills.Chicken;
|
||||
private static string[] pistols =
|
||||
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_m4a4",
|
||||
"weapon_m4a1",
|
||||
"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"
|
||||
};
|
||||
private static readonly string defaultCTModel = "characters/models/ctm_sas/ctm_sas.vmdl";
|
||||
private static readonly string defaultTModel = "characters/models/tm_phoenix_heavy/tm_phoenix_heavy.vmdl";
|
||||
private static Dictionary<CCSPlayerController, CBaseModelEntity> chickens = new Dictionary<CCSPlayerController, CBaseModelEntity>();
|
||||
|
||||
public static void LoadSkill()
|
||||
{
|
||||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#FF8B42");
|
||||
SkillUtils.RegisterSkill(skillName, "#FF8B42");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -52,6 +66,35 @@ namespace jRandomSkills
|
|||
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);
|
||||
}
|
||||
|
||||
|
|
@ -60,13 +103,21 @@ namespace jRandomSkills
|
|||
var playerPawn = player.PlayerPawn?.Value;
|
||||
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;
|
||||
Utilities.SetStateChanged(player, "CCSPlayerPawn", "m_flVelocityModifier");
|
||||
|
||||
playerPawn.Health = 50;
|
||||
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;
|
||||
if (playerPawn != null)
|
||||
{
|
||||
SetPlayerModel(player, player.Team == CsTeam.CounterTerrorist ? defaultCTModel : defaultTModel);
|
||||
playerPawn.VelocityModifier = 1f;
|
||||
Utilities.SetStateChanged(player, "CCSPlayerPawn", "m_flVelocityModifier");
|
||||
|
||||
playerPawn.Health += 50;
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
Utilities.SetStateChanged(weapon.Value, "CBasePlayerWeapon", "m_nNextPrimaryAttackTick");
|
||||
Utilities.SetStateChanged(weapon.Value, "CBasePlayerWeapon", "m_nNextSecondaryAttackTick");
|
||||
}
|
||||
}
|
||||
|
||||
public static void SetPlayerModel(CCSPlayerController player, string model)
|
||||
private static void CreateChicken(CCSPlayerController player)
|
||||
{
|
||||
var pawn = player.PlayerPawn?.Value;
|
||||
if (pawn == null) return;
|
||||
var playerPawn = player.PlayerPawn.Value;
|
||||
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;
|
||||
pawn.Render = Color.FromArgb(255, originalRender.R, originalRender.G, originalRender.B);
|
||||
});
|
||||
var pawn = player.Pawn.Value;
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
121
jRandomSkills - SRC Files/src/player/skills/Deactivator.cs
Normal file
121
jRandomSkills - SRC Files/src/player/skills/Deactivator.cs
Normal 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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -16,7 +16,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#FF4500", false);
|
||||
SkillUtils.RegisterSkill(skillName, "#FF4500", false);
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -72,7 +72,7 @@ namespace jRandomSkills
|
|||
playerInfo.SkillChance = newChance;
|
||||
newChance = (float)Math.Round(newChance, 2) * 100;
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -14,7 +14,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#FA050D");
|
||||
SkillUtils.RegisterSkill(skillName, "#FA050D");
|
||||
|
||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
||||
{
|
||||
|
|
|
|||
102
jRandomSkills - SRC Files/src/player/skills/Duplicator.cs
Normal file
102
jRandomSkills - SRC Files/src/player/skills/Duplicator.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -16,7 +16,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#ffff00", false);
|
||||
SkillUtils.RegisterSkill(skillName, "#ffff00", false);
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -49,6 +49,12 @@ namespace jRandomSkills
|
|||
|
||||
return HookResult.Continue;
|
||||
});
|
||||
|
||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
||||
{
|
||||
DisableSkill(@event.Userid);
|
||||
return HookResult.Continue;
|
||||
});
|
||||
}
|
||||
|
||||
public static void EnableSkill(CCSPlayerController player)
|
||||
|
|
@ -62,10 +68,11 @@ namespace jRandomSkills
|
|||
float newSize = (float)Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom;
|
||||
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");
|
||||
|
||||
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;
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#ff8c92");
|
||||
SkillUtils.RegisterSkill(skillName, "#ff8c92");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -67,14 +67,6 @@ namespace jRandomSkills
|
|||
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)
|
||||
|
|
@ -139,7 +131,7 @@ namespace jRandomSkills
|
|||
}
|
||||
}
|
||||
|
||||
private static void UseSkill(CCSPlayerController player)
|
||||
public static void UseSkill(CCSPlayerController player)
|
||||
{
|
||||
var playerPawn = player.PlayerPawn.Value;
|
||||
if (playerPawn?.CBodyComponent == null) return;
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#A31912", false);
|
||||
SkillUtils.RegisterSkill(skillName, "#A31912", false);
|
||||
Instance.RegisterListener<OnTick>(UpdateSpeed);
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
|
|
@ -80,7 +80,7 @@ namespace jRandomSkills
|
|||
|
||||
playerPawn.VelocityModifier = newSpeed;
|
||||
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)
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ 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;
|
||||
|
||||
|
|
@ -23,7 +22,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#00eaff");
|
||||
SkillUtils.RegisterSkill(skillName, "#00eaff");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundStart>((@event, info) =>
|
||||
{
|
||||
|
|
@ -32,6 +31,22 @@ namespace jRandomSkills
|
|||
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) =>
|
||||
{
|
||||
var player = @event.Userid;
|
||||
|
|
@ -99,6 +114,11 @@ namespace jRandomSkills
|
|||
VirtualFunctions.CBaseTrigger_EndTouchFunc.Hook(EndTouchFunc, HookMode.Post);
|
||||
}
|
||||
|
||||
public static void EnableSkill(CCSPlayerController player)
|
||||
{
|
||||
SkillUtils.TryGiveWeapon(player, CsItem.DecoyGrenade);
|
||||
}
|
||||
|
||||
private static HookResult StartTouchFun(DynamicHook h)
|
||||
{
|
||||
CBaseTrigger trigger = h.GetParam<CBaseTrigger>(0);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ using System.Drawing;
|
|||
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;
|
||||
|
||||
|
|
@ -10,13 +11,51 @@ namespace jRandomSkills
|
|||
public class Ghost : ISkill
|
||||
{
|
||||
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()
|
||||
{
|
||||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#FFFFFF");
|
||||
SkillUtils.RegisterSkill(skillName, "#FFFFFF");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -28,9 +67,7 @@ namespace jRandomSkills
|
|||
|
||||
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (playerInfo?.Skill == skillName)
|
||||
{
|
||||
SetPlayerVisibility(player, false);
|
||||
}
|
||||
EnableSkill(player);
|
||||
}
|
||||
});
|
||||
|
||||
|
|
@ -44,7 +81,7 @@ namespace jRandomSkills
|
|||
if (!Instance.IsPlayerValid(player)) continue;
|
||||
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (playerInfo?.Skill == skillName)
|
||||
SetPlayerVisibility(player, true);
|
||||
DisableSkill(player);
|
||||
}
|
||||
return HookResult.Continue;
|
||||
});
|
||||
|
|
@ -56,12 +93,12 @@ namespace jRandomSkills
|
|||
|
||||
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (playerInfo?.Skill == skillName)
|
||||
SetPlayerVisibility(player, true);
|
||||
DisableSkill(player);
|
||||
|
||||
return HookResult.Continue;
|
||||
});
|
||||
|
||||
Instance.RegisterEventHandler<EventItemEquip>((@event, info) =>
|
||||
Instance.RegisterEventHandler<EventItemPickup>((@event, info) =>
|
||||
{
|
||||
var player = @event.Userid;
|
||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
||||
|
|
@ -69,6 +106,7 @@ namespace jRandomSkills
|
|||
|
||||
if (playerInfo?.Skill != skillName) return HookResult.Continue;
|
||||
SetWeaponVisibility(player, false);
|
||||
SetWeaponAttack(player, true);
|
||||
return HookResult.Continue;
|
||||
});
|
||||
|
||||
|
|
@ -78,11 +116,15 @@ namespace jRandomSkills
|
|||
public static void EnableSkill(CCSPlayerController player)
|
||||
{
|
||||
SetPlayerVisibility(player, false);
|
||||
SetWeaponVisibility(player, false);
|
||||
SetWeaponAttack(player, true);
|
||||
}
|
||||
|
||||
public static void DisableSkill(CCSPlayerController player)
|
||||
{
|
||||
SetPlayerVisibility(player, true);
|
||||
SetWeaponVisibility(player, true);
|
||||
SetWeaponAttack(player, false);
|
||||
}
|
||||
|
||||
private static void OnTick()
|
||||
|
|
@ -90,16 +132,8 @@ namespace jRandomSkills
|
|||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
|
||||
if (playerInfo?.Skill == skillName)
|
||||
{
|
||||
var activeWeapon = player.Pawn.Value.WeaponServices?.ActiveWeapon.Value;
|
||||
if (activeWeapon != null && activeWeapon.IsValid && activeWeapon.Clip1 != 0)
|
||||
{
|
||||
activeWeapon.Clip1 = 0;
|
||||
activeWeapon.Clip2 = 0;
|
||||
}
|
||||
}
|
||||
UpdateHUD(player);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -114,8 +148,6 @@ namespace jRandomSkills
|
|||
playerPawn.Render = color;
|
||||
playerPawn.ShadowStrength = shadowStrength;
|
||||
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 shadowStrength = visible ? 1.0f : 0.0f;
|
||||
|
||||
var activeWeapon = playerPawn.WeaponServices?.ActiveWeapon.Value;
|
||||
if (activeWeapon != null && activeWeapon.IsValid)
|
||||
foreach (var weapon in playerPawn.WeaponServices?.MyWeapons)
|
||||
{
|
||||
activeWeapon.Render = color;
|
||||
activeWeapon.ShadowStrength = shadowStrength;
|
||||
Utilities.SetStateChanged(activeWeapon, "CBaseModelEntity", "m_clrRender");
|
||||
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
|
||||
{
|
||||
weapon.Value.Render = color;
|
||||
weapon.Value.ShadowStrength = shadowStrength;
|
||||
Utilities.SetStateChanged(weapon.Value, "CBaseModelEntity", "m_clrRender");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var myWeapons = playerPawn.WeaponServices?.MyWeapons;
|
||||
if (myWeapons != null)
|
||||
private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon)
|
||||
{
|
||||
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;
|
||||
if (weapon != null)
|
||||
weapon.Value.NextPrimaryAttackTick = disableWeapon ? int.MaxValue : Server.TickCount;
|
||||
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;
|
||||
weapon.ShadowStrength = shadowStrength;
|
||||
Utilities.SetStateChanged(weapon, "CBaseModelEntity", "m_clrRender");
|
||||
}
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
96
jRandomSkills - SRC Files/src/player/skills/Glitch.cs
Normal file
96
jRandomSkills - SRC Files/src/player/skills/Glitch.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -19,7 +19,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#e0d83a");
|
||||
SkillUtils.RegisterSkill(skillName, "#e0d83a");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -66,14 +66,6 @@ namespace jRandomSkills
|
|||
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)
|
||||
|
|
@ -119,12 +111,10 @@ namespace jRandomSkills
|
|||
private static void ActiveUse(CCSPlayerController player)
|
||||
{
|
||||
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
||||
{
|
||||
skillInfo.CanUse = true;
|
||||
}
|
||||
}
|
||||
|
||||
private static void UseSkill(CCSPlayerController player)
|
||||
public static void UseSkill(CCSPlayerController player)
|
||||
{
|
||||
var playerPawn = player.PlayerPawn.Value;
|
||||
if (playerPawn?.CBodyComponent == null) return;
|
||||
|
|
@ -139,6 +129,7 @@ namespace jRandomSkills
|
|||
|
||||
player.PrintToChat($" {ChatColors.Green} {Localization.GetTranslation("godmode_on")}");
|
||||
player.PlayerPawn.Value.TakesDamage = false;
|
||||
|
||||
Instance.AddTimer(2, () => {
|
||||
if (player.IsValid && player.PawnIsAlive)
|
||||
{
|
||||
|
|
|
|||
83
jRandomSkills - SRC Files/src/player/skills/Hermit.cs
Normal file
83
jRandomSkills - SRC Files/src/player/skills/Hermit.cs
Normal 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;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -18,7 +18,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#99140B");
|
||||
SkillUtils.RegisterSkill(skillName, "#99140B");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#0000FF");
|
||||
SkillUtils.RegisterSkill(skillName, "#0000FF");
|
||||
|
||||
Instance.RegisterEventHandler<EventWeaponFire>((@event, info) =>
|
||||
{
|
||||
|
|
|
|||
106
jRandomSkills - SRC Files/src/player/skills/Jammer.cs
Normal file
106
jRandomSkills - SRC Files/src/player/skills/Jammer.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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.utils;
|
||||
using static jRandomSkills.jRandomSkills;
|
||||
|
||||
namespace jRandomSkills
|
||||
|
|
@ -14,7 +15,23 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
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) =>
|
||||
{
|
||||
|
|
@ -31,5 +48,10 @@ namespace jRandomSkills
|
|||
return HookResult.Continue;
|
||||
});
|
||||
}
|
||||
|
||||
public static void EnableSkill(CCSPlayerController player)
|
||||
{
|
||||
SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Entities.Constants;
|
||||
using jRandomSkills.src.player;
|
||||
using static jRandomSkills.jRandomSkills;
|
||||
|
||||
|
|
@ -14,7 +15,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#42FF5F");
|
||||
SkillUtils.RegisterSkill(skillName, "#42FF5F");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -48,8 +49,7 @@ namespace jRandomSkills
|
|||
public static void EnableSkill(CCSPlayerController player)
|
||||
{
|
||||
int healthshot = Instance.Random.Next(1, 10);
|
||||
for (int i = 0; i < healthshot; i++)
|
||||
player.GiveNamedItem("weapon_healthshot");
|
||||
SkillUtils.TryGiveWeapon(player, CsItem.Healthshot, healthshot);
|
||||
}
|
||||
|
||||
public static void DisableSkill(CCSPlayerController player)
|
||||
|
|
|
|||
|
|
@ -17,19 +17,16 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#F5CB42");
|
||||
SkillUtils.RegisterSkill(skillName, "#F5CB42");
|
||||
|
||||
Instance.RegisterEventHandler<EventPlayerDeath>((@event, info) =>
|
||||
{
|
||||
CCSPlayerController player = @event.Userid;
|
||||
|
||||
if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
|
||||
if (!IsDeadPlayerValid(player)) return HookResult.Continue;
|
||||
|
||||
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
|
||||
if (playerInfo?.Skill == skillName)
|
||||
{
|
||||
SpawnExplosion(player);
|
||||
}
|
||||
|
||||
return HookResult.Continue;
|
||||
});
|
||||
|
|
@ -51,7 +48,6 @@ namespace jRandomSkills
|
|||
heProjectile.DispatchSpawn();
|
||||
heProjectile.AcceptInput("InitializeSpawnFromWorld", player.PlayerPawn.Value, player.PlayerPawn.Value, "");
|
||||
heProjectile.DetonateTime = 0;
|
||||
|
||||
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" };
|
||||
|
|
@ -61,5 +57,10 @@ namespace jRandomSkills
|
|||
player.ExecuteClientCommand($"play vo/agents/balkan/{randomFile}.vsnd");
|
||||
});
|
||||
}
|
||||
|
||||
private static bool IsDeadPlayerValid(CCSPlayerController player)
|
||||
{
|
||||
return player != null && player.IsValid && player.PlayerPawn?.Value != null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using jRandomSkills.src.player;
|
||||
using static jRandomSkills.jRandomSkills;
|
||||
|
||||
|
|
@ -8,50 +7,57 @@ namespace jRandomSkills
|
|||
{
|
||||
public class Mute : ISkill
|
||||
{
|
||||
private static Skills skillName = Skills.None;
|
||||
private const float ExplosionRadius = 500.0f;
|
||||
private const int ExplosionDamage = 999;
|
||||
private static Skills skillName = Skills.AntyHead;
|
||||
|
||||
public static void LoadSkill()
|
||||
{
|
||||
return;
|
||||
|
||||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#F5CB42");
|
||||
SkillUtils.RegisterSkill(skillName, "#2fc468");
|
||||
|
||||
Instance.RegisterListener<Listeners.OnEntitySpawned>(@event =>
|
||||
{
|
||||
var name = @event.DesignerName;
|
||||
if (!name.EndsWith("_projectile"))
|
||||
if (!name.EndsWith("_projectile") && name != "instanced_scripted_scene")
|
||||
return;
|
||||
|
||||
// mp_freezetime 0; mp_warmup_end
|
||||
Server.PrintToChatAll("-> " + name);
|
||||
if (@event.DesignerName == "instanced_scripted_scene")
|
||||
{
|
||||
@event.AcceptInput("Kill");
|
||||
@event.Remove();
|
||||
return;
|
||||
}
|
||||
|
||||
Server.NextFrame(() => {
|
||||
switch (name)
|
||||
{
|
||||
case "flashbang_projectile":
|
||||
var flash = @event.As<CFlashbangProjectile>();
|
||||
break;
|
||||
case "smokegrenade_projectile":
|
||||
var smoke = @event.As<CSmokeGrenadeProjectile>();
|
||||
Schema.SetSchemaValue<int>(smoke.Handle, "CSmokeGrenadeProjectile", "m_nSmokeEffectTickBegin", int.MaxValue);
|
||||
Schema.SetSchemaValue<bool>(smoke.Handle, "CSmokeGrenadeProjectile", "m_bDidSmokeEffect", true);
|
||||
break;
|
||||
case "hegrenade_projectile":
|
||||
var hegrenade = @event.As<CHEGrenadeProjectile>();
|
||||
hegrenade.DetonateTime = 0;
|
||||
smoke.SmokeEffectTickBegin = int.MaxValue;
|
||||
break;
|
||||
case "molotov_projectile":
|
||||
var molotov = @event.As<CMolotovProjectile>();
|
||||
molotov.StillTimer.Timestamp = 0;
|
||||
molotov.Detonated = true;
|
||||
break;
|
||||
case "decoy_projectile":
|
||||
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;
|
||||
}
|
||||
|
||||
Instance.AddTimer(5f, () =>
|
||||
{
|
||||
if (@event != null && @event.IsValid)
|
||||
@event.Remove();
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
115
jRandomSkills - SRC Files/src/player/skills/Ninja.cs
Normal file
115
jRandomSkills - SRC Files/src/player/skills/Ninja.cs
Normal 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
77
jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs
Normal file
77
jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -8,7 +8,7 @@ namespace jRandomSkills
|
|||
|
||||
public static void LoadSkill()
|
||||
{
|
||||
Utils.RegisterSkill(skillName, "#FFFFFF", false);
|
||||
SkillUtils.RegisterSkill(skillName, "#FFFFFF", false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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.DynamicFunctions;
|
||||
using jRandomSkills.src.player;
|
||||
|
|
@ -15,7 +16,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#ff5CD9");
|
||||
SkillUtils.RegisterSkill(skillName, "#ff5CD9");
|
||||
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
|
||||
}
|
||||
|
||||
|
|
@ -24,16 +25,16 @@ namespace jRandomSkills
|
|||
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
||||
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;
|
||||
|
||||
CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.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;
|
||||
|
||||
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
|
||||
if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
|
||||
return HookResult.Continue;
|
||||
|
||||
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
||||
|
|
|
|||
49
jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs
Normal file
49
jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs
Normal 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -19,7 +19,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#FFA500");
|
||||
SkillUtils.RegisterSkill(skillName, "#FFA500");
|
||||
|
||||
Instance.RegisterListener<OnTick>(() =>
|
||||
{
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#ff5C0A", false);
|
||||
SkillUtils.RegisterSkill(skillName, "#ff5C0A", false);
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -24,7 +24,7 @@ namespace jRandomSkills
|
|||
{
|
||||
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);
|
||||
if (playerInfo?.Skill != skillName) continue;
|
||||
|
|
@ -48,7 +48,7 @@ namespace jRandomSkills
|
|||
{
|
||||
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;
|
||||
newChance = (float)Math.Round(newChance, 2) * 100;
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -18,7 +18,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#1466F5");
|
||||
SkillUtils.RegisterSkill(skillName, "#1466F5");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#7d7d7d");
|
||||
SkillUtils.RegisterSkill(skillName, "#7d7d7d");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundStart>((@event, @info) =>
|
||||
{
|
||||
|
|
|
|||
51
jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs
Normal file
51
jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs
Normal 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Modules.Memory;
|
||||
using jRandomSkills.src.player;
|
||||
using jRandomSkills.src.utils;
|
||||
using static CounterStrikeSharp.API.Core.Listeners;
|
||||
using static jRandomSkills.jRandomSkills;
|
||||
|
||||
|
|
@ -16,7 +15,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#8a42f5");
|
||||
SkillUtils.RegisterSkill(skillName, "#8a42f5");
|
||||
Instance.RegisterListener<OnTick>(OnTick);
|
||||
}
|
||||
|
||||
|
|
@ -32,6 +31,12 @@ namespace jRandomSkills
|
|||
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;
|
||||
|
||||
Schema.SetSchemaValue<Int32>(weapon.Handle, "CBasePlayerWeapon", "m_nNextPrimaryAttackTick", Server.TickCount);
|
||||
Schema.SetSchemaValue<Int32>(weapon.Handle, "CBasePlayerWeapon", "m_nNextSecondaryAttackTick", Server.TickCount);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#2effcb");
|
||||
SkillUtils.RegisterSkill(skillName, "#2effcb");
|
||||
Instance.RegisterListener<OnTick>(CheckRadarowiec);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#009905");
|
||||
SkillUtils.RegisterSkill(skillName, "#009905");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#e0873a");
|
||||
SkillUtils.RegisterSkill(skillName, "#e0873a");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -74,14 +74,6 @@ namespace jRandomSkills
|
|||
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)
|
||||
|
|
@ -124,7 +116,7 @@ namespace jRandomSkills
|
|||
player.PrintToCenterHtml(hudContent);
|
||||
}
|
||||
|
||||
private static void UseSkill(CCSPlayerController player)
|
||||
public static void UseSkill(CCSPlayerController player)
|
||||
{
|
||||
var playerPawn = player.PlayerPawn.Value;
|
||||
if (playerPawn?.CBodyComponent == null) return;
|
||||
|
|
|
|||
150
jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs
Normal file
150
jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
}
|
||||
187
jRandomSkills - SRC Files/src/player/skills/Replicator.cs
Normal file
187
jRandomSkills - SRC Files/src/player/skills/Replicator.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -19,7 +19,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#a86eff");
|
||||
SkillUtils.RegisterSkill(skillName, "#a86eff");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -66,14 +66,6 @@ namespace jRandomSkills
|
|||
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)
|
||||
|
|
@ -116,15 +108,7 @@ namespace jRandomSkills
|
|||
player.PrintToCenterHtml(hudContent);
|
||||
}
|
||||
|
||||
private static void ActiveUse(CCSPlayerController player)
|
||||
{
|
||||
if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
|
||||
{
|
||||
skillInfo.CanUse = true;
|
||||
}
|
||||
}
|
||||
|
||||
private static void UseSkill(CCSPlayerController player)
|
||||
public static void UseSkill(CCSPlayerController player)
|
||||
{
|
||||
var playerPawn = player.PlayerPawn.Value;
|
||||
if (playerPawn?.CBodyComponent == null) return;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -14,7 +14,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#D4AF37");
|
||||
SkillUtils.RegisterSkill(skillName, "#D4AF37");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
|
|||
49
jRandomSkills - SRC Files/src/player/skills/RobinHood.cs
Normal file
49
jRandomSkills - SRC Files/src/player/skills/RobinHood.cs
Normal 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -12,7 +12,7 @@ namespace jRandomSkills
|
|||
|
||||
public static void LoadSkill()
|
||||
{
|
||||
Utils.RegisterSkill(skillName, "#8A2BE2");
|
||||
SkillUtils.RegisterSkill(skillName, "#8A2BE2");
|
||||
|
||||
Instance.RegisterEventHandler<EventBombBeginplant>((@event, info) =>
|
||||
{
|
||||
|
|
|
|||
102
jRandomSkills - SRC Files/src/player/skills/SecondLife.cs
Normal file
102
jRandomSkills - SRC Files/src/player/skills/SecondLife.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,8 @@
|
|||
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
|
||||
|
|
@ -15,7 +17,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#18171A");
|
||||
SkillUtils.RegisterSkill(skillName, "#18171A");
|
||||
|
||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
||||
{
|
||||
|
|
@ -32,6 +34,13 @@ namespace jRandomSkills
|
|||
|
||||
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)
|
||||
|
|
@ -44,21 +53,8 @@ namespace jRandomSkills
|
|||
Vector victimPosition = victimPawn.AbsOrigin;
|
||||
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));
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using jRandomSkills.src.player;
|
||||
using jRandomSkills.src.utils;
|
||||
using static jRandomSkills.jRandomSkills;
|
||||
|
||||
namespace jRandomSkills
|
||||
|
|
@ -15,7 +14,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#333333");
|
||||
SkillUtils.RegisterSkill(skillName, "#333333");
|
||||
|
||||
Instance.HookUserMessage(208, um =>
|
||||
{
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#09ba00", false);
|
||||
SkillUtils.RegisterSkill(skillName, "#09ba00", false);
|
||||
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
|
|
@ -49,7 +49,7 @@ namespace jRandomSkills
|
|||
float newScale = (float)Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom;
|
||||
playerInfo.SkillChance = newScale;
|
||||
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)
|
||||
|
|
@ -57,16 +57,16 @@ namespace jRandomSkills
|
|||
CEntityInstance param = h.GetParam<CEntityInstance>(0);
|
||||
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;
|
||||
|
||||
CCSPlayerPawn attackerPawn = new CCSPlayerPawn(param2.Attacker.Value.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;
|
||||
|
||||
if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
|
||||
if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
|
||||
return HookResult.Continue;
|
||||
|
||||
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
|
||||
|
|
|
|||
145
jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs
Normal file
145
jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -19,7 +19,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#1466F5");
|
||||
SkillUtils.RegisterSkill(skillName, "#1466F5");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -69,14 +69,6 @@ namespace jRandomSkills
|
|||
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)
|
||||
|
|
@ -127,7 +119,7 @@ namespace jRandomSkills
|
|||
player.PrintToCenterHtml(hudContent);
|
||||
}
|
||||
|
||||
private static void UseSkill(CCSPlayerController player)
|
||||
public static void UseSkill(CCSPlayerController player)
|
||||
{
|
||||
var playerPawn = player.PlayerPawn.Value;
|
||||
if (playerPawn?.CBodyComponent == null) return;
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#8A2BE2");
|
||||
SkillUtils.RegisterSkill(skillName, "#8A2BE2");
|
||||
|
||||
Instance.RegisterEventHandler<EventPlayerHurt>((@event, info) =>
|
||||
{
|
||||
|
|
|
|||
110
jRandomSkills - SRC Files/src/player/skills/Thief.cs
Normal file
110
jRandomSkills - SRC Files/src/player/skills/Thief.cs
Normal 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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -18,7 +18,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#2ec761");
|
||||
SkillUtils.RegisterSkill(skillName, "#2ec761");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -65,14 +65,6 @@ namespace jRandomSkills
|
|||
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)
|
||||
|
|
@ -115,7 +107,7 @@ namespace jRandomSkills
|
|||
player.PrintToCenterHtml(hudContent);
|
||||
}
|
||||
|
||||
private static void UseSkill(CCSPlayerController player)
|
||||
public static void UseSkill(CCSPlayerController player)
|
||||
{
|
||||
var playerPawn = player.PlayerPawn.Value;
|
||||
if (playerPawn?.CBodyComponent == null) return;
|
||||
|
|
|
|||
147
jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs
Normal file
147
jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,8 +1,9 @@
|
|||
using CounterStrikeSharp.API;
|
||||
using CounterStrikeSharp.API.Core;
|
||||
using CounterStrikeSharp.API.Modules.Entities;
|
||||
using CounterStrikeSharp.API.Modules.Utils;
|
||||
using jRandomSkills.src.player;
|
||||
using jRandomSkills.src.utils;
|
||||
using System.Collections.Generic;
|
||||
using System.Drawing;
|
||||
using static jRandomSkills.jRandomSkills;
|
||||
|
||||
|
|
@ -12,18 +13,19 @@ namespace jRandomSkills
|
|||
{
|
||||
private static Skills skillName = Skills.Wallhack;
|
||||
private static List<CDynamicProp> glows = new List<CDynamicProp>();
|
||||
private static Dictionary<CCSPlayerController, byte> orginalTeams = new Dictionary<CCSPlayerController, byte>();
|
||||
|
||||
public static void LoadSkill()
|
||||
{
|
||||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#5d00ff");
|
||||
SkillUtils.RegisterSkill(skillName, "#5d00ff");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, @info) =>
|
||||
{
|
||||
glows.Clear();
|
||||
Instance.AddTimer(.1f, () =>
|
||||
Instance.AddTimer(2f, () =>
|
||||
{
|
||||
foreach (var player in Utilities.GetPlayers())
|
||||
{
|
||||
|
|
@ -38,11 +40,19 @@ namespace jRandomSkills
|
|||
});
|
||||
return HookResult.Continue;
|
||||
});
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundEnd>((@event, @info) =>
|
||||
{
|
||||
DisableSkill(null);
|
||||
return HookResult.Continue;
|
||||
});
|
||||
}
|
||||
|
||||
public static void EnableSkill(CCSPlayerController player)
|
||||
{
|
||||
SetGlowEffectForEnemies(player);
|
||||
orginalTeams.TryAdd(player, player.TeamNum);
|
||||
player.PlayerPawn.Value.TeamNum = 1;
|
||||
}
|
||||
|
||||
public static void DisableSkill(CCSPlayerController player)
|
||||
|
|
@ -52,12 +62,24 @@ namespace jRandomSkills
|
|||
glows.Remove(glow);
|
||||
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 modelGlow = 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.GlowRange = 5000;
|
||||
modelGlow.Glow.GlowTeam = (int)player.Team;
|
||||
modelGlow.Glow.GlowTeam = (int)CsTeam.Spectator;
|
||||
modelGlow.Glow.GlowType = 3;
|
||||
modelGlow.Glow.GlowRangeMin = 100;
|
||||
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
return;
|
||||
|
||||
Utils.RegisterSkill(skillName, "#c7e03a");
|
||||
SkillUtils.RegisterSkill(skillName, "#c7e03a");
|
||||
|
||||
Instance.RegisterEventHandler<EventRoundFreezeEnd>((@event, info) =>
|
||||
{
|
||||
|
|
@ -75,14 +75,6 @@ namespace jRandomSkills
|
|||
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)
|
||||
|
|
@ -126,7 +118,7 @@ namespace jRandomSkills
|
|||
if (showInfo)
|
||||
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.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
|
||||
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;
|
||||
if (playerPawn?.CBodyComponent == null) return;
|
||||
|
|
|
|||
|
|
@ -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 static jRandomSkills.jRandomSkills;
|
||||
|
||||
|
|
@ -13,7 +15,23 @@ namespace jRandomSkills
|
|||
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
|
||||
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) =>
|
||||
{
|
||||
|
|
@ -40,5 +58,10 @@ namespace jRandomSkills
|
|||
return HookResult.Continue;
|
||||
});
|
||||
}
|
||||
|
||||
public static void EnableSkill(CCSPlayerController player)
|
||||
{
|
||||
SkillUtils.TryGiveWeapon(player, CsItem.Zeus);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,7 +1,6 @@
|
|||
using jRandomSkills.src.player;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Newtonsoft.Json;
|
||||
using System.Diagnostics.Metrics;
|
||||
using static jRandomSkills.jRandomSkills;
|
||||
|
||||
namespace jRandomSkills
|
||||
|
|
@ -69,9 +68,32 @@ namespace jRandomSkills
|
|||
|
||||
public class ConfigModel
|
||||
{
|
||||
// Team: 2 - TT, 3 - CT
|
||||
|
||||
public Settings Settings { get; set; } = new Settings();
|
||||
public SkillInfo[] SkillsInfo = {
|
||||
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.SwapPosition, cooldown: 30),
|
||||
new SkillInfo(Skills.FrozenDecoy),
|
||||
|
|
|
|||
75
jRandomSkills - SRC Files/src/utils/SkillUtils.cs
Normal file
75
jRandomSkills - SRC Files/src/utils/SkillUtils.cs
Normal 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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue