Allow using recipe produced items in ilevel check

This commit is contained in:
NathanHandley
2025-09-16 17:28:03 -05:00
parent 92c4051844
commit 9c9257e7cd
3 changed files with 59 additions and 3 deletions

View File

@@ -494,6 +494,11 @@ AuctionHouseBot.RandomStackRatio.Glyph = 0
# The lowest item level that will show up in listings # The lowest item level that will show up in listings
# Default: 0 # Default: 0
# #
# AuctionHouseBot.ListedItemLevelRestrict.UseCraftedItemForCalculation
# If the item is a recipe, then this will use the item produced by it
# for the determination if it will be excluded
# Default: true
#
# AuctionHouseBot.ListedItemLevelRestrict.MaxItemLevel # AuctionHouseBot.ListedItemLevelRestrict.MaxItemLevel
# The highest item level that will show up in listings # The highest item level that will show up in listings
# Default: 999 # Default: 999
@@ -503,10 +508,11 @@ AuctionHouseBot.RandomStackRatio.Glyph = 0
# Ranges using a dash (-) can also be used # Ranges using a dash (-) can also be used
# NOTE: Other filtering will still be honored even if it's listed here # NOTE: Other filtering will still be honored even if it's listed here
# Example: "100,150-200" would cause item level 100, and all item levels # Example: "100,150-200" would cause item level 100, and all item levels
# between 150 and 200 (inclusively) to not be subjected to this restriction # between 150 and 200 (inclusively) to not be subjected to this restriction.
############################################################################### ###############################################################################
AuctionHouseBot.ListedItemLevelRestrict.Enabled = false AuctionHouseBot.ListedItemLevelRestrict.Enabled = false
AuctionHouseBot.ListedItemLevelRestrict.UseCraftedItemForCalculation = true
AuctionHouseBot.ListedItemLevelRestrict.MinItemLevel = 0 AuctionHouseBot.ListedItemLevelRestrict.MinItemLevel = 0
AuctionHouseBot.ListedItemLevelRestrict.MaxItemLevel = 999 AuctionHouseBot.ListedItemLevelRestrict.MaxItemLevel = 999
AuctionHouseBot.ListedItemLevelRestrict.ExceptionItemIDs = AuctionHouseBot.ListedItemLevelRestrict.ExceptionItemIDs =

View File

@@ -29,6 +29,7 @@
#include "DatabaseEnv.h" #include "DatabaseEnv.h"
#include "ItemTemplate.h" #include "ItemTemplate.h"
#include "SharedDefines.h" #include "SharedDefines.h"
#include "SpellMgr.h"
#include <cmath> #include <cmath>
#include <set> #include <set>
@@ -47,6 +48,7 @@ AuctionHouseBot::AuctionHouseBot() :
ItemsPerCycle(75), ItemsPerCycle(75),
DisabledItemTextFilter(true), DisabledItemTextFilter(true),
ListedItemLevelRestrictedEnabled(false), ListedItemLevelRestrictedEnabled(false),
ListedItemLevelRestrictedUseCraftedItemForCalculation(true),
ListedItemLevelMax(999), ListedItemLevelMax(999),
ListedItemLevelMin(0), ListedItemLevelMin(0),
RandomStackRatioConsumable(1), RandomStackRatioConsumable(1),
@@ -429,6 +431,37 @@ void AuctionHouseBot::populateItemClassProportionList()
populatetemClassSeedListForItemClass(ITEM_CLASS_GLYPH, ListProportionGlyph); populatetemClassSeedListForItemClass(ITEM_CLASS_GLYPH, ListProportionGlyph);
} }
ItemTemplate const* AuctionHouseBot::getProducedItemFromRecipe(ItemTemplate const* recipeItemTemplate)
{
if (!recipeItemTemplate)
return nullptr;
for (uint8 i = 0; i < MAX_ITEM_PROTO_SPELLS; ++i)
{
if (recipeItemTemplate->Spells[i].SpellId)
{
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(recipeItemTemplate->Spells[i].SpellId);
if (!spellInfo)
continue;
for (auto const& effect : spellInfo->Effects)
{
if (effect.Effect == SPELL_EFFECT_CREATE_ITEM)
{
uint32 createdItemId = effect.ItemType;
if (createdItemId)
{
ItemTemplate const* producedItem = sObjectMgr->GetItemTemplate(createdItemId);
if (producedItem)
return producedItem;
}
}
}
}
}
return nullptr;
}
void AuctionHouseBot::populateItemCandidateList() void AuctionHouseBot::populateItemCandidateList()
{ {
// Clear old list and rebuild it // Clear old list and rebuild it
@@ -475,13 +508,27 @@ void AuctionHouseBot::populateItemCandidateList()
// Only test if it's not an exception // Only test if it's not an exception
if (ListedItemLevelExceptionItems.find(itr->second.ItemId) == ListedItemLevelExceptionItems.end()) if (ListedItemLevelExceptionItems.find(itr->second.ItemId) == ListedItemLevelExceptionItems.end())
{ {
if (itr->second.ItemLevel < ListedItemLevelMin) uint32 itemLevelToCompare = itr->second.ItemLevel;
// Recipes might need to consider produced items
if (ListedItemLevelRestrictedUseCraftedItemForCalculation == true && itr->second.Class == ITEM_CLASS_RECIPE)
{
ItemTemplate const* producedItemTemplate = getProducedItemFromRecipe(&itr->second);
if (producedItemTemplate != nullptr)
{
if (debug_Out_Filters)
LOG_ERROR("module", "AuctionHouseBot: Using item {} for recipe {} for item level comparison since ListedItemLevelRestrictedUseCraftedItemForCalculation is true", producedItemTemplate->ItemId, itr->second.ItemId);
itemLevelToCompare = producedItemTemplate->ItemLevel;
}
}
if (itemLevelToCompare < ListedItemLevelMin)
{ {
if (debug_Out_Filters) if (debug_Out_Filters)
LOG_ERROR("module", "AuctionHouseBot: Item {} disabled since item level is lower than ListedItemLevelRestrict.MinItemLevel", itr->second.ItemId); LOG_ERROR("module", "AuctionHouseBot: Item {} disabled since item level is lower than ListedItemLevelRestrict.MinItemLevel", itr->second.ItemId);
continue; continue;
} }
if (itr->second.ItemLevel > ListedItemLevelMax) if (itemLevelToCompare > ListedItemLevelMax)
{ {
if (debug_Out_Filters) if (debug_Out_Filters)
LOG_ERROR("module", "AuctionHouseBot: Item {} disabled since item level is higher than ListedItemLevelRestrict.MaxItemLevel", itr->second.ItemId); LOG_ERROR("module", "AuctionHouseBot: Item {} disabled since item level is higher than ListedItemLevelRestrict.MaxItemLevel", itr->second.ItemId);
@@ -1169,6 +1216,7 @@ void AuctionHouseBot::InitializeConfiguration()
// Item level Restrictions // Item level Restrictions
ListedItemLevelRestrictedEnabled = sConfigMgr->GetOption<bool>("AuctionHouseBot.ListedItemLevelRestrict.Enabled", false); ListedItemLevelRestrictedEnabled = sConfigMgr->GetOption<bool>("AuctionHouseBot.ListedItemLevelRestrict.Enabled", false);
ListedItemLevelRestrictedUseCraftedItemForCalculation = sConfigMgr->GetOption<bool>("AuctionHouseBot.ListedItemLevelRestrict.UseCraftedItemForCalculation", true);
ListedItemLevelMin = sConfigMgr->GetOption("AuctionHouseBot.ListedItemLevelRestrict.MinItemLevel", 0); ListedItemLevelMin = sConfigMgr->GetOption("AuctionHouseBot.ListedItemLevelRestrict.MinItemLevel", 0);
ListedItemLevelMax = sConfigMgr->GetOption("AuctionHouseBot.ListedItemLevelRestrict.MaxItemLevel", 999); ListedItemLevelMax = sConfigMgr->GetOption("AuctionHouseBot.ListedItemLevelRestrict.MaxItemLevel", 999);
ListedItemLevelExceptionItems.clear(); ListedItemLevelExceptionItems.clear();

View File

@@ -131,6 +131,7 @@ private:
bool DisabledItemTextFilter; bool DisabledItemTextFilter;
std::set<uint32> DisabledItems; std::set<uint32> DisabledItems;
bool ListedItemLevelRestrictedEnabled; bool ListedItemLevelRestrictedEnabled;
bool ListedItemLevelRestrictedUseCraftedItemForCalculation;
uint32 ListedItemLevelMax; uint32 ListedItemLevelMax;
uint32 ListedItemLevelMin; uint32 ListedItemLevelMin;
std::set<uint32> ListedItemLevelExceptionItems; std::set<uint32> ListedItemLevelExceptionItems;
@@ -238,6 +239,7 @@ private:
void calculateItemValue(ItemTemplate const* itemProto, uint64& outBidPrice, uint64& outBuyoutPrice); void calculateItemValue(ItemTemplate const* itemProto, uint64& outBidPrice, uint64& outBuyoutPrice);
void populatetemClassSeedListForItemClass(uint32 itemClass, uint32 itemClassSeedWeight); void populatetemClassSeedListForItemClass(uint32 itemClass, uint32 itemClassSeedWeight);
void populateItemClassProportionList(); void populateItemClassProportionList();
ItemTemplate const* getProducedItemFromRecipe(ItemTemplate const* recipeItemTemplate);
void populateItemCandidateList(); void populateItemCandidateList();
int getRandomValidItemClassForNewListing(); int getRandomValidItemClassForNewListing();
void addNewAuctions(Player* AHBplayer, AHBConfig *config); void addNewAuctions(Player* AHBplayer, AHBConfig *config);