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>
//------------------------------------------------------------------------------
namespace src.player.skills.Properties {
namespace jRandomSkills.Properties {
using System;

View file

@ -14,14 +14,14 @@
</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="MaxMind.Db" Version="4.3.4" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\WASDMenuAPI - SRC Files\WASDMenuAPI.csproj" />
<ProjectReference Include="..\..\..\source\repos\WASDMenuAPI-master\WASDMenuAPI\WASDMenuAPI.csproj" />
</ItemGroup>
<ItemGroup>

View file

@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.9.34728.123
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
Global
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}.Release|Any CPU.ActiveCfg = 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
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View file

@ -78,6 +78,9 @@ namespace src.command
if (playerPawn?.CBodyComponent == null) return;
if (!player.IsValid || !player.PawnIsAlive) return;
if (SkillsInfo.GetValue<bool>(playerInfo.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime())
return;
string[] commands = _.ArgString.Trim().Split(" ", StringSplitOptions.RemoveEmptyEntries);
Debug.WriteToDebug($"Player {player.PlayerName} used the skill: {playerInfo.Skill}");
if (commands == null || commands.Length == 0)
@ -464,14 +467,12 @@ namespace src.command
if (player == null || !player.IsValid) 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();
foreach (var langInfo in Config.LoadedConfig.LanguageSystem.LanguageInfos)
if (langInfo.IsoCodes.Contains(newLangCode))
fileName = langInfo.FileName;
if (!Localization.HasTranslation(newLangCode))
fileName = Config.LoadedConfig.LanguageSystem.DefaultLangCode;
else
if (Localization.HasTranslation(newLangCode))
fileName = newLangCode.ToLower();
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 ModuleAuthor => "D3X, Juzlus";
public override string ModuleDescription => "Plugin adds random skills every round for CS2 by D3X. Modified by Juzlus.";
public override string ModuleVersion => "1.1.9f";
public override string ModuleVersion => "1.10.0";
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_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_desc": "You have a random chance to launch an enemy upwards",
"catapult_desc2": "Your chance to launch an enemy on hit is: {0}%",
@ -68,6 +74,10 @@
"cutter": "Cutter",
"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_desc": "Applies a darkness effect to a chosen enemy",
"darkness_enemy_info": "Let the lights go out.",
@ -176,6 +186,9 @@
"holyhandgrenade": "Holy Hand Grenade",
"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_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",
"sniperelite": "Sniper Elite",
"sniperelite_customname": "Sniper Elite Skill",
"sniperelite_desc": "Click [css_useSkill] to swap your current weapon for an AWP",
"soldier": "Soldier",
@ -452,6 +466,7 @@
"bombsite_a": "Bombsite A",
"bombsite_b": "Bombsite B",
"bombplanted": "The bomb has been planted\n{0} seconds till detonation",
"teammate_skills": "Your teammates' skills",
"summary": "Summary of the last round",

View file

@ -55,6 +55,12 @@
"c4camouflage": "Camouflage C4",
"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_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}%",
@ -68,6 +74,10 @@
"cutter": "Trancheur",
"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_desc": "Applique un effet d’obscurité à un ennemi choisi",
"darkness_enemy_info": "Que la lumière s’éteigne.",
@ -176,6 +186,9 @@
"holyhandgrenade": "Grenade Sacré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_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",
"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",
"soldier": "Soldat",
@ -452,10 +466,10 @@
"bombsite_a": "Site de bombe A",
"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",
"summary_start": "Résumé du dernier round",
"summary_end": "===================================",
"summary": "Résumé du dernier round",
"menu_controlls_scroll": "W/S - Défilement",
"menu_controlls_padding": " | ",

View file

@ -55,6 +55,12 @@
"c4camouflage": "C4 Kamuflaż",
"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_desc": "Masz losową szanse na podrzucenie wroga",
"catapult_desc2": "Twoje szanse na podrzucenie wroga po trafieniu to: {0}%",
@ -68,6 +74,10 @@
"cutter": "Scyzoryk",
"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_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi",
"darkness_enemy_info": "Niech zgasną światła.",
@ -176,6 +186,9 @@
"holyhandgrenade": "Święty Granat Ręczny",
"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_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",
"sniperelite": "SzeliS",
"sniperelite_customname": "Mityczna AWP",
"sniperelite_desc": "Kliknij [css_useSkill], aby zamienić aktualną broń na AWP",
"soldier": "Żołnierz",
@ -452,10 +466,10 @@
"bombsite_a": "Strefa detonacji A",
"bombsite_b": "Strefa detonacji B",
"bombplanted": "Bomba została podłożona\n{0} sekund do detonacji",
"teammate_skills": "Supermoce twoich sojuszników",
"summary_start": "Podsumowanie z ostatniej rundy",
"summary_end": "============================================",
"summary": "Podsumowanie z ostatniej rundy",
"menu_controlls_scroll": "W/S – Przewijanie",
"menu_controlls_padding": " | ",

View file

@ -55,6 +55,12 @@
"c4camouflage": "Camuflagem C4",
"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_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}%",
@ -68,6 +74,10 @@
"cutter": "Cortador",
"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_desc": "Aplica um efeito de escuridão a um inimigo escolhido",
"darkness_enemy_info": "Que as luzes se apaguem.",
@ -176,6 +186,9 @@
"holyhandgrenade": "Granada Sagrada",
"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_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",
"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",
"soldier": "Soldado",
@ -452,10 +466,10 @@
"bombsite_a": "Zona de detonação A",
"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",
"summary_start": "Resumo da última rodada",
"summary_end": "=======================================",
"summary": "Resumo da última rodada",
"menu_controlls_scroll": "W/S - Rolar",
"menu_controlls_padding": " | ",

View file

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

View file

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

View file

@ -3,6 +3,7 @@ using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes;
using CounterStrikeSharp.API.Modules.Admin;
using CounterStrikeSharp.API.Modules.Cvars;
using CounterStrikeSharp.API.Modules.Events;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.UserMessages;
@ -11,7 +12,6 @@ using src.utils;
using System.Collections.Concurrent;
using static CounterStrikeSharp.API.Core.Listeners;
using static src.jRandomSkills;
using static System.Net.Mime.MediaTypeNames;
namespace src.player
{
@ -38,6 +38,7 @@ namespace src.player
{
Instance.RegisterEventHandler<EventPlayerConnectFull>(PlayerConnectFull);
Instance.RegisterEventHandler<EventPlayerDisconnect>(PlayerDisconnect);
// Instance.RegisterEventHandler<EventPlayerChat>(PlayerChat);
Instance.RegisterEventHandler<EventRoundStart>(RoundStart);
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)
{
lock (setLock)
@ -398,7 +432,10 @@ namespace src.player
lock (setLock)
{
isTransmitRegistered = false;
Instance.AddTimer(.1f, () => DisableAll());
Instance.AddTimer(.1f, () => {
DisableAll();
ConVar.Find("sv_legacy_jump")?.SetValue("1");
});
Instance.RemoveListener<CheckTransmit>(CheckTransmit);
playersSkills.Clear();
staticSkills.Clear();

View file

@ -23,19 +23,7 @@ namespace src.player.skills
if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == victim?.SteamID);
if (playerInfo?.Skill == skillName && hitgroup == (int)HitGroup_t.HITGROUP_HEAD)
ApplyIronHeadEffect(victim!, @event.DmgHealth);
}
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;
SkillUtils.RestoreHealth(victim);
}
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")
return;
RestoreHealth(victim, damage);
}
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");
SkillUtils.RestoreHealth(victim);
}
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.Modules.Utils;
using src.utils;
using System.Collections.Concurrent;
using static src.jRandomSkills;
namespace src.player.skills
@ -9,6 +10,7 @@ namespace src.player.skills
public class BunnyHop : ISkill
{
private const Skills skillName = Skills.BunnyHop;
private static readonly ConcurrentDictionary<ulong, int> playersLastJump = [];
public static void LoadSkill()
{
@ -34,7 +36,13 @@ namespace src.player.skills
var flags = (PlayerFlags)playerPawn.Flags;
var buttons = player.Buttons;
if (buttons.HasFlag(PlayerButtons.Jump) && flags.HasFlag(PlayerFlags.FL_ONGROUND) && !playerPawn.MoveType.HasFlag(MoveType_t.MOVETYPE_LADDER))
if ((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");
var maxSpeed = SkillsInfo.GetValue<float>(skillName, "maxSpeed");

View file

@ -61,7 +61,7 @@ namespace src.player.skills
{
foreach (var (info, player) in infoList)
{
if (player == null) continue;
if (player == null || !player.IsValid) continue;
foreach (var _player in invisiblePlayers.Keys)
if (player.SteamID != _player.SteamID)
{
@ -72,8 +72,9 @@ namespace src.player.skills
if (entity == null || !entity.IsValid) continue;
info.TransmitEntities.Remove(entity.Index);
var bombIndex = HideBomb(_player);
var bombIndex = GetBombIndex();
if (bombIndex == null) continue;
var bombEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)bombIndex);
if (bombEntity == null || !bombEntity.IsValid) continue;
info.TransmitEntities.Remove(bombEntity.Index);
@ -124,7 +125,7 @@ namespace src.player.skills
particle.AcceptInput("Start");
}
private static uint? HideBomb(CCSPlayerController player)
private static uint? GetBombIndex()
{
var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList();
if (bombEntities.Count == 0) return null;
@ -132,15 +133,6 @@ namespace src.player.skills
var bomb = bombEntities.FirstOrDefault();
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;
}

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.Core;
using CounterStrikeSharp.API.Modules.Entities;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Timers;
using CounterStrikeSharp.API.Modules.Utils;
using CS2TraceRay.Class;
using CS2TraceRay.Struct;
@ -10,6 +9,7 @@ using src.utils;
using System.Collections.Concurrent;
using System.Drawing;
using System.Numerics;
using Timer = CounterStrikeSharp.API.Modules.Timers.Timer;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
namespace src.player.skills
@ -25,7 +25,7 @@ namespace src.player.skills
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(cameraViewModel);
}
@ -56,7 +56,9 @@ namespace src.player.skills
CameraView = null,
CameraActive = false,
NextCamera = 0,
NoSpace = 0,
PlayerCameraRaw = player.PlayerPawn.Value.CameraServices.ViewEntity.Raw,
LastAngle = QAngle.Zero
});
}
@ -85,6 +87,7 @@ namespace src.player.skills
playerSkill.CameraProp.AcceptInput("Kill");
playerSkill.CameraProp = null;
}
playerSkill.NextCamera = Server.TickCount + SkillsInfo.GetValue<float>(skillName, "Cooldown") * 64;
}
public static void OnTick()
@ -114,8 +117,13 @@ namespace src.player.skills
{
if (player.NextCamera > Server.TickCount) return;
player.CameraProp = CreateCameraProp(player.Player);
if (player.CameraProp == null)
{
player.NoSpace = Server.TickCount + (64 * 2);
return;
}
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;
@ -123,13 +131,52 @@ namespace src.player.skills
return;
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)
{
pawn!.CameraServices!.ViewEntity.Raw = player.CameraView.EntityHandle.Raw;
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)
@ -140,7 +187,6 @@ namespace src.player.skills
camera.Collision.SolidType = SolidType_t.SOLID_VPHYSICS;
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.DispatchSpawn();
var playerPawn = player.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) return null;
@ -150,10 +196,14 @@ namespace src.player.skills
if (cameraVector == null) return null;
cameraVector = new Vector(cameraVector.X + diffVector.X, cameraVector.Y + diffVector.Y, cameraVector.Z);
if (!CheckCameraPosition(cameraVector, player))
return null;
Server.NextFrame(() =>
{
camera.SetModel(cameraPropModel);
camera.Teleport(cameraVector, new QAngle(0, playerPawn.V_angle.Y + 180, 0));
camera.DispatchSpawn();
});
return camera;
@ -163,7 +213,6 @@ namespace src.player.skills
{
var camera = Utilities.CreateEntityByName<CDynamicProp>("prop_dynamic");
if (camera == null || !camera.IsValid) return null;
camera.DispatchSpawn();
var playerPawn = player.PlayerPawn.Value;
if (playerPawn == null || !playerPawn.IsValid) return null;
@ -172,14 +221,15 @@ namespace src.player.skills
Vector diffVector = SkillUtils.GetForwardVector(playerPawn.V_angle) * 25;
if (cameraVector == null) return null;
cameraVector = new Vector(cameraVector.X - diffVector.X, cameraVector.Y - diffVector.Y, cameraVector.Z);
if (cameraVector == null) return null;
Server.NextFrame(() =>
{
camera.SetModel(cameraViewModel);
camera.Render = Color.FromArgb(0, 255, 255, 255);
camera.Teleport(cameraVector, playerPawn.EyeAngles);
camera.DispatchSpawn();
});
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;
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 endPos = eyePos + SkillUtils.GetForwardVector(playerPawn.V_angle) * 4096f;
Ray ray = new(Vector3.Zero);
CTraceFilter filter = new(playerPawn.Index, playerPawn.Index)
{
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
};
ulong solid = 0x1;
ulong window = 0x1000;
ulong passBullets = 0x2000;
filter.m_nHierarchyIds[0] = playerPawn.GetHierarchyId();
filter.m_nHierarchyIds[1] = 0;
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
ulong mask = solid | window | passBullets;
ulong contents = playerPawn.Collision.CollisionGroup;
CGameTrace trace = TraceRay.TraceShape(eyePos, endPos, mask, contents, player);
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;
}
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)
{
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);
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;
else if (playerSkill?.CameraProp == null)
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 bool CameraActive { 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)

View file

@ -5,6 +5,7 @@ using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
using System.Collections.Concurrent;
using static src.jRandomSkills;
using Timer = CounterStrikeSharp.API.Modules.Timers.Timer;
namespace src.player.skills
{
@ -111,34 +112,32 @@ namespace src.player.skills
private static void SetUpPostProcessing(CCSPlayerController player, bool turnOff = false)
{
if (player == null || !player.IsValid) return;
var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return;
ulong playerSteamID = player.SteamID;
lock (setLock)
{
if (!turnOff)
{
playersInDark.TryAdd(player.SteamID, 0);
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);
playersInDark.TryAdd(playerSteamID, 0);
ApplyColor(player);
Instance.AddTimer(2.5f, () => {
if (!playersInDark.ContainsKey(player.SteamID))
Timer? darkTimer = null;
darkTimer = Instance.AddTimer(5f, () => {
if (!playersInDark.ContainsKey(playerSteamID))
{
darkTimer?.Kill();
return;
}
if (player.IsValid && player.PawnIsAlive)
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);
var target = Utilities.GetPlayerFromSteamId(playerSteamID);
if (target == null || !target.IsValid)
{
darkTimer?.Kill();
return;
}
if (target.PawnIsAlive)
ApplyColor(player);
}, TimerFlags.STOP_ON_MAPCHANGE | TimerFlags.REPEAT);
}
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 int R { get; set; } = r;

View file

@ -2,6 +2,7 @@
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
using System.Collections.Concurrent;
using static src.jRandomSkills;
namespace src.player.skills
@ -9,15 +10,22 @@ namespace src.player.skills
public class Dash : ISkill
{
private const Skills skillName = Skills.Dash;
private static readonly PlayerFlags[] LF = new PlayerFlags[64];
private static readonly int?[] J = new int?[64];
private static readonly PlayerButtons[] LB = new PlayerButtons[64];
private static readonly ConcurrentDictionary<ulong, PlayerSkillInfo> SkillPlayerInfo = [];
private static readonly object setLock = new();
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
}
public static void NewRound()
{
lock (setLock)
{
SkillPlayerInfo.Clear();
}
}
public static void OnTick()
{
foreach (var player in Utilities.GetPlayers())
@ -25,11 +33,55 @@ namespace src.player.skills
if (!Instance.IsPlayerValid(player)) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
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;
if (playerPawn == null || !playerPawn.IsValid) return;
@ -37,24 +89,34 @@ namespace src.player.skills
var flags = (PlayerFlags)playerPawn.Flags;
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);
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)
{
}
else if ((flags & PlayerFlags.FL_ONGROUND) != 0)
bool lastJumpPressed = (skillInfo.LastButtons & PlayerButtons.Jump) != 0;
if (!lastJumpPressed && skillInfo.CanUse)
{
J[player.Slot] = 0;
}
else if ((LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0 && J[player.Slot] < 1)
{
J[player.Slot]++;
skillInfo.Jumps++;
skillInfo.CanUse = false;
skillInfo.Cooldown = DateTime.Now;
float moveX = 0;
float moveY = 0;
PlayerButtons playerButtons = player.Buttons;
if (SkillsInfo.GetValue<bool>(skillName, "anyDirection"))
{
if (playerButtons.HasFlag(PlayerButtons.Forward))
moveY += 1;
if (playerButtons.HasFlag(PlayerButtons.Back))
@ -66,6 +128,9 @@ namespace src.player.skills
if (moveX == 0 && moveY == 0)
moveY = 1;
}
else
moveY = 1;
float moveAngle = MathF.Atan2(moveX, moveY) * (180f / MathF.PI);
QAngle dashAngles = new(0, playerPawn.EyeAngles.Y + moveAngle, 0);
@ -77,15 +142,28 @@ namespace src.player.skills
playerPawn.AbsVelocity.Y = newVelocity.Y;
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 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;
info.TransmitEntities.Remove(entity.Index);
var bombIndex = HideBomb(_player);
var bombIndex = GetBombIndex(_player);
if (bombIndex == null) continue;
var bombEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)bombIndex);
if (bombEntity == null || !bombEntity.IsValid) continue;
@ -170,7 +170,7 @@ namespace src.player.skills
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();
if (bombEntities.Count == 0) return null;
@ -179,14 +179,6 @@ namespace src.player.skills
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;
}

View file

@ -72,7 +72,7 @@ namespace src.player.skills
{
foreach (Vector smokePos in smokes.Keys)
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 (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= SkillsInfo.GetValue<float>(skillName, "smokeRadius"))
AddHealth(player.PlayerPawn.Value, SkillsInfo.GetValue<int>(skillName, "smokeHeal"));

View file

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

View file

@ -34,23 +34,31 @@ namespace src.player.skills
{
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)
{
var enemy = param.Key;
var step = param.Value;
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);
if (step == null || !step.IsValid) continue;
var entity = Utilities.GetEntityFromIndex<CBaseEntity>((int)step.Index);
if (entity == null || !entity.IsValid) continue;
if (playerInfo?.Skill != skillName && observerInfo?.Skill != skillName)
info.TransmitEntities.Remove(entity.Index);
else if (enemy.Team == player.Team)
if (!hasSkill || enemy.Team == player.Team)
info.TransmitEntities.Remove(entity.Index);
}
}

View file

@ -50,25 +50,13 @@ namespace src.player.skills
if (!Instance.IsPlayerValid(attacker))
{
if (victimInfo?.Skill == skillName)
RestoreHealth(victim!, @event.DmgHealth);
SkillUtils.RestoreHealth(victim);
return;
}
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
if (attackerInfo?.Skill == skillName || victimInfo?.Skill == skillName)
RestoreHealth(victim!, @event.DmgHealth);
}
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;
SkillUtils.RestoreHealth(victim);
}
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 src.utils;
using static src.jRandomSkills;

View file

@ -1,6 +1,5 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Utils;
using CS2TraceRay.Class;
@ -9,7 +8,6 @@ using CS2TraceRay.Struct;
using src.utils;
using System.Collections.Concurrent;
using System.Drawing;
using System.Numerics;
using static src.jRandomSkills;
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 MemoryFunctionVoid<IntPtr, short> Shoot_Secondary = new(GameData.GetSignature("Shoot_Secondary"));
private static int i = 0;
public static void LoadSkill()
{
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 endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * SkillsInfo.GetValue<float>(skillName, "maxDistance");
Ray ray = new(Vector3.Zero);
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();
filter.m_nHierarchyIds[1] = 0;
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
ulong hitboxes = 0x2;
ulong mask = pawn.Collision.CollisionAttribute.InteractsWith | hitboxes;
ulong contents = pawn.Collision.CollisionGroup;
CGameTrace trace = TraceRay.TraceShape(eyePos, endPos, mask, contents, player);
if (Config.LoadedConfig.CS2TraceRayDebug)
{
@ -126,12 +114,17 @@ namespace src.player.skills
if (trace.DidHit())
{
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
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)
return;

View file

@ -7,7 +7,6 @@ using CS2TraceRay.Enum;
using CS2TraceRay.Struct;
using src.utils;
using System.Drawing;
using System.Numerics;
using static src.jRandomSkills;
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 endPos = eyePos + SkillUtils.GetForwardVector(pawn.EyeAngles) * SkillsInfo.GetValue<float>(skillName, "maxDistance");
Ray ray = new(Vector3.Zero);
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();
filter.m_nHierarchyIds[1] = 0;
CGameTrace trace = TraceRay.TraceHull(eyePos, endPos, filter, ray);
ulong hitboxes = 0x2;
ulong mask = pawn.Collision.CollisionAttribute.InteractsWith | hitboxes;
ulong contents = pawn.Collision.CollisionGroup;
CGameTrace trace = TraceRay.TraceShape(eyePos, endPos, mask, contents, player);
if (Config.LoadedConfig.CS2TraceRayDebug)
{
@ -65,10 +52,10 @@ namespace src.player.skills
if (trace.DidHit())
{
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
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)

View file

@ -68,7 +68,7 @@ namespace src.player.skills
if (entity == null || !entity.IsValid) continue;
info.TransmitEntities.Remove(entity.Index);
var bombIndex = HideBomb(_player);
var bombIndex = GetBombIndex(_player);
if (bombIndex == null) continue;
var bombEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)bombIndex);
if (bombEntity == null || !bombEntity.IsValid) continue;
@ -170,7 +170,7 @@ namespace src.player.skills
particle.AcceptInput("Start");
}
private static uint? HideBomb(CCSPlayerController player)
private static uint? GetBombIndex(CCSPlayerController player)
{
var bombEntities = Utilities.FindAllEntitiesByDesignerName<CC4>("weapon_c4").ToList();
if (bombEntities.Count == 0) return null;
@ -179,14 +179,6 @@ namespace src.player.skills
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;
}

View file

@ -1,4 +1,5 @@
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
using static src.jRandomSkills;
@ -24,8 +25,8 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player?.SteamID);
if (playerInfo?.Skill != skillName) return;
if (weapon == "hegrenade" || weapon == "inferno")
SkillUtils.AddHealth(player!.PlayerPawn.Value, damage);
if (weapon == "hegrenade" || weapon == "inferno" || weapon == "decoy" || weapon == "flashbang" || weapon == "smokegrenade" || weapon == "molotov")
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)

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];
if (hitgroup != HitGroup_t.HITGROUP_HEAD)
RestoreHealth(victim!, damage);
}
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");
SkillUtils.RestoreHealth(victim);
}
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 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);
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)
{
//J[player.Slot] ++;
}
else if ((flags & PlayerFlags.FL_ONGROUND) != 0)
{
bool isOnGround = (flags & PlayerFlags.FL_ONGROUND) != 0;
if (isOnGround)
J[player.Slot] = 0;
}
else if ((LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0 && J[player.Slot] < playerInfo.SkillChance)
else if (jumpPressed && J[player.Slot] < playerInfo.SkillChance + 1)
{
J[player.Slot]++;
playerPawn.AbsVelocity.Z = 300;

View file

@ -27,6 +27,8 @@ namespace src.player.skills
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
if (plantedBomb != null)
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)

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];
if (disabledHitbox.Contains(hitgroup))
RestoreHealth(victim!, damage);
}
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");
SkillUtils.RestoreHealth(victim);
}
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);
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)
@ -34,19 +35,6 @@ namespace src.player.skills
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 float RegenerationMultiplier { get; set; } = regenerationMultiplier;

View file

@ -1,14 +1,11 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Timers;
using CounterStrikeSharp.API.Modules.Utils;
using CS2TraceRay.Class;
using CS2TraceRay.Struct;
using src.utils;
using System.Collections.Concurrent;
using System.Numerics;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
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);
endPos.Z += 25;
Ray ray = new(Vector3.Zero);
CTraceFilter filter = new(playerPawn.Index, playerPawn.Index)
{
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);
ulong mask = playerPawn.Collision.CollisionAttribute.InteractsWith;
ulong contents = playerPawn.Collision.CollisionGroup;
CGameTrace trace = TraceRay.TraceShape(eyePos, endPos, mask, contents, player);
return !trace.DidHit();
}
@ -225,9 +209,7 @@ namespace src.player.skills
if (playersInfo.TryGetValue(victim, out var playerSkill) && playerSkill.CloneProp != null)
{
KillClone(playerSkill);
var victimPawn = victim.PlayerPawn.Value;
if (victimPawn == null) return;
SkillUtils.AddHealth(victimPawn, @event.DmgHealth);
SkillUtils.RestoreHealth(victim);
}
}

View file

@ -47,7 +47,7 @@ namespace src.player.skills
if (!victim.IsValid || !victim.PawnIsAlive || !skillInfo.CanUse) return;
skillInfo.CanUse = false;
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>")}";
}
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 ulong SteamID { get; set; }

View file

@ -20,6 +20,12 @@ namespace src.player.skills
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
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;
AddMoney(player, moneyBonus);
}
@ -28,16 +34,22 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
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;
var moneyServices = player.InGameMoneyServices;
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");
}

View file

@ -1,10 +1,8 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils;
using CS2TraceRay.Class;
using CS2TraceRay.Struct;
using System.Numerics;
using static src.jRandomSkills;
using Vector = CounterStrikeSharp.API.Modules.Utils.Vector;
using System.Collections.Concurrent;
@ -69,29 +67,18 @@ namespace src.player.skills
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(s => s.SteamID == player?.SteamID);
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)
{
var pawn = player.PlayerPawn.Value;
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();
filter.m_nHierarchyIds[1] = 0;
CGameTrace trace = TraceRay.TraceHull(startPos, endPos, filter, ray);
ulong mask = pawn.Collision.CollisionAttribute.InteractsWith;
ulong contents = pawn.Collision.CollisionGroup;
CGameTrace trace = TraceRay.TraceShape(startPos, endPos, mask, contents, player);
return !trace.HitWorld(out _);
}

View file

@ -26,6 +26,8 @@ namespace src.player.skills
var plantedBomb = Utilities.FindAllEntitiesByDesignerName<CPlantedC4>("planted_c4").FirstOrDefault();
if (plantedBomb != null)
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)

View file

@ -1,19 +1,23 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Utils;
using static src.jRandomSkills;
using System.Collections.Concurrent;
using src.utils;
using System.Collections.Concurrent;
using System.Drawing;
using static src.jRandomSkills;
namespace src.player.skills
{
public class SniperElite : ISkill
{
private const Skills skillName = Skills.SniperElite;
private static readonly ConcurrentDictionary<ulong, List<CEntityInstance>> playerAWPs = [];
private static readonly ConcurrentDictionary<ulong, string> sniperElites = [];
private static readonly ConcurrentDictionary<ulong, List<uint>> playerAWPIndexes = [];
private static readonly ConcurrentDictionary<ulong, string> savedWeapons = [];
private static readonly ConcurrentDictionary<ulong, byte> isProcessing = [];
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",
"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",
@ -29,8 +33,9 @@ namespace src.player.skills
lock (setLock)
{
sniperElites.Clear();
playerAWPs.Clear();
savedWeapons.Clear();
playerAWPIndexes.Clear();
isProcessing.Clear();
}
}
@ -38,6 +43,7 @@ namespace src.player.skills
{
var player = @event.Userid;
if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
DisableSkill(player);
@ -47,118 +53,169 @@ namespace src.player.skills
{
var player = @event.Userid;
if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill == skillName)
{
if (rifles.Contains(@event.Item) && @event.Item != weapon_awp)
savedWeapons.AddOrUpdate(player.SteamID, string.Empty, (_, _) => string.Empty);
DeleteDroppedAWP(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)
{
sniperElites.TryRemove(player.SteamID, out _);
playerAWPs.TryRemove(player.SteamID, out _);
player.ExecuteClientCommand("slot3");
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)
{
var playerPawn = player.PlayerPawn.Value;
if (playerPawn?.CBodyComponent == null) return;
if (sniperElites.ContainsKey(player.SteamID))
if (player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || isProcessing.ContainsKey(player.SteamID)) return;
if (savedWeapons.ContainsKey(player.SteamID))
RemoveAndGiveWeapon(player);
}
private static void RemoveAndGiveWeapon(CCSPlayerController player)
{
string holdedWeapon = "weapon_awp";
if (sniperElites.TryGetValue(player.SteamID, out string? weapon))
if (!string.IsNullOrEmpty(weapon))
holdedWeapon = weapon;
ulong steamID = player.SteamID;
try
{
if (!isProcessing.TryAdd(steamID, 0)) return;
CBasePlayerWeapon? activeRifle = GetActiveRifle(player);
string weaponToGive = weapon_awp;
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)
{
if (playerAWPs.TryGetValue(player.SteamID, out var list))
list.Add(createdWeapon);
else
playerAWPs.TryAdd(player.SteamID, [createdWeapon]);
if (!playerAWPIndexes.ContainsKey(steamID))
playerAWPIndexes.TryAdd(steamID, []);
if (playerAWPIndexes.TryGetValue(steamID, out var list))
list.Add(createdWeapon.Index);
}
}
}
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 (pawn == null || !pawn.IsValid) return;
var weaponServices = pawn.WeaponServices;
if (weaponServices == null) return;
if (player == null || !player.IsValid) 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)];
lock (setLock)
{
if (playerAWPs.TryGetValue(player.SteamID, out var AWPs))
foreach (var awp in AWPs.ToList())
if (playerAWPIndexes.TryGetValue(player.SteamID, out var AWPs))
foreach (var index in AWPs.ToList())
if (!myWeaponsIndexes.Contains(index))
{
if (awp != null && awp.IsValid)
{
if (!playerWeapons.Contains(awp.Index))
{
awp.AcceptInput("Kill");
AWPs.Remove(awp);
}
}
else
AWPs.Remove(awp!);
var ent = Utilities.GetEntityFromIndex<CBaseEntity>((int)index);
if (ent != null && ent.IsValid)
ent.AcceptInput("Kill");
AWPs.Remove(index);
}
}
}
private static CBasePlayerWeapon? GetActiveRifle(CCSPlayerController player)
{
CBasePlayerWeapon? rifle = null;
var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid) return rifle;
var weaponServices = pawn.WeaponServices;
if (weaponServices == null) return rifle;
if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return null;
foreach (var weapon in weaponServices.MyWeapons)
if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid)
if (rifles.Contains(weapon.Value.DesignerName))
rifle = weapon.Value;
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");
var activeWeapon = pawn.WeaponServices?.ActiveWeapon.Value;
if (activeWeapon != null && activeWeapon.IsValid && rifles.Contains(activeWeapon.DesignerName))
return activeWeapon;
return null;
}
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 src.utils;
using System.Collections.Concurrent;
using System.Runtime.InteropServices;
using static src.jRandomSkills;
namespace src.player.skills
@ -19,6 +20,7 @@ namespace src.player.skills
public static void LoadSkill()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
}

View file

@ -21,11 +21,6 @@ namespace src.player.skills
bombPlanted = false;
}
public static void DisableSkill(CCSPlayerController player)
{
SkillUtils.ResetPrintHTML(player);
}
public static void BombPlanted(EventBombPlanted _)
{
bombPlanted = true;
@ -56,30 +51,10 @@ namespace src.player.skills
else
Localization.PrintTranslationToChatAll($" {ChatColors.LightBlue}{{0}}", ["watchmaker_ct"], [roundTime]);
player.EmitSound(SkillsInfo.GetValue<string>(skillName, "SoundEvent"));
}
public static void OnTick()
{
if (bombPlanted) return;
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);
var proxy = Utilities.FindAllEntitiesByDesignerName<CCSGameRulesProxy>("cs_gamerules").FirstOrDefault();
if (proxy == null) return;
Utilities.SetStateChanged(proxy, "CCSGameRulesProxy", "m_pGameRules");
}
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;
TeamMateSkillChatInfo = true;
SummaryAfterTheRound = true;
DebugMode = true;
DebugMode = false;
AlternativeSkillButton = null;
SkillTimeBeforeStart = 7;
SkillHudDuration = 999;
@ -107,7 +107,7 @@ namespace src.utils
FlashingHtmlHudFix = true;
CS2TraceRayDebug = false;
DisableSpectateHUD = false;
DisableHUDOnDeathPermission = "@jRandmosSkills/death";
DisableHUDOnDeathPermission = "@jRandomSkills/death";
DisableSkillsOnRoundEnd = false;
LanguageSystem = new LanguageSystem
@ -116,11 +116,12 @@ namespace src.utils
DisableGeoLite = false,
LanguageInfos =
[
new LanguageInfo("CN, TW, HK, MO, SG", "pt-br"),
new LanguageInfo("PT, BR, AO, CV, GW, MZ, ST, TL", "zh"),
new LanguageInfo("ZH, CN, TW, HK, MO, SG", "zh"),
new LanguageInfo("PT-BR, PT, BR, AO, CV, GW, MZ, ST, TL", "pt-br"),
new LanguageInfo("FR, MC, HT", "fr"),
new LanguageInfo("DE, AT, CH, LI, LU, BE", "de"),
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
{
SetSkillCommand = new NormalCommand("ustawskill, ustaw_skill, setskill, set_skill, definirhabilidade, configurarhabilidade, 设置技能, 配置技能", "@jRandmosSkills/admin"),
SkillsListCommand = new NormalCommand("supermoc, skille, listamocy, supermoce, skills, listaHabilidades, habilidades, 技能列表, 超能力列表", "@jRandmosSkills/admin"),
UseSkillCommand = new NormalCommand("t, useSkill, usarHabilidade, 技能使用, 使用技能", "@jRandmosSkills/admin"),
HealCommand = new NormalCommand("heal, ulecz, curar, tratar, 治疗, 治愈", "@jRandmosSkills/admin"),
ConsoleCommand = new NormalCommand("console, sv, 控制台, 服务器", "@jRandmosSkills/owner"),
SetSkillCommand = new NormalCommand("ustawskill, ustaw_skill, setskill, set_skill, definirhabilidade, configurarhabilidade, 设置技能, 配置技能", "@jRandomSkills/admin"),
SkillsListCommand = new NormalCommand("supermoc, skille, listamocy, supermoce, skills, listaHabilidades, habilidades, 技能列表, 超能力列表", "@jRandomSkills/admin"),
UseSkillCommand = new NormalCommand("t, useSkill, usarHabilidade, 技能使用, 使用技能", "@jRandomSkills/admin"),
HealCommand = new NormalCommand("heal, ulecz, curar, tratar, 治疗, 治愈", "@jRandomSkills/admin"),
ConsoleCommand = new NormalCommand("console, sv, 控制台, 服务器", "@jRandomSkills/owner"),
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", ""),
ReloadCommand = new NormalCommand("reload, refresh", "@jRandmosSkills/admin"),
ReloadCommand = new NormalCommand("reload, refresh", "@jRandomSkills/admin"),
};
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),
ChangeMapCommand = new VotingCommand(true, "map, mapa, changemap, zmienmape, zmienmape, mudarMapa, trocarMapa, 更换地图, 更改地图", "@jRandmosSkills/admin", 25, 90, 15, 500, 2),
SwapCommand = new VotingCommand(true, "swap, zmiana, trocar, 交换, 切换", "@jRandmosSkills/admin", 15, 90, 15, 20, 2),
ShuffleCommand = new VotingCommand(true, "shuffle, embaralhar, 随机排序, 洗牌", "@jRandmosSkills/admin", 15, 90, 15, 20, 2),
PauseCommand = new VotingCommand(true, "pause, unpause, pausar, despausar, 暂停, 恢复", "@jRandmosSkills/admin", 15, 60, 15, 2, 2),
SetScoreCommand = new VotingCommand(true, "setscore, wynik, definirPontuacao, configurarPontos, 设置分数, 调整分数", "@jRandmosSkills/owner", 15, 90, 15, 90, 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, 更换地图, 更改地图", "@jRandomSkills/admin", 25, 90, 15, 500, 2),
SwapCommand = new VotingCommand(true, "swap, zmiana, trocar, 交换, 切换", "@jRandomSkills/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, 暂停, 恢复", "@jRandomSkills/admin", 15, 60, 15, 2, 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.skills;
using System.Collections.Concurrent;
using System.Globalization;
using System.Runtime.InteropServices;
using WASDMenuAPI.Classes;
using WASDSharedAPI;
@ -110,14 +111,23 @@ namespace src.utils
if (scale <= 0 || skeleton == null) return;
skeleton.Scale = scale;
playerPawn.AcceptInput("SetScale", null, null, scale.ToString());
Server.NextFrame(() => Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_CBodyComponent"));
playerPawn.AcceptInput("SetScale", null, null, scale.ToString(CultureInfo.InvariantCulture));
Server.NextWorldUpdate(() => Utilities.SetStateChanged(player.PlayerPawn.Value!, "CBaseEntity", "m_CBodyComponent"));
}
public static Vector? GetSpawnPointVector(CCSPlayerController player, bool enemySpawn = false)
{
var spawns = Utilities.FindAllEntitiesByDesignerName<SpawnPoint>(player.Team == CsTeam.Terrorist && !enemySpawn
? "info_player_terrorist" : "info_player_counterterrorist").ToList();
if (player == null || player.Team is CsTeam.None or CsTeam.Spectator) return null;
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)
{
var randomSpawn = spawns[jRandomSkills.Instance.Random.Next(spawns.Count)];
@ -208,6 +218,19 @@ namespace src.utils
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)
{
if (weapon == null || !weapon.IsValid) return string.Empty;

View file

@ -7,35 +7,40 @@
"DebugMode": false,
"AlternativeSkillButton": null,
"SkillTimeBeforeStart": 7.0,
"SkillDescriptionDuration": 7.0,
"SkillHudDuration": 999.0,
"SkillDescriptionDuration": 999.0,
"DisplayAlwaysDescription": false,
"DisableSpectateHUD": false,
"FlashingHtmlHudFix": true,
"CS2TraceRayDebug": false,
"DisableHUDOnDeathPermission": "@jRandmosSkills/death",
"DisableHUDOnDeathPermission": "@jRandomSkills/death",
"DisableSkillsOnRoundEnd": false,
"LanguageSystem": {
"DefaultLangCode": "en",
"DisableGeoLite": false,
"LanguageInfos": [
{
"IsoCodes": "CN, TW, HK, MO, SG",
"FileName": "pt-br"
"IsoCodes": "ZH, CN, TW, HK, MO, SG",
"FileName": "zh"
},
{
"IsoCodes": "PT, BR, AO, CV, GW, MZ, ST, TL",
"FileName": "zh"
"IsoCodes": "PT-BR, PT, BR, AO, CV, GW, MZ, ST, TL",
"FileName": "pt-br"
},
{
"IsoCodes": "FR, MC, HT",
"FileName": "fr"
},
{
"IsoCodes": "DE, AT, CH, LI, LU, BE",
"FileName": "de"
},
{
"IsoCodes": "PL",
"FileName": "pl"
},
{
"IsoCodes": "GB, US",
"IsoCodes": "EN, GB, US",
"FileName": "en"
}
]
@ -58,26 +63,36 @@
"WSADMenuControllsLineColor2": "white",
"WSADMenuControllsLineColor3": "green"
},
"ChatMessage": {
"MaxWidth": 1280.0,
"LineSymbol": "―",
"LineColor": "\u0004",
"LineShow": true,
"InfoPlayerNameColor": "\u0002",
"InfoSkillColor": "\u0006",
"InfoMessageShow": true,
"TagFormat": "\u0002◢◆◤ {TAG} ◥◆◣"
},
"NormalCommands": {
"SetSkillCommand": {
"Alias": "ustawskill, ustaw_skill, setskill, set_skill, definirhabilidade, configurarhabilidade, 设置技能, 配置技能",
"Permissions": "@jRandmosSkills/admin"
"Permissions": "@jRandomSkills/admin"
},
"SkillsListCommand": {
"Alias": "supermoc, skille, listamocy, supermoce, skills, listaHabilidades, habilidades, 技能列表, 超能力列表",
"Permissions": "@jRandmosSkills/admin"
"Permissions": "@jRandomSkills/admin"
},
"UseSkillCommand": {
"Alias": "t, useSkill, usarHabilidade, 技能使用, 使用技能",
"Permissions": "@jRandmosSkills/admin"
"Permissions": "@jRandomSkills/admin"
},
"HealCommand": {
"Alias": "heal, ulecz, curar, tratar, 治疗, 治愈",
"Permissions": "@jRandmosSkills/admin"
"Permissions": "@jRandomSkills/admin"
},
"ConsoleCommand": {
"Alias": "console, sv, 控制台, 服务器",
"Permissions": "@jRandmosSkills/owner"
"Permissions": "@jRandomSkills/owner"
},
"HudCommand": {
"Alias": "hud, hood",
@ -85,7 +100,7 @@
},
"SetStaticSkillCommand": {
"Alias": "ustawstatycznyskill, ustaw_statyczny_skill, setstaticskill, set_static_skill",
"Permissions": "@jRandmosSkills/admin"
"Permissions": "@jRandomSkills/admin"
},
"ChangeLanguageCommand": {
"Alias": "lang, language, changelang, change_lang, jezyk, język",
@ -93,14 +108,14 @@
},
"ReloadCommand": {
"Alias": "reload, refresh",
"Permissions": "@jRandmosSkills/admin"
"Permissions": "@jRandomSkills/admin"
}
},
"VotingCommands": {
"StartGameCommand": {
"EnableVoting": true,
"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",
"SVStartParams": "mp_freezetime 0; mp_forcecamera 0; mp_overtime_enable 1; sv_cheats 1",
"TimeToVote": 15.0,
@ -117,7 +132,7 @@
"TimeToNextSameVoting": 500.0,
"MinimumPlayersToStartVoting": 2,
"Alias": "map, mapa, changemap, zmienmape, zmienmape, mudarMapa, trocarMapa, 更换地图, 更改地图",
"Permissions": "@jRandmosSkills/admin"
"Permissions": "@jRandomSkills/admin"
},
"SwapCommand": {
"EnableVoting": true,
@ -127,7 +142,7 @@
"TimeToNextSameVoting": 20.0,
"MinimumPlayersToStartVoting": 2,
"Alias": "swap, zmiana, trocar, 交换, 切换",
"Permissions": "@jRandmosSkills/admin"
"Permissions": "@jRandomSkills/admin"
},
"ShuffleCommand": {
"EnableVoting": true,
@ -137,7 +152,7 @@
"TimeToNextSameVoting": 20.0,
"MinimumPlayersToStartVoting": 2,
"Alias": "shuffle, embaralhar, 随机排序, 洗牌",
"Permissions": "@jRandmosSkills/admin"
"Permissions": "@jRandomSkills/admin"
},
"PauseCommand": {
"EnableVoting": true,
@ -147,7 +162,7 @@
"TimeToNextSameVoting": 2.0,
"MinimumPlayersToStartVoting": 2,
"Alias": "pause, unpause, pausar, despausar, 暂停, 恢复",
"Permissions": "@jRandmosSkills/admin"
"Permissions": "@jRandomSkills/admin"
},
"SetScoreCommand": {
"EnableVoting": true,
@ -157,7 +172,7 @@
"TimeToNextSameVoting": 90.0,
"MinimumPlayersToStartVoting": 2,
"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_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_desc": "You have a random chance to launch an enemy upwards",
"catapult_desc2": "Your chance to launch an enemy on hit is: {0}%",
@ -68,6 +74,10 @@
"cutter": "Cutter",
"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_desc": "Applies a darkness effect to a chosen enemy",
"darkness_enemy_info": "Let the lights go out.",
@ -142,6 +152,7 @@
"gambler_desc": "Select a skill from the list provided.",
"gambler_select_info": "Select your skill:",
"gambler_more": "#00FF00|Refresh for ${0}",
"gambler_no_money": "Not enough money.",
"ghost": "Ghost",
"ghost_desc": "You are completely invisible",
@ -175,6 +186,9 @@
"holyhandgrenade": "Holy Hand Grenade",
"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_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",
"sniperelite": "Sniper Elite",
"sniperelite_customname": "Sniper Elite Skill",
"sniperelite_desc": "Click [css_useSkill] to swap your current weapon for an AWP",
"soldier": "Soldier",
@ -451,10 +466,10 @@
"bombsite_a": "Bombsite A",
"bombsite_b": "Bombsite B",
"bombplanted": "The bomb has been planted\n{0} seconds till detonation",
"teammate_skills": "Your teammates' skills",
"summary_start": "======SUMMARY=OF=THE=LAST=ROUND======",
"summary_end": "=======================================",
"summary": "Summary of the last round",
"menu_controlls_scroll": "W/S - Scroll",
"menu_controlls_padding": " | ",

View file

@ -55,6 +55,12 @@
"c4camouflage": "Camouflage C4",
"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_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}%",
@ -68,6 +74,10 @@
"cutter": "Trancheur",
"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_desc": "Applique un effet d’obscurité à un ennemi choisi",
"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_select_info": "Sélectionnez votre compétence :",
"gambler_more": "#00FF00|Rafraîchir pour ${0}",
"gambler_no_money": "Pas assez d'argent.",
"ghost": "Fantôme",
"ghost_desc": "Vous êtes complètement invisible",
@ -175,6 +186,9 @@
"holyhandgrenade": "Grenade Sacré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_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",
"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",
"soldier": "Soldat",
@ -451,10 +466,10 @@
"bombsite_a": "Site de bombe A",
"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",
"summary_start": "======RÉSUMÉ=DU=DERNIER=ROUND======",
"summary_end": "===================================",
"summary": "Résumé du dernier round",
"menu_controlls_scroll": "W/S - Défilement",
"menu_controlls_padding": " | ",

View file

@ -55,6 +55,12 @@
"c4camouflage": "C4 Kamuflaż",
"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_desc": "Masz losową szanse na podrzucenie wroga",
"catapult_desc2": "Twoje szanse na podrzucenie wroga po trafieniu to: {0}%",
@ -68,6 +74,10 @@
"cutter": "Scyzoryk",
"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_desc": "Nadaje efekt ciemności wybranemu przeciwnikowi",
"darkness_enemy_info": "Niech zgasną światła.",
@ -142,6 +152,7 @@
"gambler_desc": "Wybierz umiejętność z podanej listy.",
"gambler_select_info": "Wybierz umiejętność:",
"gambler_more": "#00FF00|Odśwież za ${0}",
"gambler_no_money": "Niewystarczająca ilość pieniędzy.",
"ghost": "Duszek",
"ghost_desc": "Jesteś całkowicie niewidzialny",
@ -175,6 +186,9 @@
"holyhandgrenade": "Święty Granat Ręczny",
"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_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",
"sniperelite": "SzeliS",
"sniperelite_customname": "Mityczna AWP",
"sniperelite_desc": "Kliknij [css_useSkill], aby zamienić aktualną broń na AWP",
"soldier": "Żołnierz",
@ -451,10 +466,10 @@
"bombsite_a": "Strefa detonacji A",
"bombsite_b": "Strefa detonacji B",
"bombplanted": "Bomba została podłożona\n{0} sekund do detonacji",
"teammate_skills": "Supermoce twoich sojuszników",
"summary_start": "======PODSUMOWANIE=Z=OSTATNIEJ=RUNDY======",
"summary_end": "============================================",
"summary": "Podsumowanie z ostatniej rundy",
"menu_controlls_scroll": "W/S – Przewijanie",
"menu_controlls_padding": " | ",

View file

@ -1,53 +1,53 @@
{
"none": "Nenhuma",
"none": "Nenhum",
"none_desc": "Você não tem nenhuma habilidade",
"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_desc": "Você volta alguns segundos no tempo",
"anomaly": "Anomalia",
"anomaly_desc": "Você retrocede alguns segundos no tempo",
"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_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_desc": "Você pode escolher um bombsite para desativar",
"areareaper_incorrect_site": "Nenhum bombsite encontrado.",
"areareaper_no_site": "Nenhum bombsite encontrado.",
"areareaper_select_info": "Escolha o bomb p/ desativar:",
"areareaper_site_disabled": "Bombsite {0} foi desativado - nenhuma bomba pode ser plantada lá!",
"areareaper": "Ceifador de Zonas",
"areareaper_desc": "Você pode escolher um local de bomba para desativar",
"areareaper_incorrect_site": "Nenhum local de bomba encontrado.",
"areareaper_no_site": "Nenhum local de bomba encontrado.",
"areareaper_select_info": "Escolha área p/ desativar:",
"areareaper_site_disabled": "Local de bomba {0} foi desativado - nenhuma bomba pode ser plantada lá!",
"areareaper_used_info": "Seu poder já foi usado.",
"armored": "Super Tiro",
"armored_desc": "Seu dano é multiplicado por um valor aleatório",
"armored_desc2": "Seu multiplicador de dano é: {0}x",
"armored": "Blindado",
"armored_desc": "Você tem um multiplicador de dano recebido aleatório",
"armored_desc2": "Seu multiplicador de dano recebido é: {0}x",
"assassin": "Assassino",
"assassin_desc": "Você causa mais dano aos inimigos de costas",
"assassin_desc": "Você causa mais dano aos inimigos por trás",
"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",
"bankrupt": "Ladrão",
"bankrupt": "Falido",
"bankrupt_desc": "Escolha o jogador que perderá todo o dinheiro",
"bankrupt_enemy_info": "Você ficou pobre",
"bankrupt_player_info": "O jogador '{0}' ficou pobre.",
"bankrupt_select_info": "Escolha jogador p/ ficar pobre:",
"bankrupt_enemy_info": "Você faliu.",
"bankrupt_player_info": "O jogador '{0}' faliu.",
"bankrupt_select_info": "Escolha jogador p/ falir:",
"baseball": "Decoy Aleluia",
"baseball_desc": "Sua decoy ricocheteia nas paredes e mata instantaneamente um inimigo ao acertá-lo",
"baseball": "Jogador de Beisebol",
"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_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_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_desc": "Você ganha \"BunnyHop\" automático",
@ -55,18 +55,28 @@
"c4camouflage": "Camuflagem C4",
"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_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_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",
"cutter": "Corte Rápido",
"cutter_desc": "Você mata instantaneamente com a faca",
"cutter": "Cortador",
"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_desc": "Aplica um efeito de escuridão a um inimigo escolhido",
@ -75,57 +85,58 @@
"darkness_select_info": "Escolha jogador: escuridão:",
"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_player_info": "A habilidade do jogador '{0}' foi desativada.",
"deactivator_select_info": "Desativar skill do jogador:",
"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_player_info": "O som foi desativado para o jogador '{0}'.",
"deaf_select_info": "Silenciar jogador:",
"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}%",
"distancer": "Medidor de Distância",
"distancer_desc": "Você pode ver a distância até o inimigo mais próximo",
"dash": "Impulso",
"dash_desc": "Pule novamente para receber um impulso",
"dash": "Dash",
"dash_desc": "Execute um segundo salto para dar um dash",
"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_desc": "Escolha um jogador para copiar a habilidade",
"duplicator": "Duplicador",
"duplicator_desc": "Escolha um jogador para copiar sua habilidade",
"duplicator_player_info": "A habilidade do jogador '{0}' foi copiada.",
"duplicator_select_info": "Copiar skill do jogador:",
"dwarf": "Anão",
"dwarf_desc": "Sua altura agora é aleatória",
"dwarf_desc2": "Seu multiplicador de altura é: {0}x",
"dwarf_desc": "Tamanho de personagem aleatório no início da rodada",
"dwarf_desc2": "Seu multiplicador de tamanho é: {0}x",
"enemyspawn": "Spawn Inimigo",
"enemyspawn_desc": "Clique em [css_useSkill] para se teletransportar para a base inimiga",
"enemyspawn_desc": "Clique em [css_useSkill] para se teletransportar para o spawn inimigo",
"explosiveshot": "Tiro Explosivo",
"explosiveshot_desc": "Chance aleatória de disparar uma bala explosiva enquanto atira",
"explosiveshot_desc2": "Sua chance de disparar uma bala explosiva: {0}%",
"falconeye": "Olho de Águia",
"falconeye_desc": "Clique em [css_useSkill] para ativar uma câmera 360 com visão aérea",
"falconeye": "Olho de Falcão",
"falconeye_desc": "Clique em [css_useSkill] para ativar uma câmera com visão aérea",
"fastreload": "Recarga Rápida",
"fastreload_desc": "Clique em [css_useSkill] para recarregar a arma que você está segurando",
"flash": "Ligeirinho",
"flash_desc": "Velocidade de movimentação aleatória no início da rodada",
"flash": "Flash",
"flash_desc": "Velocidade de jogador aleatória no início da rodada",
"flash_desc2": "Seu multiplicador de velocidade é: {0}x",
"fortnite": "Fortnite",
"fortnite_desc": "Clique em [css_useSkill] para criar uma barreira destrutível",
"fortnite_desc": "Clique em [css_useSkill] para criar uma barricada destrutível",
"fragilebomb": "Bomba Frágil",
"fragilebomb_desc": "Atirar na bomba a danifica",
@ -134,131 +145,135 @@
"friendlyfire": "Fogo Amigo",
"friendlyfire_desc": "Atirar em companheiros de equipe os cura",
"frozendecoy": "Decoy Congelante",
"frozendecoy_desc": "Sua decoy congela os players próximos",
"frozendecoy": "Chamariz Congelante",
"frozendecoy_desc": "Seu chamariz congela todos os jogadores próximos",
"gambler": "Tigrinho",
"gambler": "Apostador",
"gambler_desc": "Selecione uma habilidade da lista.",
"gambler_select_info": "Escolha sua habilidade:",
"gambler_more": "#00FF00|Atualizar por ${0}",
"gambler_no_money": "Não há dinheiro suficiente.",
"ghost": "Fantasma",
"ghost_desc": "Você é completamente invisível",
"glaz": "Smoke Transparente",
"glaz_desc": "Smokes tornam-se transparentes para você",
"glaz": "Glaz",
"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_enemy_info": "Seu radar foi desativado.",
"glitch_player_info": "O radar do jogador '{0}' foi desativado.",
"glitch_select_info": "Desativar radar do jogador:",
"glue": "Semtex",
"glue": "Cola",
"glue_desc": "Suas granadas grudam nas paredes",
"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_on": "Imortalidade ativada",
"grenadier": "Bomberman",
"grenadier_desc": "Você tem HEs infinitas",
"grenadier": "Grenadier",
"grenadier_desc": "Você tem granadas HE infinitas",
"healingsmoke": "Smoke Amiga",
"healingsmoke_desc": "Suas smokes curam",
"healingsmoke": "Fumaça Curativa",
"healingsmoke_desc": "Suas granadas de fumaça curam",
"hermit": "Sanguessuga",
"hermit_desc": "Matar restaura munição e uma parte da sua vida",
"hermit": "Eremita",
"hermit_desc": "Matar restaura munição e uma porção de saúde",
"holyhandgrenade": "Granada Obesa",
"holyhandgrenade_desc": "HEs causam dano dobrado e têm alcance dobrado",
"holyhandgrenade": "Granada Sagrada",
"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_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_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",
"jammer": "No Scope",
"jammer_desc": "Escolha um jogador para desativar a mira",
"jammer": "Jammer",
"jammer_desc": "Escolha um jogador para desativar sua mira",
"jammer_enemy_info": "Sua mira foi desativada.",
"jammer_player_info": "A mira do jogador '{0}' foi desativada.",
"jammer_select_info": "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_mode": "Modo Palhaço",
"jester_mode": "Modo Bobo",
"jester_on": "LIG.",
"jester_off": "DESL.",
"jumpban": "Perneta",
"jumpban": "Sem Pernas",
"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_select_info": "Banir pulo do jogador:",
"jumpingjack": "Pula-Pula",
"jumpingjack_desc": "Pular restaura vida",
"jumpingjack_desc": "Pular restaura saúde",
"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_desc": "Escolha um jogador para trocar de vida",
"lifeswap_enemy_info": "Alguém pegou sua vida emprestada.",
"lifeswap_player_info": "Você trocou vida com o jogador '{0}'.",
"lifeswap_select_info": "Trocar de vida com jogador:",
"lifeswap_desc": "Escolha um jogador para trocar saúde com ele",
"lifeswap_enemy_info": "Alguém pegou sua saúde emprestada.",
"lifeswap_player_info": "Você trocou saúde com o jogador '{0}'.",
"lifeswap_select_info": "Trocar vida com jogador:",
"longknife": "Espada",
"longknife": "Faca Longa",
"longknife_desc": "Um ataque com faca causa danos independentemente da distância",
"longzeus": "Zeus Longo",
"longzeus_desc": "Zeus causa dano independentemente da distância",
"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_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:",
"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_desc": "Escolha um jogador para trocar de dinheiro com ele",
"moneyswap_enemy_info": "Você provavelmente virou classe B",
"moneyswap": "Cobrador de Impostos",
"moneyswap_desc": "Escolha um jogador para trocar dinheiro com ele",
"moneyswap_enemy_info": "A receita federal te pegou.",
"moneyswap_player_info": "Você trocou dinheiro com o jogador '{0}'.",
"moneyswap_select_info": "Trocar dinheiro c/ jogador:",
"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!!!",
"ninja": "Ninja",
"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ê",
"norecoil": "Sem Recoil",
"norecoil_desc": "Sem recoil ao atirar",
"norecoil": "Foco",
"norecoil_desc": "Sem recuo ao atirar",
"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",
"onlyhead": "Só na Cabeçinha",
"onlyhead_desc": "Você só recebe headshot",
"onlyhead": "Apenas Cabeça",
"onlyhead_desc": "Você só recebe dano na cabeça",
"paweljumper": "Parkourista",
"paweljumper_desc": "Você recebe um número aleatório de pulos extras",
"paweljumper_desc2": "Você ganha {0} pulos extras",
"paweljumper": "Pawel Jumper",
"paweljumper_desc": "Você recebe um número aleatório de saltos extras",
"paweljumper_desc2": "Você ganha {0} saltos extras",
"phoenix": "Fênix",
"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",
"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",
"pilot": "Jetpack",
"pilot": "Piloto",
"pilot_desc": "Voe por um tempo limitado. Segure [USE - E] para voar",
"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.",
"poison": "Veneno",
@ -282,7 +297,7 @@
"poison_player_info": "O jogador '{0}' foi envenenado.",
"poison_select_info": "Envenenar jogador:",
"primaryban": "Sem Rifle",
"primaryban": "Sem Rifles",
"primaryban_desc": "Escolha um jogador que não poderá usar rifles",
"primaryban_enemy_info": "Você não pode mais usar rifles.",
"primaryban_player_info": "O jogador '{0}' não pode mais usar rifles.",
@ -291,89 +306,90 @@
"prosthesis": "Prótese",
"prosthesis_desc": "Braços e pernas são à prova de balas",
"push": "Empurrão",
"push_desc": "Você tem uma chance aleatória de empurrar um inimigo ao acertá-lo",
"push_desc2": "Suas chances de empurrar o inimigo são: {0}%",
"push": "Empurrador",
"push_desc": "Você tem uma chance aleatória de empurrar um inimigo para trás ao acertá-lo",
"push_desc2": "Suas chances de repelir o inimigo são: {0}%",
"pyro": "Pirotecnia",
"pyro_desc": "Molotov recupera vida",
"pyro": "Piro",
"pyro_desc": "Molotov restaura saúde",
"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_desc": "Inimigos são visíveis no mapa",
"radarhack": "Hack de Radar",
"radarhack_desc": "Inimigos são visíveis no radar",
"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_desc": "Clique em [css_useSkill] para receber uma arma aleatória",
"rezombie": "Walking Dead",
"rezombie_desc": "Após morrer, você renasce como um zumbi com mais vida porém sem armas",
"rezombie": "Re-Zumbi",
"rezombie_desc": "Após a morte, você renasce como um zumbi com mais saúde e sem armas",
"reactivearmor": "Armadura Reativa",
"reactivearmor_desc": "A armadura absorve o primeiro dano recebido",
"regeneration": "Regeneração",
"regeneration_desc": "Você restaura vida a cada poucos segundos",
"regeneration_desc": "Você restaura saúde a cada poucos segundos",
"replicator": "Clone",
"replicator_desc": "Clique em [css_useSkill] para criar um clone que causa dano ao ser atingido",
"replicator": "Replicador",
"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",
"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",
"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_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",
"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_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_nospace": "Sem espaço disponível",
"shortbomb": "Pavio Longo",
"shortbomb_desc": "A bomba demora muito mais para explodir",
"shortbomb": "Fusível Curto",
"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",
"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",
"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",
"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_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_desc": "Clique em [css_useSkill] para trocar de lugar com um inimigo aleatório",
"teleporter": "Teletransportador",
"teleporter_desc": "Você troca de lugar com o inimigo 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_enemy_info": "Sua habilidade 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!",
"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ê",
"toxicsmoke": "Smoke Tóxica",
"toxicsmoke_desc": "Suas smokes causam dano",
"toxicsmoke": "Fumaça Tóxica",
"toxicsmoke_desc": "Suas granadas de fumaça causam dano",
"wallhack": "Wallhack",
"wallhack_desc": "Você pode ver inimigos através das paredes",
@ -404,9 +420,9 @@
"zeus": "Zeus",
"zeus_desc": "Zeus x27 recarrega instantaneamente",
"your_skill": "Sua habilidade atual",
"your_skill": "Seu poder atual",
"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",
"drawing_skill": "Sorteando uma habilidade",
"disabled_weapon": "Você não pode usar esta arma",
@ -429,7 +445,7 @@
"error_setskill": "Falha ao definir a habilidade CHATCOLORS.RED",
"for_setskill": "para",
"invalid_map": "Nome do mapa inválido!",
"invalid_map": "Nome do mapa inserido incorretamente!",
"loading_map": "Carregando um novo mapa",
"pause": "Partida pausada.",
@ -448,12 +464,12 @@
"vote_alredy_voted": "Você já votou!",
"vote_vote": "Votar",
"bombsite_a": "Bombsite A",
"bombsite_b": "Bombsite B",
"bombsite_a": "Zona de detonação A",
"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",
"summary_start": "=======RESUMO=DA=ÚLTIMA=RODADA=======",
"summary_end": "=======================================",
"summary": "Resumo da última rodada",
"menu_controlls_scroll": "W/S - Rolar",
"menu_controlls_padding": " | ",

View file

@ -55,6 +55,12 @@
"c4camouflage": "C4伪装",
"c4camouflage_desc": "你持有炸弹时隐形",
"carefulbullets": "谨慎的子弹",
"carefulbullets_desc": "选择一名球员,每当他投篮未中时就会受到伤害",
"carefulbullets_enemy_info": "从现在起,不准确将带来切实的伤害。",
"carefulbullets_player_info": "'{0}' 现在必须更加谨慎。",
"carefulbullets_select_info": "不准确会伤害玩家:",
"catapult": "弹射",
"catapult_desc": "你有随机几率将敌人向上弹射",
"catapult_desc2": "你击中敌人将其弹射的几率是:{0}%",
@ -68,6 +74,10 @@
"cutter": "切割者",
"cutter_desc": "用刀可立即杀死敌人",
"cypher": "相机",
"cypher_desc": "点击 [css_useSkill] 创建/切换摄像机",
"cypher_nospace": "相机必须与墙壁呈直角放置",
"darkness": "黑暗",
"darkness_desc": "对选定的敌人施加黑暗效果",
"darkness_enemy_info": "让灯光熄灭。",
@ -142,6 +152,7 @@
"gambler_desc": "从提供的列表中选择一个技能。",
"gambler_select_info": "选择你的技能:",
"gambler_more": "#00FF00|刷新 ${0}",
"gambler_no_money": "钱不够。",
"ghost": "幽灵",
"ghost_desc": "你完全隐形",
@ -175,6 +186,9 @@
"holyhandgrenade": "神圣手榴弹",
"holyhandgrenade_desc": "你的高爆手榴弹造成双倍伤害并拥有双倍范围",
"iana": "全息图",
"iana_desc": "点击 [css_useSkill] 可控制你的全息影像数秒",
"impostor": "冒名顶替者",
"impostor_desc": "回合开始时你获得敌方玩家模型",
@ -356,6 +370,7 @@
"silent_desc": "你的脚步和跳跃对其他玩家无声",
"sniperelite": "狙击精英",
"sniperelite_customname": "狙击精英技能",
"sniperelite_desc": "点击 [css_useSkill] 将当前武器替换为AWP",
"soldier": "士兵",
@ -451,10 +466,10 @@
"bombsite_a": "爆轰区A",
"bombsite_b": "爆轰区B",
"bombplanted": "炸弹已安装完毕{0}秒后引爆",
"teammate_skills": "你队友的技能",
"summary_start": "=============上一回合总结==============",
"summary_end": "=======================================",
"summary": "上一回合总结",
"menu_controlls_scroll": "W/S - 滚动",
"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**
- **French** [by: [@felyjyn](https://github.com/felyjyn)]
- **Portuguese (Brazilian)** [by: [@vinicius-trev](https://github.com/vinicius-trev)]
- **German** [by: [@Enrory](https://github.com/Enrory)]
- **Simplified Chinese** [GrokAI / ChatGPT]
## 🖼️ 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).
## ✨ Current Skills (109)
## ✨ Current Skills (111)
<details>
<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 |
| - | - | - | - |
| `!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 | - |
| `!skills` | `!skills` | List of skills | - |
| `!map <mapName>` | `!map de_nuke` | Change map | `@jRandmosSkills/admin` |
| `!map <mapWorkshopId>` | `!map 3332005394` | Change map from workshop | `@jRandmosSkills/admin` |
| `!start` | `!start` | Start game with conditions: `mp_forcecamera 0, mp_freezetime 15, mp_overtime_enable 1, sv_cheats 0` | `@jRandmosSkills/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` |
| `!console <command>` | `!console sv_cheats 1` | Run a command on the server | `@jRandmosSkills/owner` |
| `!swap` | `!swap` | Switch sides | `@jRandmosSkills/admin` |
| `!shuffle` | `!shuffle` | Randomly assign players to teams | `@jRandmosSkills/admin` |
| `!pause` | `!pause` | Pause the game | `@jRandmosSkills/admin` |
| `!heal` | `!heal` | Restore 100 health points | `@jRandmosSkills/admin` |
| `!map <mapName>` | `!map de_nuke` | Change map | `@jRandomSkills/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` | `@jRandomSkills/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 | `@jRandomSkills/owner` |
| `!swap` | `!swap` | Switch sides | `@jRandomSkills/admin` |
| `!shuffle` | `!shuffle` | Randomly assign players to teams | `@jRandomSkills/admin` |
| `!pause` | `!pause` | Pause the game | `@jRandomSkills/admin` |
| `!heal` | `!heal` | Restore 100 health points | `@jRandomSkills/admin` |
| `!hud` | `!hud` | Enable/Disable hud | - |
| `!setscore <CT> <TT>` | `!setscore 10 7` | Set the game score | `@jRandmosSkills/owner` |
| `!setstaticskill <playerName/steamID> <skill>` | `!setstaticskill Juzlus Aimbot` | Giving a player a permanent skill | `@jRandmosSkills/admin` |
| `!setstaticskill <playerName/steamID> None` | `!setstaticskill Juzlus None` | Back to normal | `@jRandmosSkills/admin` |
| `!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 | `@jRandomSkills/admin` |
| `!setstaticskill <playerName/steamID> None` | `!setstaticskill Juzlus None` | Back to normal | `@jRandomSkills/admin` |
| `!reload` | `!reload` | Reload translations | - |
_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": {
"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
// 2 - Same skills for all players
// 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
"TeamMateSkillInfo": true, // Show allies' skills in chat
"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:
// null, "Attack", "Jump", "Duck", "Forward", "Back",
// "Use", "Cancel", "Left", "Right", "Moveleft",
@ -259,18 +262,21 @@ All skills can be customized in the **`config.cfg`** / **`skillsInfo.json`** fil
// "Attack3", "Scoreboard", "Inspect"
"SkillTimeBeforeStart": 7.0, // How many seconds before freeze time ends should skills
// 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)
"DisableSpectateHUD": false, // Disable HTML HUD when spectating
"FlashingHtmlHudFix": true, // Enable FlashingHtmlHudFix
"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)
"LanguageSystem": {
"DefaultLangCode": "en", // Default language: en, pl, fr, pt-br, zh
"DisableGeoLite": false, // Disable player language search by geolocation GeoLite2 (MaxMind)
"LanguageInfos": [...] // Setting to change ISO languages to translations
},
"HtmlHudCustomisation": { // Settings for changing colours and font sizes
... // xxxl: 64px, xxl: 40px, xl: 32px
} // 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:
- [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
@ -316,8 +322,165 @@ This plugin uses content from the following projects:
## 📋 Changelog
<summary><b>v1.10.0</b></summary>
- #### General:
</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:
- ###### Update the dependency to the latest version.
@ -345,7 +508,7 @@ This plugin uses content from the following projects:
- #### General:
- ###### 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).
- ###### 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).
- ###### Disabling first skill if two skills are drawn during the first round.
- ###### The `!reload` command also refreshes the skill activity status.