43 std::unordered_set<uint32> npcItems;
44 std::unordered_set<uint32> lootItems;
45 std::unordered_set<uint32> includeItems;
46 std::unordered_set<uint32> excludeItems;
53 while (std::getline(includeStream, temp,
','))
54 includeItems.insert(atoi(temp.c_str()));
60 while (std::getline(excludeStream, temp,
','))
61 excludeItems.insert(atoi(temp.c_str()));
67 TC_LOG_DEBUG(
"ahbot",
"Loading npc vendor items for filter..");
69 for (
auto const& creatureTemplatePair : creatures)
71 for (
VendorItem const& vendorItem : data->m_items)
72 npcItems.insert(vendorItem.item);
76 TC_LOG_DEBUG(
"ahbot",
"Loading loot items for filter..");
78 "SELECT `item` FROM `creature_loot_template` WHERE `Reference` = 0 UNION "
79 "SELECT `item` FROM `disenchant_loot_template` WHERE `Reference` = 0 UNION "
80 "SELECT `item` FROM `fishing_loot_template` WHERE `Reference` = 0 UNION "
81 "SELECT `item` FROM `gameobject_loot_template` WHERE `Reference` = 0 UNION "
82 "SELECT `item` FROM `item_loot_template` WHERE `Reference` = 0 UNION "
83 "SELECT `item` FROM `milling_loot_template` WHERE `Reference` = 0 UNION "
84 "SELECT `item` FROM `pickpocketing_loot_template` WHERE `Reference` = 0 UNION "
85 "SELECT `item` FROM `prospecting_loot_template` WHERE `Reference` = 0 UNION "
86 "SELECT `item` FROM `reference_loot_template` WHERE `Reference` = 0 UNION "
87 "SELECT `item` FROM `skinning_loot_template` WHERE `Reference` = 0 UNION "
88 "SELECT `item` FROM `spell_loot_template` WHERE `Reference` = 0");
94 Field* fields = result->Fetch();
100 lootItems.insert(entry);
101 }
while (result->NextRow());
105 TC_LOG_DEBUG(
"ahbot",
"Sorting and cleaning items for AHBot seller...");
120 if (excludeItems.count(itemId))
124 if (includeItems.count(itemId))
158 bool allowZero =
false;
159 switch (prototype->
Class)
211 if (npcItems.count(itemId))
218 if (lootItems.count(itemId))
225 bool const isVendorItem = npcItems.count(itemId) > 0;
226 bool const isLootItem = lootItems.count(itemId) > 0;
228 if (!isLootItem && !isVendorItem)
233 switch (prototype->
Class)
349 TC_LOG_ERROR(
"ahbot",
"AuctionHouseBot seller not have items, disabled.");
356 TC_LOG_DEBUG(
"ahbot",
"AuctionHouseBot seller will use {} items to fill auction house (according your config choices)", itemsAdded);
360 TC_LOG_DEBUG(
"ahbot",
"Items loaded \tGray\tWhite\tGreen\tBlue\tPurple\tOrange\tYellow");
367 TC_LOG_DEBUG(
"ahbot",
"AHBot seller configuration data loaded and initialized");
406 auto getPriorityForClass = [](
uint32 itemClass) ->
uint32
457 totalPrioPerQuality[j] += getPriorityForClass(i);
464 if (!totalPrioPerQuality[j])
469 uint32 classPrio = getPriorityForClass(i);
473 uint32 weightedAmount = std::lroundf(classPrio /
float(totalPrioPerQuality[j]) * qualityAmount);
553 TC_LOG_DEBUG(
"ahbot",
"AHBot: Missed Item \tGray\tWhite\tGreen\tBlue\tPurple\tOrange\tYellow");
556 TC_LOG_DEBUG(
"ahbot",
"AHBot: \t\t{}\t{}\t{}\t{}\t{}\t{}\t{}",
573 itemsToSellArray.clear();
586 itemsToSellArray.emplace_back(std::move(miss_item));
600 float priceRatio = (classRatio * qualityRatio) / 10000.0f;
602 float buyPrice = itemProto->
BuyPrice;
613 float tempQuality = (itemProto->
Quality == 0 ? 1.0f : itemProto->
Quality);
615 buyPrice = tempLevel * tempQuality *
static_cast<float>(
GetBuyModifier(itemProto))* tempLevel / divisor;
620 sellPrice = (buyPrice > 10 ? buyPrice /
GetSellModifier(itemProto) : buyPrice);
623 buyPrice = sellPrice;
625 float basePriceFloat = buyPrice * stackCount / (itemProto->
Class == 6 ? 200.0f :
static_cast<float>(itemProto->
BuyCount));
626 basePriceFloat *= priceRatio;
628 float range = basePriceFloat * 0.04f;
630 buyp =
static_cast<uint32>(
frand(basePriceFloat - range, basePriceFloat + range) + 0.5f);
635 bidp =
static_cast<uint32>(bidPercentage * buyp);
652 switch (prototype->
Class)
667 switch (prototype->
Class)
769 val = std::max(val, 10000u);
830 TC_LOG_DEBUG(
"ahbot",
"AHBot: Boost value used to fill AH! (if this happens often adjust both ItemsPerCycle in worldserver.conf)");
858 while (
GetItemsToSell(config, itemsToSell, allItems) && items > 0)
871 TC_LOG_DEBUG(
"ahbot",
"AHBot: Item entry 0 auction creating attempt.");
878 TC_LOG_DEBUG(
"ahbot",
"AHBot: Unknown item {} auction creating attempt.", itemId);
887 TC_LOG_ERROR(
"ahbot",
"AHBot: Item::CreateItem() returned NULL for item {} (stack: {})", itemId, stackCount);
924 auctionEntry->
buyout = buyoutPrice;
925 auctionEntry->
houseId = houseid;
927 auctionEntry->
bid = 0;
928 auctionEntry->
deposit =
sAuctionMgr->GetAuctionDeposit(ahEntry, etime, item, stackCount);
944 TC_LOG_DEBUG(
"ahbot",
"AHBot: Added {} items to auction", count);
std::vector< std::vector< uint32 > > AllItemsArray
std::vector< ItemToSell > ItemsToSellArray
AuctionBotConfigUInt32Values
@ CONFIG_AHBOT_ITEM_MIN_REQ_LEVEL
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_QUEST
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_GENERIC
@ CONFIG_AHBOT_ITEM_MAX_REQ_LEVEL
@ CONFIG_AHBOT_CLASS_GLYPH_PRIORITY
@ CONFIG_AHBOT_CLASS_QUEST_PRIORITY
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_QUIVER
@ CONFIG_AHBOT_CLASS_PROJECTILE_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_GEM_PRIORITY
@ CONFIG_AHBOT_CLASS_QUIVER_PRIORITY
@ CONFIG_AHBOT_CLASS_GLYPH_MIN_REQ_LEVEL
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_GEM
@ CONFIG_AHBOT_CLASS_CONTAINER_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_MISC_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_PERMANENT_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_MISC_MOUNT_MIN_SKILL_RANK
@ CONFIG_AHBOT_CLASS_MISC_PRIORITY
@ CONFIG_AHBOT_CLASS_MISC_MOUNT_MAX_SKILL_RANK
@ CONFIG_AHBOT_ITEM_GRAY_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_RECIPE_PRIORITY
@ CONFIG_AHBOT_CLASS_ARMOR_PRIORITY
@ CONFIG_AHBOT_CLASS_GLYPH_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_TRADEGOOD_PRIORITY
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_GLYPH
@ CONFIG_AHBOT_CLASS_TRADEGOOD_MIN_ITEM_LEVEL
@ CONFIG_AHBOT_CLASS_REAGENT_PRIORITY
@ CONFIG_AHBOT_ITEM_ORANGE_AMOUNT
@ CONFIG_AHBOT_CLASS_GLYPH_MAX_ITEM_LEVEL
@ CONFIG_AHBOT_CLASS_KEY_PRIORITY
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_MISC
@ CONFIG_AHBOT_ITEM_BLUE_AMOUNT
@ CONFIG_AHBOT_HORDE_ITEM_AMOUNT_RATIO
@ CONFIG_AHBOT_CLASS_QUEST_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_MISC_MOUNT_MIN_REQ_LEVEL
@ CONFIG_AHBOT_CLASS_QUIVER_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_PROJECTILE_PRIORITY
@ CONFIG_AHBOT_CLASS_CONSUMABLE_PRIORITY
@ CONFIG_AHBOT_CLASS_GEM_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_GLYPH_MIN_ITEM_LEVEL
@ CONFIG_AHBOT_CLASS_MONEY_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_CONTAINER_PRIORITY
@ CONFIG_AHBOT_CLASS_GENERIC_PRIORITY
@ CONFIG_AHBOT_ITEM_MAX_ITEM_LEVEL
@ CONFIG_AHBOT_CLASS_CONSUMABLE_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_GENERIC_PRICE_RATIO
@ CONFIG_AHBOT_ITEM_GREEN_AMOUNT
@ CONFIG_AHBOT_CLASS_KEY_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_TRADEGOOD
@ CONFIG_AHBOT_CLASS_GLYPH_MAX_REQ_LEVEL
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_REAGENT
@ CONFIG_AHBOT_ITEM_WHITE_AMOUNT
@ CONFIG_AHBOT_ITEM_MIN_SKILL_RANK
@ CONFIG_AHBOT_CLASS_TRADEGOOD_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_WEAPON_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_TRADEGOOD_MAX_ITEM_LEVEL
@ CONFIG_AHBOT_CLASS_ARMOR_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_WEAPON
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_CONTAINER
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_RECIPE
@ CONFIG_AHBOT_ALLIANCE_ITEM_AMOUNT_RATIO
@ CONFIG_AHBOT_CLASS_CONTAINER_MIN_ITEM_LEVEL
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_ARMOR
@ CONFIG_AHBOT_ITEM_GRAY_AMOUNT
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_KEY
@ CONFIG_AHBOT_ITEM_MAX_SKILL_RANK
@ CONFIG_AHBOT_NEUTRAL_ITEM_AMOUNT_RATIO
@ CONFIG_AHBOT_ITEM_MIN_ITEM_LEVEL
@ CONFIG_AHBOT_CLASS_REAGENT_PRICE_RATIO
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_CONSUMABLE
@ CONFIG_AHBOT_CLASS_RECIPE_PRICE_RATIO
@ CONFIG_AHBOT_ITEM_YELLOW_AMOUNT
@ CONFIG_AHBOT_CLASS_CONTAINER_MAX_ITEM_LEVEL
@ CONFIG_AHBOT_ITEM_PURPLE_AMOUNT
@ CONFIG_AHBOT_CLASS_RANDOMSTACKRATIO_PROJECTILE
@ CONFIG_AHBOT_CLASS_WEAPON_PRIORITY
@ CONFIG_AHBOT_CLASS_MISC_MOUNT_MAX_REQ_LEVEL
@ CONFIG_AHBOT_BIDPRICE_MIN
@ CONFIG_AHBOT_BIDPRICE_MAX
#define MAX_AUCTION_QUALITY
#define MAX_AUCTION_HOUSE_TYPE
#define sAuctionBotConfig
@ CONFIG_AHBOT_CLASS_QUIVER_ALLOW_ZERO
@ CONFIG_AHBOT_ITEMS_MISC
@ CONFIG_AHBOT_CLASS_CONSUMABLE_ALLOW_ZERO
@ CONFIG_AHBOT_CLASS_TRADEGOOD_ALLOW_ZERO
@ CONFIG_AHBOT_CLASS_GEM_ALLOW_ZERO
@ CONFIG_AHBOT_CLASS_RECIPE_ALLOW_ZERO
@ CONFIG_AHBOT_CLASS_CONTAINER_ALLOW_ZERO
@ CONFIG_AHBOT_CLASS_KEY_ALLOW_ZERO
@ CONFIG_AHBOT_LOCKBOX_ENABLED
@ CONFIG_AHBOT_CLASS_REAGENT_ALLOW_ZERO
@ CONFIG_AHBOT_CLASS_PROJECTILE_ALLOW_ZERO
@ CONFIG_AHBOT_CLASS_QUEST_ALLOW_ZERO
@ CONFIG_AHBOT_CLASS_ARMOR_ALLOW_ZERO
@ CONFIG_AHBOT_BIND_QUEST
@ CONFIG_AHBOT_ITEMS_VENDOR
@ CONFIG_AHBOT_BIND_EQUIP
@ CONFIG_AHBOT_CLASS_GLYPH_ALLOW_ZERO
@ CONFIG_AHBOT_BIND_PICKUP
@ CONFIG_AHBOT_CLASS_WEAPON_ALLOW_ZERO
@ CONFIG_AHBOT_ITEMS_LOOT
@ CONFIG_AHBOT_CLASS_MISC_ALLOW_ZERO
@ CONFIG_AHBOT_BUYPRICE_SELLER
@ AUCTION_ENTRY_FLAG_NONE
DBCStorage< ItemEntry > sItemStore(Itemfmt)
DBCStorage< AuctionHouseEntry > sAuctionHouseStore(AuctionHouseEntryfmt)
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< ResultSet > QueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
int32 GenerateItemRandomPropertyId(uint32 item_id)
@ ITEM_CLASS_MISCELLANEOUS
@ ITEM_SUBCLASS_WEAPON_AXE2
@ ITEM_SUBCLASS_WEAPON_STAFF
@ ITEM_SUBCLASS_WEAPON_MACE
@ ITEM_SUBCLASS_WEAPON_MACE2
@ ITEM_SUBCLASS_WEAPON_DAGGER
@ ITEM_SUBCLASS_WEAPON_SWORD
@ ITEM_SUBCLASS_WEAPON_AXE
@ ITEM_SUBCLASS_WEAPON_FIST_WEAPON
@ ITEM_SUBCLASS_WEAPON_THROWN
@ ITEM_SUBCLASS_WEAPON_SWORD2
@ ITEM_SUBCLASS_WEAPON_POLEARM
@ ITEM_SUBCLASS_ARMOR_MAIL
@ ITEM_SUBCLASS_ARMOR_CLOTH
@ ITEM_SUBCLASS_ARMOR_LEATHER
@ ITEM_SUBCLASS_ARMOR_SHIELD
@ ITEM_SUBCLASS_ARMOR_PLATE
@ ITEM_SUBCLASS_ARMOR_MISCELLANEOUS
@ ITEM_SUBCLASS_ENCHANTING
@ ITEM_SUBCLASS_TRADE_GOODS
@ ITEM_SUBCLASS_EXPLOSIVES
@ ITEM_SUBCLASS_TRADE_GOODS_OTHER
@ ITEM_SUBCLASS_ELEMENTAL
@ ITEM_SUBCLASS_JUNK_MOUNT
@ ITEM_SUBCLASS_CONSUMABLE
@ ITEM_SUBCLASS_ITEM_ENHANCEMENT
#define TC_LOG_DEBUG(filterType__,...)
#define TC_LOG_ERROR(filterType__,...)
std::unordered_map< uint32, CreatureTemplate > CreatureTemplateContainer
float frand(float min, float max)
uint32 urand(uint32 min, uint32 max)
static char const * GetHouseTypeName(AuctionHouseType houseType)
bool Initialize() override
void SetItemsAmountForQuality(AuctionQuality quality, uint32 val)
void SetPricesOfItem(ItemTemplate const *itemProto, SellerConfiguration &config, uint32 &buyp, uint32 &bidp, uint32 stackcnt)
SellerConfiguration _houseConfig[MAX_AUCTION_HOUSE_TYPE]
void LoadSellerValues(SellerConfiguration &config)
uint32 SetStat(SellerConfiguration &config)
void SetItemsAmount(std::array< uint32, MAX_AUCTION_QUALITY > const &amounts)
bool Update(AuctionHouseType houseType) override
ItemPool _itemPool[MAX_AUCTION_QUALITY][MAX_ITEM_CLASS]
void LoadItemsQuantity(SellerConfiguration &config)
static uint32 GetBuyModifier(ItemTemplate const *prototype)
void AddNewAuctions(SellerConfiguration &config)
uint32 GetStackSizeForItem(ItemTemplate const *itemProto, SellerConfiguration &config) const
static uint32 GetSellModifier(ItemTemplate const *itemProto)
void SetItemsRatioForHouse(AuctionHouseType house, uint32 val)
bool GetItemsToSell(SellerConfiguration &config, ItemsToSellArray &itemsToSellArray, AllItemsArray const &addedItem)
void SetItemsRatio(uint32 al, uint32 ho, uint32 ne)
AuctionEntryMap::iterator GetAuctionsEnd()
void AddAuction(AuctionEntry *auction)
AuctionEntryMap::iterator GetAuctionsBegin()
Class used to access individual fields of database query result.
virtual void SaveToDB(CharacterDatabaseTransaction trans)
static Item * CreateItem(uint32 itemEntry, uint32 count, Player const *player=nullptr)
void SetItemRandomProperties(int32 randomPropId)
ItemTemplate const * GetTemplate() const
LowType GetCounter() const
static ObjectGuid GetGUID(Object const *o)
void SetMissedItemsPerClass(AuctionQuality quality, ItemClass itemClass, uint32 found)
void SetPriceRatioPerClass(ItemClass itemClass, uint32 value)
void SetMaxTime(uint32 value)
uint32 GetItemsAmountPerClass(AuctionQuality quality, ItemClass itemClass) const
void SetPriceRatioPerQuality(AuctionQuality quality, uint32 value)
uint32 GetRandomStackRatioPerClass(ItemClass itemClass) const
uint32 GetPriceRatioPerQuality(AuctionQuality quality) const
uint32 GetMinTime() const
uint32 GetMaxTime() const
uint32 GetMissedItemsPerClass(AuctionQuality quality, ItemClass itemClass) const
void SetItemsAmountPerQuality(AuctionQuality quality, uint32 cnt)
uint32 GetPriceRatioPerClass(ItemClass itemClass) const
uint32 GetItemsAmountPerQuality(AuctionQuality quality) const
void SetMinTime(uint32 value)
void SetItemsAmountPerClass(AuctionQuality quality, ItemClass itemClass, uint32 amount)
AuctionHouseType GetHouseType() const
void SetRandomStackRatioPerClass(ItemClass itemClass, uint32 value)
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
ObjectGuid::LowType bidder
AuctionHouseEntry const * auctionHouseEntry
void SaveToDB(CharacterDatabaseTransaction trans) const
ObjectGuid::LowType owner
ObjectGuid::LowType itemGUIDLow
uint32 GetMaxStackSize() const
bool HasFlag(ItemFlags flag) const