diff --git a/jRandomSkills - SRC Files/jRandomSkills.csproj b/jRandomSkills - SRC Files/jRandomSkills.csproj
index 41aa672..b07a38b 100644
--- a/jRandomSkills - SRC Files/jRandomSkills.csproj
+++ b/jRandomSkills - SRC Files/jRandomSkills.csproj
@@ -12,7 +12,8 @@
-
+
+
diff --git a/jRandomSkills - SRC Files/src/command/Command.cs b/jRandomSkills - SRC Files/src/command/Command.cs
index 8c775ee..5dea68f 100644
--- a/jRandomSkills - SRC Files/src/command/Command.cs
+++ b/jRandomSkills - SRC Files/src/command/Command.cs
@@ -2,9 +2,11 @@ using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Commands;
+using CounterStrikeSharp.API.Modules.Entities.Constants;
+using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.utils;
-using System;
+using System.Runtime.InteropServices;
using static jRandomSkills.jRandomSkills;
namespace jRandomSkills
@@ -20,25 +22,22 @@ 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("t, useSkill"), ("Use/Type Skill", Command_UseTypeSkill) }
+ { SplitCommands(config.SetSkillCommands), ("Delete record", Command_SetSkill) },
+ { SplitCommands(config.SkillsListCommands), ("Delete all records", Command_SkillsListMenu) },
+ { SplitCommands(config.UseSkillCommands), ("Use/Type skill", Command_UseTypeSkill) },
+ { SplitCommands(config.ChangeMapCommands), ("Change map", Command_ChangeMap) },
+ { SplitCommands(config.ConsoleCommands), ("Console command", Command_CustomCommand) },
+ { SplitCommands(config.StartGameCommands), ("Start game", Command_StartGame) },
+ { SplitCommands(config.SwapCommands), ("Swap team", Command_Swap) },
+ { SplitCommands(config.ShuffleCommands), ("Shuffle team", Command_Shuffle) },
+ { SplitCommands(config.PauseCommands), ("Pause game", Command_Pause) },
+ { SplitCommands(config.HealCommands), ("Heal", Command_Heal) },
+ { SplitCommands(config.SetScoreCommands), ("Set teams score", Command_SetScore) },
};
foreach (var commandPair in commands)
- {
foreach (var command in commandPair.Key)
- {
Instance.AddCommand($"css_{command}", commandPair.Value.description, commandPair.Value.handler);
- }
- }
-
- 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)
@@ -46,7 +45,7 @@ namespace jRandomSkills
return commands.Split(',').Select(c => c.Trim());
}
- public static void AddCommands(IEnumerable commands, string description, CommandInfo.CommandCallback commandAction)
+ private static void AddCommands(IEnumerable commands, string description, CommandInfo.CommandCallback commandAction)
{
foreach (var command in commands)
{
@@ -55,7 +54,7 @@ namespace jRandomSkills
}
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)]
- public static void Command_UseTypeSkill(CCSPlayerController? player, CommandInfo _)
+ private static void Command_UseTypeSkill(CCSPlayerController? player, CommandInfo _)
{
if (player == null) return;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
@@ -65,15 +64,16 @@ namespace jRandomSkills
if (!player.IsValid || !player.PawnIsAlive) return;
string[] commands = _.ArgString.Trim().Split(" ", StringSplitOptions.RemoveEmptyEntries);
+ Debug.WriteToDebug($"Player {player.PlayerName} used the skill: {playerInfo.Skill}");
if (commands == null || commands.Length == 0)
Instance.SkillAction(playerInfo!.Skill.ToString(), "UseSkill", new object[] { player });
else
Instance.SkillAction(playerInfo!.Skill.ToString(), "TypeSkill", new object[] { player, commands });
}
- [RequiresPermissions("@css/root")]
+ [RequiresPermissions("@jRandmosSkills/admin")]
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)]
- public static void Command_SetSkill(CCSPlayerController? player, CommandInfo command)
+ private static void Command_SetSkill(CCSPlayerController? player, CommandInfo command)
{
if (player == null) return;
@@ -131,15 +131,15 @@ namespace jRandomSkills
}
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_ONLY)]
- public static void Command_SkillsListMenu(CCSPlayerController? player, CommandInfo command)
+ private static void Command_SkillsListMenu(CCSPlayerController? player, CommandInfo command)
{
if (player == null) return;
Menu.DisplaySkillsList(player);
}
- [RequiresPermissions("@css/root")]
+ [RequiresPermissions("@jRandmosSkills/admin")]
[CommandHelper(minArgs: 1, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public static void Command_ChangeMap(CCSPlayerController? player, CommandInfo command)
+ private static void Command_ChangeMap(CCSPlayerController? player, CommandInfo command)
{
if (player == null) return;
string map = command.GetArg(1);
@@ -160,9 +160,9 @@ namespace jRandomSkills
Server.ExecuteCommand($"changelevel {map}");
}
- [RequiresPermissions("@css/root")]
+ [RequiresPermissions("@jRandmosSkills/admin")]
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public static void Command_StartGame(CCSPlayerController? player, CommandInfo command)
+ private static void Command_StartGame(CCSPlayerController? player, CommandInfo command)
{
if (player == null) return;
int cheats = command.GetArg(1) == "sv" ? 1 : 0;
@@ -180,18 +180,18 @@ namespace jRandomSkills
});
}
- [RequiresPermissions("@css/root")]
+ [RequiresPermissions("@jRandmosSkills/root")]
[CommandHelper(minArgs: 1, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public static void Command_CustomCommand(CCSPlayerController? player, CommandInfo command)
+ private static void Command_CustomCommand(CCSPlayerController? player, CommandInfo command)
{
if (player == null) return;
string param = command.GetArg(1);
Server.ExecuteCommand(param);
}
- [RequiresPermissions("@css/root")]
+ [RequiresPermissions("@jRandmosSkills/admin")]
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public static void Command_Swap(CCSPlayerController? _player, CommandInfo command)
+ private 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))
@@ -199,9 +199,9 @@ namespace jRandomSkills
Server.ExecuteCommand($"mp_restartgame 1");
}
- [RequiresPermissions("@css/root")]
+ [RequiresPermissions("@jRandmosSkills/admin")]
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public static void Command_Shuffle(CCSPlayerController? _player, CommandInfo command)
+ private 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);
@@ -214,13 +214,34 @@ namespace jRandomSkills
Server.ExecuteCommand($"mp_restartgame 1");
}
- [RequiresPermissions("@css/root")]
+ [RequiresPermissions("@jRandmosSkills/admin")]
[CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
- public static void Command_Pause(CCSPlayerController? player, CommandInfo command)
+ private 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;
}
+
+ [RequiresPermissions("@jRandmosSkills/root")]
+ [CommandHelper(minArgs: 0, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
+ private static void Command_Heal(CCSPlayerController? player, CommandInfo command)
+ {
+ SkillUtils.AddHealth(player.PlayerPawn.Value, 100);
+ player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("healed")}");
+ }
+
+ [RequiresPermissions("@jRandmosSkills/root")]
+ [CommandHelper(minArgs: 2, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
+ private static void Command_SetScore(CCSPlayerController? player, CommandInfo command)
+ {
+ if (!int.TryParse(command.GetArg(1), out int ctScore) || !int.TryParse(command.GetArg(2), out int tScore))
+ {
+ SkillUtils.PrintToChat(player, Localization.GetTranslation("correct_form_setscore"), true);
+ return;
+ }
+
+ SkillUtils.SetTeamScores((short)ctScore, (short)tScore, RoundEndReason.RoundDraw);
+ }
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/icons/jRandomSkills.png b/jRandomSkills - SRC Files/src/icons/jRandomSkills.png
new file mode 100644
index 0000000..d23db6a
Binary files /dev/null and b/jRandomSkills - SRC Files/src/icons/jRandomSkills.png differ
diff --git a/jRandomSkills - SRC Files/src/jRandomSkills.cs b/jRandomSkills - SRC Files/src/jRandomSkills.cs
index dd70414..81a6e1e 100644
--- a/jRandomSkills - SRC Files/src/jRandomSkills.cs
+++ b/jRandomSkills - SRC Files/src/jRandomSkills.cs
@@ -12,13 +12,14 @@ namespace jRandomSkills
{
public static jRandomSkills Instance { get; private set; }
- public List skillPlayer { get; } = new List();
+ public List skillPlayer { get; } = new List();
public Random Random { get; } = new Random();
+ public CCSGameRules GameRules { get; set; }
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.4";
+ public override string ModuleVersion => "1.1.0";
public override void Load(bool hotReload)
{
@@ -26,25 +27,23 @@ namespace jRandomSkills
Config.Initialize();
Localization.Load();
- // Debug.Load();
+ Debug.Load();
Event.Load();
PlayerOnTick.Load();
Command.Load();
+ LoadAllSkills();
+ }
-
- None.LoadSkill();
- // -> Mute.LoadSkill();;
- // -> ToxicSmoke.LoadSkill();
-
- // Shade.LoadSkill();
- // FrozenDecoy.LoadSkill();
- // Medic.LoadSkill();
-
-
- return;
-
+ internal void LoadAllSkills()
+ {
foreach (var skill in Enum.GetValues(typeof(Skills)))
- SkillAction(skill.ToString(), "LoadSkill");
+ if (Config.GetValue(skill, "active"))
+ SkillAction(skill.ToString()!, "LoadSkill");
+
+ Debug.WriteToDebug($"jRandomSkills v{Instance.ModuleVersion} ({SkillData.Skills.Count - 1}/{Config.config.SkillsInfo.Length - 1} Skills) loaded!");
+ Debug.WriteToDebug($"GameModes: {(Config.GameModes)Config.config.Settings.GameMode}, Lang: {Config.config.Settings.LangCode}");
+ foreach (var skill in SkillData.Skills)
+ Debug.WriteToDebug($"Loaded: {skill.Skill}");
}
internal void SkillAction(string skill, string methodName, object[] param = null)
@@ -83,11 +82,11 @@ namespace jRandomSkills
return player != null && player.IsValid && player.PlayerPawn?.Value != null && player.PlayerPawn.Value.LifeState == (byte)LifeState_t.LIFE_ALIVE;
}
- public uint[] footstepSoundEvents = { 2026488395, 2745524735, 2684452812, 2265091453, 1269567645, 520432428, 3266483468, 1346129716, 2061955732, 2240518199, 2829617974, 1194677450, 1803111098, 3749333696, 29217150, 1692050905, 2207486967, 2633527058, 3342414459, 988265811, 540697918, 1763490157, 3755338324, 3161194970, 3753692454, 3166948458, 3997353267, 3161194970, 3753692454, 3166948458, 3997353267, 809738584, 3368720745, 3295206520, 3184465677, 123085364, 3123711576, 737696412, 1403457606, 1770765328, 892882552, 3023174225, 4163677892, 3952104171, 4082928848, 1019414932, 1485322532, 1161855519, 1557420499, 1163426340, 809738584, 3368720745, 2708661994, 2479376962, 3295206520, 1404198078, 1194093029, 1253503839, 2189706910, 1218015996, 96240187, 1116700262, 84876002, 1598540856, 2231399653 };
- public uint[] silentSoundEvents = { 117596568, 117596568, 740474905, 1661204257, 3009312615, 1506215040, 115843229, 3299941720, 1016523349, 2684452812, 2067683805, 2067683805, 1016523349, 4160462271, 1543118744, 585390608, 3802757032, 2302139631, 2546391140, 144629619, 4152012084, 4113422219, 1627020521, 2899365092, 819435812, 3218103073, 961838155, 1535891875, 1826799645, 3460445620, 1818046345, 3666896632, 3099536373, 1440734007, 1409986305, 1939055066, 782454593, 4074593561, 1540837791, 3257325156 };
+ public uint[] footstepSoundEvents = { 3109879199, 70939233, 1342713723, 2722081556, 1909915699, 3193435079, 2300993891, 3847761506, 4084367249, 1342713723, 3847761506, 2026488395, 2745524735, 2684452812, 2265091453, 1269567645, 520432428, 3266483468, 1346129716, 2061955732, 2240518199, 2829617974, 1194677450, 1803111098, 3749333696, 29217150, 1692050905, 2207486967, 2633527058, 3342414459, 988265811, 540697918, 1763490157, 3755338324, 3161194970, 3753692454, 3166948458, 3997353267, 3161194970, 3753692454, 3166948458, 3997353267, 809738584, 3368720745, 3295206520, 3184465677, 123085364, 3123711576, 737696412, 1403457606, 1770765328, 892882552, 3023174225, 4163677892, 3952104171, 4082928848, 1019414932, 1485322532, 1161855519, 1557420499, 1163426340, 809738584, 3368720745, 2708661994, 2479376962, 3295206520, 1404198078, 1194093029, 1253503839, 2189706910, 1218015996, 96240187, 1116700262, 84876002, 1598540856, 2231399653 };
+ public uint[] silentSoundEvents = { 2551626319, 765706800, 765706800, 2860219006, 2162652424, 2551626319, 2162652424, 117596568, 117596568, 740474905, 1661204257, 3009312615, 1506215040, 115843229, 3299941720, 1016523349, 2684452812, 2067683805, 2067683805, 1016523349, 4160462271, 1543118744, 585390608, 3802757032, 2302139631, 2546391140, 144629619, 4152012084, 4113422219, 1627020521, 2899365092, 819435812, 3218103073, 961838155, 1535891875, 1826799645, 3460445620, 1818046345, 3666896632, 3099536373, 1440734007, 1409986305, 1939055066, 782454593, 4074593561, 1540837791, 3257325156 };
}
- public class dSkill_PlayerInfo
+ public class jSkill_PlayerInfo
{
public required ulong SteamID { get; set; }
public required string PlayerName { get; set; }
@@ -97,7 +96,7 @@ namespace jRandomSkills
public bool IsDrawing { get; set; }
}
- public class dSkill_SkillInfo
+ public class jSkill_SkillInfo
{
public Skills Skill { get; }
public string Name { get; }
@@ -106,7 +105,7 @@ namespace jRandomSkills
public bool Display { get; }
- public dSkill_SkillInfo(Skills skill, string color, bool display)
+ public jSkill_SkillInfo(Skills skill, string color, bool display)
{
Skill = skill;
Name = Localization.GetTranslation(skill.ToString().ToLower());
@@ -114,10 +113,15 @@ namespace jRandomSkills
Color = color;
Display = display;
}
+
+ public static implicit operator Skills(jSkill_SkillInfo v)
+ {
+ throw new NotImplementedException();
+ }
}
public static class SkillData
{
- public static List Skills { get; } = new List();
+ public static List Skills { get; } = new List();
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/lang/en.json b/jRandomSkills - SRC Files/src/lang/en.json
index 5c08d9e..4f947c2 100644
--- a/jRandomSkills - SRC Files/src/lang/en.json
+++ b/jRandomSkills - SRC Files/src/lang/en.json
@@ -1,127 +1,410 @@
{
- "none_desc": "You have no skills",
+ "none": "None",
+ "none_desc": "You have no skill",
+
+ "aimbot": "Aimbot",
"aimbot_desc": "Every bullet you hit counts as a headshot",
- "antyflash_desc": "You are immune to flashes, and your flashes last 7 seconds",
- "astronaut_desc": "You receive a random gravity value at the start of the round",
- "astronaut_desc2": "Your random gravity is: {0}x",
- "richboy_desc": "You receive a random amount of money at the start of the round",
- "bunnyhop_desc": "You get auto \"BunnyHop\"",
- "silent_desc": "Your footsteps and jumps are silent to OTHER players",
- "shade_desc": "You teleport behind the back of a hit enemy",
- "dracula_desc": "Hitting an enemy restores a percentage of the damage dealt as health",
- "ghost_desc": "You are completely invisible",
- "flash_desc": "Random player speed at the beginning of the round",
- "flash_desc2": "Your speed multiplier is {0}x",
- "godmode_desc": "You are immortal for 2 seconds. Press [css_useSkill], cooldown 30s",
- "godmode_on": "Immortality enabled",
- "godmode_off": "Immortality disabled",
+
+ "anomaly": "Anomaly",
+ "anomaly_desc": "You rewind a few seconds back in time",
+
+ "antyflash": "Anti-Flash",
+ "antyflash_desc": "You are immune to flashbangs, and your flashbangs last 7 seconds",
+
+ "antyhead": "Iron Head",
+ "antyhead_desc": "You take no damage from headshots",
+
+ "areareaper": "Zone Reaper",
+ "areareaper_desc": "You can choose a bomb site to deactivate",
+ "areareaper_incorrect_site": "No such bomb site found.",
+ "areareaper_no_site": "No bomb sites found.",
+ "areareaper_select_info": "Choose the bomb site you want to deactivate:",
+ "areareaper_site_disabled": "Bomb site {0} has been deactivated - no bombs can be planted there!",
+ "areareaper_used_info": "Your skill has already been used.",
+
+ "armored": "Armored",
"armored_desc": "You have a random damage taken multiplier",
"armored_desc2": "Your damage taken multiplier is: {0}x",
- "muhammed_desc": "You explode upon death, killing nearby players",
- "dwarf_desc": "Random character size at the start of the round",
- "dwarf_desc2": "Your size multiplier is {0}x",
- "medic_desc": "You receive a random number of medkits at the start of the round",
- "randomweapon_desc": "You get a random weapon. Press [css_useSkill], cooldown 15s",
- "chicken_desc": "You get a chicken model + 10% faster movement - 50 HP",
- "impostor_desc": "You start the round with an enemy player model",
+
+ "assassin": "Assassin",
+ "assassin_desc": "You deal increased damage to enemies from behind",
+
+ "astronaut": "Astronaut",
+ "astronaut_desc": "You receive a random gravity value at the start of the round",
+ "astronaut_desc2": "Your random gravity is: {0}x",
+
+ "baseball": "Baseball Player",
+ "baseball_desc": "Your decoy bounces off walls and instantly kills an enemy on impact",
+
+ "behind": "Enemy Spin",
+ "behind_desc": "You have a random chance to turn an enemy 180 degrees when hitting them",
+ "behind_desc2": "Your chance to turn an enemy on hit is: {0}%",
+
+ "blademaster": "Blademaster",
+ "blademaster_desc": "While holding a knife, you have a high chance to deflect a shot",
+
+ "bunnyhop": "Bunny",
+ "bunnyhop_desc": "You get auto \"BunnyHop\"",
+
+ "c4camouflage": "C4 Camouflage",
+ "c4camouflage_desc": "You are invisible while holding the bomb",
+
+ "catapult": "Catapult",
"catapult_desc": "You have a random chance to launch an enemy upwards",
"catapult_desc2": "Your chance to launch an enemy on hit is: {0}%",
+
+ "chicken": "Chicken",
+ "chicken_desc": "You get a chicken model + 10% faster movement - 50 HP",
+
+ "chillout": "Chillout",
+ "chillout_desc": "Planting the bomb takes significantly longer",
+
+ "cutter": "Cutter",
+ "cutter_desc": "Instant kill with a knife",
+
+ "darkness": "Darkness",
+ "darkness_desc": "Applies a darkness effect to a chosen enemy",
+ "darkness_enemy_info": "Let the lights go out.",
+ "darkness_player_info": "Darkness has overtaken player '{0}'.",
+ "darkness_select_info": "Choose the player you want to apply the darkness effect to:",
+
+ "deactivator": "Deactivator",
+ "deactivator_desc": "Choose a player whose skill you want to disable",
+ "deactivator_enemy_info": "Your skill has been disabled.",
+ "deactivator_player_info": "Player '{0}'s skill has been disabled.",
+ "deactivator_select_info": "Choose the player whose skill you want to disable:",
+
+ "deaf": "Deaf",
+ "deaf_desc": "Choose a player to mute all sounds for",
+ "deaf_enemy_info": "Your headphones have left the game.",
+ "deaf_player_info": "Sound has been disabled for player '{0}'.",
+ "deaf_select_info": "Choose the player for whom you want to mute all sounds:",
+
+ "disarmament": "Disarmament",
+ "disarmament_desc": "You have a random chance to make an enemy drop their weapon on hit",
+ "disarmament_desc2": "Your chance to disarm an enemy is: {0}%",
+
+ "distancer": "Rangefinder",
+ "distancer_desc": "You can see the distance to the nearest enemy",
+
+ "dracula": "Dracula",
+ "dracula_desc": "Hitting an enemy restores health equal to a percentage of the damage dealt",
+
+ "duplicator": "Duplicator",
+ "duplicator_desc": "Choose a player to copy their skill",
+ "duplicator_player_info": "Player '{0}'s skill has been copied.",
+ "duplicator_select_info": "Choose the player whose skill you want to copy:",
+
+ "dwarf": "Dwarf",
+ "dwarf_desc": "Random character size at the start of the round",
+ "dwarf_desc2": "Your size multiplier is: {0}x",
+
+ "enemyspawn": "Enemy Spawn",
+ "enemyspawn_desc": "Click [css_useSkill] to teleport to the enemy spawn",
+
+ "explosiveshot": "Explosive Shot",
+ "explosiveshot_desc": "Random chance to fire an explosive bullet while shooting",
+ "explosiveshot_desc2": "Your chance to fire an explosive bullet: {0}%",
+
+ "falconeye": "Falcon Eye",
+ "falconeye_desc": "Click [css_useSkill] to activate a bird's-eye view camera",
+
+ "fastreload": "Fastreload",
+ "fastreload_desc": "Click [css_useSkill] to reload the weapon you are currently holding",
+
+ "flash": "Flash",
+ "flash_desc": "Random player speed at the beginning of the round",
+ "flash_desc2": "Your speed multiplier is: {0}x",
+
+ "fortnite": "Fortnite",
+ "fortnite_desc": "Click [css_useSkill] to create a destructible barricade",
+
+ "fragilebomb": "Fragile Bomb",
+ "fragilebomb_desc": "Shooting the bomb damages it",
+ "fragilebomb_bomb_health": "Bomb health",
+
+ "friendlyfire": "Friendly Fire",
+ "friendlyfire_desc": "Shooting teammates heals them",
+
+ "frozendecoy": "Freezing Decoy",
+ "frozendecoy_desc": "Your decoy freezes all nearby players",
+
+ "ghost": "Ghost",
+ "ghost_desc": "You are completely invisible",
+
+ "glaz": "Glaz",
+ "glaz_desc": "You can see through smoke grenades",
+
+ "glitch": "Glitch",
+ "glitch_desc": "Disables the radar for a chosen enemy",
+ "glitch_enemy_info": "Your radar has been disabled.",
+ "glitch_player_info": "Player '{0}'s radar has been disabled.",
+ "glitch_select_info": "Choose the player whose radar you want to disable:",
+
+ "glue": "Glue",
+ "glue_desc": "Your grenades stick to walls",
+
+ "godmode": "God Mode",
+ "godmode_desc": "Click [css_useSkill] to become immortal for a short time",
+ "godmode_off": "Immortality disabled",
+ "godmode_on": "Immortality enabled",
+
+ "healingsmoke": "Healing Smoke",
+ "healingsmoke_desc": "Your smoke grenades heal",
+
+ "hermit": "Hermit",
+ "hermit_desc": "Killing restores ammo and a portion of health",
+
+ "holyhandgrenade": "Holy Hand Grenade",
+ "holyhandgrenade_desc": "Your HE grenades deal double damage and have double range",
+
+ "impostor": "Impostor",
+ "impostor_desc": "You start the round with an enemy player model",
+
+ "infiniteammo": "Infinite Ammo",
"infiniteammo_desc": "You receive infinite ammo for all your weapons",
- "behind_desc": "You have a random chance to turn an enemy 180 degrees on hit",
- "behind_desc2": "Your chance to turn an enemy on hit is: {0}%",
- "retreat_desc": "Return to spawn. Press [css_useSkill], cooldown 15s",
+
+ "jackal": "Tracker",
+ "jackal_desc": "Choose a player who will leave a trail behind them",
+ "jackal_player_info": "Player '{0}' will start leaving a trail.",
+ "jackal_select_info": "Choose the player who will leave a trail:",
+
+ "jammer": "Jammer",
+ "jammer_desc": "Choose a player to disable their crosshair",
+ "jammer_enemy_info": "Your crosshair has been disabled.",
+ "jammer_player_info": "Player '{0}'s crosshair has been disabled.",
+ "jammer_select_info": "Choose the player whose crosshair you want to disable:",
+
+ "jumpban": "Legless",
+ "jumpban_desc": "Choose a player who cannot jump",
+ "jumpban_enemy_info": "Someone cut off your legs.",
+ "jumpban_player_info": "Player '{0}' can no longer jump.",
+ "jumpban_select_info": "Choose the player who cannot jump:",
+
+ "jumpingjack": "Jumping Jack",
+ "jumpingjack_desc": "Jumping restores health",
+
+ "killerflash": "Killer Flash",
+ "killerflash_desc": "Anyone fully blinded by your flashbang dies (including you)",
+
+ "lifeswap": "Life Swap",
+ "lifeswap_desc": "Choose a player to swap health with",
+ "lifeswap_enemy_info": "Someone borrowed your health.",
+ "lifeswap_player_info": "You swapped health with player '{0}'.",
+ "lifeswap_select_info": "Choose the player to swap health with:",
+
+ "longknife": "Long Knife",
+ "longknife_desc": "A primary knife attack deals damage regardless of distance",
+
+ "longzeus": "Long Zeus",
+ "longzeus_desc": "Zeus deals damage regardless of distance",
+
+ "medic": "Medic",
+ "medic_desc": "Click [css_useSkill] to use a healing charge that restores 50 health",
+
+ "moneyswap": "Taxman",
+ "moneyswap_desc": "Choose a player to swap money with",
+ "moneyswap_enemy_info": "The tax office got you.",
+ "moneyswap_player_info": "You swapped money with player '{0}'.",
+ "moneyswap_select_info": "Choose the player to swap money with:",
+
+ "muhammed": "Muhammed",
+ "muhammed_desc": "You explode upon death, killing nearby players",
+
+ "ninja": "Ninja",
+ "ninja_desc": "Standing still increases your invisibility by 33%, crouching by 33%, and holding a knife by 33%",
+
+ "nonades": "No-Nades",
+ "nonades_desc": "Grenades deal no damage to you",
+
+ "norecoil": "Focus",
+ "norecoil_desc": "No recoil while shooting",
+
+ "noclip": "NoClip",
+ "noclip_desc": "Click [css_useSkill] to enable noclip for a short time",
+
+ "oneshot": "One-Shot",
"oneshot_desc": "Hitting an enemy instantly kills them",
+
+ "onlyhead": "Head Only",
+ "onlyhead_desc": "You only take damage to the head",
+
+ "paweljumper": "Pawel Jumper",
"paweljumper_desc": "You get an extra jump",
+
+ "phoenix": "Phoenix",
"phoenix_desc": "You have a random chance to respawn after death",
"phoenix_desc2": "Your chance to respawn after death: {0}%",
"phoenix_respawn": "You have been resurrected from the ashes thanks to the power of: CHATCOLORS.REDPhoenix",
+
+ "psychicdefusing": "Psychic Defusing",
+ "psychicdefusing_desc": "When you are near the bomb, you start defusing it",
+ "psychicdefusing_hud_info": "{0} seconds remaining to defuse",
+
+ "pilot": "Pilot",
"pilot_desc": "Fly for a limited time. Hold [USE - E] to fly",
"pilot_hud_info": "Recharging",
- "radarhack_desc": "You can see enemies on the radar",
+
+ "planter": "Free Planter",
+ "planter_desc": "You can plant the bomb anywhere, with a detonation time of 60 seconds.",
+
+ "poison": "Poison",
+ "poison_desc": "Choose a player who will take damage every few seconds",
+ "poison_enemy_info": "You have been poisoned.",
+ "poison_player_info": "Player '{0}' has been poisoned.",
+ "poison_select_info": "Choose the player who will take damage every few seconds:",
+
+ "primaryban": "No Rifles",
+ "primaryban_desc": "Choose a player who cannot use rifles",
+ "primaryban_enemy_info": "You can no longer use rifles.",
+ "primaryban_player_info": "Player '{0}' can no longer use rifles.",
+ "primaryban_select_info": "Choose the player to ban from using rifles:",
+
+ "prosthesis": "Prosthesis",
+ "prosthesis_desc": "Arms and legs are bulletproof",
+
+ "push": "Pusher",
+ "push_desc": "You have a random chance to push an enemy back when hitting them",
+ "push_desc2": "Your chances of pushing back the enemy are: {0}%",
+
+ "pyro": "Pyro",
+ "pyro_desc": "Molotov restores health",
+
+ "quickshot": "Rapid Fire",
+ "quickshot_desc": "All bullets are fired very quickly",
+
+ "radarhack": "Radar Hack",
+ "radarhack_desc": "Enemies are visible on the radar",
+
+ "rambo": "Rambo",
"rambo_desc": "You receive a random amount of health at the start of the round",
- "enemyspawn_desc": "Teleport to enemy spawn. Press [css_useSkill], cooldown 15s",
- "disarmament_desc": "You have a random chance to make an enemy drop their weapon on hit",
- "disarmament_desc2": "Your chance to disarm an enemy is: {0}%",
- "planter_desc": "You can plant the bomb anywhere; bomb detonation time is 60s",
+
+ "randomweapon": "Random Weapon",
+ "randomweapon_desc": "Click [css_useSkill] to receive a random weapon",
+
+ "rezombie": "Re-Zombie",
+ "rezombie_desc": "After death, you respawn as a zombie with increased health and no weapons",
+
+ "reactivearmor": "Reactive Armor",
+ "reactivearmor_desc": "Armor absorbs the first damage taken",
+
+ "regeneration": "Regeneration",
+ "regeneration_desc": "You restore health every few seconds",
+
+ "replicator": "Replicator",
+ "replicator_desc": "Click [css_useSkill] to create a replica that deals damage on hit",
+
+ "retreat": "Retreat",
+ "retreat_desc": "Click [css_useSkill] to return to spawn",
+
+ "returntosender": "Return to Sender",
+ "returntosender_desc": "The first hit on an enemy sends them back to their spawn",
+
+ "richboy": "Rich Boy",
+ "richboy_desc": "You receive a random amount of money at the start of the round",
+
+ "robinhood": "Robin Hood",
+ "robinhood_desc": "Dealing damage to an enemy steals their money",
+
+ "rubber": "Rubber Bullets",
+ "rubber_desc": "Your bullets significantly slow down players",
+
+ "saper": "Sapper",
"saper_desc": "You can plant and defuse bombs faster",
- "timemanipulator_desc": "Slows down time for everyone for 6 seconds. Press [css_useSkill], cooldown 30s",
- "quickshot_desc": "No cooldown when shooting",
- "teleporter_desc": "You swap places with the hit enemy",
- "wallhack_desc": "You can see enemies through walls",
- "killerflash_desc": "Every enemy fully blinded by your flashbang dies (including you)",
- "weaponsswap_desc": "Swap weapons with a random enemy. Press [css_useSkill], cooldown 30s",
- "weaponsswap_hud_info2": "You have no weapon to swap",
- "hud_info_no_enemy": "No enemy found",
- "zeus_desc": "Zeus x27 instantly recharges",
- "frozendecoy_desc": "Your decoy grenade freezes all nearby players",
- "antyhead_desc": "You receive no headshot damage",
+
+ "secondlife": "Second Chance",
+ "secondlife_desc": "After death, you respawn with the same amount of health",
+
+ "shade": "Shade",
+ "shade_desc": "You teleport behind the back of a hit enemy",
+ "shade_nospace": "No space available",
+
+ "shortbomb": "Short Fuse",
+ "shortbomb_desc": "The bomb explodes much faster",
+
+ "silent": "Silent",
+ "silent_desc": "Your footsteps and jumps are silent to OTHER players",
+
+ "sniperelite": "Sniper Elite",
+ "sniperelite_desc": "Click [css_useSkill] to swap your current weapon for an AWP",
+
+ "soldier": "Soldier",
"soldier_desc": "You have a random damage multiplier",
"soldier_desc2": "Your damage multiplier is: {0}x",
- "swapposition_desc": "Swap places with a random enemy. Press [css_useSkill], cooldown 30s",
- "welcome_message": "Welcome {PLAYER} to {SERVER_NAME}!\nCurrent jRandomSkills version: {VERSION} ({SKILLS_COUNT} skills).\n\nOriginally created by:\n{AUTHOR1}\nModified and improved by:\n{AUTHOR2}",
- "hud_info": "Wait {0} seconds",
- "no_player": "No player found.",
- "duplicate_player": "More than one player found with the same name.",
- "drawing_skill": "Drawing a skill",
+ "soundmaker": "Soundmaker",
+ "soundmaker_desc": "Click [css_useSkill] to trigger a sound for every enemy",
+
+ "spectator": "Spectator",
+ "spectator_desc": "Click [css_useSkill] to spectate a random enemy",
+
+ "swapposition": "Position Swap",
+ "swapposition_desc": "Click [css_useSkill] to swap places with a random enemy",
+
+ "teleporter": "Teleporter",
+ "teleporter_desc": "You swap places with the hit enemy",
+
+ "thief": "Thief",
+ "thief_desc": "You can steal a skill from a chosen player",
+ "thief_enemy_info": "Your skill has been stolen.",
+ "thief_player_info": "Player '{0}'s skill has been stolen.",
+ "thief_select_info": "Choose the player whose skill you want to steal:",
+
+ "thirdeye": "Third Eye",
+ "thirdeye_desc": "Click [css_useSkill] to activate third-person view",
+
+ "toxicsmoke": "Toxic Smoke",
+ "toxicsmoke_desc": "Your smoke grenades deal damage",
+
+ "wallhack": "Wallhack",
+ "wallhack_desc": "You can see enemies through walls",
+
+ "watchmaker": "Watchmaker",
+ "watchmaker_desc": "Every grenade throw alters the round time",
+ "watchmaker_ct": "Round time shortened by {0} seconds.",
+ "watchmaker_tt": "Round time extended by {0} seconds.",
+
+ "weaponsswap": "Weapon Swap",
+ "weaponsswap_desc": "Click [css_useSkill] to swap weapons with a random enemy",
+ "weaponsswap_hud_info2": "You have no weapon to swap",
+
+ "zeus": "Zeus",
+ "zeus_desc": "Zeus x27 instantly recharges",
+
"your_skill": "Your current skill",
- "summary_start": "======SUMMARY=OF=THE=LAST=ROUND======",
- "summary_end": "=======================================",
"enemy_skill": "Enemy's skill",
- "teammate_skills": "Your teammates' skills",
- "observer_skill": "Player's power",
- "game_start": "Game started!",
- "invalid_map": "Invalid map name!",
- "loading_map": "Loading a new map",
- "skills_menu": "Skill List",
+ "observer_skill": "Player's skill",
+ "welcome_message": "Welcome {PLAYER} to {SERVER_NAME}!\nCurrent jRandomSkills version: {VERSION} ({SKILLS_COUNT} skills).\n\nOriginally created by:\n{AUTHOR1}\nModified and improved by:\n{AUTHOR2}\nOfficial Discord: https://discord.gg/72nzFguNtd",
+ "drawing_skill": "Drawing a skill",
+ "disabled_weapon": "You cannot use this weapon",
+
+ "hud_info": "Wait another {0} seconds",
+ "hud_info_no_enemy": "No enemy found",
+ "active_hud_info": "Active for another {0} milliseconds",
+
+ "skills_menu": "skill List",
+ "no_player": "No matching player found.",
+ "duplicate_player": "More than one player found with the same name.",
+ "selectplayerskill_command": "Type /t",
+ "selectplayerskill_incorrect_enemy_index": "No player found with that index.",
+
+ "skill_not_found_setskill": "No such CHATCOLORS.REDskill found",
+ "player_not_found_setskill": "No such CHATCOLORS.REDplayer found",
"correct_form_setskill": "Correct usage: CHATCOLORS.RED!setskill ",
- "skill_not_found_setskill": "Skill CHATCOLORS.REDnot found",
+ "correct_form_setskill": "Correct usage: CHATCOLORS.RED!setscore ",
+ "done_setskill": "skill set",
"error_setskill": "Failed to set CHATCOLORS.REDskill",
- "done_setskill": "Skill set",
"for_setskill": "for",
- "none": "None",
- "dwarf": "Dwarf",
- "swapposition": "Swapper",
- "killerflash": "Deadly Flash",
- "soldier": "Soldier",
- "armored": "Tank",
- "aimbot": "Aimbot",
- "retreat": "Retreat",
- "enemyspawn": "Enemy Spawn",
- "zeus": "Zeus",
- "radarhack": "Radar Hack",
- "quickshot": "Quick-Shot",
- "planter": "Planter",
- "silent": "Silent",
- "frozendecoy": "Freezing Decoy",
- "timemanipulator": "Time Slow",
- "godmode": "God Mode",
- "randomweapon": "Random Weapon",
- "weaponsswap": "Weapon Swap",
- "wallhack": "Wallhack",
- "flash": "Flash",
- "paweljumper": "Paweł Jumper",
- "bunnyhop": "Bunnyhop",
- "impostor": "Spy",
- "oneshot": "One-Shot",
- "muhammed": "Muhammed",
- "richboy": "Rich Boy",
- "rambo": "Rambo",
- "medic": "Medic",
- "ghost": "Ghost",
- "chicken": "Chicken",
- "astronaut": "Astronaut",
- "disarmament": "Disarmament",
- "antyflash": "Anti-Flash",
- "behind": "Enemy Rotation",
- "infiniteammo": "Infinite Ammo",
- "catapult": "Catapult",
- "dracula": "Dracula",
- "teleporter": "Teleporter",
- "saper": "Sapper",
- "phoenix": "Phoenix",
- "pilot": "Pilot",
- "shade": "Shade",
- "antyhead": "Anty Head"
+ "invalid_map": "Map name entered incorrectly!",
+ "loading_map": "Loading a new map",
+
+ "pause": "Match has been paused.",
+ "unpause": "Match has been resumed.",
+ "healed": "You have been healed.",
+ "game_start": "Game started!",
+
+ "teammate_skills": "Your teammates' skills",
+ "summary_start": "======SUMMARY=OF=THE=LAST=ROUND======",
+ "summary_end": "======================================="
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/lang/pl.json b/jRandomSkills - SRC Files/src/lang/pl.json
index 20578ec..6efaa23 100644
--- a/jRandomSkills - SRC Files/src/lang/pl.json
+++ b/jRandomSkills - SRC Files/src/lang/pl.json
@@ -3,215 +3,408 @@
"none_desc": "Nie posiadasz żadnej supermocy",
"aimbot": "Aimbot",
- "aimbot_desc": "Każdy twój trafiony pocisk jest liczony jako głowa",
+ "aimbot_desc": "Każdy twój trafiony pocisk liczy się jako strzał w głowę",
+
+ "anomaly": "Anomalia",
+ "anomaly_desc": "Cofasz się o kilka sekund do tyłu",
"antyflash": "Anty Flash",
- "antyflash_desc": "Posiadasz odporność na flashe i 7 sekund trwają twoje flash'e",
+ "antyflash_desc": "Posiadasz odporność na flash'e, a twoje flash'e trwają 7 sekund",
- "astronaut": "Astronauta",
- "astronaut_desc": "Otrzymujesz losową ilość grawitacji na start rundy",
- "astronaut_desc2": "Twoja losowa grawitacja wynosi: {0}x",
+ "antyhead": "Żelazna Głowa",
+ "antyhead_desc": "Nie otrzymujesz obrażeń w głowę",
- "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",
+ "areareaper": "Niszczyciel Stref",
+ "areareaper_desc": "Możesz wybrać strefę detonacji, którą chcesz dezaktywować",
+ "areareaper_incorrect_site": "Nie znaleziono takiej strefy detonacji.",
+ "areareaper_no_site": "Nie znaleziono żadnej strefy detonacji.",
+ "areareaper_select_info": "Wybierz strefę detonacji, którą chcesz dezaktywować:",
+ "areareaper_site_disabled": "Strefa detonacji {0} została dezaktywowana - nie można na niej podłożyć bomby!",
+ "areareaper_used_info": "Twoja moc została już wykorzystana.",
"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",
+ "assassin": "Skrytobójca",
+ "assassin_desc": "Zadajesz większe obrażenia przeciwnikowi od tyłu",
- "dwarf": "MiniMajk",
- "dwarf_desc": "Losowa wielkość postaci na początku rundy",
- "dwarf_desc2": "Twój mnożnik wielkości to {0}x",
+ "astronaut": "Astronauta",
+ "astronaut_desc": "Na początku rundy otrzymujesz losową wartość grawitacji",
+ "astronaut_desc2": "Twoja losowa grawitacja wynosi: {0}x",
- "medic": "Medyk",
- "medic_desc": "Otrzymujesz losową ilość apteczek na start rundy",
+ "baseball": "Bejsbolista",
+ "baseball_desc": "Twój wabik odbija się od ścian i natychmiastowo zabija wroga po trafieniu",
- "randomweapon": "Losowa Broń",
- "randomweapon_desc": "Dostajesz losową broń. Kliknij [css_useSkill], cooldown 15s",
+ "behind": "Obrót Wroga",
+ "behind_desc": "Masz losową szansę na obrócenie wroga o 180 stopni po trafieniu go",
+ "behind_desc2": "Twoje szanse na obrócenie wroga po trafieniu to: {0}%",
- "chicken": "Kurczak",
- "chicken_desc": "Otrzymujesz model kurczaka + jesteś o 10% szybszy - 50hp",
+ "blademaster": "Mistrz Ostrza",
+ "blademaster_desc": "Trzymając nóż, masz duże szanse na odparcie strzału",
- "impostor": "Szpieg",
- "impostor_desc": "Otrzymujesz na start rundy model postaci wroga",
+ "bunnyhop": "Królik",
+ "bunnyhop_desc": "Otrzymujesz auto \"BunnyHopa\"",
+
+ "c4camouflage": "C4 Kamuflaż",
+ "c4camouflage_desc": "Kiedy trzymasz bombę, jesteś niewidzialny",
"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",
+ "chicken": "Kurczak",
+ "chicken_desc": "Otrzymujesz model kurczaka + jesteś o 10% szybszy - 50hp",
- "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}%",
+ "chillout": "Wyluzowany",
+ "chillout_desc": "Podłożenie bomby zajmuje znacznie więcej czasu",
- "retreat": "Odwrót",
- "retreat_desc": "Powrót na spawna. Kliknij [css_useSkill], cooldown 15s",
+ "cutter": "Scyzoryk",
+ "cutter_desc": "Natychmiastowe zabójstwo nożem",
- "oneshot": "Jednostrzałowiec",
- "oneshot_desc": "Po trafieniu od razu zabija przeciwnika",
+ "darkness": "Mrok",
+ "darkness_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi",
+ "darkness_enemy_info": "Niech zgasną światła.",
+ "darkness_player_info": "Ciemność opanowała gracza '{0}'.",
+ "darkness_select_info": "Wybierz gracza, któremu chcesz nadać efekt ciemności:",
- "paweljumper": "Pawel Jumper",
- "paweljumper_desc": "Otrzymujesz dodatkowy skok",
+ "deactivator": "Deaktywator",
+ "deactivator_desc": "Wybierasz gracza, którego supermoc chcesz wyłączyć",
+ "deactivator_enemy_info": "Twoja supermoc została wyłączona.",
+ "deactivator_player_info": "Moc gracza '{0}' została wyłączona.",
+ "deactivator_select_info": "Wybierz gracza, którego supermoc chcesz wyłączyć:",
- "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",
+ "deaf": "Głuchy",
+ "deaf_desc": "Wybierasz gracza, dla którego chcesz wyłączyć wszystkie dźwięki",
+ "deaf_enemy_info": "Słuchawki opuściły grę.",
+ "deaf_player_info": "Dźwięk został wyłączony dla gracza '{0}'.",
+ "deaf_select_info": "Wybierz gracza, dla którego chcesz wyłączyć wszystkie dźwięki:",
"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",
+ "distancer": "Odległościomierz",
+ "distancer_desc": "Możesz zobaczyć odległość do najbliższego przeciwnika",
- "saper": "Saper",
- "saper_desc": "Możesz szybciej podłożyć bombę oraz ją zdefować",
+ "dracula": "Drakula",
+ "dracula_desc": "Po trafieniu ofiary odzyskujesz zdrowie równe pewnemu procentowi zadanych obrażeń",
- "timemanipulator": "Spowlnienie Czasu",
- "timemanipulator_desc": "Spowolnienie czasu dla wszystkich na 6 sekundy. Kliknij [css_useSkill], cooldown 30s",
+ "duplicator": "Duplikator",
+ "duplicator_desc": "Wybierasz gracza, od którego chcesz skopiować supermoc",
+ "duplicator_player_info": "Moc gracza '{0}' została skopiowana.",
+ "duplicator_select_info": "Wybierz gracza, od którego chcesz skopiować supermoc:",
- "quickshot": "Szybkostrzelność",
- "quickshot_desc": "Brak cooldown przy strzelaniu",
+ "dwarf": "Mini Majk",
+ "dwarf_desc": "Losowa wielkość postaci na początku rundy",
+ "dwarf_desc2": "Twój mnożnik wielkości to {0}x",
- "teleporter": "Teleporter",
- "teleporter_desc": "Zamieniasz się miejscami z trafionym wrogiem",
+ "enemyspawn": "Resp Wroga",
+ "enemyspawn_desc": "Kliknij [css_useSkill], aby teleportować się na resp wroga",
- "wallhack": "Wallhack",
- "wallhack_desc": "Widzisz wrogów przez ściany",
+ "explosiveshot": "Strzał Wybuchowy",
+ "explosiveshot_desc": "Losowa szansa wystrzelenia pocisku wybuchowego podczas strzelania",
+ "explosiveshot_desc2": "Twoja szansa na wystrzelenie pocisku wybuchowego: {0}%",
+
+ "falconeye": "Oko Sokoła",
+ "falconeye_desc": "Kliknij [css_useSkill], aby aktywować kamerę z lotu ptaka",
+
+ "fastreload": "Szybkie Rączki",
+ "fastreload_desc": "Kliknij [css_useSkill], aby przeładować broń, którą obecnie trzymasz",
+
+ "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",
+
+ "fortnite": "Fortnite",
+ "fortnite_desc": "Kliknij [css_useSkill], aby stworzyć barykadę, którą można zniszczyć",
+
+ "fragilebomb": "Krucha Bomba",
+ "fragilebomb_desc": "Strzelanie do bomby powoduje jej uszkodzenie",
+ "fragilebomb_bomb_health": "Zdrowie bomby",
+
+ "friendlyfire": "Ogień Przyjacielski",
+ "friendlyfire_desc": "Strzelanie do członków drużyny leczy ich",
+
+ "frozendecoy": "Zamrażający Wabik",
+ "frozendecoy_desc": "Twój decoy zamraża wszystkich graczy w pobliżu",
+
+ "ghost": "Duszek",
+ "ghost_desc": "Jesteś całkowicie niewidzialny",
+
+ "glaz": "Glaz",
+ "glaz_desc": "Nie widzisz granatów dymnych",
+
+ "glitch": "Glitch",
+ "glitch_desc": "Wyłączasz radar wybranemu przeciwnikowi",
+ "glitch_enemy_info": "Twój radar został wyłączony.",
+ "glitch_player_info": "Radar gracza '{0}' został wyłączony.",
+ "glitch_select_info": "Wybierz gracza, dla którego chcesz wyłączyć radar:",
+
+ "glue": "Klej",
+ "glue_desc": "Twoje granaty przyklejają się do ścian",
+
+ "godmode": "Nieśmiertelność",
+ "godmode_desc": "Kliknij [css_useSkill], aby stać się nieśmiertelnym na krótką chwilę",
+ "godmode_off": "Nieśmiertelność wyłączona",
+ "godmode_on": "Nieśmiertelność włączona",
+
+ "healingsmoke": "Leczący Dym",
+ "healingsmoke_desc": "Twoje granaty dymne leczą",
+
+ "hermit": "Pustelnik",
+ "hermit_desc": "Zabijanie przywraca amunicję i część zdrowia",
+
+ "holyhandgrenade": "Święty Granat Ręczny",
+ "holyhandgrenade_desc": "Twoje granaty uderzeniowe zadają podwójne obrażenia i mają podwójny zasięg",
+
+ "impostor": "Szpieg",
+ "impostor_desc": "Na początku rundy otrzymujesz model postaci przeciwnika",
+
+ "infiniteammo": "Nieskończone Ammo",
+ "infiniteammo_desc": "Otrzymujesz nieskończoną ilość amunicji do wszystkich broni",
+
+ "jackal": "Stópkarz",
+ "jackal_desc": "Wybierasz gracza, który pozostawi za sobą ślad",
+ "jackal_player_info": "Gracz '{0}' zacznie zostawiać za sobą ślad.",
+ "jackal_select_info": "Wybierz gracza, który pozostawi za sobą ślad:",
+
+ "jammer": "Zakłócacz",
+ "jammer_desc": "Wybierasz gracza, dla którego chcesz wyłączyć celownik",
+ "jammer_enemy_info": "Twój celownik został wyłączony.",
+ "jammer_player_info": "Celownik gracza '{0}' została wyłączona.",
+ "jammer_select_info": "Wybierz gracza, dla którego chcesz wyłączyć celownik:",
+
+ "jumpban": "Beznogi",
+ "jumpban_desc": "Wybierasz gracza, który nie będzie mógł skakać",
+ "jumpban_enemy_info": "Ktoś odciął ci nogi.",
+ "jumpban_player_info": "Gracz '{0}' nie może teraz skakać.",
+ "jumpban_select_info": "Wybierz gracza, który nie będzie mógł skakać:",
+
+ "jumpingjack": "Pajacyk",
+ "jumpingjack_desc": "Skakanie przywraca zdrowie",
"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",
+ "lifeswap": "Zamiana Żyć",
+ "lifeswap_desc": "Wybierasz gracza, z którym chcesz wymienić się zdrowiem",
+ "lifeswap_enemy_info": "Ktoś pożyczył sobie twoje zdrowie.",
+ "lifeswap_player_info": "Wymieniłeś się zdrowiem z graczem '{0}'.",
+ "lifeswap_select_info": "Wybierz gracza, z którym chcesz wymienić się zdrowiem:",
- "zeus": "Zeus",
- "zeus_desc": "Zeus x27 natychmiastowo się odnawia",
+ "longknife": "Długi Nóż",
+ "longknife_desc": "Podstawowy atak nożem zadaje obrażenia niezależnie od odległości",
- "frozendecoy": "Zamrażający Decoy",
- "frozendecoy_desc": "Twój decoy zamraża wszystkich pobliskich graczy",
+ "longzeus": "Długi Zeus",
+ "longzeus_desc": "Zeus zadaje obrażenia niezależnie od odległości",
- "antyhead": "Żelazna Głowa",
- "antyhead_desc": "Nie otrzymujesz obrażeń w głowę",
+ "medic": "Medyk",
+ "medic_desc": "Kliknij [css_useSkill], aby użyć ładunku leczniczego, który przywraca 50 punktów zdrowia",
+
+ "moneyswap": "Skarbówka",
+ "moneyswap_desc": "Wybierasz gracza, z którym chcesz zamienić się pieniędzmi",
+ "moneyswap_enemy_info": "Urząd skarbowy cię dopadł.",
+ "moneyswap_player_info": "Wymieniłeś swoje pieniądze z graczem '{0}'.",
+ "moneyswap_select_info": "Wybierz gracza, z którym chcesz zamienić się pieniędzmi:",
+
+ "muhammed": "Muhammed",
+ "muhammed_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu",
+
+ "ninja": "Ninja",
+ "ninja_desc": "Stojąc nieruchomo zwiększasz swoją niewidzialność o 33%, kucając o 33%, a trzymając nóż o 33%",
+
+ "nonades": "Pancernik",
+ "nonades_desc": "Granaty nie zadają Ci obrażeń",
+
+ "norecoil": "Skupienie",
+ "norecoil_desc": "Brak odrzutu podczas strzelania",
+
+ "noclip": "NoClip",
+ "noclip_desc": "Kliknij [css_useSkill], aby włączyć noclip na krótki czas",
+
+ "oneshot": "Jednostrzałowiec",
+ "oneshot_desc": "Po trafieniu natychmiast zabijasz przeciwnika",
+
+ "onlyhead": "Tylko Głowa",
+ "onlyhead_desc": "Otrzymujesz obrażenia tylko w głowę",
+
+ "paweljumper": "Pawel Jumper",
+ "paweljumper_desc": "Otrzymujesz dodatkowy skok",
+
+ "phoenix": "Feniks",
+ "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",
+
+ "psychicdefusing": "Zdalne Rozbrajanie",
+ "psychicdefusing_desc": "Kiedy jesteś blisko bomby, zaczynasz ją rozbrajać",
+ "psychicdefusing_hud_info": "Pozostało {0} sekund do rozbrojenia",
+
+ "pilot": "Pilot",
+ "pilot_desc": "Latanie przez określony czas. Przytrzymaj [USE - E], aby latać",
+ "pilot_hud_info": "W trakcie odnawiania",
+
+ "planter": "Samowolka",
+ "planter_desc": "Bombę można podłożyć w dowolnym miejscu, a czas detonacji wynosi 60 sekund.",
+
+ "poison": "Trutka",
+ "poison_desc": "Wybierasz gracza, który co kilka sekund będzie otrzymywał obrażenia",
+ "poison_enemy_info": "Zostałeś otruty.",
+ "poison_player_info": "Gracz '{0}' został otruty.",
+ "poison_select_info": "Wybierz gracza, który co kilka sekund będzie otrzymywał obrażenia:",
+
+ "primaryban": "Brak Karabinów",
+ "primaryban_desc": "Wybierasz gracza, który nie może używać karabinów",
+ "primaryban_enemy_info": "Nie możesz już używać karabinów.",
+ "primaryban_player_info": "Gracz '{0}' nie może już używać karabinów.",
+ "primaryban_select_info": "Wybierz gracza, któremu chcesz zabronić używania karabinów:",
+
+ "prosthesis": "Proteza",
+ "prosthesis_desc": "Ramiona i nogi są kuloodporne",
+
+ "push": "Odpychacz",
+ "push_desc": "Masz losową szansę na odepchnięcie wroga po trafieniu go",
+ "push_desc2": "Twoje szanse na odepchnięcie wroga to: {0}%",
+
+ "pyro": "Pyro",
+ "pyro_desc": "Molotow przywraca zdrowie",
+
+ "quickshot": "Szybkostrzelność",
+ "quickshot_desc": "Wszystkie pociski są wystrzeliwane bardzo szybko",
+
+ "radarhack": "Radarowiec",
+ "radarhack_desc": "Na radarze widać wrogów",
+
+ "rambo": "Rambo",
+ "rambo_desc": "Na początku rundy otrzymujesz losową ilość zdrowia",
+
+ "randomweapon": "Losowa Broń",
+ "randomweapon_desc": "Kliknij [css_useSkill], aby otrzymać losową broń",
+
+ "rezombie": "Re-Zombie",
+ "rezombie_desc": "Po śmierci odradzasz się jako zombie z większym zdrowiem i bez broni",
+
+ "reactivearmor": "Pancerz Reaktywny",
+ "reactivearmor_desc": "Pancerz pochłania pierwsze otrzymane obrażenia",
+
+ "regeneration": "Regeneracja",
+ "regeneration_desc": "Co kilka sekund odnawiasz zdrowie",
+
+ "replicator": "Replikator",
+ "replicator_desc": "Kliknij [css_useSkill], aby stworzyć swoją replikę, która zadaje obrażenia po trafieniu",
+
+ "retreat": "Odwrót",
+ "retreat_desc": "Kliknij [css_useSkill], aby powrócić na resp",
+
+ "returntosender": "Zwrot do Nadawcy",
+ "returntosender_desc": "Pierwsze trafienie wroga powoduje, że wraca on na swój resp",
+
+ "richboy": "Bogacz",
+ "richboy_desc": "Na początku rundy otrzymujesz losową kwotę gotówki",
+
+ "robinhood": "Robin Hood",
+ "robinhood_desc": "Zadanie obrażeń przeciwnikowi powoduje kradzież jego pieniędzy",
+
+ "rubber": "Gumowe Kule",
+ "rubber_desc": "Twoje pociski znacznie spowalniają graczy",
+
+ "saper": "Saper",
+ "saper_desc": "Możesz szybciej podłożyć bombę i ją rozbroić",
+
+ "secondlife": "Druga Szansa",
+ "secondlife_desc": "Po śmierci odradzasz się z taką samą ilością zdrowia",
+
+ "shade": "Cień",
+ "shade_desc": "Teleportujesz się za plecy trafionego wroga",
+ "shade_nospace": "Brak miejsca",
+
+ "shortbomb": "Krótka Bomba",
+ "shortbomb_desc": "Bomba wybucha znacznie szybciej",
+
+ "silent": "Cichociemny",
+ "silent_desc": "Twoje kroki i skoki są niesłyszalne dla INNYCH graczy",
+
+ "sniperelite": "SzeliS",
+ "sniperelite_desc": "Kliknij [css_useSkill], aby zamienić aktualną broń na AWP",
"soldier": "Żołnierz",
"soldier_desc": "Masz losowy mnożnik obrażeń",
"soldier_desc2": "Twój mnożnik obrażeń wynosi: {0}x",
+ "soundmaker": "Dźwiękowiec",
+ "soundmaker_desc": "Kliknij [css_useSkill], aby wywołać dzwięk u każdego przeciwnika",
+
+ "spectator": "Obserwator",
+ "spectator_desc": "Kliknij [css_useSkill], aby obserwować losowego przeciwnika",
+
"swapposition": "Zamiana Miejsc",
- "swapposition_desc": "Zamiana miejscami z losowym wrogiem. Kliknij [css_useSkill], cooldown 30s",
+ "swapposition_desc": "Kliknij [css_useSkill], aby zamienić się miejscami z losowym przeciwnikiem",
- "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:",
+ "teleporter": "Teleporter",
+ "teleporter_desc": "Zamieniasz się miejscami z trafionym przeciwnikiem",
"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:",
+ "thief_desc": "Możesz ukraść supermoc wybranemu graczowi",
+ "thief_enemy_info": "Twoja supermoc została skradziona.",
+ "thief_player_info": "Moc gracza '{0}' została skradziona.",
+ "thief_select_info": "Wybierz gracza, którego supermoc chcesz ukraść:",
- "selectplayerskill_incorrect_enemy_index": "Nie znaleziono gracza o takim index'ie.",
- "selectplayerskill_not_found": "Nie znaleziono graczy!",
- "selectplayerskill_command": "Wpisz /t",
+ "thirdeye": "Trzecie Oko",
+ "thirdeye_desc": "Kliknij [css_useSkill], aby aktywować trzecią osobę",
- "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",
+ "toxicsmoke": "Toksyczny Dym",
+ "toxicsmoke_desc": "Twoje granaty dymny zadają obrażenia",
+
+ "wallhack": "Wallhack",
+ "wallhack_desc": "Widzisz wrogów przez ściany",
+
+ "watchmaker": "Zegarmistrz",
+ "watchmaker_desc": "Każdy rzut granatem zmienia czas rundy",
+ "watchmaker_ct": "Czas rundy został skrócony o {0} sekund.",
+ "watchmaker_tt": "Czas rundy został wydłużony o {0} sekund",
+
+ "weaponsswap": "Zamiana Broni",
+ "weaponsswap_desc": "Kliknij [css_useSkill], aby zamienić się bronią z losowym przeciwnikiem",
+ "weaponsswap_hud_info2": "Nie posiadasz broni na zamiane",
+
+ "zeus": "Zeus",
+ "zeus_desc": "Zeus x27 natychmiastowo się odnawia",
+
+ "your_skill": "Twoja aktualna moc",
+ "enemy_skill": "Supermoc przeciwnika",
+ "observer_skill": "Moc gracza",
+ "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}\nOficjalny discord: https://discord.gg/72nzFguNtd",
+ "drawing_skill": "Losowanie mocy",
"disabled_weapon": "Nie możesz używać tej broni",
+
+ "hud_info": "Poczekaj jeszcze {0} sekund",
+ "hud_info_no_enemy": "Nie znaleziono przeciwnika",
+ "active_hud_info": "Działa jeszcze przez {0} milisekund",
+
+ "skills_menu": "Lista Super Mocy",
"no_player": "Nie znaleziono pasującego gracza.",
"duplicate_player": "Znaleziono więcej niż jednego gracza o tej samej nazwie.",
- "drawing_skill": "Losowanie mocy",
- "your_skill": "Twoja aktualna moc",
- "summary_start": "======PODSUMOWANIE=Z=OSTATNIEJ=RUNDY======",
- "summary_end": "============================================",
- "enemy_skill": "Supermoc przeciwnika",
- "teammate_skills": "Supermoce twoich sojuszników",
- "observer_skill": "Moc gracza",
- "game_start": "Gra rozpoczęta!",
- "invalid_map": "Niepoprawnie podano nazwę mapy!",
- "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",
+ "selectplayerskill_command": "Wpisz /t",
+ "selectplayerskill_incorrect_enemy_index": "Nie znaleziono gracza o takim index'ie.",
+
"skill_not_found_setskill": "Nie znaleziono takiej CHATCOLORS.REDsupermocy",
- "error_setskill": "Nie udało się ustawić CHATCOLORS.REDsupermocy",
+ "player_not_found_setskill": "Nie znaleziono takiego CHATCOLORS.REDgracza",
+ "correct_form_setskill": "Poprawne użycie: CHATCOLORS.RED!setskill ",
+ "correct_form_setscore": "Poprawne użycie: CHATCOLORS.RED!setscore ",
"done_setskill": "Ustawiono Supermoc",
- "for_setskill": "dla"
+ "error_setskill": "Nie udało się ustawić CHATCOLORS.REDsupermocy",
+ "for_setskill": "dla",
+
+ "invalid_map": "Nazwa mapy została wprowadzona nieprawidłowo!",
+ "loading_map": "Ładowanie nowej mapy",
+
+ "pause": "Mecz został wstrzymany.",
+ "unpause": "Mecz został wznowiony.",
+ "healed": "Zostałeś uleczony.",
+ "game_start": "Gra rozpoczęta!",
+
+ "teammate_skills": "Supermoce twoich sojuszników",
+ "summary_start": "======PODSUMOWANIE=Z=OSTATNIEJ=RUNDY======",
+ "summary_end": "============================================"
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/lang/pt-br.json b/jRandomSkills - SRC Files/src/lang/pt-br.json
new file mode 100644
index 0000000..9993d21
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/lang/pt-br.json
@@ -0,0 +1,410 @@
+{
+ "none": "Nenhum",
+ "none_desc": "Você não tem nenhuma habilidade",
+
+ "aimbot": "Aimbot",
+ "aimbot_desc": "Cada bala que você acertar conta como um tiro na cabeça",
+
+ "anomaly": "Anomalia",
+ "anomaly_desc": "Você retrocede alguns segundos no tempo",
+
+ "antyflash": "Anti-Flash",
+ "antyflash_desc": "Você é imune a granadas de flash, e suas granadas de flash duram 7 segundos",
+
+ "antyhead": "Cabeça de Ferro",
+ "antyhead_desc": "Você não recebe dano de tiros na cabeça",
+
+ "areareaper": "Ceifador de Zonas",
+ "areareaper_desc": "Você pode escolher um local de bomba para desativar",
+ "areareaper_incorrect_site": "Nenhum local de bomba encontrado.",
+ "areareaper_no_site": "Nenhum local de bomba encontrado.",
+ "areareaper_select_info": "Escolha o local de bomba que deseja desativar:",
+ "areareaper_site_disabled": "Local de bomba {0} foi desativado - nenhuma bomba pode ser plantada lá!",
+ "areareaper_used_info": "Seu poder já foi usado.",
+
+ "armored": "Blindado",
+ "armored_desc": "Você tem um multiplicador de dano recebido aleatório",
+ "armored_desc2": "Seu multiplicador de dano recebido é: {0}x",
+
+ "assassin": "Assassino",
+ "assassin_desc": "Você causa mais dano aos inimigos por trás",
+
+ "astronaut": "Astronauta",
+ "astronaut_desc": "Você recebe um valor de gravidade aleatório no início da rodada",
+ "astronaut_desc2": "Sua gravidade aleatória é: {0}x",
+
+ "baseball": "Jogador de Beisebol",
+ "baseball_desc": "Seu chamariz ricocheteia nas paredes e mata instantaneamente um inimigo ao acertar",
+
+ "behind": "Giro do Inimigo",
+ "behind_desc": "Você tem uma chance aleatória de girar um inimigo 180 graus ao acertá-lo",
+ "behind_desc2": "Sua chance de girar um inimigo ao acertar é: {0}%",
+
+ "blademaster": "Mestre das Lâminas",
+ "blademaster_desc": "Enquanto segura uma faca, você tem uma alta chance de desviar de um tiro",
+
+ "bunnyhop": "Coelho",
+ "bunnyhop_desc": "Você ganha \"BunnyHop\" automático",
+
+ "c4camouflage": "Camuflagem C4",
+ "c4camouflage_desc": "Você fica invisível enquanto segura a bomba",
+
+ "catapult": "Catapulta",
+ "catapult_desc": "Você tem uma chance aleatória de lançar um inimigo para cima",
+ "catapult_desc2": "Sua chance de lançar um inimigo ao acertar é: {0}%",
+
+ "chicken": "Galinha",
+ "chicken_desc": "Você ganha um modelo de galinha + 10% de movimento mais rápido - 50 HP",
+
+ "chillout": "Descontraído",
+ "chillout_desc": "Plantar a bomba leva significativamente mais tempo",
+
+ "cutter": "Cortador",
+ "cutter_desc": "Mata instantaneamente com uma faca",
+
+ "darkness": "Escuridão",
+ "darkness_desc": "Aplica um efeito de escuridão a um inimigo escolhido",
+ "darkness_enemy_info": "Que as luzes se apaguem.",
+ "darkness_player_info": "A escuridão tomou conta do jogador '{0}'.",
+ "darkness_select_info": "Escolha o jogador ao qual deseja aplicar o efeito de escuridão:",
+
+ "deactivator": "Desativador",
+ "deactivator_desc": "Escolha um jogador cuja habilidade você deseja desativar",
+ "deactivator_enemy_info": "Sua habilidade foi desativada.",
+ "deactivator_player_info": "A habilidade do jogador '{0}' foi desativada.",
+ "deactivator_select_info": "Escolha o jogador cuja habilidade você deseja desativar:",
+
+ "deaf": "Surdo",
+ "deaf_desc": "Escolha um jogador para silenciar todos os sons",
+ "deaf_enemy_info": "Seus fones de ouvido saíram do jogo.",
+ "deaf_player_info": "O som foi desativado para o jogador '{0}'.",
+ "deaf_select_info": "Escolha o jogador para quem deseja silenciar todos os sons:",
+
+ "disarmament": "Desarmamento",
+ "disarmament_desc": "Você tem uma chance aleatória de fazer um inimigo largar sua arma ao acertá-lo",
+ "disarmament_desc2": "Sua chance de desarmar um inimigo é: {0}%",
+
+ "distancer": "Medidor de Distância",
+ "distancer_desc": "Você pode ver a distância até o inimigo mais próximo",
+
+ "dracula": "Drácula",
+ "dracula_desc": "Acertar um inimigo restaura saúde igual a uma porcentagem do dano causado",
+
+ "duplicator": "Duplicador",
+ "duplicator_desc": "Escolha um jogador para copiar sua habilidade",
+ "duplicator_player_info": "A habilidade do jogador '{0}' foi copiada.",
+ "duplicator_select_info": "Escolha o jogador cuja habilidade você deseja copiar:",
+
+ "dwarf": "Anão",
+ "dwarf_desc": "Tamanho de personagem aleatório no início da rodada",
+ "dwarf_desc2": "Seu multiplicador de tamanho é: {0}x",
+
+ "enemyspawn": "Spawn Inimigo",
+ "enemyspawn_desc": "Clique em [css_useSkill] para se teletransportar para o spawn inimigo",
+
+ "explosiveshot": "Tiro Explosivo",
+ "explosiveshot_desc": "Chance aleatória de disparar uma bala explosiva enquanto atira",
+ "explosiveshot_desc2": "Sua chance de disparar uma bala explosiva: {0}%",
+
+ "falconeye": "Olho de Falcão",
+ "falconeye_desc": "Clique em [css_useSkill] para ativar uma câmera com visão aérea",
+
+ "fastreload": "Recarga Rápida",
+ "fastreload_desc": "Clique em [css_useSkill] para recarregar a arma que você está segurando",
+
+ "flash": "Flash",
+ "flash_desc": "Velocidade de jogador aleatória no início da rodada",
+ "flash_desc2": "Seu multiplicador de velocidade é: {0}x",
+
+ "fortnite": "Fortnite",
+ "fortnite_desc": "Clique em [css_useSkill] para criar uma barricada destrutível",
+
+ "fragilebomb": "Bomba Frágil",
+ "fragilebomb_desc": "Atirar na bomba a danifica",
+ "fragilebomb_bomb_health": "Vida da bomba",
+
+ "friendlyfire": "Fogo Amigo",
+ "friendlyfire_desc": "Atirar em companheiros de equipe os cura",
+
+ "frozendecoy": "Chamariz Congelante",
+ "frozendecoy_desc": "Seu chamariz congela todos os jogadores próximos",
+
+ "ghost": "Fantasma",
+ "ghost_desc": "Você é completamente invisível",
+
+ "glaz": "Glaz",
+ "glaz_desc": "Você não pode ver granadas de fumaça",
+
+ "glitch": "Glitch",
+ "glitch_desc": "Desativa o radar de um inimigo escolhido",
+ "glitch_enemy_info": "Seu radar foi desativado.",
+ "glitch_player_info": "O radar do jogador '{0}' foi desativado.",
+ "glitch_select_info": "Escolha o jogador cujo radar você deseja desativar:",
+
+ "glue": "Cola",
+ "glue_desc": "Suas granadas grudam nas paredes",
+
+ "godmode": "Modo Deus",
+ "godmode_desc": "Clique em [css_useSkill] para se tornar imortal por um curto período",
+ "godmode_off": "Imortalidade desativada",
+ "godmode_on": "Imortalidade ativada",
+
+ "healingsmoke": "Fumaça Curativa",
+ "healingsmoke_desc": "Suas granadas de fumaça curam",
+
+ "hermit": "Eremita",
+ "hermit_desc": "Matar restaura munição e uma porção de saúde",
+
+ "holyhandgrenade": "Granada Sagrada",
+ "holyhandgrenade_desc": "Suas granadas explosivas causam dano dobrado e têm alcance dobrado",
+
+ "impostor": "Impostor",
+ "impostor_desc": "Você começa a rodada com um modelo de jogador inimigo",
+
+ "infiniteammo": "Munição Infinita",
+ "infiniteammo_desc": "Você recebe munição infinita para todas as suas armas",
+
+ "jackal": "Rastreador",
+ "jackal_desc": "Escolha um jogador que deixará um rastro atrás dele",
+ "jackal_player_info": "O jogador '{0}' começará a deixar um rastro.",
+ "jackal_select_info": "Escolha o jogador que deixará um rastro:",
+
+ "jammer": "Jammer",
+ "jammer_desc": "Escolha um jogador para desativar sua mira",
+ "jammer_enemy_info": "Sua mira foi desativada.",
+ "jammer_player_info": "A mira do jogador '{0}' foi desativada.",
+ "jammer_select_info": "Escolha o jogador cuja mira você deseja desativar:",
+
+ "jumpban": "Sem Pernas",
+ "jumpban_desc": "Escolha um jogador que não poderá pular",
+ "jumpban_enemy_info": "Alguém cortou suas pernas.",
+ "jumpban_player_info": "O jogador '{0}' não pode mais pular.",
+ "jumpban_select_info": "Escolha o jogador que não poderá pular:",
+
+ "jumpingjack": "Pula-Pula",
+ "jumpingjack_desc": "Pular restaura saúde",
+
+ "killerflash": "Flash Mortal",
+ "killerflash_desc": "Qualquer um completamente cego pela sua granada de flash morre (incluindo você)",
+
+ "lifeswap": "Troca de Vida",
+ "lifeswap_desc": "Escolha um jogador para trocar saúde com ele",
+ "lifeswap_enemy_info": "Alguém pegou sua saúde emprestada.",
+ "lifeswap_player_info": "Você trocou saúde com o jogador '{0}'.",
+ "lifeswap_select_info": "Escolha o jogador com quem deseja trocar saúde:",
+
+ "longknife": "Faca Longa",
+ "longknife_desc": "Um ataque com faca primária causa dano independentemente da distância",
+
+ "longzeus": "Zeus Longo",
+ "longzeus_desc": "Zeus causa dano independentemente da distância",
+
+ "medic": "Médico",
+ "medic_desc": "Clique em [css_useSkill] para usar uma carga de cura que restaura 50 de saúde",
+
+ "moneyswap": "Cobrador de Impostos",
+ "moneyswap_desc": "Escolha um jogador para trocar dinheiro com ele",
+ "moneyswap_enemy_info": "A receita federal te pegou.",
+ "moneyswap_player_info": "Você trocou dinheiro com o jogador '{0}'.",
+ "moneyswap_select_info": "Escolha o jogador com quem deseja trocar dinheiro:",
+
+ "muhammed": "Muhammed",
+ "muhammed_desc": "Você explode ao morrer, matando jogadores próximos",
+
+ "ninja": "Ninja",
+ "ninja_desc": "Ficar parado aumenta sua invisibilidade em 33%, agachar em 33%, e segurar uma faca em 33%",
+
+ "nonades": "Sem Granadas",
+ "nonades_desc": "Granadas não causam dano a você",
+
+ "norecoil": "Foco",
+ "norecoil_desc": "Sem recuo ao atirar",
+
+ "noclip": "NoClip",
+ "noclip_desc": "Clique em [css_useSkill] para ativar noclip por um curto período",
+
+ "oneshot": "Tiro Único",
+ "oneshot_desc": "Acertar um inimigo o mata instantaneamente",
+
+ "onlyhead": "Apenas Cabeça",
+ "onlyhead_desc": "Você só recebe dano na cabeça",
+
+ "paweljumper": "Pawel Jumper",
+ "paweljumper_desc": "Você ganha um pulo extra",
+
+ "phoenix": "Fênix",
+ "phoenix_desc": "Você tem uma chance aleatória de renascer após a morte",
+ "phoenix_desc2": "Sua chance de renascer após a morte: {0}%",
+ "phoenix_respawn": "Você foi ressuscitado das cinzas graças ao poder de: CHATCOLORS.REDPhoenix",
+
+ "psychicdefusing": "Desarme Psíquico",
+ "psychicdefusing_desc": "Quando você está perto da bomba, começa a desarmá-la",
+ "psychicdefusing_hud_info": "{0} segundos restantes para desarmar",
+
+ "pilot": "Piloto",
+ "pilot_desc": "Voe por um tempo limitado. Segure [USE - E] para voar",
+ "pilot_hud_info": "Recarregando",
+
+ "planter": "Plantador Livre",
+ "planter_desc": "Você pode plantar a bomba em qualquer lugar, com um tempo de detonação de 60 segundos.",
+
+ "poison": "Veneno",
+ "poison_desc": "Escolha um jogador que receberá dano a cada poucos segundos",
+ "poison_enemy_info": "Você foi envenenado.",
+ "poison_player_info": "O jogador '{0}' foi envenenado.",
+ "poison_select_info": "Escolha o jogador que receberá dano a cada poucos segundos:",
+
+ "primaryban": "Sem Rifles",
+ "primaryban_desc": "Escolha um jogador que não poderá usar rifles",
+ "primaryban_enemy_info": "Você não pode mais usar rifles.",
+ "primaryban_player_info": "O jogador '{0}' não pode mais usar rifles.",
+ "primaryban_select_info": "Escolha o jogador para proibir de usar rifles:",
+
+ "prosthesis": "Prótese",
+ "prosthesis_desc": "Braços e pernas são à prova de balas",
+
+ "push": "Empurrador",
+ "push_desc": "Você tem uma chance aleatória de empurrar um inimigo para trás ao acertá-lo",
+ "push_desc2": "Suas chances de repelir o inimigo são: {0}%",
+
+ "pyro": "Piro",
+ "pyro_desc": "Molotov restaura saúde",
+
+ "quickshot": "Tiro Rápido",
+ "quickshot_desc": "Todas as balas são disparadas muito rapidamente",
+
+ "radarhack": "Hack de Radar",
+ "radarhack_desc": "Inimigos são visíveis no radar",
+
+ "rambo": "Rambo",
+ "rambo_desc": "Você recebe uma quantidade aleatória de saúde no início da rodada",
+
+ "randomweapon": "Arma Aleatória",
+ "randomweapon_desc": "Clique em [css_useSkill] para receber uma arma aleatória",
+
+ "rezombie": "Re-Zumbi",
+ "rezombie_desc": "Após a morte, você renasce como um zumbi com mais saúde e sem armas",
+
+ "reactivearmor": "Armadura Reativa",
+ "reactivearmor_desc": "A armadura absorve o primeiro dano recebido",
+
+ "regeneration": "Regeneração",
+ "regeneration_desc": "Você restaura saúde a cada poucos segundos",
+
+ "replicator": "Replicador",
+ "replicator_desc": "Clique em [css_useSkill] para criar uma réplica que causa dano ao acertar",
+
+ "retreat": "Recuo",
+ "retreat_desc": "Clique em [css_useSkill] para retornar ao spawn",
+
+ "returntosender": "Devolução ao Remetente",
+ "returntosender_desc": "O primeiro acerto em um inimigo o envia de volta ao seu spawn",
+
+ "richboy": "Garoto Rico",
+ "richboy_desc": "Você recebe uma quantidade aleatória de dinheiro no início da rodada",
+
+ "robinhood": "Robin Hood",
+ "robinhood_desc": "Causar dano a um inimigo rouba seu dinheiro",
+
+ "rubber": "Balas de Borracha",
+ "rubber_desc": "Suas balas retardam significativamente os jogadores",
+
+ "saper": "Sapeador",
+ "saper_desc": "Você pode plantar e desarmar bombas mais rápido",
+
+ "secondlife": "Segunda Chance",
+ "secondlife_desc": "Após a morte, você renasce com a mesma quantidade de saúde",
+
+ "shade": "Sombra",
+ "shade_desc": "Você se teletransporta para trás de um inimigo acertado",
+ "shade_nospace": "Sem espaço disponível",
+
+ "shortbomb": "Fusível Curto",
+ "shortbomb_desc": "A bomba explode muito mais rápido",
+
+ "silent": "Silencioso",
+ "silent_desc": "Seus passos e pulos são silenciosos para OUTROS jogadores",
+
+ "sniperelite": "Atirador de Elite",
+ "sniperelite_desc": "Clique em [css_useSkill] para trocar sua arma atual por uma AWP",
+
+ "soldier": "Soldado",
+ "soldier_desc": "Você tem um multiplicador de dano aleatório",
+ "soldier_desc2": "Seu multiplicador de dano é: {0}x",
+
+ "soundmaker": "Criador de Som",
+ "soundmaker_desc": "Clique em [css_useSkill] para acionar um som para cada inimigo",
+
+ "spectator": "Espectador",
+ "spectator_desc": "Clique em [css_useSkill] para observar um inimigo aleatório",
+
+ "swapposition": "Troca de Posição",
+ "swapposition_desc": "Clique em [css_useSkill] para trocar de lugar com um inimigo aleatório",
+
+ "teleporter": "Teletransportador",
+ "teleporter_desc": "Você troca de lugar com o inimigo acertado",
+
+ "thief": "Ladrão",
+ "thief_desc": "Você pode roubar uma habilidade de um jogador escolhido",
+ "thief_enemy_info": "Sua habilidade foi roubada.",
+ "thief_player_info": "A habilidade do jogador '{0}' foi roubada.",
+ "thief_select_info": "Escolha o jogador cuja habilidade você deseja roubar:",
+
+ "thirdeye": "Terceiro Olho",
+ "thirdeye_desc": "Clique em [css_useSkill] para ativar a visão em terceira pessoa",
+
+ "toxicsmoke": "Fumaça Tóxica",
+ "toxicsmoke_desc": "Suas granadas de fumaça causam dano",
+
+ "wallhack": "Wallhack",
+ "wallhack_desc": "Você pode ver inimigos através das paredes",
+
+ "watchmaker": "Relojoeiro",
+ "watchmaker_desc": "Cada arremesso de granada altera o tempo da rodada",
+ "watchmaker_ct": "Tempo da rodada reduzido em {0} segundos.",
+ "watchmaker_tt": "Tempo da rodada estendido em {0} segundos.",
+
+ "weaponsswap": "Troca de Armas",
+ "weaponsswap_desc": "Clique em [css_useSkill] para trocar armas com um inimigo aleatório",
+ "weaponsswap_hud_info2": "Você não tem arma para trocar",
+
+ "zeus": "Zeus",
+ "zeus_desc": "Zeus x27 recarrega instantaneamente",
+
+ "your_skill": "Seu poder atual",
+ "enemy_skill": "Habilidade do inimigo",
+ "observer_skill": "Poder do jogador",
+ "welcome_message": "Bem-vindo {PLAYER} ao {SERVER_NAME}!\nVersão atual do jRandomSkills: {VERSION} ({SKILLS_COUNT} habilidades).\n\nCriado originalmente por:\n{AUTHOR1}\nModificado e aprimorado por:\n{AUTHOR2}",
+ "drawing_skill": "Sorteando uma habilidade",
+ "disabled_weapon": "Você não pode usar esta arma",
+
+ "hud_info": "Espere mais {0} segundos",
+ "hud_info_no_enemy": "Nenhum inimigo encontrado",
+ "active_hud_info": "Ativo por mais {0} milissegundos",
+
+ "skills_menu": "Lista de Habilidades",
+ "no_player": "Nenhum jogador correspondente encontrado.",
+ "duplicate_player": "Mais de um jogador encontrado com o mesmo nome.",
+ "selectplayerskill_command": "Digite /t",
+ "selectplayerskill_incorrect_enemy_index": "Nenhum jogador encontrado com esse índice.",
+
+ "skill_not_found_setskill": "Nenhuma habilidade CHATCOLORS.RED encontrada",
+ "player_not_found_setskill": "Nenhum jogador CHATCOLORS.RED encontrado",
+ "correct_form_setskill": "Uso correto: CHATCOLORS.RED!setskill ",
+ "correct_form_setscore": "Uso correto: CHATCOLORS.RED!setscore ",
+ "done_setskill": "Habilidade definida",
+ "error_setskill": "Falha ao definir a habilidade CHATCOLORS.RED",
+ "for_setskill": "para",
+
+ "invalid_map": "Nome do mapa inserido incorretamente!",
+ "loading_map": "Carregando um novo mapa",
+
+ "pause": "Partida pausada.",
+ "unpause": "Partida retomada.",
+ "healed": "Você foi curado.",
+ "game_start": "Jogo iniciado!",
+
+ "teammate_skills": "Habilidades dos seus companheiros de equipe",
+ "summary_start": "=======RESUMO=DA=ÚLTIMA=RODADA=======",
+ "summary_end": "======================================="
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/lang/zh.json b/jRandomSkills - SRC Files/src/lang/zh.json
new file mode 100644
index 0000000..1882963
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/lang/zh.json
@@ -0,0 +1,410 @@
+{
+ "none": "无",
+ "none_desc": "你没有任何技能",
+
+ "aimbot": "自动瞄准",
+ "aimbot_desc": "你击中的每颗子弹都算作爆头",
+
+ "anomaly": "异常",
+ "anomaly_desc": "你会倒退几秒钟的时间",
+
+ "antyflash": "防闪",
+ "antyflash_desc": "你对闪光弹免疫,你的闪光弹持续7秒",
+
+ "antyhead": "铁头",
+ "antyhead_desc": "你不会受到爆头伤害",
+
+ "areareaper": "区域收割者",
+ "areareaper_desc": "你可以选择一个炸弹点进行禁用",
+ "areareaper_incorrect_site": "未找到此炸弹点。",
+ "areareaper_no_site": "未找到任何炸弹点。",
+ "areareaper_select_info": "选择你想禁用的炸弹点:",
+ "areareaper_site_disabled": "炸弹点 {0} 已被禁用 - 无法在此放置炸弹!",
+ "areareaper_used_info": "你的能力已被使用。",
+
+ "armored": "装甲",
+ "armored_desc": "你有随机受到伤害的倍率",
+ "armored_desc2": "你的受到伤害倍率是:{0}x",
+
+ "assassin": "刺客",
+ "assassin_desc": "从背后攻击敌人时造成更高的伤害",
+
+ "astronaut": "宇航员",
+ "astronaut_desc": "回合开始时你会获得随机重力值",
+ "astronaut_desc2": "你的随机重力是:{0}x",
+
+ "baseball": "棒球手",
+ "baseball_desc": "你的诱饵弹会在墙壁上反弹并在击中敌人时立即杀死",
+
+ "behind": "敌人旋转",
+ "behind_desc": "你有随机几率在击中敌人时使其旋转180度",
+ "behind_desc2": "你击中敌人使其旋转的几率是:{0}%",
+
+ "blademaster": "刀锋大师",
+ "blademaster_desc": "持刀时,你有很高几率格挡子弹",
+
+ "bunnyhop": "兔子",
+ "bunnyhop_desc": "你获得自动“兔子跳”",
+
+ "c4camouflage": "C4伪装",
+ "c4camouflage_desc": "你持有炸弹时隐形",
+
+ "catapult": "弹射",
+ "catapult_desc": "你有随机几率将敌人向上弹射",
+ "catapult_desc2": "你击中敌人将其弹射的几率是:{0}%",
+
+ "chicken": "鸡",
+ "chicken_desc": "你获得鸡模型 + 移动速度提高10% - 50生命值",
+
+ "chillout": "悠闲",
+ "chillout_desc": "放置炸弹需要显著更长的时间",
+
+ "cutter": "切割者",
+ "cutter_desc": "用刀可立即杀死敌人",
+
+ "darkness": "黑暗",
+ "darkness_desc": "对选定的敌人施加黑暗效果",
+ "darkness_enemy_info": "让灯光熄灭。",
+ "darkness_player_info": "黑暗笼罩了玩家 '{0}'。",
+ "darkness_select_info": "选择你想施加黑暗效果的玩家:",
+
+ "deactivator": "禁用者",
+ "deactivator_desc": "选择一个玩家以禁用其技能",
+ "deactivator_enemy_info": "你的技能已被禁用。",
+ "deactivator_player_info": "玩家 '{0}' 的技能已被禁用。",
+ "deactivator_select_info": "选择你想禁用其技能的玩家:",
+
+ "deaf": "聾病",
+ "deaf_desc": "选择一个玩家以静音其所有声音",
+ "deaf_enemy_info": "你的耳机已退出游戏。",
+ "deaf_player_info": "玩家 '{0}' 的声音已被禁用。",
+ "deaf_select_info": "选择你想静音其所有声音的玩家:",
+
+ "disarmament": "解除武装",
+ "disarmament_desc": "你有随机几率在击中敌人时使其丢下武器",
+ "disarmament_desc2": "你使敌人解除武装的几率是:{0}%",
+
+ "distancer": "测距仪",
+ "distancer_desc": "你可以看到与最近敌人的距离",
+
+ "dracula": "德古拉",
+ "dracula_desc": "击中敌人会根据造成的伤害百分比恢复你的生命值",
+
+ "duplicator": "复制者",
+ "duplicator_desc": "选择一个玩家以复制其技能",
+ "duplicator_player_info": "玩家 '{0}' 的技能已被复制。",
+ "duplicator_select_info": "选择你想复制其技能的玩家:",
+
+ "dwarf": "矮人",
+ "dwarf_desc": "回合开始时获得随机角色大小",
+ "dwarf_desc2": "你的体型倍率是:{0}x",
+
+ "enemyspawn": "敌人出生点",
+ "enemyspawn_desc": "点击 [css_useSkill] 传送到敌人出生点",
+
+ "explosiveshot": "爆炸射击",
+ "explosiveshot_desc": "射击时有随机几率发射爆炸子弹",
+ "explosiveshot_desc2": "你发射爆炸子弹的几率是:{0}%",
+
+ "falconeye": "鹰眼",
+ "falconeye_desc": "点击 [css_useSkill] 激活鸟瞰视角摄像头",
+
+ "fastreload": "快速装弹",
+ "fastreload_desc": "点击 [css_useSkill] 重新装填你当前持有的武器",
+
+ "flash": "闪电",
+ "flash_desc": "回合开始时获得随机玩家速度",
+ "flash_desc2": "你的速度倍率是:{0}x",
+
+ "fortnite": "堡垒之夜",
+ "fortnite_desc": "点击[css_useSkill]创建可破坏路障",
+
+ "fragilebomb": "脆弱炸弹",
+ "fragilebomb_desc": "射击炸弹会对其造成伤害",
+ "fragilebomb_bomb_health": "炸弹生命值",
+
+ "friendlyfire": "友军火力",
+ "friendlyfire_desc": "射击队友会治愈他们",
+
+ "frozendecoy": "冰冻诱饵",
+ "frozendecoy_desc": "你的诱饵弹会冻结附近的所有玩家",
+
+ "ghost": "幽灵",
+ "ghost_desc": "你完全隐形",
+
+ "glaz": "格拉兹",
+ "glaz_desc": "你无法看到烟雾弹",
+
+ "glitch": "故障",
+ "glitch_desc": "禁用选定敌人的雷达",
+ "glitch_enemy_info": "你的雷达已被禁用。",
+ "glitch_player_info": "玩家 '{0}' 的雷达已被禁用。",
+ "glitch_select_info": "选择你想禁用其雷达的玩家:",
+
+ "glue": "粘胶",
+ "glue_desc": "你的手榴弹会粘在墙上",
+
+ "godmode": "神模式",
+ "godmode_desc": "点击 [css_useSkill] 在短时间内变得无敌",
+ "godmode_off": "无敌状态已禁用",
+ "godmode_on": "无敌状态已启用",
+
+ "healingsmoke": "治疗烟雾",
+ "healingsmoke_desc": "你的烟雾弹会治疗",
+
+ "hermit": "隐士",
+ "hermit_desc": "击杀敌人会恢复弹药和部分生命值",
+
+ "holyhandgrenade": "神圣手榴弹",
+ "holyhandgrenade_desc": "你的高爆手榴弹造成双倍伤害并拥有双倍范围",
+
+ "impostor": "冒名顶替者",
+ "impostor_desc": "回合开始时你获得敌方玩家模型",
+
+ "infiniteammo": "无限弹药",
+ "infiniteammo_desc": "你为所有武器获得无限弹药",
+
+ "jackal": "追踪者",
+ "jackal_desc": "选择一个玩家,其身后会留下痕迹",
+ "jackal_player_info": "玩家 '{0}' 将开始留下痕迹。",
+ "jackal_select_info": "选择将留下痕迹的玩家:",
+
+ "jammer": "干扰器",
+ "jammer_desc": "选择一个玩家以禁用其准星",
+ "jammer_enemy_info": "你的准星已被禁用。",
+ "jammer_player_info": "玩家 '{0}' 的准星已被禁用。",
+ "jammer_select_info": "选择你想禁用其准星的玩家:",
+
+ "jumpban": "无腿",
+ "jumpban_desc": "选择一个玩家使其无法跳跃",
+ "jumpban_enemy_info": "有人切断了你的腿。",
+ "jumpban_player_info": "玩家 '{0}' 现在无法跳跃。",
+ "jumpban_select_info": "选择无法跳跃的玩家:",
+
+ "jumpingjack": "跳跃杰克",
+ "jumpingjack_desc": "跳跃会恢复生命值",
+
+ "killerflash": "致命闪光",
+ "killerflash_desc": "任何被你的闪光弹完全致盲的人都会死亡(包括你自己)",
+
+ "lifeswap": "生命交换",
+ "lifeswap_desc": "选择一个玩家以交换生命值",
+ "lifeswap_enemy_info": "有人借走了你的生命值。",
+ "lifeswap_player_info": "你与玩家 '{0}' 交换了生命值。",
+ "lifeswap_select_info": "选择你想与之交换生命值的玩家:",
+
+ "longknife": "长刀",
+ "longknife_desc": "近战刀具攻击无论距离远近均可造成伤害",
+
+ "longzeus": "长宙斯",
+ "longzeus_desc": "宙斯电击枪无论距离多远都能造成伤害",
+
+ "medic": "医务兵",
+ "medic_desc": "点击 [css_useSkill] 使用治疗装置恢复50点生命值",
+
+ "moneyswap": "税务员",
+ "moneyswap_desc": "选择一个玩家以交换金钱",
+ "moneyswap_enemy_info": "税务局找上你了。",
+ "moneyswap_player_info": "你与玩家 '{0}' 交换了金钱。",
+ "moneyswap_select_info": "选择你想与之交换金钱的玩家:",
+
+ "muhammed": "穆罕默德",
+ "muhammed_desc": "你死亡时会爆炸,杀死附近的玩家",
+
+ "ninja": "忍者",
+ "ninja_desc": "站立不动增加33%隐形,蹲下增加33%,持刀增加33%",
+
+ "nonades": "无手榴弹",
+ "nonades_desc": "手榴弹对你不造成伤害",
+
+ "norecoil": "专注",
+ "norecoil_desc": "射击时无后坐力",
+
+ "noclip": "无碰撞",
+ "noclip_desc": "点击 [css_useSkill] 在短时间内启用无碰撞模式",
+
+ "oneshot": "一击必杀",
+ "oneshot_desc": "击中敌人立即杀死他们",
+
+ "onlyhead": "仅头部",
+ "onlyhead_desc": "你只会在头部受到伤害",
+
+ "paweljumper": "帕维尔跳跃者",
+ "paweljumper_desc": "你获得额外的跳跃",
+
+ "phoenix": "凤凰",
+ "phoenix_desc": "你有随机几率在死亡后复活",
+ "phoenix_desc2": "你死亡后复活的几率是:{0}%",
+ "phoenix_respawn": "你因 CHATCOLORS.RED凤凰 的力量从灰烬中重生",
+
+ "psychicdefusing": "心灵拆弹",
+ "psychicdefusing_desc": "当你靠近炸弹时,你开始拆除它",
+ "psychicdefusing_hud_info": "拆除还剩 {0} 秒",
+
+ "pilot": "飞行员",
+ "pilot_desc": "在有限时间内飞行。按住 [USE - E] 飞行",
+ "pilot_hud_info": "正在充能",
+
+ "planter": "自由种植者",
+ "planter_desc": "你可以在任何地方放置炸弹,引爆时间为60秒。",
+
+ "poison": "毒药",
+ "poison_desc": "选择一个玩家,每隔几秒受到伤害",
+ "poison_enemy_info": "你被毒害了。",
+ "poison_player_info": "玩家 '{0}' 已被毒害。",
+ "poison_select_info": "选择每隔几秒将受到伤害的玩家:",
+
+ "primaryban": "无步枪",
+ "primaryban_desc": "选择一个玩家使其无法使用步枪",
+ "primaryban_enemy_info": "你无法再使用步枪。",
+ "primaryban_player_info": "玩家 '{0}' 无法再使用步枪。",
+ "primaryban_select_info": "选择禁止使用步枪的玩家:",
+
+ "prosthesis": "假肢",
+ "prosthesis_desc": "手臂和腿部防弹",
+
+ "push": "推力者",
+ "push_desc": "你有随机几率在击中敌人时将其推回",
+ "push_desc2": "你击退敌人的几率为:{0}%",
+
+ "pyro": "火焰兵",
+ "pyro_desc": "燃烧瓶会恢复生命值",
+
+ "quickshot": "快速射击",
+ "quickshot_desc": "所有子弹射击速度极快",
+
+ "radarhack": "雷达外挂",
+ "radarhack_desc": "雷达上可以看到敌人",
+
+ "rambo": "兰博",
+ "rambo_desc": "回合开始时你获得随机数量的生命值",
+
+ "randomweapon": "随机武器",
+ "randomweapon_desc": "点击 [css_useSkill] 获得随机武器",
+
+ "rezombie": "重生僵尸",
+ "rezombie_desc": "死亡后你将作为僵尸复活,拥有更多生命值但无武器",
+
+ "reactivearmor": "反应装甲",
+ "reactivearmor_desc": "装甲吸收首次受到的伤害",
+
+ "regeneration": "再生",
+ "regeneration_desc": "每隔几秒恢复生命值",
+
+ "replicator": "复制者",
+ "replicator_desc": "点击 [css_useSkill] 创建一个造成伤害的复制体",
+
+ "retreat": "撤退",
+ "retreat_desc": "点击 [css_useSkill] 返回出生点",
+
+ "returntosender": "退货",
+ "returntosender_desc": "首次击中敌人会将其送回出生点",
+
+ "richboy": "富少",
+ "richboy_desc": "回合开始时你获得随机数量的钱",
+
+ "robinhood": "罗宾汉",
+ "robinhood_desc": "对敌人造成伤害会偷取他们的钱",
+
+ "rubber": "橡胶子弹",
+ "rubber_desc": "你的子弹会显著减慢玩家速度",
+
+ "saper": "工兵",
+ "saper_desc": "你可以更快地放置和拆除炸弹",
+
+ "secondlife": "第二次机会",
+ "secondlife_desc": "死亡后你会以相同生命值复活",
+
+ "shade": "阴影",
+ "shade_desc": "你会传送到被击中敌人的背后",
+ "shade_nospace": "无可用空间",
+
+ "shortbomb": "短引信",
+ "shortbomb_desc": "炸弹爆炸速度快得多",
+
+ "silent": "无声",
+ "silent_desc": "你的脚步和跳跃对其他玩家无声",
+
+ "sniperelite": "狙击精英",
+ "sniperelite_desc": "点击 [css_useSkill] 将当前武器替换为AWP",
+
+ "soldier": "士兵",
+ "soldier_desc": "你有随机伤害倍率",
+ "soldier_desc2": "你的伤害倍率是:{0}x",
+
+ "soundmaker": "声音制造者",
+ "soundmaker_desc": "点击 [css_useSkill] 为每个敌人触发一个声音",
+
+ "spectator": "观察者",
+ "spectator_desc": "点击 [css_useSkill] 观察一个随机敌人",
+
+ "swapposition": "位置交换",
+ "swapposition_desc": "点击 [css_useSkill] 与随机敌人交换位置",
+
+ "teleporter": "传送者",
+ "teleporter_desc": "你与被击中的敌人交换位置",
+
+ "thief": "小偷",
+ "thief_desc": "你可以从选定玩家那里偷取技能",
+ "thief_enemy_info": "你的技能被偷走了。",
+ "thief_player_info": "玩家 '{0}' 的技能被偷走了。",
+ "thief_select_info": "选择你想偷取其技能的玩家:",
+
+ "thirdeye": "第三只眼",
+ "thirdeye_desc": "点击 [css_useSkill] 激活第三人称视角",
+
+ "toxicsmoke": "毒烟",
+ "toxicsmoke_desc": "你的烟雾弹会造成伤害",
+
+ "wallhack": "透视",
+ "wallhack_desc": "你可以通过墙壁看到敌人",
+
+ "watchmaker": "钟表匠",
+ "watchmaker_desc": "每次投掷手榴弹都会改变回合时间",
+ "watchmaker_ct": "回合时间缩短了 {0} 秒。",
+ "watchmaker_tt": "回合时间延长了 {0} 秒。",
+
+ "weaponsswap": "武器交换",
+ "weaponsswap_desc": "点击 [css_useSkill] 与随机敌人交换武器",
+ "weaponsswap_hud_info2": "你没有可交换的武器",
+
+ "zeus": "宙斯",
+ "zeus_desc": "宙斯x27立即充能",
+
+ "your_skill": "你当前的技能",
+ "enemy_skill": "敌人的技能",
+ "observer_skill": "玩家的技能",
+ "welcome_message": "欢迎 {PLAYER} 来到 {SERVER_NAME}!\n当前 jRandomSkills 版本:{VERSION}({SKILLS_COUNT} 个技能)。\n\n最初由以下人员创建:\n{AUTHOR1}\n由以下人员修改和改进:\n{AUTHOR2}",
+ "drawing_skill": "抽取技能",
+ "disabled_weapon": "你无法使用这把武器",
+
+ "hud_info": "再等 {0} 秒",
+ "hud_info_no_enemy": "未找到敌人",
+ "active_hud_info": "还剩 {0} 毫秒有效",
+
+ "skills_menu": "技能列表",
+ "no_player": "未找到匹配的玩家。",
+ "duplicate_player": "找到多个同名玩家。",
+ "selectplayerskill_command": "输入 /t",
+ "selectplayerskill_incorrect_enemy_index": "未找到该索引的玩家。",
+
+ "skill_not_found_setskill": "未找到 CHATCOLORS.RED 技能",
+ "player_not_found_setskill": "未找到 CHATCOLORS.RED 玩家",
+ "correct_form_setskill": "正确用法:CHATCOLORS.RED!setskill <昵称> <技能>",
+ "correct_form_setscore": "正确用法:CHATCOLORS.RED!setscore ",
+ "done_setskill": "技能已设置",
+ "error_setskill": "无法设置 CHATCOLORS.RED 技能",
+ "for_setskill": "为",
+
+ "invalid_map": "地图名称输入错误!",
+ "loading_map": "正在加载新地图",
+
+ "pause": "比赛已暂停。",
+ "unpause": "比赛已恢复。",
+ "healed": "你已被治疗。",
+ "game_start": "游戏开始!",
+
+ "teammate_skills": "你队友的技能",
+ "summary_start": "=============上一回合总结==============",
+ "summary_end": "======================================="
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/Debug.cs b/jRandomSkills - SRC Files/src/player/Debug.cs
index 102ac67..ceddc30 100644
--- a/jRandomSkills - SRC Files/src/player/Debug.cs
+++ b/jRandomSkills - SRC Files/src/player/Debug.cs
@@ -1,11 +1,8 @@
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
@@ -17,7 +14,6 @@ namespace jRandomSkills
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;
@@ -123,6 +119,9 @@ namespace jRandomSkills
public static void WriteToDebug(string message)
{
+ if (Config.config.Settings.DebugMode != true)
+ return;
+
string filename = $"Debug_{sessionId}.txt";
string pluginFolder = Path.Combine(Server.GameDirectory, "csgo", "addons", "counterstrikesharp", "plugins", "jRandomSkills");
string debugFolder = Path.Combine(pluginFolder, "Debug");
diff --git a/jRandomSkills - SRC Files/src/player/ISkill.cs b/jRandomSkills - SRC Files/src/player/ISkill.cs
index e168af3..d8f38c0 100644
--- a/jRandomSkills - SRC Files/src/player/ISkill.cs
+++ b/jRandomSkills - SRC Files/src/player/ISkill.cs
@@ -14,69 +14,106 @@ public interface ISkill
public enum Skills
{
None,
- Dwarf,
- SwapPosition,
- FrozenDecoy,
- Soldier,
- Armored,
Aimbot,
- Retreat,
- EnemySpawn,
- Zeus,
- RadarHack,
- QuickShot,
- Planter,
- Silent,
- KillerFlash,
- TimeManipulator,
- GodMode,
- 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,
- BunnyHop,
- Impostor,
- OneShot,
- Muhammed,
- RichBoy,
- Rambo,
- Medic,
- Ghost,
- Chicken,
- Astronaut,
- Disarmament,
+ Anomaly,
AntyFlash,
- Behind,
- InfiniteAmmo,
- Catapult,
- Dracula,
- Teleporter,
- Saper,
- Phoenix,
- Pilot,
- Shade,
AntyHead,
+ AreaReaper,
+ Armored,
+ Assassin,
+ Astronaut,
+ Baseball,
+ Behind,
+ BladeMaster,
+ BunnyHop,
+ C4Camouflage,
+ Catapult,
+ Chicken,
+ ChillOut,
+ Cutter,
+ Darkness,
+ Deactivator,
+ Deaf,
+ Disarmament,
+ Distancer,
+ Dracula,
+ Duplicator,
+ Dwarf,
+ EnemySpawn,
+ ExplosiveShot,
+ FalconEye,
+ FastReload,
+ Flash,
+ Fortnite,
+ FragileBomb,
+ FriendlyFire,
+ FrozenDecoy,
+ Ghost,
+ Glaz,
+ Glitch,
+ Glue,
+ GodMode,
+ HealingSmoke,
+ Hermit,
+ HolyHandGrenade,
+ Impostor,
+ InfiniteAmmo,
+ Jackal,
+ Jammer,
+ JumpBan,
+ JumpingJack,
+ KillerFlash,
+ LifeSwap,
+ LongKnife,
+ LongZeus,
+ Medic,
+ MoneySwap,
+ Muhammed,
+ Ninja,
+ NoNades,
+ NoRecoil,
+ Noclip,
+ OneShot,
+ OnlyHead,
+ PawelJumper,
+ Phoenix,
+ PsychicDefusing,
+ Pilot,
+ Planter,
+ Poison,
+ PrimaryBan,
+ Prosthesis,
+ Push,
+ Pyro,
+ QuickShot,
+ RadarHack,
+ Rambo,
+ RandomWeapon,
+ ReZombie,
+ ReactiveArmor,
+ Regeneration,
+ Replicator,
+ Retreat,
+ ReturnToSender,
+ RichBoy,
+ RobinHood,
+ Rubber,
+ Saper,
+ SecondLife,
+ Shade,
+ ShortBomb,
+ Silent,
+ SniperElite,
+ Soldier,
+ SoundMaker,
+ Spectator,
+ SwapPosition,
+ Teleporter,
+ Thief,
+ ThirdEye,
+ ToxicSmoke,
+ Wallhack,
+ Watchmaker,
+ WeaponsSwap,
+ Zeus,
}
diff --git a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs
index 8e6e59c..5c2e6b4 100644
--- a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs
+++ b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs
@@ -11,6 +11,11 @@ namespace jRandomSkills
{
public static class Event
{
+ private static jSkill_SkillInfo ctSkill = new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false);
+ private static jSkill_SkillInfo tSkill = new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false);
+ private static jSkill_SkillInfo allSkill = new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false);
+ private static List debugSkills = new List(SkillData.Skills);
+
public static void Load()
{
Instance.RegisterEventHandler((@event, info) =>
@@ -19,11 +24,11 @@ namespace jRandomSkills
if (player == null || !player.IsValid) return HookResult.Continue;
- Instance.skillPlayer.Add(new dSkill_PlayerInfo
+ Instance.skillPlayer.Add(new jSkill_PlayerInfo
{
SteamID = player.SteamID,
PlayerName = player.PlayerName,
- Skill = src.player.Skills.None,
+ Skill = Skills.None,
SpecialSkill = Skills.None,
IsDrawing = false,
SkillChance = 1,
@@ -112,6 +117,29 @@ namespace jRandomSkills
Instance.RegisterEventHandler((@event, info) =>
{
+ Config.DefaultSkillInfo[] terroristSkills = Config.config.SkillsInfo.Where(s => s.OnlyTeam == (int)CsTeam.Terrorist).ToArray();
+ Config.DefaultSkillInfo[] counterterroristSkills = Config.config.SkillsInfo.Where(s => s.OnlyTeam == (int)CsTeam.CounterTerrorist).ToArray();
+ Config.DefaultSkillInfo[] allTeamsSkills = Config.config.SkillsInfo.Where(s => s.OnlyTeam == 0).ToArray();
+
+ if (Config.config.Settings.GameMode == (int)Config.GameModes.TeamSkills)
+ {
+ List tSkills = new List(SkillData.Skills);
+ tSkills.RemoveAll(s => s.Skill == tSkill.Skill || s.Skill == Skills.None || counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString()));
+ tSkill = tSkills.Count == 0 ? new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false) : tSkills[Instance.Random.Next(tSkills.Count)];
+
+ List ctSkills = new List(SkillData.Skills);
+ ctSkills.RemoveAll(s => s.Skill == ctSkill.Skill || s.Skill == Skills.None || terroristSkills.Any(s2 => s2.Name == s.Skill.ToString()));
+ ctSkill = ctSkills.Count == 0 ? new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false) : ctSkills[Instance.Random.Next(ctSkills.Count)];
+ }
+ else if (Config.config.Settings.GameMode == (int)Config.GameModes.SameSkills)
+ {
+ List allSkills = new List(SkillData.Skills);
+ allSkills.RemoveAll(s => s.Skill == allSkill.Skill || s.Skill == Skills.None || !allTeamsSkills.Any(s2 => s2.Name == s.Skill.ToString()));
+ allSkill = allSkills.Count == 0 ? new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false) : allSkills[Instance.Random.Next(allSkills.Count)];
+ }
+ else if (Config.config.Settings.GameMode == (int)Config.GameModes.Debug && debugSkills.Count == 0)
+ debugSkills = new List(SkillData.Skills);
+
foreach (var player in Utilities.GetPlayers())
{
var playerTeam = player.Team;
@@ -123,24 +151,39 @@ namespace jRandomSkills
if (skillPlayer != null)
{
skillPlayer.IsDrawing = false;
+ jSkill_SkillInfo randomSkill = new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false);
- List skillList = new List(SkillData.Skills);
- skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None);
-
- if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsBot).Count != 1)
+ if (Config.config.Settings.GameMode == (int)Config.GameModes.Normal)
{
- Config.SkillInfo[] skillsOnly1v1 = Config.config.SkillsInfo.Where(s => s.Only1v1).ToArray();
- skillList.RemoveAll(s => skillsOnly1v1.Any(s2 => s2.Name == s.Skill.ToString()));
+ List skillList = new List(SkillData.Skills);
+ skillList.RemoveAll(s => s?.Skill == skillPlayer?.Skill || s?.Skill == skillPlayer?.SpecialSkill || s?.Skill == Skills.None);
+
+ if (Utilities.GetPlayers().FindAll(p => p.Team == player.Team && p.IsValid && !p.IsBot).Count == 1)
+ {
+ Config.DefaultSkillInfo[] skillsNeedsTeammates = Config.config.SkillsInfo.Where(s => s.NeedsTeammates).ToArray();
+ skillList.RemoveAll(s => skillsNeedsTeammates.Any(s2 => s2.Name == s.Skill.ToString()));
+ }
+
+ if (player.Team == CsTeam.Terrorist)
+ skillList.RemoveAll(s => counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString()));
+ else
+ skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString()));
+
+ randomSkill = skillList.Count == 0 ? new jSkill_SkillInfo(Skills.None, Config.GetValue(Skills.None, "color"), false) : skillList[Instance.Random.Next(skillList.Count)];
+ }
+ else if (Config.config.Settings.GameMode == (int)Config.GameModes.TeamSkills)
+ randomSkill = player.Team == CsTeam.Terrorist ? tSkill : ctSkill;
+ else if (Config.config.Settings.GameMode == (int)Config.GameModes.SameSkills)
+ randomSkill = allSkill;
+ else if (Config.config.Settings.GameMode == (int)Config.GameModes.Debug)
+ {
+ if (debugSkills.Count == 0)
+ debugSkills = new List(SkillData.Skills);
+ randomSkill = debugSkills[0];
+ debugSkills.RemoveAt(0);
+ player.PrintToChat($"{SkillData.Skills.Count - debugSkills.Count}/{SkillData.Skills.Count}");
}
- Config.SkillInfo[] terroristSkills = Config.config.SkillsInfo.Where(s => s.Team == 2).ToArray();
- Config.SkillInfo[] counterterroristSkills = Config.config.SkillsInfo.Where(s => s.Team == 3).ToArray();
- if (player.Team == CsTeam.Terrorist)
- skillList.RemoveAll(s => counterterroristSkills.Any(s2 => s2.Name == s.Skill.ToString()));
- else
- skillList.RemoveAll(s => terroristSkills.Any(s2 => s2.Name == s.Skill.ToString()));
-
- 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}\".");
diff --git a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs
index 54494e2..a647392 100644
--- a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs
+++ b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs
@@ -14,14 +14,34 @@ namespace jRandomSkills
{
Instance.RegisterListener(() =>
{
+ UpdateGameRules();
foreach (var player in Utilities.GetPlayers())
- {
if (player != null && player.IsValid)
- {
UpdatePlayerHud(player);
- }
- }
});
+
+ Instance.RegisterListener(OnMapStart);
+ }
+
+ private static void OnMapStart(string mapName)
+ {
+ Instance.GameRules = null;
+ }
+
+ private static void InitializeGameRules()
+ {
+ if (Instance.GameRules != null) return;
+ var gameRulesProxy = Utilities.FindAllEntitiesByDesignerName("cs_gamerules").FirstOrDefault();
+ if (gameRulesProxy != null)
+ Instance.GameRules = gameRulesProxy?.GameRules;
+ }
+
+ private static void UpdateGameRules()
+ {
+ if (Instance.GameRules == null)
+ InitializeGameRules();
+ else
+ Instance.GameRules.GameRestart = Instance.GameRules.RestartRoundTime < Server.CurrentTime;
}
private static void UpdatePlayerHud(CCSPlayerController player)
diff --git a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs
index 8b75d6e..56cc90c 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs
@@ -1,7 +1,7 @@
-using CounterStrikeSharp.API;
-using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
+using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
using System.Runtime.InteropServices;
using static jRandomSkills.jRandomSkills;
@@ -10,15 +10,12 @@ namespace jRandomSkills
{
public class Aimbot : ISkill
{
- private static Skills skillName = Skills.Aimbot;
+ private const Skills skillName = Skills.Aimbot;
private static Dictionary hitGroups = new Dictionary();
public static void LoadSkill()
{
- if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
- return;
-
- SkillUtils.RegisterSkill(skillName, "#ff0000");
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
}
@@ -66,5 +63,12 @@ namespace jRandomSkills
return HookResult.Continue;
}
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ }
+ }
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs b/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs
new file mode 100644
index 0000000..5875041
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/Anomaly.cs
@@ -0,0 +1,163 @@
+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 Anomaly : ISkill
+ {
+ private const Skills skillName = Skills.Anomaly;
+ private static int maxSize = Config.GetValue(skillName, "secondsInBack");
+ private static float tickRate = 64;
+ private static float timerCooldown = Config.GetValue(skillName, "cooldown");
+ private static readonly Dictionary SkillPlayerInfo = new Dictionary();
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ Instance.AddTimer(0.1f, () =>
+ {
+ foreach (var player in Utilities.GetPlayers())
+ {
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
+ if (playerInfo?.Skill == skillName)
+ EnableSkill(player);
+ }
+ });
+
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ SkillPlayerInfo.Clear();
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ var player = @event.Userid;
+
+ 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);
+ if (Server.TickCount % tickRate != 0) return;
+ var pawn = player.PlayerPawn.Value;
+ if (pawn != null && pawn.IsValid)
+ {
+ skillInfo.LastPositions.Add(new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z));
+ skillInfo.LastRotations.Add(new QAngle(pawn.EyeAngles.X, pawn.EyeAngles.Y, pawn.EyeAngles.Z));
+ if (skillInfo.LastRotations.Count > maxSize)
+ {
+ skillInfo.LastPositions.RemoveAt(0);
+ skillInfo.LastRotations.RemoveAt(0);
+ }
+ }
+ }
+ }
+ });
+ }
+
+ public static void EnableSkill(CCSPlayerController player)
+ {
+ SkillPlayerInfo[player.SteamID] = new PlayerSkillInfo
+ {
+ SteamID = player.SteamID,
+ CanUse = true,
+ Cooldown = DateTime.MinValue,
+ LastPositions = new List(),
+ LastRotations = new List(),
+ };
+ }
+
+ 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;
+ Vector lastPosition = skillInfo.LastPositions.FirstOrDefault();
+ QAngle lastRotation = skillInfo.LastRotations.FirstOrDefault();
+ if (lastPosition != null && lastRotation != null)
+ playerPawn.Teleport(lastPosition, lastRotation, null);
+ }
+ }
+ }
+
+ public class PlayerSkillInfo
+ {
+ public ulong SteamID { get; set; }
+ public bool CanUse { get; set; }
+ public DateTime Cooldown { get; set; }
+ public List LastPositions { get; set; }
+ public List LastRotations { get; set; }
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public int SecondsInBack { get; set; }
+ public float Cooldown { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#a86eff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, int secondsInBack = 5, float cooldown = 15) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ SecondsInBack = secondsInBack;
+ Cooldown = cooldown;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs b/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs
index 693c3b0..9738fac 100644
--- a/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs
@@ -1,4 +1,7 @@
+using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Entities.Constants;
+using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills;
@@ -6,15 +9,28 @@ namespace jRandomSkills
{
public class AntyFlash : ISkill
{
- private static Skills skillName = Skills.AntyFlash;
+ private const Skills skillName = Skills.AntyFlash;
public static void LoadSkill()
{
- if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
- return;
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ Instance.AddTimer(0.1f, () =>
+ {
+ foreach (var player in Utilities.GetPlayers())
+ {
+ if (!Instance.IsPlayerValid(player)) continue;
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
+ if (playerInfo?.Skill != skillName) continue;
+ EnableSkill(player);
+ }
+ });
+
+ return HookResult.Continue;
+ });
- SkillUtils.RegisterSkill(skillName, "#D6E6FF");
-
Instance.RegisterEventHandler((@event, info) =>
{
var player = @event.Userid;
@@ -35,5 +51,17 @@ namespace jRandomSkills
return HookResult.Continue;
});
}
+
+ public static void EnableSkill(CCSPlayerController player)
+ {
+ SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade);
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#D6E6FF", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ }
+ }
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs b/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs
index 5c63a84..44b5aa0 100644
--- a/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs
@@ -1,4 +1,5 @@
using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills;
@@ -6,15 +7,12 @@ namespace jRandomSkills
{
public class AntyHead : ISkill
{
- private static Skills skillName = Skills.AntyHead;
+ private const Skills skillName = Skills.AntyHead;
public static void LoadSkill()
{
- if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
- return;
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
- SkillUtils.RegisterSkill(skillName, "#8B4513");
-
Instance.RegisterEventHandler((@event, info) =>
{
var attacker = @event.Attacker;
@@ -45,5 +43,12 @@ namespace jRandomSkills
playerPawn.Health = (int)newHealth;
}
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#8B4513", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ }
+ }
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs
index 1908764..5296644 100644
--- a/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/AreaReaper.cs
@@ -9,11 +9,11 @@ namespace jRandomSkills
{
public class AreaReaper : ISkill
{
- private static Skills skillName = Skills.AreaReaper;
+ private const Skills skillName = Skills.AreaReaper;
public static void LoadSkill()
{
- SkillUtils.RegisterSkill(skillName, "#edf5b5", false);
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
Instance.RegisterEventHandler((@event, info) =>
{
@@ -94,5 +94,12 @@ namespace jRandomSkills
foreach (var bombTarget in bombTargets)
bombTarget.AcceptInput("Enable");
}
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#edf5b5", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ }
+ }
}
}
\ 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 df89a66..050d39f 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Armored.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Armored.cs
@@ -11,14 +11,11 @@ namespace jRandomSkills
{
public class Armored : ISkill
{
- private static Skills skillName = Skills.Armored;
+ private const Skills skillName = Skills.Armored;
public static void LoadSkill()
{
- if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
- return;
-
- SkillUtils.RegisterSkill(skillName, "#d1430a", false);
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false);
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
@@ -44,10 +41,7 @@ namespace jRandomSkills
{
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
- var skillConfig = Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString());
- if (skillConfig == null) return;
-
- float newScale = (float)Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom;
+ float newScale = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "ChanceTo") - Config.GetValue(skillName, "ChanceFrom")) + Config.GetValue(skillName, "ChanceFrom");
playerInfo.SkillChance = newScale;
newScale = (float)Math.Round(newScale, 2);
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("armored")}{ChatColors.Lime}: " + Localization.GetTranslation("armored_desc2", newScale), false);
@@ -73,15 +67,24 @@ namespace jRandomSkills
CCSPlayerController attacker = attackerPawn.Controller.Value.As();
CCSPlayerController victim = victimPawn.Controller.Value.As();
- var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID);
if (playerInfo == null) return HookResult.Continue;
- if (playerInfo.Skill == skillName && attacker.PawnIsAlive)
- {
+ if (playerInfo.Skill == skillName && victim.PawnIsAlive)
param2.Damage *= (float)playerInfo.SkillChance;
- }
return HookResult.Continue;
}
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float ChanceFrom { get; set; }
+ public float ChanceTo { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#d1430a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .65f, float chanceTo = .85f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ ChanceFrom = chanceFrom;
+ ChanceTo = chanceTo;
+ }
+ }
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Assassin.cs b/jRandomSkills - SRC Files/src/player/skills/Assassin.cs
new file mode 100644
index 0000000..e0be636
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/Assassin.cs
@@ -0,0 +1,78 @@
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.player;
+using static jRandomSkills.jRandomSkills;
+
+namespace jRandomSkills
+{
+ public class Assassin : ISkill
+ {
+ private const Skills skillName = Skills.Assassin;
+ private static float damageMultiplier = Config.GetValue(skillName, "damageMultiplier");
+ private static float toleranceDeg = Config.GetValue(skillName, "toleranceDeg");
+ private static string[] nades = { "inferno", "flashbang", "smokegrenade", "decoy", "hegrenade" };
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ var damage = @event.DmgHealth;
+ var victim = @event.Userid;
+ var attacker = @event.Attacker;
+ var weapon = @event.Weapon;
+ HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup;
+
+ if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue;
+ if (nades.Contains(weapon)) return HookResult.Continue;
+
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
+ if (playerInfo?.Skill != skillName) return HookResult.Continue;
+
+ if (IsBehind(attacker, victim))
+ SkillUtils.TakeHealth(victim.PlayerPawn.Value, (int)(damage * (damageMultiplier - 1f)));
+
+ return HookResult.Continue;
+ });
+ }
+
+ private static bool IsBehind(CCSPlayerController attacker, CCSPlayerController victim)
+ {
+ var attackerPawn = attacker.PlayerPawn.Value;
+ var victimPawn = victim.PlayerPawn.Value;
+ if (attackerPawn == null || !attackerPawn.IsValid || victimPawn == null || !victimPawn.IsValid) return false;
+ var angles = GetAngleRange(victimPawn.AbsRotation.Y);
+ return IsBeetween(angles.Item1, angles.Item2, attackerPawn.AbsRotation.Y);
+ }
+
+ private static (float, float) GetAngleRange(float angle)
+ {
+ float min = angle - toleranceDeg;
+ float max = angle + toleranceDeg;
+
+ if (min < -180) min += 360f;
+ if (max > 180f) max -= 360f;
+
+ return (min, max);
+ }
+
+ private static bool IsBeetween(float a, float b, float target)
+ {
+ if (a <= b)
+ return (target >= a && target <= b);
+ return (target >= a || target <= b);
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float DamageMultiplier { get; set; }
+ public float ToleranceDeg { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#d9d9d9", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float damageMultiplier = 2f, float toleranceDeg = 45f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ DamageMultiplier = damageMultiplier;
+ ToleranceDeg = toleranceDeg;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs b/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs
index 7ae9cf4..c8a6655 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Astronaut.cs
@@ -9,15 +9,12 @@ namespace jRandomSkills
{
public class Astronaut : ISkill
{
- private static Skills skillName = Skills.Astronaut;
+ private const Skills skillName = Skills.Astronaut;
public static void LoadSkill()
{
- if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
- return;
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false);
- SkillUtils.RegisterSkill(skillName, "#7E10AD", false);
-
Instance.RegisterEventHandler((@event, info) =>
{
Instance.AddTimer(0.1f, () =>
@@ -35,6 +32,13 @@ namespace jRandomSkills
});
return HookResult.Continue;
});
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ foreach (var player in Utilities.GetPlayers())
+ DisableSkill(player);
+ return HookResult.Continue;
+ });
}
public static void EnableSkill(CCSPlayerController player)
@@ -44,17 +48,25 @@ namespace jRandomSkills
public static void DisableSkill(CCSPlayerController player)
{
- player.Pawn.Value.GravityScale = 1;
+ player.Pawn.Value.ActualGravityScale = 1;
}
private static void ApplyGravityModifier(CCSPlayerController player)
{
- var skillConfig = Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString());
- if (skillConfig == null) return;
-
- float gravityModifier = (float)Math.Round(Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom, 1);
+ float gravityModifier = (float)Math.Round(Instance.Random.NextDouble() * (Config.GetValue(skillName, "ChanceTo") - Config.GetValue(skillName, "chanceFrom")) + Config.GetValue(skillName, "chanceFrom"), 1);
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("astronaut")}{ChatColors.Lime}: " + Localization.GetTranslation("astronaut_desc2", gravityModifier), false);
- player.Pawn.Value.GravityScale = gravityModifier;
+ player.Pawn.Value.ActualGravityScale = gravityModifier;
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float ChanceFrom { get; set; }
+ public float ChanceTo { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#7E10AD", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .1f, float chanceTo = .7f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ ChanceFrom = chanceFrom;
+ ChanceTo = chanceTo;
+ }
}
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs
new file mode 100644
index 0000000..afebce6
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs
@@ -0,0 +1,130 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Entities.Constants;
+using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.player;
+using static jRandomSkills.jRandomSkills;
+
+namespace jRandomSkills
+{
+ public class Baseball : ISkill
+ {
+ private const Skills skillName = Skills.Baseball;
+ private static float speedMultipier = Config.GetValue(skillName, "speedMultipier");
+ private static float maxSpeed = Config.GetValue(skillName, "maxSpeed");
+ private static int damageDeal = Config.GetValue(skillName, "damageDeal");
+ private static HashSet decoys = new HashSet();
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ Instance.AddTimer(0.1f, () =>
+ {
+ foreach (var player in Utilities.GetPlayers())
+ {
+ if (!Instance.IsPlayerValid(player)) continue;
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
+ if (playerInfo?.Skill != skillName) continue;
+ EnableSkill(player);
+ }
+ });
+
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ var victim = @event.Userid;
+ var attacker = @event.Attacker;
+ var weapon = @event.Weapon;
+
+ if (weapon != "decoy") return HookResult.Continue;
+ if (!Instance.IsPlayerValid(victim) || !Instance.IsPlayerValid(attacker)) return HookResult.Continue;
+
+ var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
+ if (attackerInfo?.Skill != skillName) return HookResult.Continue;
+
+ SkillUtils.TakeHealth(victim.PlayerPawn.Value, damageDeal);
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterListener(@event =>
+ {
+ var name = @event.DesignerName;
+ if (name != "decoy_projectile")
+ return;
+
+ var decoy = @event.As();
+ var pawn = decoy.OwnerEntity.Value.As();
+ var player = pawn.Controller.Value.As();
+
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
+ if (playerInfo?.Skill != skillName) return;
+ decoys.Add(decoy);
+ });
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ var player = @event.Userid;
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
+ if (playerInfo?.Skill != skillName) return HookResult.Continue;
+
+ var decoy = decoys.FirstOrDefault(d => d.Index == @event.Entityid);
+ if (decoy != null && decoy.IsValid)
+ decoy.Remove();
+
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterListener(OnTick);
+ }
+
+ private static void OnTick()
+ {
+ foreach (var decoy in decoys)
+ {
+ if (decoy == null || !decoy.IsValid)
+ {
+ decoys.Remove(decoy);
+ continue;
+ }
+ decoy.Bounces = 0;
+ if (Server.TickCount % 8 != 0) continue;
+ var vel = decoy.AbsVelocity;
+ float speed = vel.Length();
+ float targetSpeed = Math.Min(speed * speedMultipier, maxSpeed);
+
+ if (speed > .01f)
+ {
+ var dir = vel / speed;
+ var newVelocity = dir * targetSpeed;
+
+ decoy.AbsVelocity.X = newVelocity.X;
+ decoy.AbsVelocity.Y = newVelocity.Y;
+ decoy.AbsVelocity.Z = newVelocity.Z;
+ }
+ }
+ }
+
+ public static void EnableSkill(CCSPlayerController player)
+ {
+ SkillUtils.TryGiveWeapon(player, CsItem.DecoyGrenade);
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float SpeedMultipier { get; set; }
+ public float MaxSpeed { get; set; }
+ public float DamageDeal { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#2effc7", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float speedMultipier = 2f, float maxSpeed = 900f, int damageDeal = 9999) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ SpeedMultipier = speedMultipier;
+ MaxSpeed = maxSpeed;
+ DamageDeal = damageDeal;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Behind.cs b/jRandomSkills - SRC Files/src/player/skills/Behind.cs
index e7aa88a..bc70b14 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Behind.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Behind.cs
@@ -9,14 +9,11 @@ namespace jRandomSkills
{
public class Behind : ISkill
{
- private static Skills skillName = Skills.Behind;
+ private const Skills skillName = Skills.Behind;
public static void LoadSkill()
{
- if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
- return;
-
- SkillUtils.RegisterSkill(skillName, "#00FF00", false);
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false);
Instance.RegisterEventHandler((@event, info) =>
{
@@ -57,11 +54,8 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController player)
{
- var skillConfig = Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString());
- if (skillConfig == null) return;
-
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
- float newChance = (float)Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom;
+ float newChance = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "ChanceTo") - Config.GetValue(skillName, "ChanceFrom")) + Config.GetValue(skillName, "ChanceFrom");
playerInfo.SkillChance = newChance;
newChance = (float)Math.Round(newChance, 2) * 100;
newChance = (float)Math.Round(newChance);
@@ -84,5 +78,16 @@ namespace jRandomSkills
player.PlayerPawn.Value.Teleport(currentPosition, newAngles, new Vector(0, 0, 0));
}
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float ChanceFrom { get; set; }
+ public float ChanceTo { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#00FF00", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .2f, float chanceTo = .4f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ ChanceFrom = chanceFrom;
+ ChanceTo = chanceTo;
+ }
+ }
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs b/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs
new file mode 100644
index 0000000..857914a
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs
@@ -0,0 +1,75 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.player;
+using static jRandomSkills.jRandomSkills;
+
+namespace jRandomSkills
+{
+ public class BladeMaster : ISkill
+ {
+ private const Skills skillName = Skills.BladeMaster;
+ private static string[] noReflectionWeapon = { "inferno", "flashbang", "smokegrenade", "decoy", "hegrenade", "knife" };
+ private static float torseReflectionChance = Config.GetValue(skillName, "torseReflectionChance") * 100;
+ private static float legReflectionChance = Config.GetValue(skillName, "legReflectionChance") * 100;
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ var victim = @event.Userid;
+ int damage = @event.DmgHealth;
+ HitGroup_t hitGroup = (HitGroup_t)@event.Hitgroup;
+ string weapon = @event.Weapon;
+
+ if (noReflectionWeapon.Contains(weapon) || !Instance.IsPlayerValid(victim)) return HookResult.Continue;
+ var victimInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == victim.SteamID);
+ if (victimInfo == null || victimInfo.Skill != skillName) return HookResult.Continue;
+
+ int chance = Instance.Random.Next(0, 101);
+ if (hitGroup == HitGroup_t.HITGROUP_LEFTLEG || hitGroup == HitGroup_t.HITGROUP_RIGHTLEG)
+ {
+ if (chance > legReflectionChance)
+ return HookResult.Continue;
+ }
+ else
+ if (chance > torseReflectionChance)
+ return HookResult.Continue;
+
+ var pawn = victim.PlayerPawn.Value;
+ if (pawn == null || !pawn.IsValid) return HookResult.Continue;
+
+ var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value;
+ if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.DesignerName != "weapon_knife") return HookResult.Continue;
+
+ 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");
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float TorseReflectionChance { get; set; }
+ public float LegReflectionChance { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#cc7504", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float torseReflectionChance = .95f, float legReflectionChance = .80f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ TorseReflectionChance = torseReflectionChance;
+ LegReflectionChance = legReflectionChance;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs
index cab0c15..7c35b37 100644
--- a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs
@@ -9,16 +9,14 @@ namespace jRandomSkills
{
public class BunnyHop : ISkill
{
- private static Skills skillName = Skills.BunnyHop;
- private const float MaxSpeed = 500f;
- private const float BunnyHopVelocity = 300f;
+ private const Skills skillName = Skills.BunnyHop;
+ private static float maxSpeed = Config.GetValue(skillName, "maxSpeed");
+ private static float bunnyHopVelocity = Config.GetValue(skillName, "jumpVelocity");
+ private static float jumpBoost = Config.GetValue(skillName, "jumpBoost");
public static void LoadSkill()
{
- if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
- return;
-
- SkillUtils.RegisterSkill(skillName, "#EB4034");
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
Instance.RegisterListener(OnTick);
}
@@ -27,40 +25,52 @@ namespace jRandomSkills
foreach (var player in Utilities.GetPlayers())
{
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
-
if (playerInfo?.Skill == skillName)
- {
GiveBunnyHop(player);
- }
}
}
private static void GiveBunnyHop(CCSPlayerController player)
{
var playerPawn = player.PlayerPawn.Value;
- if (playerPawn != null)
+ if (playerPawn == null || !playerPawn.IsValid) return;
+
+ var flags = (PlayerFlags)playerPawn.Flags;
+ var buttons = player.Buttons;
+
+ if (buttons.HasFlag(PlayerButtons.Jump) && flags.HasFlag(PlayerFlags.FL_ONGROUND) && !playerPawn.MoveType.HasFlag(MoveType_t.MOVETYPE_LADDER))
{
- if (Math.Round(playerPawn.AbsVelocity.Length2D()) > MaxSpeed && MaxSpeed != 0)
- ChangeVelocity(playerPawn, MaxSpeed);
+ playerPawn.AbsVelocity.Z = bunnyHopVelocity;
- var flags = (PlayerFlags)playerPawn.Flags;
- var buttons = player.Buttons;
+ var vX = playerPawn.AbsVelocity.X;
+ var vY = playerPawn.AbsVelocity.Y;
+ var speed2D = Math.Sqrt(vX * vX + vY * vY);
+ var scale = 1d;
- if (buttons.HasFlag(PlayerButtons.Jump) && flags.HasFlag(PlayerFlags.FL_ONGROUND) && !playerPawn.MoveType.HasFlag(MoveType_t.MOVETYPE_LADDER))
- playerPawn.AbsVelocity.Z = BunnyHopVelocity;
+ if (speed2D < maxSpeed)
+ {
+ var newSpeed = Math.Min(speed2D * jumpBoost, maxSpeed);
+ scale = newSpeed / (speed2D == 0 ? 1 : speed2D);
+ }
+ else if (speed2D > maxSpeed)
+ scale = maxSpeed / speed2D;
+
+ playerPawn.AbsVelocity.X = (float)(vX * scale);
+ playerPawn.AbsVelocity.Y = (float)(vY * scale);
}
}
- private static void ChangeVelocity(CCSPlayerPawn? pawn, float vel)
+ public class SkillConfig : Config.DefaultSkillInfo
{
- if (pawn == null) return;
-
- var currentVelocity = new Vector(pawn.AbsVelocity.X, pawn.AbsVelocity.Y, pawn.AbsVelocity.Z);
- var currentSpeed3D = Math.Sqrt(currentVelocity.X * currentVelocity.X + currentVelocity.Y * currentVelocity.Y + currentVelocity.Z * currentVelocity.Z);
-
- pawn.AbsVelocity.X = (float)(currentVelocity.X / currentSpeed3D) * vel;
- pawn.AbsVelocity.Y = (float)(currentVelocity.Y / currentSpeed3D) * vel;
- pawn.AbsVelocity.Z = (float)(currentVelocity.Z / currentSpeed3D) * vel;
+ public float MaxSpeed { get; set; }
+ public float JumpVelocity { get; set; }
+ public float JumpBoost { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#d1430a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float maxSpeed = 500f, float jumpVelocity = 300f, float jumpBoost = 2f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ MaxSpeed = maxSpeed;
+ JumpVelocity = jumpVelocity;
+ JumpBoost = jumpBoost;
+ }
}
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs
index bc522dd..53aa562 100644
--- a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs
@@ -1,6 +1,7 @@
using System.Drawing;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills;
@@ -8,14 +9,11 @@ namespace jRandomSkills
{
public class C4Camouflage : ISkill
{
- private static Skills skillName = Skills.C4Camouflage;
+ private const 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");
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
Instance.RegisterEventHandler((@event, info) =>
{
@@ -23,6 +21,7 @@ namespace jRandomSkills
{
foreach (var player in Utilities.GetPlayers())
{
+ DisableSkill(player);
if (!Instance.IsPlayerValid(player)) continue;
var playerPawn = player.PlayerPawn?.Value;
@@ -35,10 +34,15 @@ namespace jRandomSkills
return HookResult.Continue;
});
- Instance.RegisterEventHandler((@event, info) =>
+ Instance.RegisterEventHandler((@event, info) =>
{
- foreach (var player in Utilities.GetPlayers())
+ var player = @event.Userid;
+ if (!player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue;
+
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
+ if (playerInfo?.Skill == skillName)
DisableSkill(player);
+
return HookResult.Continue;
});
@@ -117,5 +121,12 @@ namespace jRandomSkills
}
}
}
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#00911f", CsTeam onlyTeam = CsTeam.Terrorist, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ }
+ }
}
}
\ 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 08f24c1..9f4b60b 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Catapult.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Catapult.cs
@@ -9,14 +9,11 @@ namespace jRandomSkills
{
public class Catapult : ISkill
{
- private static Skills skillName = Skills.Catapult;
+ private const Skills skillName = Skills.Catapult;
public static void LoadSkill()
{
- if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
- return;
-
- SkillUtils.RegisterSkill(skillName, "#FF4500", false);
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false);
Instance.RegisterEventHandler((@event, info) =>
{
@@ -40,10 +37,7 @@ namespace jRandomSkills
var attacker = @event.Attacker;
var victim = @event.Userid;
- if (attacker == null || !attacker.IsValid || victim == null || !victim.IsValid) return HookResult.Continue;
-
- if (attacker == victim) return HookResult.Continue;
-
+ if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue;
var attackerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
if (attackerInfo?.Skill == skillName && victim.PawnIsAlive)
@@ -64,15 +58,23 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController player)
{
- var skillConfig = Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString());
- if (skillConfig == null) return;
-
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
- float newChance = (float)Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom;
+ float newChance = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "chanceTo") - Config.GetValue(skillName, "chanceFrom")) + Config.GetValue(skillName, "chanceFrom");
playerInfo.SkillChance = newChance;
newChance = (float)Math.Round(newChance, 2) * 100;
newChance = (float)Math.Round(newChance);
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("catapult")}{ChatColors.Lime}: " + Localization.GetTranslation("catapult_desc2", newChance), false);
}
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float ChanceFrom { get; set; }
+ public float ChanceTo { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#FF4500", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .2f, float chanceTo = .4f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ ChanceFrom = chanceFrom;
+ ChanceTo = chanceTo;
+ }
+ }
}
}
\ 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 6bb700e..73de410 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs
@@ -11,7 +11,7 @@ namespace jRandomSkills
{
public class Chicken : ISkill
{
- private static Skills skillName = Skills.Chicken;
+ private const Skills skillName = Skills.Chicken;
private static string[] disabledWeapons =
{
"weapon_ak47",
@@ -44,10 +44,7 @@ namespace jRandomSkills
public static void LoadSkill()
{
- if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
- return;
-
- SkillUtils.RegisterSkill(skillName, "#FF8B42");
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
Instance.RegisterEventHandler((@event, info) =>
{
@@ -82,7 +79,13 @@ namespace jRandomSkills
Instance.RegisterEventHandler((@event, info) =>
{
- DisableSkill(@event.Userid);
+ var player = @event.Userid;
+ if (!player.IsValid || player.PlayerPawn.Value == null) return HookResult.Continue;
+
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
+ if (playerInfo?.Skill == skillName)
+ DisableSkill(player);
+
return HookResult.Continue;
});
@@ -95,6 +98,13 @@ namespace jRandomSkills
return HookResult.Continue;
});
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ foreach (var player in Utilities.GetPlayers())
+ SetWeaponAttack(player, false);
+ return HookResult.Continue;
+ });
+
Instance.RegisterListener(OnTick);
}
@@ -104,7 +114,6 @@ namespace jRandomSkills
if (playerPawn != null)
{
playerPawn.VelocityModifier = 1.1f;
- Utilities.SetStateChanged(player, "CCSPlayerPawn", "m_flVelocityModifier");
playerPawn.Health = 50;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
@@ -127,7 +136,6 @@ namespace jRandomSkills
if (playerPawn != null)
{
playerPawn.VelocityModifier = 1f;
- Utilities.SetStateChanged(player, "CCSPlayerPawn", "m_flVelocityModifier");
playerPawn.Health += 50;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
@@ -219,5 +227,12 @@ namespace jRandomSkills
var hudContent = infoLine + skillLine + remainingLine;
player.PrintToCenterHtml(hudContent);
}
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#FF8B42", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ }
+ }
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs b/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs
new file mode 100644
index 0000000..6c8a0e7
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/ChillOut.cs
@@ -0,0 +1,50 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.player;
+using static jRandomSkills.jRandomSkills;
+
+namespace jRandomSkills
+{
+ public class ChillOut : ISkill
+ {
+ private const Skills skillName = Skills.ChillOut;
+ private static float bombArmedTime = Config.GetValue(skillName, "bombArmedTime");
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ var player = @event.Userid;
+
+ if (!Instance.IsPlayerValid(player)) return HookResult.Continue;
+
+ var anyChillOut = Instance.skillPlayer.FirstOrDefault(p => p.Skill == skillName);
+ if (anyChillOut != null)
+ {
+ var bombEntities = Utilities.FindAllEntitiesByDesignerName("weapon_c4").ToList();
+
+ if (bombEntities.Any())
+ {
+ var bomb = bombEntities.FirstOrDefault();
+ if (bomb != null)
+ bomb.ArmedTime = Server.CurrentTime + bombArmedTime;
+ }
+ }
+
+ return HookResult.Continue;
+ });
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float BombArmedTime { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#343deb", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false, float bombArmedTime = 10f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ BombArmedTime = bombArmedTime;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Cutter.cs b/jRandomSkills - SRC Files/src/player/skills/Cutter.cs
new file mode 100644
index 0000000..de36510
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/Cutter.cs
@@ -0,0 +1,41 @@
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.player;
+using static jRandomSkills.jRandomSkills;
+
+namespace jRandomSkills
+{
+ public class Cutter : ISkill
+ {
+ private const Skills skillName = Skills.Cutter;
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ var damage = @event.DmgHealth;
+ var attacker = @event.Attacker;
+ var victim = @event.Userid;
+ var weapon = @event.Weapon;
+
+ if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue;
+
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
+ if (playerInfo?.Skill != skillName) return HookResult.Continue;
+
+ if (weapon == "knife")
+ SkillUtils.TakeHealth(victim.PlayerPawn.Value, 9999);
+ return HookResult.Continue;
+ });
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#88a31a", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs
new file mode 100644
index 0000000..4448ee0
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs
@@ -0,0 +1,136 @@
+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 Darkness : ISkill
+ {
+ private const Skills skillName = Skills.Darkness;
+ private static float brightness = Config.GetValue(skillName, "brightness");
+ private static Dictionary deafultPostProcessing = new Dictionary();
+ private static List newPostProcessing = new List();
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false);
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ Instance.AddTimer(0.1f, () =>
+ {
+ foreach (var player in Utilities.GetPlayers())
+ {
+ if (!Instance.IsPlayerValid(player)) continue;
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
+ if (playerInfo?.Skill != skillName) continue;
+ EnableSkill(player);
+ }
+ });
+
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ foreach (var player in deafultPostProcessing.Keys)
+ DisableSkill(player);
+ foreach (var postProcessing in newPostProcessing)
+ postProcessing.Remove();
+ newPostProcessing.Clear();
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ SetUpPostProcessing(@event.Userid, true);
+ 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;
+ }
+
+ SetUpPostProcessing(enemy);
+ playerInfo.SkillChance = 1;
+ player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("darkness_player_info", enemy.PlayerName));
+ enemy.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("darkness_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("darkness") + ":", false);
+
+ player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("darkness_select_info")}");
+ var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot).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)
+ {
+ SetUpPostProcessing(player, true);
+ }
+
+ private static void SetUpPostProcessing(CCSPlayerController player, bool dontCreateNew = false)
+ {
+ if (deafultPostProcessing.TryGetValue(player, out var oldPostProcessing))
+ {
+ player.PlayerPawn.Value.CameraServices.PostProcessingVolumes.FirstOrDefault().Raw = oldPostProcessing.EntityHandle.Raw;
+ deafultPostProcessing.Remove(player);
+ Utilities.SetStateChanged(player.PlayerPawn.Value, "CBasePlayerPawn", "m_pCameraServices");
+ return;
+ }
+
+ if (dontCreateNew)
+ return;
+
+ var postProcessing = Utilities.CreateEntityByName("post_processing_volume");
+ postProcessing.ExposureControl = true;
+ postProcessing.MaxExposure = brightness;
+ postProcessing.MinExposure = brightness;
+ deafultPostProcessing.TryAdd(player, player.PlayerPawn.Value.CameraServices.PostProcessingVolumes.FirstOrDefault().Value);
+ player.PlayerPawn.Value.CameraServices.PostProcessingVolumes.FirstOrDefault().Raw = postProcessing.EntityHandle.Raw;
+ Utilities.SetStateChanged(player.PlayerPawn.Value, "CBasePlayerPawn", "m_pCameraServices");
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float Brightness { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#383838", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float brightness = .01f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ Brightness = brightness;
+ }
+ }
+ }
+}
\ 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
index 4ba0086..eaee80b 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs
@@ -3,21 +3,17 @@ 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;
+ private const 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);
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false);
Instance.RegisterEventHandler((@event, info) =>
{
@@ -83,7 +79,7 @@ namespace jRandomSkills
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}");
+ player.PrintToChat($" {ChatColors.Green}⠀⠀⠀[{ChatColors.Red}{enemy.Index}{ChatColors.Green}] {enemy.PlayerName}: {ChatColors.Red}{skillData.Name}");
}
}
else
@@ -117,5 +113,12 @@ namespace jRandomSkills
enemy.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("deactivator_enemy_info"));
}
}
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#919191", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ }
+ }
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Deaf.cs b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs
new file mode 100644
index 0000000..9b05858
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/Deaf.cs
@@ -0,0 +1,119 @@
+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 Deaf : ISkill
+ {
+ private const Skills skillName = Skills.Deaf;
+ private static HashSet deafPlayers = new HashSet();
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false);
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ deafPlayers.Clear();
+ Instance.AddTimer(0.1f, () =>
+ {
+ foreach (var player in Utilities.GetPlayers())
+ {
+ if (!Instance.IsPlayerValid(player)) continue;
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
+ if (playerInfo?.Skill != skillName) continue;
+ EnableSkill(player);
+ }
+ });
+
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ DisableSkill(@event.Userid);
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ foreach (var player in deafPlayers)
+ DisableSkill(player);
+ return HookResult.Continue;
+ });
+
+ Instance.HookUserMessage(208, um =>
+ {
+ var soundevent = um.ReadUInt("soundevent_hash");
+ var userIndex = um.ReadUInt("source_entity_index");
+
+ foreach (var player in deafPlayers)
+ um.Recipients.Remove(player);
+
+ return HookResult.Continue;
+ }, HookMode.Pre);
+ }
+
+ 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;
+ }
+
+ deafPlayers.Add(enemy);
+ playerInfo.SkillChance = 1;
+ player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("deaf_player_info", enemy.PlayerName));
+ enemy.PrintToChat($" {ChatColors.Red}" + Localization.GetTranslation("deaf_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("deaf") + ":", false);
+
+ player.PrintToChat($" {ChatColors.Green}{Localization.GetTranslation("deaf_select_info")}");
+ var enemies = Utilities.GetPlayers().Where(p => p.Team != player.Team && p.IsValid && !p.IsBot).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)
+ {
+ deafPlayers.Remove(player);
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#dae01f", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs b/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs
index b09f631..24b140a 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Disarmament.cs
@@ -9,14 +9,11 @@ namespace jRandomSkills
{
public class Disarmament : ISkill
{
- private static Skills skillName = Skills.Disarmament;
+ private const Skills skillName = Skills.Disarmament;
public static void LoadSkill()
{
- if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
- return;
-
- SkillUtils.RegisterSkill(skillName, "#FF4500", false);
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false);
Instance.RegisterEventHandler((@event, info) =>
{
@@ -40,10 +37,7 @@ namespace jRandomSkills
var attacker = @event.Attacker;
var victim = @event.Userid;
- if (attacker == null || !attacker.IsValid || victim == null || !victim.IsValid) return HookResult.Continue;
-
- if (attacker == victim) return HookResult.Continue;
-
+ if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
if (playerInfo?.Skill == skillName && victim.PawnIsAlive)
@@ -55,7 +49,8 @@ namespace jRandomSkills
var weaponName = weaponServices?.ActiveWeapon?.Value?.DesignerName;
if (weaponName != null && !weaponName.Contains("weapon_knife") && !weaponName.Contains("weapon_c4"))
- victim.DropActiveWeapon();
+ victim.ExecuteClientCommand("slot3");
+ //victim.DropActiveWeapon();
}
}
return HookResult.Continue;
@@ -64,15 +59,23 @@ namespace jRandomSkills
public static void EnableSkill(CCSPlayerController player)
{
- var skillConfig = Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString());
- if (skillConfig == null) return;
-
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
- float newChance = (float)Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom;
+ float newChance = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "chanceTo") - Config.GetValue(skillName, "chanceFrom")) + Config.GetValue(skillName, "chanceFrom");
playerInfo.SkillChance = newChance;
newChance = (float)Math.Round(newChance, 2) * 100;
newChance = (float)Math.Round(newChance);
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("disarmament")}{ChatColors.Lime}: " + Localization.GetTranslation("disarmament_desc2", newChance), false);
}
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float ChanceFrom { get; set; }
+ public float ChanceTo { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#FF4500", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = .65f, float chanceTo = .85f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ ChanceFrom = chanceFrom;
+ ChanceTo = chanceTo;
+ }
+ }
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Distancer.cs b/jRandomSkills - SRC Files/src/player/skills/Distancer.cs
new file mode 100644
index 0000000..de5839d
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/Distancer.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 Distancer : ISkill
+ {
+ private const Skills skillName = Skills.Distancer;
+ private static HashSet distancerPlayers = new HashSet();
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ Instance.AddTimer(0.1f, () =>
+ {
+ foreach (var player in Utilities.GetPlayers())
+ {
+ if (!Instance.IsPlayerValid(player)) continue;
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
+ if (playerInfo?.Skill != skillName) continue;
+ EnableSkill(player);
+ }
+ });
+
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ foreach (var player in distancerPlayers)
+ DisableSkill(player);
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterListener(OnTick);
+ }
+
+ private static void OnTick()
+ {
+ foreach (var player in distancerPlayers)
+ {
+ var playerPawn = player.PlayerPawn.Value;
+ if (playerPawn == null || !playerPawn.IsValid) return;
+ if (playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return;
+
+ var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == skillName);
+ if (skillData == null) return;
+
+ string closetEnemy = "Bot";
+ double closetDistance = double.MaxValue;
+
+ foreach (var enemy in Utilities.GetPlayers().Where(p => p.Team != player.Team))
+ {
+ var enemyPawn = enemy.PlayerPawn.Value;
+ if (enemyPawn == null || !enemyPawn.IsValid) continue;
+ if (enemyPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) continue;
+ double distance = (int)SkillUtils.GetDistance(playerPawn.AbsOrigin, enemyPawn.AbsOrigin);
+ if (distance >= closetDistance) continue;
+ closetDistance = distance;
+ closetEnemy = enemy.PlayerName;
+ }
+
+ string distanceColor = closetDistance > 1500 ? "#00FF00" : closetDistance > 600 ? "#FFFF00" : "#FF0000";
+
+ string infoLine = $"{Localization.GetTranslation("your_skill")}:
";
+ string skillLine = $"{skillData.Name}
";
+ string remainingLine = $"{closetEnemy}: {closetDistance}
";
+
+ var hudContent = infoLine + skillLine + remainingLine;
+ player.PrintToCenterHtml(hudContent);
+ }
+ }
+
+ public static void EnableSkill(CCSPlayerController player)
+ {
+ distancerPlayers.Add(player);
+ }
+
+ public static void DisableSkill(CCSPlayerController player)
+ {
+ distancerPlayers.Remove(player);
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#00f2ff", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Dracula.cs b/jRandomSkills - SRC Files/src/player/skills/Dracula.cs
index 435f953..078e8ee 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Dracula.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Dracula.cs
@@ -1,5 +1,6 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
using static jRandomSkills.jRandomSkills;
@@ -7,21 +8,19 @@ namespace jRandomSkills
{
public class Dracula : ISkill
{
- private static Skills skillName = Skills.Dracula;
+ private const Skills skillName = Skills.Dracula;
+ private static float healthRegainScale = Config.GetValue(skillName, "healthRegainScale");
public static void LoadSkill()
{
- if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
- return;
-
- SkillUtils.RegisterSkill(skillName, "#FA050D");
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
Instance.RegisterEventHandler((@event, info) =>
{
var attacker = @event.Attacker;
var victim = @event.Userid;
- if (!Instance.IsPlayerValid(attacker) || attacker == victim) return HookResult.Continue;
+ if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue;
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
@@ -38,7 +37,7 @@ namespace jRandomSkills
var attackerPawn = attacker.PlayerPawn.Value;
if (attackerPawn == null) return;
- int newHealth = (int)(attackerPawn.Health + (damage * 0.3));
+ int newHealth = (int)(attackerPawn.Health + (damage * healthRegainScale));
attackerPawn.MaxHealth = Math.Max(newHealth, 100);
Utilities.SetStateChanged(attackerPawn, "CBaseEntity", "m_iMaxHealth");
@@ -46,5 +45,14 @@ namespace jRandomSkills
attackerPawn.Health = newHealth;
Utilities.SetStateChanged(attackerPawn, "CBaseEntity", "m_iHealth");
}
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float HealthRegainScale { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#FA050D", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float healthRegainScale = .3f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ HealthRegainScale = healthRegainScale;
+ }
+ }
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs
index a97d0b1..15be89c 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs
@@ -9,14 +9,11 @@ namespace jRandomSkills
{
public class Duplicator : ISkill
{
- private static Skills skillName = Skills.Duplicator;
+ private const 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);
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false);
Instance.RegisterEventHandler((@event, info) =>
{
@@ -98,5 +95,12 @@ namespace jRandomSkills
player.PrintToChat($" {ChatColors.Green}" + Localization.GetTranslation("duplicator_player_info", enemy.PlayerName));
}
}
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffb73b", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ }
+ }
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs b/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs
index 08bb54c..692a35f 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Dwarf.cs
@@ -9,14 +9,11 @@ namespace jRandomSkills
{
public class Dwarf : ISkill
{
- private static Skills skillName = Skills.Dwarf;
+ private const Skills skillName = Skills.Dwarf;
public static void LoadSkill()
{
- if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
- return;
-
- SkillUtils.RegisterSkill(skillName, "#ffff00", false);
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false);
Instance.RegisterEventHandler((@event, info) =>
{
@@ -62,16 +59,12 @@ namespace jRandomSkills
var playerPawn = player.PlayerPawn?.Value;
if (playerPawn != null)
{
- var skillConfig = Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString());
- if (skillConfig == null) return;
-
- float newSize = (float)Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom;
+ float newSize = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "maxScale") - Config.GetValue(skillName, "minScale")) + Config.GetValue(skillName, "minScale");
newSize = (float)Math.Round(newSize, 2);
// playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = newSize;
- player.PlayerPawn.Value.CBodyComponent.SceneNode.Scale = newSize;
+ playerPawn.CBodyComponent.SceneNode.Scale = newSize;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent");
-
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("dwarf")}{ChatColors.Lime}: " + Localization.GetTranslation("dwarf_desc2", newSize), false);
}
}
@@ -82,9 +75,21 @@ namespace jRandomSkills
if (playerPawn != null && playerPawn?.CBodyComponent != null)
{
// playerPawn.CBodyComponent.SceneNode.GetSkeletonInstance().Scale = 1;
- player.PlayerPawn.Value.CBodyComponent.SceneNode.Scale = 1;
+ playerPawn.CBodyComponent.SceneNode.Scale = 1;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent");
}
}
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float MinScale { get; set; }
+ public float MaxScale { get; set; }
+
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffff00", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float minScale = .6f, float maxScale = .95f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ MinScale = minScale;
+ MaxScale = maxScale;
+ }
+ }
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs
index f6e9957..6718ec5 100644
--- a/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/EnemySpawn.cs
@@ -10,16 +10,13 @@ namespace jRandomSkills
{
public class EnemySpawn : ISkill
{
- private static Skills skillName = Skills.EnemySpawn;
- private static float timerCooldown = (float)(Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Cooldown);
+ private const Skills skillName = Skills.EnemySpawn;
+ private static float timerCooldown = Config.GetValue(skillName, "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, "#ff8c92");
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
Instance.RegisterEventHandler((@event, info) =>
{
@@ -123,14 +120,6 @@ namespace jRandomSkills
player.PrintToCenterHtml(hudContent);
}
- private static void ActiveUse(CCSPlayerController player)
- {
- if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
- {
- skillInfo.CanUse = true;
- }
- }
-
public static void UseSkill(CCSPlayerController player)
{
var playerPawn = player.PlayerPawn.Value;
@@ -169,5 +158,14 @@ namespace jRandomSkills
public DateTime Cooldown { get; set; }
public DateTime LastClick { get; set; }
}
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float Cooldown { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff8c92", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 15f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ Cooldown = cooldown;
+ }
+ }
}
}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs b/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs
new file mode 100644
index 0000000..4766f1e
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/ExplosiveShot.cs
@@ -0,0 +1,106 @@
+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 jRandomSkills.jRandomSkills;
+
+namespace jRandomSkills
+{
+ public class ExplosiveShot : ISkill
+ {
+ private const Skills skillName = Skills.ExplosiveShot;
+ private static float damage = Config.GetValue(skillName, "damage");
+ private static float damageRadius = Config.GetValue(skillName, "damageRadius");
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false);
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ Instance.AddTimer(0.1f, () =>
+ {
+ foreach (var player in Utilities.GetPlayers())
+ {
+ if (!Instance.IsPlayerValid(player)) continue;
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
+ if (playerInfo?.Skill != skillName) continue;
+ EnableSkill(player);
+ }
+ });
+
+ return HookResult.Continue;
+ });
+
+ VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
+ }
+
+ public static void EnableSkill(CCSPlayerController player)
+ {
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
+ float newChance = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "ChanceTo") - Config.GetValue(skillName, "ChanceFrom")) + Config.GetValue(skillName, "ChanceFrom");
+ playerInfo.SkillChance = newChance;
+ newChance = (float)Math.Round(newChance, 2) * 100;
+ newChance = (float)Math.Round(newChance);
+ SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("explosiveshot")}{ChatColors.Lime}: " + Localization.GetTranslation("explosiveshot_desc2", newChance), false);
+ }
+
+ private static void SpawnExplosion(Vector vector)
+ {
+ var heProjectile = Utilities.CreateEntityByName("hegrenade_projectile");
+ if (heProjectile == null || !heProjectile.IsValid) return;
+
+ Vector pos = vector;
+ heProjectile.TicksAtZeroVelocity = 100;
+ heProjectile.TeamNum = (byte)CsTeam.None;
+ heProjectile.Damage = damage;
+ heProjectile.DmgRadius = damageRadius;
+ heProjectile.Teleport(pos, null, new Vector(0, 0, -10));
+ heProjectile.DispatchSpawn();
+ heProjectile.AcceptInput("InitializeSpawnFromWorld", null, null, "");
+ heProjectile.DetonateTime = 0;
+ }
+
+ 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 (attackerPawn.DesignerName != "player")
+ return HookResult.Continue;
+
+ if (attackerPawn == null || attackerPawn.Controller?.Value == null)
+ return HookResult.Continue;
+
+ CCSPlayerController attacker = attackerPawn.Controller.Value.As();
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
+ if (playerInfo == null || playerInfo.Skill != skillName) return HookResult.Continue;
+
+ if (Instance.Random.NextDouble() <= playerInfo.SkillChance)
+ SpawnExplosion(param2.DamagePosition);
+ return HookResult.Continue;
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float Damage { get; set; }
+ public float DamageRadius { get; set; }
+ public float ChanceFrom { get; set; }
+ public float ChanceTo { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#9c0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float damage = 10f, float damageRadius = 190f, float chanceFrom = .15f, float chanceTo = .3f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ Damage = damage;
+ DamageRadius = damageRadius;
+ ChanceFrom = chanceFrom;
+ ChanceTo = chanceTo;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs b/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs
new file mode 100644
index 0000000..551ba5b
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/FalconEye.cs
@@ -0,0 +1,147 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.player;
+using System.Drawing;
+using static jRandomSkills.jRandomSkills;
+
+namespace jRandomSkills
+{
+ public class FalconEye : ISkill
+ {
+ private const Skills skillName = Skills.FalconEye;
+ private static bool blocked = false;
+ private static float distance = Config.GetValue(skillName, "distance");
+ private static Dictionary cameras = new Dictionary();
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ blocked = true;
+ foreach (var player in Utilities.GetPlayers())
+ if (cameras.TryGetValue(player.SteamID, out _))
+ DisableSkill(player);
+
+ foreach (var camera in cameras)
+ camera.Value.Item2.Remove();
+ cameras.Clear();
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ blocked = false;
+ return HookResult.Continue;
+ });
+
+ Instance.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;
+
+ if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item1 == player.PlayerPawn.Value.CameraServices!.ViewEntity!.Raw)
+ BlockWeapon(player, true);
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterListener(OnTick);
+ }
+
+ public static void UseSkill(CCSPlayerController player)
+ {
+ var playerPawn = player.PlayerPawn.Value;
+ if (playerPawn?.CBodyComponent == null || blocked) return;
+ ChangeCamera(player);
+ }
+
+ public static void DisableSkill(CCSPlayerController player)
+ {
+ ChangeCamera(player, true);
+ }
+
+ private static void OnTick()
+ {
+ foreach (var player in Utilities.GetPlayers())
+ if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2.IsValid)
+ {
+ var pawn = player.PlayerPawn.Value;
+ if (pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE)
+ {
+ ChangeCamera(player, true);
+ continue;
+ }
+ Vector pos = new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + 1000);
+ QAngle angle = new QAngle(90, 0, -pawn.V_angle.Y);
+ cameraInfo.Item2.Teleport(pos, angle);
+ }
+ }
+
+ private static void ChangeCamera(CCSPlayerController player, bool forceToDefault = false)
+ {
+ uint orginalCameraRaw;
+ uint newCameraRaw;
+ var pawn = player.PlayerPawn.Value;
+ if (cameras.TryGetValue(player.SteamID, out var cameraInfo) && cameraInfo.Item2.IsValid)
+ {
+ orginalCameraRaw = cameraInfo.Item1;
+ newCameraRaw = cameraInfo.Item2.EntityHandle.Raw;
+ }
+ else
+ {
+ orginalCameraRaw = pawn!.CameraServices!.ViewEntity.Raw;
+ newCameraRaw = CreateCamera(player);
+ }
+
+ if (newCameraRaw == 0)
+ return;
+
+ bool defaultCam = forceToDefault ? true : (pawn.CameraServices!.ViewEntity!.Raw == orginalCameraRaw ? false : true);
+ pawn!.CameraServices!.ViewEntity.Raw = defaultCam ? orginalCameraRaw : newCameraRaw;
+ Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices");
+ BlockWeapon(player, !defaultCam);
+ }
+
+ private static uint CreateCamera(CCSPlayerController player)
+ {
+ var camera = Utilities.CreateEntityByName("prop_dynamic");
+ if (camera == null || !camera.IsValid) return 0;
+
+ var pawn = player.PlayerPawn.Value;
+ Vector pos = new Vector(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + distance);
+
+ camera.Render = Color.FromArgb(0, 255, 255, 255);
+ camera.Teleport(pos, new QAngle(90, 0, 0));
+ camera.DispatchSpawn();
+ cameras[player.SteamID] = (pawn.CameraServices!.ViewEntity.Raw, camera);
+ return camera.EntityHandle.Raw;
+ }
+
+ private static void BlockWeapon(CCSPlayerController player, bool block)
+ {
+ foreach (var weapon in player.Pawn.Value.WeaponServices?.MyWeapons)
+ if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
+ {
+ weapon.Value.NextPrimaryAttackTick = block ? int.MaxValue : Server.TickCount;
+ weapon.Value.NextSecondaryAttackTick = block ? int.MaxValue : Server.TickCount;
+
+ Utilities.SetStateChanged(weapon.Value, "CBasePlayerWeapon", "m_nNextPrimaryAttackTick");
+ Utilities.SetStateChanged(weapon.Value, "CBasePlayerWeapon", "m_nNextSecondaryAttackTick");
+ }
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float Distance { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#d1f542", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float distance = 1000f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ Distance = distance;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/FastReload.cs b/jRandomSkills - SRC Files/src/player/skills/FastReload.cs
new file mode 100644
index 0000000..0c767bb
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/FastReload.cs
@@ -0,0 +1,46 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.player;
+using static jRandomSkills.jRandomSkills;
+
+namespace jRandomSkills
+{
+ public class FastReload : ISkill
+ {
+ private const Skills skillName = Skills.FastReload;
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
+ }
+
+ public static void UseSkill(CCSPlayerController player)
+ {
+ var playerPawn = player.PlayerPawn.Value;
+ if (playerPawn?.CBodyComponent == null) return;
+
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
+ if (playerInfo?.Skill != skillName) return;
+ if (!player.IsValid || !player.PawnIsAlive) return;
+
+ InstaReload(playerPawn);
+ }
+
+ private static void InstaReload(CCSPlayerPawn pawn)
+ {
+ var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value;
+ if (activeWeapon == null || !activeWeapon.IsValid) return;
+
+ activeWeapon.Clip1 = activeWeapon.VData.MaxClip1;
+ Utilities.SetStateChanged(activeWeapon, "CBasePlayerWeapon", "m_iClip1");
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffc061", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float distance = 1000f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Flash.cs b/jRandomSkills - SRC Files/src/player/skills/Flash.cs
index 731f539..3b54ca6 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Flash.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Flash.cs
@@ -10,14 +10,11 @@ namespace jRandomSkills
{
public class Flash : ISkill
{
- private static Skills skillName = Skills.Flash;
+ private const Skills skillName = Skills.Flash;
public static void LoadSkill()
{
- if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
- return;
-
- SkillUtils.RegisterSkill(skillName, "#A31912", false);
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"), false);
Instance.RegisterListener(UpdateSpeed);
Instance.RegisterEventHandler((@event, info) =>
@@ -30,8 +27,6 @@ namespace jRandomSkills
var playerPawn = player.PlayerPawn?.Value;
playerPawn.VelocityModifier = 1;
- Utilities.SetStateChanged(playerPawn, "CCSPlayerPawn", "m_flVelocityModifier");
-
var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) continue;
EnableSkill(player);
@@ -74,12 +69,11 @@ namespace jRandomSkills
var skillConfig = Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString());
if (skillConfig == null) return;
- float newSpeed = (float)Instance.Random.NextDouble() * (skillConfig.ChanceTo - skillConfig.ChanceFrom) + skillConfig.ChanceFrom;
+ float newSpeed = (float)Instance.Random.NextDouble() * (Config.GetValue(skillName, "ChanceTo") - Config.GetValue(skillName, "ChanceFrom")) + Config.GetValue(skillName, "ChanceFrom");
newSpeed = (float)Math.Round(newSpeed, 2);
playerInfo.SkillChance = newSpeed;
playerPawn.VelocityModifier = newSpeed;
- Utilities.SetStateChanged(playerPawn, "CCSPlayerPawn", "m_flVelocityModifier");
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{Localization.GetTranslation("flash")}{ChatColors.Lime}: " + Localization.GetTranslation("flash_desc2", newSpeed), false);
}
@@ -88,7 +82,6 @@ namespace jRandomSkills
var playerPawn = player.PlayerPawn.Value;
if (playerPawn == null) return;
playerPawn.VelocityModifier = 1;
- Utilities.SetStateChanged(playerPawn, "CCSPlayerPawn", "m_flVelocityModifier");
}
private static void UpdateSpeed()
@@ -102,10 +95,18 @@ namespace jRandomSkills
var playerPawn = player.PlayerPawn?.Value;
if (playerPawn != null && playerPawn.VelocityModifier != 0)
- {
playerPawn.VelocityModifier = Math.Max((float)playerInfo?.SkillChance, 1);
- Utilities.SetStateChanged(playerPawn, "CCSPlayerPawn", "m_flVelocityModifier");
- }
+ }
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float ChanceFrom { get; set; }
+ public float ChanceTo { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#A31912", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float chanceFrom = 1.2f, float chanceTo = 3.0f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ ChanceFrom = chanceFrom;
+ ChanceTo = chanceTo;
}
}
}
diff --git a/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs
new file mode 100644
index 0000000..975b713
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/Fortnite.cs
@@ -0,0 +1,191 @@
+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 Fortnite : ISkill
+ {
+ private const Skills skillName = Skills.Fortnite;
+ private static float timerCooldown = Config.GetValue(skillName, "Cooldown");
+ private const string propModel = "models/props/de_aztec/hr_aztec/aztec_scaffolding/aztec_scaffold_wall_support_128.vmdl";
+ private static readonly Dictionary SkillPlayerInfo = new Dictionary();
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ Instance.AddTimer(0.1f, () =>
+ {
+ foreach (var player in Utilities.GetPlayers())
+ {
+ if (!Instance.IsPlayerValid(player)) return;
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
+ if (playerInfo?.Skill == skillName)
+ EnableSkill(player);
+ }
+ });
+
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ SkillPlayerInfo.Clear();
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ var player = @event.Userid;
+
+ 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.RegisterListener((ResourceManifest manifest) =>
+ {
+ manifest.AddResource(propModel);
+ });
+
+ 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;
+ CreateBox(player);
+ }
+ else
+ skillInfo.LastClick = DateTime.Now;
+ }
+ }
+
+ private static void CreateBox(CCSPlayerController player)
+ {
+ var playerPawn = player.PlayerPawn.Value;
+ var box = Utilities.CreateEntityByName("prop_dynamic_override");
+ if (box == null) return;
+
+ float distance = 50;
+ Vector pos = playerPawn.AbsOrigin + SkillUtils.GetForwardVector(playerPawn.AbsRotation) * distance;
+ QAngle angle = new QAngle(playerPawn.AbsRotation.X, playerPawn.AbsRotation.Y + 90, playerPawn.AbsRotation.Z);
+
+ box.Entity.Name = box.Globalname = $"FortniteWall_{Server.TickCount}";
+ box.Collision.SolidType = SolidType_t.SOLID_VPHYSICS;
+ box.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(box.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2));
+ box.DispatchSpawn();
+ Server.NextFrame(() =>
+ {
+ box.SetModel(propModel);
+ box.Teleport(pos, angle, null);
+ });
+ }
+
+ 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;
+
+ if (string.IsNullOrEmpty(param.Entity.Name)) return HookResult.Continue;
+ if (!param.Entity.Name.StartsWith("FortniteWall")) return HookResult.Continue;
+
+ var box = param.As();
+ if (box == null || !box.IsValid) return HookResult.Continue;
+ box.EmitSound("Wood_Plank.BulletImpact", volume: 1f);
+ box.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; }
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float Cooldown { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#1b04cc", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = false, float cooldown = 2f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ Cooldown = cooldown;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs b/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs
new file mode 100644
index 0000000..cd8a1db
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/FragileBomb.cs
@@ -0,0 +1,131 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Entities.Constants;
+using CounterStrikeSharp.API.Modules.Memory;
+using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
+using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.player;
+using jRandomSkills.src.utils;
+using static jRandomSkills.jRandomSkills;
+
+namespace jRandomSkills
+{
+ public class FragileBomb : ISkill
+ {
+ private const Skills skillName = Skills.FragileBomb;
+ private static int bombHealth = Config.GetValue(skillName, "maxBombHealth");
+ private static int maxBombHealth = Config.GetValue(skillName, "maxBombHealth");
+
+ private static CPlantedC4 plantedC4;
+ private static CTriggerMultiple triggerC4;
+
+ public static void LoadSkill()
+ {
+ if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
+ return;
+
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ bombHealth = maxBombHealth;
+ plantedC4 = null;
+ triggerC4 = null;
+ return HookResult.Continue;
+ });
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault();
+ if (plantedBomb == null) return HookResult.Continue;
+ plantedC4 = plantedBomb;
+ CreateTrigger();
+ return HookResult.Continue;
+ });
+
+ VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
+ }
+
+ private static void CreateTrigger()
+ {
+ var trigger = Utilities.CreateEntityByName("trigger_multiple");
+ if (trigger == null || plantedC4 == null) return;
+
+ trigger.Collision.SolidType = SolidType_t.SOLID_CAPSULE;
+ trigger.Collision.SolidFlags = 0;
+ trigger.Spawnflags = 1;
+ trigger.Globalname = $"planted_bomb_prop_{trigger.Index}";
+ trigger.Collision.SolidFlags = 1;
+
+ trigger.AbsOrigin.X = plantedC4.AbsOrigin.X;
+ trigger.AbsOrigin.Y = plantedC4.AbsOrigin.Y;
+ trigger.AbsOrigin.Z = plantedC4.AbsOrigin.Z;
+
+ trigger.Collision.CapsuleRadius = 10;
+ trigger.Collision.BoundingRadius = 10;
+
+ 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();
+ triggerC4 = trigger;
+ }
+
+ private static void RemoveBomb()
+ {
+ if (plantedC4 != null && plantedC4.IsValid)
+ plantedC4.Remove();
+ if (triggerC4 != null && triggerC4.IsValid)
+ triggerC4.Remove();
+ SkillUtils.TerminateRound(CsTeam.CounterTerrorist);
+ }
+
+ 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 (attackerPawn.DesignerName != "player" || param.DesignerName != "trigger_multiple")
+ return HookResult.Continue;
+
+ CTriggerMultiple trigger = new CTriggerMultiple(param.Handle);
+
+ if (attackerPawn == null || attackerPawn.Controller?.Value == null || trigger == null || !trigger.Globalname.StartsWith("planted_bomb_prop_"))
+ return HookResult.Continue;
+
+ CCSPlayerController attacker = attackerPawn.Controller.Value.As();
+
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
+ if (playerInfo == null || playerInfo.Skill != skillName) return HookResult.Continue;
+
+ bombHealth -= (int)param2.TotalledDamage;
+ if (bombHealth <= 0)
+ {
+ RemoveBomb();
+ return HookResult.Continue;
+ }
+
+ Server.PrintToChatAll($" {ChatColors.Gold}{Localization.GetTranslation("fragilebomb_bomb_health")}: {ChatColors.Red}{bombHealth}{ChatColors.Gold}/{ChatColors.Green}{maxBombHealth}");
+ return HookResult.Continue;
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public int MaxBombHealth { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#5d00ff", CsTeam onlyTeam = CsTeam.CounterTerrorist, bool needsTeammates = false, int maxBombHealth = 1000) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ MaxBombHealth = maxBombHealth;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs b/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs
new file mode 100644
index 0000000..0080b6f
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs
@@ -0,0 +1,54 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.player;
+using static jRandomSkills.jRandomSkills;
+
+namespace jRandomSkills
+{
+ public class FriendlyFire : ISkill
+ {
+ private const Skills skillName = Skills.FriendlyFire;
+ private static float healthMultiplier = Config.GetValue(skillName, "healthMultiplier");
+ private static string[] nades = { "inferno", "flashbang", "smokegrenade", "decoy", "hegrenade" };
+
+ public static void LoadSkill()
+ {
+ if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
+ return;
+
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
+
+ Instance.RegisterEventHandler((@event, info) =>
+ {
+ var damage = @event.DmgHealth;
+ var victim = @event.Userid;
+ var attacker = @event.Attacker;
+ var weapon = @event.Weapon;
+ HitGroup_t hitgroup = (HitGroup_t)@event.Hitgroup;
+
+ if (nades.Contains(weapon)) return HookResult.Continue;
+ if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return HookResult.Continue;
+
+ var playerInfo = Instance.skillPlayer.FirstOrDefault(p => p.SteamID == attacker.SteamID);
+ if (playerInfo?.Skill != skillName || attacker.Team != victim.Team) return HookResult.Continue;
+
+ Server.ExecuteCommand("mp_autokick 0");
+
+ var pawn = victim.PlayerPawn.Value;
+ SkillUtils.AddHealth(pawn, damage + (int)(damage * healthMultiplier), pawn.MaxHealth);
+
+ return HookResult.Continue;
+ });
+ }
+
+ public class SkillConfig : Config.DefaultSkillInfo
+ {
+ public float HealthMultiplier { get; set; }
+ public SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool needsTeammates = true, float healthMultiplier = 1.5f) : base(skill, active, color, onlyTeam, needsTeammates)
+ {
+ HealthMultiplier = healthMultiplier;
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs
index bdbfe73..75f5294 100644
--- a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs
@@ -1,8 +1,6 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
-using CounterStrikeSharp.API.Modules.Memory;
-using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils;
using jRandomSkills.src.player;
using static CounterStrikeSharp.API.Core.Listeners;
@@ -12,22 +10,21 @@ namespace jRandomSkills
{
public class FrozenDecoy : ISkill
{
- private static Skills skillName = Skills.FrozenDecoy;
- private static Dictionary gravities = new Dictionary();
- private static List players = new List();
- private static Dictionary triggers = new Dictionary();
+ private const Skills skillName = Skills.FrozenDecoy;
+ private static float decoyRadius = Config.GetValue(skillName, "triggerRadius");
+ private static int slownessMultiplier = Config.GetValue(skillName, "slownessMultiplier");
+ private static List decoys = new List();
public static void LoadSkill()
{
if (Config.config.SkillsInfo.FirstOrDefault(s => s.Name == skillName.ToString())?.Active != true)
return;
- SkillUtils.RegisterSkill(skillName, "#00eaff");
+ SkillUtils.RegisterSkill(skillName, Config.GetValue(skillName, "color"));
Instance.RegisterEventHandler((@event, info) =>
{
- gravities.Clear();
- players.Clear();
+ decoys.Clear();
return HookResult.Continue;
});
@@ -47,71 +44,37 @@ namespace jRandomSkills
return HookResult.Continue;
});
- Instance.RegisterEventHandler((@event, @info) =>
+ Instance.RegisterEventHandler