local E, L, V, P, G = unpack(select(2, ...)); --Import: Engine, Locales, PrivateDB, ProfileDB, GlobalDB local M = E:GetModule("Misc") --Lua functions local unpack, pairs = unpack, pairs local max = math.max local find, gsub = string.find, string.gsub local tinsert = table.insert --WoW API / Variables local CloseLoot = CloseLoot local CreateFrame = CreateFrame local CursorOnUpdate = CursorOnUpdate local CursorUpdate = CursorUpdate local GetCVar = GetCVar local GetCursorPosition = GetCursorPosition local GetLootSlotInfo = GetLootSlotInfo local GetLootSlotLink = GetLootSlotLink local GetNumLootItems = GetNumLootItems local GiveMasterLoot = GiveMasterLoot local HandleModifiedItemClick = HandleModifiedItemClick local IsFishingLoot = IsFishingLoot local IsModifiedClick = IsModifiedClick local LootSlot = LootSlot local LootSlotIsItem = LootSlotIsItem local ResetCursor = ResetCursor local StaticPopup_Hide = StaticPopup_Hide local ToggleDropDownMenu = ToggleDropDownMenu local UnitIsDead = UnitIsDead local UnitIsFriend = UnitIsFriend local UnitName = UnitName local ITEM_QUALITY_COLORS = ITEM_QUALITY_COLORS local TEXTURE_ITEM_QUEST_BANG = TEXTURE_ITEM_QUEST_BANG local LOOT = LOOT -- Credit Haste local lootFrame, lootFrameHolder local iconSize = 30 local sq, ss, sn local OnEnter = function(self) local slot = self:GetID() if LootSlotIsItem(slot) then GameTooltip:SetOwner(self, "ANCHOR_RIGHT") GameTooltip:SetLootItem(slot) CursorUpdate(self) end self.drop:Show() self.drop:SetVertexColor(1, 1, 1) end local OnLeave = function(self) if self.quality and (self.quality > 1) then local color = ITEM_QUALITY_COLORS[self.quality] self.drop:SetVertexColor(color.r, color.g, color.b) else self.drop:Hide() end GameTooltip:Hide() ResetCursor() end local OnClick = function(self) LootFrame.selectedQuality = self.quality LootFrame.selectedItemName = self.name:GetText() LootFrame.selectedSlot = self:GetID() LootFrame.selectedLootButton = self:GetName() if IsModifiedClick() then HandleModifiedItemClick(GetLootSlotLink(self:GetID())) else StaticPopup_Hide("CONFIRM_LOOT_DISTRIBUTION") ss = self:GetID() sq = self.quality sn = self.name:GetText() LootSlot(ss) end end local OnShow = function(self) if GameTooltip:IsOwned(self) then GameTooltip:SetOwner(self, "ANCHOR_RIGHT") GameTooltip:SetLootItem(self:GetID()) CursorOnUpdate(self) end end local function anchorSlots(self) local shownSlots = 0 for i = 1, #self.slots do local frame = self.slots[i] if frame:IsShown() then shownSlots = shownSlots + 1 frame:Point("TOP", lootFrame, 4, (-8 + iconSize) - (shownSlots * iconSize)) end end self:Height(max(shownSlots * iconSize + 16, 20)) end local function createSlot(id) local frame = CreateFrame("Button", "ElvLootSlot"..id, lootFrame) frame:Point("LEFT", 8, 0) frame:Point("RIGHT", -8, 0) frame:Height(iconSize - 2) frame:SetID(id) frame:RegisterForClicks("LeftButtonUp", "RightButtonUp") frame:SetScript("OnEnter", OnEnter) frame:SetScript("OnLeave", OnLeave) frame:SetScript("OnClick", OnClick) frame:SetScript("OnShow", OnShow) local iconFrame = CreateFrame("Frame", nil, frame) iconFrame:Size(iconSize - 2) iconFrame:Point("RIGHT", frame) iconFrame:SetTemplate("Default") frame.iconFrame = iconFrame E.frames[iconFrame] = nil local icon = iconFrame:CreateTexture(nil, "ARTWORK") icon:SetTexCoord(unpack(E.TexCoords)) icon:SetInside() frame.icon = icon local count = iconFrame:CreateFontString(nil, "OVERLAY") count:SetJustifyH("RIGHT") count:Point("BOTTOMRIGHT", iconFrame, -2, 2) count:FontTemplate(nil, nil, "OUTLINE") count:SetText(1) frame.count = count local name = frame:CreateFontString(nil, "OVERLAY") name:SetJustifyH("LEFT") name:Point("LEFT", frame) name:Point("RIGHT", icon, "LEFT") name:SetNonSpaceWrap(true) name:FontTemplate(nil, nil, "OUTLINE") frame.name = name local drop = frame:CreateTexture(nil, "ARTWORK") drop:SetTexture(1, 1, 1, 0.15) drop:Point("LEFT", icon, "RIGHT", 0, 0) drop:Point("RIGHT", frame) drop:SetAllPoints(frame) frame.drop = drop local questTexture = iconFrame:CreateTexture(nil, "OVERLAY") questTexture:SetInside() questTexture:SetTexture(TEXTURE_ITEM_QUEST_BANG) questTexture:SetTexCoord(unpack(E.TexCoords)) frame.questTexture = questTexture lootFrame.slots[id] = frame return frame end function M:LOOT_SLOT_CLEARED(_, slot) if not lootFrame:IsShown() then return end lootFrame.slots[slot]:Hide() anchorSlots(lootFrame) end function M:LOOT_CLOSED() StaticPopup_Hide("LOOT_BIND") lootFrame:Hide() for _, v in pairs(lootFrame.slots) do v:Hide() end end function M:OPEN_MASTER_LOOT_LIST() ToggleDropDownMenu(1, nil, GroupLootDropDown, lootFrame.slots[ss], 0, 0) end function M:UPDATE_MASTER_LOOT_LIST() UIDropDownMenu_Refresh(GroupLootDropDown) end function M:LOOT_OPENED(_, autoLoot) lootFrame:Show() if not lootFrame:IsShown() then CloseLoot(autoLoot == 0) end local items = GetNumLootItems() if IsFishingLoot() then lootFrame.title:SetText(L["Fishy Loot"]) elseif not UnitIsFriend("player", "target") and UnitIsDead("target") then lootFrame.title:SetText(UnitName("target")) else lootFrame.title:SetText(LOOT) end -- Blizzard uses strings here if GetCVar("lootUnderMouse") == "1" then local x, y = GetCursorPosition() x = x / lootFrame:GetEffectiveScale() y = y / lootFrame:GetEffectiveScale() lootFrame:ClearAllPoints() lootFrame:Point("TOPLEFT", UIParent, "BOTTOMLEFT", x - 40, y + 20) lootFrame:GetCenter() lootFrame:Raise() E:DisableMover("LootFrameMover") else lootFrame:ClearAllPoints() lootFrame:Point("TOPLEFT", lootFrameHolder, "TOPLEFT") E:EnableMover("LootFrameMover") end local m, w, t = 0, 0, lootFrame.title:GetStringWidth() if items > 0 then for i = 1, items do local slot = lootFrame.slots[i] or createSlot(i) local texture, item, quantity, quality, _, isQuestItem, questId, isActive = GetLootSlotInfo(i) local color = ITEM_QUALITY_COLORS[quality] if texture and find(texture, "INV_Misc_Coin") then item = gsub(item, "\n", ", ") end if quantity and (quantity > 1) then slot.count:SetText(quantity) slot.count:Show() else slot.count:Hide() end if quality and (quality > 1) then slot.drop:SetVertexColor(color.r, color.g, color.b) slot.drop:Show() else slot.drop:Hide() end slot.quality = quality slot.name:SetText(item) if color then slot.name:SetTextColor(color.r, color.g, color.b) end slot.icon:SetTexture(texture) if quality then m = max(m, quality) end w = max(w, slot.name:GetStringWidth()) local questTexture = slot.questTexture if questId and not isActive then questTexture:SetTexture(TEXTURE_ITEM_QUEST_BANG) questTexture:Show() elseif questId or isQuestItem then questTexture:SetTexture(TEXTURE_ITEM_QUEST_BORDER) questTexture:Show() else questTexture:Hide() end -- Check for FasterLooting scripts or w/e (if bag is full) if texture then slot:Enable() slot:Show() end end else local slot = lootFrame.slots[1] or createSlot(1) local color = ITEM_QUALITY_COLORS[0] slot.name:SetText(L["Empty Slot"]) if color then slot.name:SetTextColor(color.r, color.g, color.b) end slot.icon:SetTexture[[Interface\Icons\INV_Misc_Herb_AncientLichen]] w = max(w, slot.name:GetStringWidth()) slot.count:Hide() slot.drop:Hide() slot:Disable() slot:Show() end anchorSlots(lootFrame) w = w + 60 t = t + 5 local color = ITEM_QUALITY_COLORS[m] lootFrame:SetBackdropBorderColor(color.r, color.g, color.b, .8) lootFrame:Width(max(w, t)) end function M:LoadLoot() if not E.private.general.loot then return end lootFrameHolder = CreateFrame("Frame", "ElvLootFrameHolder", E.UIParent) lootFrameHolder:Point("TOP", 0, -50) lootFrameHolder:Size(150, 22) lootFrame = CreateFrame("Button", "ElvLootFrame", lootFrameHolder) lootFrame:SetClampedToScreen(true) lootFrame:SetPoint("TOPLEFT") lootFrame:Size(256, 64) lootFrame:SetTemplate("Transparent") lootFrame:SetFrameStrata("DIALOG") lootFrame:SetToplevel(true) lootFrame.title = lootFrame:CreateFontString(nil, "OVERLAY") lootFrame.title:FontTemplate(nil, nil, "OUTLINE") lootFrame.title:Point("BOTTOMLEFT", lootFrame, "TOPLEFT", 0, 1) lootFrame.slots = {} lootFrame:SetScript("OnHide", function() StaticPopup_Hide("CONFIRM_LOOT_DISTRIBUTION") CloseLoot() end) E.frames[lootFrame] = nil self:RegisterEvent("LOOT_OPENED") self:RegisterEvent("LOOT_SLOT_CLEARED") self:RegisterEvent("LOOT_CLOSED") self:RegisterEvent("OPEN_MASTER_LOOT_LIST") self:RegisterEvent("UPDATE_MASTER_LOOT_LIST") E:CreateMover(lootFrameHolder, "LootFrameMover", L["Loot Frame"], nil, nil, nil, nil, nil, "general,blizzUIImprovements") -- Fuzz LootFrame:UnregisterAllEvents() tinsert(UISpecialFrames, "ElvLootFrame") function _G.GroupLootDropDown_GiveLoot(self) if sq >= MASTER_LOOT_THREHOLD then local dialog = StaticPopup_Show("CONFIRM_LOOT_DISTRIBUTION", ITEM_QUALITY_COLORS[sq].hex..sn..FONT_COLOR_CODE_CLOSE, self:GetText()) if dialog then dialog.data = self.value end else GiveMasterLoot(ss, self.value) end CloseDropDownMenus() end E.PopupDialogs.CONFIRM_LOOT_DISTRIBUTION.OnAccept = function(_, data) GiveMasterLoot(ss, data) end StaticPopupDialogs.CONFIRM_LOOT_DISTRIBUTION.preferredIndex = 3 end