Phase Two · Companion Plugin
Killstreak Announcer v1.1.0
An Unreal-Tournament / Quake-style killstreak announcer for Easy Red 2. Every kill, multi-kill, spree, headshot, capture, lead change and match result fires a punchy voice callout pulled at random from a library of 701 announcer clips across 50 event categories, so it never feels repetitive. Pure flavor, zero gameplay changes — it only listens to the game and plays sounds, through hooks verified against the v2.0.6 decompile, so callouts fire exactly when the matching thing actually happens to you — not your squadmates, not the enemy.
New in v1.1.0 — a much bigger sound library
- 701 clips across 50 event categories, up from 317 across 48 — every event
has more variety, from extra
double_killtakes to multipleYou_have_won_the_matchreads. - Vehicle kills get their own announcement. Destroy a vehicle (and its crew)
and you get a dedicated road/vehicle callout — Road Kill, Road Rampage, Vehicular
Manslaughter, Pancake, Top Gun and more — in addition to the crew counting toward
your multi-kills and sprees. Uses the existing
EnableVehicleKillstoggle. - A 4-minute match-clock warning joins the existing 5/3/2/1-minute and
30/20-second warnings (optional clock, still off by default; existing
EnableTimeWarningstoggle). - The impressive UT reward medals — Goliath, Iron Guard, Iron Skull, Juggernauts, Hellions, ThunderCrash, FireStorm, Sun Blade, Vampire, Eagle Eye, DareDevil, Rage, Ownage, Whirlwind, Retribution… — are folded into the top multi-kill and spree tiers as epic-moment variety.
- Curated on purpose: the source packs contain plenty of audio with no
matching Easy Red 2 event (UT map mission briefings, Assault objective scripts, CTF flag
chatter, medal description voice-overs). Those would only be dead files, so this download
contains only the 701 files the mod actually uses — the in-game log reports
0 unmapped. - Nothing changed in the control surface: no new config keys, same plugin
GUID — an existing config still applies. If you keep an older, larger
KSoundsfolder around, that's fine too: unmapped files are simply ignored.
Requirements: Easy Red 2 v2.0.6 (the build this was
reversed against) with all DLC, and BepInEx 6 (IL2CPP, x64) already installed
and run once — a BepInEx folder must already exist in your game root.
This mod does not include BepInEx; if you don't have it yet, do the
loader install first.
Install
Field Order 01
Know the two destinations
The archive holds the plugin, the voice library, and the README:
EasyRed2-KillstreakAnnouncer-v1_1_0.rar
|- EasyRed2.KillstreakAnnouncer.dll <- the mod (59 KB)
|- KSounds\ <- the voice library: 701 WAVs
| |- Sounds1\ ... Sounds11\
'- README.txt <- full event + settings reference
Two things must be true after installing:
EasyRed2.KillstreakAnnouncer.dllis insideEasy Red 2\BepInEx\plugins\— directly, or in a subfolder likeStixsworldHD-KillstreakAnnouncer\\; both work.The
KSoundsfolder lives in the game root, right next to theBepInExfolder — not inside it. This is where the mod looks for its voice clips.
Easy Red 2\
|- Easy Red 2.exe
|- BepInEx\
| '- plugins\
| '- EasyRed2.KillstreakAnnouncer.dll
'- KSounds\ <- NEXT TO BepInEx, not inside it
|- Sounds1\
|- Sounds2\
'- ...
Field Order 02
Launch and verify
Start the game and check BepInEx\LogOutput.log (or the console). A healthy
load shows the mod's banner and the index line:
EasyRed2 Killstreak Announcer v1.1.0 <- the banner
Indexed 701 sound files across 50 event categories (0 unmapped)
Then go earn one: your first enemy kill of a battle calls First Blood.
Field Order 03
Tune it — in the .cfg, on purpose
There is no in-game menu and no console commands by design — the config file is the whole control surface:
Easy Red 2\BepInEx\config\com.stixsworldhd.easyred2.killstreakannouncer.cfg
It's plain text: edit with Notepad while the game is closed, then relaunch. Every entry carries a built-in description, its default, and an allowed min/max; a pre-filled copy generates on first launch, and deleting the file regenerates factory defaults. Highlights:
01 - General → MasterVolume(0–1, default 0.85) andMasterEnabled, the master mute.02 - Multi-Kills → MultiKillWindowSeconds(1–10) — how forgiving multi-kill chains are; bigger = easier chains.03 - Sprees → KillingSpreeAt … BerzerkAt— the kill counts for each spree tier; keep them in increasing order.04 - Headshots → HeadshotCooldownSeconds— throttle so a headshot streak doesn't spam the line.13 - Match Clock— off by default. Easy Red 2 doesn't expose a universal match timer, so this is best-effort: you tell it your match/phase length in seconds and it fires time warnings plus a final countdown from time-elapsed. Turn it on only for timed modes where you know the length.- Every category has its own
Enable…toggle — keep multi-kills and victory lines, silence lead changes and adrenaline, or any mix.
What triggers what
The mod reacts to real in-game events for the locally controlled player. When several things happen at once, a small priority queue plays the big moment first (a Monster Kill beats lead chatter) and drops minor lines rather than overlapping them.
| You do this in-game | You hear |
|---|---|
| First enemy kill of the battle | First Blood |
| 2–9+ kills in quick succession | Double → Triple → Mega → Ultra → Monster → Ludicrous → Wicked Sick → Holy Shit |
| Kill milestones without dying | Killing Spree → Rampage → Dominating → Unstoppable → GodLike → Berzerk |
| Lethal helmet headshot | Headshot (and Headhunter every N headshots) |
| Grenade / explosive kill streaks | Explosive spree (Flak Monkey / Combo) |
| Kill while sprinting | Adrenaline / Speed (rare, on a cooldown) |
| Kill while injured / low HP | Clutch / Last Man Standing |
| Destroy a vehicle + its crew (new) | Road Kill, Road Rampage, Pancake… — crew also feeds your multi-kills & sprees |
| Capture an objective / collect a dog tag / revive | Capture / Nice Catch / Assist |
| Your faction takes or loses the lead | Taking the Lead / Lost the Lead |
| Die repeatedly with no kills | Losing Badly |
| Battle starts / ends | Prepare / Begin · Victory (Flawless Victory if you never died) · Defeat |
| (optional) Match-clock warnings | 5/4/3/2/1-min, 30/20-sec, final 10…1 countdown |
The bundled README lists the complete sound-to-event mapping — all 50 categories with per-event clip counts and representative file names, from 12 First Blood takes to 80 countdown clips.
Performance & behavior
- Callouts play through a dedicated 2D audio source — straight to your ears, not positioned in the world — that ignores the listener pause, so they play cleanly.
- Each clip is decoded on first use and then cached — no upfront cost. Prefer
paying it all at battle start (and never risking a first-play micro-stutter)? Flip
PreloadAllSounds = true. - The kill hook fires for every soldier in the battle, so it does the cheapest possible pointer check against the cached local player first and bails instantly for everyone else — negligible overhead.
- Something looks off? Set
VerboseLogging = trueto see exactly which files mapped and which events fired in the BepInEx log.
Multiplayer & the Ungodly trio: this mod is a pure listener — it hooks the game's own kill / score / battle events, plays a sound, and writes nothing back, so there is no gameplay change to sync and nothing for other players to see. It reacts to the locally controlled player only, and it stacks cleanly alongside UngodlyAI, UngodlyBallistics and UngodlyGFX.
Engineering footnote — the IL2CPP war stories
Two early crashes in this mod's history are documented in the README because they're classic
IL2CPP traps. v1.0.2: the injected MonoBehaviour exposed methods taking the mod's
own enum; Il2CppInterop converts all instance methods of an injected type and waves every
value type through its check, then throws resolving a non-existent IL2CPP class for the enum —
fixed for good by splitting into a paper-thin injected shell plus a separate non-injected logic
class the engine never sees. v1.0.3: the kill hook sat on a method taking
Nullable<Vector3>; Harmony's trampoline must box every original
parameter, and for a generic value-type instantiation the cached class pointer resolves to zero,
throwing on every call — fixed by moving to the parameterless
GameStatistics.OnPlayerGetKill() and the clean
BattleManager.OnWin. If you mod IL2CPP games yourself, those two
paragraphs in the README are worth the download alone.
Turning it off / uninstalling
- Mute everything, keep installed: set
MasterEnabled = falsein the .cfg. - Uninstall: delete the plugin DLL (or its subfolder) from
BepInEx\plugins\, and optionally theKSoundsfolder and the.cfg.
Get the archive on the Downloads page Run the full post-install checklist