diff --git a/jRandomSkills - SRC Files/jRandomSkills.csproj b/jRandomSkills - SRC Files/jRandomSkills.csproj
index 0c589f9..ead9b06 100644
--- a/jRandomSkills - SRC Files/jRandomSkills.csproj
+++ b/jRandomSkills - SRC Files/jRandomSkills.csproj
@@ -14,6 +14,10 @@
+
+
+
+
diff --git a/jRandomSkills - SRC Files/src/command/Command.cs b/jRandomSkills - SRC Files/src/command/Command.cs
index 3770dc7..8b6dbb8 100644
--- a/jRandomSkills - SRC Files/src/command/Command.cs
+++ b/jRandomSkills - SRC Files/src/command/Command.cs
@@ -1,5 +1,6 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Core.Attributes.Registration;
using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Commands;
using CounterStrikeSharp.API.Modules.Entities.Constants;
@@ -49,6 +50,7 @@ namespace src.command
{ SplitCommands(config.NormalCommands.ChangeLanguageCommand.Alias), ("Change language", Command_ChangeLanguage) },
{ SplitCommands(config.NormalCommands.ReloadCommand.Alias), ("Reaload configs", Command_Reload) },
{ SplitCommands(config.NormalCommands.NextCommand.Alias), ("Next skill", Command_Next) },
+ { SplitCommands(config.NormalCommands.CheckEntityCommand.Alias), ("Check entity", Command_CheckEntity) },
{ SplitCommands(config.VotingCommands.ChangeMapCommand.Alias), ("Change map", Command_ChangeMap) },
{ SplitCommands(config.VotingCommands.StartGameCommand.Alias), ("Start game", Command_StartGame) },
@@ -184,6 +186,35 @@ namespace src.command
Menu.DisplaySkillsList(player);
}
+ [CommandHelper(minArgs: 1, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
+ private static void Command_CheckEntity(CCSPlayerController? player, CommandInfo command)
+ {
+ Debug.WriteToDebug($"Player {player?.PlayerName} used the css_entity {command.ArgString} command.");
+
+ if (player != null && player.IsValid)
+ if (!string.IsNullOrEmpty(config.NormalCommands.CheckEntityCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.CheckEntityCommand.Permissions))
+ return;
+
+ int.TryParse(command.GetArg(1), out int index);
+ if (index == -1)
+ {
+ if (player == null)
+ {
+ Server.PrintToConsole("Invalid entity index!");
+ return;
+ }
+ player.PrintToChat("Invalid entity index!");
+ return;
+ }
+
+ var entity = Utilities.GetAllEntities().FirstOrDefault(e => e != null && e.IsValid && (e.Index == index || e.Handle == (nint)index));
+
+ if (player == null)
+ Server.PrintToConsole(entity != null ? $"Entity {entity?.DesignerName} exists!" : "Entity does not exist!");
+ else
+ player.PrintToChat(entity != null ? $"Entity {entity?.DesignerName} exists!" : "Entity does not exist!");
+ }
+
[CommandHelper(minArgs: 1, whoCanExecute: CommandUsage.CLIENT_AND_SERVER)]
private static void Command_ChangeMap(CCSPlayerController? player, CommandInfo command)
{
diff --git a/jRandomSkills - SRC Files/src/gamedata/jRandomSkills.gamedata.json b/jRandomSkills - SRC Files/src/gamedata/jRandomSkills.gamedata.json
index 3e0bc0e..bd817d6 100644
--- a/jRandomSkills - SRC Files/src/gamedata/jRandomSkills.gamedata.json
+++ b/jRandomSkills - SRC Files/src/gamedata/jRandomSkills.gamedata.json
@@ -13,6 +13,13 @@
"linux": "55 4C 89 C1 48 89 E5 41 57 49 89 FF 41 56 49 89 D6 48 89 F2 48 89 FE 41 55 48 8D 3D ? ? ? ? 4D 89 C5 41 54 45 89 CC 53"
}
},
+ "CMolotovProjectile_CreateFunc": {
+ "signatures": {
+ "library": "server",
+ "windows": "48 8B C4 48 89 58 10 4C 89 40 18 48 89 48 08",
+ "linux": "55 48 8D 05 ? ? ? ? 48 89 E5 41 57 41 56 41 55 41 54 49 89 FC 53 48 81 EC ? ? ? ? 4C 8D 35"
+ }
+ },
"Shoot_Secondary": {
"signatures": {
"library": "server",
diff --git a/jRandomSkills - SRC Files/src/lang/de.json b/jRandomSkills - SRC Files/src/lang/de.json
index bebaa5d..13fa2df 100644
--- a/jRandomSkills - SRC Files/src/lang/de.json
+++ b/jRandomSkills - SRC Files/src/lang/de.json
@@ -51,9 +51,15 @@
"behind_desc": "Du hast eine zufällige Chance, einen Feind um 180 Grad zu drehen, wenn du ihn triffst",
"behind_desc2": "Deine Chance, einen Feind bei einem Treffer zu drehen, beträgt: {0} %",
+ "berserker": "Berserker",
+ "berserker_desc": "Du verursachst mehr Schaden und bewegst dich schneller, je weniger Gesundheit du hast",
+
"blademaster": "Schwertmeister",
"blademaster_desc": "Wenn du ein Messer hältst, hast du eine hohe Chance, einen Schuss abzuwehren",
+ "blastshot": "Explosivschuss",
+ "blastshot_desc": "Drücke Attack2 mit der MP5, um eine HE-Granate abzufeuern",
+
"bunnyhop": "Hase",
"bunnyhop_desc": "Du erhältst automatisch bunnyhop",
@@ -104,6 +110,13 @@
"deaf_player_info": "Der Ton für den Spieler ‚{0}‘ wurde deaktiviert.",
"deaf_select_info": "Alle Töne für den Spieler stummschalten:",
+ "deathbomb": "Todesbombe",
+ "deathbomb_desc": "Du explodierst beim Tod und tötest Spieler in deiner Nähe",
+ "deathbomb_explosion": "Kaboom!",
+
+ "demoneye": "Dämonenauge",
+ "demoneye_desc": "Du verursachst allen Gegnern Schaden, die du ansiehst",
+
"disarmament": "Entwaffnung",
"disarmament_desc": "Du hast eine zufällige Chance, einen Gegner bei einem Treffer seine Waffe fallen zu lassen.",
"disarmament_desc2": "Ihre Chance, einen Gegner zu entwaffnen, beträgt: {0} %",
@@ -129,15 +142,15 @@
"enemyspawn": "Feindes-Spawn",
"enemyspawn_desc": "Klicke auf [css_useSkill], um zum Feindes-Spawn zu teleportieren",
- "expensiveammo": "expensiveammo",
- "expensiveammo_desc": "expensiveammo_desc",
- "expensiveammo_disable_info": "expensiveammo_disable_info",
- "expensiveammo_enemy_info": "expensiveammo_enemy_info: {0}",
- "expensiveammo_player_info": "expensiveammo_player_info: {0}",
- "expensiveammo_select_info": "expensiveammo_select_info",
+ "expensiveammo": "Teure Munition",
+ "expensiveammo_desc": "Ein ausgewählter Gegner muss für jeden Schuss bezahlen",
+ "expensiveammo_disable_info": "Deine Kugeln sind wieder kostenlos.",
+ "expensiveammo_enemy_info": "Jeder Schuss kostet dich jetzt {0}$.",
+ "expensiveammo_player_info": "Spieler '{0}' muss jetzt für jede Kugel bezahlen.",
+ "expensiveammo_select_info": "Wähle einen Spieler, dessen Munition teuer wird:",
- "explodingbarrel": "explodingbarrel",
- "explodingbarrel_desc": "explodingbarrel_desc",
+ "explodingbarrel": "Explosives Fass",
+ "explodingbarrel_desc": "Klicke auf [css_useSkill], um ein Fass zu platzieren, das beim Beschuss explodiert",
"explosiveshot": "Explosiver Schuss",
"explosiveshot_desc": "Zufällige Chance, beim Schießen eine explosive Kugel abzufeuern",
@@ -149,10 +162,16 @@
"fastreload": "Schnellnachladen",
"fastreload_desc": "Klicke auf [css_useSkill], um die Waffe, die du gerade hältst, nachzuladen",
+ "firerain": "Feuerregen",
+ "firerain_desc": "Wirf einen Köder, um einen Regen aus Molotows auszulösen",
+
"flash": "Blitz",
"flash_desc": "Zufällige Spielergeschwindigkeit zu Beginn der Runde",
"flash_desc2": "Dein Geschwindigkeitsmultiplikator beträgt: {0}x",
+ "flashlight": "Taschenlampe",
+ "flashlight_desc": "Klicke auf [css_useSkill], um die Taschenlampe ein- oder auszuschalten. Ihr Licht kann Gegner blenden",
+
"fortnite": "Fortnite",
"fortnite_desc": "Klicke auf [css_useSkill], um eine zerstörbare Barrikade zu erstellen",
@@ -175,14 +194,14 @@
"ghost": "Geist",
"ghost_desc": "Du bist vollständig unsichtbar",
- "giant": "giant",
- "giant_desc": "giant_desc",
- "giant_desc2": "giant_desc2: {0}x",
- "giant_disable_info": "giant_disable_info",
- "giant_enemy_info": "giant_enemy_info: {0}x",
- "giant_player_info": "giant_player_info: {0} {1}",
- "giant_select_info": "giant_select_info",
-
+ "giant": "Riese",
+ "giant_desc": "Vergrößere einen Gegner deiner Wahl",
+ "giant_desc2": "Vergrößere einen Gegner deiner Wahl auf das {0}-Fache seiner normalen Größe",
+ "giant_disable_info": "Du hast wieder deine normale Größe.",
+ "giant_enemy_info": "Du wurdest auf das {0}-Fache deiner normalen Größe vergrößert.",
+ "giant_player_info": "Du hast Spieler '{0}' auf das {1}-Fache seiner normalen Größe vergrößert.",
+ "giant_select_info": "Wähle einen Spieler zum Vergrößern:",
+
"glaz": "Glaz",
"glaz_desc": "Du kannst durch Rauchgranaten hindurchsehen",
@@ -207,6 +226,9 @@
"healingsmoke": "Heilender Rauch",
"healingsmoke_desc": "Deine Rauchgranaten heilen",
+ "healingchicken": "Heilendes Huhn",
+ "healingchicken_desc": "Deine Hühner heilen dich, solange du in ihrer Nähe bist",
+
"hermit": "Einsiedler",
"hermit_desc": "Durch das Töten von Gegnern werden Munition und ein Teil der Gesundheit wiederhergestellt",
@@ -252,6 +274,12 @@
"jester_on": "EIN",
"jester_off": "AUS",
+ "jetkick": "Jetkick",
+ "jetkick_desc": "Wähle einen Spieler für einen Jetkick",
+ "jetkick_player_info": "Spieler '{0}' wurde wegge-kickt.",
+ "jetkick_enemy_info": "Jeder Schuss stößt dich nach hinten",
+ "jetkick_disable_info": "Dein Rückstoß ist wieder normal.",
+
"jumpban": "Beinlos",
"jumpban_desc": "Wähle einen Spieler, der nicht springen kann",
"jumpban_enemy_info": "Jemand hat dir die Beine abgeschnitten.",
@@ -259,12 +287,12 @@
"jumpban_player_info": "Der Spieler ‚{0}‘ kann nicht mehr springen.",
"jumpban_select_info": "Spieler vom Springen ausschließen:",
- "jumpcurse": "jumpcurse",
- "jumpcurse_desc": "jumpcurse_desc",
- "jumpcurse_disable_info": "jumpcurse_disable_info",
- "jumpcurse_enemy_info": "jumpcurse_enemy_info",
- "jumpcurse_player_info": "jumpcurse_player_info: {0}",
- "jumpcurse_select_info": "jumpcurse_select_info",
+ "jumpcurse": "Sprungfluch",
+ "jumpcurse_desc": "Ein ausgewählter Gegner springt jedes Mal, wenn einer seiner Teamkollegen springt",
+ "jumpcurse_disable_info": "Du kannst deine Sprünge wieder selbst kontrollieren.",
+ "jumpcurse_enemy_info": "Du springst jetzt jedes Mal, wenn einer deiner Teamkollegen springt.",
+ "jumpcurse_player_info": "Spieler '{0}' springt jetzt jedes Mal, wenn seine Teamkollegen springen.",
+ "jumpcurse_select_info": "Wähle einen Spieler für den Fluch:",
"jumpingjack": "Jumping Jack",
"jumpingjack_desc": "Durch Springen wird die Gesundheit wiederhergestellt",
@@ -272,8 +300,11 @@
"killerflash": "Killer Flash",
"killerflash_desc": "Jeder, der durch deine Blendgranate vollständig geblendet wird, stirbt (einschließlich dir selbst)",
- "knockback": "knockback",
- "knockback_desc": "knockback_desc",
+ "knockback": "Rückstoß",
+ "knockback_desc": "Schießen in der Luft stößt dich nach hinten",
+
+ "lastgasp": "Letzter Atemzug",
+ "lastgasp_desc": "Nach deinem Tod fügst du dem Gegner, der dich getötet hat, Schaden zu",
"lifeswap": "Lebensaustausch",
"lifeswap_desc": "Wähle einen Spieler aus, mit dem du deine Gesundheit austauschen möchtest",
@@ -312,16 +343,12 @@
"bankrupt_player_info": "Der Spieler ‚{0}‘ ist bankrott.",
"bankrupt_select_info": "Wähle einen Spieler aus, der bankrott gehen soll:",
- "deathbomb": "Todesbombe",
- "deathbomb_desc": "Du explodierst beim Tod und tötest Spieler in deiner Nähe",
- "deathbomb_explosion": "Kaboom!",
-
- "nightmare": "nightmare",
- "nightmare_desc": "nightmare_desc",
- "nightmare_disable_info": "nightmare_disable_info",
- "nightmare_enemy_info": "nightmare_enemy_info",
- "nightmare_player_info": "nightmare_player_info: {0}",
- "nightmare_select_info": "nightmare_select_info",
+ "nightmare": "Albtraum",
+ "nightmare_desc": "Lass einen ausgewählten Gegner eine schreckliche Vision erleben",
+ "nightmare_disable_info": "Der Albtraum ist vorbei.",
+ "nightmare_enemy_info": "Ein Albtraum trübt deine Sicht.",
+ "nightmare_player_info": "Du hast Spieler '{0}' einen Albtraum verpasst.",
+ "nightmare_select_info": "Wähle einen Spieler für den Albtraum:",
"ninja": "Ninja",
"ninja_desc": "Wenn du stillstehst, erhöht sich deine Unsichtbarkeit um 33 %, wenn du dich duckst um 33 % und wenn du ein Messer hältst um 33 %",
@@ -462,6 +489,17 @@
"swapposition": "Positionstausch",
"swapposition_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Plätze zu tauschen",
+ "takeammo": "Munition nehmen",
+ "takeammo_desc": "Klicke auf [css_useSkill], um das Magazin der aktiven Waffe eines zufälligen Gegners zu nehmen",
+ "takeammo_hud_info1": "Kein Spieler mit einem aktiven Magazin gefunden.",
+ "takeammo_hud_info2": "Der Gegner hat keine Magazine.",
+ "takeammo_enemy_info": "Du hast etwas Munition verloren.",
+
+ "teamteleport": "Team-Teleport",
+ "teamteleport_desc": "Drücke [css_useSkill], um dich zu dem anvisierten Teammitglied zu teleportieren",
+ "teamteleport_noenemy": "Kein Teammitglied gefunden",
+ "teamteleport_hud_info": "Gefunden: {0}",
+
"teleporter": "Teleporter",
"teleporter_desc": "Du hast die Chance, die Plätze mit einem getroffenen Gegner zu tauschen",
"teleporter_desc2": "Deine Chance auf Platztausch nach einem Treffer: {0}%",
@@ -485,11 +523,11 @@
"toxicsmoke": "Giftiger Rauch",
"toxicsmoke_desc": "Deine Rauchgranaten verursachen Schaden",
- "tripwire": "tripwire",
- "tripwire_desc": "tripwire_desc",
- "tripwire_no_wall_info": "tripwire_no_wall_info",
- "tripwire_placed_info": "tripwire_placed_info",
- "tripwire_triggered_info": "tripwire_triggered_info: {0}",
+ "tripwire": "Stolperdraht",
+ "tripwire_desc": "Klicke auf [css_useSkill], um einen Draht zwischen zwei Wänden zu spannen. Gegner, die ihn berühren, werden auf deinem Radar angezeigt",
+ "tripwire_no_wall_info": "Auf beiden Seiten sind keine Wände nah genug.",
+ "tripwire_placed_info": "Stolperdraht platziert.",
+ "tripwire_triggered_info": "'{0}' hat deinen Stolperdraht ausgelöst.",
"wallhack": "Wallhack",
"wallhack_desc": "Du kannst Feinde durch Wände hindurch sehen",
@@ -569,6 +607,6 @@
"summary": "Zusammenfassung der letzten runde",
"menu_controlls_scroll": "W/S – Scrollen",
- "menu_controlls_padding": " | ",
+ "menu_controlls_padding": " | ",
"menu_controlls_select": "E – Auswählen"
}
diff --git a/jRandomSkills - SRC Files/src/lang/en.json b/jRandomSkills - SRC Files/src/lang/en.json
index 172540e..c489c0f 100644
--- a/jRandomSkills - SRC Files/src/lang/en.json
+++ b/jRandomSkills - SRC Files/src/lang/en.json
@@ -51,9 +51,15 @@
"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}%",
+ "berserker": "Berserker",
+ "berserker_desc": "You deal more damage and move faster as your health gets lower",
+
"blademaster": "Blademaster",
"blademaster_desc": "While holding a knife, you have a high chance to deflect a shot",
+ "blastshot": "Blast Shot",
+ "blastshot_desc": "Press Attack2 with the MP5 to fire an HE grenade",
+
"bunnyhop": "Bunny",
"bunnyhop_desc": "You get auto \"BunnyHop\"",
@@ -130,11 +136,11 @@
"enemyspawn_desc": "Click [css_useSkill] to teleport to the enemy spawn",
"expensiveammo": "Expensive Ammo",
- "expensiveammo_desc": "A chosen enemy loses money with every shot",
+ "expensiveammo_desc": "A chosen enemy has to pay for every shot",
"expensiveammo_disable_info": "Your bullets are free again.",
"expensiveammo_enemy_info": "Every shot you fire now costs you {0}$.",
- "expensiveammo_player_info": "Player '{0}' now pays for every bullet.",
- "expensiveammo_select_info": "Select player whose ammo becomes expensive:",
+ "expensiveammo_player_info": "Player '{0}' now has to pay for every bullet.",
+ "expensiveammo_select_info": "Select a player whose ammo will become expensive:",
"explodingbarrel": "Exploding Barrel",
"explodingbarrel_desc": "Click [css_useSkill] to place a barrel that explodes when shot",
@@ -149,10 +155,16 @@
"fastreload": "Fastreload",
"fastreload_desc": "Click [css_useSkill] to reload the weapon you are currently holding",
+ "firerain": "Fire Rain",
+ "firerain_desc": "Throw a decoy to call down a rain of Molotovs",
+
"flash": "Flash",
"flash_desc": "Random player speed at the beginning of the round",
"flash_desc2": "Your speed multiplier is: {0}x",
+ "flashlight": "Flashlight",
+ "flashlight_desc": "Click [css_useSkill] to turn the flashlight on or off. Its light can blind enemies",
+
"fortnite": "Fortnite",
"fortnite_desc": "Click [css_useSkill] to create a destructible barricade",
@@ -177,12 +189,12 @@
"giant": "Giant",
"giant_desc": "Enlarge an enemy of your choice",
- "giant_desc2": "Enlarge an enemy of your choice to {0}x",
+ "giant_desc2": "Enlarge an enemy of your choice to {0}x their normal size",
"giant_disable_info": "You are back to your normal size.",
- "giant_enemy_info": "You have been enlarged to {0}x.",
- "giant_player_info": "You enlarged player '{0}' to {1}x.",
- "giant_select_info": "Enlarge player:",
-
+ "giant_enemy_info": "You have been enlarged to {0}x your normal size.",
+ "giant_player_info": "You enlarged player '{0}' to {1}x their normal size.",
+ "giant_select_info": "Select a player to enlarge:",
+
"glaz": "Glaz",
"glaz_desc": "You can see through smoke grenades",
@@ -204,6 +216,9 @@
"grenadier": "Grenadier",
"grenadier_desc": "You have infinite hegrenade",
+ "healingchicken": "Healing Chicken",
+ "healingchicken_desc": "Your chickens heal you while you are nearby",
+
"healingsmoke": "Healing Smoke",
"healingsmoke_desc": "Your smoke grenades heal",
@@ -252,6 +267,12 @@
"jester_on": "ON",
"jester_off": "OFF",
+ "jetkick": "Jetkick",
+ "jetkick_desc": "Select a player to jetkick",
+ "jetkick_player_info": "Player '{0}' has been jetkicked.",
+ "jetkick_enemy_info": "Every shot knocks you backwards",
+ "jetkick_disable_info": "Your recoil is back to normal.",
+
"jumpban": "Legless",
"jumpban_desc": "Choose a player who cannot jump",
"jumpban_enemy_info": "Someone cut off your legs.",
@@ -260,11 +281,11 @@
"jumpban_select_info": "Ban player from jumping:",
"jumpcurse": "Jump Curse",
- "jumpcurse_desc": "A chosen enemy jumps whenever their teammates jump",
- "jumpcurse_disable_info": "Your legs are your own again.",
- "jumpcurse_enemy_info": "You now jump whenever your teammates jump.",
- "jumpcurse_player_info": "Player '{0}' now jumps with their team.",
- "jumpcurse_select_info": "Select player for the jump curse:",
+ "jumpcurse_desc": "A chosen enemy jumps whenever one of their teammates jumps",
+ "jumpcurse_disable_info": "You can control your jumps again.",
+ "jumpcurse_enemy_info": "You now jump whenever one of your teammates jumps.",
+ "jumpcurse_player_info": "Player '{0}' now jumps whenever their teammates do.",
+ "jumpcurse_select_info": "Select a player to curse:",
"jumpingjack": "Jumping Jack",
"jumpingjack_desc": "Jumping restores health",
@@ -275,6 +296,9 @@
"knockback": "Knockback",
"knockback_desc": "Firing while airborne pushes you backwards",
+ "lastgasp": "Last Gasp",
+ "lastgasp_desc": "After you die, you deal damage to the enemy who killed you",
+
"lifeswap": "Life Swap",
"lifeswap_desc": "Choose a player to swap health with",
"lifeswap_enemy_info": "Someone borrowed your health.",
@@ -316,12 +340,15 @@
"deathbomb_desc": "You explode upon death, killing nearby players",
"deathbomb_explosion": "Kaboom!",
+ "demoneye": "Demon Eye",
+ "demoneye_desc": "You deal damage to every enemy you are looking at",
+
"nightmare": "Nightmare",
- "nightmare_desc": "Give a chosen enemy a nightmarish vision",
+ "nightmare_desc": "Force a chosen enemy to experience a terrifying vision",
"nightmare_disable_info": "The nightmare has faded.",
- "nightmare_enemy_info": "A nightmare clouds your vision.",
+ "nightmare_enemy_info": "A nightmare is clouding your vision.",
"nightmare_player_info": "You cast a nightmare on player '{0}'.",
- "nightmare_select_info": "Select player for the nightmare:",
+ "nightmare_select_info": "Select a player to inflict with a nightmare:",
"ninja": "Ninja",
"ninja_desc": "Standing still increases your invisibility by 33%, crouching by 33%, and holding a knife by 33%",
@@ -462,6 +489,17 @@
"swapposition": "Position Swap",
"swapposition_desc": "Click [css_useSkill] to swap places with a random enemy",
+ "takeammo": "Take Ammo",
+ "takeammo_desc": "Click [css_useSkill] to take the active weapon's magazine from a random enemy",
+ "takeammo_hud_info1": "No player with an active magazine was found.",
+ "takeammo_hud_info2": "The enemy has no magazines.",
+ "takeammo_enemy_info": "You lost some ammo.",
+
+ "teamteleport": "Team Teleport",
+ "teamteleport_desc": "Press [css_useSkill] to teleport to the teammate you're looking at",
+ "teamteleport_noenemy": "No teammate found",
+ "teamteleport_hud_info": "Found: {0}",
+
"teleporter": "Teleporter",
"teleporter_desc": "You have the chance to swap places with a hit enemy",
"teleporter_desc2": "Your chances of swapping places after a hit: {0}%",
@@ -486,10 +524,10 @@
"toxicsmoke_desc": "Your smoke grenades deal damage",
"tripwire": "Tripwire",
- "tripwire_desc": "Click [css_useSkill] to string a wire between two walls. Enemies touching it show on your radar",
- "tripwire_no_wall_info": "No walls close enough on both sides.",
+ "tripwire_desc": "Click [css_useSkill] to string a wire between two walls. Enemies who touch it appear on your radar",
+ "tripwire_no_wall_info": "There are no walls close enough on both sides.",
"tripwire_placed_info": "Tripwire placed.",
- "tripwire_triggered_info": "'{0}' tripped your wire.",
+ "tripwire_triggered_info": "'{0}' triggered your tripwire.",
"wallhack": "Wallhack",
"wallhack_desc": "You can see enemies through walls",
diff --git a/jRandomSkills - SRC Files/src/lang/fr.json b/jRandomSkills - SRC Files/src/lang/fr.json
index 19a008a..73b6756 100644
--- a/jRandomSkills - SRC Files/src/lang/fr.json
+++ b/jRandomSkills - SRC Files/src/lang/fr.json
@@ -19,7 +19,7 @@
"areareaper": "Faucheur de Zone",
"areareaper_desc": "Vous pouvez choisir un site de bombe à désactiver",
- "areareaper_incorrect_site": "Aucun site de bombe trouvé.",
+ "areareaper_incorrect_site": "Aucun site de bombe trouvé",
"areareaper_no_site": "Aucun site de bombe disponible.",
"areareaper_select_info": "Sélectionnez un site à désactiver :",
"areareaper_site_disabled": "Le site de bombe {0} a été désactivé – aucune bombe ne peut y être posée !",
@@ -51,9 +51,15 @@
"behind_desc": "Vous avez une chance aléatoire de retourner un ennemi à 180° en le touchant",
"behind_desc2": "Votre chance de retourner un ennemi à l’impact est : {0}%",
+ "berserker": "Berserker",
+ "berserker_desc": "Vous infligez plus de dégâts et vous déplacez plus vite à mesure que votre santé diminue",
+
"blademaster": "Maître de Lame",
"blademaster_desc": "En tenant un couteau, vous avez une forte chance de dévier un tir",
+ "blastshot": "Tir explosif",
+ "blastshot_desc": "Appuyez sur Attack2 avec le MP5 pour tirer une grenade HE",
+
"bunnyhop": "Lapin",
"bunnyhop_desc": "Vous obtenez l’auto « BunnyHop »",
@@ -104,6 +110,13 @@
"deaf_player_info": "Le son a été désactivé pour le joueur « {0} ».",
"deaf_select_info": "Couper tous les sons du joueur :",
+ "deathbomb": "Bombe",
+ "deathbomb_desc": "Vous explosez à votre mort, tuant les joueurs proches",
+ "deathbomb_explosion": "Kaboom!",
+
+ "demoneye": "Œil démoniaque",
+ "demoneye_desc": "Vous infligez des dégâts à tous les ennemis que vous regardez",
+
"disarmament": "Désarmement",
"disarmament_desc": "Vous avez une chance aléatoire de faire lâcher son arme à un ennemi en le touchant",
"disarmament_desc2": "Votre chance de désarmer un ennemi est : {0}%",
@@ -129,15 +142,15 @@
"enemyspawn": "Spawn Ennemi",
"enemyspawn_desc": "Appuyez sur [css_useSkill] pour vous téléporter au spawn ennemi",
- "expensiveammo": "expensiveammo",
- "expensiveammo_desc": "expensiveammo_desc",
- "expensiveammo_disable_info": "expensiveammo_disable_info",
- "expensiveammo_enemy_info": "expensiveammo_enemy_info: {0}",
- "expensiveammo_player_info": "expensiveammo_player_info: {0}",
- "expensiveammo_select_info": "expensiveammo_select_info",
+ "expensiveammo": "Munitions coûteuses",
+ "expensiveammo_desc": "Un ennemi choisi doit payer pour chaque tir",
+ "expensiveammo_disable_info": "Vos balles sont à nouveau gratuites.",
+ "expensiveammo_enemy_info": "Chaque tir que vous effectuez vous coûte maintenant {0}$.",
+ "expensiveammo_player_info": "Le joueur '{0}' doit maintenant payer pour chaque balle.",
+ "expensiveammo_select_info": "Sélectionnez un joueur dont les munitions deviendront coûteuses :",
- "explodingbarrel": "explodingbarrel",
- "explodingbarrel_desc": "explodingbarrel_desc",
+ "explodingbarrel": "Baril explosif",
+ "explodingbarrel_desc": "Cliquez sur [css_useSkill] pour placer un baril qui explose lorsqu'il est touché",
"explosiveshot": "Tir Explosif",
"explosiveshot_desc": "Chance aléatoire de tirer une balle explosive en tirant",
@@ -149,10 +162,16 @@
"fastreload": "Recharge Rapide",
"fastreload_desc": "Appuyez sur [css_useSkill] pour recharger l’arme que vous tenez",
+ "firerain": "Pluie de feu",
+ "firerain_desc": "Lancez un leurre pour déclencher une pluie de cocktails Molotov",
+
"flash": "Flash",
"flash_desc": "Vitesse de joueur aléatoire au début du round",
"flash_desc2": "Votre multiplicateur de vitesse est : {0}x",
+ "flashlight": "Lampe torche",
+ "flashlight_desc": "Cliquez sur [css_useSkill] pour allumer ou éteindre la lampe torche. Sa lumière peut aveugler les ennemis",
+
"fortnite": "Fortnite",
"fortnite_desc": "Appuyez sur [css_useSkill] pour créer une barricade destructible",
@@ -175,14 +194,14 @@
"ghost": "Fantôme",
"ghost_desc": "Vous êtes complètement invisible",
- "giant": "giant",
- "giant_desc": "giant_desc",
- "giant_desc2": "giant_desc2: {0}x",
- "giant_disable_info": "giant_disable_info",
- "giant_enemy_info": "giant_enemy_info: {0}x",
- "giant_player_info": "giant_player_info: {0} {1}",
- "giant_select_info": "giant_select_info",
-
+ "giant": "Géant",
+ "giant_desc": "Agrandissez un ennemi de votre choix",
+ "giant_desc2": "Agrandissez un ennemi de votre choix jusqu'à {0}x sa taille normale",
+ "giant_disable_info": "Vous avez retrouvé votre taille normale.",
+ "giant_enemy_info": "Vous avez été agrandi à {0}x votre taille normale.",
+ "giant_player_info": "Vous avez agrandi le joueur '{0}' jusqu'à {1}x sa taille normale.",
+ "giant_select_info": "Sélectionnez un joueur à agrandir :",
+
"glaz": "Glaz",
"glaz_desc": "Vous pouvez voir à travers les fumigènes",
@@ -207,6 +226,9 @@
"healingsmoke": "Fumigène Soin",
"healingsmoke_desc": "Vos fumigènes soignent",
+ "healingchicken": "Poulet guérisseur",
+ "healingchicken_desc": "Vos poulets vous soignent lorsque vous êtes à proximité",
+
"hermit": "Ermite",
"hermit_desc": "Tuer restaure des munitions et une partie de vos PV",
@@ -252,6 +274,12 @@
"jester_on": "ACTIVÉ",
"jester_off": "DÉSACTIVÉ",
+ "jetkick": "Coup de pied propulsé",
+ "jetkick_desc": "Sélectionnez un joueur pour lui donner un coup de pied propulsé",
+ "jetkick_player_info": "Le joueur '{0}' a reçu un coup de pied propulsé.",
+ "jetkick_enemy_info": "Chaque tir vous repousse vers l'arrière",
+ "jetkick_disable_info": "Votre recul est revenu à la normale.",
+
"jumpban": "Sans Jambes",
"jumpban_desc": "Choisissez un joueur qui ne pourra plus sauter",
"jumpban_enemy_info": "Quelqu’un vous a coupé les jambes.",
@@ -259,12 +287,12 @@
"jumpban_player_info": "Le joueur « {0} » ne peut plus sauter.",
"jumpban_select_info": "Interdire de sauter au joueur :",
- "jumpcurse": "jumpcurse",
- "jumpcurse_desc": "jumpcurse_desc",
- "jumpcurse_disable_info": "jumpcurse_disable_info",
- "jumpcurse_enemy_info": "jumpcurse_enemy_info",
- "jumpcurse_player_info": "jumpcurse_player_info: {0}",
- "jumpcurse_select_info": "jumpcurse_select_info",
+ "jumpcurse": "Malédiction du saut",
+ "jumpcurse_desc": "Un ennemi choisi saute chaque fois que l'un de ses coéquipiers saute",
+ "jumpcurse_disable_info": "Vous pouvez à nouveau contrôler vos sauts.",
+ "jumpcurse_enemy_info": "Vous sautez maintenant chaque fois que l'un de vos coéquipiers saute.",
+ "jumpcurse_player_info": "Le joueur '{0}' saute maintenant chaque fois que ses coéquipiers sautent.",
+ "jumpcurse_select_info": "Sélectionnez un joueur à maudire :",
"jumpingjack": "Sauteur",
"jumpingjack_desc": "Sauter vous rend de la vie",
@@ -272,8 +300,12 @@
"killerflash": "Flash Mortel",
"killerflash_desc": "Toute personne totalement aveuglée par votre flashbang meurt (y compris vous)",
- "knockback": "knockback",
- "knockback_desc": "knockback_desc",
+ "knockback": "Repoussement",
+ "knockback_desc": "Tirer dans les airs vous repousse vers l'arrière",
+
+ "lastgasp": "Dernier souffle",
+ "lastgasp_desc": "Après votre mort, vous infligez des dégâts à l'ennemi qui vous a tué",
+
"lifeswap": "Échange de Vie",
"lifeswap_desc": "Choisissez un joueur avec qui échanger votre santé",
"lifeswap_enemy_info": "Quelqu’un a emprunté votre santé.",
@@ -311,16 +343,12 @@
"bankrupt_player_info": "Le joueur « {0} » est en faillite.",
"bankrupt_select_info": "Mettre un joueur en faillite :",
- "deathbomb": "Bombe",
- "deathbomb_desc": "Vous explosez à votre mort, tuant les joueurs proches",
- "deathbomb_explosion": "Kaboom!",
-
- "nightmare": "nightmare",
- "nightmare_desc": "nightmare_desc",
- "nightmare_disable_info": "nightmare_disable_info",
- "nightmare_enemy_info": "nightmare_enemy_info",
- "nightmare_player_info": "nightmare_player_info: {0}",
- "nightmare_select_info": "nightmare_select_info",
+ "nightmare": "Cauchemar",
+ "nightmare_desc": "Faites subir une vision terrifiante à un ennemi choisi",
+ "nightmare_disable_info": "Le cauchemar s'est dissipé.",
+ "nightmare_enemy_info": "Un cauchemar obscurcit votre vision.",
+ "nightmare_player_info": "Vous avez lancé un cauchemar sur le joueur '{0}'.",
+ "nightmare_select_info": "Sélectionnez un joueur pour le cauchemar :",
"ninja": "Ninja",
"ninja_desc": "Rester immobile augmente votre invisibilité de 33%, s’accroupir de 33%, et tenir un couteau de 33%",
@@ -461,6 +489,17 @@
"swapposition": "Échange de Position",
"swapposition_desc": "Appuyez sur [css_useSkill] pour échanger de place avec un ennemi aléatoire",
+ "takeammo": "Prendre des munitions",
+ "takeammo_desc": "Cliquez sur [css_useSkill] pour prendre le chargeur de l'arme active d'un ennemi aléatoire",
+ "takeammo_hud_info1": "Aucun joueur avec un chargeur actif n'a été trouvé.",
+ "takeammo_hud_info2": "L'ennemi n'a pas de chargeur.",
+ "takeammo_enemy_info": "Vous avez perdu des munitions.",
+
+ "teamteleport": "Téléportation d'équipe",
+ "teamteleport_desc": "Appuyez sur [css_useSkill] pour vous téléporter vers le coéquipier que vous regardez",
+ "teamteleport_noenemy": "Aucun coéquipier trouvé",
+ "teamteleport_hud_info": "Trouvé : {0}",
+
"teleporter": "Téléporteur",
"teleporter_desc": "Vous avez une chance d'échanger votre place avec un ennemi touché",
"teleporter_desc2": "Vos chances d'échanger votre place après un coup : {0}%",
@@ -484,12 +523,12 @@
"toxicsmoke": "Fumée Toxique",
"toxicsmoke_desc": "Vos grenades fumigènes infligent des dégâts",
- "tripwire": "tripwire",
- "tripwire_desc": "tripwire_desc",
- "tripwire_no_wall_info": "tripwire_no_wall_info",
- "tripwire_placed_info": "tripwire_placed_info",
- "tripwire_triggered_info": "tripwire_triggered_info: {0}",
-
+ "tripwire": "Fil-piège",
+ "tripwire_desc": "Cliquez sur [css_useSkill] pour tendre un fil entre deux murs. Les ennemis qui le touchent apparaissent sur votre radar",
+ "tripwire_no_wall_info": "Aucun mur n'est suffisamment proche des deux côtés.",
+ "tripwire_placed_info": "Fil-piège placé.",
+ "tripwire_triggered_info": "'{0}' a déclenché votre fil-piège.",
+
"wallhack": "Wallhack",
"wallhack_desc": "Vous pouvez voir les ennemis à travers les murs",
@@ -568,6 +607,6 @@
"summary": "Résumé du dernier round",
"menu_controlls_scroll": "W/S - Défilement",
- "menu_controlls_padding": " | ",
+ "menu_controlls_padding": " | ",
"menu_controlls_select": "E - Sélectionner"
}
diff --git a/jRandomSkills - SRC Files/src/lang/pl.json b/jRandomSkills - SRC Files/src/lang/pl.json
index c8958da..4045536 100644
--- a/jRandomSkills - SRC Files/src/lang/pl.json
+++ b/jRandomSkills - SRC Files/src/lang/pl.json
@@ -51,9 +51,15 @@
"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}%",
+ "berserker": "Berserker",
+ "berserker_desc": "Zadajesz więcej obrażeń i poruszasz się szybciej, gdy masz mniej zdrowia",
+
"blademaster": "Mistrz Ostrza",
"blademaster_desc": "Trzymając nóż, masz duże szanse na odparcie strzału",
+ "blastshot": "Mocne Uderzenie",
+ "blastshot_desc": "Naciśnij Attack2 na MP5, aby wystrzelić granat HE",
+
"bunnyhop": "Królik",
"bunnyhop_desc": "Otrzymujesz auto \"BunnyHopa\"",
@@ -104,6 +110,13 @@
"deaf_player_info": "Dźwięk został wyłączony dla gracza '{0}'.",
"deaf_select_info": "Wycisz dźwięki gracza:",
+ "deathbomb": "Ludzka bomba",
+ "deathbomb_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu",
+ "deathbomb_explosion": "Kaboom!",
+
+ "demoneye": "Oko Demona",
+ "demoneye_desc": "Zadajesz obrażenia wszystkim przeciwnikom, na których patrzysz",
+
"disarmament": "Rozbrojenie",
"disarmament_desc": "Masz losową szanse na wyrzucenie broni wroga po trafieniu",
"disarmament_desc2": "Twoje szanse na wyrzucenie broni wroga to: {0}%",
@@ -129,16 +142,16 @@
"enemyspawn": "Resp Wroga",
"enemyspawn_desc": "Kliknij [css_useSkill], aby teleportować się na resp wroga",
- "expensiveammo": "expensiveammo",
- "expensiveammo_desc": "expensiveammo_desc",
- "expensiveammo_disable_info": "expensiveammo_disable_info",
- "expensiveammo_enemy_info": "expensiveammo_enemy_info: {0}",
- "expensiveammo_player_info": "expensiveammo_player_info: {0}",
- "expensiveammo_select_info": "expensiveammo_select_info",
+ "expensiveammo": "Droga Amunicja",
+ "expensiveammo_desc": "Wybrany przeciwnik musi płacić za każdy oddany strzał",
+ "expensiveammo_disable_info": "Twoje pociski znów są darmowe.",
+ "expensiveammo_enemy_info": "Każdy Twój strzał kosztuje teraz {0}$.",
+ "expensiveammo_player_info": "Gracz '{0}' musi teraz płacić za każdy pocisk.",
+ "expensiveammo_select_info": "Wybierz gracza, którego amunicja stanie się droga:",
+
+ "explodingbarrel": "Wybuchowa Beczka",
+ "explodingbarrel_desc": "Kliknij [css_useSkill], aby postawić beczkę, która wybucha po trafieniu",
- "explodingbarrel": "explodingbarrel",
- "explodingbarrel_desc": "explodingbarrel_desc",
-
"explosiveshot": "Strzał Wybuchowy",
"explosiveshot_desc": "Losowa szansa wystrzelenia pocisku wybuchowego podczas strzelania",
"explosiveshot_desc2": "Twoja szansa na wystrzelenie pocisku wybuchowego: {0}%",
@@ -149,10 +162,16 @@
"fastreload": "Szybkie Rączki",
"fastreload_desc": "Kliknij [css_useSkill], aby przeładować broń, którą obecnie trzymasz",
+ "firerain": "Deszcz Ognia",
+ "firerain_desc": "Rzuć wabik, aby przywołać deszcz koktajli Mołotowa",
+
"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",
+ "flashlight": "Latarka",
+ "flashlight_desc": "Kliknij [css_useSkill], aby włączyć lub wyłączyć latarkę. Jej światło może oślepić przeciwników",
+
"fortnite": "Fortnite",
"fortnite_desc": "Kliknij [css_useSkill], aby stworzyć barykadę, którą można zniszczyć",
@@ -175,14 +194,14 @@
"ghost": "Duszek",
"ghost_desc": "Jesteś całkowicie niewidzialny",
- "giant": "giant",
- "giant_desc": "giant_desc",
- "giant_desc2": "giant_desc2: {0}x",
- "giant_disable_info": "giant_disable_info",
- "giant_enemy_info": "giant_enemy_info: {0}x",
- "giant_player_info": "giant_player_info: {0} {1}",
- "giant_select_info": "giant_select_info",
-
+ "giant": "Olbrzym",
+ "giant_desc": "Powiększ wybranego przeciwnika",
+ "giant_desc2": "Powiększ wybranego przeciwnika do {0}x normalnego rozmiaru",
+ "giant_disable_info": "Wróciłeś do normalnego rozmiaru.",
+ "giant_enemy_info": "Zostałeś powiększony do {0}x normalnego rozmiaru.",
+ "giant_player_info": "Powiększyłeś gracza '{0}' do {1}x normalnego rozmiaru.",
+ "giant_select_info": "Wybierz gracza do powiększenia:",
+
"glaz": "Glaz",
"glaz_desc": "Nie widzisz granatów dymnych",
@@ -207,6 +226,9 @@
"healingsmoke": "Leczący Dym",
"healingsmoke_desc": "Twoje granaty dymne leczą",
+ "healingchicken": "Lecząca Kura",
+ "healingchicken_desc": "Twoje kury leczą Cię, gdy jesteś w pobliżu",
+
"hermit": "Pustelnik",
"hermit_desc": "Zabijanie przywraca amunicję i część zdrowia",
@@ -252,6 +274,12 @@
"jester_on": "WŁ.",
"jester_off": "WYŁ.",
+ "jetkick": "Odrzutowy Kop",
+ "jetkick_desc": "Wybierz gracza, aby użyć na nim odrzutowego kopa",
+ "jetkick_player_info": "Gracz '{0}' został odrzucony kopem.",
+ "jetkick_enemy_info": "Każdy strzał mocno odrzuca Cię do tyłu",
+ "jetkick_disable_info": "Twój odrzut wrócił do normy.",
+
"jumpban": "Beznogi",
"jumpban_desc": "Wybierasz gracza, który nie będzie mógł skakać",
"jumpban_enemy_info": "Ktoś odciął ci nogi.",
@@ -259,12 +287,12 @@
"jumpban_player_info": "Gracz '{0}' nie może teraz skakać.",
"jumpban_select_info": "Zablokuj skok dla gracza:",
- "jumpcurse": "jumpcurse",
- "jumpcurse_desc": "jumpcurse_desc",
- "jumpcurse_disable_info": "jumpcurse_disable_info",
- "jumpcurse_enemy_info": "jumpcurse_enemy_info",
- "jumpcurse_player_info": "jumpcurse_player_info: {0}",
- "jumpcurse_select_info": "jumpcurse_select_info",
+ "jumpcurse": "Klątwa Skakania",
+ "jumpcurse_desc": "Wybrany przeciwnik skacze za każdym razem, gdy skacze jeden z jego sojuszników",
+ "jumpcurse_disable_info": "Znów możesz kontrolować swoje skoki.",
+ "jumpcurse_enemy_info": "Teraz skaczesz za każdym razem, gdy skacze jeden z Twoich sojuszników.",
+ "jumpcurse_player_info": "Gracz '{0}' skacze teraz za każdym razem, gdy robią to jego sojusznicy.",
+ "jumpcurse_select_info": "Wybierz gracza do przeklęcia:",
"jumpingjack": "Pajacyk",
"jumpingjack_desc": "Skakanie przywraca zdrowie",
@@ -272,8 +300,12 @@
"killerflash": "Zabójczy Flash",
"killerflash_desc": "Każdy całkowicie oślepiony twoim granatem umiera (również ty)",
- "knockback": "knockback",
- "knockback_desc": "knockback_desc",
+ "knockback": "Odrzut",
+ "knockback_desc": "Strzelanie w powietrzu odpycha Cię do tyłu",
+
+ "lastgasp": "Ostatnie Tchnienie",
+ "lastgasp_desc": "Po śmierci zadajesz obrażenia przeciwnikowi, który Cię zabił",
+
"lifeswap": "Zamiana Żyć",
"lifeswap_desc": "Wybierasz gracza, z którym chcesz wymienić się zdrowiem",
"lifeswap_enemy_info": "Ktoś pożyczył sobie twoje zdrowie.",
@@ -311,16 +343,12 @@
"moneyswap_player_info": "Wymieniłeś swoje pieniądze z graczem '{0}'.",
"moneyswap_select_info": "Zamień się kasą z graczem:",
- "deathbomb": "Ludzka bomba",
- "deathbomb_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu",
- "deathbomb_explosion": "Kaboom!",
-
- "nightmare": "nightmare",
- "nightmare_desc": "nightmare_desc",
- "nightmare_disable_info": "nightmare_disable_info",
- "nightmare_enemy_info": "nightmare_enemy_info",
- "nightmare_player_info": "nightmare_player_info: {0}",
- "nightmare_select_info": "nightmare_select_info",
+ "nightmare": "Koszmar",
+ "nightmare_desc": "Wywołaj u wybranego przeciwnika przerażającą wizję",
+ "nightmare_disable_info": "Koszmar minął.",
+ "nightmare_enemy_info": "Koszmar przesłania Ci wzrok.",
+ "nightmare_player_info": "Rzuciłeś koszmar na gracza '{0}'.",
+ "nightmare_select_info": "Wybierz gracza do nałożenia koszmaru:",
"ninja": "Ninja",
"ninja_desc": "Stojąc nieruchomo zwiększasz swoją niewidzialność o 33%, kucając o 33%, a trzymając nóż o 33%",
@@ -461,6 +489,17 @@
"swapposition": "Zamiana Miejsc",
"swapposition_desc": "Kliknij [css_useSkill], aby zamienić się miejscami z losowym przeciwnikiem",
+ "takeammo": "Zabierz Amunicję",
+ "takeammo_desc": "Kliknij [css_useSkill], aby zabrać magazynek aktywnej broni losowego przeciwnika",
+ "takeammo_hud_info1": "Nie znaleziono gracza z aktywnym magazynkiem.",
+ "takeammo_hud_info2": "Przeciwnik nie ma magazynków.",
+ "takeammo_enemy_info": "Straciłeś trochę amunicji.",
+
+ "teamteleport": "Teleport do drużyny",
+ "teamteleport_desc": "Naciśnij [css_useSkill], aby teleportować się do członka drużyny, na którego patrzysz",
+ "teamteleport_noenemy": "Nie znaleziono członka drużyny",
+ "teamteleport_hud_info": "Znaleziono: {0}",
+
"teleporter": "Teleporter",
"teleporter_desc": "Masz szansę na zamianę miejsc z trafionym wrogiem",
"teleporter_desc2": "Szansa na zamianę miejsc po trafieniu: {0}%",
@@ -484,11 +523,11 @@
"toxicsmoke": "Toksyczny Dym",
"toxicsmoke_desc": "Twoje granaty dymny zadają obrażenia",
- "tripwire": "tripwire",
- "tripwire_desc": "tripwire_desc",
- "tripwire_no_wall_info": "tripwire_no_wall_info",
- "tripwire_placed_info": "tripwire_placed_info",
- "tripwire_triggered_info": "tripwire_triggered_info: {0}",
+ "tripwire": "Linka z Drutu",
+ "tripwire_desc": "Kliknij [css_useSkill], aby rozciągnąć drut między dwiema ścianami. Wrogowie, którzy go dotkną, pojawią się na Twoim radarze",
+ "tripwire_no_wall_info": "Po obu stronach nie ma wystarczająco blisko położonych ścian.",
+ "tripwire_placed_info": "Linka została rozstawiona.",
+ "tripwire_triggered_info": "'{0}' uruchomił Twoją linkę.",
"wallhack": "Wallhack",
"wallhack_desc": "Widzisz wrogów przez ściany",
@@ -568,6 +607,6 @@
"summary": "Podsumowanie z ostatniej rundy",
"menu_controlls_scroll": "W/S – Przewijanie",
- "menu_controlls_padding": " | ",
+ "menu_controlls_padding": " | ",
"menu_controlls_select": "E - Wybierz"
}
diff --git a/jRandomSkills - SRC Files/src/lang/pt-br.json b/jRandomSkills - SRC Files/src/lang/pt-br.json
index 907e797..bc31f3b 100644
--- a/jRandomSkills - SRC Files/src/lang/pt-br.json
+++ b/jRandomSkills - SRC Files/src/lang/pt-br.json
@@ -51,9 +51,15 @@
"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 acertá-lo é: {0}%",
+ "berserker": "Berserker",
+ "berserker_desc": "Você causa mais dano e se move mais rápido conforme sua vida diminui",
+
"blademaster": "Mestre das Lâminas",
"blademaster_desc": "Enquanto segura a faca, você tem chance de desviar de um tiro",
+ "blastshot": "Tiro Explosivo",
+ "blastshot_desc": "Pressione Attack2 com a MP5 para disparar uma granada HE",
+
"bunnyhop": "Coelho",
"bunnyhop_desc": "Você ganha \"BunnyHop\" automático",
@@ -104,6 +110,13 @@
"deaf_player_info": "O som foi desativado para o jogador '{0}'.",
"deaf_select_info": "Silenciar jogador:",
+ "deathbomb": "Bomba mortal",
+ "deathbomb_desc": "Você explode ao morrer, matando os jogadores próximos",
+ "deathbomb_explosion": "Kaboom!",
+
+ "demoneye": "Olho Demoníaco",
+ "demoneye_desc": "Você causa dano a todos os inimigos que estiver olhando",
+
"disarmament": "Desarmamento",
"disarmament_desc": "Você tem uma chance aleatória de fazer um inimigo dropar a arma ao acertá-lo",
"disarmament_desc2": "Sua chance de desarmar um inimigo é: {0}%",
@@ -129,16 +142,16 @@
"enemyspawn": "Spawn Inimigo",
"enemyspawn_desc": "Clique em [css_useSkill] para se teletransportar para a base inimiga",
- "expensiveammo": "expensiveammo",
- "expensiveammo_desc": "expensiveammo_desc",
- "expensiveammo_disable_info": "expensiveammo_disable_info",
- "expensiveammo_enemy_info": "expensiveammo_enemy_info: {0}",
- "expensiveammo_player_info": "expensiveammo_player_info: {0}",
- "expensiveammo_select_info": "expensiveammo_select_info",
+ "expensiveammo": "Munição Cara",
+ "expensiveammo_desc": "Um inimigo escolhido precisa pagar por cada disparo",
+ "expensiveammo_disable_info": "Suas balas voltaram a ser gratuitas.",
+ "expensiveammo_enemy_info": "Agora cada tiro que você dispara custa {0}$.",
+ "expensiveammo_player_info": "O jogador '{0}' agora precisa pagar por cada bala.",
+ "expensiveammo_select_info": "Selecione um jogador cuja munição ficará cara:",
+
+ "explodingbarrel": "Barril Explosivo",
+ "explodingbarrel_desc": "Clique em [css_useSkill] para colocar um barril que explode quando atingido",
- "explodingbarrel": "explodingbarrel",
- "explodingbarrel_desc": "explodingbarrel_desc",
-
"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}%",
@@ -149,10 +162,16 @@
"fastreload": "Recarga Rápida",
"fastreload_desc": "Clique em [css_useSkill] para recarregar a arma que você está segurando",
+ "firerain": "Chuva de Fogo",
+ "firerain_desc": "Jogue uma isca para chamar uma chuva de Molotovs",
+
"flash": "Ligeirinho",
"flash_desc": "Velocidade de movimentação aleatória no início da rodada",
"flash_desc2": "Seu multiplicador de velocidade é: {0}x",
+ "flashlight": "Lanterna",
+ "flashlight_desc": "Clique em [css_useSkill] para ligar ou desligar a lanterna. Sua luz pode cegar os inimigos",
+
"fortnite": "Fortnite",
"fortnite_desc": "Clique em [css_useSkill] para criar uma barreira destrutível",
@@ -175,14 +194,14 @@
"ghost": "Fantasma",
"ghost_desc": "Você é completamente invisível",
- "giant": "giant",
- "giant_desc": "giant_desc",
- "giant_desc2": "giant_desc2: {0}x",
- "giant_disable_info": "giant_disable_info",
- "giant_enemy_info": "giant_enemy_info: {0}x",
- "giant_player_info": "giant_player_info: {0} {1}",
- "giant_select_info": "giant_select_info",
-
+ "giant": "Gigante",
+ "giant_desc": "Aumente o tamanho de um inimigo à sua escolha",
+ "giant_desc2": "Aumente o tamanho de um inimigo à sua escolha para {0}x o tamanho normal",
+ "giant_disable_info": "Você voltou ao seu tamanho normal.",
+ "giant_enemy_info": "Você foi aumentado para {0}x o tamanho normal.",
+ "giant_player_info": "Você aumentou o jogador '{0}' para {1}x o tamanho normal.",
+ "giant_select_info": "Selecione um jogador para aumentar:",
+
"glaz": "Smoke Transparente",
"glaz_desc": "Smokes tornam-se transparentes para você",
@@ -207,6 +226,9 @@
"healingsmoke": "Smoke Amiga",
"healingsmoke_desc": "Suas smokes curam",
+ "healingchicken": "Galinha Curadora",
+ "healingchicken_desc": "Suas galinhas curam você enquanto você estiver por perto",
+
"hermit": "Sanguessuga",
"hermit_desc": "Matar restaura munição e uma parte da sua vida",
@@ -252,6 +274,12 @@
"jester_on": "LIG.",
"jester_off": "DESL.",
+ "jetkick": "Chute a Jato",
+ "jetkick_desc": "Selecione um jogador para aplicar um chute a jato",
+ "jetkick_player_info": "O jogador '{0}' recebeu um chute a jato.",
+ "jetkick_enemy_info": "Cada tiro empurra você para trás",
+ "jetkick_disable_info": "Seu recuo voltou ao normal.",
+
"jumpban": "Perneta",
"jumpban_desc": "Escolha um jogador que não poderá pular",
"jumpban_enemy_info": "Cortaram as suas pernas.",
@@ -259,12 +287,12 @@
"jumpban_player_info": "O jogador '{0}' não pode mais pular.",
"jumpban_select_info": "Banir pulo do jogador:",
- "jumpcurse": "jumpcurse",
- "jumpcurse_desc": "jumpcurse_desc",
- "jumpcurse_disable_info": "jumpcurse_disable_info",
- "jumpcurse_enemy_info": "jumpcurse_enemy_info",
- "jumpcurse_player_info": "jumpcurse_player_info: {0}",
- "jumpcurse_select_info": "jumpcurse_select_info",
+ "jumpcurse": "Maldição do Salto",
+ "jumpcurse_desc": "Um inimigo escolhido pula sempre que um de seus companheiros pula",
+ "jumpcurse_disable_info": "Você pode controlar seus saltos novamente.",
+ "jumpcurse_enemy_info": "Agora você pula sempre que um de seus companheiros pula.",
+ "jumpcurse_player_info": "O jogador '{0}' agora pula sempre que seus companheiros pulam.",
+ "jumpcurse_select_info": "Selecione um jogador para amaldiçoar:",
"jumpingjack": "Pula-Pula",
"jumpingjack_desc": "Pular restaura vida",
@@ -272,8 +300,11 @@
"killerflash": "Flash Mortal",
"killerflash_desc": "Qualquer pessoa cega pela sua flash morre (incluindo você)",
- "knockback": "knockback",
- "knockback_desc": "knockback_desc",
+ "knockback": "Repulsão",
+ "knockback_desc": "Atirar enquanto estiver no ar empurra você para trás",
+
+ "lastgasp": "Último Suspiro",
+ "lastgasp_desc": "Após morrer, você causa dano ao inimigo que matou você",
"lifeswap": "Troca de Vida",
"lifeswap_desc": "Escolha um jogador para trocar de vida",
@@ -312,16 +343,12 @@
"moneyswap_player_info": "Você trocou dinheiro com o jogador '{0}'.",
"moneyswap_select_info": "Trocar dinheiro c/ jogador:",
- "deathbomb": "Bomba mortal",
- "deathbomb_desc": "Você explode ao morrer, matando os jogadores próximos",
- "deathbomb_explosion": "Kaboom!",
-
- "nightmare": "nightmare",
- "nightmare_desc": "nightmare_desc",
- "nightmare_disable_info": "nightmare_disable_info",
- "nightmare_enemy_info": "nightmare_enemy_info",
- "nightmare_player_info": "nightmare_player_info: {0}",
- "nightmare_select_info": "nightmare_select_info",
+ "nightmare": "Pesadelo",
+ "nightmare_desc": "Faça um inimigo escolhido ter uma visão aterrorizante",
+ "nightmare_disable_info": "O pesadelo desapareceu.",
+ "nightmare_enemy_info": "Um pesadelo está obscurecendo sua visão.",
+ "nightmare_player_info": "Você lançou um pesadelo sobre o jogador '{0}'.",
+ "nightmare_select_info": "Selecione um jogador para o pesadelo:",
"ninja": "Ninja",
"ninja_desc": "Ficar parado aumenta sua invisibilidade em 33%, agachar em 33%, e segurar uma faca em 33%",
@@ -462,6 +489,17 @@
"swapposition": "Troca de Posição",
"swapposition_desc": "Clique em [css_useSkill] para trocar de lugar com um inimigo aleatório",
+ "takeammo": "Pegar Munição",
+ "takeammo_desc": "Clique em [css_useSkill] para pegar o carregador da arma ativa de um inimigo aleatório",
+ "takeammo_hud_info1": "Nenhum jogador com um carregador ativo foi encontrado.",
+ "takeammo_hud_info2": "O inimigo não possui carregadores.",
+ "takeammo_enemy_info": "Você perdeu um pouco de munição.",
+
+ "teamteleport": "Teleporte para o Time",
+ "teamteleport_desc": "Pressione [css_useSkill] para se teleportar até o companheiro de equipe que você está olhando",
+ "teamteleport_noenemy": "Nenhum companheiro de equipe encontrado",
+ "teamteleport_hud_info": "Encontrado: {0}",
+
"teleporter": "Teletransportador",
"teleporter_desc": "Você tem a chance de trocar de lugar com um inimigo atingido",
"teleporter_desc2": "Sua chance de trocar de lugar após o acerto: {0}%",
@@ -485,11 +523,11 @@
"toxicsmoke": "Smoke Tóxica",
"toxicsmoke_desc": "Suas smokes causam dano",
- "tripwire": "tripwire",
- "tripwire_desc": "tripwire_desc",
- "tripwire_no_wall_info": "tripwire_no_wall_info",
- "tripwire_placed_info": "tripwire_placed_info",
- "tripwire_triggered_info": "tripwire_triggered_info: {0}",
+ "tripwire": "Fio de Armadilha",
+ "tripwire_desc": "Clique em [css_useSkill] para estender um fio entre duas paredes. Inimigos que tocarem nele aparecerão no seu radar",
+ "tripwire_no_wall_info": "Não há paredes próximas o suficiente dos dois lados.",
+ "tripwire_placed_info": "Fio de armadilha colocado.",
+ "tripwire_triggered_info": "'{0}' acionou seu fio.",
"wallhack": "Wallhack",
"wallhack_desc": "Você pode ver inimigos através das paredes",
@@ -569,6 +607,6 @@
"summary": "Resumo da última rodada",
"menu_controlls_scroll": "W/S - Rolar",
- "menu_controlls_padding": " | ",
+ "menu_controlls_padding": " | ",
"menu_controlls_select": "E - Selecionar"
}
diff --git a/jRandomSkills - SRC Files/src/lang/ru.json b/jRandomSkills - SRC Files/src/lang/ru.json
index f77d7cc..2702d1c 100644
--- a/jRandomSkills - SRC Files/src/lang/ru.json
+++ b/jRandomSkills - SRC Files/src/lang/ru.json
@@ -38,11 +38,11 @@
"astronaut_desc": "В начале раунда вам выдаётся случайное значение гравитации",
"astronaut_desc2": "Ваша случайная гравитация: {0}x",
- "moneyswap": "Налоговик",
- "moneyswap_desc": "Выберите игрока для обмена деньгами",
- "moneyswap_enemy_info": "Налоговая служба добралась до вас.",
- "moneyswap_player_info": "Вы обменялись деньгами с игроком '{0}'.",
- "moneyswap_select_info": "Обменять деньги с игроком:",
+ "bankrupt": "Банкрот",
+ "bankrupt_desc": "Выберите игрока, который потеряет все свои деньги",
+ "bankrupt_enemy_info": "Вы обанкротились.",
+ "bankrupt_player_info": "Игрок '{0}' обанкротился.",
+ "bankrupt_select_info": "Выберите игрока для банкротства:",
"baseball": "Бейсболист",
"baseball_desc": "Ваша ложная граната отскакивает от стен и мгновенно убивает врага при попадании",
@@ -51,9 +51,15 @@
"behind_desc": "Есть шанс развернуть врага на 180° при попадании",
"behind_desc2": "Ваш шанс развернуть врага при попадании: {0}%",
+ "berserker": "Берсерк",
+ "berserker_desc": "Чем меньше у вас здоровья, тем больше урона вы наносите и тем быстрее двигаетесь",
+
"blademaster": "Мастер клинка",
"blademaster_desc": "С ножом в руках у вас высокий шанс отразить выстрел",
+ "blastshot": "Взрывной выстрел",
+ "blastshot_desc": "Нажмите Attack2 на MP5, чтобы выстрелить гранатой HE",
+
"bunnyhop": "Заяц",
"bunnyhop_desc": "Вы получаете автоматический «БанниХоп»",
@@ -104,6 +110,13 @@
"deaf_player_info": "Звук отключён для игрока '{0}'.",
"deaf_select_info": "Отключить звук для игрока:",
+ "deathbomb": "Смертельная бомба",
+ "deathbomb_desc": "Вы взрываетесь при смерти, убивая ближайших игроков",
+ "deathbomb_explosion": "АЛЛАХУ АКБАР!!!",
+
+ "demoneye": "Око демона",
+ "demoneye_desc": "Вы наносите урон каждому врагу, на которого смотрите",
+
"disarmament": "Разоружение",
"disarmament_desc": "Есть шанс заставить врага выронить оружие при попадании",
"disarmament_desc2": "Ваш шанс разоружить врага: {0}%",
@@ -129,15 +142,15 @@
"enemyspawn": "Спавн врагов",
"enemyspawn_desc": "Нажмите [css_useSkill], чтобы телепортироваться на спавн врагов",
- "expensiveammo": "expensiveammo",
- "expensiveammo_desc": "expensiveammo_desc",
- "expensiveammo_disable_info": "expensiveammo_disable_info",
- "expensiveammo_enemy_info": "expensiveammo_enemy_info: {0}",
- "expensiveammo_player_info": "expensiveammo_player_info: {0}",
- "expensiveammo_select_info": "expensiveammo_select_info",
+ "expensiveammo": "Дорогие патроны",
+ "expensiveammo_desc": "Выбранный противник платит за каждый выстрел",
+ "expensiveammo_disable_info": "Теперь ваши патроны снова бесплатны.",
+ "expensiveammo_enemy_info": "Теперь каждый ваш выстрел стоит {0}$.",
+ "expensiveammo_player_info": "Игрок '{0}' теперь должен платить за каждый патрон.",
+ "expensiveammo_select_info": "Выберите игрока, для которого патроны станут дорогими:",
- "explodingbarrel": "explodingbarrel",
- "explodingbarrel_desc": "explodingbarrel_desc",
+ "explodingbarrel": "Взрывающаяся бочка",
+ "explodingbarrel_desc": "Нажмите [css_useSkill], чтобы установить бочку, которая взрывается при попадании",
"explosiveshot": "Взрывной выстрел",
"explosiveshot_desc": "Случайный шанс выстрелить взрывной пулей при стрельбе",
@@ -149,10 +162,16 @@
"fastreload": "Быстрая перезарядка",
"fastreload_desc": "Нажмите [css_useSkill], чтобы перезарядить текущее оружие",
+ "firerain": "Огненный дождь",
+ "firerain_desc": "Бросьте приманку, чтобы вызвать дождь из коктейлей Молотова",
+
"flash": "Флеш",
"flash_desc": "Случайная скорость игрока в начале раунда",
"flash_desc2": "Ваш множитель скорости: {0}x",
+ "flashlight": "Фонарик",
+ "flashlight_desc": "Нажмите [css_useSkill], чтобы включить или выключить фонарик. Его свет может ослеплять врагов",
+
"fortnite": "Фортнайт",
"fortnite_desc": "Нажмите [css_useSkill], чтобы создать разрушаемую баррикаду",
@@ -175,14 +194,14 @@
"ghost": "Призрак",
"ghost_desc": "Вы полностью невидимы",
- "giant": "giant",
- "giant_desc": "giant_desc",
- "giant_desc2": "giant_desc2: {0}x",
- "giant_disable_info": "giant_disable_info",
- "giant_enemy_info": "giant_enemy_info: {0}x",
- "giant_player_info": "giant_player_info: {0} {1}",
- "giant_select_info": "giant_select_info",
-
+ "giant": "Гигант",
+ "giant_desc": "Увеличьте выбранного противника",
+ "giant_desc2": "Увеличьте выбранного противника до {0}-кратного размера",
+ "giant_disable_info": "Вы снова обычного размера.",
+ "giant_enemy_info": "Ваш размер увеличен до {0}-кратного.",
+ "giant_player_info": "Вы увеличили игрока '{0}' до {1}-кратного размера.",
+ "giant_select_info": "Выберите игрока для увеличения:",
+
"glaz": "Глаз",
"glaz_desc": "Вы видите сквозь дымовые гранаты",
@@ -204,6 +223,9 @@
"grenadier": "Гренадёр",
"grenadier_desc": "У вас бесконечные осколочные гранаты",
+ "healingchicken": "Лечащая курица",
+ "healingchicken_desc": "Ваши куры лечат вас, пока вы находитесь рядом",
+
"healingsmoke": "Лечащий дым",
"healingsmoke_desc": "Ваши дымовые гранаты лечат",
@@ -252,6 +274,12 @@
"jester_on": "ВКЛ",
"jester_off": "ВЫКЛ",
+ "jetkick": "Реактивный удар",
+ "jetkick_desc": "Выберите игрока для реактивного удара",
+ "jetkick_player_info": "Игрок '{0}' получил реактивный удар.",
+ "jetkick_enemy_info": "Каждый выстрел отбрасывает вас назад",
+ "jetkick_disable_info": "Ваша отдача вернулась к норме.",
+
"jumpban": "Безногий",
"jumpban_desc": "Выберите игрока, который не сможет прыгать",
"jumpban_enemy_info": "Кто-то отрезал вам ноги.",
@@ -259,12 +287,12 @@
"jumpban_player_info": "Игрок '{0}' больше не может прыгать.",
"jumpban_select_info": "Запретить прыжки игроку:",
- "jumpcurse": "jumpcurse",
- "jumpcurse_desc": "jumpcurse_desc",
- "jumpcurse_disable_info": "jumpcurse_disable_info",
- "jumpcurse_enemy_info": "jumpcurse_enemy_info",
- "jumpcurse_player_info": "jumpcurse_player_info: {0}",
- "jumpcurse_select_info": "jumpcurse_select_info",
+ "jumpcurse": "Проклятие прыжка",
+ "jumpcurse_desc": "Выбранный противник прыгает каждый раз, когда прыгает кто-либо из его союзников",
+ "jumpcurse_disable_info": "Теперь вы снова можете контролировать свои прыжки.",
+ "jumpcurse_enemy_info": "Теперь вы будете прыгать каждый раз, когда прыгает кто-либо из ваших союзников.",
+ "jumpcurse_player_info": "Игрок '{0}' теперь прыгает вместе со своими союзниками.",
+ "jumpcurse_select_info": "Выберите игрока для проклятия:",
"jumpingjack": "Прыгающий Джек",
"jumpingjack_desc": "Прыжки восстанавливают здоровье",
@@ -272,8 +300,11 @@
"killerflash": "Смертельная флешка",
"killerflash_desc": "Любой, полностью ослеплённый вашей флешкой, погибает (включая вас)",
- "knockback": "knockback",
- "knockback_desc": "knockback_desc",
+ "knockback": "Отдача",
+ "knockback_desc": "Стрельба в воздухе отталкивает вас назад",
+
+ "lastgasp": "Последний вздох",
+ "lastgasp_desc": "После смерти вы наносите урон врагу, который вас убил",
"lifeswap": "Обмен жизнями",
"lifeswap_desc": "Выберите игрока для обмена здоровьем",
@@ -306,22 +337,18 @@
"miner": "Минёр",
"miner_desc": "Ваша осколочная граната взрывается только когда рядом есть враг",
- "bankrupt": "Банкрот",
- "bankrupt_desc": "Выберите игрока, который потеряет все свои деньги",
- "bankrupt_enemy_info": "Вы обанкротились.",
- "bankrupt_player_info": "Игрок '{0}' обанкротился.",
- "bankrupt_select_info": "Выберите игрока для банкротства:",
+ "moneyswap": "Налоговик",
+ "moneyswap_desc": "Выберите игрока для обмена деньгами",
+ "moneyswap_enemy_info": "Налоговая служба добралась до вас.",
+ "moneyswap_player_info": "Вы обменялись деньгами с игроком '{0}'.",
+ "moneyswap_select_info": "Обменять деньги с игроком:",
- "deathbomb": "Смертельная бомба",
- "deathbomb_desc": "Вы взрываетесь при смерти, убивая ближайших игроков",
- "deathbomb_explosion": "АЛЛАХУ АКБАР!!!",
-
- "nightmare": "nightmare",
- "nightmare_desc": "nightmare_desc",
- "nightmare_disable_info": "nightmare_disable_info",
- "nightmare_enemy_info": "nightmare_enemy_info",
- "nightmare_player_info": "nightmare_player_info: {0}",
- "nightmare_select_info": "nightmare_select_info",
+ "nightmare": "Кошмар",
+ "nightmare_desc": "Заставьте выбранного противника увидеть кошмарное видение",
+ "nightmare_disable_info": "Кошмар рассеялся.",
+ "nightmare_enemy_info": "Кошмар затуманивает ваше зрение.",
+ "nightmare_player_info": "Вы наложили кошмар на игрока '{0}'.",
+ "nightmare_select_info": "Выберите игрока для кошмара:",
"ninja": "Ниндзя",
"ninja_desc": "Стоя на месте, ваша невидимость увеличивается на 33%, в приседе на 33%, с ножом на 33%",
@@ -462,6 +489,17 @@
"swapposition": "Обмен позициями",
"swapposition_desc": "Нажмите [css_useSkill], чтобы поменяться местами со случайным врагом",
+ "takeammo": "Забрать патроны",
+ "takeammo_desc": "Нажмите [css_useSkill], чтобы забрать магазин активного оружия случайного противника",
+ "takeammo_hud_info1": "Не найден игрок с активным магазином.",
+ "takeammo_hud_info2": "У противника нет магазинов.",
+ "takeammo_enemy_info": "Вы потеряли немного боеприпасов.",
+
+ "teamteleport": "Телепортация к союзнику",
+ "teamteleport_desc": "Нажмите [css_useSkill], чтобы телепортироваться к союзнику, на которого вы смотрите",
+ "teamteleport_noenemy": "Союзник не найден",
+ "teamteleport_hud_info": "Найден: {0}",
+
"teleporter": "Телепортер",
"teleporter_desc": "Есть шанс поменяться местами с врагом при попадании",
"teleporter_desc2": "Ваш шанс обмена местами после попадания: {0}%",
@@ -485,12 +523,12 @@
"toxicsmoke": "Токсичный дым",
"toxicsmoke_desc": "Ваши дымовые гранаты наносят урон",
- "tripwire": "tripwire",
- "tripwire_desc": "tripwire_desc",
- "tripwire_no_wall_info": "tripwire_no_wall_info",
- "tripwire_placed_info": "tripwire_placed_info",
- "tripwire_triggered_info": "tripwire_triggered_info: {0}",
-
+ "tripwire": "Растяжка",
+ "tripwire_desc": "Нажмите [css_useSkill], чтобы натянуть трос между двумя стенами. Враги, задевшие его, отображаются на вашем радаре",
+ "tripwire_no_wall_info": "С обеих сторон нет достаточно близких стен.",
+ "tripwire_placed_info": "Растяжка установлена.",
+ "tripwire_triggered_info": "'{0}' задел вашу растяжку.",
+
"wallhack": "Воллхак",
"wallhack_desc": "Вы видите врагов сквозь стены",
@@ -569,6 +607,6 @@
"summary": "Итоги прошедшего раунда",
"menu_controlls_scroll": "W/S — Прокрутка",
- "menu_controlls_padding": " | ",
+ "menu_controlls_padding": " | ",
"menu_controlls_select": "E — Выбрать"
}
diff --git a/jRandomSkills - SRC Files/src/lang/tr.json b/jRandomSkills - SRC Files/src/lang/tr.json
index 18a1ceb..4db8982 100644
--- a/jRandomSkills - SRC Files/src/lang/tr.json
+++ b/jRandomSkills - SRC Files/src/lang/tr.json
@@ -51,9 +51,15 @@
"behind_desc": "Vurduğunda düşmanı 180 derece döndürme şansın olur",
"behind_desc2": "Baş döndürme şansın: %{0}",
+ "berserker": "Berserker",
+ "berserker_desc": "Canın azaldıkça daha fazla hasar verir ve daha hızlı hareket edersin",
+
"blademaster": "Kılıç Ustası",
"blademaster_desc": "Bıçak tutarken mermileri sektirme şansın artar",
+ "blastshot": "Patlama Atışı",
+ "blastshot_desc": "MP5 ile Attack2 tuşuna basarak bir HE bombası ateşle",
+
"bunnyhop": "Tavşan",
"bunnyhop_desc": "Otomatik \"BunnyHop\" yaparsın",
@@ -138,7 +144,7 @@
"explodingbarrel": "Patlayan Varil",
"explodingbarrel_desc": "[css_useSkill] ile vurulunca patlayan bir varil koyarsın",
-
+
"explosiveshot": "Patlayıcı Mermi",
"explosiveshot_desc": "Ateş ederken rastgele mermilerin patlayabilir",
"explosiveshot_desc2": "Patlayan mermi şansı: %{0}",
@@ -149,10 +155,16 @@
"fastreload": "Şipşak Şarjör",
"fastreload_desc": "[css_useSkill] tuşuna basarak şarjörünü hızlıca değiştir",
+ "firerain": "Ateş Yağmuru",
+ "firerain_desc": "Molotof yağmuru çağırmak için bir yem at",
+
"flash": "Flash",
"flash_desc": "Raund başında rastgele oyuncu hızı",
"flash_desc2": "Hızın: {0}x",
+ "flashlight": "El Feneri",
+ "flashlight_desc": "El fenerini açıp kapatmak için [css_useSkill] tuşuna tıkla. Işığı düşmanları kör edebilir",
+
"fortnite": "Fortnite",
"fortnite_desc": "[css_useSkill] tuşuna basarak barikat kur",
@@ -182,7 +194,7 @@
"giant_enemy_info": "{0}x boyutuna büyütüldün.",
"giant_player_info": "'{0}' oyuncusunu {1}x büyüttün.",
"giant_select_info": "Büyütülecek oyuncu:",
-
+
"glaz": "Glaz",
"glaz_desc": "Sis bombalarının içini görebilirsin",
@@ -204,6 +216,9 @@
"grenadier": "Bombacı",
"grenadier_desc": "Sınırsız el bombasına sahipsin",
+ "healingchicken": "Şifacı Tavuk",
+ "healingchicken_desc": "Yakınındayken tavukların seni iyileştirir",
+
"healingsmoke": "Şifalı Sis",
"healingsmoke_desc": "Sis bombaların iyileştirir",
@@ -252,6 +267,12 @@
"jester_on": "AÇIK",
"jester_off": "KAPALI",
+ "jetkick": "Jet Tekmesi",
+ "jetkick_desc": "Jet tekmesi yapmak için bir oyuncu seç",
+ "jetkick_player_info": "'{0}' adlı oyuncuya jet tekmesi yapıldı.",
+ "jetkick_enemy_info": "Her atış seni geriye doğru iter",
+ "jetkick_disable_info": "Geri tepmen normale döndü.",
+
"jumpban": "Bacaksız",
"jumpban_desc": "Zıplayamayacak bir oyuncu seç",
"jumpban_enemy_info": "Bacakların kesildi",
@@ -275,6 +296,9 @@
"knockback": "Savurma",
"knockback_desc": "Havadayken ateş etmek seni geriye savurur",
+ "lastgasp": "Son Nefes",
+ "lastgasp_desc": "Öldükten sonra seni öldüren düşmana hasar verirsin",
+
"lifeswap": "Can Takası",
"lifeswap_desc": "Can değerlerini takas etmek için bir oyuncu seç",
"lifeswap_enemy_info": "Birisi canını çaldı",
@@ -316,6 +340,9 @@
"deathbomb_desc": "Öldüğünde patlayarak etraftaki oyuncuları öldürürsün",
"deathbomb_explosion": "BOOM!!!",
+ "demoneye": "Şeytan Gözü",
+ "demoneye_desc": "Baktığın tüm düşmanlara hasar verirsin",
+
"nightmare": "Kabus",
"nightmare_desc": "Seçtiğin bir rakibe kabus görüntüsü verir",
"nightmare_disable_info": "Kabus sona erdi.",
@@ -462,6 +489,17 @@
"swapposition": "Yer Değiştirme",
"swapposition_desc": "[css_useSkill] tuşuna basarak vurduğun düşmanla yer değiştir",
+ "takeammo": "Mühimmat Al",
+ "takeammo_desc": "Rastgele bir düşmanın aktif silahının şarjörünü almak için [css_useSkill] tuşuna tıkla",
+ "takeammo_hud_info1": "Aktif şarjörü olan bir oyuncu bulunamadı.",
+ "takeammo_hud_info2": "Düşmanın şarjörü yok.",
+ "takeammo_enemy_info": "Bir miktar mühimmat kaybettin.",
+
+ "teamteleport": "Takıma Işınlanma",
+ "teamteleport_desc": "Baktığın takım arkadaşına ışınlanmak için [css_useSkill] tuşuna bas",
+ "teamteleport_noenemy": "Takım arkadaşı bulunamadı",
+ "teamteleport_hud_info": "Bulundu: {0}",
+
"teleporter": "Işınlayıcı",
"teleporter_desc": "Vurulan bir düşmanla yer değiştirme şansınız var",
"teleporter_desc2": "Yer değiştirme şansın: %{0}",
diff --git a/jRandomSkills - SRC Files/src/player/EntityEvents.cs b/jRandomSkills - SRC Files/src/player/EntityEvents.cs
index 51c36bc..0a575e8 100644
--- a/jRandomSkills - SRC Files/src/player/EntityEvents.cs
+++ b/jRandomSkills - SRC Files/src/player/EntityEvents.cs
@@ -1,20 +1,12 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes;
-using CounterStrikeSharp.API.Modules.Admin;
-using CounterStrikeSharp.API.Modules.Cvars;
-using CounterStrikeSharp.API.Modules.Events;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
-using CounterStrikeSharp.API.Modules.UserMessages;
-using CounterStrikeSharp.API.Modules.Utils;
-using RayTraceAPI;
using src.player.skills;
using src.utils;
-using System.Collections.Concurrent;
using static CounterStrikeSharp.API.Core.Listeners;
using static src.jRandomSkills;
-using Timer = CounterStrikeSharp.API.Modules.Timers.Timer;
namespace src.player
{
@@ -106,6 +98,15 @@ namespace src.player
}
}
+ private static HookResult OnTakeDamagePost(DynamicHook h)
+ {
+ lock (setLock)
+ {
+ DispatchOnTakeDamage(h, true);
+ return HookResult.Continue;
+ }
+ }
+
private static HookResult OnTriggerEnter(DynamicHook hook)
{
lock (setLock)
@@ -172,33 +173,6 @@ namespace src.player
}
}
- private static HookResult WeaponDrop(DynamicHook hook)
- {
- lock (setLock)
- {
- CCSPlayerController player = hook.GetParam(0);
- if (player == null || !player.IsValid)
- return HookResult.Continue;
-
- var activeSkills = Instance.SkillPlayer
- .Where(p => !p.IsDrawing)
- .Select(p => p.Skill.ToString())
- .Distinct();
-
- bool block = false;
- foreach (string skillName in activeSkills)
- {
- bool? result = (bool?)Instance.SkillAction(skillName, "WeaponDrop", [hook, player]);
- if (result == true)
- {
- block = true;
- break;
- }
- }
- return block ? HookResult.Handled : HookResult.Continue;
- }
- }
-
private static void EntitySpawned(CEntityInstance entity)
{
lock (setLock)
diff --git a/jRandomSkills - SRC Files/src/player/ISkill.cs b/jRandomSkills - SRC Files/src/player/ISkill.cs
index 7cc9a65..a0b41c6 100644
--- a/jRandomSkills - SRC Files/src/player/ISkill.cs
+++ b/jRandomSkills - SRC Files/src/player/ISkill.cs
@@ -14,6 +14,7 @@ public interface ISkill
public static void TypeSkill(CCSPlayerController _, string[] __) { }
public static void OnTakeDamage(DynamicHook _) { }
+ public static void OnTakeDamagePost(DynamicHook _) { }
public static void OnEntitySpawned(CEntityInstance _) { }
public static void OnTick() { }
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList _) { }
@@ -70,8 +71,10 @@ public enum Skills
Bankrupt,
Baseball,
Behind,
+ Berserker,
BladeMaster,
BunnyHop,
+ BlastShot,
C4Camouflage,
CarefulBullets,
Catapult,
@@ -83,6 +86,7 @@ public enum Skills
Deactivator,
Deaf,
DeathBomb,
+ DemonEye,
Disarmament,
Distancer,
Dash,
@@ -95,7 +99,9 @@ public enum Skills
ExplosiveShot,
FalconEye,
FastReload,
+ FireRain,
Flash,
+ Flashlight,
Fortnite,
FragileBomb,
FriendlyFire,
@@ -108,6 +114,7 @@ public enum Skills
Glue,
GodMode,
Grenadier,
+ HealingChicken,
HealingSmoke,
Hermit,
HolyHandGrenade,
@@ -121,11 +128,13 @@ public enum Skills
Jackal,
Jammer,
Jester,
+ JetKick,
JumpBan,
JumpCurse,
JumpingJack,
KillerFlash,
Knockback,
+ LastGasp,
LifeSwap,
LongKnife,
LongZeus,
@@ -176,6 +185,8 @@ public enum Skills
SoundMaker,
Spectator,
SwapPosition,
+ TakeAmmo,
+ TeamTeleport,
Teleporter,
Thief,
ThirdEye,
diff --git a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs
index fe62a16..71a61db 100644
--- a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs
+++ b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs
@@ -79,6 +79,7 @@ namespace src.player
Instance.HookUserMessage(208, PlayerMakeSound);
VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamage, HookMode.Pre);
+ VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Hook(OnTakeDamagePost, HookMode.Post);
Instance.RegisterEventHandler(BulletImpact);
@@ -94,6 +95,7 @@ namespace src.player
public static void Unload()
{
TryUnhook(() => VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Unhook(OnTakeDamage, HookMode.Pre));
+ TryUnhook(() => VirtualFunctions.CBaseEntity_TakeDamageOldFunc.Unhook(OnTakeDamagePost, HookMode.Post));
TryUnhook(() => VirtualFunctions.CBaseTrigger_StartTouchFunc.Unhook(OnTriggerEnter, HookMode.Post));
TryUnhook(() => VirtualFunctions.CBaseTrigger_EndTouchFunc.Unhook(OnTriggerExit, HookMode.Pre));
TryUnhook(() => VirtualFunctions.CCSPlayer_ItemServices_CanAcquireFunc.Unhook(OnWeaponCanAcquire, HookMode.Pre));
@@ -133,7 +135,7 @@ namespace src.player
}
}
- private static void DispatchOnTakeDamage(DynamicHook h)
+ private static void DispatchOnTakeDamage(DynamicHook h, bool post = false)
{
object[] args = [h];
var seen = new HashSet();
@@ -149,26 +151,26 @@ namespace src.player
continue;
}
- InvokeOnTakeDamage(p.Skill, h, args);
+ InvokeOnTakeDamage(p.Skill, h, args, post);
}
if (deferred == null) return;
foreach (var skill in deferred)
- InvokeOnTakeDamage(skill, h, args);
+ InvokeOnTakeDamage(skill, h, args, post);
}
- private static void InvokeOnTakeDamage(Skills skill, DynamicHook h, object[] args)
+ private static void InvokeOnTakeDamage(Skills skill, DynamicHook h, object[] args, bool post)
{
if (Config.LoadedConfig.DebugMode != true)
{
- InvokeSkill(skill, "OnTakeDamage", args);
+ InvokeSkill(skill, post ? "OnTakeDamagePost" : "OnTakeDamage", args);
return;
}
var info = h.GetParam(1);
float before = info == null ? 0f : info.Damage;
- InvokeSkill(skill, "OnTakeDamage", args);
+ InvokeSkill(skill, post ? "OnTakeDamagePost" : "OnTakeDamage", args);
float after = info == null ? 0f : info.Damage;
if (Math.Abs(before - after) > 0.01f)
@@ -345,6 +347,33 @@ namespace src.player
}
}
+ private static HookResult WeaponDrop(DynamicHook hook)
+ {
+ lock (setLock)
+ {
+ CCSPlayerController player = hook.GetParam(0);
+ if (player == null || !player.IsValid)
+ return HookResult.Continue;
+
+ var activeSkills = Instance.SkillPlayer
+ .Where(p => !p.IsDrawing)
+ .Select(p => p.Skill.ToString())
+ .Distinct();
+
+ bool block = false;
+ foreach (string skillName in activeSkills)
+ {
+ bool? result = (bool?)Instance.SkillAction(skillName, "WeaponDrop", [hook, player]);
+ if (result == true)
+ {
+ block = true;
+ break;
+ }
+ }
+ return block ? HookResult.Handled : HookResult.Continue;
+ }
+ }
+
private static readonly Dictionary _skillNames =
Enum.GetValues().ToDictionary(s => s, s => s.ToString());
private static readonly HashSet _activeSkillsSet = [];
diff --git a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs
index d2670f4..9650e5b 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Aimbot.cs
@@ -10,6 +10,7 @@ namespace src.player.skills
public class Aimbot : ISkill
{
private const Skills skillName = Skills.Aimbot;
+ private static readonly ThreadLocal> _restoreStack = new(() => new Stack<(nint, HitGroup_t)>());
public static void LoadSkill()
{
@@ -50,7 +51,33 @@ namespace src.player.skills
nint hitGroupData = Marshal.ReadIntPtr(hitGroupPointer, 16);
if (hitGroupData == nint.Zero) return;
- Marshal.WriteInt32(hitGroupData, 56, (int)HitGroup_t.HITGROUP_HEAD);
+ nint address = hitGroupData + 56;
+ HitGroup_t oldValue = (HitGroup_t)Marshal.ReadInt32(address);
+
+ if (oldValue == HitGroup_t.HITGROUP_HEAD || oldValue == HitGroup_t.HITGROUP_INVALID) return;
+
+ _restoreStack.Value!.Push((address, oldValue));
+ Marshal.WriteInt32(address, (int)HitGroup_t.HITGROUP_HEAD);
+ }
+
+ public static void OnTakeDamagePost(DynamicHook h)
+ {
+ var info = h.GetParam(1);
+
+ if (info == null || info.Handle == nint.Zero)
+ return;
+
+ if (!SkillUtils.IsBulletDamage(info)) return;
+
+ if (_restoreStack.Value!.Count > 0)
+ {
+ var (address, oldValue) = _restoreStack.Value.Pop();
+
+ if (address == nint.Zero)
+ return;
+
+ Marshal.WriteInt32(address, (int)oldValue);
+ }
}
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
diff --git a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs
index 9551ecf..fdb89e5 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs
@@ -2,6 +2,7 @@ using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
using src.utils;
using System.Collections.Concurrent;
@@ -57,7 +58,7 @@ namespace src.player.skills
var attackerInfo = PlayerManager.GetPlayerByIndex((PlayerManager.GetPlayerEvent(attacker)?.Index ?? attacker.Index));
if (attackerInfo?.Skill != skillName) return;
- SkillUtils.TakeHealth(victim!.PlayerPawn.Value, SkillsInfo.GetValue(skillName, "damageDeal"), attacker, "decoy");
+ SkillUtils.TakeHealth(victim!.PlayerPawn.Value, SkillsInfo.GetValue(skillName, "damageDeal"), attacker, KillfeedIcons.Decoy);
}
public static void OnEntitySpawned(CEntityInstance entity)
diff --git a/jRandomSkills - SRC Files/src/player/skills/Berserker.cs b/jRandomSkills - SRC Files/src/player/skills/Berserker.cs
new file mode 100644
index 0000000..0892dc1
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/Berserker.cs
@@ -0,0 +1,123 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
+using CounterStrikeSharp.API.Modules.Utils;
+using src.utils;
+using System.Collections.Concurrent;
+using static src.jRandomSkills;
+
+namespace src.player.skills
+{
+ public class Berserker : ISkill
+ {
+ private const Skills skillName = Skills.Berserker;
+ public static readonly ConcurrentDictionary jumpedPlayers = [];
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color"), false);
+ }
+
+ public static void NewRound()
+ {
+ jumpedPlayers.Clear();
+ }
+
+ private static float CalculateNewVelocity(CCSPlayerPawn pawn, float maxValue)
+ {
+ if (pawn!.Health <= 0) return 1f;
+
+ float healthPercentage = pawn.MaxHealth > 0
+ ? Math.Clamp((float)pawn.Health / pawn.MaxHealth, 0f, 1f)
+ : 0f;
+
+ float newValue = 1f + (maxValue - 1f) * (1f - healthPercentage);
+ return Math.Max(1, Math.Min(maxValue, newValue));
+ }
+
+ public static void 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;
+
+ CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle);
+ CCSPlayerPawn victimPawn = new(param.Handle);
+
+ if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player")
+ return;
+
+ if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null)
+ return;
+
+ CCSPlayerController attacker = PlayerManager.GetPlayerEvent(attackerPawn.Controller.Value.As())!;
+
+ var playerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index);
+ if (playerInfo == null) return;
+
+ if (playerInfo.Skill == skillName)
+ {
+ float damageMultiplier = CalculateNewVelocity(attackerPawn, SkillsInfo.GetValue(skillName, "maxDamageVelocity"));
+ param2.Damage *= damageMultiplier;
+ }
+ }
+
+ public static void PlayerJump(EventPlayerJump @event)
+ {
+ var player = PlayerManager.GetPlayerEvent(@event.Userid);
+ if (player == null || !player.IsValid) return;
+ if (!jumpedPlayers.TryGetValue(player.Index, out _)) return;
+ jumpedPlayers.AddOrUpdate(player.Index, Server.TickCount + 20, (k, v) => Server.TickCount + 20);
+ }
+
+ public static void EnableSkill(CCSPlayerController player)
+ {
+ var playerPawn = player.PlayerPawn.Value;
+ var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
+ if (playerPawn == null || playerInfo == null) return;
+ jumpedPlayers.TryAdd(player.Index, 0);
+ }
+
+ public static void DisableSkill(CCSPlayerController player)
+ {
+ var playerPawn = player.PlayerPawn.Value;
+ if (playerPawn == null) return;
+ playerPawn.VelocityModifier = 1;
+ jumpedPlayers.TryRemove(player.Index, out _);
+ }
+
+ public static void OnTick()
+ {
+ foreach (var player in PlayerManager.GetTickPlayers())
+ {
+ if (!Instance.IsPlayerValid(player)) continue;
+
+ var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
+ if (playerInfo?.Skill != skillName) continue;
+
+ var playerPawn = player.PlayerPawn?.Value;
+ if (playerPawn == null || playerPawn.VelocityModifier == 0) continue;
+
+ var buttons = player.Buttons;
+ float newSpeedVelocity = CalculateNewVelocity(playerPawn, SkillsInfo.GetValue(skillName, "maxSpeedVelocity"));
+
+ if (buttons.HasFlag(PlayerButtons.Moveleft) || buttons.HasFlag(PlayerButtons.Moveright) || buttons.HasFlag(PlayerButtons.Forward) || buttons.HasFlag(PlayerButtons.Back))
+ playerPawn.VelocityModifier = newSpeedVelocity;
+
+ if (jumpedPlayers.TryGetValue(player.Index, out var time) && time > Server.TickCount)
+ continue;
+
+ if (!((PlayerFlags)player.Flags).HasFlag(PlayerFlags.FL_ONGROUND))
+ playerPawn.AbsVelocity.Z = Math.Min(playerPawn.AbsVelocity.Z, 10);
+ }
+ }
+
+ public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#cc2929", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, float maxSpeedVelocity = 2f, float maxDamageVelocity = 2f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
+ {
+ public float MaxSpeedVelocity { get; set; } = maxSpeedVelocity;
+ public float MaxDamageVelocity { get; set; } = maxDamageVelocity;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/BlastShot.cs b/jRandomSkills - SRC Files/src/player/skills/BlastShot.cs
new file mode 100644
index 0000000..5aeeb8e
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/BlastShot.cs
@@ -0,0 +1,217 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Cvars;
+using CounterStrikeSharp.API.Modules.Entities.Constants;
+using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
+using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
+using src.utils;
+using System.Collections.Concurrent;
+using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
+
+namespace src.player.skills
+{
+ public class BlastShot : ISkill
+ {
+ private const Skills skillName = Skills.BlastShot;
+ private static readonly QAngle angle = new(13, -5, 5);
+ private static readonly ConcurrentDictionary nades = [];
+ private static readonly ConcurrentDictionary SkillPlayerInfo = [];
+ private static readonly string[] allowedWeapons = ["weapon_mp5sd"];
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color"));
+ }
+
+ public static void NewRound()
+ {
+ SkillPlayerInfo.Clear();
+ nades.Clear();
+ }
+
+ public static void EnableSkill(CCSPlayerController player)
+ {
+ SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo
+ {
+ SteamID = player.Index,
+ CanUse = true,
+ Cooldown = DateTime.MinValue,
+ });
+ SkillUtils.TryGiveWeapon(player, CsItem.MP5SD);
+ }
+
+ public static void DisableSkill(CCSPlayerController player)
+ {
+ if (player == null || !player.IsValid) return;
+ SkillPlayerInfo.TryRemove(player.Index, out _);
+ }
+
+ public static void OnTick()
+ {
+ float cooldown = SkillsInfo.GetValue(skillName, "cooldown");
+
+ foreach (var player in PlayerManager.GetTickPlayers())
+ {
+ var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
+ if (playerInfo?.Skill != skillName) continue;
+
+ var playerPawn = player.PlayerPawn?.Value;
+ if (playerPawn == null || !playerPawn.IsValid) continue;
+
+ if (!SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) continue;
+
+ var buttons = player.Buttons;
+ bool isAttack2 = (buttons & PlayerButtons.Attack2) != 0;
+
+ if (skillInfo.CanUse && isAttack2)
+ {
+ var weapon = playerPawn.WeaponServices?.ActiveWeapon?.Value;
+
+ if (weapon == null || !weapon.IsValid) continue;
+ if (!allowedWeapons.Contains(SkillUtils.GetDesignerName(weapon))) continue;
+
+ skillInfo.CanUse = false;
+ skillInfo.Cooldown = DateTime.Now;
+ SpawnExplosion(player);
+ }
+
+ UpdateHUD(player, skillInfo, cooldown);
+ }
+ }
+
+ private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo, float cooldownSkill)
+ {
+ float cooldown = 0;
+ if (skillInfo != null)
+ {
+ float time = (int)Math.Ceiling((skillInfo.Cooldown.AddSeconds(cooldownSkill) - DateTime.Now).TotalSeconds);
+ cooldown = Math.Max(time, 0);
+
+ if (cooldown == 0 && skillInfo?.CanUse == false)
+ skillInfo.CanUse = true;
+ }
+
+ var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
+ if (playerInfo == null) return;
+
+ if (cooldown == 0)
+ playerInfo.PrintHTML = null;
+ else
+ playerInfo.PrintHTML = $"{player.GetTranslation("hud_info", $"{cooldown}")}";
+ }
+
+ private static void SpawnExplosion(CCSPlayerController player)
+ {
+ var pawn = player.PlayerPawn.Value;
+ if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return;
+
+ float force = SkillsInfo.GetValue(skillName, "force");
+
+ Vector pos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z);
+ Vector vel = SkillUtils.GetForwardVector(pawn.EyeAngles) * force;
+
+ SkillUtils.CreateHEGrenadeProjectile(pos, angle, vel, player.TeamNum);
+ nades.AddOrUpdate(Server.TickCount, (player.TeamNum, player.Index), (_, _) => (player.TeamNum, player.Index));
+ }
+
+ public static void OnEntitySpawned(CEntityInstance entity)
+ {
+ if (entity.DesignerName != "hegrenade_projectile") return;
+
+ var heProjectile = entity.As();
+ if (heProjectile == null || !heProjectile.IsValid || heProjectile.AbsRotation == null) return;
+
+ int lastTick = Server.TickCount;
+
+ Server.NextFrame(() =>
+ {
+ if (heProjectile == null || !heProjectile.IsValid) return;
+ if (!(NearlyEquals(angle.X, heProjectile.AbsRotation.X) && NearlyEquals(angle.Y, heProjectile.AbsRotation.Y) && NearlyEquals(angle.Z, heProjectile.AbsRotation.Z)))
+ return;
+
+ heProjectile.TicksAtZeroVelocity = 100;
+ heProjectile.Damage = SkillsInfo.GetValue(skillName, "explosionDamage");
+ heProjectile.DmgRadius = SkillsInfo.GetValue(skillName, "explosionRadius");
+
+ if (nades.TryRemove(lastTick, out var source))
+ heProjectile.Globalname = $"deathbomb_team_{source.Team}_{source.Owner}_{heProjectile.Index}";
+ });
+ }
+
+ public static void OnTakeDamage(DynamicHook h)
+ {
+ CEntityInstance param = h.GetParam(0);
+ CTakeDamageInfo param2 = h.GetParam(1);
+
+ if (param == null || param.Entity == null || param2 == null) return;
+
+ var nade = param2.Attacker.Value;
+ if (nade == null || !nade.IsValid) return;
+
+ if (nade.DesignerName != "hegrenade_projectile") return;
+ if (string.IsNullOrEmpty(nade.Globalname) || !nade.Globalname.StartsWith("deathbomb_team_")) return;
+
+ var parts = nade.Globalname.Split('_');
+ if (parts.Length < 4) return;
+ if (!int.TryParse(parts[2], out int nadeTeam)) return;
+ if (!uint.TryParse(parts[3], out uint ownerIndex)) return;
+
+ CCSPlayerPawn victimPawn = new(param.Handle);
+
+ if (victimPawn.DesignerName != "player") return;
+ if (victimPawn.Controller?.Value == null) return;
+
+ var victim = victimPawn.Controller.Value.As();
+ if (victim == null || !victim.IsValid || victim.Index == ownerIndex) return;
+
+ var owner = Utilities.GetPlayerFromIndex((int)ownerIndex);
+ if (owner != null && !owner.IsValid) owner = null;
+
+ if (victimPawn.TeamNum == nadeTeam)
+ {
+ float reduction = SkillsInfo.GetValue(skillName, "dmgReductionForTeamates");
+ param2.Damage *= 1f - Math.Clamp(reduction, 0f, 1f);
+
+ if (IsFriendlyFireOff())
+ {
+ int teamDamage = (int)param2.Damage;
+ param2.Damage = 0;
+
+ if (teamDamage > 0)
+ SkillUtils.TakeHealth(victimPawn, teamDamage, owner, KillfeedIcons.Explosion);
+
+ return;
+ }
+ }
+
+ if (owner != null && param2.Damage >= victimPawn.Health)
+ SkillUtils.RegisterKillCredit(victim.Index, owner.Index, KillfeedIcons.Explosion);
+ }
+
+ private static bool IsFriendlyFireOff()
+ {
+ bool ff = ConVar.Find("mp_friendlyfire")?.GetPrimitiveValue() ?? false;
+ bool tae = ConVar.Find("mp_teammates_are_enemies")?.GetPrimitiveValue() ?? false;
+ return !ff && !tae;
+ }
+
+ private static bool NearlyEquals(float a, float b, float epsilon = 0.001f) => Math.Abs(a - b) < epsilon;
+
+ public class PlayerSkillInfo
+ {
+ public ulong SteamID { get; set; }
+ public bool CanUse { get; set; }
+ public DateTime Cooldown { get; set; }
+ }
+
+ public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#7740c9", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, float explosionRadius = 400.0f, int explosionDamage = 60, float dmgReductionForTeamates = 0.5f, float cooldown = 10f, float force = 1000f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
+ {
+ public float ExplosionRadius { get; set; } = explosionRadius;
+ public int ExplosionDamage { get; set; } = explosionDamage;
+ public float DmgReductionForTeamates { get; set; } = dmgReductionForTeamates;
+ public float Cooldown { get; set; } = cooldown;
+ public float Force { get; set; } = force;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs b/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs
index 867d3a3..de9c9d1 100644
--- a/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs
@@ -2,6 +2,7 @@ using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
using src.utils;
using System.Collections.Concurrent;
using static src.jRandomSkills;
@@ -154,7 +155,7 @@ namespace src.player.skills
{
eventPlayer.ExecuteClientCommand($"play player/player_damagebody_0{Instance.Random.Next(4, 8)}");
- SkillUtils.TakeHealth(playerPawn, SkillsInfo.GetValue(skillName, "damageAfterMiss"), GetSkillOwner(playerIndex), "planted_c4");
+ SkillUtils.TakeHealth(playerPawn, SkillsInfo.GetValue(skillName, "damageAfterMiss"), GetSkillOwner(playerIndex), KillfeedIcons.Fist);
}
lastShot.TryRemove(playerIndex, out _);
});
diff --git a/jRandomSkills - SRC Files/src/player/skills/DeathBomb.cs b/jRandomSkills - SRC Files/src/player/skills/DeathBomb.cs
index 11c723e..43e262c 100644
--- a/jRandomSkills - SRC Files/src/player/skills/DeathBomb.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/DeathBomb.cs
@@ -3,6 +3,7 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Cvars;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
using src.utils;
using System.Collections.Concurrent;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
@@ -132,14 +133,14 @@ namespace src.player.skills
param2.Damage = 0;
if (teamDamage > 0)
- SkillUtils.TakeHealth(victimPawn, teamDamage, owner, "hegrenade");
+ SkillUtils.TakeHealth(victimPawn, teamDamage, owner, KillfeedIcons.Explosion);
return;
}
}
if (owner != null && param2.Damage >= victimPawn.Health)
- SkillUtils.RegisterKillCredit(victim.Index, owner.Index, "hegrenade");
+ SkillUtils.RegisterKillCredit(victim.Index, owner.Index, KillfeedIcons.Explosion);
}
private static bool IsFriendlyFireOff()
diff --git a/jRandomSkills - SRC Files/src/player/skills/DemonEye.cs b/jRandomSkills - SRC Files/src/player/skills/DemonEye.cs
new file mode 100644
index 0000000..8059a0d
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/DemonEye.cs
@@ -0,0 +1,80 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
+using src.utils;
+using static src.jRandomSkills;
+
+namespace src.player.skills
+{
+ public class DemonEye : ISkill
+ {
+ private const Skills skillName = Skills.DemonEye;
+ private static readonly Skills[] hidingSkills = [Skills.Ghost, Skills.Ninja, Skills.C4Camouflage];
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color"));
+ }
+
+ public static void OnTick()
+ {
+ int tickCooldown = (int)(64 * SkillsInfo.GetValue(skillName, "SecondCooldown"));
+ if (Server.TickCount % tickCooldown != 0) return;
+
+ int damage = SkillsInfo.GetValue(skillName, "damage");
+
+ foreach (var player in PlayerManager.GetTickPlayers())
+ {
+ var playerEvent = PlayerManager.GetPlayerEvent(player);
+ if (!Instance.IsPlayerValid(playerEvent)) continue;
+
+ var playerInfo = PlayerManager.GetPlayerByIndex(playerEvent!.Index);
+ if (playerInfo?.Skill == skillName)
+ HitEnemies(playerEvent, damage);
+ }
+ }
+
+ private static void HitEnemies(CCSPlayerController player, int damage)
+ {
+ if (player == null || !player.IsValid || player.PlayerPawn?.Value == null) return;
+
+ int playerSlot = player.Slot;
+ int playerBit = playerSlot % 32;
+
+ if (playerSlot < 0)
+ return;
+
+ foreach (var enemy in PlayerManager.GetTickPlayers().FindAll(p => p != null && p.IsValid && p.Team != player.Team))
+ {
+ var enemyEvent = PlayerManager.GetPlayerEvent(enemy);
+ if (enemyEvent == null || !enemyEvent.IsValid) continue;
+
+ var enemyPawn = enemyEvent.PlayerPawn?.Value;
+ if (enemyPawn == null || !enemyPawn.IsValid || enemyPawn.Health <= 0) continue;
+
+ int enemySlot = enemy.Slot;
+ if (enemySlot < 0)
+ return;
+
+ int enemyBit = enemySlot % 32;
+ uint playerMask = 1u << playerBit;
+ uint enemyMask = 1u << enemyBit;
+
+ bool playerSeesEnemy = (enemyPawn.EntitySpottedState.SpottedByMask[0] & playerMask) != 0;
+
+ if (playerSeesEnemy)
+ {
+ SkillUtils.TakeHealth(enemyPawn, damage, player, KillfeedIcons.Fist);
+ enemyEvent.EmitSound("Player.DamageBody.Onlooker");
+ }
+ }
+ }
+
+ public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#c91243", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, float secondCooldown = 1f, int damage = 5) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
+ {
+ public float SecondCooldown { get; set; } = secondCooldown;
+ public int Damage { get; set; } = damage;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/ExplodingBarrel.cs b/jRandomSkills - SRC Files/src/player/skills/ExplodingBarrel.cs
index 0c7df63..aea0ac2 100644
--- a/jRandomSkills - SRC Files/src/player/skills/ExplodingBarrel.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/ExplodingBarrel.cs
@@ -3,6 +3,7 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Cvars;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
using src.utils;
using System.Collections.Concurrent;
@@ -238,14 +239,14 @@ namespace src.player.skills
param2.Damage = 0;
if (teamDamage > 0)
- SkillUtils.TakeHealth(victimPawn, teamDamage, owner, "planted_c4");
+ SkillUtils.TakeHealth(victimPawn, teamDamage, owner, KillfeedIcons.Explosion);
return;
}
}
if (owner != null && param2.Damage >= victimPawn.Health)
- SkillUtils.RegisterKillCredit(victim.Index, owner.Index, "planted_c4");
+ SkillUtils.RegisterKillCredit(victim.Index, owner.Index, KillfeedIcons.Explosion);
}
private static bool IsFriendlyFireOff()
diff --git a/jRandomSkills - SRC Files/src/player/skills/FireRain.cs b/jRandomSkills - SRC Files/src/player/skills/FireRain.cs
new file mode 100644
index 0000000..b62f5a9
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/FireRain.cs
@@ -0,0 +1,144 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Entities.Constants;
+using CounterStrikeSharp.API.Modules.Utils;
+using src.utils;
+using System.Collections.Concurrent;
+
+namespace src.player.skills
+{
+ public class FireRain : ISkill
+ {
+ private const Skills skillName = Skills.FireRain;
+ private static readonly QAngle angle = new(10, -4, 13);
+ private static readonly ConcurrentDictionary decoys = [];
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color"));
+ }
+
+ public static void NewRound()
+ {
+ KillAllDecoys();
+ }
+
+ private static void KillAllDecoys()
+ {
+ foreach (var decoyIndex in decoys.Keys.ToArray())
+ {
+ var decoy = Utilities.GetEntityFromIndex((int)decoyIndex);
+ if (decoy != null && decoy.IsValid && decoy.DesignerName == "decoy_projectile")
+ decoy.AddEntityIOEvent("Kill", decoy, delay: 0.1f);
+ }
+
+ decoys.Clear();
+ }
+
+ private static void SpawnRain(CCSPlayerController player, Vector targetPos)
+ {
+ var pawn = player.PlayerPawn.Value;
+
+ if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null)
+ return;
+
+ const int grenadeCount = 5;
+ const float spawnHeight = 800.0f;
+ const float approachDistance = 600.0f;
+ const float clusterRadius = 130.0f;
+ const float flightTime = 0.65f;
+ const float gravity = 800.0f;
+
+ float approachAngle = Random.Shared.NextSingle() * MathF.Tau;
+ float dirX = MathF.Cos(approachAngle);
+ float dirY = MathF.Sin(approachAngle);
+
+ Vector skyCenter = new(
+ targetPos.X + dirX * approachDistance,
+ targetPos.Y + dirY * approachDistance,
+ targetPos.Z + spawnHeight
+ );
+
+ float dx = targetPos.X - skyCenter.X;
+ float dy = targetPos.Y - skyCenter.Y;
+ float dz = targetPos.Z - skyCenter.Z;
+
+ float vx = dx / flightTime;
+ float vy = dy / flightTime;
+ float vz = (dz + 0.5f * gravity * flightTime * flightTime) / flightTime;
+
+ Vector velocity = new(vx, vy, vz);
+
+ float yaw = MathF.Atan2(vy, vx) * (180.0f / MathF.PI);
+ float horizontalSpeed = MathF.Sqrt(vx * vx + vy * vy);
+ float pitch = -MathF.Atan2(vz, horizontalSpeed) * (180.0f / MathF.PI);
+ QAngle launchAngle = new(pitch, yaw, 0.0f);
+
+ for (int i = 0; i < grenadeCount; i++)
+ {
+ float offsetAngle = Random.Shared.NextSingle() * MathF.Tau;
+ float offsetDist = MathF.Sqrt(Random.Shared.NextSingle()) * clusterRadius;
+
+ float offsetX = MathF.Cos(offsetAngle) * offsetDist;
+ float offsetY = MathF.Sin(offsetAngle) * offsetDist;
+
+ Vector spawnPos = new(
+ skyCenter.X + offsetX,
+ skyCenter.Y + offsetY,
+ skyCenter.Z
+ );
+
+ SkillUtils.CreateMolotovProjectile(spawnPos, launchAngle, velocity, player.TeamNum);
+ }
+ }
+
+ public static void OnEntitySpawned(CEntityInstance entity)
+ {
+ var name = entity.DesignerName;
+ if (name != "decoy_projectile")
+ return;
+
+ var decoy = entity.As();
+ if (decoy == null || !decoy.IsValid || decoy.OwnerEntity == null || decoy.OwnerEntity.Value == null || !decoy.OwnerEntity.Value.IsValid) return;
+
+ var pawn = decoy.OwnerEntity.Value.As();
+ if (pawn == null || !pawn.IsValid || pawn.Controller == null || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return;
+
+ var player = pawn.Controller.Value.As();
+ if (player == null || !player.IsValid) return;
+
+ var playerInfo = PlayerManager.GetPlayerByIndex((PlayerManager.GetPlayerEvent(player)?.Index ?? player.Index));
+ if (playerInfo?.Skill != skillName) return;
+ decoys.TryAdd(decoy.Index, 0);
+ }
+
+ public static void DecoyStarted(EventDecoyStarted @event)
+ {
+ var player = PlayerManager.GetPlayerEvent(@event.Userid);
+ if (player == null || !player.IsValid) return;
+
+ var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
+ if (playerInfo?.Skill != skillName) return;
+
+ uint key = (uint)@event.Entityid;
+ if (decoys.ContainsKey(key))
+ {
+ var decoy = Utilities.GetEntityFromIndex(@event.Entityid);
+ if (decoy != null && decoy.IsValid)
+ decoy.AddEntityIOEvent("Kill", decoy, delay: 0.1f);
+ decoys.TryRemove(key, out _);
+ SpawnRain(player, new Vector(@event.X, @event.Y, @event.Z));
+ }
+ }
+
+ public static void EnableSkill(CCSPlayerController player)
+ {
+ if (player == null || !player.IsValid) return;
+ SkillUtils.TryGiveWeapon(player, CsItem.DecoyGrenade);
+ }
+
+ public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffbf47", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Epic) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
+ {
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Flashlight.cs b/jRandomSkills - SRC Files/src/player/skills/Flashlight.cs
new file mode 100644
index 0000000..12209ba
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/Flashlight.cs
@@ -0,0 +1,466 @@
+// https://github.com/creazy231/cs2-css-flashlight
+
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
+using src.utils;
+using System.Collections.Concurrent;
+using System.Drawing;
+
+namespace src.player.skills
+{
+ public class Flashlight : ISkill
+ {
+ private const Skills skillName = Skills.Flashlight;
+ private static readonly ConcurrentDictionary SkillPlayerInfo = [];
+
+ public class PlayerSkillInfo
+ {
+ public ulong SteamID { get; set; }
+ public bool CanUse { get; set; }
+ public DateTime Cooldown { get; set; }
+ public uint LightEntityIndex { get; set; }
+ public bool IsActive { get; set; }
+ }
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color"));
+ }
+
+ public static void NewRound()
+ {
+ ClearAllEntities();
+ SkillPlayerInfo.Clear();
+ }
+
+ public static void RoundEnd()
+ {
+ ClearAllEntities();
+ }
+
+ public static void OnTick()
+ {
+ foreach (var player in PlayerManager.GetTickPlayers())
+ {
+ if (player == null || !player.IsValid)
+ continue;
+
+ var playerInfo = PlayerManager.GetPlayerByIndex(player.Index);
+
+ if (playerInfo?.Skill != skillName)
+ continue;
+
+ if (!SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo))
+ continue;
+
+ UpdateHUD(player, skillInfo);
+
+ if (!skillInfo.IsActive || skillInfo.LightEntityIndex == 0)
+ continue;
+
+ var lightEntity = Utilities.GetEntityFromIndex((int)skillInfo.LightEntityIndex);
+
+ if (lightEntity == null || !lightEntity.IsValid)
+ {
+ skillInfo.IsActive = false;
+ skillInfo.LightEntityIndex = 0;
+ continue;
+ }
+
+ UpdateLightPosition(player, lightEntity);
+
+ if (Server.TickCount % 32 != 0) continue;
+ CanBlind(player, lightEntity);
+ }
+ }
+
+ public static void EnableSkill(CCSPlayerController player)
+ {
+ if (player == null || !player.IsValid)
+ return;
+
+ SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo
+ {
+ SteamID = player.Index,
+ CanUse = true,
+ Cooldown = DateTime.MinValue,
+ LightEntityIndex = 0,
+ IsActive = false
+ });
+ }
+
+ public static void DisableSkill(CCSPlayerController player)
+ {
+ if (player == null)
+ return;
+
+ RemovePlayerLight(player.Index);
+ SkillPlayerInfo.TryRemove(player.Index, out _);
+ SkillUtils.ResetPrintHTML(player);
+ }
+
+ public static void PlayerDeath(EventPlayerDeath @event)
+ {
+ var victim = PlayerManager.GetPlayerEvent(@event.Userid);
+ if (victim != null && victim.IsValid)
+ RemovePlayerLight(victim.Index);
+ }
+
+ public static void UseSkill(CCSPlayerController player)
+ {
+ if (player == null || !player.IsValid)
+ return;
+
+ var playerPawn = player.PlayerPawn?.Value;
+ if (playerPawn == null || !playerPawn.IsValid || playerPawn.Health <= 0)
+ return;
+
+ if (!SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo))
+ return;
+
+ if (!skillInfo.CanUse)
+ return;
+
+ skillInfo.CanUse = false;
+ skillInfo.Cooldown = DateTime.Now;
+
+ CBarnLight? lightEntity = null;
+ if (skillInfo.LightEntityIndex != 0)
+ lightEntity = Utilities.GetEntityFromIndex((int)skillInfo.LightEntityIndex);
+
+ if (lightEntity == null || !lightEntity.IsValid)
+ CreatePlayerFlashlight(player, skillInfo);
+ else
+ {
+ skillInfo.IsActive = !skillInfo.IsActive;
+ lightEntity.Enabled = skillInfo.IsActive;
+
+ if (skillInfo.IsActive)
+ {
+ lightEntity.AcceptInput("TurnOn");
+ UpdateLightPosition(player, lightEntity);
+ }
+ else
+ {
+ lightEntity.AcceptInput("TurnOff");
+ lightEntity.Teleport(new Vector(0, 0, -1000));
+ }
+ }
+ }
+
+ private static void CreatePlayerFlashlight(CCSPlayerController player, PlayerSkillInfo skillInfo)
+ {
+ var playerPawn = player.PlayerPawn?.Value;
+
+ if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null)
+ return;
+
+ RemovePlayerLight(player.Index);
+
+ if (EntityManager.OverBudget())
+ return;
+
+ var light = Utilities.CreateEntityByName("light_barn");
+
+ if (light == null || !light.IsValid)
+ return;
+
+ EntityManager.RegisterEntity(light.Index, player.Index, "light_barn");
+
+ int colorR = SkillsInfo.GetValue(skillName, "colorR");
+ int colorG = SkillsInfo.GetValue(skillName, "colorG");
+ int colorB = SkillsInfo.GetValue(skillName, "colorB");
+ float brightness = SkillsInfo.GetValue(skillName, "brightness");
+ float range = SkillsInfo.GetValue(skillName, "range");
+
+ light.Enabled = true;
+ light.Color = Color.FromArgb(255, Math.Clamp(colorR, 0, 255), Math.Clamp(colorG, 0, 255), Math.Clamp(colorB, 0, 255));
+ light.ColorTemperature = 6500;
+ light.Brightness = brightness;
+ light.Range = range;
+ light.SoftX = 1f;
+ light.SoftY = 1f;
+ light.Skirt = 0.5f;
+ light.SkirtNear = 1.0f;
+ light.CastShadows = 0;
+ light.DirectLight = 3;
+ light.SizeParams.X = 45;
+ light.SizeParams.Y = 45;
+ light.SizeParams.Z = 0.03f;
+
+ using (var keyValues = new CEntityKeyValues())
+ {
+ light.DispatchSpawn(keyValues);
+ }
+
+ light.AcceptInput("TurnOn");
+
+ skillInfo.LightEntityIndex = light.Index;
+ skillInfo.IsActive = true;
+
+ UpdateLightPosition(player, light);
+ }
+
+ private static void UpdateLightPosition(CCSPlayerController player, CBarnLight light)
+ {
+ var pawn = player.PlayerPawn.Value;
+
+ if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null || pawn.V_angle == null)
+ return;
+
+ Vector eyePos = new(
+ pawn.AbsOrigin.X,
+ pawn.AbsOrigin.Y,
+ pawn.AbsOrigin.Z + pawn.ViewOffset.Z
+ );
+
+ Vector forward = SkillUtils.GetForwardVector(pawn.V_angle);
+
+ const float distance = 18.0f;
+
+ Vector lightPos = new(
+ eyePos.X + forward.X * distance,
+ eyePos.Y + forward.Y * distance,
+ eyePos.Z + forward.Z * distance
+ );
+
+ light.Teleport(lightPos, pawn.V_angle, null);
+ }
+
+ private static void CanBlind(CCSPlayerController owner, CBarnLight light)
+ {
+ var ownerPawn = owner.PlayerPawn.Value;
+ if (ownerPawn == null || !ownerPawn.IsValid || ownerPawn.AbsOrigin == null || ownerPawn.V_angle == null)
+ return;
+
+ if (light == null || !light.IsValid || light.AbsOrigin == null)
+ return;
+
+ float blindDuration = SkillsInfo.GetValue(skillName, "blindDuration");
+ float blindAlpha = SkillsInfo.GetValue(skillName, "blindAlpha");
+
+ float blindAngle = SkillsInfo.GetValue(skillName, "blindAngle");
+ float range = SkillsInfo.GetValue(skillName, "range");
+ float rangeSq = range * range;
+
+ Vector eyePos = new(
+ ownerPawn.AbsOrigin.X,
+ ownerPawn.AbsOrigin.Y,
+ ownerPawn.AbsOrigin.Z + ownerPawn.ViewOffset.Z
+ );
+ Vector ownerForward = SkillUtils.GetForwardVector(ownerPawn.V_angle);
+ Vector lightPos = new(
+ eyePos.X + ownerForward.X * 18.0f,
+ eyePos.Y + ownerForward.Y * 18.0f,
+ eyePos.Z + ownerForward.Z * 18.0f
+ );
+
+ float minDot = MathF.Cos(blindAngle * MathF.PI / 180.0f);
+
+ foreach (var target in PlayerManager.GetTickPlayers())
+ {
+ if (target == null || !target.IsValid || target.Index == owner.Index || target.Team == owner.Team)
+ continue;
+
+ var targetInfo = PlayerManager.GetPlayerByIndex(target.Index);
+ if (targetInfo != null && targetInfo.Skill == Skills.AntyFlash)
+ continue;
+
+ var targetPawn = target.PlayerPawn.Value;
+
+ if (targetPawn == null || !targetPawn.IsValid || targetPawn.Health <= 0 || target.TeamNum == owner.TeamNum)
+ continue;
+
+ bool targetBlinded = targetPawn.BlindUntilTime > Server.CurrentTime;
+ bool ownerBlinded = ownerPawn.BlindUntilTime > Server.CurrentTime;
+ var (playerSeesEnemy, enemySeesPlayer) = ArePlayersSpottedBothWays(owner, ownerPawn, target, targetPawn);
+
+ bool needPlayerSees = !ownerBlinded;
+ bool needEnemySees = !targetBlinded;
+
+ if (ownerBlinded && targetBlinded)
+ continue;
+
+ if (needPlayerSees && !playerSeesEnemy)
+ continue;
+
+ if (needEnemySees && !enemySeesPlayer)
+ continue;
+
+ Vector targetEyePos = new(
+ targetPawn.AbsOrigin.X,
+ targetPawn.AbsOrigin.Y,
+ targetPawn.AbsOrigin.Z + targetPawn.ViewOffset.Z
+ );
+
+ Vector toTarget = new(
+ targetEyePos.X - lightPos.X,
+ targetEyePos.Y - lightPos.Y,
+ targetEyePos.Z - lightPos.Z
+ );
+
+ float distanceSq = toTarget.X * toTarget.X + toTarget.Y * toTarget.Y + toTarget.Z * toTarget.Z;
+
+ if (distanceSq <= 0.0001f || distanceSq > rangeSq)
+ continue;
+
+ float distance = MathF.Sqrt(distanceSq);
+ float invLength = 1.0f / distance;
+
+ Vector directionToTarget = new(
+ toTarget.X * invLength,
+ toTarget.Y * invLength,
+ toTarget.Z * invLength
+ );
+
+ float sourceDot = ownerForward.X * directionToTarget.X +
+ ownerForward.Y * directionToTarget.Y +
+ ownerForward.Z * directionToTarget.Z;
+
+ if (sourceDot < minDot)
+ continue;
+
+ Vector targetForward = SkillUtils.GetForwardVector(targetPawn.V_angle);
+
+ Vector fromTargetToLight = new(
+ lightPos.X - targetEyePos.X,
+ lightPos.Y - targetEyePos.Y,
+ lightPos.Z - targetEyePos.Z
+ );
+
+ float targetDistanceSq = fromTargetToLight.X * fromTargetToLight.X +
+ fromTargetToLight.Y * fromTargetToLight.Y +
+ fromTargetToLight.Z * fromTargetToLight.Z;
+
+ if (targetDistanceSq <= 0.0001f)
+ continue;
+
+ float targetInvLength = 1.0f / MathF.Sqrt(targetDistanceSq);
+
+ fromTargetToLight.X *= targetInvLength;
+ fromTargetToLight.Y *= targetInvLength;
+ fromTargetToLight.Z *= targetInvLength;
+
+ float targetDot = targetForward.X * fromTargetToLight.X +
+ targetForward.Y * fromTargetToLight.Y +
+ targetForward.Z * fromTargetToLight.Z;
+
+ if (targetDot < minDot)
+ continue;
+
+ BlindPlayers(targetPawn, blindDuration, blindAlpha);
+ }
+ }
+
+ private static void BlindPlayers(CCSPlayerPawn pawn, float blindDuration, float blindAlpha)
+ {
+ var rng = jRandomSkills.Instance.Random;
+ float now = Server.CurrentTime;
+
+ bool alreadyBlinded = pawn.BlindUntilTime > now;
+
+ if (!alreadyBlinded)
+ pawn.BlindStartTime = now;
+
+ pawn.BlindUntilTime = now + blindDuration;
+
+ pawn.FlashDuration = blindDuration + (float)rng.NextDouble() * 0.05f;
+ pawn.FlashMaxAlpha = blindAlpha + (float)rng.NextDouble() * 0.5f;
+
+ Utilities.SetStateChanged(pawn, "CCSPlayerPawnBase", "m_flFlashDuration");
+ Utilities.SetStateChanged(pawn, "CCSPlayerPawnBase", "m_flFlashMaxAlpha");
+ }
+
+ private static (bool, bool) ArePlayersSpottedBothWays(CCSPlayerController player, CCSPlayerPawn playerPawn, CCSPlayerController enemy, CCSPlayerPawn enemyPawn)
+ {
+ int playerSlot = player.Slot;
+ int enemySlot = enemy.Slot;
+
+ if (playerSlot < 0 || enemySlot < 0)
+ return (false, false);
+
+ int playerBit = playerSlot % 32;
+ int enemyBit = enemySlot % 32;
+
+ uint playerMask = 1u << playerBit;
+ uint enemyMask = 1u << enemyBit;
+
+ bool playerSeesEnemy = (enemyPawn.EntitySpottedState.SpottedByMask[0] & playerMask) != 0;
+ bool enemySeesPlayer = (playerPawn.EntitySpottedState.SpottedByMask[0] & enemyMask) != 0;
+
+ return (playerSeesEnemy, enemySeesPlayer);
+ }
+
+ private static void RemovePlayerLight(uint playerIndex)
+ {
+ if (SkillPlayerInfo.TryGetValue(playerIndex, out var info) && info.LightEntityIndex != 0)
+ {
+ EntityManager.DestroyEntity(info.LightEntityIndex);
+ info.LightEntityIndex = 0;
+ info.IsActive = false;
+ }
+ }
+
+ private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo)
+ {
+ float cooldown = 0;
+
+ float time = (float)Math.Ceiling((skillInfo.Cooldown.AddSeconds(SkillsInfo.GetValue(skillName, "cooldown")) - DateTime.Now).TotalSeconds);
+ cooldown = Math.Max(time, 0);
+
+ if (cooldown == 0 && !skillInfo.CanUse)
+ skillInfo.CanUse = true;
+
+ var playerInfo = PlayerManager.GetPlayerByIndex(player.Index);
+
+ if (playerInfo == null)
+ return;
+
+ if (cooldown == 0)
+ playerInfo.PrintHTML = null;
+ else
+ playerInfo.PrintHTML = $"{player.GetTranslation("hud_info", $"{cooldown}")}";
+ }
+
+ private static void ClearAllEntities()
+ {
+ foreach (var key in SkillPlayerInfo.Keys)
+ RemovePlayerLight(key);
+ }
+
+ public class SkillConfig(
+ Skills skill = skillName,
+ bool active = true,
+ string color = "#a3000b",
+ CsTeam onlyTeam = CsTeam.None,
+ bool disableOnFreezeTime = true,
+ bool needsTeammates = false,
+ string requiredPermission = "",
+ float? hudDuration = null,
+ float? descriptionHudDuration = null,
+ int maxPerServer = 2,
+ Rarity rarity = Rarity.Legendary,
+ float cooldown = 2f,
+ int colorR = 255,
+ int colorG = 255,
+ int colorB = 255,
+ float brightness = 1.5f,
+ float range = 1200.0f,
+ float blindDuration = 5f,
+ float blindAngle = 10.0f,
+ float blindAlpha = 200
+ ) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
+ {
+ public float Cooldown { get; set; } = cooldown;
+ public int ColorR { get; set; } = colorR;
+ public int ColorG { get; set; } = colorG;
+ public int ColorB { get; set; } = colorB;
+ public float Brightness { get; set; } = brightness;
+ public float Range { get; set; } = range;
+ public float BlindDuration { get; set; } = blindDuration;
+ public float BlindAlpha { get; set; } = blindAlpha;
+ public float BlindAngle { get; set; } = blindAngle;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/HealingChicken.cs b/jRandomSkills - SRC Files/src/player/skills/HealingChicken.cs
new file mode 100644
index 0000000..cd10384
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/HealingChicken.cs
@@ -0,0 +1,167 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
+using src.utils;
+using System.Collections.Concurrent;
+using System.Drawing;
+
+namespace src.player.skills
+{
+ public class HealingChicken : ISkill
+ {
+ private const Skills skillName = Skills.HealingChicken;
+
+ private class ChickenState
+ {
+ public CChicken? Chicken { get; set; }
+ public Vector? LastOrigin { get; set; }
+ public int TickCounter { get; set; }
+ }
+
+ private static readonly ConcurrentDictionary> activeChickens = new();
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color"));
+ }
+
+ public static void NewRound()
+ {
+ activeChickens.Clear();
+ }
+
+ public static void EnableSkill(CCSPlayerController player)
+ {
+ SpawnChicken(player);
+ }
+
+ public static void DisableSkill(CCSPlayerController player)
+ {
+ if (activeChickens.TryRemove(player.Index, out var chickens))
+ foreach (var state in chickens)
+ if (state.Chicken != null && state.Chicken.IsValid)
+ state.Chicken.Remove();
+ }
+
+ private static void SpawnChicken(CCSPlayerController player)
+ {
+ if (player == null || !player.IsValid) return;
+
+ var pawn = player.PlayerPawn.Value;
+ if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return;
+
+ int amount = SkillsInfo.GetValue(skillName, "amount");
+ var list = new List();
+
+ for (int i = 0; i < amount; i++)
+ {
+ CChicken? chicken = EntityManager.CreateTrackedChicken(player.Index);
+ if (chicken == null || !chicken.IsValid) continue;
+
+ chicken.Render = Color.LightGreen;
+
+ Vector offset = new(
+ (float)(100 * Math.Cos(2 * Math.PI * i / amount)),
+ (float)(100 * Math.Sin(2 * Math.PI * i / amount)),
+ 0
+ );
+
+ chicken.Teleport(new Vector(pawn.AbsOrigin.X + offset.X, pawn.AbsOrigin.Y + offset.Y, pawn.AbsOrigin.Z + offset.Z));
+ chicken.Leader.Raw = pawn.Index;
+
+ list.Add(new ChickenState { Chicken = chicken, LastOrigin = null, TickCounter = 0 });
+ }
+
+ activeChickens[player.Index] = list;
+ }
+
+ public static void OnTick()
+ {
+ int tickCooldown = SkillsInfo.GetValue(skillName, "tickCooldown");
+ if (Server.TickCount % tickCooldown == 0) return;
+
+ var players = PlayerManager.GetTickPlayers().ToArray();
+ int healAmount = SkillsInfo.GetValue(skillName, "heal");
+ float healRadius = SkillsInfo.GetValue(skillName, "healRadius");
+
+ foreach (var player in players)
+ {
+ if (player == null || !player.IsValid) continue;
+
+ var playerInfo = PlayerManager.GetPlayerByIndex(player.Index);
+ if (playerInfo?.Skill != skillName) continue;
+
+ var pawn = player.PlayerPawn.Value;
+ if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue;
+
+ if (!activeChickens.TryGetValue(player.Index, out var chickens)) continue;
+
+ for (int i = chickens.Count - 1; i >= 0; i--)
+ {
+ var state = chickens[i];
+ if (state.Chicken == null || !state.Chicken.IsValid || state.Chicken.AbsOrigin == null)
+ {
+ chickens.RemoveAt(i);
+ continue;
+ }
+
+ var chicken = state.Chicken;
+
+ if (chicken.Leader.Raw != player.Pawn.Raw)
+ chicken.Leader.Raw = player.Pawn.Raw;
+
+ Vector currentOrigin = new(chicken.AbsOrigin.X, chicken.AbsOrigin.Y, chicken.AbsOrigin.Z);
+
+ if (state.LastOrigin != null)
+ {
+ float dx = currentOrigin.X - state.LastOrigin.X;
+ float dy = currentOrigin.Y - state.LastOrigin.Y;
+ float dist2D = MathF.Sqrt(dx * dx + dy * dy);
+
+ if (dist2D > 0.05f && dist2D < 20.0f)
+ {
+ float boostFactor = 2.5f;
+ Vector newPos = new(
+ currentOrigin.X + (dx * boostFactor),
+ currentOrigin.Y + (dy * boostFactor),
+ currentOrigin.Z
+ );
+
+ chicken.Teleport(newPos, chicken.AbsRotation, chicken.AbsVelocity);
+ state.LastOrigin = newPos;
+ }
+ else
+ state.LastOrigin = currentOrigin;
+ }
+ else
+ state.LastOrigin = currentOrigin;
+
+ float pdx = pawn.AbsOrigin.X - state.LastOrigin.X;
+ float pdy = pawn.AbsOrigin.Y - state.LastOrigin.Y;
+ float pdz = pawn.AbsOrigin.Z - state.LastOrigin.Z;
+ float distToPlayer = MathF.Sqrt(pdx * pdx + pdy * pdy + pdz * pdz);
+
+ if (distToPlayer <= healRadius)
+ {
+ state.TickCounter++;
+ if (state.TickCounter >= tickCooldown)
+ {
+ SkillUtils.AddHealth(pawn, healAmount);
+ state.TickCounter = 0;
+ }
+ }
+ else
+ state.TickCounter = 0;
+ }
+ }
+ }
+
+ public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#b5ab8f", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = 1, Rarity rarity = Rarity.Legendary, int amount = 3, int heal = 2, int tickCooldown = 16, float healRadius = 150.0f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
+ {
+ public int Amount { get; set; } = amount;
+ public int Heal { get; set; } = heal;
+ public int TickCooldown { get; set; } = tickCooldown;
+ public float HealRadius { get; set; } = healRadius;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/HotBomb.cs b/jRandomSkills - SRC Files/src/player/skills/HotBomb.cs
index 1ca4069..0f984d4 100644
--- a/jRandomSkills - SRC Files/src/player/skills/HotBomb.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/HotBomb.cs
@@ -2,6 +2,7 @@ using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Commands.Targeting;
using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
using src.utils;
using System.Collections.Concurrent;
using System.Drawing;
@@ -39,7 +40,7 @@ namespace src.player.skills
bool hasC4 = pawn.WeaponServices.MyWeapons.Any(w => w.Value?.DesignerName == "weapon_c4");
if (!hasC4) continue;
- SkillUtils.TakeHealth(pawn, damage, owner, "planted_c4");
+ SkillUtils.TakeHealth(pawn, damage, owner, KillfeedIcons.C4);
playerEvent?.ExecuteClientCommand($"play player/player_damagebody_0{jRandomSkills.Instance.Random.Next(4, 8)}");
}
}
diff --git a/jRandomSkills - SRC Files/src/player/skills/Iana.cs b/jRandomSkills - SRC Files/src/player/skills/Iana.cs
index ae7d758..52ce05d 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Iana.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Iana.cs
@@ -3,6 +3,7 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Timers;
using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
using src.utils;
using System.Collections.Concurrent;
using Timer = CounterStrikeSharp.API.Modules.Timers.Timer;
@@ -353,7 +354,10 @@ namespace src.player.skills
var playerPawn = player.PlayerPawn.Value;
if (playerPawn != null)
- SkillUtils.TakeHealth(playerPawn, (int)dealDamage, GetShooter(param2), param2.Ability?.Value?.DesignerName);
+ {
+ KillfeedIcons? killfeed = KillfeedIconsExtensions.FromWeaponName(param2.Ability?.Value?.DesignerName);
+ SkillUtils.TakeHealth(playerPawn, (int)dealDamage, GetShooter(param2), killfeed ?? KillfeedIcons.Leg);
+ }
}
}
diff --git a/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs b/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs
index c541ce8..23ded08 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Illusionist.cs
@@ -1,11 +1,12 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
-using CounterStrikeSharp.API.Modules.Utils;
-using static src.jRandomSkills;
-using System.Collections.Concurrent;
-using src.utils;
using CounterStrikeSharp.API.Modules.Timers;
+using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
+using src.utils;
+using System.Collections.Concurrent;
+using static src.jRandomSkills;
using Timer = CounterStrikeSharp.API.Modules.Timers.Timer;
namespace src.player.skills
@@ -209,7 +210,7 @@ namespace src.player.skills
var attackerTeam = attackerPawn.TeamNum;
var replicaTeam = replica.Globalname.EndsWith("CT") ? 3 : 2;
- SkillUtils.TakeHealth(attackerPawn, attackerTeam != replicaTeam ? SkillsInfo.GetValue(skillName, "EnemyTeamDamage") : SkillsInfo.GetValue(skillName, "YourTeamDamage"), owner, "planted_c4");
+ SkillUtils.TakeHealth(attackerPawn, attackerTeam != replicaTeam ? SkillsInfo.GetValue(skillName, "EnemyTeamDamage") : SkillsInfo.GetValue(skillName, "YourTeamDamage"), owner, KillfeedIcons.Player);
}
private static CCSPlayerController? GetReplicaOwner(uint replicaIndex)
diff --git a/jRandomSkills - SRC Files/src/player/skills/JetKick.cs b/jRandomSkills - SRC Files/src/player/skills/JetKick.cs
new file mode 100644
index 0000000..e8f351c
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/JetKick.cs
@@ -0,0 +1,166 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
+using src.utils;
+using System.Collections.Concurrent;
+
+namespace src.player.skills
+{
+ public class JetKick : ISkill
+ {
+ private const Skills skillName = Skills.JetKick;
+ private static readonly ConcurrentDictionary targetedPlayers = [];
+ private static readonly ConcurrentDictionary playersToTarget = [];
+ private static readonly object setLock = new();
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color"));
+ }
+
+ public static void NewRound()
+ {
+ lock (setLock)
+ {
+ foreach (var player in PlayerManager.GetTickPlayers())
+ {
+ DisableSkill(player);
+ SkillUtils.CloseMenu(player);
+ }
+
+ targetedPlayers.Clear();
+ playersToTarget.Clear();
+ }
+ }
+
+ public static void OnTick()
+ {
+ if (Server.TickCount % 32 != 0) return;
+ foreach (var player in PlayerManager.GetTickPlayers())
+ {
+ var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
+
+ if (playerInfo == null || playerInfo.Skill != skillName) continue;
+ if (!SkillUtils.HasMenu(player)) continue;
+
+ var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
+
+ ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString())));
+ SkillUtils.UpdateMenu(player, menuItems);
+ }
+ }
+
+ public static void TypeSkill(CCSPlayerController player, string[] commands)
+ {
+ if (player == null || !player.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return;
+ var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
+ if (playerInfo?.Skill != skillName) return;
+
+ var playerEvent = PlayerManager.GetPlayerFromEvent(player);
+ if (playerEvent == null || !playerEvent.IsValid) return;
+
+ if (playerInfo.SkillUsed)
+ {
+ playerEvent.PrintToChat($" {ChatColors.Red}{playerEvent.GetTranslation("areareaper_used_info")}");
+ return;
+ }
+
+ string enemyId = commands[0];
+
+ if (!uint.TryParse(enemyId, out uint enemyIndex))
+ {
+ playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index"));
+ return;
+ }
+
+ var enemy = Utilities.GetPlayerFromIndex((int)enemyIndex);
+
+ if (enemy == null)
+ {
+ playerEvent.PrintToChat($" {ChatColors.Red}" + playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index"));
+ return;
+ }
+
+ targetedPlayers.TryAdd(enemy.Index, 0);
+ playersToTarget[player.Index] = enemy.Index;
+
+ var enemyEvent = PlayerManager.GetPlayerFromEvent(enemy);
+ if (enemyEvent == null || !enemyEvent.IsValid) return;
+
+ playerInfo.SkillUsed = true;
+
+ playerEvent.PrintToChat($" {ChatColors.Green}" + playerEvent.GetTranslation("jetkick_player_info", enemy.PlayerName));
+ enemyEvent.PrintToChat($" {ChatColors.Red}" + enemyEvent.GetTranslation("jetkick_enemy_info"));
+ }
+
+ public static void EnableSkill(CCSPlayerController player)
+ {
+ var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
+ if (playerInfo == null) return;
+ playerInfo.SkillUsed = false;
+
+ var playerEvent = PlayerManager.GetPlayerFromEvent(player);
+ if (playerEvent == null || !playerEvent.IsValid) return;
+
+ var enemies = PlayerManager.GetTickPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
+
+ if (enemies.Length > 0)
+ {
+ ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => (e.PlayerName, e.Index.ToString())));
+ SkillUtils.CreateMenu(player, menuItems);
+ }
+ else
+ playerEvent.PrintToChat($" {ChatColors.Red}{playerEvent.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
+ }
+
+ public static void DisableSkill(CCSPlayerController player)
+ {
+ if (playersToTarget.TryRemove(player.Index, out uint targetIndex))
+ {
+ var target = PlayerManager.GetPlayerFromEvent(Utilities.GetPlayerFromIndex((int)targetIndex));
+ if (target != null && target.IsValid)
+ {
+ if (target.PawnIsAlive && !SkillUtils.IsFreezeTime())
+ target.PrintToChat($" {ChatColors.Green}" + target.GetTranslation("jetkick_disable_info"));
+ }
+ targetedPlayers.TryRemove(targetIndex, out _);
+ }
+
+ SkillUtils.CloseMenu(player);
+ }
+
+ public static void PlayerDeath(EventPlayerDeath @event)
+ {
+ var player = @event.Userid;
+ if (player == null || !player.IsValid) return;
+
+ targetedPlayers.TryRemove(player.Index, out _);
+ SkillUtils.CloseMenu(player);
+ }
+
+ public static void WeaponFire(EventWeaponFire @event)
+ {
+ var player = PlayerManager.GetPlayerEvent(@event.Userid);
+ if (player == null || !player.IsValid) return;
+
+ if (!targetedPlayers.ContainsKey(player.Index)) return;
+ if (!SkillUtils.FiresBullets(@event.Weapon)) return;
+
+ PushPlayer(player);
+ }
+
+ private static void PushPlayer(CCSPlayerController player)
+ {
+ var playerPawn = player.PlayerPawn.Value;
+ if (playerPawn == null || !playerPawn.IsValid || playerPawn.Health <= 0) return;
+
+ Vector newVelocity = -SkillUtils.GetForwardVector(playerPawn.V_angle) * SkillsInfo.GetValue(skillName, "pushVelocity");
+ playerPawn.Teleport(null, null, newVelocity);
+ }
+
+ public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#5a4fd1", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, float pushVelocity = 400f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
+ {
+ public float PushVelocity { get; set; } = pushVelocity;
+ }
+ }
+}
diff --git a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs
index 44cf795..926b3b2 100644
--- a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs
@@ -2,6 +2,7 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Cvars;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
using src.utils;
using System.Collections.Concurrent;
using static src.jRandomSkills;
@@ -30,7 +31,7 @@ namespace src.player.skills
if (!SkillsInfo.GetValue(skillName, "friendlyFire") && player!.Team == attacker!.Team) return;
if (attackerInfo?.Skill == skillName && playerInfo?.Skill != Skills.AntyFlash && player!.PlayerPawn.Value!.FlashDuration >= SkillsInfo.GetValue(skillName, "flashDuration"))
- SkillUtils.TakeHealth(player.PlayerPawn.Value, 9999, attacker, "weapon_flashbang");
+ SkillUtils.TakeHealth(player.PlayerPawn.Value, 9999, attacker, KillfeedIcons.Flashbang);
}
public static void GrenadeThrown(EventGrenadeThrown @event)
diff --git a/jRandomSkills - SRC Files/src/player/skills/LastGasp.cs b/jRandomSkills - SRC Files/src/player/skills/LastGasp.cs
new file mode 100644
index 0000000..8baa7dd
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/LastGasp.cs
@@ -0,0 +1,58 @@
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
+using src.utils;
+using static System.Net.Mime.MediaTypeNames;
+
+namespace src.player.skills
+{
+ public class LastGasp : ISkill
+ {
+ private const Skills skillName = Skills.LastGasp;
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color"));
+ }
+
+ public static void PlayerDeath(EventPlayerDeath @event)
+ {
+ var victim = PlayerManager.GetPlayerEvent(@event.Userid);
+ var attacker = PlayerManager.GetPlayerEvent(@event.Attacker);
+
+ if (victim == null || !victim.IsValid || attacker == null || !attacker.IsValid)
+ return;
+
+ var victimPawn = victim.PlayerPawn?.Value;
+ var attackerPawn = attacker.PlayerPawn?.Value;
+
+ if (victimPawn == null || !victimPawn.IsValid || attackerPawn == null || !attackerPawn.IsValid)
+ return;
+
+ var victimInfo = PlayerManager.GetPlayerByIndex(victim!.Index);
+ if (victimInfo?.Skill != skillName)
+ return;
+
+ int damageAfterDeath = SkillsInfo.GetValue(skillName, "DamageAfterDeath");
+ bool canKill = SkillsInfo.GetValue(skillName, "CanKill");
+
+ if (!canKill)
+ {
+ int newHealth = (int)(attackerPawn.Health - damageAfterDeath);
+ if (newHealth <= 0)
+ damageAfterDeath = damageAfterDeath - 1 + newHealth;
+
+ }
+
+ SkillUtils.TakeHealth(attackerPawn, damageAfterDeath, victim, KillfeedIcons.Fist);
+ PlayerManager.GetPlayerFromEvent(attacker)?.ExecuteClientCommand($"play player/player_damagebody_0{jRandomSkills.Instance.Random.Next(4, 8)}");
+ }
+
+ public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#88bdba", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Rare, int damageAfterDeath = 30, bool canKill = true) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
+ {
+ public int DamageAfterDeath { get; set; } = damageAfterDeath;
+ public bool CanKill { get; set; } = canKill;
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs b/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs
index 32d128f..5c04b36 100644
--- a/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs
@@ -2,6 +2,7 @@ using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
using src.utils;
using System.Collections.Concurrent;
using static src.jRandomSkills;
@@ -76,7 +77,8 @@ namespace src.player.skills
var playerInfo = PlayerManager.GetPlayerByIndex(eventPlayer.Index);
if (playerInfo == null || playerInfo.Skill != skillName) return HookResult.Continue;
- KnifeHit(eventPlayer, true);
+ KillfeedIcons? killfeedIcon = KillfeedIconsExtensions.FromWeapon(weapon);
+ KnifeHit(eventPlayer, true, killfeedIcon);
return HookResult.Continue;
}
@@ -94,10 +96,11 @@ namespace src.player.skills
var activeWeapon = pawn.WeaponServices.ActiveWeapon.Value;
if (activeWeapon == null || !activeWeapon.IsValid || (activeWeapon.DesignerName != "weapon_knife" && activeWeapon.DesignerName != "weapon_bayonet")) return;
- KnifeHit(player, false);
+ KillfeedIcons? killfeedIcon = KillfeedIconsExtensions.FromWeapon(activeWeapon);
+ KnifeHit(player, false, killfeedIcon);
}
- private unsafe static void KnifeHit(CCSPlayerController player, bool heavyHit)
+ private unsafe static void KnifeHit(CCSPlayerController player, bool heavyHit, KillfeedIcons? killfeedIcon)
{
var pawn = player!.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null)
@@ -119,7 +122,7 @@ namespace src.player.skills
if (!SkillsInfo.GetValue(skillName, "friendlyFire") && player.Team == target.Team) return;
target.PlayerPawn.Value.EmitSound("Player.DamageBody.Onlooker");
- SkillUtils.TakeHealth(target.PlayerPawn.Value, heavyHit ? Instance.Random.Next(45, 55) : Instance.Random.Next(21, 34), player, "weapon_knife");
+ SkillUtils.TakeHealth(target.PlayerPawn.Value, heavyHit ? Instance.Random.Next(45, 55) : Instance.Random.Next(21, 34), player, killfeedIcon ?? KillfeedIcons.Knife);
}
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#c9f8ff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, float maxDistance = 4096f, bool friendlyFire = true) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
diff --git a/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs b/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs
index 77b26d0..60f1efb 100644
--- a/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs
@@ -1,6 +1,7 @@
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
using src.utils;
using static src.jRandomSkills;
@@ -39,7 +40,7 @@ namespace src.player.skills
if (target.Handle == player.Handle) return;
if (!SkillsInfo.GetValue(skillName, "friendlyFire") && player.Team == target.Team) return;
- SkillUtils.TakeHealth(target.PlayerPawn.Value, 9999, player, "weapon_taser");
+ SkillUtils.TakeHealth(target.PlayerPawn.Value, 9999, player, KillfeedIcons.Taser);
}
public static void EnableSkill(CCSPlayerController player)
diff --git a/jRandomSkills - SRC Files/src/player/skills/Poison.cs b/jRandomSkills - SRC Files/src/player/skills/Poison.cs
index c7b8e8c..fc433f2 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Poison.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Poison.cs
@@ -1,8 +1,9 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
-using System.Collections.Concurrent;
+using jRandomSkills.src.utils;
using src.utils;
+using System.Collections.Concurrent;
namespace src.player.skills
{
@@ -65,7 +66,7 @@ namespace src.player.skills
if (pawn.Health <= SkillsInfo.GetValue(skillName, "MinHealth")) continue;
- SkillUtils.TakeHealth(pawn, SkillsInfo.GetValue(skillName, "Damage"), GetSkillOwner(playerIndex), "planted_c4");
+ SkillUtils.TakeHealth(pawn, SkillsInfo.GetValue(skillName, "Damage"), GetSkillOwner(playerIndex), KillfeedIcons.Spray);
if (Server.TickCount % cooldown2 == 0)
PlayerManager.GetPlayerFromEvent(player)?.ExecuteClientCommand($"play player/player_damagebody_0{jRandomSkills.Instance.Random.Next(4, 8)}");
diff --git a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs
index d0b6e9c..d4185cd 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Replicator.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Replicator.cs
@@ -2,10 +2,9 @@ using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils;
-using static src.jRandomSkills;
-using System.Collections.Concurrent;
+using jRandomSkills.src.utils;
using src.utils;
-using CounterStrikeSharp.API.Modules.Memory;
+using System.Collections.Concurrent;
namespace src.player.skills
{
@@ -62,7 +61,7 @@ namespace src.player.skills
public static void DisableSkill(CCSPlayerController player)
{
- if (player == null) return;
+ if (player == null || !player.IsValid) return;
SkillPlayerInfo.TryRemove(player.Index, out _);
EntityManager.DestroyPlayerEntities(player.Index);
SkillUtils.ResetPrintHTML(player);
@@ -164,7 +163,7 @@ namespace src.player.skills
var attackerTeam = attackerPawn.TeamNum;
var replicaTeam = replica.Globalname.EndsWith("CT") ? 3 : 2;
- SkillUtils.TakeHealth(attackerPawn, attackerTeam != replicaTeam ? SkillsInfo.GetValue(skillName, "EnemyTeamDamage") : SkillsInfo.GetValue(skillName, "YourTeamDamage"), owner, "planted_c4");
+ SkillUtils.TakeHealth(attackerPawn, attackerTeam != replicaTeam ? SkillsInfo.GetValue(skillName, "EnemyTeamDamage") : SkillsInfo.GetValue(skillName, "YourTeamDamage"), owner, KillfeedIcons.Player);
}
private static CCSPlayerController? GetReplicaOwner(uint replicaIndex)
diff --git a/jRandomSkills - SRC Files/src/player/skills/TakeAmmo.cs b/jRandomSkills - SRC Files/src/player/skills/TakeAmmo.cs
new file mode 100644
index 0000000..3c84c0e
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/TakeAmmo.cs
@@ -0,0 +1,300 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Memory;
+using CounterStrikeSharp.API.Modules.Utils;
+using src.utils;
+using System.Collections.Concurrent;
+using static src.jRandomSkills;
+
+namespace src.player.skills
+{
+ public class TakeAmmo : ISkill
+ {
+ private const Skills skillName = Skills.TakeAmmo;
+ private static readonly ConcurrentDictionary SkillPlayerInfo = [];
+ private static readonly object setLock = new();
+ private static readonly ConcurrentDictionary OriginalWeaponMaxAmmo = new();
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color"));
+ }
+
+ public static void NewRound()
+ {
+ lock (setLock)
+ {
+ SkillPlayerInfo.Clear();
+ }
+
+ foreach (var kvp in OriginalWeaponMaxAmmo)
+ {
+ var vdata = VirtualFunctions.GetCSWeaponDataFromKey(-1, kvp.Value.Item2);
+ if (vdata != null)
+ vdata.PrimaryReserveAmmoMax = kvp.Value.Item1;
+ }
+ OriginalWeaponMaxAmmo.Clear();
+ }
+
+ public static void EnableSkill(CCSPlayerController player)
+ {
+ SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo
+ {
+ SteamID = player.Index,
+ CanUse = true,
+ Cooldown = DateTime.MinValue,
+ LastClick = DateTime.MinValue,
+ FindedEnemy = true,
+ EnemyHaveAmmo = true,
+ MaxWeaponAmmo = new ConcurrentDictionary()
+ });
+ }
+
+ public static void DisableSkill(CCSPlayerController player)
+ {
+ if (SkillPlayerInfo.TryRemove(player.Index, out var _))
+ SkillUtils.ResetPrintHTML(player);
+
+ var weaponServices = player.PlayerPawn?.Value?.WeaponServices;
+ if (weaponServices == null) return;
+
+ foreach (var _weapon in weaponServices.MyWeapons.ToArray())
+ {
+ if (_weapon == null || !_weapon.IsValid) continue;
+
+ var weapon = _weapon?.Value;
+ if (weapon == null || string.IsNullOrEmpty(weapon.DesignerName)) continue;
+
+ OriginalWeaponMaxAmmo.TryGetValue(weapon.DesignerName, out var items);
+
+ weapon.ReserveAmmo.Fill(items.Item1);
+ Utilities.SetStateChanged(weapon, "CBasePlayerWeapon", "m_pReserveAmmo");
+ }
+ }
+
+ public static void OnTick()
+ {
+ var players = PlayerManager.GetTickPlayers().ToArray();
+ foreach (var player in players)
+ {
+ var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
+ if (playerInfo?.Skill != skillName) continue;
+
+ if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo))
+ {
+ bool recentClick = skillInfo.LastClick.AddSeconds(4) >= DateTime.Now;
+ UpdateHUD(player, skillInfo, recentClick);
+ }
+ }
+ }
+
+ private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo, bool showInfo)
+ {
+ float cooldown = 0;
+ if (skillInfo != null)
+ {
+ float time = (int)Math.Ceiling((skillInfo.Cooldown.AddSeconds(SkillsInfo.GetValue(skillName, "cooldown")) - DateTime.Now).TotalSeconds);
+ cooldown = Math.Max(time, 0);
+
+ if (cooldown == 0 && skillInfo?.CanUse == false)
+ skillInfo.CanUse = true;
+ }
+
+ var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index);
+ if (playerInfo == null) return;
+
+ if (cooldown == 0)
+ {
+ if (showInfo)
+ playerInfo.PrintHTML =
+ skillInfo != null && !skillInfo.FindedEnemy
+ ? $"{player.GetTranslation("takeammo_hud_info1")}"
+ : skillInfo != null && !skillInfo.EnemyHaveAmmo ? $"{player.GetTranslation("takeammo_hud_info2")}" : null;
+ else
+ SkillUtils.ResetPrintHTML(player);
+ return;
+ }
+
+ playerInfo.PrintHTML = $"{player.GetTranslation("hud_info", $"{cooldown}")}";
+ }
+
+ public static void UseSkill(CCSPlayerController player)
+ {
+ var playerPawn = player.PlayerPawn.Value;
+ if (playerPawn?.CBodyComponent == null) return;
+
+ if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo))
+ {
+ if (!player.IsValid || playerPawn.Health <= 0) return;
+ if (skillInfo.CanUse)
+ {
+ CCSPlayerController? enemy = GetRandomEnemy(player);
+ if (enemy == null)
+ {
+ skillInfo.FindedEnemy = false;
+ skillInfo.LastClick = DateTime.Now;
+ return;
+ }
+
+ int playerMagazines = GetMagazinesCount(player);
+ int enemyMagazines = GetMagazinesCount(enemy);
+
+ if (enemyMagazines == 0)
+ {
+ skillInfo.FindedEnemy = true;
+ skillInfo.EnemyHaveAmmo = false;
+ skillInfo.LastClick = DateTime.Now;
+ return;
+ }
+
+ skillInfo.EnemyHaveAmmo = true;
+ skillInfo.FindedEnemy = true;
+ skillInfo.CanUse = false;
+ skillInfo.Cooldown = DateTime.Now;
+
+ Server.NextFrame(() =>
+ {
+ if (player == null || !player.IsValid) return;
+ if (enemy == null || !enemy.IsValid) return;
+
+ SetMagazines(player, playerMagazines + enemyMagazines);
+ SetMagazines(enemy, 0);
+
+ PlayerManager.GetPlayerFromEvent(enemy)?.ExecuteClientCommand($"play sounds/weapons/g3sg1/g3sg1_clipout");
+
+ var enemyEvent = PlayerManager.GetPlayerFromEvent(enemy);
+ if (enemyEvent == null || !enemyEvent.IsValid) return;
+ enemyEvent.PrintToChat($" {ChatColors.Red}" + enemyEvent.GetTranslation("takeammo_enemy_info"));
+ });
+ }
+ else
+ skillInfo.LastClick = DateTime.Now;
+ }
+ }
+
+ private static int GetMagazinesCount(CCSPlayerController player)
+ {
+ var pawn = player.PlayerPawn.Value;
+ if (pawn == null || !pawn.IsValid || pawn.Health <= 0) return 0;
+
+ var ws = pawn.WeaponServices;
+ if (ws == null) return 0;
+
+ var activeWeapon = ws.ActiveWeapon?.Value;
+ if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.VData == null || string.IsNullOrEmpty(activeWeapon.DesignerName)) return 0;
+
+ if (activeWeapon.VData.PrimaryAmmoType == 7 && activeWeapon.ReserveAmmo.Length >= 1)
+ return (int)(activeWeapon.ReserveAmmo[0] / activeWeapon.VData.MaxClip1);
+
+ int magazines = activeWeapon.VData.ReserveAmmoAsClips && activeWeapon.ReserveAmmo.Length >= 1 ? activeWeapon.ReserveAmmo[0] : 0;
+ return magazines;
+ }
+
+ private static void SetMagazines(CCSPlayerController player, int magazines)
+ {
+ var pawn = player.PlayerPawn.Value;
+ if (pawn == null || !pawn.IsValid || pawn.Health <= 0) return;
+
+ var ws = pawn.WeaponServices;
+ if (ws == null) return;
+
+ var activeWeapon = ws.ActiveWeapon?.Value;
+ if (activeWeapon == null || !activeWeapon.IsValid || activeWeapon.VData == null || string.IsNullOrEmpty(activeWeapon.DesignerName)) return;
+
+ if (activeWeapon.VData.PrimaryAmmoType == 7)
+ magazines = (int)(magazines * activeWeapon.VData.MaxClip1);
+
+ activeWeapon.ReserveAmmo.Fill(magazines);
+ Utilities.SetStateChanged(activeWeapon, "CBasePlayerWeapon", "m_pReserveAmmo");
+
+ string weaponName = activeWeapon.DesignerName;
+ string weaponIndex = activeWeapon.AttributeManager.Item.ItemDefinitionIndex.ToString();
+
+ if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo))
+ {
+ if (skillInfo.MaxWeaponAmmo.TryGetValue(weaponName, out int currentMax))
+ skillInfo.MaxWeaponAmmo[weaponName] = Math.Max(currentMax, magazines);
+ else
+ skillInfo.MaxWeaponAmmo.TryAdd(weaponName, magazines);
+ }
+
+ var vdata = VirtualFunctions.GetCSWeaponDataFromKey(-1, weaponIndex);
+ if (vdata == null) return;
+
+ if (!OriginalWeaponMaxAmmo.ContainsKey(weaponName))
+ OriginalWeaponMaxAmmo.TryAdd(weaponName, (vdata.PrimaryReserveAmmoMax, weaponIndex));
+
+ vdata.PrimaryReserveAmmoMax = Math.Max(vdata.PrimaryReserveAmmoMax, magazines);
+ }
+
+ public static void WeaponEquip(EventItemEquip @event)
+ {
+ var player = @event.Userid;
+ if (player == null || !player.IsValid) return;
+
+ string weaponName = @event.Item;
+ if (string.IsNullOrEmpty(weaponName)) return;
+
+ if (OriginalWeaponMaxAmmo.TryGetValue("weapon_" + weaponName, out var items))
+ {
+ var pawn = player.PlayerPawn?.Value;
+ if (pawn == null) return;
+
+ var ws = pawn.WeaponServices;
+ if (ws == null) return;
+
+ var activeWeapon = ws.ActiveWeapon?.Value;
+ if (activeWeapon == null || !activeWeapon.IsValid || string.IsNullOrEmpty(activeWeapon.DesignerName)) return;
+
+ int ammoLimit = items.Item1;
+
+ if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo))
+ {
+ if (skillInfo.MaxWeaponAmmo.TryGetValue("weapon_" + weaponName, out int personalMax))
+ ammoLimit = Math.Max(ammoLimit, personalMax);
+ }
+
+ if (activeWeapon.ReserveAmmo.Length > 0 && activeWeapon.ReserveAmmo[0] > ammoLimit)
+ {
+ activeWeapon.ReserveAmmo.Fill(ammoLimit);
+ Utilities.SetStateChanged(activeWeapon, "CBasePlayerWeapon", "m_pReserveAmmo");
+ }
+ }
+ }
+
+ private static CCSPlayerController? GetRandomEnemy(CCSPlayerController player)
+ {
+ CCSPlayerController[] enemies = [.. PlayerManager.GetTickPlayers().FindAll(e =>
+ e.Team != player.Team &&
+ e.PlayerPawn?.Value?.Health > 0 &&
+ e.PlayerPawn?.Value?.WeaponServices?.ActiveWeapon?.Value?.ReserveAmmo.Length > 0
+ )];
+ if (enemies.Length == 0) return null;
+ return enemies[Instance.Random.Next(enemies.Length)];
+ }
+
+ public class PlayerSkillInfo
+ {
+ public ulong SteamID { get; set; }
+ public bool CanUse { get; set; }
+ public DateTime Cooldown { get; set; }
+ public DateTime LastClick { get; set; }
+ public bool FindedEnemy { get; set; }
+ public bool EnemyHaveAmmo { get; set; }
+ public ConcurrentDictionary MaxWeaponAmmo { get; set; } = new();
+ }
+
+ public class WeaponInfo
+ {
+ public required string Name { get; set; }
+ public required int Clip1 { get; set; }
+ public required int Clip2 { get; set; }
+ public required int Reserve { get; set; }
+ }
+
+ public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#5eb8b0", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Common, float cooldown = 30f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
+ {
+ public float Cooldown { get; set; } = cooldown;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/TeamTeleport.cs b/jRandomSkills - SRC Files/src/player/skills/TeamTeleport.cs
new file mode 100644
index 0000000..c85fccc
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/player/skills/TeamTeleport.cs
@@ -0,0 +1,257 @@
+using CounterStrikeSharp.API;
+using CounterStrikeSharp.API.Core;
+using CounterStrikeSharp.API.Modules.Utils;
+using src.utils;
+using System.Collections.Concurrent;
+
+namespace src.player.skills
+{
+ public class TeamTeleport : ISkill
+ {
+ private const Skills skillName = Skills.TeamTeleport;
+ private static readonly ConcurrentDictionary SkillPlayerInfo = [];
+
+ public class PlayerSkillInfo
+ {
+ public ulong SteamID { get; set; }
+ public bool CanUse { get; set; }
+ public DateTime Cooldown { get; set; }
+ public string? TeamateName { get; set; }
+ public uint? TeamateIndex { get; set; }
+ public Vector? TeamatePosition { get; set; }
+ public int NoSpace { get; set; }
+ public int NoEnemy { get; set; }
+ }
+
+ public static void LoadSkill()
+ {
+ SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color"));
+ }
+
+ public static void NewRound()
+ {
+ SkillPlayerInfo.Clear();
+ }
+
+ public static void OnTick()
+ {
+ foreach (var player in PlayerManager.GetTickPlayers())
+ {
+ if (player == null || !player.IsValid) continue;
+
+ var playerInfo = PlayerManager.GetPlayerByIndex(player.Index);
+ if (playerInfo?.Skill != skillName) continue;
+
+ if (!SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) continue;
+
+ GetTeamate(player, skillInfo);
+ UpdateHUD(player, skillInfo);
+ }
+ }
+
+ public static void EnableSkill(CCSPlayerController player)
+ {
+ if (player == null || !player.IsValid) return;
+
+ SkillPlayerInfo.TryAdd(player.Index, new PlayerSkillInfo
+ {
+ SteamID = player.Index,
+ CanUse = true,
+ Cooldown = DateTime.MinValue,
+ TeamateName = null,
+ TeamateIndex = null,
+ TeamatePosition = null,
+ NoSpace = int.MinValue,
+ NoEnemy = int.MinValue
+ });
+ }
+
+ public static void DisableSkill(CCSPlayerController player)
+ {
+ if (player == null) return;
+ SkillPlayerInfo.TryRemove(player.Index, out _);
+ SkillUtils.ResetPrintHTML(player);
+ }
+
+ public static void UseSkill(CCSPlayerController player)
+ {
+ if (player == null || !player.IsValid) return;
+
+ var playerPawn = player.PlayerPawn?.Value;
+ if (playerPawn == null || !playerPawn.IsValid || playerPawn.Health <= 0) return;
+
+ if (!SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) return;
+ if (!skillInfo.CanUse) return;
+
+ skillInfo.NoEnemy = int.MinValue;
+ skillInfo.NoSpace = int.MinValue;
+
+ if (skillInfo.TeamateIndex == null || skillInfo.TeamatePosition == null)
+ {
+ skillInfo.NoEnemy = Server.TickCount + (64 * 2);
+ return;
+ }
+
+ var victim = PlayerManager.GetTickPlayers().FirstOrDefault(p => p.Index == skillInfo.TeamateIndex.Value);
+ if (victim == null || !victim.IsValid)
+ {
+ skillInfo.NoEnemy = Server.TickCount + (64 * 2);
+ return;
+ }
+
+ TeleportToTeamate(player, victim, skillInfo.TeamatePosition, skillInfo);
+ }
+
+ private static void GetTeamate(CCSPlayerController player, PlayerSkillInfo skillInfo)
+ {
+ var playerPawn = player.PlayerPawn?.Value;
+ if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null || playerPawn.V_angle == null || playerPawn.ViewOffset == null)
+ return;
+
+ Vector eyePos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + playerPawn.ViewOffset.Z);
+ Vector playerForward = SkillUtils.GetForwardVector(playerPawn.V_angle);
+
+ float teleportAngle = SkillsInfo.GetValue(skillName, "teleportAngle");
+ float minDot = MathF.Cos(teleportAngle * MathF.PI / 180.0f);
+
+ skillInfo.TeamateIndex = null;
+ skillInfo.TeamateName = null;
+ skillInfo.TeamatePosition = null;
+
+ foreach (var teammate in PlayerManager.GetTickPlayers())
+ {
+ if (teammate == null || !teammate.IsValid || teammate.Index == player.Index || teammate.Team != player.Team)
+ continue;
+
+ var teammatePawn = teammate.PlayerPawn?.Value;
+ if (teammatePawn == null || !teammatePawn.IsValid || teammatePawn.Health <= 0 || teammatePawn.AbsOrigin == null)
+ continue;
+
+ Vector targetPos = new(teammatePawn.AbsOrigin.X, teammatePawn.AbsOrigin.Y, teammatePawn.AbsOrigin.Z + (teammatePawn.ViewOffset.Z * 0.5f));
+ Vector toTarget = new(targetPos.X - eyePos.X, targetPos.Y - eyePos.Y, targetPos.Z - eyePos.Z);
+
+ float distanceSq = toTarget.X * toTarget.X + toTarget.Y * toTarget.Y + toTarget.Z * toTarget.Z;
+ if (distanceSq <= 0.0001f)
+ continue;
+
+ float distance = MathF.Sqrt(distanceSq);
+
+ float invLength = 1.0f / distance;
+
+ toTarget.X *= invLength;
+ toTarget.Y *= invLength;
+ toTarget.Z *= invLength;
+
+ float dot = playerForward.X * toTarget.X + playerForward.Y * toTarget.Y + playerForward.Z * toTarget.Z;
+
+ if (distance > 30.0f && dot < minDot)
+ continue;
+
+ skillInfo.TeamateIndex = teammate.Index;
+ skillInfo.TeamateName = teammate.PlayerName;
+ skillInfo.TeamatePosition = new Vector(teammatePawn.AbsOrigin.X, teammatePawn.AbsOrigin.Y, teammatePawn.AbsOrigin.Z);
+ }
+ }
+
+ private unsafe static bool CheckTeleport(CCSPlayerController attacker, CCSPlayerController victim, Vector startPos, Vector endPos, QAngle angle)
+ {
+ var attackerPawn = attacker.PlayerPawn.Value;
+ if (attackerPawn == null || !attackerPawn.IsValid) return false;
+
+ var victimPawn = victim.PlayerPawn.Value;
+ if (victimPawn == null || !victimPawn.IsValid) return false;
+
+ var result = RayTrace.TraceHullShape(
+ startPos,
+ endPos,
+ victim,
+ attackerPawn.Collision.Mins,
+ attackerPawn.Collision.Maxs,
+ null,
+ null,
+ angle
+ );
+
+ if (!result.HasValue)
+ return false;
+
+ return !result.Value.DidHit;
+ }
+
+ private static void TeleportToTeamate(CCSPlayerController player, CCSPlayerController victim, Vector position, PlayerSkillInfo skillInfo)
+ {
+ var playerPawn = player.PlayerPawn?.Value;
+ if (playerPawn == null || !playerPawn.IsValid || player.AbsRotation == null) return;
+
+ QAngle playerAngles = new(player.AbsRotation.X, player.AbsRotation.Y, player.AbsRotation.Z);
+ float distance = SkillsInfo.GetValue(skillName, "teleportDistance");
+
+ int[] angles = [0, 90, -90, 179];
+ bool teleported = false;
+
+ foreach (int extraAngle in angles)
+ {
+ QAngle targetAngle = new(0, playerAngles.Y + extraAngle, 0);
+ Vector direction = SkillUtils.GetForwardVector(targetAngle);
+
+ Vector targetPos = position - (direction * distance);
+ Vector traceStart = position - (direction * 20f);
+
+ if (CheckTeleport(player, victim, traceStart, targetPos, targetAngle))
+ {
+ playerPawn.Teleport(targetPos, targetAngle, Vector.Zero);
+ teleported = true;
+ break;
+ }
+ }
+
+ if (!teleported)
+ skillInfo.NoSpace = Server.TickCount + (64 * 2);
+ else
+ {
+ skillInfo.NoSpace = int.MinValue;
+ skillInfo.NoEnemy = int.MinValue;
+ skillInfo.CanUse = false;
+ skillInfo.Cooldown = DateTime.Now;
+ }
+ }
+
+ private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo)
+ {
+ float cooldown = 0;
+
+ float time = (float)Math.Ceiling((skillInfo.Cooldown.AddSeconds(SkillsInfo.GetValue(skillName, "cooldown")) - DateTime.Now).TotalSeconds);
+ cooldown = Math.Max(time, 0);
+
+ if (cooldown == 0 && !skillInfo.CanUse)
+ skillInfo.CanUse = true;
+
+ var playerInfo = PlayerManager.GetPlayerByIndex(player.Index);
+ if (playerInfo == null) return;
+
+ if (cooldown != 0)
+ playerInfo.PrintHTML = $"{player.GetTranslation("hud_info", $"{cooldown}")}";
+ else if (skillInfo.NoSpace >= Server.TickCount)
+ playerInfo.PrintHTML = $"{player.GetTranslation("shade_nospace")}";
+ else if (skillInfo.NoEnemy >= Server.TickCount)
+ playerInfo.PrintHTML = $"{player.GetTranslation("teamteleport_noenemy")}";
+ else
+ {
+ if (skillInfo.TeamateName == null)
+ playerInfo.PrintHTML = null;
+ else
+ {
+ string color = player.Team == CsTeam.Terrorist ? "#FFA500" : "#ADD8E6";
+ playerInfo.PrintHTML = $"{player.GetTranslation("teamteleport_hud_info", $"{System.Net.WebUtility.HtmlEncode(skillInfo.TeamateName)}")}";
+ }
+ }
+ }
+
+ public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#bcf542", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = true, bool needsTeammates = true, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = 2, Rarity rarity = Rarity.Common, float cooldown = 15f, float teleportAngle = 10.0f, float teleportDistance = 100f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
+ {
+ public float Cooldown { get; set; } = cooldown;
+ public float TeleportAngle { get; set; } = teleportAngle;
+ public float TeleportDistance { get; set; } = teleportDistance;
+ }
+ }
+}
\ No newline at end of file
diff --git a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs
index d9433b5..150e41e 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs
@@ -1,5 +1,6 @@
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
using src.utils;
namespace src.player.skills
@@ -38,7 +39,7 @@ namespace src.player.skills
int damage = (int)(@event.DmgHealth * SkillsInfo.GetValue(skillName, "healthTakenScale"));
damage = Math.Min(damage, SkillsInfo.GetValue(skillName, "maxTakenDamagePerShot"));
- SkillUtils.TakeHealth(attackerEvent.PlayerPawn.Value, damage, victimEvent, "planted_c4");
+ SkillUtils.TakeHealth(attackerEvent.PlayerPawn.Value, damage, victimEvent, KillfeedIcons.Armor);
attackerEvent.EmitSound("Player.DamageBody.Onlooker");
}
}
diff --git a/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs b/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs
index 59610a2..afb43ac 100644
--- a/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs
@@ -6,6 +6,7 @@ using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Timers;
using CounterStrikeSharp.API.Modules.UserMessages;
using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
using src.utils;
using System.Collections.Concurrent;
using System.Drawing;
@@ -360,7 +361,7 @@ namespace src.player.skills
if (CheckHasKnife(thrower!)) return;
- SkillUtils.TakeHealth(victimPawn, SkillsInfo.GetValue(skillName, "damage"), thrower, "weapon_knife");
+ SkillUtils.TakeHealth(victimPawn, SkillsInfo.GetValue(skillName, "damage"), thrower, KillfeedIcons.Knife);
}
}
diff --git a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs
index 4697a19..bf360b0 100644
--- a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs
@@ -2,6 +2,7 @@ using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils;
+using jRandomSkills.src.utils;
using src.utils;
using System.Collections.Concurrent;
@@ -95,7 +96,7 @@ namespace src.player.skills
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue;
if (SkillUtils.GetDistance(smoke.Key, pawn.AbsOrigin) <= smokeRadius)
- if (SkillUtils.TakeHealth(pawn, smokeDamage, thrower, "smokegrenade"))
+ if (SkillUtils.TakeHealth(pawn, smokeDamage, thrower, KillfeedIcons.Smokegrenade))
player.EmitSound("Player.DamageBody.Onlooker");
}
}
diff --git a/jRandomSkills - SRC Files/src/player/skills/Tripwire.cs b/jRandomSkills - SRC Files/src/player/skills/Tripwire.cs
index 0edd992..c901253 100644
--- a/jRandomSkills - SRC Files/src/player/skills/Tripwire.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/Tripwire.cs
@@ -314,7 +314,7 @@ namespace src.player.skills
public DateTime LastAttempt { get; set; }
}
- public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff3b3b", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Rare, float radarDuration = 5f, float triggerRadius = 24f, float wireHeight = 30f, float wireWidth = 1.5f, float maxWallDistance = 400f, float cooldown = 20f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
+ public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff3b3b", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float? hudDuration = null, float? descriptionHudDuration = null, int maxPerServer = -1, Rarity rarity = Rarity.Rare, float radarDuration = 5f, float triggerRadius = 24f, float wireHeight = 30f, float wireWidth = 0.7f, float maxWallDistance = 400f, float cooldown = 20f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, hudDuration, descriptionHudDuration, maxPerServer, rarity)
{
public float RadarDuration { get; set; } = radarDuration;
public float TriggerRadius { get; set; } = triggerRadius;
diff --git a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs
index 3637777..10633b2 100644
--- a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs
+++ b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs
@@ -195,7 +195,6 @@ namespace src.player.skills
itemServices.HasHelmet = gear.HasHelmet;
itemServices.HasDefuser = gear.HasDefuser;
- Utilities.SetStateChanged(pawn, "CCSPlayerPawn", "m_pItemServices");
}
private static (WeaponInfo[]?, bool) GetWeapons(CCSPlayerController player)
@@ -272,7 +271,7 @@ namespace src.player.skills
private static CCSPlayerController? GetRandomEnemy(CCSPlayerController player)
{
- CCSPlayerController[] enemies = [.. PlayerManager.GetTickPlayers().FindAll(e => e.Team != player.Team && e.PawnIsAlive)];
+ CCSPlayerController[] enemies = [.. PlayerManager.GetTickPlayers().FindAll(e => e.Team != player.Team && e.PlayerPawn?.Value?.Health > 0)];
if (enemies.Length == 0) return null;
return enemies[Instance.Random.Next(enemies.Length)];
}
diff --git a/jRandomSkills - SRC Files/src/utils/Config.cs b/jRandomSkills - SRC Files/src/utils/Config.cs
index 6f7acc4..57c4dbc 100644
--- a/jRandomSkills - SRC Files/src/utils/Config.cs
+++ b/jRandomSkills - SRC Files/src/utils/Config.cs
@@ -187,6 +187,7 @@ namespace src.utils
ChangeLanguageCommand = new NormalCommand("lang, language, changelang, change_lang, jezyk, język", ""),
ReloadCommand = new NormalCommand("reload, refresh", "@jRandomSkills/admin"),
NextCommand = new NormalCommand("next_skill", "@jRandomSkills/admin"),
+ CheckEntityCommand = new NormalCommand("ent, entity, checkentity, check_entity, sprawdzencje, checkent, check_ent, 检查实体, 检查实体", "@jRandomSkills/owner"),
};
VotingCommands = new VotingCommands
@@ -267,6 +268,7 @@ namespace src.utils
public required NormalCommand ChangeLanguageCommand { get; set; }
public required NormalCommand ReloadCommand { get; set; }
public required NormalCommand NextCommand { get; set; }
+ public required NormalCommand CheckEntityCommand { get; set; }
}
public class VotingCommand(bool enableVoting, string alias, string permissions, float timeToVote, float percentagesToSuccess, float timeToNextVoting, float timeToNextSameVoting, int minimumPlayersToStartVoting) : NormalCommand(alias, permissions)
diff --git a/jRandomSkills - SRC Files/src/utils/EntityManager.cs b/jRandomSkills - SRC Files/src/utils/EntityManager.cs
index 5675e6a..b965cd5 100644
--- a/jRandomSkills - SRC Files/src/utils/EntityManager.cs
+++ b/jRandomSkills - SRC Files/src/utils/EntityManager.cs
@@ -123,6 +123,25 @@ namespace src.utils
return CreateTrackedDynamicProp(playerIndex, "prop_dynamic_override");
}
+ public static CChicken? CreateTrackedChicken(uint playerIndex)
+ {
+ try
+ {
+ if (OverBudget()) return null;
+ var chicken = Utilities.CreateEntityByName("chicken");
+ if (chicken == null || !chicken.IsValid) return null;
+
+ chicken.DispatchSpawn();
+ RegisterEntity(chicken.Index, playerIndex, "chicken");
+ return chicken;
+ }
+ catch (Exception ex)
+ {
+ Server.PrintToConsole($"[EntityManager] CreateTrackedChicken: {ex.Message}");
+ return null;
+ }
+ }
+
public static CPhysicsPropMultiplayer? CreateTrackedPhysicsProp(uint playerIndex)
{
try
diff --git a/jRandomSkills - SRC Files/src/utils/KillfeedIcons.cs b/jRandomSkills - SRC Files/src/utils/KillfeedIcons.cs
new file mode 100644
index 0000000..79e3c27
--- /dev/null
+++ b/jRandomSkills - SRC Files/src/utils/KillfeedIcons.cs
@@ -0,0 +1,314 @@
+using CounterStrikeSharp.API.Core;
+using src.utils;
+
+namespace jRandomSkills.src.utils
+{
+ public enum KillfeedIcons
+ {
+ // Pistols
+ Deagle,
+ Elite,
+ FiveSeven,
+ Glock,
+ Hkp2000,
+ P2000,
+ P250,
+ Tec9,
+ Cz75a,
+ Revolver,
+ UspSilencer,
+ UspSilencerOff,
+
+ // Assault Rifles
+ Ak47,
+ Aug,
+ Famas,
+ Galilar,
+ M4A4,
+ M4A1,
+ M4A1_off,
+ Sg556,
+
+ // Sniper Rifles
+ AWP,
+ G3SG1,
+ Scar20,
+ Ssg,
+
+ // Machine Guns
+ M249,
+ Negev,
+
+ // Submachine Guns
+ Bizon,
+ Mac10,
+ Mp5,
+ Mp7,
+ Mp9,
+ P90,
+ Ump45,
+
+ // Shotguns
+ Mag7,
+ Nova,
+ Sawedoff,
+ Xm1014,
+
+ // Knives
+ Bayonet,
+ Knife,
+ KnifeBowie,
+ KnifeButterfly,
+ KnifeCanis,
+ KnifeCord,
+ KnifeCss,
+ KnifeFalchion,
+ KnifeFlip,
+ KnifeGut,
+ KnifeGypsyJackknife,
+ KnifeKarambit,
+ KnifeKukri,
+ KnifeM9Bayonet,
+ KnifeOutdoor,
+ KnifePush,
+ KnifeSkeleton,
+ KnifeStiletto,
+ KnifeSurvivalBowie,
+ KnifeT,
+ KnifeTactical,
+ KnifeTwinblade,
+ KnifeUrsus,
+ KnifeWidowmaker,
+ Knifegg,
+
+ // Grenades and Explosives
+ C4,
+ Decoy,
+ Flashbang,
+ FlashbangAssist,
+ Grenadepack,
+ Grenadepack2,
+ Hegrenade,
+ Incgrenade,
+ Fire,
+ Molotov,
+ Smokegrenade,
+
+ // Equipment and Armor
+ Armor,
+ ArmorHelmet,
+ Assaultsuit,
+ AssaultsuitHelmetOnly,
+ Defuser,
+ HeavyArmor,
+ Helmet,
+ Taser,
+ Healthshot,
+ Ammobox,
+ AmmoboxThreepack,
+
+ // Environmental and Other Damage
+ Disconnect,
+ Sentry,
+ MeleeKnife,
+ Fist,
+ Explosion,
+ Leg,
+
+ // Cosmetics and Effects
+ ClothingHands,
+ Player,
+ Medal,
+ Spray
+ }
+
+ public static class KillfeedIconsExtensions
+ {
+ public static string? ToIcon(this KillfeedIcons icon)
+ {
+ return icon switch
+ {
+ // Pistols
+ KillfeedIcons.Deagle => "deagle",
+ KillfeedIcons.Elite => "elite",
+ KillfeedIcons.FiveSeven => "fiveseven",
+ KillfeedIcons.Glock => "glock",
+ KillfeedIcons.Hkp2000 => "hkp2000",
+ KillfeedIcons.P2000 => "p2000",
+ KillfeedIcons.P250 => "p250",
+ KillfeedIcons.Tec9 => "tec9",
+ KillfeedIcons.Cz75a => "cz75a",
+ KillfeedIcons.Revolver => "revolver",
+ KillfeedIcons.UspSilencer => "usp_silencer",
+ KillfeedIcons.UspSilencerOff => "usp_silencer_off",
+
+ // Assault Rifles
+ KillfeedIcons.Ak47 => "ak47",
+ KillfeedIcons.Aug => "aug",
+ KillfeedIcons.Famas => "famas",
+ KillfeedIcons.Galilar => "galilar",
+ KillfeedIcons.M4A4 => "m4a1",
+ KillfeedIcons.M4A1 => "m4a1_silencer",
+ KillfeedIcons.M4A1_off => "m4a1_silencer_off",
+ KillfeedIcons.Sg556 => "sg556",
+
+ // Sniper Rifles
+ KillfeedIcons.AWP => "awp",
+ KillfeedIcons.G3SG1 => "g3sg1",
+ KillfeedIcons.Scar20 => "scar20",
+ KillfeedIcons.Ssg => "ssg08",
+
+ // Machine Guns
+ KillfeedIcons.M249 => "m249",
+ KillfeedIcons.Negev => "negev",
+
+ // Submachine Guns
+ KillfeedIcons.Bizon => "bizon",
+ KillfeedIcons.Mac10 => "mac10",
+ KillfeedIcons.Mp5 => "mp5sd",
+ KillfeedIcons.Mp7 => "mp7",
+ KillfeedIcons.Mp9 => "mp9",
+ KillfeedIcons.P90 => "p90",
+ KillfeedIcons.Ump45 => "ump45",
+
+ // Shotguns
+ KillfeedIcons.Mag7 => "mag7",
+ KillfeedIcons.Nova => "nova",
+ KillfeedIcons.Sawedoff => "sawedoff",
+ KillfeedIcons.Xm1014 => "xm1014",
+
+ // Knives
+ KillfeedIcons.Bayonet => "bayonet",
+ KillfeedIcons.Knife => "knife",
+ KillfeedIcons.KnifeBowie => "knife_bowie",
+ KillfeedIcons.KnifeButterfly => "knife_butterfly",
+ KillfeedIcons.KnifeCanis => "knife_canis",
+ KillfeedIcons.KnifeCord => "knife_cord",
+ KillfeedIcons.KnifeCss => "knife_css",
+ KillfeedIcons.KnifeFalchion => "knife_falchion",
+ KillfeedIcons.KnifeFlip => "knife_flip",
+ KillfeedIcons.KnifeGut => "knife_gut",
+ KillfeedIcons.KnifeGypsyJackknife => "knife_gypsy_jackknife",
+ KillfeedIcons.KnifeKarambit => "knife_karambit",
+ KillfeedIcons.KnifeKukri => "knife_kukri",
+ KillfeedIcons.KnifeM9Bayonet => "knife_m9_bayonet",
+ KillfeedIcons.KnifeOutdoor => "knife_outdoor",
+ KillfeedIcons.KnifePush => "knife_push",
+ KillfeedIcons.KnifeSkeleton => "knife_skeleton",
+ KillfeedIcons.KnifeStiletto => "knife_stiletto",
+ KillfeedIcons.KnifeSurvivalBowie => "knife_survival_bowie",
+ KillfeedIcons.KnifeT => "knife_t",
+ KillfeedIcons.KnifeTactical => "knife_tactical",
+ KillfeedIcons.KnifeTwinblade => "knife_twinblade",
+ KillfeedIcons.KnifeUrsus => "knife_ursus",
+ KillfeedIcons.KnifeWidowmaker => "knife_widowmaker",
+ KillfeedIcons.Knifegg => "knifegg",
+
+ // Grenades and Explosives
+ KillfeedIcons.C4 => "c4",
+ KillfeedIcons.Decoy => "decoy",
+ KillfeedIcons.Flashbang => "flashbang",
+ KillfeedIcons.FlashbangAssist => "flashbang_assist",
+ KillfeedIcons.Grenadepack => "grenadepack",
+ KillfeedIcons.Grenadepack2 => "grenadepack2",
+ KillfeedIcons.Hegrenade => "hegrenade",
+ KillfeedIcons.Incgrenade => "incgrenade",
+ KillfeedIcons.Fire => "inferno",
+ KillfeedIcons.Molotov => "molotov",
+ KillfeedIcons.Smokegrenade => "smokegrenade",
+
+ // Equipment and Armor
+ KillfeedIcons.Armor => "armor",
+ KillfeedIcons.ArmorHelmet => "armor_helmet",
+ KillfeedIcons.Assaultsuit => "assaultsuit",
+ KillfeedIcons.AssaultsuitHelmetOnly => "assaultsuit_helmet_only",
+ KillfeedIcons.Defuser => "defuser",
+ KillfeedIcons.HeavyArmor => "heavy_armor",
+ KillfeedIcons.Helmet => "helmet",
+ KillfeedIcons.Taser => "taser",
+ KillfeedIcons.Healthshot => "healthshot",
+ KillfeedIcons.Ammobox => "ammobox",
+ KillfeedIcons.AmmoboxThreepack => "ammobox_threepack",
+
+ // Environmental and Other Damage
+ KillfeedIcons.Disconnect => "disconnect",
+ KillfeedIcons.Sentry => "dronegun",
+ KillfeedIcons.MeleeKnife => "melee",
+ KillfeedIcons.Fist => "movelinear",
+ KillfeedIcons.Explosion => "prop_exploding_barrel",
+ KillfeedIcons.Leg => "stomp_damage",
+
+ // Cosmetics and Effects
+ KillfeedIcons.ClothingHands => "clothing_hands",
+ KillfeedIcons.Player => "customplayer",
+ KillfeedIcons.Medal => "flair0",
+ KillfeedIcons.Spray => "spray0",
+
+ _ => throw new ArgumentOutOfRangeException(nameof(icon), icon, null)
+ };
+ }
+
+ public static KillfeedIcons? FromWeapon(CBasePlayerWeapon? weapon)
+ {
+ string weaponName = SkillUtils.GetDesignerName(weapon);
+ return FromWeaponName(weaponName);
+ }
+
+ public static KillfeedIcons? FromWeaponName(string? weaponName)
+ {
+ if (string.IsNullOrWhiteSpace(weaponName))
+ return null;
+
+ return weaponName.ToLowerInvariant() switch
+ {
+ "weapon_deagle" => KillfeedIcons.Deagle,
+ "weapon_revolver" => KillfeedIcons.Revolver,
+ "weapon_glock" => KillfeedIcons.Glock,
+ "weapon_usp_silencer" => KillfeedIcons.UspSilencer,
+ "weapon_cz75a" => KillfeedIcons.Cz75a,
+ "weapon_fiveseven" => KillfeedIcons.FiveSeven,
+ "weapon_p250" => KillfeedIcons.P250,
+ "weapon_tec9" => KillfeedIcons.Tec9,
+ "weapon_elite" => KillfeedIcons.Elite,
+ "weapon_hkp2000" => KillfeedIcons.Hkp2000,
+ "weapon_mp9" => KillfeedIcons.Mp9,
+ "weapon_mac10" => KillfeedIcons.Mac10,
+ "weapon_bizon" => KillfeedIcons.Bizon,
+ "weapon_mp7" => KillfeedIcons.Mp7,
+ "weapon_ump45" => KillfeedIcons.Ump45,
+ "weapon_p90" => KillfeedIcons.P90,
+ "weapon_mp5sd" => KillfeedIcons.Mp5,
+ "weapon_sg556" => KillfeedIcons.Sg556,
+ "weapon_sg553" => KillfeedIcons.Sg556,
+ "weapon_famas" => KillfeedIcons.Famas,
+ "weapon_galilar" => KillfeedIcons.Galilar,
+ "weapon_m4a4" => KillfeedIcons.M4A4,
+ "weapon_m4a1_silencer" => KillfeedIcons.M4A1,
+ "weapon_ak47" => KillfeedIcons.Ak47,
+ "weapon_aug" => KillfeedIcons.Aug,
+ "weapon_ssg08" => KillfeedIcons.Ssg,
+ "weapon_awp" => KillfeedIcons.AWP,
+ "weapon_scar20" => KillfeedIcons.Scar20,
+ "weapon_g3sg1" => KillfeedIcons.G3SG1,
+ "weapon_nova" => KillfeedIcons.Nova,
+ "weapon_xm1014" => KillfeedIcons.Xm1014,
+ "weapon_mag7" => KillfeedIcons.Mag7,
+ "weapon_sawedoff" => KillfeedIcons.Sawedoff,
+ "weapon_m249" => KillfeedIcons.M249,
+ "weapon_negev" => KillfeedIcons.Negev,
+ "weapon_taser" => KillfeedIcons.Taser,
+ "weapon_molotov" => KillfeedIcons.Molotov,
+ "weapon_incgrenade" => KillfeedIcons.Incgrenade,
+ "weapon_flashbang" => KillfeedIcons.Flashbang,
+ "weapon_smokegrenade" => KillfeedIcons.Smokegrenade,
+ "weapon_decoy" => KillfeedIcons.Decoy,
+ "weapon_hegrenade" => KillfeedIcons.Hegrenade,
+ "weapon_knife" => KillfeedIcons.Knife,
+ "weapon_bayonet" => KillfeedIcons.Bayonet,
+ "weapon_c4" => KillfeedIcons.C4,
+
+ _ => null
+ };
+ }
+ }
+}
diff --git a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs
index 783cd9c..9ff3798 100644
--- a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs
+++ b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs
@@ -32,6 +32,8 @@ namespace src.utils
LazySig>("HEGrenadeProjectile_CreateFunc", s => new(s));
private static readonly Lazy?> SmokeGrenadeProjectile_CreateFunc =
LazySig>("SmokeGrenadeProjectile_CreateFunc", s => new(s));
+ private static readonly Lazy?> CMolotovProjectile_CreateFunc =
+ LazySig>("CMolotovProjectile_CreateFunc", s => new(s));
private static readonly Lazy?> TerminateRoundFunc =
LazySig>("CCSGameRules_TerminateRound", s => new(s));
private static readonly Lazy?> SnapViewAngles =
@@ -310,6 +312,11 @@ namespace src.utils
SmokeGrenadeProjectile_CreateFunc.Value?.Invoke(pos.Handle, angle.Handle, vel.Handle, vel.Handle, IntPtr.Zero, 45, teamNum);
}
+ public static void CreateMolotovProjectile(Vector pos, QAngle angle, Vector vel, int teamNum)
+ {
+ CMolotovProjectile_CreateFunc.Value?.Invoke(pos.Handle, angle.Handle, vel.Handle, vel.Handle, IntPtr.Zero, 46, teamNum);
+ }
+
// True when this hit would be nullified by the server's friendly-fire rules (same-team hit,
// mp_friendlyfire 0 and mp_teammates_are_enemies 0). The TakeDamage pre-hook still sees the raw
// damage, so lethal victim-side skills (SecondLife/Phoenix) must skip it — otherwise they "revive"
@@ -333,9 +340,9 @@ namespace src.utils
private static readonly ConcurrentDictionary pendingKillCredits = [];
- public static void RegisterKillCredit(uint victimIndex, uint attackerIndex, string? weapon = null)
+ public static void RegisterKillCredit(uint victimIndex, uint attackerIndex, KillfeedIcons? killfeedIcon = null)
{
- pendingKillCredits[victimIndex] = (attackerIndex, weapon, Server.TickCount + 64);
+ pendingKillCredits[victimIndex] = (attackerIndex, killfeedIcon == null ? null : KillfeedIconsExtensions.ToIcon((KillfeedIcons)killfeedIcon), Server.TickCount + 64);
}
public static bool TryConsumeKillCredit(uint victimIndex, out uint attackerIndex, out string? weapon)
@@ -505,7 +512,7 @@ namespace src.utils
.Cast()];
}
- public static bool TakeHealth(CCSPlayerPawn? pawn, int damage, CCSPlayerController? damageAttacker = null, string? damageWeapon = null)
+ public static bool TakeHealth(CCSPlayerPawn? pawn, int damage, CCSPlayerController? damageAttacker = null, KillfeedIcons? killfeedIcon = null)
{
if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE)
return false;
@@ -546,9 +553,8 @@ namespace src.utils
if (pawn.Health <= 0)
{
- if (damageAttacker != null && damageAttacker.IsValid && victim != null && victim.IsValid
- && damageAttacker.Index != victim.Index)
- RegisterKillCredit(victim.Index, damageAttacker.Index, damageWeapon);
+ if (damageAttacker != null && damageAttacker.IsValid && victim != null && victim.IsValid && damageAttacker.Index != victim.Index)
+ RegisterKillCredit(victim.Index, damageAttacker.Index, killfeedIcon);
Server.NextFrame(() =>
{
@@ -752,6 +758,7 @@ namespace src.utils
("weapon_m4a1", 60) => "weapon_m4a1_silencer",
("weapon_hkp2000", 61) => "weapon_usp_silencer",
("weapon_deagle", 64) => "weapon_revolver",
+ ("weapon_mp7", 23) => "weapon_mp5sd",
_ => designerName
};
diff --git a/jRandomSkills - Server Files/gamedata/jRandomSkills.gamedata.json b/jRandomSkills - Server Files/gamedata/jRandomSkills.gamedata.json
index 3e0bc0e..bd817d6 100644
--- a/jRandomSkills - Server Files/gamedata/jRandomSkills.gamedata.json
+++ b/jRandomSkills - Server Files/gamedata/jRandomSkills.gamedata.json
@@ -13,6 +13,13 @@
"linux": "55 4C 89 C1 48 89 E5 41 57 49 89 FF 41 56 49 89 D6 48 89 F2 48 89 FE 41 55 48 8D 3D ? ? ? ? 4D 89 C5 41 54 45 89 CC 53"
}
},
+ "CMolotovProjectile_CreateFunc": {
+ "signatures": {
+ "library": "server",
+ "windows": "48 8B C4 48 89 58 10 4C 89 40 18 48 89 48 08",
+ "linux": "55 48 8D 05 ? ? ? ? 48 89 E5 41 57 41 56 41 55 41 54 49 89 FC 53 48 81 EC ? ? ? ? 4C 8D 35"
+ }
+ },
"Shoot_Secondary": {
"signatures": {
"library": "server",
diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll
index 9fb186b..b71e801 100644
Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll differ
diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/configs/config.json b/jRandomSkills - Server Files/plugins/jRandomSkills/configs/config.json
index 22fa6b8..31a1b3b 100644
--- a/jRandomSkills - Server Files/plugins/jRandomSkills/configs/config.json
+++ b/jRandomSkills - Server Files/plugins/jRandomSkills/configs/config.json
@@ -143,6 +143,10 @@
"NextCommand": {
"Alias": "next_skill",
"Permissions": "@jRandomSkills/admin"
+ },
+ "CheckEntityCommand": {
+ "Alias": "ent, entity, checkentity, check_entity, sprawdzencje, checkent, check_ent, 检查实体, 检查实体",
+ "Permissions": "@jRandomSkills/owner"
}
},
"VotingCommands": {
diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/configs/skillsInfo.json b/jRandomSkills - Server Files/plugins/jRandomSkills/configs/skillsInfo.json
index b0f1c45..8e74bbb 100644
--- a/jRandomSkills - Server Files/plugins/jRandomSkills/configs/skillsInfo.json
+++ b/jRandomSkills - Server Files/plugins/jRandomSkills/configs/skillsInfo.json
@@ -85,7 +85,7 @@
"RadarDuration": 5.0,
"TriggerRadius": 24.0,
"WireHeight": 30.0,
- "WireWidth": 1.5,
+ "WireWidth": 0.7,
"MaxWallDistance": 400.0,
"Cooldown": 20.0,
"NeedsTeammates": false,
@@ -189,6 +189,20 @@
"MaxPerServer": -1,
"Rarity": "Common"
},
+ {
+ "Cooldown": 30.0,
+ "NeedsTeammates": false,
+ "DisableOnFreezeTime": false,
+ "OnlyTeam": 0,
+ "Color": "#5eb8b0",
+ "Active": true,
+ "Name": "TakeAmmo",
+ "HudDuration": null,
+ "DescriptionHudDuration": null,
+ "RequiredPermission": "",
+ "MaxPerServer": -1,
+ "Rarity": "Common"
+ },
{
"Cooldown": 30.0,
"CooldownBeforeUse": 10.0,
@@ -928,6 +942,21 @@
"MaxPerServer": -1,
"Rarity": "Common"
},
+ {
+ "DamageAfterDeath": 30,
+ "CanKill": true,
+ "NeedsTeammates": false,
+ "DisableOnFreezeTime": false,
+ "OnlyTeam": 0,
+ "Color": "#88bdba",
+ "Active": true,
+ "Name": "LastGasp",
+ "HudDuration": null,
+ "DescriptionHudDuration": null,
+ "RequiredPermission": "",
+ "MaxPerServer": -1,
+ "Rarity": "Rare"
+ },
{
"KnockbackUnits": 120.0,
"MaxSpeed": 1200.0,
@@ -1000,6 +1029,20 @@
"MaxPerServer": -1,
"Rarity": "Common"
},
+ {
+ "PushVelocity": 400.0,
+ "NeedsTeammates": false,
+ "DisableOnFreezeTime": false,
+ "OnlyTeam": 0,
+ "Color": "#5a4fd1",
+ "Active": true,
+ "Name": "JetKick",
+ "HudDuration": null,
+ "DescriptionHudDuration": null,
+ "RequiredPermission": "",
+ "MaxPerServer": -1,
+ "Rarity": "Common"
+ },
{
"MinTime": 10.0,
"MaxTime": 25.0,
@@ -1194,6 +1237,23 @@
"MaxPerServer": -1,
"Rarity": "Common"
},
+ {
+ "Amount": 3,
+ "Heal": 2,
+ "TickCooldown": 16,
+ "HealRadius": 150.0,
+ "NeedsTeammates": false,
+ "DisableOnFreezeTime": false,
+ "OnlyTeam": 0,
+ "Color": "#b5ab8f",
+ "Active": true,
+ "Name": "HealingChicken",
+ "HudDuration": null,
+ "DescriptionHudDuration": null,
+ "RequiredPermission": "",
+ "MaxPerServer": 1,
+ "Rarity": "Legendary"
+ },
{
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
@@ -1364,6 +1424,28 @@
"MaxPerServer": 5,
"Rarity": "Common"
},
+ {
+ "Cooldown": 2.0,
+ "ColorR": 255,
+ "ColorG": 255,
+ "ColorB": 255,
+ "Brightness": 1.5,
+ "Range": 1200.0,
+ "BlindDuration": 5.0,
+ "BlindAlpha": 200.0,
+ "BlindAngle": 10.0,
+ "NeedsTeammates": false,
+ "DisableOnFreezeTime": true,
+ "OnlyTeam": 0,
+ "Color": "#a3000b",
+ "Active": true,
+ "Name": "Flashlight",
+ "HudDuration": null,
+ "DescriptionHudDuration": null,
+ "RequiredPermission": "",
+ "MaxPerServer": 2,
+ "Rarity": "Legendary"
+ },
{
"ChanceFrom": 1.2,
"ChanceTo": 3.0,
@@ -1379,6 +1461,19 @@
"MaxPerServer": -1,
"Rarity": "Common"
},
+ {
+ "NeedsTeammates": false,
+ "DisableOnFreezeTime": false,
+ "OnlyTeam": 0,
+ "Color": "#ffbf47",
+ "Active": true,
+ "Name": "FireRain",
+ "HudDuration": null,
+ "DescriptionHudDuration": null,
+ "RequiredPermission": "",
+ "MaxPerServer": -1,
+ "Rarity": "Epic"
+ },
{
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
@@ -1540,6 +1635,21 @@
"MaxPerServer": -1,
"Rarity": "Common"
},
+ {
+ "SecondCooldown": 1.0,
+ "Damage": 5,
+ "NeedsTeammates": false,
+ "DisableOnFreezeTime": false,
+ "OnlyTeam": 0,
+ "Color": "#c91243",
+ "Active": true,
+ "Name": "DemonEye",
+ "HudDuration": null,
+ "DescriptionHudDuration": null,
+ "RequiredPermission": "",
+ "MaxPerServer": -1,
+ "Rarity": "Common"
+ },
{
"ExplosionRadius": 500.0,
"ExplosionDamage": 999,
@@ -1728,6 +1838,24 @@
"MaxPerServer": -1,
"Rarity": "Common"
},
+ {
+ "ExplosionRadius": 400.0,
+ "ExplosionDamage": 60,
+ "DmgReductionForTeamates": 0.5,
+ "Cooldown": 10.0,
+ "Force": 1000.0,
+ "NeedsTeammates": false,
+ "DisableOnFreezeTime": false,
+ "OnlyTeam": 0,
+ "Color": "#7740c9",
+ "Active": true,
+ "Name": "BlastShot",
+ "HudDuration": null,
+ "DescriptionHudDuration": null,
+ "RequiredPermission": "",
+ "MaxPerServer": -1,
+ "Rarity": "Common"
+ },
{
"TorseReflectionChance": 0.95,
"LegReflectionChance": 0.7,
@@ -1744,6 +1872,21 @@
"MaxPerServer": -1,
"Rarity": "Common"
},
+ {
+ "MaxSpeedVelocity": 2.0,
+ "MaxDamageVelocity": 2.0,
+ "NeedsTeammates": false,
+ "DisableOnFreezeTime": false,
+ "OnlyTeam": 0,
+ "Color": "#cc2929",
+ "Active": true,
+ "Name": "Berserker",
+ "HudDuration": null,
+ "DescriptionHudDuration": null,
+ "RequiredPermission": "",
+ "MaxPerServer": -1,
+ "Rarity": "Common"
+ },
{
"ChanceFrom": 0.2,
"ChanceTo": 0.4,
diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll
index 51e4268..292cb23 100644
Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll differ
diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/de.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/de.json
index bebaa5d..13fa2df 100644
--- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/de.json
+++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/de.json
@@ -51,9 +51,15 @@
"behind_desc": "Du hast eine zufällige Chance, einen Feind um 180 Grad zu drehen, wenn du ihn triffst",
"behind_desc2": "Deine Chance, einen Feind bei einem Treffer zu drehen, beträgt: {0} %",
+ "berserker": "Berserker",
+ "berserker_desc": "Du verursachst mehr Schaden und bewegst dich schneller, je weniger Gesundheit du hast",
+
"blademaster": "Schwertmeister",
"blademaster_desc": "Wenn du ein Messer hältst, hast du eine hohe Chance, einen Schuss abzuwehren",
+ "blastshot": "Explosivschuss",
+ "blastshot_desc": "Drücke Attack2 mit der MP5, um eine HE-Granate abzufeuern",
+
"bunnyhop": "Hase",
"bunnyhop_desc": "Du erhältst automatisch bunnyhop",
@@ -104,6 +110,13 @@
"deaf_player_info": "Der Ton für den Spieler ‚{0}‘ wurde deaktiviert.",
"deaf_select_info": "Alle Töne für den Spieler stummschalten:",
+ "deathbomb": "Todesbombe",
+ "deathbomb_desc": "Du explodierst beim Tod und tötest Spieler in deiner Nähe",
+ "deathbomb_explosion": "Kaboom!",
+
+ "demoneye": "Dämonenauge",
+ "demoneye_desc": "Du verursachst allen Gegnern Schaden, die du ansiehst",
+
"disarmament": "Entwaffnung",
"disarmament_desc": "Du hast eine zufällige Chance, einen Gegner bei einem Treffer seine Waffe fallen zu lassen.",
"disarmament_desc2": "Ihre Chance, einen Gegner zu entwaffnen, beträgt: {0} %",
@@ -129,15 +142,15 @@
"enemyspawn": "Feindes-Spawn",
"enemyspawn_desc": "Klicke auf [css_useSkill], um zum Feindes-Spawn zu teleportieren",
- "expensiveammo": "expensiveammo",
- "expensiveammo_desc": "expensiveammo_desc",
- "expensiveammo_disable_info": "expensiveammo_disable_info",
- "expensiveammo_enemy_info": "expensiveammo_enemy_info: {0}",
- "expensiveammo_player_info": "expensiveammo_player_info: {0}",
- "expensiveammo_select_info": "expensiveammo_select_info",
+ "expensiveammo": "Teure Munition",
+ "expensiveammo_desc": "Ein ausgewählter Gegner muss für jeden Schuss bezahlen",
+ "expensiveammo_disable_info": "Deine Kugeln sind wieder kostenlos.",
+ "expensiveammo_enemy_info": "Jeder Schuss kostet dich jetzt {0}$.",
+ "expensiveammo_player_info": "Spieler '{0}' muss jetzt für jede Kugel bezahlen.",
+ "expensiveammo_select_info": "Wähle einen Spieler, dessen Munition teuer wird:",
- "explodingbarrel": "explodingbarrel",
- "explodingbarrel_desc": "explodingbarrel_desc",
+ "explodingbarrel": "Explosives Fass",
+ "explodingbarrel_desc": "Klicke auf [css_useSkill], um ein Fass zu platzieren, das beim Beschuss explodiert",
"explosiveshot": "Explosiver Schuss",
"explosiveshot_desc": "Zufällige Chance, beim Schießen eine explosive Kugel abzufeuern",
@@ -149,10 +162,16 @@
"fastreload": "Schnellnachladen",
"fastreload_desc": "Klicke auf [css_useSkill], um die Waffe, die du gerade hältst, nachzuladen",
+ "firerain": "Feuerregen",
+ "firerain_desc": "Wirf einen Köder, um einen Regen aus Molotows auszulösen",
+
"flash": "Blitz",
"flash_desc": "Zufällige Spielergeschwindigkeit zu Beginn der Runde",
"flash_desc2": "Dein Geschwindigkeitsmultiplikator beträgt: {0}x",
+ "flashlight": "Taschenlampe",
+ "flashlight_desc": "Klicke auf [css_useSkill], um die Taschenlampe ein- oder auszuschalten. Ihr Licht kann Gegner blenden",
+
"fortnite": "Fortnite",
"fortnite_desc": "Klicke auf [css_useSkill], um eine zerstörbare Barrikade zu erstellen",
@@ -175,14 +194,14 @@
"ghost": "Geist",
"ghost_desc": "Du bist vollständig unsichtbar",
- "giant": "giant",
- "giant_desc": "giant_desc",
- "giant_desc2": "giant_desc2: {0}x",
- "giant_disable_info": "giant_disable_info",
- "giant_enemy_info": "giant_enemy_info: {0}x",
- "giant_player_info": "giant_player_info: {0} {1}",
- "giant_select_info": "giant_select_info",
-
+ "giant": "Riese",
+ "giant_desc": "Vergrößere einen Gegner deiner Wahl",
+ "giant_desc2": "Vergrößere einen Gegner deiner Wahl auf das {0}-Fache seiner normalen Größe",
+ "giant_disable_info": "Du hast wieder deine normale Größe.",
+ "giant_enemy_info": "Du wurdest auf das {0}-Fache deiner normalen Größe vergrößert.",
+ "giant_player_info": "Du hast Spieler '{0}' auf das {1}-Fache seiner normalen Größe vergrößert.",
+ "giant_select_info": "Wähle einen Spieler zum Vergrößern:",
+
"glaz": "Glaz",
"glaz_desc": "Du kannst durch Rauchgranaten hindurchsehen",
@@ -207,6 +226,9 @@
"healingsmoke": "Heilender Rauch",
"healingsmoke_desc": "Deine Rauchgranaten heilen",
+ "healingchicken": "Heilendes Huhn",
+ "healingchicken_desc": "Deine Hühner heilen dich, solange du in ihrer Nähe bist",
+
"hermit": "Einsiedler",
"hermit_desc": "Durch das Töten von Gegnern werden Munition und ein Teil der Gesundheit wiederhergestellt",
@@ -252,6 +274,12 @@
"jester_on": "EIN",
"jester_off": "AUS",
+ "jetkick": "Jetkick",
+ "jetkick_desc": "Wähle einen Spieler für einen Jetkick",
+ "jetkick_player_info": "Spieler '{0}' wurde wegge-kickt.",
+ "jetkick_enemy_info": "Jeder Schuss stößt dich nach hinten",
+ "jetkick_disable_info": "Dein Rückstoß ist wieder normal.",
+
"jumpban": "Beinlos",
"jumpban_desc": "Wähle einen Spieler, der nicht springen kann",
"jumpban_enemy_info": "Jemand hat dir die Beine abgeschnitten.",
@@ -259,12 +287,12 @@
"jumpban_player_info": "Der Spieler ‚{0}‘ kann nicht mehr springen.",
"jumpban_select_info": "Spieler vom Springen ausschließen:",
- "jumpcurse": "jumpcurse",
- "jumpcurse_desc": "jumpcurse_desc",
- "jumpcurse_disable_info": "jumpcurse_disable_info",
- "jumpcurse_enemy_info": "jumpcurse_enemy_info",
- "jumpcurse_player_info": "jumpcurse_player_info: {0}",
- "jumpcurse_select_info": "jumpcurse_select_info",
+ "jumpcurse": "Sprungfluch",
+ "jumpcurse_desc": "Ein ausgewählter Gegner springt jedes Mal, wenn einer seiner Teamkollegen springt",
+ "jumpcurse_disable_info": "Du kannst deine Sprünge wieder selbst kontrollieren.",
+ "jumpcurse_enemy_info": "Du springst jetzt jedes Mal, wenn einer deiner Teamkollegen springt.",
+ "jumpcurse_player_info": "Spieler '{0}' springt jetzt jedes Mal, wenn seine Teamkollegen springen.",
+ "jumpcurse_select_info": "Wähle einen Spieler für den Fluch:",
"jumpingjack": "Jumping Jack",
"jumpingjack_desc": "Durch Springen wird die Gesundheit wiederhergestellt",
@@ -272,8 +300,11 @@
"killerflash": "Killer Flash",
"killerflash_desc": "Jeder, der durch deine Blendgranate vollständig geblendet wird, stirbt (einschließlich dir selbst)",
- "knockback": "knockback",
- "knockback_desc": "knockback_desc",
+ "knockback": "Rückstoß",
+ "knockback_desc": "Schießen in der Luft stößt dich nach hinten",
+
+ "lastgasp": "Letzter Atemzug",
+ "lastgasp_desc": "Nach deinem Tod fügst du dem Gegner, der dich getötet hat, Schaden zu",
"lifeswap": "Lebensaustausch",
"lifeswap_desc": "Wähle einen Spieler aus, mit dem du deine Gesundheit austauschen möchtest",
@@ -312,16 +343,12 @@
"bankrupt_player_info": "Der Spieler ‚{0}‘ ist bankrott.",
"bankrupt_select_info": "Wähle einen Spieler aus, der bankrott gehen soll:",
- "deathbomb": "Todesbombe",
- "deathbomb_desc": "Du explodierst beim Tod und tötest Spieler in deiner Nähe",
- "deathbomb_explosion": "Kaboom!",
-
- "nightmare": "nightmare",
- "nightmare_desc": "nightmare_desc",
- "nightmare_disable_info": "nightmare_disable_info",
- "nightmare_enemy_info": "nightmare_enemy_info",
- "nightmare_player_info": "nightmare_player_info: {0}",
- "nightmare_select_info": "nightmare_select_info",
+ "nightmare": "Albtraum",
+ "nightmare_desc": "Lass einen ausgewählten Gegner eine schreckliche Vision erleben",
+ "nightmare_disable_info": "Der Albtraum ist vorbei.",
+ "nightmare_enemy_info": "Ein Albtraum trübt deine Sicht.",
+ "nightmare_player_info": "Du hast Spieler '{0}' einen Albtraum verpasst.",
+ "nightmare_select_info": "Wähle einen Spieler für den Albtraum:",
"ninja": "Ninja",
"ninja_desc": "Wenn du stillstehst, erhöht sich deine Unsichtbarkeit um 33 %, wenn du dich duckst um 33 % und wenn du ein Messer hältst um 33 %",
@@ -462,6 +489,17 @@
"swapposition": "Positionstausch",
"swapposition_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Plätze zu tauschen",
+ "takeammo": "Munition nehmen",
+ "takeammo_desc": "Klicke auf [css_useSkill], um das Magazin der aktiven Waffe eines zufälligen Gegners zu nehmen",
+ "takeammo_hud_info1": "Kein Spieler mit einem aktiven Magazin gefunden.",
+ "takeammo_hud_info2": "Der Gegner hat keine Magazine.",
+ "takeammo_enemy_info": "Du hast etwas Munition verloren.",
+
+ "teamteleport": "Team-Teleport",
+ "teamteleport_desc": "Drücke [css_useSkill], um dich zu dem anvisierten Teammitglied zu teleportieren",
+ "teamteleport_noenemy": "Kein Teammitglied gefunden",
+ "teamteleport_hud_info": "Gefunden: {0}",
+
"teleporter": "Teleporter",
"teleporter_desc": "Du hast die Chance, die Plätze mit einem getroffenen Gegner zu tauschen",
"teleporter_desc2": "Deine Chance auf Platztausch nach einem Treffer: {0}%",
@@ -485,11 +523,11 @@
"toxicsmoke": "Giftiger Rauch",
"toxicsmoke_desc": "Deine Rauchgranaten verursachen Schaden",
- "tripwire": "tripwire",
- "tripwire_desc": "tripwire_desc",
- "tripwire_no_wall_info": "tripwire_no_wall_info",
- "tripwire_placed_info": "tripwire_placed_info",
- "tripwire_triggered_info": "tripwire_triggered_info: {0}",
+ "tripwire": "Stolperdraht",
+ "tripwire_desc": "Klicke auf [css_useSkill], um einen Draht zwischen zwei Wänden zu spannen. Gegner, die ihn berühren, werden auf deinem Radar angezeigt",
+ "tripwire_no_wall_info": "Auf beiden Seiten sind keine Wände nah genug.",
+ "tripwire_placed_info": "Stolperdraht platziert.",
+ "tripwire_triggered_info": "'{0}' hat deinen Stolperdraht ausgelöst.",
"wallhack": "Wallhack",
"wallhack_desc": "Du kannst Feinde durch Wände hindurch sehen",
@@ -569,6 +607,6 @@
"summary": "Zusammenfassung der letzten runde",
"menu_controlls_scroll": "W/S – Scrollen",
- "menu_controlls_padding": " | ",
+ "menu_controlls_padding": " | ",
"menu_controlls_select": "E – Auswählen"
}
diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/en.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/en.json
index 172540e..c489c0f 100644
--- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/en.json
+++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/en.json
@@ -51,9 +51,15 @@
"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}%",
+ "berserker": "Berserker",
+ "berserker_desc": "You deal more damage and move faster as your health gets lower",
+
"blademaster": "Blademaster",
"blademaster_desc": "While holding a knife, you have a high chance to deflect a shot",
+ "blastshot": "Blast Shot",
+ "blastshot_desc": "Press Attack2 with the MP5 to fire an HE grenade",
+
"bunnyhop": "Bunny",
"bunnyhop_desc": "You get auto \"BunnyHop\"",
@@ -130,11 +136,11 @@
"enemyspawn_desc": "Click [css_useSkill] to teleport to the enemy spawn",
"expensiveammo": "Expensive Ammo",
- "expensiveammo_desc": "A chosen enemy loses money with every shot",
+ "expensiveammo_desc": "A chosen enemy has to pay for every shot",
"expensiveammo_disable_info": "Your bullets are free again.",
"expensiveammo_enemy_info": "Every shot you fire now costs you {0}$.",
- "expensiveammo_player_info": "Player '{0}' now pays for every bullet.",
- "expensiveammo_select_info": "Select player whose ammo becomes expensive:",
+ "expensiveammo_player_info": "Player '{0}' now has to pay for every bullet.",
+ "expensiveammo_select_info": "Select a player whose ammo will become expensive:",
"explodingbarrel": "Exploding Barrel",
"explodingbarrel_desc": "Click [css_useSkill] to place a barrel that explodes when shot",
@@ -149,10 +155,16 @@
"fastreload": "Fastreload",
"fastreload_desc": "Click [css_useSkill] to reload the weapon you are currently holding",
+ "firerain": "Fire Rain",
+ "firerain_desc": "Throw a decoy to call down a rain of Molotovs",
+
"flash": "Flash",
"flash_desc": "Random player speed at the beginning of the round",
"flash_desc2": "Your speed multiplier is: {0}x",
+ "flashlight": "Flashlight",
+ "flashlight_desc": "Click [css_useSkill] to turn the flashlight on or off. Its light can blind enemies",
+
"fortnite": "Fortnite",
"fortnite_desc": "Click [css_useSkill] to create a destructible barricade",
@@ -177,12 +189,12 @@
"giant": "Giant",
"giant_desc": "Enlarge an enemy of your choice",
- "giant_desc2": "Enlarge an enemy of your choice to {0}x",
+ "giant_desc2": "Enlarge an enemy of your choice to {0}x their normal size",
"giant_disable_info": "You are back to your normal size.",
- "giant_enemy_info": "You have been enlarged to {0}x.",
- "giant_player_info": "You enlarged player '{0}' to {1}x.",
- "giant_select_info": "Enlarge player:",
-
+ "giant_enemy_info": "You have been enlarged to {0}x your normal size.",
+ "giant_player_info": "You enlarged player '{0}' to {1}x their normal size.",
+ "giant_select_info": "Select a player to enlarge:",
+
"glaz": "Glaz",
"glaz_desc": "You can see through smoke grenades",
@@ -204,6 +216,9 @@
"grenadier": "Grenadier",
"grenadier_desc": "You have infinite hegrenade",
+ "healingchicken": "Healing Chicken",
+ "healingchicken_desc": "Your chickens heal you while you are nearby",
+
"healingsmoke": "Healing Smoke",
"healingsmoke_desc": "Your smoke grenades heal",
@@ -252,6 +267,12 @@
"jester_on": "ON",
"jester_off": "OFF",
+ "jetkick": "Jetkick",
+ "jetkick_desc": "Select a player to jetkick",
+ "jetkick_player_info": "Player '{0}' has been jetkicked.",
+ "jetkick_enemy_info": "Every shot knocks you backwards",
+ "jetkick_disable_info": "Your recoil is back to normal.",
+
"jumpban": "Legless",
"jumpban_desc": "Choose a player who cannot jump",
"jumpban_enemy_info": "Someone cut off your legs.",
@@ -260,11 +281,11 @@
"jumpban_select_info": "Ban player from jumping:",
"jumpcurse": "Jump Curse",
- "jumpcurse_desc": "A chosen enemy jumps whenever their teammates jump",
- "jumpcurse_disable_info": "Your legs are your own again.",
- "jumpcurse_enemy_info": "You now jump whenever your teammates jump.",
- "jumpcurse_player_info": "Player '{0}' now jumps with their team.",
- "jumpcurse_select_info": "Select player for the jump curse:",
+ "jumpcurse_desc": "A chosen enemy jumps whenever one of their teammates jumps",
+ "jumpcurse_disable_info": "You can control your jumps again.",
+ "jumpcurse_enemy_info": "You now jump whenever one of your teammates jumps.",
+ "jumpcurse_player_info": "Player '{0}' now jumps whenever their teammates do.",
+ "jumpcurse_select_info": "Select a player to curse:",
"jumpingjack": "Jumping Jack",
"jumpingjack_desc": "Jumping restores health",
@@ -275,6 +296,9 @@
"knockback": "Knockback",
"knockback_desc": "Firing while airborne pushes you backwards",
+ "lastgasp": "Last Gasp",
+ "lastgasp_desc": "After you die, you deal damage to the enemy who killed you",
+
"lifeswap": "Life Swap",
"lifeswap_desc": "Choose a player to swap health with",
"lifeswap_enemy_info": "Someone borrowed your health.",
@@ -316,12 +340,15 @@
"deathbomb_desc": "You explode upon death, killing nearby players",
"deathbomb_explosion": "Kaboom!",
+ "demoneye": "Demon Eye",
+ "demoneye_desc": "You deal damage to every enemy you are looking at",
+
"nightmare": "Nightmare",
- "nightmare_desc": "Give a chosen enemy a nightmarish vision",
+ "nightmare_desc": "Force a chosen enemy to experience a terrifying vision",
"nightmare_disable_info": "The nightmare has faded.",
- "nightmare_enemy_info": "A nightmare clouds your vision.",
+ "nightmare_enemy_info": "A nightmare is clouding your vision.",
"nightmare_player_info": "You cast a nightmare on player '{0}'.",
- "nightmare_select_info": "Select player for the nightmare:",
+ "nightmare_select_info": "Select a player to inflict with a nightmare:",
"ninja": "Ninja",
"ninja_desc": "Standing still increases your invisibility by 33%, crouching by 33%, and holding a knife by 33%",
@@ -462,6 +489,17 @@
"swapposition": "Position Swap",
"swapposition_desc": "Click [css_useSkill] to swap places with a random enemy",
+ "takeammo": "Take Ammo",
+ "takeammo_desc": "Click [css_useSkill] to take the active weapon's magazine from a random enemy",
+ "takeammo_hud_info1": "No player with an active magazine was found.",
+ "takeammo_hud_info2": "The enemy has no magazines.",
+ "takeammo_enemy_info": "You lost some ammo.",
+
+ "teamteleport": "Team Teleport",
+ "teamteleport_desc": "Press [css_useSkill] to teleport to the teammate you're looking at",
+ "teamteleport_noenemy": "No teammate found",
+ "teamteleport_hud_info": "Found: {0}",
+
"teleporter": "Teleporter",
"teleporter_desc": "You have the chance to swap places with a hit enemy",
"teleporter_desc2": "Your chances of swapping places after a hit: {0}%",
@@ -486,10 +524,10 @@
"toxicsmoke_desc": "Your smoke grenades deal damage",
"tripwire": "Tripwire",
- "tripwire_desc": "Click [css_useSkill] to string a wire between two walls. Enemies touching it show on your radar",
- "tripwire_no_wall_info": "No walls close enough on both sides.",
+ "tripwire_desc": "Click [css_useSkill] to string a wire between two walls. Enemies who touch it appear on your radar",
+ "tripwire_no_wall_info": "There are no walls close enough on both sides.",
"tripwire_placed_info": "Tripwire placed.",
- "tripwire_triggered_info": "'{0}' tripped your wire.",
+ "tripwire_triggered_info": "'{0}' triggered your tripwire.",
"wallhack": "Wallhack",
"wallhack_desc": "You can see enemies through walls",
diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/fr.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/fr.json
index 19a008a..73b6756 100644
--- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/fr.json
+++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/fr.json
@@ -19,7 +19,7 @@
"areareaper": "Faucheur de Zone",
"areareaper_desc": "Vous pouvez choisir un site de bombe à désactiver",
- "areareaper_incorrect_site": "Aucun site de bombe trouvé.",
+ "areareaper_incorrect_site": "Aucun site de bombe trouvé",
"areareaper_no_site": "Aucun site de bombe disponible.",
"areareaper_select_info": "Sélectionnez un site à désactiver :",
"areareaper_site_disabled": "Le site de bombe {0} a été désactivé – aucune bombe ne peut y être posée !",
@@ -51,9 +51,15 @@
"behind_desc": "Vous avez une chance aléatoire de retourner un ennemi à 180° en le touchant",
"behind_desc2": "Votre chance de retourner un ennemi à l’impact est : {0}%",
+ "berserker": "Berserker",
+ "berserker_desc": "Vous infligez plus de dégâts et vous déplacez plus vite à mesure que votre santé diminue",
+
"blademaster": "Maître de Lame",
"blademaster_desc": "En tenant un couteau, vous avez une forte chance de dévier un tir",
+ "blastshot": "Tir explosif",
+ "blastshot_desc": "Appuyez sur Attack2 avec le MP5 pour tirer une grenade HE",
+
"bunnyhop": "Lapin",
"bunnyhop_desc": "Vous obtenez l’auto « BunnyHop »",
@@ -104,6 +110,13 @@
"deaf_player_info": "Le son a été désactivé pour le joueur « {0} ».",
"deaf_select_info": "Couper tous les sons du joueur :",
+ "deathbomb": "Bombe",
+ "deathbomb_desc": "Vous explosez à votre mort, tuant les joueurs proches",
+ "deathbomb_explosion": "Kaboom!",
+
+ "demoneye": "Œil démoniaque",
+ "demoneye_desc": "Vous infligez des dégâts à tous les ennemis que vous regardez",
+
"disarmament": "Désarmement",
"disarmament_desc": "Vous avez une chance aléatoire de faire lâcher son arme à un ennemi en le touchant",
"disarmament_desc2": "Votre chance de désarmer un ennemi est : {0}%",
@@ -129,15 +142,15 @@
"enemyspawn": "Spawn Ennemi",
"enemyspawn_desc": "Appuyez sur [css_useSkill] pour vous téléporter au spawn ennemi",
- "expensiveammo": "expensiveammo",
- "expensiveammo_desc": "expensiveammo_desc",
- "expensiveammo_disable_info": "expensiveammo_disable_info",
- "expensiveammo_enemy_info": "expensiveammo_enemy_info: {0}",
- "expensiveammo_player_info": "expensiveammo_player_info: {0}",
- "expensiveammo_select_info": "expensiveammo_select_info",
+ "expensiveammo": "Munitions coûteuses",
+ "expensiveammo_desc": "Un ennemi choisi doit payer pour chaque tir",
+ "expensiveammo_disable_info": "Vos balles sont à nouveau gratuites.",
+ "expensiveammo_enemy_info": "Chaque tir que vous effectuez vous coûte maintenant {0}$.",
+ "expensiveammo_player_info": "Le joueur '{0}' doit maintenant payer pour chaque balle.",
+ "expensiveammo_select_info": "Sélectionnez un joueur dont les munitions deviendront coûteuses :",
- "explodingbarrel": "explodingbarrel",
- "explodingbarrel_desc": "explodingbarrel_desc",
+ "explodingbarrel": "Baril explosif",
+ "explodingbarrel_desc": "Cliquez sur [css_useSkill] pour placer un baril qui explose lorsqu'il est touché",
"explosiveshot": "Tir Explosif",
"explosiveshot_desc": "Chance aléatoire de tirer une balle explosive en tirant",
@@ -149,10 +162,16 @@
"fastreload": "Recharge Rapide",
"fastreload_desc": "Appuyez sur [css_useSkill] pour recharger l’arme que vous tenez",
+ "firerain": "Pluie de feu",
+ "firerain_desc": "Lancez un leurre pour déclencher une pluie de cocktails Molotov",
+
"flash": "Flash",
"flash_desc": "Vitesse de joueur aléatoire au début du round",
"flash_desc2": "Votre multiplicateur de vitesse est : {0}x",
+ "flashlight": "Lampe torche",
+ "flashlight_desc": "Cliquez sur [css_useSkill] pour allumer ou éteindre la lampe torche. Sa lumière peut aveugler les ennemis",
+
"fortnite": "Fortnite",
"fortnite_desc": "Appuyez sur [css_useSkill] pour créer une barricade destructible",
@@ -175,14 +194,14 @@
"ghost": "Fantôme",
"ghost_desc": "Vous êtes complètement invisible",
- "giant": "giant",
- "giant_desc": "giant_desc",
- "giant_desc2": "giant_desc2: {0}x",
- "giant_disable_info": "giant_disable_info",
- "giant_enemy_info": "giant_enemy_info: {0}x",
- "giant_player_info": "giant_player_info: {0} {1}",
- "giant_select_info": "giant_select_info",
-
+ "giant": "Géant",
+ "giant_desc": "Agrandissez un ennemi de votre choix",
+ "giant_desc2": "Agrandissez un ennemi de votre choix jusqu'à {0}x sa taille normale",
+ "giant_disable_info": "Vous avez retrouvé votre taille normale.",
+ "giant_enemy_info": "Vous avez été agrandi à {0}x votre taille normale.",
+ "giant_player_info": "Vous avez agrandi le joueur '{0}' jusqu'à {1}x sa taille normale.",
+ "giant_select_info": "Sélectionnez un joueur à agrandir :",
+
"glaz": "Glaz",
"glaz_desc": "Vous pouvez voir à travers les fumigènes",
@@ -207,6 +226,9 @@
"healingsmoke": "Fumigène Soin",
"healingsmoke_desc": "Vos fumigènes soignent",
+ "healingchicken": "Poulet guérisseur",
+ "healingchicken_desc": "Vos poulets vous soignent lorsque vous êtes à proximité",
+
"hermit": "Ermite",
"hermit_desc": "Tuer restaure des munitions et une partie de vos PV",
@@ -252,6 +274,12 @@
"jester_on": "ACTIVÉ",
"jester_off": "DÉSACTIVÉ",
+ "jetkick": "Coup de pied propulsé",
+ "jetkick_desc": "Sélectionnez un joueur pour lui donner un coup de pied propulsé",
+ "jetkick_player_info": "Le joueur '{0}' a reçu un coup de pied propulsé.",
+ "jetkick_enemy_info": "Chaque tir vous repousse vers l'arrière",
+ "jetkick_disable_info": "Votre recul est revenu à la normale.",
+
"jumpban": "Sans Jambes",
"jumpban_desc": "Choisissez un joueur qui ne pourra plus sauter",
"jumpban_enemy_info": "Quelqu’un vous a coupé les jambes.",
@@ -259,12 +287,12 @@
"jumpban_player_info": "Le joueur « {0} » ne peut plus sauter.",
"jumpban_select_info": "Interdire de sauter au joueur :",
- "jumpcurse": "jumpcurse",
- "jumpcurse_desc": "jumpcurse_desc",
- "jumpcurse_disable_info": "jumpcurse_disable_info",
- "jumpcurse_enemy_info": "jumpcurse_enemy_info",
- "jumpcurse_player_info": "jumpcurse_player_info: {0}",
- "jumpcurse_select_info": "jumpcurse_select_info",
+ "jumpcurse": "Malédiction du saut",
+ "jumpcurse_desc": "Un ennemi choisi saute chaque fois que l'un de ses coéquipiers saute",
+ "jumpcurse_disable_info": "Vous pouvez à nouveau contrôler vos sauts.",
+ "jumpcurse_enemy_info": "Vous sautez maintenant chaque fois que l'un de vos coéquipiers saute.",
+ "jumpcurse_player_info": "Le joueur '{0}' saute maintenant chaque fois que ses coéquipiers sautent.",
+ "jumpcurse_select_info": "Sélectionnez un joueur à maudire :",
"jumpingjack": "Sauteur",
"jumpingjack_desc": "Sauter vous rend de la vie",
@@ -272,8 +300,12 @@
"killerflash": "Flash Mortel",
"killerflash_desc": "Toute personne totalement aveuglée par votre flashbang meurt (y compris vous)",
- "knockback": "knockback",
- "knockback_desc": "knockback_desc",
+ "knockback": "Repoussement",
+ "knockback_desc": "Tirer dans les airs vous repousse vers l'arrière",
+
+ "lastgasp": "Dernier souffle",
+ "lastgasp_desc": "Après votre mort, vous infligez des dégâts à l'ennemi qui vous a tué",
+
"lifeswap": "Échange de Vie",
"lifeswap_desc": "Choisissez un joueur avec qui échanger votre santé",
"lifeswap_enemy_info": "Quelqu’un a emprunté votre santé.",
@@ -311,16 +343,12 @@
"bankrupt_player_info": "Le joueur « {0} » est en faillite.",
"bankrupt_select_info": "Mettre un joueur en faillite :",
- "deathbomb": "Bombe",
- "deathbomb_desc": "Vous explosez à votre mort, tuant les joueurs proches",
- "deathbomb_explosion": "Kaboom!",
-
- "nightmare": "nightmare",
- "nightmare_desc": "nightmare_desc",
- "nightmare_disable_info": "nightmare_disable_info",
- "nightmare_enemy_info": "nightmare_enemy_info",
- "nightmare_player_info": "nightmare_player_info: {0}",
- "nightmare_select_info": "nightmare_select_info",
+ "nightmare": "Cauchemar",
+ "nightmare_desc": "Faites subir une vision terrifiante à un ennemi choisi",
+ "nightmare_disable_info": "Le cauchemar s'est dissipé.",
+ "nightmare_enemy_info": "Un cauchemar obscurcit votre vision.",
+ "nightmare_player_info": "Vous avez lancé un cauchemar sur le joueur '{0}'.",
+ "nightmare_select_info": "Sélectionnez un joueur pour le cauchemar :",
"ninja": "Ninja",
"ninja_desc": "Rester immobile augmente votre invisibilité de 33%, s’accroupir de 33%, et tenir un couteau de 33%",
@@ -461,6 +489,17 @@
"swapposition": "Échange de Position",
"swapposition_desc": "Appuyez sur [css_useSkill] pour échanger de place avec un ennemi aléatoire",
+ "takeammo": "Prendre des munitions",
+ "takeammo_desc": "Cliquez sur [css_useSkill] pour prendre le chargeur de l'arme active d'un ennemi aléatoire",
+ "takeammo_hud_info1": "Aucun joueur avec un chargeur actif n'a été trouvé.",
+ "takeammo_hud_info2": "L'ennemi n'a pas de chargeur.",
+ "takeammo_enemy_info": "Vous avez perdu des munitions.",
+
+ "teamteleport": "Téléportation d'équipe",
+ "teamteleport_desc": "Appuyez sur [css_useSkill] pour vous téléporter vers le coéquipier que vous regardez",
+ "teamteleport_noenemy": "Aucun coéquipier trouvé",
+ "teamteleport_hud_info": "Trouvé : {0}",
+
"teleporter": "Téléporteur",
"teleporter_desc": "Vous avez une chance d'échanger votre place avec un ennemi touché",
"teleporter_desc2": "Vos chances d'échanger votre place après un coup : {0}%",
@@ -484,12 +523,12 @@
"toxicsmoke": "Fumée Toxique",
"toxicsmoke_desc": "Vos grenades fumigènes infligent des dégâts",
- "tripwire": "tripwire",
- "tripwire_desc": "tripwire_desc",
- "tripwire_no_wall_info": "tripwire_no_wall_info",
- "tripwire_placed_info": "tripwire_placed_info",
- "tripwire_triggered_info": "tripwire_triggered_info: {0}",
-
+ "tripwire": "Fil-piège",
+ "tripwire_desc": "Cliquez sur [css_useSkill] pour tendre un fil entre deux murs. Les ennemis qui le touchent apparaissent sur votre radar",
+ "tripwire_no_wall_info": "Aucun mur n'est suffisamment proche des deux côtés.",
+ "tripwire_placed_info": "Fil-piège placé.",
+ "tripwire_triggered_info": "'{0}' a déclenché votre fil-piège.",
+
"wallhack": "Wallhack",
"wallhack_desc": "Vous pouvez voir les ennemis à travers les murs",
@@ -568,6 +607,6 @@
"summary": "Résumé du dernier round",
"menu_controlls_scroll": "W/S - Défilement",
- "menu_controlls_padding": " | ",
+ "menu_controlls_padding": " | ",
"menu_controlls_select": "E - Sélectionner"
}
diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pl.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pl.json
index c8958da..4045536 100644
--- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pl.json
+++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pl.json
@@ -51,9 +51,15 @@
"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}%",
+ "berserker": "Berserker",
+ "berserker_desc": "Zadajesz więcej obrażeń i poruszasz się szybciej, gdy masz mniej zdrowia",
+
"blademaster": "Mistrz Ostrza",
"blademaster_desc": "Trzymając nóż, masz duże szanse na odparcie strzału",
+ "blastshot": "Mocne Uderzenie",
+ "blastshot_desc": "Naciśnij Attack2 na MP5, aby wystrzelić granat HE",
+
"bunnyhop": "Królik",
"bunnyhop_desc": "Otrzymujesz auto \"BunnyHopa\"",
@@ -104,6 +110,13 @@
"deaf_player_info": "Dźwięk został wyłączony dla gracza '{0}'.",
"deaf_select_info": "Wycisz dźwięki gracza:",
+ "deathbomb": "Ludzka bomba",
+ "deathbomb_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu",
+ "deathbomb_explosion": "Kaboom!",
+
+ "demoneye": "Oko Demona",
+ "demoneye_desc": "Zadajesz obrażenia wszystkim przeciwnikom, na których patrzysz",
+
"disarmament": "Rozbrojenie",
"disarmament_desc": "Masz losową szanse na wyrzucenie broni wroga po trafieniu",
"disarmament_desc2": "Twoje szanse na wyrzucenie broni wroga to: {0}%",
@@ -129,16 +142,16 @@
"enemyspawn": "Resp Wroga",
"enemyspawn_desc": "Kliknij [css_useSkill], aby teleportować się na resp wroga",
- "expensiveammo": "expensiveammo",
- "expensiveammo_desc": "expensiveammo_desc",
- "expensiveammo_disable_info": "expensiveammo_disable_info",
- "expensiveammo_enemy_info": "expensiveammo_enemy_info: {0}",
- "expensiveammo_player_info": "expensiveammo_player_info: {0}",
- "expensiveammo_select_info": "expensiveammo_select_info",
+ "expensiveammo": "Droga Amunicja",
+ "expensiveammo_desc": "Wybrany przeciwnik musi płacić za każdy oddany strzał",
+ "expensiveammo_disable_info": "Twoje pociski znów są darmowe.",
+ "expensiveammo_enemy_info": "Każdy Twój strzał kosztuje teraz {0}$.",
+ "expensiveammo_player_info": "Gracz '{0}' musi teraz płacić za każdy pocisk.",
+ "expensiveammo_select_info": "Wybierz gracza, którego amunicja stanie się droga:",
+
+ "explodingbarrel": "Wybuchowa Beczka",
+ "explodingbarrel_desc": "Kliknij [css_useSkill], aby postawić beczkę, która wybucha po trafieniu",
- "explodingbarrel": "explodingbarrel",
- "explodingbarrel_desc": "explodingbarrel_desc",
-
"explosiveshot": "Strzał Wybuchowy",
"explosiveshot_desc": "Losowa szansa wystrzelenia pocisku wybuchowego podczas strzelania",
"explosiveshot_desc2": "Twoja szansa na wystrzelenie pocisku wybuchowego: {0}%",
@@ -149,10 +162,16 @@
"fastreload": "Szybkie Rączki",
"fastreload_desc": "Kliknij [css_useSkill], aby przeładować broń, którą obecnie trzymasz",
+ "firerain": "Deszcz Ognia",
+ "firerain_desc": "Rzuć wabik, aby przywołać deszcz koktajli Mołotowa",
+
"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",
+ "flashlight": "Latarka",
+ "flashlight_desc": "Kliknij [css_useSkill], aby włączyć lub wyłączyć latarkę. Jej światło może oślepić przeciwników",
+
"fortnite": "Fortnite",
"fortnite_desc": "Kliknij [css_useSkill], aby stworzyć barykadę, którą można zniszczyć",
@@ -175,14 +194,14 @@
"ghost": "Duszek",
"ghost_desc": "Jesteś całkowicie niewidzialny",
- "giant": "giant",
- "giant_desc": "giant_desc",
- "giant_desc2": "giant_desc2: {0}x",
- "giant_disable_info": "giant_disable_info",
- "giant_enemy_info": "giant_enemy_info: {0}x",
- "giant_player_info": "giant_player_info: {0} {1}",
- "giant_select_info": "giant_select_info",
-
+ "giant": "Olbrzym",
+ "giant_desc": "Powiększ wybranego przeciwnika",
+ "giant_desc2": "Powiększ wybranego przeciwnika do {0}x normalnego rozmiaru",
+ "giant_disable_info": "Wróciłeś do normalnego rozmiaru.",
+ "giant_enemy_info": "Zostałeś powiększony do {0}x normalnego rozmiaru.",
+ "giant_player_info": "Powiększyłeś gracza '{0}' do {1}x normalnego rozmiaru.",
+ "giant_select_info": "Wybierz gracza do powiększenia:",
+
"glaz": "Glaz",
"glaz_desc": "Nie widzisz granatów dymnych",
@@ -207,6 +226,9 @@
"healingsmoke": "Leczący Dym",
"healingsmoke_desc": "Twoje granaty dymne leczą",
+ "healingchicken": "Lecząca Kura",
+ "healingchicken_desc": "Twoje kury leczą Cię, gdy jesteś w pobliżu",
+
"hermit": "Pustelnik",
"hermit_desc": "Zabijanie przywraca amunicję i część zdrowia",
@@ -252,6 +274,12 @@
"jester_on": "WŁ.",
"jester_off": "WYŁ.",
+ "jetkick": "Odrzutowy Kop",
+ "jetkick_desc": "Wybierz gracza, aby użyć na nim odrzutowego kopa",
+ "jetkick_player_info": "Gracz '{0}' został odrzucony kopem.",
+ "jetkick_enemy_info": "Każdy strzał mocno odrzuca Cię do tyłu",
+ "jetkick_disable_info": "Twój odrzut wrócił do normy.",
+
"jumpban": "Beznogi",
"jumpban_desc": "Wybierasz gracza, który nie będzie mógł skakać",
"jumpban_enemy_info": "Ktoś odciął ci nogi.",
@@ -259,12 +287,12 @@
"jumpban_player_info": "Gracz '{0}' nie może teraz skakać.",
"jumpban_select_info": "Zablokuj skok dla gracza:",
- "jumpcurse": "jumpcurse",
- "jumpcurse_desc": "jumpcurse_desc",
- "jumpcurse_disable_info": "jumpcurse_disable_info",
- "jumpcurse_enemy_info": "jumpcurse_enemy_info",
- "jumpcurse_player_info": "jumpcurse_player_info: {0}",
- "jumpcurse_select_info": "jumpcurse_select_info",
+ "jumpcurse": "Klątwa Skakania",
+ "jumpcurse_desc": "Wybrany przeciwnik skacze za każdym razem, gdy skacze jeden z jego sojuszników",
+ "jumpcurse_disable_info": "Znów możesz kontrolować swoje skoki.",
+ "jumpcurse_enemy_info": "Teraz skaczesz za każdym razem, gdy skacze jeden z Twoich sojuszników.",
+ "jumpcurse_player_info": "Gracz '{0}' skacze teraz za każdym razem, gdy robią to jego sojusznicy.",
+ "jumpcurse_select_info": "Wybierz gracza do przeklęcia:",
"jumpingjack": "Pajacyk",
"jumpingjack_desc": "Skakanie przywraca zdrowie",
@@ -272,8 +300,12 @@
"killerflash": "Zabójczy Flash",
"killerflash_desc": "Każdy całkowicie oślepiony twoim granatem umiera (również ty)",
- "knockback": "knockback",
- "knockback_desc": "knockback_desc",
+ "knockback": "Odrzut",
+ "knockback_desc": "Strzelanie w powietrzu odpycha Cię do tyłu",
+
+ "lastgasp": "Ostatnie Tchnienie",
+ "lastgasp_desc": "Po śmierci zadajesz obrażenia przeciwnikowi, który Cię zabił",
+
"lifeswap": "Zamiana Żyć",
"lifeswap_desc": "Wybierasz gracza, z którym chcesz wymienić się zdrowiem",
"lifeswap_enemy_info": "Ktoś pożyczył sobie twoje zdrowie.",
@@ -311,16 +343,12 @@
"moneyswap_player_info": "Wymieniłeś swoje pieniądze z graczem '{0}'.",
"moneyswap_select_info": "Zamień się kasą z graczem:",
- "deathbomb": "Ludzka bomba",
- "deathbomb_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu",
- "deathbomb_explosion": "Kaboom!",
-
- "nightmare": "nightmare",
- "nightmare_desc": "nightmare_desc",
- "nightmare_disable_info": "nightmare_disable_info",
- "nightmare_enemy_info": "nightmare_enemy_info",
- "nightmare_player_info": "nightmare_player_info: {0}",
- "nightmare_select_info": "nightmare_select_info",
+ "nightmare": "Koszmar",
+ "nightmare_desc": "Wywołaj u wybranego przeciwnika przerażającą wizję",
+ "nightmare_disable_info": "Koszmar minął.",
+ "nightmare_enemy_info": "Koszmar przesłania Ci wzrok.",
+ "nightmare_player_info": "Rzuciłeś koszmar na gracza '{0}'.",
+ "nightmare_select_info": "Wybierz gracza do nałożenia koszmaru:",
"ninja": "Ninja",
"ninja_desc": "Stojąc nieruchomo zwiększasz swoją niewidzialność o 33%, kucając o 33%, a trzymając nóż o 33%",
@@ -461,6 +489,17 @@
"swapposition": "Zamiana Miejsc",
"swapposition_desc": "Kliknij [css_useSkill], aby zamienić się miejscami z losowym przeciwnikiem",
+ "takeammo": "Zabierz Amunicję",
+ "takeammo_desc": "Kliknij [css_useSkill], aby zabrać magazynek aktywnej broni losowego przeciwnika",
+ "takeammo_hud_info1": "Nie znaleziono gracza z aktywnym magazynkiem.",
+ "takeammo_hud_info2": "Przeciwnik nie ma magazynków.",
+ "takeammo_enemy_info": "Straciłeś trochę amunicji.",
+
+ "teamteleport": "Teleport do drużyny",
+ "teamteleport_desc": "Naciśnij [css_useSkill], aby teleportować się do członka drużyny, na którego patrzysz",
+ "teamteleport_noenemy": "Nie znaleziono członka drużyny",
+ "teamteleport_hud_info": "Znaleziono: {0}",
+
"teleporter": "Teleporter",
"teleporter_desc": "Masz szansę na zamianę miejsc z trafionym wrogiem",
"teleporter_desc2": "Szansa na zamianę miejsc po trafieniu: {0}%",
@@ -484,11 +523,11 @@
"toxicsmoke": "Toksyczny Dym",
"toxicsmoke_desc": "Twoje granaty dymny zadają obrażenia",
- "tripwire": "tripwire",
- "tripwire_desc": "tripwire_desc",
- "tripwire_no_wall_info": "tripwire_no_wall_info",
- "tripwire_placed_info": "tripwire_placed_info",
- "tripwire_triggered_info": "tripwire_triggered_info: {0}",
+ "tripwire": "Linka z Drutu",
+ "tripwire_desc": "Kliknij [css_useSkill], aby rozciągnąć drut między dwiema ścianami. Wrogowie, którzy go dotkną, pojawią się na Twoim radarze",
+ "tripwire_no_wall_info": "Po obu stronach nie ma wystarczająco blisko położonych ścian.",
+ "tripwire_placed_info": "Linka została rozstawiona.",
+ "tripwire_triggered_info": "'{0}' uruchomił Twoją linkę.",
"wallhack": "Wallhack",
"wallhack_desc": "Widzisz wrogów przez ściany",
@@ -568,6 +607,6 @@
"summary": "Podsumowanie z ostatniej rundy",
"menu_controlls_scroll": "W/S – Przewijanie",
- "menu_controlls_padding": " | ",
+ "menu_controlls_padding": " | ",
"menu_controlls_select": "E - Wybierz"
}
diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pt-br.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pt-br.json
index 907e797..bc31f3b 100644
--- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pt-br.json
+++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pt-br.json
@@ -51,9 +51,15 @@
"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 acertá-lo é: {0}%",
+ "berserker": "Berserker",
+ "berserker_desc": "Você causa mais dano e se move mais rápido conforme sua vida diminui",
+
"blademaster": "Mestre das Lâminas",
"blademaster_desc": "Enquanto segura a faca, você tem chance de desviar de um tiro",
+ "blastshot": "Tiro Explosivo",
+ "blastshot_desc": "Pressione Attack2 com a MP5 para disparar uma granada HE",
+
"bunnyhop": "Coelho",
"bunnyhop_desc": "Você ganha \"BunnyHop\" automático",
@@ -104,6 +110,13 @@
"deaf_player_info": "O som foi desativado para o jogador '{0}'.",
"deaf_select_info": "Silenciar jogador:",
+ "deathbomb": "Bomba mortal",
+ "deathbomb_desc": "Você explode ao morrer, matando os jogadores próximos",
+ "deathbomb_explosion": "Kaboom!",
+
+ "demoneye": "Olho Demoníaco",
+ "demoneye_desc": "Você causa dano a todos os inimigos que estiver olhando",
+
"disarmament": "Desarmamento",
"disarmament_desc": "Você tem uma chance aleatória de fazer um inimigo dropar a arma ao acertá-lo",
"disarmament_desc2": "Sua chance de desarmar um inimigo é: {0}%",
@@ -129,16 +142,16 @@
"enemyspawn": "Spawn Inimigo",
"enemyspawn_desc": "Clique em [css_useSkill] para se teletransportar para a base inimiga",
- "expensiveammo": "expensiveammo",
- "expensiveammo_desc": "expensiveammo_desc",
- "expensiveammo_disable_info": "expensiveammo_disable_info",
- "expensiveammo_enemy_info": "expensiveammo_enemy_info: {0}",
- "expensiveammo_player_info": "expensiveammo_player_info: {0}",
- "expensiveammo_select_info": "expensiveammo_select_info",
+ "expensiveammo": "Munição Cara",
+ "expensiveammo_desc": "Um inimigo escolhido precisa pagar por cada disparo",
+ "expensiveammo_disable_info": "Suas balas voltaram a ser gratuitas.",
+ "expensiveammo_enemy_info": "Agora cada tiro que você dispara custa {0}$.",
+ "expensiveammo_player_info": "O jogador '{0}' agora precisa pagar por cada bala.",
+ "expensiveammo_select_info": "Selecione um jogador cuja munição ficará cara:",
+
+ "explodingbarrel": "Barril Explosivo",
+ "explodingbarrel_desc": "Clique em [css_useSkill] para colocar um barril que explode quando atingido",
- "explodingbarrel": "explodingbarrel",
- "explodingbarrel_desc": "explodingbarrel_desc",
-
"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}%",
@@ -149,10 +162,16 @@
"fastreload": "Recarga Rápida",
"fastreload_desc": "Clique em [css_useSkill] para recarregar a arma que você está segurando",
+ "firerain": "Chuva de Fogo",
+ "firerain_desc": "Jogue uma isca para chamar uma chuva de Molotovs",
+
"flash": "Ligeirinho",
"flash_desc": "Velocidade de movimentação aleatória no início da rodada",
"flash_desc2": "Seu multiplicador de velocidade é: {0}x",
+ "flashlight": "Lanterna",
+ "flashlight_desc": "Clique em [css_useSkill] para ligar ou desligar a lanterna. Sua luz pode cegar os inimigos",
+
"fortnite": "Fortnite",
"fortnite_desc": "Clique em [css_useSkill] para criar uma barreira destrutível",
@@ -175,14 +194,14 @@
"ghost": "Fantasma",
"ghost_desc": "Você é completamente invisível",
- "giant": "giant",
- "giant_desc": "giant_desc",
- "giant_desc2": "giant_desc2: {0}x",
- "giant_disable_info": "giant_disable_info",
- "giant_enemy_info": "giant_enemy_info: {0}x",
- "giant_player_info": "giant_player_info: {0} {1}",
- "giant_select_info": "giant_select_info",
-
+ "giant": "Gigante",
+ "giant_desc": "Aumente o tamanho de um inimigo à sua escolha",
+ "giant_desc2": "Aumente o tamanho de um inimigo à sua escolha para {0}x o tamanho normal",
+ "giant_disable_info": "Você voltou ao seu tamanho normal.",
+ "giant_enemy_info": "Você foi aumentado para {0}x o tamanho normal.",
+ "giant_player_info": "Você aumentou o jogador '{0}' para {1}x o tamanho normal.",
+ "giant_select_info": "Selecione um jogador para aumentar:",
+
"glaz": "Smoke Transparente",
"glaz_desc": "Smokes tornam-se transparentes para você",
@@ -207,6 +226,9 @@
"healingsmoke": "Smoke Amiga",
"healingsmoke_desc": "Suas smokes curam",
+ "healingchicken": "Galinha Curadora",
+ "healingchicken_desc": "Suas galinhas curam você enquanto você estiver por perto",
+
"hermit": "Sanguessuga",
"hermit_desc": "Matar restaura munição e uma parte da sua vida",
@@ -252,6 +274,12 @@
"jester_on": "LIG.",
"jester_off": "DESL.",
+ "jetkick": "Chute a Jato",
+ "jetkick_desc": "Selecione um jogador para aplicar um chute a jato",
+ "jetkick_player_info": "O jogador '{0}' recebeu um chute a jato.",
+ "jetkick_enemy_info": "Cada tiro empurra você para trás",
+ "jetkick_disable_info": "Seu recuo voltou ao normal.",
+
"jumpban": "Perneta",
"jumpban_desc": "Escolha um jogador que não poderá pular",
"jumpban_enemy_info": "Cortaram as suas pernas.",
@@ -259,12 +287,12 @@
"jumpban_player_info": "O jogador '{0}' não pode mais pular.",
"jumpban_select_info": "Banir pulo do jogador:",
- "jumpcurse": "jumpcurse",
- "jumpcurse_desc": "jumpcurse_desc",
- "jumpcurse_disable_info": "jumpcurse_disable_info",
- "jumpcurse_enemy_info": "jumpcurse_enemy_info",
- "jumpcurse_player_info": "jumpcurse_player_info: {0}",
- "jumpcurse_select_info": "jumpcurse_select_info",
+ "jumpcurse": "Maldição do Salto",
+ "jumpcurse_desc": "Um inimigo escolhido pula sempre que um de seus companheiros pula",
+ "jumpcurse_disable_info": "Você pode controlar seus saltos novamente.",
+ "jumpcurse_enemy_info": "Agora você pula sempre que um de seus companheiros pula.",
+ "jumpcurse_player_info": "O jogador '{0}' agora pula sempre que seus companheiros pulam.",
+ "jumpcurse_select_info": "Selecione um jogador para amaldiçoar:",
"jumpingjack": "Pula-Pula",
"jumpingjack_desc": "Pular restaura vida",
@@ -272,8 +300,11 @@
"killerflash": "Flash Mortal",
"killerflash_desc": "Qualquer pessoa cega pela sua flash morre (incluindo você)",
- "knockback": "knockback",
- "knockback_desc": "knockback_desc",
+ "knockback": "Repulsão",
+ "knockback_desc": "Atirar enquanto estiver no ar empurra você para trás",
+
+ "lastgasp": "Último Suspiro",
+ "lastgasp_desc": "Após morrer, você causa dano ao inimigo que matou você",
"lifeswap": "Troca de Vida",
"lifeswap_desc": "Escolha um jogador para trocar de vida",
@@ -312,16 +343,12 @@
"moneyswap_player_info": "Você trocou dinheiro com o jogador '{0}'.",
"moneyswap_select_info": "Trocar dinheiro c/ jogador:",
- "deathbomb": "Bomba mortal",
- "deathbomb_desc": "Você explode ao morrer, matando os jogadores próximos",
- "deathbomb_explosion": "Kaboom!",
-
- "nightmare": "nightmare",
- "nightmare_desc": "nightmare_desc",
- "nightmare_disable_info": "nightmare_disable_info",
- "nightmare_enemy_info": "nightmare_enemy_info",
- "nightmare_player_info": "nightmare_player_info: {0}",
- "nightmare_select_info": "nightmare_select_info",
+ "nightmare": "Pesadelo",
+ "nightmare_desc": "Faça um inimigo escolhido ter uma visão aterrorizante",
+ "nightmare_disable_info": "O pesadelo desapareceu.",
+ "nightmare_enemy_info": "Um pesadelo está obscurecendo sua visão.",
+ "nightmare_player_info": "Você lançou um pesadelo sobre o jogador '{0}'.",
+ "nightmare_select_info": "Selecione um jogador para o pesadelo:",
"ninja": "Ninja",
"ninja_desc": "Ficar parado aumenta sua invisibilidade em 33%, agachar em 33%, e segurar uma faca em 33%",
@@ -462,6 +489,17 @@
"swapposition": "Troca de Posição",
"swapposition_desc": "Clique em [css_useSkill] para trocar de lugar com um inimigo aleatório",
+ "takeammo": "Pegar Munição",
+ "takeammo_desc": "Clique em [css_useSkill] para pegar o carregador da arma ativa de um inimigo aleatório",
+ "takeammo_hud_info1": "Nenhum jogador com um carregador ativo foi encontrado.",
+ "takeammo_hud_info2": "O inimigo não possui carregadores.",
+ "takeammo_enemy_info": "Você perdeu um pouco de munição.",
+
+ "teamteleport": "Teleporte para o Time",
+ "teamteleport_desc": "Pressione [css_useSkill] para se teleportar até o companheiro de equipe que você está olhando",
+ "teamteleport_noenemy": "Nenhum companheiro de equipe encontrado",
+ "teamteleport_hud_info": "Encontrado: {0}",
+
"teleporter": "Teletransportador",
"teleporter_desc": "Você tem a chance de trocar de lugar com um inimigo atingido",
"teleporter_desc2": "Sua chance de trocar de lugar após o acerto: {0}%",
@@ -485,11 +523,11 @@
"toxicsmoke": "Smoke Tóxica",
"toxicsmoke_desc": "Suas smokes causam dano",
- "tripwire": "tripwire",
- "tripwire_desc": "tripwire_desc",
- "tripwire_no_wall_info": "tripwire_no_wall_info",
- "tripwire_placed_info": "tripwire_placed_info",
- "tripwire_triggered_info": "tripwire_triggered_info: {0}",
+ "tripwire": "Fio de Armadilha",
+ "tripwire_desc": "Clique em [css_useSkill] para estender um fio entre duas paredes. Inimigos que tocarem nele aparecerão no seu radar",
+ "tripwire_no_wall_info": "Não há paredes próximas o suficiente dos dois lados.",
+ "tripwire_placed_info": "Fio de armadilha colocado.",
+ "tripwire_triggered_info": "'{0}' acionou seu fio.",
"wallhack": "Wallhack",
"wallhack_desc": "Você pode ver inimigos através das paredes",
@@ -569,6 +607,6 @@
"summary": "Resumo da última rodada",
"menu_controlls_scroll": "W/S - Rolar",
- "menu_controlls_padding": " | ",
+ "menu_controlls_padding": " | ",
"menu_controlls_select": "E - Selecionar"
}
diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/ru.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/ru.json
index f77d7cc..2702d1c 100644
--- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/ru.json
+++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/ru.json
@@ -38,11 +38,11 @@
"astronaut_desc": "В начале раунда вам выдаётся случайное значение гравитации",
"astronaut_desc2": "Ваша случайная гравитация: {0}x",
- "moneyswap": "Налоговик",
- "moneyswap_desc": "Выберите игрока для обмена деньгами",
- "moneyswap_enemy_info": "Налоговая служба добралась до вас.",
- "moneyswap_player_info": "Вы обменялись деньгами с игроком '{0}'.",
- "moneyswap_select_info": "Обменять деньги с игроком:",
+ "bankrupt": "Банкрот",
+ "bankrupt_desc": "Выберите игрока, который потеряет все свои деньги",
+ "bankrupt_enemy_info": "Вы обанкротились.",
+ "bankrupt_player_info": "Игрок '{0}' обанкротился.",
+ "bankrupt_select_info": "Выберите игрока для банкротства:",
"baseball": "Бейсболист",
"baseball_desc": "Ваша ложная граната отскакивает от стен и мгновенно убивает врага при попадании",
@@ -51,9 +51,15 @@
"behind_desc": "Есть шанс развернуть врага на 180° при попадании",
"behind_desc2": "Ваш шанс развернуть врага при попадании: {0}%",
+ "berserker": "Берсерк",
+ "berserker_desc": "Чем меньше у вас здоровья, тем больше урона вы наносите и тем быстрее двигаетесь",
+
"blademaster": "Мастер клинка",
"blademaster_desc": "С ножом в руках у вас высокий шанс отразить выстрел",
+ "blastshot": "Взрывной выстрел",
+ "blastshot_desc": "Нажмите Attack2 на MP5, чтобы выстрелить гранатой HE",
+
"bunnyhop": "Заяц",
"bunnyhop_desc": "Вы получаете автоматический «БанниХоп»",
@@ -104,6 +110,13 @@
"deaf_player_info": "Звук отключён для игрока '{0}'.",
"deaf_select_info": "Отключить звук для игрока:",
+ "deathbomb": "Смертельная бомба",
+ "deathbomb_desc": "Вы взрываетесь при смерти, убивая ближайших игроков",
+ "deathbomb_explosion": "АЛЛАХУ АКБАР!!!",
+
+ "demoneye": "Око демона",
+ "demoneye_desc": "Вы наносите урон каждому врагу, на которого смотрите",
+
"disarmament": "Разоружение",
"disarmament_desc": "Есть шанс заставить врага выронить оружие при попадании",
"disarmament_desc2": "Ваш шанс разоружить врага: {0}%",
@@ -129,15 +142,15 @@
"enemyspawn": "Спавн врагов",
"enemyspawn_desc": "Нажмите [css_useSkill], чтобы телепортироваться на спавн врагов",
- "expensiveammo": "expensiveammo",
- "expensiveammo_desc": "expensiveammo_desc",
- "expensiveammo_disable_info": "expensiveammo_disable_info",
- "expensiveammo_enemy_info": "expensiveammo_enemy_info: {0}",
- "expensiveammo_player_info": "expensiveammo_player_info: {0}",
- "expensiveammo_select_info": "expensiveammo_select_info",
+ "expensiveammo": "Дорогие патроны",
+ "expensiveammo_desc": "Выбранный противник платит за каждый выстрел",
+ "expensiveammo_disable_info": "Теперь ваши патроны снова бесплатны.",
+ "expensiveammo_enemy_info": "Теперь каждый ваш выстрел стоит {0}$.",
+ "expensiveammo_player_info": "Игрок '{0}' теперь должен платить за каждый патрон.",
+ "expensiveammo_select_info": "Выберите игрока, для которого патроны станут дорогими:",
- "explodingbarrel": "explodingbarrel",
- "explodingbarrel_desc": "explodingbarrel_desc",
+ "explodingbarrel": "Взрывающаяся бочка",
+ "explodingbarrel_desc": "Нажмите [css_useSkill], чтобы установить бочку, которая взрывается при попадании",
"explosiveshot": "Взрывной выстрел",
"explosiveshot_desc": "Случайный шанс выстрелить взрывной пулей при стрельбе",
@@ -149,10 +162,16 @@
"fastreload": "Быстрая перезарядка",
"fastreload_desc": "Нажмите [css_useSkill], чтобы перезарядить текущее оружие",
+ "firerain": "Огненный дождь",
+ "firerain_desc": "Бросьте приманку, чтобы вызвать дождь из коктейлей Молотова",
+
"flash": "Флеш",
"flash_desc": "Случайная скорость игрока в начале раунда",
"flash_desc2": "Ваш множитель скорости: {0}x",
+ "flashlight": "Фонарик",
+ "flashlight_desc": "Нажмите [css_useSkill], чтобы включить или выключить фонарик. Его свет может ослеплять врагов",
+
"fortnite": "Фортнайт",
"fortnite_desc": "Нажмите [css_useSkill], чтобы создать разрушаемую баррикаду",
@@ -175,14 +194,14 @@
"ghost": "Призрак",
"ghost_desc": "Вы полностью невидимы",
- "giant": "giant",
- "giant_desc": "giant_desc",
- "giant_desc2": "giant_desc2: {0}x",
- "giant_disable_info": "giant_disable_info",
- "giant_enemy_info": "giant_enemy_info: {0}x",
- "giant_player_info": "giant_player_info: {0} {1}",
- "giant_select_info": "giant_select_info",
-
+ "giant": "Гигант",
+ "giant_desc": "Увеличьте выбранного противника",
+ "giant_desc2": "Увеличьте выбранного противника до {0}-кратного размера",
+ "giant_disable_info": "Вы снова обычного размера.",
+ "giant_enemy_info": "Ваш размер увеличен до {0}-кратного.",
+ "giant_player_info": "Вы увеличили игрока '{0}' до {1}-кратного размера.",
+ "giant_select_info": "Выберите игрока для увеличения:",
+
"glaz": "Глаз",
"glaz_desc": "Вы видите сквозь дымовые гранаты",
@@ -204,6 +223,9 @@
"grenadier": "Гренадёр",
"grenadier_desc": "У вас бесконечные осколочные гранаты",
+ "healingchicken": "Лечащая курица",
+ "healingchicken_desc": "Ваши куры лечат вас, пока вы находитесь рядом",
+
"healingsmoke": "Лечащий дым",
"healingsmoke_desc": "Ваши дымовые гранаты лечат",
@@ -252,6 +274,12 @@
"jester_on": "ВКЛ",
"jester_off": "ВЫКЛ",
+ "jetkick": "Реактивный удар",
+ "jetkick_desc": "Выберите игрока для реактивного удара",
+ "jetkick_player_info": "Игрок '{0}' получил реактивный удар.",
+ "jetkick_enemy_info": "Каждый выстрел отбрасывает вас назад",
+ "jetkick_disable_info": "Ваша отдача вернулась к норме.",
+
"jumpban": "Безногий",
"jumpban_desc": "Выберите игрока, который не сможет прыгать",
"jumpban_enemy_info": "Кто-то отрезал вам ноги.",
@@ -259,12 +287,12 @@
"jumpban_player_info": "Игрок '{0}' больше не может прыгать.",
"jumpban_select_info": "Запретить прыжки игроку:",
- "jumpcurse": "jumpcurse",
- "jumpcurse_desc": "jumpcurse_desc",
- "jumpcurse_disable_info": "jumpcurse_disable_info",
- "jumpcurse_enemy_info": "jumpcurse_enemy_info",
- "jumpcurse_player_info": "jumpcurse_player_info: {0}",
- "jumpcurse_select_info": "jumpcurse_select_info",
+ "jumpcurse": "Проклятие прыжка",
+ "jumpcurse_desc": "Выбранный противник прыгает каждый раз, когда прыгает кто-либо из его союзников",
+ "jumpcurse_disable_info": "Теперь вы снова можете контролировать свои прыжки.",
+ "jumpcurse_enemy_info": "Теперь вы будете прыгать каждый раз, когда прыгает кто-либо из ваших союзников.",
+ "jumpcurse_player_info": "Игрок '{0}' теперь прыгает вместе со своими союзниками.",
+ "jumpcurse_select_info": "Выберите игрока для проклятия:",
"jumpingjack": "Прыгающий Джек",
"jumpingjack_desc": "Прыжки восстанавливают здоровье",
@@ -272,8 +300,11 @@
"killerflash": "Смертельная флешка",
"killerflash_desc": "Любой, полностью ослеплённый вашей флешкой, погибает (включая вас)",
- "knockback": "knockback",
- "knockback_desc": "knockback_desc",
+ "knockback": "Отдача",
+ "knockback_desc": "Стрельба в воздухе отталкивает вас назад",
+
+ "lastgasp": "Последний вздох",
+ "lastgasp_desc": "После смерти вы наносите урон врагу, который вас убил",
"lifeswap": "Обмен жизнями",
"lifeswap_desc": "Выберите игрока для обмена здоровьем",
@@ -306,22 +337,18 @@
"miner": "Минёр",
"miner_desc": "Ваша осколочная граната взрывается только когда рядом есть враг",
- "bankrupt": "Банкрот",
- "bankrupt_desc": "Выберите игрока, который потеряет все свои деньги",
- "bankrupt_enemy_info": "Вы обанкротились.",
- "bankrupt_player_info": "Игрок '{0}' обанкротился.",
- "bankrupt_select_info": "Выберите игрока для банкротства:",
+ "moneyswap": "Налоговик",
+ "moneyswap_desc": "Выберите игрока для обмена деньгами",
+ "moneyswap_enemy_info": "Налоговая служба добралась до вас.",
+ "moneyswap_player_info": "Вы обменялись деньгами с игроком '{0}'.",
+ "moneyswap_select_info": "Обменять деньги с игроком:",
- "deathbomb": "Смертельная бомба",
- "deathbomb_desc": "Вы взрываетесь при смерти, убивая ближайших игроков",
- "deathbomb_explosion": "АЛЛАХУ АКБАР!!!",
-
- "nightmare": "nightmare",
- "nightmare_desc": "nightmare_desc",
- "nightmare_disable_info": "nightmare_disable_info",
- "nightmare_enemy_info": "nightmare_enemy_info",
- "nightmare_player_info": "nightmare_player_info: {0}",
- "nightmare_select_info": "nightmare_select_info",
+ "nightmare": "Кошмар",
+ "nightmare_desc": "Заставьте выбранного противника увидеть кошмарное видение",
+ "nightmare_disable_info": "Кошмар рассеялся.",
+ "nightmare_enemy_info": "Кошмар затуманивает ваше зрение.",
+ "nightmare_player_info": "Вы наложили кошмар на игрока '{0}'.",
+ "nightmare_select_info": "Выберите игрока для кошмара:",
"ninja": "Ниндзя",
"ninja_desc": "Стоя на месте, ваша невидимость увеличивается на 33%, в приседе на 33%, с ножом на 33%",
@@ -462,6 +489,17 @@
"swapposition": "Обмен позициями",
"swapposition_desc": "Нажмите [css_useSkill], чтобы поменяться местами со случайным врагом",
+ "takeammo": "Забрать патроны",
+ "takeammo_desc": "Нажмите [css_useSkill], чтобы забрать магазин активного оружия случайного противника",
+ "takeammo_hud_info1": "Не найден игрок с активным магазином.",
+ "takeammo_hud_info2": "У противника нет магазинов.",
+ "takeammo_enemy_info": "Вы потеряли немного боеприпасов.",
+
+ "teamteleport": "Телепортация к союзнику",
+ "teamteleport_desc": "Нажмите [css_useSkill], чтобы телепортироваться к союзнику, на которого вы смотрите",
+ "teamteleport_noenemy": "Союзник не найден",
+ "teamteleport_hud_info": "Найден: {0}",
+
"teleporter": "Телепортер",
"teleporter_desc": "Есть шанс поменяться местами с врагом при попадании",
"teleporter_desc2": "Ваш шанс обмена местами после попадания: {0}%",
@@ -485,12 +523,12 @@
"toxicsmoke": "Токсичный дым",
"toxicsmoke_desc": "Ваши дымовые гранаты наносят урон",
- "tripwire": "tripwire",
- "tripwire_desc": "tripwire_desc",
- "tripwire_no_wall_info": "tripwire_no_wall_info",
- "tripwire_placed_info": "tripwire_placed_info",
- "tripwire_triggered_info": "tripwire_triggered_info: {0}",
-
+ "tripwire": "Растяжка",
+ "tripwire_desc": "Нажмите [css_useSkill], чтобы натянуть трос между двумя стенами. Враги, задевшие его, отображаются на вашем радаре",
+ "tripwire_no_wall_info": "С обеих сторон нет достаточно близких стен.",
+ "tripwire_placed_info": "Растяжка установлена.",
+ "tripwire_triggered_info": "'{0}' задел вашу растяжку.",
+
"wallhack": "Воллхак",
"wallhack_desc": "Вы видите врагов сквозь стены",
@@ -569,6 +607,6 @@
"summary": "Итоги прошедшего раунда",
"menu_controlls_scroll": "W/S — Прокрутка",
- "menu_controlls_padding": " | ",
+ "menu_controlls_padding": " | ",
"menu_controlls_select": "E — Выбрать"
}
diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/tr.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/tr.json
index 18a1ceb..4db8982 100644
--- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/tr.json
+++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/tr.json
@@ -51,9 +51,15 @@
"behind_desc": "Vurduğunda düşmanı 180 derece döndürme şansın olur",
"behind_desc2": "Baş döndürme şansın: %{0}",
+ "berserker": "Berserker",
+ "berserker_desc": "Canın azaldıkça daha fazla hasar verir ve daha hızlı hareket edersin",
+
"blademaster": "Kılıç Ustası",
"blademaster_desc": "Bıçak tutarken mermileri sektirme şansın artar",
+ "blastshot": "Patlama Atışı",
+ "blastshot_desc": "MP5 ile Attack2 tuşuna basarak bir HE bombası ateşle",
+
"bunnyhop": "Tavşan",
"bunnyhop_desc": "Otomatik \"BunnyHop\" yaparsın",
@@ -138,7 +144,7 @@
"explodingbarrel": "Patlayan Varil",
"explodingbarrel_desc": "[css_useSkill] ile vurulunca patlayan bir varil koyarsın",
-
+
"explosiveshot": "Patlayıcı Mermi",
"explosiveshot_desc": "Ateş ederken rastgele mermilerin patlayabilir",
"explosiveshot_desc2": "Patlayan mermi şansı: %{0}",
@@ -149,10 +155,16 @@
"fastreload": "Şipşak Şarjör",
"fastreload_desc": "[css_useSkill] tuşuna basarak şarjörünü hızlıca değiştir",
+ "firerain": "Ateş Yağmuru",
+ "firerain_desc": "Molotof yağmuru çağırmak için bir yem at",
+
"flash": "Flash",
"flash_desc": "Raund başında rastgele oyuncu hızı",
"flash_desc2": "Hızın: {0}x",
+ "flashlight": "El Feneri",
+ "flashlight_desc": "El fenerini açıp kapatmak için [css_useSkill] tuşuna tıkla. Işığı düşmanları kör edebilir",
+
"fortnite": "Fortnite",
"fortnite_desc": "[css_useSkill] tuşuna basarak barikat kur",
@@ -182,7 +194,7 @@
"giant_enemy_info": "{0}x boyutuna büyütüldün.",
"giant_player_info": "'{0}' oyuncusunu {1}x büyüttün.",
"giant_select_info": "Büyütülecek oyuncu:",
-
+
"glaz": "Glaz",
"glaz_desc": "Sis bombalarının içini görebilirsin",
@@ -204,6 +216,9 @@
"grenadier": "Bombacı",
"grenadier_desc": "Sınırsız el bombasına sahipsin",
+ "healingchicken": "Şifacı Tavuk",
+ "healingchicken_desc": "Yakınındayken tavukların seni iyileştirir",
+
"healingsmoke": "Şifalı Sis",
"healingsmoke_desc": "Sis bombaların iyileştirir",
@@ -252,6 +267,12 @@
"jester_on": "AÇIK",
"jester_off": "KAPALI",
+ "jetkick": "Jet Tekmesi",
+ "jetkick_desc": "Jet tekmesi yapmak için bir oyuncu seç",
+ "jetkick_player_info": "'{0}' adlı oyuncuya jet tekmesi yapıldı.",
+ "jetkick_enemy_info": "Her atış seni geriye doğru iter",
+ "jetkick_disable_info": "Geri tepmen normale döndü.",
+
"jumpban": "Bacaksız",
"jumpban_desc": "Zıplayamayacak bir oyuncu seç",
"jumpban_enemy_info": "Bacakların kesildi",
@@ -275,6 +296,9 @@
"knockback": "Savurma",
"knockback_desc": "Havadayken ateş etmek seni geriye savurur",
+ "lastgasp": "Son Nefes",
+ "lastgasp_desc": "Öldükten sonra seni öldüren düşmana hasar verirsin",
+
"lifeswap": "Can Takası",
"lifeswap_desc": "Can değerlerini takas etmek için bir oyuncu seç",
"lifeswap_enemy_info": "Birisi canını çaldı",
@@ -316,6 +340,9 @@
"deathbomb_desc": "Öldüğünde patlayarak etraftaki oyuncuları öldürürsün",
"deathbomb_explosion": "BOOM!!!",
+ "demoneye": "Şeytan Gözü",
+ "demoneye_desc": "Baktığın tüm düşmanlara hasar verirsin",
+
"nightmare": "Kabus",
"nightmare_desc": "Seçtiğin bir rakibe kabus görüntüsü verir",
"nightmare_disable_info": "Kabus sona erdi.",
@@ -462,6 +489,17 @@
"swapposition": "Yer Değiştirme",
"swapposition_desc": "[css_useSkill] tuşuna basarak vurduğun düşmanla yer değiştir",
+ "takeammo": "Mühimmat Al",
+ "takeammo_desc": "Rastgele bir düşmanın aktif silahının şarjörünü almak için [css_useSkill] tuşuna tıkla",
+ "takeammo_hud_info1": "Aktif şarjörü olan bir oyuncu bulunamadı.",
+ "takeammo_hud_info2": "Düşmanın şarjörü yok.",
+ "takeammo_enemy_info": "Bir miktar mühimmat kaybettin.",
+
+ "teamteleport": "Takıma Işınlanma",
+ "teamteleport_desc": "Baktığın takım arkadaşına ışınlanmak için [css_useSkill] tuşuna bas",
+ "teamteleport_noenemy": "Takım arkadaşı bulunamadı",
+ "teamteleport_hud_info": "Bulundu: {0}",
+
"teleporter": "Işınlayıcı",
"teleporter_desc": "Vurulan bir düşmanla yer değiştirme şansınız var",
"teleporter_desc2": "Yer değiştirme şansın: %{0}",