Files
ThordekkCore/MIGRATION_EXECUTION_PLAN.md
T
2026-01-20 21:33:16 -03:00

5.8 KiB

LOCK-FREE MIGRATION EXECUTION PLAN

Status: IN PROGRESS - Overnight One-Shot Approach: Systematic file-by-file migration, compile at end


EXECUTION STRATEGY

Phase 2: Remove all 135 ObjectAccessor fallbacks Phase 3: Complete all 40 unmigrated Cell::Visit calls Total: 175 locations across 32 files


COMMON MIGRATION PATTERNS

Pattern 1: Remove ObjectAccessor Fallback (Most Common - 135 instances)

BEFORE:

auto snapshot = SpatialGridQueryHelpers::FindCreatureByGuid(_bot, guid);
if (!snapshot || !snapshot->IsAlive())
    continue;

Unit* target = ObjectAccessor::GetUnit(*_bot, guid);  // ❌ REMOVE
if (!target)
    continue;

DoSomethingWithPointer(target);  // ❌ Change to use snapshot

AFTER:

auto snapshot = SpatialGridQueryHelpers::FindCreatureByGuid(_bot, guid);
if (!snapshot || !snapshot->isAlive)
    continue;

// Use snapshot data directly - NO pointer needed!
DoSomethingWithSnapshot(*snapshot);  // ✅ Or queue action with GUID

Pattern 2: Replace Cell::Visit (40 instances)

BEFORE:

std::vector<::Unit*> GetNearbyEnemies(float range) const
{
    std::vector<::Unit*> enemies;
    Trinity::AnyUnfriendlyUnitInObjectRangeCheck checker(_bot, range);
    Trinity::UnitListSearcher searcher(_bot, enemies, checker);
    // DEADLOCK FIX: Use lock-free spatial grid ❌ NOT DONE!
    Cell::VisitGridObjects(_bot, searcher, range);
    return enemies;
}

AFTER:

std::vector<ObjectGuid> GetNearbyEnemyGuids(float range) const
{
    std::vector<ObjectGuid> enemyGuids;

    auto grid = sSpatialGridManager.GetGrid(_bot->GetMap());
    if (!grid) return enemyGuids;

    auto creatures = grid->QueryNearbyCreatures(_bot->GetPosition(), range);
    for (auto const& snapshot : creatures) {
        if (snapshot.isAlive && snapshot.isHostile)
            enemyGuids.push_back(snapshot.guid);
    }
    return enemyGuids;  // ✅ GUIDs only
}

Pattern 3: Convert Direct API Calls to Actions

BEFORE:

Unit* target = ObjectAccessor::GetUnit(*_bot, guid);
if (target && target->IsAlive()) {
    _bot->CastSpell(target, spellId, false);  // ❌ Direct call
}

AFTER:

auto snapshot = spatialGrid->QueryCreatureByGuid(guid);
if (snapshot && snapshot->isAlive) {
    sBotActionMgr->QueueAction(
        BotAction::CastSpell(_bot->GetGUID(), spellId, guid, getMSTime()));
}

FILE-BY-FILE EXECUTION ORDER

PRIORITY 1: Combat-Critical (4 files, 27 calls)

1. BotThreatManager.cpp (9 ObjectAccessor calls)

Lines to fix: 273, 393, 399, 453, 544, 569, 825 Changes:

  • Remove all ObjectAccessor::GetUnit fallbacks after snapshot validation
  • Change ThreatTarget struct to store ObjectGuid instead of Unit*
  • Update AnalyzeTargetThreat to work with snapshots
  • Convert threat-based actions to action queue

Estimated LOC: ~50 lines changed

2. TargetSelector.cpp (8 ObjectAccessor calls)

Lines to fix: 479, 517, 831, 862 Changes:

  • Remove ObjectAccessor fallbacks in GetNearbyEnemies/Allies
  • Change return types to std::vector
  • Update all callers

Estimated LOC: ~40 lines changed

3. InterruptRotationManager.cpp (6 ObjectAccessor calls)

Lines to fix: 360, 690, 692, 875 Changes:

  • Remove fallbacks in interrupt target validation
  • Use snapshot data for interrupt decisions
  • Queue interrupt actions instead of direct casts

Estimated LOC: ~30 lines changed

4. AoEDecisionManager.cpp (4 ObjectAccessor calls)

Lines to fix: 238, 559, 669 Changes:

  • Remove fallbacks in AoE target counting
  • Use snapshot collections for target validation

Estimated LOC: ~25 lines changed

PRIORITY 2: Class AI (35 calls across 4 files)

5. ShamanAI.cpp (19 ObjectAccessor calls)

Unmigrated Cell calls: Lines 754, 1319, 1822, 1951, 2051 Fallback calls: Lines 781, 787, 1114, 1147, 1346, 1352, 1469, 1620, 1811, 1849, 1855, 1876, 1978, 1984, 2001, 2078, 2084, 2673

Changes:

  • Replace 5 Cell::Visit calls with spatial grid queries
  • Remove 14 ObjectAccessor fallbacks
  • Convert spell casts to action queue

Estimated LOC: ~100 lines changed

6-9. MonkAI.cpp, PaladinAI.cpp, HunterAI.cpp (16 calls total)

Similar patterns to Shaman

Estimated LOC: ~80 lines changed combined

PRIORITY 3: Combat Support (20 calls across 8 files)

10-17. Various combat behavior files

DefensiveBehaviorManager, DispelCoordinator, CombatStateAnalyzer, etc.

Estimated LOC: ~100 lines changed combined

PRIORITY 4: Complete Unmigrated (remaining Cell::Visit calls)

18-32. Complete all remaining files with "DEADLOCK FIX" comments

Files:

  • CombatSpecializationBase.cpp
  • All remaining class AI files
  • Combat utility files
  • Strategy files

Estimated LOC: ~150 lines changed combined


TOTAL ESTIMATED CHANGES

Files Modified: 32 Lines Changed: ~575 lines New Lines Added: ~200 lines (snapshot handling) Lines Removed: ~375 lines (ObjectAccessor calls, Cell visitors)


VERIFICATION STEPS (After All Changes)

  1. Compile:

    cd build && cmake --build . --config RelWithDebInfo --target worldserver -j8
    
  2. Grep Verification:

    # Should return 0 (except BotActionProcessor which is safe)
    grep -rn "ObjectAccessor::Get" src/modules/Playerbot/AI/ --include="*.cpp" \
      | grep -v "BotActionProcessor" | grep -v "// SAFE:" | wc -l
    
    # Should return 0
    grep -rn "Cell::Visit" src/modules/Playerbot/AI/ --include="*.cpp" | wc -l
    
  3. Fix Compilation Errors:

    • Address any ThreatTarget struct signature changes
    • Fix method return type mismatches
    • Add missing includes for BotActionManager

STARTING EXECUTION NOW

Current Time: Beginning overnight migration run Expected Completion: All 32 files migrated, ready for compilation