From 014bb8f2a7a6e5a0b7b9c796017708a54e55c620 Mon Sep 17 00:00:00 2001 From: TerraByte Date: Mon, 5 May 2025 16:41:38 -0500 Subject: [PATCH] Update aoe_loot.cpp --- mod-aoe-loot/src/aoe_loot.cpp | 144 ++++++++++++++++++++++++++++------ 1 file changed, 119 insertions(+), 25 deletions(-) diff --git a/mod-aoe-loot/src/aoe_loot.cpp b/mod-aoe-loot/src/aoe_loot.cpp index ccab3bf..f8d4987 100644 --- a/mod-aoe-loot/src/aoe_loot.cpp +++ b/mod-aoe-loot/src/aoe_loot.cpp @@ -227,8 +227,7 @@ bool AoeLootCommandScript::ProcessLootSlot(Player* player, ObjectGuid lguid, uin Corpse* bones = ObjectAccessor::GetCorpse(*player, lguid); if (!bones) { - player->SendLootRelease(lguid); - ProcessLootRelease(lguid, player, loot); + player->SendLootRelease(lguid); return false; } loot = &bones->loot; @@ -255,28 +254,6 @@ bool AoeLootCommandScript::ProcessLootSlot(Player* player, ObjectGuid lguid, uin sScriptMgr->OnPlayerAfterCreatureLoot(player); if (!loot) return false; - // Check if the item is already looted - - QuestItem* qitem = nullptr; - QuestItem* ffaitem = nullptr; - QuestItem* conditem = nullptr; - LootItem* item = loot->LootItemInSlot(lootSlot, player, &qitem, &ffaitem, &conditem); - - if (!item) - { - if (sConfigMgr->GetOption("AOELoot.Debug", false)) - LOG_DEBUG("module.aoe_loot", "No valid loot item found in slot {}", lootSlot); - - return false; - } - - // Skip items being rolled on - if (item->is_blocked) - return false; - - // Skip already looted items - if (item->is_looted) - return false; InventoryResult msg; LootItem* lootItem = player->StoreLootItem(lootSlot, loot, msg); @@ -297,6 +274,8 @@ bool AoeLootCommandScript::ProcessLootSlot(Player* player, ObjectGuid lguid, uin return true; } + + bool AoeLootCommandScript::HandleStartAoeLootCommand(ChatHandler* handler, Optional /*args*/) { if (!sConfigMgr->GetOption("AOELoot.Enable", true)) @@ -386,10 +365,113 @@ bool AoeLootCommandScript::HandleStartAoeLootCommand(ChatHandler* handler, Optio { ObjectGuid lguid = creature->GetGUID(); Loot* loot = &creature->loot; + if (validCorpses.size() <= 1) + { + break; + } if (!loot) continue; player->SetLootGUID(lguid); + /* + // Add processing for PlayerQuestItems (player-specific quest items) + QuestItemMap const& playerQuestItems = loot->GetPlayerQuestItems(); + if (!playerQuestItems.empty()) + { + QuestItemMap::const_iterator pqItr = playerQuestItems.find(player->GetGUID()); + if (pqItr != playerQuestItems.end()) + { + QuestItemList* pql = pqItr->second; + if (pql) + { + for (QuestItemList::const_iterator iter = pql->begin(); iter != pql->end(); ++iter) + { + ProcessLootSlot(player, lguid, iter->index); + if (debugMode) + LOG_DEBUG("module.aoe_loot", "AOE Loot: looted player quest item in slot {}", iter->index); + } + } + } + } + + // Add processing for PlayerFFAItems (Free-For-All quest items) + QuestItemMap const& playerFFAItems = loot->GetPlayerFFAItems(); + if (!playerFFAItems.empty()) + { + QuestItemMap::const_iterator pqItr = playerFFAItems.find(player->GetGUID()); + if (pqItr != playerFFAItems.end()) + { + QuestItemList* pql = pqItr->second; + if (pql) + { + for (QuestItemList::const_iterator iter = pql->begin(); iter != pql->end(); ++iter) + { + ProcessLootSlot(player, lguid, iter->index); + if (debugMode) + LOG_DEBUG("module.aoe_loot", "AOE Loot: looted player FFA item in slot {}", iter->index); + } + } + } + } + + // Add processing for PlayerNonQuestNonFFAConditionalItems + QuestItemMap const& playerNonQuestNonFFAConditionalItems = loot->GetPlayerNonQuestNonFFAConditionalItems(); + if (!playerNonQuestNonFFAConditionalItems.empty()) + { + QuestItemMap::const_iterator pqItr = playerNonQuestNonFFAConditionalItems.find(player->GetGUID()); + if (pqItr != playerNonQuestNonFFAConditionalItems.end()) + { + QuestItemList* pql = pqItr->second; + if (pql) + { + for (QuestItemList::const_iterator iter = pql->begin(); iter != pql->end(); ++iter) + { + ProcessLootSlot(player, lguid, iter->index); + if (debugMode) + LOG_DEBUG("module.aoe_loot", "AOE Loot: looted conditional item in slot {}", iter->index); + } + } + } + } + */ + // Process quest items + QuestItemMap const& playerNonQuestNonFFAConditionalItems = loot->GetPlayerNonQuestNonFFAConditionalItems(); + if (!playerNonQuestNonFFAConditionalItems.empty()) + { + for (uint8 i = 0; i < playerNonQuestNonFFAConditionalItems.size(); ++i) + { + uint8 lootSlot = playerNonQuestNonFFAConditionalItems.size() + i; + ProcessLootSlot(player, lguid, lootSlot); + if (debugMode) + LOG_DEBUG("module.aoe_loot", "AOE Loot: looted quest item in slot {}", lootSlot); + } + } + + // Process quest items + QuestItemMap const& playerFFAItems = loot->GetPlayerFFAItems(); + if (!playerFFAItems.empty()) + { + for (uint8 i = 0; i < playerFFAItems.size(); ++i) + { + uint8 lootSlot = playerFFAItems.size() + i; + ProcessLootSlot(player, lguid, lootSlot); + if (debugMode) + LOG_DEBUG("module.aoe_loot", "AOE Loot: looted quest item in slot {}", lootSlot); + } + } + + // Process quest items + QuestItemMap const& playerQuestItems = loot->GetPlayerQuestItems(); + if (!playerQuestItems.empty()) + { + for (uint8 i = 0; i < playerQuestItems.size(); ++i) + { + uint8 lootSlot = playerQuestItems.size() + i; + ProcessLootSlot(player, lguid, lootSlot); + if (debugMode) + LOG_DEBUG("module.aoe_loot", "AOE Loot: looted quest item in slot {}", lootSlot); + } + } // Process quest items if (!loot->quest_items.empty()) @@ -399,7 +481,19 @@ bool AoeLootCommandScript::HandleStartAoeLootCommand(ChatHandler* handler, Optio uint8 lootSlot = loot->items.size() + i; ProcessLootSlot(player, lguid, lootSlot); if (debugMode) - LOG_DEBUG("module.aoe_loot", "AOE Loot: looted quest item in slot {}", lootSlot); + LOG_DEBUG("module.aoe_loot", "AOE Loot: looted quest item in slot {}", lootSlot); + } + } + + // Process quest items + if (!loot->quest_items.empty()) + { + for (uint8 i = 0; i < loot->quest_items.size(); ++i) + { + uint8 lootSlot = loot->items.size() + i; + ProcessLootSlot(player, lguid, lootSlot); + if (debugMode) + LOG_DEBUG("module.aoe_loot", "AOE Loot: looted quest item in slot {}", lootSlot); } }