Description
Enemy and partner cooldowns on a key, and diminishing returns, for arena and world PvP in Midnight (12.1).
Why this addon works the way it does
In Midnight an addon may not read anything about anybody inside an instance. This was measured on live arenas, not taken from documentation:
- every aura read is refused, for every unit, including your own character;
- the combat log hands back secret caster GUIDs and secret spell ids;
UNIT_SPELLCAST_SUCCEEDEDnames who cast, never what;- addon-to-addon messages are blocked outright;
C_Secretswas asked about all 163 spells this addon knows, one at a time: cast secrecy and aura secrecy came back as secret for every single one. Secrecy is contextual, not per-spell, so there is no exception to go looking for.
Everything the engine will do for you - play a sound, draw an aura icon, anchor a private aura - reports to the player and never back into Lua. That is the design, and it is why no addon can put an enemy defensive on a timer automatically. Anything claiming otherwise is either reading your own character or guessing.
One door stayed open. C_LossOfControl answers about you: what holds you, which spell
did it, for how long. Everything below follows from that, plus one key you press yourself.
What it does
Diminishing returns - automatic
On you, split into six categories: stun, incapacitate, disorient, silence, root, disarm.
Position in the row is fixed per category, so the cell never moves. Two applications to
immunity - Midnight has no quarter step. The window is 20 seconds; the cell turns white and
shows ! a few seconds before it resets, which is the moment they can open on you with full
control again.
On your partners, as one cell each. The game does not tell addons which category a friendly unit's control belongs to, so it cannot be split - only the fact that something is on them, and how long it has left.
Enemy crowd control cooldowns - automatic
When a controlling spell lands on you, its id is readable even though the cast was not. Freezing Trap, Blind, Kidney Shot, Ring of Frost and the rest start counting from that moment. Interrupts resolve too: the school lockout says how long, and the opponent's specialisation - which is readable - says whose it was.
A caveat worth knowing: a trap's cooldown starts when it is thrown, and the addon only learns of it when you step in it. A trap that sat armed for ten seconds makes this run late.
Everything else - one key, pressed by you
Enemy defensives, bursts and externals cannot be detected at all. So the addon does not pretend to: you press a key at the moment you see it happen, and the countdown runs for the rest of your team to read.
A key is bound to a slot, not to a spell. One key cannot mean Divine Shield and Ice Block at once - but "the first spell of whatever spec is in front of me" can, and four keys per opponent then cover all forty specialisations. What slot 1 means on each spec is yours to decide.
Each opponent's row shows their first three slots before you press anything, greyed out, so you can see what your keys would start against this particular spec. Press one and it lights up and counts; when it expires it goes back to grey in the same place.
Getting started
- Bind the keys.
/kho keys, or Escape -> Options -> Key Bindings -> khorium.pro. Nothing has a default key. Start with slots 1 and 2 on each of the three opponents, plus the clear keys for a misfire - eight keys covers most of it. - Place the rows.
/kho unlockshows them all with labels and lets you drag them;/kho testfills them with samples so there is something to line up against./kho lockwhen you are done. - Check the slots. In an arena,
/kho slotsprints what each key currently presses against the enemies actually in front of you. - Correct the numbers as you play. See below - you will find wrong ones.
Commands
| Command | What it does |
|---|---|
/kho |
settings |
/kho edit |
slot book and cooldown numbers |
/kho keys |
jump to the key bindings |
/kho slots |
what your slot keys press against the current opponents |
/kho unlock / /kho lock |
move the rows with the mouse |
/kho test |
fill the rows with samples |
/kho reset |
put the rows back in the middle of the screen |
The minimap button opens settings on a left click and the editor on a right click, and drags around the ring.
The numbers are wrong, and you are the one who fixes them
Every cooldown in this addon is a starting value assembled from general knowledge of the game. They were not measured on 12.1. Some of them are wrong today, talents move others, and the next balance patch will make more of them wrong.
That is not something the author can fix from a distance, and inventing precision would be worse than admitting it. You are in the arena; you will notice a timer running long before anybody else does.
/kho edit -> Numbers lists every value the addon uses, searchable. Type over the wrong
one; an empty box goes back to the built-in. One number per spell, so correcting Divine Shield
fixes it for all three paladin specs at once.
/kho edit -> Slots is the spell book. Pick a class or a specialisation and you get its
list: tick spells on and off, move them with the arrows to set which is slot 1, correct the
seconds, and add anything missing by spell id. Editing the class-shared list covers every spec
of that class; editing a spec covers only that one.
Everything you change is saved per character and survives an update to the addon.
One spec is genuinely empty: Devourer, the new demon hunter specialisation, has only the shared demon hunter list, because its kit is not known here. Add its spells yourself and it works like any other.
What it deliberately does not do
- No automatic enemy defensives. Not a missing feature - see the top of this file. Nine access channels were tested and closed.
- No fake data. Nothing on screen is invented, estimated or padded out. A row is empty when the client refuses to say, and grey means "this key is loaded", never "this is up".
- No clicking. An earlier version had a clickable grid of icons. Hunting an icon with the mouse mid-fight is not a real input; a keybind is muscle memory, and it is the only thing fast enough.
Compatibility
- Retail, Midnight (interface 120100).
- No dependencies. No libraries, no LibStub, no shared globals beyond
Khoriumitself. - Nothing here reads or writes anything outside its own saved variables.
Credits
Interrupt cooldowns and school lockouts started from MiniAuras' KickData, recorded there as
tested in game. Loss-of-control category mapping started from BattleGroundEnemies, worked out
there against live games.
Made by the team behind khorium.pro.





