435 lines
11 KiB
Markdown
435 lines
11 KiB
Markdown
# Playerbot Refactoring - Executive Action Plan
|
|
|
|
**Date**: 2025-10-08
|
|
**Objective**: Eliminate movement conflicts, group desyncs, and strategy overlaps
|
|
**Expected Outcome**: 51% code reduction, zero functionality loss, improved performance
|
|
|
|
---
|
|
|
|
## QUICK WINS (Can implement immediately)
|
|
|
|
### 1. Enforce BehaviorPriorityManager (1 day)
|
|
**File**: `src/modules/Playerbot/AI/BotAI.cpp`
|
|
|
|
**Current Problem**:
|
|
```cpp
|
|
// BotAI::UpdateStrategies() - runs ALL active strategies
|
|
for (auto& strategy : _strategies)
|
|
{
|
|
if (strategy->IsActive(this))
|
|
strategy->UpdateBehavior(this, diff); // Multiple strategies run!
|
|
}
|
|
```
|
|
|
|
**Solution**:
|
|
```cpp
|
|
// Run ONLY the highest priority strategy
|
|
void BotAI::UpdateStrategies(uint32 diff)
|
|
{
|
|
std::vector<Strategy*> allStrategies = GetAllStrategies();
|
|
|
|
// Let priority manager select ONE strategy
|
|
Strategy* activeStrategy = _priorityManager->SelectActiveBehavior(allStrategies);
|
|
|
|
if (activeStrategy)
|
|
activeStrategy->UpdateBehavior(this, diff);
|
|
}
|
|
```
|
|
|
|
**Impact**: Immediately fixes Issue #2 & #3 (movement conflicts)
|
|
|
|
---
|
|
|
|
### 2. Fix Strategy Priorities (30 minutes)
|
|
**Files**:
|
|
- `src/modules/Playerbot/Movement/LeaderFollowBehavior.cpp:123`
|
|
- `src/modules/Playerbot/AI/Strategy/CombatMovementStrategy.cpp:47`
|
|
|
|
**Changes**:
|
|
```cpp
|
|
// LeaderFollowBehavior.cpp:123
|
|
LeaderFollowBehavior::LeaderFollowBehavior()
|
|
: Strategy("follow")
|
|
{
|
|
_priority = 50; // Changed from 200
|
|
}
|
|
|
|
// CombatMovementStrategy.cpp:47
|
|
CombatMovementStrategy::CombatMovementStrategy()
|
|
: Strategy("CombatMovement")
|
|
{
|
|
SetPriority(100); // Changed from 80
|
|
_exclusive = true; // Add this line
|
|
}
|
|
```
|
|
|
|
**Impact**: Ensures combat has exclusive control over movement
|
|
|
|
---
|
|
|
|
### 3. Add Group Events (2 hours)
|
|
**File**: `src/modules/Playerbot/Core/Events/BotEventTypes.h`
|
|
|
|
**Add event types**:
|
|
```cpp
|
|
enum class EventType
|
|
{
|
|
// ... existing events ...
|
|
|
|
// Group events
|
|
GROUP_JOINED,
|
|
GROUP_LEFT,
|
|
GROUP_LEADER_CHANGED,
|
|
GROUP_DISBANDED,
|
|
};
|
|
```
|
|
|
|
**File**: `src/modules/Playerbot/Group/GroupInvitationHandler.cpp:500`
|
|
|
|
**Dispatch event on successful join**:
|
|
```cpp
|
|
void GroupInvitationHandler::AcceptInvitation(ObjectGuid inviterGuid)
|
|
{
|
|
// ... existing accept logic ...
|
|
|
|
if (acceptSuccess)
|
|
{
|
|
// NEW: Dispatch event
|
|
BotEvent evt(EventType::GROUP_JOINED, _bot->GetGUID(), inviterGuid);
|
|
evt.group = _bot->GetGroup();
|
|
_eventDispatcher->Dispatch(std::move(evt));
|
|
}
|
|
}
|
|
```
|
|
|
|
**File**: `src/modules/Playerbot/AI/BotAI.cpp:54`
|
|
|
|
**Subscribe to events in constructor**:
|
|
```cpp
|
|
BotAI::BotAI(Player* bot) : _bot(bot)
|
|
{
|
|
// ... existing initialization ...
|
|
|
|
// Subscribe to group events
|
|
_eventDispatcher->Subscribe(EventType::GROUP_JOINED, this);
|
|
_eventDispatcher->Subscribe(EventType::GROUP_LEFT, this);
|
|
}
|
|
```
|
|
|
|
**Impact**: Eliminates 1s polling lag, instant strategy activation
|
|
|
|
---
|
|
|
|
## MEDIUM-TERM IMPROVEMENTS (Week 1-2)
|
|
|
|
### 4. Standardize Movement Execution (3 days)
|
|
**Goal**: ALL movement flows through BotMovementUtil
|
|
|
|
**Files to modify**:
|
|
- `src/modules/Playerbot/Movement/LeaderFollowBehavior.cpp:1234`
|
|
- `src/modules/Playerbot/AI/Strategy/CombatMovementStrategy.cpp:425`
|
|
- `src/modules/Playerbot/AI/Strategy/GroupCombatStrategy.cpp:132`
|
|
|
|
**Pattern to apply**:
|
|
```cpp
|
|
// BEFORE (direct MotionMaster call):
|
|
bot->GetMotionMaster()->Clear();
|
|
bot->GetMotionMaster()->MovePoint(1, position);
|
|
|
|
// AFTER (use BotMovementUtil):
|
|
BotMovementUtil::MoveToPosition(bot, position, 1);
|
|
```
|
|
|
|
**Impact**: Eliminates stuttering/blinking, deduplicates movement commands
|
|
|
|
---
|
|
|
|
### 5. Merge GroupCombatStrategy into CombatMovementStrategy (2 days)
|
|
**Files**:
|
|
- Move logic from `src/modules/Playerbot/AI/Strategy/GroupCombatStrategy.cpp` to `CombatMovementStrategy.cpp`
|
|
- Delete `GroupCombatStrategy.cpp` and `GroupCombatStrategy.h`
|
|
|
|
**New CombatMovementStrategy structure**:
|
|
```cpp
|
|
void CombatMovementStrategy::UpdateBehavior(BotAI* ai, uint32 diff)
|
|
{
|
|
// 1. Check if group in combat but bot isn't (assist mode)
|
|
if (!bot->IsInCombat() && IsGroupInCombat(ai))
|
|
{
|
|
Unit* groupTarget = GetGroupMemberTarget(ai);
|
|
if (groupTarget)
|
|
{
|
|
bot->SetTarget(groupTarget->GetGUID());
|
|
bot->Attack(groupTarget, true);
|
|
}
|
|
}
|
|
|
|
// 2. Handle combat positioning (existing logic)
|
|
if (bot->IsInCombat())
|
|
{
|
|
// ... existing combat positioning ...
|
|
}
|
|
}
|
|
```
|
|
|
|
**Impact**: 272 lines removed, clearer responsibility
|
|
|
|
---
|
|
|
|
### 6. Add Throttling to LeaderFollowBehavior (1 hour)
|
|
**File**: `src/modules/Playerbot/Movement/LeaderFollowBehavior.cpp:297`
|
|
|
|
**Change**:
|
|
```cpp
|
|
void LeaderFollowBehavior::UpdateBehavior(BotAI* ai, uint32 diff)
|
|
{
|
|
// Add throttling
|
|
static uint32 updateTimer = 0;
|
|
updateTimer += diff;
|
|
if (updateTimer < 100) // 10 Hz update rate
|
|
return;
|
|
updateTimer = 0;
|
|
|
|
// Now call existing logic
|
|
UpdateFollowBehavior(ai, diff);
|
|
}
|
|
```
|
|
|
|
**Impact**: Reduces CPU usage from ~0.3% to ~0.05% per bot
|
|
|
|
---
|
|
|
|
## LONG-TERM CLEANUP (Week 3-4)
|
|
|
|
### 7. Remove ClassAI Movement Logic (5 days)
|
|
**Goal**: ClassAI only provides optimal range/angle, never executes movement
|
|
|
|
**Files to modify** (all in `src/modules/Playerbot/AI/ClassAI/`):
|
|
- `Hunters/HunterAI.cpp`
|
|
- `Mages/MageAI.cpp`
|
|
- `Warriors/WarriorAI.cpp`
|
|
- `Priests/PriestAI.cpp`
|
|
- (etc. for all 13 classes)
|
|
|
|
**Pattern**:
|
|
```cpp
|
|
// REMOVE all movement execution:
|
|
void HunterAI::UpdateAI(uint32 diff)
|
|
{
|
|
// DELETE THIS:
|
|
if (distance > 25.0f)
|
|
bot->GetMotionMaster()->MoveChase(target, 25.0f);
|
|
}
|
|
|
|
// KEEP only range calculation:
|
|
float HunterAI::GetOptimalRange(Unit* target) override
|
|
{
|
|
return 25.0f; // This is all ClassAI should provide
|
|
}
|
|
```
|
|
|
|
**Impact**: ~200 lines removed, consistent behavior across all classes
|
|
|
|
---
|
|
|
|
### 8. Remove BotAI Periodic Group Check (15 minutes)
|
|
**File**: `src/modules/Playerbot/AI/BotAI.cpp:216-242`
|
|
|
|
**Delete this workaround**:
|
|
```cpp
|
|
// DELETE LINES 216-242:
|
|
static uint32 groupCheckTimer = 0;
|
|
groupCheckTimer += diff;
|
|
if (groupCheckTimer >= 1000)
|
|
{
|
|
// This entire block - delete it
|
|
}
|
|
```
|
|
|
|
**Prerequisite**: Must complete step #3 (Add Group Events) first
|
|
|
|
**Impact**: Cleaner code, instant response instead of 1s lag
|
|
|
|
---
|
|
|
|
## CODE REDUCTION TRACKER
|
|
|
|
| Component | Before | After | Reduction |
|
|
|-----------|--------|-------|-----------|
|
|
| LeaderFollowBehavior | 1,497 | 800 | 697 lines (47%) |
|
|
| CombatMovementStrategy | 734 | 400 | 334 lines (45%) |
|
|
| GroupCombatStrategy | 272 | 0 | 272 lines (100%) |
|
|
| BotAI periodic checks | 27 | 0 | 27 lines (100%) |
|
|
| ClassAI movement code | ~200 | 0 | 200 lines (100%) |
|
|
| **TOTAL** | **~2,730** | **~1,200** | **~1,530 lines (56%)** |
|
|
|
|
---
|
|
|
|
## TESTING CHECKLIST
|
|
|
|
After each change, verify:
|
|
|
|
### Movement System Tests
|
|
- [ ] Bot follows player smoothly (no stuttering/blinking)
|
|
- [ ] Bot stops movement when entering combat
|
|
- [ ] Bot resumes following after combat ends
|
|
- [ ] Melee classes stay at 5yd, ranged at 25yd
|
|
- [ ] Bots avoid fire/poison ground effects
|
|
- [ ] Pathfinding still works correctly
|
|
|
|
### Group System Tests
|
|
- [ ] Bot accepts group invite instantly
|
|
- [ ] Follow strategy activates within 50ms of group join
|
|
- [ ] Bot leaves group cleanly (no errors in log)
|
|
- [ ] Idle strategy activates when group disbanded
|
|
- [ ] Multiple bots can join same group
|
|
|
|
### Strategy Priority Tests
|
|
- [ ] Only ONE strategy executes at a time
|
|
- [ ] Combat strategy has exclusive control during combat
|
|
- [ ] Follow strategy never runs during combat
|
|
- [ ] Priority transitions are instant (<50ms)
|
|
|
|
### Performance Tests
|
|
- [ ] CPU per bot: <0.1% (down from ~0.3%)
|
|
- [ ] Memory per bot: <10MB (unchanged)
|
|
- [ ] Strategy selection: <0.01ms per frame
|
|
- [ ] Movement deduplication: 90%+ command reduction
|
|
|
|
---
|
|
|
|
## ROLLBACK PLAN
|
|
|
|
If any change causes issues:
|
|
|
|
### Git Workflow
|
|
```bash
|
|
# Before making changes, create a backup branch
|
|
git checkout -b refactor-backup-YYYYMMDD
|
|
|
|
# If something breaks, revert
|
|
git checkout playerbot-dev
|
|
git reset --hard refactor-backup-YYYYMMDD
|
|
```
|
|
|
|
### Per-Feature Rollback
|
|
Each feature is independent and can be rolled back separately:
|
|
|
|
1. **BehaviorPriorityManager enforcement** → Revert `BotAI.cpp:UpdateStrategies()`
|
|
2. **Strategy priorities** → Revert constructor changes
|
|
3. **Group events** → Comment out event dispatch, restore periodic check
|
|
4. **Movement standardization** → Revert to direct MotionMaster calls
|
|
5. **GroupCombatStrategy merge** → Restore deleted files from git
|
|
6. **Throttling** → Remove throttling code
|
|
7. **ClassAI cleanup** → Revert ClassAI movement removal
|
|
8. **Periodic check removal** → Restore deleted code
|
|
|
|
---
|
|
|
|
## DEPENDENCIES
|
|
|
|
### Internal (Playerbot Module)
|
|
- ✅ EventDispatcher exists and works
|
|
- ✅ BehaviorPriorityManager exists
|
|
- ✅ BotMovementUtil exists
|
|
- ✅ Strategy base class supports priority
|
|
|
|
### External (TrinityCore)
|
|
- ✅ MotionMaster APIs stable
|
|
- ✅ Group system APIs stable
|
|
- ✅ No TrinityCore changes required
|
|
|
|
### Configuration
|
|
- ⚠️ May need to adjust `playerbots.conf` for throttling intervals
|
|
- ⚠️ Recommend adding `Playerbot.MovementUpdateInterval = 100` (ms)
|
|
|
|
---
|
|
|
|
## SUCCESS METRICS
|
|
|
|
### Before Refactoring
|
|
- Movement conflicts: ~30% of combat encounters
|
|
- Strategy overlap: 3+ strategies running simultaneously
|
|
- CPU per bot: ~0.3%
|
|
- Code duplication: ~40%
|
|
- Group join lag: ~1 second
|
|
|
|
### After Refactoring
|
|
- Movement conflicts: 0%
|
|
- Strategy overlap: 1 strategy at a time (enforced)
|
|
- CPU per bot: <0.1%
|
|
- Code duplication: <5%
|
|
- Group join lag: <50ms
|
|
|
|
---
|
|
|
|
## PHASED ROLLOUT
|
|
|
|
### Week 1: Foundation
|
|
- Day 1: Enforce BehaviorPriorityManager
|
|
- Day 2: Fix strategy priorities
|
|
- Day 3: Add group events
|
|
- Day 4-5: Testing and validation
|
|
|
|
### Week 2: Movement
|
|
- Day 1-3: Standardize movement to BotMovementUtil
|
|
- Day 4: Merge GroupCombatStrategy
|
|
- Day 5: Add throttling
|
|
|
|
### Week 3: Cleanup
|
|
- Day 1-3: Remove ClassAI movement
|
|
- Day 4: Remove periodic checks
|
|
- Day 5: Final testing
|
|
|
|
### Week 4: Polish
|
|
- Day 1-2: Performance optimization
|
|
- Day 3-4: Documentation
|
|
- Day 5: Release candidate
|
|
|
|
---
|
|
|
|
## APPROVAL CHECKLIST
|
|
|
|
Before implementing:
|
|
- [ ] Review PLAYERBOT_ARCHITECTURE_DEEP_ANALYSIS.md
|
|
- [ ] Understand the 3 core issues (movement conflicts, group desync, strategy overlap)
|
|
- [ ] Agree on the solution approach
|
|
- [ ] Commit to NO shortcuts (full implementation)
|
|
- [ ] Allocate 4 weeks for complete refactoring
|
|
- [ ] Set up testing environment
|
|
|
|
---
|
|
|
|
## QUESTIONS TO ANSWER
|
|
|
|
1. **Should we implement all changes at once or phase them in?**
|
|
- Recommendation: Phased (Week 1 → Week 2 → Week 3)
|
|
|
|
2. **What's the rollback strategy if something breaks?**
|
|
- Recommendation: Git branch per phase, easy rollback
|
|
|
|
3. **Do we need to notify users of behavior changes?**
|
|
- Recommendation: Yes - movement will be smoother but might look different
|
|
|
|
4. **Should we keep dead code commented out or delete it?**
|
|
- Recommendation: Delete (git history preserves it)
|
|
|
|
5. **What happens to existing saved bot data?**
|
|
- Recommendation: No impact - all changes are code-only
|
|
|
|
---
|
|
|
|
## NEXT STEPS
|
|
|
|
1. **Review this document** and the detailed analysis
|
|
2. **Approve the approach** (or request changes)
|
|
3. **Choose rollout strategy** (all-at-once vs phased)
|
|
4. **Create git branch** for refactoring work
|
|
5. **Implement Quick Wins** (Day 1-2)
|
|
6. **Validate** with testing checklist
|
|
7. **Proceed to Medium-Term** improvements
|
|
|
|
---
|
|
|
|
**READY TO PROCEED?** Start with Quick Win #1 (Enforce BehaviorPriorityManager) - it's the highest impact, lowest risk change.
|