diff --git a/jRandomSkills - SRC Files/!jRandomSkills.csproj.user b/jRandomSkills - SRC Files/!jRandomSkills.csproj.user deleted file mode 100644 index a324019..0000000 --- a/jRandomSkills - SRC Files/!jRandomSkills.csproj.user +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - Designer - - - \ No newline at end of file diff --git a/jRandomSkills - SRC Files/Properties/Resources.Designer.cs b/jRandomSkills - SRC Files/Properties/Resources.Designer.cs index d45662c..90c5831 100644 --- a/jRandomSkills - SRC Files/Properties/Resources.Designer.cs +++ b/jRandomSkills - SRC Files/Properties/Resources.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace src.player.skills.Properties { +namespace jRandomSkills.Properties { using System; diff --git a/jRandomSkills - SRC Files/!jRandomSkills.csproj b/jRandomSkills - SRC Files/jRandomSkills.csproj similarity index 91% rename from jRandomSkills - SRC Files/!jRandomSkills.csproj rename to jRandomSkills - SRC Files/jRandomSkills.csproj index dfd9bbb..bcbde77 100644 --- a/jRandomSkills - SRC Files/!jRandomSkills.csproj +++ b/jRandomSkills - SRC Files/jRandomSkills.csproj @@ -14,14 +14,14 @@ - + - + diff --git a/jRandomSkills - SRC Files/jRandomSkills.sln b/jRandomSkills - SRC Files/jRandomSkills.sln index 6fe0607..58731d2 100644 --- a/jRandomSkills - SRC Files/jRandomSkills.sln +++ b/jRandomSkills - SRC Files/jRandomSkills.sln @@ -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 diff --git a/jRandomSkills - SRC Files/src/command/Command.cs b/jRandomSkills - SRC Files/src/command/Command.cs index 7e3bd95..2876434 100644 --- a/jRandomSkills - SRC Files/src/command/Command.cs +++ b/jRandomSkills - SRC Files/src/command/Command.cs @@ -78,6 +78,9 @@ namespace src.command if (playerPawn?.CBodyComponent == null) return; if (!player.IsValid || !player.PawnIsAlive) return; + if (SkillsInfo.GetValue(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 } } } - - - - - - - - - - - - } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/jRandomSkills.cs b/jRandomSkills - SRC Files/src/jRandomSkills.cs index 1ad7ed5..c8aa550 100644 --- a/jRandomSkills - SRC Files/src/jRandomSkills.cs +++ b/jRandomSkills - SRC Files/src/jRandomSkills.cs @@ -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) { diff --git a/jRandomSkills - SRC Files/src/lang/de.json b/jRandomSkills - SRC Files/src/lang/de.json new file mode 100644 index 0000000..161f149 --- /dev/null +++ b/jRandomSkills - SRC Files/src/lang/de.json @@ -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 ", + "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" +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/lang/en.json b/jRandomSkills - SRC Files/src/lang/en.json index 38b95e3..32a8e1a 100644 --- a/jRandomSkills - SRC Files/src/lang/en.json +++ b/jRandomSkills - SRC Files/src/lang/en.json @@ -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", diff --git a/jRandomSkills - SRC Files/src/lang/fr.json b/jRandomSkills - SRC Files/src/lang/fr.json index 7dfa8f1..91cfcd7 100644 --- a/jRandomSkills - SRC Files/src/lang/fr.json +++ b/jRandomSkills - SRC Files/src/lang/fr.json @@ -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,12 +466,12 @@ "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": " | ", "menu_controlls_select": "E - Sélectionner" -} +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/lang/pl.json b/jRandomSkills - SRC Files/src/lang/pl.json index 5fba217..0a2f4f9 100644 --- a/jRandomSkills - SRC Files/src/lang/pl.json +++ b/jRandomSkills - SRC Files/src/lang/pl.json @@ -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": " | ", diff --git a/jRandomSkills - SRC Files/src/lang/pt-br.json b/jRandomSkills - SRC Files/src/lang/pt-br.json index dcc4b4b..8884abb 100644 --- a/jRandomSkills - SRC Files/src/lang/pt-br.json +++ b/jRandomSkills - SRC Files/src/lang/pt-br.json @@ -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": " | ", diff --git a/jRandomSkills - SRC Files/src/lang/zh.json b/jRandomSkills - SRC Files/src/lang/zh.json index 2489a55..245438e 100644 --- a/jRandomSkills - SRC Files/src/lang/zh.json +++ b/jRandomSkills - SRC Files/src/lang/zh.json @@ -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": " | ", diff --git a/jRandomSkills - SRC Files/src/player/ISkill.cs b/jRandomSkills - SRC Files/src/player/ISkill.cs index 3d43247..5911433 100644 --- a/jRandomSkills - SRC Files/src/player/ISkill.cs +++ b/jRandomSkills - SRC Files/src/player/ISkill.cs @@ -64,6 +64,7 @@ public enum Skills BladeMaster, BunnyHop, C4Camouflage, + CarefulBullets, Catapult, Chicken, ChillOut, diff --git a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs index b0e3b4b..1050774 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs @@ -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(PlayerConnectFull); Instance.RegisterEventHandler(PlayerDisconnect); + // Instance.RegisterEventHandler(PlayerChat); Instance.RegisterEventHandler(RoundStart); Instance.RegisterEventHandler(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); playersSkills.Clear(); staticSkills.Clear(); diff --git a/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs b/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs index f1d55ec..d8d6751 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AntyHead.cs @@ -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) diff --git a/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs b/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs index 81985d4..73c7aad 100644 --- a/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs +++ b/jRandomSkills - SRC Files/src/player/skills/BladeMaster.cs @@ -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) diff --git a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs index 9349f2d..410ee7c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs +++ b/jRandomSkills - SRC Files/src/player/skills/BunnyHop.cs @@ -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 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(skillName, "jumpVelocity"); var maxSpeed = SkillsInfo.GetValue(skillName, "maxSpeed"); diff --git a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs index a7cd937..2d2ead8 100644 --- a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs +++ b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs @@ -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((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("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; } diff --git a/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs b/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs new file mode 100644 index 0000000..c67492f --- /dev/null +++ b/jRandomSkills - SRC Files/src/player/skills/CarefulBullets.cs @@ -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 targetPlayers = []; + private static readonly ConcurrentDictionary lastShot = []; + private static readonly object setLock = new(); + + public static void LoadSkill() + { + SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(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(0); + CTakeDamageInfo param2 = h.GetParam(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(); + + 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(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; + } + } +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Cypher.cs b/jRandomSkills - SRC Files/src/player/skills/Cypher.cs index 3afc1fb..fd8b4bb 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Cypher.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Cypher.cs @@ -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(skillName, "color")); + SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(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(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(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"); - if (player.CameraActive && player.CameraView != null) + Server.NextWorldUpdate(() => { - SkillUtils.ApplyScreenColor(player.Player, 0, 0, 255, 20, 100, 1020); - } + 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("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 = $"{playerSkill.Player.GetTranslation("cypher_nospace")}"; + else if (cooldown == 0) playerInfo.PrintHTML = null; else if (playerSkill?.CameraProp == null) playerInfo.PrintHTML = $"{playerSkill?.Player.GetTranslation("hud_info", $"{cooldown}")}"; @@ -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) diff --git a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs index 2317e38..9113c0b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Darkness.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Darkness.cs @@ -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(skillName, "R"), - g: SkillsInfo.GetValue(skillName, "G"), - b: SkillsInfo.GetValue(skillName, "B"), - a: SkillsInfo.GetValue(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(skillName, "R"), - g: SkillsInfo.GetValue(skillName, "G"), - b: SkillsInfo.GetValue(skillName, "B"), - a: SkillsInfo.GetValue(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(skillName, "R"), + g: SkillsInfo.GetValue(skillName, "G"), + b: SkillsInfo.GetValue(skillName, "B"), + a: SkillsInfo.GetValue(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; diff --git a/jRandomSkills - SRC Files/src/player/skills/Dash.cs b/jRandomSkills - SRC Files/src/player/skills/Dash.cs index 05b614d..8226000 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Dash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Dash.cs @@ -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 SkillPlayerInfo = []; + private static readonly object setLock = new(); public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(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(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", $"{cooldown}")}"; + } + + private static void HandleDash(CCSPlayerController player, PlayerSkillInfo skillInfo) { var playerPawn = player.PlayerPawn.Value; if (playerPawn == null || !playerPawn.IsValid) return; @@ -37,55 +89,81 @@ 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) - { - J[player.Slot] = 0; - } - else if ((LB[player.Slot] & PlayerButtons.Jump) == 0 && (buttons & PlayerButtons.Jump) != 0 && J[player.Slot] < 1) - { - J[player.Slot]++; + bool lastJumpPressed = (skillInfo.LastButtons & PlayerButtons.Jump) != 0; + if (!lastJumpPressed && skillInfo.CanUse) + { + skillInfo.Jumps++; + skillInfo.CanUse = false; + skillInfo.Cooldown = DateTime.Now; - float moveX = 0; - float moveY = 0; + float moveX = 0; + float moveY = 0; - PlayerButtons playerButtons = player.Buttons; - if (playerButtons.HasFlag(PlayerButtons.Forward)) - moveY += 1; - if (playerButtons.HasFlag(PlayerButtons.Back)) - moveY -= 1; - if (playerButtons.HasFlag(PlayerButtons.Moveleft)) - moveX += 1; - if (playerButtons.HasFlag(PlayerButtons.Moveright)) - moveX -= 1; + PlayerButtons playerButtons = player.Buttons; + if (SkillsInfo.GetValue(skillName, "anyDirection")) + { + if (playerButtons.HasFlag(PlayerButtons.Forward)) + moveY += 1; + if (playerButtons.HasFlag(PlayerButtons.Back)) + moveY -= 1; + if (playerButtons.HasFlag(PlayerButtons.Moveleft)) + moveX += 1; + if (playerButtons.HasFlag(PlayerButtons.Moveright)) + moveX -= 1; - if (moveX == 0 && moveY == 0) - moveY = 1; + 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); + float moveAngle = MathF.Atan2(moveX, moveY) * (180f / MathF.PI); + QAngle dashAngles = new(0, playerPawn.EyeAngles.Y + moveAngle, 0); - Vector newVelocity = SkillUtils.GetForwardVector(dashAngles) * SkillsInfo.GetValue(skillName, "pushVelocity"); - newVelocity.Z = playerPawn.AbsVelocity.Z + SkillsInfo.GetValue(skillName, "jumpVelocity"); + Vector newVelocity = SkillUtils.GetForwardVector(dashAngles) * SkillsInfo.GetValue(skillName, "pushVelocity"); + newVelocity.Z = playerPawn.AbsVelocity.Z + SkillsInfo.GetValue(skillName, "jumpVelocity"); - playerPawn.AbsVelocity.X = newVelocity.X; - playerPawn.AbsVelocity.Y = newVelocity.Y; - playerPawn.AbsVelocity.Z = newVelocity.Z; + playerPawn.AbsVelocity.X = newVelocity.X; + playerPawn.AbsVelocity.Y = newVelocity.Y; + playerPawn.AbsVelocity.Z = newVelocity.Z; + } } - LF[player.Slot] = flags; - LB[player.Slot] = buttons; + skillInfo.LastFlags = flags; + skillInfo.LastButtons = 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) + 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; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs index a75d406..010be1b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs @@ -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((int)bombIndex); if (bombEntity == null || !bombEntity.IsValid) continue; @@ -170,7 +170,7 @@ namespace src.player.skills playerInfo.PrintHTML = $"{player.GetTranslation("disabled_weapon")}"; } - private static uint? HideBomb(CCSPlayerController player) + private static uint? GetBombIndex(CCSPlayerController player) { var bombEntities = Utilities.FindAllEntitiesByDesignerName("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; } diff --git a/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs index 58ffee5..cf501fd 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs @@ -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(skillName, "smokeRadius")) AddHealth(player.PlayerPawn.Value, SkillsInfo.GetValue(skillName, "smokeHeal")); diff --git a/jRandomSkills - SRC Files/src/player/skills/Iana.cs b/jRandomSkills - SRC Files/src/player/skills/Iana.cs index 17f18b7..d88d3f1 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Iana.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Iana.cs @@ -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(skillName, "color")); + SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(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); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs index 8c88a2b..35bac69 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs @@ -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((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); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Jester.cs b/jRandomSkills - SRC Files/src/player/skills/Jester.cs index 925f683..432ec33 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jester.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jester.cs @@ -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 _) diff --git a/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs b/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs index 499a282..fd7d955 100644 --- a/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/JumpingJack.cs @@ -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; diff --git a/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs b/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs index 7132f08..b82ae1a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LongKnife.cs @@ -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 playersInAction = []; private static readonly MemoryFunctionVoid Shoot_Secondary = new(GameData.GetSignature("Shoot_Secondary")); + private static int i = 0; + public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); @@ -100,23 +100,11 @@ 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(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) { CreateLine(eyePos, endPos, Color.FromArgb(255, 255, 255, 0)); @@ -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(); if (!trace.HitPlayer(out CCSPlayerController? target) || target == null) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs b/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs index c872b97..bfc74e4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LongZeus.cs @@ -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(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) diff --git a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs index 0bdc11c..53e95a5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs @@ -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((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("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; } diff --git a/jRandomSkills - SRC Files/src/player/skills/NoNades.cs b/jRandomSkills - SRC Files/src/player/skills/NoNades.cs index b8200d9..2851990 100644 --- a/jRandomSkills - SRC Files/src/player/skills/NoNades.cs +++ b/jRandomSkills - SRC Files/src/player/skills/NoNades.cs @@ -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) diff --git a/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs b/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs index b89d523..3e6f8be 100644 --- a/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs +++ b/jRandomSkills - SRC Files/src/player/skills/OnlyHead.cs @@ -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) diff --git a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs index de8ef31..4ae2893 100644 --- a/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs +++ b/jRandomSkills - SRC Files/src/player/skills/PawelJumper.cs @@ -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; diff --git a/jRandomSkills - SRC Files/src/player/skills/Planter.cs b/jRandomSkills - SRC Files/src/player/skills/Planter.cs index 0c7cbb6..06c9d16 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Planter.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Planter.cs @@ -27,6 +27,8 @@ namespace src.player.skills var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); if (plantedBomb != null) Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + SkillsInfo.GetValue(skillName, "extraC4BlowTime")); + + player!.PrintToCenterAlert(player.GetTranslation("bombplanted", SkillsInfo.GetValue(skillName, "extraC4BlowTime"))); } public static void DisableSkill(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs b/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs index 20a67b5..ef23357 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Prosthesis.cs @@ -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) diff --git a/jRandomSkills - SRC Files/src/player/skills/Pyro.cs b/jRandomSkills - SRC Files/src/player/skills/Pyro.cs index b302106..0fc962a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Pyro.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Pyro.cs @@ -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(skillName, "regenerationMultiplier")); + var pawn = victim!.PlayerPawn.Value; + SkillUtils.AddHealth(pawn, (int)(damage * SkillsInfo.GetValue(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; diff --git a/jRandomSkills - SRC Files/src/player/skills/RCMelon.cs b/jRandomSkills - SRC Files/src/player/skills/RCMelon.cs index 98e17b2..e11a942 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RCMelon.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RCMelon.cs @@ -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); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs index 043a514..a9a06f0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReactiveArmor.cs @@ -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", $"{cooldown}")}"; } - 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; } diff --git a/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs b/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs index 2b120c1..268fd2d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/RichBoy.cs @@ -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(skillName, "minMoney"), SkillsInfo.GetValue(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"); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Shade.cs b/jRandomSkills - SRC Files/src/player/skills/Shade.cs index 0536f3e..e2c3651 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Shade.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Shade.cs @@ -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 = $"{player.GetTranslation("shade_nospace")}"; } 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 _); } diff --git a/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs b/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs index 3f239de..32850e0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ShortBomb.cs @@ -26,6 +26,8 @@ namespace src.player.skills var plantedBomb = Utilities.FindAllEntitiesByDesignerName("planted_c4").FirstOrDefault(); if (plantedBomb != null) Server.NextFrame(() => plantedBomb.C4Blow = (float)Server.EngineTime + SkillsInfo.GetValue(skillName, "detonationTime")); + + player!.PrintToCenterAlert(player.GetTranslation("bombplanted", SkillsInfo.GetValue(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) diff --git a/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs b/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs index 0985ad0..c31aeb4 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SniperElite.cs @@ -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> playerAWPs = []; - private static readonly ConcurrentDictionary sniperElites = []; + private static readonly ConcurrentDictionary> playerAWPIndexes = []; + private static readonly ConcurrentDictionary savedWeapons = []; + private static readonly ConcurrentDictionary 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((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().GiveNamedItem(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); + { + string currentWeaponName = SkillUtils.GetDesignerName(activeRifle); + bool isScriptAWP = false; - 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().GiveNamedItem(weapon); + lock (setLock) + isScriptAWP = playerAWPIndexes.TryGetValue(steamID, out var indexes) && indexes.Contains(activeRifle.Index); - if (createdWeapon != null && createdWeapon.IsValid && createdWeapon.DesignerName == "weapon_awp") + if (isScriptAWP) { - lock (setLock) + if (savedWeapons.TryGetValue(steamID, out var savedWeapon) && !string.IsNullOrEmpty(savedWeapon)) { - if (playerAWPs.TryGetValue(player.SteamID, out var list)) - list.Add(createdWeapon); - else - playerAWPs.TryAdd(player.SteamID, [createdWeapon]); + 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().GiveNamedItem(weaponToGive.Replace("_script", "")); + + if (createdWeapon != null && createdWeapon.IsValid && weaponToGive.EndsWith("_script")) + { + CBasePlayerWeapon weapon = createdWeapon.As(); + if (weapon?.AttributeManager.Item.NetworkedDynamicAttributes != null) + weapon.AttributeManager.Item.CustomName = player.GetTranslation("sniperelite_customname"); + + lock (setLock) + { + 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 playerWeapons = [.. weaponServices.MyWeapons.Where(w => w != null && w.IsValid && w.Value != null && w.Value.IsValid) - .Select(w => w.Value!.Index)]; + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return; + + var myWeapons = pawn.WeaponServices.MyWeapons; + ConcurrentBag 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 (awp != null && awp.IsValid) + if (playerAWPIndexes.TryGetValue(player.SteamID, out var AWPs)) + foreach (var index in AWPs.ToList()) + if (!myWeaponsIndexes.Contains(index)) { - if (!playerWeapons.Contains(awp.Index)) - { - awp.AcceptInput("Kill"); - AWPs.Remove(awp); - } + var ent = Utilities.GetEntityFromIndex((int)index); + if (ent != null && ent.IsValid) + ent.AcceptInput("Kill"); + + AWPs.Remove(index); } - else - AWPs.Remove(awp!); - } } } 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; - - 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"); + if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return null; + + 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) diff --git a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs index 23a9df1..e072ed3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs @@ -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,7 +20,8 @@ namespace src.player.skills public static void LoadSkill() { - SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); } public static void NewRound() diff --git a/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs b/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs index 40771ac..897a362 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Watchmaker.cs @@ -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(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("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) diff --git a/jRandomSkills - SRC Files/src/utils/Config.cs b/jRandomSkills - SRC Files/src/utils/Config.cs index 105dbda..fef56f7 100644 --- a/jRandomSkills - SRC Files/src/utils/Config.cs +++ b/jRandomSkills - SRC Files/src/utils/Config.cs @@ -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), }; } } diff --git a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs index da32e36..196e07b 100644 --- a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs +++ b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs @@ -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(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(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; diff --git a/jRandomSkills - Server Files/plugins/!jRandomSkills/!jRandomSkills.dll b/jRandomSkills - Server Files/plugins/!jRandomSkills/!jRandomSkills.dll deleted file mode 100644 index 09f8333..0000000 Binary files a/jRandomSkills - Server Files/plugins/!jRandomSkills/!jRandomSkills.dll and /dev/null differ diff --git a/jRandomSkills - Server Files/plugins/!jRandomSkills/MaxMind.Db.dll b/jRandomSkills - Server Files/plugins/!jRandomSkills/MaxMind.Db.dll deleted file mode 100644 index 0608dde..0000000 Binary files a/jRandomSkills - Server Files/plugins/!jRandomSkills/MaxMind.Db.dll and /dev/null differ diff --git a/jRandomSkills - Server Files/plugins/!jRandomSkills/Newtonsoft.Json.dll b/jRandomSkills - Server Files/plugins/!jRandomSkills/Newtonsoft.Json.dll deleted file mode 100644 index d035c38..0000000 Binary files a/jRandomSkills - Server Files/plugins/!jRandomSkills/Newtonsoft.Json.dll and /dev/null differ diff --git a/jRandomSkills - Server Files/plugins/!jRandomSkills/WASDMenuAPI.dll b/jRandomSkills - Server Files/plugins/!jRandomSkills/WASDMenuAPI.dll deleted file mode 100644 index e18b762..0000000 Binary files a/jRandomSkills - Server Files/plugins/!jRandomSkills/WASDMenuAPI.dll and /dev/null differ diff --git a/jRandomSkills - Server Files/plugins/!jRandomSkills/configs/config.json b/jRandomSkills - Server Files/plugins/jRandomSkills/configs/config.json similarity index 78% rename from jRandomSkills - Server Files/plugins/!jRandomSkills/configs/config.json rename to jRandomSkills - Server Files/plugins/jRandomSkills/configs/config.json index 5999716..3a0631f 100644 --- a/jRandomSkills - Server Files/plugins/!jRandomSkills/configs/config.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/configs/config.json @@ -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" } } } \ No newline at end of file diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/configs/playersLanguage.json b/jRandomSkills - Server Files/plugins/jRandomSkills/configs/playersLanguage.json new file mode 100644 index 0000000..326b788 --- /dev/null +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/configs/playersLanguage.json @@ -0,0 +1 @@ +{"0":"en","76561199562070178":"en","76561198150092992":"pt-br"} \ No newline at end of file diff --git a/jRandomSkills - Server Files/plugins/!jRandomSkills/configs/skillsInfo.json b/jRandomSkills - Server Files/plugins/jRandomSkills/configs/skillsInfo.json similarity index 71% rename from jRandomSkills - Server Files/plugins/!jRandomSkills/configs/skillsInfo.json rename to jRandomSkills - Server Files/plugins/jRandomSkills/configs/skillsInfo.json index c3ec575..d39d9bd 100644 --- a/jRandomSkills - Server Files/plugins/!jRandomSkills/configs/skillsInfo.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/configs/skillsInfo.json @@ -5,7 +5,8 @@ "OnlyTeam": 0, "Color": "#fbff00", "Active": true, - "Name": "Zeus" + "Name": "Zeus", + "RequiredPermission": "" }, { "Cooldown": 30.0, @@ -14,16 +15,19 @@ "OnlyTeam": 0, "Color": "#c7e03a", "Active": true, - "Name": "WeaponsSwap" + "Name": "WeaponsSwap", + "RequiredPermission": "" }, { - "ChangeRoundTime": 10, + "ChangeRoundTime": 7, + "SoundEvent": "UIPanorama.sidemenu_select", "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, "Color": "#ff462e", "Active": true, - "Name": "Watchmaker" + "Name": "Watchmaker", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -31,7 +35,8 @@ "OnlyTeam": 0, "Color": "#5d00ff", "Active": true, - "Name": "Wallhack" + "Name": "Wallhack", + "RequiredPermission": "" }, { "SmokeDamage": 2, @@ -41,7 +46,8 @@ "OnlyTeam": 0, "Color": "#507529", "Active": true, - "Name": "ToxicSmoke" + "Name": "ToxicSmoke", + "RequiredPermission": "" }, { "HealthTakenScale": 0.3, @@ -50,7 +56,8 @@ "OnlyTeam": 0, "Color": "#962631", "Active": true, - "Name": "Thorns" + "Name": "Thorns", + "RequiredPermission": "" }, { "Distance": 100.0, @@ -59,7 +66,8 @@ "OnlyTeam": 0, "Color": "#1b04cc", "Active": true, - "Name": "ThirdEye" + "Name": "ThirdEye", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -67,7 +75,8 @@ "OnlyTeam": 0, "Color": "#adaec7", "Active": true, - "Name": "Thief" + "Name": "Thief", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -75,7 +84,8 @@ "OnlyTeam": 0, "Color": "#8A2BE2", "Active": true, - "Name": "Teleporter" + "Name": "Teleporter", + "RequiredPermission": "" }, { "Cooldown": 30.0, @@ -85,7 +95,8 @@ "OnlyTeam": 0, "Color": "#1466F5", "Active": true, - "Name": "SwapPosition" + "Name": "SwapPosition", + "RequiredPermission": "" }, { "Distance": 100.0, @@ -94,16 +105,20 @@ "OnlyTeam": 0, "Color": "#42f5da", "Active": true, - "Name": "Spectator" + "Name": "Spectator", + "RequiredPermission": "" }, { "Cooldown": 5.0, + "CTSoundEvent": "c4.disarmstart", + "TSoundEvent": "C4.PlantSoundB", "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, "Color": "#e3ed8c", "Active": true, - "Name": "SoundMaker" + "Name": "SoundMaker", + "RequiredPermission": "" }, { "ChanceFrom": 1.15, @@ -113,7 +128,8 @@ "OnlyTeam": 0, "Color": "#09ba00", "Active": true, - "Name": "Soldier" + "Name": "Soldier", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -121,7 +137,8 @@ "OnlyTeam": 0, "Color": "#e0873a", "Active": true, - "Name": "SniperElite" + "Name": "SniperElite", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -129,7 +146,8 @@ "OnlyTeam": 0, "Color": "#333333", "Active": true, - "Name": "Silent" + "Name": "Silent", + "RequiredPermission": "" }, { "DetonationTime": 20, @@ -138,7 +156,8 @@ "OnlyTeam": 2, "Color": "#f5b74c", "Active": true, - "Name": "ShortBomb" + "Name": "ShortBomb", + "RequiredPermission": "" }, { "TeleportDistance": 100.0, @@ -149,7 +168,8 @@ "OnlyTeam": 0, "Color": "#4d4d4d", "Active": true, - "Name": "Shade" + "Name": "Shade", + "RequiredPermission": "" }, { "StartHealth": 50, @@ -158,7 +178,8 @@ "OnlyTeam": 0, "Color": "#d41c1c", "Active": true, - "Name": "SecondLife" + "Name": "SecondLife", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -166,7 +187,8 @@ "OnlyTeam": 0, "Color": "#8A2BE2", "Active": true, - "Name": "Saper" + "Name": "Saper", + "RequiredPermission": "" }, { "SlownessTime": 2.0, @@ -176,7 +198,8 @@ "OnlyTeam": 0, "Color": "#8B4513", "Active": true, - "Name": "Rubber" + "Name": "Rubber", + "RequiredPermission": "" }, { "MoneyMultiplier": 35, @@ -185,7 +208,8 @@ "OnlyTeam": 0, "Color": "#119125", "Active": true, - "Name": "RobinHood" + "Name": "RobinHood", + "RequiredPermission": "" }, { "MinMoney": 5000, @@ -195,16 +219,18 @@ "OnlyTeam": 0, "Color": "#D4AF37", "Active": true, - "Name": "RichBoy" + "Name": "RichBoy", + "RequiredPermission": "" }, { - "ZombieHealth": 200, + "ZombieHealth": 250, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, "Color": "#ff5C0A", "Active": true, - "Name": "ReZombie" + "Name": "ReZombie", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -212,7 +238,8 @@ "OnlyTeam": 0, "Color": "#a68132", "Active": true, - "Name": "ReturnToSender" + "Name": "ReturnToSender", + "RequiredPermission": "" }, { "Cooldown": 15.0, @@ -221,16 +248,20 @@ "OnlyTeam": 0, "Color": "#a86eff", "Active": true, - "Name": "Retreat" + "Name": "Retreat", + "RequiredPermission": "" }, { "Cooldown": 15.0, + "YourTeamDamage": 10, + "EnemyTeamDamage": 20, "NeedsTeammates": false, "DisableOnFreezeTime": true, "OnlyTeam": 0, "Color": "#a3000b", "Active": true, - "Name": "Replicator" + "Name": "Replicator", + "RequiredPermission": "" }, { "HealthToAdd": 1, @@ -240,7 +271,8 @@ "OnlyTeam": 0, "Color": "#ff462e", "Active": true, - "Name": "Regeneration" + "Name": "Regeneration", + "RequiredPermission": "" }, { "Cooldown": 15.0, @@ -249,7 +281,19 @@ "OnlyTeam": 0, "Color": "#3cded3", "Active": true, - "Name": "ReactiveArmor" + "Name": "ReactiveArmor", + "RequiredPermission": "" + }, + { + "Cooldown": 30.0, + "Duration": 10.0, + "NeedsTeammates": false, + "DisableOnFreezeTime": true, + "OnlyTeam": 0, + "Color": "#d0d930", + "Active": false, + "Name": "RCMelon", + "RequiredPermission": "" }, { "Cooldown": 15.0, @@ -258,7 +302,8 @@ "OnlyTeam": 0, "Color": "#e0873a", "Active": true, - "Name": "RandomWeapon" + "Name": "RandomWeapon", + "RequiredPermission": "" }, { "MinExtraHealth": 50, @@ -268,7 +313,8 @@ "OnlyTeam": 0, "Color": "#009905", "Active": true, - "Name": "Rambo" + "Name": "Rambo", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -276,7 +322,8 @@ "OnlyTeam": 0, "Color": "#2effcb", "Active": true, - "Name": "RadarHack" + "Name": "RadarHack", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -284,7 +331,8 @@ "OnlyTeam": 0, "Color": "#8a42f5", "Active": true, - "Name": "QuickShot" + "Name": "QuickShot", + "RequiredPermission": "" }, { "RegenerationMultiplier": 1.5, @@ -293,7 +341,8 @@ "OnlyTeam": 0, "Color": "#3c47de", "Active": true, - "Name": "Pyro" + "Name": "Pyro", + "RequiredPermission": "" }, { "ChanceFrom": 0.3, @@ -305,7 +354,8 @@ "OnlyTeam": 0, "Color": "#1e9ab0", "Active": true, - "Name": "Push" + "Name": "Push", + "RequiredPermission": "" }, { "MaxDefusingRange": 80.0, @@ -315,7 +365,8 @@ "OnlyTeam": 3, "Color": "#507529", "Active": true, - "Name": "PsychicDefusing" + "Name": "PsychicDefusing", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -323,7 +374,8 @@ "OnlyTeam": 0, "Color": "#9c9c9c", "Active": true, - "Name": "Prosthesis" + "Name": "Prosthesis", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -331,17 +383,20 @@ "OnlyTeam": 0, "Color": "#ffc061", "Active": true, - "Name": "PrimaryBan" + "Name": "PrimaryBan", + "RequiredPermission": "" }, { "Damage": 1, - "Cooldown": 1.0, + "Cooldown": 0.85, + "MinHealth": 30, "NeedsTeammates": false, "DisableOnFreezeTime": true, "OnlyTeam": 0, "Color": "#902eff", "Active": true, - "Name": "Poison" + "Name": "Poison", + "RequiredPermission": "" }, { "ExtraC4BlowTime": 60, @@ -350,7 +405,8 @@ "OnlyTeam": 2, "Color": "#7d7d7d", "Active": true, - "Name": "Planter" + "Name": "Planter", + "RequiredPermission": "" }, { "MaximumFuel": 150.0, @@ -361,7 +417,8 @@ "OnlyTeam": 0, "Color": "#1466F5", "Active": true, - "Name": "Pilot" + "Name": "Pilot", + "RequiredPermission": "" }, { "ChanceFrom": 0.2, @@ -371,7 +428,8 @@ "OnlyTeam": 0, "Color": "#ff5C0A", "Active": true, - "Name": "Phoenix" + "Name": "Phoenix", + "RequiredPermission": "" }, { "ExtraJumpsMin": 1, @@ -381,7 +439,8 @@ "OnlyTeam": 0, "Color": "#FFA500", "Active": true, - "Name": "PawelJumper" + "Name": "PawelJumper", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -389,7 +448,8 @@ "OnlyTeam": 0, "Color": "#3c47de", "Active": true, - "Name": "OnlyHead" + "Name": "OnlyHead", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -397,7 +457,8 @@ "OnlyTeam": 0, "Color": "#ff5CD9", "Active": true, - "Name": "OneShot" + "Name": "OneShot", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -405,7 +466,8 @@ "OnlyTeam": 0, "Color": "#8a42f5", "Active": true, - "Name": "NoRecoil" + "Name": "NoRecoil", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -413,7 +475,8 @@ "OnlyTeam": 0, "Color": "#FFFFFF", "Active": true, - "Name": "None" + "Name": "None", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -421,7 +484,8 @@ "OnlyTeam": 0, "Color": "#a38c1a", "Active": true, - "Name": "NoNades" + "Name": "NoNades", + "RequiredPermission": "" }, { "Cooldown": 30.0, @@ -431,7 +495,8 @@ "OnlyTeam": 0, "Color": "#44ebd4", "Active": true, - "Name": "Noclip" + "Name": "Noclip", + "RequiredPermission": "" }, { "IdlePercentInvisibility": 0.3, @@ -442,7 +507,8 @@ "OnlyTeam": 0, "Color": "#dedede", "Active": true, - "Name": "Ninja" + "Name": "Ninja", + "RequiredPermission": "" }, { "ExplosionRadius": 500.0, @@ -452,7 +518,8 @@ "OnlyTeam": 0, "Color": "#F5CB42", "Active": true, - "Name": "Muhammed" + "Name": "Muhammed", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -460,7 +527,8 @@ "OnlyTeam": 0, "Color": "#52f54c", "Active": true, - "Name": "MoneySwap" + "Name": "MoneySwap", + "RequiredPermission": "" }, { "HealthToAdd": 50, @@ -471,7 +539,8 @@ "OnlyTeam": 0, "Color": "#10c212", "Active": true, - "Name": "Medic" + "Name": "Medic", + "RequiredPermission": "" }, { "CustomFOV": 50, @@ -480,7 +549,8 @@ "OnlyTeam": 0, "Color": "#9ba882", "Active": true, - "Name": "Magnifier" + "Name": "Magnifier", + "RequiredPermission": "" }, { "MaxDistance": 4096.0, @@ -489,7 +559,8 @@ "OnlyTeam": 0, "Color": "#6effc7", "Active": true, - "Name": "LongZeus" + "Name": "LongZeus", + "RequiredPermission": "" }, { "MaxDistance": 4096.0, @@ -498,7 +569,8 @@ "OnlyTeam": 0, "Color": "#c9f8ff", "Active": true, - "Name": "LongKnife" + "Name": "LongKnife", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -506,7 +578,8 @@ "OnlyTeam": 0, "Color": "#a3651a", "Active": true, - "Name": "LifeSwap" + "Name": "LifeSwap", + "RequiredPermission": "" }, { "FlashDuration": 1.0, @@ -515,7 +588,8 @@ "OnlyTeam": 0, "Color": "#57bcff", "Active": true, - "Name": "KillerFlash" + "Name": "KillerFlash", + "RequiredPermission": "" }, { "HealthToAdd": 3, @@ -524,7 +598,8 @@ "OnlyTeam": 0, "Color": "#a86eff", "Active": true, - "Name": "JumpingJack" + "Name": "JumpingJack", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -532,7 +607,8 @@ "OnlyTeam": 0, "Color": "#b01e5d", "Active": true, - "Name": "JumpBan" + "Name": "JumpBan", + "RequiredPermission": "" }, { "MinTime": 10.0, @@ -542,7 +618,8 @@ "OnlyTeam": 0, "Color": "#8f108f", "Active": true, - "Name": "Jester" + "Name": "Jester", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -550,16 +627,17 @@ "OnlyTeam": 0, "Color": "#42f5a7", "Active": true, - "Name": "Jammer" + "Name": "Jammer", + "RequiredPermission": "" }, { - "MaxStepBeam": 100, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, "Color": "#f542ef", - "Active": false, - "Name": "Jackal" + "Active": true, + "Name": "Jackal", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -567,7 +645,8 @@ "OnlyTeam": 0, "Color": "#0000FF", "Active": true, - "Name": "InfiniteAmmo" + "Name": "InfiniteAmmo", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -575,7 +654,19 @@ "OnlyTeam": 0, "Color": "#99140B", "Active": true, - "Name": "Impostor" + "Name": "Impostor", + "RequiredPermission": "" + }, + { + "Cooldown": 30.0, + "Duration": 10.0, + "NeedsTeammates": false, + "DisableOnFreezeTime": true, + "OnlyTeam": 0, + "Color": "#d0d930", + "Active": true, + "Name": "Iana", + "RequiredPermission": "" }, { "DamageMultiplier": 2.0, @@ -585,7 +676,8 @@ "OnlyTeam": 0, "Color": "#ffdd00", "Active": true, - "Name": "HolyHandGrenade" + "Name": "HolyHandGrenade", + "RequiredPermission": "" }, { "HealthToAdd": 25, @@ -594,7 +686,8 @@ "OnlyTeam": 0, "Color": "#ded678", "Active": true, - "Name": "Hermit" + "Name": "Hermit", + "RequiredPermission": "" }, { "SmokeHeal": 1, @@ -604,7 +697,8 @@ "OnlyTeam": 0, "Color": "#1fe070", "Active": true, - "Name": "HealingSmoke" + "Name": "HealingSmoke", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -612,7 +706,8 @@ "OnlyTeam": 0, "Color": "#4a6e21", "Active": true, - "Name": "Grenadier" + "Name": "Grenadier", + "RequiredPermission": "" }, { "Cooldown": 30.0, @@ -622,7 +717,8 @@ "OnlyTeam": 0, "Color": "#e0d83a", "Active": true, - "Name": "GodMode" + "Name": "GodMode", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -630,7 +726,8 @@ "OnlyTeam": 0, "Color": "#fff52e", "Active": true, - "Name": "Glue" + "Name": "Glue", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -638,7 +735,8 @@ "OnlyTeam": 0, "Color": "#f542ef", "Active": true, - "Name": "Glitch" + "Name": "Glitch", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -646,7 +744,8 @@ "OnlyTeam": 0, "Color": "#5d00ff", "Active": true, - "Name": "Glaz" + "Name": "Glaz", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -654,7 +753,8 @@ "OnlyTeam": 0, "Color": "#FFFFFF", "Active": true, - "Name": "Ghost" + "Name": "Ghost", + "RequiredPermission": "" }, { "RefreshPrice": 150, @@ -663,7 +763,8 @@ "OnlyTeam": 0, "Color": "#7eff47", "Active": true, - "Name": "Gambler" + "Name": "Gambler", + "RequiredPermission": "" }, { "TriggerRadius": 180.0, @@ -673,7 +774,8 @@ "OnlyTeam": 0, "Color": "#00eaff", "Active": true, - "Name": "FrozenDecoy" + "Name": "FrozenDecoy", + "RequiredPermission": "" }, { "HealthMultiplier": 1.5, @@ -682,7 +784,8 @@ "OnlyTeam": 0, "Color": "#ff0000", "Active": true, - "Name": "FriendlyFire" + "Name": "FriendlyFire", + "RequiredPermission": "" }, { "MaxBombHealth": 1000, @@ -691,7 +794,8 @@ "OnlyTeam": 3, "Color": "#5d00ff", "Active": true, - "Name": "FragileBomb" + "Name": "FragileBomb", + "RequiredPermission": "" }, { "Cooldown": 2.0, @@ -702,7 +806,8 @@ "OnlyTeam": 0, "Color": "#1b04cc", "Active": true, - "Name": "Fortnite" + "Name": "Fortnite", + "RequiredPermission": "" }, { "ChanceFrom": 1.2, @@ -712,7 +817,8 @@ "OnlyTeam": 0, "Color": "#A31912", "Active": true, - "Name": "Flash" + "Name": "Flash", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -720,7 +826,8 @@ "OnlyTeam": 0, "Color": "#ffc061", "Active": true, - "Name": "FastReload" + "Name": "FastReload", + "RequiredPermission": "" }, { "Distance": 1000.0, @@ -729,7 +836,8 @@ "OnlyTeam": 0, "Color": "#d1f542", "Active": true, - "Name": "FalconEye" + "Name": "FalconEye", + "RequiredPermission": "" }, { "Damage": 25.0, @@ -741,7 +849,8 @@ "OnlyTeam": 0, "Color": "#9c0000", "Active": true, - "Name": "ExplosiveShot" + "Name": "ExplosiveShot", + "RequiredPermission": "" }, { "Cooldown": 15.0, @@ -751,7 +860,8 @@ "OnlyTeam": 0, "Color": "#ff8c92", "Active": true, - "Name": "EnemySpawn" + "Name": "EnemySpawn", + "RequiredPermission": "" }, { "Cooldown": 16.0, @@ -764,7 +874,8 @@ "OnlyTeam": 0, "Color": "#42f59b", "Active": false, - "Name": "Earthquake" + "Name": "Earthquake", + "RequiredPermission": "" }, { "MinScale": 0.6, @@ -774,7 +885,8 @@ "OnlyTeam": 0, "Color": "#ffff00", "Active": true, - "Name": "Dwarf" + "Name": "Dwarf", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -782,7 +894,8 @@ "OnlyTeam": 0, "Color": "#ffb73b", "Active": true, - "Name": "Duplicator" + "Name": "Duplicator", + "RequiredPermission": "" }, { "HealthRegainScale": 0.3, @@ -791,7 +904,8 @@ "OnlyTeam": 0, "Color": "#FA050D", "Active": true, - "Name": "Dracula" + "Name": "Dracula", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -799,7 +913,8 @@ "OnlyTeam": 0, "Color": "#00f2ff", "Active": true, - "Name": "Distancer" + "Name": "Distancer", + "RequiredPermission": "" }, { "ChanceFrom": 0.2, @@ -809,7 +924,8 @@ "OnlyTeam": 0, "Color": "#FF4500", "Active": true, - "Name": "Disarmament" + "Name": "Disarmament", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -817,7 +933,8 @@ "OnlyTeam": 0, "Color": "#dae01f", "Active": true, - "Name": "Deaf" + "Name": "Deaf", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -825,26 +942,44 @@ "OnlyTeam": 0, "Color": "#919191", "Active": true, - "Name": "Deactivator" + "Name": "Deactivator", + "RequiredPermission": "" }, { "JumpVelocity": 150.0, "PushVelocity": 600.0, + "AnyDirection": true, + "Cooldown": 2.0, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, "Color": "#42bbfc", "Active": true, - "Name": "Dash" + "Name": "Dash", + "RequiredPermission": "" }, { - "Brightness": 0.01, + "R": 0, + "G": 0, + "B": 0, + "A": 230, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, "Color": "#383838", "Active": true, - "Name": "Darkness" + "Name": "Darkness", + "RequiredPermission": "" + }, + { + "Cooldown": 30.0, + "NeedsTeammates": false, + "DisableOnFreezeTime": true, + "OnlyTeam": 0, + "Color": "#34ebd5", + "Active": true, + "Name": "Cypher", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -852,7 +987,8 @@ "OnlyTeam": 0, "Color": "#88a31a", "Active": true, - "Name": "Cutter" + "Name": "Cutter", + "RequiredPermission": "" }, { "BombArmedTime": 10.0, @@ -861,7 +997,8 @@ "OnlyTeam": 3, "Color": "#343deb", "Active": true, - "Name": "ChillOut" + "Name": "ChillOut", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -869,7 +1006,8 @@ "OnlyTeam": 0, "Color": "#FF8B42", "Active": true, - "Name": "Chicken" + "Name": "Chicken", + "RequiredPermission": "" }, { "ChanceFrom": 0.2, @@ -879,7 +1017,18 @@ "OnlyTeam": 0, "Color": "#FF4500", "Active": true, - "Name": "Catapult" + "Name": "Catapult", + "RequiredPermission": "" + }, + { + "DamageAfterMiss": 5, + "NeedsTeammates": false, + "DisableOnFreezeTime": false, + "OnlyTeam": 0, + "Color": "#db6c35", + "Active": true, + "Name": "CarefulBullets", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -887,7 +1036,8 @@ "OnlyTeam": 2, "Color": "#00911f", "Active": true, - "Name": "C4Camouflage" + "Name": "C4Camouflage", + "RequiredPermission": "" }, { "MaxSpeed": 500.0, @@ -898,7 +1048,8 @@ "OnlyTeam": 0, "Color": "#d1430a", "Active": true, - "Name": "BunnyHop" + "Name": "BunnyHop", + "RequiredPermission": "" }, { "TorseReflectionChance": 0.95, @@ -909,7 +1060,8 @@ "OnlyTeam": 0, "Color": "#cc7504", "Active": true, - "Name": "BladeMaster" + "Name": "BladeMaster", + "RequiredPermission": "" }, { "ChanceFrom": 0.2, @@ -919,7 +1071,8 @@ "OnlyTeam": 0, "Color": "#00FF00", "Active": true, - "Name": "Behind" + "Name": "Behind", + "RequiredPermission": "" }, { "SpeedMultipier": 2.0, @@ -930,7 +1083,8 @@ "OnlyTeam": 0, "Color": "#2effc7", "Active": true, - "Name": "Baseball" + "Name": "Baseball", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -938,7 +1092,8 @@ "OnlyTeam": 0, "Color": "#abab33", "Active": true, - "Name": "Bankrupt" + "Name": "Bankrupt", + "RequiredPermission": "" }, { "ChanceFrom": 0.1, @@ -948,7 +1103,8 @@ "OnlyTeam": 0, "Color": "#7E10AD", "Active": true, - "Name": "Astronaut" + "Name": "Astronaut", + "RequiredPermission": "" }, { "DamageMultiplier": 2.0, @@ -958,7 +1114,8 @@ "OnlyTeam": 0, "Color": "#d9d9d9", "Active": true, - "Name": "Assassin" + "Name": "Assassin", + "RequiredPermission": "" }, { "ChanceFrom": 0.65, @@ -968,7 +1125,8 @@ "OnlyTeam": 0, "Color": "#d1430a", "Active": true, - "Name": "Armored" + "Name": "Armored", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -976,7 +1134,8 @@ "OnlyTeam": 3, "Color": "#edf5b5", "Active": true, - "Name": "AreaReaper" + "Name": "AreaReaper", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -984,7 +1143,8 @@ "OnlyTeam": 0, "Color": "#8B4513", "Active": true, - "Name": "AntyHead" + "Name": "AntyHead", + "RequiredPermission": "" }, { "FlashDuration": 7.0, @@ -993,7 +1153,8 @@ "OnlyTeam": 0, "Color": "#D6E6FF", "Active": true, - "Name": "AntyFlash" + "Name": "AntyFlash", + "RequiredPermission": "" }, { "SecondsInBack": 5, @@ -1003,7 +1164,8 @@ "OnlyTeam": 0, "Color": "#a86eff", "Active": true, - "Name": "Anomaly" + "Name": "Anomaly", + "RequiredPermission": "" }, { "NeedsTeammates": false, @@ -1011,6 +1173,7 @@ "OnlyTeam": 0, "Color": "#ff0000", "Active": true, - "Name": "Aimbot" + "Name": "Aimbot", + "RequiredPermission": "" } ] \ No newline at end of file diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/de.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/de.json new file mode 100644 index 0000000..161f149 --- /dev/null +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/de.json @@ -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 ", + "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" +} \ No newline at end of file diff --git a/jRandomSkills - Server Files/plugins/!jRandomSkills/languages/en.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/en.json similarity index 95% rename from jRandomSkills - Server Files/plugins/!jRandomSkills/languages/en.json rename to jRandomSkills - Server Files/plugins/jRandomSkills/languages/en.json index 745900b..32a8e1a 100644 --- a/jRandomSkills - Server Files/plugins/!jRandomSkills/languages/en.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/en.json @@ -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": " | ", diff --git a/jRandomSkills - Server Files/plugins/!jRandomSkills/languages/fr.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/fr.json similarity index 95% rename from jRandomSkills - Server Files/plugins/!jRandomSkills/languages/fr.json rename to jRandomSkills - Server Files/plugins/jRandomSkills/languages/fr.json index 56e1401..91cfcd7 100644 --- a/jRandomSkills - Server Files/plugins/!jRandomSkills/languages/fr.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/fr.json @@ -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,12 +466,12 @@ "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": " | ", "menu_controlls_select": "E - Sélectionner" -} +} \ No newline at end of file diff --git a/jRandomSkills - Server Files/plugins/!jRandomSkills/languages/pl.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pl.json similarity index 95% rename from jRandomSkills - Server Files/plugins/!jRandomSkills/languages/pl.json rename to jRandomSkills - Server Files/plugins/jRandomSkills/languages/pl.json index 2897792..0a2f4f9 100644 --- a/jRandomSkills - Server Files/plugins/!jRandomSkills/languages/pl.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pl.json @@ -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": " | ", diff --git a/jRandomSkills - Server Files/plugins/!jRandomSkills/languages/pt-br.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pt-br.json similarity index 57% rename from jRandomSkills - Server Files/plugins/!jRandomSkills/languages/pt-br.json rename to jRandomSkills - Server Files/plugins/jRandomSkills/languages/pt-br.json index 22a9ece..8884abb 100644 --- a/jRandomSkills - Server Files/plugins/!jRandomSkills/languages/pt-br.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pt-br.json @@ -1,426 +1,442 @@ { - "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", - + "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", - - "chillout": "Esqueci a Senha", + "chicken_desc": "Você ganha um modelo de galinha + 10% de movimento mais rápido - 50 HP", + + "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", "darkness_enemy_info": "Que as luzes se apaguem.", "darkness_player_info": "A escuridão tomou conta do jogador '{0}'.", "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", - - "duplicator": "ctrl+c ctrl+v", - "duplicator_desc": "Escolha um jogador para copiar a habilidade", + "dracula_desc": "Acertar um inimigo restaura saúde igual a uma porcentagem do dano causado", + + "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", "fragilebomb_bomb_health": "Vida da bomba", - + "friendlyfire": "Fogo Amigo", "friendlyfire_desc": "Atirar em companheiros de equipe os cura", - - "frozendecoy": "Decoy Congelante", - "frozendecoy_desc": "Sua decoy congela os players próximos", - - "gambler": "Tigrinho", + + "frozendecoy": "Chamariz Congelante", + "frozendecoy_desc": "Seu chamariz congela todos os jogadores próximos", + + "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ê", - - "glitch": "Sem Mapa", + + "glaz": "Glaz", + "glaz_desc": "Você não pode ver granadas de fumaça", + + "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", - - "healingsmoke": "Smoke Amiga", - "healingsmoke_desc": "Suas smokes curam", - - "hermit": "Sanguessuga", - "hermit_desc": "Matar restaura munição e uma parte da sua vida", - - "holyhandgrenade": "Granada Obesa", - "holyhandgrenade_desc": "HEs causam dano dobrado e têm alcance dobrado", - + + "grenadier": "Grenadier", + "grenadier_desc": "Você tem granadas HE infinitas", + + "healingsmoke": "Fumaça Curativa", + "healingsmoke_desc": "Suas granadas de fumaça curam", + + "hermit": "Eremita", + "hermit_desc": "Matar restaura munição e uma porção de saúde", + + "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:", - - "longknife": "Espada", + "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": "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", - - "moneyswap": "Troca de Grana", - "moneyswap_desc": "Escolha um jogador para trocar de dinheiro com ele", - "moneyswap_enemy_info": "Você provavelmente virou classe B", + "medic_desc": "Clique em [css_useSkill] para usar uma carga de cura que restaura 50 de saúde", + + "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", - - "oneshot": "Ignorante", + "noclip_desc": "Clique em [css_useSkill] para ativar noclip por um curto período", + + "oneshot": "Tiro Único", "oneshot_desc": "Acertar um inimigo o mata instantaneamente", - - "onlyhead": "Só na Cabeçinha", - "onlyhead_desc": "Você só recebe headshot", - - "paweljumper": "Parkourista", - "paweljumper_desc": "Você recebe um número aleatório de pulos extras", - "paweljumper_desc2": "Você ganha {0} pulos extras", - + + "onlyhead": "Apenas Cabeça", + "onlyhead_desc": "Você só recebe dano na cabeça", + + "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", "phoenix_desc2": "Sua chance de renascer após a morte: {0}%", "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", "poison_desc": "Escolha um jogador que receberá dano a cada poucos segundos", "poison_enemy_info": "Você foi envenenado.", "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.", "primaryban_select_info": "Banir rifles do jogador:", - + "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}%", - - "pyro": "Pirotecnia", - "pyro_desc": "Molotov recupera vida", - + + "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": "Piro", + "pyro_desc": "Molotov restaura saúde", + "quickshot": "Tiro Rápido", - "quickshot_desc": "Todas as balas são disparadas extremamente rapidas", - - "radarhack": "Hack de Mapa", - "radarhack_desc": "Inimigos são visíveis no mapa", - + "quickshot_desc": "Todas as balas são disparadas muito rapidamente", + + "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", - - "replicator": "Clone", - "replicator_desc": "Clique em [css_useSkill] para criar um clone que causa dano ao ser atingido", - - "retreat": "De Volta as Origens", + "regeneration_desc": "Você restaura saúde a cada poucos segundos", + + "replicator": "Replicador", + "replicator_desc": "Clique em [css_useSkill] para criar uma réplica que causa dano ao acertar", + + "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", - - "richboy": "Filhinho de Papai", + "returntosender_desc": "O primeiro acerto em um inimigo o envia de volta ao seu spawn", + + "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", - - "saper": "Especialista", + "rubber_desc": "Suas balas retardam significativamente os jogadores", + + "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", - - "silent": "Shhhiu!", + + "shortbomb": "Fusível Curto", + "shortbomb_desc": "A bomba explode muito mais rápido", + + "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", - - "thief": "Lula", + "teleporter_desc": "Você troca de lugar com o inimigo acertado", + + "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.", "thief_select_info": "Roubar skill do jogador:", "thief_incorrect_skill": "Esta habilidade não pode ser selecionada!", - + "thirdeye": "Terceiro Olho", - "thirdeye_desc": "Clique em [css_useSkill] para ativar a terceira pessoa", - - "thorns": "Porco Espinho", + "thirdeye_desc": "Clique em [css_useSkill] para ativar a visão em terceira pessoa", + + "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", - + "watchmaker": "Relojoeiro", "watchmaker_desc": "Cada arremesso de granada altera o tempo da rodada", "watchmaker_ct": "Tempo da rodada reduzido em {0} segundos.", "watchmaker_tt": "Tempo da rodada estendido em {0} segundos.", - + "weaponsswap": "Troca de Armas", "weaponsswap_desc": "Clique em [css_useSkill] para trocar armas com um inimigo aleatório", "weaponsswap_hud_info2": "Você não tem arma para trocar", - + "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", - + "hud_info": "Espere mais {0} segundos", "hud_info_no_enemy": "Nenhum inimigo encontrado", "active_hud_info": "Ativo por mais {0} milissegundos", - + "skills_menu": "Lista de Habilidades", "no_player": "Nenhum jogador correspondente encontrado.", "duplicate_player": "Mais de um jogador encontrado com o mesmo nome.", "selectplayerskill_command": "Digite /t", "selectplayerskill_incorrect_enemy_index": "Não foram encontrados jogadores para selecionar.", - + "skill_not_found_setskill": "Nenhuma habilidade CHATCOLORS.RED encontrada", "player_not_found_setskill": "Nenhum jogador CHATCOLORS.RED encontrado", "correct_form_setskill": "Uso correto: CHATCOLORS.RED!setskill ", @@ -428,10 +444,10 @@ "done_setskill": "Habilidade definida", "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.", "unpause": "Partida retomada.", "healed": "Você foi curado.", @@ -439,7 +455,7 @@ "reload": "Os idiomas e as configurações foram recarregados.", "hud_on": "O HUD foi ativado.", "hud_off": "O HUD foi desativado.", - + "vote_started": "Votação iniciada: '{0}'", "vote_timeout": "Votação '{0}' expirou!", "vote_wait": "Você precisa esperar antes de iniciar outra votação!", @@ -447,14 +463,14 @@ "vote_not_enough_players": "Não há jogadores suficientes para iniciar uma votação!", "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": " | ", "menu_controlls_select": "E - Selecionar" diff --git a/jRandomSkills - Server Files/plugins/!jRandomSkills/languages/zh.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/zh.json similarity index 95% rename from jRandomSkills - Server Files/plugins/!jRandomSkills/languages/zh.json rename to jRandomSkills - Server Files/plugins/jRandomSkills/languages/zh.json index 99d6be0..245438e 100644 --- a/jRandomSkills - Server Files/plugins/!jRandomSkills/languages/zh.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/zh.json @@ -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": " | ", diff --git a/jRandomSkills - Server Files/plugins/!jRandomSkills/packages/GeoLite2-Country.mmdb b/jRandomSkills - Server Files/plugins/jRandomSkills/packages/GeoLite2-Country.mmdb similarity index 54% rename from jRandomSkills - Server Files/plugins/!jRandomSkills/packages/GeoLite2-Country.mmdb rename to jRandomSkills - Server Files/plugins/jRandomSkills/packages/GeoLite2-Country.mmdb index bc47f24..f3c9a52 100644 Binary files a/jRandomSkills - Server Files/plugins/!jRandomSkills/packages/GeoLite2-Country.mmdb and b/jRandomSkills - Server Files/plugins/jRandomSkills/packages/GeoLite2-Country.mmdb differ diff --git a/readme.md b/readme.md index e274e46..0d7dc05 100644 --- a/readme.md +++ b/readme.md @@ -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)
The table below lists all available skills in the game, along with their descriptions. @@ -197,22 +198,22 @@ Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus. | Command | Example | Description | Permissions | | - | - | - | - | -| `!setskill ` | `!setskill Juzlus Aimbot` | Giving skill to a player | `@jRandmosSkills/admin` | +| `!setskill ` | `!setskill Juzlus Aimbot` | Giving skill to a player | `@jRandomSkills/admin` | | `!lang ` | `!lang en` | Change the language | - | | `!skills` | `!skills` | List of skills | - | -| `!map ` | `!map de_nuke` | Change map | `@jRandmosSkills/admin` | -| `!map ` | `!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 ` | `!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 ` | `!map de_nuke` | Change map | `@jRandomSkills/admin` | +| `!map ` | `!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 ` | `!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 ` | `!setscore 10 7` | Set the game score | `@jRandmosSkills/owner` | -| `!setstaticskill ` | `!setstaticskill Juzlus Aimbot` | Giving a player a permanent skill | `@jRandmosSkills/admin` | -| `!setstaticskill None` | `!setstaticskill Juzlus None` | Back to normal | `@jRandmosSkills/admin` | +| `!setscore ` | `!setscore 10 7` | Set the game score | `@jRandomSkills/owner` | +| `!setstaticskill ` | `!setstaticskill Juzlus Aimbot` | Giving a player a permanent skill | `@jRandomSkills/admin` | +| `!setstaticskill 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 +v1.10.0 + +- #### General: +
+
-v1.1.9 BETA +v1.1.9f + +- #### 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. +
+ +
+v1.1.9e + +- #### General: + - ###### Improved display of text frame / content. + - ###### Added customisation options for chat message appearance. +
+ +
+v1.1.9d + +- #### 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). +
+ +
+v1.1.9c + +- #### 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. +
+ +
+v1.1.9b + +- #### 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). +
+ +
+v1.1.9a - #### 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.