mirror of
https://github.com/NathanHandley/mod-ah-bot-plus.git
synced 2026-01-13 01:08:37 +00:00
Fix player session leak by bots in update loop
This commit is contained in:
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user