Merge pull request #39 from zeb139/add-usedroprates-minrate

Added UseDropRates.MinDropRate + other fixes
This commit is contained in:
Nathan Handley
2025-10-14 08:53:26 -05:00
committed by GitHub
4 changed files with 29 additions and 10 deletions

View File

@@ -94,7 +94,7 @@ AuctionHouseBot.ListingExpireTimeInSecondsMax = 86400
# Crafted items may also appear more often since their drop rate is effectively 100%. # Crafted items may also appear more often since their drop rate is effectively 100%.
# Default: false (disabled) # Default: false (disabled)
# #
# AuctionHouseBot.Seller.AdvancedListingRules.UseDropRates.<Category> # AuctionHouseBot.AdvancedListingRules.UseDropRates.<Category>
# Toggle AdvancedListingRules.UseDropRates behavior for individual category. # Toggle AdvancedListingRules.UseDropRates behavior for individual category.
# Only applied if AdvancedListingRules.UseDropRates.Enabled is true. # Only applied if AdvancedListingRules.UseDropRates.Enabled is true.
# Default: true (enabled) # Default: true (enabled)
@@ -107,6 +107,12 @@ AuctionHouseBot.ListingExpireTimeInSecondsMax = 86400
# (0) Poor, (1) Common, (2) Uncommon, (3) Rare, (4) Epic, (5) Legendary, (6) Heirloom # (0) Poor, (1) Common, (2) Uncommon, (3) Rare, (4) Epic, (5) Legendary, (6) Heirloom
# Default: 2,3,4,5 # 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 # AuctionHouseBot.AdvancedListingRules.UseDropRates.TiersConfig
# The thresholds that define item drop rate tiers. # The thresholds that define item drop rate tiers.
# Value should be a string of comma-separated numbers between 0 and 100. # 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.Armor.AffectedQualities = 2,3,4,5
AuctionHouseBot.AdvancedListingRules.UseDropRates.Recipe.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.TiersConfig = 50, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01, 0.005
AuctionHouseBot.AdvancedListingRules.UseDropRates.DisabledItemIDs = AuctionHouseBot.AdvancedListingRules.UseDropRates.DisabledItemIDs =

View File

@@ -161,6 +161,7 @@ AuctionHouseBot::AuctionHouseBot() :
AdvancedListingRuleUseDropRatesWeaponEnabled(true), AdvancedListingRuleUseDropRatesWeaponEnabled(true),
AdvancedListingRuleUseDropRatesArmorEnabled(true), AdvancedListingRuleUseDropRatesArmorEnabled(true),
AdvancedListingRuleUseDropRatesRecipeEnabled(true), AdvancedListingRuleUseDropRatesRecipeEnabled(true),
AdvancedListingRuleUseDropRatesMinDropRate(0.005),
LastBuyCycleCount(0), LastBuyCycleCount(0),
LastSellCycleCount(0), LastSellCycleCount(0),
ActiveListMultipleItemID(0), ActiveListMultipleItemID(0),
@@ -1292,7 +1293,7 @@ void AuctionHouseBot::PopulateItemDropChancesForCategoryAndQuality(ItemClass cat
SELECT itemID, SELECT itemID,
0 AS direct_chance, 0 AS direct_chance,
AVG(reference_chance) AS reference_chance MIN(reference_chance) AS reference_chance
FROM chances FROM chances
GROUP BY itemID GROUP BY itemID
)SQL"; )SQL";
@@ -1347,7 +1348,7 @@ void AuctionHouseBot::PopulateItemDropChancesForCategoryAndQuality(ItemClass cat
} }
// Add drop rate of all results to CachedItemDropRates // Add drop rate of all results to CachedItemDropRates
auto parseResults = [this](QueryResult result) auto parseResults = [this](QueryResult result, bool overwriteDropRate)
{ {
do { do {
Field* fields = result->Fetch(); Field* fields = result->Fetch();
@@ -1359,12 +1360,17 @@ void AuctionHouseBot::PopulateItemDropChancesForCategoryAndQuality(ItemClass cat
if (IsItemQuestReward(itemID) || IsItemCrafted(itemID)) if (IsItemQuestReward(itemID) || IsItemCrafted(itemID))
continue; continue;
if (CachedItemDropRates.contains(itemID) && !overwriteDropRate)
continue;
if (!fields[1].IsNull()) if (!fields[1].IsNull())
directDropChance = fields[1].Get<double>(); directDropChance = fields[1].Get<double>();
if (!fields[2].IsNull()) if (!fields[2].IsNull())
referenceDropChance = fields[2].Get<double>(); referenceDropChance = fields[2].Get<double>();
// Choose higher of two rates (one is normally 0), then raise to MinDropRate if less than
double higherDropChance = (directDropChance > referenceDropChance) ? directDropChance : referenceDropChance; double higherDropChance = (directDropChance > referenceDropChance) ? directDropChance : referenceDropChance;
higherDropChance = (higherDropChance < AdvancedListingRuleUseDropRatesMinDropRate) ? AdvancedListingRuleUseDropRatesMinDropRate : higherDropChance;
if (CachedItemDropRates[itemID] < higherDropChance) if (CachedItemDropRates[itemID] < higherDropChance)
CachedItemDropRates[itemID] = higherDropChance; CachedItemDropRates[itemID] = higherDropChance;
@@ -1372,11 +1378,11 @@ void AuctionHouseBot::PopulateItemDropChancesForCategoryAndQuality(ItemClass cat
} while (result->NextRow()); } while (result->NextRow());
}; };
parseResults(directResult); parseResults(directResult, true);
parseResults(referenceResult); parseResults(referenceResult, true);
parseResults(danglingReferenceResult); parseResults(danglingReferenceResult, false);
parseResults(groupResult); parseResults(groupResult, true);
parseResults(objectsDropResult); parseResults(objectsDropResult, true);
// Populate drop rates Tiers // Populate drop rates Tiers
for (auto& [classID, qualityGroups] : ItemCandidatesByItemClassAndQuality) for (auto& [classID, qualityGroups] : ItemCandidatesByItemClassAndQuality)
@@ -1706,8 +1712,6 @@ void AuctionHouseBot::Update()
if (AHCharacters.empty() == true) if (AHCharacters.empty() == true)
return; return;
CleanupExpiredAuctionItems();
if ((SellingBotEnabled == false) && (BuyingBotEnabled == false)) if ((SellingBotEnabled == false) && (BuyingBotEnabled == false))
return; return;
@@ -1815,6 +1819,8 @@ void AuctionHouseBot::InitializeConfiguration()
AdvancedListingRuleUseDropRatesWeaponEnabled = sConfigMgr->GetOption<bool>("AuctionHouseBot.AdvancedListingRules.UseDropRates.Weapon", true); AdvancedListingRuleUseDropRatesWeaponEnabled = sConfigMgr->GetOption<bool>("AuctionHouseBot.AdvancedListingRules.UseDropRates.Weapon", true);
AdvancedListingRuleUseDropRatesArmorEnabled = sConfigMgr->GetOption<bool>("AuctionHouseBot.AdvancedListingRules.UseDropRates.Armor", true); AdvancedListingRuleUseDropRatesArmorEnabled = sConfigMgr->GetOption<bool>("AuctionHouseBot.AdvancedListingRules.UseDropRates.Armor", true);
AdvancedListingRuleUseDropRatesRecipeEnabled = sConfigMgr->GetOption<bool>("AuctionHouseBot.AdvancedListingRules.UseDropRates.Recipe", true); AdvancedListingRuleUseDropRatesRecipeEnabled = sConfigMgr->GetOption<bool>("AuctionHouseBot.AdvancedListingRules.UseDropRates.Recipe", true);
AdvancedListingRuleUseDropRatesMinDropRate = sConfigMgr->GetOption<float>("AuctionHouseBot.AdvancedListingRules.UseDropRates.MinDropRate", 0.005);
if (AdvancedListingRuleUseDropRatesMinDropRate < 0 || AdvancedListingRuleUseDropRatesMinDropRate > 100) AdvancedListingRuleUseDropRatesMinDropRate = 0.005;
ParseNumberListToSet(AdvancedListingRuleUseDropRatesWeaponAffectedQualities, sConfigMgr->GetOption<std::string>("AuctionHouseBot.AdvancedListingRules.UseDropRates.Weapon.AffectedQualities", "2,3,4,5"), ""); ParseNumberListToSet(AdvancedListingRuleUseDropRatesWeaponAffectedQualities, sConfigMgr->GetOption<std::string>("AuctionHouseBot.AdvancedListingRules.UseDropRates.Weapon.AffectedQualities", "2,3,4,5"), "");
ParseNumberListToSet(AdvancedListingRuleUseDropRatesArmorAffectedQualities, sConfigMgr->GetOption<std::string>("AuctionHouseBot.AdvancedListingRules.UseDropRates.Armor.AffectedQualities", "2,3,4,5"), ""); ParseNumberListToSet(AdvancedListingRuleUseDropRatesArmorAffectedQualities, sConfigMgr->GetOption<std::string>("AuctionHouseBot.AdvancedListingRules.UseDropRates.Armor.AffectedQualities", "2,3,4,5"), "");
ParseNumberListToSet(AdvancedListingRuleUseDropRatesRecipeAffectedQualities, sConfigMgr->GetOption<std::string>("AuctionHouseBot.AdvancedListingRules.UseDropRates.Recipe.AffectedQualities", "2,3,4,5"), ""); ParseNumberListToSet(AdvancedListingRuleUseDropRatesRecipeAffectedQualities, sConfigMgr->GetOption<std::string>("AuctionHouseBot.AdvancedListingRules.UseDropRates.Recipe.AffectedQualities", "2,3,4,5"), "");

View File

@@ -289,6 +289,7 @@ private:
std::set<uint32> AdvancedListingRuleUseDropRatesWeaponAffectedQualities; std::set<uint32> AdvancedListingRuleUseDropRatesWeaponAffectedQualities;
std::set<uint32> AdvancedListingRuleUseDropRatesArmorAffectedQualities; std::set<uint32> AdvancedListingRuleUseDropRatesArmorAffectedQualities;
std::set<uint32> AdvancedListingRuleUseDropRatesRecipeAffectedQualities; std::set<uint32> AdvancedListingRuleUseDropRatesRecipeAffectedQualities;
float AdvancedListingRuleUseDropRatesMinDropRate;
std::unordered_set<uint32> QuestRewardItemIDs; std::unordered_set<uint32> QuestRewardItemIDs;
FactionSpecificAuctionHouseConfig AllianceConfig; FactionSpecificAuctionHouseConfig AllianceConfig;

View File

@@ -169,6 +169,8 @@ public:
LOG_INFO("module", "AuctionHouseBot: Updating Auction House..."); LOG_INFO("module", "AuctionHouseBot: Updating Auction House...");
handler->PSendSysMessage("AuctionHouseBot: Updating Auction House..."); handler->PSendSysMessage("AuctionHouseBot: Updating Auction House...");
AuctionHouseBot::instance()->Update(); AuctionHouseBot::instance()->Update();
LOG_INFO("module", "AuctionHouseBot: Auction House Updated.");
handler->PSendSysMessage("AuctionHouseBot: Auction House Updated.");
return true; return true;
} }
@@ -198,6 +200,9 @@ public:
LOG_INFO("module", "AuctionHouseBot: Emptying Auction House..."); LOG_INFO("module", "AuctionHouseBot: Emptying Auction House...");
handler->PSendSysMessage("AuctionHouseBot: Emptying Auction House..."); handler->PSendSysMessage("AuctionHouseBot: Emptying Auction House...");
AuctionHouseBot::instance()->EmptyAuctionHouses(); 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; return true;
} }