From 9c5267f35bf002149adbc041e7aa6016389aa467 Mon Sep 17 00:00:00 2001 From: celguar Date: Sun, 26 May 2024 12:50:09 +0300 Subject: [PATCH] Only try to loot quest objects if has items or not used --- playerbot/LootObjectStack.cpp | 10 +++++++++- playerbot/strategy/actions/LootAction.cpp | 6 ++++-- playerbot/strategy/values/LootValues.cpp | 18 ++++++++---------- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/playerbot/LootObjectStack.cpp b/playerbot/LootObjectStack.cpp index 7930a3216..2d9f5bbbb 100644 --- a/playerbot/LootObjectStack.cpp +++ b/playerbot/LootObjectStack.cpp @@ -259,7 +259,15 @@ bool LootObject::IsLootPossible(Player* bot) { if (go->ActivateToQuest(bot)) { - return true; + bool hasQuestItems = false; + for (auto& entry : GAI_VALUE2(std::list, "entry loot list", -go->GetEntry())) + { + if (IsNeededForQuest(bot, entry)) + { + hasQuestItems = true; + } + } + return hasQuestItems || go->GetLootState() != GO_READY; } } } diff --git a/playerbot/strategy/actions/LootAction.cpp b/playerbot/strategy/actions/LootAction.cpp index 98c298041..5524d0597 100644 --- a/playerbot/strategy/actions/LootAction.cpp +++ b/playerbot/strategy/actions/LootAction.cpp @@ -12,6 +12,7 @@ #include "playerbot/strategy/values/LootStrategyValue.h" #include "playerbot/strategy/values/ItemUsageValue.h" #include "playerbot/ServerFacade.h" +#include "playerbot/strategy/values/SharedValueContext.h" using namespace ai; @@ -127,11 +128,12 @@ bool OpenLootAction::DoLoot(LootObject& lootObject) { // herb-like quest objects bool isForQuest = false; - if (sObjectMgr.IsGameObjectForQuests(lootObject.guid.GetEntry())) + if (go && sObjectMgr.IsGameObjectForQuests(lootObject.guid.GetEntry())) { if (go->ActivateToQuest(bot)) { - isForQuest = true; + std::list lootItems = GAI_VALUE2(std::list, "entry loot list", -go->GetEntry()); + isForQuest = !lootItems.empty() || go->GetLootState() != GO_READY; } } diff --git a/playerbot/strategy/values/LootValues.cpp b/playerbot/strategy/values/LootValues.cpp index 35482bdbe..651084b7a 100644 --- a/playerbot/strategy/values/LootValues.cpp +++ b/playerbot/strategy/values/LootValues.cpp @@ -175,16 +175,14 @@ std::list EntryLootListValue::Calculate() std::list items; - LootTemplateAccess const* lTemplateA; - - if (entry > 0) - lTemplateA = DropMapValue::GetLootTemplate(ObjectGuid(HIGHGUID_UNIT, entry, uint32(1)), LOOT_CORPSE); - else - lTemplateA = DropMapValue::GetLootTemplate(ObjectGuid(HIGHGUID_GAMEOBJECT, entry, uint32(1)), LOOT_CORPSE); - - if (lTemplateA) - for (LootStoreItem const& lItem : lTemplateA->Entries) - items.push_back(lItem.itemid); + DropMap* dropMap = GAI_VALUE(DropMap*, "drop map"); + for (auto it = dropMap->begin(); it != dropMap->end(); ++it) + { + if (it->second == entry) + { + items.push_back(it->first); + } + } return items; }