Four defects found reviewing this against AzerothCore efe123fab and
mod-playerbots 8d9f6aa6 (both 2026-08-14).
1. Bot routing did nothing. Engine::ChangeStrategy switches on name[0] and
only handles '+', '-', '~' and '?'; a bare "new rpg" fell through every
case. Bots still drifted toward the hotspot, but only because
rpgInfo.ChangeToGoGrind() works and AiFactory already grants the strategy
when AiPlayerbot.EnableNewRpgStrategy is on. Now sends "+new rpg", and
only to BOT_STATE_NON_COMBAT -- the combat engine never carries it.
2. Node lifetime was off by 1000x. The respawnTime argument to
Map::SummonGameObject lands in GameObject::SetRespawnTime(int32), which is
seconds. Passing DurationMs made a 20-minute event's nodes live ~13.9 days,
so they only ever vanished via the explicit despawn at event end.
3. LoadConfig cleared _spawnedNodes and _active without despawning, so a
`.reload config` mid-event orphaned every node permanently (compounded by
defect 2). It now tears the running event down first.
4. Spawns reused the anchor's exact Z for every scattered X/Y with no ground
probe and no LOS check, leaving nodes floating or buried on the hilly zones
in the default pool. Placement now probes ground height, rejects drift
beyond 20y, requires LOS from the anchor, and retries up to 8 times.
Verified with a clang -fsyntax-only pass using the live build's own compile
flags plus the mod-playerbots include tree.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019vTNrJGsprcjdjjjDJD5ZM