From 915b771b78eabacc900e230ea8b39b8df3b4aaf1 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 4 Sep 2026 19:41:16 +0000 Subject: [PATCH 1/2] docs: zone-specific resource nodes spec Makes node selection zone-aware instead of drawing from one global pool for every hotspot. Includes real herb/ore entries verified against the live acore_world database for all four configured hotspots (Un'Goro Crater, Winterspring, Eastern Plaguelands, Sholazar Basin), plus a rare 'bonus' tier per zone (Black Lotus for the three Classic zones -- a real, accurate spawn-zone match, not an arbitrary pick). Extends the existing pipe-delimited ZonePool config format with two optional segments rather than introducing a new config key, and explicitly calls out backward compatibility for hotspots that don't specify zone-specific resources. --- docs/zone-specific-resources-spec.md | 117 +++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 docs/zone-specific-resources-spec.md diff --git a/docs/zone-specific-resources-spec.md b/docs/zone-specific-resources-spec.md new file mode 100644 index 0000000..fe71cf0 --- /dev/null +++ b/docs/zone-specific-resources-spec.md @@ -0,0 +1,117 @@ +# Zone-specific resource nodes — implementation spec + +Currently `GoldRush.NodeEntries` is one global pool used for every hotspot +regardless of location — an event in Un'Goro Crater and one in Sholazar +Basin draw from the exact same 5 entries. This spec makes node selection +zone-aware: each configured hotspot gets resources that actually belong +there, plus a rare "bonus" node type for extra excitement. + +**Good news for implementation**: the module already tracks which zone/area +an event is anchored to (`GoldRushSite.ZoneLabel`/`ZoneId`/`AreaLabel`) — +this is purely about *using* that existing data to pick node types, not +building zone-tracking from scratch. + +--- + +## 1. Confirmed real, zone-appropriate resources (verified against the live DB, not guessed) + +Looked up directly against `acore_world.gameobject_template` (`type = 3`, +matching the 5 entries the module already uses) for the four zones +currently in `GoldRush.ZonePool`: + +| Hotspot | Herb entries | Ore entries | Bonus entries | +|---|---|---|---| +| Un'Goro Crater | Firethorn (191303) | Small Thorium Vein (324, 150082, 176643), Rich Thorium Vein (175404) | Black Lotus (176589) | +| Winterspring | Purple Lotus (142140, 180165), Sungrass (142142, 176636, 180164) | Small/Rich Thorium Vein (same as above) | Black Lotus (176589) | +| Eastern Plaguelands | Plaguebloom (176587, 176641), Ghost Mushroom (142144) | Small/Rich Thorium Vein (same as above) | Black Lotus (176589) | +| Sholazar Basin | Lichbloom (190171), Icethorn (190172), Goldclover (189973), Talandra's Rose (190170), Adder's Tongue (191019) | Cobalt Deposit (189978), Rich Cobalt Deposit (189979), Saronite Deposit (189980), Rich Saronite Deposit (189981), Titanium Vein (191133) | *(none needed — this zone's base pool is already top-tier; see note below)* | + +**Why Black Lotus for the three Classic zones specifically**: it's a real, +accurate spawn zone match — Black Lotus genuinely spawns in Un'Goro Crater, +Winterspring, and Eastern Plaguelands (among a couple others not in our +current hotspot list). It's a legitimately rare, high-value herb, which is +exactly the "couple of higher level ones" feel being asked for — not an +arbitrary reskin. + +**Sholazar's bonus tier**: Sholazar is already the highest-level zone in +the current hotspot list, and its existing default pool (Frost Lotus, +Lichbloom, Icethorn) is already the good stuff. Rather than reaching for +something contextually odd, treat the **Rich** variants of Cobalt/Saronite +as its "bonus" tier — rarer, better-yielding versions of what's already +appropriate there. Simpler and more thematically honest than importing an +unrelated resource into a zone it doesn't belong in. + +**If more hotspots get added to `ZonePool` later**, they'll need the same +kind of real DB lookup before assigning resources — don't extrapolate a +"probably fine" guess from a different zone's list. + +--- + +## 2. Config format change + +Extend the existing pipe-delimited `Zone|Area` tokens in `GoldRush.ZonePool` +with two more optional segments — `NodeEntries` and `BonusEntries` — using +the same `;`-separated-entries convention `GoldRush.NodeEntries` already +uses: + +``` +GoldRush.ZonePool = Un'Goro Crater|Fire Plume Ridge|191303;324;150082;176643;175404|176589; Winterspring|Frostfire Hot Springs|142140;180165;142142;176636;180164;324;150082;176643;175404|176589; Eastern Plaguelands|Terrorweb Tunnel|176587;176641;142144;324;150082;176643;175404|176589; Sholazar Basin|River's Heart|190171;190172;189973;190170;191019;189978;189979;189980;189981;191133|189979;189981 +``` + +**Backward compatibility matters here** — a hotspot token with only +`Zone|Area` (no node/bonus segments) should fall back to the existing +global `GoldRush.NodeEntries` pool, exactly as it does today. Don't make +the new segments required; this format needs to keep working for anyone +who hasn't customized it (and for a clean upgrade path if more hotspots +get added later without someone remembering to fill in resources for them +immediately). + +## 3. Code changes + +- **`GoldRushSite` struct** (`GoldRush.cpp:44`): add `std::vector + NodeEntries` and `std::vector BonusEntries`, both defaulting + empty. +- **`BuildSites()`** (`GoldRush.cpp:479`): parse the 3rd and 4th `|`-delimited + segments (if present) through the existing `BuildNodeEntries()` parser, + storing them on the site. +- **`SpawnHotspot()`** (`GoldRush.cpp:919`): currently always builds + `oreEntries`/`herbEntries`/`fallbackEntries` from the global `_nodeEntries`. + Change this to use `_currentSite.NodeEntries` when non-empty, falling back + to the global `_nodeEntries` otherwise — same herb/ore + alternating-selection logic (`SplitByCategory`) already in place, just + fed from the per-site pool instead of always the global one. +- **Bonus node mixing**: in the per-node selection loop (`GoldRush.cpp:949` + onward), give each node spawn attempt a small chance (a new config value, + e.g. `GoldRush.BonusChancePercent`, reasonable default around 10-15%) to + pull from `_currentSite.BonusEntries` instead of the normal herb/ore pool + for that one node — so a Gold Rush event yields mostly zone-appropriate + regular resources with an occasional Black Lotus mixed in, not a + guaranteed one every time (that would undercut its rarity and value). + +## 4. Config parameters from the original request + +Already applied directly on the live server (config-only, no code change +needed for these two): + +``` +GoldRush.SpawnRadiusYards = 75.0 +GoldRush.MinNodes = 20 +GoldRush.MaxNodes = 30 +``` + +No action needed here — mentioned for completeness since this spec +originated from the same conversation as those changes. + +## 5. Testing + +- `.goldrush teststart` while standing in each of the four configured + hotspots — confirm the herb/ore mix that spawns actually matches that + zone's table above, not the old global pool. +- Run enough test events per zone to actually observe a bonus node + appear (given a ~10-15% per-node chance across 20-30 nodes, a bonus + should show up in most single events, but don't rely on exactly one + test run to confirm the feature works — false negatives are likely on + a single low-probability roll). +- Confirm a hotspot token with the old 2-segment `Zone|Area` format (no + node/bonus data) still works and falls back to the global pool — + don't let this become a breaking change for the config format. From d386536d2768593b42337b42392df7be676a38a0 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 4 Sep 2026 20:05:27 +0000 Subject: [PATCH 2/2] 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. --- docs/zone-specific-resources-spec.md | 303 ++++++++++++++++++--------- 1 file changed, 209 insertions(+), 94 deletions(-) diff --git a/docs/zone-specific-resources-spec.md b/docs/zone-specific-resources-spec.md index fe71cf0..18fa7c8 100644 --- a/docs/zone-specific-resources-spec.md +++ b/docs/zone-specific-resources-spec.md @@ -1,117 +1,232 @@ -# Zone-specific resource nodes — implementation spec +# Zone-specific resource nodes — implementation spec (v2: full zone coverage) -Currently `GoldRush.NodeEntries` is one global pool used for every hotspot -regardless of location — an event in Un'Goro Crater and one in Sholazar -Basin draw from the exact same 5 entries. This spec makes node selection -zone-aware: each configured hotspot gets resources that actually belong -there, plus a rare "bonus" node type for extra excitement. - -**Good news for implementation**: the module already tracks which zone/area -an event is anchored to (`GoldRushSite.ZoneLabel`/`ZoneId`/`AreaLabel`) — -this is purely about *using* that existing data to pick node types, not -building zone-tracking from scratch. +**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. --- -## 1. Confirmed real, zone-appropriate resources (verified against the live DB, not guessed) +## 0. Zone list validation — do this before using this spec, not after -Looked up directly against `acore_world.gameobject_template` (`type = 3`, -matching the 5 entries the module already uses) for the four zones -currently in `GoldRush.ZonePool`: +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). -| Hotspot | Herb entries | Ore entries | Bonus entries | +**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 | |---|---|---|---| -| Un'Goro Crater | Firethorn (191303) | Small Thorium Vein (324, 150082, 176643), Rich Thorium Vein (175404) | Black Lotus (176589) | -| Winterspring | Purple Lotus (142140, 180165), Sungrass (142142, 176636, 180164) | Small/Rich Thorium Vein (same as above) | Black Lotus (176589) | -| Eastern Plaguelands | Plaguebloom (176587, 176641), Ghost Mushroom (142144) | Small/Rich Thorium Vein (same as above) | Black Lotus (176589) | -| Sholazar Basin | Lichbloom (190171), Icethorn (190172), Goldclover (189973), Talandra's Rose (190170), Adder's Tongue (191019) | Cobalt Deposit (189978), Rich Cobalt Deposit (189979), Saronite Deposit (189980), Rich Saronite Deposit (189981), Titanium Vein (191133) | *(none needed — this zone's base pool is already top-tier; see note below)* | +| 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 | | | -**Why Black Lotus for the three Classic zones specifically**: it's a real, -accurate spawn zone match — Black Lotus genuinely spawns in Un'Goro Crater, -Winterspring, and Eastern Plaguelands (among a couple others not in our -current hotspot list). It's a legitimately rare, high-value herb, which is -exactly the "couple of higher level ones" feel being asked for — not an -arbitrary reskin. - -**Sholazar's bonus tier**: Sholazar is already the highest-level zone in -the current hotspot list, and its existing default pool (Frost Lotus, -Lichbloom, Icethorn) is already the good stuff. Rather than reaching for -something contextually odd, treat the **Rich** variants of Cobalt/Saronite -as its "bonus" tier — rarer, better-yielding versions of what's already -appropriate there. Simpler and more thematically honest than importing an -unrelated resource into a zone it doesn't belong in. - -**If more hotspots get added to `ZonePool` later**, they'll need the same -kind of real DB lookup before assigning resources — don't extrapolate a -"probably fine" guess from a different zone's list. +### 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. Config format change +## 2. Full `GoldRush.ZonePool` replacement -Extend the existing pipe-delimited `Zone|Area` tokens in `GoldRush.ZonePool` -with two more optional segments — `NodeEntries` and `BonusEntries` — using -the same `;`-separated-entries convention `GoldRush.NodeEntries` already -uses: +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 = Un'Goro Crater|Fire Plume Ridge|191303;324;150082;176643;175404|176589; Winterspring|Frostfire Hot Springs|142140;180165;142142;176636;180164;324;150082;176643;175404|176589; Eastern Plaguelands|Terrorweb Tunnel|176587;176641;142144;324;150082;176643;175404|176589; Sholazar Basin|River's Heart|190171;190172;189973;190170;191019;189978;189979;189980;189981;191133|189979;189981 +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 ``` -**Backward compatibility matters here** — a hotspot token with only -`Zone|Area` (no node/bonus segments) should fall back to the existing -global `GoldRush.NodeEntries` pool, exactly as it does today. Don't make -the new segments required; this format needs to keep working for anyone -who hasn't customized it (and for a clean upgrade path if more hotspots -get added later without someone remembering to fill in resources for them -immediately). +**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. -## 3. Code changes - -- **`GoldRushSite` struct** (`GoldRush.cpp:44`): add `std::vector - NodeEntries` and `std::vector BonusEntries`, both defaulting - empty. -- **`BuildSites()`** (`GoldRush.cpp:479`): parse the 3rd and 4th `|`-delimited - segments (if present) through the existing `BuildNodeEntries()` parser, - storing them on the site. -- **`SpawnHotspot()`** (`GoldRush.cpp:919`): currently always builds - `oreEntries`/`herbEntries`/`fallbackEntries` from the global `_nodeEntries`. - Change this to use `_currentSite.NodeEntries` when non-empty, falling back - to the global `_nodeEntries` otherwise — same herb/ore - alternating-selection logic (`SplitByCategory`) already in place, just - fed from the per-site pool instead of always the global one. -- **Bonus node mixing**: in the per-node selection loop (`GoldRush.cpp:949` - onward), give each node spawn attempt a small chance (a new config value, - e.g. `GoldRush.BonusChancePercent`, reasonable default around 10-15%) to - pull from `_currentSite.BonusEntries` instead of the normal herb/ore pool - for that one node — so a Gold Rush event yields mostly zone-appropriate - regular resources with an occasional Black Lotus mixed in, not a - guaranteed one every time (that would undercut its rarity and value). - -## 4. Config parameters from the original request - -Already applied directly on the live server (config-only, no code change -needed for these two): +
+One zone per line (source of truth for future edits) ``` -GoldRush.SpawnRadiusYards = 75.0 -GoldRush.MinNodes = 20 -GoldRush.MaxNodes = 30 +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 ``` -No action needed here — mentioned for completeness since this spec -originated from the same conversation as those changes. +
-## 5. Testing +--- -- `.goldrush teststart` while standing in each of the four configured - hotspots — confirm the herb/ore mix that spawns actually matches that - zone's table above, not the old global pool. -- Run enough test events per zone to actually observe a bonus node - appear (given a ~10-15% per-node chance across 20-30 nodes, a bonus - should show up in most single events, but don't rely on exactly one - test run to confirm the feature works — false negatives are likely on - a single low-probability roll). -- Confirm a hotspot token with the old 2-segment `Zone|Area` format (no - node/bonus data) still works and falls back to the global pool — - don't let this become a breaking change for the config format. +## 3. Code mechanism (unchanged from v1 — already specced, just restating for completeness) + +- `GoldRushSite` struct (`GoldRush.cpp:44`) needs `std::vector + NodeEntries` and `std::vector 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).