diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 564403d27..80f090ce6 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) diff --git a/src/strategy/actions/BattleGroundJoinAction.cpp b/src/strategy/actions/BattleGroundJoinAction.cpp index 2c773b5a5..e6842b231 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 0a548c586..5768736e6 100644 --- a/src/strategy/actions/BattleGroundJoinAction.h +++ b/src/strategy/actions/BattleGroundJoinAction.h @@ -57,6 +57,7 @@ class BGStatusAction : public Action 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 9ae915242..6c1527a6f 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()) { @@ -4088,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; + } + } } } } @@ -4537,20 +4542,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) diff --git a/src/strategy/actions/CheckMountStateAction.cpp b/src/strategy/actions/CheckMountStateAction.cpp index d85f51b50..24684a6a1 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()) diff --git a/src/strategy/actions/ReleaseSpiritAction.cpp b/src/strategy/actions/ReleaseSpiritAction.cpp index 0d1ad8b64..382464e45 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; }