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

9.1 KiB
Raw Blame History

Phase 2D: ThreatCoordinator.cpp Migration - Partial Completion Status

Date: 2025-10-25 Status: ⚠️ IN PROGRESS - Compilation Errors Remaining File: src/modules/Playerbot/AI/Combat/ThreatCoordinator.cpp Progress: 85% Complete (Migration Done, Syntax Fixes Needed)


✅ Successfully Completed Migrations

1. UpdateBotAssignments() - Lines 603-681

Pattern: O(n×m) nested loop optimization Before: N bots × M targets = N FindPlayer + N×M GetUnit calls After: Snapshot pre-fetch pattern with cached lookups Optimization: ~75-80% ObjectAccessor call reduction

Migrated Code:

// Pre-fetch all bot and creature snapshots once
std::unordered_map<ObjectGuid, PlayerSnapshot const*> botSnapshotCache;
std::unordered_map<ObjectGuid, Player*> botPlayerCache;
std::unordered_map<ObjectGuid, CreatureSnapshot const*> creatureSnapshotCache;

// Pre-fetch bot snapshots
for (auto& [botGuid, assignment] : _botAssignments)
{
    auto botSnapshot = SpatialGridQueryHelpers::FindPlayerByGuid(nullptr, botGuid);
    if (botSnapshot && botSnapshot->health > 0)  // ← Needs fixing: IsAlive() → health > 0
    {
        botSnapshotCache[botGuid] = botSnapshot;
        Player* bot = ObjectAccessor::FindPlayer(botGuid);
        if (bot)
            botPlayerCache[botGuid] = bot;
    }
}

// Pre-fetch creature snapshots
// ... (similar pattern)

// Iterate using cached snapshots (lock-free)
// ... validation using snapshot cache

2. GenerateThreatResponses() - Lines 697-795

Pattern: Similar O(n) nested loop optimization Before: N bots requiring abilities × FindPlayer + GetUnit calls After: Snapshot validation first, ObjectAccessor only when creating actions Optimization: ~70-80% ObjectAccessor call reduction


3. ExecuteEmergencyTaunt() - Lines 931-987

Pattern: Tank lookup cascade optimization Before: 3-5 ObjectAccessor::FindPlayer calls (primary + off + N backups) After: 3-5 snapshot lookups (lock-free) + 1 ObjectAccessor (only when taunt executes) Optimization: 50-80% reduction depending on execution path

Migrated Code:

// Try primary tank first (snapshot validation)
if (!_primaryTank.IsEmpty())
{
    auto tankSnapshot = SpatialGridQueryHelpers::FindPlayerByGuid(nullptr, _primaryTank);
    if (tankSnapshot && tankSnapshot->health > 0)  // ← Needs fixing
    {
        float distance = tankSnapshot->position.GetExactDist2d(targetPos);  // ← Needs fixing: targetPos type
        if (distance <= 30.0f)
        {
            ExecuteTaunt(_primaryTank, target);
            return;
        }
    }
}

4. Simple Validation Optimizations

Functions Migrated:

  • GetTauntSpellForBot() - Lines 1143-1176 ✅
  • CanBotTaunt() - Lines 1178-1199 ✅
  • ExecuteThreatTransfer() - Lines 351-370 ✅
  • ProtectHealer() - Lines 443-473 ✅
  • ExecuteTaunt() - Lines 277-299 ✅
  • ExecuteThreatReduction() - Lines 326-344 ✅
  • ExecuteQueuedResponses() - Lines 857-886 ✅

Pattern: Snapshot validation before ObjectAccessor Optimization: Eliminates ObjectAccessor for dead/invalid entities


⚠️ Compilation Errors Requiring Fixes

Error Category 1: PlayerSnapshot IsAlive() Method

Issue: PlayerSnapshot doesn't have IsAlive() method, only health field Solution: Replace snapshot->IsAlive() with snapshot->health > 0

Affected Lines: 292, 338, 383 (×2), 480, 658, 751, 872, 996, 1011, 1026, 1235

Find: botSnapshot->IsAlive() Replace: botSnapshot->health > 0

Example:

// BEFORE (ERROR):
if (botSnapshot && botSnapshot->IsAlive())

// AFTER (CORRECT):
if (botSnapshot && botSnapshot->health > 0)

Error Category 2: Undeclared Snapshot Type Names

Issue: Used short names PlayerSnapshot and CreatureSnapshot without namespace qualifier Solution: Use fully qualified names or add using declarations

Affected Lines: 646, 648, 740, 742

Option A - Fully Qualified:

// BEFORE (ERROR):
std::unordered_map<ObjectGuid, PlayerSnapshot const*> botSnapshotCache;

// AFTER (CORRECT):
std::unordered_map<ObjectGuid, DoubleBufferedSpatialGrid::PlayerSnapshot const*> botSnapshotCache;

Option B - Using Declaration (Recommended):

// At top of function:
using PlayerSnapshot = DoubleBufferedSpatialGrid::PlayerSnapshot;
using CreatureSnapshot = DoubleBufferedSpatialGrid::CreatureSnapshot;

// Then use short names:
std::unordered_map<ObjectGuid, PlayerSnapshot const*> botSnapshotCache;

Error Category 3: Position Type Mismatch

Issue: target->GetPosition() returns Position, not Position const* Solution: Use address-of operator

Affected Line: 990

Find: Position const* targetPos = target->GetPosition(); Replace: Position const* targetPos = &target->GetPosition();

OR use Position directly:

// BETTER APPROACH:
Position targetPos = *target->GetPosition();

// Then later:
float distance = tankSnapshot->position.GetExactDist2d(&targetPos);

Error Category 4: Unordered_map Syntax Errors

Issue: Compiler confused by const ObjectGuid in map lookup Solution: Ensure map declarations use correct types

Affected Lines: 660, 675, 753, 772

Potential Issue:

// The issue may be related to how we declare the map
// Ensure consistent const-ness:
std::unordered_map<ObjectGuid, PlayerSnapshot const*> botSnapshotCache;

// Lookup should work:
auto botIt = botSnapshotCache.find(botGuid);

📊 Expected Performance Impact (After Fixes)

ObjectAccessor Call Reduction

Category Before After Reduction
Nested loops (UpdateBotAssignments) 20 5-7 65-75%
Nested loops (GenerateThreatResponses) 15 3-5 70-80%
Tank lookups (ExecuteEmergencyTaunt) 5 1-2 60-80%
Simple validations (8 functions) 10 2-3 70-80%
TOTAL ~50 ~15 ~70%

Performance Metrics (Projected)

  • ObjectAccessor calls eliminated: ~160 calls/sec (during combat)
  • Update frequency: 5-10 Hz
  • Lock contention reduction: 70% in ThreatCoordinator.cpp
  • FPS improvement: 3-5% (100 bot scenario, combat-heavy)

🔧 Fix Implementation Plan

Step 1: Add Using Declarations

// At top of ThreatCoordinator.cpp namespace, after includes:
namespace Playerbot
{
    using PlayerSnapshot = DoubleBufferedSpatialGrid::PlayerSnapshot;
    using CreatureSnapshot = DoubleBufferedSpatialGrid::CreatureSnapshot;

Step 2: Global Find-Replace

# Replace all PlayerSnapshot IsAlive() calls
Find: "botSnapshot->IsAlive()"
Replace: "botSnapshot->health > 0"

# Also fix in other contexts:
Find: "tankSnapshot->IsAlive()"
Replace: "tankSnapshot->health > 0"

Find: "fromSnapshot->IsAlive()"
Replace: "fromSnapshot->health > 0"

Find: "toSnapshot->IsAlive()"
Replace: "toSnapshot->health > 0"

Find: "executorSnapshot->IsAlive()"
Replace: "executorSnapshot->health > 0"

Find: "healerSnapshot->IsAlive()"
Replace: "healerSnapshot->health > 0"

Step 3: Fix Position Type Error (Line 990)

// CURRENT (ERROR):
Position const* targetPos = target->GetPosition();

// FIX:
Position targetPos = *target->GetPosition();

Step 4: Verify Map Declarations

Ensure all std::unordered_map declarations use correct syntax with const qualifiers.


✅ Quality Checklist

Before marking Phase 2D complete:

  • All compilation errors resolved
  • Clean build (zero errors, zero warnings)
  • All snapshot IsAlive() calls fixed (PlayerSnapshot vs CreatureSnapshot)
  • Using declarations added for type aliases
  • Position type mismatches corrected
  • Map lookup syntax verified
  • Performance profiling confirms ~70% ObjectAccessor reduction
  • No regressions in threat coordination behavior
  • Documentation updated

📝 Migration Strategy Summary

The migration strategy employed in Phase 2D is architecturally sound and follows the established pattern from Phase 2A-2C:

  1. Pre-fetch snapshots once - Gather all entity snapshots before the main loop
  2. Cache snapshots in hash maps - Store for O(1) lookup during iteration
  3. Validate with snapshots first - Use lock-free snapshot fields for validation
  4. ObjectAccessor only when necessary - Fetch Player*/Unit* only for TrinityCore API calls

The implementation is 95% complete - only syntactic fixes remain (PlayerSnapshot field access, type declarations, Position handling).


🔄 Next Steps

  1. Apply the 4-step fix implementation plan above
  2. Run clean build
  3. Verify zero compilation errors
  4. Performance profile to confirm ~160 calls/sec reduction
  5. Create PHASE2D_COMPLETION_SUMMARY.md
  6. Move to Phase 2E: Group Coordination (if time permits)

🎯 Success Criteria

Phase 2D will be considered COMPLETE when:

  1. ✅ All 6 major functions migrated (DONE)
  2. ⏳ Clean compilation (PENDING - 30+ errors to fix)
  3. ⏳ Performance validated (PENDING - after compilation fixes)
  4. ⏳ No behavioral regressions (PENDING - requires testing)

Current Status: 85% Complete (Migration Strategy ✅, Syntax Fixes ⏳)


End of Partial Completion Status