Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019W3rwwaFE77MpiHiYhRwLT
ScaledLifeTap
A World of Warcraft 1.12.1 addon for Warlocks. One button casts the highest Life Tap rank that fits into your missing mana, so you never waste health on mana you can't hold.
It accounts for your shadow spell damage, Improved Life Tap and (optionally) a health safety floor. Version 4 is a rewrite of Kimilly's ScaledLifeTap 3. It no longer uses BonusScanner, so you can uninstall it unless another addon needs it.
Features
- Picks the right rank automatically. Goes from rank 6 down and casts the first one whose mana return fits.
- Exact spell damage with client mods. With ClassicAPI or Nampower, it reads the spell damage number the game client itself calculates. That includes buffs such as elixirs, flasks and trinkets.
- Works without any mods. A built-in gear scanner reads your item tooltips. It gives the same totals BonusScanner did, and works on English, German and French clients.
- Spell IDs and macro display (ClassicAPI). Finds Life Tap ranks by spell ID, shows the rank that would be cast on your
/slt castmacro button, and/slt verifychecks the built-in health numbers against the game's own spell data. - Mana check (Nampower or ClassicAPI). Compares the mana each tap actually gives with the prediction, and adjusts itself if your server's Life Tap numbers differ.
- Options window. All settings in one place: in ClassicAPI's AddOn Options window, or in a small window of its own without ClassicAPI.
- Health safety floor. Optionally never taps below a set percentage of your health.
- Light. No per-frame work. Gear is rescanned only after your equipment changes.
- English, German and French clients.
Installation
- Download the latest zip from Releases, or download the repository as a ZIP.
- Extract it into
World of Warcraft\Interface\AddOns\. - Make sure the folder is named exactly
ScaledLifeTap. A repository download may name it differently (for exampleScaledLifeTap-main), so rename it if needed. The release zip already has the right name. - If you used the old version (v3), delete its folder first. Your overtap setting carries over.
Usage
Make a macro and put it on your bar:
/slt cast
Old macros using /script ScaledLifeTap_CastLifeTap() keep working.
Options window
Type /slt options, or with ClassicAPI open the game menu and click AddOn Options → ScaledLifeTap.
| Setting | What it does |
|---|---|
| Overtap | When no rank fits but mana isn't full, cast rank 1 anyway (default: on) |
| Mana check | Learn the actual mana per tap if your server differs. Reset forgets what it learned. Greyed out without Nampower or ClassicAPI |
| Show each cast in chat | Print the rank, health cost and mana gained on every cast |
| Health reserve (%) | Never tap below this % of max health (default: 0) |
| Spell damage source | Automatic, or force ClassicAPI, Nampower, the built-in scanner or BonusScanner. Sources that aren't running are marked |
| Extra spell damage | Added by hand, for buffs the built-in scanner can't see. Greyed out when ClassicAPI or Nampower supplies spell damage |
The page also shows your current spell damage and multipliers, with a Rescan button. In ClassicAPI's window, a Ranks page under ScaledLifeTap shows the health cost and mana gained for each rank.
In ClassicAPI's window, changes apply at once, Cancel (or Escape) undoes the changes made since the window was opened, and Defaults restores the defaults, just like ClassicAPI's own pages. In the standalone window, changes apply at once and Escape closes it.
Commands
Everything in the options window is also available as a command.
| Command | What it does |
|---|---|
/slt status |
Shows your spell damage and its source, the talent multiplier, and the health cost and mana gained for each rank |
/slt overtap [on|off] |
When no rank fits but mana isn't full, cast rank 1 anyway (default: on) |
/slt reserve <0-90> |
Never tap below this % of max health (default: 0) |
/slt bonus <n> |
Add extra spell damage by hand. Only useful without ClassicAPI or Nampower, for buffs the gear scan can't see |
/slt source <name> |
Where spell damage comes from: auto (default), classicapi, nampower, bonusscanner or internal |
/slt calibrate [on|off|reset] |
Turn the mana check on or off, or reset what it has learned (needs Nampower or ClassicAPI) |
/slt verify [adopt|reset] |
Compare each rank's base health with the game's spell data. adopt uses the game's numbers, reset goes back to the built-in table (needs ClassicAPI) |
/slt macrodisplay [on|off] |
Show the current rank on /slt cast macro buttons (needs ClassicAPI) |
/slt debug [on|off] |
Print each cast to chat |
/slt rescan |
Force a rescan of gear, spellbook and talents |
/slt options |
Open the options window |
Where spell damage comes from
With source auto, the first one available is used:
| Source | Includes buffs | Notes |
|---|---|---|
| ClassicAPI | Yes | GetSpellBonusDamage(6) |
| Nampower | Yes | GetSpellPower() |
| Built-in scanner | No | Always available |
Running ClassicAPI and Nampower together (the usual setup) works fine. Spell damage comes from ClassicAPI; both mods read the same number, so it makes no difference which is used.
BonusScanner is never chosen automatically. /slt source bonusscanner forces it, but that's rarely useful: it gives the same totals as the built-in scanner on English clients, and likely 0 on German and French clients.
Mana check
The mana check needs the actual mana each Life Tap gave. It gets it from either:
- Nampower: its
SPELL_ENERGIZE_BY_SELFevent. On Nampower versions older than 4.5, turn the event on once:/run SetCVar("NP_EnableSpellEnergizeEvents","1") - ClassicAPI: its combat log (
SPELL_ENERGIZE). ScaledLifeTap listens to the combat log only for a few seconds after each tap, so it costs nothing the rest of the time.
With both mods running, whichever reports first is used. Each tap is counted once.
How the rank is chosen
For each rank, from highest to lowest:
- Health cost = base + coefficient × shadow spell damage
- Mana gained = health cost × Improved Life Tap (1.0 / 1.1 / 1.2) × server correction (from the mana check, normally 1.0)
| Rank | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| Base health | 30 | 75 | 140 | 220 | 310 | 424 |
| Coefficient | 0.38 | 0.68 | 0.8 | 0.8 | 0.8 | 0.8 |
Ranks 1 and 2 get a lower coefficient because of the low-level spell penalty. The addon casts the first rank where mana gained ≤ missing mana and you'd keep more health than your reserve.
Development
The code targets the Lua 5.0 that the 1.12 client embeds. The tests run the addon against a mock of the WoW API. Run them from the repository root with a Lua 5.0 interpreter:
lua5.0 tests/test_core.lua . path/to/BonusScanner
lua5.0 tests/test_sources.lua . path/to/BonusScanner
lua5.0 tests/test_options.lua .
test_core.lua checks the built-in scanner against BonusScanner on the same gear, so it needs a copy of that.
Credits
- Kimilly: ScaledLifeTap up to version 3.
- Aredia (Gilneas): original macro, research and calculations.
- Crowley: BonusScanner, whose gear patterns the built-in scanner is based on.
See CHANGELOG.md for version history.