diff --git a/.github/workflows/update_thanks.yml b/.github/workflows/update_thanks.yml new file mode 100644 index 0000000..b66bd79 --- /dev/null +++ b/.github/workflows/update_thanks.yml @@ -0,0 +1,39 @@ +name: Update Contributors & Thanks + +on: + pull_request: + types: [closed] + +jobs: + update: + if: github.event.pull_request.merged == true + runs-on: ubuntu-latest + + permissions: + contents: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install dependencies + run: pip install requests python-dotenv + + - name: Run update script + env: + DISCORD_USER_IDS: ${{ vars.DISCORD_USER_IDS }} + EXTRA_USERS_GITHUB: ${{ vars.EXTRA_USERS_GITHUB }} + run: python .github/update_thanks.py + + - name: Commit changes + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add README.md README-PL.md .github/avatars/ + git diff --cached --quiet || git commit -m "chore: update contributors and thanks" + git push \ No newline at end of file diff --git a/.gitignore b/.gitignore index 07e621c..543ae5a 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,5 @@ project.fragment.lock.json # Other common ignores node_modules/ -dist/ \ No newline at end of file +dist/ +.env diff --git a/WASDMenuAPI - SRC Files/Classes/WasdMenuPlayer.cs b/WASDMenuAPI - SRC Files/Classes/WasdMenuPlayer.cs index 554397a..5c1b265 100644 --- a/WASDMenuAPI - SRC Files/Classes/WasdMenuPlayer.cs +++ b/WASDMenuAPI - SRC Files/Classes/WasdMenuPlayer.cs @@ -162,32 +162,67 @@ public class WasdMenuPlayer color = parts[0].StartsWith("#") && parts[0].Length == 7 ? parts[0] : string.Empty; text = parts.Length > 1 ? parts[1] : ""; } - + + string cleanText = text.Replace("\u200B", "") + .Replace("\u200C", "") + .Replace("\u202A", "") + .Replace("\u202C", ""); + + int sepIndex = cleanText.IndexOf(" : "); + string namePart = sepIndex != -1 ? cleanText.Substring(0, sepIndex) : cleanText; + string statsPart = sepIndex != -1 ? cleanText.Substring(sepIndex) : ""; + + int start = 0; + int length = cleanText.Length; + if (option == CurrentChoice) { - if (text.Length > maxLength) + if (cleanText.Length > maxLength) { - int remaining = text.Length - scrollIndex; + int remaining = cleanText.Length - scrollIndex; if (remaining <= maxLength) { - text = SafeSubstring(text, scrollIndex, remaining); - if (Server.TickCount % 32 == 0) - scrollIndex = 0; + start = scrollIndex; + length = remaining; + if (Server.TickCount % 32 == 0) scrollIndex = 0; } else { - text = SafeSubstring(text, scrollIndex, maxLength); - if (Server.TickCount % 32 == 0) - scrollIndex += scrollJump; + start = scrollIndex; + length = maxLength; + if (Server.TickCount % 32 == 0) scrollIndex += scrollJump; } } else - text = SafeSubstring(text, 0, maxLength); - - builder.AppendLine(string.Format(itemHoverText, text)); + { + start = 0; + length = Math.Min(cleanText.Length, maxLength); + } } else - builder.AppendLine(string.Format(itemText, $"{SafeSubstring(text, 0, maxLength)}")); + { + start = 0; + length = Math.Min(cleanText.Length, maxLength); + } + + int nameLength = namePart.Length; + + int nameSliceStart = Math.Max(start, 0); + int nameSliceEnd = Math.Min(start + length, nameLength); + int nameSliceLength = Math.Max(0, nameSliceEnd - nameSliceStart); + string visibleName = nameSliceLength > 0 ? cleanText.Substring(nameSliceStart, nameSliceLength) : ""; + + int statsSliceStart = Math.Max(start, nameLength); + int statsSliceEnd = Math.Min(start + length, cleanText.Length); + int statsSliceLength = Math.Max(0, statsSliceEnd - statsSliceStart); + + string visibleStats = statsSliceLength > 0 ? cleanText.Substring(statsSliceStart, statsSliceLength) : ""; + string finalOptionText = (visibleName.Length > 0 ? $"\u202A{visibleName}\u202C" : "") + visibleStats; + + if (option == CurrentChoice) + builder.AppendLine(string.Format(itemHoverText, finalOptionText)); + else + builder.AppendLine(string.Format(itemText, $"{finalOptionText}")); option = option.Next; shown++; diff --git a/WASDMenuAPI - SRC Files/WASDMenuAPI.csproj b/WASDMenuAPI - SRC Files/WASDMenuAPI.csproj index d9c058f..0811c6e 100644 --- a/WASDMenuAPI - SRC Files/WASDMenuAPI.csproj +++ b/WASDMenuAPI - SRC Files/WASDMenuAPI.csproj @@ -1,7 +1,7 @@  - net8.0 + net10.0 enable enable diff --git a/github/avatars/discord_20f902436962.png b/github/avatars/discord_20f902436962.png new file mode 100644 index 0000000..995cf32 Binary files /dev/null and b/github/avatars/discord_20f902436962.png differ diff --git a/github/avatars/discord_7ee4547c02f2.png b/github/avatars/discord_7ee4547c02f2.png new file mode 100644 index 0000000..bc75cac Binary files /dev/null and b/github/avatars/discord_7ee4547c02f2.png differ diff --git a/github/avatars/discord_a3b321b84dc6.png b/github/avatars/discord_a3b321b84dc6.png new file mode 100644 index 0000000..5f12a3d Binary files /dev/null and b/github/avatars/discord_a3b321b84dc6.png differ diff --git a/github/avatars/discord_f7017ab921b5.png b/github/avatars/discord_f7017ab921b5.png new file mode 100644 index 0000000..0f698f6 Binary files /dev/null and b/github/avatars/discord_f7017ab921b5.png differ diff --git a/github/readme-pl.md b/github/readme-pl.md new file mode 100644 index 0000000..0d64645 --- /dev/null +++ b/github/readme-pl.md @@ -0,0 +1,1311 @@ + + +
+ GitHub release       + GitHub latest commit       + Github all releases       + GitHub stars       + Discord server +
+ +## 📌 Oznaczenie +> [!NOTE] +> Te repozytorium jest to fork [projektu](https://github.com/jakubbartosik/dRandomSkills) stworzonego przez [Jakuba Bartosika (D3X)](https://github.com/jakubbartosik). + +## 💡 Opis +jRandomSkills to plugin do CounterStrike 2, który wprowadza chaos i frajdę do rozgrywki! W każdej rundzie losowo otrzymujesz jedną z unikalnych supermocy - od niewidzialności, przez wybuchowe strzały, po manipulację kamerą. Zaskocz przeciwników, przejmij kontrolę nad meczem i odkryj dziesiątki kreatywnych umiejętności, które zmieniają dynamikę gry! + +#### Wybierz język: + + + + + + + +## 💬 Dostępne języki +- **Angielski** +- **Polski** +- **Francuski** [by: [@felyjyn](https://github.com/felyjyn)] +- **Portugalski (Brazylijski)** [by: [@vinicius-trev](https://github.com/vinicius-trev)] +- **Niemiecki** [by: [@Enrory](https://github.com/Enrory)] +- **Turecki** [by: [@brkvlr](https://github.com/brkvlr), [@ByDexterTR](https://github.com/ByDexterTR)] +- **Rosyjski** [by: [@213sdfsdgf](https://github.com/213sdfsdgf)] +- **Chiński uproszczony** [GrokAI / ChatGPT] + +## 🖼️ Prezentacja Pluginu +![Preview](./preview.gif) +![Preview2](./preview2.gif) + +## 🌐 Serwer Testowy +Dołącz do serwera testowego 3v3 i wypróbuj plugin jRandomSkills: +- **Adres**: `jRandomSkills@pukawka.pl` +- **Hasło**: `public` +- **Godziny otwarcia**: `00:00-19:00` +- **Połącz URL**: `steam://connect/51.38.122.215:27215/public` +- **Połącz**: `connect 51.38.122.215:27215; password public` + +Kupujesz serwer na pukawce? Skorzystaj z mojego [kodu polecającego](https://pukawka.pl/pp,juzlus.html). + +## ✨ Aktualne Supermoce (124) +
+Poniższa tabela przedstawia wszystkie dostępne supermoce w grze, wraz z ich opisami. + +| Nazwa | Opis | Czas odnowienia / Zakres | +| - | - | -| +| Aimbot | Każdy twój trafiony pocisk liczy się jako strzał w głowę | - | +| Aim Lock | Kliknij [css_useSkill], aby wycelować na najbliższego wroga | 20 s | +| Anomalia | Cofasz się o 5 sekund do tyłu | 15 s | +| Anty Flash | Posiadasz odporność na flash'e, a twoje flash'e trwają 7 sekund | - | +| Żelazna Głowa | Nie otrzymujesz obrażeń w głowę | - | +| Niszczyciel Stref | Możesz wybrać strefę detonacji, którą chcesz dezaktywować | - | +| Gruby | Masz losowy mnożnik otrzymywanych obrażeń | (0.65 - 0.85)x | +| Skrytobójca | Zadajesz podwójne obrażenia przeciwnikowi od tyłu | - | +| Astronauta | Na początku rundy otrzymujesz losową wartość grawitacji | (0.1 - 0.7)x | +| Bankrut | Wybierz gracza, który straci wszystkie swoje pieniądze | - | +| Bejsbolista | Twój wabik odbija się od ścian i natychmiastowo zabija wroga po trafieniu | - | +| Obrót Wroga | Masz losową szansę na obrócenie wroga o 180 stopni po trafieniu go | (20 - 40)% | +| Mistrz Ostrza | Trzymając nóż, masz duże szanse na odparcie strzału | - | +| Królik | Otrzymujesz auto "BunnyHopa" | - | +| C4 Kamuflaż | Kiedy trzymasz bombę, jesteś niewidzialny | - | +| Ostrożne pociski | Wybierz gracza, który otrzymuje obrażenia za każdy niecelny strzał | - | +| Katapulta | Masz losową szanse na podrzucenie wroga | (20 - 40)% | +| Kurczak | Otrzymujesz model kurczaka + jesteś o 10% szybszy - 50hp | - | +| Wyluzowany | Podłożenie bomby zajmuje 10 sekund | - | +| Scyzoryk | Natychmiastowe zabójstwo nożem | - | +| Kamera | Kliknij [css_useSkill], aby utworzyć/przełączyć się na kamerę | 30 s | +| Mrok | Nadaje efekt ciemności wybranemu przeciwnikowi | - | +| Deaktywator | Wybierasz gracza, którego supermoc chcesz wyłączyć | - | +| Głuchy | Wybierasz gracza, dla którego chcesz wyłączyć wszystkie dźwięki | - | +| Ludzka bomba | Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu | - | +| Rozbrojenie | Masz losową szanse na wyrzucenie broni wroga po trafieniu | (20 - 35)% | +| Odległościomierz | Możesz zobaczyć odległość do najbliższego przeciwnika | - | +| Doskok | Wykonaj drugi skok, aby wykonać doskok | - | +| Drakula | Po trafieniu ofiary odzyskujesz zdrowie równe pewnemu procentowi zadanych obrażeń | - | +| Duplikator | Wybierasz gracza, od którego chcesz skopiować supermoc | - | +| Mini Majk | Losowa wielkość postaci na początku rundy | (60 - 95)% | +| Resp Wroga | Kliknij [css_useSkill], aby teleportować się na resp wroga | 15 s | +| Strzał Wybuchowy | Losowa szansa wystrzelenia pocisku wybuchowego podczas strzelania | (15 - 30)% | +| Oko Sokoła | Kliknij [css_useSkill], aby aktywować kamerę z lotu ptaka | - | +| Szybkie Rączki | Kliknij [css_useSkill], aby przeładować broń, którą obecnie trzymasz | - | +| Flash | Losowa prędkość postaci na początku rundy | (1.2 - 3.0)x | +| Fortnite | Kliknij [css_useSkill], aby stworzyć barykadę, którą można zniszczyć | 2 s | +| Krucha Bomba | Strzelanie do bomby powoduje jej uszkodzenie | - | +| Ogień Przyjacielski | Strzelanie do członków drużyny leczy ich | - | +| Zamrażający Wabik | Twój decoy zamraża wszystkich graczy w pobliżu | - | +| Hazardzista | Wybierz umiejętność z podanej listy | - | +| Duszek | Jesteś całkowicie niewidzialny | - | +| Glaz | Nie widzisz granatów dymnych | - | +| Glitch | Wyłączasz radar wybranemu przeciwnikowi | - | +| Klej | Twoje granaty przyklejają się do ścian | - | +| Nieśmiertelność | Kliknij [css_useSkill], aby stać się nieśmiertelnym na krótką chwilę | 30 s | +| Granatnik | Masz nieskończone granaty odłamkowe | - | +| Leczący Dym | Twoje granaty dymne leczą | - | +| Pustelnik | Zabijanie przywraca amunicję i część zdrowia | - | +| Święty Granat Ręczny | Twoje granaty uderzeniowe zadają podwójne obrażenia i mają podwójny zasięg | - | +| Naprowadzane Granaty | Twoje granaty (z wyjątkiem dymnych) są przyciągane do wrogów | - | +| Gorąca Bomba | Dopóki żyjesz, bomba zadaje obrażenia osobie, która ją niesie | - | +| Hologram | Kliknij [css_useSkill], aby sterować hologramem przez kilka sekund | - | +| Analfabeta | Dopóki żyjesz, Twoi wrogowie nie potrafią czytać | - | +| Iluzjonista | Naciśnij [css_useSkill], aby wypuścić replikę idącą prosto przed siebie | 30 s | +| Szpieg | Na początku rundy otrzymujesz model postaci przeciwnika | - | +| Nieskończone Ammo | Otrzymujesz nieskończoną ilość amunicji do wszystkich broni | - | +| Stópkarz | Wybierasz gracza, który pozostawi za sobą ślad | - | +| Zakłócacz | Wybierasz gracza, dla którego chcesz wyłączyć celownik | - | +| Błazen | W trybie błazna nie możesz zadawać ani otrzymywać obrażeń. Tryb zmienia się co kilka sekund | (10 - 25) s | +| Beznogi | Wybierasz gracza, który nie będzie mógł skakać | - | +| Pajacyk | Skakanie przywraca zdrowie | - | +| Zabójczy Flash | Każdy całkowicie oślepiony twoim granatem umiera (również ty) | - | +| Zamiana Żyć | Wybierasz gracza, z którym chcesz wymienić się zdrowiem | - | +| Długi Nóż | Podstawowy atak nożem zadaje obrażenia niezależnie od odległości | - | +| Długi Zeus | Zeus zadaje obrażenia niezależnie od odległości | - | +| Magnetyczny Wabik | Twój wabik przyciąga pobliskich graczy do siebie | - | +| Magneto | Wszystkie granaty wroga są odpychane od Ciebie | - | +| Lupa | Przybiżasz ekran wybranemu przeciwnikowi | - | +| Medyk | Kliknij [css_useSkill], aby użyć ładunku leczniczego, który przywraca 50 punktów zdrowia | 1 s | +| Bomberman | Twoje granaty HE wybuchają tylko wtedy, gdy w pobliżu jest wróg | - | +| Skarbówka | Wybierasz gracza, z którym chcesz zamienić się pieniędzmi | - | +| Ninja | Stojąc nieruchomo zwiększasz swoją niewidzialność o 33%, kucając o 33%, a trzymając nóż o 33% | - | +| Pancernik | Granaty nie zadają Ci obrażeń | - | +| Skupienie | Brak odrzutu podczas strzelania | - | +| NoClip | Kliknij [css_useSkill], aby włączyć noclip na krótki czas | 30 s | +| Jednostrzałowiec | Po trafieniu natychmiast zabijasz przeciwnika | - | +| Tylko Głowa | Otrzymujesz obrażenia tylko w głowę | - | +| Pawel Jumper | Otrzymujesz dodatkowy skok | - | +| Feniks | Masz losową szans na odrodzenie się po śmierci | (20 - 40)% | +| Pilot | Latanie przez określony czas. Przytrzymaj [USE - E], aby latać | - | +| Samowolka | Bombę można podłożyć w dowolnym miejscu, a czas detonacji wynosi 60 sekund | - | +| Trutka | Wybierasz gracza, który co kilka sekund będzie otrzymywał obrażenia | - | +| Brak Karabinów | Wybierasz gracza, który nie może używać karabinów | - | +| Proteza | Ramiona i nogi są kuloodporne | - | +| Zdalne Rozbrajanie | Kiedy jesteś blisko bomby, zaczynasz ją rozbrajać | 10 s | +| Odpychacz | Masz losową szansę na odepchnięcie wroga po trafieniu go | 100% | +| Pyro | Molotow przywraca zdrowie | - | +| Szybkostrzelność | Wszystkie pociski są wystrzeliwane bardzo szybko | - | +| Radarowiec | Na radarze widać wrogów | - | +| Rambo | Na początku rundy otrzymujesz losową ilość zdrowia | +(50 - 501) HP | +| Losowa Broń | Kliknij [css_useSkill], aby otrzymać losową broń | 15 s | +| Pancerz Reaktywny | Pancerz pochłania pierwsze otrzymane obrażenia | 15 s | +| Regeneracja | Co kilka sekund odnawiasz zdrowie | - | +| Replikator | Kliknij [css_useSkill], aby stworzyć swoją replikę, która zadaje obrażenia po trafieniu | 15 s | +| Odwrót | Kliknij [css_useSkill], aby powrócić na resp | 15 s | +| Zwrot do Nadawcy | Pierwsze trafienie wroga powoduje, że wraca on na swój resp | - | +| Re-Zombie | Po śmierci odradzasz się jako zombie z większym zdrowiem i bez broni | - | +| Bogacz | Na początku rundy otrzymujesz losową kwotę gotówki | (5000 - 15000)$ | +| Robin Hood | Zadanie obrażeń przeciwnikowi powoduje kradzież jego pieniędzy | - | +| Gumowe Kule | Twoje pociski znacznie spowalniają graczy | - | +| Saper | Możesz szybciej podłożyć bombę i ją rozbroić | - | +| Druga Szansa | Po śmierci odradzasz się z taką samą ilością zdrowia | - | +| Cień | Teleportujesz się za plecy trafionego wroga | - | +| Krótka Bomba | Bomba wybucha znacznie szybciej | - | +| Cichociemny | Twoje kroki i skoki są niesłyszalne dla INNYCH graczy | - | +| Zadymiarz | Twoje granaty dymne nigdy się nie kończą | - | +| Papito | Kliknij [css_useSkill], aby zamienić aktualną broń na AWP | 0 s | +| Żołnierz | Masz losowy mnożnik obrażeń | (1.15 - 1.35)x | +| Dźwiękowiec | Kliknij [css_useSkill], aby wywołać dźwięk u każdego przeciwnika | 5 s | +| Obserwator | Kliknij [css_useSkill], aby obserwować losowego przeciwnika | 0 s | +| Zamiana Miejsc | Kliknij [css_useSkill], aby zamienić się miejscami z losowym przeciwnikiem | 30 s | +| Zamiana Broni | Kliknij [css_useSkill], aby zamienić się bronią z losowym przeciwnikiem | 30 s | +| Teleporter | Zamieniasz się miejscami z trafionym przeciwnikiem | - | +| Złodziej | Możesz ukraść supermoc wybranemu graczowi | - | +| Trzecie Oko | Kliknij [css_useSkill], aby aktywować trzecią osobę | 0 s | +| Ciernie | Twój przeciwnik otrzymuje część obrażeń, które zadał ci | - | +| TNóż do Rzucania | Naciśnij [css_useSkill], aby rzucić nożem. Ale uważaj na innych | - | +| Toksyczny Dym | Twoje granaty dymne zadają obrażenia | - | +| Wallhack | Widzisz wrogów przez ściany | - | +| Zegarmistrz | Każdy rzut granatem zmienia czas rundy o -10 lub +10 sekund | - | +| Nieważkość | Twoje granaty nie podlegają grawitacji i lecą szybciej | - | +| Dzikie Rzuty | Wybierz gracza, który będzie miał trudności z rzucaniem granatami | - | +| Zeus | Zeus x27 natychmiastowo się odnawia | - | +
+ +## 💻 Instalacja +1. Zainstaluj / Kup **serwer CS2** + - Dobry poradnik jak stworzyć własny serwer CS2 [[Film]](https://www.youtube.com/watch?v=1ZrEn0CiMi4&ab_channel=TroubleChute), [[Strona]](https://hub.tcno.co/games/cs2/dedicated_server/). +2. Zainstaluj **Metamod** + - Pobierz [Metamod:Source 2.x](https://www.sourcemm.net/downloads.php/?branch=master) + - Wypakuj go do folderu `C2Server/game/csgo/` + - Edytuj plik `gameinfo.gi` dodając nową linijkę + ```json + Game_LowViolence csgo_lv // Perfect World content override + Game csgo/addons/metamod // <-- Linijka do dodania (kolejność ma znaczenie) + + Game csgo + ``` +3. Zainstaluj **CounterStrikeSharp** + - Pobierz [CounterStrikeSharp-With-Runtime](https://github.com/roflmuffin/CounterStrikeSharp/releases) + - Wypakuj go do folderu `C2Server/game/csgo/` +4. Zainstaluj **Ray-Trace** + - Pobierz [RayTrace-CSS-API](https://github.com/FUNPLAY-pro-CS2/Ray-Trace/releases) + - Wypakuj folder `conterstrikesharp` do folderu `CS2Server/game/csgo/addons/`. + - Pobierz [RayTrace-MM](https://github.com/FUNPLAY-pro-CS2/Ray-Trace/releases) + - Wypakuj go do folderu `CS2Server/game/csgo/addons/`. +5. Zainstaluj **jRandomSkills** + - Pobierz [jRandomSkills](https://github.com/Juzlus/jRandomSkills/releases) + +## Komendy Serwerowe +> [!TIP] +> **Bind do używania supermocy:** `bind x css_useSkill` + +
+Poniższa tabela przedstawia wszystkie dostępne komendy w grze, wraz z ich opisami. + +| Komenda | Przykład | Opis | Uprawnienia | +| - | - | - | - | +| `!setskill ` | `!setskill Juzlus Aimbot` | Przypisanie supermocy do gracza | `@jRandomSkills/admin` | +| `!lang ` | `!lang pl` | Zmień język | - | +| `!skills` | `!skills` | Lista supermocy | - | +| `!map ` | `!map de_nuke` | Zmiana mapy | `@jRandomSkills/admin` | +| `!map ` | `!map 3332005394` | Zmiana mapy z warsztatu | `@jRandomSkills/admin` | +| `!start` | `!start` | Rozpoczęcie gry z parametrami: `mp_forcecamera 0, mp_freezetime 15, mp_overtime_enable 1, sv_cheats 0` | `@jRandomSkills/admin` | +| `!start sv` | `!start sv` | Rozpoczęcie gry z parametrami: `mp_forcecamera 0, mp_freezetime 0, mp_overtime_enable 1, sv_cheats 1` | `@jRandomSkills/admin` | +| `!console ` | `!console sv_cheats 1` | Uruchomienie komendy na serwerze | `@jRandomSkills/owner` | +| `!swap` | `!swap` | Zamiana stron | `@jRandomSkills/admin` | +| `!shuffle` | `!shuffle` | Losowe dobranie graczy do drużyn | `@jRandomSkills/admin` | +| `!pause` | `!pause` | Wstrzymanie gry | `@jRandomSkills/admin` | +| `!heal` | `!heal` | Przywrócenie 100 punktów zdrowia | `@jRandomSkills/admin` | +| `!hud` | `!hud` | Włącz/Wyłącz HUD | - | +| `!setscore ` | `!setscore 10 7` | Ustawienie wyniku gry | `@jRandomSkills/owner` | +| `!setstaticskill ` | `!setstaticskill Juzlus Aimbot` | Przypisanie supermocy do gracza na stałe | `@jRandomSkills/admin` | +| `!setstaticskill None` | `!setstaticskill Juzlus None` | Powrót do normalności | `@jRandomSkills/admin` | +| `!botplace [slot] [godmode]` | `!botplace 2 1` | Teleportuj bota do swojej lokalizacji | `@jRandomSkills/admin` | +| `!next_skill [idx]` | `!next_skill Juzlus` | Przełącza umiejętność gracza (następna, poprzednia -1 lub konkretny idx) | `@jRandomSkills/admin` | +| `!plantedbomb [time]` | `!plantedbomb 35` | Stwórz podłożoną bombę C4 w miejscu, w którym stoisz, z niestandardowym lub domyślnym (40 s) czasem detonacji | `@jRandomSkills/admin` | +| `!sethealth ` | `!sethealth 150` | Ustala określoną ilość zdrowia dla samego siebie | `@jRandomSkills/admin` | +| `!reload` | `!reload` | Odśwież tłumaczenia | - | + +_Większość poleceń wymaga uprawnień, które należy ustawić w pliku: `game/csgo/addons/counterstrikesharp/configs/admins.json`_ +
+ +## 🔑 Uprawnienia +Aby nadać uprawnienia administracyjne w CounterStrikeSharp: +1. W folderze **`game/csgo/addons/counterstrikesharp/configs/`** utwórz plik **`admins.json`**. +2. Dodaj do niego poniższą zawartość: + ```json + { + "Juzlus": { + "identity": "STEAM_0:0:94913632", + "flags": ["@jRandomSkills/admin", "@jRandomSkills/owner"] + } + } + ``` + `steamID` można znaleźć przy pomocy strony [steamidfinder](www.steamidfinder.com). +3. Zapisz plik i uruchom serwer, aby zastosować zmiany. + +## ⚙️ Konfiguracja +Wszystkie sypermoce można dostosować w pliku **`config.cfg`** / **`skillsInfo.json`** znajdującym się w folderze **`game/csgo/addons/counterstrikesharp/plugins/jRandomSkills/configs/`** + +- ##### config.json +```json +{ + "Settings": { + "GameMode": 3, // Tryb gry: + // 0 - Losowa supermoc dla każdego gracza (Brak powtórek z rzędu) + // 1 - Ta sama supermoc dla całej drużyny + // 2 - Ta sama supermoc dla wszystkich graczy + // 3 - Losowa supermoc dla każdego gracza (Brak powtórek na mapie) + // 4 - Losowa supermoc dla każdego gracza (Pełna losowość) + // 5 - Debug: Supormoce są przydzielane po kolei + "YourSkillChatInfo": true, // Pokazuj swoją supermoc na czacie + "KillerSkillChatInfo": true, // Pokazuj supermoc zabójcy na czacie + "TeamMateSkillChatInfo": true, // Pokazuj supermoc sojuszników na czacie + "SummaryAfterTheRound": true, // Pokazuj podsumowanie z ostatniej rundy + "EnableBotSkills": true, // Włącz umiejętności dla botów + "EnableBotKickDebug": false, // Co 45 sekund wyrzuć losowego bota (do celów debugowania/testowania) + "DebugMode": false, // Zapisuj aktywność do folderu 'Debug' + "AlternativeSkillButton": null, // Możliwe przyciski: + // null, "Attack", "Jump", "Duck", "Forward", "Back", + // "Use", "Cancel", "Left", "Right", "Moveleft", + // "Moveright", "Attack2", "Run", "Reload", "Alt1", + // "Alt2", "Speed", "Walk", "Zoom", "Weapon1", + // "Weapon2", "Bullrush", "Grenade1", "Grenade2", + // "Attack3", "Scoreboard", "Inspect" + "SkillTimeBeforeStart": 7.0, // Ile sekund przed końcem freeze time należy zakończyć + // losowanie umiejętności? (freezetime - SkillTimeBeforeStart) + "SkillHudDuration": -1.0, // Jak długo HUD HTML powinien być widoczny? + "SkillDescriptionDuration": 7.0, // Jak długo opis umiejętności powinien być widoczny? + "DisplayAlwaysDescription":false,// Zawsze wyświetlaj opis umiejętności + "DisableSpectateHUD": false, // Wyłącz HUD HTML bedąc martwym + "EnableFlashingHtmlHudFix": false,// Włącz FlashingHtmlHudFix + "TraceRayBeam": false, // Włącz widoczność ścieżki dla 'Długi Nóż', 'Długi Zeus' + "DisableHUDOnDeathPermission": "@jRandomSkills/death", // Wyłącz HUD po śmierci dla graczy z tym uprawnieniem + "DisableSkillsOnRoundEnd": false,// Wyłącz wszystkie umiejętności na koniec rundy (gdy widoczne jest podsumowanie) + + "LanguageSystem": { + "DefaultLangCode": "en", // Język domyślny: en, pl, fr, pt-br, zh + "DisableGeoLite": false, // Wyłącz wyszukiwanie języka gracza według geolokalizacji GeoLite2 (MaxMind) + "LanguageInfos": [...] // Ustawienie zmiany języków ISO na tłumaczenia + }, + + "HtmlHudCustomisation": { // Ustawienia zmiany kolorów i rozmiarów czcionek + ... // xxxl: 64px, xxl: 40px, xl: 32px + } // l: 24px, ml: 20px, m: 18px + ... // sm: 16px, s: 12px, xs: 8px + }, +``` + +- ##### skillsInfo.json +```json +[ + { + "NeedsTeammates": false, // Wymaga innych graczy w drużynie + "DisableOnFreezeTime": false, // Wyłącz umiejętność podczas freeze time + "OnlyTeam": 0, // Dostępność supermocy: + // 0 - Wszyscy + // 2 - Terrorist + // 3 - CounterTerrorist + "Color": "#ff0000", // Kolor supermocy + "Active": true, // Włączona przy uruchamianiu + "Name": "Aimbot", // Nazwa supermocy + "RequiredPermission": "", // Wymagane uprawnienie + "MaxPerServer": -1, // Maksymalna liczba graczy, którzy mogą posiadać tę + // umiejętność na serwerze (-1 dla "nieograniczona") + "Rarity": "Common" // Poziom rzadkości umiejętności: + // Common (70x), Uncommon (14x), + // Rare (10x), Epic (5x), Legendary (1x) + }, + ... +] +``` + +- ##### playersLanguage.json +```json +{ + "76561198150092992": "pl", // "SteamID": "nazwa pliku tłumaczenia" + ... +} +``` + +## 🔗 Uznanie +Plugin korzysta z zawartości następujących projektów: +- [dRandomSkills](https://github.com/jakubbartosik/dRandomSkills) autorstwa [Jakub Bartosik (D3X)](https://github.com/jakubbartosik) - System losowych umiejętności +- [CS2TraceRay](https://github.com/schwarper/CS2TraceRay) autorstwa [schwarper](https://github.com/schwarper) - Stary system śledzenia promieni (Trace Ray) +- [Ray-Trace](https://github.com/FUNPLAY-pro-CS2/Ray-Trace) autorstwa [SlynxCZ](https://github.com/SlynxCZ) - Nowy system śledzenia promieni (Trace Ray) +- [CS2FlashingHtmlHudFix](https://github.com/girlglock/CS2FlashingHtmlHudFix) autorstwa [girlglock](https://github.com/girlglock) - Poprawka migotania okienka z supermocą +- [ChaseMod](https://github.com/ipsvn/ChaseMod/blob/master/Utils/Memory/CCSMatch.cs) autorstwa [ipsvn](https://github.com/ipsvn) - Ustawianie wyniku rund +- [WASDMenuAPI](https://github.com/Interesting-exe/WASDMenuAPI) autorstwa [Interesting-exe](https://github.com/Interesting-exe) - API do łatwego tworzenia menu za pomocą klawiszy WASD +- [GeoLocationLanguageManagerPlugin](https://github.com/aprox2/GeoLocationLanguageManagerPlugin) autorstwa [aprox2](https://github.com/aprox2) - Zarządzenie geolokalizacją +- [GeoLite2](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data) autorstwa [MaxMind](https://www.maxmind.com/) - Dane geolokalizacyjne +- [CServerSideClient](https://discord.com/channels/1160907911501991946/1508172390863994910/1508180670659166348) autorstwa [SLAYER](https://github.com/zakriamansoor47) + +## ❤️ Szczególne podziękowania +[CONTRIBUTORS] +ㅤ +[THANKS] + +## 📋 Lista Zmian + +
+v1.2.2.b2 + +- #### Ogólne: + - ###### Zaktualizowano zależność CSS do wersji 1.0.369. + - ###### Przeniesiono projekt z .NET 8.0 na .NET 10.0. + - ###### Zaktualizowano tłumaczenie na język turecki przez [@ByDexterTR](https://github.com/ByDexterTR)]. + - ###### Dodano tłumaczenie na język rosyjski autorstwa [@213sdfsdgf](https://github.com/213sdfsdgf)]. + - ###### Naprawiono problem z błędnym wyświetlaniem arabskich pseudonimów. + - ###### Wykorzystano ForceFullUpdate, aby naprawić crash "FATAL ERROR: CopyExistingEntity". + - ###### Wyłączono nieaktualny hook HandleCommandDrop, aby uniknąć crashy, gdy gracz dołącza do drużyny (podziękowania dla [@vladimir214sd](https://github.com/vladimir214sd)). + - ###### Dodano nowe sygnatury do gamedata. + - ###### Dodano możliwość ustawienia ilości granatów dla każdej mocy, która korzysta z granatów jako części swojej umiejętności (np. Bomberman, Anty Flash, Magnetyczny Wabik itp.). + +- #### Poprawki mocy: + - ###### Re-Zombie: + - ###### Naprawiono błędy z przełączaniem broni, gdy gracz trzyma Zeusa i nóż. + - ###### Bronie są teraz usuwane dla botów w trybie zombie. + - ###### Naprawiono błąd, przez który gracze czasami nie odradzali się, jeśli otrzymali zbyt duże obrażenia w zbyt krótkim czasie. + - ###### Duszek: + - ###### Zablokowano możliwość korzystania z Zeusa. + - ###### Zablokowano możliwość korzystania z SG556 (`weapon_sg556`). + - ###### Ciernie: + - ###### Dodano konfigurowalny maksymalny limit zdrowia (37 HP) dla obrażeń, które mogą zostać odbite. + - ###### Druga Szansa: + - ###### Naprawiono błąd, przez który gracze czasami nie odradzali się, jeśli otrzymali zbyt duże obrażenia w zbyt krótkim czasie. + - ###### Feniks: + - ###### Naprawiono błąd, przez który gracze czasami nie odradzali się, jeśli otrzymali zbyt duże obrażenia w zbyt krótkim czasie. + - ###### Kurczak: + - ###### Zablokowano możliwość korzystania z SG556 (`weapon_sg556`). + - ###### Wallhack: + - ###### Naprawiono błąd, który powodował tymczasowe podświetlanie wrogów natychmiast po śmierci. + - ###### Kamera: + - ###### Dodano zapamiętywanie pozycji kamery. + - ###### Nieśmiertelność: + - ###### Naprawiono błąd z permanentną nieśmiertelnością aktywującą się po osiągnięciu dokładnie 0 HP. + - ###### Zamiana Broni: + - ###### Ilość amunicji jest teraz również przenoszona podczas zamiany broni. + - ###### Ludzka bomba: + - ###### Zmieniono nazwę umiejętności na "DeathBomb". + - ###### Obserwator: + - ###### Naprawiono błąd, przez który gracz z umiejętnością Kurczak po śmierci nadal wyświetlał się jako ragdoll podczas bycia obserwowanym. + - ###### Ogień Przyjacielski: + - ###### Umiejętność działa teraz nawet wtedy, gdy serwerowa funkcja mp_friendlyfire jest ustawiona na 0. + - ###### Bejsbolista: + - ###### Wyłączono zabijanie członków drużyny. + +
+ +
+v1.2.2.b1 + +- #### Ogólne: + - ###### Zaktualizowano zależności projektu. + - ###### Zaimplementowano `EntityManager` w celu automatycznego czyszczenia encji i zarządzania pamięcią. + - ###### Dodano konfigurację umożliwiającą włączenie lub wyłączenie umiejętności dla botów. + - ###### Poprawki stabilności i wydajności. + +- #### Poprawki mocy: + - ###### Umiejętności oparte na niewidzialności: Są teraz widoczne dla członków drużyny oraz obserwatorów. + - ###### Fortnite: + - ###### Naprawiono problem z niezniszczalnymi barykadami po śmierci gracza. + - ###### Wallhack: + - ###### Ulepszono logikę wykrywania niewidzialnych graczy. + - ###### Dźwiękowiec / Stópkarz / Obserwator: + - ###### Zaktualizowano kod, aby poprawnie współpracował z niewidzialnymi graczami. + - ###### I więcej... + +
+ +
+v1.2.1.b9 + +- #### Ogólne: + - ###### Dodano Crash Handler w celu poprawy stabilności serwera (Podziękowania dla cj za pomoc). + - ###### Dodano rzadkość umiejętności (Skill Rarity - wprowadzono poziomy rzadkości dla mocy). + - ###### Dodano limit 'MaxPerServer' (ogranicza liczbę osób, które mogą korzystać z tej samej umiejętności jednocześnie). + - ###### Zastąpiono model "ghost_speaker.vmd" modelem "spray_plane.vmdl". + +- #### Poprawki mocy: + - ###### Skupienie: + - ###### Naprawiono i ulepszono kontrolę odrzutu (recoil control). + - ###### Re-Zombie / Feniks: + - ###### Zablokowano możliwość nadużywania (exploitu) odradzania się podczas zmiany drużyny. + +
+ +
+v1.2.1.b8 + +- #### Ogólne: + - ###### Zastąpiono [CS2TraceRay](https://github.com/schwarper/CS2TraceRay) biblioteką [RayTraceApi](https://github.com/FUNPLAY-pro-CS2/Ray-Trace). + - ###### Zaktualizowano CounterStrikeSharp do najnowszej wersji. + - ###### Nowa komenda do testowania umiejętności: `css_next_skill <(null)/-1/index>`. + - ###### Zaktualizowano sygnatury gamedata. + - ###### Zastąpiono bezpośrednie referencje do obiektów indeksami encji (entity indices) w celu poprawy bezpieczeństwa pamięci. + - ###### Naprawiono ścieżki modeli agentów. + - ###### Umiejętności są teraz automatycznie wyłączane, gdy gracz opuszcza serwer. + - ###### Dodano sprawdzenia wartości null (null-pointer checks) dla poprawy stabilności. + +- #### Poprawki mocy: + - ###### Aim Lock: + - ###### Ulepszono celowanie w głowę przeciwnika. + - ###### Anomalia / Skrytobójca / Kamera / Odpychacz / Zamiana Miejsc / Teleporter: + - ###### Ulepszono pozycjonowanie kamery podczas teleportacji. + - ###### Ostrożne pociski / Strzał Wybuchowy / Krucha Bomba: + - ###### Zaprojektowano na nowo logikę z powodu zmian w zdarzeniu `OnTakeDamage`. + - ###### Ogień Przyjacielski: + - ###### Naprawiono działanie umiejętności, gdy ogień przyjacielski jest wyłączony na serwerze (tryb Uproszczony/Casual). + - ###### Hologram: + - ###### Zablokowano możliwość wyrzucania i podnoszenia broni podczas bycia w formie hologramu. + - ###### Analfabeta: + - ###### Naprawiono błąd z poprawnym wyświetlaniem tekstu. + - ###### Stópkarz: + - ###### Naprawiono problemy związane z licznikami czasu (timerami). + - ###### Ninja: + - ###### Naprawiono błąd, przez który początkowy stan niewidzialności nigdy się nie aktualizował. + - ###### Skupienie / Szybkostrzelność: + - ###### Zaktualizowano kod, aby pasował do nowej struktury `AimPunchServices`. + - ###### NoClip / Cień / Iana: + - ###### Przeniesiono logikę na `TraceHullShape` w celu dokładniejszego wykrywania kolizji. + - ###### Re-Zombie: + - ###### Zablokowano możliwość używania broni w trybie zombie oraz zwiększono zdrowie do 500 HP. + +- #### Znane problemy: + - ###### Długi Nóż: + - ###### Wykrywanie prawego przycisku myszy jest obecnie zepsute na systemach Linux (pomimo poprawnych sygnatur). + - ###### Iluzjonista: + - ###### Błąd z T-Pose: Po dodaniu animgraph_2, modele postaci nie mają wbudowanych żadnych animacji. Na ten moment nie ma możliwości naprawienia tego bez dodawania własnych animacji z Warsztatu Steam. + +
+ +
+v1.2.1.b7 + +- #### Ogólne: + - ###### Podniesiono wersję modułu do **1.2.1.b7**. + - ###### Zaimplementowano **HTMLEncoder** w celu zwiększenia bezpieczeństwa wiadomości i ich ochrony. + - ###### Zaktualizowano funkcję `SkillAction`, aby zwracała wynik wywołanej metody (`object?`) lub `null`, jeśli nie została znaleziona. + - ###### Przebudowano system dystrybucji zdarzeń graczy, aby wywoływał `SkillAction` **tylko raz na każdą unikalną aktywną umiejętność**, co zmniejsza liczbę nadmiarowych wywołań. + - ###### Przełączono logikę pomiaru czasu na używanie `Server.CurrentTime` zamiast `EngineTime`. + - ###### Dodano informacje w konsoli podczas uruchamiania oraz automatyczne **sprawdzanie wersji** przy ładowaniu wtyczki. + - ###### Zaimplementowano **automatyczne kopiowanie** plików gamedata, bibliotek DLL oraz plików językowych podczas procesu budowania (autor: @vinicius-trev). + - ###### Zaktualizowano główne zależności: `CounterStrikeSharp.API` do wersji **1.0.364** oraz `MaxMind.Db` do wersji **5.0.0** (autor: @vinicius-trev). + - ###### Dodano **obsługę geolokalizacji** dla Turcji (`tr`) i Czech (`cz`). + - ###### Dodano obsługę **języka tureckiego (`tr`)** (autor: @brkvlr) oraz ulepszono tłumaczenia dla **języka portugalskiego brazylijskiego (`pt-br`)** (autor: @vinicius-trev). + - ###### W przypadku braku tłumaczenia system **używa teraz tekstu angielskiego** zamiast wyświetlania surowego klucza tłumaczenia. + - ###### **SkillUtils:** Naprawiono błędy wyboru punktów odrodzenia, problemy z referencjami pamięci oraz dodano obsługę parametru `maxHealth` dla funkcji `AddHealth`. + - ###### Naprawiono błąd, przez który **klawisz E** (interakcja/rozbrajanie) był przerywany przez użycie umiejętności; gracze mogą teraz rozbrajać bombę i wchodzić w interakcję z obiektami bez zakłóceń. + - ###### Licznik czasu systemu głosowania resetuje się teraz poprawnie po każdym głosowaniu. + +- #### Poprawki mocy: + - ##### Pilot (Rework): + - ###### Całkowicie przepisano logikę skoku. Lot wymaga teraz **podwójnego kliknięcia** klawisza skoku, aby go aktywować. + - ##### Błazen (Rework): + - ###### Zrefaktoryzowano system na działający indywidualnie dla każdego gracza (**per-player system**) wraz z poprawą stabilności licznika czasu. Licznik czasu Błazna **resetuje się** teraz, gdy gracz próbuje podłożyć lub rozbroić bombę. + - ##### NoClip (Rework): + - ###### Całkowita Rework logiki ruchu; ulepszono wykrywanie kolizji, aby **zapobiec utykaniu** w obiektach oraz zapewniono płynniejszy lot. + - ##### Duszek / C4 Kamuflaż / Ninja: + - ###### **Obserwatorzy widzą teraz niewidzialnych graczy.** + - ###### Ulepszono funkcję ukrywania bomby i naprawiono problem ze spamowaniem konsoli. + - ##### Odwrót / Resp Wroga: + - ###### Naprawiono błąd związany z niepoprawną interpretacją punktu odrodzenia. + - ##### Teleporter: + - ###### Mechanika została zmieniona na **procentową szansę** na zamianę miejsc z wrogiem, zamiast gwarantowanych 100%. + - ##### Hazardzista: + - ###### Naprawiono błąd, który pozwalał na odświeżenie umiejętności bez posiadania wymaganych pieniędzy. + - ##### Cień: + - ###### Naprawiono problemy związane z logiką teleportacji. + - ##### Ludzka bomba: + - ###### Zablokowano możliwość korzystania z umiejętności podczas zmiany drużyny, aby zapobiec nadużyciom (exploitom). + - ##### Bejsbolista: + - ###### Granaty wabiące (decoy) mają teraz taką samą kolizję jak gracze (**PlayerClip**). + - ##### Papito: + - ###### Główna refaktoryzacja oraz **naprawa crashy serwera** związanych z wymianą broni. + - ##### Replikator: + - ###### Dodano **animacje kucania** dla replik, aby dopasować je do ruchu gracza. + - ##### Mistrz Ostrza / Scyzoryk / Rozbrojenie / Długi Nóż / Długi Zeus / Zabójczy Flash: + - ###### Ulepszono obsługę broni typu **Bagnet** (Bayonet). + - ###### Dodano opcje konfiguracyjne **friendlyFire** dla `LongKnife`, `LongZeus` oraz `KillerFlash`. + - ##### Samowolka / Krótka Bomba / Wyluzowany: + - ###### Powiadomienia docierają teraz do wszystkich prawidłowych graczy, niezależnie od tego, czy żyją; dodano obsługę `BombAbortPlant`. + - ##### Niszczyciel Stref: + - ###### Dodano komunikat podczas przebywania na wyłączonym bombsite. + - ##### Wallhack: + - ###### Podświetlenie (glow) jest teraz poprawnie wyłączane dla martwych graczy. + - ##### Dźwiękowiec (Rework): + - ###### Przerobiono umiejętność tak, aby automatycznie odtwarzała dźwięk co 2 sekundy (słyszalny tylko dla gracza z tą umiejętnością). + +- #### Nowe moce: + - ##### Aim Lock: + - ###### Ustawia celownik na najbliższym przeciwniku przez ograniczony czas. + - ##### Naprowadzane Granaty: + - ###### Twoje granaty (z wyjątkiem dymnych) are przyciągane do pobliskich wrogów. + - ##### Magneto: + - ###### Odpycha nadlatujące granaty wroga od gracza. + - ##### Bomberman: + - ###### Rozmieszcza granaty odłamkowe (HE), które wybuchają tylko wtedy, gdy wróg znajdzie się w ich zasięgu. + - ##### Analfabeta: + - ###### Dopóki użytkownik żyje, wrogowie nie mogą czytać czatu ani informacji na HUD-zie. + - ##### Gorąca Bomba: + - ###### C4 zadaje stałe obrażenia osobie niosącej bombę tak długo, jak żyje właściciel umiejętności. + - ##### Iluzjonista: + - ###### Tworzy replikę, która idzie prosto przed siebie, aby odwrócić uwagę wrogów. + - ##### Magnetyczny Wabik: + - ###### Granaty wabiące (decoy) przyciągają pobliskich graczy do swojego środka. + - ##### TNóż do Rzucania: + - ###### Dodaje możliwość rzucania we wrogów zabójczym nożem. + - ##### Nieważkość: + - ###### Granaty lecą szybciej i nie działa już na nie grawitacja. + - ##### Dzikie Rzuty: + - ###### Sprawia, że wybrany gracz "zapomina swoich lineupów", co skutkuje losowymi trajektoriami rzutów granatów. + - ##### Zadymiarz: + - ###### Twoje granaty dymne nigdy się nie kończą. + +- #### Nowe komendy: + - ###### `css_bot_place ` - Teleportuje bota na pozycję gracza z opcjonalnym trybem godmode. + - ###### `!sethealth ` - Komenda dla administratora do zarządzania zdrowiem i testowania. + - ###### `!plantedbomb ` - Komenda do testowania stanów i logiki związanej z podłożoną bombą. +
+ +
+v1.2.0 + +- #### Ogólne: + - ###### Zmieniono nazwę pluginu z `!jRandomSkills` na `jRandomSkills`. + - ###### Poprawiono literówkę w uprawnieniach z `@jRandmosSkills` na `@jRandomSkills`. + - ###### Domyślnie wyłączono `DebugMode` w konfiguracji (przez: [@vinicius-trev](https://github.com/vinicius-trev)). + - ###### Zaktualizowano zależności GeoLite (przez: [@vinicius-trev](https://github.com/vinicius-trev)). + - ###### Poprawiono tłumaczenia w języku `pt-br` (przez: [@vinicius-trev](https://github.com/vinicius-trev)). + - ###### Dodano wsparcie dla języka niemieckiego (przez: [@Enrory](https://github.com/Enrory)). + - ###### Naprawiono wykrywanie języka na podstawie kodów ISO. + - ###### Naprawiono błędne odniesienia do plików językowych. + +- #### Poprawki mocy: + - ##### Resp Wroga: + - ###### Naprawiono błąd z błędną interpretacją punktu odrodzenia (spawnpoint). + - ##### Kamera: + - ###### Poprawiono pozycjonowanie kamery. + - ###### Ograniczono możliwość tworzenia kamery tylko do ścian. + - ###### Kluczowe poprawki stabilności. + - ##### Mrok / Hologram: + - ###### Dodano dodatkową walidację. + - ###### Naprawiono problem z niekończącym się timerem. + - ##### Stópkarz: + - ###### Lekka optymalizacja i naprawienie błędu, przez który ślady były widoczne dla wszystkich. + - ##### C4 Kamuflaż / Duszek / Ninja: + - ###### Poprawiono funkcję ukrywania bomby. + - ###### Naprawiono problem ze spamem w konsoli. + - ##### Żelazna Głowa / Mistrz Ostrza / Błazen / Pancernik / Tylko Głowa / Proteza / Pyro / Pancerz Reaktywny: + - ###### Poprawiono funkcję przywracania zdrowia. + - ##### Pancernik: + - ###### Dodano niewrażliwość na granaty decoy. + - ##### Bogacz: + - ###### Naprawiono błąd, przez który wszystkie pieniądze były usuwane po rundzie. + - ###### Pieniądze są odejmowane na podstawie wydatków, a ostateczna kwota nie może być niższa niż $3,000. + - ##### Doskok: + - ###### Dodano opcję `anyDirection` do konfiguracji, która określa, czy doskok może być wykonany w dowolnym kierunku, czy tylko do przodu. + - ##### Królik / Doskok / Pawel Jumper: + - ###### Poprawiono logikę skoku. + - ###### Moce mogą być teraz aktywowane za pomocą scrolla myszki. + - ##### Pajacyk / Beznogi: + - ###### Wymuszono ConVar `sv_legacy_jump 1`, aby umożliwić wykrywanie skoków. + - ##### Długi Zeus / Długi Nóż: + - ###### Strzały są teraz obliczane na podstawie hitboxów, a nie kolizji. + - ###### Naprawiono funkcjonalność RayTrace. + - ##### Cień: + - ###### Naprawiono funkcjonalność RayTrace. + - ##### Saper / Krótka Bomba: + - ###### Dodano komunikat powiadamiający o podłożeniu bomby. + - ##### SzeliS: + - ###### Ogólna refaktoryzacja. + - ###### Naprawiono błąd, przez który broń nie była poprawnie zamieniana. + - ###### Naprawiono błąd z duplikowaniem broni. + - ##### Toksyczny Dym: + - ###### Umiejętność jest teraz włączona tylko dla systemów Linux. + - ##### Zegarmistrz: + - ###### Usunięto timer rundy ze środkowego HUD-u. + - ###### Timer rundy aktualizuje się teraz dla wszystkich po rzuceniu granatów. + +- #### Nowe moce: + - ##### Ostrożne pociski: + - ###### Wybierz gracza, który traci HP za każdy niecelny strzał w innego przeciwnika. +
+ +
+v1.1.9f + +- #### Ogólne: + - ###### Zaktualizowano zależności do najnowszej wersji (CSS v1.0.361). + - ###### Zaktualizowano kompatybilność WSADMenu z najnowszą wersją CSS. + +- #### Poprawki mocy: + - ##### Trzęsienie ziemi: + - ###### Tymczasowo wyłączono. + - ##### Kamera: + - ###### Tymczasowo wyłączono. + - ###### Poprawiono pozycjonowanie kamery. + - ##### Hologram: + - ###### Tymczasowo wyłączono. + - ###### Replika może teraz otrzymywać obrażenia od strzałów w głowę. + - ##### Toksyczny Dym: + - ###### Zmieniono sposób obliczania odległości na triggerów. +
+ +
+v1.1.9e + +- #### Ogólne: + - ###### Poprawiono wyświetlanie ramek tekstowych oraz ich zawartości. + - ###### Dodano opcje personalizacji wyglądu wiadomości na czacie. +
+ +
+v1.1.9d + +- #### Ogólne: + - ###### Zaktualizowano wygląd wiadomości na czacie. + +- #### Poprawki mocy: + - ##### C4 Kamuflaż / Duszek / Ninja: + - ###### Teraz ukrywany jest cały model postaci, zamiast tylko broni i ustawiania przezroczystości modelu. + + - ##### Re-Zombie: + - ###### Zwiększono punkty życia zombie z 200 HP do 250 HP. + + - ##### Replikator: + - ###### Zwiększono obrażenia zadawane przez repliki: Twoja drużyna: 10 HP; Drużyna przeciwna: 20 HP. + - ###### Dodano możliwość dostosowania obrażeń repliki w pliku `skillsInfo.json`. + + - ##### Toksyczny Dym: + - ###### Umiejętność tymczasowo wyłączona w celu przetestowania logiki triggerów. + + - ##### Zegarmistrz: + - ###### Zmniejszono zmianę czasu z 10 sekund do 7 sekund. + +- #### Nowe moce: + - ##### Kamera: + - ###### Kliknij [css_useSkill], aby utworzyć/przełączyć się na kamerę. + + - ##### Hologram: + - ###### Kliknij [css_useSkill], aby sterować hologramem przez kilka sekund (hologram nie może strzelać). +
+ +
+v1.1.9c + +- #### Ogólne: + - ###### Zaktualizowano zależności do najnowszej wersji. + - ###### Dodano nowy tryb gry "FullRandom", który losuje losowe umiejętności w każdej rundzie (umiejętności mogą się powtarzać). + - ###### Dodano opcję `requiredPermission` do konfiguracji każdej umiejętności, określającą uprawnienia wymagane do jej otrzymania. + +- #### Poprawki mocy: + - ##### Hazardzista: + - ###### Dodano powiadomienie tekstowe, gdy gracz nie ma pieniędzy. + + - ##### Mrok: + - ###### Usunięto starą logikę post-processingu (nie działała na każdej mapie). + - ###### Dodano UTIL_ScreenFade dla bardziej niezawodnego i spójnego efektu ciemności. + + - ##### Odległościomierz: + - ###### Ograniczono maksymalną wyświetlaną odległość do 3000 jednostek. + + - ##### Fortnite: + - ###### Poprawiono kąt ustawiania barykad. + + - ##### Stópkarz: + - ###### Przeprojektowano logikę śladu (bean trail) na system cząsteczek (particles) dla lepszej wydajności. + + - ##### Trutka: + - ###### Nieznacznie zwiększono szybkość zadawania obrażeń. + - ###### Dodano minimalny próg zdrowia (30 HP), poniżej którego trucizna przestaje działać (konfigurowalne). + + - ##### Obserwator: + - ###### Naprawiono problem z kamerą po śmierci. +
+ +
+v1.1.9b + +- #### Ogólne: + - ###### Zaktualizowano zależności do najnowszej wersji. + - ###### Naprawiono problem z pustymi uprawnieniami dla komend. + - ###### Dodano opcję `SkillHudExpired` do pliku konfiguracyjnego, która kontroluje czas wyświetlania (w sekundach) środkowego HUD-u. + - ###### Dodano logikę obsługi zdarzeń trigger enter / exit. + - ###### Automatyczne dopasowanie wielkości liter dla opcji `AlternativeSkillButton` w konfiguracji. + - ###### Naprawiono problem z automatycznym wykrywaniem języka. + - ###### Próba naprawy błędu ze zmianą rozmiaru modeli. + +- #### Poprawki mocy: + - ###### Bankrut: + - ###### Mrok: + - ###### Deaktywator: + - ###### Głuchy: + - ###### Glitch: + - ###### Zakłócacz: + - ###### Beznogi: + - ###### Zamiana Żyć: + - ###### Lupa: + - ###### Skarbówka: + - ###### Trutka: + - ###### Brak Karabinów: + - ###### Złodziej: + - ###### Naprawiono wyświetlanie wiadomości w języku drugiego gracza. + + - ###### C4 Kamuflaż: + - ###### Duszek: + - ###### Glaz: + - ###### Stópkarz: + - ###### Ninja: + - ###### Wallhack: + - ###### Potencjalna naprawa błędu brakującego bytu (entity) podczas ponownego pokazywania modelu. + + - ###### Niszczyciel Stref: + - ###### Naprawiono błędną kolejność wyświetlania bombsite'ów. + + - ###### Hazardzista: + - ###### Naprawiono błąd, przez który gracze mogli ponownie losować umiejętność nawet bez posiadania pieniędzy. + + - ###### Dźwiękowiec: + - ###### Dodano osobne dźwięki dla obu drużyn (konfigurowalne). + + - ###### Toksyczny Dym: + - ###### Zaktualizowano logikę, aby używała triggerów (brak offsetu dla systemów Windows). + + - ###### Zegarmistrz: + - ###### Dodano dźwięk podczas aktualizacji czasu (konfigurowalny). +
+ +
+v1.1.9a + +- #### Ogólne: + - ###### Zaktualizowano zależności do najnowszej wersji. + - ###### Aktualizacja sygnatur (jRandomSkills.gamedata.json). + - ###### FlashingHtmlHudFix jest teraz wyłączony podczas rozgrzewki. + - ###### Naprawiono błędne wyświetlanie tekstu debugowania podczas używania komendy. + - ###### Poprawiono funkcjonalność komendy !map. + - ###### Dodano opcję `YourSkillChatInfo` do konfiguracji, umożliwiającą wyłączenie opisu własnej umiejętności na czacie. + - ###### Wyłączanie umiejętności graczy podczas zmiany mapy. +- #### Poprawki mocy: + - ##### Trzecie Oko: + - ###### Dodano model do kamery. + - ##### Obserwator: + - ###### Dodano model do kamery. + - ##### Oko Sokoła: + - ###### Dodano model do kamery. + - ##### Stópkarz: + - ###### Tymczasowo wyłączono w celu napisania kodu na nowo. +
+ +
+v1.1.8 + +- #### Ogólne: + - ###### Dodano opcję `DisableHUDOnDeathPermission` do pliku konfiguracyjnego, aby wyłączyć HUD po śmierci dla graczy posiadających to konkretne uprawnienie. + - ###### Dodano opcję `DisableSkillsOnRoundEnd` do pliku konfiguracyjnego, aby wyłączyć wszystkie umiejętności na koniec rundy (gdy widoczne jest podsumowanie). + - ###### Uprawnienie `@jRandomSkills/root` zostało zmienione na `@jRandomSkills/owner`, aby zapobiec problemom z domeną. + - ###### Dodano polecenie `!hud` do włączania/wyłączania HUD (gdy HUD jest wyłączony, menu WSAD nie będzie wyświetlane). + - ###### Wyłączenie pierwszej umiejętności, jeżeli podczas pierwszej rundy wylosowano dwie umiejętności. + - ###### Komenda `!reload` odświeża również status aktywności umiejętności. +- #### Poprawki mocy: + - ##### Replikator: + - ###### Naprawiono błąd powodujący awarie serwera po wybuchu bomby. + - ###### Kolizje replik są teraz bardziej dokładne. +
+ +
+v1.1.7 + +- #### Ogólne: + - ###### Zaktualizowano zależności do najnowszej wersji. + - ###### Informacje o umiejętnościach są teraz dostępne w `skillsInfo.json` zamiast w `config.json`. + - ###### Dodano plik `jRandomSkills.gamedata.json`. + - ###### Dodano opcję wyłączenia konkretnej mocy podczas freeze time (domyślnie wyłączone: Zamiana Miejsc, Odwrót, Replikator, Trutka, Samowolka, Pilot, NoClip, Medyk, Nieśmiertelność, Fortnite, Resp Wroga, Anomalia). + - ###### Dodano opcje `LanguageSystem` do pliku konfiguracyjnego dla szczegółowego zarządzania przypisywaniem języka. + - ###### Komenda `StartGameCommand` ma teraz zmienny parametr startowy w pliku konfiguracyjnym. + - ###### Dodano opcję `DisplayAlwaysDescription` w pliku konfiguracyjnym, aby opis umiejętności był widoczny cały czas. + - ###### Dodano opcje `HtmlHudCustomisation` w pliku konfiguracyjnym do ustawiania kolorów i rozmiaru czcionki. + - ###### Można ustawić pusty tekst: your_skill/drawing_skill/observer_skill/XXX_select_info. + - ###### Opcja ustawienia uzyskanej wartości w nazwie/opisie umiejętności (`{0}`). + - ###### Naprawiono wyświetlanie czasu odnowienia umiejętności (zaokrąglenie w górę). + - ###### Komenda `!reload` odświeża teraz wszystkie parametry ze wszystkich plików konfiguracyjnych. + - ###### Większość kolekcji została zastąpiona strukturami bezpiecznymi dla wątków, aby uniknąć crashy serwera (pomysł: @ebat_kopat777). +- #### Poprawki mocy: + - ##### Długi Nóż: + - ###### Prawy atak nożem również zadaje obrażenia. + - ###### Naprawiono błąd, w którym po śmierci umiejętność gracza była pokazywana jako `Brak`. + - ##### Wallhack: + - ###### Poświaty tworzą się tylko raz, zamiast dla każdego gracza osobno. + - ###### Naprawiono błąd, w którym po śmierci umiejętność gracza była pokazywana jako `Brak`. + - ##### Stópkarz: + - ###### Naprawiono błąd, w którym po śmierci umiejętność gracza była pokazywana jako `Brak`. + - ##### Zamiana Miejsc: + - ###### Dodano konfigurowalny czas blokady na początku rundy. + - ##### Obserwator: + - ###### Zmieniła się metoda poruszania się kamery. + - ##### NoClip: + - ###### Powrót do ostatniego miejsca użycia umiejętności, jeśli gracz spadnie poniżej 3000 jednostek. + - ###### Dodano opcję wyłączenia noclipu, gdy jest aktywny. + - ##### Ninja: + - ###### Naprawiono problem z niewidoczną bronią po śmierci. + - ##### Muhammed: + - ###### Komunikat przy eksplozji jest teraz konfigurowalny (w languages/). + - ###### Naprawiono błąd, w którym granat nie wybuchał. + - ##### Duszek: + - ###### Naprawiono problem z niewidoczną bronią po śmierci. + - ##### Strzał Wybuchowy: + - ###### Naprawiono błąd, w którym granat nie wybuchał. + - ##### Resp Wroga: + - ###### Dodano konfigurowalny czas blokady na początku rundy. + - ##### Rozbrojenie: + - ###### Powrót do upuszczania broni zamiast zmiany na slot3. + - ###### Zmniejszono szansę na upuszczenie broni: (20-50)% → (20-35)%. + - ##### Kurczak: + - ###### Zmieniła się metoda poruszania się kurczaka. + - ###### Gracz widzi model swojego kurczaka. + - ###### Naprawiono hitboxy po powrocie do normalnego modelu. + - ###### Naprawiono błąd, w którym po dezaktywacji umiejętności gracz otrzymywał nadmiarowe HP. + - ##### C4 Kamuflaż: + - ###### Naprawiono problem z niewidoczną bronią po śmierci. + - ##### Mistrz Ostrza: + - ###### Zmniejszono prędkość ruchu z nożem o 10% (konfigurowalne). + - ##### Anty Flash: + - ###### Dodano opcję w pliku konfiguracyjnym, umożliwiającą zmianę czasu trwania błysku twojego flash'a. + - ##### Błazen: + - ###### Naprawiono problem, w którym gracz mógł otrzymywać obrażenia od innych umiejętności lub wybuchu bomby. + - ###### Naprawiono błąd, w którym gracz zawsze był fioletowy. + - ##### Cień: + - ###### Dodano opcję ustawienia szansy na teleportację po trafieniu przeciwnika (w pliku konfiguracyjnym). + - ##### Szpieg: + - ###### Ustawianie modelu gracza po dezaktywacji umiejętności. + - ###### Domyślny model terrorystów został zmieniony. +
+ +
+v1.1.6 + +- #### Ogólne: + - ###### Dodano język francuski (autorstwa [@felyjyn](https://github.com/felyjyn)). +- #### Poprawki mocy: + - ##### Doskok: + - ###### Dodano możliwość wykonywania doskoku w dowolnym kierunku. +
+ +
+v1.1.5 + +- #### Ogólne: + - ###### Zaktualizowano zależności do najnowszej wersji. + - ###### Dodano rozpoznawanie języka na podstawie geolokalizacji (MaxMind GeoLite2). + - ###### Każdy gracz może wybrać inny język. + - ###### Zmieniono nazwy katalogów. + - ###### Usunięto automatyczne odświeżanie pliku konfiguracyjnego. + - ###### Dodano opcję `DisableSpectateHUD` do pliku konfiguracyjnego, umożliwiającą wyłączenie HUD HTML dla martwych graczy. + - ###### Nazwa projektu została zmieniona z `jRandomSkills` na `!jRandomSkills`, aby umożliwić późniejsze ładowanie innych wtyczek do pamięci. + - ###### Dodano polecenie `!lang en`, aby zmienić język. + - ###### Dodano polecenie `!reload`, aby ponownie załadować tłumaczenia. + - ###### Zniesiono ograniczenia dotyczące wiadomości powitalnych. +- #### Poprawki mocy: + - ##### Zamiana Broni: + - ###### Naprawiono błąd związany z powielaniem bomby na HUD. + - ##### Złodziej: + - ###### Możliwość kradzieży umiejętności niedostępnych dla twojej drużyny została zablokowana. + - ###### Menu HTML jest wyłączone, gdy nie znaleziono żadnych graczy. + - ##### SzeliS: + - ###### Naprawiono wszystkie błędy i włączono tę umiejętność. + - ##### Druga Szansa: + - ###### Powrót do pierwotnego stanu zdrowia po wyłączeniu umiejętności. + - ##### Samowolka: + - ###### Zablokowano możliwość podkładania bomby podczas freezetime. + - ##### Stópkarz: + - ###### Dodano sprawdzanie "null". + - ##### Astronauta: + - ###### Naprawiono brak wyświetlania skali grawitacji w HTML. + - ##### Duplikator: + - ###### Menu HTML jest wyłączone, gdy nie znaleziono żadnych graczy. + - ##### Deaktywator: + - ###### Menu HTML jest wyłączone, gdy nie znaleziono żadnych graczy. +- #### Nowe moce: + - ##### Granatnik: + - ###### Masz nieskończone granaty odłamkowe. + - ##### Doskok: + - ###### Wykonaj drugi skok, aby wykonać doskok. +
+ +
+v1.1.4 + +- #### Ogólne: + - ###### Do pliku konfiguracyjnego dodano opcję `SkillTimeBeforeStart`, która określa, na ile sekund przed końcem freezetime powinno się zakończyć losowanie umiejętności. + - ###### Do pliku konfiguracyjnego dodano opcję `SkillDescriptionDuration`, która określa, ile sekund opis umiejętności w wiadomości HTML powinien być widoczny. + - ###### Umiejętności nie są już wyłączane pod koniec rundy. + - ###### Zmieniono logikę przydzielania umiejętności. + - ###### Zbyt długie pseudonimy są skracane podczas oglądania graczy. + - ###### Wybór gracza został zmieniony z Chat Menu na WSAD Menu. + - ###### Na początku rundy dodano opisy umiejętności wyświetlane za pomocą PrintToCenterHtml. + - ###### Skrócono opisy umiejętności przy wyborze gracza. + - ###### Naprawiono problem, w którym komendy css_setskill i css_setstaticskill nie mogły być wykonywane z serwera. + - ###### Parametry polecenia `!start` zostały zmienione. +- #### Poprawki mocy: + - ##### Beznogi: + - ###### Umiejętność Beznogi całkowicie wyłącza umiejętność Królik. + - ##### Bogacz: + - ###### Limit został ustawiony na $16,000. + - ##### Pilot: + - ###### Plecak odrzutowy został przeprojektowany. + - ###### Zwiększono ilość paliwa. + - ###### Od teraz ilość paliwa jest zawsze widoczna. + - ###### Nie można już używać plecaka odrzutowego podczas rozbrajania bomby. + - ##### Strzał Wybuchowy: + - ###### Obrażenia i zasięg ataku zostały nieznacznie zwiększone. + - ##### Flash: + - ###### Naprawiono błąd powodujący "wystrzelenie w górę" graczy na schodach/rampach. + - ##### Lupa: + - ###### Usunięto niepotrzebne wywołania Server.PrintToChatAll. + - ##### Zamiana Broni: + - ###### Naprawiono błąd z możliwością wymiany broni z martwym graczem. + - ##### Mini Majk: + - ###### Naprawiono błąd z niezmienionymi hitboxami. + - ##### Kurczak: + - ###### Naprawiono błąd z niezmienionymi hitboxami. +- #### Nowe moce: + - ##### Błazen: + - ###### W trybie błazna nie możesz zadawać ani otrzymywać obrażeń. Tryb zmienia się co kilka sekund. + - ##### Hazardzista: + - ###### Wybierz umiejętność z podanej listy. + - ##### Bankrut: + - ###### Wybierz gracza, który straci wszystkie swoje pieniądze. +
+ +
+v1.1.3 + +- #### Ogólne: + - ###### Dodano opcje `AlternativeSkillButton` do pliku konfiguracyjnego, aby przycisk gracza mógł być używany do aktywowania umiejętności. + - ###### Obserwatorzy nie są już uwzględniani przy wyborze konkretnego gracza podczas używania umiejętności. +- #### Poprawki mocy: + - ##### Stópkarz: + - ###### Teraz wszyscy przeciwnicy pozostawiają ślad, a nie tylko wybrany. + - ##### Mrok: + - ###### Wszystkie woluminy postprocessingu są zastępowane, a nie tylko pierwszy z nich. +
+ +
+v1.1.2 + +- #### Ogólne: + - ###### Umiejętności zostały wyłączone podczas rozgrzewki. + - ###### Dodano walidację dla wartości nieokreślonych. + - ###### Dodano użycie poleceń i zmiany mapy do debug. + - ###### Dodano polecenie `!setstaticskill`, które na stałe przypisuje graczowi określoną umiejętność. + - ###### Polecenia mogą mieć niestandardowe uprawnienia ustawione w pliku konfiguracyjnym. + - ###### Nowy tryb gry: Umiejętności nie mogą być powtarzane, dopóki mapa się nie zmieni (ustawione jako domyślne). + - ###### Dodano system głosowania dla poleceń takich jak: `!start`, `!map`, `!swap`, `!shuffle`, `!pause`, `!setscore` (konfigurowalne) + - ###### Dodano możliwość wyszukiwania graczy według identyfikatora SteamID dla polecenia !setskill. +- #### Poprawki mocy: + - ##### Pawel Jumper: + - ###### Daje losową liczbę dodatkowych skoków zamiast tylko jednego. + - ###### Dodano do konfiguracji: minimalną i maksymalną liczbę dodatkowych skoków. + - ##### Kurczak: + - ###### Kurczak jest niewidoczny dla gracza posiadającego tę umiejętność. + - ##### Fortnite: + - ###### Barykada ma teraz 115 HP zamiast znikać po jednym strzale. + - ###### Dodano do konfiguracji: hp barykady i model barykady. + - ##### Glaz: + - ###### Gracze obserwujący cię również nie widzą granatów dymnych. + - ##### Wallhack: + - ###### Gracze obserwujący cię mogą również widzieć przez ściany. + - ##### Gumowe kule: + - ###### Naprawiono błąd związany z dodawaniem istniejącego klucza. + - ##### Ninja: + - ###### Transmisja broni została wyłączona, dzięki czemu charms i nametags nie są widoczne. + - ##### Duch: + - ###### Transmisja broni została wyłączona, dzięki czemu charms i nametags nie są widoczne. + - ##### C4 Kamuflaż: + - ###### Transmisja broni została wyłączona, dzięki czemu charms i nametags nie są widoczne. +- #### Nowe moce: + - ##### Lupa: + - ###### Powoduje powiększenie ekranu przeciwnika, ograniczając jego pole widzenia. + - ##### Ciernie: + - ###### Twój przeciwnik otrzyma część obrażeń, które zadał tobie. + +
+ +
+v1.1.1 + + - #### Ogólne: + - ###### Dodano walidację dla wartości nieokreślonych dla umiejętności: Cichociemny i Flash. +
+ +
+v1.1.0 + +- #### Ogólne: + - ###### Dodano język Brazylijski (Portugalski) (Grok AI). + - ###### Dodano język Chiński (Grok AI). + - ###### Dodano tryby gry. + - ###### Dodano konfigurację dla każdej supermocy. + - ###### Dodano tryb Debug Mode. + - ###### Dodano otrzymywanie broni dla klas z nimi związanymi (sugestia od [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)). + - ###### Wprowadzono ogólne poprawki i naprawiono błedy. +- #### Nowe moce: + - ##### Anomalia: + - ###### Cofasz się o 5 sekund do tyłu. Cooldown: 15 s. + - ##### Niszczyciel Stref: + - ###### Możesz wybrać strefę detonacji, którą chcesz dezaktywować. + - ##### Skrytobójca: + - ###### Zadajesz podwójne obrażenia przeciwnikowi od tyłu. + - ##### Bejsbolista: + - ###### Twój wabik odbija się od ścian i natychmiastowo zabija wroga po trafieniu. + - ##### Mistrz Ostrza: + - ###### Trzymając nóż, masz duże szanse na odparcie strzału. + - ##### C4 Kamuflaż: + - ###### Kiedy trzymasz bombę, jesteś niewidzialny. + - ##### Wyluzowany: + - ###### Podłożenie bomby zajmuje 10 sekund. + - ##### Scyzoryk: + - ###### Natychmiastowe zabójstwo nożem. + - ##### Mrok: + - ###### Nadaje efekt ciemności wybranemu przeciwnikowi. + - ##### Deaktywator: + - ###### Wybierasz gracza, którego supermoc chcesz wyłączyć. + - ##### Głuchy: + - ###### Wybierasz gracza, dla którego chcesz wyłączyć wszystkie dźwięki. + - ##### Odległościomierz: + - ###### Możesz zobaczyć odległość do najbliższego przeciwnika. + - ##### Duplikator: + - ###### Wybierasz gracza, od którego chcesz skopiować supermoc. + - ##### Strzał Wybuchowy: + - ###### Losowa szansa wystrzelenia pocisku wybuchowego podczas strzelania. Szansa: (15 - 30)%. + - ##### Oko Sokoła: + - ###### Kliknij [css_useSkill], aby aktywować kamerę z lotu ptaka. + - ##### Szybkie Rączki: + - ###### Kliknij [css_useSkill], aby przeładować broń, którą obecnie trzymasz. + - ##### Fortnite: + - ###### Kliknij [css_useSkill], aby stworzyć barykadę, którą można zniszczyć. Cooldown: 2 s. + - ##### Krucha Bomba: + - ###### Strzelanie do bomby powoduje jej uszkodzenie. + - ##### Ogień Przyjacielski: + - ###### Strzelanie do członków drużyny leczy ich. + - ##### Glaz: + - ###### Nie widzisz granatów dymnych. + - ##### Glitch (wymyślone przez [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### Wyłączasz radar wybranemu przeciwnikowi. + - ##### Klej (wymyślone przez [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### Twoje granaty przyklejają się do ścian. + - ##### Leczący Dym: + - ###### Twoje granaty dymne leczą. + - ##### Pustelnik (wymyślone przez [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### Zabijanie przywraca amunicję i część zdrowia. + - ##### Święty Granat Ręczny: + - ###### Twoje granaty uderzeniowe zadają podwójne obrażenia i mają podwójny zasięg. + - ##### Stópkarz: + - ###### Wybierasz gracza, który pozostawi za sobą ślad. + - ##### Zakłócacz (wymyślone przez [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### Wybierasz gracza, dla którego chcesz wyłączyć celownik. + - ##### Beznogi: + - ###### Wybierasz gracza, który nie będzie mógł skakać. + - ##### Pajacyk: + - ###### Skakanie przywraca zdrowie. + - ##### Zamiana Żyć: + - ###### Wybierasz gracza, z którym chcesz wymienić się zdrowiem. + - ##### Długi Nóż: + - ###### Podstawowy atak nożem zadaje obrażenia niezależnie od odległości. + - ##### Długi Zeus: + - ###### Zeus zadaje obrażenia niezależnie od odległości. + - ##### Skarbówka: + - ###### Wybierasz gracza, z którym chcesz zamienić się pieniędzmi. + - ##### Ninja: + - ###### Stojąc nieruchomo zwiększasz swoją niewidzialność o 33%, kucając o 33%, a trzymając nóż o 33%. + - ##### Pancernik: + - ###### Granaty nie zadają Ci obrażeń. + - ##### Skupienie (wymyślone przez [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### Brak odrzutu podczas strzelania. + - ##### NoClip: + - ###### Kliknij [css_useSkill], aby włączyć noclip na krótki czas. Cooldown: 30 s. + - ##### Tylko Głowa: + - ###### Otrzymujesz obrażenia tylko w głowę. + - ##### Trutka: + - ###### Wybierasz gracza, który co kilka sekund będzie otrzymywał obrażenia. + - ##### Brak Karabinów: + - ###### Wybierasz gracza, który nie może używać karabinów. + - ##### Proteza: + - ###### Ramiona i nogi są kuloodporne. + - ##### Zdalne Rozbrajanie: + - ###### Kiedy jesteś blisko bomby, zaczynasz ją rozbrajać. Cooldown: 10 s. + - ##### Odpychacz: + - ###### Masz losową szansę na odepchnięcie wroga po trafieniu go. Szansa: 100%. + - ##### Pyro: + - ###### Molotow przywraca zdrowie. + - ##### Pancerz Reaktywny: + - ###### Pancerz pochłania pierwsze otrzymane obrażenia. Cooldown: 15 s. + - ##### Regeneracja: + - ###### Co kilka sekund odnawiasz zdrowie. + - ##### Replikator: + - ###### Kliknij [css_useSkill], aby stworzyć replikę, która zadaje obrażenia po trafieniu. Cooldown: 15 s. + - ##### Zwrot do Nadawcy: + - ###### Pierwsze trafienie wroga powoduje, że wraca on na swój resp. + - ##### Re-Zombie: + - ###### Po śmierci odradzasz się jako zombie z większym zdrowiem i bez broni. + - ##### Robin Hood (wymyślone przez [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### Zadanie obrażeń przeciwnikowi powoduje kradzież jego pieniędzy. + - ##### Gumowe Kule (wymyślone przez [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### Twoje pociski znacznie spowalniają graczy. + - ##### Druga Szansa: + - ###### Po śmierci odradzasz się z taką samą ilością zdrowia. + - ##### Krótka Bomba (wymyślone przez [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### Bomba wybucha znacznie szybciej. + - ##### SzeliS: + - ###### Kliknij [css_useSkill], aby zamienić aktualną broń na AWP. + - ##### Dźwiękowiec: + - ###### Kliknij [css_useSkill], aby wywołać dźwięk u każdego przeciwnika. Cooldown: 5 s. + - ##### Obserwator: + - ###### Kliknij [css_useSkill], aby obserwować losowego przeciwnika. + - ##### Złodziej: + - ###### Możesz ukraść supermoc wybranemu graczowi. + - ##### Trzecie Oko: + - ###### Kliknij [css_useSkill], aby aktywować trzecią osobę. + - ##### Toksyczny Dym: + - ###### Twoje granaty dymne zadają obrażenia. + - ##### Wallhack: + - ###### Widzisz wrogów przez ściany. + - ##### Zegarmistrz: + - ###### Każdy rzut granatem zmienia czas rundy o -10 lub +10 sekund. +- #### Poprawki mocy: + - ###### Poprawiono opisy supermocy. + - ###### Naprawiono wszyskie zauważalne błedy. +
+ +
+v1.0.3 + +- #### Ogólne: + - ###### Dodano język angielski. + - ###### Dodano wiadomość powitalną. + - ###### Dodano podsumowanie z ostatniej rundy. + - ###### Dodano podgląd supermocy obserwowanego gracza. + - ###### Zabklokowano możliwość posiadania tej samej supermocy dwa razy pod rząd. + - ###### Dodano prostą konfigurację dla każdej supermocy. + - ###### Przerobiono wszystkie supermoce aby można manipulować nimi w każdej chwili (Naprawiono komendy do ustawiania supermocy). + - ###### Zmieniono aktywację supermocy na bind css_useSkill. +- #### Nowe moce: + - ##### Zamrażający Decoy + - ###### Twój decoy zamraża wszystkich pobliskich graczy. + - ##### Żołnierz: + - ###### Masz losowy mnożnik obrażeń (1.15 - 1.35)x. + - ##### Gruby: + - ###### Masz losowy mnożnik otrzymywanych obrażeń (0.65 - 0.85)x. + - ##### Aimbot: + - ###### Każdy twój trafiony pocisk jest liczony jako głowa. + - ##### Odwrót: + - ###### Powrót na spawna. Kliknij [css_useSkill], cooldown 15s. + - ##### Resp Wroga: + - ###### Teleportacja na spawn wroga. Kliknij [css_useSkill], cooldown 15s. + - ##### Zeus: + - ###### Zeus x27 natychmiastowo się odnawia. + - ##### Radarowiec: + - ###### Widzisz wrogów na radarze. + - ##### Szybkostrzelność: + - ###### Brak cooldown przy strzelaniu. + - ##### Samowolka: + - ###### Możesz podłożyć bombę w dowolnym miejscu, czas detonacji bomby trwa 60s. + - ##### Cichociemny: + - ###### Twoje kroki i skoki są niesłyszalne dla INNYCH graczy. + - ##### Zabójczy Flash: + - ###### Każdy całkowicie oślepiony twoim granatem umiera (również ty). + - ##### Spowlnienie Czasu: + - ###### Spowolnienie czasu dla wszystkich na 6 sekundy. Kliknij [css_useSkill], cooldown 30s. + - ##### Nieśmiertelność: + - ###### Jesteś nieśmiertelny przez 2 sekundy. Kliknij [css_useSkill], cooldown 30s. + - ##### Losowa Broń: + - ###### Dostajesz losową broń. Kliknij [css_useSkill], cooldown 15s. + - ##### Zamiana Broni: + - ###### Zamieniasz się bronią z losowym wrogiem. Kliknij [css_useSkill], cooldown 30s. +- #### Poprawki mocy: + - ##### Saper: + - ###### Naprawiono bład z natychmiastowym podkładaniem bomby jak ktokolwiek na serwerze miał moc 'Saper'. + - ##### Duszek: + - ###### Naprawiono bycie niewidzialnym po śmierci. + - ###### Drobne poprawki dla reszty mocy. +
+ +
+v1.0.2 + +- #### Nowe moce: + - ##### Mini Majk: + - ###### Losowa wielkość postaci w przedziale (60% - 95%). + - ##### Zamiana Miejsc: + - ###### Zamiana miejscami z losowym wrogiem, po kliknięciu przyciska [css_useSkill]. Cooldown to 30s. +- #### Poprawki mocy: + - ##### Anty Flash: + - ###### Dodano: Twoje flash'e trwają dłużej (7s). + - ##### Astronauta: + - ###### Zmieniono: Mnożnik grawitacji z (0.2 - 0.7) na (0.1 - 0.7). + - ###### Dodano: Gracz widzi teraz mnożnik swojej grawitacji na czacie. + - ##### Drakula: + - ###### Zmieniono: Drakula od teraz może mieć nadwyżkę zdrowia. + - ##### Duszek: + - ###### Dodano: Zabklokowanie korzystania z broni innej niż nóż. + - ###### Dodano: Każda podniesiona broń przez duszka staje się niewidzialna. + - ##### Flash: + - ###### Naprawiono nie dostawanie prędkości. + - ###### Zmieniono: Mnożnik prędkości z (1.2 - 2.5) na (1.2 - 3.0). + - ###### Dodano: Gracz widzi teraz mnożnik swojej prędkości na czacie. + - ##### Katapulta: + - ###### Dodano: Losowe szanse na podrzucenie (20% - 40%). + - ###### Dodano: Gracz widzi teraz swoje szanse na czacie. + - ##### Kurczak: + - ###### Naprawiono nie dostawanie modelu kurczaka. + - ###### Dodano: Zabklokowanie korzystania z broni innej niż nóż lub pistolet. + - ###### Dodano: Kurczak może posiadać tylko 50 hp. + - ##### Medyk: + - ###### Naprawiono nie dostawanie apteczek. + - ###### Zmieniono: Od teraz wszyscy tracą apteczki na końcu rundy. + - ##### Nieskończone Ammo: + - ###### Dodano: Od teraz granaty również są nieskończone. + - ##### Obrót Wroga: + - ###### Dodano: Losowe szanse na obrót wroga (20% - 40%). + - ###### Dodano: Gracz widzi teraz swoje szanse na czacie. + - ##### Phoenix: + - ###### Naprawiono nie odradzanie się po śmierci. + - ###### Dodano: Losowe szanse na odrodzenie (20% - 40%). + - ###### Dodano: Gracz widzi teraz swoje szanse na czacie. + - ##### Pilot: + - ###### Zmieniono: Poprawiono opis supermocy. + - ##### Rambo: + - ###### Naprawiono nie dostawanie dodatkowego życia. + - ##### Rozbrojenie: + - ###### Dodano: Losowe szanse na wyrzucenie broni wroga (20% - 40%). + - ###### Dodano: Gracz widzi teraz swoje szanse na czacie. + - ###### Zmieniono: Wyrzuca teraz tylko aktywną broń wroga (naprawiono błąd wyrzucenia kosy). + - ##### Eliminator -> Saper: + - ###### Zmieniono: Zmineiono nazwę mocy z 'Eliminator' na 'Saper'. + - ##### Teleporter: + - ###### Naprawiono błąd, gdzie tylko gracz z supermocą był przeteleportowywany. +
+ +## 💝 Wsparcie + + + + + ⠀ + + + + + +## 📝 Kontakt + +Jeśli masz jakieś pytanie, napisz na juzlus.biznes@gmail.com lub [jRandomSkills Discord](https://discord.gg/9H8EZYBpPF). \ No newline at end of file diff --git a/github/readme.md b/github/readme.md new file mode 100644 index 0000000..c28ade2 --- /dev/null +++ b/github/readme.md @@ -0,0 +1,1321 @@ + + +
+ GitHub release       + GitHub latest commit       + Github all releases       + GitHub stars       + Discord server +
+ +## 📌 +> [!NOTE] +> This repository is a fork of the [project](https://github.com/jakubbartosik/dRandomSkills) created by [Jakub Bartosik (D3X)](https://github.com/jakubbartosik). + +## 💡 About +jRandomSkills is a plugin for CounterStrike 2 that brings chaos and fun to gameplay! In each round, you randomly receive one of the unique skills - from invisibility and explosive shots to camera manipulation. Surprise your opponents, take control of the match, and discover dozens of creative abilities that transform the game's dynamics! + +#### Choose language: + + + + + + + +## 💬 Available languages +- **English** +- **Polish** +- **French** [by: [@felyjyn](https://github.com/felyjyn)] +- **Portuguese (Brazilian)** [by: [@vinicius-trev](https://github.com/vinicius-trev)] +- **German** [by: [@Enrory](https://github.com/Enrory)] +- **Turkish** [by: [@brkvlr](https://github.com/brkvlr), [@ByDexterTR](https://github.com/ByDexterTR)] +- **Russian** [by: [@213sdfsdgf](https://github.com/213sdfsdgf)] +- **Simplified Chinese** [GrokAI / ChatGPT] + +## 🖼️ Preview +![Preview](./preview.gif) +![Preview2](./preview2.gif) + +## 🌐 Test Server +Join the 3v3 test server and try out the jRandomSkills plugin: +- **Address**: `jRandomSkills@pukawka.pl` +- **Password**: `public` +- **Opening Hours**: `22:00-17:00 UTC` +- **Connect URL**: `steam://connect/51.38.122.215:27215/public` +- **Connect**: `connect 51.38.122.215:27215; password public` + +Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus.html). + + +## ✨ Current Skills (124) +
+The table below lists all available skills in the game, along with their descriptions. + +| Name | Description | Cooldown / Range | +| - | - | - | +| Aimbot | Every bullet you hit counts as a headshot | - | +| Aim Lock | Click [css_useSkill] to lock your aim on the nearest enemy | 20 s | +| Anomaly | You rewind a few seconds back in time | 15 s | +| Anti-Flash | You are immune to flashbangs, and your flashbangs last 7 seconds | - | +| Iron Head | You take no damage from headshots | - | +| Zone Reaper | You can choose a bomb site to deactivate | - | +| Armored | You have a random damage taken multiplier | (0.65 - 0.85)x | +| Assassin | You deal increased damage to enemies from behind | - | +| Astronaut | You receive a random gravity value at the start of the round | (0.1 - 0.7)x | +| Bankrupt | Choose the player who will lose all their money | - | +| Baseball Player | Your decoy bounces off walls and instantly kills an enemy on impact | - | +| Enemy Spin | You have a random chance to turn an enemy 180° when hitting them | (20 - 40)% | +| Blademaster | While holding a knife, you have a high chance to deflect a shot | - | +| Bunny | You get auto "BunnyHop" | - | +| C4 Camouflage | You are invisible while holding the bomb | - | +| Careful Bullets | Select a player who takes damage for every missed shot | - | +| Catapult | You have a random chance to launch an enemy upwards | (20 - 40)% | +| Chicken | You get a chicken model + 10% faster movement - 50 HP | - | +| Chillout | Planting the bomb takes significantly longer | - | +| Cutter | Instant kill with a knife | - | +| Cypher | Click [css_useSkill] to create/switch to a camera | 30 s | +| Darkness | Applies a darkness effect to a chosen enemy | - | +| Deactivator | Choose a player whose skill you want to disable | - | +| Deaf | Choose a player to mute all sounds for | - | +| Death Bomb | You explode upon death, killing nearby players | - | +| Disarmament | You have a random chance to make an enemy drop their weapon on hit | (20 - 35)% | +| Rangefinder | You can see the distance to the nearest enemy | - | +| Dash | Perform a second jump to dash | - | +| Dracula | Hitting an enemy restores health equal to a percentage of the damage dealt | - | +| Duplicator | Choose a player to copy their skill | - | +| Dwarf | Random character size at the start of the round | (60 - 95)% | +| Enemy Spawn | Click [css_useSkill] to teleport to the enemy spawn | 15 s | +| Explosive Shot | Random chance to fire an explosive bullet while shooting | (15 - 30)% | +| Falcon Eye | Click [css_useSkill] to activate a bird's-eye view camera| - | +| Fastreload | Click [css_useSkill] to reload the weapon you are currently holding | - | +| Flash | Random player speed at the beginning of the round | (1.2 - 3.0)x | +| Fortnite | Click [css_useSkill] to create a destructible barricade | 2 s | +| Fragile Bomb | Shooting the bomb damages it | - | +| Friendly Fire | Shooting teammates heals them | - | +| Freezing Decoy | Your decoy freezes all nearby players | - | +| Gambler | Select a skill from the list provided | - | +| Ghost | You are completely invisible | - | +| Glaz | You can see through smoke grenades | - | +| Glitch | Disables the radar for a chosen enemy | - | +| Glue | Your grenades stick to walls | - | +| God Mode | Click [css_useSkill] to become immortal for a short time | 30 s | +| Grenadier | You have infinite hegranade | - | +| Healing Smoke | Your smoke grenades heal | - | +| Hermit | Killing restores ammo and a portion of health | - | +| Holy Hand Grenade | Your HE grenades deal double damage and have double range| - | +| Homing Grenades | Your grenades (except smokes) are attracted to enemies | - | +| Hot Bomb | As long as you are alive, the bomb deals damage to its carrier | - | +| Hologram | Click [css_useSkill] to control your hologram for a few seconds | 30 s | +| Illiterate | As long as you are alive, your enemies cannot read | - | +| Illusionist | Click [css_useSkill] to deploy a replica that walks straight ahead | 30 s | +| Impostor | You start the round with an enemy player model | - | +| Infinite Ammo | You receive infinite ammo for all your weapons | - | +| Tracker | Choose a player who will leave a trail behind them | - | +| Jammer | Choose a player to disable their crosshair | - | +| Jester | In jester mode, you cannot get or take any damage. This mode changes every few seconds | (10 - 25) s | +| Legless | Choose a player who cannot jump | - | +| Jumping Jack | Jumping restores health | - | +| Killer Flash | Anyone fully blinded by your flashbang dies (including you) | - | +| Life Swap | Choose a player to swap health with | - | +| Long Knife | A primary knife attack deals damage regardless of distance | - | +| Long Zeus | Zeus deals damage regardless of distance | - | +| Magnetic Decoy | Your decoy attracts nearby players towards itself | - | +| Magneto | All enemy grenades are repelled away from you | - | +| Magnifier | Forces the enemy's screen to zoom in, reducing their field of view | - | +| Medic | Click [css_useSkill] to use a healing charge that restores 50 health | 1 s | +| Bomb Miner | Your HE grenade only explode when there is an enemy nearby | - | +| Taxman | Choose a player to swap money with | - | +| Ninja | Standing still increases your invisibility by 33%, crouching by 33%, and holding a knife by 33% | - | +| No-Nades | Grenades deal no damage to you | - | +| Focus | No recoil while shooting | - | +| NoClip | Click [css_useSkill] to enable noclip for a short time | 30 s | +| One-Shot | Hitting an enemy instantly kills them | - | +| Head Only | You only take damage to the head | - | +| Pawel Jumper | You get an extra jump | - | +| Phoenix | You have a random chance to respawn after death | (20 - 40)% | +| Psychic Defusing | When you are near the bomb, you start defusing it | 10 s | +| Pilot | Fly for a limited time. Hold [USE - E] to fly | - | +| Free Planter | You can plant the bomb anywhere, with a detonation time of 60 seconds | - | +| Poison | Choose a player who will take damage every few seconds | - | +| No Rifles | Choose a player who cannot use rifles | - | +| Prosthesis | Arms and legs are bulletproof | - | +| Pusher | You have a random chance to push an enemy back when hitting them | 100% | +| Pyro | Molotov restores health | - | +| Rapid Fire | All bullets are fired very quickly | - | +| Radar Hack | Enemies are visible on the radar | - | +| Rambo | You receive a random amount of health at the start of the round | +(50 - 501) HP | +| Random Weapon | Click [css_useSkill] to receive a random weapon | 15 s | +| Re-Zombie | After death, you respawn as a zombie with increased health and no weapons | - | +| Reactive Armor | Armor absorbs the first damage taken | 15 s | +| Regeneration | You restore health every few seconds | - | +| Replicator | Click [css_useSkill] to create a replica that deals damage on hit | 15 s | +| Retreat | Click [css_useSkill] to return to spawn | 15 s | +| Return to Sender | The first hit on an enemy sends them back to their spawn | - | +| Rich Boy | You receive a random amount of money at the start of the round | (5000 - 15000)$ | +| Robin Hood | Dealing damage to an enemy steals their money | - | +| Rubber Bullets | Your bullets significantly slow down players | - | +| Sapper | You can plant and defuse bombs faster | - | +| Second Chance | After death, you respawn with the same amount of health | - | +| Shade | You teleport behind the back of a hit enemy | - | +| Short Fuse | The bomb explodes much faster | - | +| Silent | Your footsteps and jumps are silent to other players | - | +| Smoker | Your smoke grenades never run out | - | +| Sniper Elite | Click [css_useSkill] to swap your current weapon for an AWP | 0 s | +| Soldier | You have a random damage multiplier | (1.15 - 1.35)x | +| Soundmaker | Click [css_useSkill] to trigger a sound for every enemy | 5 s | +| Spectator | Click [css_useSkill] to spectate a random enemy | 0 s | +| Position Swap | Click [css_useSkill] to swap places with a random enemy | 30 s | +| Teleporter | You swap places with the hit enemy | - | +| Thief | You can steal a skill from a chosen player | - | +| Third Eye | Click [css_useSkill] to activate third-person view | 0 s | +| Thorns | Your opponent will receive a portion of the damage that they inflicted on you | - | +| Throwing Knife | Click [css_useSkill] to throw a knife. But watch out for others | - | +| Toxic Smoke | Your smoke grenades deal damage | - | +| Wallhack | You can see enemies through walls | - | +| Watchmaker | Every grenade throw alters the round time | - | +| Weapon Swap | Click [css_useSkill] to swap weapons with a random enemy | 30 s | +| Weightlessness | Your grenades are not affected by gravity and fly faster | - | +| Wild Throws | Choose a player who will have trouble throwing grenades | - | +| Zeus | Zeus x27 instantly recharges | - | + +
+ +## 💻 Installation +1. install / buy a **CS2 server**. + - Good tutorial on how to create your own CS2 server [[Video]](https://www.youtube.com/watch?v=1ZrEn0CiMi4&ab_channel=TroubleChute), [[Website]](https://hub.tcno.co/games/cs2/dedicated_server/). +2. Install **Metamod**. + - Download [Metamod:Source 2.x](https://www.sourcemm.net/downloads.php/?branch=master) + - Extract it to the `C2Server/game/csgo/` folder. + - Edit the `gameinfo.gi` file by adding a new line + ```json + Game_LowViolence csgo_lv // Perfect World content override + Game csgo/addons/metamod // <-- Line to add + + Game csgo + ``` +3. Install **CounterStrikeSharp**. + - Download [CounterStrikeSharp-With-Runtime](https://github.com/roflmuffin/CounterStrikeSharp/releases). + - Extract it to the `C2Server/game/csgo/` folder. +4. Install **Ray-Trace** + - Download [RayTrace-CSS-API](https://github.com/FUNPLAY-pro-CS2/Ray-Trace/releases) + - Extract folder `conterstrikesharp` to the `CS2Server/game/csgo/addons/` folder. + - Download [RayTrace-MM](https://github.com/FUNPLAY-pro-CS2/Ray-Trace/releases) + - Extract it to the `CS2Server/game/csgo/addons/` folder. +5. Install **jRandomSkills** + - Download [jRandomSkills](https://github.com/Juzlus/jRandomSkills/releases) + +## Server Commands +> [!TIP] +> **Bind to use skills:** `bind x css_useSkill` + +
+The table below lists all available commands in the game, along with their descriptions. + +| Command | Example | Description | Permissions | +| - | - | - | - | +| `!setskill ` | `!setskill Juzlus Aimbot` | Giving skill to a player | `@jRandomSkills/admin` | +| `!lang ` | `!lang en` | Change the language | - | +| `!skills` | `!skills` | List of skills | - | +| `!map ` | `!map de_nuke` | Change map | `@jRandomSkills/admin` | +| `!map ` | `!map 3332005394` | Change map from workshop | `@jRandomSkills/admin` | +| `!start` | `!start` | Start game with conditions: `mp_forcecamera 0, mp_freezetime 15, mp_overtime_enable 1, sv_cheats 0` | `@jRandomSkills/admin` | +| `!start sv` | `!start sv` | Start the game with conditions: `mp_forcecamera 0, mp_freezetime 0, mp_overtime_enable 1, sv_cheats 1` | `@jRandomSkills/admin` | +| `!console ` | `!console sv_cheats 1` | Run a command on the server | `@jRandomSkills/owner` | +| `!swap` | `!swap` | Switch sides | `@jRandomSkills/admin` | +| `!shuffle` | `!shuffle` | Randomly assign players to teams | `@jRandomSkills/admin` | +| `!pause` | `!pause` | Pause the game | `@jRandomSkills/admin` | +| `!heal` | `!heal` | Restore 100 health points | `@jRandomSkills/admin` | +| `!hud` | `!hud` | Enable/Disable hud | - | +| `!setscore ` | `!setscore 10 7` | Set the game score | `@jRandomSkills/owner` | +| `!setstaticskill ` | `!setstaticskill Juzlus Aimbot` | Giving a player a permanent skill | `@jRandomSkills/admin` | +| `!setstaticskill None` | `!setstaticskill Juzlus None` | Back to normal | `@jRandomSkills/admin` | +| `!botplace [slot] [godmode]` | `!botplace 2 1` | Teleport a bot to your location | `@jRandomSkills/admin` | +| `!next_skill [idx]` | `!next_skill Juzlus` | Switch skill for a player (next, previous -1, or specific idx) | `@jRandomSkills/admin` | +| `!plantedbomb [time]` | `!plantedbomb 35` | Spawn a planted C4 bomb at your position with custom or default (40s) detonation time | `@jRandomSkills/admin` | +| `!sethealth ` | `!sethealth 150` | Set a specific health amount for yourself | `@jRandomSkills/admin` | +| `!reload` | `!reload` | Reload translations | - | + +_Most commands require permissions, which must be set in the file: `game/csgo/addons/counterstrikesharp/configs/admins.json`_ +
+ +## 🔑 Permissions +To grant administrative permissions in CounterStrikeSharp: +1. In the **`game/csgo/addons/counterstrikesharp/configs/`** folder, create a file named **`admins.json`**. +2. Add the following content to it: + ```json + { + "Juzlus": { + "identity": "STEAM_0:0:94913632", + "flags": ["@jRandomSkills/admin", "@jRandomSkills/owner"] + } + } + ``` + You can find your `steamID` using the [steamidfinder](www.steamidfinder.com) website. +3. Save the file and restart the server to apply the changes. + +## ⚙️ Configuration +All skills can be customized in the **`config.cfg`** / **`skillsInfo.json`** file located in the **`game/csgo/addons/counterstrikesharp/plugins/jRandomSkills/configs/`** folder. + +- ##### config.json +```json +{ + "Settings": { + "GameMode": 3, // Game mode: + // 0 - Random skills for each player (It can't be the same twice in a row) + // 1 - Same skills for the whole team + // 2 - Same skills for all players + // 3 - Random skills for each player (It can't be the same until the map changes) + // 4 - Random skills for each player (Full random) + // 5 - Debug: Skills are assigned in turn + "YourSkillChatInfo": true, // Show your skill in chat + "KillerSkillChatInfo": true, // Show killer's skill in chat + "TeamMateSkillChatInfo": true, // Show allies' skills in chat + "SummaryAfterTheRound": true, // Show summary of the last round + "EnableBotSkills": true, // Enable skills for bots + "EnableBotKickDebug": false, // Kick a random bot every 45s (for debug/testing) + "DebugMode": false, // Write activity to the ‘Debug’ folder + "AlternativeSkillButton": null, // Possible buttons: + // null, "Attack", "Jump", "Duck", "Forward", "Back", + // "Use", "Cancel", "Left", "Right", "Moveleft", + // "Moveright", "Attack2", "Run", "Reload", "Alt1", + // "Alt2", "Speed", "Walk", "Zoom", "Weapon1", + // "Weapon2", "Bullrush", "Grenade1", "Grenade2", + // "Attack3", "Scoreboard", "Inspect" + "SkillTimeBeforeStart": 7.0, // How many seconds before freeze time ends should skills + // drawing be completed? (freezetime - SkillTimeBeforeStart) + "SkillHudDuration": -1.0, // How long should the HUD be visible for? + "SkillDescriptionDuration": 7.0, // How long should the skill description be visible for? + "DisplayAlwaysDescription":false,// Always display skill description (SkillDescriptionDuration = 9999) + "DisableSpectateHUD": false, // Disable HTML HUD when spectating + "EnableFlashingHtmlHudFix": false,// Enable FlashingHtmlHudFix + "TraceRayBeam": false, // Enable trail visibility for 'Long Knife', 'Long Zeus' + "DisableHUDOnDeathPermission": "@jRandomSkills/death", // Disable the HUD after death for players with this permission + "DisableSkillsOnRoundEnd": false,// Disable all skills at the end of the round (when the summary is visible) + + "LanguageSystem": { + "DefaultLangCode": "en", // Default language: en, pl, fr, pt-br, zh + "DisableGeoLite": false, // Disable player language search by geolocation GeoLite2 (MaxMind) + "LanguageInfos": [...] // Setting to change ISO languages to translations + }, + + "HtmlHudCustomisation": { // Settings for changing colours and font sizes + ... // xxxl: 64px, xxl: 40px, xl: 32px + } // l: 24px, ml: 20px, m: 18px + ... // sm: 16px, s: 12px, xs: 8px + }, +``` + +- ##### skillsInfo.json +```json +[ + { + "NeedsTeammates": false, // Requires other players on the team + "DisableOnFreezeTime": false, // Disable the skill during freeze time + "OnlyTeam": 0, // Skill availability: + // 0 - Everyone + // 2 - Terrorist + // 3 - CounterTerrorist + "Color": "#ff0000", // Skill color + "Active": true, // Enabled on startup + "Name": "Aimbot", // Skill name + "RequiredPermission": "", // Required permission + "MaxPerServer": -1, // Maximum number of players allowed to have + // this skill on the server (-1 for unlimited) + "Rarity": "Common" // Rarity tier of the skill: + // Common (70x), Uncommon (14x), + // Rare (10x), Epic (5x), Legendary (1x) + }, + ... +] +``` + +- ##### playersLanguage.json +```json +{ + "76561198150092992": "en", // "SteamID": "name of the translation file" + ... +} +``` + +## 🔗 Credits +This plugin uses content from the following projects: +- [dRandomSkills](https://github.com/jakubbartosik/dRandomSkills) by [Jakub Bartosik (D3X)](https://github.com/jakubbartosik) - Random skills system +- [CS2TraceRay](https://github.com/schwarper/CS2TraceRay) by [schwarper](https://github.com/schwarper) - Old Trace Ray system +- [Ray-Trace](https://github.com/FUNPLAY-pro-CS2/Ray-Trace) by [SlynxCZ](https://github.com/SlynxCZ) - New Trace Ray system +- [CS2FlashingHtmlHudFix](https://github.com/girlglock/CS2FlashingHtmlHudFix) by [girlglock](https://github.com/girlglock) - A fix for window flickering +- [ChaseMod](https://github.com/ipsvn/ChaseMod/blob/master/Utils/Memory/CCSMatch.cs) by [ipsvn](https://github.com/ipsvn) - Round score management +- [WASDMenuAPI](https://github.com/Interesting-exe/WASDMenuAPI) by [Interesting-exe](https://github.com/Interesting-exe) - API to easily create WASD menus +- [GeoLocationLanguageManagerPlugin](https://github.com/aprox2/GeoLocationLanguageManagerPlugin) by [aprox2](https://github.com/aprox2) - Geolocation language manager +- [GeoLite2](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data) by [MaxMind](https://www.maxmind.com/) - Geolocation data +- [CServerSideClient](https://discord.com/channels/1160907911501991946/1508172390863994910/1508180670659166348) by [SLAYER](https://github.com/zakriamansoor47) + +## ❤️ Special thanks +[CONTRIBUTORS] +ㅤ +[THANKS] + +## 📋 Changelog + +
+v1.2.2.b2 + +- #### General: + - ###### Updated CSS dependency to version 1.0.369. + - ###### Upgraded the project from .NET 8.0 to .NET 10.0. + - ###### Updated Turkish language translation by [@ByDexterTR](https://github.com/ByDexterTR)]. + - ###### Added Russian language translation by [@213sdfsdgf](https://github.com/213sdfsdgf)]. + - ###### Fixed an issue with incorrect display of Arabic nicknames. + - ###### Used ForceFullUpdate to resolve the "FATAL ERROR: CopyExistingEntity" crash. + - ###### Disabled stale HandleCommandDrop hook to avoid crashes when a player joins a team (thanks to [@vladimir214sd](https://github.com/vladimir214sd)). + - ###### Added new signatures to gamedata. + - ###### Added the ability to configure the number of grenades for every skill that uses grenades as part of its ability (e.g., Miner, AntyFlash, MagneticDecoy, etc.). + +- #### Skill improvements: + - ###### Re-Zombie: + - ###### Fixed weapon switching issues when a player is holding a Zeus and a knife. + - ###### Weapons are now removed for bots in zombie mode. + - ###### Fixed an issue where players would occasionally fail to respawn if they took too much damage too quickly. + - ###### Ghost: + - ###### Blocked the ability to use the Zeus. + - ###### Blocked the ability to use the SG556 (`weapon_sg556`). + - ###### Thorns: + - ###### Added a configurable maximum health limit (37 HP) for the damage that can be reflected. + - ###### Second Life: + - ###### Fixed an issue where players would occasionally fail to respawn if they took too much damage too quickly. + - ###### Phoenix: + - ###### Fixed an issue where players would occasionally fail to respawn if they took too much damage too quickly. + - ###### Chicken: + - ###### Blocked the ability to use the SG556 (`weapon_sg556`). + - ###### Wallhack: + - ###### Fixed a bug that caused temporary enemy highlighting right after death. + - ###### Cypher: + - ###### Added camera position persistence. + - ###### God Mode: + - ###### Fixed an issue with permanent immortality triggering after reaching exactly 0 HP. + - ###### Weapons Swap: + - ###### The ammo count is now also transferred when weapons are swapped. + - ###### Muhammed: + - ###### Renamed the skill to "DeathBomb". + - ###### Spectator: + - ###### Fixed a bug where a player with the Chicken skill would still display as a ragdoll after death when spectated. + - ###### Friendly Fire: + - ###### The skill now works even when the server's mp_friendlyfire setting is set to 0. + - ###### Baseball: + - ###### Disabled teammate killing. + +
+ +
+v1.2.2.b1 + +- #### General: + - ###### Updated project dependencies. + - ###### Implemented `EntityManager` for automated entity cleanup and memory management. + - ###### Added configuration to enable or disable skills for bots. + - ###### Stability and performance improvements. + +- #### Skill improvements: + - ###### Invisibility-based skills: Now visible to teammates and spectators. + - ###### Fortnite: + - ###### Fixed an issue with indestructible barricades after player death. + - ###### Wallhack: + - ###### Improved detection logic for invisible players. + - ###### Soundmaker / Jackal / Spectator: + - ###### Updated to correctly work with invisible players. + - ###### And more... + +
+ +
+v1.2.1.b9 + +- #### General: + - ###### Added Crash Handler to improve server stability (Thanks to cj for help). + - ###### Added Skill Rarity (added rarity levels to skills). + - ###### Added 'MaxPerServer' limit (limits how many people can use the same skill). + - ###### Replaced model "ghost_speaker.vmd" with "spray_plane.vmdl". + +- #### Skill improvements: + - ###### Focus: + - ###### Fixed and improved recoil control. + - ###### ReZombie / Phoenix: + - ###### Blocked respawn exploit when changing teams. + +
+ +
+v1.2.1.b8 + +- #### General: + - ###### Replaced [CS2TraceRay](https://github.com/schwarper/CS2TraceRay) with [RayTraceApi](https://github.com/FUNPLAY-pro-CS2/Ray-Trace). + - ###### Updated CounterStrikeSharp to the latest version. + - ###### New command for skill testing: `css_next_skill <(null)/index>`. + - ###### Updated gamedata signatures. + - ###### Replaced CS2TraceRay with `RayTraceApi`. + - ###### Replaced direct object references with entity indices to improve memory safety. + - ###### Fixed agent model paths. + - ###### Skills are now automatically disabled when a player leaves the server. + - ###### Added null-pointer checks for improved stability. + +- #### Skill improvements: + - ###### AimLock: + - ###### Aiming at the opponent's head has been improved. + - ###### Anomaly / Behind / Cypher / Push / SwapPosition / Teleporter: + - ###### Improved camera positioning during teleportation. + - ###### CarefulBullets / ExplosiveShot / FragileBomb: + - ###### Redesigned logic due to changes in the `OnTakeDamage` event. + - ###### FriendlyFire: + - ###### Fixed skill functionality when friendly fire is disabled on the server (Casual mode). + - ###### Hologram: + - ###### Blocked weapon dropping and picking up while in hologram form. + - ###### Illiterate: + - ###### Fixed a bug with correct text display. + - ###### Tracker: + - ###### Fixed issues related to timers. + - ###### Ninja: + - ###### Fixed a bug where the initial invisibility state never update. + - ###### NoRecoil / QuickShot: + - ###### Updated to match the new `AimPunchServices` structure. + - ###### Noclip / Shade / Iana: + - ###### Migrated to `TraceHullShape` for more accurate collision detection. + - ###### ReZombie: + - ###### Disabled weapon usage in zombie mode and increased HP to 500. + +- #### Known Issues: + - ###### LongKnife: + - ###### Right-click detection is currently broken on Linux (despite valid signatures). + - ###### Illusionist: + - ###### T-Pose bug: After adding animgraph_2, the character models don't have any animations built in. So, for now, there isn't really any way to do this without adding your own from the Workshop. + +
+ +
+v1.2.1.b7 + +- #### General: + - ###### Bumped module version to **1.2.1.b7**. + - ###### Implemented **HTMLEncoder** for improved message security and protection. + - ###### Updated `SkillAction` to return the invoked method result (`object?`) or `null` if not found. + - ###### Reworked player event dispatching to call `SkillAction` **once per distinct active skill**, reducing redundant invocations. + - ###### Switched timing logic to use `Server.CurrentTime` instead of `EngineTime`. + - ###### Added startup console information and an automated **version check** on plugin load. + - ###### Implemented **automatic copying** of gamedata, DLLs, and language files during the build process (by @vinicius-trev). + - ###### Updated core dependencies: `CounterStrikeSharp.API` to **1.0.364** and `MaxMind.Db` to **5.0.0** (by @vinicius-trev). + - ###### Added **geolocation support** for Turkey (`tr`) and Czechia (`cz`). + - ###### Added **Turkish (`tr`)** language support (by @brkvlr) and improved **Portuguese-Brazil (`pt-br`)** translations (by @vinicius-trev). + - ###### If a translation is missing, the system now **falls back to English text** instead of displaying the raw translation key. + - ###### **SkillUtils:** Fixed spawn point selection bugs, memory referencing issues, and added `maxHealth` parameter support for `AddHealth`. + - ###### Fixed an issue where the **E key** (interact/defuse) was interrupted by skill usage; players can now defuse and interact with objects without interference. + - ###### Vote system timer now correctly resets after each vote. + +- #### Skill improvements: + - ##### Pilot (Rework): + - ###### Completely rewritten jump and fuel logic. Flight now requires a **double-click** of the jump key to activate. + - ##### Jester (Rework): + - ###### Refactored to a **per-player system** with improved timer stability. The Jester timer now **resets** when the player attempts to plant or defuse the bomb. + - ##### Noclip (Rework): + - ###### Total rework of the movement logic; improved collision detection to **prevent getting stuck** in objects and ensured smoother flight. + - ##### Ghost / C4 Camouflage / Ninja: + - ###### **Observers can now see invisible players.** + - ###### Improved bomb hiding function and fixed console spam issues. + - ##### Retreat / Enemy Spawn: + - ###### Fixed an error with incorrect spawn point interpretation. + - ##### Teleporter: + - ###### The mechanic has been changed to a **percentage chance** of swapping places with an enemy, rather than a guaranteed 100%. + - ##### Gambler: + - ###### Fixed a bug that allowed the skill to be refreshed without having the required money. + - ##### Shade: + - ###### Fixed issues related to teleportation logic. + - ##### Muhammed: + - ###### Blocked skill usage during team switching to prevent exploits. + - ##### Baseball: + - ###### Decoy grenades now have the same collision as players (**PlayerClip**). + - ##### Sniper Elite: + - ###### Major refactoring and **fix for server crashes** related to weapon swapping. + - ##### Replicator: + - ###### Added **crouching animations** for replicas to match player movement. + - ##### Blade Master / Cutter / Disarmament / Long Knife / Long Zeus / Killer Flash: + - ###### Improved handling for **Bayonet** weapon types. + - ###### Added **friendlyFire** configuration options for `LongKnife`, `LongZeus`, and `KillerFlash`. + - ##### Planter / Short Bomb / Chill Out: + - ###### Notifications now reach all valid players regardless of life status; added `BombAbortPlant` support. + - ##### Area Reaper: + - ###### Added a message while being on a disabled bombsite. + - ##### Wallhack: + - ###### Glow is now correctly disabled for dead players. + - ##### Sound Maker (Rework): + - ###### Reworked to automatically play a sound every 2 seconds (audible only for the player with skill). + +- #### New skills: + - ##### Aim Lock: + - ###### Lock your aim on the nearest enemy for a limited duration. + - ##### Homing Nades: + - ###### Your grenades (except smokes) are attracted to nearby enemies. + - ##### Magneto: + - ###### Pushes incoming enemy grenades away from the player. + - ##### Miner: + - ###### Deploys HE grenades that only detonate when an enemy is within range. + - ##### Illiterate: + - ###### While the user is alive, enemies are unable to read chat or HUD information. + - ##### Hot Bomb: + - ###### The C4 deals constant damage to the carrier as long as the skill owner is alive. + - ##### Illusionist: + - ###### Deploys a replica that walks straight ahead to distract enemies. + - ##### Magnetic Decoy: + - ###### Decoy grenades attract nearby players towards the center of the decoy. + - ##### Throwing Knife: + - ###### Adds the ability to throw a lethal knife at enemies. + - ##### Weightless: + - ###### Grenades fly faster and are no longer affected by gravity. + - ##### Wild Throw: + - ###### Causes a selected player to "forget their lineups," resulting in randomized grenade trajectories. + - ##### Smoker: + - ###### Your smoke grenades never run out. + +- #### New commands: + - ###### `css_bot_place ` - Teleports a bot to the player's position with optional godmode. + - ###### `!sethealth ` - Admin command for health management and testing. + - ###### `!plantedbomb ` - Command for testing bomb-related states and logic. +
+ +
+v1.2.0 + +- #### General: + - ###### Renamed the plugin from `!jRandomSkills` to `jRandomSkills`. + - ###### Fixed a typo in permissions from `@jRandmosSkills` to `@jRandomSkills`. + - ###### Disabled `DebugMode` by default in the config. (by: [@vinicius-trev](https://github.com/vinicius-trev)) + - ###### Updated GeoLite dependencies. (by: [@vinicius-trev](https://github.com/vinicius-trev)) + - ###### Improved `pt-br` language translations. (by: [@vinicius-trev](https://github.com/vinicius-trev)) + - ###### Added German language support. (by: [@Enrory](https://github.com/Enrory)) + - ###### Fixed language detection based on ISO codes. + - ###### Fixed incorrect references to language files. + +- #### Skill improvements: + - ##### Enemy Spawn: + - ###### Fixed an error with incorrect spawn point interpretation. + - ##### Cypher: + - ###### Improved camera positioning. + - ###### Restricted camera placement to walls only. + - ###### Key stability fixes. + - ##### Darkness / Hologram: + - ###### Added additional validation. + - ###### Fixed an issue with an infinite timer. + - ##### Jackal: + - ###### Minor optimization and fixed a bug where tracks were visible to everyone. + - ##### C4 Camouflage / Ghost / Ninja: + - ###### Improved bomb hiding function. + - ###### Fixed console spam issues. + - ##### AntyHead / BladeMaster / Jester / NoNades / OnlyHead / Posthesis / Pyro / Reactive Armor: + - ###### Fixed the health restoration function. + - ##### NoNades: + - ###### Added immunity to Decoy grenades. + - ##### RichBoy: + - ###### Fixed a bug where all money was removed after a round. + - ###### Money is deducted based on spending, where the final amount cannot be less than $3,000. + - ##### Dash: + - ###### Added `anyDirection` options to the configuration, which define whether a dash can be performed in any direction or only forwards. + - ##### BunnyHop / Dash / Pawel Jumper: + - ###### Improved jump logic. + - ###### Skills can now be triggered using the mouse scroll wheel. + - ##### Jumping Jack / Legless: + - ###### The ConVar `sv_legacy_jump` has been set to `1` to enable jump detection. + - ##### Long Zeus / Long Knife: + - ###### Shots are now calculated based on hitboxes instead of collisions. + - ###### Fixed RayTrace functionality. + - ##### Shade: + - ###### Fixed RayTrace functionality. + - ##### Planter / Short Bomb: + - ###### Added a notification message when the bomb is planted. + - ##### Sniper Elite: + - ###### General refactoring. + - ###### Fixed an issue where weapons were not swapped correctly. + - ###### Fixed a weapon duplication bug. + - ##### Toxic Smoke: + - ###### Skill is now enabled only for Linux systems. + - ##### Watchmaker: + - ###### Removed the round timer from the center HUD. + - ###### Round timer now updates for everyone after throwing utilities. + +- #### New skills: + - ##### Careful Bullets: + - ###### Select a player who loses HP for every missed shot at another player. +
+ +
+v1.1.9f + +- #### General: + - ###### Updated dependencies to the latest version (CSS v1.0.361). + - ###### Updated WSADMenu compatibility to the latest CSS version. + +- #### Skill improvements: + - ###### Earthquake: + - ###### Temporarily disabled. + + - ###### Cypher: + - ###### Temporarily disabled. + - ###### Improved camera positioning. + + - ###### Hologram: + - ###### Temporarily disabled. + - ###### Replica can now receive headshot damage. + + - ###### Toxic Smoke: + - ###### Changed distance calculation for triggers. +
+ +
+v1.1.9e + +- #### General: + - ###### Improved display of text frame / content. + - ###### Added customisation options for chat message appearance. +
+ +
+v1.1.9d + +- #### General: + - ###### Updated the appearance of chat messages. + +- #### Skill improvements: + - ###### C4Camouflage: + - ###### Ghost: + - ###### Ninja: + - ###### Now the entire model is hidden instead of just the weapon and setting the model's transparency. + + - ###### ReZombie: + - ###### Increased zombie health from 200 HP to 250 HP. + + - ###### Replicator: + - ###### ncreased damage dealt by replicas: Your team: 10 HP; Enemy team: 20 HP + - ###### Added the option to customize replica damage in `skillsInfo.json`. + + - ###### ToxicSmoke: + - ###### Skill temporarily disabled to test trigger logic. + + - ###### Watchmaker: + - ###### Reduced time change from 10 seconds to 7 seconds. + +- #### New skills: + - ###### Cypher: + - ###### Click [css_useSkill] to create/switch to a camera. + + - ###### Hologram: + - ###### Click [css_useSkill] to control your hologram for a few seconds (the hologram cannot shoot). +
+ +
+v1.1.9c + +- #### General: + - ###### Updated dependency to the latest version. + - ###### Added a new game mode, ‘FullRandom,’ which randomly assigns skills each round (skills may be repeated). + - ###### Added the `requiredPermission` option to every skill config, defining the permission required for a player to receive that skill. + +- #### Skill improvements: + - ###### Gambler: + - ###### Added text notification when the player has no money. + + - ###### Darkness: + - ###### Removed the old post-processing logic (did not work on every map). + - ###### Added UTIL_ScreenFade for a more reliable and consistent darkness effect. + + - ###### Distancer: + - ###### Limited the maximum display distance to 3000 units. + + - ###### Fortnite: + - ###### mproved the placement angle of barricades. + + - ###### Jackal: + - ###### Reworked the bean trail logic to a particle system for better performance. + + - ###### Poison: + - ###### Slightly increased the poison tick speed. + - ###### Added a minimum health threshold (30 HP) below which poison no longer works (configurable). + + - ###### Spectator: + - ###### Fixed an issue with the camera after death. +
+ +
+v1.1.9b + +- #### General: + - ###### Updated dependency to the latest version. + - ###### Fixed an issue with empty permissions for commands. + - ###### Added `SkillHudExpired` option to the config file that controls how long (in seconds) the central HUD is visible. + - ###### Added logic for trigger enter / exit handling. + - ###### Automatic case adjustment for the `AlternativeSkillButton` option in the config. + - ###### Fixed an issue with automatic language detection. + - ###### Attempt to fix model resizing issue. + +- #### Skill improvements: + - ###### Bankrupt: + - ###### Darkness: + - ###### Deactivator: + - ###### Deaf: + - ###### Glitch: + - ###### Jammer: + - ###### JumpBan: + - ###### LifeSwap: + - ###### Magnifier: + - ###### MoneySwap: + - ###### Poison: + - ###### PrimaryBan: + - ###### Thief: + - ###### Fixed message being shown in the other player's language. + + - ###### C4Camouflage: + - ###### Ghost: + - ###### Glaz: + - ###### Jackal: + - ###### Ninja: + - ###### Wallhack: + - ###### Possible fix for missing entity when showing the entity again. + + - ###### AreaReaper: + - ###### Fixed incorrect bomb placement order. + + - ###### Gambler: + - ###### Fixed issue where players could reroll their skill even without money. + + - ###### SoundMaker: + - ###### Added separate sounds for both teams (configurable). + + - ###### ToxicSmoke: + - ###### Updated logic to use triggers (offset not found for Windows system). + + - ###### Watchmaker: + - ###### Added a sound when the time updates (configurable). +
+ +
+v1.1.9a + +- #### General: + - ###### Update the dependency to the latest version. + - ###### Signature update (jRandomSkills.gamedata.json). + - ###### FlashingHtmlHudFix is disabled during warm-up. + - ###### Fixed incorrect debug text display when using the command. + - ###### Improved the functionality of the !map command. + - ###### Added the `YourSkillChatInfo` option to the configuration to disable the description of your skill in chat. + - ###### Disabling player skill when changing maps. +- #### Skill improvements: + - ##### Third Eye: + - ###### Model added to camera. + - ##### Spectator: + - ###### Model added to camera. + - ##### Falcon Eye: + - ###### Model added to camera. + - ##### Jackal: + - ###### Temporarily disabled for rewrite. +
+ +
+v1.1.8 + +- #### General: + - ###### Added `DisableHUDOnDeathPermission` options to the config, to disable the HUD after death for players with this specific permission. + - ###### Added `DisableSkillsOnRoundEnd` option to the config, to disable all skills at the end of the round (when the summary is visible). + - ###### The permission `@jRandomSkills/root` has been changed to `@jRandomSkills/owner` to prevent domain issues. + - ###### Added `!hud` command to toggle the HUD on/off (When the HUD is off, the WSAD Menu will not appear). + - ###### Disabling first skill if two skills are drawn during the first round. + - ###### The `!reload` command also refreshes the skill activity status. +- #### Skill improvements: + - ##### Replicator: + - ###### Fixed a bug causing server crashes after a bomb explosion. + - ###### Replica collisions are now more accurate. +
+ +
+v1.1.7 + +- #### General: + - ###### Update the dependency to the latest version. + - ###### Information about skills is available in `skillsInfo.json` instead of `config.json`. + - ###### Added the `jRandomSkills.gamedata.json` file. + - ###### Added the option to disable a specific power during freeze time (Disabled by default: Position Swap, Retreat, Replicator, Poison, Planter, Pilot, Noclip, Medic, God Mode, Fortnite, Enemy Spawn, Anomaly). + - ###### Added `LanguageSystem` options to the config for detailed language assignment management. + - ###### The `StartGameCommand` command now includes a changeable start parameter in config. + - ###### Added `DisplayAlwaysDescription` option to the config to show the description all the time. + - ###### Added `HtmlHudCustomisation` options to config for setting colours and font size. + - ###### Can be set to empty text: your_skill/drawing_skill/observer_skill/XXX_select_info. + - ###### Option to set the obtained value in the name/description of the skill (`{0}`). + - ###### Fixed skill cooldown time display (Rounding up). + - ###### The `!reload` command now refreshes all parameters from the all configs. + - ###### Most of the collection has been replaced with safe-threading to avoid server crashes (idea by: @ebat_kopat777). +- #### Skill improvements: + - ##### Long Knife: + - ###### A secondary knife attack also deals damage. + - ###### Fixed a mistake where the player's skill was shown as `None` after death. + - ##### Wallhack: + - ###### Glows are created just once, instead of being created again for each player. + - ###### Fixed a mistake where the player's skill was shown as `None` after death. + - ##### Jackal: + - ###### Fixed a mistake where the player's skill was shown as `None` after death. + - ##### Position Swap: + - ###### Added a configurable cooldown at the start of the round. + - ##### Spectator: + - ###### The method used to attach the camera has changed. + - ##### NoClip: + - ###### Return to the last place where you used skill if you fall below 3,000 units. + - ###### Added an option to disable the noclip when it is active. + - ##### Ninja: + - ###### Fixed an issue with weapons not being visible after death. + - ##### Muhammed: + - ###### The message at the explosion is configurable (in languages/). + - ###### Fixed a bug with the grenade not detonating. + - ##### Ghost: + - ###### Fixed an issue with weapons not being visible after death. + - ##### Explosive Shot: + - ###### Fixed a bug with the grenade not detonating. + - ##### Enemy Spawn: + - ###### Added a configurable cooldown at the start of the round. + - ##### Disarmament: + - ###### Back to dropping weapons instead of changing to slot3. + - ###### The chance of dropping weapons has been reduced: (20-50)% → (20-35)% + - ##### Chicken: + - ###### The method used to attach the chicken has changed. + - ###### Player with skill can see a model of your chicken. + - ###### Fixed hitboxes after returning to normal model. + - ###### Fixed a bug that added extra health after deactivating skill. + - ##### C4 Camouflage: + - ###### Fixed an issue with weapons not being visible after death. + - ##### Blade Master: + - ###### Movement speed with a knife has been reduced by 10% (configurable). + - ##### AntyFlash: + - ###### Added the option in config to change the flash duration of your flashes. + - ##### Jester: + - ###### Fixed an issue where you could take damage from other skills or bombs. + - ###### Fixed a bug where the player was always purple. + - ##### Shade: + - ###### Added an option to set the chance of teleportation after hitting an enemy in the config. + - ##### Impostor: + - ###### Setting the player model after deactivating the skill. + - ###### The default model for terrorists has been changed. +
+ +
+v1.1.6 + +- #### General: + - ###### Added French language (by [@felyjyn](https://github.com/felyjyn)). +- #### Skill improvements: + - ##### Dash: + - ###### Added the ability to dash in any direction. +
+ +
+v1.1.5 + +- #### General: + - ###### Update the dependency to the latest version. + - ###### Added language recognition based on geolocation (MaxMind GeoLite2). + - ###### Each player can choose a different language. + - ###### Directory names have been changed. + - ###### Automatic config refresh has been removed. + - ###### Added the `FlashingHtmlHudFix` option to the config. + - ###### Added the `CS2TraceRayDebug` option to the config, showing the "bullet" path for the LongKnife and LongZeus skills. + - ###### Added the `DisableSpectateHUD` option to the config, allowing the HTML HUD to be disabled for spectators. + - ###### The name of the project has been changed from `jRandomSkills` to `!jRandomSkills` to allow other plugins to load into memory later. + - ###### Added the command `!lang en` to change the language + - ###### Added the `!reload` command to reload translations. + - ###### Restrictions on welcome messages removed. +- #### Skill improvements: + - ##### Weapon Swap: + - ###### Fixed a bug with bomb duplication on the HUD. + - ##### Thief: + - ###### The ability to steal skill that is unavailable to your team has been blocked. + - ###### The HTML Menu is disabled when no players are found. + - ##### Sniper Elite: + - ###### Fixed all bugs and enabled the skill. + - ##### Second Chance: + - ###### Return to original health when skill are deactivated. + - ##### Planter: + - ###### Planting a bomb during freezing has been blocked. + - ##### Jackal: + - ###### Added 'null' check. + - ##### Astronaut: + - ###### Fixed gravity scale not showing on HTML. + - ##### Duplicator: + - ###### The HTML Menu is disabled when no players are found. + - ##### Deactivator: + - ###### The HTML Menu is disabled when no players are found. +- #### New skills: + - ##### Grenadier: + - ###### You have infinite hegranade. + - ##### Dash: + - ###### Perform a second jump to dash. +
+ +
+v1.1.4 + +- #### General: + - ###### The `SkillTimeBeforeStart` option has been added to the config file, which specifies how many seconds before the end of freeze time the skills drawing should stop. + - ###### The `SkillDescriptionDuration` option has been added to the config file, which specifies how many seconds the skill description HTML message should be visible. + - ###### Skills are no longer disabled at the end of the round. + - ###### The logic for granting skills has been changed. + - ###### Nicknames that are too long are shortened when spectating players. + - ###### The player selection has been changed via the Chat Menu to the WSAD Menu. + - ###### Skill descriptions added at the start of the round using PrintToCenterHtml. + - ###### Skill descriptions with player selection have been shortened. + - ###### Fixed a problem where the css_setskill and css_setstaticskill commands could not be executed from the server. + - ###### The parameters of the `!start` command have been changed. +- #### Skill improvements: + - ##### Legless: + - ###### Legless's skill completely disables Bunny's skill. + - ##### Rich Boy: + - ###### The cap has been set at $16,000. + - ##### Pilot: + - ###### The jetpack has been redesigned. + - ###### The amount of fuel has been increased. + - ###### From now on, the amount of fuel is always visible. + - ###### It is no longer possible to use a jetpack while defusing a bomb. + - ##### Explosive Shot: + - ###### The damage and range of attack have increased a little. + - ##### Flash: + - ###### Fixed a bug causing players to be launched upwards on stairs/ramps. + - ##### Magnifier: + - ###### Unnecessary Server.PrintToChatAll have been removed. + - ##### Weapon Swap: + - ###### Fixed a bug with the option to change weapons with a dead player. + - ##### Dwarf: + - ###### Fixed a bug with unchanged hitboxes. + - ##### Chicken: + - ###### Fixed a bug with unchanged hitboxes. +- #### New skills: + - ##### Jester: + - ###### In jester mode, you cannot get or take any damage. This mode changes every few seconds. + - ##### Gambler: + - ###### Select a skill from the list provided. + - ##### Bankrupt: + - ###### Choose the player who will lose all their money. +
+ +
+v1.1.3 + +- #### General: + - ###### Added `AlternativeSkillButton` options to the config file so that the player button can be used to activate skills. + - ###### Spectators are no longer selected when choosing a specific player when using a skill. +- #### Skill improvements: + - ##### Jackal: + - ###### Now, all opponents are leaving a trail, not just the selected ones. + - ##### Darkness: + - ###### All postprocessing volumes are replaced instead of just the first one. +
+ +
+v1.1.2 + +- #### General: + - ###### Skills disabled during warm-up. + - ###### Added general validation for undefined values. + - ###### Added command usage and map changes to debug log. + - ###### The `!setstaticskill` command has been added, which permanently assigns a specific skill to a player. + - ###### Commands can have custom permissions set in the config file. + - ###### New game mode: Skills can't be repeated until the map changes (Set as default). + - ###### Added a voting system for commands such as: `!start`, `!map`, `!swap`, `!shuffle`, `!pause`, `!setscore` (configurable) + - ###### Added the ability to search for players by steamID for the !setskill command. +- #### Skill improvements: + - ##### Pawel Jumper: + - ###### Gives a random number of extra jumps instead of just one. + - ###### Added to config: minimum and maximum number of extra jumps. + - ##### Chicken: + - ###### The chicken is invisible to the player with skill. + - ##### Fortnite: + - ###### The barricade now has 115 HP instead of disappearing after one shot. + - ###### Added to config: hp barricade and barricade model. + - ##### Glaz: + - ###### Players observing you also cannot see smoke grenades. + - ##### Wallhack: + - ###### Players observing you can also see through walls. + - ##### Rubber Bullets: + - ###### Fixed an error with adding an existing key. + - ##### Ninja: + - ###### Weapon transmit has been disabled, so charms and name tags are not visible. + - ##### Ghost: + - ###### Weapon transmit has been disabled, so charms and name tags are not visible. + - ##### C4 Camouflage: + - ###### Weapon transmit has been disabled, so charms and name tags are not visible. +- #### New skills: + - ##### Magnifier: + - ###### Forces the enemy's screen to zoom in, reducing their field of view. + - ##### Thorns: + - ###### Your opponent will receive a portion of the damage that they inflicted on you. + +
+ +
+v1.1.1 + + - #### General: + - ###### Added validation for undefined values for the skills: Silent and Flash. +
+ +
+v1.1.0 + +- #### General: + - ###### Added Brazilian Portuguese language (Grok AI). + - ###### Added Chinese language (Grok AI). + - ###### Added game modes. + - ###### Added configuration for each skill. + - ###### Added Debug Mode. + - ###### Added weapon receiving for skills associated with them (suggested by [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)). + - ###### Introduced general fixes and resolved bugs. +- #### New skills: + - ##### Anomaly: + - ###### You rewind a few seconds back in time. Cooldown: 15 s. + - ##### Zone Reaper: + - ###### You can choose a bomb site to deactivate. + - ##### Assassin: + - ###### You deal increased damage to enemies from behind. + - ##### Baseball Player: + - ###### Your decoy bounces off walls and instantly kills an enemy on impact. + - ##### Blademaster: + - ###### While holding a knife, you have a high chance to deflect a shot. + - ##### C4 Camouflage: + - ###### You are invisible while holding the bomb. + - ##### Chillout: + - ###### Planting the bomb takes significantly longer. + - ##### Cutter: + - ###### Instant kill with a knife. + - ##### Darkness: + - ###### Applies a darkness effect to a chosen enemy. + - ##### Deactivator: + - ###### Choose a player whose skill you want to disable. + - ##### Deaf: + - ###### Choose a player to mute all sounds for. + - ##### Rangefinder: + - ###### You can see the distance to the nearest enemy. + - ##### Duplicator: + - ###### Choose a player to copy their skill. + - ##### Explosive Shot: + - ###### Random chance to fire an explosive bullet while shooting. Chance: (15 - 30)%. + - ##### Falcon Eye: + - ###### Click [css_useSkill] to activate a bird's-eye view camera. + - ##### Fastreload: + - ###### Click [css_useSkill] to reload the weapon you are currently holding. + - ##### Fortnite: + - ###### Click [css_useSkill] to create a destructible barricade. Cooldown: 2 s. + - ##### Fragile Bomb: + - ###### Shooting the bomb damages it. + - ##### Friendly Fire: + - ###### Shooting teammates heals them. + - ##### Glaz: + - ###### You can see through smoke grenades. + - ##### Glitch (suggested by [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### Disables the radar for a chosen enemy. + - ##### Glue (suggested by [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### Your grenades stick to walls. + - ##### Healing Smoke: + - ###### Your smoke grenades heal. + - ##### Hermit (suggested by [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### Killing restores ammo and a portion of health. + - ##### Holy Hand Grenade: + - ###### Your HE grenades deal double damage and have double range. + - ##### Tracker: + - ###### Choose a player who will leave a trail behind them. + - ##### Jammer (suggested by [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### Choose a player to disable their crosshair. + - ##### Legless: + - ###### Choose a player who cannot jump. + - ##### Jumping Jack: + - ###### Jumping restores health. + - ##### Life Swap: + - ###### Choose a player to swap health with. + - ##### Long Knife: + - ###### A primary knife attack deals damage regardless of distance. + - ##### Long Zeus: + - ###### Zeus deals damage regardless of distance. + - ##### Taxman: + - ###### Choose a player to swap money with. + - ##### Ninja: + - ###### Standing still increases your invisibility by 33%, crouching by 33%, and holding a knife by 33%. + - ##### No-Nades: + - ###### Grenades deal no damage to you. + - ##### Focus (suggested by [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### No recoil while shooting. + - ##### NoClip: + - ###### Click [css_useSkill] to enable noclip for a short time. Cooldown: 30 s. + - ##### Head Only: + - ###### You only take damage to the head. + - ##### Poison: + - ###### Choose a player who will take damage every few seconds. + - ##### No Rifles: + - ###### Choose a player who cannot use rifles. + - ##### Prosthesis: + - ###### Arms and legs are bulletproof. + - ##### Psychic Defusing: + - ###### When you are near the bomb, you start defusing it. Cooldown: 10 s. + - ##### Pusher: + - ###### You have a random chance to push an enemy back when hitting them. Chance: 100%. + - ##### Pyro: + - ###### Molotov restores health. + - ##### Reactive Armor: + - ###### Armor absorbs the first damage taken. Cooldown: 15 s. + - ##### Regeneration: + - ###### You restore health every few seconds. + - ##### Replicator: + - ###### Click [css_useSkill] to create a replica that deals damage on hit. Cooldown: 15 s. + - ##### Return to Sender: + - ###### The first hit on an enemy sends them back to their spawn. + - ##### Re-Zombie: + - ###### After death, you respawn as a zombie with increased health and no weapons. + - ##### Robin Hood (suggested by [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### Dealing damage to an enemy steals their money. + - ##### Rubber Bullets (suggested by [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### Your bullets significantly slow down players. + - ##### Second Chance: + - ###### After death, you respawn with the same amount of health. + - ##### Short Fuse (suggested by [ToRRent1812](https://github.com/Juzlus/jRandomSkills/issues/1)): + - ###### The bomb explodes much faster. + - ##### Sniper Elite: + - ###### Click [css_useSkill] to swap your current weapon for an AWP. + - ##### Soundmaker: + - ###### Click [css_useSkill] to trigger a sound for every enemy. Cooldown: 5 s. + - ##### Spectator: + - ###### Click [css_useSkill] to spectate a random enemy. + - ##### Thief: + - ###### You can steal a skill from a chosen player. + - ##### Third Eye: + - ###### Click [css_useSkill] to activate third-person view. + - ##### Toxic Smoke: + - ###### Your smoke grenades deal damage. + - ##### Wallhack: + - ###### You can see enemies through walls. + - ##### Watchmaker: + - ###### Every grenade throw alters the round time. +- #### Skill improvements: + - ###### Improved skill descriptions. + - ###### Fixed all noticeable bugs. +
+ +
+v1.0.3 + +- #### General: + - ###### English language added. + - ###### Added welcome message. + - ###### Added summary of last round. + - ###### Added preview of spectated player's skills. + - ###### Blocked the possibility of having the same skill twice in a row. + - ###### Added simple configuration for each skill. + - ###### Reworked all skills so they can be manipulated at any time (Fixed setskill command) + - ###### Changed activation of skills to bind css_useSkill +- #### New skills: + - ##### Freezing Decoy + - ###### Your decoy freezes all nearby players. + - ##### Soldier: + - ###### You have a random damage multiplier (1.15 - 1.35)x. + - ##### Tank: + - ###### You have a random received damage multiplier (0.65 - 0.85)x. + - ##### Aimbot: + - ###### Each bullet you hit is counted as a head. + - ##### Retreat: + - ###### Return to spawn. Click [css_useSkill], cooldown 15s. + - ##### Enemy Respawn: + - ###### Teleport to enemy spawn. Click [css_useSkill], cooldown 15s. + - ##### Zeus: + - ###### Zeus x27 instant reload. + - ##### Radar Hack: + - ###### You see enemies on radar. + - ##### Quick-Shot: + - ###### No cooldown when shooting. + - ##### Planter: + - ###### You can plant a bomb anywhere, bomb detonation time is 60s. + - ##### Silent: + - ###### Your steps and jumps are unheard by OTHER players. + - ##### Deadly Flash: + - ###### Anyone completely blinded by your grenade dies (including you). + - ##### Time Slow: + - ###### Time slowdown for everyone for 6 seconds. Click [css_useSkill], cooldown 30s. + - ##### God Mode: + - ###### You are immortal for 2 seconds. Click [css_useSkill], cooldown 30s. + - ##### Random Weapon: + - ###### You are given a random weapon. Click [css_useSkill], cooldown 15s. + - ##### Weapon Swap: + - ###### You swap weapons with a random enemy. Click [css_useSkill], cooldown 30s. +- #### Skill improvements: + - ##### Sapper: + - ###### Fixed bug with instantly planting a bomb as anyone on the server had the skill ‘Sapper’. + - ##### Ghost: + - ###### Fixed being invisible after death. + - ###### Minor fixes for the rest of the powers. +
+ +
+v1.0.2 + +- #### New skills: + - ##### Dwarf: + - ###### Random character size range (60% - 95%). + - ##### Swapper: + - ###### Swap places with a random enemy when clicking the [css_useSkill] button. Cooldown is 30s. +- #### Skill improvements: + - ##### Anti-Flash: + - ###### Added: Your flash takes longer (7s). + - ##### Astronaut: + - ###### Changed: Gravity multiplier from (0.2 - 0.7) to (0.1 - 0.7). + - ###### Added: Player can now see their gravity multiplier in chat. + - ##### Dracula: + - ###### Changed: Dracula can now have excess health from now on. + - ##### Ghost: + - ###### Added: Blocking the use of weapons other than a knife. + - ###### Added: Any weapon picked up by a ghost becomes invisible. + - ##### Flash: + - ###### Fixed not getting speed. + - ###### Changed: Speed multiplier from (1.2 - 2.5) to (1.2 - 3.0). + - ###### Added: Player can now see their speed multiplier in chat. + - ##### Catapult: + - ###### Added: Random toss chances (20% - 40%). + - ###### Added: The player now sees their chances in chat. + - ##### Chicken: + - ###### Fixed not getting the chicken model. + - ###### Added: Blocking the use of weapons other than a knife or gun. + - ###### Added: Chicken can only have 50 hp. + - ##### Medic: + - ###### Fixed not getting first aid kits. + - ###### Changed: From now on everyone loses first aid kits at the end of the round. + - ##### Infinite Ammo: + - ###### Added: From now on, grenades are also infinite. + - ##### Enemy Rotation: + - ###### Added: Random chance of enemy rotation (20% - 40%). + - ###### Added: Player can now see their chances in chat. + - ##### Phoenix: + - ###### Fixed not being reborn after death. + - ###### Added: Random revival chances (20% - 40%). + - ###### Added: Player can now see their chances in chat. + - ##### Pilot: + - ###### Changed: The description of this skill has been improved. + - ##### Rambo: + - ###### Fixed not getting extra health. + - ##### Disarmament: + - ###### Added: Random chances to throw away enemy weapons after hit (20% - 40%). + - ###### Added: Player can now see their chances in chat. + - ###### Changed: Now only active enemy weapon is thrown (Knife throwing bug fixed). + - ##### Eliminator -> Sapper: + - ###### Changed: Renamed the power from ‘Eliminator’ to ‘Sapper’. + - ##### Teleporter: + - ###### Fixed a bug where only the player with the skill was being teleported. +
+ +## 💝 Donate + + + + + ⠀ + + + + + +## 📝 Contact + +If you have a question, please write to juzlus.biznes@gmail.com or [jRandomSkills Discord](https://discord.gg/9H8EZYBpPF). diff --git a/github/update_thanks.py b/github/update_thanks.py index dd23926..f54c2ba 100644 --- a/github/update_thanks.py +++ b/github/update_thanks.py @@ -1,57 +1,220 @@ -import requests import os +import hashlib +import requests +from dotenv import load_dotenv -# Konfiguracja -USER_IDS = ["284780352042434570"] -MARKER = "[THANKS]" +load_dotenv() -def get_html_for_user(user_id): +def _env_list(key): + value = os.getenv(key, "") + return [item.strip() for item in value.split(",") if item.strip()] + +REPOSITORY = "Juzlus/jRandomSkills" +DISCORD_USER_IDS = _env_list("DISCORD_USER_IDS") +EXTRA_USERS_GITHUB = _env_list("EXTRA_USERS_GITHUB") + +CONTRIBUTORS_URL = "https://github.com/Juzlus/jRandomSkills/graphs/contributors" +AVATARS_DIR = "./avatars" +AVATARS_RAW_URL = "https://raw.githubusercontent.com/Juzlus/jRandomSkills/main/.github/avatars" + +MARKER_GITHUB = "[CONTRIBUTORS]" +MARKER_DISCORD = "[THANKS]" + + +def build_table(cells, max_per_row=6): + rows = [] + for i in range(0, len(cells), max_per_row): + row_cells = "".join(cells[i:i + max_per_row]) + rows.append(f" {row_cells}") + return "\n" + "\n".join(rows) + "\n
" + + +def make_cell(avatar_url, name, profile_url=None): + if profile_url: + return ( + f'' + f'' + f'{name}' + f'
{name}' + f'
' + f'' + ) + return ( + f'' + f'{name}' + f'
{name}' + f'' + ) + + +def save_avatar(source_url, filename): + os.makedirs(AVATARS_DIR, exist_ok=True) + filepath = os.path.join(AVATARS_DIR, filename) + response = requests.get(source_url, timeout=10) + if response.status_code != 200: + print(f"Failed to download avatar: {source_url}") + return None + with open(filepath, "wb") as f: + f.write(response.content) + return f"{AVATARS_RAW_URL}/{filename}" + + +def fetch_github_user(login): + response = requests.get(f"https://api.github.com/users/{login}", timeout=10) + if response.status_code != 200: + print(f"GitHub API Error for user '{login}': Status {response.status_code}") + return None + return response.json() + + +def get_github_contributors(repo, extra_logins): try: - url = f"https://pfpfinder.com/api/discord/user/{user_id}" + url = f"https://api.github.com/repos/{repo}/contributors" response = requests.get(url, timeout=10) - data = response.json() + if response.status_code != 200: + print(f"GitHub API Error: Status {response.status_code}") + return "" - name = data.get("global_name") or data.get("username") - avatar = data.get("avatar") - github_user = data.get("username") + seen = set() + cells = [] + + for user in response.json(): + name = user.get("login") + if not name or name == "web-flow": + continue + seen.add(name.lower()) + cells.append(make_cell( + avatar_url=f"{user['avatar_url']}&s=75", + name=name, + profile_url=user["html_url"], + )) + + for login in extra_logins: + if login.lower() in seen: + print(f"Skipping duplicate extra user: {login}") + continue + user = fetch_github_user(login) + if not user: + continue + seen.add(login.lower()) + cells.append(make_cell( + avatar_url=f"{user['avatar_url']}&s=75", + name=user["login"], + profile_url=user["html_url"], + )) + + return build_table(cells) if cells else "" - return f""" - - {name} - -""" except Exception as e: - print(f"Błąd API: {e}") + print(f"GitHub Fetch Error: {e}") return "" -def update_file(file_path, html_content): - if not os.path.exists(file_path): - print(f"❌ Plik {file_path} nie istnieje!") + +def get_discord_users(user_ids): + cells = [] + for uid in user_ids: + try: + response = requests.get( + f"https://pfpfinder.com/api/discord/user/{uid}", timeout=10 + ) + if response.status_code != 200: + print(f"Discord API: Status {response.status_code} for {uid}") + continue + + data = response.json() + global_name = data.get("global_name") + username = data.get("username") + if global_name: + name = global_name + else: + print(f"Warning: {uid} has no global_name, falling back to username '{username}' (can be used for invites)") + name = username or f"User {uid}" + + source_url = (data.get("avatar") or "").replace(".gif", ".png") + if not source_url: + default_index = (int(uid) >> 22) % 6 + source_url = f"https://cdn.discordapp.com/embed/avatars/{default_index}.png" + + uid_hash = hashlib.sha1(uid.encode()).hexdigest()[:12] + filename = f"discord_{uid_hash}.png" + avatar_url = save_avatar(source_url, filename) + if not avatar_url: + continue + + cells.append(make_cell(avatar_url=avatar_url, name=name)) + + except Exception as e: + print(f"Discord API Error for {uid}: {e}") + + return build_table(cells) if cells else "" + + +def process_file(filename, github_elements, discord_elements, is_pl): + input_path = f"./{filename}" + output_path = f"../{filename}" + + if not os.path.exists(input_path): + print(f"Error: File {input_path} does not exist") return - with open(file_path, "r", encoding="utf-8") as f: + with open(input_path, "r", encoding="utf-8") as f: content = f.read() - if MARKER not in content: - print(f"⚠️ Marker {MARKER} nie został znaleziony w {file_path}") - return + if is_pl: + info_github = ( + f'Jeśli jesteś współtwórcą i chcesz, ' + f'aby Twój profil został usunięty z tej listy, skontaktuj się ze mną.' + ) + info_discord = ( + "Jeśli jesteś na tej liście i chcesz usunąć swój profil, skontaktuj się ze mną." + ) + else: + info_github = ( + f'If you are a contributor and want your profile ' + f'removed from this list, please contact me.' + ) + info_discord = ( + "If you are on this list and want your profile removed, please contact me." + ) - # Zamiana markera na HTML - new_content = content.replace(MARKER, html_content) + if MARKER_GITHUB in content and github_elements: + content = content.replace(MARKER_GITHUB, ( + f'
\n\n' + f'{github_elements}\n\n' + f'{info_github}\n\n' + f'
' + )) + elif MARKER_GITHUB in content: + print(f"Warning: No GitHub data to replace marker in {input_path}") - with open(file_path, "w", encoding="utf-8") as f: - f.write(new_content) + if MARKER_DISCORD in content and discord_elements: + content = content.replace(MARKER_DISCORD, ( + f'
\n\n' + f'{discord_elements}\n\n' + f'{info_discord}\n\n' + f'
' + )) + elif MARKER_DISCORD in content: + print(f"Warning: No Discord data to replace marker in {input_path}") + + with open(output_path, "w", encoding="utf-8") as f: + f.write(content) + + print(f"Success: Created {output_path}") - print(f"✅ Zaktualizowano: {file_path}") def main(): - elements = "".join([get_html_for_user(uid) for uid in USER_IDS]) - full_html = f'
\n{elements}\n
' + print("Fetching GitHub contributors...") + github_elements = get_github_contributors(REPOSITORY, EXTRA_USERS_GITHUB) - files = ["../README.md", "../README-PL.md"] + print("Fetching Discord users...") + discord_elements = get_discord_users(DISCORD_USER_IDS) + + files = [("README.md", False), ("README-PL.md", True)] + + for filename, is_pl in files: + process_file(filename, github_elements, discord_elements, is_pl) - for file in files: - update_file(file, full_html) if __name__ == "__main__": main() \ No newline at end of file diff --git a/jRandomSkills - SRC Files/jRandomSkills.csproj b/jRandomSkills - SRC Files/jRandomSkills.csproj index 818771c..ad9f274 100644 --- a/jRandomSkills - SRC Files/jRandomSkills.csproj +++ b/jRandomSkills - SRC Files/jRandomSkills.csproj @@ -1,7 +1,7 @@  - net8.0 + net10.0 enable enable true @@ -18,7 +18,7 @@ - + @@ -53,7 +53,7 @@ $(MSBuildProjectDirectory)\src\lang $(MSBuildProjectDirectory)\..\jRandomSkills - Server Files\plugins\jRandomSkills\languages - $(MSBuildProjectDirectory)\bin\Debug\net8.0 + $(MSBuildProjectDirectory)\bin\Debug\net10.0 $(MSBuildProjectDirectory)\..\jRandomSkills - Server Files\plugins\jRandomSkills $(MSBuildProjectDirectory)\src\gamedata $(MSBuildProjectDirectory)\..\jRandomSkills - Server Files\gamedata diff --git a/jRandomSkills - SRC Files/src/command/Command.cs b/jRandomSkills - SRC Files/src/command/Command.cs index 623fe45..e5f5051 100644 --- a/jRandomSkills - SRC Files/src/command/Command.cs +++ b/jRandomSkills - SRC Files/src/command/Command.cs @@ -158,7 +158,7 @@ namespace src.command return; } - SkillUtils.PrintToChat(player, $"{player.GetTranslation("done_setskill")}: {ChatColors.LightRed}{player.GetSkillName(skill.Skill)} {ChatColors.Lime}{player.GetTranslation("for_setskill")} {ChatColors.LightRed}{targetPlayer.PlayerName}"); + SkillUtils.PrintToChat(player, $"{player.GetTranslation("done_setskill")}: {ChatColors.LightRed}{player.GetSkillName(skill.Skill)} {ChatColors.Lime}{player.GetTranslation("for_setskill")} {ChatColors.LightRed}\u202A{targetPlayer.PlayerName}\u202C"); if (skill.Display) SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skill.Skill)}{ChatColors.Lime}: {player.GetSkillDescription(skill.Skill)}", border: "b"); @@ -518,7 +518,7 @@ namespace src.command return; } - SkillUtils.PrintToChat(player, $"{player.GetTranslation("done_setskill")}: {ChatColors.LightRed}{player.GetSkillName(skill.Skill)} {ChatColors.Lime}{player.GetTranslation("for_setskill")} {ChatColors.LightRed}{targetPlayer.PlayerName}"); + SkillUtils.PrintToChat(player, $"{player.GetTranslation("done_setskill")}: {ChatColors.LightRed}{player.GetSkillName(skill.Skill)} {ChatColors.Lime}{player.GetTranslation("for_setskill")} {ChatColors.LightRed}\u202A{targetPlayer.PlayerName}\u202C"); if (skill.Display) SkillUtils.PrintToChat(player, $"{ChatColors.DarkRed}{player.GetSkillName(skill.Skill)}{ChatColors.Lime}: {player.GetSkillDescription(skill.Skill)}", border: "b"); diff --git a/jRandomSkills - SRC Files/src/gamedata/jRandomSkills.gamedata.json b/jRandomSkills - SRC Files/src/gamedata/jRandomSkills.gamedata.json index 7c8be60..2f7bc51 100644 --- a/jRandomSkills - SRC Files/src/gamedata/jRandomSkills.gamedata.json +++ b/jRandomSkills - SRC Files/src/gamedata/jRandomSkills.gamedata.json @@ -27,11 +27,22 @@ "linux": "55 48 89 E5 41 57 49 89 FF 48 89 F7 41 56 41 55 41 54 53 48 81 EC" } }, - "CCSPlayerController_HandleCommandDrop": { - "signatures": { - "library": "server", - "windows": "48 89 5C 24 ? 57 48 83 EC ? 48 8B FA E8 ? ? ? ? 48 8B D8", - "linux": "55 48 89 E5 41 54 49 89 F4 53 E8 ? ? ? ? 48 85 C0 74 ? 48 89 C3" + "CServerSideClient_m_nDeltaTick": { + "offsets": { + "windows": 348, + "linux": 348 + } + }, + "INetworkGameServer_Slots": { + "offsets": { + "windows": 592, + "linux": 592 + } + }, + "INetworkServerService_GetIGameServer": { + "offsets": { + "windows": 23, + "linux": 24 } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/jRandomSkills.cs b/jRandomSkills - SRC Files/src/jRandomSkills.cs index 7db762b..160b1c6 100644 --- a/jRandomSkills - SRC Files/src/jRandomSkills.cs +++ b/jRandomSkills - SRC Files/src/jRandomSkills.cs @@ -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.2.b1"; + public override string ModuleVersion => "1.2.2.b2"; public override void Load(bool hotReload) { diff --git a/jRandomSkills - SRC Files/src/lang/de.json b/jRandomSkills - SRC Files/src/lang/de.json index f06a831..d0adf2d 100644 --- a/jRandomSkills - SRC Files/src/lang/de.json +++ b/jRandomSkills - SRC Files/src/lang/de.json @@ -1,519 +1,519 @@ { - "none": "Keine", - "none_desc": "Du hast keine Fertigkeit", + "none": "Keine", + "none_desc": "Du hast keine Fertigkeit", - "aimbot": "Aimbot", - "aimbot_desc": "Jede Kugel, die du triffst, zählt als Kopfschuss", + "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", + "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", + "anomaly": "Anomalie", + "anomaly_desc": "Du spulst die Zeit um einige Sekunden zurück", - "antyflash": "Anti-Flash", - "antyflash_desc": "Du bist immun gegen Blendgranaten und deine Blendgranaten halten 7 Sekunden lang", + "antyflash": "Anti-Flash", + "antyflash_desc": "Du bist immun gegen Blendgranaten und deine Blendgranaten halten 7 Sekunden lang", - "antyhead": "Eiserner Kopf", - "antyhead_desc": "Du erleidest keinen Schaden durch Kopfschüsse", + "antyhead": "Eiserner Kopf", + "antyhead_desc": "Du erleidest keinen Schaden durch Kopfschüsse", - "areareaper": "Zone Reaper", - "areareaper_desc": "Du kannst einen Bombenort auswählen, den du deaktivieren möchtest", - "areareaper_incorrect_site": "Kein solcher Bombenort gefunden", - "areareaper_no_site": "Keine Bombenstandorte gefunden.", - "areareaper_select_info": "Standort zum Deaktivieren auswählen:", - "areareaper_site_disabled": "Bombenstandort {0} wurde deaktiviert – dort können keine Bomben platziert werden!", - "areareaper_used_info": "Deine Fähigkeit wurde bereits eingesetzt.", - "areareaper_bombsite_disabled": "Dieser Bombenplatz wurde deaktiviert!", + "areareaper": "Zone Reaper", + "areareaper_desc": "Du kannst einen Bombenort auswählen, den du deaktivieren möchtest", + "areareaper_incorrect_site": "Kein solcher Bombenort gefunden", + "areareaper_no_site": "Keine Bombenstandorte gefunden.", + "areareaper_select_info": "Standort zum Deaktivieren auswählen:", + "areareaper_site_disabled": "Bombenstandort {0} wurde deaktiviert – dort können keine Bomben platziert werden!", + "areareaper_used_info": "Deine Fähigkeit wurde bereits eingesetzt.", + "areareaper_bombsite_disabled": "Dieser Bombenplatz wurde deaktiviert!", - "armored": "Gepanzert", - "armored_desc": "Du hast einen zufälligen Schadensmultiplikator", - "armored_desc2": "Dein Schadensmultiplikator beträgt: {0}x", + "armored": "Gepanzert", + "armored_desc": "Du hast einen zufälligen Schadensmultiplikator", + "armored_desc2": "Dein Schadensmultiplikator beträgt: {0}x", - "assassin": "Attentäter", - "assassin_desc": "Du fügst Gegnern von hinten erhöhten Schaden zu", + "assassin": "Attentäter", + "assassin_desc": "Du fügst Gegnern von hinten erhöhten Schaden zu", - "astronaut": "Astronaut", - "astronaut_desc": "Du erhältst zu Beginn der Runde einen zufälligen Schwerkraftwert", - "astronaut_desc2": "Deine zufällige Schwerkraft beträgt: {0}x", + "astronaut": "Astronaut", + "astronaut_desc": "Du erhältst zu Beginn der Runde einen zufälligen Schwerkraftwert", + "astronaut_desc2": "Deine zufällige Schwerkraft beträgt: {0}x", - "moneyswap": "Steuerbeamter", - "moneyswap_desc": "Wähle einen Spieler aus, mit dem du Geld tauschen möchtest", - "moneyswap_enemy_info": "Das Finanzamt hat dich erwischt.", - "moneyswap_player_info": "Du hast Geld mit dem Spieler \"{0}\" getauscht.", - "moneyswap_select_info": "Geld mit Spieler tauschen:", + "moneyswap": "Steuerbeamter", + "moneyswap_desc": "Wähle einen Spieler aus, mit dem du Geld tauschen möchtest", + "moneyswap_enemy_info": "Das Finanzamt hat dich erwischt.", + "moneyswap_player_info": "Du hast Geld mit dem Spieler \"{0}\" getauscht.", + "moneyswap_select_info": "Geld mit Spieler tauschen:", - "baseball": "Baseballspieler", - "baseball_desc": "Deine Attrappe prallt von Wänden ab und tötet einen Gegner sofort beim Aufprall.", + "baseball": "Baseballspieler", + "baseball_desc": "Deine Attrappe prallt von Wänden ab und tötet einen Gegner sofort beim Aufprall.", - "behind": "Feind drehen", - "behind_desc": "Du hast eine zufällige Chance, einen Feind um 180 Grad zu drehen, wenn du ihn triffst", - "behind_desc2": "Deine Chance, einen Feind bei einem Treffer zu drehen, beträgt: {0} %", + "behind": "Feind drehen", + "behind_desc": "Du hast eine zufällige Chance, einen Feind um 180 Grad zu drehen, wenn du ihn triffst", + "behind_desc2": "Deine Chance, einen Feind bei einem Treffer zu drehen, beträgt: {0} %", - "blademaster": "Schwertmeister", - "blademaster_desc": "Wenn du ein Messer hältst, hast du eine hohe Chance, einen Schuss abzuwehren", + "blademaster": "Schwertmeister", + "blademaster_desc": "Wenn du ein Messer hältst, hast du eine hohe Chance, einen Schuss abzuwehren", - "bunnyhop": "Hase", - "bunnyhop_desc": "Du erhältst automatisch bunnyhop", + "bunnyhop": "Hase", + "bunnyhop_desc": "Du erhältst automatisch bunnyhop", - "c4camouflage": "C4-Tarnung", - "c4camouflage_desc": "Du bist unsichtbar, während du die Bombe hältst", + "c4camouflage": "C4-Tarnung", + "c4camouflage_desc": "Du bist unsichtbar, während du die Bombe hältst", - "carefulbullets": "Vorsichtige Kugeln", - "carefulbullets_desc": "Wähle einen Spieler aus, der für jeden Fehlschuss Schaden nimmt", - "carefulbullets_enemy_info": "Von nun an wird Ungenauigkeit buchstäblich wehtun.", - "carefulbullets_player_info": "‚{0}‘ muss jetzt vorsichtiger sein.", - "carefulbullets_select_info": "Fehler schaden dem Spieler:", + "carefulbullets": "Vorsichtige Kugeln", + "carefulbullets_desc": "Wähle einen Spieler aus, der für jeden Fehlschuss Schaden nimmt", + "carefulbullets_enemy_info": "Von nun an wird Ungenauigkeit buchstäblich wehtun.", + "carefulbullets_player_info": "‚{0}‘ muss jetzt vorsichtiger sein.", + "carefulbullets_select_info": "Fehler schaden dem Spieler:", - "catapult": "Katapult", - "catapult_desc": "Du hast eine zufällige Chance, einen Gegner nach oben zu schleudern", - "catapult_desc2": "Deine Chance, einen Gegner bei einem Treffer zu schleudern, beträgt: {0} %", + "catapult": "Katapult", + "catapult_desc": "Du hast eine zufällige Chance, einen Gegner nach oben zu schleudern", + "catapult_desc2": "Deine Chance, einen Gegner bei einem Treffer zu schleudern, beträgt: {0} %", - "chicken": "Huhn", - "chicken_desc": "Du erhältst ein Huhn-Modell + 10 % schnellere Bewegung – 50 HP", + "chicken": "Huhn", + "chicken_desc": "Du erhältst ein Huhn-Modell + 10 % schnellere Bewegung – 50 HP", - "chillout": "Chillout", - "chillout_desc": "Das Platzieren der Bombe dauert deutlich länger", + "chillout": "Chillout", + "chillout_desc": "Das Platzieren der Bombe dauert deutlich länger", - "cutter": "Cutter", - "cutter_desc": "Sofortiger Tod mit einem Messer", + "cutter": "Cutter", + "cutter_desc": "Sofortiger Tod mit einem Messer", - "cypher": "Kamera", - "cypher_desc": "Klicken Sie auf [css_useSkill], um eine Kamera zu erstellen/zu wechseln", - "cypher_nospace": "Die Kamera muss im rechten Winkel zur Wand positioniert werden", + "cypher": "Kamera", + "cypher_desc": "Klicken Sie auf [css_useSkill], um eine Kamera zu erstellen/zu wechseln", + "cypher_nospace": "Die Kamera muss im rechten Winkel zur Wand positioniert werden", - "darkness": "Dunkelheit", - "darkness_desc": "Wendet einen Dunkelheitseffekt auf einen ausgewählten Gegner an", - "darkness_enemy_info": "Lass die Lichter ausgehen", - "darkness_player_info": "Die Dunkelheit hat den Spieler \"{0}\" überwältigt.", - "darkness_select_info": "Wähle einen Spieler für die Dunkelheit aus:", + "darkness": "Dunkelheit", + "darkness_desc": "Wendet einen Dunkelheitseffekt auf einen ausgewählten Gegner an", + "darkness_enemy_info": "Lass die Lichter ausgehen", + "darkness_player_info": "Die Dunkelheit hat den Spieler \"{0}\" überwältigt.", + "darkness_select_info": "Wähle einen Spieler für die Dunkelheit aus:", - "deactivator": "Deaktivator", - "deactivator_desc": "Wähle einen Spieler aus, dessen Fähigkeit du deaktivieren möchtest", - "deactivator_enemy_info": "Deine Fähigkeit wurde deaktiviert", - "deactivator_player_info": "Die Fähigkeit des Spielers ‚{0}‘ wurde deaktiviert", - "deactivator_select_info": "Fähigkeit eines Spielers deaktivieren:", + "deactivator": "Deaktivator", + "deactivator_desc": "Wähle einen Spieler aus, dessen Fähigkeit du deaktivieren möchtest", + "deactivator_enemy_info": "Deine Fähigkeit wurde deaktiviert", + "deactivator_player_info": "Die Fähigkeit des Spielers ‚{0}‘ wurde deaktiviert", + "deactivator_select_info": "Fähigkeit eines Spielers deaktivieren:", - "deaf": "Taub", - "deaf_desc": "Wähle einen Spieler aus, für den alle Sounds stummgeschaltet werden sollen", - "deaf_enemy_info": "Deine Kopfhörer haben das Spiel verlassen.", - "deaf_player_info": "Der Ton für den Spieler ‚{0}‘ wurde deaktiviert.", - "deaf_select_info": "Alle Töne für den Spieler stummschalten:", + "deaf": "Taub", + "deaf_desc": "Wähle einen Spieler aus, für den alle Sounds stummgeschaltet werden sollen", + "deaf_enemy_info": "Deine Kopfhörer haben das Spiel verlassen.", + "deaf_player_info": "Der Ton für den Spieler ‚{0}‘ wurde deaktiviert.", + "deaf_select_info": "Alle Töne für den Spieler stummschalten:", - "disarmament": "Entwaffnung", - "disarmament_desc": "Du hast eine zufällige Chance, einen Gegner bei einem Treffer seine Waffe fallen zu lassen.", - "disarmament_desc2": "Ihre Chance, einen Gegner zu entwaffnen, beträgt: {0} %", + "disarmament": "Entwaffnung", + "disarmament_desc": "Du hast eine zufällige Chance, einen Gegner bei einem Treffer seine Waffe fallen zu lassen.", + "disarmament_desc2": "Ihre Chance, einen Gegner zu entwaffnen, beträgt: {0} %", - "distancer": "Entfernungsmesser", - "distancer_desc": "Sie können die Entfernung zum nächsten Gegner sehen", + "distancer": "Entfernungsmesser", + "distancer_desc": "Sie können die Entfernung zum nächsten Gegner sehen", - "dash": "Sprinten", - "dash_desc": "Führe einen zweiten Sprung aus, um zu sprinten", + "dash": "Sprinten", + "dash_desc": "Führe einen zweiten Sprung aus, um zu sprinten", - "dracula": "Dracula", - "dracula_desc": "Wenn du einen Gegner triffst, wird deine Gesundheit um einen Prozentsatz des verursachten Schadens wiederhergestellt", + "dracula": "Dracula", + "dracula_desc": "Wenn du einen Gegner triffst, wird deine Gesundheit um einen Prozentsatz des verursachten Schadens wiederhergestellt", - "duplicator": "Duplikator", - "duplicator_desc": "Wähle einen Spieler aus, dessen Fertigkeit du kopieren möchtest", - "duplicator_player_info": "Die Fertigkeit des Spielers ‚{0}‘ wurde kopiert.", - "duplicator_select_info": "Kopiere die Fertigkeit eines Spielers:", + "duplicator": "Duplikator", + "duplicator_desc": "Wähle einen Spieler aus, dessen Fertigkeit du kopieren möchtest", + "duplicator_player_info": "Die Fertigkeit des Spielers ‚{0}‘ wurde kopiert.", + "duplicator_select_info": "Kopiere die Fertigkeit eines Spielers:", - "dwarf": "Zwerg", - "dwarf_desc": "Zufällige Charaktergröße zu Beginn der Runde", - "dwarf_desc2": "Dein Größenmultiplikator beträgt: {0}x", + "dwarf": "Zwerg", + "dwarf_desc": "Zufällige Charaktergröße zu Beginn der Runde", + "dwarf_desc2": "Dein Größenmultiplikator beträgt: {0}x", - "enemyspawn": "Feindes-Spawn", - "enemyspawn_desc": "Klicke auf [css_useSkill], um zum Feindes-Spawn zu teleportieren", + "enemyspawn": "Feindes-Spawn", + "enemyspawn_desc": "Klicke auf [css_useSkill], um zum Feindes-Spawn zu teleportieren", - "explosiveshot": "Explosiver Schuss", - "explosiveshot_desc": "Zufällige Chance, beim Schießen eine explosive Kugel abzufeuern", - "explosiveshot_desc2": "Deine Chance, eine explosive Kugel abzufeuern: {0} %", + "explosiveshot": "Explosiver Schuss", + "explosiveshot_desc": "Zufällige Chance, beim Schießen eine explosive Kugel abzufeuern", + "explosiveshot_desc2": "Deine Chance, eine explosive Kugel abzufeuern: {0} %", - "falconeye": "Falkenauge", - "falconeye_desc": "Klicke auf [css_useSkill], um eine Vogelperspektive zu aktivieren", + "falconeye": "Falkenauge", + "falconeye_desc": "Klicke auf [css_useSkill], um eine Vogelperspektive zu aktivieren", - "fastreload": "Schnellnachladen", - "fastreload_desc": "Klicke auf [css_useSkill], um die Waffe, die du gerade hältst, nachzuladen", + "fastreload": "Schnellnachladen", + "fastreload_desc": "Klicke auf [css_useSkill], um die Waffe, die du gerade hältst, nachzuladen", - "flash": "Blitz", - "flash_desc": "Zufällige Spielergeschwindigkeit zu Beginn der Runde", - "flash_desc2": "Dein Geschwindigkeitsmultiplikator beträgt: {0}x", + "flash": "Blitz", + "flash_desc": "Zufällige Spielergeschwindigkeit zu Beginn der Runde", + "flash_desc2": "Dein Geschwindigkeitsmultiplikator beträgt: {0}x", - "fortnite": "Fortnite", - "fortnite_desc": "Klicke auf [css_useSkill], um eine zerstörbare Barrikade zu erstellen", + "fortnite": "Fortnite", + "fortnite_desc": "Klicke auf [css_useSkill], um eine zerstörbare Barrikade zu erstellen", - "fragilebomb": "Fragile Bombe", - "fragilebomb_desc": "Das Schießen auf die Bombe beschädigt sie", - "fragilebomb_bomb_health": "Bombengesundheit", + "fragilebomb": "Fragile Bombe", + "fragilebomb_desc": "Das Schießen auf die Bombe beschädigt sie", + "fragilebomb_bomb_health": "Bombengesundheit", - "friendlyfire": "Friendly Fire", - "friendlyfire_desc": "Das Schießen auf Teamkameraden heilt sie", + "friendlyfire": "Friendly Fire", + "friendlyfire_desc": "Das Schießen auf Teamkameraden heilt sie", - "frozendecoy": "Eisige Attrappe", - "frozendecoy_desc": "Deine Attrappe friert alle Spieler in der Nähe ein", + "frozendecoy": "Eisige Attrappe", + "frozendecoy_desc": "Deine Attrappe friert alle Spieler in der Nähe ein", - "gambler": "Zocker", - "gambler_desc": "Wähle eine Fertigkeit aus der Liste aus.", - "gambler_select_info": "Wähle deine Fähigkeit aus:", - "gambler_more": "#00FF00|Aktualisieren für ${0}", - "gambler_no_money": "Nicht genug Geld.", + "gambler": "Zocker", + "gambler_desc": "Wähle eine Fertigkeit aus der Liste aus.", + "gambler_select_info": "Wähle deine Fähigkeit aus:", + "gambler_more": "#00FF00|Aktualisieren für ${0}", + "gambler_no_money": "Nicht genug Geld.", - "ghost": "Geist", - "ghost_desc": "Du bist vollständig unsichtbar", + "ghost": "Geist", + "ghost_desc": "Du bist vollständig unsichtbar", - "glaz": "Glaz", - "glaz_desc": "Du kannst durch Rauchgranaten hindurchsehen", + "glaz": "Glaz", + "glaz_desc": "Du kannst durch Rauchgranaten hindurchsehen", - "glitch": "Glitch", - "glitch_desc": "Deaktiviert das Radar für einen ausgewählten Gegner", - "glitch_enemy_info": "Dein Radar wurde deaktiviert", - "glitch_player_info": "Das Radar des Spielers ‚{0}‘ wurde deaktiviert.", - "glitch_select_info": "Radar des Spielers ausschalten:", + "glitch": "Glitch", + "glitch_desc": "Deaktiviert das Radar für einen ausgewählten Gegner", + "glitch_enemy_info": "Dein Radar wurde deaktiviert", + "glitch_player_info": "Das Radar des Spielers ‚{0}‘ wurde deaktiviert.", + "glitch_select_info": "Radar des Spielers ausschalten:", - "glue": "Glue", - "glue_desc": "Deine Granaten haften an Wänden", + "glue": "Glue", + "glue_desc": "Deine Granaten haften an Wänden", - "godmode": "Gott-Modus", - "godmode_desc": "Klicke auf [css_useSkill], um für kurze Zeit unsterblich zu werden", - "godmode_off": "Unsterblichkeit deaktiviert", - "godmode_on": "Unsterblichkeit aktiviert", + "godmode": "Gott-Modus", + "godmode_desc": "Klicke auf [css_useSkill], um für kurze Zeit unsterblich zu werden", + "godmode_off": "Unsterblichkeit deaktiviert", + "godmode_on": "Unsterblichkeit aktiviert", - "grenadier": "Grenadier", - "grenadier_desc": "Du hast unendlich viele Granaten", + "grenadier": "Grenadier", + "grenadier_desc": "Du hast unendlich viele Granaten", - "healingsmoke": "Heilender Rauch", - "healingsmoke_desc": "Deine Rauchgranaten heilen", + "healingsmoke": "Heilender Rauch", + "healingsmoke_desc": "Deine Rauchgranaten heilen", - "hermit": "Einsiedler", - "hermit_desc": "Durch das Töten von Gegnern werden Munition und ein Teil der Gesundheit wiederhergestellt", + "hermit": "Einsiedler", + "hermit_desc": "Durch das Töten von Gegnern werden Munition und ein Teil der Gesundheit wiederhergestellt", - "holyhandgrenade": "Heilige Handgranate", - "holyhandgrenade_desc": "Deine HE-Granaten verursachen doppelten Schaden und haben doppelte Reichweite", + "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", + "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ß!", + "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", + "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", + "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", + "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", + "impostor": "Betrüger", + "impostor_desc": "Du beginnst die Runde mit einem feindlichen Spielermodell", - "infiniteammo": "Unendliche Munition", - "infiniteammo_desc": "Du erhältst unendliche Munition für alle deine Waffen", + "infiniteammo": "Unendliche Munition", + "infiniteammo_desc": "Du erhältst unendliche Munition für alle deine Waffen", - "jackal": "Spürhund", - "jackal_desc": "Jeder Gegner hinterlässt eine Spur", + "jackal": "Spürhund", + "jackal_desc": "Jeder Gegner hinterlässt eine Spur", - "jammer": "Störsender", - "jammer_desc": "Wähle einen Spieler aus, um dessen Fadenkreuz zu deaktivieren", - "jammer_enemy_info": "Dein Fadenkreuz wurde deaktiviert.", - "jammer_player_info": "Das Fadenkreuz von Spieler ‚{0}‘ wurde deaktiviert.", - "jammer_select_info": "Fadenkreuz des Spielers deaktivieren:", + "jammer": "Störsender", + "jammer_desc": "Wähle einen Spieler aus, um dessen Fadenkreuz zu deaktivieren", + "jammer_enemy_info": "Dein Fadenkreuz wurde deaktiviert.", + "jammer_player_info": "Das Fadenkreuz von Spieler ‚{0}‘ wurde deaktiviert.", + "jammer_select_info": "Fadenkreuz des Spielers deaktivieren:", - "jester": "Narr", - "jester_desc": "Im Narrenmodus kannst du keinen Schaden erleiden oder verursachen. Dieser Modus ändert sich alle paar Sekunden.", - "jester_mode": "Jester-Modus", - "jester_on": "EIN", - "jester_off": "AUS", + "jester": "Narr", + "jester_desc": "Im Narrenmodus kannst du keinen Schaden erleiden oder verursachen. Dieser Modus ändert sich alle paar Sekunden.", + "jester_mode": "Jester-Modus", + "jester_on": "EIN", + "jester_off": "AUS", - "jumpban": "Beinlos", - "jumpban_desc": "Wähle einen Spieler, der nicht springen kann", - "jumpban_enemy_info": "Jemand hat dir die Beine abgeschnitten.", - "jumpban_player_info": "Der Spieler ‚{0}‘ kann nicht mehr springen.", - "jumpban_select_info": "Spieler vom Springen ausschließen:", + "jumpban": "Beinlos", + "jumpban_desc": "Wähle einen Spieler, der nicht springen kann", + "jumpban_enemy_info": "Jemand hat dir die Beine abgeschnitten.", + "jumpban_player_info": "Der Spieler ‚{0}‘ kann nicht mehr springen.", + "jumpban_select_info": "Spieler vom Springen ausschließen:", - "jumpingjack": "Jumping Jack", - "jumpingjack_desc": "Durch Springen wird die Gesundheit wiederhergestellt", + "jumpingjack": "Jumping Jack", + "jumpingjack_desc": "Durch Springen wird die Gesundheit wiederhergestellt", - "killerflash": "Killer Flash", - "killerflash_desc": "Jeder, der durch deine Blendgranate vollständig geblendet wird, stirbt (einschließlich dir selbst)", + "killerflash": "Killer Flash", + "killerflash_desc": "Jeder, der durch deine Blendgranate vollständig geblendet wird, stirbt (einschließlich dir selbst)", - "lifeswap": "Lebensaustausch", - "lifeswap_desc": "Wähle einen Spieler aus, mit dem du deine Gesundheit austauschen möchtest", - "lifeswap_enemy_info": "Jemand hat sich deine Gesundheit ausgeliehen", - "lifeswap_player_info": "Du hast deine Gesundheit mit dem Spieler \"{0}\" ausgetauscht", - "lifeswap_select_info": "Tausche Gesundheit mit Spieler:", + "lifeswap": "Lebensaustausch", + "lifeswap_desc": "Wähle einen Spieler aus, mit dem du deine Gesundheit austauschen möchtest", + "lifeswap_enemy_info": "Jemand hat sich deine Gesundheit ausgeliehen", + "lifeswap_player_info": "Du hast deine Gesundheit mit dem Spieler \"{0}\" ausgetauscht", + "lifeswap_select_info": "Tausche Gesundheit mit Spieler:", - "longknife": "Langes Messer", - "longknife_desc": "Ein Messerangriff verursacht unabhängig von der Entfernung Schaden", + "longknife": "Langes Messer", + "longknife_desc": "Ein Messerangriff verursacht unabhängig von der Entfernung Schaden", - "longzeus": "Langer Zeus", - "longzeus_desc": "Zeus verursacht unabhängig von der Entfernung Schaden", + "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", + "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", + "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!", - "magnifier_player_info": "Der Spieler ‚{0}‘ wurde in den Zoom-Modus versetzt.", - "magnifier_select_info": "Bildschirm des Spielers vergrößern:", + "magnifier": "Lupe", + "magnifier_desc": "Vergrößert den Bildschirm des Gegners und verringert dessen Sichtfeld", + "magnifier_enemy_info": "Dein Sichtfeld wurde verzerrt!", + "magnifier_player_info": "Der Spieler ‚{0}‘ wurde in den Zoom-Modus versetzt.", + "magnifier_select_info": "Bildschirm des Spielers vergrößern:", - "medic": "Sanitäter", - "medic_desc": "Klicke auf [css_useSkill], um eine Heilungsladung zu verwenden, die 50 Gesundheitspunkte wiederherstellt", + "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", + "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.", - "bankrupt_player_info": "Der Spieler ‚{0}‘ ist bankrott.", - "bankrupt_select_info": "Wähle einen Spieler aus, der bankrott gehen soll:", + "bankrupt": "Bankrott", + "bankrupt_desc": "Wähle den Spieler aus, der sein gesamtes Geld verlieren wird", + "bankrupt_enemy_info": "Du bist bankrott.", + "bankrupt_player_info": "Der Spieler ‚{0}‘ ist bankrott.", + "bankrupt_select_info": "Wähle einen Spieler aus, der bankrott gehen soll:", - "muhammed": "Muhammed", - "muhammed_desc": "Du explodierst beim Tod und tötest Spieler in deiner Nähe", - "muhammed_explosion": "ALLAHU AKBAR!!!", + "deathbomb": "Todesbombe", + "deathbomb_desc": "Du explodierst beim Tod und tötest Spieler in deiner Nähe", + "deathbomb_explosion": "Kaboom!", - "ninja": "Ninja", - "ninja_desc": "Wenn du stillstehst, erhöht sich deine Unsichtbarkeit um 33 %, wenn du dich duckst um 33 % und wenn du ein Messer hältst um 33 %", + "ninja": "Ninja", + "ninja_desc": "Wenn du stillstehst, erhöht sich deine Unsichtbarkeit um 33 %, wenn du dich duckst um 33 % und wenn du ein Messer hältst um 33 %", - "nonades": "No-Nades", - "nonades_desc": "Granaten fügen dir keinen Schaden zu", - - "norecoil": "Fokus", - "norecoil_desc": "Kein Rückstoß beim Schießen", + "nonades": "No-Nades", + "nonades_desc": "Granaten fügen dir keinen Schaden zu", - "noclip": "NoClip", - "noclip_desc": "Klicke auf [css_useSkill], um NoClip für kurze Zeit zu aktivieren", + "norecoil": "Fokus", + "norecoil_desc": "Kein Rückstoß beim Schießen", - "oneshot": "One-Shot", - "oneshot_desc": "Ein Treffer tötet einen Gegner sofort", + "noclip": "NoClip", + "noclip_desc": "Klicke auf [css_useSkill], um NoClip für kurze Zeit zu aktivieren", - "onlyhead": "Nur Kopf", - "onlyhead_desc": "Du erleidest nur Schaden am Kopf", + "oneshot": "One-Shot", + "oneshot_desc": "Ein Treffer tötet einen Gegner sofort", - "paweljumper": "Pawel Jumper", - "paweljumper_desc": "Du erhältst eine zufällige Anzahl zusätzlicher Sprünge", - "paweljumper_desc2": "Du erhältst {0} zusätzliche Sprünge", + "onlyhead": "Nur Kopf", + "onlyhead_desc": "Du erleidest nur Schaden am Kopf", - "phoenix": "Phönix", - "phoenix_desc": "Du hast eine zufällige Chance, nach dem Tod wieder zu erscheinen", - "phoenix_desc2": "Deine Chance, nach dem Tod wieder zu erscheinen: {0} %", - "phoenix_respawn": "Du bist dank der Kraft von CHATCOLORS.REDPhoenix aus der Asche auferstanden", + "paweljumper": "Pawel Jumper", + "paweljumper_desc": "Du erhältst eine zufällige Anzahl zusätzlicher Sprünge", + "paweljumper_desc2": "Du erhältst {0} zusätzliche Sprünge", - "psychicdefusing": "Psychic Defusing", - "psychicdefusing_desc": "Wenn du dich in der Nähe der Bombe befindest, beginnst du, sie zu entschärfen", - "psychicdefusing_hud_info": "{0} Sekunden verbleibend bis zur Entschärfung", + "phoenix": "Phönix", + "phoenix_desc": "Du hast eine zufällige Chance, nach dem Tod wieder zu erscheinen", + "phoenix_desc2": "Deine Chance, nach dem Tod wieder zu erscheinen: {0} %", + "phoenix_respawn": "Du bist dank der Kraft von CHATCOLORS.REDPhoenix aus der Asche auferstanden", - "pilot": "Pilot", - "pilot_desc": "Fliege für begrenzte Zeit. Doppelklick auf Sprung zum Fliegen", - "pilot_hud_info": "Treibstoff", + "psychicdefusing": "Psychic Defusing", + "psychicdefusing_desc": "Wenn du dich in der Nähe der Bombe befindest, beginnst du, sie zu entschärfen", + "psychicdefusing_hud_info": "{0} Sekunden verbleibend bis zur Entschärfung", - "planter": "Freier Planter", - "planter_desc": "Du kannst die Bombe überall platzieren, die Detonationszeit beträgt 60 Sekunden.", - "planter_planting": "Bombe wird gelegt ({0})...", + "pilot": "Pilot", + "pilot_desc": "Fliege für begrenzte Zeit. Doppelklick auf Sprung zum Fliegen", + "pilot_hud_info": "Treibstoff", - "poison": "Gift", - "poison_desc": "Wähle einen Spieler aus, der alle paar Sekunden Schaden nimmt", - "poison_enemy_info": "Du wurdest vergiftet", - "poison_player_info": "Der Spieler ‚{0}‘ wurde vergiftet", - "poison_select_info": "Einen Spieler vergiften:", + "planter": "Freier Planter", + "planter_desc": "Du kannst die Bombe überall platzieren, die Detonationszeit beträgt 60 Sekunden.", + "planter_planting": "Bombe wird gelegt ({0})...", - "primaryban": "Keine Gewehre", - "primaryban_desc": "Wähle einen Spieler aus, der keine Gewehre verwenden kann", - "primaryban_enemy_info": "Du kannst keine Gewehre mehr verwenden.", - "primaryban_player_info": "Der Spieler ‚{0}‘ kann keine Gewehre mehr verwenden.", - "primaryban_select_info": "Gewehre für Spieler verbieten:", + "poison": "Gift", + "poison_desc": "Wähle einen Spieler aus, der alle paar Sekunden Schaden nimmt", + "poison_enemy_info": "Du wurdest vergiftet", + "poison_player_info": "Der Spieler ‚{0}‘ wurde vergiftet", + "poison_select_info": "Einen Spieler vergiften:", - "prosthesis": "Prothese", - "prosthesis_desc": "Arme und Beine sind kugelsicher", + "primaryban": "Keine Gewehre", + "primaryban_desc": "Wähle einen Spieler aus, der keine Gewehre verwenden kann", + "primaryban_enemy_info": "Du kannst keine Gewehre mehr verwenden.", + "primaryban_player_info": "Der Spieler ‚{0}‘ kann keine Gewehre mehr verwenden.", + "primaryban_select_info": "Gewehre für Spieler verbieten:", - "push": "Pusher", - "push_desc": "Du hast eine zufällige Chance, einen Gegner zurückzustoßen, wenn du ihn triffst", - "push_desc2": "Deine Chancen, den Gegner zurückzustoßen, betragen: {0} %", + "prosthesis": "Prothese", + "prosthesis_desc": "Arme und Beine sind kugelsicher", - "pyro": "Pyro", - "pyro_desc": "Molotow-Cocktail stellt Gesundheit wieder her", + "push": "Pusher", + "push_desc": "Du hast eine zufällige Chance, einen Gegner zurückzustoßen, wenn du ihn triffst", + "push_desc2": "Deine Chancen, den Gegner zurückzustoßen, betragen: {0} %", - "quickshot": "Schnellfeuer", - "quickshot_desc": "Alle Kugeln werden sehr schnell abgefeuert", + "pyro": "Pyro", + "pyro_desc": "Molotow-Cocktail stellt Gesundheit wieder her", - "radarhack": "Radar-Hack", - "radarhack_desc": "Gegner sind auf dem Radar sichtbar", + "quickshot": "Schnellfeuer", + "quickshot_desc": "Alle Kugeln werden sehr schnell abgefeuert", - "rambo": "Rambo", - "rambo_desc": "Du erhältst zu Beginn der Runde eine zufällige Menge an Gesundheit", + "radarhack": "Radar-Hack", + "radarhack_desc": "Gegner sind auf dem Radar sichtbar", - "randomweapon": "Zufällige Waffe", - "randomweapon_desc": "Klicke auf [css_useSkill], um eine zufällige Waffe zu erhalten", + "rambo": "Rambo", + "rambo_desc": "Du erhältst zu Beginn der Runde eine zufällige Menge an Gesundheit", - "rezombie": "Re-Zombie", - "rezombie_desc": "Nach dem Tod spawnst du als Zombie mit erhöhter Gesundheit und ohne Waffen", + "randomweapon": "Zufällige Waffe", + "randomweapon_desc": "Klicke auf [css_useSkill], um eine zufällige Waffe zu erhalten", - "reactivearmor": "Reaktive Rüstung", - "reactivearmor_desc": "Die Rüstung absorbiert den ersten erlittenen Schaden", + "rezombie": "Re-Zombie", + "rezombie_desc": "Nach dem Tod spawnst du als Zombie mit erhöhter Gesundheit und ohne Waffen", - "regeneration": "Regeneration", - "regeneration_desc": "Du stellst alle paar Sekunden Gesundheit wieder her", + "reactivearmor": "Reaktive Rüstung", + "reactivearmor_desc": "Die Rüstung absorbiert den ersten erlittenen Schaden", - "replicator": "Replikator", - "replicator_desc": "Klicke auf [css_useSkill], um eine Replik zu erstellen, die bei Treffer Schaden verursacht", + "regeneration": "Regeneration", + "regeneration_desc": "Du stellst alle paar Sekunden Gesundheit wieder her", - "retreat": "Rückzug", - "retreat_desc": "Klicke auf [css_useSkill], um zum Spawn zurückzukehren", + "replicator": "Replikator", + "replicator_desc": "Klicke auf [css_useSkill], um eine Replik zu erstellen, die bei Treffer Schaden verursacht", - "returntosender": "Zurück zum Absender", - "returntosender_desc": "Der erste Treffer eines Gegners schickt ihn zurück zu seinem Spawn", + "retreat": "Rückzug", + "retreat_desc": "Klicke auf [css_useSkill], um zum Spawn zurückzukehren", - "richboy": "Rich Boy", - "richboy_desc": "Du erhältst zu Beginn der Runde einen zufälligen Geldbetrag", + "returntosender": "Zurück zum Absender", + "returntosender_desc": "Der erste Treffer eines Gegners schickt ihn zurück zu seinem Spawn", - "robinhood": "Robin Hood", - "robinhood_desc": "Wenn du einem Gegner Schaden zufügst, stiehlst du ihm sein Geld", + "richboy": "Rich Boy", + "richboy_desc": "Du erhältst zu Beginn der Runde einen zufälligen Geldbetrag", - "rubber": "Gummigeschosse", - "rubber_desc": "Deine Kugeln verlangsamen Spieler erheblich", + "robinhood": "Robin Hood", + "robinhood_desc": "Wenn du einem Gegner Schaden zufügst, stiehlst du ihm sein Geld", - "saper": "Sapper", - "saper_desc": "Du kannst Bomben schneller legen und entschärfen", + "rubber": "Gummigeschosse", + "rubber_desc": "Deine Kugeln verlangsamen Spieler erheblich", - "secondlife": "Zweite Chance", - "secondlife_desc": "Nach dem Tod spawnst du mit derselben Gesundheitsanzeige wieder", + "saper": "Sapper", + "saper_desc": "Du kannst Bomben schneller legen und entschärfen", - "shade": "Schatten", - "shade_desc": "Du hast eine zufällige Chance, dich hinter einen getroffenen Gegner zu teleportieren", - "shade_desc2": "Deine Chancen, dich hinter einen getroffenen Gegner zu teleportieren, betragen: {0} %", - "shade_nospace": "Kein Platz verfügbar", + "secondlife": "Zweite Chance", + "secondlife_desc": "Nach dem Tod spawnst du mit derselben Gesundheitsanzeige wieder", - "shortbomb": "Kurze Zündschnur", - "shortbomb_desc": "Die Bombe explodiert viel schneller", + "shade": "Schatten", + "shade_desc": "Du hast eine zufällige Chance, dich hinter einen getroffenen Gegner zu teleportieren", + "shade_desc2": "Deine Chancen, dich hinter einen getroffenen Gegner zu teleportieren, betragen: {0} %", + "shade_nospace": "Kein Platz verfügbar", - "silent": "Leise", - "silent_desc": "Deine Schritte und Sprünge sind für ANDERE Spieler lautlos", + "shortbomb": "Kurze Zündschnur", + "shortbomb_desc": "Die Bombe explodiert viel schneller", - "smoker": "Smoker", - "smoker_desc": "Deine Rauchgranaten gehen nie aus", + "silent": "Leise", + "silent_desc": "Deine Schritte und Sprünge sind für ANDERE Spieler lautlos", - "sniperelite": "Sniper Elite", - "sniperelite_customname": "Sniper-Elite-Skill", - "sniperelite_desc": "Klicke auf [css_useSkill], um deine aktuelle Waffe gegen eine AWP auszutauschen", + "smoker": "Smoker", + "smoker_desc": "Deine Rauchgranaten gehen nie aus", - "soldier": "Soldat", - "soldier_desc": "Du hast einen zufälligen Schadensmultiplikator", - "soldier_desc2": "Dein Schadensmultiplikator beträgt: {0}x", + "sniperelite": "Sniper Elite", + "sniperelite_customname": "Sniper-Elite-Skill", + "sniperelite_desc": "Klicke auf [css_useSkill], um deine aktuelle Waffe gegen eine AWP auszutauschen", - "soundmaker": "Soundmaker", - "soundmaker_desc": "Klicke auf [css_useSkill], um für jeden Gegner einen Sound auszulösen", + "soldier": "Soldat", + "soldier_desc": "Du hast einen zufälligen Schadensmultiplikator", + "soldier_desc2": "Dein Schadensmultiplikator beträgt: {0}x", - "spectator": "Zuschauer", - "spectator_desc": "Klicke auf [css_useSkill], um einen zufälligen Gegner zu beobachten", + "soundmaker": "Soundmaker", + "soundmaker_desc": "Klicke auf [css_useSkill], um für jeden Gegner einen Sound auszulösen", - "swapposition": "Positionstausch", - "swapposition_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Plätze zu tauschen", + "spectator": "Zuschauer", + "spectator_desc": "Klicke auf [css_useSkill], um einen zufälligen Gegner zu beobachten", - "teleporter": "Teleporter", - "teleporter_desc": "Du hast die Chance, die Plätze mit einem getroffenen Gegner zu tauschen", - "teleporter_desc2": "Deine Chance auf Platztausch nach einem Treffer: {0}%", + "swapposition": "Positionstausch", + "swapposition_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Plätze zu tauschen", - "thief": "Dieb", - "thief_desc": "Du kannst einem ausgewählten Spieler eine Fertigkeit stehlen", - "thief_enemy_info": "Deine Fertigkeit wurde gestohlen", - "thief_player_info": "Die Fertigkeit des Spielers ‚{0}‘ wurde gestohlen", - "thief_select_info": "Fähigkeit eines Spielers stehlen:", - "thief_incorrect_skill": "Diese Fähigkeit kann nicht ausgewählt werden!", + "teleporter": "Teleporter", + "teleporter_desc": "Du hast die Chance, die Plätze mit einem getroffenen Gegner zu tauschen", + "teleporter_desc2": "Deine Chance auf Platztausch nach einem Treffer: {0}%", - "thirdeye": "Drittes Auge", - "thirdeye_desc": "Klicke auf [css_useSkill], um die Third-Person-Ansicht zu aktivieren", + "thief": "Dieb", + "thief_desc": "Du kannst einem ausgewählten Spieler eine Fertigkeit stehlen", + "thief_enemy_info": "Deine Fertigkeit wurde gestohlen", + "thief_player_info": "Die Fertigkeit des Spielers ‚{0}‘ wurde gestohlen", + "thief_select_info": "Fähigkeit eines Spielers stehlen:", + "thief_incorrect_skill": "Diese Fähigkeit kann nicht ausgewählt werden!", - "thorns": "Dornen", - "thorns_desc": "Dein Gegner erhält einen Teil des Schadens, den er dir zugefügt hat", + "thirdeye": "Drittes Auge", + "thirdeye_desc": "Klicke auf [css_useSkill], um die Third-Person-Ansicht zu aktivieren", - "throwingknife": "Wurfmesser", - "throwingknife_desc": "Klicke [css_useSkill], um ein Messer zu werfen. Aber nimm dich vor anderen in Acht", + "thorns": "Dornen", + "thorns_desc": "Dein Gegner erhält einen Teil des Schadens, den er dir zugefügt hat", - "toxicsmoke": "Giftiger Rauch", - "toxicsmoke_desc": "Deine Rauchgranaten verursachen Schaden", + "throwingknife": "Wurfmesser", + "throwingknife_desc": "Klicke [css_useSkill], um ein Messer zu werfen. Aber nimm dich vor anderen in Acht", - "wallhack": "Wallhack", - "wallhack_desc": "Du kannst Feinde durch Wände hindurch sehen", + "toxicsmoke": "Giftiger Rauch", + "toxicsmoke_desc": "Deine Rauchgranaten verursachen Schaden", - "watchmaker": "Uhrmacher", - "watchmaker_desc": "Jeder Granatenwurf verändert die Rundenzeit", - "watchmaker_ct": "Rundenzeit um {0} Sekunden verkürzt", - "watchmaker_tt": "Rundenzeit um {0} Sekunden verlängert", + "wallhack": "Wallhack", + "wallhack_desc": "Du kannst Feinde durch Wände hindurch sehen", - "weaponsswap": "Waffenwechsel", - "weaponsswap_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Waffen zu tauschen", - "weaponsswap_hud_info2": "Du hast keine Waffe zum Tauschen", + "watchmaker": "Uhrmacher", + "watchmaker_desc": "Jeder Granatenwurf verändert die Rundenzeit", + "watchmaker_ct": "Rundenzeit um {0} Sekunden verkürzt", + "watchmaker_tt": "Rundenzeit um {0} Sekunden verlängert", - "weightless": "Schwerelosigkeit", - "weightless_desc": "Deine Granaten werden nicht von der Schwerkraft beeinflusst und fliegen schneller", + "weaponsswap": "Waffenwechsel", + "weaponsswap_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Waffen zu tauschen", + "weaponsswap_hud_info2": "Du hast keine Waffe zum Tauschen", - "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", - - "your_skill": "Deine aktuelle Fertigkeit", - "enemy_skill": "Fähigkeit des Gegners", - "observer_skill": "Fähigkeit des Spielers", - "welcome_message": "Willkommen {PLAYER} bei {SERVER_NAME}", - "drawing_skill": "Eine Fertigkeit zeichnen", - "disabled_weapon": "Du kannst diese Waffe nicht verwenden", - - "hud_info": "Warte weitere {0} Sekunden", - "hud_info_no_enemy": "Kein Feind gefunden", - "active_hud_info": "Noch {0} Millisekunden aktiv", - - "skills_menu": "Fähigkeitenliste", - "no_player": "Kein passender Spieler gefunden.", - "duplicate_player": "Mehr als ein Spieler mit demselben Namen gefunden.", - "selectplayerskill_command": "Gib /t ein", - "selectplayerskill_incorrect_enemy_index": "Es wurden keine Spieler gefunden, die ausgewählt werden können.", - - "skill_not_found_setskill": "Keine solche CHATCOLORS.REDskill gefunden", - "player_not_found_setskill": "Kein solcher CHATCOLORS.REDplayer gefunden", - "correct_form_setskill": "Korrekte Verwendung: CHATCOLORS.RED!setskill ", - "correct_form_setscore": "Korrekte Verwendung: CHATCOLORS.RED!setscore ", - "done_setskill": "Fähigkeit festgelegt", - "error_setskill": "CHATCOLORS.REDskill konnte nicht festgelegt werden", - "for_setskill": "für", - - "invalid_map": "Kartenname falsch eingegeben!", - "loading_map": "Neue Karte wird geladen", - - "pause": "Spiel wurde unterbrochen", - "unpause": "Spiel wurde fortgesetzt", - "healed": "Du wurdest geheilt.", - "game_start": "Spiel gestartet!", - "reload": "Sprachen und Konfigurationen wurden neu geladen.", - "hud_on": "HUD wurde aktiviert.", - "hud_off": "HUD wurde deaktiviert.", - - "vote_started": "Abstimmung gestartet: ‚{0}‘", - "vote_timeout": "Zeitlimit für Abstimmung ‚{0}‘ abgelaufen!", - "vote_wait": "Sie müssen warten, bevor Sie eine weitere Abstimmung starten können!", - "vote_same_wait": "Sie müssen warten, bevor Sie dieselbe Abstimmung erneut starten können!", - "vote_not_enough_players": "Nicht genügend Spieler, um eine Abstimmung zu starten!", - "vote_alredy_voted": "Du hast bereits abgestimmt!", - "vote_vote": "Abstimmen", - - "bombsite_a": "Bombenplatz A", - "bombsite_b": "Bombenplatz B", - "bombplanted": "Die Bombe wurde gelegt\n{0} Sekunden bis zur Detonation", - - "teammate_skills": "Die Fähigkeiten Ihrer Teamkollegen", - "summary": "Zusammenfassung der letzten runde", - - "menu_controlls_scroll": "W/S – Scrollen", - "menu_controlls_padding": " | ", - "menu_controlls_select": "E – Auswählen" + "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", + + "your_skill": "Deine aktuelle Fertigkeit", + "enemy_skill": "Fähigkeit des Gegners", + "observer_skill": "Fähigkeit des Spielers", + "welcome_message": "Willkommen {PLAYER} bei {SERVER_NAME}", + "drawing_skill": "Eine Fertigkeit zeichnen", + "disabled_weapon": "Du kannst diese Waffe nicht verwenden", + + "hud_info": "Warte weitere {0} Sekunden", + "hud_info_no_enemy": "Kein Feind gefunden", + "active_hud_info": "Noch {0} Millisekunden aktiv", + + "skills_menu": "Fähigkeitenliste", + "no_player": "Kein passender Spieler gefunden.", + "duplicate_player": "Mehr als ein Spieler mit demselben Namen gefunden.", + "selectplayerskill_command": "Gib /t ein", + "selectplayerskill_incorrect_enemy_index": "Es wurden keine Spieler gefunden, die ausgewählt werden können.", + + "skill_not_found_setskill": "Keine solche CHATCOLORS.REDskill gefunden", + "player_not_found_setskill": "Kein solcher CHATCOLORS.REDplayer gefunden", + "correct_form_setskill": "Korrekte Verwendung: CHATCOLORS.RED!setskill ", + "correct_form_setscore": "Korrekte Verwendung: CHATCOLORS.RED!setscore ", + "done_setskill": "Fähigkeit festgelegt", + "error_setskill": "CHATCOLORS.REDskill konnte nicht festgelegt werden", + "for_setskill": "für", + + "invalid_map": "Kartenname falsch eingegeben!", + "loading_map": "Neue Karte wird geladen", + + "pause": "Spiel wurde unterbrochen", + "unpause": "Spiel wurde fortgesetzt", + "healed": "Du wurdest geheilt.", + "game_start": "Spiel gestartet!", + "reload": "Sprachen und Konfigurationen wurden neu geladen.", + "hud_on": "HUD wurde aktiviert.", + "hud_off": "HUD wurde deaktiviert.", + + "vote_started": "Abstimmung gestartet: ‚{0}‘", + "vote_timeout": "Zeitlimit für Abstimmung ‚{0}‘ abgelaufen!", + "vote_wait": "Sie müssen warten, bevor Sie eine weitere Abstimmung starten können!", + "vote_same_wait": "Sie müssen warten, bevor Sie dieselbe Abstimmung erneut starten können!", + "vote_not_enough_players": "Nicht genügend Spieler, um eine Abstimmung zu starten!", + "vote_alredy_voted": "Du hast bereits abgestimmt!", + "vote_vote": "Abstimmen", + + "bombsite_a": "Bombenplatz A", + "bombsite_b": "Bombenplatz B", + "bombplanted": "Die Bombe wurde gelegt\n{0} Sekunden bis zur Detonation", + + "teammate_skills": "Die Fähigkeiten Ihrer Teamkollegen", + "summary": "Zusammenfassung der letzten runde", + + "menu_controlls_scroll": "W/S – Scrollen", + "menu_controlls_padding": " | ", + "menu_controlls_select": "E – Auswählen" } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/lang/en.json b/jRandomSkills - SRC Files/src/lang/en.json index 80f90d1..f972310 100644 --- a/jRandomSkills - SRC Files/src/lang/en.json +++ b/jRandomSkills - SRC Files/src/lang/en.json @@ -275,9 +275,9 @@ "bankrupt_player_info": "Player '{0}' has gone bankrupt.", "bankrupt_select_info": "Pick a player to go bankrupt:", - "muhammed": "Muhammed", - "muhammed_desc": "You explode upon death, killing nearby players", - "muhammed_explosion": "ALLAHU AKBAR!!!", + "deathbomb": "Death Bomb", + "deathbomb_desc": "You explode upon death, killing nearby players", + "deathbomb_explosion": "Kaboom!", "ninja": "Ninja", "ninja_desc": "Standing still increases your invisibility by 33%, crouching by 33%, and holding a knife by 33%", diff --git a/jRandomSkills - SRC Files/src/lang/fr.json b/jRandomSkills - SRC Files/src/lang/fr.json index d648e66..02c5543 100644 --- a/jRandomSkills - SRC Files/src/lang/fr.json +++ b/jRandomSkills - SRC Files/src/lang/fr.json @@ -275,9 +275,9 @@ "bankrupt_player_info": "Le joueur « {0} » est en faillite.", "bankrupt_select_info": "Mettre un joueur en faillite :", - "muhammed": "Bombe", - "muhammed_desc": "Vous explosez à votre mort, tuant les joueurs proches", - "muhammed_explosion": "ALLAHU AKBAR!!!", + "deathbomb": "Bombe", + "deathbomb_desc": "Vous explosez à votre mort, tuant les joueurs proches", + "deathbomb_explosion": "Kaboom!", "ninja": "Ninja", "ninja_desc": "Rester immobile augmente votre invisibilité de 33%, s’accroupir de 33%, et tenir un couteau de 33%", diff --git a/jRandomSkills - SRC Files/src/lang/pl.json b/jRandomSkills - SRC Files/src/lang/pl.json index 2570ed2..321c9d9 100644 --- a/jRandomSkills - SRC Files/src/lang/pl.json +++ b/jRandomSkills - SRC Files/src/lang/pl.json @@ -275,9 +275,9 @@ "moneyswap_player_info": "Wymieniłeś swoje pieniądze z graczem '{0}'.", "moneyswap_select_info": "Zamień się kasą z graczem:", - "muhammed": "Muhammed", - "muhammed_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu", - "muhammed_explosion": "ALLAHU AKBAR!!!", + "deathbomb": "Ludzka bomba", + "deathbomb_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu", + "deathbomb_explosion": "Kaboom!", "ninja": "Ninja", "ninja_desc": "Stojąc nieruchomo zwiększasz swoją niewidzialność o 33%, kucając o 33%, a trzymając nóż o 33%", diff --git a/jRandomSkills - SRC Files/src/lang/pt-br.json b/jRandomSkills - SRC Files/src/lang/pt-br.json index 2e53cab..b953a61 100644 --- a/jRandomSkills - SRC Files/src/lang/pt-br.json +++ b/jRandomSkills - SRC Files/src/lang/pt-br.json @@ -52,10 +52,10 @@ "blademaster": "Mestre das Lâminas", "blademaster_desc": "Enquanto segura a faca, você tem chance de desviar de um tiro", - + "bunnyhop": "Coelho", "bunnyhop_desc": "Você ganha \"BunnyHop\" automático", - + "c4camouflage": "Camuflagem C4", "c4camouflage_desc": "Você fica invisível enquanto segura a bomba", @@ -68,122 +68,122 @@ "catapult": "Catapulta", "catapult_desc": "Você tem uma chance aleatória de lançar um inimigo para cima", "catapult_desc2": "Sua chance de lançar um inimigo ao acertá-lo é: {0}%", - + "chicken": "Galinha", "chicken_desc": "Você é uma galinha com +10% de movimento mais rápido e -50 HP", - + "chillout": "Esqueci a Senha", "chillout_desc": "Plantar a bomba leva significativamente mais tempo", - + "cutter": "Corte Rápido", "cutter_desc": "Você mata instantaneamente com a faca", "cypher": "CFTV", "cypher_desc": "Clique em [css_useSkill] para criar/mudar para uma câmera", "cypher_nospace": "A câmera deve ser posicionada em ângulo reto com a parede", - + "darkness": "Escuridão", "darkness_desc": "Aplica um efeito de escuridão a um inimigo escolhido", "darkness_enemy_info": "Que as luzes se apaguem.", "darkness_player_info": "A escuridão tomou conta do jogador '{0}'.", "darkness_select_info": "Escolha jogador: escuridão:", - + "deactivator": "Desativador", "deactivator_desc": "Escolha um jogador para desativar a habilidade", "deactivator_enemy_info": "Sua habilidade foi desativada.", "deactivator_player_info": "A habilidade do jogador '{0}' foi desativada.", "deactivator_select_info": "Desativar skill do jogador:", - + "deaf": "Surdo", "deaf_desc": "Escolha um jogador para desativar todos os sons", "deaf_enemy_info": "Seus fones de ouvido saíram do jogo.", "deaf_player_info": "O som foi desativado para o jogador '{0}'.", "deaf_select_info": "Silenciar jogador:", - + "disarmament": "Desarmamento", "disarmament_desc": "Você tem uma chance aleatória de fazer um inimigo dropar a arma ao acertá-lo", "disarmament_desc2": "Sua chance de desarmar um inimigo é: {0}%", "distancer": "Medidor de Distância", "distancer_desc": "Você pode ver a distância até o inimigo mais próximo", - + "dash": "Impulso", "dash_desc": "Pule novamente para receber um impulso", - + "dracula": "Drácula", "dracula_desc": "Acertar um inimigo restaura sua vida igual a ao dano causado", - + "duplicator": "ctrl+c ctrl+v", "duplicator_desc": "Escolha um jogador para copiar a habilidade", "duplicator_player_info": "A habilidade do jogador '{0}' foi copiada.", "duplicator_select_info": "Copiar skill do jogador:", - + "dwarf": "Anão", "dwarf_desc": "Sua altura agora é aleatória", "dwarf_desc2": "Seu multiplicador de altura é: {0}x", - + "enemyspawn": "Spawn Inimigo", "enemyspawn_desc": "Clique em [css_useSkill] para se teletransportar para a base inimiga", - + "explosiveshot": "Tiro Explosivo", "explosiveshot_desc": "Chance aleatória de disparar uma bala explosiva enquanto atira", "explosiveshot_desc2": "Sua chance de disparar uma bala explosiva: {0}%", - + "falconeye": "Olho de Águia", "falconeye_desc": "Clique em [css_useSkill] para ativar uma câmera 360 com visão aérea", - + "fastreload": "Recarga Rápida", "fastreload_desc": "Clique em [css_useSkill] para recarregar a arma que você está segurando", - + "flash": "Ligeirinho", "flash_desc": "Velocidade de movimentação aleatória no início da rodada", "flash_desc2": "Seu multiplicador de velocidade é: {0}x", - + "fortnite": "Fortnite", "fortnite_desc": "Clique em [css_useSkill] para criar uma barreira destrutível", - + "fragilebomb": "Bomba Frágil", "fragilebomb_desc": "Atirar na bomba a danifica", "fragilebomb_bomb_health": "Vida da bomba", - + "friendlyfire": "Fogo Amigo", "friendlyfire_desc": "Atirar em companheiros de equipe os cura", - + "frozendecoy": "Decoy Congelante", "frozendecoy_desc": "Sua decoy congela os players próximos", - + "gambler": "Tigrinho", "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", - + "glaz": "Smoke Transparente", "glaz_desc": "Smokes tornam-se transparentes para você", - + "glitch": "Sem Mapa", "glitch_desc": "Desativa o radar de um inimigo escolhido", "glitch_enemy_info": "Seu radar foi desativado.", "glitch_player_info": "O radar do jogador '{0}' foi desativado.", "glitch_select_info": "Desativar radar do jogador:", - + "glue": "Semtex", "glue_desc": "Suas granadas grudam nas paredes", - + "godmode": "Modo Deus", "godmode_desc": "Clique em [css_useSkill] para se tornar imortal por alguns segundos", "godmode_off": "Imortalidade desativada", "godmode_on": "Imortalidade ativada", - + "grenadier": "Bomberman", "grenadier_desc": "Você tem HEs infinitas", - + "healingsmoke": "Smoke Amiga", "healingsmoke_desc": "Suas smokes curam", - + "hermit": "Sanguessuga", "hermit_desc": "Matar restaura munição e uma parte da sua vida", @@ -199,7 +199,7 @@ "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", @@ -208,10 +208,10 @@ "impostor": "Impostor", "impostor_desc": "Você começa a rodada vestido do time inimigo", - + "infiniteammo": "Munição Infinita", "infiniteammo_desc": "Você recebe munição infinita para todas as suas armas", - + "jackal": "Lesma", "jackal_desc": "Cada adversário deixa um rastro atrás de si", @@ -220,37 +220,37 @@ "jammer_enemy_info": "Sua mira foi desativada.", "jammer_player_info": "A mira do jogador '{0}' foi desativada.", "jammer_select_info": "Desativar mira do jogador:", - + "jester": "Palhaço", "jester_desc": "No modo bobo você não pode causar nem receber dano. Esse modo muda a cada poucos segundos.", "jester_mode": "Modo Palhaço", "jester_on": "LIG.", "jester_off": "DESL.", - + "jumpban": "Perneta", "jumpban_desc": "Escolha um jogador que não poderá pular", "jumpban_enemy_info": "Cortaram as suas pernas.", "jumpban_player_info": "O jogador '{0}' não pode mais pular.", "jumpban_select_info": "Banir pulo do jogador:", - + "jumpingjack": "Pula-Pula", "jumpingjack_desc": "Pular restaura vida", - + "killerflash": "Flash Mortal", "killerflash_desc": "Qualquer pessoa cega pela sua flash morre (incluindo você)", - + "lifeswap": "Troca de Vida", "lifeswap_desc": "Escolha um jogador para trocar de vida", "lifeswap_enemy_info": "Alguém pegou sua vida emprestada.", "lifeswap_player_info": "Você trocou vida com o jogador '{0}'.", "lifeswap_select_info": "Trocar de vida com jogador:", - + "longknife": "Espada", "longknife_desc": "Um ataque com faca causa danos independentemente da distância", - + "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", @@ -262,10 +262,10 @@ "magnifier_enemy_info": "Seu campo de visão foi distorcido!", "magnifier_player_info": "O jogador ‘{0}’ foi forçado a entrar no modo zoom.", "magnifier_select_info": "Ampliar tela do jogador:", - + "medic": "Médico", "medic_desc": "Clique em [css_useSkill] para usar uma injeção que restaura 50 de vida", - + "miner": "Mineiro de Bombas", "miner_desc": "Sua granada HE só explode quando há um inimigo por perto", @@ -274,131 +274,131 @@ "moneyswap_enemy_info": "Você provavelmente virou classe B", "moneyswap_player_info": "Você trocou dinheiro com o jogador '{0}'.", "moneyswap_select_info": "Trocar dinheiro c/ jogador:", - - "muhammed": "Muhammed", - "muhammed_desc": "Você explode ao morrer, matando os jogadores próximos", - "muhammed_explosion": "ALLAHU AKBAR!!!", - + + "deathbomb": "Bomba mortal", + "deathbomb_desc": "Você explode ao morrer, matando os jogadores próximos", + "deathbomb_explosion": "Kaboom!", + "ninja": "Ninja", "ninja_desc": "Ficar parado aumenta sua invisibilidade em 33%, agachar em 33%, e segurar uma faca em 33%", - + "nonades": "Imune a Granadas", "nonades_desc": "Granadas não causam dano a você", - + "norecoil": "Sem Recoil", "norecoil_desc": "Sem recoil ao atirar", - + "noclip": "NoClip", "noclip_desc": "Clique em [css_useSkill] para ativar noclip por poucos segundos", - + "oneshot": "Ignorante", "oneshot_desc": "Acertar um inimigo o mata instantaneamente", - + "onlyhead": "Só na Cabeçinha", "onlyhead_desc": "Você só recebe headshot", - + "paweljumper": "Parkourista", "paweljumper_desc": "Você recebe um número aleatório de pulos extras", "paweljumper_desc2": "Você ganha {0} pulos extras", - + "phoenix": "Fênix", "phoenix_desc": "Você tem uma chance aleatória de renascer após a morte", "phoenix_desc2": "Sua chance de renascer após a morte: {0}%", "phoenix_respawn": "Você foi ressuscitado das cinzas graças ao poder de: CHATCOLORS.REDPhoenix", - + "psychicdefusing": "Desarme Psíquico", "psychicdefusing_desc": "Quando você está proximo da bomba, começa a desarmá-la automaticamente", "psychicdefusing_hud_info": "{0} segundos restantes para desarmar", - + "pilot": "Jetpack", "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", "poison_enemy_info": "Você foi envenenado.", "poison_player_info": "O jogador '{0}' foi envenenado.", "poison_select_info": "Envenenar jogador:", - + "primaryban": "Sem Rifle", "primaryban_desc": "Escolha um jogador que não poderá usar rifles", "primaryban_enemy_info": "Você não pode mais usar rifles.", "primaryban_player_info": "O jogador '{0}' não pode mais usar rifles.", "primaryban_select_info": "Banir rifles do jogador:", - + "prosthesis": "Prótese", "prosthesis_desc": "Braços e pernas são à prova de balas", - + "push": "Empurrão", "push_desc": "Você tem uma chance aleatória de empurrar um inimigo ao acertá-lo", "push_desc2": "Suas chances de empurrar o inimigo são: {0}%", - + "pyro": "Pirotecnia", "pyro_desc": "Molotov recupera vida", - + "quickshot": "Tiro Rápido", "quickshot_desc": "Todas as balas são disparadas extremamente rapidas", - + "radarhack": "Hack de Mapa", "radarhack_desc": "Inimigos são visíveis no mapa", - + "rambo": "Rambo", "rambo_desc": "Você recebe uma quantidade aleatória de vida no início da rodada", - + "randomweapon": "Arma Aleatória", "randomweapon_desc": "Clique em [css_useSkill] para receber uma arma aleatória", - + "rezombie": "Walking Dead", "rezombie_desc": "Após morrer, você renasce como um zumbi com mais vida porém sem armas", - + "reactivearmor": "Armadura Reativa", "reactivearmor_desc": "A armadura absorve o primeiro dano recebido", - + "regeneration": "Regeneração", "regeneration_desc": "Você restaura vida a cada poucos segundos", - + "replicator": "Clone", "replicator_desc": "Clique em [css_useSkill] para criar um clone que causa dano ao ser atingido", - + "retreat": "De Volta as Origens", "retreat_desc": "Clique em [css_useSkill] para retornar ao spawn", - + "returntosender": "Devolução ao Remetente", "returntosender_desc": "O primeiro tiro em um inimigo o envia de volta a sua base", - + "richboy": "Filhinho de Papai", "richboy_desc": "Você recebe uma quantidade aleatória de dinheiro no início da rodada", - + "robinhood": "Robin Hood", "robinhood_desc": "Atirar em um inimigo rouba seu dinheiro", - + "rubber": "Balas de Borracha", "rubber_desc": "Seus tiros deixam os jogadores lentos ao serem atingidos", - + "saper": "Especialista", "saper_desc": "Você pode plantar e desarmar bombas mais rápido", - + "secondlife": "Segunda Chance", "secondlife_desc": "Após morrer, você renasce com a mesma quantidade de vida", - + "shade": "Sombra", "shade_desc": "Você tem uma chance aleatória de teletransportar para trás de um inimigo ao atingi-lo", "shade_desc2": "Suas chances de se teletransportar para trás de um inimigo atingido são: {0}%", "shade_nospace": "Sem espaço disponível", - + "shortbomb": "Pavio Longo", "shortbomb_desc": "A bomba demora muito mais para explodir", - + "silent": "Shhhiu!", "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", @@ -406,51 +406,51 @@ "soldier": "Soldado", "soldier_desc": "Seus tiros causam mais dano", "soldier_desc2": "Seu multiplicador de dano é: {0}x", - + "soundmaker": "Criador de Som", "soundmaker_desc": "Clique em [css_useSkill] para tocar um som para cada inimigo", - + "spectator": "Espectador", "spectator_desc": "Clique em [css_useSkill] para ver a tela de um inimigo aleatório", - + "swapposition": "Troca de Posição", "swapposition_desc": "Clique em [css_useSkill] para trocar de lugar com um inimigo aleatório", - + "teleporter": "Teletransportador", "teleporter_desc": "Você 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", "thief_enemy_info": "Sua habilidade foi roubada.", "thief_player_info": "A habilidade do jogador '{0}' foi roubada.", "thief_select_info": "Roubar skill do jogador:", "thief_incorrect_skill": "Esta habilidade não pode ser selecionada!", - + "thirdeye": "Terceiro Olho", "thirdeye_desc": "Clique em [css_useSkill] para ativar a terceira pessoa", - + "thorns": "Porco Espinho", "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", - + "wallhack": "Wallhack", "wallhack_desc": "Você pode ver inimigos através das paredes", - + "watchmaker": "Relojoeiro", "watchmaker_desc": "Cada arremesso de granada altera o tempo da rodada", "watchmaker_ct": "Tempo da rodada reduzido em {0} segundos.", "watchmaker_tt": "Tempo da rodada estendido em {0} segundos.", - + "weaponsswap": "Troca de Armas", "weaponsswap_desc": "Clique em [css_useSkill] para trocar armas com um inimigo aleatório", "weaponsswap_hud_info2": "Você não tem arma para trocar", - + "weightless": "Gravidade Zero", "weightless_desc": "Suas granadas não são afetadas pela gravidade e voam mais rápido", @@ -461,24 +461,24 @@ "zeus": "Zeus", "zeus_desc": "Zeus x27 recarrega instantaneamente", - + "your_skill": "Sua habilidade atual", "enemy_skill": "Habilidade do inimigo", "observer_skill": "Habilidade do jogador", "welcome_message": "Bem-vindo {PLAYER} ao {SERVER_NAME}!\nVersão atual do jRandomSkills: {VERSION} ({SKILLS_COUNT} habilidades).\n\nCriado originalmente por:\n{AUTHOR1}\nModificado e aprimorado por:\n{AUTHOR2}\nDiscord oficial: https://discord.gg/9H8EZYBpPF", "drawing_skill": "Sorteando uma habilidade", "disabled_weapon": "Você não pode usar esta arma", - + "hud_info": "Espere mais {0} segundos", "hud_info_no_enemy": "Nenhum inimigo encontrado", "active_hud_info": "Ativo por mais {0} milissegundos", - + "skills_menu": "Lista de Habilidades", "no_player": "Nenhum jogador correspondente encontrado.", "duplicate_player": "Mais de um jogador encontrado com o mesmo nome.", "selectplayerskill_command": "Digite /t", "selectplayerskill_incorrect_enemy_index": "Não foram encontrados jogadores para selecionar.", - + "skill_not_found_setskill": "Nenhuma habilidade CHATCOLORS.RED encontrada", "player_not_found_setskill": "Nenhum jogador CHATCOLORS.RED encontrado", "correct_form_setskill": "Uso correto: CHATCOLORS.RED!setskill ", @@ -486,10 +486,10 @@ "done_setskill": "Habilidade definida", "error_setskill": "Falha ao definir a habilidade CHATCOLORS.RED", "for_setskill": "para", - + "invalid_map": "Nome do mapa inválido!", "loading_map": "Carregando um novo mapa", - + "pause": "Partida pausada.", "unpause": "Partida retomada.", "healed": "Você foi curado.", @@ -497,7 +497,7 @@ "reload": "Os idiomas e as configurações foram recarregados.", "hud_on": "O HUD foi ativado.", "hud_off": "O HUD foi desativado.", - + "vote_started": "Votação iniciada: '{0}'", "vote_timeout": "Votação '{0}' expirou!", "vote_wait": "Você precisa esperar antes de iniciar outra votação!", @@ -505,14 +505,14 @@ "vote_not_enough_players": "Não há jogadores suficientes para iniciar uma votação!", "vote_alredy_voted": "Você já votou!", "vote_vote": "Votar", - + "bombsite_a": "Bombsite A", "bombsite_b": "Bombsite B", "bombplanted": "A bomba foi plantada\n{0} segundos até a detonação", - + "teammate_skills": "Habilidades dos seus companheiros de equipe", "summary": "Resumo da última rodada", - + "menu_controlls_scroll": "W/S - Rolar", "menu_controlls_padding": " | ", "menu_controlls_select": "E - Selecionar" diff --git a/jRandomSkills - SRC Files/src/lang/ru.json b/jRandomSkills - SRC Files/src/lang/ru.json new file mode 100644 index 0000000..e8fc4c3 --- /dev/null +++ b/jRandomSkills - SRC Files/src/lang/ru.json @@ -0,0 +1,519 @@ +{ + "none": "Нет навыка", + "none_desc": "У вас нет навыка", + + "aimbot": "Аимбот", + "aimbot_desc": "Каждое ваше попадание считается хедшотом", + + "aimlock": "Захват прицела", + "aimlock_desc": "Нажмите [css_useSkill], чтобы зафиксировать прицел на ближайшем враге", + + "anomaly": "Аномалия", + "anomaly_desc": "Вы отматываете время на несколько секунд назад", + + "antyflash": "Антифлеш", + "antyflash_desc": "Вы невосприимчивы к флешкам, а ваши флешки действуют 7 секунд", + + "antyhead": "Железная голова", + "antyhead_desc": "Вы не получаете урон от выстрелов в голову", + + "areareaper": "Жнец зоны", + "areareaper_desc": "Вы можете выбрать бомб-сайт для деактивации", + "areareaper_incorrect_site": "Такой бомб-сайт не найден.", + "areareaper_no_site": "Бомб-сайты не найдены.", + "areareaper_select_info": "Выберите сайт для деактивации:", + "areareaper_site_disabled": "Бомб-сайт {0} деактивирован — бомбу нельзя установить там!", + "areareaper_used_info": "Ваш навык уже был использован.", + "areareaper_bombsite_disabled": "Этот бомб-сайт отключён!", + + "armored": "Бронированный", + "armored_desc": "У вас случайный множитель получаемого урона", + "armored_desc2": "Ваш множитель получаемого урона: {0}x", + + "assassin": "Ассасин", + "assassin_desc": "Вы наносите увеличенный урон врагам со спины", + + "astronaut": "Астронавт", + "astronaut_desc": "В начале раунда вам выдаётся случайное значение гравитации", + "astronaut_desc2": "Ваша случайная гравитация: {0}x", + + "moneyswap": "Налоговик", + "moneyswap_desc": "Выберите игрока для обмена деньгами", + "moneyswap_enemy_info": "Налоговая служба добралась до вас.", + "moneyswap_player_info": "Вы обменялись деньгами с игроком '{0}'.", + "moneyswap_select_info": "Обменять деньги с игроком:", + + "baseball": "Бейсболист", + "baseball_desc": "Ваша ложная граната отскакивает от стен и мгновенно убивает врага при попадании", + + "behind": "Разворот врага", + "behind_desc": "Есть шанс развернуть врага на 180° при попадании", + "behind_desc2": "Ваш шанс развернуть врага при попадании: {0}%", + + "blademaster": "Мастер клинка", + "blademaster_desc": "С ножом в руках у вас высокий шанс отразить выстрел", + + "bunnyhop": "Заяц", + "bunnyhop_desc": "Вы получаете автоматический «БанниХоп»", + + "c4camouflage": "Маскировка бомбы", + "c4camouflage_desc": "Вы невидимы, пока несёте бомбу", + + "carefulbullets": "Осторожные пули", + "carefulbullets_desc": "Выберите игрока, который будет получать урон за каждое ваше промахивание", + "carefulbullets_enemy_info": "Точность теперь буквально имеет значение.", + "carefulbullets_player_info": "'{0}' теперь должен быть осторожнее.", + "carefulbullets_select_info": "Промахи ранят игрока:", + + "catapult": "Катапульта", + "catapult_desc": "Есть шанс подбросить врага вверх при попадании", + "catapult_desc2": "Ваш шанс подбросить врага при попадании: {0}%", + + "chicken": "Курица", + "chicken_desc": "Вы получаете модель курицы + 10% к скорости передвижения - 50 HP", + + "chillout": "Чилл", + "chillout_desc": "Установка бомбы занимает значительно больше времени", + + "cutter": "Резак", + "cutter_desc": "Мгновенное убийство ножом", + + "cypher": "Шифровальщик", + "cypher_desc": "Нажмите [css_useSkill], чтобы создать/переключиться на камеру", + "cypher_nospace": "Камера должна быть расположена под прямым углом к стене", + + "darkness": "Тьма", + "darkness_desc": "Накладывает эффекть тьмы на выбранного врага", + "darkness_enemy_info": "Пусть свет погаснет.", + "darkness_player_info": "Тьма охватила игрока '{0}'.", + "darkness_select_info": "Выберите игрока для тьмы:", + + "deactivator": "Деактиватор", + "deactivator_desc": "Выберите игрока, чей навык вы хотите отключить", + "deactivator_enemy_info": "Ваш навык был отключён.", + "deactivator_player_info": "Навык игрока '{0}' был отключён.", + "deactivator_select_info": "Отключить навык игрока:", + + "deaf": "Глухой", + "deaf_desc": "Выберите игрока, у которого будет отключён весь звук", + "deaf_enemy_info": "Ваши наушники покинули игру.", + "deaf_player_info": "Звук отключён для игрока '{0}'.", + "deaf_select_info": "Отключить звук для игрока:", + + "disarmament": "Разоружение", + "disarmament_desc": "Есть шанс заставить врага выронить оружие при попадании", + "disarmament_desc2": "Ваш шанс разоружить врага: {0}%", + + "distancer": "Дальномер", + "distancer_desc": "Вы можете видеть расстояние до ближайшего врага", + + "dash": "Рывок", + "dash_desc": "Выполните второй прыжок для рывка", + + "dracula": "Дракула", + "dracula_desc": "Попадание по врагу восстанавливает здоровье в размере процента от нанесённого урона", + + "duplicator": "Дупликатор", + "duplicator_desc": "Выберите игрока, чтобы скопировать его навык", + "duplicator_player_info": "Навык игрока '{0}' был скопирован.", + "duplicator_select_info": "Скопировать навык игрока:", + + "dwarf": "Гном", + "dwarf_desc": "Случайный размер персонажа в начале раунда", + "dwarf_desc2": "Ваш множитель размера: {0}x", + + "enemyspawn": "Спавн врагов", + "enemyspawn_desc": "Нажмите [css_useSkill], чтобы телепортироваться на спавн врагов", + + "explosiveshot": "Взрывной выстрел", + "explosiveshot_desc": "Случайный шанс выстрелить взрывной пулей при стрельбе", + "explosiveshot_desc2": "Ваш шанс выстрелить взрывной пулей: {0}%", + + "falconeye": "Глаз сокола", + "falconeye_desc": "Нажмите [css_useSkill], чтобы активировать камеру с высоты птичьего полёта", + + "fastreload": "Быстрая перезарядка", + "fastreload_desc": "Нажмите [css_useSkill], чтобы перезарядить текущее оружие", + + "flash": "Флеш", + "flash_desc": "Случайная скорость игрока в начале раунда", + "flash_desc2": "Ваш множитель скорости: {0}x", + + "fortnite": "Фортнайт", + "fortnite_desc": "Нажмите [css_useSkill], чтобы создать разрушаемую баррикаду", + + "fragilebomb": "Хрупкая бомба", + "fragilebomb_desc": "Стрельба по бомбе повреждает её", + "fragilebomb_bomb_health": "Здоровье бомбы", + + "friendlyfire": "Дружественный огонь", + "friendlyfire_desc": "Стрельба по союзникам лечит их", + + "frozendecoy": "Замораживающая ловушка", + "frozendecoy_desc": "Ваша ложная граната замораживает всех ближайших игроков", + + "gambler": "Азартный игрок", + "gambler_desc": "Выберите навык из предложенного списка.", + "gambler_select_info": "Выберите ваш навык:", + "gambler_more": "#00FF00|Обновить за ${0}", + "gambler_no_money": "Недостаточно денег.", + + "ghost": "Призрак", + "ghost_desc": "Вы полностью невидимы", + + "glaz": "Глаз", + "glaz_desc": "Вы видите сквозь дымовые гранаты", + + "glitch": "Глитч", + "glitch_desc": "Отключает радар выбранному врагу", + "glitch_enemy_info": "Ваш радар был отключён.", + "glitch_player_info": "Радар игрока '{0}' был отключён.", + "glitch_select_info": "Отключить радар игроку:", + + "glue": "Клей", + "glue_desc": "Ваши гранаты прилипают к стенам", + + "godmode": "Режим бога", + "godmode_desc": "Нажмите [css_useSkill], чтобы стать неуязвимым на короткое время", + "godmode_off": "Неуязвимость отключена", + "godmode_on": "Неуязвимость включена", + + "grenadier": "Гренадёр", + "grenadier_desc": "У вас бесконечные осколочные гранаты", + + "healingsmoke": "Лечащий дым", + "healingsmoke_desc": "Ваши дымовые гранаты лечат", + + "hermit": "Отшельник", + "hermit_desc": "Убийства восстанавливают боеприпасы и часть здоровья", + + "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": "Вы начинаете раунд с моделью игрока вражеской команды", + + "infiniteammo": "Бесконечные патроны", + "infiniteammo_desc": "Вы получаете бесконечные патроны для всего оружия", + + "jackal": "Трекер", + "jackal_desc": "Каждый противник оставляет за собой след", + + "jammer": "Глушилка", + "jammer_desc": "Выберите игрока, чтобы отключить его прицел", + "jammer_enemy_info": "Ваш прицел был отключён.", + "jammer_player_info": "Прицел игрока '{0}' был отключён.", + "jammer_select_info": "Отключить прицел игроку:", + + "jester": "Шут", + "jester_desc": "В режиме шута вы не можете получать или наносить урон. Режим переключается каждые несколько секунд.", + "jester_mode": "Режим шута", + "jester_on": "ВКЛ", + "jester_off": "ВЫКЛ", + + "jumpban": "Безногий", + "jumpban_desc": "Выберите игрока, который не сможет прыгать", + "jumpban_enemy_info": "Кто-то отрезал вам ноги.", + "jumpban_player_info": "Игрок '{0}' больше не может прыгать.", + "jumpban_select_info": "Запретить прыжки игроку:", + + "jumpingjack": "Прыгающий Джек", + "jumpingjack_desc": "Прыжки восстанавливают здоровье", + + "killerflash": "Смертельная флешка", + "killerflash_desc": "Любой, полностью ослеплённый вашей флешкой, погибает (включая вас)", + + "lifeswap": "Обмен жизнями", + "lifeswap_desc": "Выберите игрока для обмена здоровьем", + "lifeswap_enemy_info": "Кто-то занял ваше здоровье.", + "lifeswap_player_info": "Вы обменялись здоровьем с игроком '{0}'.", + "lifeswap_select_info": "Обменять здоровье с игроком:", + + "longknife": "Длинный нож", + "longknife_desc": "Удар ножом наносит урон независимо от расстояния", + + "longzeus": "Длинный Зевс", + "longzeus_desc": "Зевс наносит урон независимо от расстояния", + + "magneticdecoy": "Магнитная ловушка", + "magneticdecoy_desc": "Ваша ложная граната притягивает ближайших игроков к себе", + + "magneto": "Магнето", + "magneto_desc": "Все вражеские гранаты отталкиваются от вас", + + "magnifier": "Лупа", + "magnifier_desc": "Приближает экран врага, уменьшая его поле зрения", + "magnifier_enemy_info": "Ваше поле зрения было искажено!", + "magnifier_player_info": "Игрок '{0}' принудительно переведён в режим увеличения.", + "magnifier_select_info": "Увеличить экран игрока:", + + "medic": "Медик", + "medic_desc": "Нажмите [css_useSkill], чтобы использовать заряд лечения, восстанавливающий 50 HP", + + "miner": "Минёр", + "miner_desc": "Ваша осколочная граната взрывается только когда рядом есть враг", + + "bankrupt": "Банкрот", + "bankrupt_desc": "Выберите игрока, который потеряет все свои деньги", + "bankrupt_enemy_info": "Вы обанкротились.", + "bankrupt_player_info": "Игрок '{0}' обанкротился.", + "bankrupt_select_info": "Выберите игрока для банкротства:", + + "deathbomb": "Смертельная бомба", + "deathbomb_desc": "Вы взрываетесь при смерти, убивая ближайших игроков", + "deathbomb_explosion": "АЛЛАХУ АКБАР!!!", + + "ninja": "Ниндзя", + "ninja_desc": "Стоя на месте, ваша невидимость увеличивается на 33%, в приседе на 33%, с ножом на 33%", + + "nonades": "Антигранаты", + "nonades_desc": "Гранаты не наносят вам урон", + + "norecoil": "Фокус", + "norecoil_desc": "Нет отдачи при стрельбе", + + "noclip": "Ноклип", + "noclip_desc": "Нажмите [css_useSkill], чтобы включить ноклип на короткое время", + + "oneshot": "Один выстрел", + "oneshot_desc": "Попадание по врагу мгновенно убивает его", + + "onlyhead": "Только голова", + "onlyhead_desc": "Вы получаете урон только в голову", + + "paweljumper": "Павел-прыгун", + "paweljumper_desc": "Вы получаете случайное количество дополнительных прыжков", + "paweljumper_desc2": "Вы получаете {0} дополнительных прыжков", + + "phoenix": "Феникс", + "phoenix_desc": "Есть шанс возродиться после смерти", + "phoenix_desc2": "Ваш шанс возродиться после смерти: {0}%", + "phoenix_respawn": "Вы были воскрешены из пепла благодаря силе CHATCOLORS.REDФеникса", + + "psychicdefusing": "Психическое разминирование", + "psychicdefusing_desc": "Когда вы рядом с бомбой, вы начинаете её разминировать", + "psychicdefusing_hud_info": "{0} секунд осталось до разминирования", + + "pilot": "Пилот", + "pilot_desc": "Летайте ограниченное время. Двойной прыжок для полёта", + "pilot_hud_info": "Топливо", + + "planter": "Свободная установка", + "planter_desc": "Вы можете установить бомбу где угодно, с таймером взрыва 60 секунд.", + "planter_planting": "Установка ({0})...", + + "poison": "Яд", + "poison_desc": "Выберите игрока, который будет получать урон каждые несколько секунд", + "poison_enemy_info": "Вы были отравлены.", + "poison_player_info": "Игрок '{0}' был отравлен.", + "poison_select_info": "Отравить игрока:", + + "primaryban": "Без винтовок", + "primaryban_desc": "Выберите игрока, который не сможет использовать винтовки", + "primaryban_enemy_info": "Вы больше не можете использовать винтовки.", + "primaryban_player_info": "Игрок '{0}' больше не может использовать винтовки.", + "primaryban_select_info": "Запретить винтовки игроку:", + + "prosthesis": "Протез", + "prosthesis_desc": "Руки и ноги защищены от пуль", + + "push": "Толкач", + "push_desc": "Есть шанс оттолкнуть врага назад при попадании", + "push_desc2": "Ваш шанс оттолкнуть врага: {0}%", + + "pyro": "Пироман", + "pyro_desc": "Молотов восстанавливает здоровье", + + "quickshot": "Скорострельность", + "quickshot_desc": "Все пули выпускаются очень быстро", + + "radarhack": "Взлом радара", + "radarhack_desc": "Враги видны на радаре", + + "rambo": "Рэмбо", + "rambo_desc": "Вы получаете случайное количество здоровья в начале раунда", + + "randomweapon": "Случайное оружие", + "randomweapon_desc": "Нажмите [css_useSkill], чтобы получить случайное оружие", + + "rezombie": "Ре-зомби", + "rezombie_desc": "После смерти вы возрождаетесь как зомби с увеличенным здоровьем и без оружия", + + "reactivearmor": "Реактивная броня", + "reactivearmor_desc": "Броня поглощает первый полученный урон", + + "regeneration": "Регенерация", + "regeneration_desc": "Вы восстанавливаете здоровье каждые несколько секунд", + + "replicator": "Репликатор", + "replicator_desc": "Нажмите [css_useSkill], чтобы создать копию, наносящую урон при попадании", + + "retreat": "Отступление", + "retreat_desc": "Нажмите [css_useSkill], чтобы вернуться на спавн", + + "returntosender": "Вернуть отправителю", + "returntosender_desc": "Первое попадание по врагу отправляет его обратно на спавн", + + "richboy": "Богач", + "richboy_desc": "Вы получаете случайную сумму денег в начале раунда", + + "robinhood": "Робин Гуд", + "robinhood_desc": "Нанесение урона врагу крадёт его деньги", + + "rubber": "Резиновые пули", + "rubber_desc": "Ваши пули значительно замедляют игроков", + + "saper": "Сапёр", + "saper_desc": "Вы можете устанавливать и обезвреживать бомбы быстрее", + + "secondlife": "Второй шанс", + "secondlife_desc": "После смерти вы возрождаетесь с тем же количеством здоровья", + + "shade": "Тень", + "shade_desc": "Есть шанс телепортироваться за спину врагу при попадании", + "shade_desc2": "Ваш шанс телепортироваться за спину врагу: {0}%", + "shade_nospace": "Нет места", + + "shortbomb": "Короткий фитиль", + "shortbomb_desc": "Бомба взрывается гораздо быстрее", + + "silent": "Тишина", + "silent_desc": "Ваши шаги и прыжки не слышны ДРУГИМ игрокам", + + "smoker": "Курильщик", + "smoker_desc": "Ваши дымовые гранаты никогда не заканчиваются", + + "sniperelite": "Снайпер-элита", + "sniperelite_customname": "Навык снайпера-элиты", + "sniperelite_desc": "Нажмите [css_useSkill], чтобы заменить текущее оружие на AWP", + + "soldier": "Солдат", + "soldier_desc": "У вас случайный множитель урона", + "soldier_desc2": "Ваш множитель урона: {0}x", + + "soundmaker": "Звуковик", + "soundmaker_desc": "Время от времени вы слышите крики игроков", + + "spectator": "Наблюдатель", + "spectator_desc": "Нажмите [css_useSkill], чтобы наблюдать за случайным врагом", + + "swapposition": "Обмен позициями", + "swapposition_desc": "Нажмите [css_useSkill], чтобы поменяться местами со случайным врагом", + + "teleporter": "Телепортер", + "teleporter_desc": "Есть шанс поменяться местами с врагом при попадании", + "teleporter_desc2": "Ваш шанс обмена местами после попадания: {0}%", + + "thief": "Вор", + "thief_desc": "Вы можете украсть навык у выбранного игрока", + "thief_enemy_info": "Ваш навык был украден.", + "thief_player_info": "Навык игрока '{0}' был украден.", + "thief_select_info": "Украсть навык у игрока:", + "thief_incorrect_skill": "Этот навык нельзя выбрать!", + + "thirdeye": "Третий глаз", + "thirdeye_desc": "Нажмите [css_useSkill], чтобы активировать вид от третьего лица", + + "thorns": "Шипы", + "thorns_desc": "Противник получает часть урона, который нанёс вам", + + "throwingknife": "Метательный нож", + "throwingknife_desc": "Нажмите [css_useSkill], чтобы метнуть нож. Но остерегайтесь других", + + "toxicsmoke": "Токсичный дым", + "toxicsmoke_desc": "Ваши дымовые гранаты наносят урон", + + "wallhack": "Воллхак", + "wallhack_desc": "Вы видите врагов сквозь стены", + + "watchmaker": "Часовщик", + "watchmaker_desc": "Каждый бросок гранаты изменяет время раунда", + "watchmaker_ct": "Время раунда сокращено на {0} секунд.", + "watchmaker_tt": "Время раунда увеличено на {0} секунд.", + + "weaponsswap": "Обмен оружием", + "weaponsswap_desc": "Нажмите [css_useSkill], чтобы обменяться оружием со случайным врагом", + "weaponsswap_hud_info2": "У вас нет оружия для обмена", + + "weightless": "Невесомость", + "weightless_desc": "Ваши гранаты не подвержены гравитации и летают быстрее", + + "wildthrow": "Дикие броски", + "wildthrow_desc": "Выберите игрока, у которого будут проблемы с бросанием гранат", + "wildthrow_player_info": "Игрок '{0}' забыл все свои гранатлайны", + "wildthrow_select_info": "Выберите игрока:", + + "zeus": "Зевс", + "zeus_desc": "Зевс x27 мгновенно перезаряжается", + + "your_skill": "Ваш текущий навык", + "enemy_skill": "Навык врага", + "observer_skill": "Навык игрока", + "welcome_message": "Добро пожаловать {PLAYER} на {SERVER_NAME}!\nТекущая версия jRandomSkills: {VERSION} ({SKILLS_COUNT} навыков).\n\nОригинал создан:\n{AUTHOR1}\nМодифицирован и улучшен:\n{AUTHOR2}\nОфициальный Discord: https://discord.gg/9H8EZYBpPF", + "drawing_skill": "Получение навыка", + "disabled_weapon": "Вы не можете использовать это оружие", + + "hud_info": "Подождите ещё {0} секунд", + "hud_info_no_enemy": "Враг не найден", + "active_hud_info": "Активно ещё {0} миллисекунд", + + "skills_menu": "Список навыков", + "no_player": "Подходящий игрок не найден.", + "duplicate_player": "Найдено несколько игроков с таким именем.", + "selectplayerskill_command": "Введите /t", + "selectplayerskill_incorrect_enemy_index": "Игроки для выбора не найдены.", + + "skill_not_found_setskill": "Навык не найден", + "player_not_found_setskill": "Игрок не найден", + "correct_form_setskill": "Правильное использование: CHATCOLORS.RED!setskill <ник> <навык>", + "correct_form_setscore": "Правильное использование: CHATCOLORS.RED!setscore ", + "done_setskill": "Навык установлен", + "error_setskill": "Не удалось установить CHATCOLORS.REDнавык", + "for_setskill": "для", + + "invalid_map": "Название карты введено неверно!", + "loading_map": "Загрузка новой карты", + + "pause": "Матч приостановлен.", + "unpause": "Матч возобновлён.", + "healed": "Вы были вылечены.", + "game_start": "Игра началась!", + "reload": "Языки и конфигурации перезагружены.", + "hud_on": "HUD включён.", + "hud_off": "HUD выключен.", + + "vote_started": "Голосование начато: '{0}'", + "vote_timeout": "Голосование '{0}' истекло!", + "vote_wait": "Нужно подождать перед началом нового голосования!", + "vote_same_wait": "Нужно подождать перед повторным голосованием по той же теме!", + "vote_not_enough_players": "Недостаточно игроков для начала голосования!", + "vote_alredy_voted": "Вы уже проголосовали!", + "vote_vote": "Голосование", + + "bombsite_a": "Бомб-сайт A", + "bombsite_b": "Бомб-сайт B", + "bombplanted": "Бомба установлена\n{0} секунд до взрыва", + + "teammate_skills": "Навыки ваших тиммейтов", + "summary": "Итоги прошедшего раунда", + + "menu_controlls_scroll": "W/S — Прокрутка", + "menu_controlls_padding": " | ", + "menu_controlls_select": "E — Выбрать" +} diff --git a/jRandomSkills - SRC Files/src/lang/tr.json b/jRandomSkills - SRC Files/src/lang/tr.json index fddcada..fca1676 100644 --- a/jRandomSkills - SRC Files/src/lang/tr.json +++ b/jRandomSkills - SRC Files/src/lang/tr.json @@ -3,52 +3,52 @@ "none_desc": "Hiçbir yeteneğin yok", "aimbot": "Aimbot", - "aimbot_desc": "Vurduğun her mermi kafadan vuruş (headshot) sayılır", + "aimbot_desc": "Vurduğunda kafadan (HS) sayılır", - "aimlock": "Nişan Kilidi", + "aimlock": "Kitlenme", "aimlock_desc": "En yakın düşmana nişan almak için [css_useSkill] tuşuna basın", - "anomaly": "Anomali", + "anomaly": "Zaman Büken", "anomaly_desc": "Zamanı birkaç saniye geriye alırsın", "antyflash": "Anti-Flash", - "antyflash_desc": "Flaş bombalarından etkilenmezsin ve senin flaşların 7 saniye sürer", + "antyflash_desc": "Flaşa kör olmazsın ve flaşların 7 saniye sürer", - "antyhead": "Demir Kafa", - "antyhead_desc": "Kafadan vuruşlardan hasar almazsın", + "antyhead": "Beton Kafa", + "antyhead_desc": "Kafadan hasar almazsın", - "areareaper": "Bölge Azraili", - "areareaper_desc": "Devre dışı bırakmak için bir bomba alanı seçebilirsin", - "areareaper_incorrect_site": "Böyle bir bomba alanı bulunamadı.", - "areareaper_no_site": "Hiçbir bomba alanı bulunamadı.", - "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ı!", + "areareaper": "Mekan Kapatan", + "areareaper_desc": "Haritadaki bir bomba alanını tamamen devre dışı bırakabilirsin", + "areareaper_incorrect_site": "Böyle bir bomba alanı yok uydurma", + "areareaper_no_site": "Haritada bomba alanı bulunamadı", + "areareaper_select_info": "Kapatılacak bomba alanını seç:", + "areareaper_site_disabled": "{0} alanı mühürlendi - artık buraya bomba kurulamaz!", + "areareaper_used_info": "Yeteneğini zaten kullandın, açgözlülük yapma", + "areareaper_bombsite_disabled": "Bu bomba alanı kullanıma kapatıldı!", "armored": "Zırhlı", - "armored_desc": "Rastgele bir hasar alma çarpanına sahip olursun", - "armored_desc2": "Hasar alma çarpanın: {0}x", + "armored_desc": "Rastgele hasar alma çarpanına sahip olursun", + "armored_desc2": "Hasar alma: {0}x", "assassin": "Suikastçı", - "assassin_desc": "Düşmanlara arkadan vurduğunda daha fazla hasar verirsin", + "assassin_desc": "Düşmanlara arkadan daha fazla hasar verirsin", "astronaut": "Astronot", - "astronaut_desc": "Raund başında rastgele bir yerçekimi değeri alırsın", - "astronaut_desc2": "Rastgele yerçekimin: {0}x", + "astronaut_desc": "Rastgele bir yerçekimi değerine sahip olursun", + "astronaut_desc2": "Yerçekimin: {0}x", "moneyswap": "Vergi Memuru", - "moneyswap_desc": "Para takas etmek için bir oyuncu seç", - "moneyswap_enemy_info": "Vergi dairesi seni yakaladı.", - "moneyswap_player_info": "'{0}' isimli oyuncuyla paraları takas ettin.", - "moneyswap_select_info": "Para takası yapılacak oyuncu:", + "moneyswap_desc": "Bir düşmanla paranı takasla", + "moneyswap_enemy_info": "Maliye kapına dayandı", + "moneyswap_player_info": "'{0}' isimli oyuncuyla paraları takas ettin", + "moneyswap_select_info": "Para takasla biriyle:", "baseball": "Beyzbolcu", - "baseball_desc": "Yanıltıcı bomban (decoy) duvarlardan seker ve çarptığı düşmanı anında öldürür", + "baseball_desc": "Yanıltıcı bomban (decoy) duvarlardan seker ve çarptığı düşmanı öldürür", - "behind": "Düşman Döndürücü", - "behind_desc": "Düşmana vurduğunda onu 180 derece döndürme şansın olur", - "behind_desc2": "Vuruşta düşmanı döndürme şansın: %{0}", + "behind": "Baş Döndüren", + "behind_desc": "Vurduğunda düşmanı 180 derece döndürme şansın olur", + "behind_desc2": "Baş döndürme şansın: %{0}", "blademaster": "Kılıç Ustası", "blademaster_desc": "Bıçak tutarken mermileri sektirme şansın artar", @@ -57,105 +57,105 @@ "bunnyhop_desc": "Otomatik \"BunnyHop\" yaparsın", "c4camouflage": "C4 Kamuflajı", - "c4camouflage_desc": "Bombayı taşırken görünmez olursun", + "c4camouflage_desc": "Elinde C4 varken tamamen görünmez olursun", "carefulbullets": "Dikkatli Mermiler", - "carefulbullets_desc": "Iskaladığın her mermi için hasar alacak bir oyuncu seç", - "carefulbullets_enemy_info": "Artık isabetsiz atışlar canını yakacak.", - "carefulbullets_player_info": "'{0}' artık daha dikkatli olmalı.", + "carefulbullets_desc": "Düşman mermi kaçırırsa hasar alır", + "carefulbullets_enemy_info": "Mermi kaçırmak canını yakacak", + "carefulbullets_player_info": "'{0}' artık mermi sıkarken iki kere düşünecek", "carefulbullets_select_info": "İsabetsiz atışların hasar vereceği oyuncu:", "catapult": "Mancınık", - "catapult_desc": "Düşmanı havaya fırlatma şansın olur", - "catapult_desc2": "Vuruşta düşmanı fırlatma şansın: %{0}", + "catapult_desc": "Vurduğun rakibi uzaya (yukarı doğru) fırlatma şansın var", + "catapult_desc2": "Fırlatma şansın: %{0}", "chicken": "Tavuk", - "chicken_desc": "Tavuk modeli + %10 daha hızlı hareket - 50 HP alırsın", + "chicken_desc": "Tavuk modeli ve %10 daha hızlısın fakat 50 HP", - "chillout": "Sakin Ol", + "chillout": "Ağırdan Al", "chillout_desc": "Bombayı kurmak çok daha uzun sürer", - "cutter": "Kesici", - "cutter_desc": "Bıçakla tek atışta öldürme", + "cutter": "Kasap", + "cutter_desc": "Bıçakla tek atarsın", - "cypher": "Cypher", - "cypher_desc": "Kamera oluşturmak/kameraya geçmek için E tuşuna bas", - "cypher_nospace": "Kamera duvara dik açıyla yerleştirilmelidir", + "cypher": "Gözcü", + "cypher_desc": "Kamera oluşturmak/geçmek için [css_useSkill] tuşuna bas", + "cypher_nospace": "Kamerayı duvara dik yerleştir", "darkness": "Karanlık", - "darkness_desc": "Seçilen bir düşmana karanlık efekti uygular", - "darkness_enemy_info": "Işıklar sönsün.", - "darkness_player_info": "Karanlık, '{0}' isimli oyuncuyu ele geçirdi.", - "darkness_select_info": "Karanlık uygulanacak oyuncuyu seç:", + "darkness_desc": "Bir düşmanın ekranını karart", + "darkness_enemy_info": "Işıklar sönsün", + "darkness_player_info": "'{0}' isimli oyuncunun dünyasını kararttın", + "darkness_select_info": "Karanlık bir oyuncuyu seç:", - "deactivator": "Devre Dışı Bırakıcı", - "deactivator_desc": "Yeteneğini kapatmak istediğin bir oyuncu seç", - "deactivator_enemy_info": "Yeteneğin devre dışı bırakıldı.", - "deactivator_player_info": "'{0}' isimli oyuncunun yeteneği devre dışı bırakıldı.", - "deactivator_select_info": "Bir oyuncunun yeteneğini devre dışı bırak:", + "deactivator": "Silgi", + "deactivator_desc": "Bir düşmanın yeteneğini sil", + "deactivator_enemy_info": "Yeteneğin silindi", + "deactivator_player_info": "'{0}' isimli oyuncunun yeteneği silindi", + "deactivator_select_info": "Yetenek silmek için oyuncu seç:", "deaf": "Sağır", - "deaf_desc": "Tüm seslerini kapatmak için bir oyuncu seç", - "deaf_enemy_info": "Kulaklıkların oyundan ayrıldı.", + "deaf_desc": "Bir düşmanın kulağını kapat ve sesleri duymaz hale getir", + "deaf_enemy_info": "Kulaklıkların tıkandı", "deaf_player_info": "'{0}' isimli oyuncu için sesler kapatıldı.", - "deaf_select_info": "Sesleri kapatılacak oyuncuyu seç:", + "deaf_select_info": "Sağır bir oyuncuyu seç:", "disarmament": "Silahsızlandırma", - "disarmament_desc": "Vurduğun düşmanın silahını düşürme şansın olur", - "disarmament_desc2": "Düşmanı silahsızlandırma şansın: %{0}", + "disarmament_desc": "Vurduğunda rakibin elindeki silahı yere düşürme şansın olur", + "disarmament_desc2": "Silahsızlandırma şansın: %{0}", - "distancer": "Mesafe Ölçer", - "distancer_desc": "En yakın düşmana olan mesafeni görebilirsin", + "distancer": "Kronometre", + "distancer_desc": "En yakın düşmanın mesafesini görürsün", "dash": "Atılma", - "dash_desc": "Atılmak (dash) için ikinci kez zıpla", + "dash_desc": "Atılmak için ikinci kez zıpla", - "dracula": "Dracula", - "dracula_desc": "Düşmana vurmak, verdiğin hasarın bir yüzdesi kadar canını yeniler", + "dracula": "Drakula", + "dracula_desc": "Rakiplere verdiğin hasarın belirli bir yüzdesi kadar can alırsın", - "duplicator": "Kopyalayıcı", + "duplicator": "Kopyacı", "duplicator_desc": "Yeteneğini kopyalamak için bir oyuncu seç", "duplicator_player_info": "'{0}' isimli oyuncunun yeteneği kopyalandı.", "duplicator_select_info": "Yeteneği kopyalanacak oyuncu:", "dwarf": "Cüce", "dwarf_desc": "Raund başında rastgele karakter boyutu", - "dwarf_desc2": "Boyut çarpanın: {0}x", + "dwarf_desc2": "Boyutun: {0}x", - "enemyspawn": "Düşman Başlangıcı", - "enemyspawn_desc": "Düşman başlangıç noktasına ışınlanmak için E tuşuna bas", + "enemyspawn": "Base Baskını", + "enemyspawn_desc": "[css_useSkill] tuşuna basarak düşman doğma noktasına ışınlan", - "explosiveshot": "Patlayıcı Atış", - "explosiveshot_desc": "Ateş ederken rastgele patlayıcı mermi atma şansı", - "explosiveshot_desc2": "Patlayıcı mermi atma şansın: %{0}", + "explosiveshot": "Patlayıcı Mermi", + "explosiveshot_desc": "Ateş ederken rastgele mermilerin patlayabilir", + "explosiveshot_desc2": "Patlayan mermi şansı: %{0}", "falconeye": "Şahin Gözü", - "falconeye_desc": "Kuş bakışı kamerayı aktif etmek için E tuşuna bas", + "falconeye_desc": "[css_useSkill] tuşuna basarak kuş bakışına geç", - "fastreload": "Hızlı Şarjör", - "fastreload_desc": "Eldeki silahı anında doldurmak için E tuşuna bas", + "fastreload": "Şipşak Şarjör", + "fastreload_desc": "[css_useSkill] tuşuna basarak şarjörünü hızlıca değiştir", "flash": "Flash", "flash_desc": "Raund başında rastgele oyuncu hızı", - "flash_desc2": "Hız çarpanın: {0}x", + "flash_desc2": "Hızın: {0}x", "fortnite": "Fortnite", - "fortnite_desc": "Parçalanabilir bir barikat oluşturmak için E tuşuna bas", + "fortnite_desc": "[css_useSkill] tuşuna basarak barikat kur", "fragilebomb": "Hassas Bomba", - "fragilebomb_desc": "Bombaya ateş etmek ona hasar verir", - "fragilebomb_bomb_health": "Bomba canı", + "fragilebomb_desc": "Kurulu bombaya ateş etmek bombanın canını azaltır", + "fragilebomb_bomb_health": "Bombanın canı", - "friendlyfire": "Dost Ateşi", + "friendlyfire": "Dost Şifası", "friendlyfire_desc": "Takım arkadaşlarına ateş etmek onları iyileştirir", - "frozendecoy": "Dondurucu Yem", - "frozendecoy_desc": "Yanıltıcı bomban (decoy) yakındaki tüm oyuncuları dondurur", + "frozendecoy": "Buz Kıran", + "frozendecoy_desc": "Yanıltıcı bomba (decoy) yakındaki tüm oyuncuları dondurur", "gambler": "Kumarbaz", "gambler_desc": "Sunulan listeden bir yetenek seç.", "gambler_select_info": "Yeteneğini seç:", - "gambler_more": "#00FF00|${0} karşılığında yenile", + "gambler_more": "#00FF00|${0} karşılığında yeni yetenekler", "gambler_no_money": "Yeterli para yok.", "ghost": "Hayalet", @@ -165,71 +165,71 @@ "glaz_desc": "Sis bombalarının içini görebilirsin", "glitch": "Glitç", - "glitch_desc": "Seçilen bir düşmanın radarını devre dışı bırakır", - "glitch_enemy_info": "Radarın devre dışı bırakıldı.", + "glitch_desc": "Seçilen bir düşmanın radarını kapatır", + "glitch_enemy_info": "Radarın kapandı", "glitch_player_info": "'{0}' isimli oyuncunun radarı devre dışı bırakıldı.", "glitch_select_info": "Radarı kapatılacak oyuncuyu seç:", "glue": "Yapıştırıcı", "glue_desc": "Bombaların duvarlara yapışır", - "godmode": "Ölümsüzlük", - "godmode_desc": "Kısa süreliğine ölümsüz olmak için E tuşuna bas", - "godmode_off": "Ölümsüzlük kapalı", - "godmode_on": "Ölümsüzlük açık", + "godmode": "Ölümsüz", + "godmode_desc": "[css_useSkill] tuşuna basarak kısa süreli ölümsüz ol", + "godmode_off": "Ölümsüzlük kapandı", + "godmode_on": "Ölümsüzlük açıldı", "grenadier": "Bombacı", "grenadier_desc": "Sınırsız el bombasına sahipsin", - "healingsmoke": "İyileştiren Sis", + "healingsmoke": "Şifalı Sis", "healingsmoke_desc": "Sis bombaların iyileştirir", "hermit": "Münzevi", - "hermit_desc": "Öldürmek, mermilerini ve canının bir kısmını yeniler", + "hermit_desc": "Öldüğünde mernin ve canının biraz yenilenir", "holyhandgrenade": "Kutsal El Bombası", - "holyhandgrenade_desc": "El bombaların iki kat hasar verir ve iki kat menzile sahiptir", + "holyhandgrenade_desc": "El bomban iki kat hasara ve menzile sahip", - "homingnades": "Güdümlü El Bombaları", - "homingnades_desc": "El bombalarınız (sis hariç) düşmanlara yönelir", + "homingnades": "Güdümlü Bomba", + "homingnades_desc": "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!", + "hotbomb": "Sıcak C4", + "hotbomb_desc": "Yaşadığın sürece bombacının canı azalıyor", + "hotbomb_hint": "Bomba çok sıcak!", "iana": "Hologram", - "iana_desc": "Hologramını birkaç saniyeliğine kontrol etmek için E tuşuna bas", + "iana_desc": "[css_useSkill] tuşuna basarak bir hologram oluştur", - "illiterate": "Okuryazar Olmayan", - "illiterate_desc": "Siz hayatta olduğunuz sürece, düşmanlarınız yazıları okuyamaz", + "illiterate": "Cahiliye", + "illiterate_desc": "Yaşadığın sürece rakibin sohbeti (chat) veya oyun yazılarını okuyamaz", "illusionist": "İllüzyonist", - "illusionist_desc": "Düz ilerleyen bir kopya oluşturmak için [css_useSkill] tuşuna basın", + "illusionist_desc": "[css_useSkill] tuşuna basarak düz ilerleyen illüzyon oluştur", "impostor": "Sahtekar", - "impostor_desc": "Raunda düşman oyuncu modeliyle başlarsın", + "impostor_desc": "Düşman oyuncu modeline dönüşürsün", "infiniteammo": "Sınırsız Mermi", - "infiniteammo_desc": "Tüm silahların için sınırsız mermi alırsın", + "infiniteammo_desc": "Tüm silahların sınırsız mermisi olur", "jackal": "İzci", - "jackal_desc": "Her rakip arkasında bir iz bırakır", + "jackal_desc": "Her rakip yürüdüğünde ayak izi bırakır", "jammer": "Sinyal Kesici", "jammer_desc": "Bir oyuncunun nişangahını (crosshair) kapatmak için seç", - "jammer_enemy_info": "Nişangahın devre dışı bırakıldı.", - "jammer_player_info": "'{0}' isimli oyuncunun nişangahı devre dışı bırakıldı.", + "jammer_enemy_info": "Nişangahın kapatıldı.", + "jammer_player_info": "'{0}' isimli oyuncunun nişangahı kapatıldı.", "jammer_select_info": "Nişangahı kapatılacak oyuncuyu seç:", - "jester": "Joker", - "jester_desc": "Joker modunda hasar alamazsın ve veremezsin. Bu mod birkaç saniyede bir değişir.", - "jester_mode": "Joker Modu", + "jester": "Soytarı", + "jester_desc": "Soytarı modunda hasar alamazsın ve veremezsin. Bu mod birkaç saniyede bir değişir.", + "jester_mode": "Soytarı Modu", "jester_on": "AÇIK", "jester_off": "KAPALI", "jumpban": "Bacaksız", "jumpban_desc": "Zıplayamayacak bir oyuncu seç", - "jumpban_enemy_info": "Birisi bacaklarını kesti.", + "jumpban_enemy_info": "Bacakların kesildi", "jumpban_player_info": "'{0}' artık zıplayamaz.", "jumpban_select_info": "Zıplaması yasaklanacak oyuncu:", @@ -237,59 +237,59 @@ "jumpingjack_desc": "Zıplamak canını yeniler", "killerflash": "Ölümcül Flaş", - "killerflash_desc": "Flaş bombanla tamamen kör olan herkes ölür (sen dahil)", + "killerflash_desc": "Flaşına tamamen kör olan herkes ölür (sen dahil)", "lifeswap": "Can Takası", "lifeswap_desc": "Can değerlerini takas etmek için bir oyuncu seç", - "lifeswap_enemy_info": "Birisi canını ödünç aldı.", + "lifeswap_enemy_info": "Birisi canını çaldı", "lifeswap_player_info": "'{0}' isimli oyuncuyla canlarını takas ettin.", "lifeswap_select_info": "Can takası yapılacak oyuncu:", "longknife": "Uzun Bıçak", - "longknife_desc": "Bıçak saldırısı mesafeden bağımsız olarak hasar verir", + "longknife_desc": "Bıçağın uzaktaki rakibe hasar verebilir", "longzeus": "Uzak Zeus", - "longzeus_desc": "Zeus mesafeden bağımsız olarak hasar verir", + "longzeus_desc": "Zeus uzaktaki rakibe hasar verebilir", "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", + "magneto_desc": "Tüm düşman 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!", + "magnifier_enemy_info": "Görüşün bozuldu!", "magnifier_player_info": "'{0}' isimli oyuncunun ekranı yakınlaştırıldı.", "magnifier_select_info": "Ekranı büyütülecek oyuncuyu seç:", "medic": "Sıhhiye", - "medic_desc": "50 can yenileyen bir iyileştirme yükü kullanmak için E tuşuna bas", + "medic_desc": "[css_useSkill] tuşuna basarak kendine anında 50 HP bas", - "miner": "Bomba Madencisi", + "miner": "Mayın", "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.", + "bankrupt_enemy_info": "İflas ettin!", "bankrupt_player_info": "'{0}' isimli oyuncu iflas etti.", "bankrupt_select_info": "İflas edecek oyuncuyu seç:", - "muhammed": "Bombacı", - "muhammed_desc": "Öldüğünde patlayarak etraftaki oyuncuları öldürürsün", - "muhammed_explosion": "ALLAHU EKBER!!!", + "deathbomb": "Canlı Bomba", + "deathbomb_desc": "Öldüğünde patlayarak etraftaki oyuncuları öldürürsün", + "deathbomb_explosion": "BOOM!!!", "ninja": "Ninja", - "ninja_desc": "Hareketsiz durmak görünmezliğini %33, çömelmek %33 ve bıçak tutmak %33 artırır", + "ninja_desc": "Görünmezliğini sabit durmak %33, eğilmek %33 ve bıçak tutmak %33 artırır", "nonades": "Bomba Geçirmez", "nonades_desc": "Bombalar sana hasar vermez", "norecoil": "Odaklanma", - "norecoil_desc": "Ateş ederken geri tepme olmaz", + "norecoil_desc": "Silahın hiç sekmez", "noclip": "Noclip", - "noclip_desc": "Kısa süreliğine noclip açmak için E tuşuna bas", + "noclip_desc": "[css_useSkill] tuşuna basarak duvarların içinden geç", "oneshot": "Tek Atış", "oneshot_desc": "Düşmana vurmak onu anında öldürür", @@ -297,18 +297,18 @@ "onlyhead": "Sadece Kafa", "onlyhead_desc": "Sadece kafadan hasar alırsın", - "paweljumper": "Ekstra Zıplama", - "paweljumper_desc": "Rastgele sayıda ekstra zıplama hakkı kazanırsın", - "paweljumper_desc2": "{0} tane ekstra zıplama hakkın var", + "paweljumper": "Zıppır", + "paweljumper_desc": "Rastgele sayıda ekstra zıplaman olur", + "paweljumper_desc2": "{0} kez ekstra zıplayabilirsin", "phoenix": "Anka Kuşu", "phoenix_desc": "Öldükten sonra rastgele yeniden doğma şansın olur", - "phoenix_desc2": "Ölümden sonra yeniden doğma şansın: %{0}", - "phoenix_respawn": "Anka Kuşu'nun gücü sayesinde küllerinden yeniden doğdun!", + "phoenix_desc2": "Yeniden doğma şansın: %{0}", + "phoenix_respawn": "Küllerinden yeniden doğdun!", "psychicdefusing": "Psişik İmha", "psychicdefusing_desc": "Bombanın yanındayken onu otomatik imha etmeye başlarsın", - "psychicdefusing_hud_info": "İmha için {0} saniye kaldı", + "psychicdefusing_hud_info": "Bombanın çözülmesi için son {0} saniye", "pilot": "Pilot", "pilot_desc": "Sınırlı bir süre uçun. Uçmak için zıplama tuşuna iki kez basın", @@ -326,7 +326,7 @@ "primaryban": "Tüfek Yasak", "primaryban_desc": "Tüfek kullanamayacak bir oyuncu seç", - "primaryban_enemy_info": "Artık tüfek kullanamazsın.", + "primaryban_enemy_info": "Tüfek kullanmayı unuttun", "primaryban_player_info": "'{0}' artık tüfek kullanamaz.", "primaryban_select_info": "Tüfek kullanımı yasaklanacak oyuncu:", @@ -335,13 +335,13 @@ "push": "İtici", "push_desc": "Düşmana vurduğunda onu geri itme şansın olur", - "push_desc2": "Düşmanı geri itme şansın: %{0}", + "push_desc2": "Geri itme şansın: %{0}", - "pyro": "Piromani", + "pyro": "Ateşbaz", "pyro_desc": "Molotof canını yeniler", - "quickshot": "Seri Ateş", - "quickshot_desc": "Tüm mermiler çok hızlı ateşlenir", + "quickshot": "Seri Atış", + "quickshot_desc": "Silahın daha hızlı ateş eder", "radarhack": "Radar Hack", "radarhack_desc": "Düşmanlar radarda görünür", @@ -349,34 +349,34 @@ "rambo": "Rambo", "rambo_desc": "Raund başında rastgele miktarda can alırsın", - "randomweapon": "Rastgele Silah", - "randomweapon_desc": "Rastgele bir silah almak için E tuşuna bas", + "randomweapon": "Silah Kumarı", + "randomweapon_desc": "[css_useSkill] tuşuna basarak rastgele bir silah al", - "rezombie": "Zombi Dönüşümü", - "rezombie_desc": "Öldükten sonra daha fazla canla ve silahsız bir zombi olarak yeniden doğarsın", + "rezombie": "Zombi", + "rezombie_desc": "Öldükten sonra daha fazla canla ve silahsız zombi olarak doğarsın", "reactivearmor": "Reaktif Zırh", - "reactivearmor_desc": "Zırh alınan ilk hasarı emmer", + "reactivearmor_desc": "Zırhın alınan ilk hasarı emmer", "regeneration": "Yenilenme", "regeneration_desc": "Birkaç saniyede bir canın yenilenir", "replicator": "Kopyacı", - "replicator_desc": "Vurulduğunda hasar veren bir kopya oluşturmak için E tuşuna bas", + "replicator_desc": "[css_useSkill] tuşuna basarak kopya oluştur ve ölürse rakibe hasar verir", - "retreat": "Geri Çekilme", - "retreat_desc": "Başlangıç noktasına dönmek için E tuşuna bas", + "retreat": "Geri Çekil", + "retreat_desc": "[css_useSkill] tuşuna basarak başlangıç noktasına ışınlan", "returntosender": "İade", - "returntosender_desc": "Düşmana ilk vuruşun onu kendi başlangıç noktasına geri gönderir", + "returntosender_desc": "Düşmana ilk vuruşun onu kendi başlangıç noktasına ışınlar", - "richboy": "Zengin Çocuk", + "richboy": "Zengin Bebe", "richboy_desc": "Raund başında rastgele miktarda para alırsın", "robinhood": "Robin Hood", "robinhood_desc": "Düşmana hasar vermek onun parasını çalar", - "rubber": "Lastik Mermiler", + "rubber": "Lastik Mermi", "rubber_desc": "Mermilerin oyuncuları önemli ölçüde yavaşlatır", "saper": "İstihkamcı", @@ -387,48 +387,48 @@ "shade": "Gölge", "shade_desc": "Vurduğun düşmanın arkasına ışınlanma şansın olur", - "shade_desc2": "Düşmanın arkasına ışınlanma şansın: %{0}", + "shade_desc2": "Arkasına ışınlanma şansın: %{0}", "shade_nospace": "Uygun alan yok", "shortbomb": "Kısa Fünye", "shortbomb_desc": "Bomba çok daha hızlı patlar", "silent": "Sessiz", - "silent_desc": "Ayak seslerin ve zıplamaların DİĞER oyunculara duyulmaz", + "silent_desc": "Ayak seslerini ve zıplamalarını DİĞER oyuncular duyamaz", "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", + "sniperelite_customname": "Keskin Nişancı", + "sniperelite_desc": "[css_useSkill] tuşuna basarak silahını AWP ile değiştir", - "soldier": "Asker", - "soldier_desc": "Rastgele bir hasar çarpanına sahip olursun", - "soldier_desc2": "Hasar çarpanın: {0}x", + "soldier": "Teğmen", + "soldier_desc": "Rastgele bir oranda fazla hasar verirsin", + "soldier_desc2": "Hasarın: {0}x", - "soundmaker": "Gürültücü", - "soundmaker_desc": "Her düşman için bir ses tetiklemek için E tuşuna bas", + "soundmaker": "Halüsinasyon", + "soundmaker_desc": "[css_useSkill] tuşuna basarak rakibinin çığlık atmasını sağla", - "spectator": "İzleyici", - "spectator_desc": "Rastgele bir düşmanı izlemek için E tuşuna bas", + "spectator": "Röntgen", + "spectator_desc": "[css_useSkill] tuşuna basarak rakibinin gözünden gör", "swapposition": "Yer Değiştirme", - "swapposition_desc": "Rastgele bir düşmanla yer değiştirmek için E tuşuna bas", + "swapposition_desc": "[css_useSkill] tuşuna basarak vurduğun düşmanla yer değiştir", "teleporter": "Işınlayıcı", "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}", + "teleporter_desc2": "Yer değiştirme şansın: %{0}", "thief": "Hırsız", "thief_desc": "Seçilen bir oyuncudan yeteneğini çalabilirsin", "thief_enemy_info": "Yeteneğin çalındı.", "thief_player_info": "'{0}' isimli oyuncunun yeteneği çalındı.", "thief_select_info": "Yetenek çalınacak oyuncu:", - "thief_incorrect_skill": "Bu yetenek seçilemez!", + "thief_incorrect_skill": "Bu yetenek çalınamaz!", "thirdeye": "Üçüncü Göz", - "thirdeye_desc": "Üçüncü şahıs bakış açısını aktif etmek için E tuşuna bas", + "thirdeye_desc": "[css_useSkill] tuşuna basarak üçüncü göze(thirdperson) geç", "thorns": "Dikenler", "thorns_desc": "Rakibin, sana verdiği hasarın bir kısmını geri alır", @@ -448,13 +448,13 @@ "watchmaker_tt": "Raund süresi {0} saniye uzatıldı.", "weaponsswap": "Silah Takası", - "weaponsswap_desc": "Rastgele bir düşmanla silahları takas etmek için E tuşuna bas", + "weaponsswap_desc": "[css_useSkill] tuşuna basarak silahını düşmanla takasla", "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", + "weightless_desc": "El bombalarınız yerçekiminden etkilenmez ve dümdüz gider", - "wildthrow": "Vahşi Atış", + "wildthrow": "Unutkan Bombacı", "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:", @@ -462,25 +462,25 @@ "zeus": "Zeus", "zeus_desc": "Zeus x27 anında şarj olur", - "your_skill": "Mevcut yeteneğin", + "your_skill": "Yeteneğin", "enemy_skill": "Düşmanın yeteneği", "observer_skill": "Oyuncunun yeteneği", "welcome_message": "{PLAYER}, {SERVER_NAME} sunucusuna hoş geldin!\nGüncel jRandomSkills versiyonu: {VERSION} ({SKILLS_COUNT} yetenek).\n\nOrijinal yapımcı:\n{AUTHOR1}\nGeliştiren:\n{AUTHOR2}\nResmi Discord: https://discord.gg/9H8EZYBpPF", - "drawing_skill": "Yetenek çekiliyor", + "drawing_skill": "Yetenek çarkı dönüyor...", "disabled_weapon": "Bu silahı kullanamazsın", "hud_info": "{0} saniye daha bekle", - "hud_info_no_enemy": "Düşman bulunamadı", + "hud_info_no_enemy": "Düşman yok", "active_hud_info": "{0} milisaniye daha aktif", "skills_menu": "Yetenek Listesi", - "no_player": "Eşleşen oyuncu bulunamadı.", + "no_player": "Eşleşen oyuncu yok.", "duplicate_player": "Aynı isimde birden fazla oyuncu bulundu.", - "selectplayerskill_command": "/t yazın", - "selectplayerskill_incorrect_enemy_index": "Seçilecek oyuncu bulunamadı.", + "selectplayerskill_command": "Sohbete /t yazın", + "selectplayerskill_incorrect_enemy_index": "Seçilecek oyuncu yok.", - "skill_not_found_setskill": "Böyle bir yetenek bulunamadı", - "player_not_found_setskill": "Böyle bir oyuncu bulunamadı", + "skill_not_found_setskill": "Böyle bir yetenek yok", + "player_not_found_setskill": "Böyle bir oyuncu yok", "correct_form_setskill": "Doğru kullanım: !setskill ", "correct_form_setscore": "Doğru kullanım: !setscore ", "done_setskill": "yetenek ayarlandı", @@ -506,12 +506,12 @@ "vote_alredy_voted": "Zaten oy kullandın!", "vote_vote": "Oy ver", - "bombsite_a": "Bomba Alanı A", - "bombsite_b": "Bomba Alanı B", + "bombsite_a": "A Bölgesi", + "bombsite_b": "B Bölgesi", "bombplanted": "Bomba kuruldu\nPatlamaya {0} saniye", - "teammate_skills": "Takım arkadaşlarının yetenekleri", - "summary": "Son raundun özeti", + "teammate_skills": "Takımının yetenekleri", + "summary": "Raundun özeti", "menu_controlls_scroll": "W/S - Kaydır", "menu_controlls_padding": " | ", diff --git a/jRandomSkills - SRC Files/src/lang/zh.json b/jRandomSkills - SRC Files/src/lang/zh.json index c42ef7c..08f05a2 100644 --- a/jRandomSkills - SRC Files/src/lang/zh.json +++ b/jRandomSkills - SRC Files/src/lang/zh.json @@ -275,9 +275,9 @@ "moneyswap_player_info": "你与玩家 '{0}' 交换了金钱。", "moneyswap_select_info": "选择你想与之交换金钱的玩家:", - "muhammed": "穆罕默德", - "muhammed_desc": "你死亡时会爆炸,杀死附近的玩家", - "muhammed_explosion": "真主至大!!!", + "deathbomb": "死亡炸弹", + "deathbomb_desc": "你死亡时会爆炸,杀死附近的玩家", + "deathbomb_explosion": "砰!", "ninja": "忍者", "ninja_desc": "站立不动增加33%隐形,蹲下增加33%,持刀增加33%", diff --git a/jRandomSkills - SRC Files/src/player/ISkill.cs b/jRandomSkills - SRC Files/src/player/ISkill.cs index f1df3a4..395ee9c 100644 --- a/jRandomSkills - SRC Files/src/player/ISkill.cs +++ b/jRandomSkills - SRC Files/src/player/ISkill.cs @@ -79,6 +79,7 @@ public enum Skills Darkness, Deactivator, Deaf, + DeathBomb, Disarmament, Distancer, Dash, @@ -126,7 +127,6 @@ public enum Skills Medic, Miner, MoneySwap, - Muhammed, Ninja, NoNades, NoRecoil, diff --git a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs index 8a66bba..a171a95 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerEvents.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerEvents.cs @@ -2,14 +2,12 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; using CounterStrikeSharp.API.Modules.Admin; -using CounterStrikeSharp.API.Modules.Commands.Targeting; using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Events; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; -using Microsoft.Extensions.Logging; using RayTraceAPI; using src.player.skills; using src.utils; @@ -465,6 +463,9 @@ namespace src.player CCSPlayerController player = pawn.Controller.Value.As(); if (player == null || !player.IsValid) return HookResult.Continue; + var playerInfo = PlayerManager.GetPlayerByIndex(player.Index); + if (playerInfo == null) return HookResult.Continue; + CCSWeaponBaseVData vdata = VirtualFunctions.GetCSWeaponDataFromKeyFunc.Invoke(-1, econItem.ItemDefinitionIndex.ToString()); if (vdata == null) return HookResult.Continue; @@ -483,7 +484,8 @@ namespace src.player break; } } - return block ? HookResult.Stop : HookResult.Continue; + + return block ? HookResult.Handled : HookResult.Continue; } } @@ -510,7 +512,7 @@ namespace src.player break; } } - return block ? HookResult.Stop : HookResult.Continue; + return block ? HookResult.Handled : HookResult.Continue; } } @@ -570,7 +572,7 @@ namespace src.player string welcomeMsg = player.GetTranslation("welcome_message", "welcome"); foreach (string line in welcomeMsg.Split("\n")) - player.PrintToChat($" {ChatColors.Green}" + line.Replace("{PLAYER}", $" {ChatColors.Red}{player.PlayerName}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) + player.PrintToChat($" {ChatColors.Green}" + line.Replace("{PLAYER}", $" {ChatColors.Red}\u202A{player.PlayerName}\u202C{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) .Replace("{SERVER_NAME}", $" {ChatColors.Red}{ConVar.Find("hostname")?.StringValue ?? "Default Server"}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) .Replace("{VERSION}", $" {ChatColors.Red}v{Instance.ModuleVersion}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) .Replace("{SKILLS_COUNT}", $" {ChatColors.Red}{SkillData.Skills.Count - 1}{ChatColors.Green}", StringComparison.OrdinalIgnoreCase) @@ -731,16 +733,22 @@ namespace src.player lock (setLock) { isTransmitRegistered = false; + Instance.AddTimer(.1f, () => { DisableAll(); ConVar.Find("sv_legacy_jump")?.SetValue("1"); + }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + Instance.RemoveListener(CheckTransmit); + playersSkills.Clear(); staticSkills.Clear(); + ctSkill = noneSkill; tSkill = noneSkill; allSkill = noneSkill; + PlayerManager.Clear(); } } @@ -766,7 +774,7 @@ namespace src.player var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == _playerSkill.Skill); var specialSkillInfo = SkillData.Skills.FirstOrDefault(s => s.Skill == _playerSkill.SpecialSkill); if (skillInfo == null) continue; - skillsText += $" {ChatColors.DarkRed}{_player.PlayerName}{ChatColors.Lime}: {(_playerSkill.SpecialSkill == Skills.None || specialSkillInfo == null ? player.GetSkillName(skillInfo.Skill, _playerSkill.SkillChance) : $"{player.GetSkillName(specialSkillInfo.Skill)} -> {player.GetSkillName(skillInfo.Skill, _playerSkill.SkillChance)}")}\n"; + skillsText += $" {ChatColors.DarkRed}\u202A{_player.PlayerName}\u202C{ChatColors.Lime}: {(_playerSkill.SpecialSkill == Skills.None || specialSkillInfo == null ? player.GetSkillName(skillInfo.Skill, _playerSkill.SkillChance) : $"{player.GetSkillName(specialSkillInfo.Skill)} -> {player.GetSkillName(skillInfo.Skill, _playerSkill.SkillChance)}")}\n"; } } @@ -824,7 +832,7 @@ namespace src.player SkillUtils.PrintToChat(victim, $"{ChatColors.DarkRed}{(attackerInfo.SpecialSkill == Skills.None ? victim.GetSkillName(skillData.Skill) : $"{victim.GetSkillName(specialSkillData.Skill)} -> {victim.GetSkillName(skillData.Skill)}")}{ChatColors.Lime} - {skillDesc}", - title: $"{victim.GetTranslation("enemy_skill")} {ChatColors.DarkRed}{attacker.PlayerName}{ChatColors.Lime}"); + title: $"{victim.GetTranslation("enemy_skill")} {ChatColors.DarkRed}\u202A{attacker.PlayerName}\u202C{ChatColors.Lime}"); } } return HookResult.Continue; @@ -1064,9 +1072,9 @@ namespace src.player float hudExpired = Config.LoadedConfig.SkillHudDuration; skillPlayer.SkillHudExpired = hudExpired == -1 ? DateTime.MaxValue : DateTime.Now.AddSeconds(hudExpired); - float descriptionHudExpired = Config.LoadedConfig.SkillHudDuration; + float descriptionHudExpired = Config.LoadedConfig.SkillDescriptionDuration; skillPlayer.SkillDescriptionHudExpired = descriptionHudExpired == -1 ? DateTime.MaxValue : DateTime.Now.AddSeconds(descriptionHudExpired); - + if (Config.LoadedConfig.TeamMateSkillChatInfo) { Instance?.AddTimer(.6f, () => @@ -1079,7 +1087,7 @@ namespace src.player if (teammateInfo != null && teammateInfo?.Skill != null) { var skillInfo = SkillData.Skills.FirstOrDefault(p => p.Skill == teammateInfo.Skill); - teammateSkills += $" {ChatColors.DarkRed}{teammate.PlayerName}{ChatColors.Lime}: {(skillInfo == null ? player.GetSkillName(Skills.None) : player.GetSkillName(skillInfo.Skill, teammateInfo.SkillChance))}\n"; + teammateSkills += $" {ChatColors.DarkRed}\u202A{teammate.PlayerName}\u202C{ChatColors.Lime}: {(skillInfo == null ? player.GetSkillName(Skills.None) : player.GetSkillName(skillInfo.Skill, teammateInfo.SkillChance))}\n"; } } diff --git a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs index ba7ac98..3f87eae 100644 --- a/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs +++ b/jRandomSkills - SRC Files/src/player/PlayerOnTick.cs @@ -15,6 +15,7 @@ namespace src.player Instance.RegisterListener(() => { UpdateGameRules(); + if (Server.TickCount % 2 != 0) return; foreach (var player in Utilities.GetPlayers()) { diff --git a/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs b/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs index 8025f0c..b2bac0d 100644 --- a/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/AntyFlash.cs @@ -1,13 +1,16 @@ using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; +using System.Collections.Concurrent; namespace src.player.skills { public class AntyFlash : ISkill { private const Skills skillName = Skills.AntyFlash; + private readonly static ConcurrentDictionary playersWithSkill = []; public static void LoadSkill() { @@ -38,15 +41,76 @@ namespace src.player.skills } } + public static void GrenadeThrown(EventGrenadeThrown @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Weapon; + if (weapon != "flashbang") return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + playersWithSkill[player.Index] = grenadesLeft - 1; + player!.GiveNamedItem($"weapon_{weapon}"); + SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, grenadesLeft - 1); + } + } + + public static void WeaponEquip(EventItemEquip @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, grenadesLeft); + } + + public static void WeaponPickup(EventItemPickup @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Item; + if (string.IsNullOrEmpty(weapon) || weapon != "flashbang") return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, grenadesLeft); + } + public static void EnableSkill(CCSPlayerController player) { if (player == null || !player.IsValid) return; - SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade); + + int flashbangLimit = ConVar.Find("ammo_grenade_limit_flashbang")?.GetPrimitiveValue() ?? 2; + int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); + + if (grenadeLimit > flashbangLimit) + { + playersWithSkill.TryAdd(player.Index, grenadeLimit); + SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade); + SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, grenadeLimit); + } + else + SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade, grenadeLimit, false); } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#D6E6FF", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float flashDuration = 7f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public static void DisableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + playersWithSkill.TryRemove(player.Index, out _); + SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, 1); + } + + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#D6E6FF", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float flashDuration = 7f, int grenadeLimit = 2) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public float FlashDuration { get; set; } = flashDuration; + public int GrenadeLimit { get; set; } = grenadeLimit; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs b/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs index a450d07..da16eb5 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Bankrupt.cs @@ -41,7 +41,7 @@ namespace src.player.skills foreach (var e in enemies) { int money = e.InGameMoneyServices?.Account ?? 0; - menuItems.Add(($"{e.PlayerName} : {money}$", e.Index.ToString())); + menuItems.Add(($"\u202A{e.PlayerName}\u202C : {money}$", e.Index.ToString())); } if (!menuItems.IsEmpty) @@ -61,7 +61,7 @@ namespace src.player.skills var enemies = Utilities.GetPlayers().Where(p => p.IsValid && p.PawnIsAlive && p.Team != player.Team && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { - ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices?.Account ?? 0)}$", e.Index.ToString()))]; + ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => ($"\u202A{e.PlayerName}\u202C : {(e.InGameMoneyServices?.Account ?? 0)}$", e.Index.ToString()))]; SkillUtils.CreateMenu(player, menuItems); } else diff --git a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs index e79fa38..8f8ccb3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Baseball.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Baseball.cs @@ -4,7 +4,6 @@ using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; -using static src.jRandomSkills; namespace src.player.skills { @@ -12,6 +11,7 @@ namespace src.player.skills { private const Skills skillName = Skills.Baseball; private static readonly ConcurrentDictionary decoys = []; + private readonly static ConcurrentDictionary playersWithSkill = []; public static void LoadSkill() { @@ -24,8 +24,17 @@ namespace src.player.skills var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); var weapon = @event.Weapon; - if (weapon != "decoy") return; - if (!Instance.IsPlayerValid(victim) || !Instance.IsPlayerValid(attacker)) return; + if (weapon != "decoy") + return; + + if (victim == null || !victim.IsValid || victim.PlayerPawn?.Value == null || !victim.PlayerPawn.Value.IsValid || victim.PlayerPawn.Value.Health <= 0) + return; + + if (attacker == null || !attacker.IsValid || attacker.PlayerPawn?.Value == null || !attacker.PlayerPawn.Value.IsValid || attacker.PlayerPawn.Value.Health <= 0) + return; + + if (victim.Index == attacker.Index || victim.Team == attacker.Team) + return; var attackerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(attacker)!.Index); if (attackerInfo?.Skill != skillName) return; @@ -108,16 +117,72 @@ namespace src.player.skills } } - public static void EnableSkill(CCSPlayerController player) + public static void GrenadeThrown(EventGrenadeThrown @event) { - SkillUtils.TryGiveWeapon(player, CsItem.DecoyGrenade); + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Weapon; + if (weapon != "decoy") return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + playersWithSkill[player.Index] = grenadesLeft - 1; + player!.GiveNamedItem($"weapon_{weapon}"); + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, grenadesLeft - 1); + } } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#2effc7", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float speedMultipier = 2f, float maxSpeed = 900f, int damageDeal = 9999) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public static void WeaponEquip(EventItemEquip @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, grenadesLeft); + } + + public static void WeaponPickup(EventItemPickup @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Item; + if (string.IsNullOrEmpty(weapon) || weapon != "decoy") return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, grenadesLeft); + } + + public static void EnableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); + playersWithSkill.TryAdd(player.Index, grenadeLimit); + + SkillUtils.TryGiveWeapon(player, CsItem.DecoyGrenade); + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, grenadeLimit); + } + + public static void DisableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + playersWithSkill.TryRemove(player.Index, out _); + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, 1); + } + + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#2effc7", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float speedMultipier = 2f, float maxSpeed = 900f, int damageDeal = 9999, int grenadeLimit = 3) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public float SpeedMultipier { get; set; } = speedMultipier; public float MaxSpeed { get; set; } = maxSpeed; public float DamageDeal { get; set; } = damageDeal; + public int GrenadeLimit { get; set; } = grenadeLimit; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs index add268f..6e8e265 100644 --- a/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs +++ b/jRandomSkills - SRC Files/src/player/skills/C4Camouflage.cs @@ -125,14 +125,18 @@ namespace src.player.skills var entity = Utilities.GetEntityFromIndex((int)playerPawn.Index); if (entity == null || !entity.IsValid) continue; - info.TransmitEntities.Remove(entity.Index); + + if (info.TransmitEntities.Contains(entity.Index)) + info.TransmitEntities.Remove(entity.Index); var bombIndex = GetBombIndex(); if (bombIndex == null) continue; var bombEntity = Utilities.GetEntityFromIndex((int)bombIndex); if (bombEntity == null || !bombEntity.IsValid) continue; - info.TransmitEntities.Remove(bombEntity.Index); + + if (info.TransmitEntities.Contains(bombEntity.Index)) + info.TransmitEntities.Remove(bombEntity.Index); } } } @@ -141,6 +145,7 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { Event.EnableTransmit(); + if (player == null || !player.IsValid) return; var playerPawn = player.PlayerPawn.Value; @@ -157,6 +162,8 @@ namespace src.player.skills invisiblePlayers.TryAdd(player.Index, 0); SkillUtils.SetPlayerInvisibility(player, .5f); + + SkillUtils.ForceFullUpdateToAll(); } public static void DisableSkill(CCSPlayerController player) @@ -164,6 +171,8 @@ namespace src.player.skills invisiblePlayers.TryRemove(player.Index, out _); SkillUtils.SetPlayerInvisibility(player, 0); EntityManager.DestroyPlayerEntities(player.Index); + + SkillUtils.ForceFullUpdateToAll(); } private static void CreatePlayerPosProp(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs index 379af4c..430cc76 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Chicken.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Chicken.cs @@ -2,7 +2,6 @@ using System.Drawing; using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using static src.jRandomSkills; using System.Collections.Concurrent; using src.utils; @@ -19,7 +18,7 @@ namespace src.player.skills "weapon_ump45", "weapon_p90", "weapon_mp5sd", "weapon_ssg08", "weapon_awp", "weapon_scar20", "weapon_g3sg1", "weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_m249", - "weapon_negev" + "weapon_negev", "weapon_sg556" ]; private static readonly ConcurrentDictionary chickens = []; @@ -82,8 +81,11 @@ namespace src.player.skills { playerPawn.VelocityModifier = 1f; - playerPawn.Health = Math.Min(playerPawn.Health + 50, 100); - Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth"); + if (playerPawn.Health > 0) + { + playerPawn.Health = Math.Min(playerPawn.Health + 50, 100); + Utilities.SetStateChanged(playerPawn, "CBaseEntity", "m_iHealth"); + } SkillUtils.ChangePlayerScale(player, 1); diff --git a/jRandomSkills - SRC Files/src/player/skills/Cypher.cs b/jRandomSkills - SRC Files/src/player/skills/Cypher.cs index ea73bf2..bc39238 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Cypher.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Cypher.cs @@ -58,7 +58,8 @@ namespace src.player.skills NextCamera = 0, NoSpace = 0, PlayerCameraRaw = player.PlayerPawn.Value.CameraServices.ViewEntity.Raw, - LastAngle = QAngle.Zero + LastPlayerAngle = QAngle.Zero, + LastCameraAngle = QAngle.Zero }); } @@ -160,16 +161,20 @@ namespace src.player.skills if (playerInfo.CameraActive && playerInfo.CameraProp != null) { if (pawn.AbsRotation != null) - playerInfo.LastAngle = new QAngle(pawn.V_angle.X, pawn.V_angle.Y, 0); + playerInfo.LastPlayerAngle = new QAngle(pawn.V_angle.X, pawn.V_angle.Y, 0); var cameraProp = Utilities.GetEntityFromIndex((int)playerInfo.CameraProp); - if (cameraProp == null || !cameraProp.IsValid) return; + if (cameraProp == null || !cameraProp.IsValid || cameraProp.AbsRotation == null) return; - pawn.Teleport(null, cameraProp.AbsRotation); + if (playerInfo.LastCameraAngle == QAngle.Zero) + playerInfo.LastCameraAngle = new QAngle(cameraProp.AbsRotation.X, cameraProp.AbsRotation.Y, 0); + + pawn.Look(playerInfo.LastCameraAngle); } else if (!forceToDefault) { - pawn.Look(playerInfo.LastAngle); + playerInfo.LastCameraAngle = new QAngle(pawn.V_angle.X, pawn.V_angle.Y, 0); + pawn.Look(playerInfo.LastPlayerAngle); } } @@ -399,7 +404,8 @@ namespace src.player.skills public bool CameraActive { get; set; } public float NextCamera { get; set; } public float NoSpace { get; set; } - public required QAngle LastAngle { get; set; } + public required QAngle LastPlayerAngle { get; set; } + public required QAngle LastCameraAngle { get; set; } } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#34ebd5", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = true, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float cooldown = 30) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs index a36fe35..b664117 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Deactivator.cs @@ -40,7 +40,7 @@ namespace src.player.skills if (enemyInfo == null) continue; var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; - menuItems.Add(($"{enemy.PlayerName} : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); + menuItems.Add(($"\u202A{enemy.PlayerName}\u202C : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); } SkillUtils.UpdateMenu(player, menuItems); } @@ -82,7 +82,7 @@ namespace src.player.skills if (enemyInfo == null) continue; var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; - menuItems.Add(($"{enemy.PlayerName} : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); + menuItems.Add(($"\u202A{enemy.PlayerName}\u202C : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); } SkillUtils.CreateMenu(player, menuItems); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs b/jRandomSkills - SRC Files/src/player/skills/DeathBomb.cs similarity index 94% rename from jRandomSkills - SRC Files/src/player/skills/Muhammed.cs rename to jRandomSkills - SRC Files/src/player/skills/DeathBomb.cs index 07f2f92..14c6345 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Muhammed.cs +++ b/jRandomSkills - SRC Files/src/player/skills/DeathBomb.cs @@ -4,14 +4,13 @@ using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; -using static src.jRandomSkills; using Vector = CounterStrikeSharp.API.Modules.Utils.Vector; namespace src.player.skills { - public class Muhammed : ISkill + public class DeathBomb : ISkill { - private const Skills skillName = Skills.Muhammed; + private const Skills skillName = Skills.DeathBomb; private static readonly QAngle angle = new(10, -5, 9); private static readonly ConcurrentDictionary nades = []; @@ -57,7 +56,7 @@ namespace src.player.skills SkillUtils.CreateHEGrenadeProjectile(pos, angle, new Vector(0, 0, -10), player.TeamNum); foreach (var _p in Utilities.GetPlayers().Where(p => p.IsValid && p.Team is CsTeam.CounterTerrorist or CsTeam.Terrorist)) - SkillUtils.PrintToChat(_p, $"{ChatColors.DarkRed}{player.PlayerName}: {ChatColors.Lime}{_p.GetTranslation("muhammed_explosion")}", + SkillUtils.PrintToChat(_p, $"{ChatColors.DarkRed}\u202A{player.PlayerName}\u202C: {ChatColors.Lime}{_p.GetTranslation("deathbomb_explosion")}", border: !Utilities.GetPlayers().Any(p => p.Team == player.Team && p != player) ? "tb" : "t"); var fileNames = new[] { "radiobotfallback01", "radiobotfallback02", "radiobotfallback04" }; @@ -88,7 +87,7 @@ namespace src.player.skills heProjectile.DetonateTime = 0; if (nades.TryRemove(lastTick, out byte teamNum)) - heProjectile.Globalname = $"muhammed_team_{teamNum}_{heProjectile.Index}"; + heProjectile.Globalname = $"deathbomb_team_{teamNum}_{heProjectile.Index}"; }); } @@ -103,7 +102,7 @@ namespace src.player.skills if (nade == null || !nade.IsValid) return; if (nade.DesignerName != "hegrenade_projectile") return; - if (string.IsNullOrEmpty(nade.Globalname) || !nade.Globalname.StartsWith("muhammed_team_")) return; + if (string.IsNullOrEmpty(nade.Globalname) || !nade.Globalname.StartsWith("deathbomb_team_")) return; if (!int.TryParse(nade.Globalname.Split('_')[2], out int nadeTeam)) return; diff --git a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs index 3b9f2b9..cd75c12 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Duplicator.cs @@ -31,18 +31,18 @@ namespace src.player.skills var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null || playerInfo.Skill != skillName) continue; - var enemies = Utilities.GetPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Team != player.Team && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); + var enemies = Utilities.GetPlayers().Where(p => p != null && p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p => p != null && p.IsValid && p.Index != player.Index && p.PlayerPawn?.Value != null && p.PlayerPawn.Value.IsValid && p.PlayerPawn.Value.Health > 0 && !p.IsHLTV && p.Team != CsTeam.Spectator && p.Team != CsTeam.None).ToArray(); ConcurrentBag<(string, string)> menuItems = []; foreach (var enemy in enemies) { - var enemyInfo = PlayerManager.GetPlayerByIndex(enemy.Index); + var enemyInfo = PlayerManager.GetPlayerByIndex(enemy?.Index); if (enemyInfo == null) continue; var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; - menuItems.Add(($"{enemy.PlayerName} : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); + menuItems.Add(($"\u202A{enemy!.PlayerName}\u202C : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); } SkillUtils.UpdateMenu(player, menuItems); } @@ -82,10 +82,12 @@ namespace src.player.skills { var enemyInfo = PlayerManager.GetPlayerByIndex(enemy.Index); if (enemyInfo == null) continue; + var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; + skills.Add(skillData.Skill.ToString()); - menuItems.Add(($"{enemy.PlayerName} : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); + menuItems.Add(($"\u202A{enemy.PlayerName}\u202C : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); } int ctSkills = Event.counterterroristSkills.Count(s => skills.Contains(s.Name)); diff --git a/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs b/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs index 2e2481e..a7abce8 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FriendlyFire.cs @@ -1,48 +1,73 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Utils; using src.utils; -using static src.jRandomSkills; namespace src.player.skills { public class FriendlyFire : ISkill { private const Skills skillName = Skills.FriendlyFire; - private static readonly string[] nades = ["inferno", "flashbang", "smokegrenade", "decoy", "hegrenade"]; public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); } - public static void PlayerHurt(EventPlayerHurt @event) + public static void OnTakeDamage(DynamicHook h) { - var damage = @event.DmgHealth; - var victim = PlayerManager.GetPlayerEvent(@event.Userid); - var attacker = PlayerManager.GetPlayerEvent(@event.Attacker); - var weapon = @event.Weapon; + CEntityInstance param = h.GetParam(0); + CTakeDamageInfo param2 = h.GetParam(1); - if (nades.Contains(weapon)) return; - if (!Instance.IsPlayerValid(attacker) || !Instance.IsPlayerValid(victim) || attacker == victim) return; + if (param == null || param.Entity == null || param2 == null || param2.Attacker == null || param2.Attacker.Value == null) + return; - var playerInfo = PlayerManager.GetPlayerByIndex(attacker!.Index); + if (param2.AmmoType == 255) + return; + + CCSPlayerPawn attackerPawn = new(param2.Attacker.Value.Handle); + CCSPlayerPawn victimPawn = new(param.Handle); + + if (attackerPawn == null || !attackerPawn.IsValid || victimPawn == null || !victimPawn.IsValid) + return; + + if (attackerPawn.DesignerName != "player" || victimPawn.DesignerName != "player") + return; + + if (attackerPawn == null || attackerPawn.Controller?.Value == null || victimPawn == null || victimPawn.Controller?.Value == null) + return; + + var attackerController = attackerPawn.Controller.Value; + if (attackerController == null || !attackerController.IsValid) return; + + var victimController = victimPawn.Controller.Value; + if (victimController == null || !victimController.IsValid) return; + + var attacker = attackerController.As(); + if (attacker == null || !attacker.IsValid) return; + + var victim = victimController.As(); + if (victim == null || !victim.IsValid) return; + + var playerInfo = PlayerManager.GetPlayerByIndex(PlayerManager.GetPlayerEvent(attacker)!.Index); if (playerInfo?.Skill != skillName || attacker!.Team != victim!.Team) return; + float damage = param2.Damage; + param2.Damage = 0; + Server.ExecuteCommand("mp_autokick 0"); - - var pawn = victim.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid) return; - - if (damage == 0) - damage = Instance.Random.Next(4, 6); - - SkillUtils.AddHealth(pawn, damage + (int)(damage * SkillsInfo.GetValue(skillName, "healthMultiplier")), pawn.MaxHealth); + + SkillUtils.AddHealth( + victimPawn, + (int)(damage * SkillsInfo.GetValue(skillName, "healthDamageMultiplier")), + victimPawn.MaxHealth + ); } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = true, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float healthMultiplier = 1.5f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ff0000", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = true, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float healthDamageMultiplier = .3f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { - public float HealthMultiplier { get; set; } = healthMultiplier; + public float HealthDamageMultiplier { get; set; } = healthDamageMultiplier; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs index 1a07aa9..aa850cf 100644 --- a/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/FrozenDecoy.cs @@ -11,6 +11,7 @@ namespace src.player.skills { private const Skills skillName = Skills.FrozenDecoy; private static readonly ConcurrentDictionary decoys = []; + private readonly static ConcurrentDictionary playersWithSkill = []; public static void LoadSkill() { @@ -67,15 +68,71 @@ namespace src.player.skills } } - public static void EnableSkill(CCSPlayerController player) + public static void GrenadeThrown(EventGrenadeThrown @event) { - SkillUtils.TryGiveWeapon(player, CsItem.DecoyGrenade); + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Weapon; + if (weapon != "decoy") return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + playersWithSkill[player.Index] = grenadesLeft - 1; + player!.GiveNamedItem($"weapon_{weapon}"); + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, grenadesLeft - 1); + } } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#00eaff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float triggerRadius = 180, int slownessMultiplier = 5) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public static void WeaponEquip(EventItemEquip @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, grenadesLeft); + } + + public static void WeaponPickup(EventItemPickup @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Item; + if (string.IsNullOrEmpty(weapon) || weapon != "decoy") return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, grenadesLeft); + } + + public static void EnableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); + playersWithSkill.TryAdd(player.Index, grenadeLimit); + + SkillUtils.TryGiveWeapon(player, CsItem.DecoyGrenade); + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, grenadeLimit); + } + + public static void DisableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + playersWithSkill.TryRemove(player.Index, out _); + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, 1); + } + + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#00eaff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float triggerRadius = 180, int slownessMultiplier = 5, int grenadeLimit = 3) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public float TriggerRadius { get; set; } = triggerRadius; public int SlownessMultiplier { get; set; } = slownessMultiplier; + public int GrenadeLimit { get; set; } = grenadeLimit; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs index 6bbbc05..7aad102 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ghost.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ghost.cs @@ -13,17 +13,8 @@ namespace src.player.skills public class Ghost : ISkill { private const Skills skillName = Skills.Ghost; - private static readonly string[] disabledWeapons = - [ - "weapon_deagle", "weapon_revolver", "weapon_glock", "weapon_usp_silencer", - "weapon_cz75a", "weapon_fiveseven", "weapon_p250", "weapon_tec9", - "weapon_elite", "weapon_hkp2000", "weapon_ak47", "weapon_m4a1", - "weapon_m4a4", "weapon_m4a1_silencer", "weapon_famas", "weapon_galilar", - "weapon_aug", "weapon_sg553", "weapon_mp9", "weapon_mac10", - "weapon_bizon", "weapon_mp7", "weapon_ump45", "weapon_p90", - "weapon_mp5sd", "weapon_ssg08", "weapon_awp", "weapon_scar20", - "weapon_g3sg1", "weapon_nova", "weapon_xm1014", "weapon_mag7", - "weapon_sawedoff", "weapon_m249", "weapon_negev" + private static readonly string[] allowedWeapons = [ + "weapon_molotov", "weapon_incgrenade", "weapon_flashbang", "weapon_smokegrenade", "weapon_decoy", "weapon_hegrenade", "weapon_knife", "weapon_bayonet" ]; private static readonly ConcurrentDictionary invisiblePlayers = []; private const string bloodParticle = "particles/blood_impact/blood_impact_high.vpcf"; @@ -96,7 +87,8 @@ namespace src.player.skills var entity = Utilities.GetEntityFromIndex((int)playerPawn.Index); if (entity == null || !entity.IsValid) continue; - info.TransmitEntities.Remove(entity.Index); + if (info.TransmitEntities.Contains(entity.Index)) + info.TransmitEntities.Remove(entity.Index); var bombIndex = GetBombIndex(playerController); if (bombIndex == null) continue; @@ -104,7 +96,8 @@ namespace src.player.skills var bombEntity = Utilities.GetEntityFromIndex((int)bombIndex); if (bombEntity == null || !bombEntity.IsValid) continue; - info.TransmitEntities.Remove(bombEntity.Index); + if (info.TransmitEntities.Contains(bombEntity.Index)) + info.TransmitEntities.Remove(bombEntity.Index); } } } @@ -113,12 +106,15 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { Event.EnableTransmit(); + SetWeaponAttack(player, true); SkillUtils.SetPlayerInvisibility(player, .5f); invisiblePlayers.TryAdd(player.Index, 0); if (EntityManager.GetPlayerEntities(player.Index, "empty_prop").Count == 0) CreatePlayerPosProp(player); + + SkillUtils.ForceFullUpdateToAll(); } private static void CreatePlayerPosProp(CCSPlayerController player) @@ -154,6 +150,8 @@ namespace src.player.skills invisiblePlayers.TryRemove(player.Index, out _); EntityManager.DestroyPlayerEntities(player.Index); + + SkillUtils.ForceFullUpdateToAll(); } public static void OnTick() @@ -210,8 +208,10 @@ namespace src.player.skills if (pawn == null || !pawn.IsValid || pawn.WeaponServices == null) return; foreach (var weapon in pawn.WeaponServices.MyWeapons) - if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) - if (disabledWeapons.Contains(weapon.Value.DesignerName)) + if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid && !string.IsNullOrEmpty(weapon.Value.DesignerName)) + { + string weaponName = weapon.Value.DesignerName; + if (!allowedWeapons.Contains(weaponName)) { weapon.Value.NextPrimaryAttackTick = disableWeapon ? int.MaxValue : Server.TickCount; weapon.Value.NextSecondaryAttackTick = disableWeapon ? int.MaxValue : Server.TickCount; @@ -219,6 +219,7 @@ namespace src.player.skills Utilities.SetStateChanged(weapon.Value, "CBasePlayerWeapon", "m_nNextPrimaryAttackTick"); Utilities.SetStateChanged(weapon.Value, "CBasePlayerWeapon", "m_nNextSecondaryAttackTick"); } + } } private static void UpdateHUD(CCSPlayerController player) @@ -231,7 +232,7 @@ namespace src.player.skills if (playerInfo == null) return; var weapon = pawn.WeaponServices.ActiveWeapon.Value; - if (weapon == null || !weapon.IsValid || !disabledWeapons.Contains(weapon.DesignerName)) + if (weapon == null || !weapon.IsValid || allowedWeapons.Contains(weapon.DesignerName)) { playerInfo.PrintHTML = null; return; diff --git a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs index f6bb458..a2a1f04 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Glaz.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Glaz.cs @@ -13,6 +13,7 @@ namespace src.player.skills { private const Skills skillName = Skills.Glaz; private readonly static ConcurrentDictionary smokes = []; + private readonly static ConcurrentDictionary playersWithSkill = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -51,19 +52,82 @@ namespace src.player.skills { var entity = Utilities.GetEntityFromIndex((int)entityIndex); if (entity == null || !entity.IsValid) continue; - info.TransmitEntities.Remove(entity.Index); + + if (info.TransmitEntities.Contains(entity.Index)) + info.TransmitEntities.Remove(entity.Index); } } } - public static void EnableSkill(CCSPlayerController player) + public static void GrenadeThrown(EventGrenadeThrown @event) { - Event.EnableTransmit(); - SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Weapon; + if (weapon != "smokegrenade") return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + playersWithSkill[player.Index] = grenadesLeft - 1; + player!.GiveNamedItem($"weapon_{weapon}"); + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadesLeft - 1); + } } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#5d00ff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public static void WeaponEquip(EventItemEquip @event) { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadesLeft); + } + + public static void WeaponPickup(EventItemPickup @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Item; + if (string.IsNullOrEmpty(weapon) || weapon != "smokegrenade") return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadesLeft); + } + + public static void EnableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + Event.EnableTransmit(); + + int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); + playersWithSkill.TryAdd(player.Index, grenadeLimit); + + SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadeLimit); + + SkillUtils.ForceFullUpdateToAll(); + } + + public static void DisableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + playersWithSkill.TryRemove(player.Index, out _); + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, 1); + + SkillUtils.ForceFullUpdateToAll(); + } + + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#5d00ff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, int grenadeLimit = 2) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + { + public int GrenadeLimit { get; set; } = grenadeLimit; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs index 05cc683..e89ef69 100644 --- a/jRandomSkills - SRC Files/src/player/skills/GodMode.cs +++ b/jRandomSkills - SRC Files/src/player/skills/GodMode.cs @@ -13,6 +13,8 @@ namespace src.player.skills private static readonly ConcurrentDictionary SkillPlayerInfo = []; private static readonly object setLock = new(); + public static bool HaveHodMode(uint playerIndex) => SkillPlayerInfo.TryGetValue(playerIndex, out var skillInfo) && skillInfo.CanUse == false; + public static void LoadSkill() { SkillUtils.RegisterSkill(skillName, SkillsInfo.GetValue(skillName, "color")); @@ -30,8 +32,12 @@ namespace src.player.skills { SteamID = player.Index, CanUse = true, + HaveGodMode = false, Cooldown = DateTime.MinValue, }); + + if (SkillPlayerInfo.TryGetValue(player.Index, out var skillInfo)) + skillInfo.HaveGodMode = true; } public static void OnTick() @@ -90,11 +96,15 @@ namespace src.player.skills { skillInfo.CanUse = false; skillInfo.Cooldown = DateTime.Now; + skillInfo.HaveGodMode = true; PlayerManager.GetPlayerFromEvent(player)?.PrintToChat($" {ChatColors.Green} {player.GetTranslation("godmode_on")}"); player.PlayerPawn.Value.TakesDamage = false; Instance.AddTimer(SkillsInfo.GetValue(skillName, "duration"), () => { + if (SkillPlayerInfo.TryGetValue(playerIndex, out var skillInfo)) + skillInfo.HaveGodMode = false; + var player = Utilities.GetPlayerFromIndex((int)playerIndex); if (player != null && player.IsValid) { @@ -102,6 +112,9 @@ namespace src.player.skills player.PlayerPawn.Value.TakesDamage = true; PlayerManager.GetPlayerFromEvent(player)?.PrintToChat($" {ChatColors.Red} {player.GetTranslation("godmode_off")}"); + + if (player.PlayerPawn.Value.Health <= 0) + player.CommitSuicide(false, true); } }, CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); } @@ -112,6 +125,7 @@ namespace src.player.skills { public ulong SteamID { get; set; } public bool CanUse { get; set; } + public bool HaveGodMode { get; set; } public DateTime Cooldown { get; set; } } diff --git a/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs index 9f19cb7..e1f1ad0 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HealingSmoke.cs @@ -11,6 +11,7 @@ namespace src.player.skills { private const Skills skillName = Skills.HealingSmoke; private static readonly ConcurrentDictionary smokes = []; + private readonly static ConcurrentDictionary playersWithSkill = []; public static void LoadSkill() { @@ -95,16 +96,72 @@ namespace src.player.skills } } - public static void EnableSkill(CCSPlayerController player) + public static void GrenadeThrown(EventGrenadeThrown @event) { - SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Weapon; + if (weapon != "smokegrenade") return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + playersWithSkill[player.Index] = grenadesLeft - 1; + player!.GiveNamedItem($"weapon_{weapon}"); + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadesLeft - 1); + } } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#1fe070", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, int smokeHeal = 1, float smokeRadius = 180, int tickCooldown = 16) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public static void WeaponEquip(EventItemEquip @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadesLeft); + } + + public static void WeaponPickup(EventItemPickup @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Item; + if (string.IsNullOrEmpty(weapon) || weapon != "smokegrenade") return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadesLeft); + } + + public static void EnableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); + playersWithSkill.TryAdd(player.Index, grenadeLimit); + + SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadeLimit); + } + + public static void DisableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + playersWithSkill.TryRemove(player.Index, out _); + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, 1); + } + + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#1fe070", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, int smokeHeal = 1, float smokeRadius = 180, int tickCooldown = 16, int grenadeLimit = 1) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public int SmokeHeal { get; set; } = smokeHeal; public float SmokeRadius { get; set; } = smokeRadius; public int TickCooldown { get; set; } = tickCooldown; + public int GrenadeLimit { get; set; } = grenadeLimit; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs b/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs index 6d8f2e6..20b7f94 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HolyHandGrenade.cs @@ -3,13 +3,14 @@ using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; -using static src.jRandomSkills; +using System.Collections.Concurrent; namespace src.player.skills { public class HolyHandGrenade : ISkill { private const Skills skillName = Skills.HolyHandGrenade; + private readonly static ConcurrentDictionary playersWithSkill = []; public static void LoadSkill() { @@ -40,15 +41,71 @@ namespace src.player.skills }); } - public static void EnableSkill(CCSPlayerController player) + public static void GrenadeThrown(EventGrenadeThrown @event) { - SkillUtils.TryGiveWeapon(player, CsItem.HEGrenade); + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Weapon; + if (weapon != "hegrenade") return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + playersWithSkill[player.Index] = grenadesLeft - 1; + player!.GiveNamedItem($"weapon_{weapon}"); + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadesLeft - 1); + } } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffdd00", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float damageMultiplier = 2f, float damageRadiusMultiplier = 2f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public static void WeaponEquip(EventItemEquip @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadesLeft); + } + + public static void WeaponPickup(EventItemPickup @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Item; + if (string.IsNullOrEmpty(weapon) || weapon != "hegrenade") return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadesLeft); + } + + public static void EnableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); + playersWithSkill.TryAdd(player.Index, grenadeLimit); + + SkillUtils.TryGiveWeapon(player, CsItem.HEGrenade); + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadeLimit); + } + + public static void DisableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + playersWithSkill.TryRemove(player.Index, out _); + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, 1); + } + + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#ffdd00", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float damageMultiplier = 2f, float damageRadiusMultiplier = 2f, int grenadeLimit = 1) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public float DamageMultiplier { get; set; } = damageMultiplier; public float DamageRadiusMultiplier { get; set; } = damageRadiusMultiplier; + public int GrenadeLimit { get; set; } = grenadeLimit; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/HomingNades.cs b/jRandomSkills - SRC Files/src/player/skills/HomingNades.cs index f8d1093..03ea2b3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/HomingNades.cs +++ b/jRandomSkills - SRC Files/src/player/skills/HomingNades.cs @@ -11,6 +11,7 @@ namespace src.player.skills { private const Skills skillName = Skills.HomingNades; private readonly static ConcurrentDictionary nades = []; + private readonly static ConcurrentDictionary playersWithSkill = []; public static void LoadSkill() { @@ -140,16 +141,72 @@ namespace src.player.skills }); } - public static void EnableSkill(CCSPlayerController player) + public static void GrenadeThrown(EventGrenadeThrown @event) { - SkillUtils.TryGiveWeapon(player, CsItem.HEGrenade); + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Weapon; + if (weapon != "hegrenade") return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + playersWithSkill[player.Index] = grenadesLeft - 1; + player!.GiveNamedItem($"weapon_{weapon}"); + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadesLeft - 1); + } } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#384728", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float strength = 150, float maxVelocity = 2000, float detonationRange = 130) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public static void WeaponEquip(EventItemEquip @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadesLeft); + } + + public static void WeaponPickup(EventItemPickup @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Item; + if (string.IsNullOrEmpty(weapon) || weapon != "hegrenade") return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadesLeft); + } + + public static void EnableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); + playersWithSkill.TryAdd(player.Index, grenadeLimit); + + SkillUtils.TryGiveWeapon(player, CsItem.HEGrenade); + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadeLimit); + } + + public static void DisableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + playersWithSkill.TryRemove(player.Index, out _); + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, 1); + } + + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#384728", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float strength = 150, float maxVelocity = 2000, float detonationRange = 130, int grenadeLimit = 2) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public float Strength { get; set; } = strength; public float MaxVelocity { get; set; } = maxVelocity; public float DetonationRange { get; set; } = detonationRange; + public int GrenadeLimit { get; set; } = grenadeLimit; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Iana.cs b/jRandomSkills - SRC Files/src/player/skills/Iana.cs index aa1805a..4b12069 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Iana.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Iana.cs @@ -241,7 +241,7 @@ namespace src.player.skills return clone; } - private unsafe static bool CheckPosition(CCSPlayerController player, Vector endPos) + private static bool CheckPosition(CCSPlayerController player, Vector endPos) { var playerPawn = player.PlayerPawn.Value; @@ -340,10 +340,16 @@ namespace src.player.skills var victim = PlayerManager.GetPlayerEvent(@event.Userid); if (victim == null || !victim.IsValid) return; - if (playersInfo.TryGetValue(victim.Index, out var playerSkill) && playerSkill.CloneProp != null) + if (playersInfo.TryGetValue(victim.Index, out var playerSkill)) { - KillClone(playerSkill); - SkillUtils.RestoreHealth(victim); + if (playerSkill.CloneProp != null) + { + KillClone(playerSkill); + playerSkill.LastHit = Server.TickCount; + } + + if (playerSkill.LastHit + 4 > Server.TickCount) + SkillUtils.RestoreHealth(victim); } } @@ -429,6 +435,7 @@ namespace src.player.skills public float NextUse { get; set; } public float UseTime { get; set; } public int InfoTime { get; set; } + public int LastHit { get; set; } public List Weapons { get; set; } = []; } diff --git a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs index d8bddc7..79e13eb 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Jackal.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Jackal.cs @@ -1,6 +1,7 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; +using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Utils; using src.utils; using System.Collections.Concurrent; @@ -75,7 +76,8 @@ namespace src.player.skills if (relayEntity == null || !relayEntity.IsValid) continue; if (player.Team == trailOwner.Team || !isJackalOwner) - info.TransmitEntities.Remove(relayEntity.Index); + if (info.TransmitEntities.Contains(relayEntity.Index)) + info.TransmitEntities.Remove(relayEntity.Index); } } } @@ -137,6 +139,8 @@ namespace src.player.skills mainSkillTimer ??= Instance.AddTimer(2.5f, () => UpdateAllTrails(), CounterStrikeSharp.API.Modules.Timers.TimerFlags.REPEAT | CounterStrikeSharp.API.Modules.Timers.TimerFlags.STOP_ON_MAPCHANGE); + + SkillUtils.ForceFullUpdateToAll(); } private static void UpdateAllTrails() @@ -159,6 +163,8 @@ namespace src.player.skills mainSkillTimer.Kill(); mainSkillTimer = null; } + + SkillUtils.ForceFullUpdateToAll(); } public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#f542ef", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = 1, Rarity rarity = Rarity.Common, string particleName = "particles/ui/hud/ui_map_def_utility_trail.vpcf") : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) diff --git a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs index c525751..e8c47c3 100644 --- a/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs +++ b/jRandomSkills - SRC Files/src/player/skills/KillerFlash.cs @@ -1,8 +1,9 @@ using CounterStrikeSharp.API.Core; -using CounterStrikeSharp.API.Modules.Commands.Targeting; +using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; +using System.Collections.Concurrent; using static src.jRandomSkills; namespace src.player.skills @@ -10,6 +11,7 @@ namespace src.player.skills public class KillerFlash : ISkill { private const Skills skillName = Skills.KillerFlash; + private readonly static ConcurrentDictionary playersWithSkill = []; public static void LoadSkill() { @@ -31,15 +33,77 @@ namespace src.player.skills player?.PlayerPawn?.Value?.CommitSuicide(false, true); } - public static void EnableSkill(CCSPlayerController player) + public static void GrenadeThrown(EventGrenadeThrown @event) { - SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade); + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Weapon; + if (weapon != "flashbang") return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + playersWithSkill[player.Index] = grenadesLeft - 1; + player!.GiveNamedItem($"weapon_{weapon}"); + SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, grenadesLeft - 1); + } } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#57bcff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = 1, Rarity rarity = Rarity.Epic, float flashDuration = 1f, bool friendlyFire = true) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public static void WeaponEquip(EventItemEquip @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, grenadesLeft); + } + + public static void WeaponPickup(EventItemPickup @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Item; + if (string.IsNullOrEmpty(weapon) || weapon != "flashbang") return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, grenadesLeft); + } + + public static void EnableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + int flashbangLimit = ConVar.Find("ammo_grenade_limit_flashbang")?.GetPrimitiveValue() ?? 2; + int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); + + if (grenadeLimit > flashbangLimit) + { + playersWithSkill.TryAdd(player.Index, grenadeLimit); + SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade); + SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, grenadeLimit); + } + else + SkillUtils.TryGiveWeapon(player, CsItem.FlashbangGrenade, grenadeLimit, false); + } + + public static void DisableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + playersWithSkill.TryRemove(player.Index, out _); + SkillUtils.UpdateGrenadeCount(player, CsItem.FlashbangGrenade, 1); + } + + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#57bcff", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = 1, Rarity rarity = Rarity.Epic, float flashDuration = 1f, bool friendlyFire = true, int grenadeLimit = 1) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public float FlashDuration { get; set; } = flashDuration; public bool FriendlyFire { get; set; } = friendlyFire; + public int GrenadeLimit { get; set; } = grenadeLimit; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs b/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs index e588f5f..7af9337 100644 --- a/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/LifeSwap.cs @@ -33,7 +33,7 @@ namespace src.player.skills if (playerInfo == null || playerInfo.Skill != skillName) continue; var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); - ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => ($"{e.PlayerName} : {e?.PlayerPawn?.Value?.Health ?? 0} HP", e.Index.ToString()))); + ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => ($"\u202A{e.PlayerName}\u202C : {e?.PlayerPawn?.Value?.Health ?? 0} HP", e.Index.ToString()))); SkillUtils.UpdateMenu(player, menuItems); } } @@ -75,7 +75,7 @@ namespace src.player.skills var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { - ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => ($"{e.PlayerName} : {e.PawnHealth} HP", e.Index.ToString()))); + ConcurrentBag<(string, string)> menuItems = new(enemies.Select(e => ($"\u202A{e.PlayerName}\u202C : {e.PawnHealth} HP", e.Index.ToString()))); SkillUtils.CreateMenu(player, menuItems); } else diff --git a/jRandomSkills - SRC Files/src/player/skills/MagneticDecoy.cs b/jRandomSkills - SRC Files/src/player/skills/MagneticDecoy.cs index 8a3815c..f34a3fe 100644 --- a/jRandomSkills - SRC Files/src/player/skills/MagneticDecoy.cs +++ b/jRandomSkills - SRC Files/src/player/skills/MagneticDecoy.cs @@ -11,6 +11,7 @@ namespace src.player.skills { private const Skills skillName = Skills.MagneticDecoy; private static readonly ConcurrentDictionary decoys = []; + private readonly static ConcurrentDictionary playersWithSkill = []; public static void LoadSkill() { @@ -74,15 +75,71 @@ namespace src.player.skills } } - public static void EnableSkill(CCSPlayerController player) + public static void GrenadeThrown(EventGrenadeThrown @event) { - SkillUtils.TryGiveWeapon(player, CsItem.DecoyGrenade); + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Weapon; + if (weapon != "decoy") return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + playersWithSkill[player.Index] = grenadesLeft - 1; + player!.GiveNamedItem($"weapon_{weapon}"); + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, grenadesLeft - 1); + } } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#81f0c4", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float triggerRadius = 180, float strenght = 30) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public static void WeaponEquip(EventItemEquip @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, grenadesLeft); + } + + public static void WeaponPickup(EventItemPickup @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Item; + if (string.IsNullOrEmpty(weapon) || weapon != "decoy") return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, grenadesLeft); + } + + public static void EnableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); + playersWithSkill.TryAdd(player.Index, grenadeLimit); + + SkillUtils.TryGiveWeapon(player, CsItem.DecoyGrenade); + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, grenadeLimit); + } + + public static void DisableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + playersWithSkill.TryRemove(player.Index, out _); + SkillUtils.UpdateGrenadeCount(player, CsItem.DecoyGrenade, 1); + } + + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#81f0c4", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float triggerRadius = 180, float strenght = 30, int grenadeLimit = 3) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public float TriggerRadius { get; set; } = triggerRadius; public float Strenght { get; set; } = strenght; + public int GrenadeLimit { get; set; } = grenadeLimit; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Miner.cs b/jRandomSkills - SRC Files/src/player/skills/Miner.cs index 5f02cdf..a0acdee 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Miner.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Miner.cs @@ -11,6 +11,7 @@ namespace src.player.skills { private const Skills skillName = Skills.Miner; private readonly static ConcurrentDictionary nades = []; + private readonly static ConcurrentDictionary playersWithSkill = []; public static void LoadSkill() { @@ -20,6 +21,7 @@ namespace src.player.skills public static void NewRound() { nades.Clear(); + playersWithSkill.Clear(); } public static void OnTick() @@ -39,7 +41,7 @@ namespace src.player.skills if (nade.CreateTime + 3 > currentTime) return; Vector currentPos = new(nade.AbsOrigin.X, nade.AbsOrigin.Y, nade.AbsOrigin.Z); - + foreach (var enemy in Utilities.GetPlayers().Where(p => p.IsValid && p.PawnIsAlive && p.TeamNum != nade.TeamNum)) { var enemyPawn = enemy.PlayerPawn.Value; @@ -101,12 +103,68 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController player) { + if (player == null || !player.IsValid) return; + + int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); + playersWithSkill.TryAdd(player.Index, grenadeLimit); + SkillUtils.TryGiveWeapon(player, CsItem.HEGrenade); + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadeLimit); } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#adf542", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float detonationRange = 130) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public static void GrenadeThrown(EventGrenadeThrown @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Weapon; + if (weapon != "hegrenade") return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + playersWithSkill[player.Index] = grenadesLeft - 1; + player!.GiveNamedItem($"weapon_{weapon}"); + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadesLeft - 1); + } + } + + public static void WeaponEquip(EventItemEquip @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadesLeft); + } + + public static void WeaponPickup(EventItemPickup @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Item; + if (string.IsNullOrEmpty(weapon) || weapon != "hegrenade") return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadesLeft); + } + + public static void DisableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + playersWithSkill.TryRemove(player.Index, out _); + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, 1); + } + + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#adf542", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float detonationRange = 130, int grenadeLimit = 3) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public float DetonationRange { get; set; } = detonationRange; + public int GrenadeLimit { get; set; } = grenadeLimit; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs b/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs index 8c138e2..fff4743 100644 --- a/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/MoneySwap.cs @@ -1,7 +1,6 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; -using static src.jRandomSkills; using System.Collections.Concurrent; using src.utils; @@ -33,7 +32,7 @@ namespace src.player.skills if (playerInfo == null || playerInfo.Skill != skillName) continue; var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); - ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account + e.InGameMoneyServices.CashSpentThisRound)}$", e.Index.ToString()))]; + ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => ($"\u202A{e.PlayerName}\u202C : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account + e.InGameMoneyServices.CashSpentThisRound)}$", e.Index.ToString()))]; SkillUtils.UpdateMenu(player, menuItems); } } @@ -75,7 +74,7 @@ namespace src.player.skills var enemies = Utilities.GetPlayers().Where(p =>p != null &&p.IsValid).Select(p => PlayerManager.GetPlayerEvent(p)).Where(p =>p != null &&p.IsValid &&p.Team != player.Team &&p.PlayerPawn?.Value != null &&p.PlayerPawn.Value.IsValid &&p.PlayerPawn.Value.Health > 0 &&!p.IsHLTV &&p.Team != CsTeam.Spectator&& p.Team != CsTeam.None).ToArray(); if (enemies.Length > 0) { - ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => ($"{e.PlayerName} : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account + e.InGameMoneyServices.CashSpentThisRound)}$", e.Index.ToString()))]; + ConcurrentBag<(string, string)> menuItems = [.. enemies.Select(e => ($"\u202A{e.PlayerName}\u202C : {(e.InGameMoneyServices == null ? 0 : e.InGameMoneyServices.Account + e.InGameMoneyServices.CashSpentThisRound)}$", e.Index.ToString()))]; SkillUtils.CreateMenu(player, menuItems); } else diff --git a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs index 036080c..a63ebe8 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Ninja.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Ninja.cs @@ -88,13 +88,17 @@ namespace src.player.skills var entity = Utilities.GetEntityFromIndex((int)playerPawn.Index); if (entity == null || !entity.IsValid) continue; - info.TransmitEntities.Remove(entity.Index); + + if (info.TransmitEntities.Contains(entity.Index)) + info.TransmitEntities.Remove(entity.Index); var bombIndex = GetBombIndex(playerController); if (bombIndex == null) continue; var bombEntity = Utilities.GetEntityFromIndex((int)bombIndex); if (bombEntity == null || !bombEntity.IsValid) continue; - info.TransmitEntities.Remove(bombEntity.Index); + + if (info.TransmitEntities.Contains(bombEntity.Index)) + info.TransmitEntities.Remove(bombEntity.Index); } } } @@ -135,6 +139,8 @@ namespace src.player.skills if (EntityManager.GetPlayerEntities(player.Index, "empty_prop").Count == 0) CreatePlayerPosProp(player); + + SkillUtils.ForceFullUpdateToAll(); } public static void DisableSkill(CCSPlayerController player) @@ -142,6 +148,8 @@ namespace src.player.skills SkillUtils.SetPlayerInvisibility(player, 0); invisiblePlayers.TryRemove(player.Index, out _); EntityManager.DestroyPlayerEntities(player.Index); + + SkillUtils.ForceFullUpdateToAll(); } private static void CreatePlayerPosProp(CCSPlayerController player) diff --git a/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs b/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs index 61a41bc..157bb34 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Phoenix.cs @@ -2,6 +2,7 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; +using System.Collections.Concurrent; using static src.jRandomSkills; namespace src.player.skills @@ -9,6 +10,7 @@ namespace src.player.skills public class Phoenix : ISkill { private const Skills skillName = Skills.Phoenix; + private static readonly ConcurrentDictionary phoenixTicks = new(); public static void LoadSkill() { @@ -26,12 +28,21 @@ namespace src.player.skills var pawn = victim.PlayerPawn.Value; if (pawn == null || !pawn.IsValid) return; + bool isProtected = phoenixTicks.TryGetValue(victim.Index, out int tick); + if (isProtected && tick + 4 > Server.TickCount) + { + SkillUtils.AddHealth(pawn, 100 - pawn.Health); + return; + } + var playerInfo = PlayerManager.GetPlayerByIndex(victim.Index); if (playerInfo?.Skill != skillName || pawn.Health > 0) return; if (Instance.Random.NextDouble() > playerInfo.SkillChance) return; if (victim.TeamChanged) return; + phoenixTicks[victim.Index] = Server.TickCount; + SkillUtils.AddHealth(pawn, 100 - pawn.Health); SkillUtils.PrintToChat(user, user.GetTranslation("phoenix_respawn")); @@ -51,8 +62,10 @@ namespace src.player.skills { var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); if (playerInfo == null) return; + float newChance = (float)Instance.Random.NextDouble() * (SkillsInfo.GetValue(skillName, "ChanceTo") - SkillsInfo.GetValue(skillName, "ChanceFrom")) + SkillsInfo.GetValue(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 != player) ? "tb" : "t"); } diff --git a/jRandomSkills - SRC Files/src/player/skills/Pyro.cs b/jRandomSkills - SRC Files/src/player/skills/Pyro.cs index 021dd8c..dc7941b 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Pyro.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Pyro.cs @@ -1,8 +1,8 @@ -using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Utils; using src.utils; +using System.Collections.Concurrent; using static src.jRandomSkills; namespace src.player.skills @@ -10,6 +10,7 @@ namespace src.player.skills public class Pyro : ISkill { private const Skills skillName = Skills.Pyro; + private readonly static ConcurrentDictionary playersWithSkill = []; public static void LoadSkill() { @@ -31,14 +32,77 @@ namespace src.player.skills SkillUtils.AddHealth(pawn, (int)(damage * SkillsInfo.GetValue(skillName, "regenerationMultiplier"))); } - public static void EnableSkill(CCSPlayerController player) + public static void GrenadeThrown(EventGrenadeThrown @event) { - SkillUtils.TryGiveWeapon(player, player.Team == CsTeam.CounterTerrorist ? CsItem.IncendiaryGrenade : CsItem.Molotov); + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Weapon; + if (weapon != "molotov" && weapon != "incgrenade") return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + playersWithSkill[player.Index] = grenadesLeft - 1; + player!.GiveNamedItem($"weapon_{weapon}"); + SkillUtils.UpdateGrenadeCount(player, CsItem.Molotov, grenadesLeft - 1); + SkillUtils.UpdateGrenadeCount(player, CsItem.IncendiaryGrenade, grenadesLeft - 1); + } } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#3c47de", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float regenerationMultiplier = 1.5f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public static void WeaponEquip(EventItemEquip @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + SkillUtils.UpdateGrenadeCount(player, CsItem.Molotov, grenadesLeft); + SkillUtils.UpdateGrenadeCount(player, CsItem.IncendiaryGrenade, grenadesLeft); + } + } + + public static void WeaponPickup(EventItemPickup @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Item; + if (string.IsNullOrEmpty(weapon) || weapon != "hegrenade") return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadesLeft); + } + + public static void EnableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); + playersWithSkill.TryAdd(player.Index, grenadeLimit); + + var item = player.Team == CsTeam.CounterTerrorist ? CsItem.IncendiaryGrenade : CsItem.Molotov; + + SkillUtils.TryGiveWeapon(player, item); + SkillUtils.UpdateGrenadeCount(player, item, grenadeLimit); + } + + public static void DisableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + playersWithSkill.TryRemove(player.Index, out _); + SkillUtils.UpdateGrenadeCount(player, CsItem.Molotov, 1); + SkillUtils.UpdateGrenadeCount(player, CsItem.IncendiaryGrenade, 1); + } + + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#3c47de", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float regenerationMultiplier = 1.5f, int grenadeLimit = 2) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public float RegenerationMultiplier { get; set; } = regenerationMultiplier; + public int GrenadeLimit { get; set; } = grenadeLimit; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs b/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs index c93b08c..0250248 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ReZombie.cs @@ -11,7 +11,7 @@ namespace src.player.skills public class ReZombie : ISkill { private const Skills skillName = Skills.ReZombie; - private static readonly ConcurrentDictionary zombies = []; + private static readonly ConcurrentDictionary zombies = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -76,25 +76,57 @@ namespace src.player.skills var pawn = victim.PlayerPawn.Value; if (pawn == null || !pawn.IsValid) return; - if (zombies.ContainsKey(victim.Index)) return; + bool isZombie = zombies.TryGetValue(victim.Index, out int tick); + + if (isZombie && tick + 4 < Server.TickCount) + return; var playerInfo = PlayerManager.GetPlayerByIndex(victim.Index); - if (playerInfo?.Skill != skillName || pawn.Health > 0) return; + if (playerInfo?.Skill != skillName) return; - lock (setLock) + var zombieHealth = SkillsInfo.GetValue(skillName, "zombieHealth"); + + if (pawn.Health <= 0) { - var zombieHealth = SkillsInfo.GetValue(skillName, "zombieHealth"); bool isBlock = victim.TeamChanged; - zombies.TryAdd(victim.Index, 0); + zombies[victim.Index] = Server.TickCount; if (isBlock) return; + DropAllBotWeapons(victim); SetPlayerColor(pawn, false); SkillUtils.AddHealth(pawn, zombieHealth - pawn.Health, zombieHealth); victim.ExecuteClientCommand("slot3"); } + else if (isZombie && tick + 4 > Server.TickCount) + SkillUtils.AddHealth(pawn, zombieHealth - pawn.Health, zombieHealth); + } + + private static void DropAllBotWeapons(CCSPlayerController player) + { + if (player == null || !player.IsValid || !player.IsBot) return; + + var pawn = player.PlayerPawn?.Value; + if (pawn == null || !pawn.IsValid) return; + + var itemServices = pawn.ItemServices?.As(); + if (itemServices == null || pawn.WeaponServices?.MyWeapons == null) return; + + foreach (var item in pawn.WeaponServices.MyWeapons) + { + if (item == null || !item.IsValid) continue; + + var weapon = item.Value; + if (weapon == null || !weapon.IsValid) continue; + + var weaponName = weapon.DesignerName; + if (string.IsNullOrEmpty(weaponName) || weaponName.Contains("knife") || weaponName.Contains("bayonet")) + continue; + + SkillUtils.SafeKillEntity(weapon.Index); + } } public static bool OnWeaponCanAcquire(DynamicHook hook, CCSPlayerController player, CEconItemView econItem, CCSWeaponBaseVData vdata) diff --git a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs index b18ccaf..c791b62 100644 --- a/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/SecondLife.cs @@ -10,7 +10,7 @@ namespace src.player.skills public class SecondLife : ISkill { private const Skills skillName = Skills.SecondLife; - private static readonly ConcurrentDictionary secondLifePlayers = []; + private static readonly ConcurrentDictionary secondLifePlayers = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -26,24 +26,24 @@ namespace src.player.skills public static void PlayerHurt(EventPlayerHurt @event) { var victim = PlayerManager.GetPlayerEvent(@event.Userid); - int damage = @event.DmgHealth; if (!Instance.IsPlayerValid(victim)) return; var victimInfo = PlayerManager.GetPlayerByIndex(victim!.Index); if (victimInfo == null || victimInfo.Skill != skillName) return; var victimPawn = victim!.PlayerPawn.Value; - if (victimPawn!.Health > 0 || secondLifePlayers.ContainsKey(victim.Handle)) + if (victimPawn!.Health > 0 || (secondLifePlayers.TryGetValue(victim.Handle, out int tick) && tick + 4 < Server.TickCount)) return; lock (setLock) { - secondLifePlayers.TryAdd(victim.Handle, 0); SetHealth(victim, SkillsInfo.GetValue(skillName, "startHealth")); var spawnpoint = SkillUtils.GetSpawnPointVector(victim); if (spawnpoint == null) return; + victimPawn.Teleport(spawnpoint, null, null); + secondLifePlayers.TryAdd(victim.Handle, Server.TickCount); } } diff --git a/jRandomSkills - SRC Files/src/player/skills/Smoker.cs b/jRandomSkills - SRC Files/src/player/skills/Smoker.cs index dc787f6..2e2f065 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Smoker.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Smoker.cs @@ -14,6 +14,7 @@ namespace src.player.skills { private const Skills skillName = Skills.Smoker; private readonly static ConcurrentDictionary> playerSmokes = []; + private readonly static ConcurrentDictionary playersWithSkill = []; private static readonly object setLock = new(); public static void LoadSkill() @@ -31,15 +32,65 @@ namespace src.player.skills } } + public static void GrenadeThrown(EventGrenadeThrown @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Weapon; + if (weapon != "smokegrenade") return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + playersWithSkill[player.Index] = grenadesLeft - 1; + player!.GiveNamedItem($"weapon_{weapon}"); + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadesLeft - 1); + } + } + + public static void WeaponEquip(EventItemEquip @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadesLeft); + } + + public static void WeaponPickup(EventItemPickup @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Item; + if (string.IsNullOrEmpty(weapon) || weapon != "smokegrenade") return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadesLeft); + } + public static void EnableSkill(CCSPlayerController player) { + if (player == null || !player.IsValid) return; + + int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); + playersWithSkill.TryAdd(player.Index, grenadeLimit); + SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadeLimit); } public static void DisableSkill(CCSPlayerController player) { if (playerSmokes.TryRemove(player.Index, out var timers)) timers.ForEach(t => t?.Kill()); + + playersWithSkill.TryRemove(player.Index, out _); + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, 1); } public static void SmokegrenadeDetonate(EventSmokegrenadeDetonate @event) @@ -72,8 +123,9 @@ namespace src.player.skills playerSmokes.AddOrUpdate(player.Index, [smokeTimer], (_, list) => { list.Add(smokeTimer); return list; }); } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#b5ab8f", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = 1, Rarity rarity = Rarity.Common) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#b5ab8f", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = 1, Rarity rarity = Rarity.Common, int grenadeLimit = 1) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { + public int GrenadeLimit { get; set; } = grenadeLimit; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Spectator.cs b/jRandomSkills - SRC Files/src/player/skills/Spectator.cs index 7ed2915..f3aaa2c 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Spectator.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Spectator.cs @@ -58,6 +58,7 @@ namespace src.player.skills foreach (var player in Utilities.GetPlayers()) if (cameras.TryGetValue(player.Index, out var cameraInfo) && cameraInfo.Item2 != 0) { + if (player == null || !player.IsValid) return; var enemy = Utilities.GetPlayerFromIndex((int)cameraInfo.Item3); if (enemy == null || !enemy.IsValid || enemy.PlayerPawn == null) @@ -73,16 +74,18 @@ namespace src.player.skills return; } - if (enemyPawn.LifeState != (byte)LifeState_t.LIFE_ALIVE - || (player.PlayerPawn.Value != null && player.PlayerPawn.Value.LifeState != (byte)LifeState_t.LIFE_ALIVE)) + if (enemyPawn.Health <= 0 || (player.PlayerPawn?.Value != null && player.PlayerPawn.Value.Health <= 0)) ChangeCamera(player, true); } } private static void ChangeCamera(CCSPlayerController player, bool forceToDefault = false) { + if (player == null || !player.IsValid) return; + uint orginalCameraRaw; uint newCameraRaw = 0; + var pawn = player.PlayerPawn.Value; if (pawn == null || !pawn.IsValid || pawn.CameraServices == null) return; @@ -165,9 +168,9 @@ namespace src.player.skills }); if (cameras.TryGetValue(player.Index, out var cameraInfo)) - cameras.AddOrUpdate(player.Index, (cameraInfo.Item1, camera.Index, player.Index), (k, v) => (cameraInfo.Item1, camera.Index, player.Index)); + cameras.AddOrUpdate(player.Index, (cameraInfo.Item1, camera.Index, enemy.Index), (k, v) => (cameraInfo.Item1, camera.Index, enemy.Index)); else - cameras.AddOrUpdate(player.Index, (pawn.CameraServices.ViewEntity.Raw, camera.Index, player.Index), (k, v) => (pawn.CameraServices.ViewEntity.Raw, camera.Index, player.Index)); + cameras.AddOrUpdate(player.Index, (pawn.CameraServices.ViewEntity.Raw, camera.Index, enemy.Index), (k, v) => (pawn.CameraServices.ViewEntity.Raw, camera.Index, enemy.Index)); return camera.EntityHandle.Raw; } diff --git a/jRandomSkills - SRC Files/src/player/skills/Thief.cs b/jRandomSkills - SRC Files/src/player/skills/Thief.cs index ded984e..c3c2792 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Thief.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Thief.cs @@ -50,7 +50,7 @@ namespace src.player.skills var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; - menuItems.Add(($"{enemy.PlayerName} : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); + menuItems.Add(($"\u202A{enemy.PlayerName}\u202C : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); } SkillUtils.UpdateMenu(player, menuItems); } @@ -120,7 +120,7 @@ namespace src.player.skills var skillData = SkillData.Skills.FirstOrDefault(s => s.Skill == enemyInfo.Skill); if (skillData == null) continue; - menuItems.Add(($"{enemy.PlayerName} : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); + menuItems.Add(($"\u202A{enemy.PlayerName}\u202C : {player.GetSkillName(skillData.Skill)}", enemy.Index.ToString())); } SkillUtils.CreateMenu(player, menuItems); diff --git a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs index 3ea7b3c..e760e70 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Thorns.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Thorns.cs @@ -1,4 +1,3 @@ -using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Utils; using src.utils; @@ -36,14 +35,18 @@ namespace src.player.skills var victimInfo = PlayerManager.GetPlayerByIndex(victimEvent!.Index); if (victimInfo?.Skill == skillName) { - SkillUtils.TakeHealth(attackerEvent.PlayerPawn.Value, (int)(@event.DmgHealth * SkillsInfo.GetValue(skillName, "healthTakenScale"))); + int damage = (int)(@event.DmgHealth * SkillsInfo.GetValue(skillName, "healthTakenScale")); + damage = Math.Min(damage, SkillsInfo.GetValue(skillName, "maxTakenDamagePerShot")); + + SkillUtils.TakeHealth(attackerEvent.PlayerPawn.Value, damage); attackerEvent.EmitSound("Player.DamageBody.Onlooker"); } } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#962631", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float healthTakenScale = .3f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#962631", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float healthTakenScale = .3f, int maxTakenDamagePerShot = 37) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public float HealthTakenScale { get; set; } = healthTakenScale; + public int MaxTakenDamagePerShot { get; set; } = maxTakenDamagePerShot; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs b/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs index 8b28f73..6ce287a 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ThrowingKnife.cs @@ -1,6 +1,7 @@ using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes; +using CounterStrikeSharp.API.Modules.Entities; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; using CounterStrikeSharp.API.Modules.Timers; using CounterStrikeSharp.API.Modules.UserMessages; @@ -122,12 +123,15 @@ namespace src.player.skills public static void EnableSkill(CCSPlayerController _) { Event.EnableTransmit(); + SkillUtils.ForceFullUpdateToAll(); } public static void DisableSkill(CCSPlayerController player) { if (knivesInfo.TryRemove(player.Index, out KnifeInfo? knifeInfo) && knifeInfo != null) DisableKnifeSkill(knifeInfo); + + SkillUtils.ForceFullUpdateToAll(); } public static void DisableKnifeSkill(KnifeInfo knifeInfo) @@ -388,7 +392,8 @@ namespace src.player.skills bool isObservingOwner = observedPlayerIndex.HasValue && observedPlayerIndex.Value == knifeOwnerIndex; if (!isOwner && !isObservingOwner) - info.TransmitEntities.Remove(glowEntity.Index); + if (info.TransmitEntities.Contains(glowEntity.Index)) + info.TransmitEntities.Remove(glowEntity.Index); } } } diff --git a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs index 1ce09b7..135a541 100644 --- a/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs +++ b/jRandomSkills - SRC Files/src/player/skills/ToxicSmoke.cs @@ -11,6 +11,7 @@ namespace src.player.skills { private const Skills skillName = Skills.ToxicSmoke; private static readonly ConcurrentDictionary smokes = []; + private readonly static ConcurrentDictionary playersWithSkill = []; public static void LoadSkill() { @@ -95,16 +96,72 @@ namespace src.player.skills } } - public static void EnableSkill(CCSPlayerController player) + public static void GrenadeThrown(EventGrenadeThrown @event) { - SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Weapon; + if (weapon != "smokegrenade") return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + playersWithSkill[player.Index] = grenadesLeft - 1; + player!.GiveNamedItem($"weapon_{weapon}"); + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadesLeft - 1); + } } - 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 maxPerServer = -1, Rarity rarity = Rarity.Common, int smokeDamage = 2, float smokeRadius = 180, int tickCooldown = 17) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public static void WeaponEquip(EventItemEquip @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadesLeft); + } + + public static void WeaponPickup(EventItemPickup @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Item; + if (string.IsNullOrEmpty(weapon) || weapon != "smokegrenade") return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadesLeft); + } + + public static void EnableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); + playersWithSkill.TryAdd(player.Index, grenadeLimit); + + SkillUtils.TryGiveWeapon(player, CsItem.SmokeGrenade); + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, grenadeLimit); + } + + public static void DisableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + playersWithSkill.TryRemove(player.Index, out _); + SkillUtils.UpdateGrenadeCount(player, CsItem.SmokeGrenade, 1); + } + + 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 maxPerServer = -1, Rarity rarity = Rarity.Common, int smokeDamage = 2, float smokeRadius = 180, int tickCooldown = 17, int grenadeLimit = 1) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public int SmokeDamage { get; set; } = smokeDamage; public float SmokeRadius { get; set; } = smokeRadius; public int TickCooldown { get; set; } = tickCooldown; + public int GrenadeLimit { get; set; } = grenadeLimit; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs index 9d9a270..6f15728 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Wallhack.cs @@ -12,7 +12,8 @@ namespace src.player.skills { private const Skills skillName = Skills.Wallhack; private static readonly ConcurrentDictionary playersInAction = new(); - private static ConcurrentDictionary glows = new(); + private static readonly ConcurrentDictionary glows = new(); + private static readonly ConcurrentDictionary temporaryBlockList = new(); public static void LoadSkill() { @@ -21,6 +22,12 @@ namespace src.player.skills public static void CheckTransmit([CastFrom(typeof(nint))] CCheckTransmitInfoList infoList) { + foreach (var kvp in temporaryBlockList) + { + if (DateTime.Now > kvp.Value) + temporaryBlockList.TryRemove(kvp.Key, out _); + } + foreach (var (info, player) in infoList) { if (player == null || !player.IsValid) continue; @@ -54,11 +61,20 @@ namespace src.player.skills var glowEntity1 = Utilities.GetEntityFromIndex((int)glowInfo.RelayIndex); if (glowEntity1 == null || !glowEntity1.IsValid) continue; + var glowEntity2 = Utilities.GetEntityFromIndex((int)glowInfo.GlowIndex); if (glowEntity2 == null || !glowEntity2.IsValid) continue; - info.TransmitEntities.Remove(glowEntity1.Index); - info.TransmitEntities.Remove(glowEntity2.Index); + + if (info.TransmitEntities.Contains(glowEntity1.Index)) + info.TransmitEntities.Remove(glowEntity1.Index); + + if (info.TransmitEntities.Contains(glowEntity2.Index)) + info.TransmitEntities.Remove(glowEntity2.Index); } + + foreach (var kvp in temporaryBlockList) + if (info.TransmitEntities.Contains(kvp.Key)) + info.TransmitEntities.Remove(kvp.Key); } } @@ -71,6 +87,9 @@ namespace src.player.skills SkillUtils.SafeKillEntity(relayIndex); SkillUtils.SafeKillEntity(glowIndex); + + temporaryBlockList.TryAdd(relayIndex, DateTime.Now.AddSeconds(2)); + temporaryBlockList.TryAdd(glowIndex, DateTime.Now.AddSeconds(2)); } glows.Clear(); @@ -81,15 +100,21 @@ namespace src.player.skills { Event.EnableTransmit(); playersInAction.TryAdd(player.Index, 0); + if (glows.IsEmpty) SetGlowEffectForAll(); + + SkillUtils.ForceFullUpdateToAll(); } public static void DisableSkill(CCSPlayerController player) { playersInAction.TryRemove(player.Index, out _); + if (playersInAction.IsEmpty) NewRound(); + + SkillUtils.ForceFullUpdateToAll(); } private static void SetGlowEffectForAll() diff --git a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs index 78f490b..ea19f9e 100644 --- a/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs +++ b/jRandomSkills - SRC Files/src/player/skills/WeaponsSwap.cs @@ -15,7 +15,7 @@ namespace src.player.skills private static readonly HashSet weapons = [ "weapon_deagle", "weapon_revolver", "weapon_glock", "weapon_usp_silencer", "weapon_cz75a", "weapon_fiveseven", "weapon_p250", "weapon_tec9", "weapon_elite", "weapon_hkp2000", - "weapon_mp9", "weapon_mac10", "weapon_bizon", "weapon_mp7", "weapon_ump45", "weapon_p90", + "weapon_mp9", "weapon_mac10", "weapon_bizon", "weapon_mp7", "weapon_ump45", "weapon_p90", "weapon_sg556", "weapon_mp5sd", "weapon_famas", "weapon_galilar", "weapon_m4a4", "weapon_m4a1_silencer", "weapon_ak47", "weapon_aug", "weapon_sg553", "weapon_ssg08", "weapon_awp", "weapon_scar20", "weapon_g3sg1", "weapon_nova", "weapon_xm1014", "weapon_mag7", "weapon_sawedoff", "weapon_m249", "weapon_negev" ]; @@ -114,10 +114,10 @@ namespace src.player.skills return; } - string[]? playerWeapon = GetWeapons(player); - string[]? enemyWeapon = GetWeapons(enemy); + (WeaponInfo[]? playerWeapon, bool playerC4) = GetWeapons(player); + (WeaponInfo[]? enemyWeapon, bool enemyC4) = GetWeapons(enemy); - if (playerWeapon == null || !playerWeapon.Any(w => weapons.Contains(w))) + if (playerWeapon == null || !playerWeapon.Any(w => weapons.Contains(w.Name))) { skillInfo.FindedEnemy = true; skillInfo.HaveWeapon = false; @@ -139,8 +139,8 @@ namespace src.player.skills if (enemy == null || !enemy.IsValid) return; player.RemoveWeapons(); enemy.RemoveWeapons(); - GiveWeapons(player, enemyWeapon, playerWeapon.Contains("weapon_c4")); - GiveWeapons(enemy, playerWeapon, (enemyWeapon != null && enemyWeapon.Contains("weapon_c4"))); + GiveWeapons(player, enemyWeapon, playerC4); + GiveWeapons(enemy, playerWeapon, (enemyWeapon != null && enemyC4)); }); } else @@ -148,28 +148,76 @@ namespace src.player.skills } } - private static string[]? GetWeapons(CCSPlayerController player) + private static (WeaponInfo[]?, bool) GetWeapons(CCSPlayerController player) { + bool haveC4 = false; + var pawn = player.PlayerPawn.Value; - if (pawn == null || !pawn.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return null; - if (pawn.WeaponServices == null) return null; + if (pawn == null || !pawn.IsValid || player.LifeState != (byte)LifeState_t.LIFE_ALIVE) return (null, haveC4); + + if (pawn.WeaponServices == null) return (null, haveC4); - var list = new List(); + var list = new List(); foreach (var weapon in pawn.WeaponServices.MyWeapons) - if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid) - list.Add(SkillUtils.GetDesignerName(weapon.Value)); + if (weapon != null && weapon.IsValid && weapon.Value != null && weapon.Value.IsValid && !string.IsNullOrEmpty(weapon.Value.DesignerName)) + { + if (weapon.Value.DesignerName == "weapon_c4") + haveC4 = true; + else + { + list.Add( + new WeaponInfo + { + Name = SkillUtils.GetDesignerName(weapon.Value), + Clip1 = weapon.Value.Clip1, + Clip2 = weapon.Value.Clip2, + Reserve = weapon.Value.ReserveAmmo.Length >= 1 ? weapon.Value.ReserveAmmo[0] : 0, + }); + } + } - return list.Count == 0 ? null : [.. list]; + return (list.Count == 0 ? null : [.. list], haveC4); } - private static void GiveWeapons(CCSPlayerController player, string[]? weapons, bool addC4) + private static void GiveWeapons(CCSPlayerController player, WeaponInfo[]? weapons, bool addC4) { if (weapons == null) return; + uint index = player.Index; + foreach (var weapon in weapons) - if (weapon != "weapon_c4") - player.GiveNamedItem(weapon); + player.GiveNamedItem(weapon.Name); + if (addC4) player.GiveNamedItem("weapon_c4"); + + Server.NextFrame(() => + { + var player = Utilities.GetPlayerFromIndex((int)index); + if (player == null || !player.IsValid) return; + + var pawn = player.PlayerPawn.Value; + if (pawn == null || !pawn.IsValid) return; + + if (pawn.WeaponServices == null) return; + + foreach (var item in pawn.WeaponServices.MyWeapons) + if (item != null && item.IsValid) + { + var weapon = item.Value; + if (weapon == null || !weapon.IsValid || string.IsNullOrEmpty(weapon.DesignerName)) continue; + + var enemyWeapon = weapons.FirstOrDefault(w => w.Name == SkillUtils.GetDesignerName(weapon)); + if (enemyWeapon == null) continue; + + weapon.Clip1 = enemyWeapon.Clip1; + weapon.Clip2 = enemyWeapon.Clip2; + weapon.ReserveAmmo.Fill(enemyWeapon.Reserve); + + Utilities.SetStateChanged(weapon, "CBasePlayerWeapon", "m_iClip1"); + Utilities.SetStateChanged(weapon, "CBasePlayerWeapon", "m_iClip2"); + Utilities.SetStateChanged(weapon, "CBasePlayerWeapon", "m_pReserveAmmo"); + } + }); } private static CCSPlayerController? GetRandomEnemy(CCSPlayerController player) @@ -199,6 +247,15 @@ namespace src.player.skills public bool HaveWeapon { get; set; } } + public class WeaponInfo + { + public required string Name { get; set; } + public required int Clip1 { get; set; } + public required int Clip2 { get; set; } + public required int Reserve { get; set; } + + } + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#c7e03a", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, float cooldown = 30f) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) { public float Cooldown { get; set; } = cooldown; diff --git a/jRandomSkills - SRC Files/src/player/skills/Weightless.cs b/jRandomSkills - SRC Files/src/player/skills/Weightless.cs index 0df985b..ff10464 100644 --- a/jRandomSkills - SRC Files/src/player/skills/Weightless.cs +++ b/jRandomSkills - SRC Files/src/player/skills/Weightless.cs @@ -11,6 +11,7 @@ namespace src.player.skills { private const Skills skillName = Skills.Weightless; private readonly static ConcurrentDictionary nades = []; + private readonly static ConcurrentDictionary playersWithSkill = []; public static void LoadSkill() { @@ -79,13 +80,69 @@ namespace src.player.skills }); } - public static void EnableSkill(CCSPlayerController player) + public static void GrenadeThrown(EventGrenadeThrown @event) { - SkillUtils.TryGiveWeapon(player, CsItem.HEGrenade); + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Weapon; + if (weapon != "hegrenade") return; + + var playerInfo = PlayerManager.GetPlayerByIndex(player!.Index); + if (playerInfo?.Skill != skillName) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + { + playersWithSkill[player.Index] = grenadesLeft - 1; + player!.GiveNamedItem($"weapon_{weapon}"); + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadesLeft - 1); + } } - public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8f6dc9", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + public static void WeaponEquip(EventItemEquip @event) { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + var weapon = @event.Item; + if (player == null || !player.IsValid) return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadesLeft); + } + + public static void WeaponPickup(EventItemPickup @event) + { + var player = PlayerManager.GetPlayerEvent(@event.Userid); + if (player == null || !player.IsValid) return; + + var weapon = @event.Item; + if (string.IsNullOrEmpty(weapon) || weapon != "hegrenade") return; + + if (playersWithSkill.TryGetValue(player.Index, out int grenadesLeft) && grenadesLeft > 1) + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadesLeft); + } + + public static void EnableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + int grenadeLimit = SkillsInfo.GetValue(skillName, "grenadeLimit"); + playersWithSkill.TryAdd(player.Index, grenadeLimit); + + SkillUtils.TryGiveWeapon(player, CsItem.HEGrenade); + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, grenadeLimit); + } + + public static void DisableSkill(CCSPlayerController player) + { + if (player == null || !player.IsValid) return; + + playersWithSkill.TryRemove(player.Index, out _); + SkillUtils.UpdateGrenadeCount(player, CsItem.HEGrenade, 1); + } + + public class SkillConfig(Skills skill = skillName, bool active = true, string color = "#8f6dc9", CsTeam onlyTeam = CsTeam.None, bool disableOnFreezeTime = false, bool needsTeammates = false, string requiredPermission = "", int maxPerServer = -1, Rarity rarity = Rarity.Common, int grenadeLimit = 2) : SkillsInfo.DefaultSkillInfo(skill, active, color, onlyTeam, disableOnFreezeTime, needsTeammates, requiredPermission, maxPerServer, rarity) + { + public int GrenadeLimit { get; set; } = grenadeLimit; } } } \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/utils/CServerSideClient.cs b/jRandomSkills - SRC Files/src/utils/CServerSideClient.cs new file mode 100644 index 0000000..7b50de7 --- /dev/null +++ b/jRandomSkills - SRC Files/src/utils/CServerSideClient.cs @@ -0,0 +1,101 @@ +// https://discord.com/channels/1160907911501991946/1508172390863994910/1508180670659166348 + +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using CounterStrikeSharp.API; +using CounterStrikeSharp.API.Core; +using CounterStrikeSharp.API.Modules.Memory; + +namespace jRandomSkills.src.utils +{ + + #region Native Structs + + [StructLayout(LayoutKind.Sequential)] + public unsafe struct CUtlMemory where T : unmanaged + { + public T* m_pMemory; + public int m_nAllocationCount; + public int m_nGrowSize; + } + + [StructLayout(LayoutKind.Sequential)] + public unsafe struct CUtlVector where T : unmanaged + { + public int m_Size; + public CUtlMemory m_Memory; + + public int Count => m_Size; + + public ref T Element(int index) + { + if (index < 0 || index >= m_Size) + throw new IndexOutOfRangeException(); + + return ref m_Memory.m_pMemory[index]; + } + } + + #endregion + + #region Network Services + + public class INetworkServerService : NativeObject + { + private readonly VirtualFunctionWithReturn GetIGameServerFunc; + + public INetworkServerService() : base(NativeAPI.GetValveInterface(0, "NetworkServerService_001")) + { + GetIGameServerFunc = new VirtualFunctionWithReturn(Handle, GameData.GetOffset("INetworkServerService_GetIGameServer")); + } + + public INetworkGameServer GetIGameServer() + { + return new INetworkGameServer(GetIGameServerFunc.Invoke(Handle)); + } + } + + public unsafe class INetworkGameServer(nint ptr) : NativeObject(ptr) + { + private static readonly int SlotsOffset = GameData.GetOffset("INetworkGameServer_Slots"); + + private ref CUtlVector Slots => ref Unsafe.AsRef>((void*)(Handle + SlotsOffset)); + + public CServerSideClient? GetClientBySlot(int slot) + { + if (slot < 0 || slot >= Slots.Count) + return null; + + var ptr = Slots.Element(slot); + + if (ptr == nint.Zero) + return null; + + return new CServerSideClient(ptr); + } + } + + #endregion + + #region CServerSideClient + + public unsafe class CServerSideClient(nint ptr) : NativeObject(ptr) + { + private static readonly int m_nDeltaTick = GameData.GetOffset("CServerSideClient_m_nDeltaTick"); + + private ref T Field(int offset) where T : unmanaged + { + return ref Unsafe.AsRef((void*)(Handle + offset)); + } + + public int DeltaTick + { + get => Field(m_nDeltaTick); + set => Field(m_nDeltaTick) = value; + } + + public void ForceFullUpdate() => DeltaTick = -1; + } + + #endregion +} \ No newline at end of file diff --git a/jRandomSkills - SRC Files/src/utils/Config.cs b/jRandomSkills - SRC Files/src/utils/Config.cs index 9b1027b..f25b19c 100644 --- a/jRandomSkills - SRC Files/src/utils/Config.cs +++ b/jRandomSkills - SRC Files/src/utils/Config.cs @@ -131,6 +131,7 @@ namespace src.utils new LanguageInfo("PT-BR, PT, BR, AO, CV, GW, MZ, ST, TL", "pt-br"), new LanguageInfo("FR, MC, HT", "fr"), new LanguageInfo("DE, AT, CH, LI, LU, BE", "de"), + new LanguageInfo("RU, KZ, BY, KG, TJ, UZ, TM, AM, AZ, GE, MD", "ru"), new LanguageInfo("TR", "tr"), new LanguageInfo("CZ", "cs"), new LanguageInfo("PL", "pl"), diff --git a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs index b24c1a6..d95ce2f 100644 --- a/jRandomSkills - SRC Files/src/utils/SkillUtils.cs +++ b/jRandomSkills - SRC Files/src/utils/SkillUtils.cs @@ -4,8 +4,10 @@ using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Entities.Constants; using CounterStrikeSharp.API.Modules.Memory; using CounterStrikeSharp.API.Modules.Memory.DynamicFunctions; +using CounterStrikeSharp.API.Modules.Timers; using CounterStrikeSharp.API.Modules.UserMessages; using CounterStrikeSharp.API.Modules.Utils; +using jRandomSkills.src.utils; using src.player; using src.player.skills; using System.Collections.Concurrent; @@ -56,7 +58,30 @@ namespace src.utils SkillData.Skills.Add(new jSkill_SkillInfo(skill, color, display)); } - public static void TryGiveWeapon(CCSPlayerController player, CsItem item, int count = 1) + public static void UpdateGrenadeCount(CCSPlayerController player, CsItem item, int ammo) + { + string? itemString = EnumUtils.GetEnumMemberAttributeValue(item); + if (string.IsNullOrWhiteSpace(itemString)) return; + + if (player == null || !player.IsValid || player.PlayerPawn.Value == null || !player.PlayerPawn.Value.IsValid) return; + if (player.PlayerPawn.Value.WeaponServices == null) return; + + var weapon = player.PlayerPawn.Value.WeaponServices.MyWeapons + .FirstOrDefault(w => w != null && w.IsValid && w.Value != null && w.Value.IsValid && !string.IsNullOrEmpty(w.Value.DesignerName) && w.Value.DesignerName == itemString); + + if (weapon == null || !weapon.IsValid || weapon.Value == null || !weapon.Value.IsValid) return; + + weapon.Value.Clip1 = ammo; + Utilities.SetStateChanged(weapon.Value, "CBasePlayerWeapon", "m_iClip1"); + + jRandomSkills.Instance.AddTimer(.1f, () => + { + if (weapon == null || !weapon.IsValid || weapon.Value == null || !weapon.Value.IsValid) return; + weapon.Value.Clip1 = 1; + }, TimerFlags.STOP_ON_MAPCHANGE); + } + + public static void TryGiveWeapon(CCSPlayerController player, CsItem item, int count = 1, bool existValidator = true) { string? itemString = EnumUtils.GetEnumMemberAttributeValue(item); if (string.IsNullOrWhiteSpace(itemString)) return; @@ -66,7 +91,8 @@ namespace src.utils var exists = player.PlayerPawn.Value.WeaponServices.MyWeapons .FirstOrDefault(w => w != null && w.IsValid && w.Value != null && w.Value.IsValid && w.Value.DesignerName == itemString); - if (exists == null) + + if (exists == null || !existValidator) for (int i = 0; i < count; i++) player.GiveNamedItem(item); } @@ -259,6 +285,9 @@ namespace src.utils var jester = Jester.GetJesterInfo(player.Index); if (jester?.Active == true) return false; + + if (playerInfo.Skill == Skills.GodMode && GodMode.HaveHodMode(player.Index)) + return false; } int newHealth = (int)(pawn.Health - damage); @@ -291,9 +320,35 @@ namespace src.utils return EntityManager.CreateTrackedTrigger(ownerPlayerIndex, name, radius, pos); } + public static void ForceFullUpdate(CCSPlayerController player) + { + if (player == null || !player.IsValid) + return; + + var pawn = player.PlayerPawn?.Value; + if (pawn == null || !pawn.IsValid || pawn.AbsOrigin == null) return; + + QAngle lastAngle = new(pawn.V_angle.X, pawn.V_angle.Y, pawn.V_angle.Z); + + INetworkServerService networkServerService = new(); + INetworkGameServer networkGameServer = networkServerService.GetIGameServer(); + + var client = networkGameServer.GetClientBySlot(player.Slot); + if (client == null) return; + + client.ForceFullUpdate(); + pawn.Look(lastAngle); + } + + public static void ForceFullUpdateToAll() + { + foreach (var player in Utilities.GetPlayers()) + ForceFullUpdate(player); + } + public static bool AddHealth(CCSPlayerPawn? pawn, int extraHealth, int? maxHealth = null) { - if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE) + if (pawn == null || !pawn.IsValid || pawn.LifeState != (byte)LifeState_t.LIFE_ALIVE || pawn.Health <= 0) return false; maxHealth ??= pawn.MaxHealth; @@ -381,6 +436,18 @@ namespace src.utils return manager.HasMenu(player); } + private static string GetInvisibleSignature(string id) + { + if (string.IsNullOrEmpty(id)) return ""; + var sb = new System.Text.StringBuilder(); + + foreach (char c in id) + for (int i = 0; i < 8; i++) + sb.Append(((c >> i) & 1) == 1 ? "\u200B" : "\u200C"); + + return sb.ToString(); + } + public static void UpdateMenu(CCSPlayerController? player, ConcurrentBag<(string, string)> items) { if (player == null) return; @@ -395,13 +462,19 @@ namespace src.utils Dictionary> list = []; foreach (var item in items) - list.TryAdd(isIlliterate + { + string encodedText = isIlliterate ? System.Net.WebUtility.HtmlEncode(Illiterate.GetRandomText(item.Item1)!) - : System.Net.WebUtility.HtmlEncode(item.Item1), (p, option) => + : System.Net.WebUtility.HtmlEncode(item.Item1); + + string uniqueKey = GetInvisibleSignature(item.Item2) + $"\u202A{encodedText}\u202C"; + + list.TryAdd(uniqueKey, (p, option) => { jRandomSkills.Instance.SkillAction(playerInfo.Skill.ToString(), "TypeSkill", [p, new[] { item.Item2 }]); manager.CloseMenu(p); }); + } manager.UpdateActiveMenu(player, list); } @@ -445,11 +518,11 @@ namespace src.utils string infoLine = string.IsNullOrEmpty(your_skill) ? "" - : $"{your_skill}:
"; + : $"\u202A{your_skill}:\u202C
"; string skillLine = Illiterate.CheckIlliterateSkill(player) - ? $"{Illiterate.GetRandomText(player.GetSkillName(skillData.Skill))}
" - : $"{player.GetSkillName(skillData.Skill)}
"; + ? $"\u202A{Illiterate.GetRandomText(player.GetSkillName(skillData.Skill))}\u202C
" + : $"\u202A{player.GetSkillName(skillData.Skill)}\u202C
"; var skill_select_info = player.GetTranslation($"{playerInfo.Skill.ToString().ToLower()}_select_info"); string remainingLine = string.IsNullOrWhiteSpace(skill_select_info) @@ -470,22 +543,34 @@ namespace src.utils IWasdMenu menu = manager.CreateMenu(hudContent, itemText, itemHoverText, controllsLine); foreach (var enemy in enemies) - menu.Add(isIlliterate + { + string encodedEnemyName = isIlliterate ? System.Net.WebUtility.HtmlEncode(Illiterate.GetRandomText(enemy.Item1)!) - : System.Net.WebUtility.HtmlEncode(enemy.Item1), (p, option) => + : System.Net.WebUtility.HtmlEncode(enemy.Item1); + + string uniqueKey = GetInvisibleSignature(enemy.Item2) + $"\u202A{encodedEnemyName}\u202C"; + + menu.Add(uniqueKey, (p, option) => { jRandomSkills.Instance.SkillAction(playerInfo.Skill.ToString(), "TypeSkill", [p, new[] { enemy.Item2 }]); manager.CloseMenu(p); }); + } + if (lastElement != null) - menu.Add(isIlliterate + { + string encodedLastElement = isIlliterate ? System.Net.WebUtility.HtmlEncode(Illiterate.GetRandomText(lastElement.Value.Item1)!) - : System.Net.WebUtility.HtmlEncode(lastElement.Value.Item1), (p, option) => + : System.Net.WebUtility.HtmlEncode(lastElement.Value.Item1); + + menu.Add($"\u202A{encodedLastElement}\u202C", (p, option) => { jRandomSkills.Instance.SkillAction(playerInfo.Skill.ToString(), "TypeSkill", [p, new[] { lastElement.Value.Item2 }]); if (lastElement.Value.Item3) manager.CloseMenu(p); }); + } + manager.OpenMainMenu(player, menu); } diff --git a/jRandomSkills - Server Files/gamedata/jRandomSkills.gamedata.json b/jRandomSkills - Server Files/gamedata/jRandomSkills.gamedata.json index a908333..2f7bc51 100644 --- a/jRandomSkills - Server Files/gamedata/jRandomSkills.gamedata.json +++ b/jRandomSkills - Server Files/gamedata/jRandomSkills.gamedata.json @@ -27,17 +27,22 @@ "linux": "55 48 89 E5 41 57 49 89 FF 48 89 F7 41 56 41 55 41 54 53 48 81 EC" } }, - "CCSPlayerController_HandleCommandDrop": { - "signatures": { - "library": "server", - "windows": "48 89 5C 24 ? 57 48 83 EC ? 48 8B FA E8 ? ? ? ? 48 8B D8", - "linux": "55 48 89 E5 41 54 49 89 F4 53 E8 ? ? ? ? 48 85 C0 74 ? 48 89 C3" + "CServerSideClient_m_nDeltaTick": { + "offsets": { + "windows": 348, + "linux": 348 } }, - "CBaseEntity_CollisionRulesChanged": { + "INetworkGameServer_Slots": { "offsets": { - "windows": 186, - "linux": 185 + "windows": 592, + "linux": 592 + } + }, + "INetworkServerService_GetIGameServer": { + "offsets": { + "windows": 23, + "linux": 24 } } } \ No newline at end of file diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/MaxMind.Db.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/MaxMind.Db.dll index 0608dde..3cd5dab 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/MaxMind.Db.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/MaxMind.Db.dll differ diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/Newtonsoft.Json.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/Newtonsoft.Json.dll index d035c38..5813d8c 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/Newtonsoft.Json.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/Newtonsoft.Json.dll differ diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll index 8addc7b..0b03600 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/WASDMenuAPI.dll differ diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/configs/config.json b/jRandomSkills - Server Files/plugins/jRandomSkills/configs/config.json index ecdf209..d5e39fd 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/configs/config.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/configs/config.json @@ -38,6 +38,10 @@ "IsoCodes": "DE, AT, CH, LI, LU, BE", "FileName": "de" }, + { + "IsoCodes": "RU, KZ, BY, KG, TJ, UZ, TM, AM, AZ, GE, MD", + "FileName": "ru" + }, { "IsoCodes": "TR", "FileName": "tr" diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/configs/skillsInfo.json b/jRandomSkills - Server Files/plugins/jRandomSkills/configs/skillsInfo.json index afbb14b..979c6e2 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/configs/skillsInfo.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/configs/skillsInfo.json @@ -22,6 +22,7 @@ "Rarity": "Common" }, { + "GrenadeLimit": 2, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -72,6 +73,7 @@ "SmokeDamage": 2, "SmokeRadius": 180.0, "TickCooldown": 17, + "GrenadeLimit": 1, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -97,6 +99,7 @@ }, { "HealthTakenScale": 0.3, + "MaxTakenDamagePerShot": 37, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -205,6 +208,7 @@ "Rarity": "Common" }, { + "GrenadeLimit": 1, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -436,6 +440,7 @@ }, { "RegenerationMultiplier": 1.5, + "GrenadeLimit": 2, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -645,20 +650,6 @@ "MaxPerServer": -1, "Rarity": "Common" }, - { - "ExplosionRadius": 500.0, - "ExplosionDamage": 999, - "DmgReductionForTeamates": 0.5, - "NeedsTeammates": false, - "DisableOnFreezeTime": false, - "OnlyTeam": 0, - "Color": "#F5CB42", - "Active": true, - "Name": "Muhammed", - "RequiredPermission": "", - "MaxPerServer": -1, - "Rarity": "Common" - }, { "NeedsTeammates": false, "DisableOnFreezeTime": false, @@ -672,6 +663,7 @@ }, { "DetonationRange": 130.0, + "GrenadeLimit": 3, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -723,6 +715,7 @@ { "TriggerRadius": 180.0, "Strenght": 30.0, + "GrenadeLimit": 3, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -773,6 +766,7 @@ { "FlashDuration": 1.0, "FriendlyFire": true, + "GrenadeLimit": 1, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -921,6 +915,7 @@ "Strength": 150.0, "MaxVelocity": 2000.0, "DetonationRange": 130.0, + "GrenadeLimit": 2, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -934,6 +929,7 @@ { "DamageMultiplier": 2.0, "DamageRadiusMultiplier": 2.0, + "GrenadeLimit": 1, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -960,6 +956,7 @@ "SmokeHeal": 1, "SmokeRadius": 180.0, "TickCooldown": 16, + "GrenadeLimit": 1, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -1017,6 +1014,7 @@ "Rarity": "Common" }, { + "GrenadeLimit": 2, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -1053,6 +1051,7 @@ { "TriggerRadius": 180.0, "SlownessMultiplier": 5, + "GrenadeLimit": 3, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -1064,7 +1063,7 @@ "Rarity": "Common" }, { - "HealthMultiplier": 1.5, + "HealthDamageMultiplier": 0.3, "NeedsTeammates": true, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -1225,6 +1224,20 @@ "MaxPerServer": -1, "Rarity": "Common" }, + { + "ExplosionRadius": 500.0, + "ExplosionDamage": 999, + "DmgReductionForTeamates": 0.5, + "NeedsTeammates": false, + "DisableOnFreezeTime": false, + "OnlyTeam": 0, + "Color": "#F5CB42", + "Active": true, + "Name": "DeathBomb", + "RequiredPermission": "", + "MaxPerServer": -1, + "Rarity": "Common" + }, { "NeedsTeammates": false, "DisableOnFreezeTime": false, @@ -1404,6 +1417,7 @@ "SpeedMultipier": 2.0, "MaxSpeed": 900.0, "DamageDeal": 9999.0, + "GrenadeLimit": 3, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, @@ -1488,6 +1502,7 @@ }, { "FlashDuration": 7.0, + "GrenadeLimit": 2, "NeedsTeammates": false, "DisableOnFreezeTime": false, "OnlyTeam": 0, diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll index 26993a2..e8e0d41 100644 Binary files a/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll and b/jRandomSkills - Server Files/plugins/jRandomSkills/jRandomSkills.dll differ diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/de.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/de.json index f06a831..d0adf2d 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/de.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/de.json @@ -1,519 +1,519 @@ { - "none": "Keine", - "none_desc": "Du hast keine Fertigkeit", + "none": "Keine", + "none_desc": "Du hast keine Fertigkeit", - "aimbot": "Aimbot", - "aimbot_desc": "Jede Kugel, die du triffst, zählt als Kopfschuss", + "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", + "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", + "anomaly": "Anomalie", + "anomaly_desc": "Du spulst die Zeit um einige Sekunden zurück", - "antyflash": "Anti-Flash", - "antyflash_desc": "Du bist immun gegen Blendgranaten und deine Blendgranaten halten 7 Sekunden lang", + "antyflash": "Anti-Flash", + "antyflash_desc": "Du bist immun gegen Blendgranaten und deine Blendgranaten halten 7 Sekunden lang", - "antyhead": "Eiserner Kopf", - "antyhead_desc": "Du erleidest keinen Schaden durch Kopfschüsse", + "antyhead": "Eiserner Kopf", + "antyhead_desc": "Du erleidest keinen Schaden durch Kopfschüsse", - "areareaper": "Zone Reaper", - "areareaper_desc": "Du kannst einen Bombenort auswählen, den du deaktivieren möchtest", - "areareaper_incorrect_site": "Kein solcher Bombenort gefunden", - "areareaper_no_site": "Keine Bombenstandorte gefunden.", - "areareaper_select_info": "Standort zum Deaktivieren auswählen:", - "areareaper_site_disabled": "Bombenstandort {0} wurde deaktiviert – dort können keine Bomben platziert werden!", - "areareaper_used_info": "Deine Fähigkeit wurde bereits eingesetzt.", - "areareaper_bombsite_disabled": "Dieser Bombenplatz wurde deaktiviert!", + "areareaper": "Zone Reaper", + "areareaper_desc": "Du kannst einen Bombenort auswählen, den du deaktivieren möchtest", + "areareaper_incorrect_site": "Kein solcher Bombenort gefunden", + "areareaper_no_site": "Keine Bombenstandorte gefunden.", + "areareaper_select_info": "Standort zum Deaktivieren auswählen:", + "areareaper_site_disabled": "Bombenstandort {0} wurde deaktiviert – dort können keine Bomben platziert werden!", + "areareaper_used_info": "Deine Fähigkeit wurde bereits eingesetzt.", + "areareaper_bombsite_disabled": "Dieser Bombenplatz wurde deaktiviert!", - "armored": "Gepanzert", - "armored_desc": "Du hast einen zufälligen Schadensmultiplikator", - "armored_desc2": "Dein Schadensmultiplikator beträgt: {0}x", + "armored": "Gepanzert", + "armored_desc": "Du hast einen zufälligen Schadensmultiplikator", + "armored_desc2": "Dein Schadensmultiplikator beträgt: {0}x", - "assassin": "Attentäter", - "assassin_desc": "Du fügst Gegnern von hinten erhöhten Schaden zu", + "assassin": "Attentäter", + "assassin_desc": "Du fügst Gegnern von hinten erhöhten Schaden zu", - "astronaut": "Astronaut", - "astronaut_desc": "Du erhältst zu Beginn der Runde einen zufälligen Schwerkraftwert", - "astronaut_desc2": "Deine zufällige Schwerkraft beträgt: {0}x", + "astronaut": "Astronaut", + "astronaut_desc": "Du erhältst zu Beginn der Runde einen zufälligen Schwerkraftwert", + "astronaut_desc2": "Deine zufällige Schwerkraft beträgt: {0}x", - "moneyswap": "Steuerbeamter", - "moneyswap_desc": "Wähle einen Spieler aus, mit dem du Geld tauschen möchtest", - "moneyswap_enemy_info": "Das Finanzamt hat dich erwischt.", - "moneyswap_player_info": "Du hast Geld mit dem Spieler \"{0}\" getauscht.", - "moneyswap_select_info": "Geld mit Spieler tauschen:", + "moneyswap": "Steuerbeamter", + "moneyswap_desc": "Wähle einen Spieler aus, mit dem du Geld tauschen möchtest", + "moneyswap_enemy_info": "Das Finanzamt hat dich erwischt.", + "moneyswap_player_info": "Du hast Geld mit dem Spieler \"{0}\" getauscht.", + "moneyswap_select_info": "Geld mit Spieler tauschen:", - "baseball": "Baseballspieler", - "baseball_desc": "Deine Attrappe prallt von Wänden ab und tötet einen Gegner sofort beim Aufprall.", + "baseball": "Baseballspieler", + "baseball_desc": "Deine Attrappe prallt von Wänden ab und tötet einen Gegner sofort beim Aufprall.", - "behind": "Feind drehen", - "behind_desc": "Du hast eine zufällige Chance, einen Feind um 180 Grad zu drehen, wenn du ihn triffst", - "behind_desc2": "Deine Chance, einen Feind bei einem Treffer zu drehen, beträgt: {0} %", + "behind": "Feind drehen", + "behind_desc": "Du hast eine zufällige Chance, einen Feind um 180 Grad zu drehen, wenn du ihn triffst", + "behind_desc2": "Deine Chance, einen Feind bei einem Treffer zu drehen, beträgt: {0} %", - "blademaster": "Schwertmeister", - "blademaster_desc": "Wenn du ein Messer hältst, hast du eine hohe Chance, einen Schuss abzuwehren", + "blademaster": "Schwertmeister", + "blademaster_desc": "Wenn du ein Messer hältst, hast du eine hohe Chance, einen Schuss abzuwehren", - "bunnyhop": "Hase", - "bunnyhop_desc": "Du erhältst automatisch bunnyhop", + "bunnyhop": "Hase", + "bunnyhop_desc": "Du erhältst automatisch bunnyhop", - "c4camouflage": "C4-Tarnung", - "c4camouflage_desc": "Du bist unsichtbar, während du die Bombe hältst", + "c4camouflage": "C4-Tarnung", + "c4camouflage_desc": "Du bist unsichtbar, während du die Bombe hältst", - "carefulbullets": "Vorsichtige Kugeln", - "carefulbullets_desc": "Wähle einen Spieler aus, der für jeden Fehlschuss Schaden nimmt", - "carefulbullets_enemy_info": "Von nun an wird Ungenauigkeit buchstäblich wehtun.", - "carefulbullets_player_info": "‚{0}‘ muss jetzt vorsichtiger sein.", - "carefulbullets_select_info": "Fehler schaden dem Spieler:", + "carefulbullets": "Vorsichtige Kugeln", + "carefulbullets_desc": "Wähle einen Spieler aus, der für jeden Fehlschuss Schaden nimmt", + "carefulbullets_enemy_info": "Von nun an wird Ungenauigkeit buchstäblich wehtun.", + "carefulbullets_player_info": "‚{0}‘ muss jetzt vorsichtiger sein.", + "carefulbullets_select_info": "Fehler schaden dem Spieler:", - "catapult": "Katapult", - "catapult_desc": "Du hast eine zufällige Chance, einen Gegner nach oben zu schleudern", - "catapult_desc2": "Deine Chance, einen Gegner bei einem Treffer zu schleudern, beträgt: {0} %", + "catapult": "Katapult", + "catapult_desc": "Du hast eine zufällige Chance, einen Gegner nach oben zu schleudern", + "catapult_desc2": "Deine Chance, einen Gegner bei einem Treffer zu schleudern, beträgt: {0} %", - "chicken": "Huhn", - "chicken_desc": "Du erhältst ein Huhn-Modell + 10 % schnellere Bewegung – 50 HP", + "chicken": "Huhn", + "chicken_desc": "Du erhältst ein Huhn-Modell + 10 % schnellere Bewegung – 50 HP", - "chillout": "Chillout", - "chillout_desc": "Das Platzieren der Bombe dauert deutlich länger", + "chillout": "Chillout", + "chillout_desc": "Das Platzieren der Bombe dauert deutlich länger", - "cutter": "Cutter", - "cutter_desc": "Sofortiger Tod mit einem Messer", + "cutter": "Cutter", + "cutter_desc": "Sofortiger Tod mit einem Messer", - "cypher": "Kamera", - "cypher_desc": "Klicken Sie auf [css_useSkill], um eine Kamera zu erstellen/zu wechseln", - "cypher_nospace": "Die Kamera muss im rechten Winkel zur Wand positioniert werden", + "cypher": "Kamera", + "cypher_desc": "Klicken Sie auf [css_useSkill], um eine Kamera zu erstellen/zu wechseln", + "cypher_nospace": "Die Kamera muss im rechten Winkel zur Wand positioniert werden", - "darkness": "Dunkelheit", - "darkness_desc": "Wendet einen Dunkelheitseffekt auf einen ausgewählten Gegner an", - "darkness_enemy_info": "Lass die Lichter ausgehen", - "darkness_player_info": "Die Dunkelheit hat den Spieler \"{0}\" überwältigt.", - "darkness_select_info": "Wähle einen Spieler für die Dunkelheit aus:", + "darkness": "Dunkelheit", + "darkness_desc": "Wendet einen Dunkelheitseffekt auf einen ausgewählten Gegner an", + "darkness_enemy_info": "Lass die Lichter ausgehen", + "darkness_player_info": "Die Dunkelheit hat den Spieler \"{0}\" überwältigt.", + "darkness_select_info": "Wähle einen Spieler für die Dunkelheit aus:", - "deactivator": "Deaktivator", - "deactivator_desc": "Wähle einen Spieler aus, dessen Fähigkeit du deaktivieren möchtest", - "deactivator_enemy_info": "Deine Fähigkeit wurde deaktiviert", - "deactivator_player_info": "Die Fähigkeit des Spielers ‚{0}‘ wurde deaktiviert", - "deactivator_select_info": "Fähigkeit eines Spielers deaktivieren:", + "deactivator": "Deaktivator", + "deactivator_desc": "Wähle einen Spieler aus, dessen Fähigkeit du deaktivieren möchtest", + "deactivator_enemy_info": "Deine Fähigkeit wurde deaktiviert", + "deactivator_player_info": "Die Fähigkeit des Spielers ‚{0}‘ wurde deaktiviert", + "deactivator_select_info": "Fähigkeit eines Spielers deaktivieren:", - "deaf": "Taub", - "deaf_desc": "Wähle einen Spieler aus, für den alle Sounds stummgeschaltet werden sollen", - "deaf_enemy_info": "Deine Kopfhörer haben das Spiel verlassen.", - "deaf_player_info": "Der Ton für den Spieler ‚{0}‘ wurde deaktiviert.", - "deaf_select_info": "Alle Töne für den Spieler stummschalten:", + "deaf": "Taub", + "deaf_desc": "Wähle einen Spieler aus, für den alle Sounds stummgeschaltet werden sollen", + "deaf_enemy_info": "Deine Kopfhörer haben das Spiel verlassen.", + "deaf_player_info": "Der Ton für den Spieler ‚{0}‘ wurde deaktiviert.", + "deaf_select_info": "Alle Töne für den Spieler stummschalten:", - "disarmament": "Entwaffnung", - "disarmament_desc": "Du hast eine zufällige Chance, einen Gegner bei einem Treffer seine Waffe fallen zu lassen.", - "disarmament_desc2": "Ihre Chance, einen Gegner zu entwaffnen, beträgt: {0} %", + "disarmament": "Entwaffnung", + "disarmament_desc": "Du hast eine zufällige Chance, einen Gegner bei einem Treffer seine Waffe fallen zu lassen.", + "disarmament_desc2": "Ihre Chance, einen Gegner zu entwaffnen, beträgt: {0} %", - "distancer": "Entfernungsmesser", - "distancer_desc": "Sie können die Entfernung zum nächsten Gegner sehen", + "distancer": "Entfernungsmesser", + "distancer_desc": "Sie können die Entfernung zum nächsten Gegner sehen", - "dash": "Sprinten", - "dash_desc": "Führe einen zweiten Sprung aus, um zu sprinten", + "dash": "Sprinten", + "dash_desc": "Führe einen zweiten Sprung aus, um zu sprinten", - "dracula": "Dracula", - "dracula_desc": "Wenn du einen Gegner triffst, wird deine Gesundheit um einen Prozentsatz des verursachten Schadens wiederhergestellt", + "dracula": "Dracula", + "dracula_desc": "Wenn du einen Gegner triffst, wird deine Gesundheit um einen Prozentsatz des verursachten Schadens wiederhergestellt", - "duplicator": "Duplikator", - "duplicator_desc": "Wähle einen Spieler aus, dessen Fertigkeit du kopieren möchtest", - "duplicator_player_info": "Die Fertigkeit des Spielers ‚{0}‘ wurde kopiert.", - "duplicator_select_info": "Kopiere die Fertigkeit eines Spielers:", + "duplicator": "Duplikator", + "duplicator_desc": "Wähle einen Spieler aus, dessen Fertigkeit du kopieren möchtest", + "duplicator_player_info": "Die Fertigkeit des Spielers ‚{0}‘ wurde kopiert.", + "duplicator_select_info": "Kopiere die Fertigkeit eines Spielers:", - "dwarf": "Zwerg", - "dwarf_desc": "Zufällige Charaktergröße zu Beginn der Runde", - "dwarf_desc2": "Dein Größenmultiplikator beträgt: {0}x", + "dwarf": "Zwerg", + "dwarf_desc": "Zufällige Charaktergröße zu Beginn der Runde", + "dwarf_desc2": "Dein Größenmultiplikator beträgt: {0}x", - "enemyspawn": "Feindes-Spawn", - "enemyspawn_desc": "Klicke auf [css_useSkill], um zum Feindes-Spawn zu teleportieren", + "enemyspawn": "Feindes-Spawn", + "enemyspawn_desc": "Klicke auf [css_useSkill], um zum Feindes-Spawn zu teleportieren", - "explosiveshot": "Explosiver Schuss", - "explosiveshot_desc": "Zufällige Chance, beim Schießen eine explosive Kugel abzufeuern", - "explosiveshot_desc2": "Deine Chance, eine explosive Kugel abzufeuern: {0} %", + "explosiveshot": "Explosiver Schuss", + "explosiveshot_desc": "Zufällige Chance, beim Schießen eine explosive Kugel abzufeuern", + "explosiveshot_desc2": "Deine Chance, eine explosive Kugel abzufeuern: {0} %", - "falconeye": "Falkenauge", - "falconeye_desc": "Klicke auf [css_useSkill], um eine Vogelperspektive zu aktivieren", + "falconeye": "Falkenauge", + "falconeye_desc": "Klicke auf [css_useSkill], um eine Vogelperspektive zu aktivieren", - "fastreload": "Schnellnachladen", - "fastreload_desc": "Klicke auf [css_useSkill], um die Waffe, die du gerade hältst, nachzuladen", + "fastreload": "Schnellnachladen", + "fastreload_desc": "Klicke auf [css_useSkill], um die Waffe, die du gerade hältst, nachzuladen", - "flash": "Blitz", - "flash_desc": "Zufällige Spielergeschwindigkeit zu Beginn der Runde", - "flash_desc2": "Dein Geschwindigkeitsmultiplikator beträgt: {0}x", + "flash": "Blitz", + "flash_desc": "Zufällige Spielergeschwindigkeit zu Beginn der Runde", + "flash_desc2": "Dein Geschwindigkeitsmultiplikator beträgt: {0}x", - "fortnite": "Fortnite", - "fortnite_desc": "Klicke auf [css_useSkill], um eine zerstörbare Barrikade zu erstellen", + "fortnite": "Fortnite", + "fortnite_desc": "Klicke auf [css_useSkill], um eine zerstörbare Barrikade zu erstellen", - "fragilebomb": "Fragile Bombe", - "fragilebomb_desc": "Das Schießen auf die Bombe beschädigt sie", - "fragilebomb_bomb_health": "Bombengesundheit", + "fragilebomb": "Fragile Bombe", + "fragilebomb_desc": "Das Schießen auf die Bombe beschädigt sie", + "fragilebomb_bomb_health": "Bombengesundheit", - "friendlyfire": "Friendly Fire", - "friendlyfire_desc": "Das Schießen auf Teamkameraden heilt sie", + "friendlyfire": "Friendly Fire", + "friendlyfire_desc": "Das Schießen auf Teamkameraden heilt sie", - "frozendecoy": "Eisige Attrappe", - "frozendecoy_desc": "Deine Attrappe friert alle Spieler in der Nähe ein", + "frozendecoy": "Eisige Attrappe", + "frozendecoy_desc": "Deine Attrappe friert alle Spieler in der Nähe ein", - "gambler": "Zocker", - "gambler_desc": "Wähle eine Fertigkeit aus der Liste aus.", - "gambler_select_info": "Wähle deine Fähigkeit aus:", - "gambler_more": "#00FF00|Aktualisieren für ${0}", - "gambler_no_money": "Nicht genug Geld.", + "gambler": "Zocker", + "gambler_desc": "Wähle eine Fertigkeit aus der Liste aus.", + "gambler_select_info": "Wähle deine Fähigkeit aus:", + "gambler_more": "#00FF00|Aktualisieren für ${0}", + "gambler_no_money": "Nicht genug Geld.", - "ghost": "Geist", - "ghost_desc": "Du bist vollständig unsichtbar", + "ghost": "Geist", + "ghost_desc": "Du bist vollständig unsichtbar", - "glaz": "Glaz", - "glaz_desc": "Du kannst durch Rauchgranaten hindurchsehen", + "glaz": "Glaz", + "glaz_desc": "Du kannst durch Rauchgranaten hindurchsehen", - "glitch": "Glitch", - "glitch_desc": "Deaktiviert das Radar für einen ausgewählten Gegner", - "glitch_enemy_info": "Dein Radar wurde deaktiviert", - "glitch_player_info": "Das Radar des Spielers ‚{0}‘ wurde deaktiviert.", - "glitch_select_info": "Radar des Spielers ausschalten:", + "glitch": "Glitch", + "glitch_desc": "Deaktiviert das Radar für einen ausgewählten Gegner", + "glitch_enemy_info": "Dein Radar wurde deaktiviert", + "glitch_player_info": "Das Radar des Spielers ‚{0}‘ wurde deaktiviert.", + "glitch_select_info": "Radar des Spielers ausschalten:", - "glue": "Glue", - "glue_desc": "Deine Granaten haften an Wänden", + "glue": "Glue", + "glue_desc": "Deine Granaten haften an Wänden", - "godmode": "Gott-Modus", - "godmode_desc": "Klicke auf [css_useSkill], um für kurze Zeit unsterblich zu werden", - "godmode_off": "Unsterblichkeit deaktiviert", - "godmode_on": "Unsterblichkeit aktiviert", + "godmode": "Gott-Modus", + "godmode_desc": "Klicke auf [css_useSkill], um für kurze Zeit unsterblich zu werden", + "godmode_off": "Unsterblichkeit deaktiviert", + "godmode_on": "Unsterblichkeit aktiviert", - "grenadier": "Grenadier", - "grenadier_desc": "Du hast unendlich viele Granaten", + "grenadier": "Grenadier", + "grenadier_desc": "Du hast unendlich viele Granaten", - "healingsmoke": "Heilender Rauch", - "healingsmoke_desc": "Deine Rauchgranaten heilen", + "healingsmoke": "Heilender Rauch", + "healingsmoke_desc": "Deine Rauchgranaten heilen", - "hermit": "Einsiedler", - "hermit_desc": "Durch das Töten von Gegnern werden Munition und ein Teil der Gesundheit wiederhergestellt", + "hermit": "Einsiedler", + "hermit_desc": "Durch das Töten von Gegnern werden Munition und ein Teil der Gesundheit wiederhergestellt", - "holyhandgrenade": "Heilige Handgranate", - "holyhandgrenade_desc": "Deine HE-Granaten verursachen doppelten Schaden und haben doppelte Reichweite", + "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", + "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ß!", + "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", + "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", + "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", + "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", + "impostor": "Betrüger", + "impostor_desc": "Du beginnst die Runde mit einem feindlichen Spielermodell", - "infiniteammo": "Unendliche Munition", - "infiniteammo_desc": "Du erhältst unendliche Munition für alle deine Waffen", + "infiniteammo": "Unendliche Munition", + "infiniteammo_desc": "Du erhältst unendliche Munition für alle deine Waffen", - "jackal": "Spürhund", - "jackal_desc": "Jeder Gegner hinterlässt eine Spur", + "jackal": "Spürhund", + "jackal_desc": "Jeder Gegner hinterlässt eine Spur", - "jammer": "Störsender", - "jammer_desc": "Wähle einen Spieler aus, um dessen Fadenkreuz zu deaktivieren", - "jammer_enemy_info": "Dein Fadenkreuz wurde deaktiviert.", - "jammer_player_info": "Das Fadenkreuz von Spieler ‚{0}‘ wurde deaktiviert.", - "jammer_select_info": "Fadenkreuz des Spielers deaktivieren:", + "jammer": "Störsender", + "jammer_desc": "Wähle einen Spieler aus, um dessen Fadenkreuz zu deaktivieren", + "jammer_enemy_info": "Dein Fadenkreuz wurde deaktiviert.", + "jammer_player_info": "Das Fadenkreuz von Spieler ‚{0}‘ wurde deaktiviert.", + "jammer_select_info": "Fadenkreuz des Spielers deaktivieren:", - "jester": "Narr", - "jester_desc": "Im Narrenmodus kannst du keinen Schaden erleiden oder verursachen. Dieser Modus ändert sich alle paar Sekunden.", - "jester_mode": "Jester-Modus", - "jester_on": "EIN", - "jester_off": "AUS", + "jester": "Narr", + "jester_desc": "Im Narrenmodus kannst du keinen Schaden erleiden oder verursachen. Dieser Modus ändert sich alle paar Sekunden.", + "jester_mode": "Jester-Modus", + "jester_on": "EIN", + "jester_off": "AUS", - "jumpban": "Beinlos", - "jumpban_desc": "Wähle einen Spieler, der nicht springen kann", - "jumpban_enemy_info": "Jemand hat dir die Beine abgeschnitten.", - "jumpban_player_info": "Der Spieler ‚{0}‘ kann nicht mehr springen.", - "jumpban_select_info": "Spieler vom Springen ausschließen:", + "jumpban": "Beinlos", + "jumpban_desc": "Wähle einen Spieler, der nicht springen kann", + "jumpban_enemy_info": "Jemand hat dir die Beine abgeschnitten.", + "jumpban_player_info": "Der Spieler ‚{0}‘ kann nicht mehr springen.", + "jumpban_select_info": "Spieler vom Springen ausschließen:", - "jumpingjack": "Jumping Jack", - "jumpingjack_desc": "Durch Springen wird die Gesundheit wiederhergestellt", + "jumpingjack": "Jumping Jack", + "jumpingjack_desc": "Durch Springen wird die Gesundheit wiederhergestellt", - "killerflash": "Killer Flash", - "killerflash_desc": "Jeder, der durch deine Blendgranate vollständig geblendet wird, stirbt (einschließlich dir selbst)", + "killerflash": "Killer Flash", + "killerflash_desc": "Jeder, der durch deine Blendgranate vollständig geblendet wird, stirbt (einschließlich dir selbst)", - "lifeswap": "Lebensaustausch", - "lifeswap_desc": "Wähle einen Spieler aus, mit dem du deine Gesundheit austauschen möchtest", - "lifeswap_enemy_info": "Jemand hat sich deine Gesundheit ausgeliehen", - "lifeswap_player_info": "Du hast deine Gesundheit mit dem Spieler \"{0}\" ausgetauscht", - "lifeswap_select_info": "Tausche Gesundheit mit Spieler:", + "lifeswap": "Lebensaustausch", + "lifeswap_desc": "Wähle einen Spieler aus, mit dem du deine Gesundheit austauschen möchtest", + "lifeswap_enemy_info": "Jemand hat sich deine Gesundheit ausgeliehen", + "lifeswap_player_info": "Du hast deine Gesundheit mit dem Spieler \"{0}\" ausgetauscht", + "lifeswap_select_info": "Tausche Gesundheit mit Spieler:", - "longknife": "Langes Messer", - "longknife_desc": "Ein Messerangriff verursacht unabhängig von der Entfernung Schaden", + "longknife": "Langes Messer", + "longknife_desc": "Ein Messerangriff verursacht unabhängig von der Entfernung Schaden", - "longzeus": "Langer Zeus", - "longzeus_desc": "Zeus verursacht unabhängig von der Entfernung Schaden", + "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", + "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", + "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!", - "magnifier_player_info": "Der Spieler ‚{0}‘ wurde in den Zoom-Modus versetzt.", - "magnifier_select_info": "Bildschirm des Spielers vergrößern:", + "magnifier": "Lupe", + "magnifier_desc": "Vergrößert den Bildschirm des Gegners und verringert dessen Sichtfeld", + "magnifier_enemy_info": "Dein Sichtfeld wurde verzerrt!", + "magnifier_player_info": "Der Spieler ‚{0}‘ wurde in den Zoom-Modus versetzt.", + "magnifier_select_info": "Bildschirm des Spielers vergrößern:", - "medic": "Sanitäter", - "medic_desc": "Klicke auf [css_useSkill], um eine Heilungsladung zu verwenden, die 50 Gesundheitspunkte wiederherstellt", + "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", + "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.", - "bankrupt_player_info": "Der Spieler ‚{0}‘ ist bankrott.", - "bankrupt_select_info": "Wähle einen Spieler aus, der bankrott gehen soll:", + "bankrupt": "Bankrott", + "bankrupt_desc": "Wähle den Spieler aus, der sein gesamtes Geld verlieren wird", + "bankrupt_enemy_info": "Du bist bankrott.", + "bankrupt_player_info": "Der Spieler ‚{0}‘ ist bankrott.", + "bankrupt_select_info": "Wähle einen Spieler aus, der bankrott gehen soll:", - "muhammed": "Muhammed", - "muhammed_desc": "Du explodierst beim Tod und tötest Spieler in deiner Nähe", - "muhammed_explosion": "ALLAHU AKBAR!!!", + "deathbomb": "Todesbombe", + "deathbomb_desc": "Du explodierst beim Tod und tötest Spieler in deiner Nähe", + "deathbomb_explosion": "Kaboom!", - "ninja": "Ninja", - "ninja_desc": "Wenn du stillstehst, erhöht sich deine Unsichtbarkeit um 33 %, wenn du dich duckst um 33 % und wenn du ein Messer hältst um 33 %", + "ninja": "Ninja", + "ninja_desc": "Wenn du stillstehst, erhöht sich deine Unsichtbarkeit um 33 %, wenn du dich duckst um 33 % und wenn du ein Messer hältst um 33 %", - "nonades": "No-Nades", - "nonades_desc": "Granaten fügen dir keinen Schaden zu", - - "norecoil": "Fokus", - "norecoil_desc": "Kein Rückstoß beim Schießen", + "nonades": "No-Nades", + "nonades_desc": "Granaten fügen dir keinen Schaden zu", - "noclip": "NoClip", - "noclip_desc": "Klicke auf [css_useSkill], um NoClip für kurze Zeit zu aktivieren", + "norecoil": "Fokus", + "norecoil_desc": "Kein Rückstoß beim Schießen", - "oneshot": "One-Shot", - "oneshot_desc": "Ein Treffer tötet einen Gegner sofort", + "noclip": "NoClip", + "noclip_desc": "Klicke auf [css_useSkill], um NoClip für kurze Zeit zu aktivieren", - "onlyhead": "Nur Kopf", - "onlyhead_desc": "Du erleidest nur Schaden am Kopf", + "oneshot": "One-Shot", + "oneshot_desc": "Ein Treffer tötet einen Gegner sofort", - "paweljumper": "Pawel Jumper", - "paweljumper_desc": "Du erhältst eine zufällige Anzahl zusätzlicher Sprünge", - "paweljumper_desc2": "Du erhältst {0} zusätzliche Sprünge", + "onlyhead": "Nur Kopf", + "onlyhead_desc": "Du erleidest nur Schaden am Kopf", - "phoenix": "Phönix", - "phoenix_desc": "Du hast eine zufällige Chance, nach dem Tod wieder zu erscheinen", - "phoenix_desc2": "Deine Chance, nach dem Tod wieder zu erscheinen: {0} %", - "phoenix_respawn": "Du bist dank der Kraft von CHATCOLORS.REDPhoenix aus der Asche auferstanden", + "paweljumper": "Pawel Jumper", + "paweljumper_desc": "Du erhältst eine zufällige Anzahl zusätzlicher Sprünge", + "paweljumper_desc2": "Du erhältst {0} zusätzliche Sprünge", - "psychicdefusing": "Psychic Defusing", - "psychicdefusing_desc": "Wenn du dich in der Nähe der Bombe befindest, beginnst du, sie zu entschärfen", - "psychicdefusing_hud_info": "{0} Sekunden verbleibend bis zur Entschärfung", + "phoenix": "Phönix", + "phoenix_desc": "Du hast eine zufällige Chance, nach dem Tod wieder zu erscheinen", + "phoenix_desc2": "Deine Chance, nach dem Tod wieder zu erscheinen: {0} %", + "phoenix_respawn": "Du bist dank der Kraft von CHATCOLORS.REDPhoenix aus der Asche auferstanden", - "pilot": "Pilot", - "pilot_desc": "Fliege für begrenzte Zeit. Doppelklick auf Sprung zum Fliegen", - "pilot_hud_info": "Treibstoff", + "psychicdefusing": "Psychic Defusing", + "psychicdefusing_desc": "Wenn du dich in der Nähe der Bombe befindest, beginnst du, sie zu entschärfen", + "psychicdefusing_hud_info": "{0} Sekunden verbleibend bis zur Entschärfung", - "planter": "Freier Planter", - "planter_desc": "Du kannst die Bombe überall platzieren, die Detonationszeit beträgt 60 Sekunden.", - "planter_planting": "Bombe wird gelegt ({0})...", + "pilot": "Pilot", + "pilot_desc": "Fliege für begrenzte Zeit. Doppelklick auf Sprung zum Fliegen", + "pilot_hud_info": "Treibstoff", - "poison": "Gift", - "poison_desc": "Wähle einen Spieler aus, der alle paar Sekunden Schaden nimmt", - "poison_enemy_info": "Du wurdest vergiftet", - "poison_player_info": "Der Spieler ‚{0}‘ wurde vergiftet", - "poison_select_info": "Einen Spieler vergiften:", + "planter": "Freier Planter", + "planter_desc": "Du kannst die Bombe überall platzieren, die Detonationszeit beträgt 60 Sekunden.", + "planter_planting": "Bombe wird gelegt ({0})...", - "primaryban": "Keine Gewehre", - "primaryban_desc": "Wähle einen Spieler aus, der keine Gewehre verwenden kann", - "primaryban_enemy_info": "Du kannst keine Gewehre mehr verwenden.", - "primaryban_player_info": "Der Spieler ‚{0}‘ kann keine Gewehre mehr verwenden.", - "primaryban_select_info": "Gewehre für Spieler verbieten:", + "poison": "Gift", + "poison_desc": "Wähle einen Spieler aus, der alle paar Sekunden Schaden nimmt", + "poison_enemy_info": "Du wurdest vergiftet", + "poison_player_info": "Der Spieler ‚{0}‘ wurde vergiftet", + "poison_select_info": "Einen Spieler vergiften:", - "prosthesis": "Prothese", - "prosthesis_desc": "Arme und Beine sind kugelsicher", + "primaryban": "Keine Gewehre", + "primaryban_desc": "Wähle einen Spieler aus, der keine Gewehre verwenden kann", + "primaryban_enemy_info": "Du kannst keine Gewehre mehr verwenden.", + "primaryban_player_info": "Der Spieler ‚{0}‘ kann keine Gewehre mehr verwenden.", + "primaryban_select_info": "Gewehre für Spieler verbieten:", - "push": "Pusher", - "push_desc": "Du hast eine zufällige Chance, einen Gegner zurückzustoßen, wenn du ihn triffst", - "push_desc2": "Deine Chancen, den Gegner zurückzustoßen, betragen: {0} %", + "prosthesis": "Prothese", + "prosthesis_desc": "Arme und Beine sind kugelsicher", - "pyro": "Pyro", - "pyro_desc": "Molotow-Cocktail stellt Gesundheit wieder her", + "push": "Pusher", + "push_desc": "Du hast eine zufällige Chance, einen Gegner zurückzustoßen, wenn du ihn triffst", + "push_desc2": "Deine Chancen, den Gegner zurückzustoßen, betragen: {0} %", - "quickshot": "Schnellfeuer", - "quickshot_desc": "Alle Kugeln werden sehr schnell abgefeuert", + "pyro": "Pyro", + "pyro_desc": "Molotow-Cocktail stellt Gesundheit wieder her", - "radarhack": "Radar-Hack", - "radarhack_desc": "Gegner sind auf dem Radar sichtbar", + "quickshot": "Schnellfeuer", + "quickshot_desc": "Alle Kugeln werden sehr schnell abgefeuert", - "rambo": "Rambo", - "rambo_desc": "Du erhältst zu Beginn der Runde eine zufällige Menge an Gesundheit", + "radarhack": "Radar-Hack", + "radarhack_desc": "Gegner sind auf dem Radar sichtbar", - "randomweapon": "Zufällige Waffe", - "randomweapon_desc": "Klicke auf [css_useSkill], um eine zufällige Waffe zu erhalten", + "rambo": "Rambo", + "rambo_desc": "Du erhältst zu Beginn der Runde eine zufällige Menge an Gesundheit", - "rezombie": "Re-Zombie", - "rezombie_desc": "Nach dem Tod spawnst du als Zombie mit erhöhter Gesundheit und ohne Waffen", + "randomweapon": "Zufällige Waffe", + "randomweapon_desc": "Klicke auf [css_useSkill], um eine zufällige Waffe zu erhalten", - "reactivearmor": "Reaktive Rüstung", - "reactivearmor_desc": "Die Rüstung absorbiert den ersten erlittenen Schaden", + "rezombie": "Re-Zombie", + "rezombie_desc": "Nach dem Tod spawnst du als Zombie mit erhöhter Gesundheit und ohne Waffen", - "regeneration": "Regeneration", - "regeneration_desc": "Du stellst alle paar Sekunden Gesundheit wieder her", + "reactivearmor": "Reaktive Rüstung", + "reactivearmor_desc": "Die Rüstung absorbiert den ersten erlittenen Schaden", - "replicator": "Replikator", - "replicator_desc": "Klicke auf [css_useSkill], um eine Replik zu erstellen, die bei Treffer Schaden verursacht", + "regeneration": "Regeneration", + "regeneration_desc": "Du stellst alle paar Sekunden Gesundheit wieder her", - "retreat": "Rückzug", - "retreat_desc": "Klicke auf [css_useSkill], um zum Spawn zurückzukehren", + "replicator": "Replikator", + "replicator_desc": "Klicke auf [css_useSkill], um eine Replik zu erstellen, die bei Treffer Schaden verursacht", - "returntosender": "Zurück zum Absender", - "returntosender_desc": "Der erste Treffer eines Gegners schickt ihn zurück zu seinem Spawn", + "retreat": "Rückzug", + "retreat_desc": "Klicke auf [css_useSkill], um zum Spawn zurückzukehren", - "richboy": "Rich Boy", - "richboy_desc": "Du erhältst zu Beginn der Runde einen zufälligen Geldbetrag", + "returntosender": "Zurück zum Absender", + "returntosender_desc": "Der erste Treffer eines Gegners schickt ihn zurück zu seinem Spawn", - "robinhood": "Robin Hood", - "robinhood_desc": "Wenn du einem Gegner Schaden zufügst, stiehlst du ihm sein Geld", + "richboy": "Rich Boy", + "richboy_desc": "Du erhältst zu Beginn der Runde einen zufälligen Geldbetrag", - "rubber": "Gummigeschosse", - "rubber_desc": "Deine Kugeln verlangsamen Spieler erheblich", + "robinhood": "Robin Hood", + "robinhood_desc": "Wenn du einem Gegner Schaden zufügst, stiehlst du ihm sein Geld", - "saper": "Sapper", - "saper_desc": "Du kannst Bomben schneller legen und entschärfen", + "rubber": "Gummigeschosse", + "rubber_desc": "Deine Kugeln verlangsamen Spieler erheblich", - "secondlife": "Zweite Chance", - "secondlife_desc": "Nach dem Tod spawnst du mit derselben Gesundheitsanzeige wieder", + "saper": "Sapper", + "saper_desc": "Du kannst Bomben schneller legen und entschärfen", - "shade": "Schatten", - "shade_desc": "Du hast eine zufällige Chance, dich hinter einen getroffenen Gegner zu teleportieren", - "shade_desc2": "Deine Chancen, dich hinter einen getroffenen Gegner zu teleportieren, betragen: {0} %", - "shade_nospace": "Kein Platz verfügbar", + "secondlife": "Zweite Chance", + "secondlife_desc": "Nach dem Tod spawnst du mit derselben Gesundheitsanzeige wieder", - "shortbomb": "Kurze Zündschnur", - "shortbomb_desc": "Die Bombe explodiert viel schneller", + "shade": "Schatten", + "shade_desc": "Du hast eine zufällige Chance, dich hinter einen getroffenen Gegner zu teleportieren", + "shade_desc2": "Deine Chancen, dich hinter einen getroffenen Gegner zu teleportieren, betragen: {0} %", + "shade_nospace": "Kein Platz verfügbar", - "silent": "Leise", - "silent_desc": "Deine Schritte und Sprünge sind für ANDERE Spieler lautlos", + "shortbomb": "Kurze Zündschnur", + "shortbomb_desc": "Die Bombe explodiert viel schneller", - "smoker": "Smoker", - "smoker_desc": "Deine Rauchgranaten gehen nie aus", + "silent": "Leise", + "silent_desc": "Deine Schritte und Sprünge sind für ANDERE Spieler lautlos", - "sniperelite": "Sniper Elite", - "sniperelite_customname": "Sniper-Elite-Skill", - "sniperelite_desc": "Klicke auf [css_useSkill], um deine aktuelle Waffe gegen eine AWP auszutauschen", + "smoker": "Smoker", + "smoker_desc": "Deine Rauchgranaten gehen nie aus", - "soldier": "Soldat", - "soldier_desc": "Du hast einen zufälligen Schadensmultiplikator", - "soldier_desc2": "Dein Schadensmultiplikator beträgt: {0}x", + "sniperelite": "Sniper Elite", + "sniperelite_customname": "Sniper-Elite-Skill", + "sniperelite_desc": "Klicke auf [css_useSkill], um deine aktuelle Waffe gegen eine AWP auszutauschen", - "soundmaker": "Soundmaker", - "soundmaker_desc": "Klicke auf [css_useSkill], um für jeden Gegner einen Sound auszulösen", + "soldier": "Soldat", + "soldier_desc": "Du hast einen zufälligen Schadensmultiplikator", + "soldier_desc2": "Dein Schadensmultiplikator beträgt: {0}x", - "spectator": "Zuschauer", - "spectator_desc": "Klicke auf [css_useSkill], um einen zufälligen Gegner zu beobachten", + "soundmaker": "Soundmaker", + "soundmaker_desc": "Klicke auf [css_useSkill], um für jeden Gegner einen Sound auszulösen", - "swapposition": "Positionstausch", - "swapposition_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Plätze zu tauschen", + "spectator": "Zuschauer", + "spectator_desc": "Klicke auf [css_useSkill], um einen zufälligen Gegner zu beobachten", - "teleporter": "Teleporter", - "teleporter_desc": "Du hast die Chance, die Plätze mit einem getroffenen Gegner zu tauschen", - "teleporter_desc2": "Deine Chance auf Platztausch nach einem Treffer: {0}%", + "swapposition": "Positionstausch", + "swapposition_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Plätze zu tauschen", - "thief": "Dieb", - "thief_desc": "Du kannst einem ausgewählten Spieler eine Fertigkeit stehlen", - "thief_enemy_info": "Deine Fertigkeit wurde gestohlen", - "thief_player_info": "Die Fertigkeit des Spielers ‚{0}‘ wurde gestohlen", - "thief_select_info": "Fähigkeit eines Spielers stehlen:", - "thief_incorrect_skill": "Diese Fähigkeit kann nicht ausgewählt werden!", + "teleporter": "Teleporter", + "teleporter_desc": "Du hast die Chance, die Plätze mit einem getroffenen Gegner zu tauschen", + "teleporter_desc2": "Deine Chance auf Platztausch nach einem Treffer: {0}%", - "thirdeye": "Drittes Auge", - "thirdeye_desc": "Klicke auf [css_useSkill], um die Third-Person-Ansicht zu aktivieren", + "thief": "Dieb", + "thief_desc": "Du kannst einem ausgewählten Spieler eine Fertigkeit stehlen", + "thief_enemy_info": "Deine Fertigkeit wurde gestohlen", + "thief_player_info": "Die Fertigkeit des Spielers ‚{0}‘ wurde gestohlen", + "thief_select_info": "Fähigkeit eines Spielers stehlen:", + "thief_incorrect_skill": "Diese Fähigkeit kann nicht ausgewählt werden!", - "thorns": "Dornen", - "thorns_desc": "Dein Gegner erhält einen Teil des Schadens, den er dir zugefügt hat", + "thirdeye": "Drittes Auge", + "thirdeye_desc": "Klicke auf [css_useSkill], um die Third-Person-Ansicht zu aktivieren", - "throwingknife": "Wurfmesser", - "throwingknife_desc": "Klicke [css_useSkill], um ein Messer zu werfen. Aber nimm dich vor anderen in Acht", + "thorns": "Dornen", + "thorns_desc": "Dein Gegner erhält einen Teil des Schadens, den er dir zugefügt hat", - "toxicsmoke": "Giftiger Rauch", - "toxicsmoke_desc": "Deine Rauchgranaten verursachen Schaden", + "throwingknife": "Wurfmesser", + "throwingknife_desc": "Klicke [css_useSkill], um ein Messer zu werfen. Aber nimm dich vor anderen in Acht", - "wallhack": "Wallhack", - "wallhack_desc": "Du kannst Feinde durch Wände hindurch sehen", + "toxicsmoke": "Giftiger Rauch", + "toxicsmoke_desc": "Deine Rauchgranaten verursachen Schaden", - "watchmaker": "Uhrmacher", - "watchmaker_desc": "Jeder Granatenwurf verändert die Rundenzeit", - "watchmaker_ct": "Rundenzeit um {0} Sekunden verkürzt", - "watchmaker_tt": "Rundenzeit um {0} Sekunden verlängert", + "wallhack": "Wallhack", + "wallhack_desc": "Du kannst Feinde durch Wände hindurch sehen", - "weaponsswap": "Waffenwechsel", - "weaponsswap_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Waffen zu tauschen", - "weaponsswap_hud_info2": "Du hast keine Waffe zum Tauschen", + "watchmaker": "Uhrmacher", + "watchmaker_desc": "Jeder Granatenwurf verändert die Rundenzeit", + "watchmaker_ct": "Rundenzeit um {0} Sekunden verkürzt", + "watchmaker_tt": "Rundenzeit um {0} Sekunden verlängert", - "weightless": "Schwerelosigkeit", - "weightless_desc": "Deine Granaten werden nicht von der Schwerkraft beeinflusst und fliegen schneller", + "weaponsswap": "Waffenwechsel", + "weaponsswap_desc": "Klicke auf [css_useSkill], um mit einem zufälligen Gegner die Waffen zu tauschen", + "weaponsswap_hud_info2": "Du hast keine Waffe zum Tauschen", - "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", - - "your_skill": "Deine aktuelle Fertigkeit", - "enemy_skill": "Fähigkeit des Gegners", - "observer_skill": "Fähigkeit des Spielers", - "welcome_message": "Willkommen {PLAYER} bei {SERVER_NAME}", - "drawing_skill": "Eine Fertigkeit zeichnen", - "disabled_weapon": "Du kannst diese Waffe nicht verwenden", - - "hud_info": "Warte weitere {0} Sekunden", - "hud_info_no_enemy": "Kein Feind gefunden", - "active_hud_info": "Noch {0} Millisekunden aktiv", - - "skills_menu": "Fähigkeitenliste", - "no_player": "Kein passender Spieler gefunden.", - "duplicate_player": "Mehr als ein Spieler mit demselben Namen gefunden.", - "selectplayerskill_command": "Gib /t ein", - "selectplayerskill_incorrect_enemy_index": "Es wurden keine Spieler gefunden, die ausgewählt werden können.", - - "skill_not_found_setskill": "Keine solche CHATCOLORS.REDskill gefunden", - "player_not_found_setskill": "Kein solcher CHATCOLORS.REDplayer gefunden", - "correct_form_setskill": "Korrekte Verwendung: CHATCOLORS.RED!setskill ", - "correct_form_setscore": "Korrekte Verwendung: CHATCOLORS.RED!setscore ", - "done_setskill": "Fähigkeit festgelegt", - "error_setskill": "CHATCOLORS.REDskill konnte nicht festgelegt werden", - "for_setskill": "für", - - "invalid_map": "Kartenname falsch eingegeben!", - "loading_map": "Neue Karte wird geladen", - - "pause": "Spiel wurde unterbrochen", - "unpause": "Spiel wurde fortgesetzt", - "healed": "Du wurdest geheilt.", - "game_start": "Spiel gestartet!", - "reload": "Sprachen und Konfigurationen wurden neu geladen.", - "hud_on": "HUD wurde aktiviert.", - "hud_off": "HUD wurde deaktiviert.", - - "vote_started": "Abstimmung gestartet: ‚{0}‘", - "vote_timeout": "Zeitlimit für Abstimmung ‚{0}‘ abgelaufen!", - "vote_wait": "Sie müssen warten, bevor Sie eine weitere Abstimmung starten können!", - "vote_same_wait": "Sie müssen warten, bevor Sie dieselbe Abstimmung erneut starten können!", - "vote_not_enough_players": "Nicht genügend Spieler, um eine Abstimmung zu starten!", - "vote_alredy_voted": "Du hast bereits abgestimmt!", - "vote_vote": "Abstimmen", - - "bombsite_a": "Bombenplatz A", - "bombsite_b": "Bombenplatz B", - "bombplanted": "Die Bombe wurde gelegt\n{0} Sekunden bis zur Detonation", - - "teammate_skills": "Die Fähigkeiten Ihrer Teamkollegen", - "summary": "Zusammenfassung der letzten runde", - - "menu_controlls_scroll": "W/S – Scrollen", - "menu_controlls_padding": " | ", - "menu_controlls_select": "E – Auswählen" + "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", + + "your_skill": "Deine aktuelle Fertigkeit", + "enemy_skill": "Fähigkeit des Gegners", + "observer_skill": "Fähigkeit des Spielers", + "welcome_message": "Willkommen {PLAYER} bei {SERVER_NAME}", + "drawing_skill": "Eine Fertigkeit zeichnen", + "disabled_weapon": "Du kannst diese Waffe nicht verwenden", + + "hud_info": "Warte weitere {0} Sekunden", + "hud_info_no_enemy": "Kein Feind gefunden", + "active_hud_info": "Noch {0} Millisekunden aktiv", + + "skills_menu": "Fähigkeitenliste", + "no_player": "Kein passender Spieler gefunden.", + "duplicate_player": "Mehr als ein Spieler mit demselben Namen gefunden.", + "selectplayerskill_command": "Gib /t ein", + "selectplayerskill_incorrect_enemy_index": "Es wurden keine Spieler gefunden, die ausgewählt werden können.", + + "skill_not_found_setskill": "Keine solche CHATCOLORS.REDskill gefunden", + "player_not_found_setskill": "Kein solcher CHATCOLORS.REDplayer gefunden", + "correct_form_setskill": "Korrekte Verwendung: CHATCOLORS.RED!setskill ", + "correct_form_setscore": "Korrekte Verwendung: CHATCOLORS.RED!setscore ", + "done_setskill": "Fähigkeit festgelegt", + "error_setskill": "CHATCOLORS.REDskill konnte nicht festgelegt werden", + "for_setskill": "für", + + "invalid_map": "Kartenname falsch eingegeben!", + "loading_map": "Neue Karte wird geladen", + + "pause": "Spiel wurde unterbrochen", + "unpause": "Spiel wurde fortgesetzt", + "healed": "Du wurdest geheilt.", + "game_start": "Spiel gestartet!", + "reload": "Sprachen und Konfigurationen wurden neu geladen.", + "hud_on": "HUD wurde aktiviert.", + "hud_off": "HUD wurde deaktiviert.", + + "vote_started": "Abstimmung gestartet: ‚{0}‘", + "vote_timeout": "Zeitlimit für Abstimmung ‚{0}‘ abgelaufen!", + "vote_wait": "Sie müssen warten, bevor Sie eine weitere Abstimmung starten können!", + "vote_same_wait": "Sie müssen warten, bevor Sie dieselbe Abstimmung erneut starten können!", + "vote_not_enough_players": "Nicht genügend Spieler, um eine Abstimmung zu starten!", + "vote_alredy_voted": "Du hast bereits abgestimmt!", + "vote_vote": "Abstimmen", + + "bombsite_a": "Bombenplatz A", + "bombsite_b": "Bombenplatz B", + "bombplanted": "Die Bombe wurde gelegt\n{0} Sekunden bis zur Detonation", + + "teammate_skills": "Die Fähigkeiten Ihrer Teamkollegen", + "summary": "Zusammenfassung der letzten runde", + + "menu_controlls_scroll": "W/S – Scrollen", + "menu_controlls_padding": " | ", + "menu_controlls_select": "E – Auswählen" } \ No newline at end of file diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/en.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/en.json index 80f90d1..f972310 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/en.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/en.json @@ -275,9 +275,9 @@ "bankrupt_player_info": "Player '{0}' has gone bankrupt.", "bankrupt_select_info": "Pick a player to go bankrupt:", - "muhammed": "Muhammed", - "muhammed_desc": "You explode upon death, killing nearby players", - "muhammed_explosion": "ALLAHU AKBAR!!!", + "deathbomb": "Death Bomb", + "deathbomb_desc": "You explode upon death, killing nearby players", + "deathbomb_explosion": "Kaboom!", "ninja": "Ninja", "ninja_desc": "Standing still increases your invisibility by 33%, crouching by 33%, and holding a knife by 33%", diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/fr.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/fr.json index d648e66..02c5543 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/fr.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/fr.json @@ -275,9 +275,9 @@ "bankrupt_player_info": "Le joueur « {0} » est en faillite.", "bankrupt_select_info": "Mettre un joueur en faillite :", - "muhammed": "Bombe", - "muhammed_desc": "Vous explosez à votre mort, tuant les joueurs proches", - "muhammed_explosion": "ALLAHU AKBAR!!!", + "deathbomb": "Bombe", + "deathbomb_desc": "Vous explosez à votre mort, tuant les joueurs proches", + "deathbomb_explosion": "Kaboom!", "ninja": "Ninja", "ninja_desc": "Rester immobile augmente votre invisibilité de 33%, s’accroupir de 33%, et tenir un couteau de 33%", diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pl.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pl.json index 2570ed2..321c9d9 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pl.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pl.json @@ -275,9 +275,9 @@ "moneyswap_player_info": "Wymieniłeś swoje pieniądze z graczem '{0}'.", "moneyswap_select_info": "Zamień się kasą z graczem:", - "muhammed": "Muhammed", - "muhammed_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu", - "muhammed_explosion": "ALLAHU AKBAR!!!", + "deathbomb": "Ludzka bomba", + "deathbomb_desc": "Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu", + "deathbomb_explosion": "Kaboom!", "ninja": "Ninja", "ninja_desc": "Stojąc nieruchomo zwiększasz swoją niewidzialność o 33%, kucając o 33%, a trzymając nóż o 33%", diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pt-br.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pt-br.json index 2e53cab..b953a61 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pt-br.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/pt-br.json @@ -52,10 +52,10 @@ "blademaster": "Mestre das Lâminas", "blademaster_desc": "Enquanto segura a faca, você tem chance de desviar de um tiro", - + "bunnyhop": "Coelho", "bunnyhop_desc": "Você ganha \"BunnyHop\" automático", - + "c4camouflage": "Camuflagem C4", "c4camouflage_desc": "Você fica invisível enquanto segura a bomba", @@ -68,122 +68,122 @@ "catapult": "Catapulta", "catapult_desc": "Você tem uma chance aleatória de lançar um inimigo para cima", "catapult_desc2": "Sua chance de lançar um inimigo ao acertá-lo é: {0}%", - + "chicken": "Galinha", "chicken_desc": "Você é uma galinha com +10% de movimento mais rápido e -50 HP", - + "chillout": "Esqueci a Senha", "chillout_desc": "Plantar a bomba leva significativamente mais tempo", - + "cutter": "Corte Rápido", "cutter_desc": "Você mata instantaneamente com a faca", "cypher": "CFTV", "cypher_desc": "Clique em [css_useSkill] para criar/mudar para uma câmera", "cypher_nospace": "A câmera deve ser posicionada em ângulo reto com a parede", - + "darkness": "Escuridão", "darkness_desc": "Aplica um efeito de escuridão a um inimigo escolhido", "darkness_enemy_info": "Que as luzes se apaguem.", "darkness_player_info": "A escuridão tomou conta do jogador '{0}'.", "darkness_select_info": "Escolha jogador: escuridão:", - + "deactivator": "Desativador", "deactivator_desc": "Escolha um jogador para desativar a habilidade", "deactivator_enemy_info": "Sua habilidade foi desativada.", "deactivator_player_info": "A habilidade do jogador '{0}' foi desativada.", "deactivator_select_info": "Desativar skill do jogador:", - + "deaf": "Surdo", "deaf_desc": "Escolha um jogador para desativar todos os sons", "deaf_enemy_info": "Seus fones de ouvido saíram do jogo.", "deaf_player_info": "O som foi desativado para o jogador '{0}'.", "deaf_select_info": "Silenciar jogador:", - + "disarmament": "Desarmamento", "disarmament_desc": "Você tem uma chance aleatória de fazer um inimigo dropar a arma ao acertá-lo", "disarmament_desc2": "Sua chance de desarmar um inimigo é: {0}%", "distancer": "Medidor de Distância", "distancer_desc": "Você pode ver a distância até o inimigo mais próximo", - + "dash": "Impulso", "dash_desc": "Pule novamente para receber um impulso", - + "dracula": "Drácula", "dracula_desc": "Acertar um inimigo restaura sua vida igual a ao dano causado", - + "duplicator": "ctrl+c ctrl+v", "duplicator_desc": "Escolha um jogador para copiar a habilidade", "duplicator_player_info": "A habilidade do jogador '{0}' foi copiada.", "duplicator_select_info": "Copiar skill do jogador:", - + "dwarf": "Anão", "dwarf_desc": "Sua altura agora é aleatória", "dwarf_desc2": "Seu multiplicador de altura é: {0}x", - + "enemyspawn": "Spawn Inimigo", "enemyspawn_desc": "Clique em [css_useSkill] para se teletransportar para a base inimiga", - + "explosiveshot": "Tiro Explosivo", "explosiveshot_desc": "Chance aleatória de disparar uma bala explosiva enquanto atira", "explosiveshot_desc2": "Sua chance de disparar uma bala explosiva: {0}%", - + "falconeye": "Olho de Águia", "falconeye_desc": "Clique em [css_useSkill] para ativar uma câmera 360 com visão aérea", - + "fastreload": "Recarga Rápida", "fastreload_desc": "Clique em [css_useSkill] para recarregar a arma que você está segurando", - + "flash": "Ligeirinho", "flash_desc": "Velocidade de movimentação aleatória no início da rodada", "flash_desc2": "Seu multiplicador de velocidade é: {0}x", - + "fortnite": "Fortnite", "fortnite_desc": "Clique em [css_useSkill] para criar uma barreira destrutível", - + "fragilebomb": "Bomba Frágil", "fragilebomb_desc": "Atirar na bomba a danifica", "fragilebomb_bomb_health": "Vida da bomba", - + "friendlyfire": "Fogo Amigo", "friendlyfire_desc": "Atirar em companheiros de equipe os cura", - + "frozendecoy": "Decoy Congelante", "frozendecoy_desc": "Sua decoy congela os players próximos", - + "gambler": "Tigrinho", "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", - + "glaz": "Smoke Transparente", "glaz_desc": "Smokes tornam-se transparentes para você", - + "glitch": "Sem Mapa", "glitch_desc": "Desativa o radar de um inimigo escolhido", "glitch_enemy_info": "Seu radar foi desativado.", "glitch_player_info": "O radar do jogador '{0}' foi desativado.", "glitch_select_info": "Desativar radar do jogador:", - + "glue": "Semtex", "glue_desc": "Suas granadas grudam nas paredes", - + "godmode": "Modo Deus", "godmode_desc": "Clique em [css_useSkill] para se tornar imortal por alguns segundos", "godmode_off": "Imortalidade desativada", "godmode_on": "Imortalidade ativada", - + "grenadier": "Bomberman", "grenadier_desc": "Você tem HEs infinitas", - + "healingsmoke": "Smoke Amiga", "healingsmoke_desc": "Suas smokes curam", - + "hermit": "Sanguessuga", "hermit_desc": "Matar restaura munição e uma parte da sua vida", @@ -199,7 +199,7 @@ "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", @@ -208,10 +208,10 @@ "impostor": "Impostor", "impostor_desc": "Você começa a rodada vestido do time inimigo", - + "infiniteammo": "Munição Infinita", "infiniteammo_desc": "Você recebe munição infinita para todas as suas armas", - + "jackal": "Lesma", "jackal_desc": "Cada adversário deixa um rastro atrás de si", @@ -220,37 +220,37 @@ "jammer_enemy_info": "Sua mira foi desativada.", "jammer_player_info": "A mira do jogador '{0}' foi desativada.", "jammer_select_info": "Desativar mira do jogador:", - + "jester": "Palhaço", "jester_desc": "No modo bobo você não pode causar nem receber dano. Esse modo muda a cada poucos segundos.", "jester_mode": "Modo Palhaço", "jester_on": "LIG.", "jester_off": "DESL.", - + "jumpban": "Perneta", "jumpban_desc": "Escolha um jogador que não poderá pular", "jumpban_enemy_info": "Cortaram as suas pernas.", "jumpban_player_info": "O jogador '{0}' não pode mais pular.", "jumpban_select_info": "Banir pulo do jogador:", - + "jumpingjack": "Pula-Pula", "jumpingjack_desc": "Pular restaura vida", - + "killerflash": "Flash Mortal", "killerflash_desc": "Qualquer pessoa cega pela sua flash morre (incluindo você)", - + "lifeswap": "Troca de Vida", "lifeswap_desc": "Escolha um jogador para trocar de vida", "lifeswap_enemy_info": "Alguém pegou sua vida emprestada.", "lifeswap_player_info": "Você trocou vida com o jogador '{0}'.", "lifeswap_select_info": "Trocar de vida com jogador:", - + "longknife": "Espada", "longknife_desc": "Um ataque com faca causa danos independentemente da distância", - + "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", @@ -262,10 +262,10 @@ "magnifier_enemy_info": "Seu campo de visão foi distorcido!", "magnifier_player_info": "O jogador ‘{0}’ foi forçado a entrar no modo zoom.", "magnifier_select_info": "Ampliar tela do jogador:", - + "medic": "Médico", "medic_desc": "Clique em [css_useSkill] para usar uma injeção que restaura 50 de vida", - + "miner": "Mineiro de Bombas", "miner_desc": "Sua granada HE só explode quando há um inimigo por perto", @@ -274,131 +274,131 @@ "moneyswap_enemy_info": "Você provavelmente virou classe B", "moneyswap_player_info": "Você trocou dinheiro com o jogador '{0}'.", "moneyswap_select_info": "Trocar dinheiro c/ jogador:", - - "muhammed": "Muhammed", - "muhammed_desc": "Você explode ao morrer, matando os jogadores próximos", - "muhammed_explosion": "ALLAHU AKBAR!!!", - + + "deathbomb": "Bomba mortal", + "deathbomb_desc": "Você explode ao morrer, matando os jogadores próximos", + "deathbomb_explosion": "Kaboom!", + "ninja": "Ninja", "ninja_desc": "Ficar parado aumenta sua invisibilidade em 33%, agachar em 33%, e segurar uma faca em 33%", - + "nonades": "Imune a Granadas", "nonades_desc": "Granadas não causam dano a você", - + "norecoil": "Sem Recoil", "norecoil_desc": "Sem recoil ao atirar", - + "noclip": "NoClip", "noclip_desc": "Clique em [css_useSkill] para ativar noclip por poucos segundos", - + "oneshot": "Ignorante", "oneshot_desc": "Acertar um inimigo o mata instantaneamente", - + "onlyhead": "Só na Cabeçinha", "onlyhead_desc": "Você só recebe headshot", - + "paweljumper": "Parkourista", "paweljumper_desc": "Você recebe um número aleatório de pulos extras", "paweljumper_desc2": "Você ganha {0} pulos extras", - + "phoenix": "Fênix", "phoenix_desc": "Você tem uma chance aleatória de renascer após a morte", "phoenix_desc2": "Sua chance de renascer após a morte: {0}%", "phoenix_respawn": "Você foi ressuscitado das cinzas graças ao poder de: CHATCOLORS.REDPhoenix", - + "psychicdefusing": "Desarme Psíquico", "psychicdefusing_desc": "Quando você está proximo da bomba, começa a desarmá-la automaticamente", "psychicdefusing_hud_info": "{0} segundos restantes para desarmar", - + "pilot": "Jetpack", "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", "poison_enemy_info": "Você foi envenenado.", "poison_player_info": "O jogador '{0}' foi envenenado.", "poison_select_info": "Envenenar jogador:", - + "primaryban": "Sem Rifle", "primaryban_desc": "Escolha um jogador que não poderá usar rifles", "primaryban_enemy_info": "Você não pode mais usar rifles.", "primaryban_player_info": "O jogador '{0}' não pode mais usar rifles.", "primaryban_select_info": "Banir rifles do jogador:", - + "prosthesis": "Prótese", "prosthesis_desc": "Braços e pernas são à prova de balas", - + "push": "Empurrão", "push_desc": "Você tem uma chance aleatória de empurrar um inimigo ao acertá-lo", "push_desc2": "Suas chances de empurrar o inimigo são: {0}%", - + "pyro": "Pirotecnia", "pyro_desc": "Molotov recupera vida", - + "quickshot": "Tiro Rápido", "quickshot_desc": "Todas as balas são disparadas extremamente rapidas", - + "radarhack": "Hack de Mapa", "radarhack_desc": "Inimigos são visíveis no mapa", - + "rambo": "Rambo", "rambo_desc": "Você recebe uma quantidade aleatória de vida no início da rodada", - + "randomweapon": "Arma Aleatória", "randomweapon_desc": "Clique em [css_useSkill] para receber uma arma aleatória", - + "rezombie": "Walking Dead", "rezombie_desc": "Após morrer, você renasce como um zumbi com mais vida porém sem armas", - + "reactivearmor": "Armadura Reativa", "reactivearmor_desc": "A armadura absorve o primeiro dano recebido", - + "regeneration": "Regeneração", "regeneration_desc": "Você restaura vida a cada poucos segundos", - + "replicator": "Clone", "replicator_desc": "Clique em [css_useSkill] para criar um clone que causa dano ao ser atingido", - + "retreat": "De Volta as Origens", "retreat_desc": "Clique em [css_useSkill] para retornar ao spawn", - + "returntosender": "Devolução ao Remetente", "returntosender_desc": "O primeiro tiro em um inimigo o envia de volta a sua base", - + "richboy": "Filhinho de Papai", "richboy_desc": "Você recebe uma quantidade aleatória de dinheiro no início da rodada", - + "robinhood": "Robin Hood", "robinhood_desc": "Atirar em um inimigo rouba seu dinheiro", - + "rubber": "Balas de Borracha", "rubber_desc": "Seus tiros deixam os jogadores lentos ao serem atingidos", - + "saper": "Especialista", "saper_desc": "Você pode plantar e desarmar bombas mais rápido", - + "secondlife": "Segunda Chance", "secondlife_desc": "Após morrer, você renasce com a mesma quantidade de vida", - + "shade": "Sombra", "shade_desc": "Você tem uma chance aleatória de teletransportar para trás de um inimigo ao atingi-lo", "shade_desc2": "Suas chances de se teletransportar para trás de um inimigo atingido são: {0}%", "shade_nospace": "Sem espaço disponível", - + "shortbomb": "Pavio Longo", "shortbomb_desc": "A bomba demora muito mais para explodir", - + "silent": "Shhhiu!", "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", @@ -406,51 +406,51 @@ "soldier": "Soldado", "soldier_desc": "Seus tiros causam mais dano", "soldier_desc2": "Seu multiplicador de dano é: {0}x", - + "soundmaker": "Criador de Som", "soundmaker_desc": "Clique em [css_useSkill] para tocar um som para cada inimigo", - + "spectator": "Espectador", "spectator_desc": "Clique em [css_useSkill] para ver a tela de um inimigo aleatório", - + "swapposition": "Troca de Posição", "swapposition_desc": "Clique em [css_useSkill] para trocar de lugar com um inimigo aleatório", - + "teleporter": "Teletransportador", "teleporter_desc": "Você 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", "thief_enemy_info": "Sua habilidade foi roubada.", "thief_player_info": "A habilidade do jogador '{0}' foi roubada.", "thief_select_info": "Roubar skill do jogador:", "thief_incorrect_skill": "Esta habilidade não pode ser selecionada!", - + "thirdeye": "Terceiro Olho", "thirdeye_desc": "Clique em [css_useSkill] para ativar a terceira pessoa", - + "thorns": "Porco Espinho", "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", - + "wallhack": "Wallhack", "wallhack_desc": "Você pode ver inimigos através das paredes", - + "watchmaker": "Relojoeiro", "watchmaker_desc": "Cada arremesso de granada altera o tempo da rodada", "watchmaker_ct": "Tempo da rodada reduzido em {0} segundos.", "watchmaker_tt": "Tempo da rodada estendido em {0} segundos.", - + "weaponsswap": "Troca de Armas", "weaponsswap_desc": "Clique em [css_useSkill] para trocar armas com um inimigo aleatório", "weaponsswap_hud_info2": "Você não tem arma para trocar", - + "weightless": "Gravidade Zero", "weightless_desc": "Suas granadas não são afetadas pela gravidade e voam mais rápido", @@ -461,24 +461,24 @@ "zeus": "Zeus", "zeus_desc": "Zeus x27 recarrega instantaneamente", - + "your_skill": "Sua habilidade atual", "enemy_skill": "Habilidade do inimigo", "observer_skill": "Habilidade do jogador", "welcome_message": "Bem-vindo {PLAYER} ao {SERVER_NAME}!\nVersão atual do jRandomSkills: {VERSION} ({SKILLS_COUNT} habilidades).\n\nCriado originalmente por:\n{AUTHOR1}\nModificado e aprimorado por:\n{AUTHOR2}\nDiscord oficial: https://discord.gg/9H8EZYBpPF", "drawing_skill": "Sorteando uma habilidade", "disabled_weapon": "Você não pode usar esta arma", - + "hud_info": "Espere mais {0} segundos", "hud_info_no_enemy": "Nenhum inimigo encontrado", "active_hud_info": "Ativo por mais {0} milissegundos", - + "skills_menu": "Lista de Habilidades", "no_player": "Nenhum jogador correspondente encontrado.", "duplicate_player": "Mais de um jogador encontrado com o mesmo nome.", "selectplayerskill_command": "Digite /t", "selectplayerskill_incorrect_enemy_index": "Não foram encontrados jogadores para selecionar.", - + "skill_not_found_setskill": "Nenhuma habilidade CHATCOLORS.RED encontrada", "player_not_found_setskill": "Nenhum jogador CHATCOLORS.RED encontrado", "correct_form_setskill": "Uso correto: CHATCOLORS.RED!setskill ", @@ -486,10 +486,10 @@ "done_setskill": "Habilidade definida", "error_setskill": "Falha ao definir a habilidade CHATCOLORS.RED", "for_setskill": "para", - + "invalid_map": "Nome do mapa inválido!", "loading_map": "Carregando um novo mapa", - + "pause": "Partida pausada.", "unpause": "Partida retomada.", "healed": "Você foi curado.", @@ -497,7 +497,7 @@ "reload": "Os idiomas e as configurações foram recarregados.", "hud_on": "O HUD foi ativado.", "hud_off": "O HUD foi desativado.", - + "vote_started": "Votação iniciada: '{0}'", "vote_timeout": "Votação '{0}' expirou!", "vote_wait": "Você precisa esperar antes de iniciar outra votação!", @@ -505,14 +505,14 @@ "vote_not_enough_players": "Não há jogadores suficientes para iniciar uma votação!", "vote_alredy_voted": "Você já votou!", "vote_vote": "Votar", - + "bombsite_a": "Bombsite A", "bombsite_b": "Bombsite B", "bombplanted": "A bomba foi plantada\n{0} segundos até a detonação", - + "teammate_skills": "Habilidades dos seus companheiros de equipe", "summary": "Resumo da última rodada", - + "menu_controlls_scroll": "W/S - Rolar", "menu_controlls_padding": " | ", "menu_controlls_select": "E - Selecionar" diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/ru.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/ru.json index ccd1e83..e8fc4c3 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/ru.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/ru.json @@ -275,9 +275,9 @@ "bankrupt_player_info": "Игрок '{0}' обанкротился.", "bankrupt_select_info": "Выберите игрока для банкротства:", - "muhammed": "Мухаммед", - "muhammed_desc": "Вы взрываетесь при смерти, убивая ближайших игроков", - "muhammed_explosion": "АЛЛАХУ АКБАР!!!", + "deathbomb": "Смертельная бомба", + "deathbomb_desc": "Вы взрываетесь при смерти, убивая ближайших игроков", + "deathbomb_explosion": "АЛЛАХУ АКБАР!!!", "ninja": "Ниндзя", "ninja_desc": "Стоя на месте, ваша невидимость увеличивается на 33%, в приседе на 33%, с ножом на 33%", diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/tr.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/tr.json index fddcada..fca1676 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/tr.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/tr.json @@ -3,52 +3,52 @@ "none_desc": "Hiçbir yeteneğin yok", "aimbot": "Aimbot", - "aimbot_desc": "Vurduğun her mermi kafadan vuruş (headshot) sayılır", + "aimbot_desc": "Vurduğunda kafadan (HS) sayılır", - "aimlock": "Nişan Kilidi", + "aimlock": "Kitlenme", "aimlock_desc": "En yakın düşmana nişan almak için [css_useSkill] tuşuna basın", - "anomaly": "Anomali", + "anomaly": "Zaman Büken", "anomaly_desc": "Zamanı birkaç saniye geriye alırsın", "antyflash": "Anti-Flash", - "antyflash_desc": "Flaş bombalarından etkilenmezsin ve senin flaşların 7 saniye sürer", + "antyflash_desc": "Flaşa kör olmazsın ve flaşların 7 saniye sürer", - "antyhead": "Demir Kafa", - "antyhead_desc": "Kafadan vuruşlardan hasar almazsın", + "antyhead": "Beton Kafa", + "antyhead_desc": "Kafadan hasar almazsın", - "areareaper": "Bölge Azraili", - "areareaper_desc": "Devre dışı bırakmak için bir bomba alanı seçebilirsin", - "areareaper_incorrect_site": "Böyle bir bomba alanı bulunamadı.", - "areareaper_no_site": "Hiçbir bomba alanı bulunamadı.", - "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ı!", + "areareaper": "Mekan Kapatan", + "areareaper_desc": "Haritadaki bir bomba alanını tamamen devre dışı bırakabilirsin", + "areareaper_incorrect_site": "Böyle bir bomba alanı yok uydurma", + "areareaper_no_site": "Haritada bomba alanı bulunamadı", + "areareaper_select_info": "Kapatılacak bomba alanını seç:", + "areareaper_site_disabled": "{0} alanı mühürlendi - artık buraya bomba kurulamaz!", + "areareaper_used_info": "Yeteneğini zaten kullandın, açgözlülük yapma", + "areareaper_bombsite_disabled": "Bu bomba alanı kullanıma kapatıldı!", "armored": "Zırhlı", - "armored_desc": "Rastgele bir hasar alma çarpanına sahip olursun", - "armored_desc2": "Hasar alma çarpanın: {0}x", + "armored_desc": "Rastgele hasar alma çarpanına sahip olursun", + "armored_desc2": "Hasar alma: {0}x", "assassin": "Suikastçı", - "assassin_desc": "Düşmanlara arkadan vurduğunda daha fazla hasar verirsin", + "assassin_desc": "Düşmanlara arkadan daha fazla hasar verirsin", "astronaut": "Astronot", - "astronaut_desc": "Raund başında rastgele bir yerçekimi değeri alırsın", - "astronaut_desc2": "Rastgele yerçekimin: {0}x", + "astronaut_desc": "Rastgele bir yerçekimi değerine sahip olursun", + "astronaut_desc2": "Yerçekimin: {0}x", "moneyswap": "Vergi Memuru", - "moneyswap_desc": "Para takas etmek için bir oyuncu seç", - "moneyswap_enemy_info": "Vergi dairesi seni yakaladı.", - "moneyswap_player_info": "'{0}' isimli oyuncuyla paraları takas ettin.", - "moneyswap_select_info": "Para takası yapılacak oyuncu:", + "moneyswap_desc": "Bir düşmanla paranı takasla", + "moneyswap_enemy_info": "Maliye kapına dayandı", + "moneyswap_player_info": "'{0}' isimli oyuncuyla paraları takas ettin", + "moneyswap_select_info": "Para takasla biriyle:", "baseball": "Beyzbolcu", - "baseball_desc": "Yanıltıcı bomban (decoy) duvarlardan seker ve çarptığı düşmanı anında öldürür", + "baseball_desc": "Yanıltıcı bomban (decoy) duvarlardan seker ve çarptığı düşmanı öldürür", - "behind": "Düşman Döndürücü", - "behind_desc": "Düşmana vurduğunda onu 180 derece döndürme şansın olur", - "behind_desc2": "Vuruşta düşmanı döndürme şansın: %{0}", + "behind": "Baş Döndüren", + "behind_desc": "Vurduğunda düşmanı 180 derece döndürme şansın olur", + "behind_desc2": "Baş döndürme şansın: %{0}", "blademaster": "Kılıç Ustası", "blademaster_desc": "Bıçak tutarken mermileri sektirme şansın artar", @@ -57,105 +57,105 @@ "bunnyhop_desc": "Otomatik \"BunnyHop\" yaparsın", "c4camouflage": "C4 Kamuflajı", - "c4camouflage_desc": "Bombayı taşırken görünmez olursun", + "c4camouflage_desc": "Elinde C4 varken tamamen görünmez olursun", "carefulbullets": "Dikkatli Mermiler", - "carefulbullets_desc": "Iskaladığın her mermi için hasar alacak bir oyuncu seç", - "carefulbullets_enemy_info": "Artık isabetsiz atışlar canını yakacak.", - "carefulbullets_player_info": "'{0}' artık daha dikkatli olmalı.", + "carefulbullets_desc": "Düşman mermi kaçırırsa hasar alır", + "carefulbullets_enemy_info": "Mermi kaçırmak canını yakacak", + "carefulbullets_player_info": "'{0}' artık mermi sıkarken iki kere düşünecek", "carefulbullets_select_info": "İsabetsiz atışların hasar vereceği oyuncu:", "catapult": "Mancınık", - "catapult_desc": "Düşmanı havaya fırlatma şansın olur", - "catapult_desc2": "Vuruşta düşmanı fırlatma şansın: %{0}", + "catapult_desc": "Vurduğun rakibi uzaya (yukarı doğru) fırlatma şansın var", + "catapult_desc2": "Fırlatma şansın: %{0}", "chicken": "Tavuk", - "chicken_desc": "Tavuk modeli + %10 daha hızlı hareket - 50 HP alırsın", + "chicken_desc": "Tavuk modeli ve %10 daha hızlısın fakat 50 HP", - "chillout": "Sakin Ol", + "chillout": "Ağırdan Al", "chillout_desc": "Bombayı kurmak çok daha uzun sürer", - "cutter": "Kesici", - "cutter_desc": "Bıçakla tek atışta öldürme", + "cutter": "Kasap", + "cutter_desc": "Bıçakla tek atarsın", - "cypher": "Cypher", - "cypher_desc": "Kamera oluşturmak/kameraya geçmek için E tuşuna bas", - "cypher_nospace": "Kamera duvara dik açıyla yerleştirilmelidir", + "cypher": "Gözcü", + "cypher_desc": "Kamera oluşturmak/geçmek için [css_useSkill] tuşuna bas", + "cypher_nospace": "Kamerayı duvara dik yerleştir", "darkness": "Karanlık", - "darkness_desc": "Seçilen bir düşmana karanlık efekti uygular", - "darkness_enemy_info": "Işıklar sönsün.", - "darkness_player_info": "Karanlık, '{0}' isimli oyuncuyu ele geçirdi.", - "darkness_select_info": "Karanlık uygulanacak oyuncuyu seç:", + "darkness_desc": "Bir düşmanın ekranını karart", + "darkness_enemy_info": "Işıklar sönsün", + "darkness_player_info": "'{0}' isimli oyuncunun dünyasını kararttın", + "darkness_select_info": "Karanlık bir oyuncuyu seç:", - "deactivator": "Devre Dışı Bırakıcı", - "deactivator_desc": "Yeteneğini kapatmak istediğin bir oyuncu seç", - "deactivator_enemy_info": "Yeteneğin devre dışı bırakıldı.", - "deactivator_player_info": "'{0}' isimli oyuncunun yeteneği devre dışı bırakıldı.", - "deactivator_select_info": "Bir oyuncunun yeteneğini devre dışı bırak:", + "deactivator": "Silgi", + "deactivator_desc": "Bir düşmanın yeteneğini sil", + "deactivator_enemy_info": "Yeteneğin silindi", + "deactivator_player_info": "'{0}' isimli oyuncunun yeteneği silindi", + "deactivator_select_info": "Yetenek silmek için oyuncu seç:", "deaf": "Sağır", - "deaf_desc": "Tüm seslerini kapatmak için bir oyuncu seç", - "deaf_enemy_info": "Kulaklıkların oyundan ayrıldı.", + "deaf_desc": "Bir düşmanın kulağını kapat ve sesleri duymaz hale getir", + "deaf_enemy_info": "Kulaklıkların tıkandı", "deaf_player_info": "'{0}' isimli oyuncu için sesler kapatıldı.", - "deaf_select_info": "Sesleri kapatılacak oyuncuyu seç:", + "deaf_select_info": "Sağır bir oyuncuyu seç:", "disarmament": "Silahsızlandırma", - "disarmament_desc": "Vurduğun düşmanın silahını düşürme şansın olur", - "disarmament_desc2": "Düşmanı silahsızlandırma şansın: %{0}", + "disarmament_desc": "Vurduğunda rakibin elindeki silahı yere düşürme şansın olur", + "disarmament_desc2": "Silahsızlandırma şansın: %{0}", - "distancer": "Mesafe Ölçer", - "distancer_desc": "En yakın düşmana olan mesafeni görebilirsin", + "distancer": "Kronometre", + "distancer_desc": "En yakın düşmanın mesafesini görürsün", "dash": "Atılma", - "dash_desc": "Atılmak (dash) için ikinci kez zıpla", + "dash_desc": "Atılmak için ikinci kez zıpla", - "dracula": "Dracula", - "dracula_desc": "Düşmana vurmak, verdiğin hasarın bir yüzdesi kadar canını yeniler", + "dracula": "Drakula", + "dracula_desc": "Rakiplere verdiğin hasarın belirli bir yüzdesi kadar can alırsın", - "duplicator": "Kopyalayıcı", + "duplicator": "Kopyacı", "duplicator_desc": "Yeteneğini kopyalamak için bir oyuncu seç", "duplicator_player_info": "'{0}' isimli oyuncunun yeteneği kopyalandı.", "duplicator_select_info": "Yeteneği kopyalanacak oyuncu:", "dwarf": "Cüce", "dwarf_desc": "Raund başında rastgele karakter boyutu", - "dwarf_desc2": "Boyut çarpanın: {0}x", + "dwarf_desc2": "Boyutun: {0}x", - "enemyspawn": "Düşman Başlangıcı", - "enemyspawn_desc": "Düşman başlangıç noktasına ışınlanmak için E tuşuna bas", + "enemyspawn": "Base Baskını", + "enemyspawn_desc": "[css_useSkill] tuşuna basarak düşman doğma noktasına ışınlan", - "explosiveshot": "Patlayıcı Atış", - "explosiveshot_desc": "Ateş ederken rastgele patlayıcı mermi atma şansı", - "explosiveshot_desc2": "Patlayıcı mermi atma şansın: %{0}", + "explosiveshot": "Patlayıcı Mermi", + "explosiveshot_desc": "Ateş ederken rastgele mermilerin patlayabilir", + "explosiveshot_desc2": "Patlayan mermi şansı: %{0}", "falconeye": "Şahin Gözü", - "falconeye_desc": "Kuş bakışı kamerayı aktif etmek için E tuşuna bas", + "falconeye_desc": "[css_useSkill] tuşuna basarak kuş bakışına geç", - "fastreload": "Hızlı Şarjör", - "fastreload_desc": "Eldeki silahı anında doldurmak için E tuşuna bas", + "fastreload": "Şipşak Şarjör", + "fastreload_desc": "[css_useSkill] tuşuna basarak şarjörünü hızlıca değiştir", "flash": "Flash", "flash_desc": "Raund başında rastgele oyuncu hızı", - "flash_desc2": "Hız çarpanın: {0}x", + "flash_desc2": "Hızın: {0}x", "fortnite": "Fortnite", - "fortnite_desc": "Parçalanabilir bir barikat oluşturmak için E tuşuna bas", + "fortnite_desc": "[css_useSkill] tuşuna basarak barikat kur", "fragilebomb": "Hassas Bomba", - "fragilebomb_desc": "Bombaya ateş etmek ona hasar verir", - "fragilebomb_bomb_health": "Bomba canı", + "fragilebomb_desc": "Kurulu bombaya ateş etmek bombanın canını azaltır", + "fragilebomb_bomb_health": "Bombanın canı", - "friendlyfire": "Dost Ateşi", + "friendlyfire": "Dost Şifası", "friendlyfire_desc": "Takım arkadaşlarına ateş etmek onları iyileştirir", - "frozendecoy": "Dondurucu Yem", - "frozendecoy_desc": "Yanıltıcı bomban (decoy) yakındaki tüm oyuncuları dondurur", + "frozendecoy": "Buz Kıran", + "frozendecoy_desc": "Yanıltıcı bomba (decoy) yakındaki tüm oyuncuları dondurur", "gambler": "Kumarbaz", "gambler_desc": "Sunulan listeden bir yetenek seç.", "gambler_select_info": "Yeteneğini seç:", - "gambler_more": "#00FF00|${0} karşılığında yenile", + "gambler_more": "#00FF00|${0} karşılığında yeni yetenekler", "gambler_no_money": "Yeterli para yok.", "ghost": "Hayalet", @@ -165,71 +165,71 @@ "glaz_desc": "Sis bombalarının içini görebilirsin", "glitch": "Glitç", - "glitch_desc": "Seçilen bir düşmanın radarını devre dışı bırakır", - "glitch_enemy_info": "Radarın devre dışı bırakıldı.", + "glitch_desc": "Seçilen bir düşmanın radarını kapatır", + "glitch_enemy_info": "Radarın kapandı", "glitch_player_info": "'{0}' isimli oyuncunun radarı devre dışı bırakıldı.", "glitch_select_info": "Radarı kapatılacak oyuncuyu seç:", "glue": "Yapıştırıcı", "glue_desc": "Bombaların duvarlara yapışır", - "godmode": "Ölümsüzlük", - "godmode_desc": "Kısa süreliğine ölümsüz olmak için E tuşuna bas", - "godmode_off": "Ölümsüzlük kapalı", - "godmode_on": "Ölümsüzlük açık", + "godmode": "Ölümsüz", + "godmode_desc": "[css_useSkill] tuşuna basarak kısa süreli ölümsüz ol", + "godmode_off": "Ölümsüzlük kapandı", + "godmode_on": "Ölümsüzlük açıldı", "grenadier": "Bombacı", "grenadier_desc": "Sınırsız el bombasına sahipsin", - "healingsmoke": "İyileştiren Sis", + "healingsmoke": "Şifalı Sis", "healingsmoke_desc": "Sis bombaların iyileştirir", "hermit": "Münzevi", - "hermit_desc": "Öldürmek, mermilerini ve canının bir kısmını yeniler", + "hermit_desc": "Öldüğünde mernin ve canının biraz yenilenir", "holyhandgrenade": "Kutsal El Bombası", - "holyhandgrenade_desc": "El bombaların iki kat hasar verir ve iki kat menzile sahiptir", + "holyhandgrenade_desc": "El bomban iki kat hasara ve menzile sahip", - "homingnades": "Güdümlü El Bombaları", - "homingnades_desc": "El bombalarınız (sis hariç) düşmanlara yönelir", + "homingnades": "Güdümlü Bomba", + "homingnades_desc": "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!", + "hotbomb": "Sıcak C4", + "hotbomb_desc": "Yaşadığın sürece bombacının canı azalıyor", + "hotbomb_hint": "Bomba çok sıcak!", "iana": "Hologram", - "iana_desc": "Hologramını birkaç saniyeliğine kontrol etmek için E tuşuna bas", + "iana_desc": "[css_useSkill] tuşuna basarak bir hologram oluştur", - "illiterate": "Okuryazar Olmayan", - "illiterate_desc": "Siz hayatta olduğunuz sürece, düşmanlarınız yazıları okuyamaz", + "illiterate": "Cahiliye", + "illiterate_desc": "Yaşadığın sürece rakibin sohbeti (chat) veya oyun yazılarını okuyamaz", "illusionist": "İllüzyonist", - "illusionist_desc": "Düz ilerleyen bir kopya oluşturmak için [css_useSkill] tuşuna basın", + "illusionist_desc": "[css_useSkill] tuşuna basarak düz ilerleyen illüzyon oluştur", "impostor": "Sahtekar", - "impostor_desc": "Raunda düşman oyuncu modeliyle başlarsın", + "impostor_desc": "Düşman oyuncu modeline dönüşürsün", "infiniteammo": "Sınırsız Mermi", - "infiniteammo_desc": "Tüm silahların için sınırsız mermi alırsın", + "infiniteammo_desc": "Tüm silahların sınırsız mermisi olur", "jackal": "İzci", - "jackal_desc": "Her rakip arkasında bir iz bırakır", + "jackal_desc": "Her rakip yürüdüğünde ayak izi bırakır", "jammer": "Sinyal Kesici", "jammer_desc": "Bir oyuncunun nişangahını (crosshair) kapatmak için seç", - "jammer_enemy_info": "Nişangahın devre dışı bırakıldı.", - "jammer_player_info": "'{0}' isimli oyuncunun nişangahı devre dışı bırakıldı.", + "jammer_enemy_info": "Nişangahın kapatıldı.", + "jammer_player_info": "'{0}' isimli oyuncunun nişangahı kapatıldı.", "jammer_select_info": "Nişangahı kapatılacak oyuncuyu seç:", - "jester": "Joker", - "jester_desc": "Joker modunda hasar alamazsın ve veremezsin. Bu mod birkaç saniyede bir değişir.", - "jester_mode": "Joker Modu", + "jester": "Soytarı", + "jester_desc": "Soytarı modunda hasar alamazsın ve veremezsin. Bu mod birkaç saniyede bir değişir.", + "jester_mode": "Soytarı Modu", "jester_on": "AÇIK", "jester_off": "KAPALI", "jumpban": "Bacaksız", "jumpban_desc": "Zıplayamayacak bir oyuncu seç", - "jumpban_enemy_info": "Birisi bacaklarını kesti.", + "jumpban_enemy_info": "Bacakların kesildi", "jumpban_player_info": "'{0}' artık zıplayamaz.", "jumpban_select_info": "Zıplaması yasaklanacak oyuncu:", @@ -237,59 +237,59 @@ "jumpingjack_desc": "Zıplamak canını yeniler", "killerflash": "Ölümcül Flaş", - "killerflash_desc": "Flaş bombanla tamamen kör olan herkes ölür (sen dahil)", + "killerflash_desc": "Flaşına tamamen kör olan herkes ölür (sen dahil)", "lifeswap": "Can Takası", "lifeswap_desc": "Can değerlerini takas etmek için bir oyuncu seç", - "lifeswap_enemy_info": "Birisi canını ödünç aldı.", + "lifeswap_enemy_info": "Birisi canını çaldı", "lifeswap_player_info": "'{0}' isimli oyuncuyla canlarını takas ettin.", "lifeswap_select_info": "Can takası yapılacak oyuncu:", "longknife": "Uzun Bıçak", - "longknife_desc": "Bıçak saldırısı mesafeden bağımsız olarak hasar verir", + "longknife_desc": "Bıçağın uzaktaki rakibe hasar verebilir", "longzeus": "Uzak Zeus", - "longzeus_desc": "Zeus mesafeden bağımsız olarak hasar verir", + "longzeus_desc": "Zeus uzaktaki rakibe hasar verebilir", "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", + "magneto_desc": "Tüm düşman 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!", + "magnifier_enemy_info": "Görüşün bozuldu!", "magnifier_player_info": "'{0}' isimli oyuncunun ekranı yakınlaştırıldı.", "magnifier_select_info": "Ekranı büyütülecek oyuncuyu seç:", "medic": "Sıhhiye", - "medic_desc": "50 can yenileyen bir iyileştirme yükü kullanmak için E tuşuna bas", + "medic_desc": "[css_useSkill] tuşuna basarak kendine anında 50 HP bas", - "miner": "Bomba Madencisi", + "miner": "Mayın", "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.", + "bankrupt_enemy_info": "İflas ettin!", "bankrupt_player_info": "'{0}' isimli oyuncu iflas etti.", "bankrupt_select_info": "İflas edecek oyuncuyu seç:", - "muhammed": "Bombacı", - "muhammed_desc": "Öldüğünde patlayarak etraftaki oyuncuları öldürürsün", - "muhammed_explosion": "ALLAHU EKBER!!!", + "deathbomb": "Canlı Bomba", + "deathbomb_desc": "Öldüğünde patlayarak etraftaki oyuncuları öldürürsün", + "deathbomb_explosion": "BOOM!!!", "ninja": "Ninja", - "ninja_desc": "Hareketsiz durmak görünmezliğini %33, çömelmek %33 ve bıçak tutmak %33 artırır", + "ninja_desc": "Görünmezliğini sabit durmak %33, eğilmek %33 ve bıçak tutmak %33 artırır", "nonades": "Bomba Geçirmez", "nonades_desc": "Bombalar sana hasar vermez", "norecoil": "Odaklanma", - "norecoil_desc": "Ateş ederken geri tepme olmaz", + "norecoil_desc": "Silahın hiç sekmez", "noclip": "Noclip", - "noclip_desc": "Kısa süreliğine noclip açmak için E tuşuna bas", + "noclip_desc": "[css_useSkill] tuşuna basarak duvarların içinden geç", "oneshot": "Tek Atış", "oneshot_desc": "Düşmana vurmak onu anında öldürür", @@ -297,18 +297,18 @@ "onlyhead": "Sadece Kafa", "onlyhead_desc": "Sadece kafadan hasar alırsın", - "paweljumper": "Ekstra Zıplama", - "paweljumper_desc": "Rastgele sayıda ekstra zıplama hakkı kazanırsın", - "paweljumper_desc2": "{0} tane ekstra zıplama hakkın var", + "paweljumper": "Zıppır", + "paweljumper_desc": "Rastgele sayıda ekstra zıplaman olur", + "paweljumper_desc2": "{0} kez ekstra zıplayabilirsin", "phoenix": "Anka Kuşu", "phoenix_desc": "Öldükten sonra rastgele yeniden doğma şansın olur", - "phoenix_desc2": "Ölümden sonra yeniden doğma şansın: %{0}", - "phoenix_respawn": "Anka Kuşu'nun gücü sayesinde küllerinden yeniden doğdun!", + "phoenix_desc2": "Yeniden doğma şansın: %{0}", + "phoenix_respawn": "Küllerinden yeniden doğdun!", "psychicdefusing": "Psişik İmha", "psychicdefusing_desc": "Bombanın yanındayken onu otomatik imha etmeye başlarsın", - "psychicdefusing_hud_info": "İmha için {0} saniye kaldı", + "psychicdefusing_hud_info": "Bombanın çözülmesi için son {0} saniye", "pilot": "Pilot", "pilot_desc": "Sınırlı bir süre uçun. Uçmak için zıplama tuşuna iki kez basın", @@ -326,7 +326,7 @@ "primaryban": "Tüfek Yasak", "primaryban_desc": "Tüfek kullanamayacak bir oyuncu seç", - "primaryban_enemy_info": "Artık tüfek kullanamazsın.", + "primaryban_enemy_info": "Tüfek kullanmayı unuttun", "primaryban_player_info": "'{0}' artık tüfek kullanamaz.", "primaryban_select_info": "Tüfek kullanımı yasaklanacak oyuncu:", @@ -335,13 +335,13 @@ "push": "İtici", "push_desc": "Düşmana vurduğunda onu geri itme şansın olur", - "push_desc2": "Düşmanı geri itme şansın: %{0}", + "push_desc2": "Geri itme şansın: %{0}", - "pyro": "Piromani", + "pyro": "Ateşbaz", "pyro_desc": "Molotof canını yeniler", - "quickshot": "Seri Ateş", - "quickshot_desc": "Tüm mermiler çok hızlı ateşlenir", + "quickshot": "Seri Atış", + "quickshot_desc": "Silahın daha hızlı ateş eder", "radarhack": "Radar Hack", "radarhack_desc": "Düşmanlar radarda görünür", @@ -349,34 +349,34 @@ "rambo": "Rambo", "rambo_desc": "Raund başında rastgele miktarda can alırsın", - "randomweapon": "Rastgele Silah", - "randomweapon_desc": "Rastgele bir silah almak için E tuşuna bas", + "randomweapon": "Silah Kumarı", + "randomweapon_desc": "[css_useSkill] tuşuna basarak rastgele bir silah al", - "rezombie": "Zombi Dönüşümü", - "rezombie_desc": "Öldükten sonra daha fazla canla ve silahsız bir zombi olarak yeniden doğarsın", + "rezombie": "Zombi", + "rezombie_desc": "Öldükten sonra daha fazla canla ve silahsız zombi olarak doğarsın", "reactivearmor": "Reaktif Zırh", - "reactivearmor_desc": "Zırh alınan ilk hasarı emmer", + "reactivearmor_desc": "Zırhın alınan ilk hasarı emmer", "regeneration": "Yenilenme", "regeneration_desc": "Birkaç saniyede bir canın yenilenir", "replicator": "Kopyacı", - "replicator_desc": "Vurulduğunda hasar veren bir kopya oluşturmak için E tuşuna bas", + "replicator_desc": "[css_useSkill] tuşuna basarak kopya oluştur ve ölürse rakibe hasar verir", - "retreat": "Geri Çekilme", - "retreat_desc": "Başlangıç noktasına dönmek için E tuşuna bas", + "retreat": "Geri Çekil", + "retreat_desc": "[css_useSkill] tuşuna basarak başlangıç noktasına ışınlan", "returntosender": "İade", - "returntosender_desc": "Düşmana ilk vuruşun onu kendi başlangıç noktasına geri gönderir", + "returntosender_desc": "Düşmana ilk vuruşun onu kendi başlangıç noktasına ışınlar", - "richboy": "Zengin Çocuk", + "richboy": "Zengin Bebe", "richboy_desc": "Raund başında rastgele miktarda para alırsın", "robinhood": "Robin Hood", "robinhood_desc": "Düşmana hasar vermek onun parasını çalar", - "rubber": "Lastik Mermiler", + "rubber": "Lastik Mermi", "rubber_desc": "Mermilerin oyuncuları önemli ölçüde yavaşlatır", "saper": "İstihkamcı", @@ -387,48 +387,48 @@ "shade": "Gölge", "shade_desc": "Vurduğun düşmanın arkasına ışınlanma şansın olur", - "shade_desc2": "Düşmanın arkasına ışınlanma şansın: %{0}", + "shade_desc2": "Arkasına ışınlanma şansın: %{0}", "shade_nospace": "Uygun alan yok", "shortbomb": "Kısa Fünye", "shortbomb_desc": "Bomba çok daha hızlı patlar", "silent": "Sessiz", - "silent_desc": "Ayak seslerin ve zıplamaların DİĞER oyunculara duyulmaz", + "silent_desc": "Ayak seslerini ve zıplamalarını DİĞER oyuncular duyamaz", "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", + "sniperelite_customname": "Keskin Nişancı", + "sniperelite_desc": "[css_useSkill] tuşuna basarak silahını AWP ile değiştir", - "soldier": "Asker", - "soldier_desc": "Rastgele bir hasar çarpanına sahip olursun", - "soldier_desc2": "Hasar çarpanın: {0}x", + "soldier": "Teğmen", + "soldier_desc": "Rastgele bir oranda fazla hasar verirsin", + "soldier_desc2": "Hasarın: {0}x", - "soundmaker": "Gürültücü", - "soundmaker_desc": "Her düşman için bir ses tetiklemek için E tuşuna bas", + "soundmaker": "Halüsinasyon", + "soundmaker_desc": "[css_useSkill] tuşuna basarak rakibinin çığlık atmasını sağla", - "spectator": "İzleyici", - "spectator_desc": "Rastgele bir düşmanı izlemek için E tuşuna bas", + "spectator": "Röntgen", + "spectator_desc": "[css_useSkill] tuşuna basarak rakibinin gözünden gör", "swapposition": "Yer Değiştirme", - "swapposition_desc": "Rastgele bir düşmanla yer değiştirmek için E tuşuna bas", + "swapposition_desc": "[css_useSkill] tuşuna basarak vurduğun düşmanla yer değiştir", "teleporter": "Işınlayıcı", "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}", + "teleporter_desc2": "Yer değiştirme şansın: %{0}", "thief": "Hırsız", "thief_desc": "Seçilen bir oyuncudan yeteneğini çalabilirsin", "thief_enemy_info": "Yeteneğin çalındı.", "thief_player_info": "'{0}' isimli oyuncunun yeteneği çalındı.", "thief_select_info": "Yetenek çalınacak oyuncu:", - "thief_incorrect_skill": "Bu yetenek seçilemez!", + "thief_incorrect_skill": "Bu yetenek çalınamaz!", "thirdeye": "Üçüncü Göz", - "thirdeye_desc": "Üçüncü şahıs bakış açısını aktif etmek için E tuşuna bas", + "thirdeye_desc": "[css_useSkill] tuşuna basarak üçüncü göze(thirdperson) geç", "thorns": "Dikenler", "thorns_desc": "Rakibin, sana verdiği hasarın bir kısmını geri alır", @@ -448,13 +448,13 @@ "watchmaker_tt": "Raund süresi {0} saniye uzatıldı.", "weaponsswap": "Silah Takası", - "weaponsswap_desc": "Rastgele bir düşmanla silahları takas etmek için E tuşuna bas", + "weaponsswap_desc": "[css_useSkill] tuşuna basarak silahını düşmanla takasla", "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", + "weightless_desc": "El bombalarınız yerçekiminden etkilenmez ve dümdüz gider", - "wildthrow": "Vahşi Atış", + "wildthrow": "Unutkan Bombacı", "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:", @@ -462,25 +462,25 @@ "zeus": "Zeus", "zeus_desc": "Zeus x27 anında şarj olur", - "your_skill": "Mevcut yeteneğin", + "your_skill": "Yeteneğin", "enemy_skill": "Düşmanın yeteneği", "observer_skill": "Oyuncunun yeteneği", "welcome_message": "{PLAYER}, {SERVER_NAME} sunucusuna hoş geldin!\nGüncel jRandomSkills versiyonu: {VERSION} ({SKILLS_COUNT} yetenek).\n\nOrijinal yapımcı:\n{AUTHOR1}\nGeliştiren:\n{AUTHOR2}\nResmi Discord: https://discord.gg/9H8EZYBpPF", - "drawing_skill": "Yetenek çekiliyor", + "drawing_skill": "Yetenek çarkı dönüyor...", "disabled_weapon": "Bu silahı kullanamazsın", "hud_info": "{0} saniye daha bekle", - "hud_info_no_enemy": "Düşman bulunamadı", + "hud_info_no_enemy": "Düşman yok", "active_hud_info": "{0} milisaniye daha aktif", "skills_menu": "Yetenek Listesi", - "no_player": "Eşleşen oyuncu bulunamadı.", + "no_player": "Eşleşen oyuncu yok.", "duplicate_player": "Aynı isimde birden fazla oyuncu bulundu.", - "selectplayerskill_command": "/t yazın", - "selectplayerskill_incorrect_enemy_index": "Seçilecek oyuncu bulunamadı.", + "selectplayerskill_command": "Sohbete /t yazın", + "selectplayerskill_incorrect_enemy_index": "Seçilecek oyuncu yok.", - "skill_not_found_setskill": "Böyle bir yetenek bulunamadı", - "player_not_found_setskill": "Böyle bir oyuncu bulunamadı", + "skill_not_found_setskill": "Böyle bir yetenek yok", + "player_not_found_setskill": "Böyle bir oyuncu yok", "correct_form_setskill": "Doğru kullanım: !setskill ", "correct_form_setscore": "Doğru kullanım: !setscore ", "done_setskill": "yetenek ayarlandı", @@ -506,12 +506,12 @@ "vote_alredy_voted": "Zaten oy kullandın!", "vote_vote": "Oy ver", - "bombsite_a": "Bomba Alanı A", - "bombsite_b": "Bomba Alanı B", + "bombsite_a": "A Bölgesi", + "bombsite_b": "B Bölgesi", "bombplanted": "Bomba kuruldu\nPatlamaya {0} saniye", - "teammate_skills": "Takım arkadaşlarının yetenekleri", - "summary": "Son raundun özeti", + "teammate_skills": "Takımının yetenekleri", + "summary": "Raundun özeti", "menu_controlls_scroll": "W/S - Kaydır", "menu_controlls_padding": " | ", diff --git a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/zh.json b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/zh.json index c42ef7c..08f05a2 100644 --- a/jRandomSkills - Server Files/plugins/jRandomSkills/languages/zh.json +++ b/jRandomSkills - Server Files/plugins/jRandomSkills/languages/zh.json @@ -275,9 +275,9 @@ "moneyswap_player_info": "你与玩家 '{0}' 交换了金钱。", "moneyswap_select_info": "选择你想与之交换金钱的玩家:", - "muhammed": "穆罕默德", - "muhammed_desc": "你死亡时会爆炸,杀死附近的玩家", - "muhammed_explosion": "真主至大!!!", + "deathbomb": "死亡炸弹", + "deathbomb_desc": "你死亡时会爆炸,杀死附近的玩家", + "deathbomb_explosion": "砰!", "ninja": "忍者", "ninja_desc": "站立不动增加33%隐形,蹲下增加33%,持刀增加33%", diff --git a/readme-pl.md b/readme-pl.md index 134f86f..960d16d 100644 --- a/readme-pl.md +++ b/readme-pl.md @@ -13,7 +13,7 @@ > Te repozytorium jest to fork [projektu](https://github.com/jakubbartosik/dRandomSkills) stworzonego przez [Jakuba Bartosika (D3X)](https://github.com/jakubbartosik). ## 💡 Opis -jRandomSkills to plugin do CounterStrike 2, który wprowadza chaos i frajdę do rozgrywki! W każdej rundzie losowo otrzymujesz jedną z unikalnych supermocy – od niewidzialności, przez wybuchowe strzały, po manipulację kamerą. Zaskocz przeciwników, przejmij kontrolę nad meczem i odkryj dziesiątki kreatywnych umiejętności, które zmieniają dynamikę gry! +jRandomSkills to plugin do CounterStrike 2, który wprowadza chaos i frajdę do rozgrywki! W każdej rundzie losowo otrzymujesz jedną z unikalnych supermocy - od niewidzialności, przez wybuchowe strzały, po manipulację kamerą. Zaskocz przeciwników, przejmij kontrolę nad meczem i odkryj dziesiątki kreatywnych umiejętności, które zmieniają dynamikę gry! #### Wybierz język: @@ -29,6 +29,8 @@ jRandomSkills to plugin do CounterStrike 2, który wprowadza chaos i frajdę do - **Francuski** [by: [@felyjyn](https://github.com/felyjyn)] - **Portugalski (Brazylijski)** [by: [@vinicius-trev](https://github.com/vinicius-trev)] - **Niemiecki** [by: [@Enrory](https://github.com/Enrory)] +- **Turecki** [by: [@brkvlr](https://github.com/brkvlr), [@ByDexterTR](https://github.com/ByDexterTR)] +- **Rosyjski** [by: [@213sdfsdgf](https://github.com/213sdfsdgf)] - **Chiński uproszczony** [GrokAI / ChatGPT] ## 🖼️ Prezentacja Pluginu @@ -40,18 +42,19 @@ Dołącz do serwera testowego 3v3 i wypróbuj plugin jRandomSkills: - **Adres**: `jRandomSkills@pukawka.pl` - **Hasło**: `public` - **Godziny otwarcia**: `00:00-19:00` -- **Połącz URL**: `steam://connect/51.38.122.215:27235/public` -- **Połącz**: `connect 51.38.122.215:27235; password public` +- **Połącz URL**: `steam://connect/51.38.122.215:27215/public` +- **Połącz**: `connect 51.38.122.215:27215; password public` Kupujesz serwer na pukawce? Skorzystaj z mojego [kodu polecającego](https://pukawka.pl/pp,juzlus.html). -## ✨ Aktualne Supermoce (112) +## ✨ Aktualne Supermoce (124)
Poniższa tabela przedstawia wszystkie dostępne supermoce w grze, wraz z ich opisami. | Nazwa | Opis | Czas odnowienia / Zakres | | - | - | -| | Aimbot | Każdy twój trafiony pocisk liczy się jako strzał w głowę | - | +| Aim Lock | Kliknij [css_useSkill], aby wycelować na najbliższego wroga | 20 s | | Anomalia | Cofasz się o 5 sekund do tyłu | 15 s | | Anty Flash | Posiadasz odporność na flash'e, a twoje flash'e trwają 7 sekund | - | | Żelazna Głowa | Nie otrzymujesz obrażeń w głowę | - | @@ -74,6 +77,7 @@ Kupujesz serwer na pukawce? Skorzystaj z mojego [kodu polecającego](https://puk | Mrok | Nadaje efekt ciemności wybranemu przeciwnikowi | - | | Deaktywator | Wybierasz gracza, którego supermoc chcesz wyłączyć | - | | Głuchy | Wybierasz gracza, dla którego chcesz wyłączyć wszystkie dźwięki | - | +| Ludzka bomba | Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu | - | | Rozbrojenie | Masz losową szanse na wyrzucenie broni wroga po trafieniu | (20 - 35)% | | Odległościomierz | Możesz zobaczyć odległość do najbliższego przeciwnika | - | | Doskok | Wykonaj drugi skok, aby wykonać doskok | - | @@ -99,7 +103,11 @@ Kupujesz serwer na pukawce? Skorzystaj z mojego [kodu polecającego](https://puk | Leczący Dym | Twoje granaty dymne leczą | - | | Pustelnik | Zabijanie przywraca amunicję i część zdrowia | - | | Święty Granat Ręczny | Twoje granaty uderzeniowe zadają podwójne obrażenia i mają podwójny zasięg | - | +| Naprowadzane Granaty | Twoje granaty (z wyjątkiem dymnych) są przyciągane do wrogów | - | +| Gorąca Bomba | Dopóki żyjesz, bomba zadaje obrażenia osobie, która ją niesie | - | | Hologram | Kliknij [css_useSkill], aby sterować hologramem przez kilka sekund | - | +| Analfabeta | Dopóki żyjesz, Twoi wrogowie nie potrafią czytać | - | +| Iluzjonista | Naciśnij [css_useSkill], aby wypuścić replikę idącą prosto przed siebie | 30 s | | Szpieg | Na początku rundy otrzymujesz model postaci przeciwnika | - | | Nieskończone Ammo | Otrzymujesz nieskończoną ilość amunicji do wszystkich broni | - | | Stópkarz | Wybierasz gracza, który pozostawi za sobą ślad | - | @@ -111,10 +119,12 @@ Kupujesz serwer na pukawce? Skorzystaj z mojego [kodu polecającego](https://puk | Zamiana Żyć | Wybierasz gracza, z którym chcesz wymienić się zdrowiem | - | | Długi Nóż | Podstawowy atak nożem zadaje obrażenia niezależnie od odległości | - | | Długi Zeus | Zeus zadaje obrażenia niezależnie od odległości | - | +| Magnetyczny Wabik | Twój wabik przyciąga pobliskich graczy do siebie | - | +| Magneto | Wszystkie granaty wroga są odpychane od Ciebie | - | | Lupa | Przybiżasz ekran wybranemu przeciwnikowi | - | | Medyk | Kliknij [css_useSkill], aby użyć ładunku leczniczego, który przywraca 50 punktów zdrowia | 1 s | +| Bomberman | Twoje granaty HE wybuchają tylko wtedy, gdy w pobliżu jest wróg | - | | Skarbówka | Wybierasz gracza, z którym chcesz zamienić się pieniędzmi | - | -| Muhammed | Po śmierci eksplodujesz i zabijasz graczy znajdujących się w zasięgu | - | | Ninja | Stojąc nieruchomo zwiększasz swoją niewidzialność o 33%, kucając o 33%, a trzymając nóż o 33% | - | | Pancernik | Granaty nie zadają Ci obrażeń | - | | Skupienie | Brak odrzutu podczas strzelania | - | @@ -149,7 +159,8 @@ Kupujesz serwer na pukawce? Skorzystaj z mojego [kodu polecającego](https://puk | Cień | Teleportujesz się za plecy trafionego wroga | - | | Krótka Bomba | Bomba wybucha znacznie szybciej | - | | Cichociemny | Twoje kroki i skoki są niesłyszalne dla INNYCH graczy | - | -| SzeliS | Kliknij [css_useSkill], aby zamienić aktualną broń na AWP | 0 s | +| Zadymiarz | Twoje granaty dymne nigdy się nie kończą | - | +| Papito | Kliknij [css_useSkill], aby zamienić aktualną broń na AWP | 0 s | | Żołnierz | Masz losowy mnożnik obrażeń | (1.15 - 1.35)x | | Dźwiękowiec | Kliknij [css_useSkill], aby wywołać dźwięk u każdego przeciwnika | 5 s | | Obserwator | Kliknij [css_useSkill], aby obserwować losowego przeciwnika | 0 s | @@ -159,9 +170,12 @@ Kupujesz serwer na pukawce? Skorzystaj z mojego [kodu polecającego](https://puk | Złodziej | Możesz ukraść supermoc wybranemu graczowi | - | | Trzecie Oko | Kliknij [css_useSkill], aby aktywować trzecią osobę | 0 s | | Ciernie | Twój przeciwnik otrzymuje część obrażeń, które zadał ci | - | +| TNóż do Rzucania | Naciśnij [css_useSkill], aby rzucić nożem. Ale uważaj na innych | - | | Toksyczny Dym | Twoje granaty dymne zadają obrażenia | - | | Wallhack | Widzisz wrogów przez ściany | - | | Zegarmistrz | Każdy rzut granatem zmienia czas rundy o -10 lub +10 sekund | - | +| Nieważkość | Twoje granaty nie podlegają grawitacji i lecą szybciej | - | +| Dzikie Rzuty | Wybierz gracza, który będzie miał trudności z rzucaniem granatami | - | | Zeus | Zeus x27 natychmiastowo się odnawia | - |
@@ -181,14 +195,13 @@ Kupujesz serwer na pukawce? Skorzystaj z mojego [kodu polecającego](https://puk 3. Zainstaluj **CounterStrikeSharp** - Pobierz [CounterStrikeSharp-With-Runtime](https://github.com/roflmuffin/CounterStrikeSharp/releases) - Wypakuj go do folderu `C2Server/game/csgo/` -4. Zainstaluj **CS2TraceRay** - - Pobierz [CS2TraceRay](https://github.com/schwarper/CS2TraceRay/releases) - - Wypakuj go do folderu `CS2Server/game/csgo/addons/counterstrikesharp/` +4. Zainstaluj **Ray-Trace** + - Pobierz [RayTrace-CSS-API](https://github.com/FUNPLAY-pro-CS2/Ray-Trace/releases) + - Wypakuj folder `conterstrikesharp` do folderu `CS2Server/game/csgo/addons/`. + - Pobierz [RayTrace-MM](https://github.com/FUNPLAY-pro-CS2/Ray-Trace/releases) + - Wypakuj go do folderu `CS2Server/game/csgo/addons/`. 5. Zainstaluj **jRandomSkills** - Pobierz [jRandomSkills](https://github.com/Juzlus/jRandomSkills/releases) - - Wypakuj go do folderu `C2Server/game/csgo/addons/counterstrikesharp/` - - JEŚLI do pobrania jest plik `gamedata.json`: - - Wypakuj `gamedata.json` do folderu `C2Server/server/game/csgo/addons/counterstrikesharp/gamedata/` ## Komendy Serwerowe > [!TIP] @@ -215,6 +228,10 @@ Kupujesz serwer na pukawce? Skorzystaj z mojego [kodu polecającego](https://puk | `!setscore ` | `!setscore 10 7` | Ustawienie wyniku gry | `@jRandomSkills/owner` | | `!setstaticskill ` | `!setstaticskill Juzlus Aimbot` | Przypisanie supermocy do gracza na stałe | `@jRandomSkills/admin` | | `!setstaticskill None` | `!setstaticskill Juzlus None` | Powrót do normalności | `@jRandomSkills/admin` | +| `!botplace [slot] [godmode]` | `!botplace 2 1` | Teleportuj bota do swojej lokalizacji | `@jRandomSkills/admin` | +| `!next_skill [idx]` | `!next_skill Juzlus` | Przełącza umiejętność gracza (następna, poprzednia -1 lub konkretny idx) | `@jRandomSkills/admin` | +| `!plantedbomb [time]` | `!plantedbomb 35` | Stwórz podłożoną bombę C4 w miejscu, w którym stoisz, z niestandardowym lub domyślnym (40 s) czasem detonacji | `@jRandomSkills/admin` | +| `!sethealth ` | `!sethealth 150` | Ustala określoną ilość zdrowia dla samego siebie | `@jRandomSkills/admin` | | `!reload` | `!reload` | Odśwież tłumaczenia | - | _Większość poleceń wymaga uprawnień, które należy ustawić w pliku: `game/csgo/addons/counterstrikesharp/configs/admins.json`_ @@ -250,10 +267,12 @@ Wszystkie sypermoce można dostosować w pliku **`config.cfg`** / **`skillsInfo. // 4 - Losowa supermoc dla każdego gracza (Pełna losowość) // 5 - Debug: Supormoce są przydzielane po kolei "YourSkillChatInfo": true, // Pokazuj swoją supermoc na czacie - "KillerSkillInfo": true, // Pokazuj supermoc zabójcy na czacie - "TeamMateSkillInfo": true, // Pokazuj supermoc sojuszników na czacie + "KillerSkillChatInfo": true, // Pokazuj supermoc zabójcy na czacie + "TeamMateSkillChatInfo": true, // Pokazuj supermoc sojuszników na czacie "SummaryAfterTheRound": true, // Pokazuj podsumowanie z ostatniej rundy - "DebugMode": true, // Zapisuj aktywność do folderu 'Debug' + "EnableBotSkills": true, // Włącz umiejętności dla botów + "EnableBotKickDebug": false, // Co 45 sekund wyrzuć losowego bota (do celów debugowania/testowania) + "DebugMode": false, // Zapisuj aktywność do folderu 'Debug' "AlternativeSkillButton": null, // Możliwe przyciski: // null, "Attack", "Jump", "Duck", "Forward", "Back", // "Use", "Cancel", "Left", "Right", "Moveleft", @@ -263,12 +282,12 @@ Wszystkie sypermoce można dostosować w pliku **`config.cfg`** / **`skillsInfo. // "Attack3", "Scoreboard", "Inspect" "SkillTimeBeforeStart": 7.0, // Ile sekund przed końcem freeze time należy zakończyć // losowanie umiejętności? (freezetime - SkillTimeBeforeStart) - "SkillHudDuration": 999.0, // Jak długo HUD HTML powinien być widoczny? - "SkillDescriptionDuration": 999, // Jak długo opis umiejętności powinien być widoczny? + "SkillHudDuration": -1.0, // Jak długo HUD HTML powinien być widoczny? + "SkillDescriptionDuration": 7.0, // Jak długo opis umiejętności powinien być widoczny? "DisplayAlwaysDescription":false,// Zawsze wyświetlaj opis umiejętności "DisableSpectateHUD": false, // Wyłącz HUD HTML bedąc martwym - "FlashingHtmlHudFix": true, // Włącz FlashingHtmlHudFix - "CS2TraceRayDebug": false, // Włącz widoczność ścieżki dla 'Długi Nóż', 'Długi Zeus' + "EnableFlashingHtmlHudFix": false,// Włącz FlashingHtmlHudFix + "TraceRayBeam": false, // Włącz widoczność ścieżki dla 'Długi Nóż', 'Długi Zeus' "DisableHUDOnDeathPermission": "@jRandomSkills/death", // Wyłącz HUD po śmierci dla graczy z tym uprawnieniem "DisableSkillsOnRoundEnd": false,// Wyłącz wszystkie umiejętności na koniec rundy (gdy widoczne jest podsumowanie) @@ -298,7 +317,12 @@ Wszystkie sypermoce można dostosować w pliku **`config.cfg`** / **`skillsInfo. "Color": "#ff0000", // Kolor supermocy "Active": true, // Włączona przy uruchamianiu "Name": "Aimbot", // Nazwa supermocy - "RequiredPermission": "" // Wymagane uprawnienie + "RequiredPermission": "", // Wymagane uprawnienie + "MaxPerServer": -1, // Maksymalna liczba graczy, którzy mogą posiadać tę + // umiejętność na serwerze (-1 dla "nieograniczona") + "Rarity": "Common" // Poziom rzadkości umiejętności: + // Common (70x), Uncommon (14x), + // Rare (10x), Epic (5x), Legendary (1x) }, ... ] @@ -314,20 +338,265 @@ Wszystkie sypermoce można dostosować w pliku **`config.cfg`** / **`skillsInfo. ## 🔗 Uznanie Plugin korzysta z zawartości następujących projektów: -- [dRandomSkills](https://github.com/jakubbartosik/dRandomSkills) by [Jakub Bartosik (D3X)](https://github.com/jakubbartosik) - system losowych umiejętności -- [CS2TraceRay](https://github.com/schwarper/CS2TraceRay) autorstwa [schwarper](https://github.com/schwarper) - system śledzenia promieni (Trace Ray) -- [CS2FlashingHtmlHudFix](https://github.com/girlglock/CS2FlashingHtmlHudFix) autorstwa [girlglock](https://github.com/girlglock) - poprawka migotania okienka z supermocą -- [ChaseMod](https://github.com/ipsvn/ChaseMod/blob/master/Utils/Memory/CCSMatch.cs) autorstwa [ipsvn](https://github.com/ipsvn) - ustawianie wyniku rund -- [WASDMenuAPI](https://github.com/Interesting-exe/WASDMenuAPI) by [Interesting-exe](https://github.com/Interesting-exe) - API do łatwego tworzenia menu za pomocą klawiszy WASD -- [GeoLocationLanguageManagerPlugin](https://github.com/aprox2/GeoLocationLanguageManagerPlugin) by [aprox2](https://github.com/aprox2) - zarządzenie geolokalizacją -- [GeoLite2](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data) by [MaxMind](https://www.maxmind.com/) - dane geolokalizacyjne +- [dRandomSkills](https://github.com/jakubbartosik/dRandomSkills) autorstwa [Jakub Bartosik (D3X)](https://github.com/jakubbartosik) - System losowych umiejętności +- [CS2TraceRay](https://github.com/schwarper/CS2TraceRay) autorstwa [schwarper](https://github.com/schwarper) - Stary system śledzenia promieni (Trace Ray) +- [Ray-Trace](https://github.com/FUNPLAY-pro-CS2/Ray-Trace) autorstwa [SlynxCZ](https://github.com/SlynxCZ) - Nowy system śledzenia promieni (Trace Ray) +- [CS2FlashingHtmlHudFix](https://github.com/girlglock/CS2FlashingHtmlHudFix) autorstwa [girlglock](https://github.com/girlglock) - Poprawka migotania okienka z supermocą +- [ChaseMod](https://github.com/ipsvn/ChaseMod/blob/master/Utils/Memory/CCSMatch.cs) autorstwa [ipsvn](https://github.com/ipsvn) - Ustawianie wyniku rund +- [WASDMenuAPI](https://github.com/Interesting-exe/WASDMenuAPI) autorstwa [Interesting-exe](https://github.com/Interesting-exe) - API do łatwego tworzenia menu za pomocą klawiszy WASD +- [GeoLocationLanguageManagerPlugin](https://github.com/aprox2/GeoLocationLanguageManagerPlugin) autorstwa [aprox2](https://github.com/aprox2) - Zarządzenie geolokalizacją +- [GeoLite2](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data) autorstwa [MaxMind](https://www.maxmind.com/) - Dane geolokalizacyjne +- [CServerSideClient](https://discord.com/channels/1160907911501991946/1508172390863994910/1508180670659166348) autorstwa [SLAYER](https://github.com/zakriamansoor47) + +## ❤️ Szczególne podziękowania + +ㅤ +
+ + + +
Ryuu Jin
Ryuu Jin
cj☭
cj☭
k4chen
k4chen
luno
luno
+ +Jeśli jesteś na tej liście i chcesz usunąć swój profil, skontaktuj się ze mną. + +
## 📋 Lista Zmian +
+v1.2.2.b2 + +- #### Ogólne: + - ###### Zaktualizowano zależność CSS do wersji 1.0.369. + - ###### Przeniesiono projekt z .NET 8.0 na .NET 10.0. + - ###### Zaktualizowano tłumaczenie na język turecki przez [@ByDexterTR](https://github.com/ByDexterTR)]. + - ###### Dodano tłumaczenie na język rosyjski autorstwa [@213sdfsdgf](https://github.com/213sdfsdgf)]. + - ###### Naprawiono problem z błędnym wyświetlaniem arabskich pseudonimów. + - ###### Wykorzystano ForceFullUpdate, aby naprawić crash "FATAL ERROR: CopyExistingEntity". + - ###### Wyłączono nieaktualny hook HandleCommandDrop, aby uniknąć crashy, gdy gracz dołącza do drużyny (podziękowania dla [@vladimir214sd](https://github.com/vladimir214sd)). + - ###### Dodano nowe sygnatury do gamedata. + - ###### Dodano możliwość ustawienia ilości granatów dla każdej mocy, która korzysta z granatów jako części swojej umiejętności (np. Bomberman, Anty Flash, Magnetyczny Wabik itp.). + +- #### Poprawki mocy: + - ###### Re-Zombie: + - ###### Naprawiono błędy z przełączaniem broni, gdy gracz trzyma Zeusa i nóż. + - ###### Bronie są teraz usuwane dla botów w trybie zombie. + - ###### Naprawiono błąd, przez który gracze czasami nie odradzali się, jeśli otrzymali zbyt duże obrażenia w zbyt krótkim czasie. + - ###### Duszek: + - ###### Zablokowano możliwość korzystania z Zeusa. + - ###### Zablokowano możliwość korzystania z SG556 (`weapon_sg556`). + - ###### Ciernie: + - ###### Dodano konfigurowalny maksymalny limit zdrowia (37 HP) dla obrażeń, które mogą zostać odbite. + - ###### Druga Szansa: + - ###### Naprawiono błąd, przez który gracze czasami nie odradzali się, jeśli otrzymali zbyt duże obrażenia w zbyt krótkim czasie. + - ###### Feniks: + - ###### Naprawiono błąd, przez który gracze czasami nie odradzali się, jeśli otrzymali zbyt duże obrażenia w zbyt krótkim czasie. + - ###### Kurczak: + - ###### Zablokowano możliwość korzystania z SG556 (`weapon_sg556`). + - ###### Wallhack: + - ###### Naprawiono błąd, który powodował tymczasowe podświetlanie wrogów natychmiast po śmierci. + - ###### Kamera: + - ###### Dodano zapamiętywanie pozycji kamery. + - ###### Nieśmiertelność: + - ###### Naprawiono błąd z permanentną nieśmiertelnością aktywującą się po osiągnięciu dokładnie 0 HP. + - ###### Zamiana Broni: + - ###### Ilość amunicji jest teraz również przenoszona podczas zamiany broni. + - ###### Ludzka bomba: + - ###### Zmieniono nazwę umiejętności na "DeathBomb". + - ###### Obserwator: + - ###### Naprawiono błąd, przez który gracz z umiejętnością Kurczak po śmierci nadal wyświetlał się jako ragdoll podczas bycia obserwowanym. + - ###### Ogień Przyjacielski: + - ###### Umiejętność działa teraz nawet wtedy, gdy serwerowa funkcja mp_friendlyfire jest ustawiona na 0. + - ###### Bejsbolista: + - ###### Wyłączono zabijanie członków drużyny. + +
+ +
+v1.2.2.b1 + +- #### Ogólne: + - ###### Zaktualizowano zależności projektu. + - ###### Zaimplementowano `EntityManager` w celu automatycznego czyszczenia encji i zarządzania pamięcią. + - ###### Dodano konfigurację umożliwiającą włączenie lub wyłączenie umiejętności dla botów. + - ###### Poprawki stabilności i wydajności. + +- #### Poprawki mocy: + - ###### Umiejętności oparte na niewidzialności: Są teraz widoczne dla członków drużyny oraz obserwatorów. + - ###### Fortnite: + - ###### Naprawiono problem z niezniszczalnymi barykadami po śmierci gracza. + - ###### Wallhack: + - ###### Ulepszono logikę wykrywania niewidzialnych graczy. + - ###### Dźwiękowiec / Stópkarz / Obserwator: + - ###### Zaktualizowano kod, aby poprawnie współpracował z niewidzialnymi graczami. + - ###### I więcej... + +
+ +
+v1.2.1.b9 + +- #### Ogólne: + - ###### Dodano Crash Handler w celu poprawy stabilności serwera (Podziękowania dla cj za pomoc). + - ###### Dodano rzadkość umiejętności (Skill Rarity - wprowadzono poziomy rzadkości dla mocy). + - ###### Dodano limit 'MaxPerServer' (ogranicza liczbę osób, które mogą korzystać z tej samej umiejętności jednocześnie). + - ###### Zastąpiono model "ghost_speaker.vmd" modelem "spray_plane.vmdl". + +- #### Poprawki mocy: + - ###### Skupienie: + - ###### Naprawiono i ulepszono kontrolę odrzutu (recoil control). + - ###### Re-Zombie / Feniks: + - ###### Zablokowano możliwość nadużywania (exploitu) odradzania się podczas zmiany drużyny. + +
+ +
+v1.2.1.b8 + +- #### Ogólne: + - ###### Zastąpiono [CS2TraceRay](https://github.com/schwarper/CS2TraceRay) biblioteką [RayTraceApi](https://github.com/FUNPLAY-pro-CS2/Ray-Trace). + - ###### Zaktualizowano CounterStrikeSharp do najnowszej wersji. + - ###### Nowa komenda do testowania umiejętności: `css_next_skill <(null)/-1/index>`. + - ###### Zaktualizowano sygnatury gamedata. + - ###### Zastąpiono bezpośrednie referencje do obiektów indeksami encji (entity indices) w celu poprawy bezpieczeństwa pamięci. + - ###### Naprawiono ścieżki modeli agentów. + - ###### Umiejętności są teraz automatycznie wyłączane, gdy gracz opuszcza serwer. + - ###### Dodano sprawdzenia wartości null (null-pointer checks) dla poprawy stabilności. + +- #### Poprawki mocy: + - ###### Aim Lock: + - ###### Ulepszono celowanie w głowę przeciwnika. + - ###### Anomalia / Skrytobójca / Kamera / Odpychacz / Zamiana Miejsc / Teleporter: + - ###### Ulepszono pozycjonowanie kamery podczas teleportacji. + - ###### Ostrożne pociski / Strzał Wybuchowy / Krucha Bomba: + - ###### Zaprojektowano na nowo logikę z powodu zmian w zdarzeniu `OnTakeDamage`. + - ###### Ogień Przyjacielski: + - ###### Naprawiono działanie umiejętności, gdy ogień przyjacielski jest wyłączony na serwerze (tryb Uproszczony/Casual). + - ###### Hologram: + - ###### Zablokowano możliwość wyrzucania i podnoszenia broni podczas bycia w formie hologramu. + - ###### Analfabeta: + - ###### Naprawiono błąd z poprawnym wyświetlaniem tekstu. + - ###### Stópkarz: + - ###### Naprawiono problemy związane z licznikami czasu (timerami). + - ###### Ninja: + - ###### Naprawiono błąd, przez który początkowy stan niewidzialności nigdy się nie aktualizował. + - ###### Skupienie / Szybkostrzelność: + - ###### Zaktualizowano kod, aby pasował do nowej struktury `AimPunchServices`. + - ###### NoClip / Cień / Iana: + - ###### Przeniesiono logikę na `TraceHullShape` w celu dokładniejszego wykrywania kolizji. + - ###### Re-Zombie: + - ###### Zablokowano możliwość używania broni w trybie zombie oraz zwiększono zdrowie do 500 HP. + +- #### Znane problemy: + - ###### Długi Nóż: + - ###### Wykrywanie prawego przycisku myszy jest obecnie zepsute na systemach Linux (pomimo poprawnych sygnatur). + - ###### Iluzjonista: + - ###### Błąd z T-Pose: Po dodaniu animgraph_2, modele postaci nie mają wbudowanych żadnych animacji. Na ten moment nie ma możliwości naprawienia tego bez dodawania własnych animacji z Warsztatu Steam. + +
+ +
+v1.2.1.b7 + +- #### Ogólne: + - ###### Podniesiono wersję modułu do **1.2.1.b7**. + - ###### Zaimplementowano **HTMLEncoder** w celu zwiększenia bezpieczeństwa wiadomości i ich ochrony. + - ###### Zaktualizowano funkcję `SkillAction`, aby zwracała wynik wywołanej metody (`object?`) lub `null`, jeśli nie została znaleziona. + - ###### Przebudowano system dystrybucji zdarzeń graczy, aby wywoływał `SkillAction` **tylko raz na każdą unikalną aktywną umiejętność**, co zmniejsza liczbę nadmiarowych wywołań. + - ###### Przełączono logikę pomiaru czasu na używanie `Server.CurrentTime` zamiast `EngineTime`. + - ###### Dodano informacje w konsoli podczas uruchamiania oraz automatyczne **sprawdzanie wersji** przy ładowaniu wtyczki. + - ###### Zaimplementowano **automatyczne kopiowanie** plików gamedata, bibliotek DLL oraz plików językowych podczas procesu budowania (autor: @vinicius-trev). + - ###### Zaktualizowano główne zależności: `CounterStrikeSharp.API` do wersji **1.0.364** oraz `MaxMind.Db` do wersji **5.0.0** (autor: @vinicius-trev). + - ###### Dodano **obsługę geolokalizacji** dla Turcji (`tr`) i Czech (`cz`). + - ###### Dodano obsługę **języka tureckiego (`tr`)** (autor: @brkvlr) oraz ulepszono tłumaczenia dla **języka portugalskiego brazylijskiego (`pt-br`)** (autor: @vinicius-trev). + - ###### W przypadku braku tłumaczenia system **używa teraz tekstu angielskiego** zamiast wyświetlania surowego klucza tłumaczenia. + - ###### **SkillUtils:** Naprawiono błędy wyboru punktów odrodzenia, problemy z referencjami pamięci oraz dodano obsługę parametru `maxHealth` dla funkcji `AddHealth`. + - ###### Naprawiono błąd, przez który **klawisz E** (interakcja/rozbrajanie) był przerywany przez użycie umiejętności; gracze mogą teraz rozbrajać bombę i wchodzić w interakcję z obiektami bez zakłóceń. + - ###### Licznik czasu systemu głosowania resetuje się teraz poprawnie po każdym głosowaniu. + +- #### Poprawki mocy: + - ##### Pilot (Rework): + - ###### Całkowicie przepisano logikę skoku. Lot wymaga teraz **podwójnego kliknięcia** klawisza skoku, aby go aktywować. + - ##### Błazen (Rework): + - ###### Zrefaktoryzowano system na działający indywidualnie dla każdego gracza (**per-player system**) wraz z poprawą stabilności licznika czasu. Licznik czasu Błazna **resetuje się** teraz, gdy gracz próbuje podłożyć lub rozbroić bombę. + - ##### NoClip (Rework): + - ###### Całkowita Rework logiki ruchu; ulepszono wykrywanie kolizji, aby **zapobiec utykaniu** w obiektach oraz zapewniono płynniejszy lot. + - ##### Duszek / C4 Kamuflaż / Ninja: + - ###### **Obserwatorzy widzą teraz niewidzialnych graczy.** + - ###### Ulepszono funkcję ukrywania bomby i naprawiono problem ze spamowaniem konsoli. + - ##### Odwrót / Resp Wroga: + - ###### Naprawiono błąd związany z niepoprawną interpretacją punktu odrodzenia. + - ##### Teleporter: + - ###### Mechanika została zmieniona na **procentową szansę** na zamianę miejsc z wrogiem, zamiast gwarantowanych 100%. + - ##### Hazardzista: + - ###### Naprawiono błąd, który pozwalał na odświeżenie umiejętności bez posiadania wymaganych pieniędzy. + - ##### Cień: + - ###### Naprawiono problemy związane z logiką teleportacji. + - ##### Ludzka bomba: + - ###### Zablokowano możliwość korzystania z umiejętności podczas zmiany drużyny, aby zapobiec nadużyciom (exploitom). + - ##### Bejsbolista: + - ###### Granaty wabiące (decoy) mają teraz taką samą kolizję jak gracze (**PlayerClip**). + - ##### Papito: + - ###### Główna refaktoryzacja oraz **naprawa crashy serwera** związanych z wymianą broni. + - ##### Replikator: + - ###### Dodano **animacje kucania** dla replik, aby dopasować je do ruchu gracza. + - ##### Mistrz Ostrza / Scyzoryk / Rozbrojenie / Długi Nóż / Długi Zeus / Zabójczy Flash: + - ###### Ulepszono obsługę broni typu **Bagnet** (Bayonet). + - ###### Dodano opcje konfiguracyjne **friendlyFire** dla `LongKnife`, `LongZeus` oraz `KillerFlash`. + - ##### Samowolka / Krótka Bomba / Wyluzowany: + - ###### Powiadomienia docierają teraz do wszystkich prawidłowych graczy, niezależnie od tego, czy żyją; dodano obsługę `BombAbortPlant`. + - ##### Niszczyciel Stref: + - ###### Dodano komunikat podczas przebywania na wyłączonym bombsite. + - ##### Wallhack: + - ###### Podświetlenie (glow) jest teraz poprawnie wyłączane dla martwych graczy. + - ##### Dźwiękowiec (Rework): + - ###### Przerobiono umiejętność tak, aby automatycznie odtwarzała dźwięk co 2 sekundy (słyszalny tylko dla gracza z tą umiejętnością). + +- #### Nowe moce: + - ##### Aim Lock: + - ###### Ustawia celownik na najbliższym przeciwniku przez ograniczony czas. + - ##### Naprowadzane Granaty: + - ###### Twoje granaty (z wyjątkiem dymnych) are przyciągane do pobliskich wrogów. + - ##### Magneto: + - ###### Odpycha nadlatujące granaty wroga od gracza. + - ##### Bomberman: + - ###### Rozmieszcza granaty odłamkowe (HE), które wybuchają tylko wtedy, gdy wróg znajdzie się w ich zasięgu. + - ##### Analfabeta: + - ###### Dopóki użytkownik żyje, wrogowie nie mogą czytać czatu ani informacji na HUD-zie. + - ##### Gorąca Bomba: + - ###### C4 zadaje stałe obrażenia osobie niosącej bombę tak długo, jak żyje właściciel umiejętności. + - ##### Iluzjonista: + - ###### Tworzy replikę, która idzie prosto przed siebie, aby odwrócić uwagę wrogów. + - ##### Magnetyczny Wabik: + - ###### Granaty wabiące (decoy) przyciągają pobliskich graczy do swojego środka. + - ##### TNóż do Rzucania: + - ###### Dodaje możliwość rzucania we wrogów zabójczym nożem. + - ##### Nieważkość: + - ###### Granaty lecą szybciej i nie działa już na nie grawitacja. + - ##### Dzikie Rzuty: + - ###### Sprawia, że wybrany gracz "zapomina swoich lineupów", co skutkuje losowymi trajektoriami rzutów granatów. + - ##### Zadymiarz: + - ###### Twoje granaty dymne nigdy się nie kończą. + +- #### Nowe komendy: + - ###### `css_bot_place ` - Teleportuje bota na pozycję gracza z opcjonalnym trybem godmode. + - ###### `!sethealth ` - Komenda dla administratora do zarządzania zdrowiem i testowania. + - ###### `!plantedbomb ` - Komenda do testowania stanów i logiki związanej z podłożoną bombą. +
+
v1.2.0 -- #### General: +- #### Ogólne: - ###### Zmieniono nazwę pluginu z `!jRandomSkills` na `jRandomSkills`. - ###### Poprawiono literówkę w uprawnieniach z `@jRandmosSkills` na `@jRandomSkills`. - ###### Domyślnie wyłączono `DebugMode` w konfiguracji (przez: [@vinicius-trev](https://github.com/vinicius-trev)). @@ -535,7 +804,7 @@ Plugin korzysta z zawartości następujących projektów:
v1.1.9a -- #### General: +- #### Ogólne: - ###### Zaktualizowano zależności do najnowszej wersji. - ###### Aktualizacja sygnatur (jRandomSkills.gamedata.json). - ###### FlashingHtmlHudFix jest teraz wyłączony podczas rozgrzewki. @@ -616,7 +885,7 @@ Plugin korzysta z zawartości następujących projektów: - ###### Dodano konfigurowalny czas blokady na początku rundy. - ##### Rozbrojenie: - ###### Powrót do upuszczania broni zamiast zmiany na slot3. - - ###### Zmniejszono szansę na upuszczenie broni: (20–50)% → (20–35)%. + - ###### Zmniejszono szansę na upuszczenie broni: (20-50)% → (20-35)%. - ##### Kurczak: - ###### Zmieniła się metoda poruszania się kurczaka. - ###### Gracz widzi model swojego kurczaka. diff --git a/readme.md b/readme.md index fec917e..5941e29 100644 --- a/readme.md +++ b/readme.md @@ -13,7 +13,7 @@ > This repository is a fork of the [project](https://github.com/jakubbartosik/dRandomSkills) created by [Jakub Bartosik (D3X)](https://github.com/jakubbartosik). ## 💡 About -jRandomSkills is a plugin for CounterStrike 2 that brings chaos and fun to gameplay! In each round, you randomly receive one of the unique skills – from invisibility and explosive shots to camera manipulation. Surprise your opponents, take control of the match, and discover dozens of creative abilities that transform the game's dynamics! +jRandomSkills is a plugin for CounterStrike 2 that brings chaos and fun to gameplay! In each round, you randomly receive one of the unique skills - from invisibility and explosive shots to camera manipulation. Surprise your opponents, take control of the match, and discover dozens of creative abilities that transform the game's dynamics! #### Choose language: @@ -29,6 +29,8 @@ jRandomSkills is a plugin for CounterStrike 2 that brings chaos and fun to gamep - **French** [by: [@felyjyn](https://github.com/felyjyn)] - **Portuguese (Brazilian)** [by: [@vinicius-trev](https://github.com/vinicius-trev)] - **German** [by: [@Enrory](https://github.com/Enrory)] +- **Turkish** [by: [@brkvlr](https://github.com/brkvlr), [@ByDexterTR](https://github.com/ByDexterTR)] +- **Russian** [by: [@213sdfsdgf](https://github.com/213sdfsdgf)] - **Simplified Chinese** [GrokAI / ChatGPT] ## 🖼️ Preview @@ -40,19 +42,20 @@ Join the 3v3 test server and try out the jRandomSkills plugin: - **Address**: `jRandomSkills@pukawka.pl` - **Password**: `public` - **Opening Hours**: `22:00-17:00 UTC` -- **Connect URL**: `steam://connect/51.38.122.215:27235/public` -- **Connect**: `connect 51.38.122.215:27235; password public` +- **Connect URL**: `steam://connect/51.38.122.215:27215/public` +- **Connect**: `connect 51.38.122.215:27215; password public` Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus.html). -## ✨ Current Skills (112) +## ✨ Current Skills (124)
The table below lists all available skills in the game, along with their descriptions. | Name | Description | Cooldown / Range | | - | - | - | | Aimbot | Every bullet you hit counts as a headshot | - | +| Aim Lock | Click [css_useSkill] to lock your aim on the nearest enemy | 20 s | | Anomaly | You rewind a few seconds back in time | 15 s | | Anti-Flash | You are immune to flashbangs, and your flashbangs last 7 seconds | - | | Iron Head | You take no damage from headshots | - | @@ -75,6 +78,7 @@ Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus. | Darkness | Applies a darkness effect to a chosen enemy | - | | Deactivator | Choose a player whose skill you want to disable | - | | Deaf | Choose a player to mute all sounds for | - | +| Death Bomb | You explode upon death, killing nearby players | - | | Disarmament | You have a random chance to make an enemy drop their weapon on hit | (20 - 35)% | | Rangefinder | You can see the distance to the nearest enemy | - | | Dash | Perform a second jump to dash | - | @@ -100,7 +104,11 @@ Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus. | Healing Smoke | Your smoke grenades heal | - | | Hermit | Killing restores ammo and a portion of health | - | | Holy Hand Grenade | Your HE grenades deal double damage and have double range| - | +| Homing Grenades | Your grenades (except smokes) are attracted to enemies | - | +| Hot Bomb | As long as you are alive, the bomb deals damage to its carrier | - | | Hologram | Click [css_useSkill] to control your hologram for a few seconds | 30 s | +| Illiterate | As long as you are alive, your enemies cannot read | - | +| Illusionist | Click [css_useSkill] to deploy a replica that walks straight ahead | 30 s | | Impostor | You start the round with an enemy player model | - | | Infinite Ammo | You receive infinite ammo for all your weapons | - | | Tracker | Choose a player who will leave a trail behind them | - | @@ -112,10 +120,12 @@ Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus. | Life Swap | Choose a player to swap health with | - | | Long Knife | A primary knife attack deals damage regardless of distance | - | | Long Zeus | Zeus deals damage regardless of distance | - | +| Magnetic Decoy | Your decoy attracts nearby players towards itself | - | +| Magneto | All enemy grenades are repelled away from you | - | | Magnifier | Forces the enemy's screen to zoom in, reducing their field of view | - | | Medic | Click [css_useSkill] to use a healing charge that restores 50 health | 1 s | +| Bomb Miner | Your HE grenade only explode when there is an enemy nearby | - | | Taxman | Choose a player to swap money with | - | -| Muhammed | You explode upon death, killing nearby players | - | | Ninja | Standing still increases your invisibility by 33%, crouching by 33%, and holding a knife by 33% | - | | No-Nades | Grenades deal no damage to you | - | | Focus | No recoil while shooting | - | @@ -150,6 +160,7 @@ Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus. | Shade | You teleport behind the back of a hit enemy | - | | Short Fuse | The bomb explodes much faster | - | | Silent | Your footsteps and jumps are silent to other players | - | +| Smoker | Your smoke grenades never run out | - | | Sniper Elite | Click [css_useSkill] to swap your current weapon for an AWP | 0 s | | Soldier | You have a random damage multiplier | (1.15 - 1.35)x | | Soundmaker | Click [css_useSkill] to trigger a sound for every enemy | 5 s | @@ -159,10 +170,13 @@ Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus. | Thief | You can steal a skill from a chosen player | - | | Third Eye | Click [css_useSkill] to activate third-person view | 0 s | | Thorns | Your opponent will receive a portion of the damage that they inflicted on you | - | +| Throwing Knife | Click [css_useSkill] to throw a knife. But watch out for others | - | | Toxic Smoke | Your smoke grenades deal damage | - | | Wallhack | You can see enemies through walls | - | | Watchmaker | Every grenade throw alters the round time | - | | Weapon Swap | Click [css_useSkill] to swap weapons with a random enemy | 30 s | +| Weightlessness | Your grenades are not affected by gravity and fly faster | - | +| Wild Throws | Choose a player who will have trouble throwing grenades | - | | Zeus | Zeus x27 instantly recharges | - |
@@ -183,14 +197,13 @@ Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus. 3. Install **CounterStrikeSharp**. - Download [CounterStrikeSharp-With-Runtime](https://github.com/roflmuffin/CounterStrikeSharp/releases). - Extract it to the `C2Server/game/csgo/` folder. -4. Install **CS2TraceRay** - - Download [CS2TraceRay](https://github.com/schwarper/CS2TraceRay/releases) - - Extract it to the `CS2Server/game/csgo/addons/counterstrikesharp/` folder. +4. Install **Ray-Trace** + - Download [RayTrace-CSS-API](https://github.com/FUNPLAY-pro-CS2/Ray-Trace/releases) + - Extract folder `conterstrikesharp` to the `CS2Server/game/csgo/addons/` folder. + - Download [RayTrace-MM](https://github.com/FUNPLAY-pro-CS2/Ray-Trace/releases) + - Extract it to the `CS2Server/game/csgo/addons/` folder. 5. Install **jRandomSkills** - Download [jRandomSkills](https://github.com/Juzlus/jRandomSkills/releases) - - Extract it to the `C2Server/game/csgo/addons/counterstrikesharp/` folder. - - IF there is a `gamedata.json` file to download: - - Extract `gamedata.json` to the `C2Server/server/game/csgo/addons/counterstrikesharp/gamedata/` folder. ## Server Commands > [!TIP] @@ -217,6 +230,10 @@ Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus. | `!setscore ` | `!setscore 10 7` | Set the game score | `@jRandomSkills/owner` | | `!setstaticskill ` | `!setstaticskill Juzlus Aimbot` | Giving a player a permanent skill | `@jRandomSkills/admin` | | `!setstaticskill None` | `!setstaticskill Juzlus None` | Back to normal | `@jRandomSkills/admin` | +| `!botplace [slot] [godmode]` | `!botplace 2 1` | Teleport a bot to your location | `@jRandomSkills/admin` | +| `!next_skill [idx]` | `!next_skill Juzlus` | Switch skill for a player (next, previous -1, or specific idx) | `@jRandomSkills/admin` | +| `!plantedbomb [time]` | `!plantedbomb 35` | Spawn a planted C4 bomb at your position with custom or default (40s) detonation time | `@jRandomSkills/admin` | +| `!sethealth ` | `!sethealth 150` | Set a specific health amount for yourself | `@jRandomSkills/admin` | | `!reload` | `!reload` | Reload translations | - | _Most commands require permissions, which must be set in the file: `game/csgo/addons/counterstrikesharp/configs/admins.json`_ @@ -252,10 +269,12 @@ All skills can be customized in the **`config.cfg`** / **`skillsInfo.json`** fil // 4 - Random skills for each player (Full random) // 5 - Debug: Skills are assigned in turn "YourSkillChatInfo": true, // Show your skill in chat - "KillerSkillInfo": true, // Show killer's skill in chat - "TeamMateSkillInfo": true, // Show allies' skills in chat + "KillerSkillChatInfo": true, // Show killer's skill in chat + "TeamMateSkillChatInfo": true, // Show allies' skills in chat "SummaryAfterTheRound": true, // Show summary of the last round - "DebugMode": false, // Write activity to the ‘Debug’ folder + "EnableBotSkills": true, // Enable skills for bots + "EnableBotKickDebug": false, // Kick a random bot every 45s (for debug/testing) + "DebugMode": false, // Write activity to the ‘Debug’ folder "AlternativeSkillButton": null, // Possible buttons: // null, "Attack", "Jump", "Duck", "Forward", "Back", // "Use", "Cancel", "Left", "Right", "Moveleft", @@ -265,12 +284,12 @@ All skills can be customized in the **`config.cfg`** / **`skillsInfo.json`** fil // "Attack3", "Scoreboard", "Inspect" "SkillTimeBeforeStart": 7.0, // How many seconds before freeze time ends should skills // drawing be completed? (freezetime - SkillTimeBeforeStart) - "SkillHudDuration": 999.0, // How long should the HUD be visible for? - "SkillDescriptionDuration": 999, // How long should the skill description be visible for? + "SkillHudDuration": -1.0, // How long should the HUD be visible for? + "SkillDescriptionDuration": 7.0, // How long should the skill description be visible for? "DisplayAlwaysDescription":false,// Always display skill description (SkillDescriptionDuration = 9999) "DisableSpectateHUD": false, // Disable HTML HUD when spectating - "FlashingHtmlHudFix": true, // Enable FlashingHtmlHudFix - "CS2TraceRayDebug": false, // Enable trail visibility for 'Long Knife', 'Long Zeus' + "EnableFlashingHtmlHudFix": false,// Enable FlashingHtmlHudFix + "TraceRayBeam": false, // Enable trail visibility for 'Long Knife', 'Long Zeus' "DisableHUDOnDeathPermission": "@jRandomSkills/death", // Disable the HUD after death for players with this permission "DisableSkillsOnRoundEnd": false,// Disable all skills at the end of the round (when the summary is visible) @@ -300,7 +319,12 @@ All skills can be customized in the **`config.cfg`** / **`skillsInfo.json`** fil "Color": "#ff0000", // Skill color "Active": true, // Enabled on startup "Name": "Aimbot", // Skill name - "RequiredPermission": "" // Required permission + "RequiredPermission": "", // Required permission + "MaxPerServer": -1, // Maximum number of players allowed to have + // this skill on the server (-1 for unlimited) + "Rarity": "Common" // Rarity tier of the skill: + // Common (70x), Uncommon (14x), + // Rare (10x), Epic (5x), Legendary (1x) }, ... ] @@ -316,16 +340,262 @@ All skills can be customized in the **`config.cfg`** / **`skillsInfo.json`** fil ## 🔗 Credits This plugin uses content from the following projects: -- [dRandomSkills](https://github.com/jakubbartosik/dRandomSkills) by [Jakub Bartosik (D3X)](https://github.com/jakubbartosik) - random skills system -- [CS2TraceRay](https://github.com/schwarper/CS2TraceRay) by [schwarper](https://github.com/schwarper) - Trace Ray system -- [CS2FlashingHtmlHudFix](https://github.com/girlglock/CS2FlashingHtmlHudFix) by [girlglock](https://github.com/girlglock) - a fix for window flickering -- [ChaseMod](https://github.com/ipsvn/ChaseMod/blob/master/Utils/Memory/CCSMatch.cs) by [ipsvn](https://github.com/ipsvn) - round score management +- [dRandomSkills](https://github.com/jakubbartosik/dRandomSkills) by [Jakub Bartosik (D3X)](https://github.com/jakubbartosik) - Random skills system +- [CS2TraceRay](https://github.com/schwarper/CS2TraceRay) by [schwarper](https://github.com/schwarper) - Old Trace Ray system +- [Ray-Trace](https://github.com/FUNPLAY-pro-CS2/Ray-Trace) by [SlynxCZ](https://github.com/SlynxCZ) - New Trace Ray system +- [CS2FlashingHtmlHudFix](https://github.com/girlglock/CS2FlashingHtmlHudFix) by [girlglock](https://github.com/girlglock) - A fix for window flickering +- [ChaseMod](https://github.com/ipsvn/ChaseMod/blob/master/Utils/Memory/CCSMatch.cs) by [ipsvn](https://github.com/ipsvn) - Round score management - [WASDMenuAPI](https://github.com/Interesting-exe/WASDMenuAPI) by [Interesting-exe](https://github.com/Interesting-exe) - API to easily create WASD menus -- [GeoLocationLanguageManagerPlugin](https://github.com/aprox2/GeoLocationLanguageManagerPlugin) by [aprox2](https://github.com/aprox2) - geolocation language manager -- [GeoLite2](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data) by [MaxMind](https://www.maxmind.com/) - geolocation data +- [GeoLocationLanguageManagerPlugin](https://github.com/aprox2/GeoLocationLanguageManagerPlugin) by [aprox2](https://github.com/aprox2) - Geolocation language manager +- [GeoLite2](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data) by [MaxMind](https://www.maxmind.com/) - Geolocation data +- [CServerSideClient](https://discord.com/channels/1160907911501991946/1508172390863994910/1508180670659166348) by [SLAYER](https://github.com/zakriamansoor47) + +## ❤️ Special thanks + +ㅤ +
+ + + +
Ryuu Jin
Ryuu Jin
cj☭
cj☭
k4chen
k4chen
luno
luno
+ +If you are on this list and want your profile removed, please contact me. + +
## 📋 Changelog +
+v1.2.2.b2 + +- #### General: + - ###### Updated CSS dependency to version 1.0.369. + - ###### Upgraded the project from .NET 8.0 to .NET 10.0. + - ###### Updated Turkish language translation by [@ByDexterTR](https://github.com/ByDexterTR)]. + - ###### Added Russian language translation by [@213sdfsdgf](https://github.com/213sdfsdgf)]. + - ###### Fixed an issue with incorrect display of Arabic nicknames. + - ###### Used ForceFullUpdate to resolve the "FATAL ERROR: CopyExistingEntity" crash. + - ###### Disabled stale HandleCommandDrop hook to avoid crashes when a player joins a team (thanks to [@vladimir214sd](https://github.com/vladimir214sd)). + - ###### Added new signatures to gamedata. + - ###### Added the ability to configure the number of grenades for every skill that uses grenades as part of its ability (e.g., Miner, AntyFlash, MagneticDecoy, etc.). + +- #### Skill improvements: + - ###### Re-Zombie: + - ###### Fixed weapon switching issues when a player is holding a Zeus and a knife. + - ###### Weapons are now removed for bots in zombie mode. + - ###### Fixed an issue where players would occasionally fail to respawn if they took too much damage too quickly. + - ###### Ghost: + - ###### Blocked the ability to use the Zeus. + - ###### Blocked the ability to use the SG556 (`weapon_sg556`). + - ###### Thorns: + - ###### Added a configurable maximum health limit (37 HP) for the damage that can be reflected. + - ###### Second Life: + - ###### Fixed an issue where players would occasionally fail to respawn if they took too much damage too quickly. + - ###### Phoenix: + - ###### Fixed an issue where players would occasionally fail to respawn if they took too much damage too quickly. + - ###### Chicken: + - ###### Blocked the ability to use the SG556 (`weapon_sg556`). + - ###### Wallhack: + - ###### Fixed a bug that caused temporary enemy highlighting right after death. + - ###### Cypher: + - ###### Added camera position persistence. + - ###### God Mode: + - ###### Fixed an issue with permanent immortality triggering after reaching exactly 0 HP. + - ###### Weapons Swap: + - ###### The ammo count is now also transferred when weapons are swapped. + - ###### Muhammed: + - ###### Renamed the skill to "DeathBomb". + - ###### Spectator: + - ###### Fixed a bug where a player with the Chicken skill would still display as a ragdoll after death when spectated. + - ###### Friendly Fire: + - ###### The skill now works even when the server's mp_friendlyfire setting is set to 0. + - ###### Baseball: + - ###### Disabled teammate killing. + +
+ +
+v1.2.2.b1 + +- #### General: + - ###### Updated project dependencies. + - ###### Implemented `EntityManager` for automated entity cleanup and memory management. + - ###### Added configuration to enable or disable skills for bots. + - ###### Stability and performance improvements. + +- #### Skill improvements: + - ###### Invisibility-based skills: Now visible to teammates and spectators. + - ###### Fortnite: + - ###### Fixed an issue with indestructible barricades after player death. + - ###### Wallhack: + - ###### Improved detection logic for invisible players. + - ###### Soundmaker / Jackal / Spectator: + - ###### Updated to correctly work with invisible players. + - ###### And more... + +
+ +
+v1.2.1.b9 + +- #### General: + - ###### Added Crash Handler to improve server stability (Thanks to cj for help). + - ###### Added Skill Rarity (added rarity levels to skills). + - ###### Added 'MaxPerServer' limit (limits how many people can use the same skill). + - ###### Replaced model "ghost_speaker.vmd" with "spray_plane.vmdl". + +- #### Skill improvements: + - ###### Focus: + - ###### Fixed and improved recoil control. + - ###### ReZombie / Phoenix: + - ###### Blocked respawn exploit when changing teams. + +
+ +
+v1.2.1.b8 + +- #### General: + - ###### Replaced [CS2TraceRay](https://github.com/schwarper/CS2TraceRay) with [RayTraceApi](https://github.com/FUNPLAY-pro-CS2/Ray-Trace). + - ###### Updated CounterStrikeSharp to the latest version. + - ###### New command for skill testing: `css_next_skill <(null)/index>`. + - ###### Updated gamedata signatures. + - ###### Replaced CS2TraceRay with `RayTraceApi`. + - ###### Replaced direct object references with entity indices to improve memory safety. + - ###### Fixed agent model paths. + - ###### Skills are now automatically disabled when a player leaves the server. + - ###### Added null-pointer checks for improved stability. + +- #### Skill improvements: + - ###### AimLock: + - ###### Aiming at the opponent's head has been improved. + - ###### Anomaly / Behind / Cypher / Push / SwapPosition / Teleporter: + - ###### Improved camera positioning during teleportation. + - ###### CarefulBullets / ExplosiveShot / FragileBomb: + - ###### Redesigned logic due to changes in the `OnTakeDamage` event. + - ###### FriendlyFire: + - ###### Fixed skill functionality when friendly fire is disabled on the server (Casual mode). + - ###### Hologram: + - ###### Blocked weapon dropping and picking up while in hologram form. + - ###### Illiterate: + - ###### Fixed a bug with correct text display. + - ###### Tracker: + - ###### Fixed issues related to timers. + - ###### Ninja: + - ###### Fixed a bug where the initial invisibility state never update. + - ###### NoRecoil / QuickShot: + - ###### Updated to match the new `AimPunchServices` structure. + - ###### Noclip / Shade / Iana: + - ###### Migrated to `TraceHullShape` for more accurate collision detection. + - ###### ReZombie: + - ###### Disabled weapon usage in zombie mode and increased HP to 500. + +- #### Known Issues: + - ###### LongKnife: + - ###### Right-click detection is currently broken on Linux (despite valid signatures). + - ###### Illusionist: + - ###### T-Pose bug: After adding animgraph_2, the character models don't have any animations built in. So, for now, there isn't really any way to do this without adding your own from the Workshop. + +
+ +
+v1.2.1.b7 + +- #### General: + - ###### Bumped module version to **1.2.1.b7**. + - ###### Implemented **HTMLEncoder** for improved message security and protection. + - ###### Updated `SkillAction` to return the invoked method result (`object?`) or `null` if not found. + - ###### Reworked player event dispatching to call `SkillAction` **once per distinct active skill**, reducing redundant invocations. + - ###### Switched timing logic to use `Server.CurrentTime` instead of `EngineTime`. + - ###### Added startup console information and an automated **version check** on plugin load. + - ###### Implemented **automatic copying** of gamedata, DLLs, and language files during the build process (by @vinicius-trev). + - ###### Updated core dependencies: `CounterStrikeSharp.API` to **1.0.364** and `MaxMind.Db` to **5.0.0** (by @vinicius-trev). + - ###### Added **geolocation support** for Turkey (`tr`) and Czechia (`cz`). + - ###### Added **Turkish (`tr`)** language support (by @brkvlr) and improved **Portuguese-Brazil (`pt-br`)** translations (by @vinicius-trev). + - ###### If a translation is missing, the system now **falls back to English text** instead of displaying the raw translation key. + - ###### **SkillUtils:** Fixed spawn point selection bugs, memory referencing issues, and added `maxHealth` parameter support for `AddHealth`. + - ###### Fixed an issue where the **E key** (interact/defuse) was interrupted by skill usage; players can now defuse and interact with objects without interference. + - ###### Vote system timer now correctly resets after each vote. + +- #### Skill improvements: + - ##### Pilot (Rework): + - ###### Completely rewritten jump and fuel logic. Flight now requires a **double-click** of the jump key to activate. + - ##### Jester (Rework): + - ###### Refactored to a **per-player system** with improved timer stability. The Jester timer now **resets** when the player attempts to plant or defuse the bomb. + - ##### Noclip (Rework): + - ###### Total rework of the movement logic; improved collision detection to **prevent getting stuck** in objects and ensured smoother flight. + - ##### Ghost / C4 Camouflage / Ninja: + - ###### **Observers can now see invisible players.** + - ###### Improved bomb hiding function and fixed console spam issues. + - ##### Retreat / Enemy Spawn: + - ###### Fixed an error with incorrect spawn point interpretation. + - ##### Teleporter: + - ###### The mechanic has been changed to a **percentage chance** of swapping places with an enemy, rather than a guaranteed 100%. + - ##### Gambler: + - ###### Fixed a bug that allowed the skill to be refreshed without having the required money. + - ##### Shade: + - ###### Fixed issues related to teleportation logic. + - ##### Muhammed: + - ###### Blocked skill usage during team switching to prevent exploits. + - ##### Baseball: + - ###### Decoy grenades now have the same collision as players (**PlayerClip**). + - ##### Sniper Elite: + - ###### Major refactoring and **fix for server crashes** related to weapon swapping. + - ##### Replicator: + - ###### Added **crouching animations** for replicas to match player movement. + - ##### Blade Master / Cutter / Disarmament / Long Knife / Long Zeus / Killer Flash: + - ###### Improved handling for **Bayonet** weapon types. + - ###### Added **friendlyFire** configuration options for `LongKnife`, `LongZeus`, and `KillerFlash`. + - ##### Planter / Short Bomb / Chill Out: + - ###### Notifications now reach all valid players regardless of life status; added `BombAbortPlant` support. + - ##### Area Reaper: + - ###### Added a message while being on a disabled bombsite. + - ##### Wallhack: + - ###### Glow is now correctly disabled for dead players. + - ##### Sound Maker (Rework): + - ###### Reworked to automatically play a sound every 2 seconds (audible only for the player with skill). + +- #### New skills: + - ##### Aim Lock: + - ###### Lock your aim on the nearest enemy for a limited duration. + - ##### Homing Nades: + - ###### Your grenades (except smokes) are attracted to nearby enemies. + - ##### Magneto: + - ###### Pushes incoming enemy grenades away from the player. + - ##### Miner: + - ###### Deploys HE grenades that only detonate when an enemy is within range. + - ##### Illiterate: + - ###### While the user is alive, enemies are unable to read chat or HUD information. + - ##### Hot Bomb: + - ###### The C4 deals constant damage to the carrier as long as the skill owner is alive. + - ##### Illusionist: + - ###### Deploys a replica that walks straight ahead to distract enemies. + - ##### Magnetic Decoy: + - ###### Decoy grenades attract nearby players towards the center of the decoy. + - ##### Throwing Knife: + - ###### Adds the ability to throw a lethal knife at enemies. + - ##### Weightless: + - ###### Grenades fly faster and are no longer affected by gravity. + - ##### Wild Throw: + - ###### Causes a selected player to "forget their lineups," resulting in randomized grenade trajectories. + - ##### Smoker: + - ###### Your smoke grenades never run out. + +- #### New commands: + - ###### `css_bot_place ` - Teleports a bot to the player's position with optional godmode. + - ###### `!sethealth ` - Admin command for health management and testing. + - ###### `!plantedbomb ` - Command for testing bomb-related states and logic. +
+
v1.2.0 @@ -623,7 +893,7 @@ This plugin uses content from the following projects: - ###### Added a configurable cooldown at the start of the round. - ##### Disarmament: - ###### Back to dropping weapons instead of changing to slot3. - - ###### The chance of dropping weapons has been reduced: (20–50)% → (20–35)% + - ###### The chance of dropping weapons has been reduced: (20-50)% → (20-35)% - ##### Chicken: - ###### The method used to attach the chicken has changed. - ###### Player with skill can see a model of your chicken.