From e77e2a67857db584baf5ad03019fdf3b9fcf3479 Mon Sep 17 00:00:00 2001 From: Fuzz Date: Fri, 9 Aug 2024 21:17:44 +1000 Subject: [PATCH 1/5] [Battlegrounds] fix bot self respawn in battleground --- src/strategy/actions/ReleaseSpiritAction.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strategy/actions/ReleaseSpiritAction.cpp b/src/strategy/actions/ReleaseSpiritAction.cpp index 0d1ad8b6..382464e4 100644 --- a/src/strategy/actions/ReleaseSpiritAction.cpp +++ b/src/strategy/actions/ReleaseSpiritAction.cpp @@ -125,7 +125,7 @@ bool AutoReleaseSpiritAction::Execute(Event event) mm.Clear(); mm.MovePoint(bot->GetMapId(), unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ(), true); } - else + else if (!botAI->IsRealPlayer()) // below doesnt work properly on realplayer, but its also not needed { bg_gossip_time = time(NULL); WorldPacket packet(CMSG_GOSSIP_HELLO); @@ -133,7 +133,7 @@ bool AutoReleaseSpiritAction::Execute(Event event) bot->GetSession()->HandleGossipHelloOpcode(packet); } } - + botAI->SetNextCheckDelay(1000); return true; } From 520633b4b9151230cf41c9d46fdd587b3f59259e Mon Sep 17 00:00:00 2001 From: Fuzz Date: Wed, 14 Aug 2024 15:54:58 +1000 Subject: [PATCH 2/5] [Arena] self bot now leaves finished arena game reliably (may also fix issues with other bot types leaving arena or all bot types leaving BG's but I wasnt able to reproduce any 'bots stay in bg/arena' bugs except self-bots in arena) --- .../actions/BattleGroundJoinAction.cpp | 114 +++++++++--------- src/strategy/actions/BattleGroundJoinAction.h | 1 + src/strategy/actions/BattleGroundTactics.cpp | 17 +-- 3 files changed, 66 insertions(+), 66 deletions(-) diff --git a/src/strategy/actions/BattleGroundJoinAction.cpp b/src/strategy/actions/BattleGroundJoinAction.cpp index 2c773b5a..e6842b23 100644 --- a/src/strategy/actions/BattleGroundJoinAction.cpp +++ b/src/strategy/actions/BattleGroundJoinAction.cpp @@ -674,6 +674,10 @@ bool BGLeaveAction::Execute(Event event) // botAI->ChangeStrategy("-bg", BOT_STATE_NON_COMBAT); + if (BGStatusAction::LeaveBG(botAI)) + return true; + + // leave queue if not in BG BattlegroundQueueTypeId queueTypeId = bot->GetBattlegroundQueueTypeId(0); BattlegroundTypeId _bgTypeId = BattlegroundMgr::BGTemplateId(queueTypeId); uint8 type = false; @@ -689,27 +693,6 @@ bool BGLeaveAction::Execute(Event event) type = arenaType; } - if (bot->InBattleground()) - { - LOG_INFO("playerbots", "Bot {} {}:{} <{}> leaves {}", bot->GetGUID().ToString().c_str(), - bot->GetTeamId() == TEAM_ALLIANCE ? "A" : "H", bot->GetLevel(), bot->GetName(), - isArena ? "Arena" : "BG"); - - WorldPacket leave(CMSG_LEAVE_BATTLEFIELD); - leave << uint8(0) << uint8(0) << uint32(0) << uint16(0); - bot->GetSession()->HandleBattlefieldLeaveOpcode(leave); - - if (IsRandomBot) - botAI->SetMaster(nullptr); - - botAI->ResetStrategies(!IsRandomBot); - botAI->GetAiObjectContext()->GetValue("bg type")->Set(0); - botAI->GetAiObjectContext()->GetValue("bg role")->Set(0); - botAI->GetAiObjectContext()->GetValue("arena type")->Set(0); - - return true; - } - uint32 queueType = AI_VALUE(uint32, "bg type"); if (!queueType) return false; @@ -733,6 +716,54 @@ bool BGLeaveAction::Execute(Event event) return true; } +bool BGStatusAction::LeaveBG(PlayerbotAI* botAI) +{ + Player* bot = botAI->GetBot(); + Battleground* bg = bot->GetBattleground(); + if (!bg) + return false; + bool isArena = bg->isArena(); + bool isRandomBot = sRandomPlayerbotMgr->IsRandomBot(bot); + + if (isRandomBot) + botAI->SetMaster(nullptr); + + botAI->ChangeStrategy("-warsong", BOT_STATE_COMBAT); + botAI->ChangeStrategy("-warsong", BOT_STATE_NON_COMBAT); + botAI->ChangeStrategy("-arathi", BOT_STATE_COMBAT); + botAI->ChangeStrategy("-arathi", BOT_STATE_NON_COMBAT); + botAI->ChangeStrategy("-eye", BOT_STATE_COMBAT); + botAI->ChangeStrategy("-eye", BOT_STATE_NON_COMBAT); + botAI->ChangeStrategy("-isle", BOT_STATE_COMBAT); + botAI->ChangeStrategy("-isle", BOT_STATE_NON_COMBAT); + botAI->ChangeStrategy("-Battleground", BOT_STATE_COMBAT); + botAI->ChangeStrategy("-Battleground", BOT_STATE_NON_COMBAT); + botAI->ChangeStrategy("-arena", BOT_STATE_COMBAT); + botAI->ChangeStrategy("-arena", BOT_STATE_NON_COMBAT); + + LOG_INFO("playerbots", "Bot {} {}:{} <{}> leaves {}", bot->GetGUID().ToString().c_str(), + bot->GetTeamId() == TEAM_ALLIANCE ? "A" : "H", bot->GetLevel(), bot->GetName(), + isArena ? "Arena" : "BG"); + + WorldPacket packet(CMSG_LEAVE_BATTLEFIELD); + packet << uint8(0); + packet << uint8(0); // BattlegroundTypeId-1 ? + packet << uint32(0); + packet << uint16(0); + + bot->GetSession()->HandleBattlefieldLeaveOpcode(packet); + + botAI->ResetStrategies(!isRandomBot); + botAI->GetAiObjectContext()->GetValue("bg type")->Set(0); + botAI->GetAiObjectContext()->GetValue("bg role")->Set(0); + botAI->GetAiObjectContext()->GetValue("arena type")->Set(0); + PositionMap& posMap = botAI->GetAiObjectContext()->GetValue("position")->Get(); + PositionInfo pos = botAI->GetAiObjectContext()->GetValue("position")->Get()["bg objective"]; + pos.Reset(); + posMap["bg objective"] = pos; + return true; +} + bool BGStatusAction::isUseful() { return bot->InBattlegroundQueue(); } bool BGStatusAction::Execute(Event event) @@ -860,47 +891,12 @@ bool BGStatusAction::Execute(Event event) if (Time1 == TIME_TO_AUTOREMOVE) // Battleground is over, bot needs to leave { - LOG_INFO("playerbots", "Bot {} <{}> ({} {}): Received BG status TIME_REMOVE for {} {}", + LOG_INFO("playerbots", "Bot {} <{}> ({} {}): Received BG status TIME_TO_AUTOREMOVE for {} {}", bot->GetGUID().ToString().c_str(), bot->GetName(), bot->GetLevel(), bot->GetTeamId() == TEAM_ALLIANCE ? "A" : "H", isArena ? "Arena" : "BG", _bgType); - // remove warsong strategy - if (IsRandomBot) - botAI->SetMaster(nullptr); - - botAI->ChangeStrategy("-warsong", BOT_STATE_COMBAT); - botAI->ChangeStrategy("-warsong", BOT_STATE_NON_COMBAT); - botAI->ChangeStrategy("-arathi", BOT_STATE_COMBAT); - botAI->ChangeStrategy("-arathi", BOT_STATE_NON_COMBAT); - botAI->ChangeStrategy("-eye", BOT_STATE_COMBAT); - botAI->ChangeStrategy("-eye", BOT_STATE_NON_COMBAT); - botAI->ChangeStrategy("-isle", BOT_STATE_COMBAT); - botAI->ChangeStrategy("-isle", BOT_STATE_NON_COMBAT); - botAI->ChangeStrategy("-Battleground", BOT_STATE_COMBAT); - botAI->ChangeStrategy("-Battleground", BOT_STATE_NON_COMBAT); - botAI->ChangeStrategy("-arena", BOT_STATE_COMBAT); - botAI->ChangeStrategy("-arena", BOT_STATE_NON_COMBAT); - - LOG_INFO("playerbots", "Bot {} {}:{} <{}> leaves {} - {}", bot->GetGUID().ToString().c_str(), - bot->GetTeamId() == TEAM_ALLIANCE ? "A" : "H", bot->GetLevel(), bot->GetName(), - isArena ? "Arena" : "BG", _bgType); - - WorldPacket packet(CMSG_LEAVE_BATTLEFIELD); - packet << uint8(0); - packet << uint8(0); // BattlegroundTypeId-1 ? - packet << uint32(0); - packet << uint16(0); - - bot->GetSession()->HandleBattlefieldLeaveOpcode(packet); - - botAI->ResetStrategies(!IsRandomBot); - botAI->GetAiObjectContext()->GetValue("bg type")->Set(0); - botAI->GetAiObjectContext()->GetValue("bg role")->Set(0); - botAI->GetAiObjectContext()->GetValue("arena type")->Set(0); - PositionMap& posMap = context->GetValue("position")->Get(); - PositionInfo pos = context->GetValue("position")->Get()["bg objective"]; - pos.Reset(); - posMap["bg objective"] = pos; + if (LeaveBG(botAI)) + return true; } if (statusid == STATUS_WAIT_QUEUE) // bot is in queue diff --git a/src/strategy/actions/BattleGroundJoinAction.h b/src/strategy/actions/BattleGroundJoinAction.h index 0a548c58..5768736e 100644 --- a/src/strategy/actions/BattleGroundJoinAction.h +++ b/src/strategy/actions/BattleGroundJoinAction.h @@ -57,6 +57,7 @@ public: bool Execute(Event event) override; bool isUseful() override; + static bool LeaveBG(PlayerbotAI* botAI); }; class BGStatusCheckAction : public Action diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 9ae91524..7041129f 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -4,6 +4,7 @@ */ #include "BattleGroundTactics.h" +#include "BattleGroundJoinAction.h" #include "ArenaTeam.h" #include "ArenaTeamMgr.h" @@ -2167,7 +2168,7 @@ bool BGTactics::Execute(Event event) } if (bg->GetStatus() == STATUS_WAIT_LEAVE) - return false; + return BGStatusAction::LeaveBG(botAI); if (bg->isArena()) { @@ -4537,20 +4538,22 @@ bool ArenaTactics::Execute(Event event) return false; } - if (bot->GetBattleground()->GetStatus() != STATUS_IN_PROGRESS) + Battleground* bg = bot->GetBattleground(); + if (!bg) + return false; + + if (bg->GetStatus() == STATUS_WAIT_LEAVE) + return BGStatusAction::LeaveBG(botAI); + + if (bg->GetStatus() != STATUS_IN_PROGRESS) return false; if (bot->isDead()) - { return false; - } if (bot->isMoving()) return false; - Battleground* bg = bot->GetBattleground(); - if (!bg) - return false; // startup phase if (bg->GetStartDelayTime() > 0) From f7d229dde2a482e0e223196d9bd62e77228ee651 Mon Sep 17 00:00:00 2001 From: Fuzz Date: Wed, 14 Aug 2024 23:21:00 +1000 Subject: [PATCH 3/5] potential fix for #469 (not 100% sure as can't reproduce) --- src/RandomPlayerbotMgr.cpp | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 564403d2..80f090ce 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -578,18 +578,10 @@ void RandomPlayerbotMgr::CheckBgQueue() if (!BgCheckTimer) BgCheckTimer = time(nullptr); - uint32 count = 0; - uint32 visual_count = 0; - - uint32 check_time = count > 0 ? 120 : 30; - if (time(nullptr) < (BgCheckTimer + check_time)) - { + if (time(nullptr) < BgCheckTimer + 30) return; - } - else - { - BgCheckTimer = time(nullptr); - } + + BgCheckTimer = time(nullptr); LOG_INFO("playerbots", "Checking BG Queue..."); @@ -600,7 +592,8 @@ void RandomPlayerbotMgr::CheckBgQueue() if (!player->InBattlegroundQueue()) continue; - if (player->InBattleground() && player->GetBattleground()->GetStatus() == STATUS_WAIT_LEAVE) + Battleground* bg = player->GetBattleground(); + if (bg && bg->GetStatus() == STATUS_WAIT_LEAVE) continue; TeamId teamId = player->GetTeamId(); @@ -611,7 +604,7 @@ void RandomPlayerbotMgr::CheckBgQueue() continue; BattlegroundTypeId bgTypeId = sBattlegroundMgr->BGTemplateId(queueTypeId); - Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId); + bg = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId); uint32 mapId = bg->GetMapId(); PvPDifficultyEntry const* pvpDiff = GetBattlegroundBracketByLevel(mapId, player->GetLevel()); if (!pvpDiff) @@ -690,7 +683,8 @@ void RandomPlayerbotMgr::CheckBgQueue() if (!IsRandomBot(bot)) continue; - if (bot->InBattleground() && bot->GetBattleground()->GetStatus() == STATUS_WAIT_LEAVE) + Battleground* bg = bot->GetBattleground(); + if (bg && bg->GetStatus() == STATUS_WAIT_LEAVE) continue; TeamId teamId = bot->GetTeamId(); @@ -702,7 +696,7 @@ void RandomPlayerbotMgr::CheckBgQueue() continue; BattlegroundTypeId bgTypeId = sBattlegroundMgr->BGTemplateId(queueTypeId); - Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId); + bg = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId); uint32 mapId = bg->GetMapId(); PvPDifficultyEntry const* pvpDiff = GetBattlegroundBracketByLevel(mapId, bot->GetLevel()); if (!pvpDiff) From 780934a9e426e73faccc98397713877ccf37ee7f Mon Sep 17 00:00:00 2001 From: Fuzz Date: Wed, 14 Aug 2024 23:27:07 +1000 Subject: [PATCH 4/5] potential fix for #94 (not 100% sure as can't reproduce) --- src/strategy/actions/BattleGroundTactics.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/strategy/actions/BattleGroundTactics.cpp b/src/strategy/actions/BattleGroundTactics.cpp index 7041129f..6c1527a6 100644 --- a/src/strategy/actions/BattleGroundTactics.cpp +++ b/src/strategy/actions/BattleGroundTactics.cpp @@ -4089,13 +4089,17 @@ bool BGTactics::atFlag(std::vector const& vPaths, std::vectorGetUnit(guid); - if (pFriend->GetCurrentSpell(CURRENT_GENERIC_SPELL) && - pFriend->GetCurrentSpell(CURRENT_GENERIC_SPELL)->m_spellInfo->Id == SPELL_CAPTURE_BANNER) + if (Unit* pFriend = botAI->GetUnit(guid)) { - resetObjective(); - startNewPathBegin(vPaths); - return false; + if (Spell* spell = pFriend->GetCurrentSpell(CURRENT_GENERIC_SPELL)) + { + if (spell->m_spellInfo->Id == SPELL_CAPTURE_BANNER) + { + resetObjective(); + startNewPathBegin(vPaths); + return false; + } + } } } } From f87c87f5d4f5aefbf8db0a139d02b5989bf7b587 Mon Sep 17 00:00:00 2001 From: Fuzz Date: Thu, 15 Aug 2024 21:26:09 +1000 Subject: [PATCH 5/5] fix for bots trying to mount in WSG and AV tunnels --- src/strategy/actions/CheckMountStateAction.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/strategy/actions/CheckMountStateAction.cpp b/src/strategy/actions/CheckMountStateAction.cpp index d85f51b5..24684a6a 100644 --- a/src/strategy/actions/CheckMountStateAction.cpp +++ b/src/strategy/actions/CheckMountStateAction.cpp @@ -129,11 +129,14 @@ bool CheckMountStateAction::isUseful() if (bot->isDead()) return false; - bool isOutdoor = bot->IsOutdoors(); - if (!isOutdoor) + if (bot->HasUnitState(UNIT_STATE_IN_FLIGHT)) return false; - if (bot->HasUnitState(UNIT_STATE_IN_FLIGHT)) + // checks both outdoors flag, and whether bot is clipping below floor slightly + // because that will cause bot to falsely indicate outdoors state and try + // mount indoors (seems to mostly be an issue in tunnels of WSG and AV) + if (!bot->IsOutdoors() || bot->GetPositionZ() < bot->GetMapWaterOrGroundLevel( + bot->GetPositionX(), bot->GetPositionY(), bot->GetPositionZ())) return false; if (bot->InArena())