From 00e1fe1988f5545ad9e02bdb710496811c01ab90 Mon Sep 17 00:00:00 2001 From: zeb <37308742+zeb139@users.noreply.github.com> Date: Tue, 14 Oct 2025 08:28:43 -0400 Subject: [PATCH] Added UseDropRates.MinDropRate --- conf/mod_ahbot.conf.dist | 9 ++++++++- src/AuctionHouseBot.cpp | 24 +++++++++++++++--------- src/AuctionHouseBot.h | 1 + src/AuctionHouseBotScript.cpp | 5 +++++ 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/conf/mod_ahbot.conf.dist b/conf/mod_ahbot.conf.dist index 21c81c8..5703755 100644 --- a/conf/mod_ahbot.conf.dist +++ b/conf/mod_ahbot.conf.dist @@ -94,7 +94,7 @@ AuctionHouseBot.ListingExpireTimeInSecondsMax = 86400 # Crafted items may also appear more often since their drop rate is effectively 100%. # Default: false (disabled) # -# AuctionHouseBot.Seller.AdvancedListingRules.UseDropRates. +# AuctionHouseBot.AdvancedListingRules.UseDropRates. # Toggle AdvancedListingRules.UseDropRates behavior for individual category. # Only applied if AdvancedListingRules.UseDropRates.Enabled is true. # Default: true (enabled) @@ -107,6 +107,12 @@ AuctionHouseBot.ListingExpireTimeInSecondsMax = 86400 # (0) Poor, (1) Common, (2) Uncommon, (3) Rare, (4) Epic, (5) Legendary, (6) Heirloom # Default: 2,3,4,5 # +# AuctionHouseBot.AdvancedListingRules.UseDropRates.MinDropRate +# The minimum drop rate any affected item can have. +# Some items can have extremely low drop rates in the DB (e.g. 0.00006), so +# this setting will raise those items' drop rate to this value. +# Default: 0.005 +# # AuctionHouseBot.AdvancedListingRules.UseDropRates.TiersConfig # The thresholds that define item drop rate tiers. # Value should be a string of comma-separated numbers between 0 and 100. @@ -135,6 +141,7 @@ AuctionHouseBot.AdvancedListingRules.UseDropRates.Weapon.AffectedQualities = 2,3 AuctionHouseBot.AdvancedListingRules.UseDropRates.Armor.AffectedQualities = 2,3,4,5 AuctionHouseBot.AdvancedListingRules.UseDropRates.Recipe.AffectedQualities = 2,3,4,5 +AuctionHouseBot.AdvancedListingRules.UseDropRates.MinDropRate = 0.005 AuctionHouseBot.AdvancedListingRules.UseDropRates.TiersConfig = 50, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01, 0.005 AuctionHouseBot.AdvancedListingRules.UseDropRates.DisabledItemIDs = diff --git a/src/AuctionHouseBot.cpp b/src/AuctionHouseBot.cpp index 4265fdf..952c04a 100644 --- a/src/AuctionHouseBot.cpp +++ b/src/AuctionHouseBot.cpp @@ -161,6 +161,7 @@ AuctionHouseBot::AuctionHouseBot() : AdvancedListingRuleUseDropRatesWeaponEnabled(true), AdvancedListingRuleUseDropRatesArmorEnabled(true), AdvancedListingRuleUseDropRatesRecipeEnabled(true), + AdvancedListingRuleUseDropRatesMinDropRate(0.005), LastBuyCycleCount(0), LastSellCycleCount(0), ActiveListMultipleItemID(0), @@ -1292,7 +1293,7 @@ void AuctionHouseBot::PopulateItemDropChancesForCategoryAndQuality(ItemClass cat SELECT itemID, 0 AS direct_chance, - AVG(reference_chance) AS reference_chance + MIN(reference_chance) AS reference_chance FROM chances GROUP BY itemID )SQL"; @@ -1347,7 +1348,7 @@ void AuctionHouseBot::PopulateItemDropChancesForCategoryAndQuality(ItemClass cat } // Add drop rate of all results to CachedItemDropRates - auto parseResults = [this](QueryResult result) + auto parseResults = [this](QueryResult result, bool overwriteDropRate) { do { Field* fields = result->Fetch(); @@ -1359,12 +1360,17 @@ void AuctionHouseBot::PopulateItemDropChancesForCategoryAndQuality(ItemClass cat if (IsItemQuestReward(itemID) || IsItemCrafted(itemID)) continue; + if (CachedItemDropRates.contains(itemID) && !overwriteDropRate) + continue; + if (!fields[1].IsNull()) directDropChance = fields[1].Get(); if (!fields[2].IsNull()) referenceDropChance = fields[2].Get(); + // Choose higher of two rates (one is normally 0), then raise to MinDropRate if less than double higherDropChance = (directDropChance > referenceDropChance) ? directDropChance : referenceDropChance; + higherDropChance = (higherDropChance < AdvancedListingRuleUseDropRatesMinDropRate) ? AdvancedListingRuleUseDropRatesMinDropRate : higherDropChance; if (CachedItemDropRates[itemID] < higherDropChance) CachedItemDropRates[itemID] = higherDropChance; @@ -1372,11 +1378,11 @@ void AuctionHouseBot::PopulateItemDropChancesForCategoryAndQuality(ItemClass cat } while (result->NextRow()); }; - parseResults(directResult); - parseResults(referenceResult); - parseResults(danglingReferenceResult); - parseResults(groupResult); - parseResults(objectsDropResult); + parseResults(directResult, true); + parseResults(referenceResult, true); + parseResults(danglingReferenceResult, false); + parseResults(groupResult, true); + parseResults(objectsDropResult, true); // Populate drop rates Tiers for (auto& [classID, qualityGroups] : ItemCandidatesByItemClassAndQuality) @@ -1706,8 +1712,6 @@ void AuctionHouseBot::Update() if (AHCharacters.empty() == true) return; - CleanupExpiredAuctionItems(); - if ((SellingBotEnabled == false) && (BuyingBotEnabled == false)) return; @@ -1815,6 +1819,8 @@ void AuctionHouseBot::InitializeConfiguration() AdvancedListingRuleUseDropRatesWeaponEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedListingRules.UseDropRates.Weapon", true); AdvancedListingRuleUseDropRatesArmorEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedListingRules.UseDropRates.Armor", true); AdvancedListingRuleUseDropRatesRecipeEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedListingRules.UseDropRates.Recipe", true); + AdvancedListingRuleUseDropRatesMinDropRate = sConfigMgr->GetOption("AuctionHouseBot.AdvancedListingRules.UseDropRates.MinDropRate", 0.005); + if (AdvancedListingRuleUseDropRatesMinDropRate < 0 || AdvancedListingRuleUseDropRatesMinDropRate > 100) AdvancedListingRuleUseDropRatesMinDropRate = 0.005; ParseNumberListToSet(AdvancedListingRuleUseDropRatesWeaponAffectedQualities, sConfigMgr->GetOption("AuctionHouseBot.AdvancedListingRules.UseDropRates.Weapon.AffectedQualities", "2,3,4,5"), ""); ParseNumberListToSet(AdvancedListingRuleUseDropRatesArmorAffectedQualities, sConfigMgr->GetOption("AuctionHouseBot.AdvancedListingRules.UseDropRates.Armor.AffectedQualities", "2,3,4,5"), ""); ParseNumberListToSet(AdvancedListingRuleUseDropRatesRecipeAffectedQualities, sConfigMgr->GetOption("AuctionHouseBot.AdvancedListingRules.UseDropRates.Recipe.AffectedQualities", "2,3,4,5"), ""); diff --git a/src/AuctionHouseBot.h b/src/AuctionHouseBot.h index 747c2ab..cb727e1 100644 --- a/src/AuctionHouseBot.h +++ b/src/AuctionHouseBot.h @@ -289,6 +289,7 @@ private: std::set AdvancedListingRuleUseDropRatesWeaponAffectedQualities; std::set AdvancedListingRuleUseDropRatesArmorAffectedQualities; std::set AdvancedListingRuleUseDropRatesRecipeAffectedQualities; + float AdvancedListingRuleUseDropRatesMinDropRate; std::unordered_set QuestRewardItemIDs; FactionSpecificAuctionHouseConfig AllianceConfig; diff --git a/src/AuctionHouseBotScript.cpp b/src/AuctionHouseBotScript.cpp index e4f5ff1..8bdef78 100644 --- a/src/AuctionHouseBotScript.cpp +++ b/src/AuctionHouseBotScript.cpp @@ -169,6 +169,8 @@ public: LOG_INFO("module", "AuctionHouseBot: Updating Auction House..."); handler->PSendSysMessage("AuctionHouseBot: Updating Auction House..."); AuctionHouseBot::instance()->Update(); + LOG_INFO("module", "AuctionHouseBot: Auction House Updated."); + handler->PSendSysMessage("AuctionHouseBot: Auction House Updated."); return true; } @@ -198,6 +200,9 @@ public: LOG_INFO("module", "AuctionHouseBot: Emptying Auction House..."); handler->PSendSysMessage("AuctionHouseBot: Emptying Auction House..."); AuctionHouseBot::instance()->EmptyAuctionHouses(); + AuctionHouseBot::instance()->CleanupExpiredAuctionItems(); // Must go after EmptyAuctionHouses() + LOG_INFO("module", "AuctionHouseBot: Auction Houses Emptied."); + handler->PSendSysMessage("AuctionHouseBot: Auction Houses Emptied."); return true; }