Fix player session leak by bots in update loop

This commit is contained in:
NathanHandley
2025-10-01 06:54:54 -05:00
parent 05ee493a77
commit 1abca1a971

View File

@@ -1183,10 +1183,9 @@ void AuctionHouseBot::Update()
{ {
if ((SellingBotEnabled == false) && (BuyingBotEnabled == false)) if ((SellingBotEnabled == false) && (BuyingBotEnabled == false))
return; return;
if (AHCharacters.size() == 0) if (AHCharacters.empty() == true)
return; return;
// Only update if the update cycle has been hit // Only update if the update cycle has been hit
LastCycleCount++; LastCycleCount++;
if (LastCycleCount < CyclesBetweenBuyOrSell) if (LastCycleCount < CyclesBetweenBuyOrSell)
@@ -1195,36 +1194,51 @@ void AuctionHouseBot::Update()
CyclesBetweenBuyOrSell = urand(CyclesBetweenBuyOrSellMin, CyclesBetweenBuyOrSellMax); CyclesBetweenBuyOrSell = urand(CyclesBetweenBuyOrSellMin, CyclesBetweenBuyOrSellMax);
// Load all AH Bot Players // Load all AH Bot Players
std::vector<Player*> AHBPlayers; std::vector<std::pair<Player*, std::unique_ptr<WorldSession>>> AHBPlayers;
for (uint32 botIndex = 0; botIndex <= AHCharacters.size() - 1; ++botIndex) AHBPlayers.reserve(AHCharacters.size());
for (uint32 botIndex = 0; botIndex < AHCharacters.size(); ++botIndex)
{ {
CurrentBotCharGUID = AHCharacters[botIndex].CharacterGUID; CurrentBotCharGUID = AHCharacters[botIndex].CharacterGUID;
std::string accountName = "AuctionHouseBot" + std::to_string(AHCharacters[botIndex].AccountID); std::string accountName = "AuctionHouseBot" + std::to_string(AHCharacters[botIndex].AccountID);
WorldSession _session(AHCharacters[botIndex].AccountID, std::move(accountName), 0, nullptr, SEC_PLAYER, sWorld->getIntConfig(CONFIG_EXPANSION), 0, LOCALE_enUS, 0, false, false, 0);
Player* _AHBplayer = new Player(&_session); // Wrap session in unique pointer to manage the session lifetime
_AHBplayer->Initialize(AHCharacters[botIndex].CharacterGUID); auto session = std::make_unique<WorldSession>(
ObjectAccessor::AddObject(_AHBplayer); AHCharacters[botIndex].AccountID, std::move(accountName), 0, nullptr,
AHBPlayers.push_back(_AHBplayer); SEC_PLAYER, sWorld->getIntConfig(CONFIG_EXPANSION), 0, LOCALE_enUS, 0, false, false, 0
);
Player* player = new Player(session.get());
player->Initialize(AHCharacters[botIndex].CharacterGUID);
ObjectAccessor::AddObject(player);
AHBPlayers.emplace_back(player, std::move(session));
} }
// Create a vector of Player* for passing to methods
std::vector<Player*> playersPointerVector;
playersPointerVector.reserve(AHBPlayers.size());
for (const auto& pair : AHBPlayers)
playersPointerVector.push_back(pair.first);
// Add New Bids // Add New Bids
if (!sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION)) if (sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_AUCTION) == false)
{ {
AddNewAuctions(AHBPlayers, &AllianceConfig); AddNewAuctions(playersPointerVector, &AllianceConfig);
if (BuyingBotBuyCandidatesPerBuyCycleMin > 0) if (BuyingBotBuyCandidatesPerBuyCycleMin > 0)
AddNewAuctionBuyerBotBid(AHBPlayers, &AllianceConfig); AddNewAuctionBuyerBotBid(playersPointerVector, &AllianceConfig);
AddNewAuctions(AHBPlayers, &HordeConfig); AddNewAuctions(playersPointerVector, &HordeConfig);
if (BuyingBotBuyCandidatesPerBuyCycleMin > 0) if (BuyingBotBuyCandidatesPerBuyCycleMin > 0)
AddNewAuctionBuyerBotBid(AHBPlayers, &HordeConfig); AddNewAuctionBuyerBotBid(playersPointerVector, &HordeConfig);
} }
AddNewAuctions(playersPointerVector, &NeutralConfig);
AddNewAuctions(AHBPlayers, &NeutralConfig);
if (BuyingBotBuyCandidatesPerBuyCycleMin > 0) if (BuyingBotBuyCandidatesPerBuyCycleMin > 0)
AddNewAuctionBuyerBotBid(AHBPlayers, &NeutralConfig); AddNewAuctionBuyerBotBid(playersPointerVector, &NeutralConfig);
for (Player* p : AHBPlayers) // Explicitly delete players to close sessions
ObjectAccessor::RemoveObject(p); for (auto& [player, session] : AHBPlayers)
{
ObjectAccessor::RemoveObject(player);
delete player;
}
} }
void AuctionHouseBot::InitializeConfiguration() void AuctionHouseBot::InitializeConfiguration()