From a7efe6d76032edd76372e00542076236feb25b2c Mon Sep 17 00:00:00 2001 From: NathanHandley Date: Mon, 6 Oct 2025 08:47:20 -0500 Subject: [PATCH] Add configs to enable/disable sellprice restrictions --- conf/mod_ahbot.conf.dist | 20 +++++++++++++++++++- src/AuctionHouseBot.cpp | 35 +++++++++++++++++++---------------- src/AuctionHouseBot.h | 2 ++ 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/conf/mod_ahbot.conf.dist b/conf/mod_ahbot.conf.dist index be9fd08..9cbdea9 100644 --- a/conf/mod_ahbot.conf.dist +++ b/conf/mod_ahbot.conf.dist @@ -97,6 +97,11 @@ AuctionHouseBot.ListingExpireTimeInSecondsMax = 86400 # Note: Do not go negative on either number. Set both to 0 if you want bids # to always be exactly buyout for both buyer and seller. # +# AuctionHouseBot.BuyoutBelowVendorVariationAddPercentEnabled +# If true, price calculation will apply the following config percent when +# a price's buyout is calculated below the item_template.SellPrice +# Default: true +# # AuctionHouseBot.BuyoutBelowVendorVariationAddPercent # If a buyout calculates to a price below vendor price, this is how much to # add to it in order to bring it up above vendor price. @@ -110,6 +115,7 @@ AuctionHouseBot.BuyoutVariationReducePercent = 0.15 AuctionHouseBot.BuyoutVariationAddPercent = 0.25 AuctionHouseBot.BidVariationHighReducePercent = 0 AuctionHouseBot.BidVariationLowReducePercent = 0.25 +AuctionHouseBot.BuyoutBelowVendorVariationAddPercentEnabled = true AuctionHouseBot.BuyoutBelowVendorVariationAddPercent = 0.25 ############################################################################### @@ -372,11 +378,21 @@ AuctionHouseBot.ListProportion.CategoryGlyph.QualityHeirloom = 0 AuctionHouseBot.ListProportion.ListMultipliedItemIDs = 2589:10,2592:10,4306:10,4338:10,14047:10,21877:10,33470:10,2318:10,2319:10,4234:10,4304:10,8170:10,21887:10,33568:10,2770:10,2771:10,2772:10,2775:10,2776:10,3858:10,7911:10,10620:10,23424:10,23425:10,23426:10,23427:10,36909:10,36912:10,36910:10,2835:10,2836:10,2838:10,12365:10,7912:10,765:10,785:10,2447:10,2449:10,2450:10,2452:10,2453:10,3355:10,3356:10,3357:10,3358:10,3369:10,3818:10,3819:10,3820:10,3821:10,4625:10,8153:10,8831:10,8836:10,8838:10,8839:10,8845:10,8846:10,13463:10,13464:10,13465:10,13466:10,13467:10,13468:10,22785:10,22786:10,22787:10,22789:10,22790:10,22791:10,22792:10,22793:10,22794:10,22795:10,36901:10,36902:10,36903:10,36904:10,36905:10,36906:10,36907:10,36908:10,37921:10,10938:10,10939:10,10940:10,10978:10,10998:10,11082:10,11084:10,11128:10,11134:10,11135:10,11138:10,11139:10,11174:10,11175:10,11177:10,11178:10,14343:10,16202:10,16203:10,16204:10,22445:10,22446:10,22447:10,22448:10,22449:10,34052:10,34053:10,34054:10,34055:10,34056:10,774:10,818:10,1206:10,1210:10,1529:10,1705:10,3864:10,7909:10,7910:10,12361:10,12364:10,12799:10,12800:10,21929:10,23077:10,23079:10,23107:10,23112:10,23117:10,23436:10,23437:10,23438:10,23439:10,23440:10,23441:10,36917:10,36918:10,36919:10,36920:10,36921:10,36922:10,36923:10,36924:10,36925:10,36926:10,36927:10,36928:10,36929:10,36930:10,36931:10,36932:10,36933:10,36934:10,118:5,858:5,929:5,2455:5,2456:5,3827:5,3928:5,6149:5,13443:5,13446:5,18253:5,22829:5,22832:5,22850:5,33447:5,33448:5,39671:5,40067:5,43569:5,43570:5 ############################################################################### +# AuctionHouseBot.PriceMinimumCenterBase.UseItemSellPriceIfHigher +# If set to true, the minimum center base will use the item sell price +# defined in sql table item_template.SellPrice if that value is higher +# than the defined PriceMinimumCenterBase below. Generally leave this +# as true, as the price minimums were meant only to catch zero or +# ultra low value items. Basically, if this is false then all items +# will use this category price as the base before formulas, so it +# is only advisable to make false if you are doing item level settings +# Note: Be mindful of BuyoutBelowVendorVariationAddPercentEnabled +# # AuctionHouseBot.PriceMinimumCenterBase.* # Category-level price minimums, in copper, before any multipliers come # into play. Value shouldn't be zero, and the base minimum price will # the BidVariation* variables above. This is used to catch 0 cost or -# extremely low cost items +# extremely low cost items. Note that the value can never be lower than 1 # # AuctionHouseBot.PriceMinimumCenterBase.OverrideItems # Comma separated list of items in the format of "itemID:PriceMinCopper" @@ -386,6 +402,8 @@ AuctionHouseBot.ListProportion.ListMultipliedItemIDs = 2589:10,2592:10,4306:10,4 # of linen cloth to 100 gold and silk cloth to 10 gold each ############################################################################### +AuctionHouseBot.PriceMinimumCenterBase.UseItemSellPriceIfHigher = true + AuctionHouseBot.PriceMinimumCenterBase.Consumable = 1000 AuctionHouseBot.PriceMinimumCenterBase.Container = 1000 AuctionHouseBot.PriceMinimumCenterBase.Weapon = 1000 diff --git a/src/AuctionHouseBot.cpp b/src/AuctionHouseBot.cpp index 83c2f8c..79adac2 100644 --- a/src/AuctionHouseBot.cpp +++ b/src/AuctionHouseBot.cpp @@ -52,6 +52,7 @@ AuctionHouseBot::AuctionHouseBot() : BuyoutVariationAddPercent(0.25f), BidVariationHighReducePercent(0), BidVariationLowReducePercent(0.25f), + BuyoutBelowVendorVariationAddPercentEnabled(true), BuyoutBelowVendorVariationAddPercent(0.25f), BuyingBotBuyCandidatesPerBuyCycleMin(1), BuyingBotBuyCandidatesPerBuyCycleMax(1), @@ -136,6 +137,7 @@ AuctionHouseBot::AuctionHouseBot() : PriceMultiplierQualityLegendary(1), PriceMultiplierQualityArtifact(1), PriceMultiplierQualityHeirloom(1), + UseItemSellPriceIfHigherThanPriceMinimumCenterBase(true), PriceMinimumCenterBaseConsumable(1), PriceMinimumCenterBaseContainer(1), PriceMinimumCenterBaseWeapon(1), @@ -232,8 +234,11 @@ uint32 AuctionHouseBot::GetStackSizeForItem(ItemTemplate const* itemProto) const void AuctionHouseBot::CalculateItemValue(ItemTemplate const* itemProto, uint64& outBidPrice, uint64& outBuyoutPrice) { - // Start with a buyout price related to the sell price - outBuyoutPrice = itemProto->SellPrice; + // Start with a buyout price related to the sell price, if configured + if (UseItemSellPriceIfHigherThanPriceMinimumCenterBase == true) + outBuyoutPrice = itemProto->SellPrice; + else + outBuyoutPrice = 1; // Avoid zeros // Get the price multipliers float classPriceMultiplier = 1; @@ -351,29 +356,25 @@ void AuctionHouseBot::CalculateItemValue(ItemTemplate const* itemProto, uint64& if (itemLevelPriceMultplier > 0.0f && itemProto->ItemLevel > 0 && advancedPricingMultiplier == 1.0f) outBuyoutPrice *= itemProto->ItemLevel * itemLevelPriceMultplier; - // If a vendor sells this item, make the price at least that high - if (itemProto->SellPrice > outBuyoutPrice) - outBuyoutPrice = itemProto->SellPrice; - // Avoid price overflows if (outBuyoutPrice > MaxBuyoutPriceInCopper) outBuyoutPrice = MaxBuyoutPriceInCopper; + // If variance brought price below sell price, bring it back up to avoid making money off vendoring AH items + if (BuyoutBelowVendorVariationAddPercentEnabled == true && outBuyoutPrice < itemProto->SellPrice) + { + float minLowPriceAddVariancePercent = 1.0f + BuyoutBelowVendorVariationAddPercent; + outBuyoutPrice = urand(itemProto->SellPrice, minLowPriceAddVariancePercent * itemProto->SellPrice); + } + // Calculate a bid price based on a variance against buyout price float sellVarianceBidPriceTopPercent = 1.0f - BidVariationHighReducePercent; float sellVarianceBidPriceBottomPercent = 1.0f - BidVariationLowReducePercent; outBidPrice = urand(sellVarianceBidPriceBottomPercent * outBuyoutPrice, sellVarianceBidPriceTopPercent * outBuyoutPrice); - // If variance brought price below sell price, bring it back up to avoid making money off vendoring AH items - if (outBuyoutPrice < itemProto->SellPrice) - { - float minLowPriceAddVariancePercent = 1.0f + BuyoutBelowVendorVariationAddPercent; - outBuyoutPrice = urand(itemProto->SellPrice, minLowPriceAddVariancePercent * itemProto->SellPrice); - } - - // Bid price can never be below sell price - if (outBidPrice < itemProto->SellPrice) - outBidPrice = itemProto->SellPrice; + // Catch any zeros + if (outBuyoutPrice == 0) + outBuyoutPrice = 1; } float AuctionHouseBot::GetAdvancedPricingMultiplier(ItemTemplate const* itemProto) @@ -1374,6 +1375,7 @@ void AuctionHouseBot::InitializeConfiguration() BuyoutVariationAddPercent = sConfigMgr->GetOption("AuctionHouseBot.BuyoutVariationAddPercent", 0.25f); BidVariationHighReducePercent = sConfigMgr->GetOption("AuctionHouseBot.BidVariationHighReducePercent", 0); BidVariationLowReducePercent = sConfigMgr->GetOption("AuctionHouseBot.BidVariationLowReducePercent", 0.25f); + BuyoutBelowVendorVariationAddPercentEnabled = sConfigMgr->GetOption("AuctionHouseBot.BuyoutBelowVendorVariationAddPercentEnabled", true); BuyoutBelowVendorVariationAddPercent = sConfigMgr->GetOption("AuctionHouseBot.BuyoutBelowVendorVariationAddPercent", 0.25f); ListingExpireTimeInSecondsMin = sConfigMgr->GetOption("AuctionHouseBot.ListingExpireTimeInSecondsMin", 900); if (ListingExpireTimeInSecondsMin < 900) @@ -1532,6 +1534,7 @@ void AuctionHouseBot::InitializeConfiguration() AdvancedPricingMiscMountEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedPricing.Misc.Mount.Enabled", true); // Price minimums + UseItemSellPriceIfHigherThanPriceMinimumCenterBase = sConfigMgr->GetOption("AuctionHouseBot.PriceMinimumCenterBase.UseItemSellPriceIfHigher", true); PriceMinimumCenterBaseConsumable = sConfigMgr->GetOption("AuctionHouseBot.PriceMinimumCenterBase.Consumable",1000); PriceMinimumCenterBaseContainer = sConfigMgr->GetOption("AuctionHouseBot.PriceMinimumCenterBase.Container", 1000); PriceMinimumCenterBaseWeapon = sConfigMgr->GetOption("AuctionHouseBot.PriceMinimumCenterBase.Weapon", 1000); diff --git a/src/AuctionHouseBot.h b/src/AuctionHouseBot.h index f5d6569..12f4935 100644 --- a/src/AuctionHouseBot.h +++ b/src/AuctionHouseBot.h @@ -139,6 +139,7 @@ private: float BuyoutVariationAddPercent; float BidVariationHighReducePercent; float BidVariationLowReducePercent; + bool BuyoutBelowVendorVariationAddPercentEnabled; float BuyoutBelowVendorVariationAddPercent; uint32 BuyingBotBuyCandidatesPerBuyCycleMin; uint32 BuyingBotBuyCandidatesPerBuyCycleMax; @@ -254,6 +255,7 @@ private: bool AdvancedPricingTradeGoodMeatEnabled; bool AdvancedPricingMiscJunkEnabled; bool AdvancedPricingMiscMountEnabled; + bool UseItemSellPriceIfHigherThanPriceMinimumCenterBase; uint32 PriceMinimumCenterBaseConsumable; uint32 PriceMinimumCenterBaseContainer; uint32 PriceMinimumCenterBaseWeapon;