32 KiB
32 KiB
PHASE 4: EVENT SYSTEM INTEGRATION - DETAILED IMPLEMENTATION SUBPLAN
Executive Summary
Duration: 60-80 hours (1.5-2 weeks) Team Size: 6-7 specialized agents Primary Goal: Convert polling-based state checks to event-driven architecture Critical Issues Addressed: #1 (login group behavior), performance optimization, reactive AI
Phase 4 Architecture Overview
Core Components
Events/
├── BotEventSystem.h/cpp (750 lines) - Core event dispatcher
├── GroupEventObserver.h/cpp (450 lines) - Group state events
├── CombatEventObserver.h/cpp (450 lines) - Combat events
├── WorldEventObserver.h/cpp (450 lines) - World state events
├── EventQueue.h/cpp (400 lines) - Priority queue management
├── EventSubscription.h/cpp (350 lines) - Subscription management
├── EventMetrics.h/cpp (300 lines) - Performance monitoring
└── tests/ (2500+ lines) - Comprehensive testing
Detailed Task Breakdown
Task 4.1: Event System Architecture Design
Duration: 10 hours Assigned Agents:
- Primary: cpp-architecture-optimizer (event patterns)
- Support: concurrency-threading-specialist (async design) Dependencies: Phase 3 complete Deliverables:
// BotEventSystem.h
class BotEventSystem {
public:
// Event types
enum class EventType : uint32_t {
// Group events
GROUP_CREATED = 1 << 0,
GROUP_DISBANDED = 1 << 1,
GROUP_MEMBER_ADDED = 1 << 2,
GROUP_MEMBER_REMOVED = 1 << 3,
GROUP_LEADER_CHANGED = 1 << 4,
// Combat events
COMBAT_STARTED = 1 << 5,
COMBAT_ENDED = 1 << 6,
TARGET_CHANGED = 1 << 7,
THREAT_CHANGED = 1 << 8,
DAMAGE_TAKEN = 1 << 9,
DAMAGE_DEALT = 1 << 10,
// World events
PLAYER_LOGIN = 1 << 11,
PLAYER_LOGOUT = 1 << 12,
ZONE_CHANGED = 1 << 13,
QUEST_ACCEPTED = 1 << 14,
QUEST_COMPLETED = 1 << 15,
ITEM_RECEIVED = 1 << 16,
// Bot-specific events
BOT_SPAWNED = 1 << 17,
BOT_DESPAWNED = 1 << 18,
BOT_BEHAVIOR_CHANGED = 1 << 19,
BOT_STATE_CHANGED = 1 << 20
};
// Event data base
struct EventData {
EventType type;
ObjectGuid sourceGuid;
std::chrono::steady_clock::time_point timestamp;
uint32_t priority;
virtual ~EventData() = default;
};
// Specialized event data
struct GroupEventData : EventData {
ObjectGuid groupGuid;
ObjectGuid memberGuid;
GroupRole role;
};
struct CombatEventData : EventData {
ObjectGuid targetGuid;
uint32_t damage;
uint32_t threat;
SpellSchoolMask school;
};
// Event handler types
using EventHandler = std::function<void(const EventData&)>;
using EventFilter = std::function<bool(const EventData&)>;
using SubscriptionId = uint64_t;
// Singleton access
static BotEventSystem& Instance();
// Event publishing
void PublishEvent(std::unique_ptr<EventData> event);
void PublishEventDeferred(std::unique_ptr<EventData> event, std::chrono::milliseconds delay);
void PublishEventBatch(std::vector<std::unique_ptr<EventData>> events);
// Event subscription
SubscriptionId Subscribe(EventType type, EventHandler handler,
EventFilter filter = nullptr,
uint32_t priority = 100);
void Unsubscribe(SubscriptionId id);
void UnsubscribeAll(ObjectGuid subscriber);
// Event processing
void ProcessEvents(uint32_t maxEvents = 100);
void ProcessEventsFor(std::chrono::milliseconds duration);
void FlushEvents();
// Configuration
void SetMaxQueueSize(size_t size);
void SetProcessingThreadCount(uint32_t count);
void EnableEventLogging(bool enable);
// Metrics
EventMetrics GetMetrics() const;
void ResetMetrics();
private:
BotEventSystem();
~BotEventSystem();
struct Subscription {
SubscriptionId id;
EventType type;
EventHandler handler;
EventFilter filter;
uint32_t priority;
ObjectGuid owner;
};
// Event queue with priority
std::priority_queue<std::unique_ptr<EventData>,
std::vector<std::unique_ptr<EventData>>,
EventComparator> m_eventQueue;
// Subscriptions indexed by event type
std::unordered_map<EventType, std::vector<Subscription>> m_subscriptions;
// Deferred events
std::multimap<std::chrono::steady_clock::time_point,
std::unique_ptr<EventData>> m_deferredEvents;
// Thread safety
mutable std::shared_mutex m_queueMutex;
mutable std::shared_mutex m_subscriptionMutex;
// Processing threads
std::vector<std::thread> m_processingThreads;
std::atomic<bool> m_shouldStop{false};
// Metrics
EventMetrics m_metrics;
// ID generation
std::atomic<SubscriptionId> m_nextSubscriptionId{1};
};
// Event type operators
inline EventType operator|(EventType a, EventType b) {
return static_cast<EventType>(static_cast<uint32_t>(a) | static_cast<uint32_t>(b));
}
inline bool HasEventType(uint32_t mask, EventType type) {
return (mask & static_cast<uint32_t>(type)) != 0;
}
Task 4.2: Group Event Observer Implementation
Duration: 10 hours Assigned Agents:
- Primary: wow-bot-behavior-designer (group behavior)
- Support: trinity-integration-tester (group hooks) Dependencies: Task 4.1 Deliverables:
// GroupEventObserver.h
class GroupEventObserver {
public:
static void Initialize();
static void Shutdown();
// Core group event hooks
static void OnGroupCreate(Group* group);
static void OnGroupDisband(Group* group);
static void OnMemberAdded(Group* group, ObjectGuid memberGuid);
static void OnMemberRemoved(Group* group, ObjectGuid memberGuid);
static void OnLeaderChanged(Group* group, ObjectGuid newLeaderGuid);
// Role and assignment events
static void OnRoleChanged(Group* group, ObjectGuid memberGuid, GroupRole newRole);
static void OnLootMethodChanged(Group* group, LootMethod method);
static void OnDifficultyChanged(Group* group, Difficulty difficulty);
// Raid-specific events
static void OnRaidTargetChanged(Group* group, uint8_t symbol, ObjectGuid targetGuid);
static void OnReadyCheckInitiated(Group* group, ObjectGuid initiator);
static void OnReadyCheckResponse(Group* group, ObjectGuid player, bool ready);
// Bot-specific group handling
static void UpdateBotGroupBehavior(Bot* bot, Group* group);
static void HandleBotGroupInvite(Bot* bot, Player* inviter);
static void HandleBotPromotionToLeader(Bot* bot);
private:
// Event creation helpers
static std::unique_ptr<GroupEventData> CreateGroupEvent(
BotEventSystem::EventType type,
Group* group,
ObjectGuid memberGuid = ObjectGuid::Empty);
// Bot response handlers
static void HandleGroupFormation(Bot* bot, const GroupEventData& event);
static void HandleLeaderFollowing(Bot* bot, const GroupEventData& event);
static void HandleRoleAssignment(Bot* bot, const GroupEventData& event);
// Subscription management
static std::unordered_map<ObjectGuid, BotEventSystem::SubscriptionId> s_botSubscriptions;
static std::shared_mutex s_subscriptionMutex;
// Configuration
static bool s_initialized;
static uint32_t s_eventPriority;
};
// Integration with TrinityCore Group class
class GroupHooks {
public:
static void InstallHooks();
static void RemoveHooks();
private:
// Hook implementations
static void Hook_AddMember(Group* group, ObjectGuid guid);
static void Hook_RemoveMember(Group* group, ObjectGuid guid);
static void Hook_ChangeLeader(Group* group, ObjectGuid guid);
static void Hook_Disband(Group* group);
// Original function pointers
static decltype(&Group::AddMember) Original_AddMember;
static decltype(&Group::RemoveMember) Original_RemoveMember;
static decltype(&Group::ChangeLeader) Original_ChangeLeader;
static decltype(&Group::Disband) Original_Disband;
};
Task 4.3: Combat Event Observer Implementation
Duration: 10 hours Assigned Agents:
- Primary: wow-mechanics-expert (combat mechanics)
- Support: pvp-arena-tactician (PvP events) Dependencies: Task 4.1 Deliverables:
// CombatEventObserver.h
class CombatEventObserver {
public:
static void Initialize();
static void Shutdown();
// Combat state events
static void OnCombatStart(Unit* unit, Unit* target);
static void OnCombatEnd(Unit* unit);
static void OnTargetSwitch(Unit* unit, Unit* oldTarget, Unit* newTarget);
// Damage events
static void OnDamageDealt(Unit* dealer, Unit* victim, uint32_t damage, SpellInfo const* spellInfo);
static void OnDamageTaken(Unit* victim, Unit* dealer, uint32_t damage, SpellInfo const* spellInfo);
static void OnHealingDone(Unit* healer, Unit* target, uint32_t heal, SpellInfo const* spellInfo);
// Threat events
static void OnThreatUpdate(Unit* unit, Unit* victim, float threat);
static void OnThreatClear(Unit* unit);
static void OnTauntSuccess(Unit* taunter, Unit* target);
// Spell events
static void OnSpellCast(Unit* caster, SpellInfo const* spellInfo, Unit* target);
static void OnSpellInterrupt(Unit* caster, Unit* interrupter, SpellInfo const* spellInfo);
static void OnSpellResist(Unit* caster, Unit* target, SpellInfo const* spellInfo);
// Death and resurrection
static void OnDeath(Unit* unit, Unit* killer);
static void OnResurrect(Unit* unit);
// PvP-specific events
static void OnHonorKill(Player* killer, Player* victim);
static void OnDuelStart(Player* player1, Player* player2);
static void OnDuelEnd(Player* winner, Player* loser);
// Bot combat behavior updates
static void UpdateBotCombatBehavior(Bot* bot, const CombatEventData& event);
static void HandleBotThreatManagement(Bot* bot, const CombatEventData& event);
static void HandleBotTargetSelection(Bot* bot, const CombatEventData& event);
private:
struct CombatContext {
ObjectGuid targetGuid;
uint32_t totalDamageDealt{0};
uint32_t totalDamageTaken{0};
uint32_t totalHealing{0};
std::chrono::steady_clock::time_point combatStartTime;
ThreatManager threatInfo;
};
// Per-unit combat tracking
static std::unordered_map<ObjectGuid, CombatContext> s_combatContexts;
static std::shared_mutex s_contextMutex;
// Event creation
static std::unique_ptr<CombatEventData> CreateCombatEvent(
BotEventSystem::EventType type,
Unit* source,
Unit* target,
uint32_t value = 0);
// Bot response strategies
static void ApplyDefensiveStrategy(Bot* bot, const CombatEventData& event);
static void ApplyOffensiveStrategy(Bot* bot, const CombatEventData& event);
static void ApplySurvivalStrategy(Bot* bot, const CombatEventData& event);
// Configuration
static bool s_initialized;
static uint32_t s_damageThreshold;
static uint32_t s_threatThreshold;
};
Task 4.4: World Event Observer Implementation
Duration: 10 hours Assigned Agents:
- Primary: trinity-integration-tester (world hooks)
- Support: wow-economy-manager (economic events) Dependencies: Task 4.1 Deliverables:
// WorldEventObserver.h
class WorldEventObserver {
public:
static void Initialize();
static void Shutdown();
// Player session events
static void OnPlayerLogin(Player* player);
static void OnPlayerLogout(Player* player);
static void OnPlayerSave(Player* player);
// Movement and location events
static void OnZoneChange(Player* player, uint32_t newZone, uint32_t newArea);
static void OnMapChange(Player* player, uint32_t mapId);
static void OnTeleport(Player* player, LocationVector const& destination);
// Quest events
static void OnQuestAccept(Player* player, Quest const* quest);
static void OnQuestComplete(Player* player, Quest const* quest);
static void OnQuestAbandon(Player* player, Quest const* quest);
static void OnQuestObjectiveComplete(Player* player, Quest const* quest, uint32_t objectiveId);
// Item and loot events
static void OnItemLooted(Player* player, Item* item);
static void OnItemEquipped(Player* player, Item* item, uint8_t slot);
static void OnItemDestroyed(Player* player, Item* item);
static void OnCurrencyChange(Player* player, CurrencyTypes currency, int32_t change);
// Social events
static void OnWhisperReceived(Player* player, Player* sender, std::string const& message);
static void OnGuildChat(Player* player, Guild* guild, std::string const& message);
static void OnEmoteReceived(Player* player, Player* sender, uint32_t emoteId);
// Achievement events
static void OnAchievementComplete(Player* player, AchievementEntry const* achievement);
static void OnAchievementProgress(Player* player, CriteriaEntry const* criteria);
// Bot world interaction
static void UpdateBotWorldInteraction(Bot* bot, const WorldEventData& event);
static void HandleBotQuestBehavior(Bot* bot, Quest const* quest);
static void HandleBotEconomicActivity(Bot* bot, const WorldEventData& event);
private:
struct WorldEventData : BotEventSystem::EventData {
uint32_t zoneId{0};
uint32_t mapId{0};
uint32_t questId{0};
uint32_t itemId{0};
std::string extraData;
};
// Event creation
static std::unique_ptr<WorldEventData> CreateWorldEvent(
BotEventSystem::EventType type,
Player* player,
uint32_t dataId = 0);
// Bot behavioral responses
static void HandleLoginProximityCheck(Bot* bot, Player* player);
static void HandleQuestSharing(Bot* bot, Player* player, Quest const* quest);
static void HandleZoneAppropriateBehavior(Bot* bot, uint32_t zoneId);
// Subscription tracking
static std::unordered_map<ObjectGuid, std::vector<BotEventSystem::SubscriptionId>> s_subscriptions;
static std::shared_mutex s_subscriptionMutex;
// Configuration
static bool s_initialized;
static uint32_t s_proximityCheckRadius;
static bool s_enableQuestSharing;
};
Task 4.5: Event Queue Management
Duration: 8 hours Assigned Agents:
- Primary: concurrency-threading-specialist (queue design)
- Support: resource-monitor-limiter (memory management) Dependencies: Tasks 4.2-4.4 Deliverables:
// EventQueue.h
template<typename EventType>
class EventQueue {
public:
struct QueueStats {
size_t currentSize{0};
size_t maxSize{0};
size_t totalProcessed{0};
size_t droppedEvents{0};
std::chrono::microseconds avgProcessingTime{0};
};
explicit EventQueue(size_t maxSize = 10000)
: m_maxSize(maxSize) {}
// Queue operations
bool Enqueue(std::unique_ptr<EventType> event, uint32_t priority = 100);
std::unique_ptr<EventType> Dequeue();
std::vector<std::unique_ptr<EventType>> DequeueBatch(size_t count);
// Priority management
void UpdatePriority(const std::function<bool(const EventType&)>& matcher,
uint32_t newPriority);
void PurgeEvents(const std::function<bool(const EventType&)>& matcher);
// Queue state
bool IsEmpty() const;
size_t Size() const;
bool IsFull() const;
// Statistics
QueueStats GetStats() const;
void ResetStats();
// Configuration
void SetMaxSize(size_t size);
void SetOverflowPolicy(OverflowPolicy policy);
private:
struct PrioritizedEvent {
std::unique_ptr<EventType> event;
uint32_t priority;
uint64_t sequenceNumber;
bool operator<(const PrioritizedEvent& other) const {
if (priority != other.priority)
return priority < other.priority; // Higher priority first
return sequenceNumber > other.sequenceNumber; // FIFO for same priority
}
};
std::priority_queue<PrioritizedEvent> m_queue;
size_t m_maxSize;
std::atomic<uint64_t> m_sequenceCounter{0};
// Thread safety
mutable std::mutex m_queueMutex;
std::condition_variable m_notEmpty;
// Statistics
QueueStats m_stats;
// Overflow handling
enum class OverflowPolicy {
DROP_OLDEST,
DROP_NEWEST,
DROP_LOWEST_PRIORITY,
BLOCK
};
OverflowPolicy m_overflowPolicy{OverflowPolicy::DROP_LOWEST_PRIORITY};
};
Task 4.6: Event Subscription Management
Duration: 8 hours Assigned Agents:
- Primary: cpp-architecture-optimizer (subscription patterns)
- Support: code-quality-reviewer (API design) Dependencies: Task 4.5 Deliverables:
// EventSubscription.h
class EventSubscriptionManager {
public:
using SubscriptionId = uint64_t;
using EventHandler = std::function<void(const BotEventSystem::EventData&)>;
struct Subscription {
SubscriptionId id;
ObjectGuid subscriberGuid;
BotEventSystem::EventType eventMask;
EventHandler handler;
uint32_t priority;
bool isActive;
// Filtering
std::optional<ObjectGuid> sourceFilter;
std::optional<ObjectGuid> targetFilter;
std::optional<uint32_t> zoneFilter;
// Lifetime
std::optional<std::chrono::steady_clock::time_point> expiration;
std::optional<uint32_t> maxTriggers;
uint32_t triggerCount{0};
};
// Subscription creation
SubscriptionId Subscribe(const Subscription& subscription);
template<typename EventDataType>
SubscriptionId SubscribeTyped(
ObjectGuid subscriber,
std::function<void(const EventDataType&)> handler,
uint32_t priority = 100);
// Subscription management
void Unsubscribe(SubscriptionId id);
void UnsubscribeAll(ObjectGuid subscriber);
void SuspendSubscription(SubscriptionId id);
void ResumeSubscription(SubscriptionId id);
// Batch operations
std::vector<SubscriptionId> GetSubscriptions(ObjectGuid subscriber) const;
void UpdateSubscriptionPriority(SubscriptionId id, uint32_t newPriority);
// Event dispatch
void DispatchEvent(const BotEventSystem::EventData& event);
uint32_t GetSubscriberCount(BotEventSystem::EventType type) const;
// Maintenance
void CleanupExpiredSubscriptions();
void ValidateSubscriptions();
private:
std::unordered_map<SubscriptionId, Subscription> m_subscriptions;
std::unordered_multimap<BotEventSystem::EventType, SubscriptionId> m_typeIndex;
std::unordered_multimap<ObjectGuid, SubscriptionId> m_subscriberIndex;
mutable std::shared_mutex m_subscriptionMutex;
std::atomic<SubscriptionId> m_nextId{1};
// Helper methods
bool MatchesFilters(const Subscription& sub, const BotEventSystem::EventData& event) const;
void ExecuteHandler(Subscription& sub, const BotEventSystem::EventData& event);
void RemoveFromIndices(SubscriptionId id);
};
Task 4.7: Event Metrics and Monitoring
Duration: 6 hours Assigned Agents:
- Primary: resource-monitor-limiter (metrics design)
- Support: windows-memory-profiler (performance tracking) Dependencies: Task 4.6 Deliverables:
// EventMetrics.h
class EventMetrics {
public:
struct EventTypeMetrics {
uint64_t publishCount{0};
uint64_t processCount{0};
uint64_t dropCount{0};
std::chrono::microseconds totalProcessingTime{0};
std::chrono::microseconds avgProcessingTime{0};
std::chrono::microseconds maxProcessingTime{0};
size_t maxQueueDepth{0};
};
struct SubscriberMetrics {
ObjectGuid subscriberGuid;
uint64_t eventsReceived{0};
uint64_t eventsProcessed{0};
std::chrono::microseconds totalHandlingTime{0};
std::unordered_map<BotEventSystem::EventType, uint64_t> eventBreakdown;
};
// Metric collection
void RecordEventPublished(BotEventSystem::EventType type);
void RecordEventProcessed(BotEventSystem::EventType type,
std::chrono::microseconds processingTime);
void RecordEventDropped(BotEventSystem::EventType type);
void RecordSubscriberHandling(ObjectGuid subscriber,
BotEventSystem::EventType type,
std::chrono::microseconds handlingTime);
// Metric retrieval
EventTypeMetrics GetEventTypeMetrics(BotEventSystem::EventType type) const;
SubscriberMetrics GetSubscriberMetrics(ObjectGuid subscriber) const;
std::vector<EventTypeMetrics> GetAllEventMetrics() const;
// Performance analysis
std::vector<BotEventSystem::EventType> GetSlowEvents(std::chrono::microseconds threshold) const;
std::vector<ObjectGuid> GetSlowSubscribers(std::chrono::microseconds threshold) const;
double GetEventLossRate() const;
// Reporting
std::string GenerateReport() const;
void ExportToJson(const std::filesystem::path& path) const;
void LogMetrics() const;
// Reset
void Reset();
private:
std::unordered_map<BotEventSystem::EventType, EventTypeMetrics> m_eventMetrics;
std::unordered_map<ObjectGuid, SubscriberMetrics> m_subscriberMetrics;
mutable std::shared_mutex m_metricsMutex;
// Helpers
void UpdateAverages();
std::string FormatDuration(std::chrono::microseconds duration) const;
};
Task 4.8: Integration Testing Suite
Duration: 10 hours Assigned Agents:
- Primary: test-automation-engineer (test design)
- Support: trinity-integration-tester (integration validation) Dependencies: Tasks 4.1-4.7 Deliverables:
// EventSystemTests.cpp
class EventSystemTests : public ::testing::Test {
protected:
void TestLoginGroupBehaviorFix() {
// Issue #1: Bot creates group on player login
auto player = CreateTestPlayer();
auto bot = CreateTestBot();
// Set bot to follow player
bot->SetFollowTarget(player->GetGUID());
// Subscribe to login event
bool groupCreated = false;
auto subId = BotEventSystem::Instance().Subscribe(
BotEventSystem::EventType::PLAYER_LOGIN,
[&](const BotEventSystem::EventData& event) {
// Bot should NOT create group automatically
groupCreated = bot->GetGroup() != nullptr;
});
// Simulate player login
WorldEventObserver::OnPlayerLogin(player);
// Process events
BotEventSystem::Instance().ProcessEvents();
// Verify no automatic group creation
EXPECT_FALSE(groupCreated);
EXPECT_EQ(bot->GetGroup(), nullptr);
BotEventSystem::Instance().Unsubscribe(subId);
}
void TestEventPropagation() {
std::atomic<int> handlerCallCount{0};
// Subscribe to combat event
auto subId = BotEventSystem::Instance().Subscribe(
BotEventSystem::EventType::COMBAT_STARTED,
[&](const BotEventSystem::EventData& event) {
handlerCallCount++;
});
// Trigger combat event
auto unit = CreateTestUnit();
auto target = CreateTestUnit();
CombatEventObserver::OnCombatStart(unit, target);
// Process events
BotEventSystem::Instance().ProcessEvents();
EXPECT_EQ(handlerCallCount, 1);
BotEventSystem::Instance().Unsubscribe(subId);
}
void TestEventPriority() {
std::vector<int> executionOrder;
// Subscribe with different priorities
auto sub1 = BotEventSystem::Instance().Subscribe(
BotEventSystem::EventType::GROUP_CREATED,
[&](const auto& e) { executionOrder.push_back(1); },
nullptr, 50); // Low priority
auto sub2 = BotEventSystem::Instance().Subscribe(
BotEventSystem::EventType::GROUP_CREATED,
[&](const auto& e) { executionOrder.push_back(2); },
nullptr, 150); // High priority
auto sub3 = BotEventSystem::Instance().Subscribe(
BotEventSystem::EventType::GROUP_CREATED,
[&](const auto& e) { executionOrder.push_back(3); },
nullptr, 100); // Medium priority
// Trigger event
auto group = CreateTestGroup();
GroupEventObserver::OnGroupCreate(group);
// Process events
BotEventSystem::Instance().ProcessEvents();
// Verify execution order (high to low priority)
ASSERT_EQ(executionOrder.size(), 3);
EXPECT_EQ(executionOrder[0], 2); // High
EXPECT_EQ(executionOrder[1], 3); // Medium
EXPECT_EQ(executionOrder[2], 1); // Low
}
void TestMemoryLeaks() {
const size_t iterations = 10000;
const size_t initialMemory = GetMemoryUsage();
for (size_t i = 0; i < iterations; ++i) {
// Create and destroy subscriptions
auto subId = BotEventSystem::Instance().Subscribe(
BotEventSystem::EventType::DAMAGE_DEALT,
[](const auto& e) { /* Do nothing */ });
// Publish events
auto event = std::make_unique<BotEventSystem::EventData>();
event->type = BotEventSystem::EventType::DAMAGE_DEALT;
BotEventSystem::Instance().PublishEvent(std::move(event));
// Process and cleanup
BotEventSystem::Instance().ProcessEvents();
BotEventSystem::Instance().Unsubscribe(subId);
}
const size_t finalMemory = GetMemoryUsage();
const size_t leaked = finalMemory - initialMemory;
EXPECT_LT(leaked, 1024 * 1024); // Less than 1MB
}
void TestConcurrentEventHandling() {
std::atomic<uint32_t> eventCount{0};
const uint32_t threadCount = 10;
const uint32_t eventsPerThread = 1000;
// Subscribe to events
auto subId = BotEventSystem::Instance().Subscribe(
BotEventSystem::EventType::DAMAGE_DEALT,
[&](const auto& e) { eventCount++; });
// Spawn threads to publish events
std::vector<std::thread> threads;
for (uint32_t t = 0; t < threadCount; ++t) {
threads.emplace_back([&, t]() {
for (uint32_t i = 0; i < eventsPerThread; ++i) {
auto event = std::make_unique<CombatEventData>();
event->type = BotEventSystem::EventType::DAMAGE_DEALT;
event->damage = t * 1000 + i;
BotEventSystem::Instance().PublishEvent(std::move(event));
}
});
}
// Wait for all threads
for (auto& thread : threads) {
thread.join();
}
// Process all events
BotEventSystem::Instance().FlushEvents();
// Verify all events were handled
EXPECT_EQ(eventCount, threadCount * eventsPerThread);
BotEventSystem::Instance().Unsubscribe(subId);
}
};
Task 4.9: Performance Optimization
Duration: 8 hours Assigned Agents:
- Primary: resource-monitor-limiter (optimization)
- Support: concurrency-threading-specialist (parallelization) Dependencies: Task 4.8 Deliverables:
- Lock-free event queue implementation
- Batch event processing optimization
- Memory pool for event objects
- CPU affinity for processing threads
Task 4.10: Documentation and Migration
Duration: 6 hours Assigned Agents:
- Primary: code-quality-reviewer (documentation)
- Support: test-automation-engineer (examples) Dependencies: Task 4.9 Deliverables:
- Event system API documentation
- Migration guide from polling
- Event handler best practices
- Performance tuning guide
Testing Strategy
Unit Testing Requirements
- 100% coverage of event system core
- All event types tested
- Subscription management validation
- Queue overflow handling
Integration Testing Requirements
- Group system integration
- Combat system integration
- World event integration
- Cross-module event flow
Performance Testing Requirements
- 100,000 events/second throughput
- <100μs average event latency
- <1MB memory per 1000 events
- Zero event loss under load
Stress Testing Requirements
- 24-hour continuous operation
- 10,000 concurrent subscriptions
- Memory leak detection
- Thread safety validation
Risk Mitigation
Technical Risks
- Event Storm: Rate limiting and backpressure
- Memory Growth: Event object pooling
- Deadlocks: Lock-free structures where possible
- Event Loss: Persistent queue option for critical events
Integration Risks
- Hook Conflicts: Careful hook installation/removal
- Performance Impact: Async processing with dedicated threads
- Backward Compatibility: Optional event system activation
Success Criteria
Functional Requirements
- ✅ Issue #1 (login group behavior) fixed
- ✅ All polling converted to events
- ✅ Real-time event propagation
- ✅ Zero event loss under normal operation
- ✅ Proper event ordering maintained
Performance Requirements
- ✅ <100μs event processing latency
- ✅ 100,000 events/second throughput
- ✅ <0.1% CPU overhead
- ✅ <1MB memory per 1000 events
Quality Requirements
- ✅ 100% test coverage
- ✅ Zero memory leaks
- ✅ Thread-safe operations
- ✅ Complete documentation
Agent Coordination Matrix
| Task | Primary Agent | Support Agents | Review Agent |
|---|---|---|---|
| 4.1 | cpp-architecture-optimizer | concurrency-threading-specialist | code-quality-reviewer |
| 4.2 | wow-bot-behavior-designer | trinity-integration-tester | cpp-architecture-optimizer |
| 4.3 | wow-mechanics-expert | pvp-arena-tactician | trinity-integration-tester |
| 4.4 | trinity-integration-tester | wow-economy-manager | wow-bot-behavior-designer |
| 4.5 | concurrency-threading-specialist | resource-monitor-limiter | cpp-architecture-optimizer |
| 4.6 | cpp-architecture-optimizer | code-quality-reviewer | concurrency-threading-specialist |
| 4.7 | resource-monitor-limiter | windows-memory-profiler | test-automation-engineer |
| 4.8 | test-automation-engineer | trinity-integration-tester | code-quality-reviewer |
| 4.9 | resource-monitor-limiter | concurrency-threading-specialist | cpp-architecture-optimizer |
| 4.10 | code-quality-reviewer | test-automation-engineer | cpp-architecture-optimizer |
Rollback Strategy
Phase 4 Rollback Points
- Pre-Event: Before event system implementation
- Core-Complete: After core event system
- Observers-Ready: After all observers implemented
- Production: After full validation
Rollback Procedure
# Checkpoint creation
git tag phase4-checkpoint-1 # Before event system
git tag phase4-checkpoint-2 # After core system
git tag phase4-checkpoint-3 # After observers
git tag phase4-complete # Production ready
# Emergency rollback
./scripts/rollback_phase4.sh [checkpoint-number]
Deliverables Checklist
Code Deliverables
- BotEventSystem.h/cpp (750 lines)
- GroupEventObserver.h/cpp (450 lines)
- CombatEventObserver.h/cpp (450 lines)
- WorldEventObserver.h/cpp (450 lines)
- EventQueue.h/cpp (400 lines)
- EventSubscription.h/cpp (350 lines)
- EventMetrics.h/cpp (300 lines)
Test Deliverables
- Unit tests (1500+ lines)
- Integration tests (1000+ lines)
- Performance benchmarks
- Stress test scenarios
Documentation Deliverables
- API reference
- Migration guide
- Best practices guide
- Performance tuning guide
Phase 4 Complete Validation
Exit Criteria
- Issue #1 completely resolved
- All polling converted to events
- Performance targets met
- Zero regression in functionality
- Full test coverage achieved
Estimated Completion: 70 hours (mid-range of 60-80 hour estimate) Confidence Level: 92% (proven event-driven patterns)