Skip to content

About

WoW 1.12 addon: expected gold per kill on mob tooltips (drop tables x aux auction values)

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

14 Commits

Folders and files

Repository files navigation

OctoKillValue

Expected gold per kill on creature tooltips, for Turtle WoW and OctoWoW (WoW 1.12 clients with the Turtle API).

Sewer Beast tooltip: Kill value 6s 6c, Pointy Crocolisk Tooth x1.0 (vendor) 3s 16c, Reinforced Steel Lockbox 2% (opened) 2s 90c

Coins plus every drop weighted by its chance and stack, priced from the auction house, the vendor, or what a container holds when opened. Under the total: the top contributors with their source, a "rare drops" line for the sub-0.1% tail, and skinning value when you have the skill.

value = average coin drop + sum(drop chance x average stack x item price)

Hover any creature. /okv with a target prints the full breakdown, /okv zone ranks the best farm targets where you stand.

Requirements

Needed for Without it
Turtle WoW / OctoWoW client identifying creatures (UnitExists returns a guid) nothing works on a stock 1.12 client; the addon says so at login and in /okv status
aux-addon (optional) auction prices, disenchant estimate vendor sell prices only; the tooltip line is tagged "(vendor only)"
pfQuest (optional, any variant) /okv zone, names of items not yet in your client cache no zone ranking; uncached items print as item:<id>

Prices are read live from aux each time you hover, so scan the auction house now and then and the numbers follow. There is nothing to maintain.

Install

OctoLauncher / GitAddonsManager: add the repository URL https://github.com/Krool/OctoKillValue as an addon. The clone lands as Interface\AddOns\OctoKillValue and loads as-is.

Manual: download the release zip and put the OctoKillValue folder into Interface\AddOns, so that Interface\AddOns\OctoKillValue\OctoKillValue.toc exists.

At login the addon prints one line confirming it loaded, and a warning if a requirement is missing (/okv hello turns the confirmation off).

Commands

command effect
/okv breakdown for your target: coins, top drops with source tags, rare tail, gather value
/okv id <creatureId> breakdown for any creature entry
/okv zone [n] [all] top n creatures in the current zone by kill value (needs pfQuest); non-elite unless all; shows level, rank and value per 1000 health
/okv status requirement check with plain-language advice
/okv guid raw guid of the target, parsed creature id, whether loot data exists
/okv config every setting with its value and meaning
/okv reset restore default settings
/okv help command list

Settings (saved per account):

command default meaning
/okv toggle on tooltip line on/off
/okv detail <n> 3 contributor lines under the total (0 = none)
/okv price value|today value aux source: lower median of daily observations, or today's minimum buyout
/okv cut <pct> 5 auction house cut taken off AH and disenchant values
/okv rare <pct> 0.1 drops below this chance are shown as "rare drops", outside the total
/okv mindays <n> 3 days an aux price above 50g must have been seen before it counts
/okv vendor on vendor sell price as fallback and floor
/okv de off also consider aux's disenchant estimate for gear
/okv skin on gather line when you have the skill (not part of the total)
/okv friendly off show the line on friendly NPCs (corpses always show)
/okv hello on login confirmation line

How prices are chosen

Each item takes the best of:

  • Auction: the lower median of aux's raw daily minimum buyouts, minus the cut. Never for bind-on-pickup or poor-quality (grey) items. Random suffix gear ("of the Bear") uses the median of the suffix variants aux has seen. Prices above 50g must have been observed on 3 days.
  • Disenchant (optional): aux's expectation for the item's quality, level and slot, minus the cut.
  • Vendor: the sell price from the database.
  • Contents: clams, lockboxes and gem bags are worth their expected contents when opened, if that beats the container's own price.

Quest items are a known 0. Bind-on-pickup items only ever use vendor or disenchant value.

Why the guards

Auction history contains troll listings: a grey figurine at 999g, a one-off 166,000g buyout. aux's own "value" is a weighted median that returns the higher of two observations, so one such listing next to one real price wins, and multiplied through the world-drop pool every creature shares it inflated every mob in the game. Hence the lower median, the 3-day rule for expensive items, the grey exclusion, and the separate "rare drops" line where a bad price stays visible instead of hiding in the total.

Data

Data.lua is generated from the Turtle WoW 1.18.1 preservation database (github.com/Penqle/tortoise-wow): coin ranges, every creature, reference, skinning and container loot row with min/max stacks, group and reference semantics resolved the way the server rolls them, plus vendor prices, bonding, quality and disenchant info for every droppable item.

node tools\gen-data.js

downloads the SQL into tools\sqlcache on first run and rewrites Data.lua.

Caveats

  • Data is Turtle 1.18.1. OctoWoW-only creatures and any loot rebalances are not in it; those creatures show no line.
  • Quest-conditional loot rows (negative chance) are skipped. Class or race conditioned rows count at full chance.
  • Pickpocket loot is not included.
  • Results are cached per creature (up to 64 creatures, 10 minutes) and flushed when you close the auction house after a scan or search, or change a setting. aux's history records are read straight from their packed strings, so a hover never decodes them through aux's API.

Tests

cd tools\test
npm install
npm test

Syntax-checks the Lua, validates Data.lua sentinels, then runs the real addon under fengari with a stubbed WoW + aux environment (75 behavior checks). GitHub Actions runs them on every push.

License

MIT

Invariants added by the 2026-09-08 review

  • Never consult aux's history API (value/market_value/data_points) for a key whose raw record is ABSENT: aux's value() creates a persistent value_cache entry per unknown key. Observations() returns (vals, rawOK); the API is only a fallback when rawOK is false (record present but undecodable).
  • "today" price mode counts the record's observed days for the trust gate.
  • Tooltip work runs under pcall; the SetUnit wrapper returns the original's values. mobCache/refCache/contentsCache are released by ClearCaches().
  • /okv detail is clamped 0-20 (it multiplies computeCache retention), cut 0-100, rare 0-100, mindays 1-30. Suffix-key subsets are sorted before the 16-key cap so pricing is stable across sessions.

1.12 API allowlist lint (tools/test/api-lint.js)

Every npm test also runs api-lint.js: any bare global call, GetCVar/ SetCVar name, or RegisterEvent name that is not in api-allowlist.json fails the run. The list is built from WoW.exe's own identifier strings plus the shipped FrameXML/GlueXML (OctoWoW patch-4/5 included, so server globals like LFT_Toggle count), so absence means the name does not exist on this client. Origin: a reviewer's fix called GetCVar("rotateMinimap") - a 2.0 cvar - and this client's GetCVar THROWS on unknown names; it shipped and hit users (2026-09-08). Method calls (a:b()) and bare global reads are not checked. To add a name, add evidence (exe string or FrameXML definition) and rebuild the list rather than editing it by hand.

About

WoW 1.12 addon: expected gold per kill on mob tooltips (drop tables x aux auction values)

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages