From b0385cc957c7d8eb3775ff60183a98f530c3c274 Mon Sep 17 00:00:00 2001 From: NathanHandley Date: Mon, 20 Jan 2025 13:44:33 -0600 Subject: [PATCH] Add price overrides --- conf/mod_ahbot.conf.dist | 9 +++++ src/AuctionHouseBot.cpp | 86 +++++++++++++++++++++++++++------------- src/AuctionHouseBot.h | 2 + 3 files changed, 69 insertions(+), 28 deletions(-) diff --git a/conf/mod_ahbot.conf.dist b/conf/mod_ahbot.conf.dist index 16bf16a..1fd7141 100644 --- a/conf/mod_ahbot.conf.dist +++ b/conf/mod_ahbot.conf.dist @@ -125,6 +125,15 @@ AuctionHouseBot.PriceMinimumCenterBase.Key = 1000 AuctionHouseBot.PriceMinimumCenterBase.Misc = 1000 AuctionHouseBot.PriceMinimumCenterBase.Glyph = 1000 +############################################################################### +# AuctionHouseBot.PriceMinimumCenterBase.OverrideItems +# Comma separated list of items in the format of "itemID:PriceMinCopper" +# Example: "2589:1000000,4306:100000" would set the minimum price center +# of linen cloth to 100 gold and silk cloth to 10 gold each +############################################################################### + +AuctionHouseBot.PriceMinimumCenterBase.OverrideItems = + ############################################################################### # AuctionHouseBot.PriceMultiplier.* # Category/Quality-level modifier values for the prices of items, which can be diff --git a/src/AuctionHouseBot.cpp b/src/AuctionHouseBot.cpp index 201b278..8467536 100644 --- a/src/AuctionHouseBot.cpp +++ b/src/AuctionHouseBot.cpp @@ -127,30 +127,38 @@ void AuctionHouseBot::calculateItemValue(ItemTemplate const* itemProto, uint64& } // Grab the minimum prices - int PriceMinimumCenterBase = 1000; - switch (itemProto->Class) + uint64 PriceMinimumCenterBase = 1000; + auto it = PriceMinimumCenterBaseOverridesByItemID.find(itemProto->ItemId); + if (it != PriceMinimumCenterBaseOverridesByItemID.end()) + PriceMinimumCenterBase = it->second; + else { - case ITEM_CLASS_CONSUMABLE: PriceMinimumCenterBase = PriceMinimumCenterBaseConsumable; break; - case ITEM_CLASS_CONTAINER: PriceMinimumCenterBase = PriceMinimumCenterBaseContainer; break; - case ITEM_CLASS_WEAPON: PriceMinimumCenterBase = PriceMinimumCenterBaseWeapon; break; - case ITEM_CLASS_GEM: PriceMinimumCenterBase = PriceMinimumCenterBaseGem; break; - case ITEM_CLASS_REAGENT: PriceMinimumCenterBase = PriceMinimumCenterBaseReagent; break; - case ITEM_CLASS_ARMOR: PriceMinimumCenterBase = PriceMinimumCenterBaseArmor; break; - case ITEM_CLASS_PROJECTILE: PriceMinimumCenterBase = PriceMinimumCenterBaseProjectile; break; - case ITEM_CLASS_TRADE_GOODS: PriceMinimumCenterBase = PriceMinimumCenterBaseTradeGood; break; - case ITEM_CLASS_GENERIC: PriceMinimumCenterBase = PriceMinimumCenterBaseGeneric; break; - case ITEM_CLASS_RECIPE: PriceMinimumCenterBase = PriceMinimumCenterBaseRecipe; break; - case ITEM_CLASS_QUIVER: PriceMinimumCenterBase = PriceMinimumCenterBaseQuiver; break; - case ITEM_CLASS_QUEST: PriceMinimumCenterBase = PriceMinimumCenterBaseQuest; break; - case ITEM_CLASS_KEY: PriceMinimumCenterBase = PriceMinimumCenterBaseKey; break; - case ITEM_CLASS_MISC: PriceMinimumCenterBase = PriceMinimumCenterBaseMisc; break; - case ITEM_CLASS_GLYPH: PriceMinimumCenterBase = PriceMinimumCenterBaseGlyph; break; - default: break; + switch (itemProto->Class) + { + case ITEM_CLASS_CONSUMABLE: PriceMinimumCenterBase = PriceMinimumCenterBaseConsumable; break; + case ITEM_CLASS_CONTAINER: PriceMinimumCenterBase = PriceMinimumCenterBaseContainer; break; + case ITEM_CLASS_WEAPON: PriceMinimumCenterBase = PriceMinimumCenterBaseWeapon; break; + case ITEM_CLASS_GEM: PriceMinimumCenterBase = PriceMinimumCenterBaseGem; break; + case ITEM_CLASS_REAGENT: PriceMinimumCenterBase = PriceMinimumCenterBaseReagent; break; + case ITEM_CLASS_ARMOR: PriceMinimumCenterBase = PriceMinimumCenterBaseArmor; break; + case ITEM_CLASS_PROJECTILE: PriceMinimumCenterBase = PriceMinimumCenterBaseProjectile; break; + case ITEM_CLASS_TRADE_GOODS: PriceMinimumCenterBase = PriceMinimumCenterBaseTradeGood; break; + case ITEM_CLASS_GENERIC: PriceMinimumCenterBase = PriceMinimumCenterBaseGeneric; break; + case ITEM_CLASS_RECIPE: PriceMinimumCenterBase = PriceMinimumCenterBaseRecipe; break; + case ITEM_CLASS_QUIVER: PriceMinimumCenterBase = PriceMinimumCenterBaseQuiver; break; + case ITEM_CLASS_QUEST: PriceMinimumCenterBase = PriceMinimumCenterBaseQuest; break; + case ITEM_CLASS_KEY: PriceMinimumCenterBase = PriceMinimumCenterBaseKey; break; + case ITEM_CLASS_MISC: PriceMinimumCenterBase = PriceMinimumCenterBaseMisc; break; + case ITEM_CLASS_GLYPH: PriceMinimumCenterBase = PriceMinimumCenterBaseGlyph; break; + default: break; + } } // Set the minimum price if (outBuyoutPrice < PriceMinimumCenterBase) outBuyoutPrice = urand(PriceMinimumCenterBase * 0.5, PriceMinimumCenterBase * 1.5); + else + outBuyoutPrice = urand(outBuyoutPrice * 0.5, outBuyoutPrice * 1.5); // Multiply the price based on multipliers outBuyoutPrice *= qualityPriceMultplier; @@ -161,23 +169,20 @@ void AuctionHouseBot::calculateItemValue(ItemTemplate const* itemProto, uint64& outBuyoutPrice = itemProto->SellPrice; // Calculate buyout price with a variance - uint64 sellVarianceBuyoutPriceTopPercent = 130; - uint64 sellVarianceBuyoutPriceBottomPercent = 70; + float sellVarianceBuyoutPriceTopPercent = 1.30; + float sellVarianceBuyoutPriceBottomPercent = 0.70; outBuyoutPrice = urand(sellVarianceBuyoutPriceBottomPercent * outBuyoutPrice, sellVarianceBuyoutPriceTopPercent * outBuyoutPrice); - outBuyoutPrice /= 100; // Calculate a bid price based on a variance against buyout price - uint64 sellVarianceBidPriceTopPercent = 100; - uint64 sellVarianceBidPriceBottomPercent = 75; + float sellVarianceBidPriceTopPercent = 1; + float sellVarianceBidPriceBottomPercent = .75; outBidPrice = urand(sellVarianceBidPriceBottomPercent * outBuyoutPrice, sellVarianceBidPriceTopPercent * outBuyoutPrice); - outBidPrice /= 100; // If variance brought price below sell price, bring it back up to avoid making money off vendoring AH items if (outBuyoutPrice < itemProto->SellPrice) { - uint64 minLowPriceAddVariancePercent = 125; - outBuyoutPrice = urand(100 * itemProto->SellPrice, minLowPriceAddVariancePercent * itemProto->SellPrice); - outBuyoutPrice /= 100; + float minLowPriceAddVariancePercent = 1.25; + outBuyoutPrice = urand(itemProto->SellPrice, minLowPriceAddVariancePercent * itemProto->SellPrice); } // Bid price can never be below sell price @@ -254,7 +259,7 @@ void AuctionHouseBot::populateItemCandidateList() ItemTemplateContainer const* its = sObjectMgr->GetItemTemplateStore(); for (ItemTemplateContainer::const_iterator itr = its->begin(); itr != its->end(); ++itr) { - // Never store itemID zero + // Never store curBlock zero if (itr->second.ItemId == 0) continue; @@ -863,6 +868,7 @@ void AuctionHouseBot::InitializeConfiguration() PriceMinimumCenterBaseKey = sConfigMgr->GetOption("AuctionHouseBot.PriceMinimumCenterBase.Key", 1000); PriceMinimumCenterBaseMisc = sConfigMgr->GetOption("AuctionHouseBot.PriceMinimumCenterBase.Misc", 1000); PriceMinimumCenterBaseGlyph = sConfigMgr->GetOption("AuctionHouseBot.PriceMinimumCenterBase.Glyph", 1000); + AddPriceMinimumOverrides(sConfigMgr->GetOption("AuctionHouseBot.PriceMinimumCenterBase.OverrideItems", "")); // Disabled Items DisabledItemTextFilter = sConfigMgr->GetOption("AuctionHouseBot.DisabledItemTextFilter", true); @@ -960,3 +966,27 @@ void AuctionHouseBot::AddDisabledItems(std::string disabledItemIdString) } } } + +void AuctionHouseBot::AddPriceMinimumOverrides(std::string priceMinimimOverridesString) +{ + std::string delimitedValue; + std::stringstream priceMinimumStream; + priceMinimumStream.str(priceMinimimOverridesString); + while (std::getline(priceMinimumStream, delimitedValue, ',')) // Process each item ID in the string, delimited by the comma "," + { + std::string curBlock; + std::stringstream itemPairStream(delimitedValue); + itemPairStream >> curBlock; + + // Only process if it has a colon (:) + if (curBlock.find(":") != std::string::npos) + { + std::string itemIDString = curBlock.substr(0, curBlock.find(":")); + auto itemId = atoi(itemIDString.c_str()); + std::string priceInCopper = curBlock.substr(curBlock.find(":") + 1); + auto copperPrice = atoi(priceInCopper.c_str()); + if (itemId > 0 && copperPrice > 0) + PriceMinimumCenterBaseOverridesByItemID.insert({itemId, copperPrice}); + } + } +} diff --git a/src/AuctionHouseBot.h b/src/AuctionHouseBot.h index cc1161e..115aa5a 100644 --- a/src/AuctionHouseBot.h +++ b/src/AuctionHouseBot.h @@ -206,6 +206,7 @@ private: uint32 PriceMinimumCenterBaseKey; uint32 PriceMinimumCenterBaseMisc; uint32 PriceMinimumCenterBaseGlyph; + std::unordered_map PriceMinimumCenterBaseOverridesByItemID; AHBConfig AllianceConfig; AHBConfig HordeConfig; @@ -240,6 +241,7 @@ public: uint32 GetRandomStackValue(std::string configKeyString, uint32 defaultValue); void AddToDisabledItems(std::set& workingDisabledItemIDs, uint32 disabledItemID); void AddDisabledItems(std::string disabledItemIdString); + void AddPriceMinimumOverrides(std::string priceMinimimOverridesString); ObjectGuid::LowType GetAHBplayerGUID() { return AHBplayerGUID; }; };