From 15f138aab0606f7592931103469706a0874b60a3 Mon Sep 17 00:00:00 2001 From: bash <31279994+hermensbas@users.noreply.github.com> Date: Sun, 10 Aug 2025 18:28:39 +0200 Subject: [PATCH] Don't apply XPRate multiplier when bot is in group with real player (#1495) * dont apply XPRate if bot is in group with real player https://github.com/liyunfan1223/mod-playerbots/issues/1490 * Optimize code * Oops minor correction * Defense check on the player itself * Safer way to check the leader is real player. * Added abit more defense programming, should be needed still ..why not --- src/Playerbots.cpp | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/Playerbots.cpp b/src/Playerbots.cpp index 27c4c685..76b32efa 100644 --- a/src/Playerbots.cpp +++ b/src/Playerbots.cpp @@ -209,16 +209,30 @@ public: void OnPlayerGiveXP(Player* player, uint32& amount, Unit* /*victim*/, uint8 /*xpSource*/) override { - if (!player->GetSession()->IsBot()) - return; - - if (!sRandomPlayerbotMgr->IsRandomBot(player)) + // early return + if (sPlayerbotAIConfig->randomBotXPRate == 1.0 || !player) return; - if (sPlayerbotAIConfig->randomBotXPRate != 1.0) + // no XP multiplier, when player is no bot. + if (!player->GetSession()->IsBot() || !sRandomPlayerbotMgr->IsRandomBot(player)) + return; + + // no XP multiplier, when bot has group where leader is a real player. + if (Group* group = player->GetGroup()) { - amount = static_cast(std::round(static_cast(amount) * sPlayerbotAIConfig->randomBotXPRate)); + Player* leader = group->GetLeader(); + if (leader && leader != player) + { + if (PlayerbotAI* leaderBotAI = GET_PLAYERBOT_AI(leader)) + { + if (leaderBotAI->HasRealPlayerMaster()) + return; + } + } } + + // otherwise apply bot XP multiplier. + amount = static_cast(std::round(static_cast(amount) * sPlayerbotAIConfig->randomBotXPRate)); } };