crash fix trial

This commit is contained in:
Yunfan Li
2023-12-17 00:50:46 +08:00
parent c5f883f762
commit 4007ce2692
6 changed files with 107 additions and 67 deletions

View File

@@ -16,6 +16,9 @@ void FleeManager::calculateDistanceToCreatures(FleePoint *point)
point->minDistance = -1.0f; point->minDistance = -1.0f;
point->sumDistance = 0.0f; point->sumDistance = 0.0f;
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (!botAI) {
return;
}
GuidVector units = *botAI->GetAiObjectContext()->GetValue<GuidVector>("possible targets no los"); GuidVector units = *botAI->GetAiObjectContext()->GetValue<GuidVector>("possible targets no los");
for (GuidVector::iterator i = units.begin(); i != units.end(); ++i) for (GuidVector::iterator i = units.begin(); i != units.end(); ++i)
{ {
@@ -45,6 +48,9 @@ bool intersectsOri(float angle, std::vector<float>& angles, float angleIncrement
void FleeManager::calculatePossibleDestinations(std::vector<FleePoint*> &points) void FleeManager::calculatePossibleDestinations(std::vector<FleePoint*> &points)
{ {
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (!botAI) {
return;
}
Unit* target = *botAI->GetAiObjectContext()->GetValue<Unit*>("current target"); Unit* target = *botAI->GetAiObjectContext()->GetValue<Unit*>("current target");
float botPosX = startPosition.getX(); float botPosX = startPosition.getX();
@@ -153,6 +159,9 @@ bool FleeManager::CalculateDestination(float* rx, float* ry, float* rz)
bool FleeManager::isUseful() bool FleeManager::isUseful()
{ {
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (!botAI) {
return false;
}
GuidVector units = *botAI->GetAiObjectContext()->GetValue<GuidVector>("possible targets no los"); GuidVector units = *botAI->GetAiObjectContext()->GetValue<GuidVector>("possible targets no los");
for (GuidVector::iterator i = units.begin(); i != units.end(); ++i) for (GuidVector::iterator i = units.begin(); i != units.end(); ++i)
{ {

View File

@@ -59,6 +59,9 @@ void LootObject::Refresh(Player* bot, ObjectGuid lootGUID)
guid.Clear(); guid.Clear();
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (!botAI) {
return;
}
Creature* creature = botAI->GetCreature(lootGUID); Creature* creature = botAI->GetCreature(lootGUID);
if (creature && creature->getDeathState() == DeathState::Corpse) if (creature && creature->getDeathState() == DeathState::Corpse)
{ {
@@ -175,7 +178,9 @@ WorldObject* LootObject::GetWorldObject(Player* bot)
Refresh(bot, guid); Refresh(bot, guid);
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (!botAI) {
return nullptr;
}
Creature* creature = botAI->GetCreature(guid); Creature* creature = botAI->GetCreature(guid);
if (creature && creature->getDeathState() == DeathState::Corpse) if (creature && creature->getDeathState() == DeathState::Corpse)
return creature; return creature;
@@ -201,7 +206,9 @@ bool LootObject::IsLootPossible(Player* bot)
return false; return false;
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (!botAI) {
return false;
}
if (reqItem && !bot->HasItemCount(reqItem, 1)) if (reqItem && !bot->HasItemCount(reqItem, 1))
return false; return false;

View File

@@ -204,10 +204,7 @@ void PlayerbotAI::UpdateAI(uint32 elapsed, bool minimal)
} }
// cancel logout in combat // cancel logout in combat
if (!bot->GetSession()) { if (!bot->GetSession() || bot->GetSession()->isLogingOut())
return;
}
if (bot->GetSession()->isLogingOut())
{ {
// if (bot->IsInCombat() || (master && master->IsInCombat() && sServerFacade->GetDistance2d(bot, master) < 30.0f)) // 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) if ((!master || (masterBotAI && !masterBotAI->IsRealPlayer())) && group)
{ {
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (!botAI) {
return;
}
// Ideally we want to have the leader as master. // Ideally we want to have the leader as master.
Player* newMaster = botAI->GetGroupMaster(); Player* newMaster = botAI->GetGroupMaster();
Player* playerMaster = nullptr; Player* playerMaster = nullptr;

View File

@@ -84,7 +84,7 @@ void PlayerbotHolder::HandlePlayerBotLoginCallback(PlayerbotLoginQueryHolder con
if (!bot) if (!bot)
{ {
LogoutPlayerBot(holder.GetGuid()); 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; return;
} }
@@ -114,7 +114,7 @@ void PlayerbotHolder::HandlePlayerBotLoginCallback(PlayerbotLoginQueryHolder con
OnBotLogin(bot); OnBotLogin(bot);
LogoutPlayerBot(bot->GetGUID()); 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; Player* const bot = itr->second;
if (bot->IsBeingTeleported()) if (bot->IsBeingTeleported())
{ {
GET_PLAYERBOT_AI(bot)->HandleTeleportAck(); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (botAI) {
botAI->HandleTeleportAck();
}
} }
else if (bot->IsInWorld()) else if (bot->IsInWorld())
{ {
@@ -315,6 +318,9 @@ void PlayerbotHolder::DisablePlayerBot(ObjectGuid guid)
if (Player* bot = GetPlayerBot(guid)) if (Player* bot = GetPlayerBot(guid))
{ {
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (!botAI) {
return;
}
botAI->TellMaster("Goodbye!"); botAI->TellMaster("Goodbye!");
bot->StopMoving(); bot->StopMoving();
bot->GetMotionMaster()->Clear(); bot->GetMotionMaster()->Clear();
@@ -363,6 +369,9 @@ void PlayerbotHolder::OnBotLogin(Player* const bot)
playerBots[bot->GetGUID()] = bot; playerBots[bot->GetGUID()] = bot;
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (!botAI) {
return;
}
Player* master = botAI->GetMaster(); Player* master = botAI->GetMaster();
if (master) 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."; return "ERROR: You can not use this command on non-summoned random bot.";
} }
if (Player* master = GET_PLAYERBOT_AI(bot)->GetMaster()) if (GET_PLAYERBOT_AI(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")
{ {
PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_NORMAL); if (master->GetSession()->GetSecurity() <= SEC_PLAYER && sPlayerbotAIConfig->autoInitOnly && cmd != "init=auto") {
factory.Randomize(false); return "The command is not allowed, use init=auto instead.";
return "ok"; }
} int gs;
else if (cmd == "init=green" || cmd == "init=uncommon") if (cmd == "init=white" || cmd == "init=common")
{ {
PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_UNCOMMON); PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_NORMAL);
factory.Randomize(false); factory.Randomize(false);
return "ok"; return "ok";
} }
else if (cmd == "init=blue" || cmd == "init=rare") else if (cmd == "init=green" || cmd == "init=uncommon")
{ {
PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_RARE); PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_UNCOMMON);
factory.Randomize(false); factory.Randomize(false);
return "ok"; return "ok";
} }
else if (cmd == "init=epic" || cmd == "init=purple") else if (cmd == "init=blue" || cmd == "init=rare")
{ {
PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_EPIC); PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_RARE);
factory.Randomize(false); factory.Randomize(false);
return "ok"; return "ok";
} }
else if (cmd == "init=legendary" || cmd == "init=yellow") else if (cmd == "init=epic" || cmd == "init=purple")
{ {
PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_LEGENDARY); PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_EPIC);
factory.Randomize(false); factory.Randomize(false);
return "ok"; return "ok";
} }
else if (cmd == "init=auto") else if (cmd == "init=legendary" || cmd == "init=yellow")
{ {
uint32 mixedGearScore = PlayerbotAI::GetMixedGearScore(master, true, false, 12) * sPlayerbotAIConfig->autoInitEquipLevelLimitRatio; PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_LEGENDARY);
PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_LEGENDARY, mixedGearScore); factory.Randomize(false);
factory.Randomize(false); return "ok";
return "ok, gear score limit: " + std::to_string(mixedGearScore / (ITEM_QUALITY_EPIC + 1)) + "(for epic)"; }
} else if (cmd == "init=auto")
else if (cmd.starts_with("init=") && sscanf(cmd.c_str(), "init=%d", &gs) != -1) {
{ uint32 mixedGearScore = PlayerbotAI::GetMixedGearScore(master, true, false, 12) * sPlayerbotAIConfig->autoInitEquipLevelLimitRatio;
PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_LEGENDARY, gs); PlayerbotFactory factory(bot, master->getLevel(), ITEM_QUALITY_LEGENDARY, mixedGearScore);
factory.Randomize(false); factory.Randomize(false);
return "ok, gear score limit: " + std::to_string(gs / (ITEM_QUALITY_EPIC + 1)) + "(for epic)"; 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) for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it)
{ {
Player* const bot = it->second; 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) for (PlayerBotMap::const_iterator it = sRandomPlayerbotMgr->GetPlayerBotsBegin(); it != sRandomPlayerbotMgr->GetPlayerBotsEnd(); ++it)
{ {
Player* const bot = it->second; Player* const bot = it->second;
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (botAI->GetMaster() == master) if (botAI && botAI->GetMaster() == master)
botAI->HandleCommand(type, text, master); botAI->HandleCommand(type, text, master);
} }
} }
@@ -1166,8 +1179,9 @@ void PlayerbotMgr::HandleMasterIncomingPacket(WorldPacket const& packet)
Player* const bot = it->second; Player* const bot = it->second;
if (!bot) if (!bot)
continue; continue;
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
GET_PLAYERBOT_AI(bot)->HandleMasterIncomingPacket(packet); if (botAI)
botAI->HandleMasterIncomingPacket(packet);
} }
for (PlayerBotMap::const_iterator it = sRandomPlayerbotMgr->GetPlayerBotsBegin(); it != sRandomPlayerbotMgr->GetPlayerBotsEnd(); ++it) 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) for (PlayerBotMap::const_iterator it = GetPlayerBotsBegin(); it != GetPlayerBotsEnd(); ++it)
{ {
Player* const bot = it->second; 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) 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) for (PlayerBotMap::const_iterator it = sRandomPlayerbotMgr->GetPlayerBotsBegin(); it != sRandomPlayerbotMgr->GetPlayerBotsEnd(); ++it)
{ {
Player* const bot = it->second; 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); bot->SaveToDB(false, false);
} }
} }
@@ -1231,6 +1247,9 @@ void PlayerbotMgr::SaveToDB()
void PlayerbotMgr::OnBotLoginInternal(Player * const bot) void PlayerbotMgr::OnBotLoginInternal(Player * const bot)
{ {
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (!botAI) {
return;
}
botAI->SetMaster(master); botAI->SetMaster(master);
botAI->ResetStrategies(); botAI->ResetStrategies();

View File

@@ -19,6 +19,9 @@ PlayerbotSecurityLevel PlayerbotSecurity::LevelFor(Player* from, DenyReason* rea
return PLAYERBOT_SECURITY_ALLOW_ALL; return PLAYERBOT_SECURITY_ALLOW_ALL;
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (!botAI) {
return PLAYERBOT_SECURITY_DENY_ALL;
}
if (botAI->IsOpposing(from)) if (botAI->IsOpposing(from))
{ {
if (reason) if (reason)

View File

@@ -1399,7 +1399,8 @@ void RandomPlayerbotMgr::RandomizeFirst(Player* bot)
PlayerbotsDatabase.Execute(stmt); PlayerbotsDatabase.Execute(stmt);
// teleport to a random inn for bot level // 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()) if (bot->GetGroup())
bot->RemoveFromGroup(); bot->RemoveFromGroup();
@@ -1435,7 +1436,9 @@ void RandomPlayerbotMgr::RandomizeMin(Player* bot)
PlayerbotsDatabase.Execute(stmt); PlayerbotsDatabase.Execute(stmt);
// teleport to a random inn for bot level // 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()) if (bot->GetGroup())
bot->RemoveFromGroup(); bot->RemoveFromGroup();
@@ -1862,7 +1865,7 @@ void RandomPlayerbotMgr::OnPlayerLogout(Player* player)
{ {
Player* const bot = it->second; Player* const bot = it->second;
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot);
if (player == botAI->GetMaster()) if (botAI && player == botAI->GetMaster())
{ {
botAI->SetMaster(nullptr); botAI->SetMaster(nullptr);
if (!bot->InBattleground()) if (!bot->InBattleground())
@@ -1906,7 +1909,7 @@ void RandomPlayerbotMgr::OnPlayerLogin(Player* player)
{ {
Player* member = gref->GetSource(); Player* member = gref->GetSource();
PlayerbotAI* botAI = GET_PLAYERBOT_AI(bot); 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()) if (!bot->InBattleground())
{ {