v1.2.3.b6

New skills (9)
- Bounty: put a cash price on an enemy's head, the killer collects it.
- EmpGrenade: grenade victims lose radar and crosshair for a while.
- GravityDecoy: the decoy alters gravity for everyone in its radius.
- Heavyweight: immune to push and slow effects from other skills.
- Nemesis: the marked player takes extra damage from everyone.
- Punisher: banks part of the damage you take and releases it on your next hit.
- Rewind: drop a marker and teleport back to it shortly after.
- TrueArmor: armor absorbs part of incoming damage instead of health.
- Voodoo: the marked enemy shares the damage you take.

Shared systems
- DecoyRing: reusable ground ring so decoy skills show their real area of effect. Adopted by FireRain, FrozenDecoy, GravityDecoy and MagneticDecoy.
- WeaponPool: single cached weapon classification (rifle/pistol/grenade) with a normalizing lookup, backed by the new config Weapons section. Replaces the duplicated hardcoded arrays in Assassin, Chicken, Ghost, NoNades, PrimaryBan, RandomWeapon, SniperElite and WeaponsSwap. [because of compatibility with WeaponRestrict]
- HUD suppression registry in SkillUtils: crosshair and radar hiding is now refcounted per owner, so overlapping skills (Glitch, Jammer, EmpGrenade) cannot restore each other's state early.
- SkillUtils.ResolveHiddenPawns: shared invisible-pawn resolution for C4Camouflage, Ghost and Ninja.
- Config gained a Weapons section with automatic migration for existing installs, plus a per-skill DisableOnPistolRound switch honoured by both the round draw and css_setskill.

Sound
- Volume rebalance
- Add SkillUtils.EmitSoundToPlayer with a private RecipientFilter. A null filter had been broadcasting every skill sound to all clients. Migrated 16 call sites: Poison, DemonEye, ToxicSmoke, CarefulBullets, Thorns, HotBomb, LastGasp, LongKnife, Nightmare, Jester, Tripwire, Medic, HealingSmoke, Rewind, Watchmaker.
- New effects: LongKnife knife-hit feedback (Weapon_Knife.Hit.Heavy/Light), Grapple hook impact, Fortnite barricade placement, Ricochet bounce, Nightmare cursed tone, Replicator/Illusionist spawn, PsychicDefusing defuse cue, TakeAmmo pickup, Tripwire and Jammer trigger tones.
- 29 skills gained a configurable SoundVolume, LongKnife also HitSoundVolume.
- Grapple: emit the hook impact at the hook entity instead of at the owner so the enemy team can locate it.
- PawelJumper: the engine already plays the first jump, only extra jumps emit.

Models and visuals
- Grapple: real hook model with configurable hookScale and hookEmbed so the hook sits in the surface it hit.
- Pilot: glowing exhaust trail parented to the pawn, active only while airborne.

Performance
- SkillsInfo.GetValue now resolves through a ConcurrentDictionary cache instead of reflecting on every call; invalidated on config reload.
- HUD render cache keyed on player, config, description flag and the three source lines; identical frames skip the rebuild.
- Glaz.CheckTransmit: hoist smoke index resolution out of the per-viewer loop and build the pawn-owner map lazily.
- playersSkills switched from ConcurrentBag to HashSet<Skills>, turning the NoRepeat filter from an O(n) scan into a set lookup.

Fixes
- NoRepeat could hand a player two or three skills in one round because the history bag was never deduplicated; the HashSet rewrite closes it.
- SniperElite: restore the saved weapon after the halftime team swap instead of dropping it on the pistol round.
- Illiterate: the holder alert now reaches chat and is exempt from its own scrambler via PrintToChat(ignoreIlliterate).
- EntityManager.DestroyBeam: zero out width and render colour before the kill so beams cannot linger visibly, with a next-frame Remove fallback.
- Ricochet: drop all 18 diagnostic Trace calls and the Trace helper; the skill measured stable over 48h and the tracing dominated the debug log.

Debug
- Tag round start, round end and freeze-time-end lines with [WARMUP] so warmup load is separable from live rounds.
This commit is contained in:
ByDexter 2026-08-09 00:37:02 +03:00
parent 615c55b2da
commit b2d2c5bf9a
93 changed files with 3414 additions and 329 deletions

View file

@ -60,6 +60,13 @@
"blastshot": "Mocne Uderzenie",
"blastshot_desc": "Naciśnij Attack2 na MP5, aby wystrzelić granat HE",
"bounty": "Nagroda",
"bounty_desc": "Wyznacz nagrodę za głowę wroga; kto go zabije, dostaje pieniądze",
"bounty_select_info": "Wybierz gracza:",
"bounty_player_info": "Wyznaczyłeś nagrodę {1}$ za '{0}'.",
"bounty_enemy_info": "Za twoją głowę wyznaczono {0}$.",
"bounty_claimed_info": "Zabiłeś '{0}' i zgarnąłeś {1}$.",
"bunnyhop": "Królik",
"bunnyhop_desc": "Otrzymujesz auto \"BunnyHopa\"",
@ -144,6 +151,10 @@
"dwarf_desc": "Losowa wielkość postaci na początku rundy",
"dwarf_desc2": "Twój mnożnik wielkości to {0}x",
"empgrenade": "Granat EMP",
"empgrenade_desc": "Kto oberwie twoim granatem, na chwilę traci radar i celownik",
"empgrenade_enemy_info": "Granat EMP wyłączył twój radar i celownik.",
"enemyspawn": "Resp Wroga",
"enemyspawn_desc": "Kliknij [css_useSkill], aby teleportować się na resp wroga",
@ -230,6 +241,9 @@
"grapple_no_anchor_info": "Brak powierzchni do zaczepienia haka.",
"grapple_pulling_info": "PRZYCIĄGANIE",
"gravitydecoy": "Grawitacyjna wabik",
"gravitydecoy_desc": "Twój wabik zmienia grawitację wszystkich w pobliżu",
"grenadier": "Granatnik",
"grenadier_desc": "Masz nieskończone granaty odłamkowe",
@ -239,6 +253,9 @@
"healingchicken": "Lecząca Kura",
"healingchicken_desc": "Twoje kury leczą Cię, gdy jesteś w pobliżu",
"heavyweight": "Waga ciężka",
"heavyweight_desc": "Umiejętności, które cię popychają lub spowalniają, nie działają na ciebie",
"hermit": "Pustelnik",
"hermit_desc": "Zabijanie przywraca amunicję i część zdrowia",
@ -360,6 +377,12 @@
"moneyswap_player_info": "Wymieniłeś swoje pieniądze z graczem '{0}'.",
"moneyswap_select_info": "Zamień się kasą z graczem:",
"nemesis": "Nemezis",
"nemesis_desc": "Oznaczony gracz otrzymuje dodatkowe obrażenia",
"nemesis_select_info": "Wybierz gracza:",
"nemesis_player_info": "Oznaczyłeś '{0}'.",
"nemesis_enemy_info": "Zostałeś oznaczony jako nemezis, teraz otrzymujesz dodatkowe obrażenia od wszystkich.",
"nightmare": "Koszmar",
"nightmare_desc": "Wywołaj u wybranego przeciwnika przerażającą wizję",
"nightmare_disable_info": "Koszmar minął.",
@ -423,6 +446,10 @@
"prosthesis": "Proteza",
"prosthesis_desc": "Ramiona i nogi są kuloodporne",
"punisher": "Karzyciel",
"punisher_desc": "Gromadzisz część otrzymanych obrażeń i dodajesz je do następnego trafienia",
"punisher_released_info": "Zadałeś {0} dodatkowych obrażeń i odzyskałeś tyle samo życia.",
"push": "Odpychacz",
"push_desc": "Masz losową szansę na odepchnięcie wroga po trafieniu go",
"push_desc2": "Twoje szanse na odepchnięcie wroga to: {0}%",
@ -460,6 +487,10 @@
"returntosender": "Zwrot do Nadawcy",
"returntosender_desc": "Pierwsze trafienie wroga powoduje, że wraca on na swój resp",
"rewind": "Przewijanie",
"rewind_desc": "Naciśnij [css_useSkill], aby zostawić znacznik i wkrótce do niego wrócić",
"rewind_pending_info": "POWRÓT: {0}",
"richboy": "Bogacz",
"richboy_desc": "Na początku rundy otrzymujesz losową kwotę gotówki",
@ -549,6 +580,14 @@
"tripwire_placed_info": "Linka została rozstawiona.",
"tripwire_triggered_info": "'{0}' uruchomił Twoją linkę.",
"truearmor": "Prawdziwy pancerz",
"truearmor_desc": "Część obrażeń pokrywa twój pancerz zamiast zdrowia",
"voodoo": "Voodoo",
"voodoo_desc": "Oznaczony wróg również otrzymuje część obrażeń, które ty dostajesz",
"voodoo_select_info": "Wybierz gracza:",
"voodoo_player_info": "Związałeś '{0}' swoim voodoo.",
"wallhack": "Wallhack",
"wallhack_desc": "Widzisz wrogów przez ściany",