diff --git a/mods/aoe-loot.lua b/mods/aoe-loot.lua index 208ad60..e7ae300 100644 --- a/mods/aoe-loot.lua +++ b/mods/aoe-loot.lua @@ -14,6 +14,23 @@ module.enable = function(self) local frame = CreateFrame("Frame", "ShaguTweaksAoELoot") local pending = false local releaseDeadline = 0 + local containerLootDeadline = 0 + + local function TrackContainerUse(bag, slot) + if not C_Container or not C_Container.IsContainerItemOpenable then return end + + local isOpenable, canOpen = C_Container.IsContainerItemOpenable(bag, slot) + if isOpenable and canOpen then + -- LOOT_OPENED is also fired by clams, lockboxes and similar bag items. + -- Mark that session before UseContainerItem runs so it remains under the + -- normal client handling and the consumed container can leave the bag. + containerLootDeadline = GetTime() + 3 + end + end + + -- Use the ShaguTweaks hook explicitly because its prepend mode records the + -- bag item before UseContainerItem can synchronously fire LOOT_OPENED. + ShaguTweaks.hooksecurefunc("UseContainerItem", TrackContainerUse, true) local function IsMasterLootActive() if not GetLootMethod then return false end @@ -31,6 +48,15 @@ module.enable = function(self) return true end + local function HasNearbyLootableCorpse() + -- Older ClassicAPI builds may not expose the query yet. Keep AoE Loot + -- functional there; the container hook above still protects bag items. + if not C_Loot or not C_Loot.GetNearbyLootableUnits then return true end + + local units = C_Loot.GetNearbyLootableUnits() + return type(units) == "table" and table.getn(units) > 0 + end + local function StartAoELoot() -- Defer for one frame so the normal loot session can close cleanly. frame:SetScript("OnUpdate", nil) @@ -67,6 +93,14 @@ module.enable = function(self) frame:SetScript("OnEvent", function() if event == "LOOT_OPENED" then + -- Inventory containers use the same loot events as corpses. Let the + -- normal client finish them instead of closing their loot session. + if containerLootDeadline > 0 then + local isContainerLoot = GetTime() <= containerLootDeadline + containerLootDeadline = 0 + if isContainerLoot then return end + end + -- The master looter must keep the normal window to inspect and assign loot. if IsMasterLootActive() then pending = false @@ -75,6 +109,11 @@ module.enable = function(self) return end + -- Chests, fishing nodes and other non-corpse sources also emit + -- LOOT_OPENED. AoE Loot only has work to do when ClassicAPI can actually + -- see at least one nearby lootable unit. + if not HasNearbyLootableCorpse() then return end + if pending or not CanStartAoELoot() then return end pending = true