Update markdown

This commit is contained in:
Juzlus 2026-08-22 04:06:54 +02:00
parent 427b8e6d93
commit 8c7445cc03
2 changed files with 174 additions and 10 deletions

92
.github/en.md vendored
View file

@ -42,8 +42,8 @@ Join the 3v3 test server and try out the jRandomSkills plugin:
- **Address**: `jRandomSkills@pukawka.pl` - **Address**: `jRandomSkills@pukawka.pl`
- **Password**: `public` - **Password**: `public`
- **Opening Hours**: `22:00-17:00 UTC` - **Opening Hours**: `22:00-17:00 UTC`
- **Connect URL**: `steam://connect/51.38.122.215:27215/public` - ~~**Connect URL**: `steam://connect/51.38.122.215:27215/public`~~
- **Connect**: `connect 51.38.122.215:27215; password 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). Buying a server on pukawka? Use my [referral code](https://pukawka.pl/pp,juzlus.html).
@ -338,9 +338,12 @@ All skills can be customized in the **`config.cfg`** / **`skillsInfo.json`** fil
}, },
"HtmlHudCustomisation": { // Settings for changing colours and font sizes "HtmlHudCustomisation": { // Settings for changing colours and font sizes
... // xxxl: 64px, xxl: 40px, xl: 32px // xxxl: 64px, xxl: 40px, xl: 32px
} // l: 24px, ml: 20px, m: 18px // l: 24px, ml: 20px, m: 18px
... // sm: 16px, s: 12px, xs: 8px ... // sm: 16px, s: 12px, xs: 8px
"WSADMenuVisibleItems": 3 // Number of visible rows
}
...
}, },
``` ```
@ -405,6 +408,85 @@ This plugin uses content from the following projects:
## 📋 Changelog ## 📋 Changelog
<details>
<summary><b>v1.2.3.b8</b></summary>
- #### Shared Systems
- **PlayerManager.FillSkillHolders** - Skill holders are now resolved from the player index instead of scanning every controller each tick, replacing the per-skill full player loop used by ten skills.
- **PlayerManager.GetControllerByPawn** - Added a tick-cached pawn-to-controller map, replacing the linear observer-target scan.
- **PlayerManager.IsServerIdle** - Added a tick-cached idle check shared by the debug and performance writers.
- **SkillUtils.IsFriendlyFireBlocked** - Now takes the skill, so the per-skill `FriendlyFire` key and server convars are resolved in one place. The convar-only overload remains for victim-side skills.
- **SkillUtils.TerminateRound** - Now accepts the player who ended the round and pays out the round-end money that the engine skips on plugin-terminated rounds.
- #### Performance
- **OnTick(hud)** - Average cost reduced by 17% compared to the previous build.
- **CheckTransmit** - Average cost reduced by 25%, with peak cost reduced by 39%.
- **OnTick(skills)** - Peak cost reduced by 62%.
- **Host stalls** - Real freezes measured with players connected dropped from six to two across 785 rounds.
- **DecoyRing** - Beam creation is now spread across four frames instead of spawning the entire ring in one tick.
- **Fourteen skills** - `OnTick` now returns immediately when the skill holds no state.
- **Berserker, BladeMaster, BunnyHop, DemonEye, Flash, PawelJumper, Pilot, Poison, QuickShot, RadarHack, Regeneration** - Switched to the shared skill-holder list; config reads were moved out of per-player loops.
- #### Fixes
- **GravityDecoy** - Restored a hardcoded gravity of 1.0 when leaving the field, permanently breaking Astronaut. Each pawn's own gravity scale is now captured and restored.
- **PsychicDefusing** - The bomb location remained unset when the skill was assigned after the plant, the stored position pointed into the entity and became invalid once the bomb was killed, and setup was silently skipped when the pawn was not ready.
- **PsychicDefusing, FragileBomb** - Winning teams received no money when the plugin ended the round. Winners are now paid from the matching `cash_*` convars, with the defuser bonus applied on top.
- **FriendlyFire** - `mp_autokick` is now restored to its default value after the round ends.
- **ToxicSmoke, HealingSmoke** - Smoke continued damaging and healing after its owner lost the skill, and expiry could leave behind smokes whose owner had already lost the skill. HealingSmoke also did not track an owner at all.
- **EmpGrenade** - Crosshair and radar stayed jammed forever because `OnTick` stops being dispatched once nobody holds the skill and the jam timer never expired.
- **ThrowingKnife** - Losing the skill while the knife was thrown destroyed it without returning one to the player.
- **OnlyHead, ReactiveArmor** - Both ignored fall and world damage, which has no player attacker.
- **Gambler** - Refreshing consumed the one-shot instead of rolling two new skills, and the refresh row lost its colour prefix to the text-direction wrapper.
- **Berserker, Flash** - The falling-speed clamp could trigger while noclipping.
- **ExplodingBarrel** - The prop spawned without a model and received it a frame later; the model is now passed through `CEntityKeyValues` at spawn.
- **FastReload** - Added a cooldown, five seconds by default, with a HUD countdown. The cooldown only starts when a magazine is actually refilled.
- **Config** - Missing-key migration now descends into nested sections, so keys under `HtmlHudCustomisation` are detected.
- #### Damage Hook
- **OnEntityTakeDamagePre / OnEntityTakeDamagePost** - Replaced the deprecated `CBaseEntity_TakeDamageOldFunc` hook across 27 files.
- **Teammate damage** - The new hook runs before the engine zeroes friendly fire, so attacker-side modifiers now require explicit guards. Added to OneShot, Cutter, Assassin, Soldier, Berserker, Nemesis and Punisher.
- **FriendlyFire** - Added a new per-skill key to twelve skills, defaulting to `true`. Setting it to `false` prevents teammates from being affected, as already supported by LongKnife and KillerFlash. This covers both damage amplifiers and explosives that previously only reduced teammate damage.
- #### Menu
- **WSADMenuVisibleItems** - Added a new setting replacing the hardcoded three visible menu rows. The value is clamped between one and ten.
- **WSAD menu** - The final menu row now keeps its `#RRGGBB` colour prefix instead of losing it to the text-direction wrapper.
- #### Config Migration
- **skillsInfo.json** - Missing keys are now written back to the file on load instead of only being defaulted in memory. Existing values are preserved.
- **playersLanguage.json** - Players are now grouped by language instead of using one row per player, reducing a ten-thousand-player file by 20%. Old files are converted on load and invalid SteamIDs are dropped.
- #### Debug
- **Perf samples** - Report `p50`, `p95` and `p99` alongside the average and maximum.
- **Per-skill sampling** - Every skill is now sampled instead of only logging calls that exceeded two milliseconds. The measurement was already running; only the reporting threshold discarded it.
- **Load context** - Aggregate lines now include player, alive, bot, active-skill and round counts, allowing sessions to be compared under different loads.
- **ENTITIES** - Tracked entities are now broken down by type.
- **STALL** - Lines now include the tick, tracked entity count and load context, helping distinguish map-load pauses from genuine freezes.
- **DMGHOOK** - Reports how often the attacker and ability resolve on the damage hook.
- **Idle server** - Nothing is written while the server is empty, apart from lifecycle lines and player connects/disconnects.
- #### Startup & Stability
- **Startup crash** - Fixed a crash on servers with `PerfMode` or `DebugMode` enabled during boot at the first skill. `PerfLog.Sample` called `IsServerIdle()` on every `SkillAction`, which scanned the player list while the server was still booting. This was a regression introduced with the idle-logging gate in b8.
- **PlayerManager** - Added a `serverActive` flag set on map start. `IsServerIdle`, `GetTickPlayers` and `GetTickBomb` no longer touch the game before the map is up.
- **Commands** - `zmienmape` and one Chinese alias were listed twice, causing the same command name to be registered natively two times. Cleaned up the defaults and added a duplicate guard to cover user configs as well.
- #### Chat
- **Skill announcement** - Teammate skills are now shown first and your own skill description last, keeping it at the bottom of the chat instead of allowing it to scroll away.
- **SetRandomSkill** - No longer leaves the chat box unclosed when the player has teammates.
- #### Debug Fixes
- **PerfLog** - `p50`, `p95` and `p99` previously returned the upper bound of the histogram bucket instead of a real sample, meaning they could report a value higher than `max`. This occurred in 74% of the windows during a 6.5-hour session (for example: `avg=0.06ms p99=8.00ms max=4.68ms`). Percentiles are now taken from the actual samples in the window. The bucket estimate is only used as a fallback when the buffer overflows, interpolated inside the bucket and clamped to `max`.
- **EntityManager** - An already-tracked entity could log a second `+` line, causing creates and destroys to stop matching and making the entity log look like a leak. Re-registering now logs `~ oldType -> newType` when the type changes and nothing when it does not.
- **Ghost, Ninja, C4Camouflage** - The hiding prop was registered twice, first as `prop_dynamic` and then as `empty_prop`. It is now tracked under the correct name from creation through the new `trackAs` parameter of `CreateTrackedDynamicProp`.
- #### Cleanup
- **Compiler warnings** - All twelve warnings have been resolved; the build is clean.
- **SkillUtils.SetPlayerCollisions** - Removed because its body started with an unconditional `return`.
- **Damage hook aliases** - Removed the unused `param` and `param2` locals left behind by the migration across 27 files.
**Full update contributed by [@ByDexterTR](https://github.com/ByDexterTR) in pull request [#53](https://github.com/Juzlus/jRandomSkills/pull/53). Thanks to ByDexterTR!**
</details>
<details> <details>
<summary><b>v1.2.3.b7</b></summary> <summary><b>v1.2.3.b7</b></summary>

92
.github/pl.md vendored
View file

@ -42,8 +42,8 @@ Dołącz do serwera testowego 3v3 i wypróbuj plugin jRandomSkills:
- **Adres**: `jRandomSkills@pukawka.pl` - **Adres**: `jRandomSkills@pukawka.pl`
- **Hasło**: `public` - **Hasło**: `public`
- **Godziny otwarcia**: `00:00-19:00` - **Godziny otwarcia**: `00:00-19:00`
- **Połącz URL**: `steam://connect/51.38.122.215:27215/public` - ~~**Połącz URL**: `steam://connect/51.38.122.215:27215/public`~~
- **Połącz**: `connect 51.38.122.215:27215; password 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). Kupujesz serwer na pukawce? Skorzystaj z mojego [kodu polecającego](https://pukawka.pl/pp,juzlus.html).
@ -338,9 +338,12 @@ Wszystkie sypermoce można dostosować w pliku **`config.cfg`** / **`skillsInfo.
}, },
"HtmlHudCustomisation": { // Ustawienia zmiany kolorów i rozmiarów czcionek "HtmlHudCustomisation": { // Ustawienia zmiany kolorów i rozmiarów czcionek
... // xxxl: 64px, xxl: 40px, xl: 32px // xxxl: 64px, xxl: 40px, xl: 32px
} // l: 24px, ml: 20px, m: 18px // l: 24px, ml: 20px, m: 18px
... // sm: 16px, s: 12px, xs: 8px ... // sm: 16px, s: 12px, xs: 8px
"WSADMenuVisibleItems": 3 // Liczba widocznych wierszy
}
...
}, },
``` ```
@ -405,6 +408,85 @@ Plugin korzysta z zawartości następujących projektów:
## 📋 Lista Zmian ## 📋 Lista Zmian
<details>
<summary><b>v1.2.3.b8</b></summary>
- #### Wspólne systemy
- **PlayerManager.FillSkillHolders** - Lista posiadaczy umiejętności jest teraz pobierana z indeksu graczy zamiast skanowania wszystkich kontrolerów w każdym ticku. Usuwa to pełną pętlę po graczach wykonywaną wcześniej przez dziesięć umiejętności.
- **PlayerManager.GetControllerByPawn** - Dodano cache mapujący pawn na kontroler, odświeżany raz na tick. Zastępuje to liniowe wyszukiwanie celu obserwatora.
- **PlayerManager.IsServerIdle** - Sprawdzanie bezczynności serwera jest teraz cachowane na tick i współdzielone przez logowanie debugowe oraz wydajnościowe.
- **SkillUtils.IsFriendlyFireBlocked** - Metoda przyjmuje teraz umiejętność, dzięki czemu klucz `FriendlyFire` dla konkretnej umiejętności oraz convary serwera są rozwiązywane w jednym miejscu. Przeciążenie działające wyłącznie na convarach pozostaje dla umiejętności działających po stronie ofiary.
- **SkillUtils.TerminateRound** - Metoda przyjmuje teraz gracza, który zakończył rundę, i wypłaca pieniądze za zakończenie rundy, których silnik nie przyznaje przy zakończeniu rundy przez plugin.
- #### Wydajność
- **OnTick(hud)** - Średni koszt zmniejszony o 17% względem poprzedniej wersji.
- **CheckTransmit** - Średni koszt zmniejszony o 25%, a maksymalny o 39%.
- **OnTick(skills)** - Maksymalny koszt zmniejszony o 62%.
- **Host stalls** - Liczba rzeczywistych zawieszeń serwera przy połączonych graczach spadła z sześciu do dwóch na przestrzeni 785 rund.
- **DecoyRing** - Tworzenie obręczy zostało rozłożone na cztery klatki zamiast generowania całego pierścienia w jednym ticku.
- **Czternaście umiejętności** - `OnTick` natychmiast kończy działanie, jeśli dana umiejętność nie posiada żadnego stanu.
- **Berserker, Mistrz Ostrza, Królik, Oko Demona, Flash, Pawel Jumper, Pilot, Trutka, Szybkostrzelność, Radarowiec, Regeneracja** - Przełączono na współdzieloną listę posiadaczy umiejętności, a odczyty konfiguracji przeniesiono poza pętle wykonywane dla każdego gracza.
- #### Poprawki
- **Grawitacyjny Wabik** - Usunięto przywracanie grawitacji do sztywnej wartości `1.0` po opuszczeniu pola, które permanentnie psuło **Astronautę**. Teraz zapisywana i przywracana jest własna wartość grawitacji każdego pawna.
- **PsychicDefusing** - Po przydzieleniu umiejętności po podłożeniu bomby jej pozycja pozostawała nieustawiona. Zapamiętana pozycja wskazywała również bezpośrednio na encję bomby i stawała się nieprawidłowa po jej usunięciu. Naprawiono także pomijanie konfiguracji, gdy pawn nie był jeszcze gotowy.
- **PsychicDefusing, Krucha Bomba** - Zwycięskie drużyny nie otrzymywały pieniędzy, gdy plugin kończył rundę. Zwycięzcy otrzymują teraz wypłatę zgodną z odpowiednimi convarami `cash_*`, a bonus za rozbrojenie jest dodawany osobno.
- **Ogień Przyjacielski** - Po zakończeniu rundy `mp_autokick` jest teraz przywracane do swojej domyślnej wartości.
- **Toksyczny Dym, Leczący Dym** - Dym nadal zadawał obrażenia lub leczył po utracie umiejętności przez właściciela. Po wygaśnięciu mogły również pozostawać dymy, których właściciel nie posiadał już danej umiejętności. **Leczący Dym** nie śledził wcześniej właściciela w ogóle.
- **Granat EMP** - Celownik i radar pozostawały zablokowane na zawsze, ponieważ `OnTick` przestaje być wywoływany, gdy nikt nie posiada umiejętności, a timer blokady nie wygasał.
- **Nóż do Rzucania** - Utrata umiejętności po wyrzuceniu noża niszczyła nóż bez zwracania go graczowi.
- **Tylko Głowa, Pancerz Reaktywny** - Obie umiejętności ignorowały obrażenia od upadku i obrażenia ze świata, które nie posiadają atakującego gracza.
- **Hazardzista** - Odświeżenie zużywało jednorazową możliwość zamiast losować dwie nowe umiejętności. Wiersz odświeżania tracił również prefiks koloru przez wrapper kierunku tekstu.
- **Berserker, Flash** - Ograniczenie prędkości spadania mogło działać podczas noclipu.
- **Wybuchowa Beczka** - Beczka pojawiała się początkowo bez modelu, który był dodawany dopiero klatkę później. Model jest teraz przekazywany przez `CEntityKeyValues` już podczas tworzenia encji.
- **Szybkie Rączki** - Dodano cooldown, domyślnie pięć sekund, wraz z licznikiem na HUD. Cooldown rozpoczyna się dopiero wtedy, gdy magazynek faktycznie zostanie przeładowany.
- **Konfiguracja** - Migracja brakujących kluczy schodzi teraz również do zagnieżdżonych sekcji, dzięki czemu wykrywane są m.in. klucze znajdujące się w `HtmlHudCustomisation`.
- #### Hook obrażeń
- **OnEntityTakeDamagePre / OnEntityTakeDamagePost** - Zastąpiono przestarzały hook `CBaseEntity_TakeDamageOldFunc` w 27 plikach.
- **Obrażenia od sojuszników** - Nowy hook wykonuje się przed wyzerowaniem obrażeń drużynowych przez silnik, dlatego modyfikatory po stronie atakującego wymagają teraz jawnych zabezpieczeń. Dodano je do: **Jednostrzałowca, Cuttera, Skrytobójcy, Żołnierza, Berserkera, Nemezisa i Karającego**.
- **FriendlyFire** - Dodano nowy klucz `FriendlyFire` do dwunastu umiejętności. Domyślnie ma wartość `true`. Ustawienie `false` powoduje, że umiejętność nie wpływa na członków własnej drużyny, tak jak wcześniej działało to w **Długim Nożu** i **Zabójczym Flashu**. Obejmuje to zarówno modyfikatory obrażeń, jak i materiały wybuchowe, które wcześniej jedynie zmniejszały obrażenia zadawane sojusznikom.
- #### Menu
- **WSADMenuVisibleItems** - Dodano nowe ustawienie zastępujące sztywną liczbę trzech widocznych wierszy menu. Wartość jest ograniczana do zakresu od 1 do 10.
- **Menu WSAD** - Ostatni wiersz menu zachowuje teraz prefiks koloru `#RRGGBB` zamiast tracić go przez wrapper kierunku tekstu.
- #### Migracja konfiguracji
- **skillsInfo.json** - Brakujące klucze są teraz zapisywane do pliku podczas jego ładowania zamiast być jedynie ustawiane domyślnie w pamięci. Istniejące wartości pozostają bez zmian.
- **playersLanguage.json** - Gracze są teraz grupowani według języka zamiast posiadania osobnego wiersza dla każdego gracza. Zmniejsza to plik dla 10 000 graczy o około 20%. Stare pliki są konwertowane przy ładowaniu, a nieprawidłowe SteamID są usuwane.
- #### Debug
- **Próbki wydajności** - Oprócz średniej i maksimum raportowane są teraz `p50`, `p95` oraz `p99`.
- **Próbkowanie umiejętności** - Każda umiejętność jest teraz próbkowana, zamiast logowania wyłącznie wywołań przekraczających dwie milisekundy. Pomiar był wykonywany wcześniej, ale raportowanie odrzucało wyniki poniżej tego progu.
- **Kontekst obciążenia** - Linie agregujące zawierają teraz liczbę graczy, żywych graczy, botów, aktywnych umiejętności oraz rund, dzięki czemu sesje można porównywać przy różnych poziomach obciążenia.
- **ENTITIES** - Śledzone encje są teraz rozbijane według typu.
- **STALL** - Linie zawierają tick, liczbę śledzonych encji oraz kontekst obciążenia, co ułatwia odróżnienie pauz podczas ładowania mapy od rzeczywistych zawieszeń.
- **DMGHOOK** - Raportuje, jak często na hooku obrażeń poprawnie rozpoznawany jest atakujący oraz umiejętność.
- **Bezczynny serwer** - Gdy serwer jest pusty, nic nie jest zapisywane poza liniami cyklu życia oraz informacjami o dołączaniu i rozłączaniu graczy.
- #### Stabilność i start serwera
- **Crash podczas startu** - Naprawiono crash serwera z włączonym `PerfMode` lub `DebugMode`, który występował przy pierwszej umiejętności podczas uruchamiania. `PerfLog.Sample` wywoływał `IsServerIdle()` przy każdym `SkillAction`, a metoda próbowała skanować listę graczy, zanim serwer był jeszcze gotowy. Była to regresja wprowadzona wraz z blokadą logowania dla bezczynnego serwera w b8.
- **PlayerManager** - Dodano flagę `serverActive` ustawianą podczas rozpoczęcia mapy. `IsServerIdle`, `GetTickPlayers` oraz `GetTickBomb` nie odwołują się już do gry przed uruchomieniem mapy.
- **Komendy** - `zmienmape` oraz jeden chiński alias znajdowały się na liście dwukrotnie, co powodowało dwukrotną natywną rejestrację tej samej nazwy komendy. Usunięto duplikaty z wartości domyślnych oraz dodano zabezpieczenie przed duplikatami również w konfiguracjach użytkowników.
- #### Czat
- **Ogłoszenie umiejętności** - Umiejętności członków drużyny są teraz wyświetlane jako pierwsze, a opis własnej umiejętności jako ostatni, dzięki czemu pozostaje na dole czatu i nie jest od razu wypychany przez kolejne wiadomości.
- **SetRandomSkill** - Nie pozostawia już otwartego pola czatu, gdy gracz posiada członków drużyny.
- #### Poprawki debugowania
- **PerfLog** - `p50`, `p95` i `p99` zwracały wcześniej górną granicę przedziału histogramu zamiast rzeczywistej próbki. Mogło to powodować raportowanie wartości wyższej niż `max`. Problem występował w 74% okien podczas 6,5-godzinnej sesji, np. `avg=0.06ms p99=8.00ms max=4.68ms`. Percentyle są teraz obliczane na podstawie rzeczywistych próbek z danego okna. Szacowanie na podstawie histogramu jest używane tylko jako awaryjne rozwiązanie w przypadku przepełnienia bufora, z interpolacją wewnątrz przedziału i ograniczeniem wyniku do `max`.
- **EntityManager** - Już śledzona encja mogła otrzymać drugi wpis `+`, przez co liczba utworzeń i usunięć przestawała się zgadzać, a log encji wyglądał jak wyciek pamięci. Ponowna rejestracja loguje teraz `~ oldType -> newType`, jeśli typ encji się zmienił, i nic nie loguje, jeśli pozostał taki sam.
- **Duszek, Ninja, C4 Kamuflaż** - Ukrywająca encja była rejestrowana dwukrotnie, najpierw jako `prop_dynamic`, a następnie jako `empty_prop`. Teraz jest śledzona pod prawidłową nazwą od momentu utworzenia dzięki nowemu parametrowi `trackAs` w `CreateTrackedDynamicProp`.
- #### Czyszczenie kodu
- **Ostrzeżenia kompilatora** - Wszystkie dwanaście ostrzeżeń zostało usuniętych. Build jest czysty.
- **SkillUtils.SetPlayerCollisions** - Usunięto, ponieważ metoda zaczynała się od bezwarunkowego `return`.
- **Aliasy hooka obrażeń** - Usunięto nieużywane lokalne zmienne `param` i `param2`, które pozostały po migracji w 27 plikach.
**Pełna aktualizacja została przygotowana przez [@ByDexterTR](https://github.com/ByDexterTR) w ramach pull requesta [#53](https://github.com/Juzlus/jRandomSkills/pull/53). Dziękujemy ByDexterTR!**
</details>
<details> <details>
<summary><b>v1.2.3.b7</b></summary> <summary><b>v1.2.3.b7</b></summary>