jRandomSkills/jRandomSkills - SRC Files/src/utils/KillfeedIcons.cs
ByDexter b2d2c5bf9a 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.
2026-08-09 00:37:02 +03:00

313 lines
11 KiB
C#

using CounterStrikeSharp.API.Core;
using src.utils;
namespace jRandomSkills.src.utils
{
public enum KillfeedIcons
{
// Pistols
Deagle,
Elite,
FiveSeven,
Glock,
Hkp2000,
P2000,
P250,
Tec9,
Cz75a,
Revolver,
UspSilencer,
UspSilencerOff,
// Assault Rifles
Ak47,
Aug,
Famas,
Galilar,
M4A4,
M4A1,
M4A1_off,
Sg556,
// Sniper Rifles
AWP,
G3SG1,
Scar20,
Ssg,
// Machine Guns
M249,
Negev,
// Submachine Guns
Bizon,
Mac10,
Mp5,
Mp7,
Mp9,
P90,
Ump45,
// Shotguns
Mag7,
Nova,
Sawedoff,
Xm1014,
// Knives
Bayonet,
Knife,
KnifeBowie,
KnifeButterfly,
KnifeCanis,
KnifeCord,
KnifeCss,
KnifeFalchion,
KnifeFlip,
KnifeGut,
KnifeGypsyJackknife,
KnifeKarambit,
KnifeKukri,
KnifeM9Bayonet,
KnifeOutdoor,
KnifePush,
KnifeSkeleton,
KnifeStiletto,
KnifeSurvivalBowie,
KnifeT,
KnifeTactical,
KnifeTwinblade,
KnifeUrsus,
KnifeWidowmaker,
Knifegg,
// Grenades and Explosives
C4,
Decoy,
Flashbang,
FlashbangAssist,
Grenadepack,
Grenadepack2,
Hegrenade,
Incgrenade,
Fire,
Molotov,
Smokegrenade,
// Equipment and Armor
Armor,
ArmorHelmet,
Assaultsuit,
AssaultsuitHelmetOnly,
Defuser,
HeavyArmor,
Helmet,
Taser,
Healthshot,
Ammobox,
AmmoboxThreepack,
// Environmental and Other Damage
Disconnect,
Sentry,
MeleeKnife,
Fist,
Explosion,
Leg,
// Cosmetics and Effects
ClothingHands,
Player,
Medal,
Spray
}
public static class KillfeedIconsExtensions
{
public static string? ToIcon(this KillfeedIcons icon)
{
return icon switch
{
// Pistols
KillfeedIcons.Deagle => "deagle",
KillfeedIcons.Elite => "elite",
KillfeedIcons.FiveSeven => "fiveseven",
KillfeedIcons.Glock => "glock",
KillfeedIcons.Hkp2000 => "hkp2000",
KillfeedIcons.P2000 => "p2000",
KillfeedIcons.P250 => "p250",
KillfeedIcons.Tec9 => "tec9",
KillfeedIcons.Cz75a => "cz75a",
KillfeedIcons.Revolver => "revolver",
KillfeedIcons.UspSilencer => "usp_silencer",
KillfeedIcons.UspSilencerOff => "usp_silencer_off",
// Assault Rifles
KillfeedIcons.Ak47 => "ak47",
KillfeedIcons.Aug => "aug",
KillfeedIcons.Famas => "famas",
KillfeedIcons.Galilar => "galilar",
KillfeedIcons.M4A4 => "m4a1",
KillfeedIcons.M4A1 => "m4a1_silencer",
KillfeedIcons.M4A1_off => "m4a1_silencer_off",
KillfeedIcons.Sg556 => "sg556",
// Sniper Rifles
KillfeedIcons.AWP => "awp",
KillfeedIcons.G3SG1 => "g3sg1",
KillfeedIcons.Scar20 => "scar20",
KillfeedIcons.Ssg => "ssg08",
// Machine Guns
KillfeedIcons.M249 => "m249",
KillfeedIcons.Negev => "negev",
// Submachine Guns
KillfeedIcons.Bizon => "bizon",
KillfeedIcons.Mac10 => "mac10",
KillfeedIcons.Mp5 => "mp5sd",
KillfeedIcons.Mp7 => "mp7",
KillfeedIcons.Mp9 => "mp9",
KillfeedIcons.P90 => "p90",
KillfeedIcons.Ump45 => "ump45",
// Shotguns
KillfeedIcons.Mag7 => "mag7",
KillfeedIcons.Nova => "nova",
KillfeedIcons.Sawedoff => "sawedoff",
KillfeedIcons.Xm1014 => "xm1014",
// Knives
KillfeedIcons.Bayonet => "bayonet",
KillfeedIcons.Knife => "knife",
KillfeedIcons.KnifeBowie => "knife_bowie",
KillfeedIcons.KnifeButterfly => "knife_butterfly",
KillfeedIcons.KnifeCanis => "knife_canis",
KillfeedIcons.KnifeCord => "knife_cord",
KillfeedIcons.KnifeCss => "knife_css",
KillfeedIcons.KnifeFalchion => "knife_falchion",
KillfeedIcons.KnifeFlip => "knife_flip",
KillfeedIcons.KnifeGut => "knife_gut",
KillfeedIcons.KnifeGypsyJackknife => "knife_gypsy_jackknife",
KillfeedIcons.KnifeKarambit => "knife_karambit",
KillfeedIcons.KnifeKukri => "knife_kukri",
KillfeedIcons.KnifeM9Bayonet => "knife_m9_bayonet",
KillfeedIcons.KnifeOutdoor => "knife_outdoor",
KillfeedIcons.KnifePush => "knife_push",
KillfeedIcons.KnifeSkeleton => "knife_skeleton",
KillfeedIcons.KnifeStiletto => "knife_stiletto",
KillfeedIcons.KnifeSurvivalBowie => "knife_survival_bowie",
KillfeedIcons.KnifeT => "knife_t",
KillfeedIcons.KnifeTactical => "knife_tactical",
KillfeedIcons.KnifeTwinblade => "knife_twinblade",
KillfeedIcons.KnifeUrsus => "knife_ursus",
KillfeedIcons.KnifeWidowmaker => "knife_widowmaker",
KillfeedIcons.Knifegg => "knifegg",
// Grenades and Explosives
KillfeedIcons.C4 => "c4",
KillfeedIcons.Decoy => "decoy",
KillfeedIcons.Flashbang => "flashbang",
KillfeedIcons.FlashbangAssist => "flashbang_assist",
KillfeedIcons.Grenadepack => "grenadepack",
KillfeedIcons.Grenadepack2 => "grenadepack2",
KillfeedIcons.Hegrenade => "hegrenade",
KillfeedIcons.Incgrenade => "incgrenade",
KillfeedIcons.Fire => "inferno",
KillfeedIcons.Molotov => "molotov",
KillfeedIcons.Smokegrenade => "smokegrenade",
// Equipment and Armor
KillfeedIcons.Armor => "armor",
KillfeedIcons.ArmorHelmet => "armor_helmet",
KillfeedIcons.Assaultsuit => "assaultsuit",
KillfeedIcons.AssaultsuitHelmetOnly => "assaultsuit_helmet_only",
KillfeedIcons.Defuser => "defuser",
KillfeedIcons.HeavyArmor => "heavy_armor",
KillfeedIcons.Helmet => "helmet",
KillfeedIcons.Taser => "taser",
KillfeedIcons.Healthshot => "healthshot",
KillfeedIcons.Ammobox => "ammobox",
KillfeedIcons.AmmoboxThreepack => "ammobox_threepack",
// Environmental and Other Damage
KillfeedIcons.Disconnect => "disconnect",
KillfeedIcons.Sentry => "dronegun",
KillfeedIcons.MeleeKnife => "melee",
KillfeedIcons.Fist => "movelinear",
KillfeedIcons.Explosion => "prop_exploding_barrel",
KillfeedIcons.Leg => "stomp_damage",
// Cosmetics and Effects
KillfeedIcons.ClothingHands => "clothing_hands",
KillfeedIcons.Player => "customplayer",
KillfeedIcons.Medal => "flair0",
KillfeedIcons.Spray => "spray0",
_ => throw new ArgumentOutOfRangeException(nameof(icon), icon, null)
};
}
public static KillfeedIcons? FromWeapon(CBasePlayerWeapon? weapon)
{
string weaponName = SkillUtils.GetDesignerName(weapon);
return FromWeaponName(weaponName);
}
public static KillfeedIcons? FromWeaponName(string? weaponName)
{
if (string.IsNullOrWhiteSpace(weaponName))
return null;
return weaponName.ToLowerInvariant() switch
{
"weapon_deagle" => KillfeedIcons.Deagle,
"weapon_revolver" => KillfeedIcons.Revolver,
"weapon_glock" => KillfeedIcons.Glock,
"weapon_usp_silencer" => KillfeedIcons.UspSilencer,
"weapon_cz75a" => KillfeedIcons.Cz75a,
"weapon_fiveseven" => KillfeedIcons.FiveSeven,
"weapon_p250" => KillfeedIcons.P250,
"weapon_tec9" => KillfeedIcons.Tec9,
"weapon_elite" => KillfeedIcons.Elite,
"weapon_hkp2000" => KillfeedIcons.Hkp2000,
"weapon_mp9" => KillfeedIcons.Mp9,
"weapon_mac10" => KillfeedIcons.Mac10,
"weapon_bizon" => KillfeedIcons.Bizon,
"weapon_mp7" => KillfeedIcons.Mp7,
"weapon_ump45" => KillfeedIcons.Ump45,
"weapon_p90" => KillfeedIcons.P90,
"weapon_mp5sd" => KillfeedIcons.Mp5,
"weapon_sg556" => KillfeedIcons.Sg556,
"weapon_famas" => KillfeedIcons.Famas,
"weapon_galilar" => KillfeedIcons.Galilar,
"weapon_m4a1" => KillfeedIcons.M4A4,
"weapon_m4a1_silencer" => KillfeedIcons.M4A1,
"weapon_ak47" => KillfeedIcons.Ak47,
"weapon_aug" => KillfeedIcons.Aug,
"weapon_ssg08" => KillfeedIcons.Ssg,
"weapon_awp" => KillfeedIcons.AWP,
"weapon_scar20" => KillfeedIcons.Scar20,
"weapon_g3sg1" => KillfeedIcons.G3SG1,
"weapon_nova" => KillfeedIcons.Nova,
"weapon_xm1014" => KillfeedIcons.Xm1014,
"weapon_mag7" => KillfeedIcons.Mag7,
"weapon_sawedoff" => KillfeedIcons.Sawedoff,
"weapon_m249" => KillfeedIcons.M249,
"weapon_negev" => KillfeedIcons.Negev,
"weapon_taser" => KillfeedIcons.Taser,
"weapon_molotov" => KillfeedIcons.Molotov,
"weapon_incgrenade" => KillfeedIcons.Incgrenade,
"weapon_flashbang" => KillfeedIcons.Flashbang,
"weapon_smokegrenade" => KillfeedIcons.Smokegrenade,
"weapon_decoy" => KillfeedIcons.Decoy,
"weapon_hegrenade" => KillfeedIcons.Hegrenade,
"weapon_knife" => KillfeedIcons.Knife,
"weapon_bayonet" => KillfeedIcons.Bayonet,
"weapon_c4" => KillfeedIcons.C4,
_ => null
};
}
}
}