On-disk roots
Defined inGatherer/Navigation.lua (Windows paths, accessed through WGG’s file API):
| Constant | Path | Contents |
|---|---|---|
GATHERER_DATA_ROOT | C:/WGG/scripts/Gatherer | Bundled scripts and routes (route/<name>.json) |
GATHERER_PERSISTENT_DATA_ROOT | C:/WGG/GathererData | User-writable data (e.g. Blacklist.json) |
GATHERER_DEFAULT_ROUTE | — | Core startup fallback: "Daggerspine_Landing" |
GATHERER_DEFAULT_ROUTE is the bot-core startup fallback. :LoadRoute() with no selected gatherer.route falls back to the first scanned route or no route; the local "default" fallback is limited to save helpers such as :SaveWaypoint() / :SaveRoute(). Select a route explicitly before using route actions.
Routes and blacklists are plain JSON files.
Routes
A route is a JSON file atC:/WGG/scripts/Gatherer/route/<name>.json — an ordered list of waypoints (position plus radius) the bot flies while scanning for nodes.
Selecting a route
Pick a route in the settings UI (the dropdown is populated byvolvox.Gatherer:RefreshRoutes(), which scans the route directory). The selection persists as gatherer.route; :LoadRoute(routeName) loads the JSON into the module and bot-core globals.
Recording a route
Name it
Set
gatherer.new_route_name and gatherer.new_route_radius (default 50) in the settings UI. The name field saves when you press Enter or click away; route names are trimmed, cannot contain / \ : * ? " < > |, cannot end with a period, and cannot be Windows reserved device names such as CON, NUL, COM1, or LPT1.Record
Call Start route recording (
:StartRouteRecording()), then fly your loop and add waypoints with Add waypoint (:AddRouteWaypoint()).:SaveWaypoint() append helper does not rewrite a complete JSON document, so it is not the safe path for maintaining route files.
Blacklists and whitelists
Two mechanisms keep the bot away from bad spots:- GUI position blacklist/whitelist —
:BlacklistAdd()/:WhitelistAdd()append the player’s current position (withgatherer.blacklist_radius/gatherer.whitelist_radius) toBlacklist.json/Whitelist.jsonunderC:/WGG/scripts/Gatherer. - Persistent automatic blacklist — lower-level runtime helpers write automatic blacklist positions under
C:/WGG/GathererData. - GUID blacklist —
:BlacklistCurrentTargetGUID()blacklists a specific node object by GUID.
Node databases
Static node data lives inGatherer/NodeData.lua, sliced from Data.lua:
KPNodeIDs— knowledge-point node IDs.- Per-expansion node databases — tables named
VANILthroughMID(Vanilla through Midnight) mapping node GameObject IDs per expansion. - Area/traceline flag masks used by node reachability checks.
Rich Soil and Resilient Seeds
Rich Soil seed planting is part of the Midnight herbalism data inGatherer/Data.lua and Gatherer/GatherLogic.lua:
GathererRichSoilIDscontains Rich Soil (524808).GathererResilientSeedItemIDscontains the supported Resilient Seed item IDs (237497–237500).GathererItemCount()prefersC_Item.GetItemCountand falls back to legacyGetItemCountso Midnight clients without the global can still detect seeds.GathererUseItemFromBags()(inGatherer/Core.lua) plants the seed by locating the item in the player’s bags and using that exact container slot viaC_Container.UseContainerItem— the same as the player right-clicking it in the backpack — falling back to use-by-ID only when the bag scan fails.- When
gatherer.plant_resilient_seedis enabled, the character has Herbalism, and a seed is available, Rich Soil bypasses ordinary node-ignore/gather-skip filters soSEEDPLANTcan plant the seed and wait for the spawned herb.
NodeData.lua. volvox.Gatherer:ApplyExpansion(expansion) points the active node database globals at the expansion tables.
Every numeric game ID (GameObject, item, spell, NPC) comes from Wowhead and is recorded in code with a comment naming the entity.
.png?fit=max&auto=format&n=yZatCT6YQ7S22QWv&q=85&s=bb502db827d4362d1268445c3b70d21d)