mirror of
https://github.com/NathanHandley/mod-ah-bot-plus.git
synced 2026-01-13 01:08:37 +00:00
Merge pull request #27 from zeb139/addNewAuctions-performance-improvement
Performance: Added batch processing to AddNewAuctions()
This commit is contained in:
@@ -37,11 +37,8 @@
|
|||||||
#
|
#
|
||||||
# AuctionHouseBot.ItemsPerCycle
|
# AuctionHouseBot.ItemsPerCycle
|
||||||
# How many items to post on the auction house every house update. Items
|
# How many items to post on the auction house every house update. Items
|
||||||
# in a cycle will be posted by a single randomly selected bot, so Keep
|
# in a cycle will be posted by a single randomly selected bot, so keep
|
||||||
# this value low if you want highly diverse postings. Do note that
|
# this value low if you want highly diverse "Seller" names in auction listings.
|
||||||
# this value has a direct impact on login startup time (specifically time
|
|
||||||
# from startup complete to first character being able to log in) so a
|
|
||||||
# value greater than a few hundred is not recommended.
|
|
||||||
# Default 150
|
# Default 150
|
||||||
#
|
#
|
||||||
# AuctionHouseBot.ListingExpireTimeInSecondsMin
|
# AuctionHouseBot.ListingExpireTimeInSecondsMin
|
||||||
|
|||||||
@@ -884,92 +884,99 @@ void AuctionHouseBot::AddNewAuctions(Player* AHBplayer, FactionSpecificAuctionHo
|
|||||||
uint32 itemsGenerated = 0;
|
uint32 itemsGenerated = 0;
|
||||||
for (uint32 cnt = 1; cnt <= newItemsToListCount; cnt++)
|
for (uint32 cnt = 1; cnt <= newItemsToListCount; cnt++)
|
||||||
{
|
{
|
||||||
// Either generate a new item ID to list, or grab from the remaining list
|
|
||||||
uint32 itemID;
|
|
||||||
if (ActiveListMultipleItemID != 0)
|
|
||||||
{
|
|
||||||
itemID = ActiveListMultipleItemID;
|
|
||||||
RemainingListMultipleCount--;
|
|
||||||
if (RemainingListMultipleCount <= 0)
|
|
||||||
ActiveListMultipleItemID = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
itemID = GetRandomItemIDForListing();
|
|
||||||
if (itemID != 0 && ItemListProportionMultipliedItemIDs.find(itemID) != ItemListProportionMultipliedItemIDs.end() &&
|
|
||||||
ItemListProportionMultipliedItemIDs[itemID] > 1)
|
|
||||||
{
|
|
||||||
ActiveListMultipleItemID = itemID;
|
|
||||||
RemainingListMultipleCount = ItemListProportionMultipliedItemIDs[itemID] - 1;
|
|
||||||
if (debug_Out)
|
|
||||||
LOG_INFO("module", "AHSeller: Is listing item ID {} which is configured for {} multiples from ListMultipliedItemIDs", itemID, ItemListProportionMultipliedItemIDs[itemID]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prevent invalid IDs
|
|
||||||
if (itemID == 0)
|
|
||||||
{
|
|
||||||
if (debug_Out)
|
|
||||||
LOG_ERROR("module", "AHSeller: Item::CreateItem() failed as the ItemID is 0");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemTemplate const* prototype = sObjectMgr->GetItemTemplate(itemID);
|
|
||||||
if (prototype == NULL)
|
|
||||||
{
|
|
||||||
if (debug_Out)
|
|
||||||
LOG_ERROR("module", "AHSeller: prototype == NULL");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Item* item = Item::CreateItem(itemID, 1, AHBplayer);
|
|
||||||
if (item == NULL)
|
|
||||||
{
|
|
||||||
if (debug_Out)
|
|
||||||
LOG_ERROR("module", "AHSeller: Item::CreateItem() returned NULL");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
item->AddToUpdateQueueOf(AHBplayer);
|
|
||||||
|
|
||||||
uint32 randomPropertyId = Item::GenerateItemRandomPropertyId(itemID);
|
|
||||||
if (randomPropertyId != 0)
|
|
||||||
item->SetItemRandomProperties(randomPropertyId);
|
|
||||||
|
|
||||||
// Determine price
|
|
||||||
uint64 buyoutPrice = 0;
|
|
||||||
uint64 bidPrice = 0;
|
|
||||||
CalculateItemValue(prototype, bidPrice, buyoutPrice);
|
|
||||||
|
|
||||||
// Define a duration
|
|
||||||
uint32 etime = urand(ListingExpireTimeInSecondsMin, ListingExpireTimeInSecondsMax);
|
|
||||||
|
|
||||||
// Set stack size
|
|
||||||
uint32 stackCount = GetStackSizeForItem(prototype);
|
|
||||||
item->SetCount(stackCount);
|
|
||||||
|
|
||||||
uint32 dep = sAuctionMgr->GetAuctionDeposit(ahEntry, etime, item, stackCount);
|
|
||||||
|
|
||||||
auto trans = CharacterDatabase.BeginTransaction();
|
auto trans = CharacterDatabase.BeginTransaction();
|
||||||
AuctionEntry* auctionEntry = new AuctionEntry();
|
uint32 batchCount = 0;
|
||||||
auctionEntry->Id = sObjectMgr->GenerateAuctionID();
|
|
||||||
auctionEntry->houseId = AuctionHouseId(config->GetAHID());
|
while (batchCount < 500 && itemsGenerated < newItemsToListCount)
|
||||||
auctionEntry->item_guid = item->GetGUID();
|
{
|
||||||
auctionEntry->item_template = item->GetEntry();
|
// Either generate a new item ID to list, or grab from the remaining list
|
||||||
auctionEntry->itemCount = item->GetCount();
|
uint32 itemID;
|
||||||
auctionEntry->owner = AHBplayer->GetGUID();
|
if (ActiveListMultipleItemID != 0)
|
||||||
auctionEntry->startbid = bidPrice * stackCount;
|
{
|
||||||
auctionEntry->buyout = buyoutPrice * stackCount;
|
itemID = ActiveListMultipleItemID;
|
||||||
auctionEntry->bid = 0;
|
RemainingListMultipleCount--;
|
||||||
auctionEntry->deposit = dep;
|
if (RemainingListMultipleCount <= 0)
|
||||||
auctionEntry->expire_time = (time_t) etime + time(NULL);
|
ActiveListMultipleItemID = 0;
|
||||||
auctionEntry->auctionHouseEntry = ahEntry;
|
}
|
||||||
item->SaveToDB(trans);
|
else
|
||||||
item->RemoveFromUpdateQueueOf(AHBplayer);
|
{
|
||||||
sAuctionMgr->AddAItem(item);
|
itemID = GetRandomItemIDForListing();
|
||||||
auctionHouse->AddAuction(auctionEntry);
|
if (itemID != 0 && ItemListProportionMultipliedItemIDs.find(itemID) != ItemListProportionMultipliedItemIDs.end() &&
|
||||||
auctionEntry->SaveToDB(trans);
|
ItemListProportionMultipliedItemIDs[itemID] > 1)
|
||||||
|
{
|
||||||
|
ActiveListMultipleItemID = itemID;
|
||||||
|
RemainingListMultipleCount = ItemListProportionMultipliedItemIDs[itemID] - 1;
|
||||||
|
if (debug_Out)
|
||||||
|
LOG_INFO("module", "AHSeller: Is listing item ID {} which is configured for {} multiples from ListMultipliedItemIDs", itemID, ItemListProportionMultipliedItemIDs[itemID]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent invalid IDs
|
||||||
|
if (itemID == 0)
|
||||||
|
{
|
||||||
|
if (debug_Out)
|
||||||
|
LOG_ERROR("module", "AHSeller: Item::CreateItem() failed as the ItemID is 0");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemTemplate const* prototype = sObjectMgr->GetItemTemplate(itemID);
|
||||||
|
if (prototype == NULL)
|
||||||
|
{
|
||||||
|
if (debug_Out)
|
||||||
|
LOG_ERROR("module", "AHSeller: prototype == NULL");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Item* item = Item::CreateItem(itemID, 1, AHBplayer);
|
||||||
|
if (item == NULL)
|
||||||
|
{
|
||||||
|
if (debug_Out)
|
||||||
|
LOG_ERROR("module", "AHSeller: Item::CreateItem() returned NULL");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
item->AddToUpdateQueueOf(AHBplayer);
|
||||||
|
|
||||||
|
uint32 randomPropertyId = Item::GenerateItemRandomPropertyId(itemID);
|
||||||
|
if (randomPropertyId != 0)
|
||||||
|
item->SetItemRandomProperties(randomPropertyId);
|
||||||
|
|
||||||
|
// Determine price
|
||||||
|
uint64 buyoutPrice = 0;
|
||||||
|
uint64 bidPrice = 0;
|
||||||
|
CalculateItemValue(prototype, bidPrice, buyoutPrice);
|
||||||
|
|
||||||
|
// Define a duration
|
||||||
|
uint32 etime = urand(ListingExpireTimeInSecondsMin, ListingExpireTimeInSecondsMax);
|
||||||
|
|
||||||
|
// Set stack size
|
||||||
|
uint32 stackCount = GetStackSizeForItem(prototype);
|
||||||
|
item->SetCount(stackCount);
|
||||||
|
|
||||||
|
uint32 dep = sAuctionMgr->GetAuctionDeposit(ahEntry, etime, item, stackCount);
|
||||||
|
|
||||||
|
AuctionEntry* auctionEntry = new AuctionEntry();
|
||||||
|
auctionEntry->Id = sObjectMgr->GenerateAuctionID();
|
||||||
|
auctionEntry->houseId = AuctionHouseId(config->GetAHID());
|
||||||
|
auctionEntry->item_guid = item->GetGUID();
|
||||||
|
auctionEntry->item_template = item->GetEntry();
|
||||||
|
auctionEntry->itemCount = item->GetCount();
|
||||||
|
auctionEntry->owner = AHBplayer->GetGUID();
|
||||||
|
auctionEntry->startbid = bidPrice * stackCount;
|
||||||
|
auctionEntry->buyout = buyoutPrice * stackCount;
|
||||||
|
auctionEntry->bid = 0;
|
||||||
|
auctionEntry->deposit = dep;
|
||||||
|
auctionEntry->expire_time = (time_t) etime + time(NULL);
|
||||||
|
auctionEntry->auctionHouseEntry = ahEntry;
|
||||||
|
item->SaveToDB(trans);
|
||||||
|
item->RemoveFromUpdateQueueOf(AHBplayer);
|
||||||
|
sAuctionMgr->AddAItem(item);
|
||||||
|
auctionHouse->AddAuction(auctionEntry);
|
||||||
|
auctionEntry->SaveToDB(trans);
|
||||||
|
itemsGenerated++;
|
||||||
|
batchCount++;
|
||||||
|
}
|
||||||
|
|
||||||
CharacterDatabase.CommitTransaction(trans);
|
CharacterDatabase.CommitTransaction(trans);
|
||||||
itemsGenerated++;
|
|
||||||
}
|
}
|
||||||
if (debug_Out)
|
if (debug_Out)
|
||||||
LOG_INFO("module", "AHSeller: Added {} items", itemsGenerated);
|
LOG_INFO("module", "AHSeller: Added {} items", itemsGenerated);
|
||||||
|
|||||||
Reference in New Issue
Block a user