From 1fcd6c5cda3d964608ccae8c7b2d543ff6553666 Mon Sep 17 00:00:00 2001 From: bashermens <31279994+hermensbas@users.noreply.github.com> Date: Thu, 25 Dec 2025 02:07:59 +0100 Subject: [PATCH] Quickfix: performance problems (XP gain when master has XP turned off) (#1947) Disable bot XP gain when master has XP turned off feature has a big performance impact. Instead of reverting placed back to original code before the feature PR's for now as quickfix --- src/Playerbots.cpp | 41 ++++++++++++++--------------------------- 1 file changed, 14 insertions(+), 27 deletions(-) diff --git a/src/Playerbots.cpp b/src/Playerbots.cpp index c9c26ee8..66e74201 100644 --- a/src/Playerbots.cpp +++ b/src/Playerbots.cpp @@ -264,46 +264,33 @@ public: void OnPlayerGiveXP(Player* player, uint32& amount, Unit* /*victim*/, uint8 /*xpSource*/) override { - if (!player || !player->IsInWorld()) + // early return + if (sPlayerbotAIConfig->randomBotXPRate == 1.0 || !player) return; - if (WorldSession* session = player->GetSession(); !session || !session->IsBot()) + // no XP multiplier, when player is no bot. + if (!player->GetSession()->IsBot() || !sRandomPlayerbotMgr->IsRandomBot(player)) return; - PlayerbotAI* botAI = GET_PLAYERBOT_AI(player); - if (!botAI) - return; - - // No XP gain if master is a real player with XP gain disabled - if (const Player* master = botAI->GetMaster()) - { - if (WorldSession* masterSession = master->GetSession(); - masterSession && !masterSession->IsBot() && - master->HasPlayerFlag(PLAYER_FLAGS_NO_XP_GAIN)) - { - amount = 0; // disable XP multiplier - return; - } - } - - // From here on we only care about random bots - if (sPlayerbotAIConfig->randomBotXPRate == 1.0f || !sRandomPlayerbotMgr->IsRandomBot(player)) - return; - - // No XP multiplier if bot is in a group with at least one real player + // no XP multiplier, when bot is in a group with a real player. if (Group* group = player->GetGroup()) { for (GroupReference* gref = group->GetFirstMember(); gref; gref = gref->next()) { - if (Player* member = gref->GetSource()) + Player* member = gref->GetSource(); + if (!member) { - if (WorldSession* session = member->GetSession();session && !session->IsBot()) - return; + continue; + } + + if (!member->GetSession()->IsBot()) + { + return; } } } - // Otherwise apply XP multiplier + // otherwise apply bot XP multiplier. amount = static_cast(std::round(static_cast(amount) * sPlayerbotAIConfig->randomBotXPRate)); } };