diff --git a/jRandomSkills - SRC Files/jRandomSkills.csproj b/jRandomSkills - SRC Files/jRandomSkills.csproj index 58a46bd..41aa672 100644 --- a/jRandomSkills - SRC Files/jRandomSkills.csproj +++ b/jRandomSkills - SRC Files/jRandomSkills.csproj @@ -4,6 +4,7 @@ net8.0 enable enable + true @@ -11,7 +12,7 @@ - + diff --git a/jRandomSkills - SRC Files/src/command/Command.cs b/jRandomSkills - SRC Files/src/command/Command.cs index 6b8757b..8c775ee 100644 --- a/jRandomSkills - SRC Files/src/command/Command.cs +++ b/jRandomSkills - SRC Files/src/command/Command.cs @@ -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, (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 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; + } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/jRandomSkills.cs b/jRandomSkills - SRC Files/src/jRandomSkills.cs index 708914b..dd70414 100644 --- a/jRandomSkills - SRC Files/src/jRandomSkills.cs +++ b/jRandomSkills - SRC Files/src/jRandomSkills.cs @@ -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(Action value) + internal void RegisterListener(Action 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; } } diff --git a/jRandomSkills - SRC Files/src/lang/pl.json b/jRandomSkills - SRC Files/src/lang/pl.json index dcb9e11..20578ec 100644 --- a/jRandomSkills - SRC Files/src/lang/pl.json +++ b/jRandomSkills - SRC Files/src/lang/pl.json @@ -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 ", + "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" } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/menu/Menu.cs b/jRandomSkills - SRC Files/src/menu/Menu.cs index 31a4133..97840fe 100644 --- a/jRandomSkills - SRC Files/src/menu/Menu.cs +++ b/jRandomSkills - SRC Files/src/menu/Menu.cs @@ -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); }); } diff --git a/jRandomSkills - SRC Files/src/player/Debug.cs b/jRandomSkills - SRC Files/src/player/Debug.cs new file mode 100644 index 0000000..102ac67 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/Debug.cs @@ -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((@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((@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((@event, info) => + { + var teams = Utilities.FindAllEntitiesByDesignerName("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((@event, info) => + { + Debug.WriteToDebug($"Freeze time ended."); + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + var teams = Utilities.FindAllEntitiesByDesignerName("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((@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((@event, info) => + { + Debug.WriteToDebug($"Bomb planted."); + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + Debug.WriteToDebug($"Bomb defused."); + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@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(0); + CTakeDamageInfo param2 = h.GetParam(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 victim = victimPawn.Controller.Value.As(); + + 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); + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/ISkill.cs b/jRandomSkills - SRC Files/src/player/ISkill.cs index 245d8c2..e168af3 100644 --- a/jRandomSkills - SRC Files/src/player/ISkill.cs +++ b/jRandomSkills - SRC Files/src/player/ISkill.cs @@ -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, diff --git a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs index 182cf39..8e6e59c 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs @@ -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 skillList = new List(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,13 +142,15 @@ 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) + if (Config.config.Settings.TeamMateSkillInfo) { - Instance.AddTimer(0.5f, () => + Instance.AddTimer(0.5f, () => { foreach (var teammate in teammates) { @@ -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); @@ -168,10 +173,11 @@ namespace jRandomSkills } } } - + return HookResult.Continue; }); + Instance.RegisterEventHandler((@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); } } diff --git a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs index c55a4a7..54494e2 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs @@ -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 = $"{Localization.GetTranslation("observer_skill")} {observeredPlayerSkill.PlayerName}:
"; - skillLine = $"{observeredPlayerSkillInfo.Name}
"; + skillLine = $"{(observeredPlayerSkill.SpecialSkill == Skills.None ? observeredPlayerSkillInfo.Name : $"{observeredPlayerSpecialSkillInfo.Name}({observeredPlayerSkillInfo.Name})")}
"; } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs index d7003b8..8b75d6e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs @@ -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(0); CTakeDamageInfo param2 = h.GetParam(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(); @@ -45,8 +46,8 @@ namespace jRandomSkills if (playerInfo == null) return HookResult.Continue; 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); diff --git a/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs b/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs index 5b41500..693c3b0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs @@ -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((@event, info) => { diff --git a/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs b/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs index 6e8e13f..5c63a84 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs @@ -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((@event, info) => { diff --git a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs new file mode 100644 index 0000000..1908764 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs @@ -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((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!Instance.IsPlayerValid(player)) continue; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) continue; + EnableSkill(player); + } + }); + + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + EnableBombsite(); + }); + + return HookResult.Continue; + }); + } + + public static void 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("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("func_bomb_target"); + foreach (var bombTarget in bombTargets) + bombTarget.AcceptInput("Enable"); + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Armored.cs b/jRandomSkills - SRC Files/src/player/skills/Armored.cs index 2743344..df89a66 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Armored.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Armored.cs @@ -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(0); CTakeDamageInfo param2 = h.GetParam(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(); diff --git a/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs b/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs index 634bb07..7ae9cf4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs @@ -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((@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; } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Behind.cs b/jRandomSkills - SRC Files/src/player/skills/Behind.cs index b7dc8b7..e7aa88a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Behind.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Behind.cs @@ -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((@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) diff --git a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs index f7ba2a0..cab0c15 100644 --- a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs +++ b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs @@ -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); } @@ -40,9 +40,9 @@ namespace jRandomSkills var playerPawn = player.PlayerPawn.Value; if (playerPawn != null) { - if(Math.Round(playerPawn.AbsVelocity.Length2D()) > MaxSpeed && MaxSpeed != 0) + if (Math.Round(playerPawn.AbsVelocity.Length2D()) > MaxSpeed && MaxSpeed != 0) ChangeVelocity(playerPawn, MaxSpeed); - + var flags = (PlayerFlags)playerPawn.Flags; var buttons = player.Buttons; diff --git a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs new file mode 100644 index 0000000..bc522dd --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs @@ -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((@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((@event, info) => + { + foreach (var player in Utilities.GetPlayers()) + DisableSkill(player); + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return HookResult.Continue; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return HookResult.Continue; + EnableSkill(player); + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + var player = @event.Userid; + var weapon = @event.Item; + + if (!Instance.IsPlayerValid(player)) return HookResult.Continue; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return HookResult.Continue; + + if (weapon == "c4") + { + SetPlayerVisibility(player, false); + SetWeaponVisibility(player, false); + } + else + { + SetPlayerVisibility(player, true); + SetWeaponVisibility(player, true); + } + return HookResult.Continue; + }); + } + + 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"); + } + } + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Catapult.cs b/jRandomSkills - SRC Files/src/player/skills/Catapult.cs index 6df12da..08f24c1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Catapult.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Catapult.cs @@ -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((@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); } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs index d21a360..6bb700e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs @@ -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 chickens = new Dictionary(); 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((@event, info) => { @@ -52,6 +66,35 @@ namespace jRandomSkills return HookResult.Continue; }); + Instance.RegisterEventHandler((@event, info) => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!Instance.IsPlayerValid(player)) continue; + + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) continue; + DisableSkill(player); + } + + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + DisableSkill(@event.Userid); + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@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); } @@ -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()) - { - 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 && !pistols.Contains(activeWeapon?.DesignerName)) + 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)) { - activeWeapon.Clip1 = 0; - activeWeapon.Clip2 = 0; + 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 CreateChicken(CCSPlayerController player) + { + var playerPawn = player.PlayerPawn.Value; + var chickenModel = Utilities.CreateEntityByName("prop_dynamic"); + if (chickenModel == null) + return; + Vector pos = new Vector(0, 0, 0); + + 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() + { + 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; + + 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); } } - public static void SetPlayerModel(CCSPlayerController player, string model) + private static void UpdateHUD(CCSPlayerController player) { - var pawn = player.PlayerPawn?.Value; - if (pawn == null) return; + var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == skillName); + if (skillData == null) return; - Server.NextFrame(() => - { - pawn.SetModel(model); + var weapon = player.PlayerPawn.Value.WeaponServices.ActiveWeapon.Value; + if (weapon == null || !disabledWeapons.Contains(weapon.DesignerName)) return; - Color originalRender = pawn.Render; - pawn.Render = Color.FromArgb(255, originalRender.R, originalRender.G, originalRender.B); - }); + string infoLine = $"{Localization.GetTranslation("your_skill")}:
"; + string skillLine = $"{skillData.Name}
"; + string remainingLine = $"{Localization.GetTranslation("disabled_weapon")}
"; + + var hudContent = infoLine + skillLine + remainingLine; + player.PrintToCenterHtml(hudContent); } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs new file mode 100644 index 0000000..4ba0086 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs @@ -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((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!Instance.IsPlayerValid(player)) continue; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) continue; + EnableSkill(player); + } + }); + + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + foreach (var player in 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")); + } + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs b/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs index dc5cf23..b09f631 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs @@ -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((@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); } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Dracula.cs b/jRandomSkills - SRC Files/src/player/skills/Dracula.cs index 787b46d..435f953 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dracula.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dracula.cs @@ -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((@event, info) => { diff --git a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs new file mode 100644 index 0000000..a97d0b1 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs @@ -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((@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)); + } + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs b/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs index 2739ef3..08bb54c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs @@ -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((@event, info) => { @@ -49,6 +49,12 @@ namespace jRandomSkills return HookResult.Continue; }); + + Instance.RegisterEventHandler((@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"); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs index edae024..f6e9957 100644 --- a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs +++ b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs @@ -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((@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; diff --git a/jRandomSkills - SRC Files/src/player/skills/Flash.cs b/jRandomSkills - SRC Files/src/player/skills/Flash.cs index 321a412..731f539 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Flash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Flash.cs @@ -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(UpdateSpeed); Instance.RegisterEventHandler((@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) diff --git a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs index 0cd73b6..bdbfe73 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs @@ -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((@event, info) => { @@ -32,6 +31,22 @@ namespace jRandomSkills return HookResult.Continue; }); + Instance.RegisterEventHandler((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!Instance.IsPlayerValid(player)) continue; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) continue; + EnableSkill(player); + } + }); + + return HookResult.Continue; + }); + Instance.RegisterEventHandler((@event, @info) => { var player = @event.Userid; @@ -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(0); diff --git a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs index 9ac1c01..8df0e7b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs @@ -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((@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((@event, info) => + Instance.RegisterEventHandler((@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"); - } - - var myWeapons = playerPawn.WeaponServices?.MyWeapons; - if (myWeapons != null) - { - foreach (var gun in myWeapons) + if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) { - var weapon = gun.Value; - if (weapon != null) - { - weapon.Render = color; - weapon.ShadowStrength = shadowStrength; - Utilities.SetStateChanged(weapon, "CBaseModelEntity", "m_clrRender"); - } + weapon.Value.Render = color; + weapon.Value.ShadowStrength = shadowStrength; + Utilities.SetStateChanged(weapon.Value, "CBaseModelEntity", "m_clrRender"); } } } + + private static void SetWeaponAttack(CCSPlayerController player, bool disableWeapon) + { + 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)) + { + 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) + { + 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 = $"{Localization.GetTranslation("your_skill")}:
"; + string skillLine = $"{skillData.Name}
"; + string remainingLine = $"{Localization.GetTranslation("disabled_weapon")}
"; + + var hudContent = infoLine + skillLine + remainingLine; + player.PrintToCenterHtml(hudContent); + } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Glitch.cs b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs new file mode 100644 index 0000000..daa902f --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/Glitch.cs @@ -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 glitchedPlayers = new HashSet(); + + public static void LoadSkill() + { + SkillUtils.RegisterSkill(skillName, "#f542ef", false); + + Instance.RegisterEventHandler((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!Instance.IsPlayerValid(player)) continue; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) continue; + EnableSkill(player); + } + }); + + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + foreach (var player in 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); + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs index c78c892..dd0a8ab 100644 --- a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs +++ b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs @@ -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((@event, info) => { @@ -63,17 +63,9 @@ namespace jRandomSkills 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); + 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) { diff --git a/jRandomSkills - SRC Files/src/player/skills/Hermit.cs b/jRandomSkills - SRC Files/src/player/skills/Hermit.cs new file mode 100644 index 0000000..6e44800 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/Hermit.cs @@ -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 maxReserveAmmo = new Dictionary + { + { "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((@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; + }); + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs b/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs new file mode 100644 index 0000000..5d6dd36 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs @@ -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((@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(@event => + { + var name = @event.DesignerName; + if (!name.EndsWith("hegrenade_projectile")) + return; + + Server.NextFrame(() => + { + var hegrenade = @event.As(); + 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); + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Impostor.cs b/jRandomSkills - SRC Files/src/player/skills/Impostor.cs index 9ccad3c..f03d92e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Impostor.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Impostor.cs @@ -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((@event, info) => { diff --git a/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs b/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs index 0a1616f..23e400e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs +++ b/jRandomSkills - SRC Files/src/player/skills/InfiniteAmmo.cs @@ -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((@event, info) => { diff --git a/jRandomSkills - SRC Files/src/player/skills/Jammer.cs b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs new file mode 100644 index 0000000..2c62807 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/Jammer.cs @@ -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 jammedPlayers = new HashSet(); + + public static void LoadSkill() + { + SkillUtils.RegisterSkill(skillName, "#42f5a7", false); + + Instance.RegisterEventHandler((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!Instance.IsPlayerValid(player)) continue; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) continue; + EnableSkill(player); + } + }); + + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + foreach (var player in 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); + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs index 0bc8412..e01ed40 100644 --- a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs @@ -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((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!Instance.IsPlayerValid(player)) continue; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) continue; + EnableSkill(player); + } + }); + + return HookResult.Continue; + }); Instance.RegisterEventHandler((@event, info) => { @@ -31,5 +48,10 @@ namespace jRandomSkills return HookResult.Continue; }); } + + public static void EnableSkill(CCSPlayerController player) + { + SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade); + } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Medic.cs b/jRandomSkills - SRC Files/src/player/skills/Medic.cs index 43253b8..28e08d5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Medic.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Medic.cs @@ -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((@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) diff --git a/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs b/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs index 5257f79..e220905 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs @@ -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((@event, info) => { CCSPlayerController player = @event.Userid; + if (!IsDeadPlayerValid(player)) return HookResult.Continue; - if (!Instance.IsPlayerValid(player)) return HookResult.Continue; - var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); 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; + } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Mute.cs b/jRandomSkills - SRC Files/src/player/skills/Mute.cs index 1dd6b2a..f11de56 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Mute.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Mute.cs @@ -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(@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); - - switch (name) + if (@event.DesignerName == "instanced_scripted_scene") { - case "flashbang_projectile": - var flash = @event.As(); - break; - case "smokegrenade_projectile": - var smoke = @event.As(); - Schema.SetSchemaValue(smoke.Handle, "CSmokeGrenadeProjectile", "m_nSmokeEffectTickBegin", int.MaxValue); - Schema.SetSchemaValue(smoke.Handle, "CSmokeGrenadeProjectile", "m_bDidSmokeEffect", true); - break; - case "hegrenade_projectile": - var hegrenade = @event.As(); - hegrenade.DetonateTime = 0; - break; - case "molotov_projectile": - var molotov = @event.As(); - molotov.StillTimer.Timestamp = 0; - break; - case "decoy_projectile": - var decoy = @event.As(); - break; + @event.AcceptInput("Kill"); + @event.Remove(); + return; } + + Server.NextFrame(() => { + switch (name) + { + case "smokegrenade_projectile": + var smoke = @event.As(); + smoke.SmokeEffectTickBegin = int.MaxValue; + break; + case "molotov_projectile": + var molotov = @event.As(); + molotov.Detonated = true; + break; + case "decoy_projectile": + var decoy = @event.As(); + decoy.ExpireTime = int.MaxValue; + decoy.DecoyShotTick = int.MaxValue; + decoy.ShotsRemaining = int.MaxValue; + break; + default: + var grenade = @event.As(); + grenade.DetonateTime = float.MaxValue; + break; + } + + Instance.AddTimer(5f, () => + { + if (@event != null && @event.IsValid) + @event.Remove(); + }); + }); }); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs new file mode 100644 index 0000000..0867ecf --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs @@ -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 invisibilityChanged = new Dictionary(); + + public static void LoadSkill() + { + if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) + return; + + SkillUtils.RegisterSkill(skillName, "#dedede"); + + Instance.RegisterEventHandler((@event, info) => + { + foreach (var player in Utilities.GetPlayers()) + DisableSkill(player); + invisibilityChanged.Clear(); + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return HookResult.Continue; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + + if (playerInfo?.Skill != skillName) return HookResult.Continue; + UpdateNinja(player); + return HookResult.Continue; + }); + + Instance.RegisterListener(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"); + } + } + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs b/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs new file mode 100644 index 0000000..820f2b3 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/NoRecoil.cs @@ -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((@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((@event, info) => + { + DisableSkill(null); + return HookResult.Continue; + }); + + Instance.RegisterListener(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; + } + } + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/None.cs b/jRandomSkills - SRC Files/src/player/skills/None.cs index c62f785..fc2376c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/None.cs +++ b/jRandomSkills - SRC Files/src/player/skills/None.cs @@ -8,7 +8,7 @@ namespace jRandomSkills public static void LoadSkill() { - Utils.RegisterSkill(skillName, "#FFFFFF", false); + SkillUtils.RegisterSkill(skillName, "#FFFFFF", false); } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/OneShot.cs b/jRandomSkills - SRC Files/src/player/skills/OneShot.cs index 46e54fb..fb6449d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/OneShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/OneShot.cs @@ -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(0); CTakeDamageInfo param2 = h.GetParam(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(); diff --git a/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs b/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs new file mode 100644 index 0000000..2001af7 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs @@ -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((@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"); + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs index 9fd5c74..c95e49b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs @@ -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(() => { diff --git a/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs b/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs index ea8d2bd..01680ba 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs @@ -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((@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; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Pilot.cs b/jRandomSkills - SRC Files/src/player/skills/Pilot.cs index a9a6df0..95dda34 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Pilot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Pilot.cs @@ -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((@event, info) => { diff --git a/jRandomSkills - SRC Files/src/player/skills/Planter.cs b/jRandomSkills - SRC Files/src/player/skills/Planter.cs index 820db06..1f18702 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Planter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Planter.cs @@ -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((@event, @info) => { diff --git a/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs b/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs new file mode 100644 index 0000000..d297824 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs @@ -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((@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"); + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs b/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs index 37d6328..de3edc8 100644 --- a/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs +++ b/jRandomSkills - SRC Files/src/player/skills/QuickShot.cs @@ -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); } @@ -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(weapon.Handle, "CBasePlayerWeapon", "m_nNextPrimaryAttackTick", Server.TickCount); Schema.SetSchemaValue(weapon.Handle, "CBasePlayerWeapon", "m_nNextSecondaryAttackTick", Server.TickCount); } diff --git a/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs b/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs index b460569..ac26882 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RadarHack.cs @@ -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(CheckRadarowiec); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Rambo.cs b/jRandomSkills - SRC Files/src/player/skills/Rambo.cs index 1dba9bf..3713795 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Rambo.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Rambo.cs @@ -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((@event, info) => { diff --git a/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs b/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs index 6cd9d40..b8839c8 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RandomWeapon.cs @@ -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((@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; diff --git a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs new file mode 100644 index 0000000..de03dfd --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs @@ -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 SkillPlayerInfo = new Dictionary(); + + public static void LoadSkill() + { + if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) + return; + + SkillUtils.RegisterSkill(skillName, "#3cded3"); + + Instance.RegisterEventHandler((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == skillName) + EnableSkill(player); + } + }); + + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + SkillPlayerInfo.Clear(); + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + var player = @event.Userid; + + 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(() => + { + foreach (var player in Utilities.GetPlayers()) + { + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == skillName) + if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo)) + UpdateHUD(player, skillInfo); + } + }); + + Instance.RegisterEventHandler((@event, info) => + { + var attacker = @event.Attacker; + var victim = @event.Userid; + int damage = @event.DmgHealth; + + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; + + if (SkillPlayerInfo.TryGetValue(victim.SteamID, out var skillInfo)) + { + if (!victim.IsValid || !victim.PawnIsAlive || !skillInfo.CanUse) return HookResult.Continue; + skillInfo.CanUse = false; + skillInfo.Cooldown = DateTime.Now; + RestoreHealth(victim, damage); + return HookResult.Stop; + } + + return HookResult.Continue; + }); + } + + 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 = $"{Localization.GetTranslation("your_skill")}:
"; + string skillLine = $"{skillData.Name}
"; + string remainingLine = cooldown != 0 ? $"{Localization.GetTranslation("hud_info", $"{cooldown}")}
" : ""; + + 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; } + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs new file mode 100644 index 0000000..bb5d72e --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs @@ -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 SkillPlayerInfo = new Dictionary(); + + public static void LoadSkill() + { + if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) + return; + + SkillUtils.RegisterSkill(skillName, "#a3000b"); + + Instance.RegisterEventHandler((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!Instance.IsPlayerValid(player)) return; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == skillName) + EnableSkill(player); + } + }); + + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + SkillPlayerInfo.Clear(); + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + var player = @event.Userid; + + 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(() => + { + 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 = $"{Localization.GetTranslation("your_skill")}:
"; + string skillLine = $"{skillData.Name}
"; + string remainingLine = cooldown != 0 ? $"{Localization.GetTranslation("hud_info", $"{cooldown}")}
" : ""; + + 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("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(0); + CTakeDamageInfo param2 = h.GetParam(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(); + 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; } + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs index 087703e..43a13c1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Retreat.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Retreat.cs @@ -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((@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; diff --git a/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs b/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs new file mode 100644 index 0000000..70b94db --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/ReturnToSender.cs @@ -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 playersToSender = new HashSet(); + + public static void LoadSkill() + { + if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) + return; + + SkillUtils.RegisterSkill(skillName, "#a68132"); + + Instance.RegisterEventHandler((@event, info) => + { + playersToSender.Clear(); + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + var attacker = @event.Attacker; + var victim = @event.Userid; + int damage = @event.DmgHealth; + + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; + 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(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); + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs b/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs index 215d3ba..a899e3f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs @@ -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((@event, info) => { diff --git a/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs b/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs new file mode 100644 index 0000000..3ef046d --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/RobinHood.cs @@ -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((@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"); + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Saper.cs b/jRandomSkills - SRC Files/src/player/skills/Saper.cs index 7847c7b..f103c44 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Saper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Saper.cs @@ -12,7 +12,7 @@ namespace jRandomSkills public static void LoadSkill() { - Utils.RegisterSkill(skillName, "#8A2BE2"); + SkillUtils.RegisterSkill(skillName, "#8A2BE2"); Instance.RegisterEventHandler((@event, info) => { diff --git a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs new file mode 100644 index 0000000..a2597b3 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs @@ -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 secondLifePlayers = new HashSet(); + + public static void LoadSkill() + { + if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) + return; + + SkillUtils.RegisterSkill(skillName, "#d41c1c"); + + Instance.RegisterEventHandler((@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((@event, info) => + { + secondLifePlayers.Clear(); + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + var attacker = @event.Attacker; + var victim = @event.Userid; + int damage = @event.DmgHealth; + + if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim)) return HookResult.Continue; + 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(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); + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Shade.cs b/jRandomSkills - SRC Files/src/player/skills/Shade.cs index 8b9433b..c5a82f3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Shade.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Shade.cs @@ -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((@event, info) => { @@ -32,6 +34,13 @@ namespace jRandomSkills return HookResult.Continue; }); + + Instance.RegisterListener(() => + { + 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); - } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Silent.cs b/jRandomSkills - SRC Files/src/player/skills/Silent.cs index ed3ab97..9269d0b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Silent.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Silent.cs @@ -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 => { diff --git a/jRandomSkills - SRC Files/src/player/skills/Soldier.cs b/jRandomSkills - SRC Files/src/player/skills/Soldier.cs index b84d74e..a72357b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Soldier.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Soldier.cs @@ -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((@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(0); CTakeDamageInfo param2 = h.GetParam(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(); diff --git a/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs new file mode 100644 index 0000000..43798f0 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/SoundMaker.cs @@ -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 SkillPlayerInfo = new Dictionary(); + + public static void LoadSkill() + { + if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) + return; + + SkillUtils.RegisterSkill(skillName, "#e3ed8c"); + + Instance.RegisterEventHandler((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!Instance.IsPlayerValid(player)) return; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill == skillName) + EnableSkill(player); + } + }); + + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + SkillPlayerInfo.Clear(); + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, info) => + { + var player = @event.Userid; + + 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(() => + { + 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 = $"{Localization.GetTranslation("your_skill")}:
"; + string skillLine = $"{skillData.Name}
"; + string remainingLine = cooldown != 0 ? $"{Localization.GetTranslation("hud_info", $"{cooldown}")}
" : ""; + + 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; } + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs b/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs index 7306f32..a579f47 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SwapPosition.cs @@ -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((@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; diff --git a/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs b/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs index f6b019c..c0e02d9 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Teleporter.cs @@ -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((@event, info) => { diff --git a/jRandomSkills - SRC Files/src/player/skills/Thief.cs b/jRandomSkills - SRC Files/src/player/skills/Thief.cs new file mode 100644 index 0000000..4e5fd57 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/Thief.cs @@ -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((@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")); + } + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/TimeManipulator.cs b/jRandomSkills - SRC Files/src/player/skills/TimeManipulator.cs index 2dbdfcc..a84126c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/TimeManipulator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/TimeManipulator.cs @@ -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((@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; diff --git a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs new file mode 100644 index 0000000..2da84b9 --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs @@ -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 players = new List(); + private static Dictionary triggers = new Dictionary(); + + public static void LoadSkill() + { + if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true) + return; + + SkillUtils.RegisterSkill(skillName, "#507529"); + + Instance.RegisterEventHandler((@event, info) => + { + players.Clear(); + return HookResult.Continue; + }); + + Instance.RegisterEventHandler((@event, @info) => + { + var player = @event.Userid; + if (!Instance.IsPlayerValid(player)) return HookResult.Continue; + + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) return HookResult.Continue; + + var trigger = Utilities.CreateEntityByName("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((@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(() => + { + 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(0); + CBaseEntity entity = h.GetParam(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(0); + var entity = h.GetParam(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; + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs index 675cec9..c604f1d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs @@ -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 glows = new List(); + private static Dictionary orginalTeams = new Dictionary(); 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((@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((@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("prop_dynamic"); var modelRelay = Utilities.CreateEntityByName("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; diff --git a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs index 1333101..0d6754f 100644 --- a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs @@ -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((@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 ? $"{Localization.GetTranslation("hud_info", $"{cooldown}")}
" : !skillInfo.FindedEnemy ? $"{Localization.GetTranslation("hud_info_no_enemy")}
" - : !skillInfo.HaveWeapon ? $"{Localization.GetTranslation("weaponsswap_hud_info")}
" + : !skillInfo.HaveWeapon ? $"{Localization.GetTranslation("weaponsswap_hud_info2")}
" : ""; else remainingLine = cooldown != 0 ? $"{Localization.GetTranslation("hud_info", $"{cooldown}")}
" : ""; @@ -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; diff --git a/jRandomSkills - SRC Files/src/player/skills/Zeus.cs b/jRandomSkills - SRC Files/src/player/skills/Zeus.cs index 7d054e6..01b91ee 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Zeus.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Zeus.cs @@ -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((@event, info) => + { + Instance.AddTimer(0.1f, () => + { + foreach (var player in Utilities.GetPlayers()) + { + if (!Instance.IsPlayerValid(player)) continue; + var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); + if (playerInfo?.Skill != skillName) continue; + EnableSkill(player); + } + }); + + return HookResult.Continue; + }); Instance.RegisterEventHandler((@event, info) => { @@ -40,5 +58,10 @@ namespace jRandomSkills return HookResult.Continue; }); } + + public static void EnableSkill(CCSPlayerController player) + { + SkillUtils.TryGiveWeapon(player, CsItem.Zeus); + } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/utils/Config.cs b/jRandomSkills - SRC Files/src/utils/Config.cs index c24d335..c6606cd 100644 --- a/jRandomSkills - SRC Files/src/utils/Config.cs +++ b/jRandomSkills - SRC Files/src/utils/Config.cs @@ -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,14 +68,37 @@ 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.Dwarf, chanceFrom : .6f, chanceTo : .95f), + + 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), new SkillInfo(Skills.Soldier, chanceFrom: 1.15f, chanceTo: 1.35f), - new SkillInfo(Skills.Armored, chanceFrom : .65f, chanceTo : .85f), + new SkillInfo(Skills.Armored, chanceFrom: .65f, chanceTo : .85f), new SkillInfo(Skills.Aimbot, only1v1: true), new SkillInfo(Skills.Retreat, cooldown: 15), new SkillInfo(Skills.EnemySpawn, cooldown: 15), @@ -91,7 +113,7 @@ namespace jRandomSkills new SkillInfo(Skills.RandomWeapon, cooldown: 15), new SkillInfo(Skills.WeaponsSwap, cooldown: 30), new SkillInfo(Skills.Wallhack), - new SkillInfo(Skills.Flash, chanceFrom : 1.2f, chanceTo : 3.0f), + new SkillInfo(Skills.Flash, chanceFrom: 1.2f, chanceTo: 3.0f), new SkillInfo(Skills.PawelJumper), new SkillInfo(Skills.BunnyHop), new SkillInfo(Skills.Impostor), @@ -102,7 +124,7 @@ namespace jRandomSkills new SkillInfo(Skills.Medic), new SkillInfo(Skills.Ghost), new SkillInfo(Skills.Chicken), - new SkillInfo(Skills.Astronaut, chanceFrom : .1f, chanceTo : .7f), + new SkillInfo(Skills.Astronaut, chanceFrom: .1f, chanceTo: .7f), new SkillInfo(Skills.Disarmament, chanceFrom: .2f, chanceTo: .4f), new SkillInfo(Skills.AntyFlash), new SkillInfo(Skills.Behind, chanceFrom: .2f, chanceTo: .4f), diff --git a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs new file mode 100644 index 0000000..ec6fda7 --- /dev/null +++ b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs @@ -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"); + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/utils/Utils.cs b/jRandomSkills - SRC Files/src/utils/Utils.cs deleted file mode 100644 index 008c7a0..0000000 --- a/jRandomSkills - SRC Files/src/utils/Utils.cs +++ /dev/null @@ -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)); - } - } - } -} \ No newline at end of file