From 481c2494bbc6b5b7be2c7df9f6c8c62b7a0c90b8 Mon Sep 17 00:00:00 2001 From: Atidot3 Date: Tue, 6 Aug 2024 10:50:01 +0200 Subject: [PATCH 1/4] Fix oil issue --- src/PlayerbotAI.cpp | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 0b4db3ef..3e7afb5e 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -4388,14 +4388,14 @@ Item* PlayerbotAI::FindStoneFor(Item* weapon) const return stone; } -static const uint32 uPriorizedWizardOilIds[5] = {MINOR_WIZARD_OIL, LESSER_WIZARD_OIL, BRILLIANT_WIZARD_OIL, WIZARD_OIL, - SUPERIOR_WIZARD_OIL}; +static const std::vector uPriorizedWizardOilIds = +{ + MINOR_WIZARD_OIL, LESSER_WIZARD_OIL, BRILLIANT_WIZARD_OIL, WIZARD_OIL, SUPERIOR_WIZARD_OIL +}; -static const uint32 uPriorizedManaOilIds[4] = { - MINOR_MANA_OIL, - LESSER_MANA_OIL, - BRILLIANT_MANA_OIL, - SUPERIOR_MANA_OIL, +static const std::vector uPriorizedManaOilIds = +{ + MINOR_MANA_OIL, LESSER_MANA_OIL, BRILLIANT_MANA_OIL, SUPERIOR_MANA_OIL, }; Item* PlayerbotAI::FindOilFor(Item* weapon) const @@ -4405,25 +4405,22 @@ Item* PlayerbotAI::FindOilFor(Item* weapon) const if (pProto && (pProto->SubClass == ITEM_SUBCLASS_WEAPON_SWORD || pProto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF || pProto->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER)) { - for (uint8 i = 0; i < std::size(uPriorizedWizardOilIds); ++i) + for (const auto& id : uPriorizedWizardOilIds) { - oil = FindConsumable(uPriorizedWizardOilIds[i]); + oil = FindConsumable(uPriorizedWizardOilIds[id]); if (!oil) - oil = FindConsumable(uPriorizedManaOilIds[i]); - + oil = FindConsumable(uPriorizedManaOilIds[id]); if (oil) return oil; } } - else if (pProto && - (pProto->SubClass == ITEM_SUBCLASS_WEAPON_MACE || pProto->SubClass == ITEM_SUBCLASS_WEAPON_MACE2)) + else if (pProto && (pProto->SubClass == ITEM_SUBCLASS_WEAPON_MACE || pProto->SubClass == ITEM_SUBCLASS_WEAPON_MACE2)) { - for (uint8 i = 0; i < std::size(uPriorizedManaOilIds); ++i) + for (const auto& id : uPriorizedManaOilIds) { - oil = FindConsumable(uPriorizedManaOilIds[i]); + oil = FindConsumable(uPriorizedManaOilIds[id]); if (!oil) - oil = FindConsumable(uPriorizedWizardOilIds[i]); - + oil = FindConsumable(uPriorizedWizardOilIds[id]); if (oil) return oil; } @@ -4924,4 +4921,4 @@ uint8 PlayerbotAI::FindEquipSlot(ItemTemplate const* proto, uint32 slot, bool sw // no free position return NULL_SLOT; -} \ No newline at end of file +} From bfa3172ea44649d8970e3d34ffbc79fbc6b18f9f Mon Sep 17 00:00:00 2001 From: antony Date: Wed, 7 Aug 2024 09:18:31 +0200 Subject: [PATCH 2/4] fix the fix --- src/PlayerbotAI.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 3e7afb5e..117f6263 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -4407,9 +4407,9 @@ Item* PlayerbotAI::FindOilFor(Item* weapon) const { for (const auto& id : uPriorizedWizardOilIds) { - oil = FindConsumable(uPriorizedWizardOilIds[id]); + oil = FindConsumable(id); if (!oil) - oil = FindConsumable(uPriorizedManaOilIds[id]); + oil = FindConsumable(id); if (oil) return oil; } @@ -4418,9 +4418,9 @@ Item* PlayerbotAI::FindOilFor(Item* weapon) const { for (const auto& id : uPriorizedManaOilIds) { - oil = FindConsumable(uPriorizedManaOilIds[id]); + oil = FindConsumable(id); if (!oil) - oil = FindConsumable(uPriorizedWizardOilIds[id]); + oil = FindConsumable(id); if (oil) return oil; } From 1f70acb06efeecb26163c6745e8c284fe12933c4 Mon Sep 17 00:00:00 2001 From: antony Date: Thu, 8 Aug 2024 16:12:57 +0200 Subject: [PATCH 3/4] Fix oil priority based on weapon type and code reduncy --- src/PlayerbotAI.cpp | 54 +++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 117f6263..20c1c09d 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -4388,40 +4388,50 @@ Item* PlayerbotAI::FindStoneFor(Item* weapon) const return stone; } -static const std::vector uPriorizedWizardOilIds = -{ - MINOR_WIZARD_OIL, LESSER_WIZARD_OIL, BRILLIANT_WIZARD_OIL, WIZARD_OIL, SUPERIOR_WIZARD_OIL -}; - -static const std::vector uPriorizedManaOilIds = -{ - MINOR_MANA_OIL, LESSER_MANA_OIL, BRILLIANT_MANA_OIL, SUPERIOR_MANA_OIL, -}; - Item* PlayerbotAI::FindOilFor(Item* weapon) const { + if (!weapon) + return nullptr; + + const ItemTemplate* item_template = weapon->GetTemplate(); + if (!item_template) + return nullptr; + + // static const will only get created once whatever the call amout + static const std::vector uPriorizedWizardOilIds = + { + MINOR_WIZARD_OIL, MINOR_MANA_OIL, + LESSER_WIZARD_OIL, LESSER_MANA_OIL, + BRILLIANT_WIZARD_OIL, BRILLIANT_MANA_OIL, + WIZARD_OIL, SUPERIOR_MANA_OIL, SUPERIOR_WIZARD_OIL + }; + + // static const will only get created once whatever the call amout + static const std::vector uPriorizedManaOilIds = + { + MINOR_MANA_OIL, MINOR_WIZARD_OIL, + LESSER_MANA_OIL, LESSER_WIZARD_OIL, + BRILLIANT_MANA_OIL, BRILLIANT_WIZARD_OIL, + SUPERIOR_MANA_OIL, WIZARD_OIL, SUPERIOR_WIZARD_OIL + }; + Item* oil = nullptr; - ItemTemplate const* pProto = weapon->GetTemplate(); - if (pProto && (pProto->SubClass == ITEM_SUBCLASS_WEAPON_SWORD || pProto->SubClass == ITEM_SUBCLASS_WEAPON_STAFF || - pProto->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER)) + if (item_template->SubClass == ITEM_SUBCLASS_WEAPON_SWORD || + item_template->SubClass == ITEM_SUBCLASS_WEAPON_STAFF || + item_template->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER) { for (const auto& id : uPriorizedWizardOilIds) { - oil = FindConsumable(id); - if (!oil) - oil = FindConsumable(id); - if (oil) + if (oil = FindConsumable(id)) return oil; } } - else if (pProto && (pProto->SubClass == ITEM_SUBCLASS_WEAPON_MACE || pProto->SubClass == ITEM_SUBCLASS_WEAPON_MACE2)) + else if (item_template->SubClass == ITEM_SUBCLASS_WEAPON_MACE || + item_template->SubClass == ITEM_SUBCLASS_WEAPON_MACE2) { for (const auto& id : uPriorizedManaOilIds) { - oil = FindConsumable(id); - if (!oil) - oil = FindConsumable(id); - if (oil) + if (oil = FindConsumable(id)) return oil; } } From 4d5dd0e2fc2f3f9d0412f816c9b981897b4ada0c Mon Sep 17 00:00:00 2001 From: Christoph Wilk Date: Tue, 13 Aug 2024 17:38:57 +0900 Subject: [PATCH 4/4] Performance Monitor Improvements: 1. Added command for runtime toggle 2. Changed where tick time is captured to properly capture per-tick statistics (matching cmangos playerbots) --- src/PerformanceMonitor.cpp | 20 ++++++++++---------- src/PlayerbotAIBase.cpp | 5 +++++ src/PlayerbotAIBase.h | 1 + src/RandomPlayerbotMgr.cpp | 2 +- src/RandomPlayerbotMgr.h | 3 +-- src/cs_playerbots.cpp | 10 ++++++++++ 6 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/PerformanceMonitor.cpp b/src/PerformanceMonitor.cpp index 6219576e..dfe2fbd5 100644 --- a/src/PerformanceMonitor.cpp +++ b/src/PerformanceMonitor.cpp @@ -78,13 +78,13 @@ void PerformanceMonitor::PrintStats(bool perTick, bool fullStack) switch (i->first) { case PERF_MON_TRIGGER: - key = "T"; + key = "Trigger"; break; case PERF_MON_VALUE: - key = "V"; + key = "Value"; break; case PERF_MON_ACTION: - key = "A"; + key = "Action"; break; case PERF_MON_RNDBOT: key = "RndBot"; @@ -152,8 +152,8 @@ void PerformanceMonitor::PrintStats(bool perTick, bool fullStack) } else { - float fullTickCount = data[PERF_MON_TOTAL]["RandomPlayerbotMgr::FullTick"]->count; - float fullTickTotalTime = data[PERF_MON_TOTAL]["RandomPlayerbotMgr::FullTick"]->totalTime; + float fullTickCount = data[PERF_MON_TOTAL]["PlayerbotAIBase::FullTick"]->count; + float fullTickTotalTime = data[PERF_MON_TOTAL]["PlayerbotAIBase::FullTick"]->totalTime; LOG_INFO( "playerbots", @@ -173,13 +173,13 @@ void PerformanceMonitor::PrintStats(bool perTick, bool fullStack) switch (i->first) { case PERF_MON_TRIGGER: - key = "T"; + key = "Trigger"; break; case PERF_MON_VALUE: - key = "V"; + key = "Value"; break; case PERF_MON_ACTION: - key = "A"; + key = "Action"; break; case PERF_MON_RNDBOT: key = "RndBot"; @@ -231,7 +231,7 @@ void PerformanceMonitor::PrintStats(bool perTick, bool fullStack) time, minTime, maxTime, avg, amount, key.c_str(), disName.c_str()); } } - if (PERF_MON_TOTAL != i->first) + if (i->first != PERF_MON_TOTAL) { float tPerc = (float)typeTotalTime / (float)fullTickTotalTime * 100.0f; float tTime = (float)typeTotalTime / fullTickCount / 1000.0f; @@ -278,7 +278,7 @@ void PerformanceMonitorOperation::finish() std::chrono::microseconds finished = (std::chrono::time_point_cast(std::chrono::high_resolution_clock::now())) .time_since_epoch(); - uint64_t elapsed = (finished - started).count(); + uint64 elapsed = (finished - started).count(); std::lock_guard guard(data->lock); if (elapsed > 0) diff --git a/src/PlayerbotAIBase.cpp b/src/PlayerbotAIBase.cpp index 57b40727..b26a3e64 100644 --- a/src/PlayerbotAIBase.cpp +++ b/src/PlayerbotAIBase.cpp @@ -11,6 +11,11 @@ PlayerbotAIBase::PlayerbotAIBase(bool isBotAI) : nextAICheckDelay(0), _isBotAI(i void PlayerbotAIBase::UpdateAI(uint32 elapsed, bool minimal) { + if (totalPmo) + totalPmo->finish(); + + totalPmo = sPerformanceMonitor->start(PERF_MON_TOTAL, "PlayerbotAIBase::FullTick"); + if (nextAICheckDelay > elapsed) nextAICheckDelay -= elapsed; else diff --git a/src/PlayerbotAIBase.h b/src/PlayerbotAIBase.h index 66fec542..a1322211 100644 --- a/src/PlayerbotAIBase.h +++ b/src/PlayerbotAIBase.h @@ -24,6 +24,7 @@ public: protected: uint32 nextAICheckDelay; + class PerformanceMonitorOperation* totalPmo = nullptr; private: bool _isBotAI; diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 29bc672d..cc806663 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -153,7 +153,7 @@ double botPIDImpl::calculate(double setpoint, double pv) botPIDImpl::~botPIDImpl() {} -RandomPlayerbotMgr::RandomPlayerbotMgr() : PlayerbotHolder(), processTicks(0), totalPmo(nullptr) +RandomPlayerbotMgr::RandomPlayerbotMgr() : PlayerbotHolder(), processTicks(0) { playersLevel = sPlayerbotAIConfig->randombotStartingLevel; diff --git a/src/RandomPlayerbotMgr.h b/src/RandomPlayerbotMgr.h index cfc82dfb..f1e80ab6 100644 --- a/src/RandomPlayerbotMgr.h +++ b/src/RandomPlayerbotMgr.h @@ -204,9 +204,8 @@ private: std::list currentBots; uint32 bgBotsCount; uint32 playersLevel; - PerformanceMonitorOperation* totalPmo; }; #define sRandomPlayerbotMgr RandomPlayerbotMgr::instance() -#endif \ No newline at end of file +#endif diff --git a/src/cs_playerbots.cpp b/src/cs_playerbots.cpp index a96dc6e3..e39b7f33 100644 --- a/src/cs_playerbots.cpp +++ b/src/cs_playerbots.cpp @@ -83,6 +83,16 @@ public: return true; } + if (!strcmp(args, "toggle")) + { + sPlayerbotAIConfig->perfMonEnabled = !sPlayerbotAIConfig->perfMonEnabled; + if (sPlayerbotAIConfig->perfMonEnabled) + LOG_INFO("playerbots", "Performance monitor enabled"); + else + LOG_INFO("playerbots", "Performance monitor disabled"); + return true; + } + sPerformanceMonitor->PrintStats(); return true; }