Skip playerbots so bot re-rolls don't spam the realm #1

Merged
yrtria merged 1 commit from fix/skip-playerbots into main 2026-09-03 11:21:46 -06:00
2 changed files with 37 additions and 1 deletions

View file

@ -19,3 +19,12 @@ Congrats.Announce = 1
# ID Acore String Message
Congrats.Acore.String.ID = 60000
# Ignore Playerbots entirely? (1: true | 0: false)
#
# PlayerbotFactory calls Player::GiveLevel() whenever it randomises a bot, which fires
# the same level-changed hook a real ding does. With this off, every bot re-roll past a
# reward level broadcasts to the whole server and hands the bot gold and items.
# Has no effect on a core built without mod-playerbots.
Congrats.SkipBots = 1

View file

@ -69,15 +69,35 @@ config file for quick modifications.
#include "ScriptMgr.h"
#include "WorldSessionMgr.h"
#ifdef MOD_PLAYERBOTS
#include "PlayerbotAI.h"
#include "Playerbots.h"
#endif
struct COL
{
uint32 acoreMessageId;
bool congratsAnnounce, congratsEnable;
bool CongratsPerLevelEnable;
bool skipBots;
};
COL col;
// On a Playerbots server PlayerbotFactory calls Player::GiveLevel() every time it
// randomises a bot, which fires OnPlayerLevelChanged exactly like a real ding. Left
// unchecked that means a server-wide broadcast and a bag of reward items per bot
// re-roll. Bots are skipped by default; set Congrats.SkipBots = 0 to include them.
static bool IsPlayerbot(Player* player)
{
#ifdef MOD_PLAYERBOTS
return player && GET_PLAYERBOT_AI(player) != nullptr;
#else
(void)player;
return false;
#endif
}
uint32 giveAward(Player* player)
{
QueryResult result = WorldDatabase.Query("SELECT * FROM `mod_congrats_on_level_items` WHERE `level`={} AND (`race`={} OR `race`=0) AND (`class`={} OR `class`=0)", player->GetLevel(), player->getRace(), player->getClass());
@ -122,8 +142,11 @@ public:
PLAYERHOOK_ON_LOGIN
}) {}
void OnPlayerLogin(Player* player)
void OnPlayerLogin(Player* player) override
{
if (col.skipBots && IsPlayerbot(player))
return;
// Announce Module
if (col.congratsAnnounce)
ChatHandler(player->GetSession()).SendSysMessage(col.acoreMessageId);
@ -140,6 +163,9 @@ public:
// Level Up Rewards
void OnPlayerLevelChanged(Player* player, uint8 oldLevel) override
{
if (col.skipBots && IsPlayerbot(player))
return;
// If enabled...
if (col.congratsEnable)
{
@ -297,6 +323,7 @@ public:
col.congratsAnnounce = sConfigMgr->GetOption<uint32>("Congrats.Announce", 1);
col.congratsEnable = sConfigMgr->GetOption<uint32>("Congrats.Enable", 1);
col.CongratsPerLevelEnable = sConfigMgr->GetOption<uint32>("CongratsPerLevel.Enable", 1);
col.skipBots = sConfigMgr->GetOption<uint32>("Congrats.SkipBots", 1);
}
}
};