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(atol(temp.c_str()));
64 TC_LOG_DEBUG(
"ahbot",
"Forced Inclusion {} items", includeItems.size());
65 TC_LOG_DEBUG(
"ahbot",
"Forced Exclusion {} items", excludeItems.size());
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);
74 TC_LOG_DEBUG(
"ahbot",
"Npc vendor filter has {} items", npcItems.size());
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());
104 TC_LOG_DEBUG(
"ahbot",
"Loot filter has {} items", lootItems.size());
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;
210 if (npcItems.count(itemId))
215 if (lootItems.count(itemId))
221 bool const isVendorItem = npcItems.count(itemId) > 0;
222 bool const isLootItem = lootItems.count(itemId) > 0;
224 if (!isLootItem && !isVendorItem)
345 TC_LOG_ERROR(
"ahbot",
"AuctionHouseBot seller not have items, disabled.");
352 TC_LOG_DEBUG(
"ahbot",
"AuctionHouseBot seller will use {} items to fill auction house (according your config choices)", itemsAdded);
358 sLog->OutMessage(
"ahbot",
LOG_LEVEL_DEBUG,
"Items loaded \tGray\tWhite\tGreen\tBlue\tPurple\tOrange\tYellow");
366 TC_LOG_DEBUG(
"ahbot",
"AHBot seller configuration data loaded and initialized");
405 auto getPriorityForClass = [](
uint32 itemClass) ->
uint32
456 totalPrioPerQuality[j] += getPriorityForClass(i);
463 if (!totalPrioPerQuality[j])
468 uint32 classPrio = getPriorityForClass(i);
472 uint32 weightedAmount = std::lroundf(classPrio /
float(totalPrioPerQuality[j]) * qualityAmount);
546 TC_LOG_DEBUG(
"ahbot",
"AHBot: Missed Item \tGray\tWhite\tGreen\tBlue\tPurple\tOrange\tYellow");
549 TC_LOG_DEBUG(
"ahbot",
"AHBot: \t\t{}\t{}\t{}\t{}\t{}\t{}\t{}",
566 itemsToSellArray.clear();
579 itemsToSellArray.emplace_back(std::move(miss_item));
593 float priceRatio = (classRatio * qualityRatio) / 10000.0f;
608 buyPrice = tempLevel * tempQuality *
static_cast<float>(
GetBuyModifier(itemProto))* tempLevel / divisor;
613 sellPrice = (buyPrice > 10 ? buyPrice /
GetSellModifier(itemProto) : buyPrice);
616 buyPrice = sellPrice;
618 float basePriceFloat = buyPrice * stackCount / (itemProto->
GetClass() == 6 ? 200.0f :
static_cast<float>(itemProto->
GetBuyCount()));
619 basePriceFloat *= priceRatio;
621 float range = basePriceFloat * 0.04f;
623 buyout = (
static_cast<uint32>(
frand(basePriceFloat - range, basePriceFloat + range) + 0.5f) /
SILVER) *
SILVER;
762 val = std::max(val, 10000u);
823 TC_LOG_DEBUG(
"ahbot",
"AHBot: Boost value used to fill AH! (if this happens often adjust both ItemsPerCycle in worldserver.conf)");
835 while (
GetItemsToSell(config, itemsToSell, allItems) && items > 0)
848 TC_LOG_DEBUG(
"ahbot",
"AHBot: Item entry 0 auction creating attempt.");
855 TC_LOG_DEBUG(
"ahbot",
"AHBot: Unknown item {} auction creating attempt.", itemId);
864 TC_LOG_ERROR(
"ahbot",
"AHBot: Item::CreateItem() returned NULL for item {} (stack: {})", itemId, stackCount);
896 auction.
Items.push_back(item);
899 auction.
MinBid = bidPrice;
905 auctionHouse->
AddAuction(trans, std::move(auction));
911 TC_LOG_DEBUG(
"ahbot",
"AHBot: Added {} items to auction", count);
std::vector< ItemToSell > ItemsToSellArray
std::array< std::array< uint32, MAX_ITEM_CLASS >, MAX_ITEM_QUALITY > AllItemsArray
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
DB2Storage< ItemEntry > sItemStore("Item.db2", &ItemLoadInfo::Instance)
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
std::shared_ptr< ResultSet > QueryResult
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
std::chrono::hours Hours
Hours shorthand typedef.
ItemRandomBonusListId GenerateItemRandomBonusListId(uint32 item_id)
@ ITEM_CLASS_ITEM_ENHANCEMENT
@ 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_MISCELLANEOUS_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)
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 SetPricesOfItem(ItemTemplate const *itemProto, SellerConfiguration &config, uint32 &buyout, uint32 &bid, uint32 stackcnt)
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)
std::map< uint32, AuctionPosting >::iterator GetAuctionsEnd()
void AddAuction(CharacterDatabaseTransaction trans, AuctionPosting auction)
std::map< uint32, AuctionPosting >::iterator GetAuctionsBegin()
Class used to access individual fields of database query result.
void SetItemRandomBonusList(ItemRandomBonusListId bonusListId)
static Item * CreateItem(uint32 itemEntry, uint32 count, ItemContext context, Player const *player=nullptr, bool addDefaultBonuses=true)
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)
SystemTimePoint GetSystemTime()
Current chrono system_clock time point.
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
std::vector< Item * > Items
AuctionsBucketData * Bucket
SystemTimePoint StartTime
uint32 GetRequiredSkillRank() const
uint32 GetBaseItemLevel() const
uint32 GetQuality() const
uint32 GetBuyCount() const
uint32 GetMaxStackSize() const
uint32 GetBuyPrice() const
ItemBondingType GetBonding() const
int32 GetBaseRequiredLevel() const
bool HasFlag(ItemFlags flag) const
uint32 GetSubClass() const
uint32 GetSellPrice() const