v1.2.3.b2 - Part 2

## GENERAL
- Added a css_entity admin command to check whether an entity with a given index/handle exists (prints the designer name to chat or console).
- Added a TakeDamage post-hook (OnTakeDamagePost) alongside the existing pre-hook, so skills can now react after damage has actually been applied, not just before.
- Added CreateMolotovProjectile (new CMolotovProjectile_CreateFunc signature) and CreateTrackedChicken entity helpers.
- Added a weapon_mp7 → weapon_mp5sd fallback mapping.
- Added class for KillfeedIcons

## SKILL IMPROVEMENTS
- Aimbot:
  -- Only forces a headshot hitgroup once (skips if it's already a head or an invalid hitgroup), and now restores the original hitgroup value in the new post-damage hook instead of leaving it overwritten.
- Tripwire:
  -- Reduced the default wire width from 1.5 to 0.7.

## NEW SKILLS:
- Berserker: You deal more damage and move faster as your health gets lower.
- Blast Shot: Press Attack2 with the MP5 to fire an HE grenade.
- Demon Eye: You deal damage to every enemy you are looking at.
- Fire Rain: Throw a decoy to call down a rain of Molotovs.
- Flashlight: Click [css_useSkill] to turn the flashlight on or off; its light can blind enemies.
- Healing Chicken: Your chickens heal you while you are nearby.
- Jetkick: Select a player to jetkick - every shot they fire knocks them backwards until disabled.
- Last Gasp: After you die, you deal damage to the enemy who killed you.
- Take Ammo: Click [css_useSkill] to take the active weapon's magazine from a random enemy.
- Team Teleport: Press [css_useSkill] to teleport to the teammate you're looking at.
This commit is contained in:
Juzlus 2026-07-31 20:28:02 +02:00
parent 203a0c3986
commit 8038a4d646
57 changed files with 3663 additions and 553 deletions

View file

@ -14,6 +14,10 @@
<None Remove="tools\**" />
</ItemGroup>
<ItemGroup>
<None Include="src\player\skills\TeamTeleport.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.371" />
<PackageReference Include="MaxMind.Db" Version="5.1.0">

View file

@ -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)
{

View file

@ -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",

View file

@ -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"
}

View file

@ -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",

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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 — Выбрать"
}

View file

@ -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}",

View file

@ -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<CCSPlayerController>(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)

View file

@ -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,

View file

@ -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<EventBulletImpact>(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<Skills>();
@ -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<CTakeDamageInfo>(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<CCSPlayerController>(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<Skills, string> _skillNames =
Enum.GetValues<Skills>().ToDictionary(s => s, s => s.ToString());
private static readonly HashSet<Skills> _activeSkillsSet = [];

View file

@ -10,6 +10,7 @@ namespace src.player.skills
public class Aimbot : ISkill
{
private const Skills skillName = Skills.Aimbot;
private static readonly ThreadLocal<Stack<(nint Address, HitGroup_t OldValue)>> _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<CTakeDamageInfo>(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)

View file

@ -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<int>(skillName, "damageDeal"), attacker, "decoy");
SkillUtils.TakeHealth(victim!.PlayerPawn.Value, SkillsInfo.GetValue<int>(skillName, "damageDeal"), attacker, KillfeedIcons.Decoy);
}
public static void OnEntitySpawned(CEntityInstance entity)

View file

@ -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<uint, int> jumpedPlayers = [];
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(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<CEntityInstance>(0);
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(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<CCSPlayerController>())!;
var playerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index);
if (playerInfo == null) return;
if (playerInfo.Skill == skillName)
{
float damageMultiplier = CalculateNewVelocity(attackerPawn, SkillsInfo.GetValue<float>(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<float>(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;
}
}
}

View file

@ -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<int, (byte Team, uint Owner)> nades = [];
private static readonly ConcurrentDictionary<uint, PlayerSkillInfo> SkillPlayerInfo = [];
private static readonly string[] allowedWeapons = ["weapon_mp5sd"];
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(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<float>(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", $"<font color='#FF0000'>{cooldown}</font>")}";
}
private static void SpawnExplosion(CCSPlayerController player)
{
var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return;
float force = SkillsInfo.GetValue<float>(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<CBaseCSGrenadeProjectile>();
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<int>(skillName, "explosionDamage");
heProjectile.DmgRadius = SkillsInfo.GetValue<float>(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<CEntityInstance>(0);
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(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<CCSPlayerController>();
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<float>(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<bool>() ?? false;
bool tae = ConVar.Find("mp_teammates_are_enemies")?.GetPrimitiveValue<bool>() ?? 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;
}
}
}

View file

@ -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<int>(skillName, "damageAfterMiss"), GetSkillOwner(playerIndex), "planted_c4");
SkillUtils.TakeHealth(playerPawn, SkillsInfo.GetValue<int>(skillName, "damageAfterMiss"), GetSkillOwner(playerIndex), KillfeedIcons.Fist);
}
lastShot.TryRemove(playerIndex, out _);
});

View file

@ -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()

View file

@ -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<string>(skillName, "color"));
}
public static void OnTick()
{
int tickCooldown = (int)(64 * SkillsInfo.GetValue<float>(skillName, "SecondCooldown"));
if (Server.TickCount % tickCooldown != 0) return;
int damage = SkillsInfo.GetValue<int>(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;
}
}
}

View file

@ -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()

View file

@ -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<uint, byte> decoys = [];
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
}
public static void NewRound()
{
KillAllDecoys();
}
private static void KillAllDecoys()
{
foreach (var decoyIndex in decoys.Keys.ToArray())
{
var decoy = Utilities.GetEntityFromIndex<CDecoyProjectile>((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<CDecoyProjectile>();
if (decoy == null || !decoy.IsValid || decoy.OwnerEntity == null || decoy.OwnerEntity.Value == null || !decoy.OwnerEntity.Value.IsValid) return;
var pawn = decoy.OwnerEntity.Value.As<CCSPlayerPawn>();
if (pawn == null || !pawn.IsValid || pawn.Controller == null || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return;
var player = pawn.Controller.Value.As<CCSPlayerController>();
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<CDecoyProjectile>(@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)
{
}
}
}

View file

@ -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<uint, PlayerSkillInfo> 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<string>(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<CBarnLight>((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<CBarnLight>((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<CBarnLight>("light_barn");
if (light == null || !light.IsValid)
return;
EntityManager.RegisterEntity(light.Index, player.Index, "light_barn");
int colorR = SkillsInfo.GetValue<int>(skillName, "colorR");
int colorG = SkillsInfo.GetValue<int>(skillName, "colorG");
int colorB = SkillsInfo.GetValue<int>(skillName, "colorB");
float brightness = SkillsInfo.GetValue<float>(skillName, "brightness");
float range = SkillsInfo.GetValue<float>(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<float>(skillName, "blindDuration");
float blindAlpha = SkillsInfo.GetValue<float>(skillName, "blindAlpha");
float blindAngle = SkillsInfo.GetValue<float>(skillName, "blindAngle");
float range = SkillsInfo.GetValue<float>(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<float>(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", $"<font color='#FF0000'>{cooldown}</font>")}";
}
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;
}
}
}

View file

@ -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<uint, List<ChickenState>> activeChickens = new();
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(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<int>(skillName, "amount");
var list = new List<ChickenState>();
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<int>(skillName, "tickCooldown");
if (Server.TickCount % tickCooldown == 0) return;
var players = PlayerManager.GetTickPlayers().ToArray();
int healAmount = SkillsInfo.GetValue<int>(skillName, "heal");
float healRadius = SkillsInfo.GetValue<float>(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;
}
}
}

View file

@ -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)}");
}
}

View file

@ -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);
}
}
}

View file

@ -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<int>(skillName, "EnemyTeamDamage") : SkillsInfo.GetValue<int>(skillName, "YourTeamDamage"), owner, "planted_c4");
SkillUtils.TakeHealth(attackerPawn, attackerTeam != replicaTeam ? SkillsInfo.GetValue<int>(skillName, "EnemyTeamDamage") : SkillsInfo.GetValue<int>(skillName, "YourTeamDamage"), owner, KillfeedIcons.Player);
}
private static CCSPlayerController? GetReplicaOwner(uint replicaIndex)

View file

@ -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<uint, byte> targetedPlayers = [];
private static readonly ConcurrentDictionary<uint, uint> playersToTarget = [];
private static readonly object setLock = new();
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(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<float>(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;
}
}
}

View file

@ -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<bool>(skillName, "friendlyFire") && player!.Team == attacker!.Team) return;
if (attackerInfo?.Skill == skillName && playerInfo?.Skill != Skills.AntyFlash && player!.PlayerPawn.Value!.FlashDuration >= SkillsInfo.GetValue<float>(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)

View file

@ -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<string>(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<int>(skillName, "DamageAfterDeath");
bool canKill = SkillsInfo.GetValue<bool>(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;
}
}
}

View file

@ -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<bool>(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)

View file

@ -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<bool>(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)

View file

@ -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<int>(skillName, "MinHealth")) continue;
SkillUtils.TakeHealth(pawn, SkillsInfo.GetValue<int>(skillName, "Damage"), GetSkillOwner(playerIndex), "planted_c4");
SkillUtils.TakeHealth(pawn, SkillsInfo.GetValue<int>(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)}");

View file

@ -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<int>(skillName, "EnemyTeamDamage") : SkillsInfo.GetValue<int>(skillName, "YourTeamDamage"), owner, "planted_c4");
SkillUtils.TakeHealth(attackerPawn, attackerTeam != replicaTeam ? SkillsInfo.GetValue<int>(skillName, "EnemyTeamDamage") : SkillsInfo.GetValue<int>(skillName, "YourTeamDamage"), owner, KillfeedIcons.Player);
}
private static CCSPlayerController? GetReplicaOwner(uint replicaIndex)

View file

@ -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<uint, PlayerSkillInfo> SkillPlayerInfo = [];
private static readonly object setLock = new();
private static readonly ConcurrentDictionary<string, (int, string)> OriginalWeaponMaxAmmo = new();
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(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<string, int>()
});
}
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<float>(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
? $"<font color='#FF0000'>{player.GetTranslation("takeammo_hud_info1")}</font>"
: skillInfo != null && !skillInfo.EnemyHaveAmmo ? $"<font color='#FF0000'>{player.GetTranslation("takeammo_hud_info2")}</font>" : null;
else
SkillUtils.ResetPrintHTML(player);
return;
}
playerInfo.PrintHTML = $"{player.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}";
}
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<string, int> 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;
}
}
}

View file

@ -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<uint, PlayerSkillInfo> 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<string>(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<float>(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<float>(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<float>(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", $"<font color='#FF0000'>{cooldown}</font>")}";
else if (skillInfo.NoSpace >= Server.TickCount)
playerInfo.PrintHTML = $"<font color='#FF0000'>{player.GetTranslation("shade_nospace")}</font>";
else if (skillInfo.NoEnemy >= Server.TickCount)
playerInfo.PrintHTML = $"<font color='#FF0000'>{player.GetTranslation("teamteleport_noenemy")}</font>";
else
{
if (skillInfo.TeamateName == null)
playerInfo.PrintHTML = null;
else
{
string color = player.Team == CsTeam.Terrorist ? "#FFA500" : "#ADD8E6";
playerInfo.PrintHTML = $"{player.GetTranslation("teamteleport_hud_info", $"<font color='{color}'>{System.Net.WebUtility.HtmlEncode(skillInfo.TeamateName)}</font>")}";
}
}
}
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;
}
}
}

View file

@ -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<float>(skillName, "healthTakenScale"));
damage = Math.Min(damage, SkillsInfo.GetValue<int>(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");
}
}

View file

@ -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<int>(skillName, "damage"), thrower, "weapon_knife");
SkillUtils.TakeHealth(victimPawn, SkillsInfo.GetValue<int>(skillName, "damage"), thrower, KillfeedIcons.Knife);
}
}

View file

@ -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");
}
}

View file

@ -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;

View file

@ -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)];
}

View file

@ -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)

View file

@ -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<CChicken>("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

View file

@ -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
};
}
}
}

View file

@ -32,6 +32,8 @@ namespace src.utils
LazySig<MemoryFunctionWithReturn<IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, int>>("HEGrenadeProjectile_CreateFunc", s => new(s));
private static readonly Lazy<MemoryFunctionWithReturn<IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, int, int, CSmokeGrenadeProjectile>?> SmokeGrenadeProjectile_CreateFunc =
LazySig<MemoryFunctionWithReturn<IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, int, int, CSmokeGrenadeProjectile>>("SmokeGrenadeProjectile_CreateFunc", s => new(s));
private static readonly Lazy<MemoryFunctionWithReturn<IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, int>?> CMolotovProjectile_CreateFunc =
LazySig<MemoryFunctionWithReturn<IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, IntPtr, int>>("CMolotovProjectile_CreateFunc", s => new(s));
private static readonly Lazy<MemoryFunctionVoid<nint, float, RoundEndReason, nint, nint>?> TerminateRoundFunc =
LazySig<MemoryFunctionVoid<nint, float, RoundEndReason, nint, nint>>("CCSGameRules_TerminateRound", s => new(s));
private static readonly Lazy<MemoryFunctionVoid<CBasePlayerPawn, QAngle>?> 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<uint, (uint AttackerIndex, string? Weapon, int ExpiryTick)> 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<CCSPlayerController>()];
}
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
};

View file

@ -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",

View file

@ -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": {

View file

@ -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,

View file

@ -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"
}

View file

@ -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",

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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"
}

View file

@ -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 — Выбрать"
}

View file

@ -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}",