From 1faf20f567efbee6978622c378d8c1b33c722eed Mon Sep 17 00:00:00 2001 From: bash Date: Sun, 5 Oct 2025 20:05:56 +0200 Subject: [PATCH 1/4] removeFromGroup replaced with worldpackets --- src/PlayerbotAI.cpp | 20 +++-- src/PlayerbotAI.h | 1 + src/PlayerbotMgr.cpp | 4 +- src/RandomPlayerbotMgr.cpp | 94 ++++++++++++----------- src/strategy/actions/LeaveGroupAction.cpp | 8 +- 5 files changed, 69 insertions(+), 58 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index 9019724e..d9d79261 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -378,10 +378,7 @@ void PlayerbotAI::UpdateAIGroupMembership() PlayerbotAI* leaderAI = GET_PLAYERBOT_AI(leader); if (leaderAI && !leaderAI->IsRealPlayer()) { - WorldPacket* packet = new WorldPacket(CMSG_GROUP_DISBAND); - bot->GetSession()->QueuePacket(packet); - // bot->RemoveFromGroup(); - ResetStrategies(); + RemoveFromGroup(); } } } @@ -405,10 +402,7 @@ void PlayerbotAI::UpdateAIGroupMembership() } if (!hasRealPlayer) { - WorldPacket* packet = new WorldPacket(CMSG_GROUP_DISBAND); - bot->GetSession()->QueuePacket(packet); - // bot->RemoveFromGroup(); - ResetStrategies(); + RemoveFromGroup(); } } } @@ -791,6 +785,16 @@ void PlayerbotAI::Reset(bool full) } } +void PlayerbotAI::RemoveFromGroup() +{ + if (!bot || !bot->GetGroup() || bot->IsRealPlayer()) + return; + + WorldPacket* packet = new WorldPacket(CMSG_GROUP_DISBAND); + bot->GetSession()->QueuePacket(packet); + ResetStrategies(); +} + bool PlayerbotAI::IsAllowedCommand(std::string const text) { if (unsecuredCommands.empty()) diff --git a/src/PlayerbotAI.h b/src/PlayerbotAI.h index 04deae3a..d38f1b98 100644 --- a/src/PlayerbotAI.h +++ b/src/PlayerbotAI.h @@ -415,6 +415,7 @@ public: void ResetStrategies(bool load = false); void ReInitCurrentEngine(); void Reset(bool full = false); + void PlayerbotAI::RemoveFromGroup() static bool IsTank(Player* player, bool bySpec = false); static bool IsHeal(Player* player, bool bySpec = false); static bool IsDps(Player* player, bool bySpec = false); diff --git a/src/PlayerbotMgr.cpp b/src/PlayerbotMgr.cpp index ba0f4e39..f5aefe45 100644 --- a/src/PlayerbotMgr.cpp +++ b/src/PlayerbotMgr.cpp @@ -514,12 +514,12 @@ void PlayerbotHolder::OnBotLogin(Player* const bot) if (!groupValid) { - bot->RemoveFromGroup(); + botAI->RemoveFromGroup(); } } group = bot->GetGroup(); - if (group) + if (!group) { botAI->ResetStrategies(); } diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index ab28c25d..07664f86 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -1517,33 +1517,38 @@ bool RandomPlayerbotMgr::ProcessBot(uint32 bot) return false; } -bool RandomPlayerbotMgr::ProcessBot(Player* player) +bool RandomPlayerbotMgr::ProcessBot(Player* bot) { - uint32 bot = player->GetGUID().GetCounter(); - if (player->InBattleground()) + PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (botAI) return false; - if (player->InBattlegroundQueue()) + if (bot->InBattleground()) return false; + if (bot->InBattlegroundQueue()) + return false; + + uint32 botId = bot->GetGUID().GetCounter(); + // if death revive - if (player->isDead()) + if (bot->isDead()) { - if (!GetEventValue(bot, "dead")) + if (!GetEventValue(botId, "dead")) { uint32 randomTime = urand(sPlayerbotAIConfig->minRandomBotReviveTime, sPlayerbotAIConfig->maxRandomBotReviveTime); - LOG_DEBUG("playerbots", "Mark bot {} as dead, will be revived in {}s.", player->GetName().c_str(), + LOG_DEBUG("playerbots", "Mark bot {} as dead, will be revived in {}s.", bot->GetName().c_str(), randomTime); - SetEventValue(bot, "dead", 1, sPlayerbotAIConfig->maxRandomBotInWorldTime); - SetEventValue(bot, "revive", 1, randomTime); + SetEventValue(botId, "dead", 1, sPlayerbotAIConfig->maxRandomBotInWorldTime); + SetEventValue(botId, "revive", 1, randomTime); return false; } - if (!GetEventValue(bot, "revive")) + if (!GetEventValue(botId, "revive")) { - Revive(player); + Revive(bot); return true; } @@ -1551,34 +1556,31 @@ bool RandomPlayerbotMgr::ProcessBot(Player* player) } // leave group if leader is rndbot - Group* group = player->GetGroup(); + Group* group = bot->GetGroup(); if (group && !group->isLFGGroup() && IsRandomBot(group->GetLeader())) { - player->RemoveFromGroup(); - LOG_INFO("playerbots", "Bot {} remove from group since leader is random bot.", player->GetName().c_str()); + botAI->RemoveFromGroup(); + LOG_INFO("playerbots", "Bot {} remove from group since leader is random bot.", bot->GetName().c_str()); } // only randomize and teleport idle bots bool idleBot = false; - PlayerbotAI* botAI = GET_PLAYERBOT_AI(player); - if (botAI) + if (TravelTarget* target = botAI->GetAiObjectContext()->GetValue("travel target")->Get()) { - if (TravelTarget* target = botAI->GetAiObjectContext()->GetValue("travel target")->Get()) - { - if (target->getTravelState() == TravelState::TRAVEL_STATE_IDLE) - { - idleBot = true; - } - } - else + if (target->getTravelState() == TravelState::TRAVEL_STATE_IDLE) { idleBot = true; } } + else + { + idleBot = true; + } + if (idleBot) { // randomize - uint32 randomize = GetEventValue(bot, "randomize"); + uint32 randomize = GetEventValue(botId, "randomize"); if (!randomize) { // bool randomiser = true; @@ -1602,12 +1604,12 @@ bool RandomPlayerbotMgr::ProcessBot(Player* player) // } // if (randomiser) // { - Randomize(player); - LOG_DEBUG("playerbots", "Bot #{} {}:{} <{}>: randomized", bot, - player->GetTeamId() == TEAM_ALLIANCE ? "A" : "H", player->GetLevel(), player->GetName()); + Randomize(bot); + LOG_DEBUG("playerbots", "Bot #{} {}:{} <{}>: randomized", botId, + bot->GetTeamId() == TEAM_ALLIANCE ? "A" : "H", bot->GetLevel(), bot->GetName()); uint32 randomTime = urand(sPlayerbotAIConfig->minRandomBotRandomizeTime, sPlayerbotAIConfig->maxRandomBotRandomizeTime); - ScheduleRandomize(bot, randomTime); + ScheduleRandomize(botId, randomTime); return true; } @@ -1619,15 +1621,15 @@ bool RandomPlayerbotMgr::ProcessBot(Player* player) // return true; // } - uint32 teleport = GetEventValue(bot, "teleport"); + uint32 teleport = GetEventValue(botId, "teleport"); if (!teleport) { - LOG_DEBUG("playerbots", "Bot #{} <{}>: teleport for level and refresh", bot, player->GetName()); - Refresh(player); - RandomTeleportForLevel(player); + LOG_DEBUG("playerbots", "Bot #{} <{}>: teleport for level and refresh", botId, bot->GetName()); + Refresh(bot); + RandomTeleportForLevel(bot); uint32 time = urand(sPlayerbotAIConfig->minRandomBotTeleportInterval, sPlayerbotAIConfig->maxRandomBotTeleportInterval); - ScheduleTeleport(bot, time); + ScheduleTeleport(botId, time); return true; } } @@ -2376,6 +2378,10 @@ void RandomPlayerbotMgr::IncreaseLevel(Player* bot) void RandomPlayerbotMgr::RandomizeFirst(Player* bot) { + PlayerbotAI* botAI = GET_PLAYERBOT_AI(player); + if (botAI) + return; + uint32 maxLevel = sPlayerbotAIConfig->randomBotMaxLevel; if (maxLevel > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) maxLevel = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); @@ -2433,7 +2439,6 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot) } SetValue(bot, "level", level); - PlayerbotFactory factory(bot, level); factory.Randomize(false); @@ -2455,11 +2460,10 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot) PlayerbotsDatabase.Execute(stmt); // teleport to a random inn for bot level - if (GET_PLAYERBOT_AI(bot)) - GET_PLAYERBOT_AI(bot)->Reset(true); + botAI->Reset(true); if (bot->GetGroup()) - bot->RemoveFromGroup(); + botAI->RemoveFromGroup(); if (pmo) pmo->finish(); @@ -2469,12 +2473,13 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot) void RandomPlayerbotMgr::RandomizeMin(Player* bot) { + PlayerbotAI* botAI = GET_PLAYERBOT_AI(player); + if (botAI) + return; + PerformanceMonitorOperation* pmo = sPerformanceMonitor->start(PERF_MON_RNDBOT, "RandomizeMin"); - uint32 level = sPlayerbotAIConfig->randomBotMinLevel; - SetValue(bot, "level", level); - PlayerbotFactory factory(bot, level); factory.Randomize(false); @@ -2496,11 +2501,10 @@ void RandomPlayerbotMgr::RandomizeMin(Player* bot) PlayerbotsDatabase.Execute(stmt); // teleport to a random inn for bot level - if (GET_PLAYERBOT_AI(bot)) - GET_PLAYERBOT_AI(bot)->Reset(true); + botAI->Reset(true); if (bot->GetGroup()) - bot->RemoveFromGroup(); + botAI->RemoveFromGroup(); if (pmo) pmo->finish(); @@ -2582,7 +2586,7 @@ void RandomPlayerbotMgr::Refresh(Player* bot) bot->SetMoney(money + 500 * sqrt(urand(1, bot->GetLevel() * 5))); if (bot->GetGroup()) - bot->RemoveFromGroup(); + botAI->RemoveFromGroup(); if (pmo) pmo->finish(); diff --git a/src/strategy/actions/LeaveGroupAction.cpp b/src/strategy/actions/LeaveGroupAction.cpp index 2773ce4b..45a95de7 100644 --- a/src/strategy/actions/LeaveGroupAction.cpp +++ b/src/strategy/actions/LeaveGroupAction.cpp @@ -70,10 +70,12 @@ bool UninviteAction::Execute(Event event) return false; } -bool LeaveGroupAction::Leave(Player* player) +static bool LeaveGroupAction::Leave(Player* player) { - if (player && !GET_PLAYERBOT_AI(player) && + if (player && + !botAI && !botAI->GetSecurity()->CheckLevelFor(PLAYERBOT_SECURITY_INVITE, false, player)) + return false; bool aiMaster = GET_PLAYERBOT_AI(botAI->GetMaster()) != nullptr; @@ -84,7 +86,7 @@ bool LeaveGroupAction::Leave(Player* player) bool shouldStay = randomBot && bot->GetGroup() && player == bot; if (!shouldStay) { - bot->RemoveFromGroup(); + botAI->RemoveFromGroup(); } if (randomBot) From 780f6d60e0387fb63d1a029ed338b753e83aab98 Mon Sep 17 00:00:00 2001 From: bash Date: Sun, 5 Oct 2025 23:49:13 +0200 Subject: [PATCH 2/4] fix build errors --- src/PlayerbotAI.cpp | 2 +- src/PlayerbotAI.h | 2 +- src/RandomPlayerbotMgr.cpp | 4 ++-- src/strategy/actions/LeaveGroupAction.cpp | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index d9d79261..aa161734 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -787,7 +787,7 @@ void PlayerbotAI::Reset(bool full) void PlayerbotAI::RemoveFromGroup() { - if (!bot || !bot->GetGroup() || bot->IsRealPlayer()) + if (!bot || !bot->GetGroup() || IsRealPlayer()) return; WorldPacket* packet = new WorldPacket(CMSG_GROUP_DISBAND); diff --git a/src/PlayerbotAI.h b/src/PlayerbotAI.h index d38f1b98..a5ac2bd8 100644 --- a/src/PlayerbotAI.h +++ b/src/PlayerbotAI.h @@ -415,7 +415,7 @@ public: void ResetStrategies(bool load = false); void ReInitCurrentEngine(); void Reset(bool full = false); - void PlayerbotAI::RemoveFromGroup() + void RemoveFromGroup(); static bool IsTank(Player* player, bool bySpec = false); static bool IsHeal(Player* player, bool bySpec = false); static bool IsDps(Player* player, bool bySpec = false); diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 07664f86..ebab628f 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -2378,7 +2378,7 @@ void RandomPlayerbotMgr::IncreaseLevel(Player* bot) void RandomPlayerbotMgr::RandomizeFirst(Player* bot) { - PlayerbotAI* botAI = GET_PLAYERBOT_AI(player); + PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); if (botAI) return; @@ -2473,7 +2473,7 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot) void RandomPlayerbotMgr::RandomizeMin(Player* bot) { - PlayerbotAI* botAI = GET_PLAYERBOT_AI(player); + PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); if (botAI) return; diff --git a/src/strategy/actions/LeaveGroupAction.cpp b/src/strategy/actions/LeaveGroupAction.cpp index 45a95de7..172bf399 100644 --- a/src/strategy/actions/LeaveGroupAction.cpp +++ b/src/strategy/actions/LeaveGroupAction.cpp @@ -70,7 +70,7 @@ bool UninviteAction::Execute(Event event) return false; } -static bool LeaveGroupAction::Leave(Player* player) +bool LeaveGroupAction::Leave(Player* player) { if (player && !botAI && From cf4f0f6dc770f24a628273b7bf635c081bb022c1 Mon Sep 17 00:00:00 2001 From: bash Date: Mon, 6 Oct 2025 21:07:43 +0200 Subject: [PATCH 3/4] renamed function name --- src/PlayerbotAI.cpp | 6 +++--- src/PlayerbotAI.h | 2 +- src/PlayerbotMgr.cpp | 2 +- src/RandomPlayerbotMgr.cpp | 8 ++++---- src/strategy/actions/LeaveGroupAction.cpp | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index aa161734..9a670961 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -378,7 +378,7 @@ void PlayerbotAI::UpdateAIGroupMembership() PlayerbotAI* leaderAI = GET_PLAYERBOT_AI(leader); if (leaderAI && !leaderAI->IsRealPlayer()) { - RemoveFromGroup(); + LeaveOrDisbandGroup(); } } } @@ -402,7 +402,7 @@ void PlayerbotAI::UpdateAIGroupMembership() } if (!hasRealPlayer) { - RemoveFromGroup(); + LeaveOrDisbandGroup(); } } } @@ -785,7 +785,7 @@ void PlayerbotAI::Reset(bool full) } } -void PlayerbotAI::RemoveFromGroup() +void PlayerbotAI::LeaveOrDisbandGroup() { if (!bot || !bot->GetGroup() || IsRealPlayer()) return; diff --git a/src/PlayerbotAI.h b/src/PlayerbotAI.h index a5ac2bd8..3ae3eaf2 100644 --- a/src/PlayerbotAI.h +++ b/src/PlayerbotAI.h @@ -415,7 +415,7 @@ public: void ResetStrategies(bool load = false); void ReInitCurrentEngine(); void Reset(bool full = false); - void RemoveFromGroup(); + void LeaveOrDisbandGroup(); static bool IsTank(Player* player, bool bySpec = false); static bool IsHeal(Player* player, bool bySpec = false); static bool IsDps(Player* player, bool bySpec = false); diff --git a/src/PlayerbotMgr.cpp b/src/PlayerbotMgr.cpp index f5aefe45..074c7a3b 100644 --- a/src/PlayerbotMgr.cpp +++ b/src/PlayerbotMgr.cpp @@ -514,7 +514,7 @@ void PlayerbotHolder::OnBotLogin(Player* const bot) if (!groupValid) { - botAI->RemoveFromGroup(); + botAI->LeaveOrDisbandGroup(); } } diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index ebab628f..1a28e40c 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -1559,7 +1559,7 @@ bool RandomPlayerbotMgr::ProcessBot(Player* bot) Group* group = bot->GetGroup(); if (group && !group->isLFGGroup() && IsRandomBot(group->GetLeader())) { - botAI->RemoveFromGroup(); + botAI->LeaveOrDisbandGroup(); LOG_INFO("playerbots", "Bot {} remove from group since leader is random bot.", bot->GetName().c_str()); } @@ -2463,7 +2463,7 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot) botAI->Reset(true); if (bot->GetGroup()) - botAI->RemoveFromGroup(); + botAI->LeaveOrDisbandGroup(); if (pmo) pmo->finish(); @@ -2504,7 +2504,7 @@ void RandomPlayerbotMgr::RandomizeMin(Player* bot) botAI->Reset(true); if (bot->GetGroup()) - botAI->RemoveFromGroup(); + botAI->LeaveOrDisbandGroup(); if (pmo) pmo->finish(); @@ -2586,7 +2586,7 @@ void RandomPlayerbotMgr::Refresh(Player* bot) bot->SetMoney(money + 500 * sqrt(urand(1, bot->GetLevel() * 5))); if (bot->GetGroup()) - botAI->RemoveFromGroup(); + botAI->LeaveOrDisbandGroup(); if (pmo) pmo->finish(); diff --git a/src/strategy/actions/LeaveGroupAction.cpp b/src/strategy/actions/LeaveGroupAction.cpp index 172bf399..88567b1d 100644 --- a/src/strategy/actions/LeaveGroupAction.cpp +++ b/src/strategy/actions/LeaveGroupAction.cpp @@ -86,7 +86,7 @@ bool LeaveGroupAction::Leave(Player* player) bool shouldStay = randomBot && bot->GetGroup() && player == bot; if (!shouldStay) { - botAI->RemoveFromGroup(); + botAI->LeaveOrDisbandGroup(); } if (randomBot) From 31ed5cbb6527cac9b99c21937decab9051cff2e3 Mon Sep 17 00:00:00 2001 From: bash Date: Thu, 9 Oct 2025 20:52:32 +0200 Subject: [PATCH 4/4] fixes --- src/PlayerbotMgr.cpp | 2 +- src/RandomPlayerbotMgr.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/PlayerbotMgr.cpp b/src/PlayerbotMgr.cpp index 074c7a3b..368a216b 100644 --- a/src/PlayerbotMgr.cpp +++ b/src/PlayerbotMgr.cpp @@ -519,7 +519,7 @@ void PlayerbotHolder::OnBotLogin(Player* const bot) } group = bot->GetGroup(); - if (!group) + if (group) { botAI->ResetStrategies(); } diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 1a28e40c..63ab1e04 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -1521,7 +1521,7 @@ bool RandomPlayerbotMgr::ProcessBot(Player* bot) { PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); - if (botAI) + if (!botAI) return false; if (bot->InBattleground()) @@ -2379,7 +2379,7 @@ void RandomPlayerbotMgr::IncreaseLevel(Player* bot) void RandomPlayerbotMgr::RandomizeFirst(Player* bot) { PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); - if (botAI) + if (!botAI) return; uint32 maxLevel = sPlayerbotAIConfig->randomBotMaxLevel; @@ -2474,7 +2474,7 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot) void RandomPlayerbotMgr::RandomizeMin(Player* bot) { PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); - if (botAI) + if (!botAI) return; PerformanceMonitorOperation* pmo = sPerformanceMonitor->start(PERF_MON_RNDBOT, "RandomizeMin");