This commit is contained in:
Juzlus 2026-02-03 07:02:40 +01:00
parent ae13d6a15c
commit 53917a8b4b
62 changed files with 2643 additions and 935 deletions

View file

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup />
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
</Project>

View file

@ -8,7 +8,7 @@
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace src.player.skills.Properties { namespace jRandomSkills.Properties {
using System; using System;

View file

@ -14,14 +14,14 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="CounterStrikeSharp.API" Version="1.0.361" /> <PackageReference Include="CounterStrikeSharp.API" Version="1.0.362" />
<PackageReference Include="CS2TraceRay" Version="1.0.9" /> <PackageReference Include="CS2TraceRay" Version="1.0.9" />
<PackageReference Include="MaxMind.Db" Version="4.3.4" /> <PackageReference Include="MaxMind.Db" Version="4.3.4" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\WASDMenuAPI - SRC Files\WASDMenuAPI.csproj" /> <ProjectReference Include="..\..\..\source\repos\WASDMenuAPI-master\WASDMenuAPI\WASDMenuAPI.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View file

@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17 # Visual Studio Version 17
VisualStudioVersion = 17.9.34728.123 VisualStudioVersion = 17.9.34728.123
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "!jRandomSkills", "!jRandomSkills.csproj", "{1412DD25-558C-425A-A7F6-347C970136E5}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "jRandomSkills", "jRandomSkills.csproj", "{1412DD25-558C-425A-A7F6-347C970136E5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WASDMenuAPI", "..\..\..\source\repos\WASDMenuAPI-master\WASDMenuAPI\WASDMenuAPI.csproj", "{E13A84FA-EAB5-CAC7-8143-DD55AB40EAB5}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -15,6 +17,10 @@ Global
{1412DD25-558C-425A-A7F6-347C970136E5}.Debug|Any CPU.Build.0 = Debug|Any CPU {1412DD25-558C-425A-A7F6-347C970136E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1412DD25-558C-425A-A7F6-347C970136E5}.Release|Any CPU.ActiveCfg = Release|Any CPU {1412DD25-558C-425A-A7F6-347C970136E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1412DD25-558C-425A-A7F6-347C970136E5}.Release|Any CPU.Build.0 = Release|Any CPU {1412DD25-558C-425A-A7F6-347C970136E5}.Release|Any CPU.Build.0 = Release|Any CPU
{E13A84FA-EAB5-CAC7-8143-DD55AB40EAB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E13A84FA-EAB5-CAC7-8143-DD55AB40EAB5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E13A84FA-EAB5-CAC7-8143-DD55AB40EAB5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E13A84FA-EAB5-CAC7-8143-DD55AB40EAB5}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View file

@ -78,6 +78,9 @@ namespace src.command
if (playerPawn?.CBodyComponent == null) return; if (playerPawn?.CBodyComponent == null) return;
if (!player.IsValid || !player.PawnIsAlive) return; if (!player.IsValid || !player.PawnIsAlive) return;
if (SkillsInfo.GetValue<bool>(playerInfo.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime())
return;
string[] commands = _.ArgString.Trim().Split(" ", StringSplitOptions.RemoveEmptyEntries); string[] commands = _.ArgString.Trim().Split(" ", StringSplitOptions.RemoveEmptyEntries);
Debug.WriteToDebug($"Player {player.PlayerName} used the skill: {playerInfo.Skill}"); Debug.WriteToDebug($"Player {player.PlayerName} used the skill: {playerInfo.Skill}");
if (commands == null || commands.Length == 0) if (commands == null || commands.Length == 0)
@ -464,14 +467,12 @@ namespace src.command
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
if (!string.IsNullOrEmpty(config.NormalCommands.ChangeLanguageCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.ChangeLanguageCommand.Permissions)) return; if (!string.IsNullOrEmpty(config.NormalCommands.ChangeLanguageCommand.Permissions) && !AdminManager.PlayerHasPermissions(player, config.NormalCommands.ChangeLanguageCommand.Permissions)) return;
string fileName; string fileName = Config.LoadedConfig.LanguageSystem.DefaultLangCode;
string newLangCode = command.GetArg(1).ToUpper(); string newLangCode = command.GetArg(1).ToUpper();
foreach (var langInfo in Config.LoadedConfig.LanguageSystem.LanguageInfos) foreach (var langInfo in Config.LoadedConfig.LanguageSystem.LanguageInfos)
if (langInfo.IsoCodes.Contains(newLangCode)) if (langInfo.IsoCodes.Contains(newLangCode))
fileName = langInfo.FileName; fileName = langInfo.FileName;
if (!Localization.HasTranslation(newLangCode)) if (Localization.HasTranslation(newLangCode))
fileName = Config.LoadedConfig.LanguageSystem.DefaultLangCode;
else
fileName = newLangCode.ToLower(); fileName = newLangCode.ToLower();
Localization.ChangePlayerLanguage(player, fileName); Localization.ChangePlayerLanguage(player, fileName);
} }
@ -508,17 +509,5 @@ namespace src.command
} }
} }
} }
} }
} }

View file

@ -27,7 +27,7 @@ namespace src
public override string ModuleName => "[CS2] [ jRandomSkills ]"; public override string ModuleName => "[CS2] [ jRandomSkills ]";
public override string ModuleAuthor => "D3X, Juzlus"; public override string ModuleAuthor => "D3X, Juzlus";
public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus."; public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus.";
public override string ModuleVersion => "1.1.9f"; public override string ModuleVersion => "1.10.0";
public override void Load(bool hotReload) public override void Load(bool hotReload)
{ {

View file

@ -0,0 +1,477 @@
{
"none": "Keine",
"none_desc": "Du hast keine Fertigkeit",
"aimbot": "Aimbot",
"aimbot_desc": "Jede Kugel, die du triffst, zählt als Kopfschuss",
"anomaly": "Anomalie",
"anomaly_desc": "Du spulst die Zeit um einige Sekunden zurück",
"antyflash": "Anti-Flash",
"antyflash_desc": "Du bist immun gegen Blendgranaten und deine Blendgranaten halten 7 Sekunden lang",
"antyhead": "Eiserner Kopf",
"antyhead_desc": "Du erleidest keinen Schaden durch Kopfschüsse",
"areareaper": "Zone Reaper",
"areareaper_desc": "Du kannst einen Bombenort auswählen, den du deaktivieren möchtest",
"areareaper_incorrect_site": "Kein solcher Bombenort gefunden",
"areareaper_no_site": "Keine Bombenstandorte gefunden.",
"areareaper_select_info": "Standort zum Deaktivieren auswählen:",
"areareaper_site_disabled": "Bombenstandort {0} wurde deaktiviert – dort können keine Bomben platziert werden!",
"areareaper_used_info": "Deine Fähigkeit wurde bereits eingesetzt.",
"armored": "Gepanzert",
"armored_desc": "Du hast einen zufälligen Schadensmultiplikator",
"armored_desc2": "Dein Schadensmultiplikator beträgt: {0}x",
"assassin": "Attentäter",
"assassin_desc": "Du fügst Gegnern von hinten erhöhten Schaden zu",
"astronaut": "Astronaut",
"astronaut_desc": "Du erhältst zu Beginn der Runde einen zufälligen Schwerkraftwert",
"astronaut_desc2": "Deine zufällige Schwerkraft beträgt: {0}x",
"moneyswap": "Steuerbeamter",
"moneyswap_desc": "Wähle einen Spieler aus, mit dem du Geld tauschen möchtest",
"moneyswap_enemy_info": "Das Finanzamt hat dich erwischt.",
"moneyswap_player_info": "Du hast Geld mit dem Spieler \"{0}\" getauscht.",
"moneyswap_select_info": "Geld mit Spieler tauschen:",
"baseball": "Baseballspieler",
"baseball_desc": "Deine Attrappe prallt von Wänden ab und tötet einen Gegner sofort beim Aufprall.",
"behind": "Feind drehen",
"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} %",
"blademaster": "Schwertmeister",
"blademaster_desc": "Wenn du ein Messer hältst, hast du eine hohe Chance, einen Schuss abzuwehren",
"bunnyhop": "Hase",
"bunnyhop_desc": "Du erhältst automatisch bunnyhop",
"c4camouflage": "C4-Tarnung",
"c4camouflage_desc": "Du bist unsichtbar, während du die Bombe hältst",
"carefulbullets": "Vorsichtige Kugeln",
"carefulbullets_desc": "Wähle einen Spieler aus, der für jeden Fehlschuss Schaden nimmt",
"carefulbullets_enemy_info": "Von nun an wird Ungenauigkeit buchstäblich wehtun.",
"carefulbullets_player_info": "‚{0}‘ muss jetzt vorsichtiger sein.",
"carefulbullets_select_info": "Fehler schaden dem Spieler:",
"catapult": "Katapult",
"catapult_desc": "Du hast eine zufällige Chance, einen Gegner nach oben zu schleudern",
"catapult_desc2": "Deine Chance, einen Gegner bei einem Treffer zu schleudern, beträgt: {0} %",
"chicken": "Huhn",
"chicken_desc": "Du erhältst ein Huhn-Modell + 10 % schnellere Bewegung – 50 HP",
"chillout": "Chillout",
"chillout_desc": "Das Platzieren der Bombe dauert deutlich länger",
"cutter": "Cutter",
"cutter_desc": "Sofortiger Tod mit einem Messer",
"cypher": "Kamera",
"cypher_desc": "Klicken Sie auf [css_useSkill], um eine Kamera zu erstellen/zu wechseln",
"cypher_nospace": "Die Kamera muss im rechten Winkel zur Wand positioniert werden",
"darkness": "Dunkelheit",
"darkness_desc": "Wendet einen Dunkelheitseffekt auf einen ausgewählten Gegner an",
"darkness_enemy_info": "Lass die Lichter ausgehen",
"darkness_player_info": "Die Dunkelheit hat den Spieler \"{0}\" überwältigt.",
"darkness_select_info": "Wähle einen Spieler für die Dunkelheit aus:",
"deactivator": "Deaktivator",
"deactivator_desc": "Wähle einen Spieler aus, dessen Fähigkeit du deaktivieren möchtest",
"deactivator_enemy_info": "Deine Fähigkeit wurde deaktiviert",
"deactivator_player_info": "Die Fähigkeit des Spielers ‚{0}‘ wurde deaktiviert",
"deactivator_select_info": "Fähigkeit eines Spielers deaktivieren:",
"deaf": "Taub",
"deaf_desc": "Wähle einen Spieler aus, für den alle Sounds stummgeschaltet werden sollen",
"deaf_enemy_info": "Deine Kopfhörer haben das Spiel verlassen.",
"deaf_player_info": "Der Ton für den Spieler ‚{0}‘ wurde deaktiviert.",
"deaf_select_info": "Alle Töne für den Spieler stummschalten:",
"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} %",
"distancer": "Entfernungsmesser",
"distancer_desc": "Sie können die Entfernung zum nächsten Gegner sehen",
"dash": "Sprinten",
"dash_desc": "Führe einen zweiten Sprung aus, um zu sprinten",
"dracula": "Dracula",
"dracula_desc": "Wenn du einen Gegner triffst, wird deine Gesundheit um einen Prozentsatz des verursachten Schadens wiederhergestellt",
"duplicator": "Duplikator",
"duplicator_desc": "Wähle einen Spieler aus, dessen Fertigkeit du kopieren möchtest",
"duplicator_player_info": "Die Fertigkeit des Spielers ‚{0}‘ wurde kopiert.",
"duplicator_select_info": "Kopiere die Fertigkeit eines Spielers:",
"dwarf": "Zwerg",
"dwarf_desc": "Zufällige Charaktergröße zu Beginn der Runde",
"dwarf_desc2": "Dein Größenmultiplikator beträgt: {0}x",
"enemyspawn": "Feindes-Spawn",
"enemyspawn_desc": "Klicke auf [css_useSkill], um zum Feindes-Spawn zu teleportieren",
"explosiveshot": "Explosiver Schuss",
"explosiveshot_desc": "Zufällige Chance, beim Schießen eine explosive Kugel abzufeuern",
"explosiveshot_desc2": "Deine Chance, eine explosive Kugel abzufeuern: {0} %",
"falconeye": "Falkenauge",
"falconeye_desc": "Klicke auf [css_useSkill], um eine Vogelperspektive zu aktivieren",
"fastreload": "Schnellnachladen",
"fastreload_desc": "Klicke auf [css_useSkill], um die Waffe, die du gerade hältst, nachzuladen",
"flash": "Blitz",
"flash_desc": "Zufällige Spielergeschwindigkeit zu Beginn der Runde",
"flash_desc2": "Dein Geschwindigkeitsmultiplikator beträgt: {0}x",
"fortnite": "Fortnite",
"fortnite_desc": "Klicke auf [css_useSkill], um eine zerstörbare Barrikade zu erstellen",
"fragilebomb": "Fragile Bombe",
"fragilebomb_desc": "Das Schießen auf die Bombe beschädigt sie",
"fragilebomb_bomb_health": "Bombengesundheit",
"friendlyfire": "Friendly Fire",
"friendlyfire_desc": "Das Schießen auf Teamkameraden heilt sie",
"frozendecoy": "Eisige Attrappe",
"frozendecoy_desc": "Deine Attrappe friert alle Spieler in der Nähe ein",
"gambler": "Zocker",
"gambler_desc": "Wähle eine Fertigkeit aus der Liste aus.",
"gambler_select_info": "Wähle deine Fähigkeit aus:",
"gambler_more": "#00FF00|Aktualisieren für ${0}",
"gambler_no_money": "Nicht genug Geld.",
"ghost": "Geist",
"ghost_desc": "Du bist vollständig unsichtbar",
"glaz": "Glaz",
"glaz_desc": "Du kannst durch Rauchgranaten hindurchsehen",
"glitch": "Glitch",
"glitch_desc": "Deaktiviert das Radar für einen ausgewählten Gegner",
"glitch_enemy_info": "Dein Radar wurde deaktiviert",
"glitch_player_info": "Das Radar des Spielers ‚{0}‘ wurde deaktiviert.",
"glitch_select_info": "Radar des Spielers ausschalten:",
"glue": "Glue",
"glue_desc": "Deine Granaten haften an Wänden",
"godmode": "Gott-Modus",
"godmode_desc": "Klicke auf [css_useSkill], um für kurze Zeit unsterblich zu werden",
"godmode_off": "Unsterblichkeit deaktiviert",
"godmode_on": "Unsterblichkeit aktiviert",
"grenadier": "Grenadier",
"grenadier_desc": "Du hast unendlich viele Granaten",
"healingsmoke": "Heilender Rauch",
"healingsmoke_desc": "Deine Rauchgranaten heilen",
"hermit": "Einsiedler",
"hermit_desc": "Durch das Töten von Gegnern werden Munition und ein Teil der Gesundheit wiederhergestellt",
"holyhandgrenade": "Heilige Handgranate",
"holyhandgrenade_desc": "Deine HE-Granaten verursachen doppelten Schaden und haben doppelte Reichweite",
"iana": "Hologramm",
"iana_desc": "Klicken Sie auf [css_useSkill], um Ihr Hologramm für einige Sekunden zu steuern",
"impostor": "Betrüger",
"impostor_desc": "Du beginnst die Runde mit einem feindlichen Spielermodell",
"infiniteammo": "Unendliche Munition",
"infiniteammo_desc": "Du erhältst unendliche Munition für alle deine Waffen",
"jackal": "Spürhund",
"jackal_desc": "Jeder Gegner hinterlässt eine Spur",
"jammer": "Störsender",
"jammer_desc": "Wähle einen Spieler aus, um dessen Fadenkreuz zu deaktivieren",
"jammer_enemy_info": "Dein Fadenkreuz wurde deaktiviert.",
"jammer_player_info": "Das Fadenkreuz von Spieler ‚{0}‘ wurde deaktiviert.",
"jammer_select_info": "Fadenkreuz des Spielers deaktivieren:",
"jester": "Narr",
"jester_desc": "Im Narrenmodus kannst du keinen Schaden erleiden oder verursachen. Dieser Modus ändert sich alle paar Sekunden.",
"jester_mode": "Jester-Modus",
"jester_on": "EIN",
"jester_off": "AUS",
"jumpban": "Beinlos",
"jumpban_desc": "Wähle einen Spieler, der nicht springen kann",
"jumpban_enemy_info": "Jemand hat dir die Beine abgeschnitten.",
"jumpban_player_info": "Der Spieler ‚{0}‘ kann nicht mehr springen.",
"jumpban_select_info": "Spieler vom Springen ausschließen:",
"jumpingjack": "Jumping Jack",
"jumpingjack_desc": "Durch Springen wird die Gesundheit wiederhergestellt",
"killerflash": "Killer Flash",
"killerflash_desc": "Jeder, der durch deine Blendgranate vollständig geblendet wird, stirbt (einschließlich dir selbst)",
"lifeswap": "Lebensaustausch",
"lifeswap_desc": "Wähle einen Spieler aus, mit dem du deine Gesundheit austauschen möchtest",
"lifeswap_enemy_info": "Jemand hat sich deine Gesundheit ausgeliehen",
"lifeswap_player_info": "Du hast deine Gesundheit mit dem Spieler \"{0}\" ausgetauscht",
"lifeswap_select_info": "Tausche Gesundheit mit Spieler:",
"longknife": "Langes Messer",
"longknife_desc": "Ein Messerangriff verursacht unabhängig von der Entfernung Schaden",
"longzeus": "Langer Zeus",
"longzeus_desc": "Zeus verursacht unabhängig von der Entfernung Schaden",
"magnifier": "Lupe",
"magnifier_desc": "Vergrößert den Bildschirm des Gegners und verringert dessen Sichtfeld",
"magnifier_enemy_info": "Dein Sichtfeld wurde verzerrt!",
"magnifier_player_info": "Der Spieler ‚{0}‘ wurde in den Zoom-Modus versetzt.",
"magnifier_select_info": "Bildschirm des Spielers vergrößern:",
"medic": "Sanitäter",
"medic_desc": "Klicke auf [css_useSkill], um eine Heilungsladung zu verwenden, die 50 Gesundheitspunkte wiederherstellt",
"bankrupt": "Bankrott",
"bankrupt_desc": "Wähle den Spieler aus, der sein gesamtes Geld verlieren wird",
"bankrupt_enemy_info": "Du bist bankrott.",
"bankrupt_player_info": "Der Spieler ‚{0}‘ ist bankrott.",
"bankrupt_select_info": "Wähle einen Spieler aus, der bankrott gehen soll:",
"muhammed": "Muhammed",
"muhammed_desc": "Du explodierst beim Tod und tötest Spieler in deiner Nähe",
"muhammed_explosion": "ALLAHU AKBAR!!!",
"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 %",
"nonades": "No-Nades",
"nonades_desc": "Granaten fügen dir keinen Schaden zu",
"norecoil": "Fokus",
"norecoil_desc": "Kein Rückstoß beim Schießen",
"noclip": "NoClip",
"noclip_desc": "Klicke auf [css_useSkill], um NoClip für kurze Zeit zu aktivieren",
"oneshot": "One-Shot",
"oneshot_desc": "Ein Treffer tötet einen Gegner sofort",
"onlyhead": "Nur Kopf",
"onlyhead_desc": "Du erleidest nur Schaden am Kopf",
"paweljumper": "Pawel Jumper",
"paweljumper_desc": "Du erhältst eine zufällige Anzahl zusätzlicher Sprünge",
"paweljumper_desc2": "Du erhältst {0} zusätzliche Sprünge",
"phoenix": "Phönix",
"phoenix_desc": "Du hast eine zufällige Chance, nach dem Tod wieder zu erscheinen",
"phoenix_desc2": "Deine Chance, nach dem Tod wieder zu erscheinen: {0} %",
"phoenix_respawn": "Du bist dank der Kraft von CHATCOLORS.REDPhoenix aus der Asche auferstanden",
"psychicdefusing": "Psychic Defusing",
"psychicdefusing_desc": "Wenn du dich in der Nähe der Bombe befindest, beginnst du, sie zu entschärfen",
"psychicdefusing_hud_info": "{0} Sekunden verbleibend bis zur Entschärfung",
"pilot": "Pilot",
"pilot_desc": "Fliege für eine begrenzte Zeit. Halte [USE - E] gedrückt, um zu fliegen",
"pilot_hud_info": "Treibstoff",
"planter": "Freier Planter",
"planter_desc": "Du kannst die Bombe überall platzieren, die Detonationszeit beträgt 60 Sekunden.",
"poison": "Gift",
"poison_desc": "Wähle einen Spieler aus, der alle paar Sekunden Schaden nimmt",
"poison_enemy_info": "Du wurdest vergiftet",
"poison_player_info": "Der Spieler ‚{0}‘ wurde vergiftet",
"poison_select_info": "Einen Spieler vergiften:",
"primaryban": "Keine Gewehre",
"primaryban_desc": "Wähle einen Spieler aus, der keine Gewehre verwenden kann",
"primaryban_enemy_info": "Du kannst keine Gewehre mehr verwenden.",
"primaryban_player_info": "Der Spieler ‚{0}‘ kann keine Gewehre mehr verwenden.",
"primaryban_select_info": "Gewehre für Spieler verbieten:",
"prosthesis": "Prothese",
"prosthesis_desc": "Arme und Beine sind kugelsicher",
"push": "Pusher",
"push_desc": "Du hast eine zufällige Chance, einen Gegner zurückzustoßen, wenn du ihn triffst",
"push_desc2": "Deine Chancen, den Gegner zurückzustoßen, betragen: {0} %",
"pyro": "Pyro",
"pyro_desc": "Molotow-Cocktail stellt Gesundheit wieder her",
"quickshot": "Schnellfeuer",
"quickshot_desc": "Alle Kugeln werden sehr schnell abgefeuert",
"radarhack": "Radar-Hack",
"radarhack_desc": "Gegner sind auf dem Radar sichtbar",
"rambo": "Rambo",
"rambo_desc": "Du erhältst zu Beginn der Runde eine zufällige Menge an Gesundheit",
"randomweapon": "Zufällige Waffe",
"randomweapon_desc": "Klicke auf [css_useSkill], um eine zufällige Waffe zu erhalten",
"rezombie": "Re-Zombie",
"rezombie_desc": "Nach dem Tod spawnst du als Zombie mit erhöhter Gesundheit und ohne Waffen",
"reactivearmor": "Reaktive Rüstung",
"reactivearmor_desc": "Die Rüstung absorbiert den ersten erlittenen Schaden",
"regeneration": "Regeneration",
"regeneration_desc": "Du stellst alle paar Sekunden Gesundheit wieder her",
"replicator": "Replikator",
"replicator_desc": "Klicke auf [css_useSkill], um eine Replik zu erstellen, die bei Treffer Schaden verursacht",
"retreat": "Rückzug",
"retreat_desc": "Klicke auf [css_useSkill], um zum Spawn zurückzukehren",
"returntosender": "Zurück zum Absender",
"returntosender_desc": "Der erste Treffer eines Gegners schickt ihn zurück zu seinem Spawn",
"richboy": "Rich Boy",
"richboy_desc": "Du erhältst zu Beginn der Runde einen zufälligen Geldbetrag",
"robinhood": "Robin Hood",
"robinhood_desc": "Wenn du einem Gegner Schaden zufügst, stiehlst du ihm sein Geld",
"rubber": "Gummigeschosse",
"rubber_desc": "Deine Kugeln verlangsamen Spieler erheblich",
"saper": "Sapper",
"saper_desc": "Du kannst Bomben schneller legen und entschärfen",
"secondlife": "Zweite Chance",
"secondlife_desc": "Nach dem Tod spawnst du mit derselben Gesundheitsanzeige wieder",
"shade": "Schatten",
"shade_desc": "Du hast eine zufällige Chance, dich hinter einen getroffenen Gegner zu teleportieren",
"shade_desc2": "Deine Chancen, dich hinter einen getroffenen Gegner zu teleportieren, betragen: {0} %",
"shade_nospace": "Kein Platz verfügbar",
"shortbomb": "Kurze Zündschnur",
"shortbomb_desc": "Die Bombe explodiert viel schneller",
"silent": "Leise",
"silent_desc": "Deine Schritte und Sprünge sind für ANDERE Spieler lautlos",
"sniperelite": "Sniper Elite",
"sniperelite_customname": "Sniper Elite-Fähigkeit",
"sniperelite_desc": "Klicke auf [css_useSkill], um deine aktuelle Waffe gegen eine AWP auszutauschen",
"soldier": "Soldat",
"soldier_desc": "Du hast einen zufälligen Schadensmultiplikator",
"soldier_desc2": "Dein Schadensmultiplikator beträgt: {0}x",
"soundmaker": "Soundmaker",
"soundmaker_desc": "Klicke auf [css_useSkill], um für jeden Gegner einen Sound auszulösen",
"spectator": "Zuschauer",
"spectator_desc": "Klicke auf [css_useSkill], um einen zufälligen Gegner zu beobachten",
"swapposition": "Positionstausch",
"swapposition_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Plätze zu tauschen",
"teleporter": "Teleporter",
"teleporter_desc": "Du tauschst mit dem getroffenen Gegner die Plätze",
"thief": "Dieb",
"thief_desc": "Du kannst einem ausgewählten Spieler eine Fertigkeit stehlen",
"thief_enemy_info": "Deine Fertigkeit wurde gestohlen",
"thief_player_info": "Die Fertigkeit des Spielers ‚{0}‘ wurde gestohlen",
"thief_select_info": "Fähigkeit eines Spielers stehlen:",
"thief_incorrect_skill": "Diese Fähigkeit kann nicht ausgewählt werden!",
"thirdeye": "Drittes Auge",
"thirdeye_desc": "Klicke auf [css_useSkill], um die Third-Person-Ansicht zu aktivieren",
"thorns": "Dornen",
"thorns_desc": "Dein Gegner erhält einen Teil des Schadens, den er dir zugefügt hat",
"toxicsmoke": "Giftiger Rauch",
"toxicsmoke_desc": "Deine Rauchgranaten verursachen Schaden",
"wallhack": "Wallhack",
"wallhack_desc": "Du kannst Feinde durch Wände hindurch sehen",
"watchmaker": "Uhrmacher",
"watchmaker_desc": "Jeder Granatenwurf verändert die Rundenzeit",
"watchmaker_ct": "Rundenzeit um {0} Sekunden verkürzt",
"watchmaker_tt": "Rundenzeit um {0} Sekunden verlängert",
"weaponsswap": "Waffenwechsel",
"weaponsswap_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Waffen zu tauschen",
"weaponsswap_hud_info2": "Du hast keine Waffe zum Tauschen",
"zeus": "Zeus",
"zeus_desc": "Zeus x27 lädt sich sofort wieder auf",
"your_skill": "Deine aktuelle Fertigkeit",
"enemy_skill": "Fähigkeit des Gegners",
"observer_skill": "Fähigkeit des Spielers",
"welcome_message": "Willkommen {PLAYER} bei {SERVER_NAME}",
"drawing_skill": "Eine Fertigkeit zeichnen",
"disabled_weapon": "Du kannst diese Waffe nicht verwenden",
"hud_info": "Warte weitere {0} Sekunden",
"hud_info_no_enemy": "Kein Feind gefunden",
"active_hud_info": "Noch {0} Millisekunden aktiv",
"skills_menu": "Fähigkeitenliste",
"no_player": "Kein passender Spieler gefunden.",
"duplicate_player": "Mehr als ein Spieler mit demselben Namen gefunden.",
"selectplayerskill_command": "Gib /t ein",
"selectplayerskill_incorrect_enemy_index": "Es wurden keine Spieler gefunden, die ausgewählt werden können.",
"skill_not_found_setskill": "Keine solche CHATCOLORS.REDskill gefunden",
"player_not_found_setskill": "Kein solcher CHATCOLORS.REDplayer gefunden",
"correct_form_setskill": "Korrekte Verwendung: CHATCOLORS.RED!setskill <Fähigkeit>",
"correct_form_setscore": "Korrekte Verwendung: CHATCOLORS.RED!setscore ",
"done_setskill": "Fähigkeit festgelegt",
"error_setskill": "CHATCOLORS.REDskill konnte nicht festgelegt werden",
"for_setskill": "für",
"invalid_map": "Kartenname falsch eingegeben!",
"loading_map": "Neue Karte wird geladen",
"pause": "Spiel wurde unterbrochen",
"unpause": "Spiel wurde fortgesetzt",
"healed": "Du wurdest geheilt.",
"game_start": "Spiel gestartet!",
"reload": "Sprachen und Konfigurationen wurden neu geladen.",
"hud_on": "HUD wurde aktiviert.",
"hud_off": "HUD wurde deaktiviert.",
"vote_started": "Abstimmung gestartet: ‚{0}‘",
"vote_timeout": "Zeitlimit für Abstimmung ‚{0}‘ abgelaufen!",
"vote_wait": "Sie müssen warten, bevor Sie eine weitere Abstimmung starten können!",
"vote_same_wait": "Sie müssen warten, bevor Sie dieselbe Abstimmung erneut starten können!",
"vote_not_enough_players": "Nicht genügend Spieler, um eine Abstimmung zu starten!",
"vote_alredy_voted": "Du hast bereits abgestimmt!",
"vote_vote": "Abstimmen",
"bombsite_a": "Bombenplatz A",
"bombsite_b": "Bombenplatz B",
"bombplanted": "Die Bombe wurde gelegt\n{0} Sekunden bis zur Detonation",
"teammate_skills": "Die Fähigkeiten Ihrer Teamkollegen",
"summary": "Zusammenfassung der letzten runde",
"menu_controlls_scroll": "W/S – Scrollen",
"menu_controlls_padding": " | ",
"menu_controlls_select": "E – Auswählen"
}

View file

@ -55,6 +55,12 @@
"c4camouflage": "C4 Camouflage", "c4camouflage": "C4 Camouflage",
"c4camouflage_desc": "You are invisible while holding the bomb", "c4camouflage_desc": "You are invisible while holding the bomb",
"carefulbullets": "Careful Bullets",
"carefulbullets_desc": "Select a player who takes damage for every missed shot",
"carefulbullets_enemy_info": "From now on, inaccuracy will literally hurt.",
"carefulbullets_player_info": "'{0}' must now be more careful.",
"carefulbullets_select_info": "Inaccuracy hurts the player:",
"catapult": "Catapult", "catapult": "Catapult",
"catapult_desc": "You have a random chance to launch an enemy upwards", "catapult_desc": "You have a random chance to launch an enemy upwards",
"catapult_desc2": "Your chance to launch an enemy on hit is: {0}%", "catapult_desc2": "Your chance to launch an enemy on hit is: {0}%",
@ -68,6 +74,10 @@
"cutter": "Cutter", "cutter": "Cutter",
"cutter_desc": "Instant kill with a knife", "cutter_desc": "Instant kill with a knife",
"cypher": "Cypher",
"cypher_desc": "Click [css_useSkill] to create/switch to a camera",
"cypher_nospace": "The camera must be positioned at right angles to the wall",
"darkness": "Darkness", "darkness": "Darkness",
"darkness_desc": "Applies a darkness effect to a chosen enemy", "darkness_desc": "Applies a darkness effect to a chosen enemy",
"darkness_enemy_info": "Let the lights go out.", "darkness_enemy_info": "Let the lights go out.",
@ -176,6 +186,9 @@
"holyhandgrenade": "Holy Hand Grenade", "holyhandgrenade": "Holy Hand Grenade",
"holyhandgrenade_desc": "Your HE grenades deal double damage and have double range", "holyhandgrenade_desc": "Your HE grenades deal double damage and have double range",
"iana": "Hologram",
"iana_desc": "Click [css_useSkill] to control your hologram for a few seconds",
"impostor": "Impostor", "impostor": "Impostor",
"impostor_desc": "You start the round with an enemy player model", "impostor_desc": "You start the round with an enemy player model",
@ -357,6 +370,7 @@
"silent_desc": "Your footsteps and jumps are silent to OTHER players", "silent_desc": "Your footsteps and jumps are silent to OTHER players",
"sniperelite": "Sniper Elite", "sniperelite": "Sniper Elite",
"sniperelite_customname": "Sniper Elite Skill",
"sniperelite_desc": "Click [css_useSkill] to swap your current weapon for an AWP", "sniperelite_desc": "Click [css_useSkill] to swap your current weapon for an AWP",
"soldier": "Soldier", "soldier": "Soldier",
@ -452,6 +466,7 @@
"bombsite_a": "Bombsite A", "bombsite_a": "Bombsite A",
"bombsite_b": "Bombsite B", "bombsite_b": "Bombsite B",
"bombplanted": "The bomb has been planted\n{0} seconds till detonation",
"teammate_skills": "Your teammates' skills", "teammate_skills": "Your teammates' skills",
"summary": "Summary of the last round", "summary": "Summary of the last round",

View file

@ -55,6 +55,12 @@
"c4camouflage": "Camouflage C4", "c4camouflage": "Camouflage C4",
"c4camouflage_desc": "Vous êtes invisible en tenant la bombe", "c4camouflage_desc": "Vous êtes invisible en tenant la bombe",
"carefulbullets": "Balles prudentes",
"carefulbullets_desc": "Sélectionnez un joueur qui subit des dégâts à chaque tir manqué",
"carefulbullets_enemy_info": "À partir de maintenant, l'inexactitude fera littéralement mal.",
"carefulbullets_player_info": "« {0} » doit désormais être plus prudent.",
"carefulbullets_select_info": "L'inexactitude nuit au joueur :",
"catapult": "Catapulte", "catapult": "Catapulte",
"catapult_desc": "Vous avez une chance aléatoire de projeter un ennemi en l’air", "catapult_desc": "Vous avez une chance aléatoire de projeter un ennemi en l’air",
"catapult_desc2": "Votre chance de projeter un ennemi à l’impact est : {0}%", "catapult_desc2": "Votre chance de projeter un ennemi à l’impact est : {0}%",
@ -68,6 +74,10 @@
"cutter": "Trancheur", "cutter": "Trancheur",
"cutter_desc": "Coup de couteau = mort instantanée", "cutter_desc": "Coup de couteau = mort instantanée",
"cypher": "Caméra",
"cypher_desc": "Cliquez sur [css_useSkill] pour créer/passer à une caméra.",
"cypher_nospace": "La caméra doit être positionnée à angle droit par rapport au mur",
"darkness": "Obscurité", "darkness": "Obscurité",
"darkness_desc": "Applique un effet d’obscurité à un ennemi choisi", "darkness_desc": "Applique un effet d’obscurité à un ennemi choisi",
"darkness_enemy_info": "Que la lumière s’éteigne.", "darkness_enemy_info": "Que la lumière s’éteigne.",
@ -176,6 +186,9 @@
"holyhandgrenade": "Grenade Sacrée", "holyhandgrenade": "Grenade Sacrée",
"holyhandgrenade_desc": "Vos grenades HE infligent le double de dégâts et ont une portée doublée", "holyhandgrenade_desc": "Vos grenades HE infligent le double de dégâts et ont une portée doublée",
"iana": "Hologramme",
"iana_desc": "Cliquez sur [css_useSkill] pour contrôler votre hologramme pendant quelques secondes",
"impostor": "Imposteur", "impostor": "Imposteur",
"impostor_desc": "Vous commencez le round avec un modèle de joueur ennemi", "impostor_desc": "Vous commencez le round avec un modèle de joueur ennemi",
@ -357,6 +370,7 @@
"silent_desc": "Vos pas et vos sauts sont silencieux pour les AUTRES joueurs", "silent_desc": "Vos pas et vos sauts sont silencieux pour les AUTRES joueurs",
"sniperelite": "Sniper d’Élite", "sniperelite": "Sniper d’Élite",
"sniperelite_customname": "Compétence Sniper d’Élite",
"sniperelite_desc": "Appuyez sur [css_useSkill] pour échanger votre arme actuelle contre un AWP", "sniperelite_desc": "Appuyez sur [css_useSkill] pour échanger votre arme actuelle contre un AWP",
"soldier": "Soldat", "soldier": "Soldat",
@ -452,10 +466,10 @@
"bombsite_a": "Site de bombe A", "bombsite_a": "Site de bombe A",
"bombsite_b": "Site de bombe B", "bombsite_b": "Site de bombe B",
"bombplanted": "La bombe a été posée\n{0} secondes avant l'explosion",
"teammate_skills": "Compétences de vos coéquipiers", "teammate_skills": "Compétences de vos coéquipiers",
"summary_start": "Résumé du dernier round", "summary": "Résumé du dernier round",
"summary_end": "===================================",
"menu_controlls_scroll": "W/S - Défilement", "menu_controlls_scroll": "W/S - Défilement",
"menu_controlls_padding": " | ", "menu_controlls_padding": " | ",

View file

@ -55,6 +55,12 @@
"c4camouflage": "C4 Kamuflaż", "c4camouflage": "C4 Kamuflaż",
"c4camouflage_desc": "Kiedy trzymasz bombę, jesteś niewidzialny", "c4camouflage_desc": "Kiedy trzymasz bombę, jesteś niewidzialny",
"carefulbullets": "Ostrożne pociski",
"carefulbullets_desc": "Wybierz gracza, który otrzymuje obrażenia za każdy niecelny strzał",
"carefulbullets_enemy_info": "Od teraz niecelność będzie dosłownie bolała.",
"carefulbullets_player_info": "'{0}' musi teraz być bardziej ostrożny.",
"carefulbullets_select_info": "Niedokładność szkodzi graczowi:",
"catapult": "Katapulta", "catapult": "Katapulta",
"catapult_desc": "Masz losową szanse na podrzucenie wroga", "catapult_desc": "Masz losową szanse na podrzucenie wroga",
"catapult_desc2": "Twoje szanse na podrzucenie wroga po trafieniu to: {0}%", "catapult_desc2": "Twoje szanse na podrzucenie wroga po trafieniu to: {0}%",
@ -68,6 +74,10 @@
"cutter": "Scyzoryk", "cutter": "Scyzoryk",
"cutter_desc": "Natychmiastowe zabójstwo nożem", "cutter_desc": "Natychmiastowe zabójstwo nożem",
"cypher": "Kamera",
"cypher_desc": "Kliknij [css_useSkill], aby utworzyć/przełączyć się na kamerę",
"cypher_nospace": "Kamera musi być ustawiona pod kątem prostym do ściany",
"darkness": "Mrok", "darkness": "Mrok",
"darkness_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi", "darkness_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi",
"darkness_enemy_info": "Niech zgasną światła.", "darkness_enemy_info": "Niech zgasną światła.",
@ -176,6 +186,9 @@
"holyhandgrenade": "Święty Granat Ręczny", "holyhandgrenade": "Święty Granat Ręczny",
"holyhandgrenade_desc": "Twoje granaty uderzeniowe zadają podwójne obrażenia i mają podwójny zasięg", "holyhandgrenade_desc": "Twoje granaty uderzeniowe zadają podwójne obrażenia i mają podwójny zasięg",
"iana": "Hologram",
"iana_desc": "Kliknij [css_useSkill], aby sterować hologramem przez kilka sekund",
"impostor": "Szpieg", "impostor": "Szpieg",
"impostor_desc": "Na początku rundy otrzymujesz model postaci przeciwnika", "impostor_desc": "Na początku rundy otrzymujesz model postaci przeciwnika",
@ -357,6 +370,7 @@
"silent_desc": "Twoje kroki i skoki są niesłyszalne dla INNYCH graczy", "silent_desc": "Twoje kroki i skoki są niesłyszalne dla INNYCH graczy",
"sniperelite": "SzeliS", "sniperelite": "SzeliS",
"sniperelite_customname": "Mityczna AWP",
"sniperelite_desc": "Kliknij [css_useSkill], aby zamienić aktualną broń na AWP", "sniperelite_desc": "Kliknij [css_useSkill], aby zamienić aktualną broń na AWP",
"soldier": "Żołnierz", "soldier": "Żołnierz",
@ -452,10 +466,10 @@
"bombsite_a": "Strefa detonacji A", "bombsite_a": "Strefa detonacji A",
"bombsite_b": "Strefa detonacji B", "bombsite_b": "Strefa detonacji B",
"bombplanted": "Bomba została podłożona\n{0} sekund do detonacji",
"teammate_skills": "Supermoce twoich sojuszników", "teammate_skills": "Supermoce twoich sojuszników",
"summary_start": "Podsumowanie z ostatniej rundy", "summary": "Podsumowanie z ostatniej rundy",
"summary_end": "============================================",
"menu_controlls_scroll": "W/S – Przewijanie", "menu_controlls_scroll": "W/S – Przewijanie",
"menu_controlls_padding": " | ", "menu_controlls_padding": " | ",

View file

@ -55,6 +55,12 @@
"c4camouflage": "Camuflagem C4", "c4camouflage": "Camuflagem C4",
"c4camouflage_desc": "Você fica invisível enquanto segura a bomba", "c4camouflage_desc": "Você fica invisível enquanto segura a bomba",
"carefulbullets": "Balas cuidadosas",
"carefulbullets_desc": "Selecione um jogador que sofra dano por cada tiro errado",
"carefulbullets_enemy_info": "A partir de agora, a imprecisão vai literalmente doer.",
"carefulbullets_player_info": "Agora, '{0}' precisa ter mais cuidado.",
"carefulbullets_select_info": "A imprecisão prejudica o jogador:",
"catapult": "Catapulta", "catapult": "Catapulta",
"catapult_desc": "Você tem uma chance aleatória de lançar um inimigo para cima", "catapult_desc": "Você tem uma chance aleatória de lançar um inimigo para cima",
"catapult_desc2": "Sua chance de lançar um inimigo ao acertar é: {0}%", "catapult_desc2": "Sua chance de lançar um inimigo ao acertar é: {0}%",
@ -68,6 +74,10 @@
"cutter": "Cortador", "cutter": "Cortador",
"cutter_desc": "Mata instantaneamente com uma faca", "cutter_desc": "Mata instantaneamente com uma faca",
"cypher": "Câmera",
"cypher_desc": "Clique em [css_useSkill] para criar/mudar para uma câmera",
"cypher_nospace": "A câmera deve ser posicionada em ângulo reto com a parede",
"darkness": "Escuridão", "darkness": "Escuridão",
"darkness_desc": "Aplica um efeito de escuridão a um inimigo escolhido", "darkness_desc": "Aplica um efeito de escuridão a um inimigo escolhido",
"darkness_enemy_info": "Que as luzes se apaguem.", "darkness_enemy_info": "Que as luzes se apaguem.",
@ -176,6 +186,9 @@
"holyhandgrenade": "Granada Sagrada", "holyhandgrenade": "Granada Sagrada",
"holyhandgrenade_desc": "Suas granadas explosivas causam dano dobrado e têm alcance dobrado", "holyhandgrenade_desc": "Suas granadas explosivas causam dano dobrado e têm alcance dobrado",
"iana": "Holograma",
"iana_desc": "Clique em [css_useSkill] para controlar seu holograma por alguns segundos",
"impostor": "Impostor", "impostor": "Impostor",
"impostor_desc": "Você começa a rodada com um modelo de jogador inimigo", "impostor_desc": "Você começa a rodada com um modelo de jogador inimigo",
@ -357,6 +370,7 @@
"silent_desc": "Seus passos e pulos são silenciosos para OUTROS jogadores", "silent_desc": "Seus passos e pulos são silenciosos para OUTROS jogadores",
"sniperelite": "Atirador de Elite", "sniperelite": "Atirador de Elite",
"sniperelite_customname": "Habilidade de Atirador de Elite",
"sniperelite_desc": "Clique em [css_useSkill] para trocar sua arma atual por uma AWP", "sniperelite_desc": "Clique em [css_useSkill] para trocar sua arma atual por uma AWP",
"soldier": "Soldado", "soldier": "Soldado",
@ -452,10 +466,10 @@
"bombsite_a": "Zona de detonação A", "bombsite_a": "Zona de detonação A",
"bombsite_b": "Zona de detonação B", "bombsite_b": "Zona de detonação B",
"bombplanted": "A bomba foi colocada\n{0} segundos até a detonação",
"teammate_skills": "Habilidades dos seus companheiros de equipe", "teammate_skills": "Habilidades dos seus companheiros de equipe",
"summary_start": "Resumo da última rodada", "summary": "Resumo da última rodada",
"summary_end": "=======================================",
"menu_controlls_scroll": "W/S - Rolar", "menu_controlls_scroll": "W/S - Rolar",
"menu_controlls_padding": " | ", "menu_controlls_padding": " | ",

View file

@ -55,6 +55,12 @@
"c4camouflage": "C4伪装", "c4camouflage": "C4伪装",
"c4camouflage_desc": "你持有炸弹时隐形", "c4camouflage_desc": "你持有炸弹时隐形",
"carefulbullets": "谨慎的子弹",
"carefulbullets_desc": "选择一名球员,每当他投篮未中时就会受到伤害",
"carefulbullets_enemy_info": "从现在起,不准确将带来切实的伤害。",
"carefulbullets_player_info": "'{0}' 现在必须更加谨慎。",
"carefulbullets_select_info": "不准确会伤害玩家:",
"catapult": "弹射", "catapult": "弹射",
"catapult_desc": "你有随机几率将敌人向上弹射", "catapult_desc": "你有随机几率将敌人向上弹射",
"catapult_desc2": "你击中敌人将其弹射的几率是:{0}%", "catapult_desc2": "你击中敌人将其弹射的几率是:{0}%",
@ -68,6 +74,10 @@
"cutter": "切割者", "cutter": "切割者",
"cutter_desc": "用刀可立即杀死敌人", "cutter_desc": "用刀可立即杀死敌人",
"cypher": "相机",
"cypher_desc": "点击 [css_useSkill] 创建/切换摄像机",
"cypher_nospace": "相机必须与墙壁呈直角放置",
"darkness": "黑暗", "darkness": "黑暗",
"darkness_desc": "对选定的敌人施加黑暗效果", "darkness_desc": "对选定的敌人施加黑暗效果",
"darkness_enemy_info": "让灯光熄灭。", "darkness_enemy_info": "让灯光熄灭。",
@ -176,6 +186,9 @@
"holyhandgrenade": "神圣手榴弹", "holyhandgrenade": "神圣手榴弹",
"holyhandgrenade_desc": "你的高爆手榴弹造成双倍伤害并拥有双倍范围", "holyhandgrenade_desc": "你的高爆手榴弹造成双倍伤害并拥有双倍范围",
"iana": "全息图",
"iana_desc": "点击 [css_useSkill] 可控制你的全息影像数秒",
"impostor": "冒名顶替者", "impostor": "冒名顶替者",
"impostor_desc": "回合开始时你获得敌方玩家模型", "impostor_desc": "回合开始时你获得敌方玩家模型",
@ -357,6 +370,7 @@
"silent_desc": "你的脚步和跳跃对其他玩家无声", "silent_desc": "你的脚步和跳跃对其他玩家无声",
"sniperelite": "狙击精英", "sniperelite": "狙击精英",
"sniperelite_customname": "狙击精英技能",
"sniperelite_desc": "点击 [css_useSkill] 将当前武器替换为AWP", "sniperelite_desc": "点击 [css_useSkill] 将当前武器替换为AWP",
"soldier": "士兵", "soldier": "士兵",
@ -452,10 +466,10 @@
"bombsite_a": "爆轰区A", "bombsite_a": "爆轰区A",
"bombsite_b": "爆轰区B", "bombsite_b": "爆轰区B",
"bombplanted": "炸弹已安装完毕{0}秒后引爆",
"teammate_skills": "你队友的技能", "teammate_skills": "你队友的技能",
"summary_start": "上一回合总结", "summary": "上一回合总结",
"summary_end": "=======================================",
"menu_controlls_scroll": "W/S - 滚动", "menu_controlls_scroll": "W/S - 滚动",
"menu_controlls_padding": " | ", "menu_controlls_padding": " | ",

View file

@ -64,6 +64,7 @@ public enum Skills
BladeMaster, BladeMaster,
BunnyHop, BunnyHop,
C4Camouflage, C4Camouflage,
CarefulBullets,
Catapult, Catapult,
Chicken, Chicken,
ChillOut, ChillOut,

View file

@ -3,6 +3,7 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Core.Attributes;
using CounterStrikeSharp.API.Modules.Admin; using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Cvars;
using CounterStrikeSharp.API.Modules.Events;
using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.UserMessages;
@ -11,7 +12,6 @@ using src.utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using static CounterStrikeSharp.API.Core.Listeners; using static CounterStrikeSharp.API.Core.Listeners;
using static src.jRandomSkills; using static src.jRandomSkills;
using static System.Net.Mime.MediaTypeNames;
namespace src.player namespace src.player
{ {
@ -38,6 +38,7 @@ namespace src.player
{ {
Instance.RegisterEventHandler<EventPlayerConnectFull>(PlayerConnectFull); Instance.RegisterEventHandler<EventPlayerConnectFull>(PlayerConnectFull);
Instance.RegisterEventHandler<EventPlayerDisconnect>(PlayerDisconnect); Instance.RegisterEventHandler<EventPlayerDisconnect>(PlayerDisconnect);
// Instance.RegisterEventHandler<EventPlayerChat>(PlayerChat);
Instance.RegisterEventHandler<EventRoundStart>(RoundStart); Instance.RegisterEventHandler<EventRoundStart>(RoundStart);
Instance.RegisterEventHandler<EventRoundEnd>(RoundEnd); Instance.RegisterEventHandler<EventRoundEnd>(RoundEnd);
@ -350,6 +351,39 @@ namespace src.player
} }
} }
private static HookResult PlayerChat(EventPlayerChat @event, GameEventInfo info)
{
var userID = @event.Userid;
if (userID == 0 || string.IsNullOrEmpty(@event.Text)) return HookResult.Continue;
string text = @event.Text.Split(' ')[0].Trim();
string commandName = text.StartsWith('!') || text.StartsWith('/') ? text[1..] : text;
foreach (var cmd in Instance.CommandDefinitions)
Server.PrintToChatAll("1. " + cmd.Name);
foreach (var cmd in Instance.CommandListeners.Keys)
Server.PrintToChatAll("2. " + cmd?.Target?.ToString());
var player = Utilities.GetPlayerFromUserid(userID);
if (player == null || !player.IsValid) return HookResult.Continue;
var skillPlayer = Instance?.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (skillPlayer == null) return HookResult.Continue;
var temp = skillPlayer.SkillHudExpired;
skillPlayer.SkillHudExpired = DateTime.MinValue;
;
Instance.AddTimer(5f, () =>
{
if (skillPlayer.SkillHudExpired == DateTime.MinValue)
skillPlayer.SkillHudExpired = temp;
});
return HookResult.Continue;
}
private static HookResult RoundStart(EventRoundStart @event, GameEventInfo info) private static HookResult RoundStart(EventRoundStart @event, GameEventInfo info)
{ {
lock (setLock) lock (setLock)
@ -398,7 +432,10 @@ namespace src.player
lock (setLock) lock (setLock)
{ {
isTransmitRegistered = false; isTransmitRegistered = false;
Instance.AddTimer(.1f, () => DisableAll()); Instance.AddTimer(.1f, () => {
DisableAll();
ConVar.Find("sv_legacy_jump")?.SetValue("1");
});
Instance.RemoveListener<CheckTransmit>(CheckTransmit); Instance.RemoveListener<CheckTransmit>(CheckTransmit);
playersSkills.Clear(); playersSkills.Clear();
staticSkills.Clear(); staticSkills.Clear();

View file

@ -23,19 +23,7 @@ namespace src.player.skills
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
if (playerInfo?.Skill == skillName && hitgroup == (int)HitGroup_t.HITGROUP_HEAD) if (playerInfo?.Skill == skillName && hitgroup == (int)HitGroup_t.HITGROUP_HEAD)
ApplyIronHeadEffect(victim!, @event.DmgHealth); SkillUtils.RestoreHealth(victim);
}
private static void ApplyIronHeadEffect(CCSPlayerController victim, float damage)
{
var playerPawn = victim.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) return;
var newHealth = playerPawn.Health + damage;
if (newHealth > 100)
newHealth = 100;
playerPawn.Health = (int)newHealth;
} }
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8B4513", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8B4513", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)

View file

@ -66,20 +66,7 @@ namespace src.player.skills
if (weaponServices.ActiveWeapon == null || !weaponServices.ActiveWeapon.IsValid || weaponServices.ActiveWeapon.Value == null || !weaponServices.ActiveWeapon.Value.IsValid || weaponServices.ActiveWeapon.Value.DesignerName != "weapon_knife") if (weaponServices.ActiveWeapon == null || !weaponServices.ActiveWeapon.IsValid || weaponServices.ActiveWeapon.Value == null || !weaponServices.ActiveWeapon.Value.IsValid || weaponServices.ActiveWeapon.Value.DesignerName != "weapon_knife")
return; return;
RestoreHealth(victim, damage); SkillUtils.RestoreHealth(victim);
}
private static void RestoreHealth(CCSPlayerController victim, float damage)
{
var playerPawn = victim.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid || playerPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return;
var newHealth = playerPawn.Health + damage;
if (newHealth > 100)
newHealth = 100;
playerPawn.Health = (int)newHealth;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
} }
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#cc7504", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float torseReflectionChance = .95f, float legReflectionChance = .80f, float velocityModifier = .85f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#cc7504", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float torseReflectionChance = .95f, float legReflectionChance = .80f, float velocityModifier = .85f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)

View file

@ -2,6 +2,7 @@ using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.utils; using src.utils;
using System.Collections.Concurrent;
using static src.jRandomSkills; using static src.jRandomSkills;
namespace src.player.skills namespace src.player.skills
@ -9,6 +10,7 @@ namespace src.player.skills
public class BunnyHop : ISkill public class BunnyHop : ISkill
{ {
private const Skills skillName = Skills.BunnyHop; private const Skills skillName = Skills.BunnyHop;
private static readonly ConcurrentDictionary<ulong, int> playersLastJump = [];
public static void LoadSkill() public static void LoadSkill()
{ {
@ -34,7 +36,13 @@ namespace src.player.skills
var flags = (PlayerFlags)playerPawn.Flags; var flags = (PlayerFlags)playerPawn.Flags;
var buttons = player.Buttons; var buttons = player.Buttons;
if (buttons.HasFlag(PlayerButtons.Jump) && flags.HasFlag(PlayerFlags.FL_ONGROUND) && !playerPawn.MoveType.HasFlag(MoveType_t.MOVETYPE_LADDER)) if ((playerPawn.MovementServices?.QueuedButtonChangeMask & (ulong)PlayerButtons.Jump) != 0)
playersLastJump.AddOrUpdate(player.SteamID, Server.TickCount, (_, _) => Server.TickCount);
bool jumpPressed = buttons.HasFlag(PlayerButtons.Jump)
|| (playersLastJump.TryGetValue(player.SteamID, out int tick) && tick + 20 >= Server.TickCount);
if (jumpPressed && flags.HasFlag(PlayerFlags.FL_ONGROUND) && !playerPawn.MoveType.HasFlag(MoveType_t.MOVETYPE_LADDER))
{ {
playerPawn.AbsVelocity.Z = SkillsInfo.GetValue<float>(skillName, "jumpVelocity"); playerPawn.AbsVelocity.Z = SkillsInfo.GetValue<float>(skillName, "jumpVelocity");
var maxSpeed = SkillsInfo.GetValue<float>(skillName, "maxSpeed"); var maxSpeed = SkillsInfo.GetValue<float>(skillName, "maxSpeed");

View file

@ -61,7 +61,7 @@ namespace src.player.skills
{ {
foreach (var (info, player) in infoList) foreach (var (info, player) in infoList)
{ {
if (player == null) continue; if (player == null || !player.IsValid) continue;
foreach (var _player in invisiblePlayers.Keys) foreach (var _player in invisiblePlayers.Keys)
if (player.SteamID != _player.SteamID) if (player.SteamID != _player.SteamID)
{ {
@ -72,8 +72,9 @@ namespace src.player.skills
if (entity == null || !entity.IsValid) continue; if (entity == null || !entity.IsValid) continue;
info.TransmitEntities.Remove(entity.Index); info.TransmitEntities.Remove(entity.Index);
var bombIndex = HideBomb(_player); var bombIndex = GetBombIndex();
if (bombIndex == null) continue; if (bombIndex == null) continue;
var bombEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)bombIndex); var bombEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)bombIndex);
if (bombEntity == null || !bombEntity.IsValid) continue; if (bombEntity == null || !bombEntity.IsValid) continue;
info.TransmitEntities.Remove(bombEntity.Index); info.TransmitEntities.Remove(bombEntity.Index);
@ -124,7 +125,7 @@ namespace src.player.skills
particle.AcceptInput("Start"); particle.AcceptInput("Start");
} }
private static uint? HideBomb(CCSPlayerController player) private static uint? GetBombIndex()
{ {
var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList(); var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList();
if (bombEntities.Count == 0) return null; if (bombEntities.Count == 0) return null;
@ -132,15 +133,6 @@ namespace src.player.skills
var bomb = bombEntities.FirstOrDefault(); var bomb = bombEntities.FirstOrDefault();
if (bomb == null) return null; if (bomb == null) return null;
// if (bomb.OwnerEntity.Index != player.Index) return null;
bomb.EntitySpottedState.Spotted = false;
Utilities.SetStateChanged(bomb, "CCSPlayerPawn", "m_entitySpottedState", Schema.GetSchemaOffset("EntitySpottedState_t", "m_bSpotted"));
for (int i = 0; i < bomb.EntitySpottedState.SpottedByMask.Length; i++)
bomb.EntitySpottedState.SpottedByMask[i] = 0;
Utilities.SetStateChanged(bomb, "CCSPlayerPawn", "m_entitySpottedState", Schema.GetSchemaOffset("EntitySpottedState_t", "m_bSpottedByMask"));
return bomb.Index; return bomb.Index;
} }

View file

@ -0,0 +1,153 @@
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;
namespace src.player.skills
{
public class CarefulBullets : ISkill
{
private const Skills skillName = Skills.CarefulBullets;
private static readonly ConcurrentDictionary<ulong, byte> targetPlayers = [];
private static readonly ConcurrentDictionary<ulong, bool> lastShot = [];
private static readonly object setLock = new();
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
}
public static void NewRound()
{
lock (setLock)
{
targetPlayers.Clear();
lastShot.Clear();
}
foreach (var player in Utilities.GetPlayers())
{
DisableSkill(player);
SkillUtils.CloseMenu(player);
}
}
public static void PlayerDeath(EventPlayerDeath @event)
{
var player = @event.Userid;
if (player == null) return;
DisableSkill(player);
}
public static void OnTick()
{
if (Server.TickCount % 32 != 0) return;
foreach (var player in Utilities.GetPlayers())
{
if (!SkillUtils.HasMenu(player)) continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null || playerInfo.Skill != skillName) continue;
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
ConcurrentBag<(string, string)> menuItems = [.. 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.PawnIsAlive) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
if (playerInfo.SkillUsed)
{
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("areareaper_used_info")}");
return;
}
string enemyId = commands[0];
var enemy = Utilities.GetPlayers().FirstOrDefault(p => p.Team != player.Team && p.Index.ToString() == enemyId);
if (enemy == null)
{
player.PrintToChat($" {ChatColors.Red}" + player.GetTranslation("selectplayerskill_incorrect_enemy_index"));
return;
}
targetPlayers.TryAdd(enemy.SteamID, 0);
playerInfo.SkillUsed = true;
player.PrintToChat($" {ChatColors.Green}" + player.GetTranslation("carefulbullets_player_info", enemy.PlayerName));
enemy.PrintToChat($" {ChatColors.Red}" + enemy.GetTranslation("carefulbullets_enemy_info"));
}
public static void EnableSkill(CCSPlayerController player)
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
playerInfo.SkillUsed = false;
var enemies = Utilities.GetPlayers().Where(p => p.PawnIsAlive && p.Team != player.Team && p.IsValid && !p.IsBot && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray();
if (enemies.Length > 0)
{
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => (e.PlayerName, e.Index.ToString()))];
SkillUtils.CreateMenu(player, menuItems);
}
else
player.PrintToChat($" {ChatColors.Red}{player.GetTranslation("selectplayerskill_incorrect_enemy_index")}");
}
public static void OnTakeDamage(DynamicHook h)
{
CEntityInstance param = h.GetParam<CEntityInstance>(0);
CTakeDamageInfo param2 = h.GetParam<CTakeDamageInfo>(1);
if (param?.Entity == null || param2?.Attacker?.Value == null)
return;
CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle);
if (attackerPawn.DesignerName != "player")
return;
if (attackerPawn == null || attackerPawn.Controller?.Value == null)
return;
CCSPlayerController attacker = attackerPawn.Controller.Value.As<CCSPlayerController>();
if (!targetPlayers.ContainsKey(attacker.SteamID) || !attacker.PawnIsAlive)
return;
bool hitPlayer = param.DesignerName == "player";
if (!lastShot.ContainsKey(attacker.SteamID))
{
lastShot.TryAdd(attacker.SteamID, hitPlayer);
Instance.AddTickTimer(1, () =>
{
if (lastShot.TryRemove(attacker.SteamID, out bool didHit) && !didHit)
SkillUtils.TakeHealth(attackerPawn, SkillsInfo.GetValue<int>(skillName, "damageAfterMiss"));
lastShot.TryRemove(attacker.SteamID, out _);
});
}
else if (hitPlayer)
lastShot.TryUpdate(attacker.SteamID, true, false);
}
public static void DisableSkill(CCSPlayerController player)
{
targetPlayers.TryRemove(player.SteamID, out _);
lastShot.TryRemove(player.SteamID, out _);
SkillUtils.CloseMenu(player);
}
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#db6c35", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int damageAfterMiss = 5) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
{
public int DamageAfterMiss { get; set; } = damageAfterMiss;
}
}
}

View file

@ -1,8 +1,7 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Timers;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using CS2TraceRay.Class; using CS2TraceRay.Class;
using CS2TraceRay.Struct; using CS2TraceRay.Struct;
@ -10,6 +9,7 @@ using src.utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Drawing; using System.Drawing;
using System.Numerics; using System.Numerics;
using Timer = CounterStrikeSharp.API.Modules.Timers.Timer;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
namespace src.player.skills namespace src.player.skills
@ -25,7 +25,7 @@ namespace src.player.skills
public static void LoadSkill() public static void LoadSkill()
{ {
// SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
jRandomSkills.Instance.AddToManifest(cameraPropModel); jRandomSkills.Instance.AddToManifest(cameraPropModel);
jRandomSkills.Instance.AddToManifest(cameraViewModel); jRandomSkills.Instance.AddToManifest(cameraViewModel);
} }
@ -56,7 +56,9 @@ namespace src.player.skills
CameraView = null, CameraView = null,
CameraActive = false, CameraActive = false,
NextCamera = 0, NextCamera = 0,
NoSpace = 0,
PlayerCameraRaw = player.PlayerPawn.Value.CameraServices.ViewEntity.Raw, PlayerCameraRaw = player.PlayerPawn.Value.CameraServices.ViewEntity.Raw,
LastAngle = QAngle.Zero
}); });
} }
@ -85,6 +87,7 @@ namespace src.player.skills
playerSkill.CameraProp.AcceptInput("Kill"); playerSkill.CameraProp.AcceptInput("Kill");
playerSkill.CameraProp = null; playerSkill.CameraProp = null;
} }
playerSkill.NextCamera = Server.TickCount + SkillsInfo.GetValue<float>(skillName, "Cooldown") * 64;
} }
public static void OnTick() public static void OnTick()
@ -114,8 +117,13 @@ namespace src.player.skills
{ {
if (player.NextCamera > Server.TickCount) return; if (player.NextCamera > Server.TickCount) return;
player.CameraProp = CreateCameraProp(player.Player); player.CameraProp = CreateCameraProp(player.Player);
if (player.CameraProp == null)
{
player.NoSpace = Server.TickCount + (64 * 2);
return;
}
player.CameraView = CreateCameraView(player.Player); player.CameraView = CreateCameraView(player.Player);
player.NextCamera = Server.TickCount + SkillsInfo.GetValue<float>(skillName, "Cooldown") * 64; if (player.CameraView == null) return;
} }
var pawn = player.Player.PlayerPawn.Value; var pawn = player.Player.PlayerPawn.Value;
@ -123,13 +131,52 @@ namespace src.player.skills
return; return;
BlockWeapon(player.Player, player.CameraActive); BlockWeapon(player.Player, player.CameraActive);
pawn!.CameraServices!.ViewEntity.Raw = player.CameraActive && player.CameraView != null ? player.CameraView.EntityHandle.Raw : player.PlayerCameraRaw;
Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices"); Server.NextWorldUpdate(() =>
{
if (pawn != null && pawn.LifeState == (byte)LifeState_t.LIFE_ALIVE)
{
if (player.CameraActive && player.CameraProp != null)
{
if ( pawn.AbsRotation != null)
player.LastAngle = new QAngle(pawn.AbsRotation.X, pawn.AbsRotation.Y, pawn.AbsRotation.Z);
pawn.Teleport(null, player.CameraProp.AbsRotation);
}
else if (!forceToDefault)
pawn.Teleport(null, player.LastAngle);
}
if (player.CameraActive && player.CameraView != null) if (player.CameraActive && player.CameraView != null)
{ {
pawn!.CameraServices!.ViewEntity.Raw = player.CameraView.EntityHandle.Raw;
SkillUtils.ApplyScreenColor(player.Player, 0, 0, 255, 20, 100, 1020); SkillUtils.ApplyScreenColor(player.Player, 0, 0, 255, 20, 100, 1020);
Timer? cameraTimer = null;
ulong playerSteamID = player.Player.SteamID;
cameraTimer = jRandomSkills.Instance.AddTimer(2f, () =>
{
var target = Utilities.GetPlayerFromSteamId(playerSteamID);
if (target == null || !target.IsValid || !target.PawnIsAlive)
{
cameraTimer?.Kill();
return;
} }
if (!playersInfo.TryGetValue(target, out var playerSkill) || playerSkill.CameraActive == false)
{
cameraTimer?.Kill();
return;
}
SkillUtils.ApplyScreenColor(target, 0, 0, 255, 20, 100, 1020);
}, TimerFlags.STOP_ON_MAPCHANGE | TimerFlags.REPEAT);
}
else
pawn!.CameraServices!.ViewEntity.Raw = player.PlayerCameraRaw;
Utilities.SetStateChanged(pawn, "CBasePlayerPawn", "m_pCameraServices");
});
} }
private static CDynamicProp? CreateCameraProp(CCSPlayerController player) private static CDynamicProp? CreateCameraProp(CCSPlayerController player)
@ -140,7 +187,6 @@ namespace src.player.skills
camera.Collision.SolidType = SolidType_t.SOLID_VPHYSICS; camera.Collision.SolidType = SolidType_t.SOLID_VPHYSICS;
camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2)); camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(camera.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2));
camera.Entity!.Name = camera.Globalname = $"CypherCamera_{Server.TickCount}_{player.SteamID}"; camera.Entity!.Name = camera.Globalname = $"CypherCamera_{Server.TickCount}_{player.SteamID}";
camera.DispatchSpawn();
var playerPawn = player.PlayerPawn.Value; var playerPawn = player.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) return null; if (playerPawn == null || !playerPawn.IsValid) return null;
@ -150,10 +196,14 @@ namespace src.player.skills
if (cameraVector == null) return null; if (cameraVector == null) return null;
cameraVector = new Vector(cameraVector.X + diffVector.X, cameraVector.Y + diffVector.Y, cameraVector.Z); cameraVector = new Vector(cameraVector.X + diffVector.X, cameraVector.Y + diffVector.Y, cameraVector.Z);
if (!CheckCameraPosition(cameraVector, player))
return null;
Server.NextFrame(() => Server.NextFrame(() =>
{ {
camera.SetModel(cameraPropModel); camera.SetModel(cameraPropModel);
camera.Teleport(cameraVector, new QAngle(0, playerPawn.V_angle.Y + 180, 0)); camera.Teleport(cameraVector, new QAngle(0, playerPawn.V_angle.Y + 180, 0));
camera.DispatchSpawn();
}); });
return camera; return camera;
@ -163,7 +213,6 @@ namespace src.player.skills
{ {
var camera = Utilities.CreateEntityByName<CDynamicProp>("prop_dynamic"); var camera = Utilities.CreateEntityByName<CDynamicProp>("prop_dynamic");
if (camera == null || !camera.IsValid) return null; if (camera == null || !camera.IsValid) return null;
camera.DispatchSpawn();
var playerPawn = player.PlayerPawn.Value; var playerPawn = player.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) return null; if (playerPawn == null || !playerPawn.IsValid) return null;
@ -172,14 +221,15 @@ namespace src.player.skills
Vector diffVector = SkillUtils.GetForwardVector(playerPawn.V_angle) * 25; Vector diffVector = SkillUtils.GetForwardVector(playerPawn.V_angle) * 25;
if (cameraVector == null) return null; if (cameraVector == null) return null;
cameraVector = new Vector(cameraVector.X - diffVector.X, cameraVector.Y - diffVector.Y, cameraVector.Z); cameraVector = new Vector(cameraVector.X - diffVector.X, cameraVector.Y - diffVector.Y, cameraVector.Z);
if (cameraVector == null) return null; if (cameraVector == null) return null;
Server.NextFrame(() => Server.NextFrame(() =>
{ {
camera.SetModel(cameraViewModel); camera.SetModel(cameraViewModel);
camera.Render = Color.FromArgb(0, 255, 255, 255); camera.Render = Color.FromArgb(0, 255, 255, 255);
camera.Teleport(cameraVector, playerPawn.EyeAngles); camera.Teleport(cameraVector, playerPawn.EyeAngles);
camera.DispatchSpawn();
}); });
return camera; return camera;
@ -227,7 +277,7 @@ namespace src.player.skills
} }
} }
private unsafe static Vector? GetNewCameraPosition(CCSPlayerController player) private static Vector? GetNewCameraPosition(CCSPlayerController player)
{ {
var playerPawn = player.PlayerPawn.Value; var playerPawn = player.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null) return null; if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null) return null;
@ -235,30 +285,54 @@ namespace src.player.skills
Vector eyePos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + playerPawn.ViewOffset.Z); Vector eyePos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + playerPawn.ViewOffset.Z);
Vector endPos = eyePos + SkillUtils.GetForwardVector(playerPawn.V_angle) * 4096f; Vector endPos = eyePos + SkillUtils.GetForwardVector(playerPawn.V_angle) * 4096f;
Ray ray = new(Vector3.Zero); ulong solid = 0x1;
CTraceFilter filter = new(playerPawn.Index, playerPawn.Index) ulong window = 0x1000;
{ ulong passBullets = 0x2000;
m_nObjectSetMask = 0xf,
m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PROJECTILE,
m_nInteractsWith = 8589946881,
m_nInteractsExclude = 0,
m_nBits = 11,
m_bIterateEntities = true,
m_bHitTriggers = false,
m_nInteractsAs = 0x40000,
m_bOnlyHitIfHasPhysics = true
};
filter.m_nHierarchyIds[0] = playerPawn.GetHierarchyId(); ulong mask = solid | window | passBullets;
filter.m_nHierarchyIds[1] = 0; ulong contents = playerPawn.Collision.CollisionGroup;
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray); CGameTrace trace = TraceRay.TraceShape(eyePos, endPos, mask, contents, player);
if (trace.HitWorld(out _)) if (trace.HitWorld(out _))
return new Vector(trace.EndPos.X, trace.EndPos.Y, trace.EndPos.Z); {
Vector3 hitPost = trace.EndPos;
Vector3 normal = trace.Normal;
float offset = 8;
Vector finalPos = new(
hitPost.X + (normal.X * offset),
hitPost.Y + (normal.Y * offset),
hitPost.Z + (normal.Z * offset)
);
return finalPos;
}
return null; return null;
} }
private static bool CheckCameraPosition(Vector cameraVector, CCSPlayerController player)
{
var playerPawn = player.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid || playerPawn.AbsOrigin == null) return false;
Vector endPos = cameraVector + SkillUtils.GetForwardVector(new QAngle(0, playerPawn.V_angle.Y + 180, 0)) * -5;
cameraVector += SkillUtils.GetForwardVector(new QAngle(0, playerPawn.V_angle.Y + 180, 0)) * 5;
ulong solid = 0x1;
ulong window = 0x1000;
ulong passBullets = 0x2000;
ulong mask = solid | window | passBullets;
ulong contents = playerPawn.Collision.CollisionGroup;
CGameTrace trace = TraceRay.TraceShape(cameraVector, endPos, mask, contents, player);
if (trace.HitWorld(out _))
return true;
return false;
}
private static void UpdateHUD(PlayerSkill playerSkill) private static void UpdateHUD(PlayerSkill playerSkill)
{ {
if (playerSkill == null || playerSkill.Player == null) return; if (playerSkill == null || playerSkill.Player == null) return;
@ -270,7 +344,9 @@ namespace src.player.skills
var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == playerSkill?.Player?.SteamID); var playerInfo = jRandomSkills.Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == playerSkill?.Player?.SteamID);
if (playerInfo == null) return; if (playerInfo == null) return;
if (cooldown == 0) if (playerSkill.NoSpace >= Server.TickCount)
playerInfo.PrintHTML = $"<font color='#FF0000'>{playerSkill.Player.GetTranslation("cypher_nospace")}</font>";
else if (cooldown == 0)
playerInfo.PrintHTML = null; playerInfo.PrintHTML = null;
else if (playerSkill?.CameraProp == null) else if (playerSkill?.CameraProp == null)
playerInfo.PrintHTML = $"{playerSkill?.Player.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}"; playerInfo.PrintHTML = $"{playerSkill?.Player.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}";
@ -284,6 +360,8 @@ namespace src.player.skills
public uint PlayerCameraRaw { get; set; } public uint PlayerCameraRaw { get; set; }
public bool CameraActive { get; set; } public bool CameraActive { get; set; }
public float NextCamera { get; set; } public float NextCamera { get; set; }
public float NoSpace { get; set; }
public required QAngle LastAngle { get; set; }
} }
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#34ebd5", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = true, bool needsTeammates = false, string requiredPermission = "", float cooldown = 30) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#34ebd5", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = true, bool needsTeammates = false, string requiredPermission = "", float cooldown = 30) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)

View file

@ -5,6 +5,7 @@ using CounterStrikeSharp.API.Modules.Utils;
using src.utils; using src.utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using static src.jRandomSkills; using static src.jRandomSkills;
using Timer = CounterStrikeSharp.API.Modules.Timers.Timer;
namespace src.player.skills namespace src.player.skills
{ {
@ -111,34 +112,32 @@ namespace src.player.skills
private static void SetUpPostProcessing(CCSPlayerController player, bool turnOff = false) private static void SetUpPostProcessing(CCSPlayerController player, bool turnOff = false)
{ {
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var pawn = player.PlayerPawn.Value; ulong playerSteamID = player.SteamID;
if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return;
lock (setLock) lock (setLock)
{ {
if (!turnOff) if (!turnOff)
{ {
playersInDark.TryAdd(player.SteamID, 0); playersInDark.TryAdd(playerSteamID, 0);
SkillUtils.ApplyScreenColor(player, ApplyColor(player);
r: SkillsInfo.GetValue<int>(skillName, "R"),
g: SkillsInfo.GetValue<int>(skillName, "G"),
b: SkillsInfo.GetValue<int>(skillName, "B"),
a: SkillsInfo.GetValue<int>(skillName, "A"),
duration: 100,
holdTime: 3000);
Instance.AddTimer(2.5f, () => { Timer? darkTimer = null;
if (!playersInDark.ContainsKey(player.SteamID)) darkTimer = Instance.AddTimer(5f, () => {
if (!playersInDark.ContainsKey(playerSteamID))
{
darkTimer?.Kill();
return; return;
}
if (player.IsValid && player.PawnIsAlive) var target = Utilities.GetPlayerFromSteamId(playerSteamID);
SkillUtils.ApplyScreenColor(player, if (target == null || !target.IsValid)
r: SkillsInfo.GetValue<int>(skillName, "R"), {
g: SkillsInfo.GetValue<int>(skillName, "G"), darkTimer?.Kill();
b: SkillsInfo.GetValue<int>(skillName, "B"), return;
a: SkillsInfo.GetValue<int>(skillName, "A"), }
duration: 100,
holdTime: 3000); if (target.PawnIsAlive)
ApplyColor(player);
}, TimerFlags.STOP_ON_MAPCHANGE | TimerFlags.REPEAT); }, TimerFlags.STOP_ON_MAPCHANGE | TimerFlags.REPEAT);
} }
else else
@ -149,6 +148,17 @@ namespace src.player.skills
} }
} }
private static void ApplyColor(CCSPlayerController player)
{
SkillUtils.ApplyScreenColor(player,
r: SkillsInfo.GetValue<int>(skillName, "R"),
g: SkillsInfo.GetValue<int>(skillName, "G"),
b: SkillsInfo.GetValue<int>(skillName, "B"),
a: SkillsInfo.GetValue<int>(skillName, "A"),
duration: 100,
holdTime: 3000);
}
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#383838", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int r = 0, int g = 0, int b = 0, int a = 230) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#383838", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int r = 0, int g = 0, int b = 0, int a = 230) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
{ {
public int R { get; set; } = r; public int R { get; set; } = r;

View file

@ -2,6 +2,7 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.utils; using src.utils;
using System.Collections.Concurrent;
using static src.jRandomSkills; using static src.jRandomSkills;
namespace src.player.skills namespace src.player.skills
@ -9,15 +10,22 @@ namespace src.player.skills
public class Dash : ISkill public class Dash : ISkill
{ {
private const Skills skillName = Skills.Dash; private const Skills skillName = Skills.Dash;
private static readonly PlayerFlags[] LF = new PlayerFlags[64]; private static readonly ConcurrentDictionary<ulong, PlayerSkillInfo> SkillPlayerInfo = [];
private static readonly int?[] J = new int?[64]; private static readonly object setLock = new();
private static readonly PlayerButtons[] LB = new PlayerButtons[64];
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
} }
public static void NewRound()
{
lock (setLock)
{
SkillPlayerInfo.Clear();
}
}
public static void OnTick() public static void OnTick()
{ {
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
@ -25,11 +33,55 @@ namespace src.player.skills
if (!Instance.IsPlayerValid(player)) return; if (!Instance.IsPlayerValid(player)) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName) if (playerInfo?.Skill == skillName)
HandleDash(player); if (SkillPlayerInfo.TryGetValue(player.SteamID, out var skillInfo))
{
UpdateHUD(player, skillInfo);
HandleDash(player, skillInfo);
}
} }
} }
private static void HandleDash(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
{
SkillPlayerInfo.TryAdd(player.SteamID, new PlayerSkillInfo
{
SteamID = player.SteamID,
CanUse = true,
Cooldown = DateTime.MinValue,
LastFlags = 0,
Jumps = 0,
LastButtons = 0
});
}
public static void DisableSkill(CCSPlayerController player)
{
SkillPlayerInfo.TryRemove(player.SteamID, out _);
SkillUtils.ResetPrintHTML(player);
}
private static void UpdateHUD(CCSPlayerController player, PlayerSkillInfo skillInfo)
{
float cooldown = 0;
if (skillInfo != null)
{
float time = (int)Math.Ceiling((skillInfo.Cooldown.AddSeconds(SkillsInfo.GetValue<float>(skillName, "cooldown")) - DateTime.Now).TotalSeconds);
cooldown = Math.Max(time, 0);
if (cooldown == 0 && skillInfo?.CanUse == false)
skillInfo.CanUse = true;
}
var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID);
if (playerInfo == null) return;
if (cooldown == 0)
playerInfo.PrintHTML = null;
else
playerInfo.PrintHTML = $"{player.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}";
}
private static void HandleDash(CCSPlayerController player, PlayerSkillInfo skillInfo)
{ {
var playerPawn = player.PlayerPawn.Value; var playerPawn = player.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) return; if (playerPawn == null || !playerPawn.IsValid) return;
@ -37,24 +89,34 @@ namespace src.player.skills
var flags = (PlayerFlags)playerPawn.Flags; var flags = (PlayerFlags)playerPawn.Flags;
var buttons = player.Buttons; var buttons = player.Buttons;
bool jumpPressed = (buttons & PlayerButtons.Jump) != 0
|| (playerPawn.MovementServices?.QueuedButtonChangeMask & (ulong)PlayerButtons.Jump) != 0;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerPawn == null || playerInfo == null) return; if (playerPawn == null || playerInfo == null) return;
if ((LF[player.Slot] & PlayerFlags.FL_ONGROUND) != 0 && (flags & PlayerFlags.FL_ONGROUND) == 0 && (LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0) bool wasOnGround = (skillInfo.LastFlags & PlayerFlags.FL_ONGROUND) != 0;
bool isOnGround = (flags & PlayerFlags.FL_ONGROUND) != 0;
if (wasOnGround && !isOnGround && jumpPressed)
skillInfo.Jumps = 0;
else if (isOnGround)
skillInfo.Jumps = 0;
else if (!isOnGround && jumpPressed && skillInfo.Jumps < 1)
{ {
} bool lastJumpPressed = (skillInfo.LastButtons & PlayerButtons.Jump) != 0;
else if ((flags & PlayerFlags.FL_ONGROUND) != 0) if (!lastJumpPressed && skillInfo.CanUse)
{ {
J[player.Slot] = 0; skillInfo.Jumps++;
} skillInfo.CanUse = false;
else if ((LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0 && J[player.Slot] < 1) skillInfo.Cooldown = DateTime.Now;
{
J[player.Slot]++;
float moveX = 0; float moveX = 0;
float moveY = 0; float moveY = 0;
PlayerButtons playerButtons = player.Buttons; PlayerButtons playerButtons = player.Buttons;
if (SkillsInfo.GetValue<bool>(skillName, "anyDirection"))
{
if (playerButtons.HasFlag(PlayerButtons.Forward)) if (playerButtons.HasFlag(PlayerButtons.Forward))
moveY += 1; moveY += 1;
if (playerButtons.HasFlag(PlayerButtons.Back)) if (playerButtons.HasFlag(PlayerButtons.Back))
@ -66,6 +128,9 @@ namespace src.player.skills
if (moveX == 0 && moveY == 0) if (moveX == 0 && moveY == 0)
moveY = 1; moveY = 1;
}
else
moveY = 1;
float moveAngle = MathF.Atan2(moveX, moveY) * (180f / MathF.PI); float moveAngle = MathF.Atan2(moveX, moveY) * (180f / MathF.PI);
QAngle dashAngles = new(0, playerPawn.EyeAngles.Y + moveAngle, 0); QAngle dashAngles = new(0, playerPawn.EyeAngles.Y + moveAngle, 0);
@ -77,15 +142,28 @@ namespace src.player.skills
playerPawn.AbsVelocity.Y = newVelocity.Y; playerPawn.AbsVelocity.Y = newVelocity.Y;
playerPawn.AbsVelocity.Z = newVelocity.Z; playerPawn.AbsVelocity.Z = newVelocity.Z;
} }
LF[player.Slot] = flags;
LB[player.Slot] = buttons;
} }
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#42bbfc", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float jumpVelocity = 150f, float pushVelocity = 600f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission) skillInfo.LastFlags = flags;
skillInfo.LastButtons = buttons;
}
public class PlayerSkillInfo
{
public ulong SteamID { get; set; }
public bool CanUse { get; set; }
public DateTime Cooldown { get; set; }
public PlayerFlags LastFlags { get; set; }
public int Jumps { get; set; }
public PlayerButtons LastButtons { get; set; }
}
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#42bbfc", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float jumpVelocity = 150f, float pushVelocity = 600f, bool anyDirection = true, float cooldown = 2f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
{ {
public float JumpVelocity { get; set; } = jumpVelocity; public float JumpVelocity { get; set; } = jumpVelocity;
public float PushVelocity { get; set; } = pushVelocity; public float PushVelocity { get; set; } = pushVelocity;
public bool AnyDirection { get; set; } = anyDirection;
public float Cooldown { get; set; } = cooldown;
} }
} }
} }

View file

@ -76,7 +76,7 @@ namespace src.player.skills
if (entity == null || !entity.IsValid) continue; if (entity == null || !entity.IsValid) continue;
info.TransmitEntities.Remove(entity.Index); info.TransmitEntities.Remove(entity.Index);
var bombIndex = HideBomb(_player); var bombIndex = GetBombIndex(_player);
if (bombIndex == null) continue; if (bombIndex == null) continue;
var bombEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)bombIndex); var bombEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)bombIndex);
if (bombEntity == null || !bombEntity.IsValid) continue; if (bombEntity == null || !bombEntity.IsValid) continue;
@ -170,7 +170,7 @@ namespace src.player.skills
playerInfo.PrintHTML = $"<font color='#FF0000'>{player.GetTranslation("disabled_weapon")}</font>"; playerInfo.PrintHTML = $"<font color='#FF0000'>{player.GetTranslation("disabled_weapon")}</font>";
} }
private static uint? HideBomb(CCSPlayerController player) private static uint? GetBombIndex(CCSPlayerController player)
{ {
var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList(); var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList();
if (bombEntities.Count == 0) return null; if (bombEntities.Count == 0) return null;
@ -179,14 +179,6 @@ namespace src.player.skills
if (bomb == null) return null; if (bomb == null) return null;
if (bomb.OwnerEntity.Index != player.Index) return null; if (bomb.OwnerEntity.Index != player.Index) return null;
bomb.EntitySpottedState.Spotted = false;
Utilities.SetStateChanged(bomb, "CCSPlayerPawn", "m_entitySpottedState", Schema.GetSchemaOffset("EntitySpottedState_t", "m_bSpotted"));
for (int i = 0; i < bomb.EntitySpottedState.SpottedByMask.Length; i++)
bomb.EntitySpottedState.SpottedByMask[i] = 0;
Utilities.SetStateChanged(bomb, "CCSPlayerPawn", "m_entitySpottedState", Schema.GetSchemaOffset("EntitySpottedState_t", "m_bSpottedByMask"));
return bomb.Index; return bomb.Index;
} }

View file

@ -72,7 +72,7 @@ namespace src.player.skills
{ {
foreach (Vector smokePos in smokes.Keys) foreach (Vector smokePos in smokes.Keys)
foreach (var player in Utilities.GetPlayers()) foreach (var player in Utilities.GetPlayers())
if (Server.TickCount % 17 == 0) if (Server.TickCount % 16 == 0)
if (player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.AbsOrigin != null) if (player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.AbsOrigin != null)
if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= SkillsInfo.GetValue<float>(skillName, "smokeRadius")) if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= SkillsInfo.GetValue<float>(skillName, "smokeRadius"))
AddHealth(player.PlayerPawn.Value, SkillsInfo.GetValue<int>(skillName, "smokeHeal")); AddHealth(player.PlayerPawn.Value, SkillsInfo.GetValue<int>(skillName, "smokeHeal"));

View file

@ -1,7 +1,5 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Timers; using CounterStrikeSharp.API.Modules.Timers;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
@ -9,7 +7,7 @@ using CS2TraceRay.Class;
using CS2TraceRay.Struct; using CS2TraceRay.Struct;
using src.utils; using src.utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Numerics; using Timer = CounterStrikeSharp.API.Modules.Timers.Timer;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
namespace src.player.skills namespace src.player.skills
@ -22,7 +20,7 @@ namespace src.player.skills
public static void LoadSkill() public static void LoadSkill()
{ {
// SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
} }
public static void NewRound() public static void NewRound()
@ -143,8 +141,9 @@ namespace src.player.skills
clone.Teleport(playerPawn.AbsOrigin, new QAngle(0, playerPawn.V_angle.Y, 0)); clone.Teleport(playerPawn.AbsOrigin, new QAngle(0, playerPawn.V_angle.Y, 0));
playerPawn.Teleport(pos); playerPawn.Teleport(pos);
SkillUtils.ApplyScreenColor(player, 255, 255, 0, 20, 100, 1020); SkillUtils.ApplyScreenColor(player, r: 255, g: 255, b: 0, a: 20, duration: 100, holdTime: 1020);
BlockWeapon(playerSkill.Player, true); BlockWeapon(playerSkill.Player, true);
playerSkill.UseTime = Server.TickCount; playerSkill.UseTime = Server.TickCount;
playerSkill.NextUse = Server.TickCount + 64000; playerSkill.NextUse = Server.TickCount + 64000;
playerSkill.CloneProp = clone; playerSkill.CloneProp = clone;
@ -155,18 +154,25 @@ namespace src.player.skills
KillClone(playerSkill); KillClone(playerSkill);
}); });
jRandomSkills.Instance.AddTimer(2f, () => { Timer? cloneTimer = null;
if (playerSkill.CloneProp == null) ulong playerSteamID = player.SteamID;
return;
if (player.IsValid && player.PawnIsAlive) cloneTimer = jRandomSkills.Instance.AddTimer(2f, () =>
SkillUtils.ApplyScreenColor(player, {
r: 255, var target = Utilities.GetPlayerFromSteamId(playerSteamID);
g: 255, if (target == null || !target.IsValid || !target.PawnIsAlive)
b: 0, {
a: 20, cloneTimer?.Kill();
duration: 100, return;
holdTime: 1020); }
if (!playersInfo.TryGetValue(target, out var playerSkill) || playerSkill.CloneProp == null)
{
cloneTimer?.Kill();
return;
}
SkillUtils.ApplyScreenColor(target, r: 255, g: 255, b: 0, a: 20, duration: 100, holdTime: 1020);
}, TimerFlags.STOP_ON_MAPCHANGE | TimerFlags.REPEAT); }, TimerFlags.STOP_ON_MAPCHANGE | TimerFlags.REPEAT);
}); });
@ -181,22 +187,9 @@ namespace src.player.skills
Vector eyePos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + 25); Vector eyePos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + 25);
endPos.Z += 25; endPos.Z += 25;
Ray ray = new(Vector3.Zero); ulong mask = playerPawn.Collision.CollisionAttribute.InteractsWith;
CTraceFilter filter = new(playerPawn.Index, playerPawn.Index) ulong contents = playerPawn.Collision.CollisionGroup;
{ CGameTrace trace = TraceRay.TraceShape(eyePos, endPos, mask, contents, player);
m_nObjectSetMask = 0xf,
m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT,
m_nInteractsWith = playerPawn.GetInteractsWith(),
m_nInteractsExclude = 0,
m_nBits = 11,
m_bIterateEntities = true,
m_bHitTriggers = false,
m_nInteractsAs = 0x40000
};
filter.m_nHierarchyIds[0] = playerPawn.GetHierarchyId();
filter.m_nHierarchyIds[1] = 0;
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
return !trace.DidHit(); return !trace.DidHit();
} }
@ -282,9 +275,7 @@ namespace src.player.skills
if (playersInfo.TryGetValue(victim, out var playerSkill) && playerSkill.CloneProp != null) if (playersInfo.TryGetValue(victim, out var playerSkill) && playerSkill.CloneProp != null)
{ {
KillClone(playerSkill); KillClone(playerSkill);
var victimPawn = victim.PlayerPawn.Value; SkillUtils.RestoreHealth(victim);
if (victimPawn == null) return;
SkillUtils.AddHealth(victimPawn, @event.DmgHealth);
} }
} }

View file

@ -34,23 +34,31 @@ namespace src.player.skills
{ {
foreach( var (info, player) in infoList) foreach( var (info, player) in infoList)
{ {
if (player == null) continue; if (player == null || !player.IsValid) continue;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
var targetHandle = player.Pawn.Value?.ObserverServices?.ObserverTarget.Value?.Handle ?? nint.Zero;
bool isObservingJackal = false;
if (targetHandle != nint.Zero)
{
var target = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == targetHandle);
var targetInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == target?.SteamID);
if (targetInfo?.Skill == skillName) isObservingJackal = true;
}
bool hasSkill = playerInfo?.Skill == skillName || isObservingJackal;
foreach (var param in playersStep) foreach (var param in playersStep)
{ {
var enemy = param.Key; var enemy = param.Key;
var step = param.Value; var step = param.Value;
if (step == null || step.IsValid) continue; if (step == null || !step.IsValid) continue;
var observedPlayer = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == player?.Pawn?.Value?.ObserverServices?.ObserverTarget?.Value?.Handle);
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
var observerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == observedPlayer?.SteamID);
var entity = Utilities.GetEntityFromIndex<CBaseEntity>((int)step.Index); var entity = Utilities.GetEntityFromIndex<CBaseEntity>((int)step.Index);
if (entity == null || !entity.IsValid) continue; if (entity == null || !entity.IsValid) continue;
if (playerInfo?.Skill != skillName && observerInfo?.Skill != skillName) if (!hasSkill || enemy.Team == player.Team)
info.TransmitEntities.Remove(entity.Index);
else if (enemy.Team == player.Team)
info.TransmitEntities.Remove(entity.Index); info.TransmitEntities.Remove(entity.Index);
} }
} }

View file

@ -50,25 +50,13 @@ namespace src.player.skills
if (!Instance.IsPlayerValid(attacker)) if (!Instance.IsPlayerValid(attacker))
{ {
if (victimInfo?.Skill == skillName) if (victimInfo?.Skill == skillName)
RestoreHealth(victim!, @event.DmgHealth); SkillUtils.RestoreHealth(victim);
return; return;
} }
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID); var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
if (attackerInfo?.Skill == skillName || victimInfo?.Skill == skillName) if (attackerInfo?.Skill == skillName || victimInfo?.Skill == skillName)
RestoreHealth(victim!, @event.DmgHealth); SkillUtils.RestoreHealth(victim);
}
private static void RestoreHealth(CCSPlayerController victim, float damage)
{
var playerPawn = victim.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) return;
var newHealth = playerPawn.Health + damage;
if (newHealth > 100)
newHealth = 100;
playerPawn.Health = (int)newHealth;
} }
public static void EnableSkill(CCSPlayerController _) public static void EnableSkill(CCSPlayerController _)

View file

@ -1,4 +1,5 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.utils; using src.utils;
using static src.jRandomSkills; using static src.jRandomSkills;

View file

@ -1,6 +1,5 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using CS2TraceRay.Class; using CS2TraceRay.Class;
@ -9,7 +8,6 @@ using CS2TraceRay.Struct;
using src.utils; using src.utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Drawing; using System.Drawing;
using System.Numerics;
using static src.jRandomSkills; using static src.jRandomSkills;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
@ -24,6 +22,8 @@ namespace src.player.skills
private static readonly ConcurrentDictionary<ulong, byte> playersInAction = []; private static readonly ConcurrentDictionary<ulong, byte> playersInAction = [];
private static readonly MemoryFunctionVoid<IntPtr, short> Shoot_Secondary = new(GameData.GetSignature("Shoot_Secondary")); private static readonly MemoryFunctionVoid<IntPtr, short> Shoot_Secondary = new(GameData.GetSignature("Shoot_Secondary"));
private static int i = 0;
public static void LoadSkill() public static void LoadSkill()
{ {
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
@ -100,22 +100,10 @@ namespace src.player.skills
Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z); Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z);
Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * SkillsInfo.GetValue<float>(skillName, "maxDistance"); Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * SkillsInfo.GetValue<float>(skillName, "maxDistance");
Ray ray = new(Vector3.Zero); ulong hitboxes = 0x2;
CTraceFilter filter = new(pawn.Index, pawn.Index) ulong mask = pawn.Collision.CollisionAttribute.InteractsWith | hitboxes;
{ ulong contents = pawn.Collision.CollisionGroup;
m_nObjectSetMask = 0xf, CGameTrace trace = TraceRay.TraceShape(eyePos, endPos, mask, contents, player);
m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT,
m_nInteractsWith = pawn.GetInteractsWith(),
m_nInteractsExclude = 0,
m_nBits = 11,
m_bIterateEntities = true,
m_bHitTriggers = false,
m_nInteractsAs = 0x40000
};
filter.m_nHierarchyIds[0] = pawn.GetHierarchyId();
filter.m_nHierarchyIds[1] = 0;
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
if (Config.LoadedConfig.CS2TraceRayDebug) if (Config.LoadedConfig.CS2TraceRayDebug)
{ {
@ -126,12 +114,17 @@ namespace src.player.skills
if (trace.DidHit()) if (trace.DidHit())
{ {
var val = Activator.CreateInstance(typeof(CBaseEntity), trace.HitEntity) as CBaseEntity; var val = Activator.CreateInstance(typeof(CBaseEntity), trace.HitEntity) as CBaseEntity;
player.PrintToChat($"Hit: {trace.DidHit()}, Entity: {(val == null ? "null" : val.DesignerName)}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}"); player.PrintToChat($"Hit: {trace.DidHit()}, Entity: {(val == null ? "null" : val.DesignerName)}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}, Hitbox: {trace.HitboxData[0].HitGroup}");
} }
else else
player.PrintToChat($"Hit: {trace.DidHit()}, Entity: {trace.HitEntity}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}"); player.PrintToChat($"Hit: {trace.DidHit()}, Object: {trace.HitEntity}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}, Hitbox: {trace.HitboxData[0].HitGroup}");
} }
CEntityInstance entityInstance = new(trace.HitEntity);
if (string.IsNullOrEmpty(entityInstance.DesignerName))
return;
CBaseEntity entity = entityInstance.As<CBaseEntity>();
if (!trace.HitPlayer(out CCSPlayerController? target) || target == null) if (!trace.HitPlayer(out CCSPlayerController? target) || target == null)
return; return;

View file

@ -7,7 +7,6 @@ using CS2TraceRay.Enum;
using CS2TraceRay.Struct; using CS2TraceRay.Struct;
using src.utils; using src.utils;
using System.Drawing; using System.Drawing;
using System.Numerics;
using static src.jRandomSkills; using static src.jRandomSkills;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
@ -39,22 +38,10 @@ namespace src.player.skills
Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z); Vector eyePos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z);
Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * SkillsInfo.GetValue<float>(skillName, "maxDistance"); Vector endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * SkillsInfo.GetValue<float>(skillName, "maxDistance");
Ray ray = new(Vector3.Zero); ulong hitboxes = 0x2;
CTraceFilter filter = new(pawn.Index, pawn.Index) ulong mask = pawn.Collision.CollisionAttribute.InteractsWith | hitboxes;
{ ulong contents = pawn.Collision.CollisionGroup;
m_nObjectSetMask = 0xf, CGameTrace trace = TraceRay.TraceShape(eyePos, endPos, mask, contents, player);
m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT,
m_nInteractsWith = pawn.GetInteractsWith(),
m_nInteractsExclude = 0,
m_nBits = 11,
m_bIterateEntities = true,
m_bHitTriggers = false,
m_nInteractsAs = 0x40000
};
filter.m_nHierarchyIds[0] = pawn.GetHierarchyId();
filter.m_nHierarchyIds[1] = 0;
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
if (Config.LoadedConfig.CS2TraceRayDebug) if (Config.LoadedConfig.CS2TraceRayDebug)
{ {
@ -65,10 +52,10 @@ namespace src.player.skills
if (trace.DidHit()) if (trace.DidHit())
{ {
var val = Activator.CreateInstance(typeof(CBaseEntity), trace.HitEntity) as CBaseEntity; var val = Activator.CreateInstance(typeof(CBaseEntity), trace.HitEntity) as CBaseEntity;
player.PrintToChat($"Hit: {trace.DidHit()}, Entity: {(val == null ? "null" : val.DesignerName)}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}"); player.PrintToChat($"Hit: {trace.DidHit()}, Entity: {(val == null ? "null" : val.DesignerName)}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}, Hitbox: {trace.HitboxData[0].HitGroup}");
} }
else else
player.PrintToChat($"Hit: {trace.DidHit()}, Entity: {trace.HitEntity}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}"); player.PrintToChat($"Hit: {trace.DidHit()}, Object: {trace.HitEntity}, Solid: {trace.AllSolid}, Contents: {(Contents)trace.Contents}, Hitbox: {trace.HitboxData[0].HitGroup}");
} }
if (!trace.HitPlayer(out CCSPlayerController? target) || target == null) if (!trace.HitPlayer(out CCSPlayerController? target) || target == null)

View file

@ -68,7 +68,7 @@ namespace src.player.skills
if (entity == null || !entity.IsValid) continue; if (entity == null || !entity.IsValid) continue;
info.TransmitEntities.Remove(entity.Index); info.TransmitEntities.Remove(entity.Index);
var bombIndex = HideBomb(_player); var bombIndex = GetBombIndex(_player);
if (bombIndex == null) continue; if (bombIndex == null) continue;
var bombEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)bombIndex); var bombEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)bombIndex);
if (bombEntity == null || !bombEntity.IsValid) continue; if (bombEntity == null || !bombEntity.IsValid) continue;
@ -170,7 +170,7 @@ namespace src.player.skills
particle.AcceptInput("Start"); particle.AcceptInput("Start");
} }
private static uint? HideBomb(CCSPlayerController player) private static uint? GetBombIndex(CCSPlayerController player)
{ {
var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList(); var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList();
if (bombEntities.Count == 0) return null; if (bombEntities.Count == 0) return null;
@ -179,14 +179,6 @@ namespace src.player.skills
if (bomb == null) return null; if (bomb == null) return null;
if (bomb.OwnerEntity.Index != player.Index) return null; if (bomb.OwnerEntity.Index != player.Index) return null;
bomb.EntitySpottedState.Spotted = false;
Utilities.SetStateChanged(bomb, "CCSPlayerPawn", "m_entitySpottedState", Schema.GetSchemaOffset("EntitySpottedState_t", "m_bSpotted"));
for (int i = 0; i < bomb.EntitySpottedState.SpottedByMask.Length; i++)
bomb.EntitySpottedState.SpottedByMask[i] = 0;
Utilities.SetStateChanged(bomb, "CCSPlayerPawn", "m_entitySpottedState", Schema.GetSchemaOffset("EntitySpottedState_t", "m_bSpottedByMask"));
return bomb.Index; return bomb.Index;
} }

View file

@ -1,4 +1,5 @@
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.utils; using src.utils;
using static src.jRandomSkills; using static src.jRandomSkills;
@ -24,8 +25,8 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
if (playerInfo?.Skill != skillName) return; if (playerInfo?.Skill != skillName) return;
if (weapon == "hegrenade" || weapon == "inferno") if (weapon == "hegrenade" || weapon == "inferno" || weapon == "decoy" || weapon == "flashbang" || weapon == "smokegrenade" || weapon == "molotov")
SkillUtils.AddHealth(player!.PlayerPawn.Value, damage); SkillUtils.RestoreHealth(player);
} }
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a38c1a", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#a38c1a", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)

View file

@ -28,20 +28,7 @@ namespace src.player.skills
HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG]; HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG];
if (hitgroup != HitGroup_t.HITGROUP_HEAD) if (hitgroup != HitGroup_t.HITGROUP_HEAD)
RestoreHealth(victim!, damage); SkillUtils.RestoreHealth(victim);
}
private static void RestoreHealth(CCSPlayerController victim, float damage)
{
var playerPawn = victim.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) return;
var newHealth = playerPawn.Health + damage;
if (newHealth > 100)
newHealth = 100;
playerPawn.Health = (int)newHealth;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
} }
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#3c47de", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#3c47de", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)

View file

@ -52,18 +52,20 @@ namespace src.player.skills
var flags = (PlayerFlags)playerPawn.Flags; var flags = (PlayerFlags)playerPawn.Flags;
var buttons = player.Buttons; var buttons = player.Buttons;
bool isJumpDown = (playerPawn.MovementServices?.Buttons?.ButtonStates[0] & (ulong)PlayerButtons.Jump) != 0 || (buttons & PlayerButtons.Jump) != 0;
bool wasJumpDown = (LB[player.Slot] & PlayerButtons.Jump) != 0;
bool jumpPressed = (isJumpDown && !wasJumpDown)
|| (playerPawn.MovementServices?.QueuedButtonChangeMask & (ulong)PlayerButtons.Jump) != 0;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerPawn == null || playerInfo == null) return; if (playerPawn == null || playerInfo == null) return;
if ((LF[player.Slot] & PlayerFlags.FL_ONGROUND) != 0 && (flags & PlayerFlags.FL_ONGROUND) == 0 && (LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0) bool isOnGround = (flags & PlayerFlags.FL_ONGROUND) != 0;
{
//J[player.Slot] ++; if (isOnGround)
}
else if ((flags & PlayerFlags.FL_ONGROUND) != 0)
{
J[player.Slot] = 0; J[player.Slot] = 0;
} else if (jumpPressed && J[player.Slot] < playerInfo.SkillChance + 1)
else if ((LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0 && J[player.Slot] < playerInfo.SkillChance)
{ {
J[player.Slot]++; J[player.Slot]++;
playerPawn.AbsVelocity.Z = 300; playerPawn.AbsVelocity.Z = 300;

View file

@ -27,6 +27,8 @@ namespace src.player.skills
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault(); var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
if (plantedBomb != null) if (plantedBomb != null)
Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + SkillsInfo.GetValue<int>(skillName, "extraC4BlowTime")); Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + SkillsInfo.GetValue<int>(skillName, "extraC4BlowTime"));
player!.PrintToCenterAlert(player.GetTranslation("bombplanted", SkillsInfo.GetValue<int>(skillName, "extraC4BlowTime")));
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)

View file

@ -28,20 +28,7 @@ namespace src.player.skills
HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG]; HitGroup_t[] disabledHitbox = [HitGroup_t.HITGROUP_LEFTARM, HitGroup_t.HITGROUP_RIGHTARM, HitGroup_t.HITGROUP_LEFTLEG, HitGroup_t.HITGROUP_RIGHTLEG];
if (disabledHitbox.Contains(hitgroup)) if (disabledHitbox.Contains(hitgroup))
RestoreHealth(victim!, damage); SkillUtils.RestoreHealth(victim);
}
private static void RestoreHealth(CCSPlayerController victim, float damage)
{
var playerPawn = victim.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) return;
var newHealth = playerPawn.Health + damage;
if (newHealth > 100)
newHealth = 100;
playerPawn.Health = (int)newHealth;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
} }
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#9c9c9c", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#9c9c9c", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)

View file

@ -26,7 +26,8 @@ namespace src.player.skills
var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID); var victimInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
if (victimInfo == null || victimInfo.Skill != skillName) return ; if (victimInfo == null || victimInfo.Skill != skillName) return ;
RestoreHealth(victim!, damage * SkillsInfo.GetValue<float>(skillName, "regenerationMultiplier")); var pawn = victim!.PlayerPawn.Value;
SkillUtils.AddHealth(pawn, (int)(damage * SkillsInfo.GetValue<float>(skillName, "regenerationMultiplier")));
} }
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
@ -34,19 +35,6 @@ namespace src.player.skills
SkillUtils.TryGiveWeapon(player, player.Team == CsTeam.CounterTerrorist ? CsItem.IncendiaryGrenade : CsItem.Molotov); SkillUtils.TryGiveWeapon(player, player.Team == CsTeam.CounterTerrorist ? CsItem.IncendiaryGrenade : CsItem.Molotov);
} }
private static void RestoreHealth(CCSPlayerController victim, float damage)
{
var playerPawn = victim.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) return;
var newHealth = playerPawn.Health + damage;
if (newHealth > 100)
newHealth = 100;
playerPawn.Health = (int)newHealth;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
}
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#3c47de", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float regenerationMultiplier = 1.5f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#3c47de", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float regenerationMultiplier = 1.5f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
{ {
public float RegenerationMultiplier { get; set; } = regenerationMultiplier; public float RegenerationMultiplier { get; set; } = regenerationMultiplier;

View file

@ -1,14 +1,11 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Timers;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using CS2TraceRay.Class; using CS2TraceRay.Class;
using CS2TraceRay.Struct; using CS2TraceRay.Struct;
using src.utils; using src.utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Numerics;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
using static src.jRandomSkills; using static src.jRandomSkills;
@ -170,22 +167,9 @@ namespace src.player.skills
Vector eyePos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + 25); Vector eyePos = new(playerPawn.AbsOrigin.X, playerPawn.AbsOrigin.Y, playerPawn.AbsOrigin.Z + 25);
endPos.Z += 25; endPos.Z += 25;
Ray ray = new(Vector3.Zero); ulong mask = playerPawn.Collision.CollisionAttribute.InteractsWith;
CTraceFilter filter = new(playerPawn.Index, playerPawn.Index) ulong contents = playerPawn.Collision.CollisionGroup;
{ CGameTrace trace = TraceRay.TraceShape(eyePos, endPos, mask, contents, player);
m_nObjectSetMask = 0xf,
m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT,
m_nInteractsWith = playerPawn.GetInteractsWith(),
m_nInteractsExclude = 0,
m_nBits = 11,
m_bIterateEntities = true,
m_bHitTriggers = false,
m_nInteractsAs = 0x40000
};
filter.m_nHierarchyIds[0] = playerPawn.GetHierarchyId();
filter.m_nHierarchyIds[1] = 0;
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
return !trace.DidHit(); return !trace.DidHit();
} }
@ -225,9 +209,7 @@ namespace src.player.skills
if (playersInfo.TryGetValue(victim, out var playerSkill) && playerSkill.CloneProp != null) if (playersInfo.TryGetValue(victim, out var playerSkill) && playerSkill.CloneProp != null)
{ {
KillClone(playerSkill); KillClone(playerSkill);
var victimPawn = victim.PlayerPawn.Value; SkillUtils.RestoreHealth(victim);
if (victimPawn == null) return;
SkillUtils.AddHealth(victimPawn, @event.DmgHealth);
} }
} }

View file

@ -47,7 +47,7 @@ namespace src.player.skills
if (!victim.IsValid || !victim.PawnIsAlive || !skillInfo.CanUse) return; if (!victim.IsValid || !victim.PawnIsAlive || !skillInfo.CanUse) return;
skillInfo.CanUse = false; skillInfo.CanUse = false;
skillInfo.Cooldown = DateTime.Now; skillInfo.Cooldown = DateTime.Now;
RestoreHealth(victim, damage); SkillUtils.RestoreHealth(victim);
} }
} }
@ -88,19 +88,6 @@ namespace src.player.skills
playerInfo.PrintHTML = $"{player.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}"; playerInfo.PrintHTML = $"{player.GetTranslation("hud_info", $"<font color='#FF0000'>{cooldown}</font>")}";
} }
private static void RestoreHealth(CCSPlayerController victim, float damage)
{
var playerPawn = victim.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) return;
var newHealth = playerPawn.Health + damage;
if (newHealth > 100)
newHealth = 100;
playerPawn.Health = (int)newHealth;
Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth");
}
public class PlayerSkillInfo public class PlayerSkillInfo
{ {
public ulong SteamID { get; set; } public ulong SteamID { get; set; }

View file

@ -20,6 +20,12 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return; if (playerInfo == null) return;
int moneyBonus = Instance.Random.Next(SkillsInfo.GetValue<int>(skillName, "minMoney"), SkillsInfo.GetValue<int>(skillName, "maxMoney")); int moneyBonus = Instance.Random.Next(SkillsInfo.GetValue<int>(skillName, "minMoney"), SkillsInfo.GetValue<int>(skillName, "maxMoney"));
var moneyServices = player.InGameMoneyServices;
if (moneyServices == null) return;
moneyBonus = Math.Min(moneyBonus, 16000 - moneyServices.Account);
playerInfo.SkillChance = moneyBonus; playerInfo.SkillChance = moneyBonus;
AddMoney(player, moneyBonus); AddMoney(player, moneyBonus);
} }
@ -28,16 +34,22 @@ namespace src.player.skills
{ {
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return; if (playerInfo == null) return;
AddMoney(player, -(int)(playerInfo.SkillChance ?? 0));
var moneyServices = player.InGameMoneyServices;
if (moneyServices == null) return;
player.PrintToChat(moneyServices.CashSpentThisRound.ToString());
int money = Math.Abs((int)playerInfo.SkillChance! - moneyServices.CashSpentThisRound);
AddMoney(player, -money, 3000);
} }
private static void AddMoney(CCSPlayerController player, int money) private static void AddMoney(CCSPlayerController player, int money, int minimum = 0)
{ {
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var moneyServices = player.InGameMoneyServices; var moneyServices = player.InGameMoneyServices;
if (moneyServices == null) return; if (moneyServices == null) return;
moneyServices.Account = Math.Min(Math.Max(moneyServices.Account + money, 0), 16000); moneyServices.Account = Math.Clamp(moneyServices.Account + money, minimum, 16000);
Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInGameMoneyServices"); Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInGameMoneyServices");
} }

View file

@ -1,10 +1,8 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using CS2TraceRay.Class; using CS2TraceRay.Class;
using CS2TraceRay.Struct; using CS2TraceRay.Struct;
using System.Numerics;
using static src.jRandomSkills; using static src.jRandomSkills;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
using System.Collections.Concurrent; using System.Collections.Concurrent;
@ -69,29 +67,18 @@ namespace src.player.skills
{ {
var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID);
if (playerInfo == null) return; if (playerInfo == null) return;
playerInfo.PrintHTML = $"{player.GetTranslation("shade_nospace")}"; playerInfo.PrintHTML = $"<font color='#FF0000'>{player.GetTranslation("shade_nospace")}</font>";
} }
private unsafe static bool CheckTeleport(CCSPlayerController player, Vector startPos, Vector endPos) private unsafe static bool CheckTeleport(CCSPlayerController player, Vector startPos, Vector endPos)
{ {
var pawn = player.PlayerPawn.Value; var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid) return false; if (pawn == null || !pawn.IsValid) return false;
Ray ray = new(new Vector3(-16, -16, -0), new Vector3(16, 16, 72));
CTraceFilter filter = new(pawn.Index, pawn.Index)
{
m_nObjectSetMask = 0xf,
m_nCollisionGroup = (byte)CollisionGroup.COLLISION_GROUP_PLAYER_MOVEMENT,
m_nInteractsWith = pawn.GetInteractsWith(),
m_nInteractsExclude = 0,
m_nBits = 11,
m_bIterateEntities = true,
m_bHitTriggers = false,
m_nInteractsAs = 0x40000
};
filter.m_nHierarchyIds[0] = pawn.GetHierarchyId(); ulong mask = pawn.Collision.CollisionAttribute.InteractsWith;
filter.m_nHierarchyIds[1] = 0; ulong contents = pawn.Collision.CollisionGroup;
CGameTrace trace = TraceRay.TraceHull(startPos, endPos, filter, ray); CGameTrace trace = TraceRay.TraceShape(startPos, endPos, mask, contents, player);
return !trace.HitWorld(out _); return !trace.HitWorld(out _);
} }

View file

@ -26,6 +26,8 @@ namespace src.player.skills
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault(); var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
if (plantedBomb != null) if (plantedBomb != null)
Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + SkillsInfo.GetValue<int>(skillName, "detonationTime")); Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + SkillsInfo.GetValue<int>(skillName, "detonationTime"));
player!.PrintToCenterAlert(player.GetTranslation("bombplanted", SkillsInfo.GetValue<int>(skillName, "detonationTime")));
} }
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#f5b74c", CsTeam onlyTeam = CsTeam.Terrorist, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int detonationTime = 20) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#f5b74c", CsTeam onlyTeam = CsTeam.Terrorist, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int detonationTime = 20) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)

View file

@ -1,19 +1,23 @@
using CounterStrikeSharp.API; using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using static src.jRandomSkills;
using System.Collections.Concurrent;
using src.utils; using src.utils;
using System.Collections.Concurrent;
using System.Drawing;
using static src.jRandomSkills;
namespace src.player.skills namespace src.player.skills
{ {
public class SniperElite : ISkill public class SniperElite : ISkill
{ {
private const Skills skillName = Skills.SniperElite; private const Skills skillName = Skills.SniperElite;
private static readonly ConcurrentDictionary<ulong, List<CEntityInstance>> playerAWPs = []; private static readonly ConcurrentDictionary<ulong, List<uint>> playerAWPIndexes = [];
private static readonly ConcurrentDictionary<ulong, string> sniperElites = []; private static readonly ConcurrentDictionary<ulong, string> savedWeapons = [];
private static readonly ConcurrentDictionary<ulong, byte> isProcessing = [];
private static readonly object setLock = new(); private static readonly object setLock = new();
private const string weapon_awp = "weapon_awp";
private static readonly string[] rifles = [ "weapon_mp9", "weapon_mac10", "weapon_bizon", "weapon_mp7", "weapon_ump45", "weapon_p90", private static readonly string[] rifles = [ "weapon_mp9", "weapon_mac10", "weapon_bizon", "weapon_mp7", "weapon_ump45", "weapon_p90",
"weapon_mp5sd", "weapon_famas", "weapon_galilar", "weapon_m4a1", "weapon_m4a1_silencer", "weapon_ak47", "weapon_mp5sd", "weapon_famas", "weapon_galilar", "weapon_m4a1", "weapon_m4a1_silencer", "weapon_ak47",
"weapon_aug", "weapon_sg553", "weapon_ssg08", "weapon_awp", "weapon_scar20", "weapon_g3sg1", "weapon_aug", "weapon_sg553", "weapon_ssg08", "weapon_awp", "weapon_scar20", "weapon_g3sg1",
@ -29,8 +33,9 @@ namespace src.player.skills
lock (setLock) lock (setLock)
{ {
sniperElites.Clear(); savedWeapons.Clear();
playerAWPs.Clear(); playerAWPIndexes.Clear();
isProcessing.Clear();
} }
} }
@ -38,6 +43,7 @@ namespace src.player.skills
{ {
var player = @event.Userid; var player = @event.Userid;
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName) if (playerInfo?.Skill == skillName)
DisableSkill(player); DisableSkill(player);
@ -47,118 +53,169 @@ namespace src.player.skills
{ {
var player = @event.Userid; var player = @event.Userid;
if (player == null || !player.IsValid) return; if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID); var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName) if (playerInfo?.Skill == skillName)
{
if (rifles.Contains(@event.Item) && @event.Item != weapon_awp)
savedWeapons.AddOrUpdate(player.SteamID, string.Empty, (_, _) => string.Empty);
DeleteDroppedAWP(player); DeleteDroppedAWP(player);
} }
}
public static void EnableSkill(CCSPlayerController player) public static void EnableSkill(CCSPlayerController player)
{ {
sniperElites.TryAdd(player.SteamID, "weapon_awp"); savedWeapons.TryAdd(player.SteamID, string.Empty);
} }
public static void DisableSkill(CCSPlayerController player) public static void DisableSkill(CCSPlayerController player)
{ {
sniperElites.TryRemove(player.SteamID, out _); player.ExecuteClientCommand("slot3");
playerAWPs.TryRemove(player.SteamID, out _);
if (playerAWPIndexes.TryGetValue(player.SteamID, out var AWPs))
foreach (var index in AWPs.ToList())
{
var ent = Utilities.GetEntityFromIndex<CBaseEntity>((int)index);
if (ent != null && ent.IsValid)
ent.AcceptInput("Kill");
}
if (savedWeapons.TryGetValue(player.SteamID, out string? savedWeapon) && !string.IsNullOrWhiteSpace(savedWeapon))
Server.NextFrame(() =>
player.PlayerPawn.Value?.ItemServices?.As<CCSPlayer_ItemServices>().GiveNamedItem<CEntityInstance>(savedWeapon));
Server.NextFrame(() => player.ExecuteClientCommand("lastinv"));
savedWeapons.TryRemove(player.SteamID, out _);
playerAWPIndexes.TryRemove(player.SteamID, out _);
isProcessing.TryRemove(player.SteamID, out _);
} }
public static void UseSkill(CCSPlayerController player) public static void UseSkill(CCSPlayerController player)
{ {
var playerPawn = player.PlayerPawn.Value; if (player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || isProcessing.ContainsKey(player.SteamID)) return;
if (playerPawn?.CBodyComponent == null) return; if (savedWeapons.ContainsKey(player.SteamID))
if (sniperElites.ContainsKey(player.SteamID))
RemoveAndGiveWeapon(player); RemoveAndGiveWeapon(player);
} }
private static void RemoveAndGiveWeapon(CCSPlayerController player) private static void RemoveAndGiveWeapon(CCSPlayerController player)
{ {
string holdedWeapon = "weapon_awp"; ulong steamID = player.SteamID;
if (sniperElites.TryGetValue(player.SteamID, out string? weapon))
if (!string.IsNullOrEmpty(weapon))
holdedWeapon = weapon;
try try
{ {
if (!isProcessing.TryAdd(steamID, 0)) return;
CBasePlayerWeapon? activeRifle = GetActiveRifle(player); CBasePlayerWeapon? activeRifle = GetActiveRifle(player);
string weaponToGive = weapon_awp;
if (activeRifle != null && activeRifle.IsValid) if (activeRifle != null && activeRifle.IsValid)
RemoveWeapon(player, activeRifle.DesignerName);
sniperElites.TryAdd(player.SteamID, (activeRifle != null && activeRifle.IsValid) ? SkillUtils.GetDesignerName(activeRifle) : "weapon_awp");
Server.NextFrame(() => {
string weapon = holdedWeapon ?? "weapon_awp";
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return;
var createdWeapon = player.PlayerPawn.Value?.ItemServices?.As<CCSPlayer_ItemServices>().GiveNamedItem<CEntityInstance>(weapon);
if (createdWeapon != null && createdWeapon.IsValid && createdWeapon.DesignerName == "weapon_awp")
{ {
string currentWeaponName = SkillUtils.GetDesignerName(activeRifle);
bool isScriptAWP = false;
lock (setLock)
isScriptAWP = playerAWPIndexes.TryGetValue(steamID, out var indexes) && indexes.Contains(activeRifle.Index);
if (isScriptAWP)
{
if (savedWeapons.TryGetValue(steamID, out var savedWeapon) && !string.IsNullOrEmpty(savedWeapon))
{
weaponToGive = savedWeapon;
savedWeapons.AddOrUpdate(steamID, string.Empty, (_, _) => string.Empty);
}
else
{
isProcessing.TryRemove(steamID, out _);
return;
}
}
else
{
savedWeapons.AddOrUpdate(steamID, currentWeaponName, (_, _) => currentWeaponName);
weaponToGive = weapon_awp + "_script";
}
activeRifle.AcceptInput("Kill");
}
else
{
if (savedWeapons.TryGetValue(steamID, out string? savedWeapon) && !string.IsNullOrEmpty(savedWeapon))
{
weaponToGive = savedWeapon;
savedWeapons.AddOrUpdate(steamID, string.Empty, (_, _) => string.Empty);
}
else
weaponToGive = weapon_awp + "_script";
}
Server.NextFrame(() =>
{
if (player != null && player.IsValid && player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid)
{
var createdWeapon = player.PlayerPawn.Value?.ItemServices?.As<CCSPlayer_ItemServices>().GiveNamedItem<CEntityInstance>(weaponToGive.Replace("_script", ""));
if (createdWeapon != null && createdWeapon.IsValid && weaponToGive.EndsWith("_script"))
{
CBasePlayerWeapon weapon = createdWeapon.As<CBasePlayerWeapon>();
if (weapon?.AttributeManager.Item.NetworkedDynamicAttributes != null)
weapon.AttributeManager.Item.CustomName = player.GetTranslation("sniperelite_customname");
lock (setLock) lock (setLock)
{ {
if (playerAWPs.TryGetValue(player.SteamID, out var list)) if (!playerAWPIndexes.ContainsKey(steamID))
list.Add(createdWeapon); playerAWPIndexes.TryAdd(steamID, []);
else
playerAWPs.TryAdd(player.SteamID, [createdWeapon]); if (playerAWPIndexes.TryGetValue(steamID, out var list))
list.Add(createdWeapon.Index);
} }
} }
}
DeleteDroppedAWP(player); DeleteDroppedAWP(player);
isProcessing.TryRemove(steamID, out _);
}); });
} }
catch { } catch {
isProcessing.TryRemove(steamID, out _);
}
} }
private static void DeleteDroppedAWP(CCSPlayerController player) private static void DeleteDroppedAWP(CCSPlayerController? player)
{ {
var pawn = player.PlayerPawn.Value; if (player == null || !player.IsValid) return;
if (pawn == null || !pawn.IsValid) return;
var weaponServices = pawn.WeaponServices;
if (weaponServices == null) return;
ConcurrentBag<uint> playerWeapons = [.. weaponServices.MyWeapons.Where(w => w != null && w.IsValid && w.Value != null && w.Value.IsValid) var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return;
var myWeapons = pawn.WeaponServices.MyWeapons;
ConcurrentBag<uint> myWeaponsIndexes = [.. myWeapons
.Where(w => w != null && w.IsValid && w.Value != null && w.Value.IsValid)
.Select(w => w.Value!.Index)]; .Select(w => w.Value!.Index)];
lock (setLock) lock (setLock)
{ {
if (playerAWPs.TryGetValue(player.SteamID, out var AWPs)) if (playerAWPIndexes.TryGetValue(player.SteamID, out var AWPs))
foreach (var awp in AWPs.ToList()) foreach (var index in AWPs.ToList())
if (!myWeaponsIndexes.Contains(index))
{ {
if (awp != null && awp.IsValid) var ent = Utilities.GetEntityFromIndex<CBaseEntity>((int)index);
{ if (ent != null && ent.IsValid)
if (!playerWeapons.Contains(awp.Index)) ent.AcceptInput("Kill");
{
awp.AcceptInput("Kill"); AWPs.Remove(index);
AWPs.Remove(awp);
}
}
else
AWPs.Remove(awp!);
} }
} }
} }
private static CBasePlayerWeapon? GetActiveRifle(CCSPlayerController player) private static CBasePlayerWeapon? GetActiveRifle(CCSPlayerController player)
{ {
CBasePlayerWeapon? rifle = null;
var pawn = player.PlayerPawn.Value; var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid) return rifle; if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return null;
var weaponServices = pawn.WeaponServices;
if (weaponServices == null) return rifle;
foreach (var weapon in weaponServices.MyWeapons) var activeWeapon = pawn.WeaponServices?.ActiveWeapon.Value;
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) if (activeWeapon != null && activeWeapon.IsValid && rifles.Contains(activeWeapon.DesignerName))
if (rifles.Contains(weapon.Value.DesignerName)) return activeWeapon;
rifle = weapon.Value; return null;
return rifle;
}
private static void RemoveWeapon(CCSPlayerController player, string designerName)
{
var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return;
foreach (var item in pawn.WeaponServices.MyWeapons)
if (item != null && item.IsValid && item.Value != null && item.Value.IsValid && item.Value.DesignerName == designerName)
item.Value.AcceptInput("Kill");
} }
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#e0873a", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#e0873a", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)

View file

@ -5,6 +5,7 @@ using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Utils; using CounterStrikeSharp.API.Modules.Utils;
using src.utils; using src.utils;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Runtime.InteropServices;
using static src.jRandomSkills; using static src.jRandomSkills;
namespace src.player.skills namespace src.player.skills
@ -19,6 +20,7 @@ namespace src.player.skills
public static void LoadSkill() public static void LoadSkill()
{ {
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color")); SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
} }

View file

@ -21,11 +21,6 @@ namespace src.player.skills
bombPlanted = false; bombPlanted = false;
} }
public static void DisableSkill(CCSPlayerController player)
{
SkillUtils.ResetPrintHTML(player);
}
public static void BombPlanted(EventBombPlanted _) public static void BombPlanted(EventBombPlanted _)
{ {
bombPlanted = true; bombPlanted = true;
@ -56,30 +51,10 @@ namespace src.player.skills
else else
Localization.PrintTranslationToChatAll($" {ChatColors.LightBlue}{{0}}", ["watchmaker_ct"], [roundTime]); Localization.PrintTranslationToChatAll($" {ChatColors.LightBlue}{{0}}", ["watchmaker_ct"], [roundTime]);
player.EmitSound(SkillsInfo.GetValue<string>(skillName, "SoundEvent")); player.EmitSound(SkillsInfo.GetValue<string>(skillName, "SoundEvent"));
}
public static void OnTick() var proxy = Utilities.FindAllEntitiesByDesignerName<CCSGameRulesProxy>("cs_gamerules").FirstOrDefault();
{ if (proxy == null) return;
if (bombPlanted) return; Utilities.SetStateChanged(proxy, "CCSGameRulesProxy", "m_pGameRules");
if (SkillUtils.IsFreezeTime()) return;
foreach (var player in Utilities.GetPlayers())
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
UpdateHUD(player);
}
}
private static void UpdateHUD(CCSPlayerController player)
{
var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == skillName);
if (skillData == null || Instance?.GameRules == null || Instance?.GameRules?.RoundTime == null || Instance.GameRules?.RoundStartTime == null) return;
int seconds = 1 + (int)(Instance.GameRules.RoundTime - (Server.CurrentTime - Instance.GameRules.RoundStartTime));
var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID);
if (playerInfo == null) return;
playerInfo.PrintHTML = SkillUtils.SecondsToTimer(seconds);
} }
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff462e", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int changeRoundTime = 7, string soundEvent = "UIPanorama.sidemenu_select") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission) public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff462e", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int changeRoundTime = 7, string soundEvent = "UIPanorama.sidemenu_select") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)

View file

@ -98,7 +98,7 @@ namespace src.utils
KillerSkillChatInfo = true; KillerSkillChatInfo = true;
TeamMateSkillChatInfo = true; TeamMateSkillChatInfo = true;
SummaryAfterTheRound = true; SummaryAfterTheRound = true;
DebugMode = true; DebugMode = false;
AlternativeSkillButton = null; AlternativeSkillButton = null;
SkillTimeBeforeStart = 7; SkillTimeBeforeStart = 7;
SkillHudDuration = 999; SkillHudDuration = 999;
@ -107,7 +107,7 @@ namespace src.utils
FlashingHtmlHudFix = true; FlashingHtmlHudFix = true;
CS2TraceRayDebug = false; CS2TraceRayDebug = false;
DisableSpectateHUD = false; DisableSpectateHUD = false;
DisableHUDOnDeathPermission = "@jRandmosSkills/death"; DisableHUDOnDeathPermission = "@jRandomSkills/death";
DisableSkillsOnRoundEnd = false; DisableSkillsOnRoundEnd = false;
LanguageSystem = new LanguageSystem LanguageSystem = new LanguageSystem
@ -116,11 +116,12 @@ namespace src.utils
DisableGeoLite = false, DisableGeoLite = false,
LanguageInfos = LanguageInfos =
[ [
new LanguageInfo("CN, TW, HK, MO, SG", "pt-br"), new LanguageInfo("ZH, CN, TW, HK, MO, SG", "zh"),
new LanguageInfo("PT, BR, AO, CV, GW, MZ, ST, TL", "zh"), new LanguageInfo("PT-BR, PT, BR, AO, CV, GW, MZ, ST, TL", "pt-br"),
new LanguageInfo("FR, MC, HT", "fr"), new LanguageInfo("FR, MC, HT", "fr"),
new LanguageInfo("DE, AT, CH, LI, LU, BE", "de"),
new LanguageInfo("PL", "pl"), new LanguageInfo("PL", "pl"),
new LanguageInfo("GB, US", "en") new LanguageInfo("EN, GB, US", "en")
] ]
}; };
@ -158,25 +159,25 @@ namespace src.utils
NormalCommands = new NormalCommands NormalCommands = new NormalCommands
{ {
SetSkillCommand = new NormalCommand("ustawskill, ustaw_skill, setskill, set_skill, definirhabilidade, configurarhabilidade, 设置技能, 配置技能", "@jRandmosSkills/admin"), SetSkillCommand = new NormalCommand("ustawskill, ustaw_skill, setskill, set_skill, definirhabilidade, configurarhabilidade, 设置技能, 配置技能", "@jRandomSkills/admin"),
SkillsListCommand = new NormalCommand("supermoc, skille, listamocy, supermoce, skills, listaHabilidades, habilidades, 技能列表, 超能力列表", "@jRandmosSkills/admin"), SkillsListCommand = new NormalCommand("supermoc, skille, listamocy, supermoce, skills, listaHabilidades, habilidades, 技能列表, 超能力列表", "@jRandomSkills/admin"),
UseSkillCommand = new NormalCommand("t, useSkill, usarHabilidade, 技能使用, 使用技能", "@jRandmosSkills/admin"), UseSkillCommand = new NormalCommand("t, useSkill, usarHabilidade, 技能使用, 使用技能", "@jRandomSkills/admin"),
HealCommand = new NormalCommand("heal, ulecz, curar, tratar, 治疗, 治愈", "@jRandmosSkills/admin"), HealCommand = new NormalCommand("heal, ulecz, curar, tratar, 治疗, 治愈", "@jRandomSkills/admin"),
ConsoleCommand = new NormalCommand("console, sv, 控制台, 服务器", "@jRandmosSkills/owner"), ConsoleCommand = new NormalCommand("console, sv, 控制台, 服务器", "@jRandomSkills/owner"),
HudCommand = new NormalCommand("hud, hood", ""), HudCommand = new NormalCommand("hud, hood", ""),
SetStaticSkillCommand = new NormalCommand("ustawstatycznyskill, ustaw_statyczny_skill, setstaticskill, set_static_skill", "@jRandmosSkills/admin"), SetStaticSkillCommand = new NormalCommand("ustawstatycznyskill, ustaw_statyczny_skill, setstaticskill, set_static_skill", "@jRandomSkills/admin"),
ChangeLanguageCommand = new NormalCommand("lang, language, changelang, change_lang, jezyk, język", ""), ChangeLanguageCommand = new NormalCommand("lang, language, changelang, change_lang, jezyk, język", ""),
ReloadCommand = new NormalCommand("reload, refresh", "@jRandmosSkills/admin"), ReloadCommand = new NormalCommand("reload, refresh", "@jRandomSkills/admin"),
}; };
VotingCommands = new VotingCommands VotingCommands = new VotingCommands
{ {
StartGameCommand = new StartGameCommand(true, "start, go, começar, iniciar, 开始, 启动", "@jRandmosSkills/admin", "mp_freezetime 15; mp_forcecamera 0; mp_overtime_enable 1; sv_cheats 0", "mp_freezetime 0; mp_forcecamera 0; mp_overtime_enable 1; sv_cheats 1", 15, 60, 15, 500, 2), StartGameCommand = new StartGameCommand(true, "start, go, começar, iniciar, 开始, 启动", "@jRandomSkills/admin", "mp_freezetime 15; mp_forcecamera 0; mp_overtime_enable 1; sv_cheats 0", "mp_freezetime 0; mp_forcecamera 0; mp_overtime_enable 1; sv_cheats 1", 15, 60, 15, 500, 2),
ChangeMapCommand = new VotingCommand(true, "map, mapa, changemap, zmienmape, zmienmape, mudarMapa, trocarMapa, 更换地图, 更改地图", "@jRandmosSkills/admin", 25, 90, 15, 500, 2), ChangeMapCommand = new VotingCommand(true, "map, mapa, changemap, zmienmape, zmienmape, mudarMapa, trocarMapa, 更换地图, 更改地图", "@jRandomSkills/admin", 25, 90, 15, 500, 2),
SwapCommand = new VotingCommand(true, "swap, zmiana, trocar, 交换, 切换", "@jRandmosSkills/admin", 15, 90, 15, 20, 2), SwapCommand = new VotingCommand(true, "swap, zmiana, trocar, 交换, 切换", "@jRandomSkills/admin", 15, 90, 15, 20, 2),
ShuffleCommand = new VotingCommand(true, "shuffle, embaralhar, 随机排序, 洗牌", "@jRandmosSkills/admin", 15, 90, 15, 20, 2), ShuffleCommand = new VotingCommand(true, "shuffle, embaralhar, 随机排序, 洗牌", "@jRandomSkills/admin", 15, 90, 15, 20, 2),
PauseCommand = new VotingCommand(true, "pause, unpause, pausar, despausar, 暂停, 恢复", "@jRandmosSkills/admin", 15, 60, 15, 2, 2), PauseCommand = new VotingCommand(true, "pause, unpause, pausar, despausar, 暂停, 恢复", "@jRandomSkills/admin", 15, 60, 15, 2, 2),
SetScoreCommand = new VotingCommand(true, "setscore, wynik, definirPontuacao, configurarPontos, 设置分数, 调整分数", "@jRandmosSkills/owner", 15, 90, 15, 90, 2), SetScoreCommand = new VotingCommand(true, "setscore, wynik, definirPontuacao, configurarPontos, 设置分数, 调整分数", "@jRandomSkills/owner", 15, 90, 15, 90, 2),
}; };
} }
} }

View file

@ -9,6 +9,7 @@ using CounterStrikeSharp.API.Modules.Utils;
using src.player; using src.player;
using src.player.skills; using src.player.skills;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Globalization;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using WASDMenuAPI.Classes; using WASDMenuAPI.Classes;
using WASDSharedAPI; using WASDSharedAPI;
@ -110,14 +111,23 @@ namespace src.utils
if (scale <= 0 || skeleton == null) return; if (scale <= 0 || skeleton == null) return;
skeleton.Scale = scale; skeleton.Scale = scale;
playerPawn.AcceptInput("SetScale", null, null, scale.ToString()); playerPawn.AcceptInput("SetScale", null, null, scale.ToString(CultureInfo.InvariantCulture));
Server.NextFrame(() => Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent")); Server.NextWorldUpdate(() => Utilities.SetStateChanged(player.PlayerPawn.Value!, "CBaseEntity", "m_CBodyComponent"));
} }
public static Vector? GetSpawnPointVector(CCSPlayerController player, bool enemySpawn = false) public static Vector? GetSpawnPointVector(CCSPlayerController player, bool enemySpawn = false)
{ {
var spawns = Utilities.FindAllEntitiesByDesignerName<SpawnPoint>(player.Team == CsTeam.Terrorist && !enemySpawn if (player == null || player.Team is CsTeam.None or CsTeam.Spectator) return null;
? "info_player_terrorist" : "info_player_counterterrorist").ToList();
CsTeam targetTeam = enemySpawn
? (player.Team == CsTeam.CounterTerrorist ? CsTeam.Terrorist : CsTeam.CounterTerrorist)
: player.Team;
string spawnPointName = targetTeam == CsTeam.CounterTerrorist
? "info_player_counterterrorist"
: "info_player_terrorist";
var spawns = Utilities.FindAllEntitiesByDesignerName<SpawnPoint>(spawnPointName).ToList();
if (spawns.Count != 0) if (spawns.Count != 0)
{ {
var randomSpawn = spawns[jRandomSkills.Instance.Random.Next(spawns.Count)]; var randomSpawn = spawns[jRandomSkills.Instance.Random.Next(spawns.Count)];
@ -208,6 +218,19 @@ namespace src.utils
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iMaxHealth"); Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iMaxHealth");
} }
public static void RestoreHealth(CCSPlayerController? player)
{
if (player == null || !player.IsValid || player.PlayerPawn == null)
return;
CBasePlayerPawn? pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE)
return;
pawn.Health = (int)player.PawnHealth;
Utilities.SetStateChanged(pawn, "CBaseEntity", "m_iHealth");
}
public static string GetDesignerName(CBasePlayerWeapon? weapon) public static string GetDesignerName(CBasePlayerWeapon? weapon)
{ {
if (weapon == null || !weapon.IsValid) return string.Empty; if (weapon == null || !weapon.IsValid) return string.Empty;

View file

@ -7,35 +7,40 @@
"DebugMode": false, "DebugMode": false,
"AlternativeSkillButton": null, "AlternativeSkillButton": null,
"SkillTimeBeforeStart": 7.0, "SkillTimeBeforeStart": 7.0,
"SkillDescriptionDuration": 7.0, "SkillHudDuration": 999.0,
"SkillDescriptionDuration": 999.0,
"DisplayAlwaysDescription": false, "DisplayAlwaysDescription": false,
"DisableSpectateHUD": false, "DisableSpectateHUD": false,
"FlashingHtmlHudFix": true, "FlashingHtmlHudFix": true,
"CS2TraceRayDebug": false, "CS2TraceRayDebug": false,
"DisableHUDOnDeathPermission": "@jRandmosSkills/death", "DisableHUDOnDeathPermission": "@jRandomSkills/death",
"DisableSkillsOnRoundEnd": false, "DisableSkillsOnRoundEnd": false,
"LanguageSystem": { "LanguageSystem": {
"DefaultLangCode": "en", "DefaultLangCode": "en",
"DisableGeoLite": false, "DisableGeoLite": false,
"LanguageInfos": [ "LanguageInfos": [
{ {
"IsoCodes": "CN, TW, HK, MO, SG", "IsoCodes": "ZH, CN, TW, HK, MO, SG",
"FileName": "pt-br" "FileName": "zh"
}, },
{ {
"IsoCodes": "PT, BR, AO, CV, GW, MZ, ST, TL", "IsoCodes": "PT-BR, PT, BR, AO, CV, GW, MZ, ST, TL",
"FileName": "zh" "FileName": "pt-br"
}, },
{ {
"IsoCodes": "FR, MC, HT", "IsoCodes": "FR, MC, HT",
"FileName": "fr" "FileName": "fr"
}, },
{
"IsoCodes": "DE, AT, CH, LI, LU, BE",
"FileName": "de"
},
{ {
"IsoCodes": "PL", "IsoCodes": "PL",
"FileName": "pl" "FileName": "pl"
}, },
{ {
"IsoCodes": "GB, US", "IsoCodes": "EN, GB, US",
"FileName": "en" "FileName": "en"
} }
] ]
@ -58,26 +63,36 @@
"WSADMenuControllsLineColor2": "white", "WSADMenuControllsLineColor2": "white",
"WSADMenuControllsLineColor3": "green" "WSADMenuControllsLineColor3": "green"
}, },
"ChatMessage": {
"MaxWidth": 1280.0,
"LineSymbol": "―",
"LineColor": "\u0004",
"LineShow": true,
"InfoPlayerNameColor": "\u0002",
"InfoSkillColor": "\u0006",
"InfoMessageShow": true,
"TagFormat": "\u0002◢◆◤ {TAG} ◥◆◣"
},
"NormalCommands": { "NormalCommands": {
"SetSkillCommand": { "SetSkillCommand": {
"Alias": "ustawskill, ustaw_skill, setskill, set_skill, definirhabilidade, configurarhabilidade, 设置技能, 配置技能", "Alias": "ustawskill, ustaw_skill, setskill, set_skill, definirhabilidade, configurarhabilidade, 设置技能, 配置技能",
"Permissions": "@jRandmosSkills/admin" "Permissions": "@jRandomSkills/admin"
}, },
"SkillsListCommand": { "SkillsListCommand": {
"Alias": "supermoc, skille, listamocy, supermoce, skills, listaHabilidades, habilidades, 技能列表, 超能力列表", "Alias": "supermoc, skille, listamocy, supermoce, skills, listaHabilidades, habilidades, 技能列表, 超能力列表",
"Permissions": "@jRandmosSkills/admin" "Permissions": "@jRandomSkills/admin"
}, },
"UseSkillCommand": { "UseSkillCommand": {
"Alias": "t, useSkill, usarHabilidade, 技能使用, 使用技能", "Alias": "t, useSkill, usarHabilidade, 技能使用, 使用技能",
"Permissions": "@jRandmosSkills/admin" "Permissions": "@jRandomSkills/admin"
}, },
"HealCommand": { "HealCommand": {
"Alias": "heal, ulecz, curar, tratar, 治疗, 治愈", "Alias": "heal, ulecz, curar, tratar, 治疗, 治愈",
"Permissions": "@jRandmosSkills/admin" "Permissions": "@jRandomSkills/admin"
}, },
"ConsoleCommand": { "ConsoleCommand": {
"Alias": "console, sv, 控制台, 服务器", "Alias": "console, sv, 控制台, 服务器",
"Permissions": "@jRandmosSkills/owner" "Permissions": "@jRandomSkills/owner"
}, },
"HudCommand": { "HudCommand": {
"Alias": "hud, hood", "Alias": "hud, hood",
@ -85,7 +100,7 @@
}, },
"SetStaticSkillCommand": { "SetStaticSkillCommand": {
"Alias": "ustawstatycznyskill, ustaw_statyczny_skill, setstaticskill, set_static_skill", "Alias": "ustawstatycznyskill, ustaw_statyczny_skill, setstaticskill, set_static_skill",
"Permissions": "@jRandmosSkills/admin" "Permissions": "@jRandomSkills/admin"
}, },
"ChangeLanguageCommand": { "ChangeLanguageCommand": {
"Alias": "lang, language, changelang, change_lang, jezyk, język", "Alias": "lang, language, changelang, change_lang, jezyk, język",
@ -93,14 +108,14 @@
}, },
"ReloadCommand": { "ReloadCommand": {
"Alias": "reload, refresh", "Alias": "reload, refresh",
"Permissions": "@jRandmosSkills/admin" "Permissions": "@jRandomSkills/admin"
} }
}, },
"VotingCommands": { "VotingCommands": {
"StartGameCommand": { "StartGameCommand": {
"EnableVoting": true, "EnableVoting": true,
"Alias": "start, go, começar, iniciar, 开始, 启动", "Alias": "start, go, começar, iniciar, 开始, 启动",
"Permissions": "@jRandmosSkills/admin", "Permissions": "@jRandomSkills/admin",
"StartParams": "mp_freezetime 15; mp_forcecamera 0; mp_overtime_enable 1; sv_cheats 0", "StartParams": "mp_freezetime 15; mp_forcecamera 0; mp_overtime_enable 1; sv_cheats 0",
"SVStartParams": "mp_freezetime 0; mp_forcecamera 0; mp_overtime_enable 1; sv_cheats 1", "SVStartParams": "mp_freezetime 0; mp_forcecamera 0; mp_overtime_enable 1; sv_cheats 1",
"TimeToVote": 15.0, "TimeToVote": 15.0,
@ -117,7 +132,7 @@
"TimeToNextSameVoting": 500.0, "TimeToNextSameVoting": 500.0,
"MinimumPlayersToStartVoting": 2, "MinimumPlayersToStartVoting": 2,
"Alias": "map, mapa, changemap, zmienmape, zmienmape, mudarMapa, trocarMapa, 更换地图, 更改地图", "Alias": "map, mapa, changemap, zmienmape, zmienmape, mudarMapa, trocarMapa, 更换地图, 更改地图",
"Permissions": "@jRandmosSkills/admin" "Permissions": "@jRandomSkills/admin"
}, },
"SwapCommand": { "SwapCommand": {
"EnableVoting": true, "EnableVoting": true,
@ -127,7 +142,7 @@
"TimeToNextSameVoting": 20.0, "TimeToNextSameVoting": 20.0,
"MinimumPlayersToStartVoting": 2, "MinimumPlayersToStartVoting": 2,
"Alias": "swap, zmiana, trocar, 交换, 切换", "Alias": "swap, zmiana, trocar, 交换, 切换",
"Permissions": "@jRandmosSkills/admin" "Permissions": "@jRandomSkills/admin"
}, },
"ShuffleCommand": { "ShuffleCommand": {
"EnableVoting": true, "EnableVoting": true,
@ -137,7 +152,7 @@
"TimeToNextSameVoting": 20.0, "TimeToNextSameVoting": 20.0,
"MinimumPlayersToStartVoting": 2, "MinimumPlayersToStartVoting": 2,
"Alias": "shuffle, embaralhar, 随机排序, 洗牌", "Alias": "shuffle, embaralhar, 随机排序, 洗牌",
"Permissions": "@jRandmosSkills/admin" "Permissions": "@jRandomSkills/admin"
}, },
"PauseCommand": { "PauseCommand": {
"EnableVoting": true, "EnableVoting": true,
@ -147,7 +162,7 @@
"TimeToNextSameVoting": 2.0, "TimeToNextSameVoting": 2.0,
"MinimumPlayersToStartVoting": 2, "MinimumPlayersToStartVoting": 2,
"Alias": "pause, unpause, pausar, despausar, 暂停, 恢复", "Alias": "pause, unpause, pausar, despausar, 暂停, 恢复",
"Permissions": "@jRandmosSkills/admin" "Permissions": "@jRandomSkills/admin"
}, },
"SetScoreCommand": { "SetScoreCommand": {
"EnableVoting": true, "EnableVoting": true,
@ -157,7 +172,7 @@
"TimeToNextSameVoting": 90.0, "TimeToNextSameVoting": 90.0,
"MinimumPlayersToStartVoting": 2, "MinimumPlayersToStartVoting": 2,
"Alias": "setscore, wynik, definirPontuacao, configurarPontos, 设置分数, 调整分数", "Alias": "setscore, wynik, definirPontuacao, configurarPontos, 设置分数, 调整分数",
"Permissions": "@jRandmosSkills/owner" "Permissions": "@jRandomSkills/owner"
} }
} }
} }

View file

@ -0,0 +1 @@
{"0":"en","76561199562070178":"en","76561198150092992":"pt-br"}

View file

@ -0,0 +1,477 @@
{
"none": "Keine",
"none_desc": "Du hast keine Fertigkeit",
"aimbot": "Aimbot",
"aimbot_desc": "Jede Kugel, die du triffst, zählt als Kopfschuss",
"anomaly": "Anomalie",
"anomaly_desc": "Du spulst die Zeit um einige Sekunden zurück",
"antyflash": "Anti-Flash",
"antyflash_desc": "Du bist immun gegen Blendgranaten und deine Blendgranaten halten 7 Sekunden lang",
"antyhead": "Eiserner Kopf",
"antyhead_desc": "Du erleidest keinen Schaden durch Kopfschüsse",
"areareaper": "Zone Reaper",
"areareaper_desc": "Du kannst einen Bombenort auswählen, den du deaktivieren möchtest",
"areareaper_incorrect_site": "Kein solcher Bombenort gefunden",
"areareaper_no_site": "Keine Bombenstandorte gefunden.",
"areareaper_select_info": "Standort zum Deaktivieren auswählen:",
"areareaper_site_disabled": "Bombenstandort {0} wurde deaktiviert – dort können keine Bomben platziert werden!",
"areareaper_used_info": "Deine Fähigkeit wurde bereits eingesetzt.",
"armored": "Gepanzert",
"armored_desc": "Du hast einen zufälligen Schadensmultiplikator",
"armored_desc2": "Dein Schadensmultiplikator beträgt: {0}x",
"assassin": "Attentäter",
"assassin_desc": "Du fügst Gegnern von hinten erhöhten Schaden zu",
"astronaut": "Astronaut",
"astronaut_desc": "Du erhältst zu Beginn der Runde einen zufälligen Schwerkraftwert",
"astronaut_desc2": "Deine zufällige Schwerkraft beträgt: {0}x",
"moneyswap": "Steuerbeamter",
"moneyswap_desc": "Wähle einen Spieler aus, mit dem du Geld tauschen möchtest",
"moneyswap_enemy_info": "Das Finanzamt hat dich erwischt.",
"moneyswap_player_info": "Du hast Geld mit dem Spieler \"{0}\" getauscht.",
"moneyswap_select_info": "Geld mit Spieler tauschen:",
"baseball": "Baseballspieler",
"baseball_desc": "Deine Attrappe prallt von Wänden ab und tötet einen Gegner sofort beim Aufprall.",
"behind": "Feind drehen",
"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} %",
"blademaster": "Schwertmeister",
"blademaster_desc": "Wenn du ein Messer hältst, hast du eine hohe Chance, einen Schuss abzuwehren",
"bunnyhop": "Hase",
"bunnyhop_desc": "Du erhältst automatisch bunnyhop",
"c4camouflage": "C4-Tarnung",
"c4camouflage_desc": "Du bist unsichtbar, während du die Bombe hältst",
"carefulbullets": "Vorsichtige Kugeln",
"carefulbullets_desc": "Wähle einen Spieler aus, der für jeden Fehlschuss Schaden nimmt",
"carefulbullets_enemy_info": "Von nun an wird Ungenauigkeit buchstäblich wehtun.",
"carefulbullets_player_info": "‚{0}‘ muss jetzt vorsichtiger sein.",
"carefulbullets_select_info": "Fehler schaden dem Spieler:",
"catapult": "Katapult",
"catapult_desc": "Du hast eine zufällige Chance, einen Gegner nach oben zu schleudern",
"catapult_desc2": "Deine Chance, einen Gegner bei einem Treffer zu schleudern, beträgt: {0} %",
"chicken": "Huhn",
"chicken_desc": "Du erhältst ein Huhn-Modell + 10 % schnellere Bewegung – 50 HP",
"chillout": "Chillout",
"chillout_desc": "Das Platzieren der Bombe dauert deutlich länger",
"cutter": "Cutter",
"cutter_desc": "Sofortiger Tod mit einem Messer",
"cypher": "Kamera",
"cypher_desc": "Klicken Sie auf [css_useSkill], um eine Kamera zu erstellen/zu wechseln",
"cypher_nospace": "Die Kamera muss im rechten Winkel zur Wand positioniert werden",
"darkness": "Dunkelheit",
"darkness_desc": "Wendet einen Dunkelheitseffekt auf einen ausgewählten Gegner an",
"darkness_enemy_info": "Lass die Lichter ausgehen",
"darkness_player_info": "Die Dunkelheit hat den Spieler \"{0}\" überwältigt.",
"darkness_select_info": "Wähle einen Spieler für die Dunkelheit aus:",
"deactivator": "Deaktivator",
"deactivator_desc": "Wähle einen Spieler aus, dessen Fähigkeit du deaktivieren möchtest",
"deactivator_enemy_info": "Deine Fähigkeit wurde deaktiviert",
"deactivator_player_info": "Die Fähigkeit des Spielers ‚{0}‘ wurde deaktiviert",
"deactivator_select_info": "Fähigkeit eines Spielers deaktivieren:",
"deaf": "Taub",
"deaf_desc": "Wähle einen Spieler aus, für den alle Sounds stummgeschaltet werden sollen",
"deaf_enemy_info": "Deine Kopfhörer haben das Spiel verlassen.",
"deaf_player_info": "Der Ton für den Spieler ‚{0}‘ wurde deaktiviert.",
"deaf_select_info": "Alle Töne für den Spieler stummschalten:",
"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} %",
"distancer": "Entfernungsmesser",
"distancer_desc": "Sie können die Entfernung zum nächsten Gegner sehen",
"dash": "Sprinten",
"dash_desc": "Führe einen zweiten Sprung aus, um zu sprinten",
"dracula": "Dracula",
"dracula_desc": "Wenn du einen Gegner triffst, wird deine Gesundheit um einen Prozentsatz des verursachten Schadens wiederhergestellt",
"duplicator": "Duplikator",
"duplicator_desc": "Wähle einen Spieler aus, dessen Fertigkeit du kopieren möchtest",
"duplicator_player_info": "Die Fertigkeit des Spielers ‚{0}‘ wurde kopiert.",
"duplicator_select_info": "Kopiere die Fertigkeit eines Spielers:",
"dwarf": "Zwerg",
"dwarf_desc": "Zufällige Charaktergröße zu Beginn der Runde",
"dwarf_desc2": "Dein Größenmultiplikator beträgt: {0}x",
"enemyspawn": "Feindes-Spawn",
"enemyspawn_desc": "Klicke auf [css_useSkill], um zum Feindes-Spawn zu teleportieren",
"explosiveshot": "Explosiver Schuss",
"explosiveshot_desc": "Zufällige Chance, beim Schießen eine explosive Kugel abzufeuern",
"explosiveshot_desc2": "Deine Chance, eine explosive Kugel abzufeuern: {0} %",
"falconeye": "Falkenauge",
"falconeye_desc": "Klicke auf [css_useSkill], um eine Vogelperspektive zu aktivieren",
"fastreload": "Schnellnachladen",
"fastreload_desc": "Klicke auf [css_useSkill], um die Waffe, die du gerade hältst, nachzuladen",
"flash": "Blitz",
"flash_desc": "Zufällige Spielergeschwindigkeit zu Beginn der Runde",
"flash_desc2": "Dein Geschwindigkeitsmultiplikator beträgt: {0}x",
"fortnite": "Fortnite",
"fortnite_desc": "Klicke auf [css_useSkill], um eine zerstörbare Barrikade zu erstellen",
"fragilebomb": "Fragile Bombe",
"fragilebomb_desc": "Das Schießen auf die Bombe beschädigt sie",
"fragilebomb_bomb_health": "Bombengesundheit",
"friendlyfire": "Friendly Fire",
"friendlyfire_desc": "Das Schießen auf Teamkameraden heilt sie",
"frozendecoy": "Eisige Attrappe",
"frozendecoy_desc": "Deine Attrappe friert alle Spieler in der Nähe ein",
"gambler": "Zocker",
"gambler_desc": "Wähle eine Fertigkeit aus der Liste aus.",
"gambler_select_info": "Wähle deine Fähigkeit aus:",
"gambler_more": "#00FF00|Aktualisieren für ${0}",
"gambler_no_money": "Nicht genug Geld.",
"ghost": "Geist",
"ghost_desc": "Du bist vollständig unsichtbar",
"glaz": "Glaz",
"glaz_desc": "Du kannst durch Rauchgranaten hindurchsehen",
"glitch": "Glitch",
"glitch_desc": "Deaktiviert das Radar für einen ausgewählten Gegner",
"glitch_enemy_info": "Dein Radar wurde deaktiviert",
"glitch_player_info": "Das Radar des Spielers ‚{0}‘ wurde deaktiviert.",
"glitch_select_info": "Radar des Spielers ausschalten:",
"glue": "Glue",
"glue_desc": "Deine Granaten haften an Wänden",
"godmode": "Gott-Modus",
"godmode_desc": "Klicke auf [css_useSkill], um für kurze Zeit unsterblich zu werden",
"godmode_off": "Unsterblichkeit deaktiviert",
"godmode_on": "Unsterblichkeit aktiviert",
"grenadier": "Grenadier",
"grenadier_desc": "Du hast unendlich viele Granaten",
"healingsmoke": "Heilender Rauch",
"healingsmoke_desc": "Deine Rauchgranaten heilen",
"hermit": "Einsiedler",
"hermit_desc": "Durch das Töten von Gegnern werden Munition und ein Teil der Gesundheit wiederhergestellt",
"holyhandgrenade": "Heilige Handgranate",
"holyhandgrenade_desc": "Deine HE-Granaten verursachen doppelten Schaden und haben doppelte Reichweite",
"iana": "Hologramm",
"iana_desc": "Klicken Sie auf [css_useSkill], um Ihr Hologramm für einige Sekunden zu steuern",
"impostor": "Betrüger",
"impostor_desc": "Du beginnst die Runde mit einem feindlichen Spielermodell",
"infiniteammo": "Unendliche Munition",
"infiniteammo_desc": "Du erhältst unendliche Munition für alle deine Waffen",
"jackal": "Spürhund",
"jackal_desc": "Jeder Gegner hinterlässt eine Spur",
"jammer": "Störsender",
"jammer_desc": "Wähle einen Spieler aus, um dessen Fadenkreuz zu deaktivieren",
"jammer_enemy_info": "Dein Fadenkreuz wurde deaktiviert.",
"jammer_player_info": "Das Fadenkreuz von Spieler ‚{0}‘ wurde deaktiviert.",
"jammer_select_info": "Fadenkreuz des Spielers deaktivieren:",
"jester": "Narr",
"jester_desc": "Im Narrenmodus kannst du keinen Schaden erleiden oder verursachen. Dieser Modus ändert sich alle paar Sekunden.",
"jester_mode": "Jester-Modus",
"jester_on": "EIN",
"jester_off": "AUS",
"jumpban": "Beinlos",
"jumpban_desc": "Wähle einen Spieler, der nicht springen kann",
"jumpban_enemy_info": "Jemand hat dir die Beine abgeschnitten.",
"jumpban_player_info": "Der Spieler ‚{0}‘ kann nicht mehr springen.",
"jumpban_select_info": "Spieler vom Springen ausschließen:",
"jumpingjack": "Jumping Jack",
"jumpingjack_desc": "Durch Springen wird die Gesundheit wiederhergestellt",
"killerflash": "Killer Flash",
"killerflash_desc": "Jeder, der durch deine Blendgranate vollständig geblendet wird, stirbt (einschließlich dir selbst)",
"lifeswap": "Lebensaustausch",
"lifeswap_desc": "Wähle einen Spieler aus, mit dem du deine Gesundheit austauschen möchtest",
"lifeswap_enemy_info": "Jemand hat sich deine Gesundheit ausgeliehen",
"lifeswap_player_info": "Du hast deine Gesundheit mit dem Spieler \"{0}\" ausgetauscht",
"lifeswap_select_info": "Tausche Gesundheit mit Spieler:",
"longknife": "Langes Messer",
"longknife_desc": "Ein Messerangriff verursacht unabhängig von der Entfernung Schaden",
"longzeus": "Langer Zeus",
"longzeus_desc": "Zeus verursacht unabhängig von der Entfernung Schaden",
"magnifier": "Lupe",
"magnifier_desc": "Vergrößert den Bildschirm des Gegners und verringert dessen Sichtfeld",
"magnifier_enemy_info": "Dein Sichtfeld wurde verzerrt!",
"magnifier_player_info": "Der Spieler ‚{0}‘ wurde in den Zoom-Modus versetzt.",
"magnifier_select_info": "Bildschirm des Spielers vergrößern:",
"medic": "Sanitäter",
"medic_desc": "Klicke auf [css_useSkill], um eine Heilungsladung zu verwenden, die 50 Gesundheitspunkte wiederherstellt",
"bankrupt": "Bankrott",
"bankrupt_desc": "Wähle den Spieler aus, der sein gesamtes Geld verlieren wird",
"bankrupt_enemy_info": "Du bist bankrott.",
"bankrupt_player_info": "Der Spieler ‚{0}‘ ist bankrott.",
"bankrupt_select_info": "Wähle einen Spieler aus, der bankrott gehen soll:",
"muhammed": "Muhammed",
"muhammed_desc": "Du explodierst beim Tod und tötest Spieler in deiner Nähe",
"muhammed_explosion": "ALLAHU AKBAR!!!",
"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 %",
"nonades": "No-Nades",
"nonades_desc": "Granaten fügen dir keinen Schaden zu",
"norecoil": "Fokus",
"norecoil_desc": "Kein Rückstoß beim Schießen",
"noclip": "NoClip",
"noclip_desc": "Klicke auf [css_useSkill], um NoClip für kurze Zeit zu aktivieren",
"oneshot": "One-Shot",
"oneshot_desc": "Ein Treffer tötet einen Gegner sofort",
"onlyhead": "Nur Kopf",
"onlyhead_desc": "Du erleidest nur Schaden am Kopf",
"paweljumper": "Pawel Jumper",
"paweljumper_desc": "Du erhältst eine zufällige Anzahl zusätzlicher Sprünge",
"paweljumper_desc2": "Du erhältst {0} zusätzliche Sprünge",
"phoenix": "Phönix",
"phoenix_desc": "Du hast eine zufällige Chance, nach dem Tod wieder zu erscheinen",
"phoenix_desc2": "Deine Chance, nach dem Tod wieder zu erscheinen: {0} %",
"phoenix_respawn": "Du bist dank der Kraft von CHATCOLORS.REDPhoenix aus der Asche auferstanden",
"psychicdefusing": "Psychic Defusing",
"psychicdefusing_desc": "Wenn du dich in der Nähe der Bombe befindest, beginnst du, sie zu entschärfen",
"psychicdefusing_hud_info": "{0} Sekunden verbleibend bis zur Entschärfung",
"pilot": "Pilot",
"pilot_desc": "Fliege für eine begrenzte Zeit. Halte [USE - E] gedrückt, um zu fliegen",
"pilot_hud_info": "Treibstoff",
"planter": "Freier Planter",
"planter_desc": "Du kannst die Bombe überall platzieren, die Detonationszeit beträgt 60 Sekunden.",
"poison": "Gift",
"poison_desc": "Wähle einen Spieler aus, der alle paar Sekunden Schaden nimmt",
"poison_enemy_info": "Du wurdest vergiftet",
"poison_player_info": "Der Spieler ‚{0}‘ wurde vergiftet",
"poison_select_info": "Einen Spieler vergiften:",
"primaryban": "Keine Gewehre",
"primaryban_desc": "Wähle einen Spieler aus, der keine Gewehre verwenden kann",
"primaryban_enemy_info": "Du kannst keine Gewehre mehr verwenden.",
"primaryban_player_info": "Der Spieler ‚{0}‘ kann keine Gewehre mehr verwenden.",
"primaryban_select_info": "Gewehre für Spieler verbieten:",
"prosthesis": "Prothese",
"prosthesis_desc": "Arme und Beine sind kugelsicher",
"push": "Pusher",
"push_desc": "Du hast eine zufällige Chance, einen Gegner zurückzustoßen, wenn du ihn triffst",
"push_desc2": "Deine Chancen, den Gegner zurückzustoßen, betragen: {0} %",
"pyro": "Pyro",
"pyro_desc": "Molotow-Cocktail stellt Gesundheit wieder her",
"quickshot": "Schnellfeuer",
"quickshot_desc": "Alle Kugeln werden sehr schnell abgefeuert",
"radarhack": "Radar-Hack",
"radarhack_desc": "Gegner sind auf dem Radar sichtbar",
"rambo": "Rambo",
"rambo_desc": "Du erhältst zu Beginn der Runde eine zufällige Menge an Gesundheit",
"randomweapon": "Zufällige Waffe",
"randomweapon_desc": "Klicke auf [css_useSkill], um eine zufällige Waffe zu erhalten",
"rezombie": "Re-Zombie",
"rezombie_desc": "Nach dem Tod spawnst du als Zombie mit erhöhter Gesundheit und ohne Waffen",
"reactivearmor": "Reaktive Rüstung",
"reactivearmor_desc": "Die Rüstung absorbiert den ersten erlittenen Schaden",
"regeneration": "Regeneration",
"regeneration_desc": "Du stellst alle paar Sekunden Gesundheit wieder her",
"replicator": "Replikator",
"replicator_desc": "Klicke auf [css_useSkill], um eine Replik zu erstellen, die bei Treffer Schaden verursacht",
"retreat": "Rückzug",
"retreat_desc": "Klicke auf [css_useSkill], um zum Spawn zurückzukehren",
"returntosender": "Zurück zum Absender",
"returntosender_desc": "Der erste Treffer eines Gegners schickt ihn zurück zu seinem Spawn",
"richboy": "Rich Boy",
"richboy_desc": "Du erhältst zu Beginn der Runde einen zufälligen Geldbetrag",
"robinhood": "Robin Hood",
"robinhood_desc": "Wenn du einem Gegner Schaden zufügst, stiehlst du ihm sein Geld",
"rubber": "Gummigeschosse",
"rubber_desc": "Deine Kugeln verlangsamen Spieler erheblich",
"saper": "Sapper",
"saper_desc": "Du kannst Bomben schneller legen und entschärfen",
"secondlife": "Zweite Chance",
"secondlife_desc": "Nach dem Tod spawnst du mit derselben Gesundheitsanzeige wieder",
"shade": "Schatten",
"shade_desc": "Du hast eine zufällige Chance, dich hinter einen getroffenen Gegner zu teleportieren",
"shade_desc2": "Deine Chancen, dich hinter einen getroffenen Gegner zu teleportieren, betragen: {0} %",
"shade_nospace": "Kein Platz verfügbar",
"shortbomb": "Kurze Zündschnur",
"shortbomb_desc": "Die Bombe explodiert viel schneller",
"silent": "Leise",
"silent_desc": "Deine Schritte und Sprünge sind für ANDERE Spieler lautlos",
"sniperelite": "Sniper Elite",
"sniperelite_customname": "Sniper Elite-Fähigkeit",
"sniperelite_desc": "Klicke auf [css_useSkill], um deine aktuelle Waffe gegen eine AWP auszutauschen",
"soldier": "Soldat",
"soldier_desc": "Du hast einen zufälligen Schadensmultiplikator",
"soldier_desc2": "Dein Schadensmultiplikator beträgt: {0}x",
"soundmaker": "Soundmaker",
"soundmaker_desc": "Klicke auf [css_useSkill], um für jeden Gegner einen Sound auszulösen",
"spectator": "Zuschauer",
"spectator_desc": "Klicke auf [css_useSkill], um einen zufälligen Gegner zu beobachten",
"swapposition": "Positionstausch",
"swapposition_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Plätze zu tauschen",
"teleporter": "Teleporter",
"teleporter_desc": "Du tauschst mit dem getroffenen Gegner die Plätze",
"thief": "Dieb",
"thief_desc": "Du kannst einem ausgewählten Spieler eine Fertigkeit stehlen",
"thief_enemy_info": "Deine Fertigkeit wurde gestohlen",
"thief_player_info": "Die Fertigkeit des Spielers ‚{0}‘ wurde gestohlen",
"thief_select_info": "Fähigkeit eines Spielers stehlen:",
"thief_incorrect_skill": "Diese Fähigkeit kann nicht ausgewählt werden!",
"thirdeye": "Drittes Auge",
"thirdeye_desc": "Klicke auf [css_useSkill], um die Third-Person-Ansicht zu aktivieren",
"thorns": "Dornen",
"thorns_desc": "Dein Gegner erhält einen Teil des Schadens, den er dir zugefügt hat",
"toxicsmoke": "Giftiger Rauch",
"toxicsmoke_desc": "Deine Rauchgranaten verursachen Schaden",
"wallhack": "Wallhack",
"wallhack_desc": "Du kannst Feinde durch Wände hindurch sehen",
"watchmaker": "Uhrmacher",
"watchmaker_desc": "Jeder Granatenwurf verändert die Rundenzeit",
"watchmaker_ct": "Rundenzeit um {0} Sekunden verkürzt",
"watchmaker_tt": "Rundenzeit um {0} Sekunden verlängert",
"weaponsswap": "Waffenwechsel",
"weaponsswap_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Waffen zu tauschen",
"weaponsswap_hud_info2": "Du hast keine Waffe zum Tauschen",
"zeus": "Zeus",
"zeus_desc": "Zeus x27 lädt sich sofort wieder auf",
"your_skill": "Deine aktuelle Fertigkeit",
"enemy_skill": "Fähigkeit des Gegners",
"observer_skill": "Fähigkeit des Spielers",
"welcome_message": "Willkommen {PLAYER} bei {SERVER_NAME}",
"drawing_skill": "Eine Fertigkeit zeichnen",
"disabled_weapon": "Du kannst diese Waffe nicht verwenden",
"hud_info": "Warte weitere {0} Sekunden",
"hud_info_no_enemy": "Kein Feind gefunden",
"active_hud_info": "Noch {0} Millisekunden aktiv",
"skills_menu": "Fähigkeitenliste",
"no_player": "Kein passender Spieler gefunden.",
"duplicate_player": "Mehr als ein Spieler mit demselben Namen gefunden.",
"selectplayerskill_command": "Gib /t ein",
"selectplayerskill_incorrect_enemy_index": "Es wurden keine Spieler gefunden, die ausgewählt werden können.",
"skill_not_found_setskill": "Keine solche CHATCOLORS.REDskill gefunden",
"player_not_found_setskill": "Kein solcher CHATCOLORS.REDplayer gefunden",
"correct_form_setskill": "Korrekte Verwendung: CHATCOLORS.RED!setskill <Fähigkeit>",
"correct_form_setscore": "Korrekte Verwendung: CHATCOLORS.RED!setscore ",
"done_setskill": "Fähigkeit festgelegt",
"error_setskill": "CHATCOLORS.REDskill konnte nicht festgelegt werden",
"for_setskill": "für",
"invalid_map": "Kartenname falsch eingegeben!",
"loading_map": "Neue Karte wird geladen",
"pause": "Spiel wurde unterbrochen",
"unpause": "Spiel wurde fortgesetzt",
"healed": "Du wurdest geheilt.",
"game_start": "Spiel gestartet!",
"reload": "Sprachen und Konfigurationen wurden neu geladen.",
"hud_on": "HUD wurde aktiviert.",
"hud_off": "HUD wurde deaktiviert.",
"vote_started": "Abstimmung gestartet: ‚{0}‘",
"vote_timeout": "Zeitlimit für Abstimmung ‚{0}‘ abgelaufen!",
"vote_wait": "Sie müssen warten, bevor Sie eine weitere Abstimmung starten können!",
"vote_same_wait": "Sie müssen warten, bevor Sie dieselbe Abstimmung erneut starten können!",
"vote_not_enough_players": "Nicht genügend Spieler, um eine Abstimmung zu starten!",
"vote_alredy_voted": "Du hast bereits abgestimmt!",
"vote_vote": "Abstimmen",
"bombsite_a": "Bombenplatz A",
"bombsite_b": "Bombenplatz B",
"bombplanted": "Die Bombe wurde gelegt\n{0} Sekunden bis zur Detonation",
"teammate_skills": "Die Fähigkeiten Ihrer Teamkollegen",
"summary": "Zusammenfassung der letzten runde",
"menu_controlls_scroll": "W/S – Scrollen",
"menu_controlls_padding": " | ",
"menu_controlls_select": "E – Auswählen"
}

View file

@ -55,6 +55,12 @@
"c4camouflage": "C4 Camouflage", "c4camouflage": "C4 Camouflage",
"c4camouflage_desc": "You are invisible while holding the bomb", "c4camouflage_desc": "You are invisible while holding the bomb",
"carefulbullets": "Careful Bullets",
"carefulbullets_desc": "Select a player who takes damage for every missed shot",
"carefulbullets_enemy_info": "From now on, inaccuracy will literally hurt.",
"carefulbullets_player_info": "'{0}' must now be more careful.",
"carefulbullets_select_info": "Inaccuracy hurts the player:",
"catapult": "Catapult", "catapult": "Catapult",
"catapult_desc": "You have a random chance to launch an enemy upwards", "catapult_desc": "You have a random chance to launch an enemy upwards",
"catapult_desc2": "Your chance to launch an enemy on hit is: {0}%", "catapult_desc2": "Your chance to launch an enemy on hit is: {0}%",
@ -68,6 +74,10 @@
"cutter": "Cutter", "cutter": "Cutter",
"cutter_desc": "Instant kill with a knife", "cutter_desc": "Instant kill with a knife",
"cypher": "Cypher",
"cypher_desc": "Click [css_useSkill] to create/switch to a camera",
"cypher_nospace": "The camera must be positioned at right angles to the wall",
"darkness": "Darkness", "darkness": "Darkness",
"darkness_desc": "Applies a darkness effect to a chosen enemy", "darkness_desc": "Applies a darkness effect to a chosen enemy",
"darkness_enemy_info": "Let the lights go out.", "darkness_enemy_info": "Let the lights go out.",
@ -142,6 +152,7 @@
"gambler_desc": "Select a skill from the list provided.", "gambler_desc": "Select a skill from the list provided.",
"gambler_select_info": "Select your skill:", "gambler_select_info": "Select your skill:",
"gambler_more": "#00FF00|Refresh for ${0}", "gambler_more": "#00FF00|Refresh for ${0}",
"gambler_no_money": "Not enough money.",
"ghost": "Ghost", "ghost": "Ghost",
"ghost_desc": "You are completely invisible", "ghost_desc": "You are completely invisible",
@ -175,6 +186,9 @@
"holyhandgrenade": "Holy Hand Grenade", "holyhandgrenade": "Holy Hand Grenade",
"holyhandgrenade_desc": "Your HE grenades deal double damage and have double range", "holyhandgrenade_desc": "Your HE grenades deal double damage and have double range",
"iana": "Hologram",
"iana_desc": "Click [css_useSkill] to control your hologram for a few seconds",
"impostor": "Impostor", "impostor": "Impostor",
"impostor_desc": "You start the round with an enemy player model", "impostor_desc": "You start the round with an enemy player model",
@ -356,6 +370,7 @@
"silent_desc": "Your footsteps and jumps are silent to OTHER players", "silent_desc": "Your footsteps and jumps are silent to OTHER players",
"sniperelite": "Sniper Elite", "sniperelite": "Sniper Elite",
"sniperelite_customname": "Sniper Elite Skill",
"sniperelite_desc": "Click [css_useSkill] to swap your current weapon for an AWP", "sniperelite_desc": "Click [css_useSkill] to swap your current weapon for an AWP",
"soldier": "Soldier", "soldier": "Soldier",
@ -451,10 +466,10 @@
"bombsite_a": "Bombsite A", "bombsite_a": "Bombsite A",
"bombsite_b": "Bombsite B", "bombsite_b": "Bombsite B",
"bombplanted": "The bomb has been planted\n{0} seconds till detonation",
"teammate_skills": "Your teammates' skills", "teammate_skills": "Your teammates' skills",
"summary_start": "======SUMMARY=OF=THE=LAST=ROUND======", "summary": "Summary of the last round",
"summary_end": "=======================================",
"menu_controlls_scroll": "W/S - Scroll", "menu_controlls_scroll": "W/S - Scroll",
"menu_controlls_padding": " | ", "menu_controlls_padding": " | ",

View file

@ -55,6 +55,12 @@
"c4camouflage": "Camouflage C4", "c4camouflage": "Camouflage C4",
"c4camouflage_desc": "Vous êtes invisible en tenant la bombe", "c4camouflage_desc": "Vous êtes invisible en tenant la bombe",
"carefulbullets": "Balles prudentes",
"carefulbullets_desc": "Sélectionnez un joueur qui subit des dégâts à chaque tir manqué",
"carefulbullets_enemy_info": "À partir de maintenant, l'inexactitude fera littéralement mal.",
"carefulbullets_player_info": "« {0} » doit désormais être plus prudent.",
"carefulbullets_select_info": "L'inexactitude nuit au joueur :",
"catapult": "Catapulte", "catapult": "Catapulte",
"catapult_desc": "Vous avez une chance aléatoire de projeter un ennemi en l’air", "catapult_desc": "Vous avez une chance aléatoire de projeter un ennemi en l’air",
"catapult_desc2": "Votre chance de projeter un ennemi à l’impact est : {0}%", "catapult_desc2": "Votre chance de projeter un ennemi à l’impact est : {0}%",
@ -68,6 +74,10 @@
"cutter": "Trancheur", "cutter": "Trancheur",
"cutter_desc": "Coup de couteau = mort instantanée", "cutter_desc": "Coup de couteau = mort instantanée",
"cypher": "Caméra",
"cypher_desc": "Cliquez sur [css_useSkill] pour créer/passer à une caméra.",
"cypher_nospace": "La caméra doit être positionnée à angle droit par rapport au mur",
"darkness": "Obscurité", "darkness": "Obscurité",
"darkness_desc": "Applique un effet d’obscurité à un ennemi choisi", "darkness_desc": "Applique un effet d’obscurité à un ennemi choisi",
"darkness_enemy_info": "Que la lumière s’éteigne.", "darkness_enemy_info": "Que la lumière s’éteigne.",
@ -142,6 +152,7 @@
"gambler_desc": "Sélectionnez une compétence dans la liste proposée.", "gambler_desc": "Sélectionnez une compétence dans la liste proposée.",
"gambler_select_info": "Sélectionnez votre compétence :", "gambler_select_info": "Sélectionnez votre compétence :",
"gambler_more": "#00FF00|Rafraîchir pour ${0}", "gambler_more": "#00FF00|Rafraîchir pour ${0}",
"gambler_no_money": "Pas assez d'argent.",
"ghost": "Fantôme", "ghost": "Fantôme",
"ghost_desc": "Vous êtes complètement invisible", "ghost_desc": "Vous êtes complètement invisible",
@ -175,6 +186,9 @@
"holyhandgrenade": "Grenade Sacrée", "holyhandgrenade": "Grenade Sacrée",
"holyhandgrenade_desc": "Vos grenades HE infligent le double de dégâts et ont une portée doublée", "holyhandgrenade_desc": "Vos grenades HE infligent le double de dégâts et ont une portée doublée",
"iana": "Hologramme",
"iana_desc": "Cliquez sur [css_useSkill] pour contrôler votre hologramme pendant quelques secondes",
"impostor": "Imposteur", "impostor": "Imposteur",
"impostor_desc": "Vous commencez le round avec un modèle de joueur ennemi", "impostor_desc": "Vous commencez le round avec un modèle de joueur ennemi",
@ -356,6 +370,7 @@
"silent_desc": "Vos pas et vos sauts sont silencieux pour les AUTRES joueurs", "silent_desc": "Vos pas et vos sauts sont silencieux pour les AUTRES joueurs",
"sniperelite": "Sniper d’Élite", "sniperelite": "Sniper d’Élite",
"sniperelite_customname": "Compétence Sniper d’Élite",
"sniperelite_desc": "Appuyez sur [css_useSkill] pour échanger votre arme actuelle contre un AWP", "sniperelite_desc": "Appuyez sur [css_useSkill] pour échanger votre arme actuelle contre un AWP",
"soldier": "Soldat", "soldier": "Soldat",
@ -451,10 +466,10 @@
"bombsite_a": "Site de bombe A", "bombsite_a": "Site de bombe A",
"bombsite_b": "Site de bombe B", "bombsite_b": "Site de bombe B",
"bombplanted": "La bombe a été posée\n{0} secondes avant l'explosion",
"teammate_skills": "Compétences de vos coéquipiers", "teammate_skills": "Compétences de vos coéquipiers",
"summary_start": "======RÉSUMÉ=DU=DERNIER=ROUND======", "summary": "Résumé du dernier round",
"summary_end": "===================================",
"menu_controlls_scroll": "W/S - Défilement", "menu_controlls_scroll": "W/S - Défilement",
"menu_controlls_padding": " | ", "menu_controlls_padding": " | ",

View file

@ -55,6 +55,12 @@
"c4camouflage": "C4 Kamuflaż", "c4camouflage": "C4 Kamuflaż",
"c4camouflage_desc": "Kiedy trzymasz bombę, jesteś niewidzialny", "c4camouflage_desc": "Kiedy trzymasz bombę, jesteś niewidzialny",
"carefulbullets": "Ostrożne pociski",
"carefulbullets_desc": "Wybierz gracza, który otrzymuje obrażenia za każdy niecelny strzał",
"carefulbullets_enemy_info": "Od teraz niecelność będzie dosłownie bolała.",
"carefulbullets_player_info": "'{0}' musi teraz być bardziej ostrożny.",
"carefulbullets_select_info": "Niedokładność szkodzi graczowi:",
"catapult": "Katapulta", "catapult": "Katapulta",
"catapult_desc": "Masz losową szanse na podrzucenie wroga", "catapult_desc": "Masz losową szanse na podrzucenie wroga",
"catapult_desc2": "Twoje szanse na podrzucenie wroga po trafieniu to: {0}%", "catapult_desc2": "Twoje szanse na podrzucenie wroga po trafieniu to: {0}%",
@ -68,6 +74,10 @@
"cutter": "Scyzoryk", "cutter": "Scyzoryk",
"cutter_desc": "Natychmiastowe zabójstwo nożem", "cutter_desc": "Natychmiastowe zabójstwo nożem",
"cypher": "Kamera",
"cypher_desc": "Kliknij [css_useSkill], aby utworzyć/przełączyć się na kamerę",
"cypher_nospace": "Kamera musi być ustawiona pod kątem prostym do ściany",
"darkness": "Mrok", "darkness": "Mrok",
"darkness_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi", "darkness_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi",
"darkness_enemy_info": "Niech zgasną światła.", "darkness_enemy_info": "Niech zgasną światła.",
@ -142,6 +152,7 @@
"gambler_desc": "Wybierz umiejętność z podanej listy.", "gambler_desc": "Wybierz umiejętność z podanej listy.",
"gambler_select_info": "Wybierz umiejętność:", "gambler_select_info": "Wybierz umiejętność:",
"gambler_more": "#00FF00|Odśwież za ${0}", "gambler_more": "#00FF00|Odśwież za ${0}",
"gambler_no_money": "Niewystarczająca ilość pieniędzy.",
"ghost": "Duszek", "ghost": "Duszek",
"ghost_desc": "Jesteś całkowicie niewidzialny", "ghost_desc": "Jesteś całkowicie niewidzialny",
@ -175,6 +186,9 @@
"holyhandgrenade": "Święty Granat Ręczny", "holyhandgrenade": "Święty Granat Ręczny",
"holyhandgrenade_desc": "Twoje granaty uderzeniowe zadają podwójne obrażenia i mają podwójny zasięg", "holyhandgrenade_desc": "Twoje granaty uderzeniowe zadają podwójne obrażenia i mają podwójny zasięg",
"iana": "Hologram",
"iana_desc": "Kliknij [css_useSkill], aby sterować hologramem przez kilka sekund",
"impostor": "Szpieg", "impostor": "Szpieg",
"impostor_desc": "Na początku rundy otrzymujesz model postaci przeciwnika", "impostor_desc": "Na początku rundy otrzymujesz model postaci przeciwnika",
@ -356,6 +370,7 @@
"silent_desc": "Twoje kroki i skoki są niesłyszalne dla INNYCH graczy", "silent_desc": "Twoje kroki i skoki są niesłyszalne dla INNYCH graczy",
"sniperelite": "SzeliS", "sniperelite": "SzeliS",
"sniperelite_customname": "Mityczna AWP",
"sniperelite_desc": "Kliknij [css_useSkill], aby zamienić aktualną broń na AWP", "sniperelite_desc": "Kliknij [css_useSkill], aby zamienić aktualną broń na AWP",
"soldier": "Żołnierz", "soldier": "Żołnierz",
@ -451,10 +466,10 @@
"bombsite_a": "Strefa detonacji A", "bombsite_a": "Strefa detonacji A",
"bombsite_b": "Strefa detonacji B", "bombsite_b": "Strefa detonacji B",
"bombplanted": "Bomba została podłożona\n{0} sekund do detonacji",
"teammate_skills": "Supermoce twoich sojuszników", "teammate_skills": "Supermoce twoich sojuszników",
"summary_start": "======PODSUMOWANIE=Z=OSTATNIEJ=RUNDY======", "summary": "Podsumowanie z ostatniej rundy",
"summary_end": "============================================",
"menu_controlls_scroll": "W/S – Przewijanie", "menu_controlls_scroll": "W/S – Przewijanie",
"menu_controlls_padding": " | ", "menu_controlls_padding": " | ",

View file

@ -1,53 +1,53 @@
{ {
"none": "Nenhuma", "none": "Nenhum",
"none_desc": "Você não tem nenhuma habilidade", "none_desc": "Você não tem nenhuma habilidade",
"aimbot": "Aimbot", "aimbot": "Aimbot",
"aimbot_desc": "Toda bala que você acertar conta como um hs", "aimbot_desc": "Cada bala que você acertar conta como um tiro na cabeça",
"anomaly": "Máquina do Tempo", "anomaly": "Anomalia",
"anomaly_desc": "Você volta alguns segundos no tempo", "anomaly_desc": "Você retrocede alguns segundos no tempo",
"antyflash": "Anti-Flash", "antyflash": "Anti-Flash",
"antyflash_desc": "Você é imune a flashes, e flashbangs duram 7 segundos", "antyflash_desc": "Você é imune a granadas de flash, e suas granadas de flash duram 7 segundos",
"antyhead": "Cabeça de Ferro", "antyhead": "Cabeça de Ferro",
"antyhead_desc": "Você não recebe dano de headshots", "antyhead_desc": "Você não recebe dano de tiros na cabeça",
"areareaper": "Ceifador de Bombsite", "areareaper": "Ceifador de Zonas",
"areareaper_desc": "Você pode escolher um bombsite para desativar", "areareaper_desc": "Você pode escolher um local de bomba para desativar",
"areareaper_incorrect_site": "Nenhum bombsite encontrado.", "areareaper_incorrect_site": "Nenhum local de bomba encontrado.",
"areareaper_no_site": "Nenhum bombsite encontrado.", "areareaper_no_site": "Nenhum local de bomba encontrado.",
"areareaper_select_info": "Escolha o bomb p/ desativar:", "areareaper_select_info": "Escolha área p/ desativar:",
"areareaper_site_disabled": "Bombsite {0} foi desativado - nenhuma bomba pode ser plantada lá!", "areareaper_site_disabled": "Local de bomba {0} foi desativado - nenhuma bomba pode ser plantada lá!",
"areareaper_used_info": "Seu poder já foi usado.", "areareaper_used_info": "Seu poder já foi usado.",
"armored": "Super Tiro", "armored": "Blindado",
"armored_desc": "Seu dano é multiplicado por um valor aleatório", "armored_desc": "Você tem um multiplicador de dano recebido aleatório",
"armored_desc2": "Seu multiplicador de dano é: {0}x", "armored_desc2": "Seu multiplicador de dano recebido é: {0}x",
"assassin": "Assassino", "assassin": "Assassino",
"assassin_desc": "Você causa mais dano aos inimigos de costas", "assassin_desc": "Você causa mais dano aos inimigos por trás",
"astronaut": "Astronauta", "astronaut": "Astronauta",
"astronaut_desc": "Sua gravidade é multiplicada por um valor aleatório", "astronaut_desc": "Você recebe um valor de gravidade aleatório no início da rodada",
"astronaut_desc2": "Sua gravidade aleatória é: {0}x", "astronaut_desc2": "Sua gravidade aleatória é: {0}x",
"bankrupt": "Ladrão", "bankrupt": "Falido",
"bankrupt_desc": "Escolha o jogador que perderá todo o dinheiro", "bankrupt_desc": "Escolha o jogador que perderá todo o dinheiro",
"bankrupt_enemy_info": "Você ficou pobre", "bankrupt_enemy_info": "Você faliu.",
"bankrupt_player_info": "O jogador '{0}' ficou pobre.", "bankrupt_player_info": "O jogador '{0}' faliu.",
"bankrupt_select_info": "Escolha jogador p/ ficar pobre:", "bankrupt_select_info": "Escolha jogador p/ falir:",
"baseball": "Decoy Aleluia", "baseball": "Jogador de Beisebol",
"baseball_desc": "Sua decoy ricocheteia nas paredes e mata instantaneamente um inimigo ao acertá-lo", "baseball_desc": "Seu chamariz ricocheteia nas paredes e mata instantaneamente um inimigo ao acertar",
"behind": "Pião do Baú", "behind": "Giro do Inimigo",
"behind_desc": "Você tem uma chance aleatória de girar um inimigo 180 graus ao acertá-lo", "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}%", "behind_desc2": "Sua chance de girar um inimigo ao acertar é: {0}%",
"blademaster": "Mestre das Lâminas", "blademaster": "Mestre das Lâminas",
"blademaster_desc": "Enquanto segura a faca, você tem chance de desviar de um tiro", "blademaster_desc": "Enquanto segura uma faca, você tem uma alta chance de desviar de um tiro",
"bunnyhop": "Coelho", "bunnyhop": "Coelho",
"bunnyhop_desc": "Você ganha \"BunnyHop\" automático", "bunnyhop_desc": "Você ganha \"BunnyHop\" automático",
@ -55,18 +55,28 @@
"c4camouflage": "Camuflagem C4", "c4camouflage": "Camuflagem C4",
"c4camouflage_desc": "Você fica invisível enquanto segura a bomba", "c4camouflage_desc": "Você fica invisível enquanto segura a bomba",
"carefulbullets": "Balas cuidadosas",
"carefulbullets_desc": "Selecione um jogador que sofra dano por cada tiro errado",
"carefulbullets_enemy_info": "A partir de agora, a imprecisão vai literalmente doer.",
"carefulbullets_player_info": "Agora, '{0}' precisa ter mais cuidado.",
"carefulbullets_select_info": "A imprecisão prejudica o jogador:",
"catapult": "Catapulta", "catapult": "Catapulta",
"catapult_desc": "Você tem uma chance aleatória de lançar um inimigo para cima", "catapult_desc": "Você tem uma chance aleatória de lançar um inimigo para cima",
"catapult_desc2": "Sua chance de lançar um inimigo ao acertá-lo é: {0}%", "catapult_desc2": "Sua chance de lançar um inimigo ao acertar é: {0}%",
"chicken": "Galinha", "chicken": "Galinha",
"chicken_desc": "Você é uma galinha com +10% de movimento mais rápido e -50 HP", "chicken_desc": "Você ganha um modelo de galinha + 10% de movimento mais rápido - 50 HP",
"chillout": "Esqueci a Senha", "chillout": "Descontraído",
"chillout_desc": "Plantar a bomba leva significativamente mais tempo", "chillout_desc": "Plantar a bomba leva significativamente mais tempo",
"cutter": "Corte Rápido", "cutter": "Cortador",
"cutter_desc": "Você mata instantaneamente com a faca", "cutter_desc": "Mata instantaneamente com uma faca",
"cypher": "Câmera",
"cypher_desc": "Clique em [css_useSkill] para criar/mudar para uma câmera",
"cypher_nospace": "A câmera deve ser posicionada em ângulo reto com a parede",
"darkness": "Escuridão", "darkness": "Escuridão",
"darkness_desc": "Aplica um efeito de escuridão a um inimigo escolhido", "darkness_desc": "Aplica um efeito de escuridão a um inimigo escolhido",
@ -75,57 +85,58 @@
"darkness_select_info": "Escolha jogador: escuridão:", "darkness_select_info": "Escolha jogador: escuridão:",
"deactivator": "Desativador", "deactivator": "Desativador",
"deactivator_desc": "Escolha um jogador para desativar a habilidade", "deactivator_desc": "Escolha um jogador cuja habilidade você deseja desativar",
"deactivator_enemy_info": "Sua habilidade foi desativada.", "deactivator_enemy_info": "Sua habilidade foi desativada.",
"deactivator_player_info": "A habilidade do jogador '{0}' foi desativada.", "deactivator_player_info": "A habilidade do jogador '{0}' foi desativada.",
"deactivator_select_info": "Desativar skill do jogador:", "deactivator_select_info": "Desativar skill do jogador:",
"deaf": "Surdo", "deaf": "Surdo",
"deaf_desc": "Escolha um jogador para desativar todos os sons", "deaf_desc": "Escolha um jogador para silenciar todos os sons",
"deaf_enemy_info": "Seus fones de ouvido saíram do jogo.", "deaf_enemy_info": "Seus fones de ouvido saíram do jogo.",
"deaf_player_info": "O som foi desativado para o jogador '{0}'.", "deaf_player_info": "O som foi desativado para o jogador '{0}'.",
"deaf_select_info": "Silenciar jogador:", "deaf_select_info": "Silenciar jogador:",
"disarmament": "Desarmamento", "disarmament": "Desarmamento",
"disarmament_desc": "Você tem uma chance aleatória de fazer um inimigo dropar a arma ao acertá-lo", "disarmament_desc": "Você tem uma chance aleatória de fazer um inimigo largar sua arma ao acertá-lo",
"disarmament_desc2": "Sua chance de desarmar um inimigo é: {0}%", "disarmament_desc2": "Sua chance de desarmar um inimigo é: {0}%",
"distancer": "Medidor de Distância", "distancer": "Medidor de Distância",
"distancer_desc": "Você pode ver a distância até o inimigo mais próximo", "distancer_desc": "Você pode ver a distância até o inimigo mais próximo",
"dash": "Impulso", "dash": "Dash",
"dash_desc": "Pule novamente para receber um impulso", "dash_desc": "Execute um segundo salto para dar um dash",
"dracula": "Drácula", "dracula": "Drácula",
"dracula_desc": "Acertar um inimigo restaura sua vida igual a ao dano causado", "dracula_desc": "Acertar um inimigo restaura saúde igual a uma porcentagem do dano causado",
"duplicator": "ctrl+c ctrl+v", "duplicator": "Duplicador",
"duplicator_desc": "Escolha um jogador para copiar a habilidade", "duplicator_desc": "Escolha um jogador para copiar sua habilidade",
"duplicator_player_info": "A habilidade do jogador '{0}' foi copiada.", "duplicator_player_info": "A habilidade do jogador '{0}' foi copiada.",
"duplicator_select_info": "Copiar skill do jogador:", "duplicator_select_info": "Copiar skill do jogador:",
"dwarf": "Anão", "dwarf": "Anão",
"dwarf_desc": "Sua altura agora é aleatória", "dwarf_desc": "Tamanho de personagem aleatório no início da rodada",
"dwarf_desc2": "Seu multiplicador de altura é: {0}x", "dwarf_desc2": "Seu multiplicador de tamanho é: {0}x",
"enemyspawn": "Spawn Inimigo", "enemyspawn": "Spawn Inimigo",
"enemyspawn_desc": "Clique em [css_useSkill] para se teletransportar para a base inimiga", "enemyspawn_desc": "Clique em [css_useSkill] para se teletransportar para o spawn inimigo",
"explosiveshot": "Tiro Explosivo", "explosiveshot": "Tiro Explosivo",
"explosiveshot_desc": "Chance aleatória de disparar uma bala explosiva enquanto atira", "explosiveshot_desc": "Chance aleatória de disparar uma bala explosiva enquanto atira",
"explosiveshot_desc2": "Sua chance de disparar uma bala explosiva: {0}%", "explosiveshot_desc2": "Sua chance de disparar uma bala explosiva: {0}%",
"falconeye": "Olho de Águia", "falconeye": "Olho de Falcão",
"falconeye_desc": "Clique em [css_useSkill] para ativar uma câmera 360 com visão aérea", "falconeye_desc": "Clique em [css_useSkill] para ativar uma câmera com visão aérea",
"fastreload": "Recarga Rápida", "fastreload": "Recarga Rápida",
"fastreload_desc": "Clique em [css_useSkill] para recarregar a arma que você está segurando", "fastreload_desc": "Clique em [css_useSkill] para recarregar a arma que você está segurando",
"flash": "Ligeirinho", "flash": "Flash",
"flash_desc": "Velocidade de movimentação aleatória no início da rodada", "flash_desc": "Velocidade de jogador aleatória no início da rodada",
"flash_desc2": "Seu multiplicador de velocidade é: {0}x", "flash_desc2": "Seu multiplicador de velocidade é: {0}x",
"fortnite": "Fortnite", "fortnite": "Fortnite",
"fortnite_desc": "Clique em [css_useSkill] para criar uma barreira destrutível", "fortnite_desc": "Clique em [css_useSkill] para criar uma barricada destrutível",
"fragilebomb": "Bomba Frágil", "fragilebomb": "Bomba Frágil",
"fragilebomb_desc": "Atirar na bomba a danifica", "fragilebomb_desc": "Atirar na bomba a danifica",
@ -134,131 +145,135 @@
"friendlyfire": "Fogo Amigo", "friendlyfire": "Fogo Amigo",
"friendlyfire_desc": "Atirar em companheiros de equipe os cura", "friendlyfire_desc": "Atirar em companheiros de equipe os cura",
"frozendecoy": "Decoy Congelante", "frozendecoy": "Chamariz Congelante",
"frozendecoy_desc": "Sua decoy congela os players próximos", "frozendecoy_desc": "Seu chamariz congela todos os jogadores próximos",
"gambler": "Tigrinho", "gambler": "Apostador",
"gambler_desc": "Selecione uma habilidade da lista.", "gambler_desc": "Selecione uma habilidade da lista.",
"gambler_select_info": "Escolha sua habilidade:", "gambler_select_info": "Escolha sua habilidade:",
"gambler_more": "#00FF00|Atualizar por ${0}", "gambler_more": "#00FF00|Atualizar por ${0}",
"gambler_no_money": "Não há dinheiro suficiente.",
"ghost": "Fantasma", "ghost": "Fantasma",
"ghost_desc": "Você é completamente invisível", "ghost_desc": "Você é completamente invisível",
"glaz": "Smoke Transparente", "glaz": "Glaz",
"glaz_desc": "Smokes tornam-se transparentes para você", "glaz_desc": "Você não pode ver granadas de fumaça",
"glitch": "Sem Mapa", "glitch": "Glitch",
"glitch_desc": "Desativa o radar de um inimigo escolhido", "glitch_desc": "Desativa o radar de um inimigo escolhido",
"glitch_enemy_info": "Seu radar foi desativado.", "glitch_enemy_info": "Seu radar foi desativado.",
"glitch_player_info": "O radar do jogador '{0}' foi desativado.", "glitch_player_info": "O radar do jogador '{0}' foi desativado.",
"glitch_select_info": "Desativar radar do jogador:", "glitch_select_info": "Desativar radar do jogador:",
"glue": "Semtex", "glue": "Cola",
"glue_desc": "Suas granadas grudam nas paredes", "glue_desc": "Suas granadas grudam nas paredes",
"godmode": "Modo Deus", "godmode": "Modo Deus",
"godmode_desc": "Clique em [css_useSkill] para se tornar imortal por alguns segundos", "godmode_desc": "Clique em [css_useSkill] para se tornar imortal por um curto período",
"godmode_off": "Imortalidade desativada", "godmode_off": "Imortalidade desativada",
"godmode_on": "Imortalidade ativada", "godmode_on": "Imortalidade ativada",
"grenadier": "Bomberman", "grenadier": "Grenadier",
"grenadier_desc": "Você tem HEs infinitas", "grenadier_desc": "Você tem granadas HE infinitas",
"healingsmoke": "Smoke Amiga", "healingsmoke": "Fumaça Curativa",
"healingsmoke_desc": "Suas smokes curam", "healingsmoke_desc": "Suas granadas de fumaça curam",
"hermit": "Sanguessuga", "hermit": "Eremita",
"hermit_desc": "Matar restaura munição e uma parte da sua vida", "hermit_desc": "Matar restaura munição e uma porção de saúde",
"holyhandgrenade": "Granada Obesa", "holyhandgrenade": "Granada Sagrada",
"holyhandgrenade_desc": "HEs causam dano dobrado e têm alcance dobrado", "holyhandgrenade_desc": "Suas granadas explosivas causam dano dobrado e têm alcance dobrado",
"iana": "Holograma",
"iana_desc": "Clique em [css_useSkill] para controlar seu holograma por alguns segundos",
"impostor": "Impostor", "impostor": "Impostor",
"impostor_desc": "Você começa a rodada vestido do time inimigo", "impostor_desc": "Você começa a rodada com um modelo de jogador inimigo",
"infiniteammo": "Munição Infinita", "infiniteammo": "Munição Infinita",
"infiniteammo_desc": "Você recebe munição infinita para todas as suas armas", "infiniteammo_desc": "Você recebe munição infinita para todas as suas armas",
"jackal": "Lesma", "jackal": "Rastreador",
"jackal_desc": "Cada adversário deixa um rastro atrás de si", "jackal_desc": "Cada adversário deixa um rastro atrás de si",
"jammer": "No Scope", "jammer": "Jammer",
"jammer_desc": "Escolha um jogador para desativar a mira", "jammer_desc": "Escolha um jogador para desativar sua mira",
"jammer_enemy_info": "Sua mira foi desativada.", "jammer_enemy_info": "Sua mira foi desativada.",
"jammer_player_info": "A mira do jogador '{0}' foi desativada.", "jammer_player_info": "A mira do jogador '{0}' foi desativada.",
"jammer_select_info": "Desativar mira do jogador:", "jammer_select_info": "Desativar mira do jogador:",
"jester": "Palhaço", "jester": "Bobo",
"jester_desc": "No modo bobo você não pode causar nem receber dano. Esse modo muda a cada poucos segundos.", "jester_desc": "No modo bobo você não pode causar nem receber dano. Esse modo muda a cada poucos segundos.",
"jester_mode": "Modo Palhaço", "jester_mode": "Modo Bobo",
"jester_on": "LIG.", "jester_on": "LIG.",
"jester_off": "DESL.", "jester_off": "DESL.",
"jumpban": "Perneta", "jumpban": "Sem Pernas",
"jumpban_desc": "Escolha um jogador que não poderá pular", "jumpban_desc": "Escolha um jogador que não poderá pular",
"jumpban_enemy_info": "Cortaram as suas pernas.", "jumpban_enemy_info": "Alguém cortou suas pernas.",
"jumpban_player_info": "O jogador '{0}' não pode mais pular.", "jumpban_player_info": "O jogador '{0}' não pode mais pular.",
"jumpban_select_info": "Banir pulo do jogador:", "jumpban_select_info": "Banir pulo do jogador:",
"jumpingjack": "Pula-Pula", "jumpingjack": "Pula-Pula",
"jumpingjack_desc": "Pular restaura vida", "jumpingjack_desc": "Pular restaura saúde",
"killerflash": "Flash Mortal", "killerflash": "Flash Mortal",
"killerflash_desc": "Qualquer pessoa cega pela sua flash morre (incluindo você)", "killerflash_desc": "Qualquer um completamente cego pela sua granada de flash morre (incluindo você)",
"lifeswap": "Troca de Vida", "lifeswap": "Troca de Vida",
"lifeswap_desc": "Escolha um jogador para trocar de vida", "lifeswap_desc": "Escolha um jogador para trocar saúde com ele",
"lifeswap_enemy_info": "Alguém pegou sua vida emprestada.", "lifeswap_enemy_info": "Alguém pegou sua saúde emprestada.",
"lifeswap_player_info": "Você trocou vida com o jogador '{0}'.", "lifeswap_player_info": "Você trocou saúde com o jogador '{0}'.",
"lifeswap_select_info": "Trocar de vida com jogador:", "lifeswap_select_info": "Trocar vida com jogador:",
"longknife": "Espada", "longknife": "Faca Longa",
"longknife_desc": "Um ataque com faca causa danos independentemente da distância", "longknife_desc": "Um ataque com faca causa danos independentemente da distância",
"longzeus": "Zeus Longo", "longzeus": "Zeus Longo",
"longzeus_desc": "Zeus causa dano independentemente da distância", "longzeus_desc": "Zeus causa dano independentemente da distância",
"magnifier": "Lupa", "magnifier": "Lupa",
"magnifier_desc": "Força a tela do inimigo a dar um zoom, reduzindo seu campo de visão", "magnifier_desc": "Força a tela do inimigo a ampliar, reduzindo seu campo de visão",
"magnifier_enemy_info": "Seu campo de visão foi distorcido!", "magnifier_enemy_info": "Seu campo de visão foi distorcido!",
"magnifier_player_info": "O jogador ‘{0}’ foi forçado a entrar no modo zoom.", "magnifier_player_info": "O jogador ‘{0}’ foi forçado a entrar no modo de zoom.",
"magnifier_select_info": "Ampliar tela do jogador:", "magnifier_select_info": "Ampliar tela do jogador:",
"medic": "Médico", "medic": "Médico",
"medic_desc": "Clique em [css_useSkill] para usar uma injeção que restaura 50 de vida", "medic_desc": "Clique em [css_useSkill] para usar uma carga de cura que restaura 50 de saúde",
"moneyswap": "Troca de Grana", "moneyswap": "Cobrador de Impostos",
"moneyswap_desc": "Escolha um jogador para trocar de dinheiro com ele", "moneyswap_desc": "Escolha um jogador para trocar dinheiro com ele",
"moneyswap_enemy_info": "Você provavelmente virou classe B", "moneyswap_enemy_info": "A receita federal te pegou.",
"moneyswap_player_info": "Você trocou dinheiro com o jogador '{0}'.", "moneyswap_player_info": "Você trocou dinheiro com o jogador '{0}'.",
"moneyswap_select_info": "Trocar dinheiro c/ jogador:", "moneyswap_select_info": "Trocar dinheiro c/ jogador:",
"muhammed": "Muhammed", "muhammed": "Muhammed",
"muhammed_desc": "Você explode ao morrer, matando os jogadores próximos", "muhammed_desc": "Você explode ao morrer, matando jogadores próximos",
"muhammed_explosion": "ALLAHU AKBAR!!!", "muhammed_explosion": "ALLAHU AKBAR!!!",
"ninja": "Ninja", "ninja": "Ninja",
"ninja_desc": "Ficar parado aumenta sua invisibilidade em 33%, agachar em 33%, e segurar uma faca em 33%", "ninja_desc": "Ficar parado aumenta sua invisibilidade em 33%, agachar em 33%, e segurar uma faca em 33%",
"nonades": "Imune a Granadas", "nonades": "Sem Granadas",
"nonades_desc": "Granadas não causam dano a você", "nonades_desc": "Granadas não causam dano a você",
"norecoil": "Sem Recoil", "norecoil": "Foco",
"norecoil_desc": "Sem recoil ao atirar", "norecoil_desc": "Sem recuo ao atirar",
"noclip": "NoClip", "noclip": "NoClip",
"noclip_desc": "Clique em [css_useSkill] para ativar noclip por poucos segundos", "noclip_desc": "Clique em [css_useSkill] para ativar noclip por um curto período",
"oneshot": "Ignorante", "oneshot": "Tiro Único",
"oneshot_desc": "Acertar um inimigo o mata instantaneamente", "oneshot_desc": "Acertar um inimigo o mata instantaneamente",
"onlyhead": "Só na Cabeçinha", "onlyhead": "Apenas Cabeça",
"onlyhead_desc": "Você só recebe headshot", "onlyhead_desc": "Você só recebe dano na cabeça",
"paweljumper": "Parkourista", "paweljumper": "Pawel Jumper",
"paweljumper_desc": "Você recebe um número aleatório de pulos extras", "paweljumper_desc": "Você recebe um número aleatório de saltos extras",
"paweljumper_desc2": "Você ganha {0} pulos extras", "paweljumper_desc2": "Você ganha {0} saltos extras",
"phoenix": "Fênix", "phoenix": "Fênix",
"phoenix_desc": "Você tem uma chance aleatória de renascer após a morte", "phoenix_desc": "Você tem uma chance aleatória de renascer após a morte",
@ -266,14 +281,14 @@
"phoenix_respawn": "Você foi ressuscitado das cinzas graças ao poder de: CHATCOLORS.REDPhoenix", "phoenix_respawn": "Você foi ressuscitado das cinzas graças ao poder de: CHATCOLORS.REDPhoenix",
"psychicdefusing": "Desarme Psíquico", "psychicdefusing": "Desarme Psíquico",
"psychicdefusing_desc": "Quando você está proximo da bomba, começa a desarmá-la automaticamente", "psychicdefusing_desc": "Quando você está perto da bomba, começa a desarmá-la",
"psychicdefusing_hud_info": "{0} segundos restantes para desarmar", "psychicdefusing_hud_info": "{0} segundos restantes para desarmar",
"pilot": "Jetpack", "pilot": "Piloto",
"pilot_desc": "Voe por um tempo limitado. Segure [USE - E] para voar", "pilot_desc": "Voe por um tempo limitado. Segure [USE - E] para voar",
"pilot_hud_info": "Combustível", "pilot_hud_info": "Combustível",
"planter": "Meu Bombsite Minha Vida", "planter": "Plantador Livre",
"planter_desc": "Você pode plantar a bomba em qualquer lugar, com um tempo de detonação de 60 segundos.", "planter_desc": "Você pode plantar a bomba em qualquer lugar, com um tempo de detonação de 60 segundos.",
"poison": "Veneno", "poison": "Veneno",
@ -282,7 +297,7 @@
"poison_player_info": "O jogador '{0}' foi envenenado.", "poison_player_info": "O jogador '{0}' foi envenenado.",
"poison_select_info": "Envenenar jogador:", "poison_select_info": "Envenenar jogador:",
"primaryban": "Sem Rifle", "primaryban": "Sem Rifles",
"primaryban_desc": "Escolha um jogador que não poderá usar rifles", "primaryban_desc": "Escolha um jogador que não poderá usar rifles",
"primaryban_enemy_info": "Você não pode mais usar rifles.", "primaryban_enemy_info": "Você não pode mais usar rifles.",
"primaryban_player_info": "O jogador '{0}' não pode mais usar rifles.", "primaryban_player_info": "O jogador '{0}' não pode mais usar rifles.",
@ -291,89 +306,90 @@
"prosthesis": "Prótese", "prosthesis": "Prótese",
"prosthesis_desc": "Braços e pernas são à prova de balas", "prosthesis_desc": "Braços e pernas são à prova de balas",
"push": "Empurrão", "push": "Empurrador",
"push_desc": "Você tem uma chance aleatória de empurrar um inimigo ao acertá-lo", "push_desc": "Você tem uma chance aleatória de empurrar um inimigo para trás ao acertá-lo",
"push_desc2": "Suas chances de empurrar o inimigo são: {0}%", "push_desc2": "Suas chances de repelir o inimigo são: {0}%",
"pyro": "Pirotecnia", "pyro": "Piro",
"pyro_desc": "Molotov recupera vida", "pyro_desc": "Molotov restaura saúde",
"quickshot": "Tiro Rápido", "quickshot": "Tiro Rápido",
"quickshot_desc": "Todas as balas são disparadas extremamente rapidas", "quickshot_desc": "Todas as balas são disparadas muito rapidamente",
"radarhack": "Hack de Mapa", "radarhack": "Hack de Radar",
"radarhack_desc": "Inimigos são visíveis no mapa", "radarhack_desc": "Inimigos são visíveis no radar",
"rambo": "Rambo", "rambo": "Rambo",
"rambo_desc": "Você recebe uma quantidade aleatória de vida no início da rodada", "rambo_desc": "Você recebe uma quantidade aleatória de saúde no início da rodada",
"randomweapon": "Arma Aleatória", "randomweapon": "Arma Aleatória",
"randomweapon_desc": "Clique em [css_useSkill] para receber uma arma aleatória", "randomweapon_desc": "Clique em [css_useSkill] para receber uma arma aleatória",
"rezombie": "Walking Dead", "rezombie": "Re-Zumbi",
"rezombie_desc": "Após morrer, você renasce como um zumbi com mais vida porém sem armas", "rezombie_desc": "Após a morte, você renasce como um zumbi com mais saúde e sem armas",
"reactivearmor": "Armadura Reativa", "reactivearmor": "Armadura Reativa",
"reactivearmor_desc": "A armadura absorve o primeiro dano recebido", "reactivearmor_desc": "A armadura absorve o primeiro dano recebido",
"regeneration": "Regeneração", "regeneration": "Regeneração",
"regeneration_desc": "Você restaura vida a cada poucos segundos", "regeneration_desc": "Você restaura saúde a cada poucos segundos",
"replicator": "Clone", "replicator": "Replicador",
"replicator_desc": "Clique em [css_useSkill] para criar um clone que causa dano ao ser atingido", "replicator_desc": "Clique em [css_useSkill] para criar uma réplica que causa dano ao acertar",
"retreat": "De Volta as Origens", "retreat": "Recuo",
"retreat_desc": "Clique em [css_useSkill] para retornar ao spawn", "retreat_desc": "Clique em [css_useSkill] para retornar ao spawn",
"returntosender": "Devolução ao Remetente", "returntosender": "Devolução ao Remetente",
"returntosender_desc": "O primeiro tiro em um inimigo o envia de volta a sua base", "returntosender_desc": "O primeiro acerto em um inimigo o envia de volta ao seu spawn",
"richboy": "Filhinho de Papai", "richboy": "Garoto Rico",
"richboy_desc": "Você recebe uma quantidade aleatória de dinheiro no início da rodada", "richboy_desc": "Você recebe uma quantidade aleatória de dinheiro no início da rodada",
"robinhood": "Robin Hood", "robinhood": "Robin Hood",
"robinhood_desc": "Atirar em um inimigo rouba seu dinheiro", "robinhood_desc": "Causar dano a um inimigo rouba seu dinheiro",
"rubber": "Balas de Borracha", "rubber": "Balas de Borracha",
"rubber_desc": "Seus tiros deixam os jogadores lentos ao serem atingidos", "rubber_desc": "Suas balas retardam significativamente os jogadores",
"saper": "Especialista", "saper": "Sapeador",
"saper_desc": "Você pode plantar e desarmar bombas mais rápido", "saper_desc": "Você pode plantar e desarmar bombas mais rápido",
"secondlife": "Segunda Chance", "secondlife": "Segunda Chance",
"secondlife_desc": "Após morrer, você renasce com a mesma quantidade de vida", "secondlife_desc": "Após a morte, você renasce com a mesma quantidade de saúde",
"shade": "Sombra", "shade": "Sombra",
"shade_desc": "Você tem uma chance aleatória de teletransportar para trás de um inimigo ao atingi-lo", "shade_desc": "Você tem uma chance aleatória de se teletransportar para trás de um inimigo atingido",
"shade_desc2": "Suas chances de se teletransportar para trás de um inimigo atingido são: {0}%", "shade_desc2": "Suas chances de se teletransportar para trás de um inimigo atingido são: {0}%",
"shade_nospace": "Sem espaço disponível", "shade_nospace": "Sem espaço disponível",
"shortbomb": "Pavio Longo", "shortbomb": "Fusível Curto",
"shortbomb_desc": "A bomba demora muito mais para explodir", "shortbomb_desc": "A bomba explode muito mais rápido",
"silent": "Shhhiu!", "silent": "Silencioso",
"silent_desc": "Seus passos e pulos são silenciosos para OUTROS jogadores", "silent_desc": "Seus passos e pulos são silenciosos para OUTROS jogadores",
"sniperelite": "Sniper do BOPE", "sniperelite": "Atirador de Elite",
"sniperelite_customname": "Habilidade de Atirador de Elite",
"sniperelite_desc": "Clique em [css_useSkill] para trocar sua arma atual por uma AWP", "sniperelite_desc": "Clique em [css_useSkill] para trocar sua arma atual por uma AWP",
"soldier": "Soldado", "soldier": "Soldado",
"soldier_desc": "Seus tiros causam mais dano", "soldier_desc": "Você tem um multiplicador de dano aleatório",
"soldier_desc2": "Seu multiplicador de dano é: {0}x", "soldier_desc2": "Seu multiplicador de dano é: {0}x",
"soundmaker": "Criador de Som", "soundmaker": "Criador de Som",
"soundmaker_desc": "Clique em [css_useSkill] para tocar um som para cada inimigo", "soundmaker_desc": "Clique em [css_useSkill] para acionar um som para cada inimigo",
"spectator": "Espectador", "spectator": "Espectador",
"spectator_desc": "Clique em [css_useSkill] para ver a tela de um inimigo aleatório", "spectator_desc": "Clique em [css_useSkill] para observar um inimigo aleatório",
"swapposition": "Troca de Posição", "swapposition": "Troca de Posição",
"swapposition_desc": "Clique em [css_useSkill] para trocar de lugar com um inimigo aleatório", "swapposition_desc": "Clique em [css_useSkill] para trocar de lugar com um inimigo aleatório",
"teleporter": "Teletransportador", "teleporter": "Teletransportador",
"teleporter_desc": "Você troca de lugar com o inimigo que acertar", "teleporter_desc": "Você troca de lugar com o inimigo acertado",
"thief": "Lula", "thief": "Ladrão",
"thief_desc": "Você pode roubar uma habilidade de um jogador escolhido", "thief_desc": "Você pode roubar uma habilidade de um jogador escolhido",
"thief_enemy_info": "Sua habilidade foi roubada.", "thief_enemy_info": "Sua habilidade foi roubada.",
"thief_player_info": "A habilidade do jogador '{0}' foi roubada.", "thief_player_info": "A habilidade do jogador '{0}' foi roubada.",
@ -381,13 +397,13 @@
"thief_incorrect_skill": "Esta habilidade não pode ser selecionada!", "thief_incorrect_skill": "Esta habilidade não pode ser selecionada!",
"thirdeye": "Terceiro Olho", "thirdeye": "Terceiro Olho",
"thirdeye_desc": "Clique em [css_useSkill] para ativar a terceira pessoa", "thirdeye_desc": "Clique em [css_useSkill] para ativar a visão em terceira pessoa",
"thorns": "Porco Espinho", "thorns": "Espinhos",
"thorns_desc": "Seu oponente receberá uma parte do dano que causou a você", "thorns_desc": "Seu oponente receberá uma parte do dano que causou a você",
"toxicsmoke": "Smoke Tóxica", "toxicsmoke": "Fumaça Tóxica",
"toxicsmoke_desc": "Suas smokes causam dano", "toxicsmoke_desc": "Suas granadas de fumaça causam dano",
"wallhack": "Wallhack", "wallhack": "Wallhack",
"wallhack_desc": "Você pode ver inimigos através das paredes", "wallhack_desc": "Você pode ver inimigos através das paredes",
@ -404,9 +420,9 @@
"zeus": "Zeus", "zeus": "Zeus",
"zeus_desc": "Zeus x27 recarrega instantaneamente", "zeus_desc": "Zeus x27 recarrega instantaneamente",
"your_skill": "Sua habilidade atual", "your_skill": "Seu poder atual",
"enemy_skill": "Habilidade do inimigo", "enemy_skill": "Habilidade do inimigo",
"observer_skill": "Habilidade do jogador", "observer_skill": "Poder do jogador",
"welcome_message": "Bem-vindo {PLAYER} ao {SERVER_NAME}!\nVersão atual do jRandomSkills: {VERSION} ({SKILLS_COUNT} habilidades).\n\nCriado originalmente por:\n{AUTHOR1}\nModificado e aprimorado por:\n{AUTHOR2}\nDiscord oficial: https://discord.gg/9H8EZYBpPF", "welcome_message": "Bem-vindo {PLAYER} ao {SERVER_NAME}!\nVersão atual do jRandomSkills: {VERSION} ({SKILLS_COUNT} habilidades).\n\nCriado originalmente por:\n{AUTHOR1}\nModificado e aprimorado por:\n{AUTHOR2}\nDiscord oficial: https://discord.gg/9H8EZYBpPF",
"drawing_skill": "Sorteando uma habilidade", "drawing_skill": "Sorteando uma habilidade",
"disabled_weapon": "Você não pode usar esta arma", "disabled_weapon": "Você não pode usar esta arma",
@ -429,7 +445,7 @@
"error_setskill": "Falha ao definir a habilidade CHATCOLORS.RED", "error_setskill": "Falha ao definir a habilidade CHATCOLORS.RED",
"for_setskill": "para", "for_setskill": "para",
"invalid_map": "Nome do mapa inválido!", "invalid_map": "Nome do mapa inserido incorretamente!",
"loading_map": "Carregando um novo mapa", "loading_map": "Carregando um novo mapa",
"pause": "Partida pausada.", "pause": "Partida pausada.",
@ -448,12 +464,12 @@
"vote_alredy_voted": "Você já votou!", "vote_alredy_voted": "Você já votou!",
"vote_vote": "Votar", "vote_vote": "Votar",
"bombsite_a": "Bombsite A", "bombsite_a": "Zona de detonação A",
"bombsite_b": "Bombsite B", "bombsite_b": "Zona de detonação B",
"bombplanted": "A bomba foi colocada\n{0} segundos até a detonação",
"teammate_skills": "Habilidades dos seus companheiros de equipe", "teammate_skills": "Habilidades dos seus companheiros de equipe",
"summary_start": "=======RESUMO=DA=ÚLTIMA=RODADA=======", "summary": "Resumo da última rodada",
"summary_end": "=======================================",
"menu_controlls_scroll": "W/S - Rolar", "menu_controlls_scroll": "W/S - Rolar",
"menu_controlls_padding": " | ", "menu_controlls_padding": " | ",

View file

@ -55,6 +55,12 @@
"c4camouflage": "C4伪装", "c4camouflage": "C4伪装",
"c4camouflage_desc": "你持有炸弹时隐形", "c4camouflage_desc": "你持有炸弹时隐形",
"carefulbullets": "谨慎的子弹",
"carefulbullets_desc": "选择一名球员,每当他投篮未中时就会受到伤害",
"carefulbullets_enemy_info": "从现在起,不准确将带来切实的伤害。",
"carefulbullets_player_info": "'{0}' 现在必须更加谨慎。",
"carefulbullets_select_info": "不准确会伤害玩家:",
"catapult": "弹射", "catapult": "弹射",
"catapult_desc": "你有随机几率将敌人向上弹射", "catapult_desc": "你有随机几率将敌人向上弹射",
"catapult_desc2": "你击中敌人将其弹射的几率是:{0}%", "catapult_desc2": "你击中敌人将其弹射的几率是:{0}%",
@ -68,6 +74,10 @@
"cutter": "切割者", "cutter": "切割者",
"cutter_desc": "用刀可立即杀死敌人", "cutter_desc": "用刀可立即杀死敌人",
"cypher": "相机",
"cypher_desc": "点击 [css_useSkill] 创建/切换摄像机",
"cypher_nospace": "相机必须与墙壁呈直角放置",
"darkness": "黑暗", "darkness": "黑暗",
"darkness_desc": "对选定的敌人施加黑暗效果", "darkness_desc": "对选定的敌人施加黑暗效果",
"darkness_enemy_info": "让灯光熄灭。", "darkness_enemy_info": "让灯光熄灭。",
@ -142,6 +152,7 @@
"gambler_desc": "从提供的列表中选择一个技能。", "gambler_desc": "从提供的列表中选择一个技能。",
"gambler_select_info": "选择你的技能:", "gambler_select_info": "选择你的技能:",
"gambler_more": "#00FF00|刷新 ${0}", "gambler_more": "#00FF00|刷新 ${0}",
"gambler_no_money": "钱不够。",
"ghost": "幽灵", "ghost": "幽灵",
"ghost_desc": "你完全隐形", "ghost_desc": "你完全隐形",
@ -175,6 +186,9 @@
"holyhandgrenade": "神圣手榴弹", "holyhandgrenade": "神圣手榴弹",
"holyhandgrenade_desc": "你的高爆手榴弹造成双倍伤害并拥有双倍范围", "holyhandgrenade_desc": "你的高爆手榴弹造成双倍伤害并拥有双倍范围",
"iana": "全息图",
"iana_desc": "点击 [css_useSkill] 可控制你的全息影像数秒",
"impostor": "冒名顶替者", "impostor": "冒名顶替者",
"impostor_desc": "回合开始时你获得敌方玩家模型", "impostor_desc": "回合开始时你获得敌方玩家模型",
@ -356,6 +370,7 @@
"silent_desc": "你的脚步和跳跃对其他玩家无声", "silent_desc": "你的脚步和跳跃对其他玩家无声",
"sniperelite": "狙击精英", "sniperelite": "狙击精英",
"sniperelite_customname": "狙击精英技能",
"sniperelite_desc": "点击 [css_useSkill] 将当前武器替换为AWP", "sniperelite_desc": "点击 [css_useSkill] 将当前武器替换为AWP",
"soldier": "士兵", "soldier": "士兵",
@ -451,10 +466,10 @@
"bombsite_a": "爆轰区A", "bombsite_a": "爆轰区A",
"bombsite_b": "爆轰区B", "bombsite_b": "爆轰区B",
"bombplanted": "炸弹已安装完毕{0}秒后引爆",
"teammate_skills": "你队友的技能", "teammate_skills": "你队友的技能",
"summary_start": "=============上一回合总结==============", "summary": "上一回合总结",
"summary_end": "=======================================",
"menu_controlls_scroll": "W/S - 滚动", "menu_controlls_scroll": "W/S - 滚动",
"menu_controlls_padding": " | ", "menu_controlls_padding": " | ",

207
readme.md
View file

@ -28,6 +28,7 @@ jRandomSkills is a plugin for CounterStrike 2 that brings chaos and fun to gamep
- **Polish** - **Polish**
- **French** [by: [@felyjyn](https://github.com/felyjyn)] - **French** [by: [@felyjyn](https://github.com/felyjyn)]
- **Portuguese (Brazilian)** [by: [@vinicius-trev](https://github.com/vinicius-trev)] - **Portuguese (Brazilian)** [by: [@vinicius-trev](https://github.com/vinicius-trev)]
- **German** [by: [@Enrory](https://github.com/Enrory)]
- **Simplified Chinese** [GrokAI / ChatGPT] - **Simplified Chinese** [GrokAI / ChatGPT]
## 🖼️ Preview ## 🖼️ Preview
@ -45,7 +46,7 @@ Join the 3v3 test server and try out the jRandomSkills plugin:
Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus.html). Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus.html).
## ✨ Current Skills (109) ## ✨ Current Skills (111)
<details> <details>
<summary>The table below lists all available skills in the game, along with their descriptions.</summary> <summary>The table below lists all available skills in the game, along with their descriptions.</summary>
@ -197,22 +198,22 @@ Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus.
| Command | Example | Description | Permissions | | Command | Example | Description | Permissions |
| - | - | - | - | | - | - | - | - |
| `!setskill <playerName/steamID> <skill>` | `!setskill Juzlus Aimbot` | Giving skill to a player | `@jRandmosSkills/admin` | | `!setskill <playerName/steamID> <skill>` | `!setskill Juzlus Aimbot` | Giving skill to a player | `@jRandomSkills/admin` |
| `!lang <IsoCode>` | `!lang en` | Change the language | - | | `!lang <IsoCode>` | `!lang en` | Change the language | - |
| `!skills` | `!skills` | List of skills | - | | `!skills` | `!skills` | List of skills | - |
| `!map <mapName>` | `!map de_nuke` | Change map | `@jRandmosSkills/admin` | | `!map <mapName>` | `!map de_nuke` | Change map | `@jRandomSkills/admin` |
| `!map <mapWorkshopId>` | `!map 3332005394` | Change map from workshop | `@jRandmosSkills/admin` | | `!map <mapWorkshopId>` | `!map 3332005394` | Change map from workshop | `@jRandomSkills/admin` |
| `!start` | `!start` | Start game with conditions: `mp_forcecamera 0, mp_freezetime 15, mp_overtime_enable 1, sv_cheats 0` | `@jRandmosSkills/admin` | | `!start` | `!start` | Start game with conditions: `mp_forcecamera 0, mp_freezetime 15, mp_overtime_enable 1, sv_cheats 0` | `@jRandomSkills/admin` |
| `!start sv` | `!start sv` | Start the game with conditions: `mp_forcecamera 0, mp_freezetime 0, mp_overtime_enable 1, sv_cheats 1` | `@jRandmosSkills/admin` | | `!start sv` | `!start sv` | Start the game with conditions: `mp_forcecamera 0, mp_freezetime 0, mp_overtime_enable 1, sv_cheats 1` | `@jRandomSkills/admin` |
| `!console <command>` | `!console sv_cheats 1` | Run a command on the server | `@jRandmosSkills/owner` | | `!console <command>` | `!console sv_cheats 1` | Run a command on the server | `@jRandomSkills/owner` |
| `!swap` | `!swap` | Switch sides | `@jRandmosSkills/admin` | | `!swap` | `!swap` | Switch sides | `@jRandomSkills/admin` |
| `!shuffle` | `!shuffle` | Randomly assign players to teams | `@jRandmosSkills/admin` | | `!shuffle` | `!shuffle` | Randomly assign players to teams | `@jRandomSkills/admin` |
| `!pause` | `!pause` | Pause the game | `@jRandmosSkills/admin` | | `!pause` | `!pause` | Pause the game | `@jRandomSkills/admin` |
| `!heal` | `!heal` | Restore 100 health points | `@jRandmosSkills/admin` | | `!heal` | `!heal` | Restore 100 health points | `@jRandomSkills/admin` |
| `!hud` | `!hud` | Enable/Disable hud | - | | `!hud` | `!hud` | Enable/Disable hud | - |
| `!setscore <CT> <TT>` | `!setscore 10 7` | Set the game score | `@jRandmosSkills/owner` | | `!setscore <CT> <TT>` | `!setscore 10 7` | Set the game score | `@jRandomSkills/owner` |
| `!setstaticskill <playerName/steamID> <skill>` | `!setstaticskill Juzlus Aimbot` | Giving a player a permanent skill | `@jRandmosSkills/admin` | | `!setstaticskill <playerName/steamID> <skill>` | `!setstaticskill Juzlus Aimbot` | Giving a player a permanent skill | `@jRandomSkills/admin` |
| `!setstaticskill <playerName/steamID> None` | `!setstaticskill Juzlus None` | Back to normal | `@jRandmosSkills/admin` | | `!setstaticskill <playerName/steamID> None` | `!setstaticskill Juzlus None` | Back to normal | `@jRandomSkills/admin` |
| `!reload` | `!reload` | Reload translations | - | | `!reload` | `!reload` | Reload translations | - |
_Most commands require permissions, which must be set in the file: `game/csgo/addons/counterstrikesharp/configs/admins.json`_ _Most commands require permissions, which must be set in the file: `game/csgo/addons/counterstrikesharp/configs/admins.json`_
@ -226,7 +227,7 @@ To grant administrative permissions in CounterStrikeSharp:
{ {
"Juzlus": { "Juzlus": {
"identity": "STEAM_0:0:94913632", "identity": "STEAM_0:0:94913632",
"flags": ["@jRandmosSkills/admin", "@jRandmosSkills/owner"] "flags": ["@jRandomSkills/admin", "@jRandomSkills/owner"]
} }
} }
``` ```
@ -245,11 +246,13 @@ All skills can be customized in the **`config.cfg`** / **`skillsInfo.json`** fil
// 1 - Same skills for the whole team // 1 - Same skills for the whole team
// 2 - Same skills for all players // 2 - Same skills for all players
// 3 - Random skills for each player (It can't be the same until the map changes) // 3 - Random skills for each player (It can't be the same until the map changes)
// 4 - Debug: Skills are assigned in turn // 4 - Full Random: Random skills for each player
// 5 - Debug: Skills are assigned in turn
"YourSkillChatInfo": true, // Show your skill in chat
"KillerSkillInfo": true, // Show killer's skill in chat "KillerSkillInfo": true, // Show killer's skill in chat
"TeamMateSkillInfo": true, // Show allies' skills in chat "TeamMateSkillInfo": true, // Show allies' skills in chat
"SummaryAfterTheRound": true, // Show summary of the last round "SummaryAfterTheRound": true, // Show summary of the last round
"DebugMode": true, // Write activity to the ‘Debug’ folder "DebugMode": false, // Write activity to the ‘Debug’ folder
"AlternativeSkillButton": null, // Possible buttons: "AlternativeSkillButton": null, // Possible buttons:
// null, "Attack", "Jump", "Duck", "Forward", "Back", // null, "Attack", "Jump", "Duck", "Forward", "Back",
// "Use", "Cancel", "Left", "Right", "Moveleft", // "Use", "Cancel", "Left", "Right", "Moveleft",
@ -259,18 +262,21 @@ All skills can be customized in the **`config.cfg`** / **`skillsInfo.json`** fil
// "Attack3", "Scoreboard", "Inspect" // "Attack3", "Scoreboard", "Inspect"
"SkillTimeBeforeStart": 7.0, // How many seconds before freeze time ends should skills "SkillTimeBeforeStart": 7.0, // How many seconds before freeze time ends should skills
// drawing be completed? (freezetime - SkillTimeBeforeStart) // drawing be completed? (freezetime - SkillTimeBeforeStart)
"SkillDescriptionDuration": 7.0, // How long should the skill description be visible for? "SkillHudDuration": 999.0, // How long should the HUD be visible for?
"SkillDescriptionDuration": 999, // How long should the skill description be visible for?
"DisplayAlwaysDescription":false,// Always display skill description (SkillDescriptionDuration = 9999) "DisplayAlwaysDescription":false,// Always display skill description (SkillDescriptionDuration = 9999)
"DisableSpectateHUD": false, // Disable HTML HUD when spectating "DisableSpectateHUD": false, // Disable HTML HUD when spectating
"FlashingHtmlHudFix": true, // Enable FlashingHtmlHudFix "FlashingHtmlHudFix": true, // Enable FlashingHtmlHudFix
"CS2TraceRayDebug": false, // Enable trail visibility for 'Long Knife', 'Long Zeus' "CS2TraceRayDebug": false, // Enable trail visibility for 'Long Knife', 'Long Zeus'
"DisableHUDOnDeathPermission": "@jRandmosSkills/death", // Disable the HUD after death for players with this permission "DisableHUDOnDeathPermission": "@jRandomSkills/death", // Disable the HUD after death for players with this permission
"DisableSkillsOnRoundEnd": false,// Disable all skills at the end of the round (when the summary is visible) "DisableSkillsOnRoundEnd": false,// Disable all skills at the end of the round (when the summary is visible)
"LanguageSystem": { "LanguageSystem": {
"DefaultLangCode": "en", // Default language: en, pl, fr, pt-br, zh "DefaultLangCode": "en", // Default language: en, pl, fr, pt-br, zh
"DisableGeoLite": false, // Disable player language search by geolocation GeoLite2 (MaxMind) "DisableGeoLite": false, // Disable player language search by geolocation GeoLite2 (MaxMind)
"LanguageInfos": [...] // Setting to change ISO languages to translations "LanguageInfos": [...] // Setting to change ISO languages to translations
}, },
"HtmlHudCustomisation": { // Settings for changing colours and font sizes "HtmlHudCustomisation": { // Settings for changing colours and font sizes
... // xxxl: 64px, xxl: 40px, xl: 32px ... // xxxl: 64px, xxl: 40px, xl: 32px
} // l: 24px, ml: 20px, m: 18px } // l: 24px, ml: 20px, m: 18px
@ -304,7 +310,7 @@ All skills can be customized in the **`config.cfg`** / **`skillsInfo.json`** fil
} }
``` ```
## 🔗 Dependency Includes ## 🔗 Credits
This plugin uses content from the following projects: This plugin uses content from the following projects:
- [dRandomSkills](https://github.com/jakubbartosik/dRandomSkills) by [Jakub Bartosik (D3X)](https://github.com/jakubbartosik) - random skills system - [dRandomSkills](https://github.com/jakubbartosik/dRandomSkills) by [Jakub Bartosik (D3X)](https://github.com/jakubbartosik) - random skills system
- [CS2TraceRay](https://github.com/schwarper/CS2TraceRay) by [schwarper](https://github.com/schwarper) - Trace Ray system - [CS2TraceRay](https://github.com/schwarper/CS2TraceRay) by [schwarper](https://github.com/schwarper) - Trace Ray system
@ -316,8 +322,165 @@ This plugin uses content from the following projects:
## 📋 Changelog ## 📋 Changelog
<summary><b>v1.10.0</b></summary>
- #### General:
</details>
<details> <details>
<summary><b>v1.1.9 BETA</b></summary> <summary><b>v1.1.9f</b></summary>
- #### General:
- ###### Updated dependencies to the latest version (CSS v1.0.361).
- ###### Updated WSADMenu compatibility to the latest CSS version.
- #### Skill improvements:
- ###### Earthquake:
- ###### Temporarily disabled.
- ###### Cypher:
- ###### Temporarily disabled.
- ###### Improved camera setup.
- ###### Iana:
- ###### Temporarily disabled.
- ###### Replica can now receive headshot damage.
- ###### Toxic Smoke:
- ###### Changed distance calculation for triggers.
</details>
<details>
<summary><b>v1.1.9e</b></summary>
- #### General:
- ###### Improved display of text frame / content.
- ###### Added customisation options for chat message appearance.
</details>
<details>
<summary><b>v1.1.9d</b></summary>
- #### General:
- ###### Updated the appearance of chat messages.
- #### Skill improvements:
- ###### C4Camouflage:
- ###### Ghost:
- ###### Ninja:
- ###### Now the entire model is hidden instead of just the weapon and setting the model's transparency.
- ###### ReZombie:
- ###### Increased zombie health from 200 HP to 250 HP.
- ###### Replicator:
- ###### ncreased damage dealt by replicas: Your team: 10 HP; Enemy team: 20 HP
- ###### Added the option to customize replica damage in `skillsInfo.json`.
- ###### ToxicSmoke:
- ###### Skill temporarily disabled to test trigger logic.
- ###### Watchmaker:
- ###### Reduced time change from 10 seconds to 7 seconds.
- #### New skills:
- ###### Cypher:
- ###### Click [css_useSkill] to place a camera where you are aiming.
- ###### Iana:
- ###### Click [css_useSkill] to control a clone for 10 seconds (the clone cannot shoot).
</details>
<details>
<summary><b>v1.1.9c</b></summary>
- #### General:
- ###### Updated dependency to the latest version.
- ###### Added a new game mode, ‘FullRandom,’ which randomly assigns skills each round (skills may be repeated).
- ###### Added the `requiredPermission` option to every skill config, defining the permission required for a player to receive that skill.
- #### Skill improvements:
- ###### Gambler:
- ###### Added text notification when the player has no money.
- ###### Darkness:
- ###### Removed the old post-processing logic (did not work on every map).
- ###### Added UTIL_ScreenFade for a more reliable and consistent darkness effect.
- ###### Distancer:
- ###### Limited the maximum display distance to 3000 units.
- ###### Fortnite:
- ###### mproved the placement angle of barricades.
- ###### Jackal:
- ###### Reworked the bean trail logic to a particle system for better performance.
- ###### Poison:
- ###### Slightly increased the poison tick speed.
- ###### Added a minimum health threshold (30 HP) below which poison no longer works (configurable).
- ###### Spectator:
- ###### Fixed an issue with the camera after death.
</details>
<details>
<summary><b>v1.1.9b</b></summary>
- #### General:
- ###### Updated dependency to the latest version.
- ###### Fixed an issue with empty permissions for commands.
- ###### Added `SkillHudExpired` option to the config file that controls how long (in seconds) the central HUD is visible.
- ###### Added logic for trigger enter / exit handling.
- ###### Automatic case adjustment for the `AlternativeSkillButton` option in the config.
- ###### Fixed an issue with automatic language detection.
- ###### Attempt to fix model resizing issue.
- #### Skill improvements:
- ###### Bankrupt:
- ###### Darkness:
- ###### Deactivator:
- ###### Deaf:
- ###### Glitch:
- ###### Jammer:
- ###### JumpBan:
- ###### LifeSwap:
- ###### Magnifier:
- ###### MoneySwap:
- ###### Poison:
- ###### PrimaryBan:
- ###### Thief:
- ###### Fixed message being shown in the other player's language.
- ###### C4Camouflage:
- ###### Ghost:
- ###### Glaz:
- ###### Jackal:
- ###### Ninja:
- ###### Wallhack:
- ###### Possible fix for missing entity when showing the entity again.
- ###### AreaReaper:
- ###### Fixed incorrect bomb placement order.
- ###### C4Camouflage:
- ###### Possible fix for missing entity when showing the entity again.
- ###### Gambler:
- ###### Fixed issue where players could reroll their skill even without money.
- ###### SoundMaker:
- ###### Added separate sounds for both teams (configurable).
- ###### ToxicSmoke:
- ###### Updated logic to use triggers (offset not found for Windows system).
- ###### Watchmaker:
- ###### Added a sound when the time updates (configurable).
</details>
<details>
<summary><b>v1.1.9a</b></summary>
- #### General: - #### General:
- ###### Update the dependency to the latest version. - ###### Update the dependency to the latest version.
@ -345,7 +508,7 @@ This plugin uses content from the following projects:
- #### General: - #### General:
- ###### Added `DisableHUDOnDeathPermission` options to the config, to disable the HUD after death for players with this specific permission. - ###### Added `DisableHUDOnDeathPermission` options to the config, to disable the HUD after death for players with this specific permission.
- ###### Added `DisableSkillsOnRoundEnd` option to the config, to disable all skills at the end of the round (when the summary is visible). - ###### Added `DisableSkillsOnRoundEnd` option to the config, to disable all skills at the end of the round (when the summary is visible).
- ###### The permission `@jRandmosSkills/root` has been changed to `@jRandmosSkills/owner` to prevent domain issues. - ###### The permission `@jRandomSkills/root` has been changed to `@jRandomSkills/owner` to prevent domain issues.
- ###### Added `!hud` command to toggle the HUD on/off (When the HUD is off, the WSAD Menu will not appear). - ###### Added `!hud` command to toggle the HUD on/off (When the HUD is off, the WSAD Menu will not appear).
- ###### Disabling first skill if two skills are drawn during the first round. - ###### Disabling first skill if two skills are drawn during the first round.
- ###### The `!reload` command also refreshes the skill activity status. - ###### The `!reload` command also refreshes the skill activity status.