Bump version, return SkillAction result & i18n

Bump module version to 1.2.1.b7 and change SkillAction to return the invoked method result (object?) or null when not found. Add and normalize many localization entries across multiple language files (aimlock, homingnades, hotbomb, illiterate, illusionist, magneticdecoy, magneto, miner, planter_planting, teleporter chance string, throwingknife, weightless, wildthrow, smoker, etc.) and clean up duplicate/obsolete entries. Update server plugin binaries and configs (WASDMenuAPI.dll, jRandomSkills.dll, config.json, skillsInfo.json) and remove playersLanguage.json.
This commit is contained in:
Juzlus 2026-04-07 20:57:34 +02:00
parent 3954fc3af4
commit abd3aed8fd
33 changed files with 1159 additions and 324 deletions

View file

@ -28,7 +28,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.2.1.b4";
public override string ModuleVersion => "1.2.1.b7";
public override void Load(bool hotReload)
{
@ -77,7 +77,7 @@ namespace src
Debug.WriteToDebug($"Loaded: {skill.Skill}");
}
internal void SkillAction(string skill, string methodName, object[]? param = null)
internal object? SkillAction(string skill, string methodName, object[]? param = null)
{
string className = $"src.player.skills.{skill}";
Type? type = Type.GetType(className);
@ -85,10 +85,11 @@ namespace src
if (type != null && typeof(ISkill).IsAssignableFrom(type))
{
MethodInfo? method = type.GetMethod(methodName, BindingFlags.Static | BindingFlags.Public);
method?.Invoke(null, param);
return method?.Invoke(null, param);
}
else
Server.PrintToConsole($"Could not find or load {className}");
return null;
}
internal void RegisterListener<T>(Action onTick, HookMode pre)

View file

@ -5,6 +5,9 @@
"aimbot": "Aimbot",
"aimbot_desc": "Jede Kugel, die du triffst, zählt als Kopfschuss",
"aimlock": "Aim-Lock",
"aimlock_desc": "Klicke [css_useSkill], um dein Visier auf den nächsten Gegner zu fixieren",
"anomaly": "Anomalie",
"anomaly_desc": "Du spulst die Zeit um einige Sekunden zurück",
@ -21,6 +24,7 @@
"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.",
"areareaper_bombsite_disabled": "Dieser Bombenplatz wurde deaktiviert!",
"armored": "Gepanzert",
"armored_desc": "Du hast einen zufälligen Schadensmultiplikator",
@ -186,9 +190,22 @@
"holyhandgrenade": "Heilige Handgranate",
"holyhandgrenade_desc": "Deine HE-Granaten verursachen doppelten Schaden und haben doppelte Reichweite",
"homingnades": "Zielsuchende Granaten",
"homingnades_desc": "Deine Granaten (außer Smokes) werden von Gegnern angezogen",
"hotbomb": "Heiße Bombe",
"hotbomb_desc": "Solange du am Leben bist, fügt die Bombe ihrem Träger Schaden zu",
"hotbomb_hint": "Vorsicht, die Bombe ist heiß!",
"iana": "Hologramm",
"iana_desc": "Klicken Sie auf [css_useSkill], um Ihr Hologramm für einige Sekunden zu steuern",
"illiterate": "Analphabet",
"illiterate_desc": "Solange du am Leben bist, können deine Feinde nichts lesen",
"illusionist": "Illusionist",
"illusionist_desc": "Klicke [css_useSkill], um ein Abbild zu schicken, das geradeaus läuft",
"impostor": "Betrüger",
"impostor_desc": "Du beginnst die Runde mit einem feindlichen Spielermodell",
@ -234,6 +251,12 @@
"longzeus": "Langer Zeus",
"longzeus_desc": "Zeus verursacht unabhängig von der Entfernung Schaden",
"magneticdecoy": "Magnetischer Köder",
"magneticdecoy_desc": "Dein Köder zieht Spieler in der Nähe zu sich heran",
"magneto": "Magneto",
"magneto_desc": "Alle feindlichen Granaten werden von dir weggestoßen",
"magnifier": "Lupe",
"magnifier_desc": "Vergrößert den Bildschirm des Gegners und verringert dessen Sichtfeld",
"magnifier_enemy_info": "Dein Sichtfeld wurde verzerrt!",
@ -243,6 +266,9 @@
"medic": "Sanitäter",
"medic_desc": "Klicke auf [css_useSkill], um eine Heilungsladung zu verwenden, die 50 Gesundheitspunkte wiederherstellt",
"miner": "Bomben-Miner",
"miner_desc": "Deine HE-Granate explodiert nur, wenn ein Gegner in der Nähe ist",
"bankrupt": "Bankrott",
"bankrupt_desc": "Wähle den Spieler aus, der sein gesamtes Geld verlieren wird",
"bankrupt_enemy_info": "Du bist bankrott.",
@ -285,11 +311,12 @@
"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_desc": "Fliege für begrenzte Zeit. Doppelklick auf Sprung zum Fliegen",
"pilot_hud_info": "Treibstoff",
"planter": "Freier Planter",
"planter_desc": "Du kannst die Bombe überall platzieren, die Detonationszeit beträgt 60 Sekunden.",
"planter_planting": "Bombe wird gelegt ({0})...",
"poison": "Gift",
"poison_desc": "Wähle einen Spieler aus, der alle paar Sekunden Schaden nimmt",
@ -369,8 +396,11 @@
"silent": "Leise",
"silent_desc": "Deine Schritte und Sprünge sind für ANDERE Spieler lautlos",
"smoker": "Smoker",
"smoker_desc": "Deine Rauchgranaten gehen nie aus",
"sniperelite": "Sniper Elite",
"sniperelite_customname": "Sniper Elite-Fähigkeit",
"sniperelite_customname": "Sniper-Elite-Skill",
"sniperelite_desc": "Klicke auf [css_useSkill], um deine aktuelle Waffe gegen eine AWP auszutauschen",
"soldier": "Soldat",
@ -387,7 +417,8 @@
"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",
"teleporter_desc": "Du hast die Chance, die Plätze mit einem getroffenen Gegner zu tauschen",
"teleporter_desc2": "Deine Chance auf Platztausch nach einem Treffer: {0}%",
"thief": "Dieb",
"thief_desc": "Du kannst einem ausgewählten Spieler eine Fertigkeit stehlen",
@ -402,6 +433,9 @@
"thorns": "Dornen",
"thorns_desc": "Dein Gegner erhält einen Teil des Schadens, den er dir zugefügt hat",
"throwingknife": "Wurfmesser",
"throwingknife_desc": "Klicke [css_useSkill], um ein Messer zu werfen. Aber nimm dich vor anderen in Acht",
"toxicsmoke": "Giftiger Rauch",
"toxicsmoke_desc": "Deine Rauchgranaten verursachen Schaden",
@ -417,6 +451,14 @@
"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",
"weightless": "Schwerelosigkeit",
"weightless_desc": "Deine Granaten werden nicht von der Schwerkraft beeinflusst und fliegen schneller",
"wildthrow": "Wilder Wurf",
"wildthrow_desc": "Wähle einen Spieler aus, der Probleme beim Werfen von Granaten haben wird",
"wildthrow_player_info": "Spieler '{0}' hat all seine Lineups vergessen",
"wildthrow_select_info": "Wähle einen Spieler aus:",
"zeus": "Zeus",
"zeus_desc": "Zeus x27 lädt sich sofort wieder auf",

View file

@ -5,6 +5,9 @@
"aimbot": "Aimbot",
"aimbot_desc": "Every bullet you hit counts as a headshot",
"aimlock": "Aim Lock",
"aimlock_desc": "Click [css_useSkill] to lock your aim on the nearest enemy",
"anomaly": "Anomaly",
"anomaly_desc": "You rewind a few seconds back in time",
@ -21,6 +24,7 @@
"areareaper_select_info": "Select site to deactivate:",
"areareaper_site_disabled": "Bomb site {0} has been deactivated - no bombs can be planted there!",
"areareaper_used_info": "Your skill has already been used.",
"areareaper_bombsite_disabled": "This bombsite has been disabled!",
"armored": "Armored",
"armored_desc": "You have a random damage taken multiplier",
@ -175,7 +179,7 @@
"godmode_on": "Immortality enabled",
"grenadier": "Grenadier",
"grenadier_desc": "You have infinite hegranade",
"grenadier_desc": "You have infinite hegrenade",
"healingsmoke": "Healing Smoke",
"healingsmoke_desc": "Your smoke grenades heal",
@ -186,9 +190,22 @@
"holyhandgrenade": "Holy Hand Grenade",
"holyhandgrenade_desc": "Your HE grenades deal double damage and have double range",
"homingnades": "Homing Grenades",
"homingnades_desc": "Your grenades (except smokes) are attracted to enemies",
"hotbomb": "Hot Bomb",
"hotbomb_desc": "As long as you are alive, the bomb deals damage to its carrier",
"hotbomb_hint": "Careful, the bomb is hot!",
"iana": "Hologram",
"iana_desc": "Click [css_useSkill] to control your hologram for a few seconds",
"illiterate": "Illiterate",
"illiterate_desc": "As long as you are alive, your enemies cannot read",
"illusionist": "Illusionist",
"illusionist_desc": "Click [css_useSkill] to deploy a replica that walks straight ahead",
"impostor": "Impostor",
"impostor_desc": "You start the round with an enemy player model",
@ -234,6 +251,12 @@
"longzeus": "Long Zeus",
"longzeus_desc": "Zeus deals damage regardless of distance",
"magneticdecoy": "Magnetic Decoy",
"magneticdecoy_desc": "Your decoy attracts nearby players towards itself",
"magneto": "Magneto",
"magneto_desc": "All enemy grenades are repelled away from you",
"magnifier": "Magnifier",
"magnifier_desc": "Forces the enemy's screen to zoom in, reducing their field of view",
"magnifier_enemy_info": "Your field of view has been distorted!",
@ -243,6 +266,9 @@
"medic": "Medic",
"medic_desc": "Click [css_useSkill] to use a healing charge that restores 50 health",
"miner": "Bomb Miner",
"miner_desc": "Your HE grenade only explode when there is an enemy nearby",
"bankrupt": "Bankrupt",
"bankrupt_desc": "Choose the player who will lose all their money",
"bankrupt_enemy_info": "You have gone bankrupt.",
@ -290,6 +316,7 @@
"planter": "Free Planter",
"planter_desc": "You can plant the bomb anywhere, with a detonation time of 60 seconds.",
"planter_planting": "Planting ({0})...",
"poison": "Poison",
"poison_desc": "Choose a player who will take damage every few seconds",
@ -390,7 +417,8 @@
"swapposition_desc": "Click [css_useSkill] to swap places with a random enemy",
"teleporter": "Teleporter",
"teleporter_desc": "You swap places with the hit enemy",
"teleporter_desc": "You have the chance to swap places with a hit enemy",
"teleporter_desc2": "Your chances of swapping places after a hit: {0}%",
"thief": "Thief",
"thief_desc": "You can steal a skill from a chosen player",
@ -405,6 +433,9 @@
"thorns": "Thorns",
"thorns_desc": "Your opponent will receive a portion of the damage that they inflicted on you",
"throwingknife": "Throwing Knife",
"throwingknife_desc": "Click [css_useSkill] to throw a knife. But watch out for others",
"toxicsmoke": "Toxic Smoke",
"toxicsmoke_desc": "Your smoke grenades deal damage",
@ -420,6 +451,14 @@
"weaponsswap_desc": "Click [css_useSkill] to swap weapons with a random enemy",
"weaponsswap_hud_info2": "You have no weapon to swap",
"weightless": "Weightlessness",
"weightless_desc": "Your grenades are not affected by gravity and fly faster",
"wildthrow": "Wild Throws",
"wildthrow_desc": "Choose a player who will have trouble throwing grenades",
"wildthrow_player_info": "Player '{0}' has forgotten all their lineups",
"wildthrow_select_info": "Select a player:",
"zeus": "Zeus",
"zeus_desc": "Zeus x27 instantly recharges",
@ -476,54 +515,5 @@
"menu_controlls_scroll": "W/S - Scroll",
"menu_controlls_padding": " | ",
"menu_controlls_select": "E - Select",
"aimlock": "Aim Lock",
"aimlock_desc": "Click [css_useSkill] to lock your aim on the nearest enemy",
"homingnades": "Homing Grenades",
"homingnades_desc": "Your grenades (except smokes) are attracted to enemies",
"hotbomb": "Hot Bomb",
"hotbomb_desc": "As long as you are alive, the bomb deals damage to its carrier",
"hotbomb_hint": "Careful, the bomb is hot!",
"illiterate": "Illiterate",
"illiterate_desc": "As long as you are alive, your enemies cannot read",
"illusionist": "Illusionist",
"illusionist_desc": "Click [css_useSkill] to deploy a replica that walks straight ahead",
"magneticdecoy": "Magnetic Decoy",
"magneticdecoy_desc": "Your decoy attracts nearby players towards itself",
"magneto": "Magneto",
"magneto_desc": "All enemy grenades are repelled away from you",
"weightless": "Weightlessness",
"weightless_desc": "Your grenades are not affected by gravity and fly faster",
"wildthrow": "Wild Throws",
"wildthrow_desc": "Choose a player who will have trouble throwing grenades",
"wildthrow_player_info": "Player '{0}' has forgotten all their lineups",
"wildthrow_select_info": "Select a player:",
"throwingknife": "Throwing Knife",
"throwingknife_desc": "Click [css_useSkill] to throw a knife. But watch out for others",
"planter_planting": "Planting ({0})..."
"menu_controlls_select": "E - Select"
}

View file

@ -5,6 +5,9 @@
"aimbot": "Aimbot",
"aimbot_desc": "Chaque balle que vous touchez compte comme un headshot",
"aimlock": "Verrouillage de visée",
"aimlock_desc": "Cliquez sur [css_useSkill] pour verrouiller votre visée sur l'ennemi le plus proche",
"anomaly": "Anomalie",
"anomaly_desc": "Vous revenez quelques secondes en arrière dans le temps",
@ -21,6 +24,7 @@
"areareaper_select_info": "Sélectionnez un site à désactiver :",
"areareaper_site_disabled": "Le site de bombe {0} a été désactivé – aucune bombe ne peut y être posée !",
"areareaper_used_info": "Votre compétence a déjà été utilisée.",
"areareaper_bombsite_disabled": "Ce site de bombe a été désactivé !",
"armored": "Blindé",
"armored_desc": "Vous avez un multiplicateur de dégâts subis aléatoire",
@ -186,9 +190,22 @@
"holyhandgrenade": "Grenade Sacrée",
"holyhandgrenade_desc": "Vos grenades HE infligent le double de dégâts et ont une portée doublée",
"homingnades": "Grenades à tête chercheuse",
"homingnades_desc": "Vos grenades (sauf les fumigènes) sont attirées par les ennemis",
"hotbomb": "Bombe brûlante",
"hotbomb_desc": "Tant que vous êtes en vie, la bombe inflige des dégâts à son porteur",
"hotbomb_hint": "Attention, la bombe est brûlante !",
"iana": "Hologramme",
"iana_desc": "Cliquez sur [css_useSkill] pour contrôler votre hologramme pendant quelques secondes",
"illiterate": "Illettré",
"illiterate_desc": "Tant que vous êtes en vie, vos ennemis ne mogą pas lire",
"illusionist": "Illusionniste",
"illusionist_desc": "Cliquez sur [css_useSkill] pour déployer une réplique qui marche droit devant",
"impostor": "Imposteur",
"impostor_desc": "Vous commencez le round avec un modèle de joueur ennemi",
@ -234,6 +251,12 @@
"longzeus": "Zeus Longue Portée",
"longzeus_desc": "Le Zeus inflige des dégâts quelle que soit la distance",
"magneticdecoy": "Leurre magnétique",
"magneticdecoy_desc": "Votre leurre attire les joueurs à proximité vers lui",
"magneto": "Magneto",
"magneto_desc": "Toutes les grenades ennemies są repoussées loin de vous",
"magnifier": "Loupe",
"magnifier_desc": "Force l’écran de l’ennemi à zoomer, réduisant son champ de vision",
"magnifier_enemy_info": "Votre champ de vision a été déformé !",
@ -243,6 +266,9 @@
"medic": "Médecin",
"medic_desc": "Appuyez sur [css_useSkill] pour utiliser une charge de soin qui restaure 50 PV",
"miner": "Poseur de mines",
"miner_desc": "Votre grenade HE n'explose que lorsqu'un ennemi est à proximité",
"bankrupt": "Faillite",
"bankrupt_desc": "Choisissez le joueur qui perdra tout son argent",
"bankrupt_enemy_info": "Vous êtes en faillite.",
@ -285,11 +311,12 @@
"psychicdefusing_hud_info": "{0} secondes restantes pour désamorcer",
"pilot": "Pilote",
"pilot_desc": "Volez pendant un temps limité. Maintenez [UTILISER - E] pour voler",
"pilot_desc": "Volez pendant un temps limité. Double-cliquez sur saut pour voler",
"pilot_hud_info": "Carburant",
"planter": "Poseur Libre",
"planter_desc": "Vous pouvez planter la bombe n’importe où, avec un temps de détonation de 60 secondes.",
"planter_planting": "Amorçage ({0})...",
"poison": "Poison",
"poison_desc": "Choisissez un joueur qui subira des dégâts toutes les quelques secondes",
@ -369,6 +396,9 @@
"silent": "Silencieux",
"silent_desc": "Vos pas et vos sauts sont silencieux pour les AUTRES joueurs",
"smoker": "Fumeur",
"smoker_desc": "Vos grenades fumigènes sont illimitées",
"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",
@ -387,7 +417,8 @@
"swapposition_desc": "Appuyez sur [css_useSkill] pour échanger de place avec un ennemi aléatoire",
"teleporter": "Téléporteur",
"teleporter_desc": "Vous échangez de place avec l’ennemi touché",
"teleporter_desc": "Vous avez une chance d'échanger votre place avec un ennemi touché",
"teleporter_desc2": "Vos chances d'échanger votre place après un coup : {0}%",
"thief": "Voleur",
"thief_desc": "Vous pouvez voler la compétence d’un joueur choisi",
@ -402,6 +433,9 @@
"thorns": "Épines",
"thorns_desc": "Votre adversaire recevra une partie des dégâts qu’il vous a infligés",
"throwingknife": "Couteau de lancer",
"throwingknife_desc": "Cliquez sur [css_useSkill] pour lancer un couteau. Mais attention aux autres",
"toxicsmoke": "Fumée Toxique",
"toxicsmoke_desc": "Vos grenades fumigènes infligent des dégâts",
@ -417,6 +451,14 @@
"weaponsswap_desc": "Appuyez sur [css_useSkill] pour échanger vos armes avec un ennemi aléatoire",
"weaponsswap_hud_info2": "Vous n’avez aucune arme à échanger",
"weightless": "Apesanteur",
"weightless_desc": "Vos grenades ne sont pas affectées par la gravité et volent plus vite",
"wildthrow": "Lancers sauvages",
"wildthrow_desc": "Choisissez un joueur qui aura des difficultés à lancer des grenades",
"wildthrow_player_info": "Le joueur '{0}' a oublié tous ses alignements (lineups)",
"wildthrow_select_info": "Sélectionnez un joueur :",
"zeus": "Zeus",
"zeus_desc": "Le Zeus x27 se recharge instantanément",

View file

@ -24,6 +24,7 @@
"areareaper_select_info": "Wybierz strefę do dezaktyw.:",
"areareaper_site_disabled": "Strefa detonacji {0} została dezaktywowana - nie można na niej podłożyć bomby!",
"areareaper_used_info": "Twoja moc została już wykorzystana.",
"areareaper_bombsite_disabled": "Ten bombsite został wyłączony!",
"armored": "Gruby",
"armored_desc": "Masz losowy mnożnik otrzymywanych obrażeń",
@ -189,17 +190,21 @@
"holyhandgrenade": "Święty Granat Ręczny",
"holyhandgrenade_desc": "Twoje granaty uderzeniowe zadają podwójne obrażenia i mają podwójny zasięg",
"homingnades": "Namierzające Granaty",
"homingnades_desc": "Twoje granaty (oprócz dymnych) są przyciągane do wrogów",
"homingnades": "Naprowadzane Granaty",
"homingnades_desc": "Twoje granaty (z wyjątkiem dymnych) są przyciągane do wrogów",
"hotbomb": "Gorąca Bomba",
"hotbomb_desc": "Póki żyjesz, bomba zadaje obrażenia nosicielowi",
"hotbomb_desc": "Dopóki żyjesz, bomba zadaje obrażenia osobie, która ją niesie",
"hotbomb_hint": "Ostrożnie, bomba parzy!",
"iana": "Hologram",
"iana_desc": "Kliknij [css_useSkill], aby sterować hologramem przez kilka sekund",
"illiterate": "Analfabeta",
"illiterate_desc": "Dopóki żyjesz, twoi wrogowie nie potrafią czytać",
"illiterate_desc": "Dopóki żyjesz, Twoi wrogowie nie potrafią czytać",
"illusionist": "Iluzjonista",
"illusionist_desc": "Naciśnij [css_useSkill], aby wypuścić replikę idącą prosto przed siebie",
"impostor": "Szpieg",
"impostor_desc": "Na początku rundy otrzymujesz model postaci przeciwnika",
@ -246,11 +251,11 @@
"longzeus": "Długi Zeus",
"longzeus_desc": "Zeus zadaje obrażenia niezależnie od odległości",
"magneticdecoy": "Magnetyczny Decoy",
"magneticdecoy_desc": "Twój wabik przyciąga graczy wokół siebie",
"magneticdecoy": "Magnetyczny Wabik",
"magneticdecoy_desc": "Twój wabik przyciąga pobliskich graczy do siebie",
"magneto": "Magneto",
"magneto_desc": "Wszystkie granaty przeciwnika są odpychane od ciebie",
"magneto_desc": "Wszystkie granaty wroga są odpychane od Ciebie",
"magnifier": "Lupa",
"magnifier_desc": "Przybiżasz ekran wybranemu przeciwnikowi",
@ -261,6 +266,9 @@
"medic": "Medyk",
"medic_desc": "Kliknij [css_useSkill], aby użyć ładunku leczniczego, który przywraca 50 punktów zdrowia",
"miner": "Bomberman",
"miner_desc": "Twoje granaty HE wybuchają tylko wtedy, gdy w pobliżu jest wróg",
"moneyswap": "Skarbówka",
"moneyswap_desc": "Wybierasz gracza, z którym chcesz zamienić się pieniędzmi",
"moneyswap_enemy_info": "Urząd skarbowy cię dopadł.",
@ -303,11 +311,12 @@
"psychicdefusing_hud_info": "Pozostało {0} sekund do rozbrojenia",
"pilot": "Pilot",
"pilot_desc": "Latanie przez określony czas. Kliknij dwukrotnie skok, aby latać",
"pilot_desc": "Lataj przez ograniczony czas. Kliknij dwa razy skok, aby lecieć",
"pilot_hud_info": "Paliwo",
"planter": "Samowolka",
"planter_desc": "Bombę można podłożyć w dowolnym miejscu, a czas detonacji wynosi 60 sekund.",
"planter_planting": "Plantowanie ({0})...",
"poison": "Trutka",
"poison_desc": "Wybierasz gracza, który co kilka sekund będzie otrzymywał obrażenia",
@ -408,7 +417,8 @@
"swapposition_desc": "Kliknij [css_useSkill], aby zamienić się miejscami z losowym przeciwnikiem",
"teleporter": "Teleporter",
"teleporter_desc": "Zamieniasz się miejscami z trafionym przeciwnikiem",
"teleporter_desc": "Masz szansę na zamianę miejsc z trafionym wrogiem",
"teleporter_desc2": "Szansa na zamianę miejsc po trafieniu: {0}%",
"thief": "Złodziej",
"thief_desc": "Możesz ukraść supermoc wybranemu graczowi",
@ -424,7 +434,7 @@
"thorns_desc": "Twój przeciwnik otrzymuje część obrażeń, które zadał ci",
"throwingknife": "Nóż do Rzucania",
"throwingknife_desc": "Kliknij [css_useSkill], aby rzucić nożem. Ale uważaj na innych",
"throwingknife_desc": "Naciśnij [css_useSkill], aby rzucić nożem. Ale uważaj na innych",
"toxicsmoke": "Toksyczny Dym",
"toxicsmoke_desc": "Twoje granaty dymny zadają obrażenia",
@ -441,10 +451,10 @@
"weaponsswap_desc": "Kliknij [css_useSkill], aby zamienić się bronią z losowym przeciwnikiem",
"weaponsswap_hud_info2": "Nie posiadasz broni na zamiane",
"weightless": "Stan Nieważkości",
"weightless": "Nieważkość",
"weightless_desc": "Twoje granaty nie podlegają grawitacji i lecą szybciej",
"wildthrow": "Dzikie rzuty",
"wildthrow": "Dzikie Rzuty",
"wildthrow_desc": "Wybierz gracza, który będzie miał trudności z rzucaniem granatami",
"wildthrow_player_info": "Gracz '{0}' zapomniał wszystkie lineup'y",
"wildthrow_select_info": "Wybierz gracza:",

View file

@ -5,6 +5,9 @@
"aimbot": "Aimbot",
"aimbot_desc": "Toda bala que você acertar conta como um hs",
"aimlock": "Aim Lock",
"aimlock_desc": "Clique em [css_useSkill] para travar a mira no inimigo mais próximo",
"anomaly": "Máquina do Tempo",
"anomaly_desc": "Você volta alguns segundos no tempo",
@ -21,6 +24,7 @@
"areareaper_select_info": "Escolha o bomb p/ desativar:",
"areareaper_site_disabled": "Bombsite {0} foi desativado - nenhuma bomba pode ser plantada lá!",
"areareaper_used_info": "Seu poder já foi usado.",
"areareaper_bombsite_disabled": "Este local de bomba foi desativado!",
"armored": "Super Tiro",
"armored_desc": "Seu dano é multiplicado por um valor aleatório",
@ -152,6 +156,7 @@
"gambler_desc": "Selecione uma habilidade da lista.",
"gambler_select_info": "Escolha sua habilidade:",
"gambler_more": "#00FF00|Atualizar por ${0}",
"gambler_no_money": "Yetersiz bakiye.",
"ghost": "Fantasma",
"ghost_desc": "Você é completamente invisível",
@ -185,9 +190,22 @@
"holyhandgrenade": "Granada Obesa",
"holyhandgrenade_desc": "HEs causam dano dobrado e têm alcance dobrado",
"homingnades": "Granadas Teleguiadas",
"homingnades_desc": "Suas granadas (exceto fumaça) são atraídas por inimigos",
"hotbomb": "Bomba Quente",
"hotbomb_desc": "Enquanto você estiver vivo, a bomba causa dano ao portador",
"hotbomb_hint": "Cuidado, a bomba está quente!",
"iana": "Holograma",
"iana_desc": "Clique em [css_useSkill] para controlar seu holograma por alguns segundos",
"illiterate": "Analfabeto",
"illiterate_desc": "Enquanto você estiver vivo, seus inimigos não conseguem ler",
"illusionist": "Ilusionista",
"illusionist_desc": "Clique em [css_useSkill] para enviar uma réplica que caminha em frente",
"impostor": "Impostor",
"impostor_desc": "Você começa a rodada vestido do time inimigo",
@ -233,6 +251,12 @@
"longzeus": "Zeus Longo",
"longzeus_desc": "Zeus causa dano independentemente da distância",
"magneticdecoy": "Decoy Magnético",
"magneticdecoy_desc": "Seu decoy atrai jogadores próximos para si mesmo",
"magneto": "Magneto",
"magneto_desc": "Todas as granadas inimigas są repelidas para longe de você",
"magnifier": "Lupa",
"magnifier_desc": "Força a tela do inimigo a dar um zoom, reduzindo seu campo de visão",
"magnifier_enemy_info": "Seu campo de visão foi distorcido!",
@ -242,6 +266,9 @@
"medic": "Médico",
"medic_desc": "Clique em [css_useSkill] para usar uma injeção que restaura 50 de vida",
"miner": "Mineiro de Bombas",
"miner_desc": "Sua granada HE só explode quando há um inimigo por perto",
"moneyswap": "Troca de Grana",
"moneyswap_desc": "Escolha um jogador para trocar de dinheiro com ele",
"moneyswap_enemy_info": "Você provavelmente virou classe B",
@ -284,11 +311,12 @@
"psychicdefusing_hud_info": "{0} segundos restantes para desarmar",
"pilot": "Jetpack",
"pilot_desc": "Voe por um tempo limitado. Segure [USE - E] para voar",
"pilot_desc": "Voe por tempo limitado. Clique duas vezes no pulo para voar",
"pilot_hud_info": "Combustível",
"planter": "Meu Bombsite Minha Vida",
"planter_desc": "Você pode plantar a bomba em qualquer lugar, com um tempo de detonação de 60 segundos.",
"planter_planting": "Plantando ({0})...",
"poison": "Veneno",
"poison_desc": "Escolha um jogador que receberá dano a cada poucos segundos",
@ -368,8 +396,12 @@
"silent": "Shhhiu!",
"silent_desc": "Seus passos e pulos são silenciosos para OUTROS jogadores",
"smoker": "Tiryaki",
"smoker_desc": "Sis bombalarınız asla bitmez",
"sniperelite": "Sniper do BOPE",
"sniperelite_desc": "Clique em [css_useSkill] para trocar sua arma atual por uma AWP",
"sniperelite_customname": "Keskin Nişancı Elit Yeteneği",
"soldier": "Soldado",
"soldier_desc": "Seus tiros causam mais dano",
@ -385,7 +417,8 @@
"swapposition_desc": "Clique em [css_useSkill] para trocar de lugar com um inimigo aleatório",
"teleporter": "Teletransportador",
"teleporter_desc": "Você troca de lugar com o inimigo que acertar",
"teleporter_desc": "Você tem a chance de trocar de lugar com um inimigo atingido",
"teleporter_desc2": "Sua chance de trocar de lugar após o acerto: {0}%",
"thief": "Lula",
"thief_desc": "Você pode roubar uma habilidade de um jogador escolhido",
@ -400,6 +433,9 @@
"thorns": "Porco Espinho",
"thorns_desc": "Seu oponente receberá uma parte do dano que causou a você",
"throwingknife": "Faca de Arremesso",
"throwingknife_desc": "Clique em [css_useSkill] para lançar uma faca. Mas cuidado com os outros",
"toxicsmoke": "Smoke Tóxica",
"toxicsmoke_desc": "Suas smokes causam dano",
@ -415,6 +451,14 @@
"weaponsswap_desc": "Clique em [css_useSkill] para trocar armas com um inimigo aleatório",
"weaponsswap_hud_info2": "Você não tem arma para trocar",
"weightless": "Gravidade Zero",
"weightless_desc": "Suas granadas não são afetadas pela gravidade e voam mais rápido",
"wildthrow": "Arremesso Selvagem",
"wildthrow_desc": "Escolha um jogador que terá problemas para lançar granadas",
"wildthrow_player_info": "O jogador '{0}' esqueceu todos os seus lineups",
"wildthrow_select_info": "Selecione um jogador:",
"zeus": "Zeus",
"zeus_desc": "Zeus x27 recarrega instantaneamente",

View file

@ -5,6 +5,9 @@
"aimbot": "Aimbot",
"aimbot_desc": "Vurduğun her mermi kafadan vuruş (headshot) sayılır",
"aimlock": "Nişan Kilidi",
"aimlock_desc": "En yakın düşmana nişan almak için [css_useSkill] tuşuna basın",
"anomaly": "Anomali",
"anomaly_desc": "Zamanı birkaç saniye geriye alırsın",
@ -21,6 +24,7 @@
"areareaper_select_info": "Devre dışı bırakılacak alanı seçin:",
"areareaper_site_disabled": "Bomba alanı {0} devre dışı bırakıldı - buraya bomba kurulamaz!",
"areareaper_used_info": "Yeteneğin zaten kullanıldı.",
"areareaper_bombsite_disabled": "Bu bomba alanı devre dışı bırakıldı!",
"armored": "Zırhlı",
"armored_desc": "Rastgele bir hasar alma çarpanına sahip olursun",
@ -186,9 +190,22 @@
"holyhandgrenade": "Kutsal El Bombası",
"holyhandgrenade_desc": "El bombaların iki kat hasar verir ve iki kat menzile sahiptir",
"homingnades": "Güdümlü El Bombaları",
"homingnades_desc": "El bombalarınız (sis hariç) düşmanlara yönelir",
"hotbomb": "Sıcak Bomba",
"hotbomb_desc": "Siz hayatta olduğunuz sürece, bomba taşıyıcısına hasar verir",
"hotbomb_hint": "Dikkatli ol, bomba çok sıcak!",
"iana": "Hologram",
"iana_desc": "Hologramını birkaç saniyeliğine kontrol etmek için E tuşuna bas",
"illiterate": "Okuryazar Olmayan",
"illiterate_desc": "Siz hayatta olduğunuz sürece, düşmanlarınız yazıları okuyamaz",
"illusionist": "İllüzyonist",
"illusionist_desc": "Düz ilerleyen bir kopya oluşturmak için [css_useSkill] tuşuna basın",
"impostor": "Sahtekar",
"impostor_desc": "Raunda düşman oyuncu modeliyle başlarsın",
@ -234,6 +251,12 @@
"longzeus": "Uzak Zeus",
"longzeus_desc": "Zeus mesafeden bağımsız olarak hasar verir",
"magneticdecoy": "Manyetik Yanıltıcı",
"magneticdecoy_desc": "Yanıltıcı bombanız yakındaki oyuncuları kendine çeker",
"magneto": "Magneto",
"magneto_desc": "Tüm düşman el bombaları sizden uzaklaştırılır",
"magnifier": "Büyüteç",
"magnifier_desc": "Düşmanın ekranını yakınlaştırarak görüş alanını daraltır",
"magnifier_enemy_info": "Görüş alanın bozuldu!",
@ -243,6 +266,9 @@
"medic": "Sıhhiye",
"medic_desc": "50 can yenileyen bir iyileştirme yükü kullanmak için E tuşuna bas",
"miner": "Bomba Madencisi",
"miner_desc": "El bombanız (HE) sadece yakında bir düşman olduğunda patlar",
"bankrupt": "İflas",
"bankrupt_desc": "Tüm parasını kaybedecek bir oyuncu seç",
"bankrupt_enemy_info": "İflas ettin.",
@ -285,11 +311,12 @@
"psychicdefusing_hud_info": "İmha için {0} saniye kaldı",
"pilot": "Pilot",
"pilot_desc": "Sınırlı bir süre uç. Uçmak için [USE - E] tuşuna basılı tut",
"pilot_desc": "Sınırlı bir süre uçun. Uçmak için zıplama tuşuna iki kez basın",
"pilot_hud_info": "Yakıt",
"planter": "Serbest Kurucu",
"planter_desc": "Bombayı her yere kurabilirsin, patlama süresi 60 saniyedir.",
"planter_planting": "Kuruluyor ({0})...",
"poison": "Zehir",
"poison_desc": "Birkaç saniyede bir hasar alacak bir oyuncu seç",
@ -369,6 +396,9 @@
"silent": "Sessiz",
"silent_desc": "Ayak seslerin ve zıplamaların DİĞER oyunculara duyulmaz",
"smoker": "Tiryaki",
"smoker_desc": "Sis bombalarınız asla bitmez",
"sniperelite": "Keskin Nişancı",
"sniperelite_customname": "Keskin Nişancı Yeteneği",
"sniperelite_desc": "Mevcut silahını bir AWP ile değiştirmek için E tuşuna bas",
@ -387,7 +417,8 @@
"swapposition_desc": "Rastgele bir düşmanla yer değiştirmek için E tuşuna bas",
"teleporter": "Işınlayıcı",
"teleporter_desc": "Vurduğun düşmanla yer değiştirirsin",
"teleporter_desc": "Vurulan bir düşmanla yer değiştirme şansınız var",
"teleporter_desc2": "Vuruştan sonra yer değiştirme şansınız: %{0}",
"thief": "Hırsız",
"thief_desc": "Seçilen bir oyuncudan yeteneğini çalabilirsin",
@ -402,6 +433,9 @@
"thorns": "Dikenler",
"thorns_desc": "Rakibin, sana verdiği hasarın bir kısmını geri alır",
"throwingknife": "Fırlatma Bıçağı",
"throwingknife_desc": "Bıçak fırlatmak için [css_useSkill] tuşuna basın. Ama başkalarına dikkat edin",
"toxicsmoke": "Zehirli Sis",
"toxicsmoke_desc": "Sis bombaların hasar verir",
@ -417,6 +451,14 @@
"weaponsswap_desc": "Rastgele bir düşmanla silahları takas etmek için E tuşuna bas",
"weaponsswap_hud_info2": "Takas edilecek silahın yok",
"weightless": "Yerçekimsiz",
"weightless_desc": "El bombalarınız yerçekiminden etkilenmez ve daha hızlı uçar",
"wildthrow": "Vahşi Atış",
"wildthrow_desc": "El bombası atmakta zorluk çekecek bir oyuncu seçin",
"wildthrow_player_info": "'{0}' adlı oyuncu tüm taktiklerini unuttu",
"wildthrow_select_info": "Bir oyuncu seçin:",
"zeus": "Zeus",
"zeus_desc": "Zeus x27 anında şarj olur",

View file

@ -5,6 +5,9 @@
"aimbot": "自动瞄准",
"aimbot_desc": "你击中的每颗子弹都算作爆头",
"aimlock": "自瞄锁定",
"aimlock_desc": "点击 [css_useSkill] 锁定距离最近的敌人",
"anomaly": "异常",
"anomaly_desc": "你会倒退几秒钟的时间",
@ -21,6 +24,7 @@
"areareaper_select_info": "选择你想禁用的炸弹点:",
"areareaper_site_disabled": "炸弹点 {0} 已被禁用 - 无法在此放置炸弹!",
"areareaper_used_info": "你的能力已被使用。",
"areareaper_bombsite_disabled": "该炸弹安置点已被禁用!",
"armored": "装甲",
"armored_desc": "你有随机受到伤害的倍率",
@ -186,9 +190,22 @@
"holyhandgrenade": "神圣手榴弹",
"holyhandgrenade_desc": "你的高爆手榴弹造成双倍伤害并拥有双倍范围",
"homingnades": "追踪手雷",
"homingnades_desc": "你的手雷(烟雾弹除外)会自动追踪敌人",
"hotbomb": "烫手山芋",
"hotbomb_desc": "只要你还活着,炸弹就会对携带者造成伤害",
"hotbomb_hint": "小心,炸弹很烫!",
"iana": "全息图",
"iana_desc": "点击 [css_useSkill] 可控制你的全息影像数秒",
"illiterate": "文盲",
"illiterate_desc": "只要你还活着,你的敌人就无法阅读信息",
"illusionist": "幻術师",
"illusionist_desc": "点击 [css_useSkill] 部署一个直线行走的幻象",
"impostor": "冒名顶替者",
"impostor_desc": "回合开始时你获得敌方玩家模型",
@ -234,6 +251,12 @@
"longzeus": "长宙斯",
"longzeus_desc": "宙斯电击枪无论距离多远都能造成伤害",
"magneticdecoy": "磁性诱饵",
"magneticdecoy_desc": "你的诱饵弹会将附近的玩家吸引到自己身边",
"magneto": "万磁王",
"magneto_desc": "所有敌方手雷都会被你弹开",
"magnifier": "放大镜",
"magnifier_desc": "强制敌方屏幕放大,缩小其视野范围",
"magnifier_enemy_info": "你的视野已被扭曲!",
@ -243,6 +266,9 @@
"medic": "医务兵",
"medic_desc": "点击 [css_useSkill] 使用治疗装置恢复50点生命值",
"miner": "炸弹矿工",
"miner_desc": "你的高爆手雷仅在附近有敌人时才会爆炸",
"moneyswap": "税务员",
"moneyswap_desc": "选择一个玩家以交换金钱",
"moneyswap_enemy_info": "税务局找上你了。",
@ -285,11 +311,12 @@
"psychicdefusing_hud_info": "拆除还剩 {0} 秒",
"pilot": "飞行员",
"pilot_desc": "在有限时间内飞行。按住 [USE - E] 飞行",
"pilot_desc": "限时飞行。双击跳跃键开始飞行",
"pilot_hud_info": "燃料",
"planter": "自由种植者",
"planter_desc": "你可以在任何地方放置炸弹,引爆时间为60秒。",
"planter_planting": "安放炸弹中 ({0})...",
"poison": "毒药",
"poison_desc": "选择一个玩家,每隔几秒受到伤害",
@ -369,6 +396,9 @@
"silent": "无声",
"silent_desc": "你的脚步和跳跃对其他玩家无声",
"smoker": "烟雾使者",
"smoker_desc": "你的烟雾弹永远用不完",
"sniperelite": "狙击精英",
"sniperelite_customname": "狙击精英技能",
"sniperelite_desc": "点击 [css_useSkill] 将当前武器替换为AWP",
@ -387,7 +417,8 @@
"swapposition_desc": "点击 [css_useSkill] 与随机敌人交换位置",
"teleporter": "传送者",
"teleporter_desc": "你与被击中的敌人交换位置",
"teleporter_desc": "击中敌人后你有机会与其交换位置",
"teleporter_desc2": "击中后交换位置的概率为:{0}%",
"thief": "小偷",
"thief_desc": "你可以从选定玩家那里偷取技能",
@ -402,6 +433,9 @@
"thorns": "荊棘",
"thorns_desc": "你的對手將承受其對你造成傷害的一部分",
"throwingknife": "投掷飞刀",
"throwingknife_desc": "点击 [css_useSkill] 扔出飞刀。但要小心其他人",
"toxicsmoke": "毒烟",
"toxicsmoke_desc": "你的烟雾弹会造成伤害",
@ -417,6 +451,14 @@
"weaponsswap_desc": "点击 [css_useSkill] 与随机敌人交换武器",
"weaponsswap_hud_info2": "你没有可交换的武器",
"weightless": "失重状态",
"weightless_desc": "你的手雷不受重力影响,且飞行速度更快",
"wildthrow": "乱扔手雷",
"wildthrow_desc": "选择一名丢雷会遇到麻烦的玩家",
"wildthrow_player_info": "玩家 '{0}' 已经忘记了所有投掷角度",
"wildthrow_select_info": "选择一名玩家:",
"zeus": "宙斯",
"zeus_desc": "宙斯x27立即充能",

View file

@ -44,6 +44,7 @@ public interface ISkill
public static void OnTriggerEnter(CBaseTrigger _, CBaseEntity __) { }
public static void OnTriggerExit(CBaseTrigger _, CBaseEntity __) { }
public static bool OnWeaponCanAcquire(DynamicHook _, CCSPlayerController __, CEconItemView ___, CCSWeaponBaseVData ____) { return false; }
public class SkillConfig { }
}
@ -52,7 +53,7 @@ public enum Skills
{
None,
Aimbot,
AimLock, // <-
AimLock,
Anomaly,
AntyFlash,
AntyHead,
@ -81,7 +82,7 @@ public enum Skills
Dracula,
Duplicator,
Dwarf,
Earthquake, // <-
Earthquake,
EnemySpawn,
ExplosiveShot,
FalconEye,
@ -98,11 +99,11 @@ public enum Skills
Glue,
GodMode,
Grenadier,
HealingChicken, // <-
HealingChicken,
HealingSmoke,
Hermit,
HolyHandGrenade,
HomingNades, // <-
HomingNades,
HotBomb,
Iana,
Illiterate,
@ -134,7 +135,7 @@ public enum Skills
PawelJumper,
Phoenix,
PsychicDefusing,
Pilot, // <-
Pilot,
Planter,
Poison,
PrimaryBan,
@ -145,7 +146,7 @@ public enum Skills
RadarHack,
Rambo,
RandomWeapon,
RCMelon, // <-
RCMelon,
ReZombie,
ReactiveArmor,
Regeneration,
@ -158,10 +159,10 @@ public enum Skills
Saper,
SecondLife,
Shade,
ShortBomb, // <- short
ShortBomb,
Silent,
Smoker, // <- nie dziala
SniperElite, // <- nie dziala
Smoker,
SniperElite,
Soldier,
SoundMaker,
Spectator,

View file

@ -80,6 +80,7 @@ namespace src.player
VirtualFunctions.CBaseTrigger_StartTouchFunc.Hook(OnTriggerEnter, HookMode.Post);
VirtualFunctions.CBaseTrigger_EndTouchFunc.Hook(OnTriggerExit, HookMode.Pre);
VirtualFunctions.CCSPlayer_ItemServices_CanAcquireFunc.Hook(OnWeaponCanAcquire, HookMode.Pre);
}
private static HookResult PlayerMakeSound(UserMessage um)
@ -388,6 +389,44 @@ namespace src.player
}
}
private static HookResult OnWeaponCanAcquire(DynamicHook hook)
{
lock (setLock)
{
CCSPlayer_ItemServices itemServices = hook.GetParam<CCSPlayer_ItemServices>(0);
if (itemServices == null || itemServices.Pawn.Value == null || !itemServices.Pawn.Value.IsValid) return HookResult.Continue;
CEconItemView econItem = hook.GetParam<CEconItemView>(1);
if (econItem == null) return HookResult.Continue;
CBasePlayerPawn pawn = itemServices.Pawn.Value;
if (pawn == null || !pawn.IsValid || pawn.Controller.Value == null || !pawn.Controller.Value.IsValid) return HookResult.Continue;
CCSPlayerController player = pawn.Controller.Value.As<CCSPlayerController>();
if (player == null || !player.IsValid) return HookResult.Continue;
CCSWeaponBaseVData vdata = VirtualFunctions.GetCSWeaponDataFromKeyFunc.Invoke(-1, econItem.ItemDefinitionIndex.ToString());
if (vdata == null) return HookResult.Continue;
var activeSkills = Instance.SkillPlayer
.Where(p => !p.IsDrawing)
.Select(p => p.Skill.ToString())
.Distinct();
bool block = false;
foreach (string skillName in activeSkills)
{
bool? result = (bool?)Instance.SkillAction(skillName, "OnWeaponCanAcquire", [hook, player, econItem, vdata]);
if (result == true)
{
block = true;
break;
}
}
return block ? HookResult.Stop : HookResult.Continue;
}
}
private static void OnTick()
{
lock (setLock)
@ -827,10 +866,6 @@ namespace src.player
}
}
if (randomSkill.Display)
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(randomSkill.Skill)}{ChatColors.Lime}: {player.GetSkillDescription(randomSkill.Skill)}",
border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t");
Instance?.SkillAction(skillPlayer.Skill.ToString(), "DisableSkill", [player]);
skillPlayer.Skill = randomSkill.Skill;
skillPlayer.SpecialSkill = Skills.None;
@ -840,6 +875,10 @@ namespace src.player
Instance?.AddTimer(.2f, () =>
{
if (randomSkill.Display)
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(randomSkill.Skill)}{ChatColors.Lime}: {player.GetSkillDescription(randomSkill.Skill)}",
border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t");
if (SkillsInfo.GetValue<bool>(randomSkill.Skill, "disableOnFreezeTime") && SkillUtils.IsFreezeTime())
Instance?.AddTimer(Config.LoadedConfig.SkillTimeBeforeStart, () =>
{
@ -1016,10 +1055,10 @@ namespace src.player
}
var config = Config.LoadedConfig.HtmlHudCustomisation;
var emptySymbol = $"<font class='fontSize-{(string.IsNullOrEmpty(headerLine) ? "l" : "ml")}'> </font>";
var emptySymbol = $"<font class='fontSize-{(string.IsNullOrEmpty(headerLine) || string.IsNullOrEmpty(config.HeaderLineSize) ? "l" : "ml")}'> </font>";
var emptySymbol2 = $"<font class='fontSize-ml'> </font>";
string infoLine = string.IsNullOrEmpty(headerLine)
string infoLine = string.IsNullOrEmpty(headerLine) || string.IsNullOrEmpty(config.HeaderLineSize)
? ""
: $"<font class='fontWeight-Bold fontSize-{config.HeaderLineSize}' color='{config.HeaderLineColor}'>{headerLine}:</font><br>";
@ -1030,6 +1069,7 @@ namespace src.player
: $"<br>{emptySymbol}<font class='fontSize-{(isDescription ? config.SkillDescriptionLineSize : config.InfoLineSize)}' color='{(isDescription ? config.SkillDescriptionLineColor : config.InfoLineColor)}'>{extraLine}</font>{emptySymbol}";
var hudContent = infoLine + skillLine + remainingLine;
player.PrintToCenterHtml(hudContent);
}
}

View file

@ -105,7 +105,7 @@ namespace src.player
var observeredPlayerSpecialSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == observeredPlayerSkill.SpecialSkill);
if (observeredPlayerSpecialSkillInfo == null) return;
string pName = observeredPlayerSkill.PlayerName;
string pName = System.Net.WebUtility.HtmlEncode(observeredPlayerSkill.PlayerName);
if (pName.Length > 18)
pName = $"{pName[..17]}...";
var observerSkill = player.GetTranslation("observer_skill");

View file

@ -50,7 +50,7 @@ namespace src.player.skills
}
string distanceColor = closetDistance > 1500 ? "#00FF00" : closetDistance > 600 ? "#FFFF00" : "#FF0000";
playerInfo.PrintHTML = $"{closetEnemy}: <font color='{distanceColor}'>{(closetDistance > 3000 ? "3000+" : closetDistance)}</font>";
playerInfo.PrintHTML = $"{System.Net.WebUtility.HtmlEncode(closetEnemy)}: <font color='{distanceColor}'>{(closetDistance > 3000 ? "3000+" : closetDistance)}</font>";
}
}

View file

@ -1,6 +1,5 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Memory;
using CounterStrikeSharp.API.Modules.Timers;
using CounterStrikeSharp.API.Modules.Utils;
@ -20,7 +19,7 @@ namespace src.player.skills
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
// SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
}
public static void NewRound()

View file

@ -27,8 +27,10 @@ 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) return;
smokes.TryAdd(new Vector(@event.X, @event.Y, @event.Z), 0);
}
@ -36,8 +38,10 @@ 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) return;
foreach (var smoke in smokes.Keys.Where(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z))
smokes.TryRemove(smoke, out _);
}
@ -71,12 +75,20 @@ namespace src.player.skills
public static void OnTick()
{
int tick = SkillsInfo.GetValue<int>(skillName, "tickCooldown");
if (Server.TickCount % tick != 0) return;
float smokeRadius = SkillsInfo.GetValue<float>(skillName, "smokeRadius");
int smokeHeal = SkillsInfo.GetValue<int>(skillName, "smokeHeal");
foreach (Vector smokePos in smokes.Keys)
foreach (var player in Utilities.GetPlayers())
if (Server.TickCount % tick == 0)
if (player.PlayerPawn.Value != null && player.PlayerPawn.Value.IsValid && player.PlayerPawn.Value.AbsOrigin != null)
if (SkillUtils.GetDistance(smokePos, player.PlayerPawn.Value.AbsOrigin) <= SkillsInfo.GetValue<float>(skillName, "smokeRadius"))
AddHealth(player.PlayerPawn.Value, SkillsInfo.GetValue<int>(skillName, "smokeHeal"));
foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid && p.PawnIsAlive))
{
var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue;
if (SkillUtils.GetDistance(smokePos, pawn.AbsOrigin) <= smokeRadius)
AddHealth(pawn, smokeHeal);
}
}
public static void EnableSkill(CCSPlayerController player)

View file

@ -9,7 +9,7 @@ namespace src.player.skills
{
private const Skills skillName = Skills.Illiterate;
private static bool isActive = false;
private static int offset = jRandomSkills.Instance.Random.Next(0, 26);
private static int offset = jRandomSkills.Instance.Random.Next(2, 26);
public static void LoadSkill()
{
@ -55,7 +55,7 @@ namespace src.player.skills
{
if (string.IsNullOrEmpty(input)) return null;
if (Server.TickCount % 64 == 0)
offset = jRandomSkills.Instance.Random.Next(1, 26);
offset = jRandomSkills.Instance.Random.Next(2, 26);
return new string([.. input.Select(c =>
{

View file

@ -33,7 +33,7 @@ namespace src.player.skills
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 = new(enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account)}$", e.Index.ToString())));
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account + e.InGameMoneyServices.CashSpentThisRound)}$", e.Index.ToString()))];
SkillUtils.UpdateMenu(player, menuItems);
}
}
@ -74,7 +74,7 @@ namespace src.player.skills
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 = new(enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account)}$", e.Index.ToString())));
ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account + e.InGameMoneyServices.CashSpentThisRound)}$", e.Index.ToString()))];
SkillUtils.CreateMenu(player, menuItems);
}
else
@ -90,7 +90,7 @@ namespace src.player.skills
if (playerMoneyServices == null || enemyMoneyServices == null) return;
int playerMoney = playerMoneyServices.Account;
playerMoneyServices.Account = enemyMoneyServices.Account;
playerMoneyServices.Account = enemyMoneyServices.Account + enemyMoneyServices.CashSpentThisRound;
Utilities.SetStateChanged(player, "CCSPlayerController", "m_pInGameMoneyServices");
enemyMoneyServices.Account = playerMoney;

View file

@ -1,3 +1,4 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
@ -12,7 +13,19 @@ namespace src.player.skills
public static void LoadSkill()
{
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"), false);
}
public static void EnableSkill(CCSPlayerController player)
{
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo == null) return;
float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue<float>(skillName, "ChanceTo") - SkillsInfo.GetValue<float>(skillName, "ChanceFrom")) + SkillsInfo.GetValue<float>(skillName, "ChanceFrom");
playerInfo.SkillChance = newChance;
SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skillName)}{ChatColors.Lime}: {player.GetSkillDescription(skillName, newChance)}",
border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && !p.IsBot && p != player) ? "tb" : "t");
}
public static void PlayerHurt(EventPlayerHurt @event)
@ -24,6 +37,7 @@ namespace src.player.skills
var attackerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == attacker?.SteamID);
if (attackerInfo?.Skill == skillName)
if (Instance.Random.NextDouble() <= attackerInfo.SkillChance)
TeleportPlayers(attacker!, victim!);
}
@ -46,8 +60,10 @@ namespace src.player.skills
attackerPawn.Teleport(victimPosition, victimAngles, victimVelocity);
}
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8A2BE2", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8A2BE2", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", float chanceFrom = .5f, float chanceTo = .6f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
{
public float ChanceFrom { get; set; } = chanceFrom;
public float ChanceTo { get; set; } = chanceTo;
}
}
}

View file

@ -1,19 +1,22 @@
using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes;
using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions;
using CounterStrikeSharp.API.Modules.Timers;
using CounterStrikeSharp.API.Modules.UserMessages;
using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
using System.Collections.Concurrent;
using System.Drawing;
using static src.jRandomSkills;
using Timer = CounterStrikeSharp.API.Modules.Timers.Timer;
namespace src.player.skills
{
public class ThrowingKnife : ISkill
{
private const Skills skillName = Skills.ThrowingKnife;
private readonly static ConcurrentDictionary<uint, uint> triggers = [];
private readonly static ConcurrentDictionary<uint, uint> glows = [];
private readonly static ConcurrentDictionary<uint, KnifeInfo> knivesInfo = [];
public static void LoadSkill()
{
@ -22,40 +25,134 @@ namespace src.player.skills
public static void NewRound()
{
foreach (var player in Utilities.GetPlayers())
DisableSkill(player);
triggers.Clear();
glows.Clear();
foreach (var knifeInfo in knivesInfo.Values)
DisableKnifeSkill(knifeInfo);
knivesInfo.Clear();
}
public static void EnableSkill(CCSPlayerController player)
public static void PlayerMakeSound(UserMessage um)
{
var soundevent = um.ReadUInt("soundevent_hash");
var userIndex = um.ReadUInt("source_entity_index");
if (soundevent != 3208928088 || userIndex != 0) return;
byte[] packedParams = um.ReadBytes("packed_params");
Vector? soundPos = null;
if (packedParams != null && packedParams.Length >= 19)
{
try
{
float x = BitConverter.ToSingle(packedParams, 7);
float y = BitConverter.ToSingle(packedParams, 11);
float z = BitConverter.ToSingle(packedParams, 15);
soundPos = new Vector(x, y, z);
} catch { }
}
if (soundPos == null) return;
(var knife, var knifeInfo) = GetClosetKnife(soundPos);
if (knife == null || knife.AbsRotation == null || knifeInfo == null || knifeInfo.InitialLook == null) return;
knifeInfo.IsDropped = false;
QAngle rotation = new(knifeInfo.InitialLook?.X, knifeInfo.InitialLook?.Y, knife.AbsRotation.Z);
Vector offset = SkillUtils.GetForwardVector(new QAngle(rotation.X - 90, rotation.Y, rotation.Z)) * 2;
knife.Teleport(
new Vector(soundPos.X - offset.X, soundPos.Y - offset.Y, soundPos.Z - offset.Z),
rotation,
Vector.Zero
);
var world = Utilities.GetEntityFromIndex<CBaseEntity>(0);
knife.AcceptInput("SetParent", world, world, "!activator");
if (knifeInfo.Timer != null)
knifeInfo.Timer?.Kill();
knifeInfo.Timer =
Instance.AddTimer(3f, () =>
{
if (knife != null && knife.IsValid)
knife.AcceptInput("ClearParent");
}, TimerFlags.STOP_ON_MAPCHANGE);
}
public static bool OnWeaponCanAcquire(DynamicHook hook, CCSPlayerController player, CEconItemView econItem, CCSWeaponBaseVData vdata)
{
string weaponName = vdata.Name;
if (string.IsNullOrEmpty(weaponName)) return false;
if (!weaponName.Contains("knife") && !weaponName.Contains("bayonet"))
return false;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return false;
if (knivesInfo.TryGetValue(player.Index, out KnifeInfo? knifeInfo) && knifeInfo != null && knifeInfo.KnifeId == econItem.ItemID)
{
knifeInfo.IsDropped = false;
if (knifeInfo.Timer != null)
{
knifeInfo.Timer?.Kill();
knifeInfo.Timer = null;
}
return false;
}
hook.SetReturn(AcquireResult.InvalidItem);
return true;
}
public static void EnableSkill(CCSPlayerController _)
{
Event.EnableTransmit();
}
public static void DisableSkill(CCSPlayerController player)
{
var playersTriggers = triggers.Where(t => t.Value == player.Index).Select(t => t.Key).ToList();
foreach (var triggerIndex in playersTriggers)
if (triggers.TryRemove(triggerIndex, out _))
if (knivesInfo.TryRemove(player.Index, out KnifeInfo? knifeInfo) && knifeInfo != null)
DisableKnifeSkill(knifeInfo);
}
public static void DisableKnifeSkill(KnifeInfo knifeInfo)
{
var entity = Utilities.GetEntityFromIndex<CTriggerMultiple>((int)triggerIndex);
if (entity != null && entity.IsValid)
if (knifeInfo.Timer != null)
knifeInfo.Timer?.Kill();
knifeInfo.Timer = null;
if (knifeInfo.TriggerIndex != null)
{
var trigger = Utilities.GetEntityFromIndex<CTriggerMultiple>((int)knifeInfo.TriggerIndex);
if (trigger != null && trigger.IsValid)
Server.NextFrame(() =>
{
if (entity.IsValid)
entity.AcceptInput("Kill");
if (trigger.IsValid)
trigger.AcceptInput("Kill");
});
}
if (glows.TryRemove(player.Index, out uint glowIndex))
if (knifeInfo.GlowIndex != null)
{
var entity = Utilities.GetEntityFromIndex<CTriggerMultiple>((int)glowIndex);
if (entity != null && entity.IsValid)
var glow = Utilities.GetEntityFromIndex<CTriggerMultiple>((int)knifeInfo.GlowIndex);
if (glow != null && glow.IsValid)
Server.NextFrame(() =>
{
if (entity.IsValid)
entity.AcceptInput("Kill");
if (glow.IsValid)
glow.AcceptInput("Kill");
});
}
if (knifeInfo.RelayIndex != null)
{
var relay = Utilities.GetEntityFromIndex<CTriggerMultiple>((int)knifeInfo.RelayIndex);
if (relay != null && relay.IsValid)
Server.NextFrame(() =>
{
if (relay.IsValid)
relay.AcceptInput("Kill");
});
}
}
@ -88,12 +185,12 @@ namespace src.player.skills
private static void ThrowKnife(CCSPlayerController player, CBasePlayerWeapon knife)
{
if (player == null || !player.IsValid) return;
if (knife == null || !knife.IsValid || knife.AbsOrigin == null) return;
var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return;
if (knife == null || !knife.IsValid || knife.AbsOrigin == null) return;
float force = 2000;
float force = 2000f;
Vector pos = new(pawn.AbsOrigin.X, pawn.AbsOrigin.Y, pawn.AbsOrigin.Z + pawn.ViewOffset.Z);
QAngle angle = new(0, 0, 0);
@ -102,35 +199,61 @@ namespace src.player.skills
knife.Collision.CollisionAttribute.InteractsWith = pawn.Collision.CollisionAttribute.InteractsWith;
knife.Teleport(pos, angle, vel);
CreateTrigger(player, knife);
CreateGlow(player, knife);
if (!knivesInfo.ContainsKey(player.Index))
{
uint? triggerIndex = CreateTrigger(player, knife);
(uint? relayIndex, uint? glowIndex) = CreateGlow(player, knife);
knivesInfo.TryAdd(player.Index, new KnifeInfo
{
PlayerIndex = player.Index,
KnifeIndex = knife.Index,
KnifeId = knife.AttributeManager.Item.ItemID,
TriggerIndex = triggerIndex,
GlowIndex = glowIndex,
RelayIndex = relayIndex
});
}
private static void CreateTrigger(CCSPlayerController player, CBaseEntity knife)
if (knivesInfo.TryGetValue(player.Index, out KnifeInfo? knifeInfo))
{
if (player == null || !player.IsValid) return;
if (triggers.Any(t => t.Value == player.Index)) return;
knifeInfo.IsDropped = true;
knifeInfo.InitialLook = new QAngle(pawn.V_angle.X + 90, pawn.V_angle.Y, pawn.V_angle.Z);
}
}
var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return;
if (knife == null || !knife.IsValid || knife.AbsOrigin == null) return;
private static uint? CreateTrigger(CCSPlayerController player, CBasePlayerWeapon knife)
{
if (player == null || !player.IsValid) return null;
if (knife == null || !knife.IsValid || knife.AbsOrigin == null) return null;
var trigger = SkillUtils.CreateTrigger($"trowingknife", 10, knife.AbsOrigin);
if (trigger == null || !trigger.IsValid) return;
if (trigger == null || !trigger.IsValid) return null;
trigger.AcceptInput("SetParent", knife, knife, "!activator");
triggers.TryAdd(trigger.Index, player.Index);
return trigger.Index;
}
private static void CreateGlow(CCSPlayerController player, CBaseEntity knife)
private static (uint?, uint?) CreateGlow(CCSPlayerController player, CBaseEntity knife)
{
if (player == null || !player.IsValid) return;
if (glows.ContainsKey(player.Index)) return;
if (knife == null || !knife.IsValid || knife.AbsOrigin == null) return;
if (player == null || !player.IsValid) return (null, null);
if (knife == null || !knife.IsValid || knife.AbsOrigin == null) return (null, null);
var modelRelay = Utilities.CreateEntityByName<CPhysicsPropMultiplayer>("prop_physics_multiplayer");
if (modelRelay == null) return (null, null);
modelRelay.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(modelRelay.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2));
modelRelay.SetModel(knife!.CBodyComponent!.SceneNode!.GetSkeletonInstance().ModelState.ModelName);
modelRelay.Spawnflags = 256u;
modelRelay.Render = Color.FromArgb(1, 255, 255, 255);
modelRelay.DispatchSpawn();
modelRelay.Teleport(knife.AbsOrigin, knife.AbsRotation, knife.AbsVelocity);
modelRelay.AcceptInput("SetParent", knife, modelRelay, "!activator");
var modelGlow = Utilities.CreateEntityByName<CPhysicsPropMultiplayer>("prop_physics_multiplayer");
if (modelGlow == null) return;
if (modelGlow == null) return (null, null);
modelGlow.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags = (uint)(modelGlow.CBodyComponent!.SceneNode!.Owner!.Entity!.Flags & ~(1 << 2));
@ -144,9 +267,9 @@ namespace src.player.skills
modelGlow.Glow.GlowRangeMin = 10;
modelGlow.Teleport(knife.AbsOrigin, knife.AbsRotation, knife.AbsVelocity);
modelGlow.AcceptInput("SetParent", knife, modelGlow, "!activator");
modelGlow.AcceptInput("SetParent", modelRelay, modelGlow, "!activator");
glows.TryAdd(player.Index, modelGlow.Index);
return (modelRelay.Index, modelGlow.Index);
}
public static void OnTriggerEnter(CBaseTrigger trigger, CBaseEntity entity)
@ -156,19 +279,24 @@ namespace src.player.skills
string triggerName = trigger.Globalname;
if (entity.DesignerName != "player" || string.IsNullOrEmpty(triggerName) || !triggerName.StartsWith("trowingknife")) return;
if (triggers.TryGetValue(trigger.Index, out var throwerIndex))
{
var thrower = Utilities.GetPlayerFromIndex((int)throwerIndex);
if (thrower == null || !thrower.IsValid) return;
CCSPlayerPawn victimPawn = entity.As<CCSPlayerPawn>();
if (victimPawn == null || !victimPawn.IsValid || victimPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) return;
KnifeInfo? knifeInfo = knivesInfo.Values.FirstOrDefault(ki => ki.TriggerIndex == trigger.Index);
if (knifeInfo != null)
{
var thrower = Utilities.GetPlayerFromIndex((int)knifeInfo.PlayerIndex);
if (thrower == null || !thrower.IsValid) return;
if (thrower != null && thrower.Pawn.Value != null && victimPawn.Index == thrower.Pawn.Index) return;
bool friendlyFire = SkillsInfo.GetValue<bool>(skillName, "friendlyFire");
if (!friendlyFire && thrower?.TeamNum == victimPawn.TeamNum) return;
if (CheckHasKnife(thrower!)) return;
SkillUtils.TakeHealth(victimPawn, 99999);
Server.PrintToChatAll($"HIT");
SkillUtils.TakeHealth(victimPawn, SkillsInfo.GetValue<int>(skillName, "damage"));
}
}
@ -179,6 +307,31 @@ namespace src.player.skills
return pawn.WeaponServices.MyWeapons.Any(w => w.IsValid && w != null && w.Value != null && w.Value.IsValid && (w.Value.DesignerName.Contains("knife") || w.Value.DesignerName.Contains("bayonet")));
}
private static (CBaseEntity?, KnifeInfo?) GetClosetKnife(Vector pos)
{
double minDistance = double.MaxValue;
KnifeInfo? minKnifeInfo = null;
CBaseEntity? closet = null;
foreach (var knifeInfo in knivesInfo.Values)
{
if (!knifeInfo.IsDropped) continue;
var knifeEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)knifeInfo.KnifeIndex);
if (knifeEntity == null || !knifeEntity.IsValid || knifeEntity.AbsOrigin == null) continue;
double distance = SkillUtils.GetDistance(knifeEntity.AbsOrigin, pos);
if (distance < minDistance)
{
minDistance = distance;
closet = knifeEntity;
minKnifeInfo = knifeInfo;
}
}
return (closet, minKnifeInfo);
}
public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList)
{
foreach (var (info, player) in infoList)
@ -186,19 +339,35 @@ namespace src.player.skills
if (player == null || !player.IsValid) continue;
var observedPlayer = Utilities.GetPlayers().FirstOrDefault(p => p?.Pawn?.Value?.Handle == player?.Pawn?.Value?.ObserverServices?.ObserverTarget?.Value?.Handle);
foreach (var glow in glows)
foreach ((uint playerIndex, KnifeInfo knifeInfo) in knivesInfo)
{
if (glow.Key == player.Index || (observedPlayer != null && observedPlayer.IsValid && glow.Key == observedPlayer.Index)) continue;
if (playerIndex == player.Index || (observedPlayer != null && observedPlayer.IsValid && playerIndex == observedPlayer.Index)) continue;
if (knifeInfo.GlowIndex == null) continue;
var glowEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)glow.Value);
var glowEntity = Utilities.GetEntityFromIndex<CBaseEntity>((int)knifeInfo.GlowIndex);
if (glowEntity == null || !glowEntity.IsValid) continue;
info.TransmitEntities.Remove(glowEntity.Index);
}
}
}
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8f108f", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
public class KnifeInfo()
{
public required uint PlayerIndex { get; set; }
public required uint KnifeIndex { get; set; }
public required ulong KnifeId { get; set; }
public required uint? TriggerIndex { get; set; }
public required uint? GlowIndex { get; set; }
public required uint? RelayIndex { get; set; }
public bool IsDropped { get; set; } = false;
public QAngle? InitialLook { get; set; } = null;
public Timer? Timer { get; set; } = null;
}
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8f108f", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = true, bool needsTeammates = false, string requiredPermission = "", bool friendlyFire = false, int damage = 9999) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
{
public bool FriendlyFire { get; set; } = friendlyFire;
public int Damage { get; set; } = damage;
}
}
}

View file

@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Modules.Entities.Constants;
using CounterStrikeSharp.API.Modules.Utils;
using src.utils;
using System.Collections.Concurrent;
using System.Runtime.InteropServices;
using static src.jRandomSkills;
namespace src.player.skills
@ -12,51 +11,39 @@ namespace src.player.skills
public class ToxicSmoke : ISkill
{
private const Skills skillName = Skills.ToxicSmoke;
private static readonly ConcurrentDictionary<CCSPlayerController, byte> players = [];
private static readonly ConcurrentDictionary<CTriggerMultiple, byte> triggers = [];
private const string triggerName = "toxic_smoke";
private static readonly ConcurrentDictionary<Vector, byte> smokes = [];
public static void LoadSkill()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue<string>(skillName, "color"));
}
public static void NewRound()
{
players.Clear();
triggers.Clear();
smokes.Clear();
}
public static void EnableSkill(CCSPlayerController player)
public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate @event)
{
SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade);
var player = @event.Userid;
if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
smokes.TryAdd(new Vector(@event.X, @event.Y, @event.Z), 0);
}
public static void OnTriggerEnter(CBaseTrigger trigger, CBaseEntity entity)
public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event)
{
if (!trigger.Globalname.StartsWith(triggerName) || entity.DesignerName != "player") return;
var player = @event.Userid;
if (player == null || !player.IsValid) return;
CCSPlayerPawn playerPawn = new(entity.Handle);
if (playerPawn == null || playerPawn.Controller?.Value == null)return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
CCSPlayerController player = playerPawn.Controller.Value.As<CCSPlayerController>();
if (player == null) return;
players.TryAdd(player, 0);
}
public static void OnTriggerExit(CBaseTrigger trigger, CBaseEntity entity)
{
if (!trigger.Globalname.StartsWith(triggerName) || entity.DesignerName != "player") return;
CCSPlayerPawn playerPawn = new(entity.Handle);
if (playerPawn == null || playerPawn.Controller?.Value == null) return;
CCSPlayerController player = playerPawn.Controller.Value.As<CCSPlayerController>();
if (player == null) return;
players.TryRemove(player, out _);
foreach (var smoke in smokes.Keys.Where(v => v.X == @event.X && v.Y == @event.Y && v.Z == @event.Z))
smokes.TryRemove(smoke, out _);
}
public static void OnEntitySpawned(CEntityInstance entity)
@ -85,30 +72,28 @@ namespace src.player.skills
});
}
public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate @event)
public static void OnTick()
{
var player = @event.Userid;
if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
int tick = SkillsInfo.GetValue<int>(skillName, "tickCooldown");
if (Server.TickCount % tick != 0) return;
var trigger = SkillUtils.CreateTrigger(triggerName, SkillsInfo.GetValue<float>(skillName, "smokeRadius"), new Vector(@event.X, @event.Y, @event.Z));
if (trigger == null) return;
triggers.TryAdd(trigger, 0);
float smokeRadius = SkillsInfo.GetValue<float>(skillName, "smokeRadius");
int smokeDamage = SkillsInfo.GetValue<int>(skillName, "smokeDamage");
foreach (Vector smokePos in smokes.Keys)
foreach (var player in Utilities.GetPlayers().Where(p => p.IsValid && p.PawnIsAlive))
{
var pawn = player.PlayerPawn.Value;
if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) continue;
if (SkillUtils.GetDistance(smokePos, pawn.AbsOrigin) <= smokeRadius)
AddHealth(pawn, -smokeDamage);
}
}
public static void SmokegrenadeExpired(EventSmokegrenadeExpired @event)
public static void EnableSkill(CCSPlayerController player)
{
var player = @event.Userid;
if (player == null || !player.IsValid) return;
var playerInfo = Instance.SkillPlayer.FirstOrDefault(p => p.SteamID == player.SteamID);
if (playerInfo?.Skill != skillName) return;
foreach (var trigger in triggers.Keys.Where(t => t.AbsOrigin?.X == @event.X && t.AbsOrigin?.Y == @event.Y && t.AbsOrigin?.Z == @event.Z))
{
triggers.TryRemove(trigger, out _);
trigger.AcceptInput("Kill");
}
SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade);
}
private static void AddHealth(CCSPlayerPawn player, int health)
@ -124,20 +109,11 @@ namespace src.player.skills
player.CommitSuicide(false, true);
}
public static void OnTick()
{
if (Server.TickCount % 17 != 0) return;
foreach (var player in players.Keys)
{
if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid || !player.PawnIsAlive) return;
AddHealth(player.PlayerPawn.Value, -SkillsInfo.GetValue<int>(skillName, "smokeDamage"));
}
}
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#507529", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int smokeDamage = 2, float smokeRadius = 180) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#507529", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int smokeDamage = 2, float smokeRadius = 180, int tickCooldown = 17) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission)
{
public int SmokeDamage { get; set; } = smokeDamage;
public float SmokeRadius { get; set; } = smokeRadius;
public int TickCooldown { get; set; } = tickCooldown;
}
}
}

View file

@ -109,7 +109,7 @@ namespace src.utils
AlternativeSkillButton = null;
SkillTimeBeforeStart = 7;
SkillHudDuration = -1;
SkillDescriptionDuration = -1;
SkillDescriptionDuration = 7;
DisplayAlwaysDescription = false;
FlashingHtmlHudFix = true;
CS2TraceRayDebug = false;
@ -137,7 +137,7 @@ namespace src.utils
HtmlHudCustomisation = new HtmlHudCustomisation
{
HeaderLineColor = "#FFFFFF",
HeaderLineSize = "ml",
HeaderLineSize = "",
SkillLineSize = "l",
InfoLineColor = "#FFFFFF",
InfoLineSize = "sm",

View file

@ -75,6 +75,24 @@ namespace src.utils
return Math.Sqrt(Math.Pow(vector2.X - vector1.X, 2) + Math.Pow(vector2.Y - vector1.Y, 2) + Math.Pow(vector2.Z - vector1.Z, 2));
}
public static float Distance(this Vector vector1, Vector vector2)
{
return (float)GetDistance(vector1, vector2);
}
public static float Dot(this Vector vector1, Vector vector2)
{
return (vector1.X * vector2.X) + (vector1.Y * vector2.Y) + (vector1.Z * vector2.Z);
}
public static Vector Normalize(this Vector vector)
{
float length = vector.Length();
if (length > 0)
return new Vector(vector.X / length, vector.Y / length, vector.Z / length);
return Vector.Zero;
}
public static string SecondsToTimer(int totalSeconds)
{
if (totalSeconds <= 0) return "00:00";
@ -330,7 +348,9 @@ namespace src.utils
Dictionary<string, Action<CCSPlayerController, IWasdMenuOption>> list = [];
foreach (var item in items)
list.TryAdd(isIlliterate ? Illiterate.GetRandomText(item.Item1) : item.Item1, (p, option) =>
list.TryAdd(isIlliterate
? System.Net.WebUtility.HtmlEncode(Illiterate.GetRandomText(item.Item1)!)
: System.Net.WebUtility.HtmlEncode(item.Item1), (p, option) =>
{
jRandomSkills.Instance.SkillAction(playerInfo.Skill.ToString(), "TypeSkill", [p, new[] { item.Item2 }]);
manager.CloseMenu(p);
@ -360,13 +380,17 @@ namespace src.utils
? ""
: $"<font class='fontWeight-Bold fontSize-{config.HeaderLineSize}' color='{config.HeaderLineColor}'>{your_skill}:</font><br>";
string skillLine = $"<font class='fontWeight-Bold fontSize-{config.SkillLineSize}' color='{skillData.Color}'>{player.GetSkillName(skillData.Skill)}</font><br>";
string skillLine = Illiterate.CheckIlliterateSkill(player)
? $"<font class='fontWeight-Bold fontSize-{config.SkillLineSize}'>{Illiterate.GetRandomText(player.GetSkillName(skillData.Skill))}</font><br>"
: $"<font class='fontWeight-Bold fontSize-{config.SkillLineSize}' color='{skillData.Color}'>{player.GetSkillName(skillData.Skill)}</font><br>";
var skill_select_info = player.GetTranslation($"{playerInfo.Skill.ToString().ToLower()}_select_info");
string remainingLine = string.IsNullOrWhiteSpace(skill_select_info)
? ""
: $"<font class='fontSize-{config.WSADMenuSelectInfoLineSize}' color='{config.WSADMenuSelectInfoLineColor}'>{skill_select_info}</font><br>";
var hudContent = infoLine + skillLine + remainingLine;
string controllsLine =
@ -381,13 +405,17 @@ namespace src.utils
IWasdMenu menu = manager.CreateMenu(hudContent, itemText, itemHoverText, controllsLine);
foreach (var enemy in enemies)
menu.Add(isIlliterate ? Illiterate.GetRandomText(enemy.Item1) : enemy.Item1, (p, option) =>
menu.Add(isIlliterate
? System.Net.WebUtility.HtmlEncode(Illiterate.GetRandomText(enemy.Item1)!)
: System.Net.WebUtility.HtmlEncode(enemy.Item1), (p, option) =>
{
jRandomSkills.Instance.SkillAction(playerInfo.Skill.ToString(), "TypeSkill", [p, new[] { enemy.Item2 }]);
manager.CloseMenu(p);
});
if (lastElement != null)
menu.Add(isIlliterate ? Illiterate.GetRandomText(lastElement.Value.Item1) : lastElement.Value.Item1, (p, option) =>
menu.Add(isIlliterate
? System.Net.WebUtility.HtmlEncode(Illiterate.GetRandomText(lastElement.Value.Item1)!)
: System.Net.WebUtility.HtmlEncode(lastElement.Value.Item1), (p, option) =>
{
jRandomSkills.Instance.SkillAction(playerInfo.Skill.ToString(), "TypeSkill", [p, new[] { lastElement.Value.Item2 }]);
if (lastElement.Value.Item3)

View file

@ -1,4 +1,5 @@
{
"ConfigName": "Default",
"GameMode": 3,
"YourSkillChatInfo": true,
"KillerSkillChatInfo": true,
@ -7,8 +8,8 @@
"DebugMode": false,
"AlternativeSkillButton": null,
"SkillTimeBeforeStart": 7.0,
"SkillHudDuration": 999.0,
"SkillDescriptionDuration": 999.0,
"SkillHudDuration": -1.0,
"SkillDescriptionDuration": 7.0,
"DisplayAlwaysDescription": false,
"DisableSpectateHUD": false,
"FlashingHtmlHudFix": true,
@ -35,6 +36,14 @@
"IsoCodes": "DE, AT, CH, LI, LU, BE",
"FileName": "de"
},
{
"IsoCodes": "TR",
"FileName": "tr"
},
{
"IsoCodes": "CZ",
"FileName": "cs"
},
{
"IsoCodes": "PL",
"FileName": "pl"
@ -47,7 +56,7 @@
},
"HtmlHudCustomisation": {
"HeaderLineColor": "#FFFFFF",
"HeaderLineSize": "ml",
"HeaderLineSize": "",
"SkillLineSize": "l",
"InfoLineColor": "#FFFFFF",
"InfoLineSize": "sm",
@ -90,6 +99,18 @@
"Alias": "heal, ulecz, curar, tratar, 治疗, 治愈",
"Permissions": "@jRandomSkills/admin"
},
"HealthCommand": {
"Alias": "sethealth, set_health, health",
"Permissions": "@jRandomSkills/admin"
},
"PlantedBomb": {
"Alias": "plantedbomb, planted_bomb, bomb",
"Permissions": "@jRandomSkills/admin"
},
"BotPlace": {
"Alias": "botplace, bot_place",
"Permissions": "@jRandomSkills/admin"
},
"ConsoleCommand": {
"Alias": "console, sv, 控制台, 服务器",
"Permissions": "@jRandomSkills/owner"

View file

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

View file

@ -8,6 +8,24 @@
"Name": "Zeus",
"RequiredPermission": ""
},
{
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
"Color": "#384728",
"Active": true,
"Name": "WildThrow",
"RequiredPermission": ""
},
{
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
"Color": "#8f6dc9",
"Active": true,
"Name": "Weightless",
"RequiredPermission": ""
},
{
"Cooldown": 30.0,
"NeedsTeammates": false,
@ -41,6 +59,7 @@
{
"SmokeDamage": 2,
"SmokeRadius": 180.0,
"TickCooldown": 17,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
@ -49,6 +68,17 @@
"Name": "ToxicSmoke",
"RequiredPermission": ""
},
{
"FriendlyFire": false,
"Damage": 9999,
"NeedsTeammates": false,
"DisableOnFreezeTime": true,
"OnlyTeam": 0,
"Color": "#8f108f",
"Active": true,
"Name": "ThrowingKnife",
"RequiredPermission": ""
},
{
"HealthTakenScale": 0.3,
"NeedsTeammates": false,
@ -79,6 +109,8 @@
"RequiredPermission": ""
},
{
"ChanceFrom": 0.5,
"ChanceTo": 0.6,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
@ -109,9 +141,7 @@
"RequiredPermission": ""
},
{
"Cooldown": 5.0,
"CTSoundEvent": "c4.disarmstart",
"TSoundEvent": "C4.PlantSoundB",
"Cooldown": 2,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
@ -140,6 +170,15 @@
"Name": "SniperElite",
"RequiredPermission": ""
},
{
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
"Color": "#b5ab8f",
"Active": true,
"Name": "Smoker",
"RequiredPermission": ""
},
{
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
@ -489,6 +528,7 @@
},
{
"Cooldown": 30.0,
"CooldownWhenStuck": 5.0,
"Duration": 2.0,
"NeedsTeammates": false,
"DisableOnFreezeTime": true,
@ -513,6 +553,7 @@
{
"ExplosionRadius": 500.0,
"ExplosionDamage": 999,
"DmgReductionForTeamates": 0.5,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
@ -530,6 +571,16 @@
"Name": "MoneySwap",
"RequiredPermission": ""
},
{
"DetonationRange": 130.0,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
"Color": "#adf542",
"Active": true,
"Name": "Miner",
"RequiredPermission": ""
},
{
"HealthToAdd": 50,
"HealthShotLimit": 3,
@ -552,8 +603,30 @@
"Name": "Magnifier",
"RequiredPermission": ""
},
{
"Radius": 100.0,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
"Color": "#f081ec",
"Active": true,
"Name": "Magneto",
"RequiredPermission": ""
},
{
"TriggerRadius": 180.0,
"Strenght": 30.0,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
"Color": "#81f0c4",
"Active": true,
"Name": "MagneticDecoy",
"RequiredPermission": ""
},
{
"MaxDistance": 4096.0,
"FriendlyFire": false,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
@ -564,6 +637,7 @@
},
{
"MaxDistance": 4096.0,
"FriendlyFire": true,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
@ -583,6 +657,7 @@
},
{
"FlashDuration": 1.0,
"FriendlyFire": true,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
@ -657,6 +732,32 @@
"Name": "Impostor",
"RequiredPermission": ""
},
{
"Cooldown": 30.0,
"DurationRun": 5.0,
"DurationCrouch": 12.0,
"YourTeamDamage": 10,
"EnemyTeamDamage": 20,
"NeedsTeammates": false,
"DisableOnFreezeTime": true,
"OnlyTeam": 0,
"Color": "#42f5ef",
"Active": true,
"Name": "Illusionist",
"RequiredPermission": ""
},
{
"MaximumFuel": 150.0,
"FuelConsumption": 0.64,
"Refuelling": 0.1,
"NeedsTeammates": false,
"DisableOnFreezeTime": true,
"OnlyTeam": 0,
"Color": "#1466F5",
"Active": true,
"Name": "Illiterate",
"RequiredPermission": ""
},
{
"Cooldown": 30.0,
"Duration": 10.0,
@ -668,6 +769,29 @@
"Name": "Iana",
"RequiredPermission": ""
},
{
"Cooldown": 1.0,
"Damage": 2,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 3,
"Color": "#baf081",
"Active": true,
"Name": "HotBomb",
"RequiredPermission": ""
},
{
"Strength": 150.0,
"MaxVelocity": 2000.0,
"DetonationRange": 130.0,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
"Color": "#384728",
"Active": true,
"Name": "HomingNades",
"RequiredPermission": ""
},
{
"DamageMultiplier": 2.0,
"DamageRadiusMultiplier": 2.0,
@ -680,7 +804,7 @@
"RequiredPermission": ""
},
{
"HealthToAdd": 25,
"HealthToAdd": 100,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
@ -692,6 +816,7 @@
{
"SmokeHeal": 1,
"SmokeRadius": 180.0,
"TickCooldown": 16,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
@ -700,6 +825,18 @@
"Name": "HealingSmoke",
"RequiredPermission": ""
},
{
"Amount": 3,
"Heal": 2,
"TickCooldown": 16,
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
"OnlyTeam": 0,
"Color": "#b5ab8f",
"Active": true,
"Name": "HealingChicken",
"RequiredPermission": ""
},
{
"NeedsTeammates": false,
"DisableOnFreezeTime": false,
@ -1167,6 +1304,18 @@
"Name": "Anomaly",
"RequiredPermission": ""
},
{
"Cooldown": 20.0,
"Duration": 0.3,
"Offset": 0.0,
"NeedsTeammates": false,
"DisableOnFreezeTime": true,
"OnlyTeam": 0,
"Color": "#fa7b48",
"Active": true,
"Name": "AimLock",
"RequiredPermission": ""
},
{
"NeedsTeammates": false,
"DisableOnFreezeTime": false,

View file

@ -5,6 +5,9 @@
"aimbot": "Aimbot",
"aimbot_desc": "Jede Kugel, die du triffst, zählt als Kopfschuss",
"aimlock": "Aim-Lock",
"aimlock_desc": "Klicke [css_useSkill], um dein Visier auf den nächsten Gegner zu fixieren",
"anomaly": "Anomalie",
"anomaly_desc": "Du spulst die Zeit um einige Sekunden zurück",
@ -21,6 +24,7 @@
"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.",
"areareaper_bombsite_disabled": "Dieser Bombenplatz wurde deaktiviert!",
"armored": "Gepanzert",
"armored_desc": "Du hast einen zufälligen Schadensmultiplikator",
@ -186,9 +190,22 @@
"holyhandgrenade": "Heilige Handgranate",
"holyhandgrenade_desc": "Deine HE-Granaten verursachen doppelten Schaden und haben doppelte Reichweite",
"homingnades": "Zielsuchende Granaten",
"homingnades_desc": "Deine Granaten (außer Smokes) werden von Gegnern angezogen",
"hotbomb": "Heiße Bombe",
"hotbomb_desc": "Solange du am Leben bist, fügt die Bombe ihrem Träger Schaden zu",
"hotbomb_hint": "Vorsicht, die Bombe ist heiß!",
"iana": "Hologramm",
"iana_desc": "Klicken Sie auf [css_useSkill], um Ihr Hologramm für einige Sekunden zu steuern",
"illiterate": "Analphabet",
"illiterate_desc": "Solange du am Leben bist, können deine Feinde nichts lesen",
"illusionist": "Illusionist",
"illusionist_desc": "Klicke [css_useSkill], um ein Abbild zu schicken, das geradeaus läuft",
"impostor": "Betrüger",
"impostor_desc": "Du beginnst die Runde mit einem feindlichen Spielermodell",
@ -234,6 +251,12 @@
"longzeus": "Langer Zeus",
"longzeus_desc": "Zeus verursacht unabhängig von der Entfernung Schaden",
"magneticdecoy": "Magnetischer Köder",
"magneticdecoy_desc": "Dein Köder zieht Spieler in der Nähe zu sich heran",
"magneto": "Magneto",
"magneto_desc": "Alle feindlichen Granaten werden von dir weggestoßen",
"magnifier": "Lupe",
"magnifier_desc": "Vergrößert den Bildschirm des Gegners und verringert dessen Sichtfeld",
"magnifier_enemy_info": "Dein Sichtfeld wurde verzerrt!",
@ -243,6 +266,9 @@
"medic": "Sanitäter",
"medic_desc": "Klicke auf [css_useSkill], um eine Heilungsladung zu verwenden, die 50 Gesundheitspunkte wiederherstellt",
"miner": "Bomben-Miner",
"miner_desc": "Deine HE-Granate explodiert nur, wenn ein Gegner in der Nähe ist",
"bankrupt": "Bankrott",
"bankrupt_desc": "Wähle den Spieler aus, der sein gesamtes Geld verlieren wird",
"bankrupt_enemy_info": "Du bist bankrott.",
@ -285,11 +311,12 @@
"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_desc": "Fliege für begrenzte Zeit. Doppelklick auf Sprung zum Fliegen",
"pilot_hud_info": "Treibstoff",
"planter": "Freier Planter",
"planter_desc": "Du kannst die Bombe überall platzieren, die Detonationszeit beträgt 60 Sekunden.",
"planter_planting": "Bombe wird gelegt ({0})...",
"poison": "Gift",
"poison_desc": "Wähle einen Spieler aus, der alle paar Sekunden Schaden nimmt",
@ -369,8 +396,11 @@
"silent": "Leise",
"silent_desc": "Deine Schritte und Sprünge sind für ANDERE Spieler lautlos",
"smoker": "Smoker",
"smoker_desc": "Deine Rauchgranaten gehen nie aus",
"sniperelite": "Sniper Elite",
"sniperelite_customname": "Sniper Elite-Fähigkeit",
"sniperelite_customname": "Sniper-Elite-Skill",
"sniperelite_desc": "Klicke auf [css_useSkill], um deine aktuelle Waffe gegen eine AWP auszutauschen",
"soldier": "Soldat",
@ -387,7 +417,8 @@
"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",
"teleporter_desc": "Du hast die Chance, die Plätze mit einem getroffenen Gegner zu tauschen",
"teleporter_desc2": "Deine Chance auf Platztausch nach einem Treffer: {0}%",
"thief": "Dieb",
"thief_desc": "Du kannst einem ausgewählten Spieler eine Fertigkeit stehlen",
@ -402,6 +433,9 @@
"thorns": "Dornen",
"thorns_desc": "Dein Gegner erhält einen Teil des Schadens, den er dir zugefügt hat",
"throwingknife": "Wurfmesser",
"throwingknife_desc": "Klicke [css_useSkill], um ein Messer zu werfen. Aber nimm dich vor anderen in Acht",
"toxicsmoke": "Giftiger Rauch",
"toxicsmoke_desc": "Deine Rauchgranaten verursachen Schaden",
@ -417,6 +451,14 @@
"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",
"weightless": "Schwerelosigkeit",
"weightless_desc": "Deine Granaten werden nicht von der Schwerkraft beeinflusst und fliegen schneller",
"wildthrow": "Wilder Wurf",
"wildthrow_desc": "Wähle einen Spieler aus, der Probleme beim Werfen von Granaten haben wird",
"wildthrow_player_info": "Spieler '{0}' hat all seine Lineups vergessen",
"wildthrow_select_info": "Wähle einen Spieler aus:",
"zeus": "Zeus",
"zeus_desc": "Zeus x27 lädt sich sofort wieder auf",

View file

@ -5,6 +5,9 @@
"aimbot": "Aimbot",
"aimbot_desc": "Every bullet you hit counts as a headshot",
"aimlock": "Aim Lock",
"aimlock_desc": "Click [css_useSkill] to lock your aim on the nearest enemy",
"anomaly": "Anomaly",
"anomaly_desc": "You rewind a few seconds back in time",
@ -21,6 +24,7 @@
"areareaper_select_info": "Select site to deactivate:",
"areareaper_site_disabled": "Bomb site {0} has been deactivated - no bombs can be planted there!",
"areareaper_used_info": "Your skill has already been used.",
"areareaper_bombsite_disabled": "This bombsite has been disabled!",
"armored": "Armored",
"armored_desc": "You have a random damage taken multiplier",
@ -175,7 +179,7 @@
"godmode_on": "Immortality enabled",
"grenadier": "Grenadier",
"grenadier_desc": "You have infinite hegranade",
"grenadier_desc": "You have infinite hegrenade",
"healingsmoke": "Healing Smoke",
"healingsmoke_desc": "Your smoke grenades heal",
@ -186,9 +190,22 @@
"holyhandgrenade": "Holy Hand Grenade",
"holyhandgrenade_desc": "Your HE grenades deal double damage and have double range",
"homingnades": "Homing Grenades",
"homingnades_desc": "Your grenades (except smokes) are attracted to enemies",
"hotbomb": "Hot Bomb",
"hotbomb_desc": "As long as you are alive, the bomb deals damage to its carrier",
"hotbomb_hint": "Careful, the bomb is hot!",
"iana": "Hologram",
"iana_desc": "Click [css_useSkill] to control your hologram for a few seconds",
"illiterate": "Illiterate",
"illiterate_desc": "As long as you are alive, your enemies cannot read",
"illusionist": "Illusionist",
"illusionist_desc": "Click [css_useSkill] to deploy a replica that walks straight ahead",
"impostor": "Impostor",
"impostor_desc": "You start the round with an enemy player model",
@ -234,6 +251,12 @@
"longzeus": "Long Zeus",
"longzeus_desc": "Zeus deals damage regardless of distance",
"magneticdecoy": "Magnetic Decoy",
"magneticdecoy_desc": "Your decoy attracts nearby players towards itself",
"magneto": "Magneto",
"magneto_desc": "All enemy grenades are repelled away from you",
"magnifier": "Magnifier",
"magnifier_desc": "Forces the enemy's screen to zoom in, reducing their field of view",
"magnifier_enemy_info": "Your field of view has been distorted!",
@ -243,6 +266,9 @@
"medic": "Medic",
"medic_desc": "Click [css_useSkill] to use a healing charge that restores 50 health",
"miner": "Bomb Miner",
"miner_desc": "Your HE grenade only explode when there is an enemy nearby",
"bankrupt": "Bankrupt",
"bankrupt_desc": "Choose the player who will lose all their money",
"bankrupt_enemy_info": "You have gone bankrupt.",
@ -290,6 +316,7 @@
"planter": "Free Planter",
"planter_desc": "You can plant the bomb anywhere, with a detonation time of 60 seconds.",
"planter_planting": "Planting ({0})...",
"poison": "Poison",
"poison_desc": "Choose a player who will take damage every few seconds",
@ -390,7 +417,8 @@
"swapposition_desc": "Click [css_useSkill] to swap places with a random enemy",
"teleporter": "Teleporter",
"teleporter_desc": "You swap places with the hit enemy",
"teleporter_desc": "You have the chance to swap places with a hit enemy",
"teleporter_desc2": "Your chances of swapping places after a hit: {0}%",
"thief": "Thief",
"thief_desc": "You can steal a skill from a chosen player",
@ -405,6 +433,9 @@
"thorns": "Thorns",
"thorns_desc": "Your opponent will receive a portion of the damage that they inflicted on you",
"throwingknife": "Throwing Knife",
"throwingknife_desc": "Click [css_useSkill] to throw a knife. But watch out for others",
"toxicsmoke": "Toxic Smoke",
"toxicsmoke_desc": "Your smoke grenades deal damage",
@ -420,6 +451,14 @@
"weaponsswap_desc": "Click [css_useSkill] to swap weapons with a random enemy",
"weaponsswap_hud_info2": "You have no weapon to swap",
"weightless": "Weightlessness",
"weightless_desc": "Your grenades are not affected by gravity and fly faster",
"wildthrow": "Wild Throws",
"wildthrow_desc": "Choose a player who will have trouble throwing grenades",
"wildthrow_player_info": "Player '{0}' has forgotten all their lineups",
"wildthrow_select_info": "Select a player:",
"zeus": "Zeus",
"zeus_desc": "Zeus x27 instantly recharges",
@ -476,54 +515,5 @@
"menu_controlls_scroll": "W/S - Scroll",
"menu_controlls_padding": " | ",
"menu_controlls_select": "E - Select",
"aimlock": "Aim Lock",
"aimlock_desc": "Click [css_useSkill] to lock your aim on the nearest enemy",
"homingnades": "Homing Grenades",
"homingnades_desc": "Your grenades (except smokes) are attracted to enemies",
"hotbomb": "Hot Bomb",
"hotbomb_desc": "As long as you are alive, the bomb deals damage to its carrier",
"hotbomb_hint": "Careful, the bomb is hot!",
"illiterate": "Illiterate",
"illiterate_desc": "As long as you are alive, your enemies cannot read",
"illusionist": "Illusionist",
"illusionist_desc": "Click [css_useSkill] to deploy a replica that walks straight ahead",
"magneticdecoy": "Magnetic Decoy",
"magneticdecoy_desc": "Your decoy attracts nearby players towards itself",
"magneto": "Magneto",
"magneto_desc": "All enemy grenades are repelled away from you",
"weightless": "Weightlessness",
"weightless_desc": "Your grenades are not affected by gravity and fly faster",
"wildthrow": "Wild Throws",
"wildthrow_desc": "Choose a player who will have trouble throwing grenades",
"wildthrow_player_info": "Player '{0}' has forgotten all their lineups",
"wildthrow_select_info": "Select a player:",
"throwingknife": "Throwing Knife",
"throwingknife_desc": "Click [css_useSkill] to throw a knife. But watch out for others",
"planter_planting": "Planting ({0})..."
"menu_controlls_select": "E - Select"
}

View file

@ -5,6 +5,9 @@
"aimbot": "Aimbot",
"aimbot_desc": "Chaque balle que vous touchez compte comme un headshot",
"aimlock": "Verrouillage de visée",
"aimlock_desc": "Cliquez sur [css_useSkill] pour verrouiller votre visée sur l'ennemi le plus proche",
"anomaly": "Anomalie",
"anomaly_desc": "Vous revenez quelques secondes en arrière dans le temps",
@ -21,6 +24,7 @@
"areareaper_select_info": "Sélectionnez un site à désactiver :",
"areareaper_site_disabled": "Le site de bombe {0} a été désactivé – aucune bombe ne peut y être posée !",
"areareaper_used_info": "Votre compétence a déjà été utilisée.",
"areareaper_bombsite_disabled": "Ce site de bombe a été désactivé !",
"armored": "Blindé",
"armored_desc": "Vous avez un multiplicateur de dégâts subis aléatoire",
@ -186,9 +190,22 @@
"holyhandgrenade": "Grenade Sacrée",
"holyhandgrenade_desc": "Vos grenades HE infligent le double de dégâts et ont une portée doublée",
"homingnades": "Grenades à tête chercheuse",
"homingnades_desc": "Vos grenades (sauf les fumigènes) sont attirées par les ennemis",
"hotbomb": "Bombe brûlante",
"hotbomb_desc": "Tant que vous êtes en vie, la bombe inflige des dégâts à son porteur",
"hotbomb_hint": "Attention, la bombe est brûlante !",
"iana": "Hologramme",
"iana_desc": "Cliquez sur [css_useSkill] pour contrôler votre hologramme pendant quelques secondes",
"illiterate": "Illettré",
"illiterate_desc": "Tant que vous êtes en vie, vos ennemis ne mogą pas lire",
"illusionist": "Illusionniste",
"illusionist_desc": "Cliquez sur [css_useSkill] pour déployer une réplique qui marche droit devant",
"impostor": "Imposteur",
"impostor_desc": "Vous commencez le round avec un modèle de joueur ennemi",
@ -234,6 +251,12 @@
"longzeus": "Zeus Longue Portée",
"longzeus_desc": "Le Zeus inflige des dégâts quelle que soit la distance",
"magneticdecoy": "Leurre magnétique",
"magneticdecoy_desc": "Votre leurre attire les joueurs à proximité vers lui",
"magneto": "Magneto",
"magneto_desc": "Toutes les grenades ennemies są repoussées loin de vous",
"magnifier": "Loupe",
"magnifier_desc": "Force l’écran de l’ennemi à zoomer, réduisant son champ de vision",
"magnifier_enemy_info": "Votre champ de vision a été déformé !",
@ -243,6 +266,9 @@
"medic": "Médecin",
"medic_desc": "Appuyez sur [css_useSkill] pour utiliser une charge de soin qui restaure 50 PV",
"miner": "Poseur de mines",
"miner_desc": "Votre grenade HE n'explose que lorsqu'un ennemi est à proximité",
"bankrupt": "Faillite",
"bankrupt_desc": "Choisissez le joueur qui perdra tout son argent",
"bankrupt_enemy_info": "Vous êtes en faillite.",
@ -285,11 +311,12 @@
"psychicdefusing_hud_info": "{0} secondes restantes pour désamorcer",
"pilot": "Pilote",
"pilot_desc": "Volez pendant un temps limité. Maintenez [UTILISER - E] pour voler",
"pilot_desc": "Volez pendant un temps limité. Double-cliquez sur saut pour voler",
"pilot_hud_info": "Carburant",
"planter": "Poseur Libre",
"planter_desc": "Vous pouvez planter la bombe n’importe où, avec un temps de détonation de 60 secondes.",
"planter_planting": "Amorçage ({0})...",
"poison": "Poison",
"poison_desc": "Choisissez un joueur qui subira des dégâts toutes les quelques secondes",
@ -369,6 +396,9 @@
"silent": "Silencieux",
"silent_desc": "Vos pas et vos sauts sont silencieux pour les AUTRES joueurs",
"smoker": "Fumeur",
"smoker_desc": "Vos grenades fumigènes sont illimitées",
"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",
@ -387,7 +417,8 @@
"swapposition_desc": "Appuyez sur [css_useSkill] pour échanger de place avec un ennemi aléatoire",
"teleporter": "Téléporteur",
"teleporter_desc": "Vous échangez de place avec l’ennemi touché",
"teleporter_desc": "Vous avez une chance d'échanger votre place avec un ennemi touché",
"teleporter_desc2": "Vos chances d'échanger votre place après un coup : {0}%",
"thief": "Voleur",
"thief_desc": "Vous pouvez voler la compétence d’un joueur choisi",
@ -402,6 +433,9 @@
"thorns": "Épines",
"thorns_desc": "Votre adversaire recevra une partie des dégâts qu’il vous a infligés",
"throwingknife": "Couteau de lancer",
"throwingknife_desc": "Cliquez sur [css_useSkill] pour lancer un couteau. Mais attention aux autres",
"toxicsmoke": "Fumée Toxique",
"toxicsmoke_desc": "Vos grenades fumigènes infligent des dégâts",
@ -417,6 +451,14 @@
"weaponsswap_desc": "Appuyez sur [css_useSkill] pour échanger vos armes avec un ennemi aléatoire",
"weaponsswap_hud_info2": "Vous n’avez aucune arme à échanger",
"weightless": "Apesanteur",
"weightless_desc": "Vos grenades ne sont pas affectées par la gravité et volent plus vite",
"wildthrow": "Lancers sauvages",
"wildthrow_desc": "Choisissez un joueur qui aura des difficultés à lancer des grenades",
"wildthrow_player_info": "Le joueur '{0}' a oublié tous ses alignements (lineups)",
"wildthrow_select_info": "Sélectionnez un joueur :",
"zeus": "Zeus",
"zeus_desc": "Le Zeus x27 se recharge instantanément",

View file

@ -24,6 +24,7 @@
"areareaper_select_info": "Wybierz strefę do dezaktyw.:",
"areareaper_site_disabled": "Strefa detonacji {0} została dezaktywowana - nie można na niej podłożyć bomby!",
"areareaper_used_info": "Twoja moc została już wykorzystana.",
"areareaper_bombsite_disabled": "Ten bombsite został wyłączony!",
"armored": "Gruby",
"armored_desc": "Masz losowy mnożnik otrzymywanych obrażeń",
@ -189,17 +190,21 @@
"holyhandgrenade": "Święty Granat Ręczny",
"holyhandgrenade_desc": "Twoje granaty uderzeniowe zadają podwójne obrażenia i mają podwójny zasięg",
"homingnades": "Namierzające Granaty",
"homingnades_desc": "Twoje granaty (oprócz dymnych) są przyciągane do wrogów",
"homingnades": "Naprowadzane Granaty",
"homingnades_desc": "Twoje granaty (z wyjątkiem dymnych) są przyciągane do wrogów",
"hotbomb": "Gorąca Bomba",
"hotbomb_desc": "Póki żyjesz, bomba zadaje obrażenia nosicielowi",
"hotbomb_desc": "Dopóki żyjesz, bomba zadaje obrażenia osobie, która ją niesie",
"hotbomb_hint": "Ostrożnie, bomba parzy!",
"iana": "Hologram",
"iana_desc": "Kliknij [css_useSkill], aby sterować hologramem przez kilka sekund",
"illiterate": "Analfabeta",
"illiterate_desc": "Dopóki żyjesz, twoi wrogowie nie potrafią czytać",
"illiterate_desc": "Dopóki żyjesz, Twoi wrogowie nie potrafią czytać",
"illusionist": "Iluzjonista",
"illusionist_desc": "Naciśnij [css_useSkill], aby wypuścić replikę idącą prosto przed siebie",
"impostor": "Szpieg",
"impostor_desc": "Na początku rundy otrzymujesz model postaci przeciwnika",
@ -246,11 +251,11 @@
"longzeus": "Długi Zeus",
"longzeus_desc": "Zeus zadaje obrażenia niezależnie od odległości",
"magneticdecoy": "Magnetyczny Decoy",
"magneticdecoy_desc": "Twój wabik przyciąga graczy wokół siebie",
"magneticdecoy": "Magnetyczny Wabik",
"magneticdecoy_desc": "Twój wabik przyciąga pobliskich graczy do siebie",
"magneto": "Magneto",
"magneto_desc": "Wszystkie granaty przeciwnika są odpychane od ciebie",
"magneto_desc": "Wszystkie granaty wroga są odpychane od Ciebie",
"magnifier": "Lupa",
"magnifier_desc": "Przybiżasz ekran wybranemu przeciwnikowi",
@ -261,6 +266,9 @@
"medic": "Medyk",
"medic_desc": "Kliknij [css_useSkill], aby użyć ładunku leczniczego, który przywraca 50 punktów zdrowia",
"miner": "Bomberman",
"miner_desc": "Twoje granaty HE wybuchają tylko wtedy, gdy w pobliżu jest wróg",
"moneyswap": "Skarbówka",
"moneyswap_desc": "Wybierasz gracza, z którym chcesz zamienić się pieniędzmi",
"moneyswap_enemy_info": "Urząd skarbowy cię dopadł.",
@ -303,11 +311,12 @@
"psychicdefusing_hud_info": "Pozostało {0} sekund do rozbrojenia",
"pilot": "Pilot",
"pilot_desc": "Latanie przez określony czas. Kliknij dwukrotnie skok, aby latać",
"pilot_desc": "Lataj przez ograniczony czas. Kliknij dwa razy skok, aby lecieć",
"pilot_hud_info": "Paliwo",
"planter": "Samowolka",
"planter_desc": "Bombę można podłożyć w dowolnym miejscu, a czas detonacji wynosi 60 sekund.",
"planter_planting": "Plantowanie ({0})...",
"poison": "Trutka",
"poison_desc": "Wybierasz gracza, który co kilka sekund będzie otrzymywał obrażenia",
@ -408,7 +417,8 @@
"swapposition_desc": "Kliknij [css_useSkill], aby zamienić się miejscami z losowym przeciwnikiem",
"teleporter": "Teleporter",
"teleporter_desc": "Zamieniasz się miejscami z trafionym przeciwnikiem",
"teleporter_desc": "Masz szansę na zamianę miejsc z trafionym wrogiem",
"teleporter_desc2": "Szansa na zamianę miejsc po trafieniu: {0}%",
"thief": "Złodziej",
"thief_desc": "Możesz ukraść supermoc wybranemu graczowi",
@ -424,7 +434,7 @@
"thorns_desc": "Twój przeciwnik otrzymuje część obrażeń, które zadał ci",
"throwingknife": "Nóż do Rzucania",
"throwingknife_desc": "Kliknij [css_useSkill], aby rzucić nożem. Ale uważaj na innych",
"throwingknife_desc": "Naciśnij [css_useSkill], aby rzucić nożem. Ale uważaj na innych",
"toxicsmoke": "Toksyczny Dym",
"toxicsmoke_desc": "Twoje granaty dymny zadają obrażenia",
@ -441,10 +451,10 @@
"weaponsswap_desc": "Kliknij [css_useSkill], aby zamienić się bronią z losowym przeciwnikiem",
"weaponsswap_hud_info2": "Nie posiadasz broni na zamiane",
"weightless": "Stan Nieważkości",
"weightless": "Nieważkość",
"weightless_desc": "Twoje granaty nie podlegają grawitacji i lecą szybciej",
"wildthrow": "Dzikie rzuty",
"wildthrow": "Dzikie Rzuty",
"wildthrow_desc": "Wybierz gracza, który będzie miał trudności z rzucaniem granatami",
"wildthrow_player_info": "Gracz '{0}' zapomniał wszystkie lineup'y",
"wildthrow_select_info": "Wybierz gracza:",

View file

@ -5,6 +5,9 @@
"aimbot": "Aimbot",
"aimbot_desc": "Toda bala que você acertar conta como um hs",
"aimlock": "Aim Lock",
"aimlock_desc": "Clique em [css_useSkill] para travar a mira no inimigo mais próximo",
"anomaly": "Máquina do Tempo",
"anomaly_desc": "Você volta alguns segundos no tempo",
@ -21,6 +24,7 @@
"areareaper_select_info": "Escolha o bomb p/ desativar:",
"areareaper_site_disabled": "Bombsite {0} foi desativado - nenhuma bomba pode ser plantada lá!",
"areareaper_used_info": "Seu poder já foi usado.",
"areareaper_bombsite_disabled": "Este local de bomba foi desativado!",
"armored": "Super Tiro",
"armored_desc": "Seu dano é multiplicado por um valor aleatório",
@ -152,6 +156,7 @@
"gambler_desc": "Selecione uma habilidade da lista.",
"gambler_select_info": "Escolha sua habilidade:",
"gambler_more": "#00FF00|Atualizar por ${0}",
"gambler_no_money": "Yetersiz bakiye.",
"ghost": "Fantasma",
"ghost_desc": "Você é completamente invisível",
@ -185,9 +190,22 @@
"holyhandgrenade": "Granada Obesa",
"holyhandgrenade_desc": "HEs causam dano dobrado e têm alcance dobrado",
"homingnades": "Granadas Teleguiadas",
"homingnades_desc": "Suas granadas (exceto fumaça) são atraídas por inimigos",
"hotbomb": "Bomba Quente",
"hotbomb_desc": "Enquanto você estiver vivo, a bomba causa dano ao portador",
"hotbomb_hint": "Cuidado, a bomba está quente!",
"iana": "Holograma",
"iana_desc": "Clique em [css_useSkill] para controlar seu holograma por alguns segundos",
"illiterate": "Analfabeto",
"illiterate_desc": "Enquanto você estiver vivo, seus inimigos não conseguem ler",
"illusionist": "Ilusionista",
"illusionist_desc": "Clique em [css_useSkill] para enviar uma réplica que caminha em frente",
"impostor": "Impostor",
"impostor_desc": "Você começa a rodada vestido do time inimigo",
@ -233,6 +251,12 @@
"longzeus": "Zeus Longo",
"longzeus_desc": "Zeus causa dano independentemente da distância",
"magneticdecoy": "Decoy Magnético",
"magneticdecoy_desc": "Seu decoy atrai jogadores próximos para si mesmo",
"magneto": "Magneto",
"magneto_desc": "Todas as granadas inimigas są repelidas para longe de você",
"magnifier": "Lupa",
"magnifier_desc": "Força a tela do inimigo a dar um zoom, reduzindo seu campo de visão",
"magnifier_enemy_info": "Seu campo de visão foi distorcido!",
@ -242,6 +266,9 @@
"medic": "Médico",
"medic_desc": "Clique em [css_useSkill] para usar uma injeção que restaura 50 de vida",
"miner": "Mineiro de Bombas",
"miner_desc": "Sua granada HE só explode quando há um inimigo por perto",
"moneyswap": "Troca de Grana",
"moneyswap_desc": "Escolha um jogador para trocar de dinheiro com ele",
"moneyswap_enemy_info": "Você provavelmente virou classe B",
@ -284,11 +311,12 @@
"psychicdefusing_hud_info": "{0} segundos restantes para desarmar",
"pilot": "Jetpack",
"pilot_desc": "Voe por um tempo limitado. Segure [USE - E] para voar",
"pilot_desc": "Voe por tempo limitado. Clique duas vezes no pulo para voar",
"pilot_hud_info": "Combustível",
"planter": "Meu Bombsite Minha Vida",
"planter_desc": "Você pode plantar a bomba em qualquer lugar, com um tempo de detonação de 60 segundos.",
"planter_planting": "Plantando ({0})...",
"poison": "Veneno",
"poison_desc": "Escolha um jogador que receberá dano a cada poucos segundos",
@ -368,8 +396,12 @@
"silent": "Shhhiu!",
"silent_desc": "Seus passos e pulos são silenciosos para OUTROS jogadores",
"smoker": "Tiryaki",
"smoker_desc": "Sis bombalarınız asla bitmez",
"sniperelite": "Sniper do BOPE",
"sniperelite_desc": "Clique em [css_useSkill] para trocar sua arma atual por uma AWP",
"sniperelite_customname": "Keskin Nişancı Elit Yeteneği",
"soldier": "Soldado",
"soldier_desc": "Seus tiros causam mais dano",
@ -385,7 +417,8 @@
"swapposition_desc": "Clique em [css_useSkill] para trocar de lugar com um inimigo aleatório",
"teleporter": "Teletransportador",
"teleporter_desc": "Você troca de lugar com o inimigo que acertar",
"teleporter_desc": "Você tem a chance de trocar de lugar com um inimigo atingido",
"teleporter_desc2": "Sua chance de trocar de lugar após o acerto: {0}%",
"thief": "Lula",
"thief_desc": "Você pode roubar uma habilidade de um jogador escolhido",
@ -400,6 +433,9 @@
"thorns": "Porco Espinho",
"thorns_desc": "Seu oponente receberá uma parte do dano que causou a você",
"throwingknife": "Faca de Arremesso",
"throwingknife_desc": "Clique em [css_useSkill] para lançar uma faca. Mas cuidado com os outros",
"toxicsmoke": "Smoke Tóxica",
"toxicsmoke_desc": "Suas smokes causam dano",
@ -415,6 +451,14 @@
"weaponsswap_desc": "Clique em [css_useSkill] para trocar armas com um inimigo aleatório",
"weaponsswap_hud_info2": "Você não tem arma para trocar",
"weightless": "Gravidade Zero",
"weightless_desc": "Suas granadas não são afetadas pela gravidade e voam mais rápido",
"wildthrow": "Arremesso Selvagem",
"wildthrow_desc": "Escolha um jogador que terá problemas para lançar granadas",
"wildthrow_player_info": "O jogador '{0}' esqueceu todos os seus lineups",
"wildthrow_select_info": "Selecione um jogador:",
"zeus": "Zeus",
"zeus_desc": "Zeus x27 recarrega instantaneamente",

View file

@ -5,6 +5,9 @@
"aimbot": "Aimbot",
"aimbot_desc": "Vurduğun her mermi kafadan vuruş (headshot) sayılır",
"aimlock": "Nişan Kilidi",
"aimlock_desc": "En yakın düşmana nişan almak için [css_useSkill] tuşuna basın",
"anomaly": "Anomali",
"anomaly_desc": "Zamanı birkaç saniye geriye alırsın",
@ -21,6 +24,7 @@
"areareaper_select_info": "Devre dışı bırakılacak alanı seçin:",
"areareaper_site_disabled": "Bomba alanı {0} devre dışı bırakıldı - buraya bomba kurulamaz!",
"areareaper_used_info": "Yeteneğin zaten kullanıldı.",
"areareaper_bombsite_disabled": "Bu bomba alanı devre dışı bırakıldı!",
"armored": "Zırhlı",
"armored_desc": "Rastgele bir hasar alma çarpanına sahip olursun",
@ -186,9 +190,22 @@
"holyhandgrenade": "Kutsal El Bombası",
"holyhandgrenade_desc": "El bombaların iki kat hasar verir ve iki kat menzile sahiptir",
"homingnades": "Güdümlü El Bombaları",
"homingnades_desc": "El bombalarınız (sis hariç) düşmanlara yönelir",
"hotbomb": "Sıcak Bomba",
"hotbomb_desc": "Siz hayatta olduğunuz sürece, bomba taşıyıcısına hasar verir",
"hotbomb_hint": "Dikkatli ol, bomba çok sıcak!",
"iana": "Hologram",
"iana_desc": "Hologramını birkaç saniyeliğine kontrol etmek için E tuşuna bas",
"illiterate": "Okuryazar Olmayan",
"illiterate_desc": "Siz hayatta olduğunuz sürece, düşmanlarınız yazıları okuyamaz",
"illusionist": "İllüzyonist",
"illusionist_desc": "Düz ilerleyen bir kopya oluşturmak için [css_useSkill] tuşuna basın",
"impostor": "Sahtekar",
"impostor_desc": "Raunda düşman oyuncu modeliyle başlarsın",
@ -234,6 +251,12 @@
"longzeus": "Uzak Zeus",
"longzeus_desc": "Zeus mesafeden bağımsız olarak hasar verir",
"magneticdecoy": "Manyetik Yanıltıcı",
"magneticdecoy_desc": "Yanıltıcı bombanız yakındaki oyuncuları kendine çeker",
"magneto": "Magneto",
"magneto_desc": "Tüm düşman el bombaları sizden uzaklaştırılır",
"magnifier": "Büyüteç",
"magnifier_desc": "Düşmanın ekranını yakınlaştırarak görüş alanını daraltır",
"magnifier_enemy_info": "Görüş alanın bozuldu!",
@ -243,6 +266,9 @@
"medic": "Sıhhiye",
"medic_desc": "50 can yenileyen bir iyileştirme yükü kullanmak için E tuşuna bas",
"miner": "Bomba Madencisi",
"miner_desc": "El bombanız (HE) sadece yakında bir düşman olduğunda patlar",
"bankrupt": "İflas",
"bankrupt_desc": "Tüm parasını kaybedecek bir oyuncu seç",
"bankrupt_enemy_info": "İflas ettin.",
@ -285,11 +311,12 @@
"psychicdefusing_hud_info": "İmha için {0} saniye kaldı",
"pilot": "Pilot",
"pilot_desc": "Sınırlı bir süre uç. Uçmak için [USE - E] tuşuna basılı tut",
"pilot_desc": "Sınırlı bir süre uçun. Uçmak için zıplama tuşuna iki kez basın",
"pilot_hud_info": "Yakıt",
"planter": "Serbest Kurucu",
"planter_desc": "Bombayı her yere kurabilirsin, patlama süresi 60 saniyedir.",
"planter_planting": "Kuruluyor ({0})...",
"poison": "Zehir",
"poison_desc": "Birkaç saniyede bir hasar alacak bir oyuncu seç",
@ -369,6 +396,9 @@
"silent": "Sessiz",
"silent_desc": "Ayak seslerin ve zıplamaların DİĞER oyunculara duyulmaz",
"smoker": "Tiryaki",
"smoker_desc": "Sis bombalarınız asla bitmez",
"sniperelite": "Keskin Nişancı",
"sniperelite_customname": "Keskin Nişancı Yeteneği",
"sniperelite_desc": "Mevcut silahını bir AWP ile değiştirmek için E tuşuna bas",
@ -387,7 +417,8 @@
"swapposition_desc": "Rastgele bir düşmanla yer değiştirmek için E tuşuna bas",
"teleporter": "Işınlayıcı",
"teleporter_desc": "Vurduğun düşmanla yer değiştirirsin",
"teleporter_desc": "Vurulan bir düşmanla yer değiştirme şansınız var",
"teleporter_desc2": "Vuruştan sonra yer değiştirme şansınız: %{0}",
"thief": "Hırsız",
"thief_desc": "Seçilen bir oyuncudan yeteneğini çalabilirsin",
@ -402,6 +433,9 @@
"thorns": "Dikenler",
"thorns_desc": "Rakibin, sana verdiği hasarın bir kısmını geri alır",
"throwingknife": "Fırlatma Bıçağı",
"throwingknife_desc": "Bıçak fırlatmak için [css_useSkill] tuşuna basın. Ama başkalarına dikkat edin",
"toxicsmoke": "Zehirli Sis",
"toxicsmoke_desc": "Sis bombaların hasar verir",
@ -417,6 +451,14 @@
"weaponsswap_desc": "Rastgele bir düşmanla silahları takas etmek için E tuşuna bas",
"weaponsswap_hud_info2": "Takas edilecek silahın yok",
"weightless": "Yerçekimsiz",
"weightless_desc": "El bombalarınız yerçekiminden etkilenmez ve daha hızlı uçar",
"wildthrow": "Vahşi Atış",
"wildthrow_desc": "El bombası atmakta zorluk çekecek bir oyuncu seçin",
"wildthrow_player_info": "'{0}' adlı oyuncu tüm taktiklerini unuttu",
"wildthrow_select_info": "Bir oyuncu seçin:",
"zeus": "Zeus",
"zeus_desc": "Zeus x27 anında şarj olur",

View file

@ -5,6 +5,9 @@
"aimbot": "自动瞄准",
"aimbot_desc": "你击中的每颗子弹都算作爆头",
"aimlock": "自瞄锁定",
"aimlock_desc": "点击 [css_useSkill] 锁定距离最近的敌人",
"anomaly": "异常",
"anomaly_desc": "你会倒退几秒钟的时间",
@ -21,6 +24,7 @@
"areareaper_select_info": "选择你想禁用的炸弹点:",
"areareaper_site_disabled": "炸弹点 {0} 已被禁用 - 无法在此放置炸弹!",
"areareaper_used_info": "你的能力已被使用。",
"areareaper_bombsite_disabled": "该炸弹安置点已被禁用!",
"armored": "装甲",
"armored_desc": "你有随机受到伤害的倍率",
@ -186,9 +190,22 @@
"holyhandgrenade": "神圣手榴弹",
"holyhandgrenade_desc": "你的高爆手榴弹造成双倍伤害并拥有双倍范围",
"homingnades": "追踪手雷",
"homingnades_desc": "你的手雷(烟雾弹除外)会自动追踪敌人",
"hotbomb": "烫手山芋",
"hotbomb_desc": "只要你还活着,炸弹就会对携带者造成伤害",
"hotbomb_hint": "小心,炸弹很烫!",
"iana": "全息图",
"iana_desc": "点击 [css_useSkill] 可控制你的全息影像数秒",
"illiterate": "文盲",
"illiterate_desc": "只要你还活着,你的敌人就无法阅读信息",
"illusionist": "幻術师",
"illusionist_desc": "点击 [css_useSkill] 部署一个直线行走的幻象",
"impostor": "冒名顶替者",
"impostor_desc": "回合开始时你获得敌方玩家模型",
@ -234,6 +251,12 @@
"longzeus": "长宙斯",
"longzeus_desc": "宙斯电击枪无论距离多远都能造成伤害",
"magneticdecoy": "磁性诱饵",
"magneticdecoy_desc": "你的诱饵弹会将附近的玩家吸引到自己身边",
"magneto": "万磁王",
"magneto_desc": "所有敌方手雷都会被你弹开",
"magnifier": "放大镜",
"magnifier_desc": "强制敌方屏幕放大,缩小其视野范围",
"magnifier_enemy_info": "你的视野已被扭曲!",
@ -243,6 +266,9 @@
"medic": "医务兵",
"medic_desc": "点击 [css_useSkill] 使用治疗装置恢复50点生命值",
"miner": "炸弹矿工",
"miner_desc": "你的高爆手雷仅在附近有敌人时才会爆炸",
"moneyswap": "税务员",
"moneyswap_desc": "选择一个玩家以交换金钱",
"moneyswap_enemy_info": "税务局找上你了。",
@ -285,11 +311,12 @@
"psychicdefusing_hud_info": "拆除还剩 {0} 秒",
"pilot": "飞行员",
"pilot_desc": "在有限时间内飞行。按住 [USE - E] 飞行",
"pilot_desc": "限时飞行。双击跳跃键开始飞行",
"pilot_hud_info": "燃料",
"planter": "自由种植者",
"planter_desc": "你可以在任何地方放置炸弹,引爆时间为60秒。",
"planter_planting": "安放炸弹中 ({0})...",
"poison": "毒药",
"poison_desc": "选择一个玩家,每隔几秒受到伤害",
@ -369,6 +396,9 @@
"silent": "无声",
"silent_desc": "你的脚步和跳跃对其他玩家无声",
"smoker": "烟雾使者",
"smoker_desc": "你的烟雾弹永远用不完",
"sniperelite": "狙击精英",
"sniperelite_customname": "狙击精英技能",
"sniperelite_desc": "点击 [css_useSkill] 将当前武器替换为AWP",
@ -387,7 +417,8 @@
"swapposition_desc": "点击 [css_useSkill] 与随机敌人交换位置",
"teleporter": "传送者",
"teleporter_desc": "你与被击中的敌人交换位置",
"teleporter_desc": "击中敌人后你有机会与其交换位置",
"teleporter_desc2": "击中后交换位置的概率为:{0}%",
"thief": "小偷",
"thief_desc": "你可以从选定玩家那里偷取技能",
@ -402,6 +433,9 @@
"thorns": "荊棘",
"thorns_desc": "你的對手將承受其對你造成傷害的一部分",
"throwingknife": "投掷飞刀",
"throwingknife_desc": "点击 [css_useSkill] 扔出飞刀。但要小心其他人",
"toxicsmoke": "毒烟",
"toxicsmoke_desc": "你的烟雾弹会造成伤害",
@ -417,6 +451,14 @@
"weaponsswap_desc": "点击 [css_useSkill] 与随机敌人交换武器",
"weaponsswap_hud_info2": "你没有可交换的武器",
"weightless": "失重状态",
"weightless_desc": "你的手雷不受重力影响,且飞行速度更快",
"wildthrow": "乱扔手雷",
"wildthrow_desc": "选择一名丢雷会遇到麻烦的玩家",
"wildthrow_player_info": "玩家 '{0}' 已经忘记了所有投掷角度",
"wildthrow_select_info": "选择一名玩家:",
"zeus": "宙斯",
"zeus_desc": "宙斯x27立即充能",