- Lua 98.3%
- Shell 1.7%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| art | ||
| docs | ||
| plan | ||
| scripts | ||
| src | ||
| .gitignore | ||
| handoff.md | ||
| LICENSE | ||
| README.md | ||
| SPEC-menu.md | ||
| SPEC-party.md | ||
| todo.md | ||
WarriorKit
A warrior addon for TBC Anniversary (2.5.6) and Classic Era (1.15.9).
-
One Charge button. It casts Charge, Intervene or Intercept depending on the stance you stand in and what you are looking at, and out of combat it aims by camera rather than by target.
-
Easy raid marking. Bind your raid target icons to simple buttons.
-
One key that switches target and swings. TAB cycles and stops there. Bind a key in
/wkand it takes the next enemy and starts the attack on it. -
Weapon loadouts, one key each. A press puts you in a stance and puts that loadout's pair of weapons in your hands. Three come ready, one per stance, and you can add your own, up to ten. Drag a weapon or a shield onto a hand on the paperdoll, which is a tab of the character sheet below.
-
A character sheet that says how often you miss. Four tabs on one window the C key opens: your gear with what it adds up to in a column beside it, your skills, your standings and your loadouts. No client on either of these versions has ever put your miss chance on the character sheet, because the client knows your hit rating and not your hit chance, so this works it out: how often a special, a white swing and a spell go wide against a boss and against your own level, with the hit off your gear already taken off. Each of those numbers is the hit you still want, so there is no second line saying it twice. The gear page draws all nineteen slots with the durability of each piece as a line under it, and the four numbers the client's own sheet has never had: item level, durability, empty slots and that miss chance. The skills page prices what a weapon skill under the cap for your level is costing you. Right click a slot to take a piece off, drag one on to put it on, and neither works in a fight because the client will not allow it. Blizzard's own sheet goes off the screen, and one tick box puts it back.
-
A socketing window that knows what you are carrying. Shift-click a piece on the gear page and it opens on that piece's holes with every gem in your bags underneath, the ones that go in the hole you are pointing at first. Click a hole, click a gem, press apply. Blizzard's own frame gives you three holes and a drag: you find the gem in your bags yourself, the sparkle that says it matched is gone in half a second, and the gem you are about to destroy is named nowhere. Here the line beside the apply button says what applying costs you, by name and by count, and whether the item would pay its socket bonus afterwards, which is the number you are socketing for. Right click a hole to take a gem back out. Nothing is spent until you press apply. TBC only: Classic Era has no sockets, and on that client this part registers no event at all.
-
A dungeon log, where there has never been one. Neither of these clients has an adventure guide. Shift-L opens three columns: every boss in the game down the left, grouped by dungeon and in level order, so the column answers "what should I be running now" without a single click. In the middle, the dungeon's own map, cut into its floors, with a numbered mark per boss. Neither client will hand that map over: the 1.15 one has no dungeon maps in its map tree at all and the 2.5 one has a hundred and four of them and files art for none, so the picture is drawn from the tiles both of them ship all the same. On the right, what that boss drops, in the client's own grade colours with the client's own tooltip on every row. Forty dungeons, two hundred and thirty seven bosses, and every item id in the book generated from Questie's databases rather than typed, then checked against the client again when the row is drawn: a drop the client disagrees with is left out instead of shown.
The marks are yours. No database on either client says where a boss stands inside an instance, so the addon writes down where you were standing the first time you loot each one, and the map fills in as you run the place. Any drop the book did not have goes down beside it, which is how the Outland half of the loot arrives, because the database this was generated from does not carry it.
-
Threat-coloured enemy bars. They replace the Blizzard nameplate and carry a tag saying what the kill is worth. A mob that pays you nothing, because it is far below you or because somebody else tagged it, goes grey by name as well as by tag, so you can read it off a screen full of plates.
-
A damage meter and a threat meter, side by side. One row per player: the spec icon, the name, the number, and a class-coloured bar as long as their share of the top row. Click the header for the breakdown of your own damage, right click it to swap damage for healing. The threat side is the client's own percentage, where 100 means that player takes the mob, and beside it the seconds until they get there at the rate they are gaining. Nothing is drawn but the rows, so it sits on the screen rather than over it. A row opens nothing, because there is nothing behind a row.
-
A swing timer, with the Slam press marked on it. One bar per hand, filling towards the next swing off the combat log, and a green band on the main hand bar showing where to press Slam so the cast finishes exactly as the swing does. Press before the band and the Slam restart throws away the swing you had charged; press after it and the swing is pushed out to the end of the cast. The whole bar goes green while you are on the band. The cast time is the client's own, measured off your last Slam, and it follows your haste, so the band moves when Flurry lands. The bars are drawn for anybody holding a weapon; the band is a warrior's.
-
Your own cast bar. One bar under the swing timer, the same width as it, in the same flat colours as everything else here. The spell on the left and the seconds left on the right, counted in tenths because that is what an interrupt is timed in, and a channel drains from the other end rather than filling. A cast that does not finish, because you were interrupted or walked out of range or the client refused the press, turns the bar red and holds it where it stopped for most of a second: an empty bar is what a cast that finished leaves behind, so a cast that died has to look like something else. Blizzard's own goes off the screen, and one tick box puts it back.
-
Party and raid frames that stop moving. The same block your own frame wears, one per person you are grouped with: class colour on the health, the power under it, the name and the percent, and the role each one is playing said with Blizzard's own icon. The slot is decided by role and then by name, so the healer is in the same place in every group you are ever in, and it is worked out between fights and never during one. Left click targets, which is the point of the whole thing, because the Charge button casts Intervene at whoever you are looking at. Somebody out of range, dead, offline or running back drains to the empty colour and their block says which. A member the client will not name a power for gets no rail rather than an empty one. Where the addon guesses a role wrong, tell it:
/wk party role <name> healeris kept for that character and beats everything the client thinks. Blizzard's party and raid frames go off the screen, and one tick box each puts them back. -
A nag for what you forgot. A row of squares over your character when something that should be up is not: a sharpening stone worn off either hand, Battle Shout lapsed, no food. It is not there at all when nothing is wrong, so seeing it is the whole message. A shield is never nagged about. Hover a square and it tells you what is missing and what fixes it; click it and the options window opens on the row's own page. The row has two lines. The out line is checked between fights, because a stone and a plate of food are things you put on before the pull. The in line is checked during one: the racial you own and have not pressed, Blood Fury on an orc and Berserking on a troll pulsing in the middle of your screen until you spend them, and whatever you dragged there because it lapses mid swing, a shaman's shield being the case it was built for. An entry can stand on both lines, and a shield does. The page draws both lines, and you drag a spell out of your spellbook onto either, drag a square onto the other line to check it there as well, or drag one off a line. Every entry has its own tick box too, per character, because a bank alt that will never own a sharpening stone does not need to be told about one forever, and a low level character has no buff food yet. Add a flask by spell id where there is nothing to drag, because these clients will not say that an aura came from one.
-
A totem bar with a hole where a totem is missing. The client draws the totems you have out as a row as long as the number of them, so the square in the second place is a different totem every time you look and the one thing it can never say is which slot is empty. This is the four slots instead, always in the same order and always in the same place: earth, fire, water, air, which is Blizzard's own order. A filled slot is the totem's art with the seconds over it and a sweep that fills as it runs out; an empty one is a hole with the element's colour on its edge. After a week you stop reading names, because the second square is Windfury and Windfury being a hole is a sentence. It is up in a fight and afterwards while anything is still standing, and gone once everything has run out. Nothing in the part knows what a totem is: the slots, their order and their colours are a plan in
Class/Shaman.lua, so a warrior's three stances are one more plan and one more reader rather than a second feature. -
A loot stream, and the combat log beside it. Two columns of what just happened, newest at the top and older underneath, scrolled with the wheel. A loot row is the item's icon, its name in its own quality colour and how many dropped, with a stripe down the left in that same colour, so a pull reads as a ribbon before you read a word of it. A quest item carries a ring round its icon, because a quest item is white and so is a stack of linen. The loot feed has no word over it and no line round it, and over the rows are seven small squares: five gems in the quality colours, a quest bang and a stack of coins. Click one and that kind stops being drawn. They filter what you are looking at rather than what is recorded, so turning one back on brings its history with it. Hover a row and the tooltip carries what a vendor pays for one and what the stack came to, plus what it goes for at auction if you have Auctionator, TSM, Auctioneer or RECrystallize installed. None of them is required and the line names whichever answered. A combat row is three columns off the combat log: what happened, who it was, and the number. The stripe says which way the blow went and a critical draws its number in gold with a mark after it, so the crit is not a hue you have to be able to see. Entering and leaving combat draw a band across the feed, which is what separates one pull from the one before it, and the band at the end says how long the fight took. Both feeds are the same widget, and adding a third is a file that captures something and a table of settings.
Hover any row and you get the addon's own tooltip, not Blizzard's parchment. For an item that means the item's real text, stats and all, read out of the client and redrawn in this interface. Nothing in either feed is on a ticker: they change when something happens to you and when you scroll them, and never in between.
-
One tooltip, and parts hook into it. Every hover in the addon opens the same box: an action square, a nag square, a mail attachment, a link somebody put in chat. Where the words are the client's, which is the stats on an item and the rank and cost on an ability, they are read out of the game and redrawn here rather than raising a gold-bordered parchment over an interface that has none. Each box is a name, then the facts the thing itself knows, then whatever else in the addon has something to say about it, then one blue line telling you what to press or what to type. Adding a line to every tooltip about an item is one call at load. That is how the vendor and auction prices work, which is why they now show up on a mail attachment and not only on the loot row they were written for. The box docks in the corner the client keeps its own tooltip in, clear of the bags, so nothing you hover is covered by what it says.
/wk tips besideputs it back next to the thing itself.A creature in the world gets the same box. It is the one hover nothing in the addon owns a frame for, since the cursor is over the world itself and the client fills and shows its own tooltip with no script in the way, so the addon opens its box on the pointer and holds Blizzard's down while it is up. That suppression is narrow on purpose. It is armed only while our box is on screen and it acts only on a tooltip that answers a unit, because the client's box is also a linked item, a quest reward and every other addon you have installed. The threat meter hooks a line onto it: point at anything across the room and the box says whose it is before you swing.
-
A breakdown of what this character actually does. One row per ability, kept between sessions: how much of your damage it is, how often it lands, how often it crits, what it averages, and what stopped it when it did not land. The miss column names the outcome rather than pooling it, because a dodge and a parry mean different things and dodge is the one you can do something about. Shouts, stances and Charge are counted but not listed, since in a damage ranking they are a run of zeroes above the rows you came to read.
It answers the questions a meter cannot, because a meter forgets the pull it was counting: whether Slam pays for the swing it costs, what share of your damage comes from Thunder Clap, whether that new axe changed anything. Rows can be read one level band at a time, since in this era the target's level drives crit and miss hard and a number pooled across grey trash and an elite is the average of two unrelated things.
It opens in a window of its own, from a click on the meter header or from
/wk breakdown open, and Escape closes it./wk breakdownprints the top ten to chat instead. -
A warrior bar loadout, with a backup of whatever it replaced, plus an Edit Mode layout carried inside the addon.
-
Your own action bars, redrawn.
/wk actionbars onreads whichever bars you have up, stands one of ours up for each on the same action slots, moves your keys onto it, and hides Blizzard's behind it. Bar 1 still pages by stance. Every icon is drawn at the one size this client can draw sharp, and the border says whether a press would land. Your keybindings are read and never written, sooffgives everything back with no reload.Then every bar is yours to shape. Fold its twelve into 1, 2, 3, 4, 6 or 12 rows, so a bar is a row along the bottom or a column down the side. Pick the colour of the ground under the squares and how much of it you see, down to nothing, which leaves the icons standing on the world. Send a bar off the screen when a fight starts, or keep it off the screen until you hold shift, ctrl or alt, with its keys working the whole time either way. Unlock the bars and shift-drag one where you want it, or put its middle on the middle of the screen with a button, one axis at a time. Make the squares bigger or smaller, 16 pixels to 54, and the panel says which sizes draw sharp. Every bar answers for itself, and one press puts the lot back to plain. While the settings window is open, whichever bar you have picked wears a blue rim on the screen, so you are never editing the one you thought was the other one.
-
Stripped bar art, so the bars read as a row of icons.
/wk art onputs the Blizzard art back. -
Your experience along the bottom, drawn here. Two rails: how far into the level you are, and under it the faction you are watching, in the same flat colours as everything else. The rested pool is a second fill running on from where you are, so an evening's rest is something you see rather than something you hover for, and the twenty bubbles this game has always drawn are still on it. A rail with nothing to say is not there at all: at the level cap there is only the reputation rail, watching nothing leaves only the experience one, and a character with neither has no bar on the screen. Hover one and it says what is left of the level, what the rested pool is worth, and how long the rest of the level will take at what you have been earning this session, which is a number the game itself will not tell you. Blizzard's own pair goes off the screen, and one tick box puts it back.
-
A square minimap, as wide as you asked for. The mask and the ring come off, the mousewheel zooms, and Blizzard's mail and tracking icons move to the corners. Every addon button on the edge of the map goes behind one square you press to open. Each is borrowed rather than taken: parent, position and the button's own anchoring are handed back the moment you turn it off.
-
A chat window, and one tab for the people you play with. Name your wife, your kids or your guild officers in
/wkand every line any of them says, in any channel, is copied to one tab of its own, together with the whispers you send them. The tab is not drawn until there is a name on the list. Beside it are two more: everything anyone said, and whispers on their own. Nothing else is in it. Loot, experience, system text and every addon's output stay in Blizzard's window, which is not hidden and not unregistered, because there is no safe way to tell those lines apart from the ones this window already drew. The conversation is taken out of Blizzard's frames through FrameXML's own message filter, so one tick box puts it back with no reload. Names are class coloured, a click on one answers it, item links still work, and nothing fades out after two minutes. A right click on a conversation closes it, a right click on the lines of any room opens a box you can copy them out of, and what this addon says has a room of its own beside the System room. -
A voice channel joined when you log in. Pick your party or raid channel, or any community or guild stream you are in, the same list the client's own Chat Channels window puts a voice button on. The addon activates it at login and asks again whenever it could have appeared, which for a party channel is when you group up and for a community one is when the first person joins. It only ever joins: nothing here leaves a channel, mutes anyone or moves a volume. Blizzard's voice chat has no channels you can name, so what there is to pick is short, and
/wksays so. -
A filter for the red text in the middle of the screen. Tick the messages you do not need and they stop drawing. Nothing is hidden that you did not tick, the list is shared by every character on the account, and one press silences what a missed charge shouts at you.
-
Five chores done for you. Corpses empty in one go instead of one slot at a time. Grey items sell themselves at every merchant. Damaged gear pays for its own repair at any merchant who mends, out of the guild bank where your rank allows it and out of your purse where it does not. Hold shift as you open a merchant to skip both. The camera pulls back four times the base distance instead of 1.9. A stranger who buffs you in passing gets a whispered
ty, once every ten minutes per person, and nobody in your party or raid is ever whispered. -
A fanfare when you level, if you supply the sound. WarriorKit plays
Media/BestAround.mp3over the client's own chime and does not ship that file: it is five seconds of a record somebody else made and is not ours to hand out. Install BestAround, which is where everybody who has heard this joke heard it, and copy itsbestaround.mp3into WarriorKit'sMedia/under that name. Any sound file you like works just as well. With nothing there the fanfare is silent and/wksays why. It plays on the master volume rather than the sound effects slider, so combat noise turned down does not take it with it, and two levels in one breath play it once./wk dingplays it now,/wk ding offends it. -
/wk destroyclears out finished quest items. One card at a time, with the quest it came from written on it, and a destroy and a skip. It reads Questie's database to work out which quest, so it needs Questie installed.
/wk opens the settings panel. Everything in it has a slash command too, and
/exit quits the client, which the game itself only spells /quit.
The Charge button, the bar loadout and the Slam band are warrior only, and on any other class they are not there at all: no button, no icon in the world, no key taken, no band on the swing bar, and your action targeting setting left exactly where you had it. Everything else on this list works the same on a hunter as it does on a warrior, the swing bars included.
Install
Unzip into Interface/AddOns, so that the folder is
Interface/AddOns/WarriorKit with WarriorKit.toc directly inside it.
Questie is the one other addon
this one asks anything, and it is worth having. Both TOCs name it under
## OptionalDeps and the CurseForge upload declares it an optional dependency,
so an addon manager offers it alongside this download and the client loads it
first where it is there. Install it by hand if you took the zip.
Nothing here needs it. The quest log window, the tracker and the bag lanes all draw off the client on their own. What Questie adds is the map pin for where a quest is turned in, the drop rate under an item something wanted, a party member's progress on a quest you share, and the quest a finished item belongs to on a clutter card. Each of those says in the panel that Questie is not answering rather than showing you a blank.
Repo layout
src/ the addon, exactly what the client loads
src/Media/ the art the addon ships, today one 64x64 icon
docs/ the engineering notes, including the file map and API caveats
scripts/ check.sh, bake-ui.sh, release.sh
art/ the project art: the banner above, the avatar, the plaque
art/ is for GitHub and the CurseForge project page and is not shipped, which
is what separates it from src/Media/. The client reads BLP and TGA, so a JPEG
in the addon folder would be dead weight.
src/ is what a client sees. Link it in rather than copying, so there is one
copy to edit and every client loads it:
ln -s "$PWD/src" "/path/to/World of Warcraft/_anniversary_/Interface/AddOns/WarriorKit"
Developing
./scripts/check.sh
Syntax, TOC agreement, version agreement, saved-variable declarations, a guard check on every write reachable from an OnUpdate, and luacheck. Zero warnings and zero errors is the bar, and it passes, so any finding is yours.
./scripts/release.sh
Builds dist/WarriorKit-<version>.zip. Add --upload to publish it to
CurseForge. It refuses to build anything if check.sh fails.
There is no commit hook. There was one, and it ran check.sh and the harness
on every commit, which is the same two runs check.sh already does for every
class and spec: the harness went past twenty times a day for one answer. Run the
line above before you commit. The gate is the same gate; what is gone is running
it twice for the same tree.
Version lives in three places on purpose, ns.version in src/Core/Core.lua
and ## Version: in both TOCs. check.sh fails if they drift, which is how
the 1.1-versus-1.2 split got caught.
Licence
MIT. See LICENSE.
