diff --git a/src/FleeManager.cpp b/src/FleeManager.cpp index f3eeb1b0..8ca6ac6b 100644 --- a/src/FleeManager.cpp +++ b/src/FleeManager.cpp @@ -16,6 +16,9 @@ void FleeManager::calculateDistanceToCreatures(FleePoint *point) point->minDistance = -1.0f; point->sumDistance = 0.0f; PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (!botAI) { + return; + } GuidVector units = *botAI->GetAiObjectContext()->GetValue("possible targets no los"); for (GuidVector::iterator i = units.begin(); i != units.end(); ++i) { @@ -45,6 +48,9 @@ bool intersectsOri(float angle, std::vector& angles, float angleIncrement void FleeManager::calculatePossibleDestinations(std::vector &points) { PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (!botAI) { + return; + } Unit* target = *botAI->GetAiObjectContext()->GetValue("current target"); float botPosX = startPosition.getX(); @@ -153,6 +159,9 @@ bool FleeManager::CalculateDestination(float* rx, float* ry, float* rz) bool FleeManager::isUseful() { PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (!botAI) { + return false; + } GuidVector units = *botAI->GetAiObjectContext()->GetValue("possible targets no los"); for (GuidVector::iterator i = units.begin(); i != units.end(); ++i) { diff --git a/src/LootObjectStack.cpp b/src/LootObjectStack.cpp index 8bba885c..2a4ebd7e 100644 --- a/src/LootObjectStack.cpp +++ b/src/LootObjectStack.cpp @@ -59,6 +59,9 @@ void LootObject::Refresh(Player* bot, ObjectGuid lootGUID) guid.Clear(); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (!botAI) { + return; + } Creature* creature = botAI->GetCreature(lootGUID); if (creature && creature->getDeathState() == DeathState::Corpse) { @@ -175,7 +178,9 @@ WorldObject* LootObject::GetWorldObject(Player* bot) Refresh(bot, guid); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); - + if (!botAI) { + return nullptr; + } Creature* creature = botAI->GetCreature(guid); if (creature && creature->getDeathState() == DeathState::Corpse) return creature; @@ -201,7 +206,9 @@ bool LootObject::IsLootPossible(Player* bot) return false; PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); - + if (!botAI) { + return false; + } if (reqItem && !bot->HasItemCount(reqItem, 1)) return false; diff --git a/src/PlayerbotAI.cpp b/src/PlayerbotAI.cpp index db99021b..23b32eaf 100644 --- a/src/PlayerbotAI.cpp +++ b/src/PlayerbotAI.cpp @@ -204,10 +204,7 @@ void PlayerbotAI::UpdateAI(uint32 elapsed, bool minimal) } // cancel logout in combat - if (!bot->GetSession()) { - return; - } - if (bot->GetSession()->isLogingOut()) + if (!bot->GetSession() || bot->GetSession()->isLogingOut()) { // if (bot->IsInCombat() || (master && master->IsInCombat() && sServerFacade->GetDistance2d(bot, master) < 30.0f)) // { @@ -1047,7 +1044,9 @@ void PlayerbotAI::DoNextAction(bool min) if ((!master || (masterBotAI && !masterBotAI->IsRealPlayer())) && group) { PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); - + if (!botAI) { + return; + } // Ideally we want to have the leader as master. Player* newMaster = botAI->GetGroupMaster(); Player* playerMaster = nullptr; diff --git a/src/PlayerbotMgr.cpp b/src/PlayerbotMgr.cpp index 4083938a..a91d7bb2 100644 --- a/src/PlayerbotMgr.cpp +++ b/src/PlayerbotMgr.cpp @@ -84,7 +84,7 @@ void PlayerbotHolder::HandlePlayerBotLoginCallback(PlayerbotLoginQueryHolder con if (!bot) { LogoutPlayerBot(holder.GetGuid()); - LOG_ERROR("playerbots", "Error logging in bot {}, please try to reset all random bots", holder.GetGuid().ToString().c_str()); + // LOG_ERROR("playerbots", "Error logging in bot {}, please try to reset all random bots", holder.GetGuid().ToString().c_str()); return; } @@ -114,7 +114,7 @@ void PlayerbotHolder::HandlePlayerBotLoginCallback(PlayerbotLoginQueryHolder con OnBotLogin(bot); LogoutPlayerBot(bot->GetGUID()); - LOG_ERROR("playerbots", "Attempt to add not allowed bot {}, please try to reset all random bots", bot->GetName()); + // LOG_ERROR("playerbots", "Attempt to add not allowed bot {}, please try to reset all random bots", bot->GetName()); } } @@ -125,7 +125,10 @@ void PlayerbotHolder::UpdateSessions() Player* const bot = itr->second; if (bot->IsBeingTeleported()) { - GET_PLAYERBOT_AI(bot)->HandleTeleportAck(); + PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (botAI) { + botAI->HandleTeleportAck(); + } } else if (bot->IsInWorld()) { @@ -315,6 +318,9 @@ void PlayerbotHolder::DisablePlayerBot(ObjectGuid guid) if (Player* bot = GetPlayerBot(guid)) { PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (!botAI) { + return; + } botAI->TellMaster("Goodbye!"); bot->StopMoving(); bot->GetMotionMaster()->Clear(); @@ -363,6 +369,9 @@ void PlayerbotHolder::OnBotLogin(Player* const bot) playerBots[bot->GetGUID()] = bot; PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (!botAI) { + return; + } Player* master = botAI->GetMaster(); if (master) { @@ -546,54 +555,56 @@ std::string const PlayerbotHolder::ProcessBotCommand(std::string const cmd, Obje return "ERROR: You can not use this command on non-summoned random bot."; } - if (Player* master = GET_PLAYERBOT_AI(bot)->GetMaster()) - { - if (master->GetSession()->GetSecurity() <= SEC_PLAYER && sPlayerbotAIConfig->autoInitOnly && cmd != "init=auto") { - return "The command is not allowed, use init=auto instead."; - } - int gs; - if (cmd == "init=white" || cmd == "init=common") + if (GET_PLAYERBOT_AI(bot)) { + if (Player* master = GET_PLAYERBOT_AI(bot)->GetMaster()) { - PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_NORMAL); - factory.Randomize(false); - return "ok"; - } - else if (cmd == "init=green" || cmd == "init=uncommon") - { - PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_UNCOMMON); - factory.Randomize(false); - return "ok"; - } - else if (cmd == "init=blue" || cmd == "init=rare") - { - PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_RARE); - factory.Randomize(false); - return "ok"; - } - else if (cmd == "init=epic" || cmd == "init=purple") - { - PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_EPIC); - factory.Randomize(false); - return "ok"; - } - else if (cmd == "init=legendary" || cmd == "init=yellow") - { - PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_LEGENDARY); - factory.Randomize(false); - return "ok"; - } - else if (cmd == "init=auto") - { - uint32 mixedGearScore = PlayerbotAI::GetMixedGearScore(master, true, false, 12) * sPlayerbotAIConfig->autoInitEquipLevelLimitRatio; - PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_LEGENDARY, mixedGearScore); - factory.Randomize(false); - return "ok, gear score limit: " + std::to_string(mixedGearScore / (ITEM_QUALITY_EPIC + 1)) + "(for epic)"; - } - else if (cmd.starts_with("init=") && sscanf(cmd.c_str(), "init=%d", &gs) != -1) - { - PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_LEGENDARY, gs); - factory.Randomize(false); - return "ok, gear score limit: " + std::to_string(gs / (ITEM_QUALITY_EPIC + 1)) + "(for epic)"; + if (master->GetSession()->GetSecurity() <= SEC_PLAYER && sPlayerbotAIConfig->autoInitOnly && cmd != "init=auto") { + return "The command is not allowed, use init=auto instead."; + } + int gs; + if (cmd == "init=white" || cmd == "init=common") + { + PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_NORMAL); + factory.Randomize(false); + return "ok"; + } + else if (cmd == "init=green" || cmd == "init=uncommon") + { + PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_UNCOMMON); + factory.Randomize(false); + return "ok"; + } + else if (cmd == "init=blue" || cmd == "init=rare") + { + PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_RARE); + factory.Randomize(false); + return "ok"; + } + else if (cmd == "init=epic" || cmd == "init=purple") + { + PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_EPIC); + factory.Randomize(false); + return "ok"; + } + else if (cmd == "init=legendary" || cmd == "init=yellow") + { + PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_LEGENDARY); + factory.Randomize(false); + return "ok"; + } + else if (cmd == "init=auto") + { + uint32 mixedGearScore = PlayerbotAI::GetMixedGearScore(master, true, false, 12) * sPlayerbotAIConfig->autoInitEquipLevelLimitRatio; + PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_LEGENDARY, mixedGearScore); + factory.Randomize(false); + return "ok, gear score limit: " + std::to_string(mixedGearScore / (ITEM_QUALITY_EPIC + 1)) + "(for epic)"; + } + else if (cmd.starts_with("init=") && sscanf(cmd.c_str(), "init=%d", &gs) != -1) + { + PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_LEGENDARY, gs); + factory.Randomize(false); + return "ok, gear score limit: " + std::to_string(gs / (ITEM_QUALITY_EPIC + 1)) + "(for epic)"; + } } } @@ -1147,14 +1158,16 @@ void PlayerbotMgr::HandleCommand(uint32 type, std::string const text) for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) { Player* const bot = it->second; - GET_PLAYERBOT_AI(bot)->HandleCommand(type, text, master); + PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (botAI) + botAI->HandleCommand(type, text, master); } for (PlayerBotMap::const_iterator it = sRandomPlayerbotMgr->GetPlayerBotsBegin(); it != sRandomPlayerbotMgr->GetPlayerBotsEnd(); ++it) { Player* const bot = it->second; PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); - if (botAI->GetMaster() == master) + if (botAI && botAI->GetMaster() == master) botAI->HandleCommand(type, text, master); } } @@ -1166,8 +1179,9 @@ void PlayerbotMgr::HandleMasterIncomingPacket(WorldPacket const& packet) Player* const bot = it->second; if (!bot) continue; - - GET_PLAYERBOT_AI(bot)->HandleMasterIncomingPacket(packet); + PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (botAI) + botAI->HandleMasterIncomingPacket(packet); } for (PlayerBotMap::const_iterator it = sRandomPlayerbotMgr->GetPlayerBotsBegin(); it != sRandomPlayerbotMgr->GetPlayerBotsEnd(); ++it) @@ -1200,7 +1214,9 @@ void PlayerbotMgr::HandleMasterOutgoingPacket(WorldPacket const& packet) for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it) { Player* const bot = it->second; - GET_PLAYERBOT_AI(bot)->HandleMasterOutgoingPacket(packet); + PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (botAI) + botAI->HandleMasterOutgoingPacket(packet); } for (PlayerBotMap::const_iterator it = sRandomPlayerbotMgr->GetPlayerBotsBegin(); it != sRandomPlayerbotMgr->GetPlayerBotsEnd(); ++it) @@ -1223,7 +1239,7 @@ void PlayerbotMgr::SaveToDB() for (PlayerBotMap::const_iterator it = sRandomPlayerbotMgr->GetPlayerBotsBegin(); it != sRandomPlayerbotMgr->GetPlayerBotsEnd(); ++it) { Player* const bot = it->second; - if (GET_PLAYERBOT_AI(bot)->GetMaster() == GetMaster()) + if (GET_PLAYERBOT_AI(bot) && GET_PLAYERBOT_AI(bot)->GetMaster() == GetMaster()) bot->SaveToDB(false, false); } } @@ -1231,6 +1247,9 @@ void PlayerbotMgr::SaveToDB() void PlayerbotMgr::OnBotLoginInternal(Player * const bot) { PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (!botAI) { + return; + } botAI->SetMaster(master); botAI->ResetStrategies(); diff --git a/src/PlayerbotSecurity.cpp b/src/PlayerbotSecurity.cpp index f99a6b52..5979ae99 100644 --- a/src/PlayerbotSecurity.cpp +++ b/src/PlayerbotSecurity.cpp @@ -19,6 +19,9 @@ PlayerbotSecurityLevel PlayerbotSecurity::LevelFor(Player* from, DenyReason* rea return PLAYERBOT_SECURITY_ALLOW_ALL; PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); + if (!botAI) { + return PLAYERBOT_SECURITY_DENY_ALL; + } if (botAI->IsOpposing(from)) { if (reason) diff --git a/src/RandomPlayerbotMgr.cpp b/src/RandomPlayerbotMgr.cpp index 7df1a3e6..b5f79f00 100644 --- a/src/RandomPlayerbotMgr.cpp +++ b/src/RandomPlayerbotMgr.cpp @@ -1399,7 +1399,8 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot) PlayerbotsDatabase.Execute(stmt); // teleport to a random inn for bot level - GET_PLAYERBOT_AI(bot)->Reset(true); + if (GET_PLAYERBOT_AI(bot)) + GET_PLAYERBOT_AI(bot)->Reset(true); if (bot->GetGroup()) bot->RemoveFromGroup(); @@ -1435,7 +1436,9 @@ void RandomPlayerbotMgr::RandomizeMin(Player* bot) PlayerbotsDatabase.Execute(stmt); // teleport to a random inn for bot level - GET_PLAYERBOT_AI(bot)->Reset(true); + if (GET_PLAYERBOT_AI(bot)) + GET_PLAYERBOT_AI(bot)->Reset(true); + if (bot->GetGroup()) bot->RemoveFromGroup(); @@ -1862,7 +1865,7 @@ void RandomPlayerbotMgr::OnPlayerLogout(Player* player) { Player* const bot = it->second; PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); - if (player == botAI->GetMaster()) + if (botAI && player == botAI->GetMaster()) { botAI->SetMaster(nullptr); if (!bot->InBattleground()) @@ -1906,7 +1909,7 @@ void RandomPlayerbotMgr::OnPlayerLogin(Player* player) { Player* member = gref->GetSource(); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); - if (member == player && (!botAI->GetMaster() || GET_PLAYERBOT_AI(botAI->GetMaster()))) + if (botAI && member == player && (!botAI->GetMaster() || GET_PLAYERBOT_AI(botAI->GetMaster()))) { if (!bot->InBattleground()) {