local addon, ns = ... local db, events, F, L = ns:Locals() local open_rolls = {} local pending_loot = {} local raiders = {} local historyIDs = {} events:RegisterEvent("OPEN_MASTER_LOOT_LIST") function events:RollAndAssign(itemName, itemLink) events:RegisterEvent("LOOT_ROLLS_COMPLETE") events:RegisterEvent("LOOT_HISTORY_FULL_UPDATE") DoMasterLootRoll(F:GetLootSlot(itemLink)) end function events:LOOT_ROLLS_COMPLETE(event, ...) F:ProcessOpenRolls(open_rolls) end function events:LOOT_HISTORY_FULL_UPDATE(...) local highID, highLink, rollID, itemLink table.wipe(historyIDs) for i = 1, C_LootHistory.GetNumItems() do rollID, itemLink = C_LootHistory.GetItem(i) highID = not highID and rollID or ((highID and rollID > highID) and rollID or highID) highLink = rollID == highID and itemLink or highLink historyIDs[rollID] = true end open_rolls[highID] = highLink for k, v in pairs(open_rolls) do open_rolls[k] = historyIDs[k] and v or nil end events:UnregisterEvent("LOOT_HISTORY_FULL_UPDATE") end function events:AssignToRandom(itemName, itemLink) F:AssignLoot("random", itemLink, nil, open_rolls) end function events:LootItem(_, itemLink) F:AssignLoot("loot", itemLink, GetUnitName("player"), open_rolls) end function events:AssigntoReserver(itemName, itemLink) F:AssignLoot("loot", itemLink, select(2, events:GetReserver(itemName)), open_rolls) end function events:GetReserver(itemName) if db.reserves[itemName] then local name, server = db.reserves[itemName]:match("(.+)%-(.+)") name = name or db.reserves[itemName] local reserver = server == GetRealmName() and name or db.reserves[itemName] return name, reserver else return L.Reserver end end function events:GetDisabled(itemName) local reserver = select(2, events:GetReserver(itemName)) or events:GetReserver(itemName) if reserver == L.Reserver then return true else for i = 1, MAX_RAID_MEMBERS do local roster = GetRaidRosterInfo(i) if roster == reserver or roster == reserver then return false end end return true end end local info local menu_items = { -- {isTitle, text, fontObject, notCheckable, func} {true, MASTER_LOOTER, GameFontNormalLeft, true, false}, {false, ASSIGN_LOOT, false, true, MasterLooterFrame_Show}, {false, REQUEST_ROLL, false, true, function() DoMasterLootRoll(LootFrame.selectedSlot) end}, {false, false, false, true, false, true}, {true, L.Addon, GameFontNormalLeft, true, false}, {false, L.RollAndAssign, false, true, events.RollAndAssign}, {false, L.AssignToRandom, false, true, events.AssignToRandom}, {false, L.LootItem, false, true, events.LootItem} } function events:OPEN_MASTER_LOOT_LIST(...) CloseDropDownMenus() UIDropDownMenu_Initialize(GroupLootDropDown, function(self, level, menuList) for k, v in pairs(menu_items) do info = UIDropDownMenu_CreateInfo() info.isTitle = v[1] info.text = v[2] info.fontObject = v[3] info.notCheckable = v[4] info.func = v[5] info.disabled = false info.arg1 = select(2, GetLootSlotInfo(LootFrame.selectedSlot)) info.arg2 = GetLootSlotLink(LootFrame.selectedSlot) UIDropDownMenu_AddButton(info) end info = UIDropDownMenu_CreateInfo() info.isTitle = false info.text = string.format(L.AssignToReserver, events:GetReserver(LootFrame.selectedItemName)) info.fontObject = false info.notCheckable = true info.func = events.AssigntoReserver info.disabled = events:GetDisabled(LootFrame.selectedItemName) info.arg1 = select(2, GetLootSlotInfo(LootFrame.selectedSlot)) info.arg2 = GetLootSlotLink(LootFrame.selectedSlot) UIDropDownMenu_AddButton(info) end) ToggleDropDownMenu(1, nil, GroupLootDropDown, LootFrame.selectedLootButton, 0, 0) end LootFrame:HookScript("OnShow", function() F:ProcessOpenRolls(open_rolls) end) LootFrame:HookScript("OnHide", function() CloseDropDownMenus() end)