Skip to content

Commit

Permalink
Merge pull request liyunfan1223#479 from fuzzdeveloper/self-bot-and-c…
Browse files Browse the repository at this point in the history
…rash-fixes

Self bot and crash fixes
  • Loading branch information
fuzzdeveloper authored Aug 15, 2024
2 parents e97c035 + f87c87f commit 34c3f16
Show file tree
Hide file tree
Showing 6 changed files with 93 additions and 92 deletions.
24 changes: 9 additions & 15 deletions src/RandomPlayerbotMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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...");

Expand All @@ -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();
Expand All @@ -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)
Expand Down Expand Up @@ -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();
Expand All @@ -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)
Expand Down
114 changes: 55 additions & 59 deletions src/strategy/actions/BattleGroundJoinAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<uint32>("bg type")->Set(0);
botAI->GetAiObjectContext()->GetValue<uint32>("bg role")->Set(0);
botAI->GetAiObjectContext()->GetValue<uint32>("arena type")->Set(0);

return true;
}

uint32 queueType = AI_VALUE(uint32, "bg type");
if (!queueType)
return false;
Expand All @@ -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<uint32>("bg type")->Set(0);
botAI->GetAiObjectContext()->GetValue<uint32>("bg role")->Set(0);
botAI->GetAiObjectContext()->GetValue<uint32>("arena type")->Set(0);
PositionMap& posMap = botAI->GetAiObjectContext()->GetValue<PositionMap&>("position")->Get();
PositionInfo pos = botAI->GetAiObjectContext()->GetValue<PositionMap&>("position")->Get()["bg objective"];
pos.Reset();
posMap["bg objective"] = pos;
return true;
}

bool BGStatusAction::isUseful() { return bot->InBattlegroundQueue(); }

bool BGStatusAction::Execute(Event event)
Expand Down Expand Up @@ -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<uint32>("bg type")->Set(0);
botAI->GetAiObjectContext()->GetValue<uint32>("bg role")->Set(0);
botAI->GetAiObjectContext()->GetValue<uint32>("arena type")->Set(0);
PositionMap& posMap = context->GetValue<PositionMap&>("position")->Get();
PositionInfo pos = context->GetValue<PositionMap&>("position")->Get()["bg objective"];
pos.Reset();
posMap["bg objective"] = pos;
if (LeaveBG(botAI))
return true;
}

if (statusid == STATUS_WAIT_QUEUE) // bot is in queue
Expand Down
1 change: 1 addition & 0 deletions src/strategy/actions/BattleGroundJoinAction.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
33 changes: 20 additions & 13 deletions src/strategy/actions/BattleGroundTactics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*/

#include "BattleGroundTactics.h"
#include "BattleGroundJoinAction.h"

#include "ArenaTeam.h"
#include "ArenaTeamMgr.h"
Expand Down Expand Up @@ -2167,7 +2168,7 @@ bool BGTactics::Execute(Event event)
}

if (bg->GetStatus() == STATUS_WAIT_LEAVE)
return false;
return BGStatusAction::LeaveBG(botAI);

if (bg->isArena())
{
Expand Down Expand Up @@ -4088,13 +4089,17 @@ bool BGTactics::atFlag(std::vector<BattleBotPath*> const& vPaths, std::vector<ui
{
for (auto& guid : closePlayers)
{
Unit* pFriend = botAI->GetUnit(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;
}
}
}
}
}
Expand Down Expand Up @@ -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)
Expand Down
9 changes: 6 additions & 3 deletions src/strategy/actions/CheckMountStateAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
4 changes: 2 additions & 2 deletions src/strategy/actions/ReleaseSpiritAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,15 +125,15 @@ 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);
packet << guid;
bot->GetSession()->HandleGossipHelloOpcode(packet);
}
}

botAI->SetNextCheckDelay(1000);
return true;
}

Expand Down

0 comments on commit 34c3f16

Please sign in to comment.