mod-gold-rush/CHANGELOG.md
Troll (Hermes Agent) 5ffac92934 fix: zone pool parser truncated every zone to its first entry
GoldRush.ZonePool separates zones with '; ' (semicolon + space) but the
node/bonus entry IDs within a zone with a bare ';'. BuildSites() split on
the bare ';', so each zone's entry list was cut down to its first ID --
which is always a herb. That is why events spawned a single wrong-zone
herb and no ore at all (PR #8).

Split on the two-character '; ' zone delimiter instead, so every zone
keeps its full node and bonus pools.
2026-09-10 02:15:44 +00:00

5.7 KiB

Changelog

All notable changes to mod-gold-rush will be documented in this file.

[Unreleased — hallsworth fork]

Added

  • Per-zone resource nodes. GoldRush.ZonePool entries can now carry their own node and bonus pools (ZoneName|NodeEntries|BonusEntries) instead of every hotspot drawing from one global list -- an event in Un'Goro spawns Un'Goro- appropriate herbs/ore, Sholazar spawns Northrend resources, etc. gold_rush.conf.dist ships with all ~57 valid WotLK 3.3.5a open-world zones pre-populated (see docs/zone-specific-resources-spec.md for how each zone's resource list was derived and verified). New GoldRush.BonusChancePercent (default 15) config controls how often a spawn pulls from a zone's rarer bonus pool instead of its normal one. A zone left without node/bonus data still falls back to the global GoldRush.NodeEntries pool exactly as before.

Fixed

  • Zone pool parsing no longer truncates every zone to its first resource entry. GoldRush.ZonePool separates zones with "; " (semicolon + space) but the node/bonus entry IDs within a zone with a bare ";". BuildSites() split on the bare ";", so each zone's entry list was cut down to its first ID — which is always a herb. That is why events spawned a single wrong-zone herb and no ore at all (reported in PR #8). The parser now splits on the two-character "; " zone delimiter, so every zone keeps its full node and bonus pools.
  • Herb/ore categorization no longer guesses from display-name keywords. The old SplitByCategory() matched "lotus"/"clover"/"thorn"/"bloom" for herbs and "vein" for ore, which only worked for the original Northrend default pool and silently fell back to the unsplit pool for almost every v2 zone (Outland/Classic ore uses "Deposit", not "Vein"; most herb names match no keyword). Replaced with a static ID→category lookup table built from the DB-verified entry IDs in docs/zone-specific-resources-spec.md, with the old keyword check retained only as a fallback for entries not in the table. See docs/herb-ore-category-fix-spec.md.
  • Event start/end announcements no longer crash the server. StartEvent() and EndEvent() both used ChatHandler(nullptr).SendWorldText(...) to broadcast server-wide -- ChatHandler::SendWorldText assumes a real session and calls GetSession()->SendPacket() unconditionally, so a null session was an immediate null-pointer crash. Confirmed via a symbolized backtrace against a captured coredump on the live server (two crashes within ~24h). Replaced with sWorldSessionMgr->SendServerMessage(SERVER_MSG_STRING, text), the session-free broadcast path the built-in .announce GM command uses.
  • Bot routing is no longer a silent no-op. Engine::ChangeStrategy dispatches on the first character of the strategy name and ignores anything without a +/-/~/? prefix, so the bare "new rpg" calls did nothing. Now sends "+new rpg", and only to the non-combat engine, which is the only engine AiFactory ever adds it to.
  • Temporary node lifetime is no longer 1000x too long. The respawnTime argument to Map::SummonGameObject reaches GameObject::SetRespawnTime(int32), which is in seconds; the module was passing milliseconds, turning a 20-minute event into a ~14-day one. Nodes never expired on their own.
  • A config reload during a live event no longer orphans its gameobjects. LoadConfig cleared the tracked node list without despawning, leaving nodes in the world with nothing left to remove them.
  • Nodes are placed on real ground. Spawns previously reused the anchor's exact Z for every scattered X/Y, so on sloped terrain they floated or sank. Placement now probes ground height, rejects cliffs and lower floors, requires line of sight to the anchor, and retries a few times before giving up on a node.

Added

  • GoldRush.RetryMinutes (default 5), GoldRush.GraceMinutes (default 15) and GoldRush.MinPlayersOnline (default 1).

Changed

  • The scheduler no longer collapses to a fixed retry poll on an empty server. Previously every failed attempt overwrote the rolled Min/MaxInterval with a hard-coded 5 minutes and stayed there, so the first player to log in got an event announced on top of them within one retry window. It now holds while the world is below MinPlayersOnline, and waits GraceMinutes once the world repopulates before running. GM-forced starts (.goldrush start / teststart) bypass both checks.
  • Node scatter uses a square-root radius so points spread evenly across the disc instead of bunching near the anchor.
  • DespawnHotspotNodes resolves the map once instead of per node, and warns if the map cannot be resolved.
  • Dropped the redundant SetRespawnTime / SetSpawnedByDefault calls after Map::SummonGameObject, which already does both.

[Unreleased]

Added

  • Standalone repository documentation in README.md.
  • Initial CHANGELOG.md for tracking module releases.
  • Clear documentation that mod-playerbots is a required dependency.
  • Added a compatibility section describing the AzerothCore + Playerbots expectations for this module.

Changed

  • Loosened Gold Rush hotspot selection so events can fall back to eligible live-player zones when configured hotspots are unavailable.
  • Improved GM messaging for zone eligibility failures.
  • Allowed zone-based fallback when an exact configured sub-area anchor is not available.

Fixed

  • Fixed GoldRush.NodeEntries parsing so configured node IDs are actually loaded from gold_rush.conf.
  • Fixed startup behavior where Gold Rush could appear to have no valid node entries even when configuration values were present.
  • Fixed teststart and scheduler flows that were overly strict about allowed zones.