From d3395c5a5bc3ff258c649602f1a562f5dc8b314c Mon Sep 17 00:00:00 2001 From: Dusk-92 Date: Tue, 1 Sep 2026 17:50:51 +0200 Subject: [PATCH] Support native Auto Loot in AoE Loot --- mods/aoe-loot.lua | 49 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/mods/aoe-loot.lua b/mods/aoe-loot.lua index ae7dd67..1b25600 100644 --- a/mods/aoe-loot.lua +++ b/mods/aoe-loot.lua @@ -13,12 +13,24 @@ local module = ShaguTweaks:register({ module.enable = function(self) local frame = CreateFrame("Frame", "ShaguTweaksAoELoot") local pending = false + local releaseDeadline = 0 local function IsMasterLootActive() if not GetLootMethod then return false end return GetLootMethod() == "master" end + local function IsAutoLootActive() + if not GetCVar then return false end + + local enabled = tonumber(GetCVar("autoLootDefault")) == 1 + if IsShiftKeyDown and IsShiftKeyDown() then + enabled = not enabled + end + + return enabled + end + local function CanStartAoELoot() if IsMasterLootActive() then return false end if not C_Loot or not C_Loot.LootAllCorpses then return false end @@ -33,12 +45,35 @@ module.enable = function(self) local function StartAoELoot() -- Defer for one frame so the normal loot session can close cleanly. frame:SetScript("OnUpdate", nil) + pending = false + releaseDeadline = 0 if CanStartAoELoot() then C_Loot.LootAllCorpses() end end + local function QueueAoELoot() + pending = false + releaseDeadline = 0 + frame:SetScript("OnUpdate", StartAoELoot) + end + + local function WaitForLootRelease() + -- Native Auto Loot can finish before this module receives LOOT_OPENED. + -- In that case LOOT_CLOSED has already passed, so use the empty session + -- as a fallback and queue the ClassicAPI walk on the following frame. + if pending and (not GetNumLootItems or GetNumLootItems() == 0) then + QueueAoELoot() + elseif pending and GetTime() >= releaseDeadline then + -- Never leave a per-frame waiter behind if the native loot session + -- cannot finish, for example because every inventory bag is full. + pending = false + releaseDeadline = 0 + frame:SetScript("OnUpdate", nil) + end + end + frame:RegisterEvent("LOOT_OPENED") frame:RegisterEvent("LOOT_CLOSED") @@ -47,6 +82,7 @@ module.enable = function(self) -- The master looter must keep the normal window to inspect and assign loot. if IsMasterLootActive() then pending = false + releaseDeadline = 0 frame:SetScript("OnUpdate", nil) return end @@ -54,13 +90,20 @@ module.enable = function(self) if pending or not CanStartAoELoot() then return end pending = true - CloseLoot() + releaseDeadline = GetTime() + 3 + frame:SetScript("OnUpdate", WaitForLootRelease) + + -- Let native Auto Loot drain the first corpse. Without Auto Loot, + -- close the normal session so ClassicAPI can take over all corpses. + if not IsAutoLootActive() then + CloseLoot() + end + return end if event == "LOOT_CLOSED" and pending then - pending = false - frame:SetScript("OnUpdate", StartAoELoot) + QueueAoELoot() end end) end