From 86ff7d4217f8f5f1395af135cb2e1eea2614b626 Mon Sep 17 00:00:00 2001 From: zeb <37308742+zeb139@users.noreply.github.com> Date: Thu, 18 Sep 2025 22:55:30 -0400 Subject: [PATCH] Added meat, gem, potion, elixir, flask advancedPricingFormulas. Fixed build warnings --- conf/mod_ahbot.conf.dist | 11 +++++--- src/AuctionHouseBot.cpp | 58 +++++++++++++++++++++++++++++++++++++--- src/AuctionHouseBot.h | 5 ++++ 3 files changed, 67 insertions(+), 7 deletions(-) diff --git a/conf/mod_ahbot.conf.dist b/conf/mod_ahbot.conf.dist index 40d2bd4..03568f7 100644 --- a/conf/mod_ahbot.conf.dist +++ b/conf/mod_ahbot.conf.dist @@ -261,12 +261,17 @@ AuctionHouseBot.PriceMinimumCenterBase.OverrideItems = # will disable PriceMultiplier.ItemLevel pricing for that category ############################################################################### +AuctionHouseBot.AdvancedPricing.Consumable.Potion.Enabled = 1 +AuctionHouseBot.AdvancedPricing.Consumable.Elixir.Enabled = 1 +AuctionHouseBot.AdvancedPricing.Consumable.Flask.Enabled = 1 +AuctionHouseBot.AdvancedPricing.Gem.Enabled = 1 AuctionHouseBot.AdvancedPricing.TradeGood.Cloth.Enabled = 1 AuctionHouseBot.AdvancedPricing.TradeGood.Herb.Enabled = 1 AuctionHouseBot.AdvancedPricing.TradeGood.MetalStone.Enabled = 1 AuctionHouseBot.AdvancedPricing.TradeGood.Leather.Enabled = 1 AuctionHouseBot.AdvancedPricing.TradeGood.Enchanting.Enabled = 1 AuctionHouseBot.AdvancedPricing.TradeGood.Elemental.Enabled = 1 +AuctionHouseBot.AdvancedPricing.TradeGood.Meat.Enabled = 1 AuctionHouseBot.AdvancedPricing.Misc.Junk.Enabled = 1 AuctionHouseBot.AdvancedPricing.Misc.Mount.Enabled = 1 @@ -377,9 +382,9 @@ AuctionHouseBot.PriceMultiplier.CategoryWeapon.QualityHeirloom = 1.0 # Gem AuctionHouseBot.PriceMultiplier.CategoryGem.QualityPoor = 1.0 AuctionHouseBot.PriceMultiplier.CategoryGem.QualityNormal = 1.0 -AuctionHouseBot.PriceMultiplier.CategoryGem.QualityUncommon = 1.0 -AuctionHouseBot.PriceMultiplier.CategoryGem.QualityRare = 1.4 -AuctionHouseBot.PriceMultiplier.CategoryGem.QualityEpic = 2.0 +AuctionHouseBot.PriceMultiplier.CategoryGem.QualityUncommon = 1.2 +AuctionHouseBot.PriceMultiplier.CategoryGem.QualityRare = 1.2 +AuctionHouseBot.PriceMultiplier.CategoryGem.QualityEpic = 0.9 AuctionHouseBot.PriceMultiplier.CategoryGem.QualityLegendary = 1.0 AuctionHouseBot.PriceMultiplier.CategoryGem.QualityArtifact = 1.0 AuctionHouseBot.PriceMultiplier.CategoryGem.QualityHeirloom = 1.0 diff --git a/src/AuctionHouseBot.cpp b/src/AuctionHouseBot.cpp index cc94575..1845450 100644 --- a/src/AuctionHouseBot.cpp +++ b/src/AuctionHouseBot.cpp @@ -48,9 +48,9 @@ AuctionHouseBot::AuctionHouseBot() : BidVariationHighReducePercent(0), BidVariationLowReducePercent(0.25f), BuyoutBelowVendorVariationAddPercent(0.25f), + BuyingBotBuyCandidatesPerBuyCycle(1), ListingExpireTimeInSecondsMin(900), ListingExpireTimeInSecondsMax(86400), - BuyingBotBuyCandidatesPerBuyCycle(1), BuyingBotAcceptablePriceModifier(1), AHCharactersGUIDsForQuery(""), ItemsPerCycle(75), @@ -405,7 +405,45 @@ float AuctionHouseBot::getAdvancedPricingMultiplier(ItemTemplate const* itemProt // Try to approximate real world prices for Trade Goods based on subclass and item level double advancedPricingMultiplier = 1.0f; - if (itemProto->Class == ITEM_CLASS_TRADE_GOODS) + if (itemProto->Class == ITEM_CLASS_CONSUMABLE) + { + switch (itemProto->SubClass) + { + case ITEM_SUBCLASS_POTION: + { + if (!AdvancedPricingConsumablePotionEnabled) + break; + double potionMultiplierHelper = std::log(1.0 + (0.08 * itemProto->ItemLevel)); + advancedPricingMultiplier = ((std::pow(potionMultiplierHelper,3.0)) / (1 + (4.0 * potionMultiplierHelper))) + (std::pow(potionMultiplierHelper,2.5)); + break; + } + case ITEM_SUBCLASS_ELIXIR: + { + if (!AdvancedPricingConsumableElixirEnabled) + break; + double elixirMultiplierHelper = std::log(1.0 + (1.6 * itemProto->ItemLevel)); + advancedPricingMultiplier = ((std::pow(elixirMultiplierHelper,3.1)) / (1 + (5.0 * elixirMultiplierHelper))) + (0.05 * std::pow(elixirMultiplierHelper,3.2)) - 1.0; + break; + } + case ITEM_SUBCLASS_FLASK: + { + if (!AdvancedPricingConsumableFlaskEnabled) + break; + // Use logarithmic scaling to compress large differences in vendorSellPrice to a range of ~22g-25g + // advPricingMultiplier = LowTargetRange + (UpperTargetRange - LowTargetRange) * ( ln(vendorSellPrice) - ln(minVendorPrice) ) / ( ln(maxVendorPrice) - ln(minVendorPrice) ) / vendorSellPrice + advancedPricingMultiplier = (220000 + (250000-220000) * (std::log(itemProto->SellPrice) - std::log(1250)) / (std::log(10000) - std::log(1250))) / itemProto->SellPrice; + } + default: + break; + } + } + else if (itemProto->Class == ITEM_CLASS_GEM && AdvancedPricingGemEnabled) + { + // No switch for subclass needed since Gem subclass represents gem color + double gemMultiplierHelper = std::log(1.0 + (0.05 * itemProto->ItemLevel)); + advancedPricingMultiplier = ((std::pow(gemMultiplierHelper,1.0)) / (1 + (10.0 * gemMultiplierHelper))) + (std::pow(gemMultiplierHelper,3.0)); + } + else if (itemProto->Class == ITEM_CLASS_TRADE_GOODS) { switch (itemProto->SubClass) { @@ -456,6 +494,14 @@ float AuctionHouseBot::getAdvancedPricingMultiplier(ItemTemplate const* itemProt advancedPricingMultiplier = 85 - (itemProto->ItemLevel / 0.97); break; } + case ITEM_SUBCLASS_MEAT: + { + if (!AdvancedPricingTradeGoodMeatEnabled) + break; + double meatMultiplierHelper = std::log(1.0 + (0.5 * itemProto->ItemLevel)); + advancedPricingMultiplier = ((std::pow(meatMultiplierHelper,3.2)) / (1 + (2.0 * meatMultiplierHelper))) + (0.05 * std::pow(meatMultiplierHelper,3.2)) - 0.1; + break; + } default: break; } @@ -822,7 +868,7 @@ int AuctionHouseBot::getRandomValidItemClassForNewListing() // Loop through all of the item classes to make sure a valid one is good, looping candidate back to zero uint32 itemClassCandidate = ItemCandidateClassWeightedProportionList[urand(0, ItemCandidateClassWeightedProportionList.size() - 1)]; - for (int i = 0; i < ItemCandidateClassWeightedProportionList.size(); i++) + for (size_t i = 0; i < ItemCandidateClassWeightedProportionList.size(); i++) { if (ItemCandidatesByItemClass[itemClassCandidate].size() > 0) return itemClassCandidate; @@ -1046,7 +1092,6 @@ void AuctionHouseBot::addNewAuctionBuyerBotBid(Player* AHBplayer, AHBConfig *con // Determine if it's a bid, buyout, or skip bool doBuyout = false; bool doBid = false; - uint64 curAuctionBidAmount = 0; uint64 calcBidAmount = 0; if (auction->buyout != 0 && auction->buyout < willingToPayForStackPrice) @@ -1369,12 +1414,17 @@ void AuctionHouseBot::InitializeConfiguration() PriceMultiplierCategoryMountQualityHeirloom = sConfigMgr->GetOption("AuctionHouseBot.PriceMultiplier.CategoryMount.QualityHeirloom", 1.0); // Advanced Pricing + AdvancedPricingConsumablePotionEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedPricing.Consumable.Potion.Enabled", true); + AdvancedPricingConsumableElixirEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedPricing.Consumable.Elixir.Enabled", true); + AdvancedPricingConsumableFlaskEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedPricing.Consumable.Flask.Enabled", true); + AdvancedPricingGemEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedPricing.Gem.Enabled", true); AdvancedPricingTradeGoodClothEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedPricing.TradeGood.Cloth.Enabled", true); AdvancedPricingTradeGoodHerbEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedPricing.TradeGood.Herb.Enabled", true); AdvancedPricingTradeGoodMetalStoneEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedPricing.TradeGood.MetalStone.Enabled", true); AdvancedPricingTradeGoodLeatherEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedPricing.TradeGood.Leather.Enabled", true); AdvancedPricingTradeGoodEnchantingEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedPricing.TradeGood.Enchanting.Enabled", true); AdvancedPricingTradeGoodElementalEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedPricing.TradeGood.Elemental.Enabled", true); + AdvancedPricingTradeGoodMeatEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedPricing.TradeGood.Meat.Enabled", true); AdvancedPricingMiscJunkEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedPricing.Misc.Junk.Enabled", true); AdvancedPricingMiscMountEnabled = sConfigMgr->GetOption("AuctionHouseBot.AdvancedPricing.Misc.Mount.Enabled", true); diff --git a/src/AuctionHouseBot.h b/src/AuctionHouseBot.h index 2978739..1553195 100644 --- a/src/AuctionHouseBot.h +++ b/src/AuctionHouseBot.h @@ -236,12 +236,17 @@ private: float PriceMultiplierCategoryMountQualityLegendary; float PriceMultiplierCategoryMountQualityArtifact; float PriceMultiplierCategoryMountQualityHeirloom; + bool AdvancedPricingConsumablePotionEnabled; + bool AdvancedPricingConsumableElixirEnabled; + bool AdvancedPricingConsumableFlaskEnabled; + bool AdvancedPricingGemEnabled; bool AdvancedPricingTradeGoodClothEnabled; bool AdvancedPricingTradeGoodHerbEnabled; bool AdvancedPricingTradeGoodMetalStoneEnabled; bool AdvancedPricingTradeGoodLeatherEnabled; bool AdvancedPricingTradeGoodEnchantingEnabled; bool AdvancedPricingTradeGoodElementalEnabled; + bool AdvancedPricingTradeGoodMeatEnabled; bool AdvancedPricingMiscJunkEnabled; bool AdvancedPricingMiscMountEnabled; uint32 PriceMinimumCenterBaseConsumable;