From e983f9be00b375a5a615978e8bc156805783dc05 Mon Sep 17 00:00:00 2001 From: Yunfan Li Date: Mon, 19 Aug 2024 23:31:32 +0800 Subject: [PATCH] [Crash fix] Duplicate loading bot --- src/PlayerbotMgr.cpp | 26 ++++++++++---------------- src/PlayerbotMgr.h | 2 ++ 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/PlayerbotMgr.cpp b/src/PlayerbotMgr.cpp index 7d71e88a..097e0bf1 100644 --- a/src/PlayerbotMgr.cpp +++ b/src/PlayerbotMgr.cpp @@ -48,6 +48,10 @@ public: void PlayerbotHolder::AddPlayerBot(ObjectGuid playerGuid, uint32 masterAccountId) { + // bot is loading + if (botLoading.find(playerGuid) != botLoading.end()) + return; + // has bot already been added? Player* bot = ObjectAccessor::FindConnectedPlayer(playerGuid); if (bot && bot->IsInWorld()) @@ -64,6 +68,8 @@ void PlayerbotHolder::AddPlayerBot(ObjectGuid playerGuid, uint32 masterAccountId return; } + botLoading.insert(playerGuid); + if (WorldSession* masterSession = sWorld->FindSession(masterAccountId)) { masterSession->AddQueryHolderCallback(CharacterDatabase.DelayQueryHolder(holder)) @@ -80,13 +86,6 @@ void PlayerbotHolder::AddPlayerBot(ObjectGuid playerGuid, uint32 masterAccountId void PlayerbotHolder::HandlePlayerBotLoginCallback(PlayerbotLoginQueryHolder const& holder) { - // has bot already been added? - Player* loginBot = ObjectAccessor::FindConnectedPlayer(holder.GetGuid()); - if (loginBot && loginBot->IsInWorld()) - { - return; - } - uint32 botAccountId = holder.GetAccountId(); // At login DBC locale should be what the server is set to use by default (as spells etc are hardcoded to ENUS this @@ -101,8 +100,7 @@ void PlayerbotHolder::HandlePlayerBotLoginCallback(PlayerbotLoginQueryHolder con { botSession->LogoutPlayer(true); delete botSession; - // LOG_ERROR("playerbots", "Error logging in bot {}, please try to reset all random bots", - // holder.GetGuid().ToString().c_str()); + botLoading.erase(holder.GetGuid()); return; } @@ -159,12 +157,8 @@ void PlayerbotHolder::HandlePlayerBotLoginCallback(PlayerbotLoginQueryHolder con } botSession->LogoutPlayer(true); delete botSession; - // OnBotLogin(bot); - // LogoutPlayerBot(bot->GetGUID()); - - // LOG_ERROR("playerbots", "Attempt to add not allowed bot {}, please try to reset all random bots", - // bot->GetName()); } + botLoading.erase(holder.GetGuid()); } void PlayerbotHolder::UpdateSessions() @@ -387,7 +381,7 @@ void PlayerbotHolder::DisablePlayerBot(ObjectGuid guid) LOG_DEBUG("playerbots", "Bot {} logged out", bot->GetName().c_str()); - bot->SaveToDB(false, false); + // bot->SaveToDB(false, false); if (botAI->GetAiObjectContext()) // Maybe some day re-write to delate all pointer values. { @@ -540,7 +534,7 @@ void PlayerbotHolder::OnBotLogin(Player* const bot) bot->RemovePlayerFlag(PLAYER_FLAGS_NO_XP_GAIN); } - bot->SaveToDB(false, false); + // bot->SaveToDB(false, false); if (master && isRandomAccount && master->GetLevel() < bot->GetLevel()) { // PlayerbotFactory factory(bot, master->GetLevel()); diff --git a/src/PlayerbotMgr.h b/src/PlayerbotMgr.h index ce746e07..d67d36ef 100644 --- a/src/PlayerbotMgr.h +++ b/src/PlayerbotMgr.h @@ -7,6 +7,7 @@ #define _PLAYERBOT_PLAYERBOTMGR_H #include "Common.h" +#include "ObjectGuid.h" #include "Player.h" #include "PlayerbotAIBase.h" #include "QueryHolder.h" @@ -57,6 +58,7 @@ protected: virtual void OnBotLoginInternal(Player* const bot) = 0; PlayerBotMap playerBots; + std::unordered_set botLoading; }; class PlayerbotMgr : public PlayerbotHolder