447 lines
13 KiB
Markdown
447 lines
13 KiB
Markdown
# Phase 6: Equipment, Mount, and Battle Pet Management - Per-Bot Instance Pattern
|
|
|
|
**Status**: 📋 **PLANNED**
|
|
**Date**: 2025-11-18
|
|
**Branch**: `claude/playerbot-cleanup-analysis-01CcHSnAWQM7W9zVeUuJMF4h`
|
|
|
|
---
|
|
|
|
## Executive Summary
|
|
|
|
Phase 6 continues the architectural transformation from Phases 4 and 5, converting 3 additional manager systems to per-bot instances integrated into GameSystemsManager. This phase targets **equipment, mount, and battle pet management** systems with clear per-bot state.
|
|
|
|
### Scope
|
|
|
|
- **Managers to Convert**: 3 (EquipmentManager, MountManager, BattlePetManager)
|
|
- **Estimated Lines**: ~3,500 across 18 files
|
|
- **New Managers in GameSystemsManager**: 23 → 26
|
|
- **Pattern**: Singleton → Per-Bot Instance (established in Phases 4 & 5)
|
|
|
|
---
|
|
|
|
## Architecture Analysis
|
|
|
|
### Current State (Post Phase 5.2)
|
|
|
|
**GameSystemsManager**: 23 managers
|
|
- Phase 4: 3 bridges (GatheringMaterialsBridge, AuctionMaterialsBridge, ProfessionAuctionBridge)
|
|
- Phase 5.1: BankingManager
|
|
- Phase 5.2: FarmingCoordinator
|
|
|
|
### Phase 6 Candidates Analysis
|
|
|
|
#### 1. EquipmentManager ⭐⭐⭐⭐ (HIGH PRIORITY - 24th Manager)
|
|
|
|
**Current Implementation**:
|
|
```cpp
|
|
class EquipmentManager {
|
|
static EquipmentManager* instance();
|
|
|
|
// Per-player data structures
|
|
std::unordered_map<uint32, EquipmentProfile> _equipmentProfiles;
|
|
std::unordered_map<uint32, EquipmentMetrics> _equipmentMetrics;
|
|
std::unordered_map<uint32, std::vector<EquipmentRecommendation>> _recommendations;
|
|
std::mutex _mutex;
|
|
};
|
|
```
|
|
|
|
**Why High Priority?**:
|
|
1. **Clear Per-Bot State**: Equipment preferences, gear scoring, auto-equip rules
|
|
2. **Frequent Updates**: Auto-equip checks every 10 seconds (high contention)
|
|
3. **Integration Points**: Uses stat weights from class/spec systems
|
|
4. **Performance Impact**: Mutex contention with 100+ bots checking gear constantly
|
|
|
|
**Estimated Complexity**: Medium
|
|
**Estimated Time**: 3-4 hours
|
|
**File Count**: ~6-8 files
|
|
|
|
---
|
|
|
|
#### 2. MountManager ⭐⭐⭐ (MEDIUM PRIORITY - 25th Manager)
|
|
|
|
**Current Implementation**:
|
|
```cpp
|
|
class MountManager {
|
|
static MountManager* instance();
|
|
|
|
// Per-player data structures
|
|
std::unordered_map<uint32, MountPreferences> _mountPreferences;
|
|
std::unordered_map<uint32, std::set<uint32>> _collectedMounts;
|
|
std::unordered_map<uint32, MountUsageStats> _usageStats;
|
|
std::mutex _mutex;
|
|
};
|
|
```
|
|
|
|
**Why Medium Priority?**:
|
|
1. **Clear Per-Bot State**: Mount preferences, collection tracking
|
|
2. **Moderate Updates**: Called on zone changes, combat state changes
|
|
3. **Integration Points**: Zone detection, speed buffs, flying vs ground logic
|
|
4. **Lower Contention**: Less frequent than equipment checks
|
|
|
|
**Estimated Complexity**: Low-Medium
|
|
**Estimated Time**: 2-3 hours
|
|
**File Count**: ~4-6 files
|
|
|
|
---
|
|
|
|
#### 3. BattlePetManager ⭐⭐⭐ (MEDIUM PRIORITY - 26th Manager)
|
|
|
|
**Current Implementation**:
|
|
```cpp
|
|
class BattlePetManager {
|
|
static BattlePetManager* instance();
|
|
|
|
// Per-player data structures
|
|
std::unordered_map<uint32, BattlePetCollection> _petCollections;
|
|
std::unordered_map<uint32, BattlePetTeam> _activeTeams;
|
|
std::unordered_map<uint32, BattlePetStats> _battleStats;
|
|
std::mutex _mutex;
|
|
};
|
|
```
|
|
|
|
**Why Medium Priority?**:
|
|
1. **Clear Per-Bot State**: Pet collection, team composition, battle stats
|
|
2. **Infrequent Updates**: Only active during pet battles
|
|
3. **Optional System**: Not all bots use battle pets
|
|
4. **Lower Impact**: Minimal performance impact on main gameplay
|
|
|
|
**Estimated Complexity**: Low-Medium
|
|
**Estimated Time**: 2-3 hours
|
|
**File Count**: ~4-6 files
|
|
|
|
---
|
|
|
|
## Phase 6 Execution Plan
|
|
|
|
### Phase 6.1: EquipmentManager (24th Manager)
|
|
|
|
**Priority**: ★★★★ (Highest)
|
|
|
|
#### EquipmentManager Statistics
|
|
|
|
**Files**:
|
|
- `src/modules/Playerbot/Equipment/EquipmentManager.h` (~600 lines estimated)
|
|
- `src/modules/Playerbot/Equipment/EquipmentManager.cpp` (~1,200 lines estimated)
|
|
|
|
**Public Methods**: ~30 methods (all take Player* parameter)
|
|
|
|
**Key Features**:
|
|
- Gear scoring and evaluation (stat weights per class/spec)
|
|
- Auto-equip best gear (triggered periodically)
|
|
- Equipment recommendations
|
|
- Item comparison and upgrades
|
|
- Durability monitoring
|
|
- Equipment set bonuses
|
|
|
|
#### Conversion Steps
|
|
|
|
1. **Header Refactoring** (`EquipmentManager.h`):
|
|
- Remove `static instance()` method
|
|
- Add `explicit EquipmentManager(Player* bot);`
|
|
- Add `~EquipmentManager();` destructor
|
|
- Remove `Player*` parameters from all ~30 methods
|
|
- Convert data structures:
|
|
```cpp
|
|
// BEFORE
|
|
std::unordered_map<uint32, EquipmentProfile> _equipmentProfiles;
|
|
std::unordered_map<uint32, EquipmentMetrics> _equipmentMetrics;
|
|
|
|
// AFTER
|
|
EquipmentProfile _profile;
|
|
EquipmentMetrics _metrics;
|
|
```
|
|
- Keep shared data static:
|
|
```cpp
|
|
static std::unordered_map<uint8, StatWeights> _classStatWeights; // Class defaults
|
|
static std::unordered_map<uint8, StatWeights> _specStatWeights; // Spec defaults
|
|
static bool _statWeightsInitialized;
|
|
```
|
|
|
|
2. **Implementation Refactoring** (`EquipmentManager.cpp`):
|
|
- Implement static member initialization
|
|
- Implement per-bot constructor/destructor
|
|
- Refactor all methods to use `_bot` member
|
|
- Remove mutex locking (100% elimination)
|
|
- Load stat weights once (shared across all bots)
|
|
|
|
3. **GameSystemsManager Integration**:
|
|
- Update `GameSystemsManager.h`:
|
|
- Add `#include "Equipment/EquipmentManager.h"`
|
|
- Add `EquipmentManager* GetEquipmentManager() const`
|
|
- Add `std::unique_ptr<EquipmentManager> _equipmentManager;`
|
|
- Update `GameSystemsManager.cpp`:
|
|
- Constructor: `_equipmentManager = std::make_unique<EquipmentManager>(_bot);`
|
|
- Initialize: `_equipmentManager->Initialize();`
|
|
- Update: `_equipmentManager->Update(diff);`
|
|
- Destructor: `_equipmentManager.reset();`
|
|
|
|
4. **Legacy Cleanup**:
|
|
- Remove singleton calls from `GameSystemsManager.cpp` (current auto-equip logic)
|
|
- Update any direct `EquipmentManager::instance()` calls
|
|
|
|
---
|
|
|
|
### Phase 6.2: MountManager (25th Manager)
|
|
|
|
**Priority**: ★★★ (Medium)
|
|
|
|
#### MountManager Statistics
|
|
|
|
**Files**:
|
|
- `src/modules/Playerbot/Mounts/MountManager.h` (~400 lines estimated)
|
|
- `src/modules/Playerbot/Mounts/MountManager.cpp` (~800 lines estimated)
|
|
|
|
**Public Methods**: ~20 methods
|
|
|
|
**Key Features**:
|
|
- Mount selection based on zone (flying vs ground)
|
|
- Mount speed optimization
|
|
- Combat dismount handling
|
|
- Mount collection tracking
|
|
- Preference management
|
|
|
|
#### Conversion Steps
|
|
|
|
Follow same pattern as EquipmentManager:
|
|
1. Remove singleton, add per-bot constructor
|
|
2. Convert maps to direct members
|
|
3. Remove Player* parameters
|
|
4. Add static shared data (mount database, speed tables)
|
|
5. Integrate with GameSystemsManager
|
|
|
|
---
|
|
|
|
### Phase 6.3: BattlePetManager (26th Manager)
|
|
|
|
**Priority**: ★★★ (Medium)
|
|
|
|
#### BattlePetManager Statistics
|
|
|
|
**Files**:
|
|
- `src/modules/Playerbot/BattlePets/BattlePetManager.h` (~500 lines estimated)
|
|
- `src/modules/Playerbot/BattlePets/BattlePetManager.cpp` (~1,000 lines estimated)
|
|
|
|
**Public Methods**: ~25 methods
|
|
|
|
**Key Features**:
|
|
- Pet collection management
|
|
- Battle team composition
|
|
- Pet leveling automation
|
|
- Battle AI (move selection)
|
|
- Pet capture logic
|
|
|
|
#### Conversion Steps
|
|
|
|
Follow same pattern:
|
|
1. Remove singleton, add per-bot constructor
|
|
2. Convert maps to direct members
|
|
3. Remove Player* parameters
|
|
4. Add static shared data (pet database, ability data)
|
|
5. Integrate with GameSystemsManager
|
|
|
|
---
|
|
|
|
## Established Patterns (From Phases 4 & 5)
|
|
|
|
### 1. Singleton → Per-Bot Transformation Pattern
|
|
|
|
```cpp
|
|
// STEP 1: Remove singleton
|
|
- static Manager* instance();
|
|
+ explicit Manager(Player* bot);
|
|
+ ~Manager();
|
|
|
|
// STEP 2: Convert data structures
|
|
- std::unordered_map<playerGuid, T> _playerData;
|
|
+ T _data; // Direct member
|
|
|
|
// STEP 3: Update method signatures
|
|
- void Method(Player* player, ...);
|
|
+ void Method(...); // Use _bot instead
|
|
|
|
// STEP 4: Add static shared data
|
|
+ static SharedData _sharedData;
|
|
+ static bool _sharedDataInitialized;
|
|
|
|
// STEP 5: Remove mutex (per-bot isolation)
|
|
- std::mutex _mutex;
|
|
- std::lock_guard<std::mutex> lock(_mutex);
|
|
```
|
|
|
|
### 2. GameSystemsManager Integration Pattern
|
|
|
|
```cpp
|
|
// Header (.h)
|
|
#include "Path/ManagerName.h"
|
|
ManagerName* GetManagerName() const { return _managerName.get(); }
|
|
std::unique_ptr<ManagerName> _managerName;
|
|
|
|
// Constructor (.cpp)
|
|
_managerName = std::make_unique<ManagerName>(_bot);
|
|
|
|
// Initialize
|
|
if (_managerName)
|
|
{
|
|
_managerName->Initialize();
|
|
TC_LOG_INFO("...", "ManagerName initialized");
|
|
}
|
|
|
|
// Update
|
|
if (_managerName)
|
|
_managerName->Update(diff);
|
|
|
|
// Destructor (explicit ordering)
|
|
if (_managerName)
|
|
{
|
|
TC_LOG_DEBUG("...", "Destroying ManagerName");
|
|
_managerName.reset();
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Performance Improvements Expected
|
|
|
|
### Per Manager
|
|
|
|
| Manager | Mutex Locks | Map Lookups | Memory Reduction | Cache Improvement |
|
|
|---------|-------------|-------------|------------------|-------------------|
|
|
| EquipmentManager | Required → Zero | Per check → Direct | 30-50% | 40% estimated |
|
|
| MountManager | Required → Zero | Per use → Direct | 30-50% | 40% estimated |
|
|
| BattlePetManager | Required → Zero | Per battle → Direct | 30-50% | 40% estimated |
|
|
|
|
### Cumulative Impact
|
|
|
|
- **Mutex Elimination**: 3 more managers with zero lock contention
|
|
- **Total Managers**: 23 → 26 (13% growth)
|
|
- **Cache Locality**: Better memory layout for bot data
|
|
- **Scalability**: Linear scaling to 1000+ bots
|
|
|
|
---
|
|
|
|
## Testing Strategy
|
|
|
|
### Per-Manager Testing
|
|
|
|
1. **Compilation**: Ensure all files compile without errors
|
|
2. **Linkage**: Verify no undefined references
|
|
3. **Runtime**: Test bot creation, initialization, update loop
|
|
4. **Integration**: Verify manager interactions work correctly
|
|
|
|
### Integration Testing
|
|
|
|
1. **EquipmentManager**:
|
|
- Bot auto-equips best gear on drops
|
|
- Stat weights applied correctly per class/spec
|
|
- Equipment recommendations generated
|
|
- Durability warnings triggered
|
|
|
|
2. **MountManager**:
|
|
- Bot selects flying mount in flying zones
|
|
- Bot selects ground mount in non-flying zones
|
|
- Combat dismount handled correctly
|
|
- Speed buffs detected
|
|
|
|
3. **BattlePetManager**:
|
|
- Pet collection tracked per bot
|
|
- Battle teams composed correctly
|
|
- Pet battles automated
|
|
- Pet capture logic works
|
|
|
|
---
|
|
|
|
## Migration Guide for Developers
|
|
|
|
### Old Code (Singleton)
|
|
|
|
```cpp
|
|
// EquipmentManager
|
|
EquipmentManager::instance()->AutoEquipBestGear(player);
|
|
float score = EquipmentManager::instance()->CalculateItemScore(player, item);
|
|
|
|
// MountManager
|
|
MountManager::instance()->SummonAppropriateMount(player);
|
|
|
|
// BattlePetManager
|
|
BattlePetManager::instance()->StartBattle(player, opponent);
|
|
```
|
|
|
|
### New Code (Per-Bot)
|
|
|
|
```cpp
|
|
auto* gameSystems = botAI->GetGameSystems();
|
|
|
|
// EquipmentManager
|
|
gameSystems->GetEquipmentManager()->AutoEquipBestGear();
|
|
float score = gameSystems->GetEquipmentManager()->CalculateItemScore(item);
|
|
|
|
// MountManager
|
|
gameSystems->GetMountManager()->SummonAppropriateMount();
|
|
|
|
// BattlePetManager
|
|
gameSystems->GetBattlePetManager()->StartBattle(opponent);
|
|
```
|
|
|
|
**Key Differences**:
|
|
1. No more `::instance()` calls
|
|
2. No more `Player* player` parameters
|
|
3. Access via `GameSystemsManager` facade
|
|
4. Each bot has its own manager instances
|
|
|
|
---
|
|
|
|
## Phase 6 Success Criteria
|
|
|
|
Phase 6 is considered complete when:
|
|
|
|
- ✅ EquipmentManager converted to per-bot instance (24th manager)
|
|
- ✅ MountManager converted to per-bot instance (25th manager)
|
|
- ✅ BattlePetManager converted to per-bot instance (26th manager)
|
|
- ✅ All managers integrated into GameSystemsManager
|
|
- ✅ All legacy singleton calls removed
|
|
- ✅ Code compiles without errors
|
|
- ✅ Integration tests pass
|
|
- ✅ Documentation updated (PHASE_6_COMPLETE.md)
|
|
- ✅ DEVELOPER_GUIDE.md updated with new managers
|
|
|
|
---
|
|
|
|
## Risks and Mitigations
|
|
|
|
### Risk 1: EquipmentManager Complexity
|
|
**Impact**: Complex stat weight calculations, many item types
|
|
**Mitigation**: Thorough testing of scoring formulas, validate against known good items
|
|
|
|
### Risk 2: MountManager Zone Detection
|
|
**Impact**: Flying/ground logic depends on zone flags
|
|
**Mitigation**: Test in multiple zone types (flying, no-flying, battlegrounds, arenas)
|
|
|
|
### Risk 3: BattlePetManager Optional Usage
|
|
**Impact**: Not all bots use battle pets
|
|
**Mitigation**: Ensure graceful handling of bots without pets, null checks
|
|
|
|
### Risk 4: Performance with Auto-Equip
|
|
**Impact**: EquipmentManager called frequently (every 10 seconds per bot)
|
|
**Mitigation**: Profile performance, ensure direct member access is fast
|
|
|
|
---
|
|
|
|
## Conclusion
|
|
|
|
Phase 6 converts 3 management systems from singleton to per-bot instances, bringing GameSystemsManager to **26 managers**. These conversions eliminate mutex contention for equipment, mount, and pet systems, improving scalability and cache locality.
|
|
|
|
**Expected Benefits**:
|
|
- Zero lock contention (100% mutex elimination for 3 managers)
|
|
- Better cache locality (direct members vs maps)
|
|
- Cleaner API (no Player* parameters)
|
|
- Clear ownership (facade pattern)
|
|
- Improved scalability (per-bot isolation)
|
|
|
|
**GameSystemsManager Evolution**: 23 → 26 managers
|
|
|
|
---
|
|
|
|
**Document Version**: 1.0
|
|
**Last Updated**: 2025-11-18
|
|
**Author**: Claude (Anthropic)
|