diff --git a/playerbot/strategy/values/ItemUsageValue.cpp b/playerbot/strategy/values/ItemUsageValue.cpp index 850a3bf5..5f5b4b9e 100644 --- a/playerbot/strategy/values/ItemUsageValue.cpp +++ b/playerbot/strategy/values/ItemUsageValue.cpp @@ -265,7 +265,7 @@ ItemUsage ItemUsageValue::Calculate() return hasSameMount ? ItemUsage::ITEM_USAGE_KEEP : ItemUsage::ITEM_USAGE_EQUIP; } - ItemUsage equip = QueryItemUsageForEquip(itemQualifier); + ItemUsage equip = QueryItemUsageForEquip(itemQualifier, bot); if (equip != ItemUsage::ITEM_USAGE_NONE) return equip; @@ -395,8 +395,11 @@ ItemUsage ItemUsageValue::Calculate() return ItemUsage::ITEM_USAGE_NONE; } -ItemUsage ItemUsageValue::QueryItemUsageForEquip(ItemQualifier& itemQualifier) +ItemUsage ItemUsageValue::QueryItemUsageForEquip(ItemQualifier& itemQualifier, Player* bot) { + PlayerbotAI* ai = bot->GetPlayerbotAI(); + AiObjectContext* context = ai->GetAiObjectContext(); + ChatHelper* chat = ai->GetChatHelper(); ItemPrototype const* itemProto = itemQualifier.GetProto(); if (bot->CanUseItem(itemProto) != EQUIP_ERR_OK) @@ -477,7 +480,7 @@ ItemUsage ItemUsageValue::QueryItemUsageForEquip(ItemQualifier& itemQualifier) if (itemProto->SubClass != ITEM_SUBCLASS_CONTAINER) return ItemUsage::ITEM_USAGE_NONE; //Todo add logic for non-bag containers. We want to look at professions/class and only replace if non-bag is larger than bag. - if (GetSmallestBagSize() >= itemProto->ContainerSlots) + if (GetSmallestBagSize(bot) >= itemProto->ContainerSlots) return ItemUsage::ITEM_USAGE_NONE; return ItemUsage::ITEM_USAGE_EQUIP; @@ -552,7 +555,7 @@ ItemUsage ItemUsageValue::QueryItemUsageForEquip(ItemQualifier& itemQualifier) } //Return smaltest bag size equipped -uint32 ItemUsageValue::GetSmallestBagSize() +uint32 ItemUsageValue::GetSmallestBagSize(Player* bot) { int8 curSlot = 0; uint32 curSlots = 0; diff --git a/playerbot/strategy/values/ItemUsageValue.h b/playerbot/strategy/values/ItemUsageValue.h index bed5572a..980bb9e2 100644 --- a/playerbot/strategy/values/ItemUsageValue.h +++ b/playerbot/strategy/values/ItemUsageValue.h @@ -76,9 +76,9 @@ namespace ai ItemUsageValue(PlayerbotAI* ai, std::string name = "item usage") : CalculatedValue(ai, name), Qualified() {} virtual ItemUsage Calculate(); - private: - ItemUsage QueryItemUsageForEquip(ItemQualifier& itemQualifier); - uint32 GetSmallestBagSize(); + static ItemUsage QueryItemUsageForEquip(ItemQualifier& itemQualifier, Player* bot); + static uint32 GetSmallestBagSize(Player* bot); + private: bool IsItemUsefulForQuest(Player* player, ItemPrototype const* proto, bool ignoreInventory = false); bool IsItemNeededForSkill(ItemPrototype const* proto); bool IsItemUsefulForSkill(ItemPrototype const* proto); diff --git a/playerbot/strategy/values/LootValues.cpp b/playerbot/strategy/values/LootValues.cpp index 6003acad..4e0263de 100644 --- a/playerbot/strategy/values/LootValues.cpp +++ b/playerbot/strategy/values/LootValues.cpp @@ -255,6 +255,24 @@ itemUsageMap EntryLootUsageValue::Calculate() return items; } +bool HasUpgradeValue::Calculate() +{ + for (auto itemId : GAI_VALUE2(std::list, "entry loot list", getQualifier())) + { + ForceItemUsage forceUsage = AI_VALUE2_EXISTS(ForceItemUsage, "force item usage", itemId, ForceItemUsage::FORCE_USAGE_NONE); + + if (forceUsage == ForceItemUsage::FORCE_USAGE_NEED) + return true; + + ItemQualifier qualifier(itemId); + + ItemUsage equip = ItemUsageValue::QueryItemUsageForEquip(qualifier, bot); + if (equip == ItemUsage::ITEM_USAGE_EQUIP) + return true; + } + return false; +} + //How many (stack) items can be looted while still having free space. uint32 StackSpaceForItem::Calculate() { diff --git a/playerbot/strategy/values/LootValues.h b/playerbot/strategy/values/LootValues.h index c4c9aac1..e0adcc5f 100644 --- a/playerbot/strategy/values/LootValues.h +++ b/playerbot/strategy/values/LootValues.h @@ -161,7 +161,7 @@ namespace ai { public: HasUpgradeValue(PlayerbotAI* ai) : BoolCalculatedValue(ai, "has upgrade", 2), Qualified() {} - virtual bool Calculate() { itemUsageMap uMap = AI_VALUE2(itemUsageMap, "entry loot usage", getQualifier()); return uMap.find(ItemUsage::ITEM_USAGE_EQUIP) != uMap.end(); }; + virtual bool Calculate(); #ifdef GenerateBotHelp virtual std::string GetHelpName() { return "has upgrade"; } //Must equal iternal name @@ -170,7 +170,7 @@ namespace ai { return "This value checks if a specific creature or game object drops an item that is an equipment upgrade for the bot."; } - virtual std::vector GetUsedValues() { return { "entry loot usage" }; } + virtual std::vector GetUsedValues() { return {"entry loot list"}; } #endif };