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