mod-gold-rush/docs/zone-specific-resources-spec.md
Claude d386536d27 docs: expand zone-specific resources to full zone coverage (v2)
Extends the spec from 4 hardcoded hotspots to essentially every valid
open-world zone in WotLK 3.3.5a -- ~50 zones total.

Every zone name was validated against AzerothCore's own AreaTable.dbc
reference for 3.3.5a before being included. The original request list
contained several Cataclysm-only zones (Twilight Highlands, Abyssal
Depths, Shimmering Expanse, Kelp'thar Forest, Ruins of Gilneas, the
Northern/Southern Barrens split) that don't exist in this game
version -- those were dropped rather than guessed at. Two zones that
do exist (Plaguelands: The Scarlet Enclave, Mount Hyjal) were
deliberately excluded as impractical for a shared open-world event
(phased/instanced content, not open zones in 3.3.5a).

All ~70 resource entry IDs are individually verified against live
acore_world.gameobject_template, organized by the real Vanilla/TBC/
WotLK herbalism and mining tier progression -- not guessed from
memory. Confirmed, notably, that no 'Rich' ore variant exists for
Copper/Tin/Silver/Iron/Mithril in this database (only Thorium+ tiers
got them), matching actual game design rather than assuming symmetry
across ore tiers.

Same underlying code mechanism as v1 (GoldRushSite gains NodeEntries/
BonusEntries, SpawnHotspot prefers per-site pool with fallback to
global) -- this commit only expands the data, not the approach.
2026-09-04 20:05:27 +00:00

15 KiB

Zone-specific resource nodes — implementation spec (v2: full zone coverage)

This supersedes the original 4-zone version of this spec. Same underlying mechanism (see section 3, unchanged), but GoldRush.ZonePool now covers essentially every valid open-world zone in the game instead of just four, each with resources appropriate to that zone. Any hotspot not explicitly listed here falls back to the existing global NodeEntries pool, exactly as before.


0. Zone list validation — do this before using this spec, not after

The starting zone list for this spec came from a hand-written file that included several zones that do not exist in WotLK 3.3.5a — Cataclysm additions/renames (Twilight Highlands, Abyssal Depths, Shimmering Expanse, Kelp'thar Forest, Ruins of Gilneas, the Northern/Southern Barrens split, "Northern Stranglethorn" as a standalone zone, Uldum as a full zone rather than a Tanaris subzone, "Ahn'Qiraj: The Fallen Kingdom" which doesn't match any real zone name).

Every zone name below was cross-checked against AzerothCore's own published AreaTable.dbc reference for version 3.3.5a (https://www.azerothcore.org/wiki/areatable) — not memory, not assumption. If this spec is ever extended with more zones later, verify the same way before adding them; guessing zone names that don't exist in this exact game version has already cost real time once in this project.

Two zones were confirmed real but deliberately excluded as impractical for a shared open-world event:

  • Plaguelands: The Scarlet Enclave — real, but phased, instanced, and faction-separated (the Death Knight starting experience). An event here would be invisible to almost every player.
  • Mount Hyjal — raid-instance content in 3.3.5a, not an open leveling zone (it didn't become open world until Cataclysm).

Hrothgar's Landing is real and included, but flagged as niche — it's a small island gated behind Argent Tournament rank progression, so events there will reach a much smaller audience than the rest of the list.


1. Resource universe — every entry below verified against live acore_world.gameobject_template (type=3)

Classic herbs (Eastern Kingdoms / Kalimdor)

Tier (~level) Herb Entries
1-10 Peacebloom 1618, 3724
1-10 Silverleaf 1617, 3725
1-10 Earthroot 1619, 3726
10-20 Mageroyal 1620, 3727
15-25 Briarthorn 1621, 3729
15-25 Stranglekelp (coastal only) 2045
15-25 Bruiseweed 1622, 3730
20-30 Wild Steelbloom 1623
20-30 Kingsblood 1624
30-40 Liferoot 2041
30-40 Fadeleaf 2042
35-45 Goldthorn 2046
35-45 Khadgar's Whisker 2043
40-50 Firebloom 2866
44-54 Purple Lotus 142140, 180165
44-54 Arthas' Tears 142141, 176642
44-54 Sungrass 142142, 176636, 180164
44-54 Blindweed 142143, 183046
45-55 Ghost Mushroom 142144
45-55 Gromsblood 142145, 176637
45-55 Plaguebloom 176587, 176641
48-60 Golden Sansam 176583, 176638, 180167
48-60 Dreamfoil 176584, 176639, 180168
48-60 Mountain Silversage 176586, 176640, 180166
48-60 Icecap 176588
48-60 Firethorn (Un'Goro only) 191303
55+ Black Lotus (rare/bonus) 176589

Classic ore

Tier Ore Entries
1-15 Copper Vein 1731, 2055, 3763, 103713, 181248
15-25 Tin Vein 1732, 2054, 3764, 103711, 181249
15-25 Silver Vein 1733, 105569
25-35 Iron Deposit 1735
35-45 Gold Vein 1734, 150080, 181109
35-45 Mithril Deposit 2040, 150079, 176645
45-55 Truesilver Deposit 2047, 150081, 181108
50-60 Small Thorium Vein 324, 150082, 176643
50-60 Rich Thorium Vein (bonus) 175404
45-55 Dark Iron Deposit (Searing Gorge / Burning Steppes only) 165658

Note: no "Rich" variant exists for Copper/Tin/Silver/Iron/Mithril in this database — confirmed by direct query, not assumed. Only Thorium and the Outland tiers below got Rich variants in the actual game design.

Outland herbs/ore (all zones, ~58-70)

Herb Entries Ore Entries
Felweed 181270, 183044 Fel Iron Deposit 181555
Dreaming Glory 181271, 183045 Adamantite Deposit 181556
Ragveil (Zangarmarsh-flavored) 181275, 183043 Rich Adamantite Deposit (bonus) 181569, 181570
Terocone (Nagrand/Blade's Edge-flavored) 181277 Khorium Vein (bonus) 181557
Flame Cap 181276
Netherbloom 181279
Nightmare Vine 181280
Mana Thistle 181281

Northrend herbs/ore (already verified in v1 of this spec)

Goldclover 189973 · Lichbloom 190171 · Icethorn 190172 · Frost Lotus 190176 · Talandra's Rose 190170 · Adder's Tongue 191019 · Tiger Lily 190169 · Titanium Vein 191133 · Cobalt Deposit 189978 · Rich Cobalt Deposit 189979 · Saronite Deposit 189980 · Rich Saronite Deposit 189981


2. Full GoldRush.ZonePool replacement

One line per zone, ;-separated, using the format ZoneName|NodeEntries|BonusEntries (no AreaLabel segment — using bare zone names only, since these came verbatim from the AreaTable.dbc dump and are guaranteed to resolve; a guessed subzone name could silently drop a zone from the pool if wrong).

GoldRush.ZonePool = Dun Morogh|1618;3724;1617;3725;1619;3726;1731;2055;3763|; Elwynn Forest|1618;3724;1617;3725;1619;3726;1731;2055;3763|; Tirisfal Glades|1618;3724;1617;3725;1619;3726;1731;2055;3763|; Durotar|1618;3724;1617;3725;1619;3726;1731;2055;3763|; Teldrassil|1618;3724;1617;3725;1619;3726;1731;2055;3763|; Mulgore|1618;3724;1617;3725;1619;3726;1731;2055;3763|; Azuremyst Isle|1618;3724;1617;3725;1619;3726;1731;2055;3763|; Bloodmyst Isle|1618;3724;1617;3725;1619;3726;1731;2055;3763|; Loch Modan|1620;3727;1621;3729;1731;2055;1732;2054|; Westfall|1620;3727;1621;3729;1731;2055;1732;2054|; Silverpine Forest|1620;3727;1621;3729;1731;2055;1732;2054|; Darkshore|1620;3727;1621;3729;1731;2055;1732;2054|; The Barrens|1620;3727;1621;3729;1731;2055;1732;2054|; Redridge Mountains|1622;3730;1623;1732;2054;1733;105569|; Duskwood|1622;3730;1623;1732;2054;1733;105569|; Ashenvale|1622;3730;1621;3729;1732;2054;1733;105569|; Stranglethorn Vale|1622;3730;1623;2045;1732;2054;1733;105569|; Wetlands|1624;1735|; Hillsbrad Foothills|1624;1735|; Stonetalon Mountains|1624;1735|; Thousand Needles|1624;1735|; The Hinterlands|2041;2042;1735;1734;150080|; Arathi Highlands|2041;2042;1735;1734;150080|; Desolace|2041;2042;1735;1734;150080|; Western Plaguelands|2046;2043;1734;150080;2040;150079|; Swamp of Sorrows|2046;2043;1734;150080;2040;150079|; Dustwallow Marsh|2046;2043;1734;150080;2040;150079|; Badlands|2866;2040;150079;176645|; Searing Gorge|2866;165658;2040;150079;176645|; Feralas|2866;2040;150079;176645|; Blasted Lands|142140;180165;142141;176642;2047;150081;181108|; Burning Steppes|142140;180165;142141;176642;165658;2047;150081;181108|; Tanaris|142142;176636;180164;142143;183046;2047;150081;181108|; Azshara|142140;180165;142141;176642;2047;150081;181108|; Eastern Plaguelands|142144;176587;176641;324;150082;176643;175404|176589; Felwood|142145;176637;324;150082;176643;175404|176589; Silithus|176588;142145;176637;324;150082;176643;175404|176589; Un'Goro Crater|191303;324;150082;176643;175404|176589; Winterspring|142140;180165;142142;176636;180164;324;150082;176643;175404|176589; Isle of Quel'Danas|181270;183044;181271;183045;181279;181555;181556|181557; Hellfire Peninsula|181270;183044;181271;183045;181555;181556|181569;181570; Zangarmarsh|181270;183044;181275;183043;181555;181556|181569;181570; Terokkar Forest|181270;183044;181271;183045;181555;181556|181569;181570; Nagrand|181279;181277;181556|181557; Blade's Edge Mountains|181277;181280;181556|181557; Netherstorm|181280;181281;181276;181557|181557; Shadowmoon Valley|181281;181276;181557|181557; Borean Tundra|189973;191019;189978|189979; Howling Fjord|189973;191019;189978|189979; Dragonblight|190169;190170;189978;189980|189979;189981; Grizzly Hills|190169;190170;189978;189980|189979;189981; Zul'Drak|190171;190172;189980;191133|189981; Storm Peaks|190171;190172;189980;191133|189981; Icecrown|190176;190171;190172;189973;190170;191019;191133|189979;189981; Crystalsong Forest|190176;190171;190172;189973;190170;191019;191133|189979;189981; Sholazar Basin|190171;190172;189973;190170;191019;189978;189979;189980;189981;191133|189979;189981; Hrothgar's Landing|190176;190171;190172;191133|189979;189981

This is long and easy to typo when hand-editing later. Recommend keeping a formatted, one-zone-per-line copy in this file (below) as the source of truth, and only generating the single-line config value from it mechanically — don't hand-edit the config's one-liner directly for future changes.

One zone per line (source of truth for future edits)
Dun Morogh                  | 1618;3724;1617;3725;1619;3726;1731;2055;3763
Elwynn Forest                | 1618;3724;1617;3725;1619;3726;1731;2055;3763
Tirisfal Glades              | 1618;3724;1617;3725;1619;3726;1731;2055;3763
Durotar                      | 1618;3724;1617;3725;1619;3726;1731;2055;3763
Teldrassil                    | 1618;3724;1617;3725;1619;3726;1731;2055;3763
Mulgore                      | 1618;3724;1617;3725;1619;3726;1731;2055;3763
Azuremyst Isle                | 1618;3724;1617;3725;1619;3726;1731;2055;3763
Bloodmyst Isle                | 1618;3724;1617;3725;1619;3726;1731;2055;3763
Loch Modan                    | 1620;3727;1621;3729;1731;2055;1732;2054
Westfall                      | 1620;3727;1621;3729;1731;2055;1732;2054
Silverpine Forest              | 1620;3727;1621;3729;1731;2055;1732;2054
Darkshore                    | 1620;3727;1621;3729;1731;2055;1732;2054
The Barrens                    | 1620;3727;1621;3729;1731;2055;1732;2054
Redridge Mountains              | 1622;3730;1623;1732;2054;1733;105569
Duskwood                      | 1622;3730;1623;1732;2054;1733;105569
Ashenvale                    | 1622;3730;1621;3729;1732;2054;1733;105569
Stranglethorn Vale              | 1622;3730;1623;2045;1732;2054;1733;105569
Wetlands                      | 1624;1735
Hillsbrad Foothills            | 1624;1735
Stonetalon Mountains            | 1624;1735
Thousand Needles              | 1624;1735
The Hinterlands                | 2041;2042;1735;1734;150080
Arathi Highlands              | 2041;2042;1735;1734;150080
Desolace                      | 2041;2042;1735;1734;150080
Western Plaguelands            | 2046;2043;1734;150080;2040;150079
Swamp of Sorrows              | 2046;2043;1734;150080;2040;150079
Dustwallow Marsh              | 2046;2043;1734;150080;2040;150079
Badlands                      | 2866;2040;150079;176645
Searing Gorge                  | 2866;165658;2040;150079;176645       (Dark Iron)
Feralas                      | 2866;2040;150079;176645
Blasted Lands                  | 142140;180165;142141;176642;2047;150081;181108
Burning Steppes                | 142140;180165;142141;176642;165658;2047;150081;181108  (Dark Iron)
Tanaris                      | 142142;176636;180164;142143;183046;2047;150081;181108
Azshara                      | 142140;180165;142141;176642;2047;150081;181108
Eastern Plaguelands            | 142144;176587;176641;324;150082;176643;175404 | bonus: 176589
Felwood                      | 142145;176637;324;150082;176643;175404 | bonus: 176589
Silithus                      | 176588;142145;176637;324;150082;176643;175404 | bonus: 176589
Un'Goro Crater                | 191303;324;150082;176643;175404 | bonus: 176589
Winterspring                  | 142140;180165;142142;176636;180164;324;150082;176643;175404 | bonus: 176589
Isle of Quel'Danas              | 181270;183044;181271;183045;181279;181555;181556 | bonus: 181557
Hellfire Peninsula              | 181270;183044;181271;183045;181555;181556 | bonus: 181569;181570
Zangarmarsh                    | 181270;183044;181275;183043;181555;181556 | bonus: 181569;181570
Terokkar Forest                | 181270;183044;181271;183045;181555;181556 | bonus: 181569;181570
Nagrand                      | 181279;181277;181556 | bonus: 181557
Blade's Edge Mountains          | 181277;181280;181556 | bonus: 181557
Netherstorm                    | 181280;181281;181276;181557 | bonus: 181557
Shadowmoon Valley              | 181281;181276;181557 | bonus: 181557
Borean Tundra                  | 189973;191019;189978 | bonus: 189979
Howling Fjord                  | 189973;191019;189978 | bonus: 189979
Dragonblight                  | 190169;190170;189978;189980 | bonus: 189979;189981
Grizzly Hills                  | 190169;190170;189978;189980 | bonus: 189979;189981
Zul'Drak                      | 190171;190172;189980;191133 | bonus: 189981
Storm Peaks                    | 190171;190172;189980;191133 | bonus: 189981
Icecrown                      | 190176;190171;190172;189973;190170;191019;191133 | bonus: 189979;189981
Crystalsong Forest              | 190176;190171;190172;189973;190170;191019;191133 | bonus: 189979;189981
Sholazar Basin                  | 190171;190172;189973;190170;191019;189978;189979;189980;189981;191133 | bonus: 189979;189981
Hrothgar's Landing (niche)      | 190176;190171;190172;191133 | bonus: 189979;189981

3. Code mechanism (unchanged from v1 — already specced, just restating for completeness)

  • GoldRushSite struct (GoldRush.cpp:44) needs std::vector<uint32> NodeEntries and std::vector<uint32> BonusEntries, defaulting empty.
  • BuildSites() (GoldRush.cpp:479) parses the 2nd and 3rd |-delimited segments (in this all-zone-name version, NodeEntries is segment 2 and BonusEntries is segment 3, since no AreaLabel segment is used here — adjust the parser accordingly, or use an empty middle segment as a placeholder if keeping the original 4-segment Zone|Area|NodeEntries|BonusEntries format is preferred for consistency with a future entry that does want an area label. Pick whichever's cleaner; document the choice in code comments either way, since the two format variants look easy to confuse later.
  • SpawnHotspot() (GoldRush.cpp:919) uses _currentSite.NodeEntries when non-empty, falling back to global _nodeEntries otherwise.
  • Bonus mixing: small per-node chance (GoldRush.BonusChancePercent, ~10-15%) to pull from _currentSite.BonusEntries instead of the normal pool for that one node.
  • Backward compatibility required: a hotspot with no node/bonus segments must still fall back to the global pool.

4. Testing

Given the scale (50+ zones instead of 4), don't try to manually .goldrush teststart every single one before shipping. Reasonable approach:

  • Spot-check one zone per tier (a starting zone, a mid-level zone, a high-level Classic zone, one Outland zone, one Northrend zone) to confirm the parsing and per-zone resource selection actually works.
  • Confirm the fallback path still works for a hotspot deliberately left without node/bonus data.
  • Trust the DB-verified entry IDs for the rest rather than clicking through all fifty — the risk at this point is a config-parsing bug (same for every zone), not a wrong item ID (individually verified above).