Improve XP rate config (#1035)

This commit is contained in:
Yunfan Li
2025-02-28 08:05:08 +08:00
committed by GitHub
parent 67d805f700
commit a3e305fbed
5 changed files with 39 additions and 24 deletions

View File

@@ -369,9 +369,9 @@ AiPlayerbot.AggroDistance = 22
# #
# #
# Set kill XP rate for bots (default: 1) # Set XP rate for bots (default: 1.0)
# Server XP Rate * AiPlayerbot.KillXPRate # Server XP Rate * AiPlayerbot.PlayerbotsXPRate
AiPlayerbot.KillXPRate = 1 AiPlayerbot.PlayerbotsXPRate = 1.0
# Health/Mana levels # Health/Mana levels
AiPlayerbot.CriticalHealth = 25 AiPlayerbot.CriticalHealth = 25

View File

@@ -481,7 +481,7 @@ bool PlayerbotAIConfig::Initialize()
autoGearQualityLimit = sConfigMgr->GetOption<int32>("AiPlayerbot.AutoGearQualityLimit", 3); autoGearQualityLimit = sConfigMgr->GetOption<int32>("AiPlayerbot.AutoGearQualityLimit", 3);
autoGearScoreLimit = sConfigMgr->GetOption<int32>("AiPlayerbot.AutoGearScoreLimit", 0); autoGearScoreLimit = sConfigMgr->GetOption<int32>("AiPlayerbot.AutoGearScoreLimit", 0);
playerbotsXPrate = sConfigMgr->GetOption<int32>("AiPlayerbot.KillXPRate", 1); playerbotsXPrate = sConfigMgr->GetOption<float>("AiPlayerbot.PlayerbotsXPRate", 1.0);
randomBotAllianceRatio = sConfigMgr->GetOption<int32>("AiPlayerbot.RandomBotAllianceRatio", 50); randomBotAllianceRatio = sConfigMgr->GetOption<int32>("AiPlayerbot.RandomBotAllianceRatio", 50);
randomBotHordeRatio = sConfigMgr->GetOption<int32>("AiPlayerbot.RandomBotHordeRatio", 50); randomBotHordeRatio = sConfigMgr->GetOption<int32>("AiPlayerbot.RandomBotHordeRatio", 50);
disableDeathKnightLogin = sConfigMgr->GetOption<bool>("AiPlayerbot.DisableDeathKnightLogin", 0); disableDeathKnightLogin = sConfigMgr->GetOption<bool>("AiPlayerbot.DisableDeathKnightLogin", 0);

View File

@@ -275,7 +275,7 @@ public:
bool randomBotShowCloak; bool randomBotShowCloak;
bool randomBotFixedLevel; bool randomBotFixedLevel;
bool disableRandomLevels; bool disableRandomLevels;
uint32 playerbotsXPrate; float playerbotsXPrate;
uint32 randomBotAllianceRatio; uint32 randomBotAllianceRatio;
uint32 randomBotHordeRatio; uint32 randomBotHordeRatio;
bool disableDeathKnightLogin; bool disableDeathKnightLogin;

View File

@@ -23,6 +23,8 @@
#include "DatabaseLoader.h" #include "DatabaseLoader.h"
#include "GuildTaskMgr.h" #include "GuildTaskMgr.h"
#include "Metric.h" #include "Metric.h"
#include "PlayerScript.h"
#include "PlayerbotAIConfig.h"
#include "RandomPlayerbotMgr.h" #include "RandomPlayerbotMgr.h"
#include "ScriptMgr.h" #include "ScriptMgr.h"
#include "cs_playerbots.h" #include "cs_playerbots.h"
@@ -83,7 +85,8 @@ public:
PLAYERHOOK_ON_CHAT_WITH_GROUP, PLAYERHOOK_ON_CHAT_WITH_GROUP,
PLAYERHOOK_ON_BEFORE_CRITERIA_PROGRESS, PLAYERHOOK_ON_BEFORE_CRITERIA_PROGRESS,
PLAYERHOOK_ON_BEFORE_ACHI_COMPLETE, PLAYERHOOK_ON_BEFORE_ACHI_COMPLETE,
PLAYERHOOK_CAN_PLAYER_USE_PRIVATE_CHAT PLAYERHOOK_CAN_PLAYER_USE_PRIVATE_CHAT,
PLAYERHOOK_ON_GIVE_EXP
}) {} }) {}
void OnPlayerLogin(Player* player) override void OnPlayerLogin(Player* player) override
@@ -210,6 +213,17 @@ public:
} }
return true; return true;
} }
void OnPlayerGiveXP(Player* player, uint32& amount, Unit* /*victim*/, uint8 /*xpSource*/) override
{
if (!player->GetSession()->IsBot())
return;
if (sPlayerbotAIConfig->playerbotsXPrate != 1.0)
{
amount = static_cast<uint32>(std::round(static_cast<float>(amount) * sPlayerbotAIConfig->playerbotsXPrate));
}
}
}; };
class PlayerbotsMiscScript : public MiscScript class PlayerbotsMiscScript : public MiscScript

View File

@@ -18,21 +18,21 @@ bool XpGainAction::Execute(Event event)
WorldPacket p(event.getPacket()); // (8+4+1+4+8) WorldPacket p(event.getPacket()); // (8+4+1+4+8)
ObjectGuid guid; ObjectGuid guid;
uint32 xpgain; // uint32 xpgain;
uint8 type = 0; // 00-kill_xp type, 01-non_kill_xp type // uint8 type = 0; // 00-kill_xp type, 01-non_kill_xp type
uint32 givenXp = 0; // uint32 givenXp = 0;
float groupBonus = 0; // float groupBonus = 0;
p.rpos(0); p.rpos(0);
p >> guid; // 8 victim p >> guid; // 8 victim
p >> xpgain; // 1 given experience // p >> xpgain; // 1 given experience
p >> type; // 1 00-kill_xp type, 01-non_kill_xp type // p >> type; // 1 00-kill_xp type, 01-non_kill_xp type
if (!type) // if (!type)
{ // {
p >> givenXp; // 4 experience without rested bonus // p >> givenXp; // 4 experience without rested bonus
p >> groupBonus; // 8 group bonus // p >> groupBonus; // 8 group bonus
} // }
Creature* creature = botAI->GetCreature(guid); Creature* creature = botAI->GetCreature(guid);
if (creature && !creature->GetMap()->IsDungeon()) if (creature && !creature->GetMap()->IsDungeon())
@@ -40,15 +40,16 @@ bool XpGainAction::Execute(Event event)
BroadcastHelper::BroadcastKill(botAI, bot, creature); BroadcastHelper::BroadcastKill(botAI, bot, creature);
} }
if (!sRandomPlayerbotMgr->IsRandomBot(bot) || sPlayerbotAIConfig->playerbotsXPrate == 1) // playerbotsXPrate is now implemented in OnPlayerGiveXP script
return true; // if (!sRandomPlayerbotMgr->IsRandomBot(bot) || sPlayerbotAIConfig->playerbotsXPrate == 1)
// return true;
Unit* victim = nullptr; // Unit* victim = nullptr;
if (guid) // if (guid)
victim = botAI->GetUnit(guid); // victim = botAI->GetUnit(guid);
xpgain = xpgain * (sPlayerbotAIConfig->playerbotsXPrate - 1); // xpgain = xpgain * (sPlayerbotAIConfig->playerbotsXPrate - 1);
GiveXP(xpgain, victim); // GiveXP(xpgain, victim);
return true; return true;
} }