mirror of
https://github.com/brues-code/pfUI.git
synced 2026-09-22 07:36:56 +00:00
726 lines
25 KiB
Lua
726 lines
25 KiB
Lua
pfUI:RegisterModule("loot", "vanilla:tbc", function ()
|
|
pfUI.loot = CreateFrame("Frame", "pfLootFrame", UIParent)
|
|
pfUI.loot:Hide()
|
|
pfUI.loot:SetFrameStrata("DIALOG")
|
|
pfUI.loot:RegisterEvent("LOOT_OPENED")
|
|
pfUI.loot:RegisterEvent("LOOT_CLOSED")
|
|
pfUI.loot:RegisterEvent("LOOT_SLOT_CLEARED")
|
|
pfUI.loot:RegisterEvent("OPEN_MASTER_LOOT_LIST")
|
|
pfUI.loot:RegisterEvent("UPDATE_MASTER_LOOT_LIST")
|
|
pfUI.loot:RegisterEvent("LOOT_BIND_CONFIRM")
|
|
|
|
pfUI.loot:SetWidth(160+C.appearance.border.default*2)
|
|
|
|
if C.loot.mousecursor == "0" then
|
|
pfUI.loot:SetHeight(160+C.appearance.border.default*2)
|
|
pfUI.loot:SetPoint("TOP", UIParent, "CENTER", 0, 0)
|
|
UpdateMovable(pfUI.loot)
|
|
end
|
|
|
|
pfUI.loot.unitbuttons = {
|
|
["PF_BANKLOOTER"] = {T["Set Banker"],"bankLooter"},
|
|
["PF_DISENCHANTLOOTER"] = {T["Set Disenchanter"],"disenchantLooter"},
|
|
}
|
|
pfUI.loot.me = (UnitName("player"))
|
|
pfUI.loot.index_to_name = {}
|
|
pfUI.loot.name_to_index = {}
|
|
pfUI.loot.classes_in_raid = {}
|
|
pfUI.loot.players_in_class = {}
|
|
pfUI.loot.randoms = {}
|
|
pfUI.loot.rollers = {}
|
|
pfUI.loot.rollers_sorted = {}
|
|
pfUI.loot.info = {}
|
|
local info = pfUI.loot.info
|
|
|
|
function pfUI.loot.RaidRoll(candidates)
|
|
if type(candidates) ~= "table" then return end
|
|
local slot = pfUI.loot.selectedSlot or 0
|
|
local to = table.getn(candidates)
|
|
if to >= 1 then
|
|
local _,_,_,quality = GetLootSlotInfo(slot)
|
|
if quality >= tonumber(C.loot.rollannouncequal) then
|
|
SendChatMessageWide(T["Random Rolling"].." "..GetLootSlotLink(slot))
|
|
if C.loot.rollannounce == "1" then
|
|
local k,names = 1, ""
|
|
for i=1,to do
|
|
names = (k==1) and (i..":"..pfUI.loot.index_to_name[candidates[i]]) or (names..", "..i..":"..pfUI.loot.index_to_name[candidates[i]])
|
|
-- fit the maximum names in a single 255 char message (15)
|
|
if i == to or k == 15 then
|
|
QueueFunction(SendChatMessageWide,names)
|
|
names = ""
|
|
end
|
|
k = k<15 and k+1 or 1
|
|
end
|
|
end
|
|
end
|
|
pfUI.loot:RegisterEvent("CHAT_MSG_SYSTEM")
|
|
pfUI.loot.randomRolling = true
|
|
QueueFunction(RandomRoll,"1",tostring(to))
|
|
end
|
|
end
|
|
|
|
function pfUI.loot.RequestRolls()
|
|
local slot = pfUI.loot.selectedSlot or 0
|
|
local rollers = wipe(pfUI.loot.rollers)
|
|
local rollers_sorted = wipe(pfUI.loot.rollers_sorted)
|
|
SendChatMessageWide(T["Roll for"].. " " .. GetLootSlotLink(slot))
|
|
pfUI.loot:RegisterEvent("CHAT_MSG_SYSTEM")
|
|
pfUI.loot.monitorRolling = true
|
|
UIDropDownMenu_Refresh(GroupLootDropDown)
|
|
end
|
|
|
|
function pfUI.loot:BuildSpecialRecipientsMenu(level)
|
|
local slot = pfUI.loot.selectedSlot or 0
|
|
if level == 1 then
|
|
if pfUI.loot.my_index or pfUI.loot.disenchanter_index or pfUI.loot.banker_index then
|
|
info = wipe(info)
|
|
info.text = T["Special Recipient"]
|
|
info.textR = NORMAL_FONT_COLOR.r
|
|
info.textG = NORMAL_FONT_COLOR.g
|
|
info.textB = NORMAL_FONT_COLOR.b
|
|
info.textHeight = 12
|
|
info.hasArrow = 1
|
|
info.notCheckable = 1
|
|
info.value = "PFRECIPIENTS"
|
|
info.func = nil
|
|
UIDropDownMenu_AddButton(info)
|
|
end
|
|
elseif level == 2 then
|
|
if UIDROPDOWNMENU_MENU_VALUE == "PFRECIPIENTS" then
|
|
if (pfUI.loot.my_index) then
|
|
info = wipe(info)
|
|
info.text = T["Self"]
|
|
info.textHeight = 12
|
|
info.value = pfUI.loot.my_index
|
|
info.func = GroupLootDropDown_GiveLoot
|
|
UIDropDownMenu_AddButton(info,UIDROPDOWNMENU_MENU_LEVEL)
|
|
end
|
|
if (pfUI.loot.disenchanter_index) then
|
|
info = wipe(info)
|
|
info.text = T["Disenchanter"]
|
|
info.textHeight = 12
|
|
info.value = pfUI.loot.disenchanter_index
|
|
info.func = GroupLootDropDown_GiveLoot
|
|
UIDropDownMenu_AddButton(info,UIDROPDOWNMENU_MENU_LEVEL)
|
|
end
|
|
if (pfUI.loot.banker_index) then
|
|
info = wipe(info)
|
|
info.text = T["Banker"]
|
|
info.textHeight = 12
|
|
info.value = pfUI.loot.banker_index
|
|
info.func = GroupLootDropDown_GiveLoot
|
|
UIDropDownMenu_AddButton(info,UIDROPDOWNMENU_MENU_LEVEL)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function pfUI.loot.ClearRolls()
|
|
wipe(pfUI.loot.rollers)
|
|
wipe(pfUI.loot.rollers_sorted)
|
|
pfUI.loot.monitorRolling = nil
|
|
UIDropDownMenu_Refresh(GroupLootDropDown)
|
|
end
|
|
|
|
function pfUI.loot.CallTieRoll(rollers)
|
|
if type(rollers) ~= "table" then return end
|
|
local highroll
|
|
local ties = {}
|
|
local num_rollers = table.getn(rollers)
|
|
for i=1,num_rollers do
|
|
if rollers[i].value ~= "disabled" then
|
|
if highroll == nil then
|
|
highroll = rollers[i].roll
|
|
table.insert(ties,rollers[i])
|
|
elseif rollers[i].roll == highroll then
|
|
table.insert(ties,rollers[i])
|
|
end
|
|
end
|
|
end
|
|
local num_ties = table.getn(ties)
|
|
if num_ties > 1 then
|
|
local names = ""
|
|
for i=1, num_ties do
|
|
names = i==1 and (names..ties[i].who) or (names..", "..ties[i].who)
|
|
end
|
|
pfUI.loot:ClearRolls()
|
|
SendChatMessageWide(names.." "..T["Reroll"])
|
|
pfUI.loot:RegisterEvent("CHAT_MSG_SYSTEM")
|
|
pfUI.loot.monitorRolling = true
|
|
end
|
|
UIDropDownMenu_Refresh(GroupLootDropDown)
|
|
end
|
|
|
|
function pfUI.loot:BuildSpecialRollsMenu(level)
|
|
local slot = pfUI.loot.selectedSlot or 0
|
|
if level == 1 then
|
|
info = wipe(info)
|
|
info.text = T["Random"]
|
|
info.textR = NORMAL_FONT_COLOR.r
|
|
info.textG = NORMAL_FONT_COLOR.g
|
|
info.textB = NORMAL_FONT_COLOR.b
|
|
info.value = "PFRANDOM"
|
|
info.textHeight = 12
|
|
info.notCheckable = 1
|
|
info.arg1 = pfUI.loot.randoms
|
|
info.func = pfUI.loot.RaidRoll
|
|
UIDropDownMenu_AddButton(info)
|
|
|
|
info = wipe(info)
|
|
info.text = T["Request Rolls"]
|
|
info.textR = NORMAL_FONT_COLOR.r
|
|
info.textG = NORMAL_FONT_COLOR.g
|
|
info.textB = NORMAL_FONT_COLOR.b
|
|
info.value = "PFROLLS"
|
|
info.textHeight = 12
|
|
info.hasArrow = 1
|
|
info.notCheckable = 1
|
|
info.func = pfUI.loot.RequestRolls
|
|
UIDropDownMenu_AddButton(info)
|
|
elseif level == 2 then
|
|
if UIDROPDOWNMENU_MENU_VALUE == "PFROLLS" then
|
|
info = wipe(info)
|
|
info.text = T["Clear Rolls"]
|
|
info.textR = NORMAL_FONT_COLOR.r
|
|
info.textG = NORMAL_FONT_COLOR.g
|
|
info.textB = NORMAL_FONT_COLOR.b
|
|
info.value = "PFCLEARROLLS"
|
|
info.notCheckable = 1
|
|
info.func = pfUI.loot.ClearRolls
|
|
UIDropDownMenu_AddButton(info,UIDROPDOWNMENU_MENU_LEVEL)
|
|
|
|
info = wipe(info)
|
|
info.text = T["Reroll Ties"]
|
|
info.textR = NORMAL_FONT_COLOR.r
|
|
info.textG = NORMAL_FONT_COLOR.g
|
|
info.textB = NORMAL_FONT_COLOR.b
|
|
info.value = "PFTIEROLL"
|
|
info.notCheckable = 1
|
|
info.arg1 = pfUI.loot.rollers_sorted
|
|
info.func = pfUI.loot.CallTieRoll
|
|
UIDropDownMenu_AddButton(info,UIDROPDOWNMENU_MENU_LEVEL)
|
|
for _,roller in ipairs(pfUI.loot.rollers_sorted) do
|
|
info = wipe(info)
|
|
info.text = string.format("%02d - %s",roller.roll,roller.who)
|
|
info.textHeight = 12
|
|
if roller.value == "disabled" then
|
|
info.disabled = 1
|
|
info.value = "disabled"
|
|
else
|
|
info.value = roller.value
|
|
info.func = GroupLootDropDown_GiveLoot
|
|
end
|
|
info.notCheckable = 1
|
|
UIDropDownMenu_AddButton(info,UIDROPDOWNMENU_MENU_LEVEL)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function pfUI.loot:BuildRaidMenu(level)
|
|
local slot = pfUI.loot.selectedSlot or 0
|
|
local index_to_name = wipe(pfUI.loot.index_to_name)
|
|
local name_to_index = wipe(pfUI.loot.name_to_index)
|
|
local classes_in_raid = wipe(pfUI.loot.classes_in_raid) -- [global class]=localized class for display
|
|
local players_in_class = wipe(pfUI.loot.players_in_class)
|
|
local randoms = wipe(pfUI.loot.randoms)
|
|
pfUI.loot.my_index = false
|
|
pfUI.loot.disenchanter_index = false
|
|
pfUI.loot.banker_index = false
|
|
local disenchantLooter = pfUI.loot.disenchantLooter or ""
|
|
local bankLooter = pfUI.loot.bankLooter or ""
|
|
for i = 1, MAX_RAID_MEMBERS do -- masterlootcandidate index does not correspond with unit id index
|
|
local candidate = GetMasterLootCandidate(i)
|
|
if (candidate) then
|
|
index_to_name[i] = candidate
|
|
name_to_index[candidate] = i
|
|
randoms[table.getn(randoms)+1]=i
|
|
if candidate == pfUI.loot.me then
|
|
pfUI.loot.my_index = i
|
|
end
|
|
if candidate == disenchantLooter then
|
|
pfUI.loot.disenchanter_index = i
|
|
end
|
|
if candidate == bankLooter then
|
|
pfUI.loot.banker_index = i
|
|
end
|
|
local unit = GroupInfoByName(candidate,"raid")
|
|
classes_in_raid[unit.class] = unit.lclass
|
|
if players_in_class[unit.class] == nil then players_in_class[unit.class] = {} end
|
|
table.insert(players_in_class[unit.class],candidate)
|
|
end
|
|
end
|
|
if level == 1 then -- classes
|
|
info = wipe(info)
|
|
info.text = GIVE_LOOT
|
|
info.textHeight = 12
|
|
info.notCheckable = 1
|
|
info.isTitle = 1
|
|
UIDropDownMenu_AddButton(info)
|
|
pfUI.loot:BuildSpecialRollsMenu(UIDROPDOWNMENU_MENU_LEVEL)
|
|
pfUI.loot:BuildSpecialRecipientsMenu(UIDROPDOWNMENU_MENU_LEVEL)
|
|
for order, class in ipairs(CLASS_SORT_ORDER) do
|
|
local lclass = classes_in_raid[class]
|
|
if (lclass) then
|
|
info = wipe(info)
|
|
info.text = lclass
|
|
info.textR = RAID_CLASS_COLORS[class].r
|
|
info.textG = RAID_CLASS_COLORS[class].g
|
|
info.textB = RAID_CLASS_COLORS[class].b
|
|
info.textHeight = 12
|
|
info.hasArrow = 1
|
|
info.notCheckable = 1
|
|
info.value = class
|
|
info.func = nil
|
|
UIDropDownMenu_AddButton(info)
|
|
end
|
|
end
|
|
elseif level == 2 then -- players
|
|
pfUI.loot:BuildSpecialRollsMenu(UIDROPDOWNMENU_MENU_LEVEL)
|
|
pfUI.loot:BuildSpecialRecipientsMenu(UIDROPDOWNMENU_MENU_LEVEL)
|
|
local players = players_in_class[UIDROPDOWNMENU_MENU_VALUE]
|
|
if (players) and next(players) then
|
|
table.sort(players)
|
|
for _, candidate in ipairs(players) do
|
|
info = wipe(info)
|
|
info.text = candidate
|
|
info.textR = RAID_CLASS_COLORS[UIDROPDOWNMENU_MENU_VALUE].r
|
|
info.textG = RAID_CLASS_COLORS[UIDROPDOWNMENU_MENU_VALUE].g
|
|
info.textB = RAID_CLASS_COLORS[UIDROPDOWNMENU_MENU_VALUE].b
|
|
info.textHeight = 12
|
|
info.value = name_to_index[candidate]
|
|
info.func = GroupLootDropDown_GiveLoot
|
|
UIDropDownMenu_AddButton(info,UIDROPDOWNMENU_MENU_LEVEL)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function pfUI.loot:BuildPartyMenu(level)
|
|
local slot = pfUI.loot.selectedSlot or 0
|
|
if level == 1 then
|
|
for i=1, MAX_PARTY_MEMBERS+1, 1 do
|
|
local candidate = GetMasterLootCandidate(i)
|
|
if (candidate) then
|
|
info = wipe(info)
|
|
local unit = GroupInfoByName(candidate,"party")
|
|
info.text = candidate
|
|
info.textR = RAID_CLASS_COLORS[unit.class].r
|
|
info.textG = RAID_CLASS_COLORS[unit.class].g
|
|
info.textB = RAID_CLASS_COLORS[unit.class].b
|
|
info.textHeight = 12
|
|
info.value = i
|
|
info.func = GroupLootDropDown_GiveLoot
|
|
UIDropDownMenu_AddButton(info)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function pfUI.loot:InitGroupDropDown()
|
|
local inRaid = UnitInRaid("player")
|
|
if UIDROPDOWNMENU_MENU_LEVEL == 1 then
|
|
if ( inRaid ) then
|
|
pfUI.loot:BuildRaidMenu(UIDROPDOWNMENU_MENU_LEVEL)
|
|
else
|
|
pfUI.loot:BuildPartyMenu(UIDROPDOWNMENU_MENU_LEVEL)
|
|
end
|
|
elseif UIDROPDOWNMENU_MENU_LEVEL == 2 and (inRaid) then
|
|
pfUI.loot:BuildRaidMenu(UIDROPDOWNMENU_MENU_LEVEL)
|
|
end
|
|
end
|
|
|
|
function pfUI.loot:AddMasterLootMenus()
|
|
for index,value in ipairs(UnitPopupMenus["SELF"]) do
|
|
if value == "LOOT_PROMOTE" then
|
|
table.insert(UnitPopupMenus["SELF"],index+1,"PF_BANKLOOTER")
|
|
table.insert(UnitPopupMenus["SELF"],index+1,"PF_DISENCHANTLOOTER")
|
|
end
|
|
end
|
|
for index,value in ipairs(UnitPopupMenus["PARTY"]) do
|
|
if value == "LOOT_PROMOTE" then
|
|
table.insert(UnitPopupMenus["PARTY"],index+1,"PF_BANKLOOTER")
|
|
table.insert(UnitPopupMenus["PARTY"],index+1,"PF_DISENCHANTLOOTER")
|
|
end
|
|
end
|
|
for index,value in ipairs(UnitPopupMenus["PLAYER"]) do
|
|
if value == "RAID_TARGET_ICON" then
|
|
table.insert(UnitPopupMenus["PLAYER"],index+1,"PF_BANKLOOTER")
|
|
table.insert(UnitPopupMenus["PLAYER"],index+1,"PF_DISENCHANTLOOTER")
|
|
end
|
|
end
|
|
for index,value in ipairs(UnitPopupMenus["RAID"]) do
|
|
if value == "RAID_REMOVE" then
|
|
table.insert(UnitPopupMenus["RAID"],index+1,"PF_BANKLOOTER")
|
|
table.insert(UnitPopupMenus["RAID"],index+1,"PF_DISENCHANTLOOTER")
|
|
end
|
|
end
|
|
end
|
|
|
|
function pfUI.loot:RemoveMasterlootMenus()
|
|
for index = table.getn(UnitPopupMenus["SELF"]),1,-1 do
|
|
if UnitPopupMenus["SELF"][index] == "PF_BANKLOOTER" or UnitPopupMenus["SELF"][index] == "PF_DISENCHANTLOOTER" then
|
|
table.remove(UnitPopupMenus["SELF"],index,value)
|
|
end
|
|
end
|
|
for index = table.getn(UnitPopupMenus["PARTY"]),1,-1 do
|
|
if UnitPopupMenus["PARTY"][index] == "PF_BANKLOOTER" or UnitPopupMenus["PARTY"][index] == "PF_DISENCHANTLOOTER" then
|
|
table.remove(UnitPopupMenus["PARTY"],index,value)
|
|
end
|
|
end
|
|
for index = table.getn(UnitPopupMenus["PLAYER"]),1,-1 do
|
|
if UnitPopupMenus["PLAYER"][index] == "PF_BANKLOOTER" or UnitPopupMenus["PLAYER"][index] == "PF_DISENCHANTLOOTER" then
|
|
table.remove(UnitPopupMenus["PLAYER"],index,value)
|
|
end
|
|
end
|
|
for index = table.getn(UnitPopupMenus["RAID"]),1,-1 do
|
|
if UnitPopupMenus["RAID"][index] == "PF_BANKLOOTER" or UnitPopupMenus["RAID"][index] == "PF_DISENCHANTLOOTER" then
|
|
table.remove(UnitPopupMenus["RAID"],index,value)
|
|
end
|
|
end
|
|
end
|
|
|
|
if C.loot.advancedloot == "1" then
|
|
UIDropDownMenu_Initialize(GroupLootDropDown, pfUI.loot.InitGroupDropDown, "MENU")
|
|
for button, data in pairs(pfUI.loot.unitbuttons) do
|
|
UnitPopupButtons[button] = { text = data[1], dist = 0}
|
|
end
|
|
pfUI.loot:RemoveMasterlootMenus() -- remove then add to ensure no duplicate menus
|
|
pfUI.loot:AddMasterLootMenus()
|
|
hooksecurefunc("UnitPopup_OnClick",function()
|
|
local dropdownFrame = _G[UIDROPDOWNMENU_INIT_MENU]
|
|
if not dropdownFrame then return end
|
|
local button = this.value
|
|
local unit = dropdownFrame.unit
|
|
local name = dropdownFrame.name
|
|
if button and pfUI.loot.unitbuttons[button] then
|
|
if name then
|
|
-- resolves to pfUI.loot.bankLooter|disenchantLooter = name
|
|
pfUI.loot[pfUI.loot.unitbuttons[button][2]] = name
|
|
end
|
|
end
|
|
end)
|
|
hooksecurefunc("UnitPopup_HideButtons",function()
|
|
local dropdownFrame = _G[UIDROPDOWNMENU_INIT_MENU]
|
|
local unit = dropdownFrame.unit
|
|
local name = dropdownFrame.name
|
|
for index,value in pairs(UnitPopupMenus[dropdownFrame.which]) do
|
|
if pfUI.loot.unitbuttons[value] then
|
|
local method, lootmasterID = GetLootMethod()
|
|
if not ((method == "master" and lootmasterID == 0) or IsRaidLeader()) then
|
|
UnitPopupShown[index] = 0
|
|
end
|
|
if (unit) and UnitIsPlayer(unit) and not (UnitInRaid(unit) or (UnitInParty(unit) and UnitExists("party1"))) then
|
|
UnitPopupShown[index] = 0
|
|
end
|
|
end
|
|
end
|
|
end,true)
|
|
else
|
|
pfUI.loot:RemoveMasterlootMenus()
|
|
UIDropDownMenu_Initialize(GroupLootDropDown, GroupLootDropDown_Initialize, "MENU")
|
|
end
|
|
|
|
pfUI.loot.slots = {}
|
|
function pfUI.loot:UpdateLootFrame()
|
|
if C.loot.mousecursor == "1" then
|
|
pfUI.loot:SetClampedToScreen(true)
|
|
else
|
|
pfUI.loot:SetClampedToScreen(false)
|
|
end
|
|
local maxrarity, maxwidth = 0, 0
|
|
|
|
local items = GetNumLootItems()
|
|
if(items > 0) then
|
|
local real = 0
|
|
for i=1, items do
|
|
local texture, item, quantity, quality, locked = GetLootSlotInfo(i)
|
|
if texture then real = real + 1 end
|
|
end
|
|
|
|
local slotid = 1
|
|
for id=0 ,GetNumLootItems() do
|
|
if GetLootSlotInfo(id) then
|
|
local slot = pfUI.loot.slots[slotid] or pfUI.loot:CreateSlot(slotid)
|
|
local texture, item, quantity, quality, locked = GetLootSlotInfo(id)
|
|
local color = ITEM_QUALITY_COLORS[quality]
|
|
|
|
if(LootSlotIsCoin(id)) then
|
|
item = string.gsub(string.gsub(item,"\n", ", "), ", $", "")
|
|
end
|
|
|
|
if(quantity > 1) then
|
|
slot.count:SetText(quantity)
|
|
slot.count:Show()
|
|
else
|
|
slot.count:Hide()
|
|
end
|
|
|
|
if(quality > 1) then
|
|
slot.rarity:SetVertexColor(color.r, color.g, color.b)
|
|
slot.ficon.backdrop:SetBackdropBorderColor(color.r, color.g, color.b)
|
|
slot.rarity:Show()
|
|
else
|
|
slot.ficon.backdrop:SetBackdropBorderColor(.3,.3,.3)
|
|
slot.rarity:Hide()
|
|
end
|
|
|
|
slot.quality = quality
|
|
slot.name:SetText(item)
|
|
slot.name:SetTextColor(color.r, color.g, color.b)
|
|
slot.icon:SetTexture(texture)
|
|
|
|
maxrarity = math.max(maxrarity, quality)
|
|
maxwidth = math.max(maxwidth, slot.name:GetStringWidth())
|
|
|
|
slot:SetID(id)
|
|
if slot.SetSlot then
|
|
slot:SetSlot(id)
|
|
end
|
|
|
|
slot:Enable()
|
|
slot:Show()
|
|
slotid = slotid + 1
|
|
end
|
|
|
|
for i=real+1, GetNumLootItems() do
|
|
if pfUI.loot.slots[i] then
|
|
pfUI.loot.slots[i]:Hide()
|
|
end
|
|
end
|
|
end
|
|
|
|
local color = ITEM_QUALITY_COLORS[maxrarity]
|
|
if maxrarity <= 1 then
|
|
CreateBackdrop(pfUI.loot)
|
|
CreateBackdropShadow(pfUI.loot)
|
|
else
|
|
CreateBackdrop(pfUI.loot)
|
|
CreateBackdropShadow(pfUI.loot)
|
|
pfUI.loot.backdrop:SetBackdropBorderColor(color.r, color.g, color.b, 1)
|
|
end
|
|
pfUI.loot:SetHeight(math.max((real*22)+4*C.appearance.border.default), 20)
|
|
pfUI.loot:SetWidth(maxwidth + 22 + 8*C.appearance.border.default )
|
|
end
|
|
end
|
|
|
|
local function AutoBind(arg1)
|
|
if GetNumPartyMembers() == 0 and GetNumRaidMembers() == 0 then
|
|
local dialog = StaticPopup_FindVisible("LOOT_BIND",arg1)
|
|
if dialog then
|
|
_G[dialog:GetName().."Button1"]:Click()
|
|
end
|
|
end
|
|
end
|
|
|
|
local function CloseOnClick()
|
|
local lootbind = StaticPopup_FindVisible("LOOT_BIND")
|
|
local masterloot = UIDROPDOWNMENU_INIT_MENU and (UIDROPDOWNMENU_INIT_MENU == "GroupLootDropDown")
|
|
if lootbind or masterloot then else CloseLoot() end
|
|
end
|
|
|
|
function pfUI.loot:CreateSlot(id)
|
|
local frame = CreateFrame(LOOT_BUTTON_FRAME_TYPE, 'pfLootButton'..id, pfUI.loot)
|
|
frame:RegisterForClicks('LeftButtonUp', 'RightButtonUp')
|
|
frame:SetPoint("LEFT", C.appearance.border.default*2, 0)
|
|
frame:SetPoint("RIGHT", -C.appearance.border.default*2, 0)
|
|
frame:SetHeight(22)
|
|
frame:SetPoint("TOP", pfUI.loot, "TOP", 4, (-C.appearance.border.default*2+22)-(id*22))
|
|
|
|
frame:SetScript("OnClick", function()
|
|
if ( IsControlKeyDown() ) then
|
|
DressUpItemLink(GetLootSlotLink(this:GetID()))
|
|
elseif ( IsShiftKeyDown() ) then
|
|
if ( ChatFrameEditBox:IsVisible() ) then
|
|
ChatFrameEditBox:Insert(GetLootSlotLink(this:GetID()))
|
|
end
|
|
end
|
|
|
|
StaticPopup_Hide("CONFIRM_LOOT_DISTRIBUTION")
|
|
local numItems = GetNumLootItems()
|
|
pfUI.loot.selectedLootButton = this:GetName()
|
|
pfUI.loot.selectedSlot = this:GetID()
|
|
pfUI.loot.selectedQuality = this.quality
|
|
pfUI.loot.selectedItemName = this.name:GetText()
|
|
LootFrame.selectedSlot = pfUI.loot.selectedSlot
|
|
LootFrame.selectedQuality = pfUI.loot.selectedQuality
|
|
LootFrame.selectedItemName = pfUI.loot.selectedItemName
|
|
|
|
LootSlot(this:GetID())
|
|
-- workaround for bugged disenchant / container loot on some servers
|
|
if numItems == 1 then
|
|
QueueFunction(CloseOnClick)
|
|
end
|
|
end)
|
|
|
|
frame:SetScript("OnEnter", function()
|
|
if ( LootSlotIsItem(this:GetID()) ) then
|
|
GameTooltip:SetOwner(this, "ANCHOR_RIGHT")
|
|
GameTooltip:SetLootItem(this:GetID())
|
|
CursorUpdate()
|
|
end
|
|
if this.hover then
|
|
this.hover:Show()
|
|
end
|
|
end)
|
|
|
|
frame:SetScript("OnLeave", function()
|
|
GameTooltip:Hide()
|
|
ResetCursor()
|
|
if this.hover then
|
|
this.hover:Hide()
|
|
end
|
|
end)
|
|
|
|
if C.loot.autoresize == "1" then
|
|
frame:SetScript("OnUpdate", function()
|
|
pfUI.loot:UpdateLootFrame()
|
|
end)
|
|
end
|
|
|
|
frame.ficon = CreateFrame("Frame", "pfLootButtonIcon", frame)
|
|
frame.ficon:SetHeight(frame:GetHeight() - 2*C.appearance.border.default)
|
|
frame.ficon:SetWidth(frame:GetHeight() - 2*C.appearance.border.default)
|
|
frame.ficon:ClearAllPoints()
|
|
frame.ficon:SetPoint("RIGHT", frame)
|
|
CreateBackdrop(frame.ficon)
|
|
|
|
frame.icon = frame.ficon:CreateTexture(nil, "ARTWORK")
|
|
frame.icon:SetTexCoord(.07, .93, .07, .93)
|
|
frame.icon:SetAllPoints(frame.ficon)
|
|
|
|
frame.count = frame.ficon:CreateFontString(nil, "OVERLAY")
|
|
frame.count:ClearAllPoints()
|
|
frame.count:SetJustifyH"RIGHT"
|
|
frame.count:SetPoint("BOTTOMRIGHT", frame.ficon, 2, 2)
|
|
frame.count:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
|
frame.count:SetText(1)
|
|
|
|
frame.name = frame:CreateFontString(nil, "OVERLAY")
|
|
frame.name:SetJustifyH("LEFT")
|
|
frame.name:ClearAllPoints()
|
|
frame.name:SetAllPoints(frame)
|
|
frame.name:SetNonSpaceWrap(true)
|
|
frame.name:SetFont(pfUI.font_default, C.global.font_size, "OUTLINE")
|
|
|
|
frame.rarity = frame:CreateTexture(nil, "ARTWORK")
|
|
frame.rarity:SetTexture(pfUI.media["img:bar"])
|
|
frame.rarity:SetPoint("LEFT", frame.ficon, "RIGHT", 0, 0)
|
|
frame.rarity:SetPoint("RIGHT", frame)
|
|
frame.rarity:SetAlpha(.15)
|
|
frame.rarity:SetAllPoints(frame)
|
|
|
|
frame.hover = frame:CreateTexture(nil, "ARTWORK")
|
|
frame.hover:SetTexture(pfUI.media["img:bar"])
|
|
frame.hover:SetPoint("LEFT", frame.ficon, "RIGHT", 0, 0)
|
|
frame.hover:SetPoint("RIGHT", frame)
|
|
frame.hover:SetAlpha(.15)
|
|
frame.hover:SetAllPoints(frame)
|
|
frame.hover:Hide()
|
|
|
|
pfUI.loot.slots[id] = frame
|
|
return frame
|
|
end
|
|
|
|
pfUI.loot:SetScript("OnHide", function()
|
|
StaticPopup_Hide("CONFIRM_LOOT_DISTRIBUTION")
|
|
CloseLoot()
|
|
end)
|
|
|
|
pfUI.loot:SetScript("OnEvent", function()
|
|
if event == "OPEN_MASTER_LOOT_LIST" then
|
|
ToggleDropDownMenu(1, nil, GroupLootDropDown, pfUI.loot.slots[pfUI.loot.selectedSlot], 0, 0)
|
|
end
|
|
|
|
if event == "UPDATE_MASTER_LOOT_LIST" then
|
|
UIDropDownMenu_Refresh(GroupLootDropDown)
|
|
end
|
|
|
|
if event == "LOOT_OPENED" then
|
|
ShowUIPanel(this)
|
|
|
|
if(not this:IsShown()) then
|
|
CloseLoot(not autoLoot)
|
|
end
|
|
|
|
if C.loot.mousecursor == "1" then
|
|
local x, y = GetCursorPosition()
|
|
x = x / this:GetEffectiveScale()
|
|
y = y / this:GetEffectiveScale()
|
|
|
|
this:ClearAllPoints()
|
|
this:SetPoint("TOPLEFT", nil, "BOTTOMLEFT", x-40, y+20)
|
|
end
|
|
|
|
pfUI.loot:UpdateLootFrame()
|
|
end
|
|
|
|
if event == "LOOT_SLOT_CLEARED" then
|
|
if(not this:IsShown()) then return end
|
|
pfUI.loot.slots[arg1]:Hide()
|
|
end
|
|
|
|
if event == "LOOT_CLOSED" then
|
|
StaticPopup_Hide("LOOT_BIND")
|
|
HideUIPanel(this)
|
|
if DropDownList1:IsShown() then CloseDropDownMenus() end
|
|
for _, v in pairs(this.slots) do
|
|
v:Hide()
|
|
end
|
|
end
|
|
|
|
if event == "CHAT_MSG_SYSTEM" then
|
|
-- random rolling, check for our own roll
|
|
if pfUI.loot.randomRolling ~= nil then
|
|
local who, roll, from, to = cmatch(arg1, RANDOM_ROLL_RESULT)
|
|
if (who) and who == pfUI.loot.me then
|
|
local winner = tonumber(roll)
|
|
GiveMasterLoot(pfUI.loot.selectedSlot, pfUI.loot.randoms[winner])
|
|
end
|
|
pfUI.loot.randomRolling = nil
|
|
end
|
|
-- collecting rolls from raid, discard duplicates and 'cheating'
|
|
if pfUI.loot.monitorRolling ~= nil then
|
|
local who, roll, from, to = cmatch(arg1, RANDOM_ROLL_RESULT)
|
|
if (who) and not pfUI.loot.rollers[who] then
|
|
if tonumber(from)==1 and tonumber(to)==100 then
|
|
if pfUI.loot.name_to_index[who] ~= nil then
|
|
pfUI.loot.rollers[who] = {roll=tonumber(roll),value=pfUI.loot.name_to_index[who]}
|
|
else -- not an eligible candidate for that item
|
|
pfUI.loot.rollers[who] = {roll=tonumber(roll),value="disabled"}
|
|
end
|
|
pfUI.loot.rollers_sorted[table.getn(pfUI.loot.rollers_sorted)+1]={who=who,roll=tonumber(roll),value=pfUI.loot.rollers[who].value}
|
|
end
|
|
end
|
|
table.sort(pfUI.loot.rollers_sorted,function(a,b)
|
|
return a.roll > b.roll
|
|
end)
|
|
QueueFunction(UIDropDownMenu_Refresh,GroupLootDropDown)
|
|
end
|
|
end
|
|
|
|
if C.loot.autopickup == "1" and event == "LOOT_BIND_CONFIRM" then
|
|
QueueFunction(AutoBind,arg1)
|
|
end
|
|
end)
|
|
|
|
LootFrame:UnregisterAllEvents()
|
|
table.insert(UISpecialFrames, "pfLootFrame")
|
|
|
|
function _G.GroupLootDropDown_GiveLoot()
|
|
if ( pfUI.loot.selectedQuality >= MASTER_LOOT_THREHOLD ) then
|
|
local dialog = StaticPopup_Show("CONFIRM_LOOT_DISTRIBUTION", ITEM_QUALITY_COLORS[pfUI.loot.selectedQuality].hex..pfUI.loot.selectedItemName..FONT_COLOR_CODE_CLOSE, this:GetText())
|
|
if ( dialog ) then
|
|
dialog.data = this.value
|
|
end
|
|
else
|
|
GiveMasterLoot(pfUI.loot.selectedSlot, this.value)
|
|
end
|
|
CloseDropDownMenus()
|
|
end
|
|
|
|
StaticPopupDialogs["CONFIRM_LOOT_DISTRIBUTION"].OnAccept = function(data)
|
|
GiveMasterLoot(pfUI.loot.selectedSlot, data)
|
|
end
|
|
end)
|