From c6d2fbedd26b8fa34953376609d4e23c5753534e Mon Sep 17 00:00:00 2001 From: NathanHandley Date: Sun, 21 Sep 2025 09:58:15 -0500 Subject: [PATCH] WIP proportion list rewrite --- conf/mod_ahbot.conf.dist | 172 +++++++++++++++++++++++++++++++-------- src/AuctionHouseBot.cpp | 56 +++---------- src/AuctionHouseBot.h | 25 ++---- 3 files changed, 162 insertions(+), 91 deletions(-) diff --git a/conf/mod_ahbot.conf.dist b/conf/mod_ahbot.conf.dist index 4411dec..14e6e10 100644 --- a/conf/mod_ahbot.conf.dist +++ b/conf/mod_ahbot.conf.dist @@ -185,41 +185,149 @@ AuctionHouseBot.Buyer.PreventOverpayingForVendorItems = true AuctionHouseBot.Buyer.BidAgainstPlayers = false ############################################################################### -# AuctionHouseBot.ListProportion.* +# AuctionHouseBot.ListProportion.Category*.Quality* # Determines how many of the listings, proportionally, show up as new auctions -# "0" will mean the item never shows up. Values must be whole numbers. -# Defaults: Consumable: 2 -# Container: 2 -# Weapon: 6 -# Gem: 2 -# Armor: 6 -# Reagent: 1 -# Projectile: 2 -# TradeGood: 22 -# Generic: 1 -# Recipe: 3 -# Quiver: 1 -# Quest: 2 -# Key: 1 -# Misc: 0 -# Glyph: 2 +# "0" will mean the item classification never shows up. Values must be whole numbers. +# For example, if consumable uncommon has a portion of 4 and container normal has +# a proportion of 1 with all others being zero, then when an auction is listed +# by a seller bot then 80% will be uncommon consumables and 20% will be normal +# containers. This won't increase the total number of auctions. ############################################################################### -AuctionHouseBot.ListProportion.Consumable = 2 -AuctionHouseBot.ListProportion.Container = 2 -AuctionHouseBot.ListProportion.Weapon = 6 -AuctionHouseBot.ListProportion.Gem = 2 -AuctionHouseBot.ListProportion.Armor = 6 -AuctionHouseBot.ListProportion.Reagent = 1 -AuctionHouseBot.ListProportion.Projectile = 2 -AuctionHouseBot.ListProportion.TradeGood = 22 -AuctionHouseBot.ListProportion.Generic = 1 -AuctionHouseBot.ListProportion.Recipe = 3 -AuctionHouseBot.ListProportion.Quiver = 1 -AuctionHouseBot.ListProportion.Quest = 2 -AuctionHouseBot.ListProportion.Key = 1 -AuctionHouseBot.ListProportion.Misc = 0 -AuctionHouseBot.ListProportion.Glyph = 2 +AuctionHouseBot.ListProportion.CategoryConsumable.QualityPoor = 2 +AuctionHouseBot.ListProportion.CategoryConsumable.QualityNormal = 2 +AuctionHouseBot.ListProportion.CategoryConsumable.QualityUncommon = 2 +AuctionHouseBot.ListProportion.CategoryConsumable.QualityRare = 2 +AuctionHouseBot.ListProportion.CategoryConsumable.QualityEpic = 2 +AuctionHouseBot.ListProportion.CategoryConsumable.QualityLegendary = 2 +AuctionHouseBot.ListProportion.CategoryConsumable.QualityArtifact = 2 +AuctionHouseBot.ListProportion.CategoryConsumable.QualityHeirloom = 2 + +AuctionHouseBot.ListProportion.CategoryContainer.QualityPoor = 2 +AuctionHouseBot.ListProportion.CategoryContainer.QualityNormal = 2 +AuctionHouseBot.ListProportion.CategoryContainer.QualityUncommon = 2 +AuctionHouseBot.ListProportion.CategoryContainer.QualityRare = 2 +AuctionHouseBot.ListProportion.CategoryContainer.QualityEpic = 2 +AuctionHouseBot.ListProportion.CategoryContainer.QualityLegendary = 2 +AuctionHouseBot.ListProportion.CategoryContainer.QualityArtifact = 2 +AuctionHouseBot.ListProportion.CategoryContainer.QualityHeirloom = 2 + +AuctionHouseBot.ListProportion.CategoryWeapon.QualityPoor = 6 +AuctionHouseBot.ListProportion.CategoryWeapon.QualityNormal = 6 +AuctionHouseBot.ListProportion.CategoryWeapon.QualityUncommon = 6 +AuctionHouseBot.ListProportion.CategoryWeapon.QualityRare = 6 +AuctionHouseBot.ListProportion.CategoryWeapon.QualityEpic = 6 +AuctionHouseBot.ListProportion.CategoryWeapon.QualityLegendary = 6 +AuctionHouseBot.ListProportion.CategoryWeapon.QualityArtifact = 6 +AuctionHouseBot.ListProportion.CategoryWeapon.QualityHeirloom = 6 + +AuctionHouseBot.ListProportion.CategoryGem.QualityPoor = 2 +AuctionHouseBot.ListProportion.CategoryGem.QualityNormal = 2 +AuctionHouseBot.ListProportion.CategoryGem.QualityUncommon = 2 +AuctionHouseBot.ListProportion.CategoryGem.QualityRare = 2 +AuctionHouseBot.ListProportion.CategoryGem.QualityEpic = 2 +AuctionHouseBot.ListProportion.CategoryGem.QualityLegendary = 2 +AuctionHouseBot.ListProportion.CategoryGem.QualityArtifact = 2 +AuctionHouseBot.ListProportion.CategoryGem.QualityHeirloom = 2 + +AuctionHouseBot.ListProportion.CategoryArmor.QualityPoor = 6 +AuctionHouseBot.ListProportion.CategoryArmor.QualityNormal = 6 +AuctionHouseBot.ListProportion.CategoryArmor.QualityUncommon = 6 +AuctionHouseBot.ListProportion.CategoryArmor.QualityRare = 6 +AuctionHouseBot.ListProportion.CategoryArmor.QualityEpic = 6 +AuctionHouseBot.ListProportion.CategoryArmor.QualityLegendary = 6 +AuctionHouseBot.ListProportion.CategoryArmor.QualityArtifact = 6 +AuctionHouseBot.ListProportion.CategoryArmor.QualityHeirloom = 6 + +AuctionHouseBot.ListProportion.CategoryReagent.QualityPoor = 1 +AuctionHouseBot.ListProportion.CategoryReagent.QualityNormal = 1 +AuctionHouseBot.ListProportion.CategoryReagent.QualityUncommon = 1 +AuctionHouseBot.ListProportion.CategoryReagent.QualityRare = 1 +AuctionHouseBot.ListProportion.CategoryReagent.QualityEpic = 1 +AuctionHouseBot.ListProportion.CategoryReagent.QualityLegendary = 1 +AuctionHouseBot.ListProportion.CategoryReagent.QualityArtifact = 1 +AuctionHouseBot.ListProportion.CategoryReagent.QualityHeirloom = 1 + +AuctionHouseBot.ListProportion.CategoryProjectile.QualityPoor = 2 +AuctionHouseBot.ListProportion.CategoryProjectile.QualityNormal = 2 +AuctionHouseBot.ListProportion.CategoryProjectile.QualityUncommon = 2 +AuctionHouseBot.ListProportion.CategoryProjectile.QualityRare = 2 +AuctionHouseBot.ListProportion.CategoryProjectile.QualityEpic = 2 +AuctionHouseBot.ListProportion.CategoryProjectile.QualityLegendary = 2 +AuctionHouseBot.ListProportion.CategoryProjectile.QualityArtifact = 2 +AuctionHouseBot.ListProportion.CategoryProjectile.QualityHeirloom = 2 + +AuctionHouseBot.ListProportion.CategoryTradeGood.QualityPoor = 22 +AuctionHouseBot.ListProportion.CategoryTradeGood.QualityNormal = 22 +AuctionHouseBot.ListProportion.CategoryTradeGood.QualityUncommon = 22 +AuctionHouseBot.ListProportion.CategoryTradeGood.QualityRare = 22 +AuctionHouseBot.ListProportion.CategoryTradeGood.QualityEpic = 22 +AuctionHouseBot.ListProportion.CategoryTradeGood.QualityLegendary = 22 +AuctionHouseBot.ListProportion.CategoryTradeGood.QualityArtifact = 22 +AuctionHouseBot.ListProportion.CategoryTradeGood.QualityHeirloom = 22 + +AuctionHouseBot.ListProportion.CategoryGeneric.QualityPoor = 1 +AuctionHouseBot.ListProportion.CategoryGeneric.QualityNormal = 1 +AuctionHouseBot.ListProportion.CategoryGeneric.QualityUncommon = 1 +AuctionHouseBot.ListProportion.CategoryGeneric.QualityRare = 1 +AuctionHouseBot.ListProportion.CategoryGeneric.QualityEpic = 1 +AuctionHouseBot.ListProportion.CategoryGeneric.QualityLegendary = 1 +AuctionHouseBot.ListProportion.CategoryGeneric.QualityArtifact = 1 +AuctionHouseBot.ListProportion.CategoryGeneric.QualityHeirloom = 1 + +AuctionHouseBot.ListProportion.CategoryRecipe.QualityPoor = 3 +AuctionHouseBot.ListProportion.CategoryRecipe.QualityNormal = 3 +AuctionHouseBot.ListProportion.CategoryRecipe.QualityUncommon = 3 +AuctionHouseBot.ListProportion.CategoryRecipe.QualityRare = 3 +AuctionHouseBot.ListProportion.CategoryRecipe.QualityEpic = 3 +AuctionHouseBot.ListProportion.CategoryRecipe.QualityLegendary = 3 +AuctionHouseBot.ListProportion.CategoryRecipe.QualityArtifact = 3 +AuctionHouseBot.ListProportion.CategoryRecipe.QualityHeirloom = 3 + +AuctionHouseBot.ListProportion.CategoryQuiver.QualityPoor = 1 +AuctionHouseBot.ListProportion.CategoryQuiver.QualityNormal = 1 +AuctionHouseBot.ListProportion.CategoryQuiver.QualityUncommon = 1 +AuctionHouseBot.ListProportion.CategoryQuiver.QualityRare = 1 +AuctionHouseBot.ListProportion.CategoryQuiver.QualityEpic = 1 +AuctionHouseBot.ListProportion.CategoryQuiver.QualityLegendary = 1 +AuctionHouseBot.ListProportion.CategoryQuiver.QualityArtifact = 1 +AuctionHouseBot.ListProportion.CategoryQuiver.QualityHeirloom = 1 + +AuctionHouseBot.ListProportion.CategoryQuest.QualityPoor = 2 +AuctionHouseBot.ListProportion.CategoryQuest.QualityNormal = 2 +AuctionHouseBot.ListProportion.CategoryQuest.QualityUncommon = 2 +AuctionHouseBot.ListProportion.CategoryQuest.QualityRare = 2 +AuctionHouseBot.ListProportion.CategoryQuest.QualityEpic = 2 +AuctionHouseBot.ListProportion.CategoryQuest.QualityLegendary = 2 +AuctionHouseBot.ListProportion.CategoryQuest.QualityArtifact = 2 +AuctionHouseBot.ListProportion.CategoryQuest.QualityHeirloom = 2 + +AuctionHouseBot.ListProportion.CategoryKey.QualityPoor = 1 +AuctionHouseBot.ListProportion.CategoryKey.QualityNormal = 1 +AuctionHouseBot.ListProportion.CategoryKey.QualityUncommon = 1 +AuctionHouseBot.ListProportion.CategoryKey.QualityRare = 1 +AuctionHouseBot.ListProportion.CategoryKey.QualityEpic = 1 +AuctionHouseBot.ListProportion.CategoryKey.QualityLegendary = 1 +AuctionHouseBot.ListProportion.CategoryKey.QualityArtifact = 1 +AuctionHouseBot.ListProportion.CategoryKey.QualityHeirloom = 1 + +AuctionHouseBot.ListProportion.CategoryMisc.QualityPoor = 0 +AuctionHouseBot.ListProportion.CategoryMisc.QualityNormal = 0 +AuctionHouseBot.ListProportion.CategoryMisc.QualityUncommon = 0 +AuctionHouseBot.ListProportion.CategoryMisc.QualityRare = 0 +AuctionHouseBot.ListProportion.CategoryMisc.QualityEpic = 0 +AuctionHouseBot.ListProportion.CategoryMisc.QualityLegendary = 0 +AuctionHouseBot.ListProportion.CategoryMisc.QualityArtifact = 0 +AuctionHouseBot.ListProportion.CategoryMisc.QualityHeirloom = 0 + +AuctionHouseBot.ListProportion.CategoryGlyph.QualityPoor = 2 +AuctionHouseBot.ListProportion.CategoryGlyph.QualityNormal = 2 +AuctionHouseBot.ListProportion.CategoryGlyph.QualityUncommon = 2 +AuctionHouseBot.ListProportion.CategoryGlyph.QualityRare = 2 +AuctionHouseBot.ListProportion.CategoryGlyph.QualityEpic = 2 +AuctionHouseBot.ListProportion.CategoryGlyph.QualityLegendary = 2 +AuctionHouseBot.ListProportion.CategoryGlyph.QualityArtifact = 2 +AuctionHouseBot.ListProportion.CategoryGlyph.QualityHeirloom = 2 ############################################################################### # AuctionHouseBot.PriceMinimumCenterBase.* diff --git a/src/AuctionHouseBot.cpp b/src/AuctionHouseBot.cpp index 36359cd..468f710 100644 --- a/src/AuctionHouseBot.cpp +++ b/src/AuctionHouseBot.cpp @@ -91,21 +91,6 @@ AuctionHouseBot::AuctionHouseBot() : RandomStackIncrementKey(1), RandomStackIncrementMisc(1), RandomStackIncrementGlyph(1), - ListProportionConsumable(1), - ListProportionContainer(1), - ListProportionWeapon(1), - ListProportionGem(1), - ListProportionArmor(1), - ListProportionReagent(1), - ListProportionProjectile(1), - ListProportionTradeGood(1), - ListProportionGeneric(1), - ListProportionRecipe(1), - ListProportionQuiver(1), - ListProportionQuest(1), - ListProportionKey(1), - ListProportionMisc(1), - ListProportionGlyph(1), PriceMultiplierCategoryConsumable(1), PriceMultiplierCategoryContainer(1), PriceMultiplierCategoryWeapon(1), @@ -838,17 +823,6 @@ void AuctionHouseBot::populateItemCandidateList() // Store the item ID ItemCandidatesByItemClass[itr->second.Class].push_back(itr->second.ItemId); - - // Store a second copy if it's a trade good of certain types to double the chances - if (itr->second.Class == ITEM_CLASS_TRADE_GOODS) - { - if (itr->second.SubClass == ITEM_SUBCLASS_CLOTH || itr->second.SubClass == ITEM_SUBCLASS_LEATHER || - itr->second.SubClass == ITEM_SUBCLASS_ENCHANTING || itr->second.SubClass == ITEM_SUBCLASS_HERB || - itr->second.SubClass == ITEM_SUBCLASS_METAL_STONE) - { - ItemCandidatesByItemClass[itr->second.Class].push_back(itr->second.ItemId); - } - } } if (debug_Out) @@ -1352,23 +1326,6 @@ void AuctionHouseBot::InitializeConfiguration() RandomStackIncrementMisc = GetRandomStackIncrementValue("AuctionHouseBot.ListingStack.RandomStackIncrement.Misc", 1); RandomStackIncrementGlyph = GetRandomStackIncrementValue("AuctionHouseBot.ListingStack.RandomStackIncrement.Glyph", 1); - // List Proportions - ListProportionConsumable = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.Consumable", 2); - ListProportionContainer = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.Container", 2); - ListProportionWeapon = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.Weapon", 6); - ListProportionGem = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.Gem", 2); - ListProportionArmor = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.Armor", 6); - ListProportionReagent = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.Reagent", 1); - ListProportionProjectile = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.Projectile", 2); - ListProportionTradeGood = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.TradeGood", 22); - ListProportionGeneric = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.Generic", 1); - ListProportionRecipe = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.Recipe", 3); - ListProportionQuiver = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.Quiver", 1); - ListProportionQuest = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.Quest", 2); - ListProportionKey = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.Key", 1); - ListProportionMisc = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.Misc", 0); - ListProportionGlyph = sConfigMgr->GetOption("AuctionHouseBot.ListProportion.Glyph", 2); - // Price Multipliers PriceMultiplierCategoryConsumable = sConfigMgr->GetOption("AuctionHouseBot.PriceMultiplier.Category.Consumable", 1); PriceMultiplierCategoryContainer = sConfigMgr->GetOption("AuctionHouseBot.PriceMultiplier.Category.Container", 1); @@ -1408,15 +1365,28 @@ void AuctionHouseBot::InitializeConfiguration() PriceMultiplierQualityLegendary = sConfigMgr->GetOption("AuctionHouseBot.PriceMultiplier.Quality.Legendary", 3); PriceMultiplierQualityArtifact = sConfigMgr->GetOption("AuctionHouseBot.PriceMultiplier.Quality.Artifact", 3); PriceMultiplierQualityHeirloom = sConfigMgr->GetOption("AuctionHouseBot.PriceMultiplier.Quality.Heirloom", 3); + ItemListProportionNodes.clear(); for (int category = 0; category < MAX_ITEM_CLASS; category++) { for (int quality = 0; quality < MAX_ITEM_QUALITY; quality++) { + // Price Multipliers std::string key = std::string("AuctionHouseBot.PriceMultiplier.Category") + GetCategoryName((ItemClass)category) + ".Quality" + GetQualityName((ItemQualities)quality); float multiplier = sConfigMgr->GetOption(key.c_str(), 1.0f); PriceMultiplierCategoryQuality[category][quality] = multiplier; + + // List Proportions + if (category != ITEM_CLASS_MONEY && category != ITEM_CLASS_PERMANENT) + { + key = std::string("AuctionHouseBot.ListProportion.Category") + GetCategoryName((ItemClass)category) + ".Quality" + GetQualityName((ItemQualities)quality); + ListProportionNode node; + node.ItemClassID = category; + node.ItemQualityID = quality; + node.Proportion = sConfigMgr->GetOption(key.c_str(), 0); + ItemListProportionNodes.push_back(node); + } } } PriceMultiplierCategoryMountQualityPoor = sConfigMgr->GetOption("AuctionHouseBot.PriceMultiplier.CategoryMount.QualityPoor", 1.0); diff --git a/src/AuctionHouseBot.h b/src/AuctionHouseBot.h index c2d78df..4349e51 100644 --- a/src/AuctionHouseBot.h +++ b/src/AuctionHouseBot.h @@ -34,6 +34,13 @@ class WorldSession; #include "ItemTemplate.h" #include "SharedDefines.h" +struct ListProportionNode +{ + uint32 ItemClassID = 0; + uint32 ItemQualityID = 0; + uint32 Proportion = 0; +}; + class FactionSpecificAuctionHouseConfig { private: @@ -175,22 +182,8 @@ private: uint32 RandomStackIncrementMisc; uint32 RandomStackIncrementGlyph; std::vector ItemCandidateClassWeightedProportionList; - std::map> ItemCandidatesByItemClass; - uint32 ListProportionConsumable; - uint32 ListProportionContainer; - uint32 ListProportionWeapon; - uint32 ListProportionGem; - uint32 ListProportionArmor; - uint32 ListProportionReagent; - uint32 ListProportionProjectile; - uint32 ListProportionTradeGood; - uint32 ListProportionGeneric; - uint32 ListProportionRecipe; - uint32 ListProportionQuiver; - uint32 ListProportionQuest; - uint32 ListProportionKey; - uint32 ListProportionMisc; - uint32 ListProportionGlyph; + std::vector ItemListProportionNodes; + std::map> ItemCandidatesByItemClassAndQuality; float PriceMultiplierCategoryConsumable; float PriceMultiplierCategoryContainer; float PriceMultiplierCategoryWeapon;