XPerl_CheckItems = {} XPerl_ItemResults = {["type"] = "item"} XPerl_ResistResults = {["type"] = "res", count = 0} XPerl_DurResults = {["type"] = "dur", count = 0} XPerl_RegResults = {["type"] = "reg", count = 0} XPerl_PlayerList = {} XPerl_MsgQueue = {} SelectedPlayer = nil XPerl_ActiveScan = nil ActiveScanItem = nil ActiveScanTotals = nil local ITEMLISTSIZE = 12 local PLAYERLISTSIZE = 10 -- XPerl_CheckOnLoad function XPerl_CheckOnLoad() this:RegisterEvent("CHAT_MSG_ADDON") this:RegisterEvent("RAID_ROSTER_UPDATE") XPerl_CheckListItemsScrollBar.offset = 0 XPerl_CheckListPlayersScrollBar.offset = 0 end if (not XPerl_GetClassColour) then XPerl_GetClassColour = function(class) if (class) then local color = RAID_CLASS_COLORS[class]; -- Now using the WoW class color table if (color) then return color end end return {r = 0.5, g = 0.5, b = 1} end end if (not XPerlColourTable) then local function MashXX(class) local c = RAID_CLASS_COLORS[class] XPerlColourTable[class] = string.format("|c00%02X%02X%02X", 255 * c.r, 255 * c.g, 255 * c.b) end XPerlColourTable = {} MashXX("HUNTER") MashXX("WARLOCK") MashXX("PRIEST") MashXX("PALADIN") MashXX("MAGE") MashXX("ROGUE") MashXX("DRUID") MashXX("SHAMAN") MashXX("WARRIOR") end if (not XPerl_ClassPos) then XPerl_ClassPos = function(class) if(class=="WARRIOR") then return 0, 0.25, 0, 0.25; end if(class=="MAGE") then return 0.25, 0.5, 0, 0.25; end if(class=="ROGUE") then return 0.5, 0.75, 0, 0.25; end if(class=="DRUID") then return 0.75, 1, 0, 0.25; end if(class=="HUNTER") then return 0, 0.25, 0.25, 0.5; end if(class=="SHAMAN") then return 0.25, 0.5, 0.25, 0.5; end if(class=="PRIEST") then return 0.5, 0.75, 0.25, 0.5; end if(class=="WARLOCK") then return 0.75, 1, 0.25, 0.5; end if(class=="PALADIN") then return 0, 0.25, 0.5, 0.75; end return 0.25, 0.5, 0.5, 0.75 -- Returns empty next one, so blank end end -- CTRAItemMsg local needUpdate local function CTRAItemMsg(nick, item, count) local results = XPerl_ItemResults[item] if (not results) then ChatFrame7:AddMessage("Missing results for "..item) else results.last = GetTime() tinsert(results, {name = nick, ["count"] = tonumber(count)}) needUpdate = true end end local function ProcessCTRAMessage(unitName, msg) --ChatFrame7:AddMessage(unitName..": "..msg) if (strfind(msg, "^ITM ")) then local _, _, numItems, itemName, callPerson = strfind(msg, "^ITM ([-%d]+) (.+) ([^%s]+)$") if (callPerson == UnitName("player")) then -- Maybe ignore this CTRAItemMsg(unitName, itemName, numItems) end elseif (strfind(msg, "^DUR ")) then local _, _, currDur, maxDur, brokenItems, callPerson = strfind(msg, "^DUR (%d+) (%d+) (%d+) ([^%s]+)$") if (currDur and maxDur and brokenItems) then currDur, maxDur, brokenItems = tonumber(currDur), tonumber(maxDur), tonumber(brokenItems) XPerl_DurResults[unitName] = {dur = floor((currDur/maxDur)*100+0.5), broken = brokenItems} if (callPerson == UnitName("player")) then XPerl_DurResults.count = XPerl_DurResults.count + 1 end XPerl_DurResults.last = GetTime() needUpdate = true end elseif (strfind(msg, "^RST ")) then local _, _, plrName = strfind(msg, "^RST %-1 ([^%s]+)$"); if (not plrName) then local _, _, FR, NR, FRR, SR, AR, callPerson = strfind(msg, "^RST (%d+) (%d+) (%d+) (%d+) (%d+) ([^%s]+)$") if (FR) then XPerl_ResistResults[unitName] = {fr = tonumber(FR), nr = tonumber(NR), frr = tonumber(FRR), sr = tonumber(SR), ar = tonumber(AR)} if (callPerson == UnitName("player")) then XPerl_ResistResults.count = XPerl_ResistResults.count + 1 end XPerl_ResistResults.last = GetTime() needUpdate = true end end elseif (strfind(msg, "^REA ")) then local _, _, numItems, callPerson = strfind(msg, "^REA ([^%s]+) ([^%s]+)$"); if (numItems) then XPerl_RegResults[unitName] = {count = tonumber(numItems)} if (callPerson == UnitName("player")) then XPerl_RegResults.count = XPerl_RegResults.count + 1 end XPerl_RegResults.last = GetTime() needUpdate = true end end end -- XPerl_Check_Setup function XPerl_Check_Setup() SlashCmdList["XPERLITEM"] = XPerl_ItemCheck SLASH_XPERLITEM1 = "/xpitem" SLASH_XPERLITEM2 = "/raitem" SLASH_XPERLITEM3 = "/radur" SLASH_XPERLITEM4 = "/raresist" SLASH_XPERLITEM5 = "/raresists" SLASH_XPERLITEM6 = "/rareg" SlashCmdList["RAITEM"] = nil SLASH_RAITEM1 = nil SlashCmdList["RADUR"] = nil SLASH_RADUR1 = nil SlashCmdList["RARST"] = nil SLASH_RARST1 = nil SlashCmdList["RAREG"] = nil SLASH_RAREG1 = nil if (oRA) then -- oRA2 oRA:UnRegisterShorthand("raitem") oRA:UnRegisterShorthand("rareg") oRA:UnRegisterShorthand("radur") oRA:UnRegisterShorthand("raresist") elseif (oRA_Core) then -- oRA1 oRA_Core:UnregisterShortHand("raitem") oRA_Core:UnregisterShortHand("rareg") oRA_Core:UnregisterShortHand("radur") oRA_Core:UnregisterShortHand("raresist") end if (not XPerl_Admin.ResistSort) then XPerl_Admin.ResistSort = "fr" end for k,v in ipairs(XPerl_CheckItems) do v.query = nil end XPerl_CheckTitleBarPin:SetButtonTex() XPerl_CheckTitleBarLockOpen:SetButtonTex() XPerl_CheckListPlayersTotals:SetHighlightTexture(nil) XPerl_CheckListPlayersTotals:SetScript("OnClick", nil) XPerl_Check_ItemsChanged() XPerl_Check_UpdatePlayerList() end -- XPerl_CheckOnEvent function XPerl_CheckOnEvent() if (event == "RAID_ROSTER_UPDATE") then if (not UnitInRaid("player")) then XPerl_ItemResults = {["type"] = "item"} XPerl_ResistResults = {["type"] = "res", count = 0} XPerl_DurResults = {["type"] = "dur", count = 0} XPerl_RegResults = {["type"] = "reg", count = 0} end XPerl_Check_ValidateButtons() elseif (event == "CHAT_MSG_ADDON") then if (arg1 == "CTRA" and arg3 == "RAID") then needUpdate = nil XPerl_ParseCTRA(arg4, arg2, ProcessCTRAMessage) if (needUpdate) then XPerl_Check_UpdateItemList() XPerl_Check_MakePlayerList() XPerl_Check_ShowInfo() end end elseif (event == "UNIT_INVENTORY_CHANGED" or event == "UNIT_MODEL_CHANGED") then local n = UnitName(arg1) if (XPerl_ActiveScan and XPerl_ActiveScan[n]) then XPerl_ActiveScan[n].changed = true XPerl_ActiveScan[n].offline = nil XPerl_ActiveScan[n].wrongZone = nil end end end -- XPerl_CheckOnUpdate -- Only active after a query, and only for 10 seconds local function XPerl_CheckOnUpdate() -- TODO Total Progress indication if (getn(XPerl_MsgQueue) > 0) then local Time = GetTime() local send if (not XPerl_Check.lastMsgsent) then send = true elseif (Time > XPerl_Check.lastMsgsent + 1) then send = true end if (send) then XPerl_Check.lastMsgsent = Time local count = 0 local msg = "" while (getn(XPerl_MsgQueue) > 0 and count < 4) do local sub = XPerl_MsgQueue[1] if (strlen(msg..sub) > 220) then SendAddonMessage("CTRA", msg, "RAID") break else count = count + 1 tremove(XPerl_MsgQueue, 1) if (msg == "") then msg = sub else msg = msg.."#"..sub end end end if (msg ~= "") then SendAddonMessage("CTRA", msg, "RAID") end end elseif (ActiveScanItem) then XPerl_Check_ActiveScan() else if (XPerl_Check.queryStart and GetTime() > XPerl_Check.queryStart + 5) then XPerl_Check:SetScript("OnUpdate", nil) XPerl_Check.queryStart, XPerl_Check.lastMsgsent = nil, nil XPerl_Check_ValidateButtons() end end end -- GetVLinkName local function GetVLinkName(v) local linkName if (strsub(v.link, 1, 1) == "|") then local _ _, _, linkName = strfind(v.link, "%[(.+)%]") else linkName = v.link end return linkName end -- ClearSelectedItem local function ClearSelectedItem() for k,v in ipairs(XPerl_CheckItems) do v.selected = nil end end -- TickItemByName local function TickItemByName(itemName) for k,v in ipairs(XPerl_CheckItems) do local name = GetVLinkName(v) if (name == itemName) then if (not v.fixed) then v.ticked = true end v.selected = true break end end end -- GotItem local function GotItem(link) local _,_, findItem = strfind(link, "item:(%d+):") for k,v in pairs(XPerl_CheckItems) do local _, _, item = strfind(v.link, "item:(%d+):") if (item == findItem) then return true end end end -- GotItem local function GotItemName(itemName) for k,v in pairs(XPerl_CheckItems) do local _, _, linkName = strfind(v.link, "%[(.+)%]") if (linkName == itemName) then return true end end end -- InsertItemLink local function InsertItemLink(itemLink) ClearSelectedItem() if (strsub(itemLink, 1, 1) == "|") then if (not GotItem(itemLink)) then tinsert(XPerl_CheckItems, {link = itemLink, ticked = true, selected = true}) else local _, _, linkName = strfind(itemLink, "%[(.+)%]") TickItemByName(linkName) end else if (not GotItemName(itemLink)) then tinsert(XPerl_CheckItems, {link = itemLink, ticked = true, selected = true}) else local _, _, linkName = strfind(itemLink, "%[(.+)%]") TickItemByName(linkName) end end end -- XPerl_Check_Expand() function XPerl_Check_Expand(forced) XPerl_Check:SetWidth(500) XPerl_Check:SetHeight(241) --213) XPerl_CheckList:Show() XPerl_CheckButton:Show() XPerl_Check.forcedOpen = forced XPerl_CheckTitleBarLockOpen:Show() end -- XPerl_ItemCheck function XPerl_ItemCheck(itemName) local cmd = "/raitem" if (DEFAULT_CHAT_FRAME.editBox) then local command = DEFAULT_CHAT_FRAME.editBox:GetText() if (strlower(strsub(command, 1, 6)) == "/radur") then cmd = "/radur" elseif (strlower(strsub(command, 1, 9)) == "/raresist") then cmd = "/raresist" elseif (strlower(strsub(command, 1, 6)) == "/rareg") then cmd = "/rareg" end end XPerl_Check:Show() XPerl_Check_Expand(true) if (cmd == "/raitem") then if (not itemName or itemName == "") then return end if (strsub(itemName, 1, 1) == "|") then -- TODO search for item in inventory (and LootLink) and use the link end InsertItemLink(itemName) elseif (cmd == "/radur") then ClearSelectedItem() TickItemByName("dur") elseif (cmd == "/rareg") then ClearSelectedItem() TickItemByName("reg") elseif (cmd == "/raresist") then ClearSelectedItem() TickItemByName("res") end XPerl_Check_Query() end -- XPerl_PickupContainerItem local oldPickup local PickupBag, PickupSlot local function XPerl_PickupContainerItem(bagID, slot) PickupBag, PickupSlot = bagID, slot return oldPickup(bagID, slot) end if (not oldPickup) then oldPickup = PickupContainerItem PickupContainerItem = XPerl_PickupContainerItem end -- sortItems -- Fixed entries at top, followed by last current queried, followed by rest. Alphabetical within this. local function sortItems(i1, i2) local itemName1 = GetVLinkName(i1) local itemName2 = GetVLinkName(i2) local t1, t2, f1, f2, q1, q2 if (i1.fixed) then f1 = "0" else f1 = "1" end if (i2.fixed) then f2 = "0" else f2 = "1" end if (i1.ticked) then t1 = "0" else t1 = "1" end if (i2.ticked) then t2 = "0" else t2 = "1" end if (i1.query) then q1 = "0" else q1 = "1" end if (i2.query) then q2 = "0" else q2 = "1" end return f1..q1..t1..itemName1 < f2..q2..t2..itemName2 end -- ItemsChanged function XPerl_Check_ItemsChanged() -- Validate. Make sure we have our fixed entries local dur, reg, res for k,v in ipairs(XPerl_CheckItems) do if (v.link == "res") then res = true elseif (v.link == "dur") then dur = true elseif (v.link == "reg") then reg = true end end if (not dur) then tinsert(XPerl_CheckItems, {fixed = true, link = "dur"}) end if (not res) then tinsert(XPerl_CheckItems, {fixed = true, link = "res"}) end if (not reg) then tinsert(XPerl_CheckItems, {fixed = true, link = "reg"}) end sort(XPerl_CheckItems, sortItems) XPerl_Check_UpdateItemList() XPerl_Check_ValidateButtons() end -- GetSelectedResults local function GetSelectedItem() for k,v in ipairs(XPerl_CheckItems) do if (v.selected) then if (v.fixed) then if (v.link == "res") then return XPerl_ResistResults, "res" elseif (v.link == "dur") then return XPerl_DurResults, "dur" elseif (v.link == "reg") then return XPerl_RegResults, "reg" end else local linkName = GetVLinkName(v) if (linkName) then return XPerl_ItemResults[linkName], "item" end break end end end end -- GetSelectedItemLink local function GetSelectedItemLink() local link for k,v in ipairs(XPerl_CheckItems) do if (v.selected) then return v.link end end end -- GetCursorItem local function GetCursorItemLink() local id = this:GetID() + XPerl_CheckListItemsScrollBar.offset local item = XPerl_CheckItems[id] if (item and not item.fixed) then return item.link end return "" end -- SelectClickedTickItem local function SelectClickedTickItem() local oldSelection for k,v in ipairs(XPerl_CheckItems) do if (v.selected) then oldSelection = v v.selected = nil end end local id if (this:GetFrameType() == "CheckButton") then id = this:GetParent():GetID() else id = this:GetID() end if (id and id > 0) then id = id + XPerl_CheckListItemsScrollBar.offset local item = XPerl_CheckItems[id] if (item) then item.selected = true end if (oldSelection ~= item) then XPerl_Check_StopActiveScan() XPerl_ActiveScan = nil ActiveScanTotals = nil end XPerl_Check_UpdateItemList() XPerl_Check_MakePlayerList() XPerl_Check_ShowInfo() end end -- XPerl_Check_TickAll function XPerl_Check_TickAll(all) for k,v in ipairs(XPerl_CheckItems) do if (not v.fixed) then v.ticked = all end end XPerl_Check_ItemsChanged() end -- XPerl_Check_TickLastResults function XPerl_Check_TickLastResults() for k,v in ipairs(XPerl_CheckItems) do if (not v.fixed) then v.ticked = nil local linkName = GetVLinkName(v) if (linkName) then if (XPerl_ItemResults[linkName]) then v.ticked = true end end end end XPerl_Check_ItemsChanged() end -- XPerl_Check_OnClickItem function XPerl_Check_OnClickItem(button) if (button == "LeftButton") then if (IsShiftKeyDown()) then if (ChatFrameEditBox:IsVisible()) then ChatFrameEditBox:Insert(GetCursorItemLink()) end elseif (IsControlKeyDown()) then DressUpItemLink(GetCursorItemLink()) else if (CursorHasItem()) then ClearCursor() if (PickupBag and PickupSlot) then local itemLink = GetContainerItemLink(PickupBag, PickupSlot) if (itemLink) then InsertItemLink(itemLink) XPerl_Check_ItemsChanged() end end end XPerl_CheckListPlayersScrollBarScrollBar:SetValue(0) SetPortraitTexture(XPerl_CheckButtonPlayerPortrait, "raidx") SelectedPlayer = nil SelectClickedTickItem(true) XPerl_Check_ValidateButtons() end end end local reagentClasses = { PRIEST = true, MAGE = true, DRUID = true, WARLOCK = true, PALADIN = true, SHAMAN = true } -- GetOnlineMembers local function GetOnlineMembers() local count = 0 local reagentCount = 0 for i = 1,GetNumRaidMembers() do if (UnitIsConnected("raid"..i)) then local _, class = UnitClass("raid"..i) if (reagentClasses[class]) then reagentCount = reagentCount + 1 end if (XPerl_Roster) then local stats = XPerl_Roster[UnitName("raid"..i)] if (stats) then if (stats.version) then count = count + 1 end end else count = count + 1 end end end return count, reagentCount end -- SmoothColour local function SmoothColour(percentage) local r, g if (percentage < 0.5) then g = 2*percentage r = 1 else g = 1 r = 2*(1 - percentage) end if (r < 0) then r = 0 elseif (r > 1) then r = 1 end if (g < 0) then g = 0 elseif (g > 1) then g = 1 end return r, g, 0 end -- SmoothBarColor local function SmoothGuageColor(bar, percentage) local r, g, b = SmoothColour(percentage) bar:SetVertexColor(r, g, b, 0.75) end -- XPerl_Check_UpdateItemList function XPerl_Check_UpdateItemList() local onlineCount, reagentCount = GetOnlineMembers() local index = 1 local i = 0 for k,v in ipairs(XPerl_CheckItems) do if (index > ITEMLISTSIZE) then break end if (i >= XPerl_CheckListItemsScrollBar.offset) then local frame = getglobal("XPerl_CheckListItems"..index) local nameFrame = getglobal("XPerl_CheckListItems"..index.."Name") local countFrame = getglobal("XPerl_CheckListItems"..index.."Count") local iconFrame = getglobal("XPerl_CheckListItems"..index.."Icon") local gaugeFrame = getglobal("XPerl_CheckListItems"..index.."Gauge") local tickFrame = getglobal("XPerl_CheckListItems"..index.."Tick") frame:Show() if (v.selected) then frame:LockHighlight() else frame:UnlockHighlight() end if (v.fixed) then tickFrame:Hide() iconFrame:Hide() local div if (v.link == "res") then nameFrame:SetText(RESISTANCE_LABEL) countFrame:SetText(XPerl_ResistResults.count) div = XPerl_ResistResults.count / onlineCount elseif (v.link == "dur") then local dur,c = string.gsub(DURABILITY_TEMPLATE, " %%d / %%d", "") if (not dur or c ~= 1) then dur = "Durability" end nameFrame:SetText(dur) countFrame:SetText(XPerl_DurResults.count) div = XPerl_DurResults.count / onlineCount elseif (v.link == "reg") then local reg,c = string.gsub(SPELL_REAGENTS, ": ", "") if (not reg or c ~= 1) then reg = "Reagents" end nameFrame:SetText(reg) countFrame:SetText(XPerl_RegResults.count) div = XPerl_RegResults.count / reagentCount end nameFrame:SetTextColor(1, 1, 0.7) if (div > 0) then if (div > 1) then div = 1 end gaugeFrame:SetWidth((countFrame:GetLeft() - nameFrame:GetLeft()) * div) gaugeFrame:Show() SmoothGuageColor(gaugeFrame, div) else gaugeFrame:Hide() end else tickFrame:Show() tickFrame:SetChecked(v.ticked) nameFrame:SetText(v.link) local _,_, itemId = strfind(v.link, "item:(%d+):"); if (itemId) then local itemName, itemString, itemQuality, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, itemTexture = GetItemInfo(itemId) iconFrame:SetTexture(itemTexture) iconFrame:Show() else iconFrame:Hide() end local linkName = GetVLinkName(v) if (linkName) then local count = "" local result = XPerl_ItemResults[linkName] if (result) then count = getn(result) local div = count / onlineCount if (v.query and div > 0) then if (div > 1) then div = 1 end gaugeFrame:SetWidth((countFrame:GetLeft() - nameFrame:GetLeft()) * div) gaugeFrame:Show() SmoothGuageColor(gaugeFrame, div) else gaugeFrame:Hide() end else gaugeFrame:Hide() end countFrame:SetText(count) else gaugeFrame:Hide() end end index = index + 1 end i = i + 1 end for i = index,ITEMLISTSIZE do getglobal("XPerl_CheckListItems"..i):Hide() end if (FauxScrollFrame_Update(XPerl_CheckListItemsScrollBar, getn(XPerl_CheckItems), ITEMLISTSIZE, 1)) then XPerl_CheckListItemsScrollBar:Show() else XPerl_CheckListItemsScrollBar:Hide() end end -- SortPlayersByCount local function SortPlayersByCount(p1, p2) local c1, c2 if (p1.broken) then if (p1.connected and not p1.noCTRA) then c1 = p1.broken + (1 - (p1.dur / 100)) else c1 = -1 end if (p2.connected and not p2.noCTRA) then c2 = p2.broken + (1 - (p2.dur / 100)) else c2 = -1 end else if (p1.connected and not p1.noCTRA) then c1 = p1.count else c1 = -1 end if (p2.connected and not p2.noCTRA) then c2 = p2.count else c2 = -1 end end return c1 > c2 end -- SortPlayersByName local function SortPlayersByName(p1, p2) return p1.name < p2.name end -- SortPlayersByClass local function SortPlayersByClass(p1, p2) return p1.class..p1.name < p2.class..p2.name end --local EquipedSortOrder = {untested = 0, notequipped = 1, equipped = 2, notinzone = 3, offline = 4} local function ScanOrder(p) local s = XPerl_ActiveScan[p.name] if (s) then if (s.notequipped) then return 1 elseif (s.equipped and s.changed) then return 2 elseif (s.equipped) then return 3 elseif (s.notinzone) then return 4 elseif (s.offline) then return 5 end end return 0 end -- SortPlayersByDur local function SortPlayersByDur(p1, p2) if (p1.dur) then local o1, o2 = 0,0 if (not p1.connected or p1.noCTRA) then o1 = 1000 end if (not p2.connected or p2.noCTRA) then o2 = 1000 end return p1.dur + o1 < p2.dur + o2 else if (XPerl_ActiveScan) then return ScanOrder(p1)..p1.class..p1.name < ScanOrder(p2)..p2.class..p2.name else return SortPlayersByCount(p1, p2) end end end -- SortPlayersByResist local function SortPlayersByResist(p1, p2) local o1, o2 = 0,0 if (not p1.connected or p1.noCTRA) then o1 = 1000 end if (not p2.connected or p2.noCTRA) then o2 = 1000 end return p1[XPerl_Admin.ResistSort] - o1 > p2[XPerl_Admin.ResistSort] - o2 end -- XPerl_Check_MakePlayerList function XPerl_Check_MakePlayerList() FauxScrollFrame_SetOffset(XPerl_CheckListPlayersScrollBar, 0) local function ShowResists(show) if (show) then XPerl_CheckListPlayersTitleFR:Show() XPerl_CheckListPlayersTitleFRR:Show() XPerl_CheckListPlayersTitleNR:Show() XPerl_CheckListPlayersTitleSR:Show() XPerl_CheckListPlayersTitleAR:Show() XPerl_CheckListPlayersTotalsFR:Show() XPerl_CheckListPlayersTotalsFRR:Show() XPerl_CheckListPlayersTotalsNR:Show() XPerl_CheckListPlayersTotalsSR:Show() XPerl_CheckListPlayersTotalsAR:Show() else XPerl_CheckListPlayersTitleFR:Hide() XPerl_CheckListPlayersTitleFRR:Hide() XPerl_CheckListPlayersTitleNR:Hide() XPerl_CheckListPlayersTitleSR:Hide() XPerl_CheckListPlayersTitleAR:Hide() XPerl_CheckListPlayersTotalsFR:Hide() XPerl_CheckListPlayersTotalsFRR:Hide() XPerl_CheckListPlayersTotalsNR:Hide() XPerl_CheckListPlayersTotalsSR:Hide() XPerl_CheckListPlayersTotalsAR:Hide() end end local function ShowCount(show) if (show) then XPerl_CheckListPlayersTitleCount:Show() XPerl_CheckListPlayersTotalsCount:Show() else XPerl_CheckListPlayersTitleCount:Hide() XPerl_CheckListPlayersTotalsCount:Hide() end end local function ShowDur(show) if (show) then XPerl_CheckListPlayersTitleDur:Show() XPerl_CheckListPlayersTotalsNR:Show() else XPerl_CheckListPlayersTitleDur:Hide() XPerl_CheckListPlayersTotalsNR:Hide() end end XPerl_PlayerList = {} local results, resType = GetSelectedItem() if (results and results.last) then XPerl_CheckListPlayersTitleClass:Show() XPerl_CheckListPlayersTitleName:Show() XPerl_CheckListPlayersTotalsName:Show() if (resType == "item" or resType == "reg") then XPerl_CheckListPlayersTotalsName:SetText(XPERL_CHECK_TOTALS) XPerl_CheckListPlayersTitleCount:SetText("#") ShowCount(true) ShowResists(false) ShowDur(XPerl_ActiveScan) if (XPerl_ActiveScan) then XPerl_CheckListPlayersTitleDur:SetText(XPERL_CHECK_EQUIPED) end elseif (resType == "dur") then XPerl_CheckListPlayersTotalsName:SetText(XPERL_CHECK_AVERAGE) ShowResists(false) ShowCount(true) ShowDur(true) XPerl_CheckListPlayersTitleCount:SetText(XPERL_CHECK_BROKEN) XPerl_CheckListPlayersTitleDur:SetText("%") elseif (resType == "res") then XPerl_CheckListPlayersTotalsName:SetText(XPERL_CHECK_AVERAGE) ShowCount(false) ShowDur(false) ShowResists(true) end for i = 1,GetNumRaidMembers() do local name = UnitName("raid"..i) local _, class = UnitClass("raid"..i) local count = 0 local noCTRA if (XPerl_Roster) then local stats = XPerl_Roster[name] if (stats) then if (not stats.version) then noCTRA = true end end end if (resType == "item") then for k,v in ipairs(results) do if (v.name == name) then -- type(v) == "table" and count = v.count if (count > 0) then noCTRA = nil end break end end tinsert(XPerl_PlayerList, {["name"] = name, unit = "raid"..i, ["count"] = count, ["class"] = class, connected = (UnitIsConnected("raid"..i) == 1), ["noCTRA"] = noCTRA}) elseif (resType == "reg") then if (reagentClasses[class] or results[name]) then local p = results[name] local reg = 0 if (p) then reg = p.count if (reg > 0) then noCTRA = nil end end tinsert(XPerl_PlayerList, {["name"] = name, unit = "raid"..i, ["count"] = reg, ["class"] = class, connected = (UnitIsConnected("raid"..i) == 1), ["noCTRA"] = noCTRA}) end elseif (resType == "res") then local p = results[name] local fr, frr, nr, sr, ar = 0, 0, 0, 0, 0 if (p) then fr, frr, nr, sr, ar = p.fr, p.frr, p.nr, p.sr, p.ar if (fr + frr + nr + sr + ar > 0) then noCTRA = nil end end tinsert(XPerl_PlayerList, {["name"] = name, unit = "raid"..i, ["fr"] = fr, ["frr"] = frr, ["nr"] = nr, ["sr"] = sr, ["ar"] = ar, ["class"] = class, connected = (UnitIsConnected("raid"..i) == 1), ["noCTRA"] = noCTRA}) elseif (resType == "dur") then local p = results[name] local dur, broken = 0, 0 if (p) then dur, broken = p.dur, p.broken if (dur + broken > 0) then noCTRA = nil end end tinsert(XPerl_PlayerList, {["name"] = name, unit = "raid"..i, ["dur"] = dur, ["broken"] = broken, ["class"] = class, connected = (UnitIsConnected("raid"..i) == 1), ["noCTRA"] = noCTRA}) end end if (resType == "item" or resType == "reg") then sort(XPerl_PlayerList, SortPlayersByCount) elseif (resType == "dur") then sort(XPerl_PlayerList, SortPlayersByDur) elseif (resType == "res") then sort(XPerl_PlayerList, SortPlayersByResist) end else XPerl_CheckListPlayersTitleClass:Hide() XPerl_CheckListPlayersTitleName:Hide() XPerl_CheckListPlayersTotalsName:Hide() ShowCount(false) ShowDur(false) ShowResists(false) end XPerl_Check_UpdatePlayerList() end -- XPerl_Check_UpdatePlayerList function XPerl_Check_UpdatePlayerList() local onlineCount, tFR, tFRR, tNR, tSR, tAR, tDur, tBroken, tCount = 0, 0, 0, 0, 0, 0, 0, 0, 0 local results, resType = GetSelectedItem() local index = 1 for i = 1,getn(XPerl_PlayerList) do -- + XPerl_CheckListPlayersScrollBar.offset, PLAYERLISTSIZE + XPerl_CheckListPlayersScrollBar.offset do local v = XPerl_PlayerList[i] if (not v) then break end if (v.fr) then tFR = tFR + v.fr tFRR = tFRR + v.frr tNR = tNR + v.nr tSR = tSR + v.sr tAR = tAR + v.ar elseif (v.dur) then tDur = tDur + v.dur tBroken = tBroken + v.broken else tCount = tCount + v.count end if (v.connected) then onlineCount = onlineCount + 1 end if (i >= XPerl_CheckListPlayersScrollBar.offset + 1 and index <= PLAYERLISTSIZE) then local frame = getglobal("XPerl_CheckListPlayers"..index) local iconFrame = getglobal("XPerl_CheckListPlayers"..index.."Icon") local nameFrame = getglobal("XPerl_CheckListPlayers"..index.."Name") local countFrame = getglobal("XPerl_CheckListPlayers"..index.."Count") local resFrameFR = getglobal("XPerl_CheckListPlayers"..index.."FR") local resFrameFRR = getglobal("XPerl_CheckListPlayers"..index.."FRR") local resFrameNR = getglobal("XPerl_CheckListPlayers"..index.."NR") local resFrameSR = getglobal("XPerl_CheckListPlayers"..index.."SR") local resFrameAR = getglobal("XPerl_CheckListPlayers"..index.."AR") local resFrameEquiped = getglobal("XPerl_CheckListPlayers"..index.."Equiped") if (v.name == SelectedPlayer) then frame:LockHighlight() else frame:UnlockHighlight() end nameFrame:SetText(v.name) local color = XPerl_GetClassColour(v.class) nameFrame:SetTextColor(color.r, color.g, color.b) if (v.class) then local r, l, t, b = XPerl_ClassPos(v.class) iconFrame:SetTexCoord(r, l, t, b) iconFrame:Show() else iconFrame:Hide() end getglobal("XPerl_CheckListPlayers"..index):Show() local function ShowScanIcon() if (XPerl_ActiveScan) then local z = XPerl_ActiveScan[v.name] if (z) then resFrameEquiped:Show() if (z.equipped) then if (z.changed) then resFrameEquiped:SetTexture("Interface\\Buttons\\UI-CheckBox-Check-Disabled") else resFrameEquiped:SetTexture("Interface\\Buttons\\UI-CheckBox-Check") end resFrameEquiped:SetTexCoord(0, 1, 0, 1) elseif (z.offline) then resFrameEquiped:SetTexture("Interface\\CharacterFrame\\Disconnect-Icon") resFrameEquiped:SetTexCoord(0.2, 0.8, 0.2, 0.8) elseif (z.notequipped) then resFrameEquiped:SetTexture("Interface\\Addons\\XPerl_RaidAdmin\\Images\\XPerl_Check") if (z.changed) then resFrameEquiped:SetTexCoord(0.75, 0.875, 0.25, 0.5) else resFrameEquiped:SetTexCoord(0.625, 0.75, 0.25, 0.5) end elseif (z.notinzone) then resFrameEquiped:SetTexture("Interface\\GossipFrame\\TaxiGossipIcon") --resFrameEquiped:SetTexture("Interface\\WorldMap\\WorldMap-Icon") resFrameEquiped:SetTexCoord(0, 1, 0, 1) else resFrameEquiped:Hide() end else resFrameEquiped:Hide() end else resFrameEquiped:Hide() end end if (not v.connected or v.noCTRA) then if (not v.connected) then countFrame:SetText(XPERL_LOC_OFFLINE) else countFrame:SetText(XPERL_RAID_TOOLTIP_NOCTRA) end countFrame:SetTextColor(0.5, 0.5, 0.5) countFrame:Show() ShowScanIcon() resFrameFR:Hide() resFrameFRR:Hide() resFrameNR:Hide() resFrameSR:Hide() resFrameAR:Hide() else if (v.fr) then resFrameFR:SetText(v.fr) resFrameFRR:SetText(v.frr) resFrameNR:SetText(v.nr) resFrameNR:SetTextColor(0, 1, 0) resFrameSR:SetText(v.sr) resFrameAR:SetText(v.ar) resFrameFR:Show() resFrameFRR:Show() resFrameNR:Show() resFrameSR:Show() resFrameAR:Show() countFrame:Hide() resFrameEquiped:Hide() elseif (v.dur) then resFrameNR:SetText(v.dur) countFrame:SetText(v.broken) local r, g, b = SmoothColour(v.dur) resFrameNR:SetTextColor(r, g, b) countFrame:Show() resFrameNR:Show() if (v.broken > 0) then countFrame:SetTextColor(1, 0, 0) else countFrame:SetTextColor(0, 1, 0) end resFrameFR:Hide() resFrameFRR:Hide() resFrameSR:Hide() resFrameAR:Hide() resFrameEquiped:Hide() else countFrame:SetText(v.count) countFrame:Show() if (v.count == 0) then countFrame:SetTextColor(1, 0, 0) else countFrame:SetTextColor(0, 1, 0) end ShowScanIcon() resFrameFR:Hide() resFrameFRR:Hide() resFrameNR:Hide() resFrameSR:Hide() resFrameAR:Hide() end end index = index + 1 end end for i = index,PLAYERLISTSIZE do getglobal("XPerl_CheckListPlayers"..i):Hide() end if (resType == "dur") then XPerl_CheckListPlayersTotalsNR:SetText(floor(tDur / onlineCount)) XPerl_CheckListPlayersTotalsNR:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b) XPerl_CheckListPlayersTotalsCount:SetText(tBroken) local r, g, b = SmoothColour((tDur / onlineCount) / 100) XPerl_CheckListPlayersTotalsNR:SetTextColor(r, g, b) if (tBroken > 0) then XPerl_CheckListPlayersTotalsCount:SetTextColor(1, 0, 0) else XPerl_CheckListPlayersTotalsCount:SetTextColor(0, 1, 0) end elseif (resType == "res") then XPerl_CheckListPlayersTotalsFR:SetText(floor(tFR / onlineCount)) XPerl_CheckListPlayersTotalsNR:SetText(floor(tNR / onlineCount)) XPerl_CheckListPlayersTotalsNR:SetTextColor(0, 1, 0) XPerl_CheckListPlayersTotalsFRR:SetText(floor(tFRR / onlineCount)) XPerl_CheckListPlayersTotalsSR:SetText(floor(tSR / onlineCount)) XPerl_CheckListPlayersTotalsAR:SetText(floor(tAR / onlineCount)) else XPerl_CheckListPlayersTotalsCount:SetText(tCount) if (tCount == 0) then XPerl_CheckListPlayersTotalsNR:SetTextColor(1, 0, 0) else XPerl_CheckListPlayersTotalsNR:SetTextColor(0, 1, 0) end end if (FauxScrollFrame_Update(XPerl_CheckListPlayersScrollBar, getn(XPerl_PlayerList), PLAYERLISTSIZE, 1)) then XPerl_CheckListPlayersScrollBar:Show() else XPerl_CheckListPlayersScrollBar:Hide() end end -- XPerl_Check_ShowInfo function XPerl_Check_ShowInfo() if (ActiveScanTotals) then if (ActiveScanTotals.missing > 0) then XPerl_CheckButtonInfo:SetText(string.format(XPERL_CHECK_SCAN_MISSING, ActiveScanTotals.missing)) else XPerl_CheckButtonInfo:SetText("") end else local results = GetSelectedItem() local t if (results and results.last and results.last > 0) then t = SecondsToTime(GetTime() - results.last) else t = "" end if (t ~= "") then XPerl_CheckButtonInfo:SetText(string.format(XPERL_CHECK_LASTINFO, t)) else XPerl_CheckButtonInfo:SetText("") end end end -- XPerl_Check_OnEnter function XPerl_Check_OnEnter() local f, anc if (this:GetFrameType() == "CheckButton") then f = getglobal(this:GetParent():GetName().."Name") anc = this:GetParent() else f = getglobal(this:GetName().."Name") anc = this end if (f) then local link = f:GetText() if (link and strsub(link, 1, 1) == "|") then -- Have to strip excess information for the SetHyperlink call local _,_, itemId = strfind(link, "item:(%d+):"); if (itemId) then local newLink = string.format("item:%d:0:0:0", itemId) GameTooltip:SetOwner(anc, "ANCHOR_LEFT") GameTooltip:SetHyperlink(newLink) return end end end GameTooltip:SetOwner(XPerl_CheckListItems1, "ANCHOR_LEFT") GameTooltip:SetText(XPERL_CHECK_DROPITEMTIP1, HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b) GameTooltip:AddLine(XPERL_CHECK_DROPITEMTIP2, NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b, 1) GameTooltip:Show() end -- XPerl_CheckMouseWheel function XPerl_CheckMouseWheel(name, dir) local frame = getglobal("XPerl_CheckList"..name.."ScrollBarScrollBar") if (dir > 0) then frame:SetValue(frame:GetValue() - 5) else frame:SetValue(frame:GetValue() + 5) end end -- XPerl_Check_OnClickStart function XPerl_Check_OnClickTick() local id = this:GetParent():GetID() + XPerl_CheckListItemsScrollBar.offset if (XPerl_CheckItems[id]) then XPerl_CheckItems[id].ticked = this:GetChecked() end XPerl_Check_ValidateButtons() end -- XPerl_Check_DeleteSelectedItems function XPerl_Check_DeleteSelectedItems() local newList = {} for k,v in ipairs(XPerl_CheckItems) do if (v.fixed or not v.ticked) then tinsert(newList, v) else local linkName = GetVLinkName(v) if (linkName) then XPerl_ItemResults[linkName] = nil end end end XPerl_CheckItems = newList XPerl_Check_ItemsChanged() end -- XPerl_Check_Query function XPerl_Check_Query() local oldResults = XPerl_ItemResults XPerl_ItemResults = {["type"] = "item"} XPerl_CheckListItemsScrollBarScrollBar:SetValue(0) tinsert(XPerl_MsgQueue, "DURC") tinsert(XPerl_MsgQueue, "RSTC") tinsert(XPerl_MsgQueue, "REAC") XPerl_ResistResults.count = 0 XPerl_DurResults.count = 0 XPerl_RegResults.count = 0 local msg for k,v in ipairs(XPerl_CheckItems) do if (v.ticked) then v.query = true v.ticked = nil if (not v.fixed) then local linkName = GetVLinkName(v) if (linkName) then XPerl_ItemResults[linkName] = {last = 0} oldResults[linkName] = nil tinsert(XPerl_MsgQueue, "ITMC "..linkName) end end else v.query = nil end end for k,v in pairs(oldResults) do if (type(v) == "table") then if (not v.fixed) then XPerl_ItemResults[k] = v end end end XPerl_Check.queryStart = GetTime() XPerl_Check.lastMsgsent = nil XPerl_Check:SetScript("OnUpdate", XPerl_CheckOnUpdate) XPerl_Check_ItemsChanged() -- Re-sort and re-show list with ticked items at top XPerl_Check_ValidateButtons() end -- GetActiveScanItem local function GetActiveScanItem() local item = GetSelectedItemLink() local itemId if (item and strsub(item, 1, 1) == "|") then local _ _,_, itemId = strfind(item, "item:(%d+):") if (not itemId) then return end else return end local itemName, itemString, itemQuality, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, itemTexture = GetItemInfo(itemId) if (not itemEquipLoc or not itemType) then return end if (not (itemType == "Armor" or itemType == "Weapon")) then return end local slots = { INVTYPE_HEAD = 1, INVTYPE_NECK = 2, INVTYPE_SHOULDER = 3, INVTYPE_BODY = 4, INVTYPE_CHEST = 5, INVTYPE_ROBE = 5, INVTYPE_WAIST = 6, INVTYPE_LEGS = 7, INVTYPE_FEET = 8, INVTYPE_WRIST = 9, INVTYPE_HAND = 10, INVTYPE_FINGER = {11, 12}, INVTYPE_TRINKET = {13, 14}, INVTYPE_CLOAK = 15, INVTYPE_2HWEAPON = 16, INVTYPE_WEAPONMAINHAND = 16, INVTYPE_WEAPON = {16, 17}, INVTYPE_WEAPONOFFHAND = 17, INVTYPE_HOLDABLE = 17, INVTYPE_SHIELD = 17, INVTYPE_RANGED = 18, INVTYPE_RELIC = 18, INVTYPE_TABARD = 19} local slot = slots[itemEquipLoc] if (slot) then return tonumber(itemId), slot end end -- GetSelectedPlayer local function GetSelectedPlayer() if (SelectedPlayer) then for k,v in pairs(XPerl_PlayerList) do if (v.name == SelectedPlayer) then return v end end end end -- XPerl_Check_ValidateButtons function XPerl_Check_ValidateButtons() local fixedSelected, regSelected local anyTicked for k,v in ipairs(XPerl_CheckItems) do if (v.selected) then if (v.fixed) then fixedSelected = true end if (v.link == "reg") then regSelected = true end end if (not v.fixed and v.ticked) then anyTicked = true end end local results, resType = GetSelectedItem() if (anyTicked and not XPerl_Check.queryStart) then XPerl_CheckButtonDelete:Enable() else XPerl_CheckButtonDelete:Disable() end if (not XPerl_Check.queryStart and IsRaidOfficer()) then XPerl_CheckButtonQuery:Enable() else XPerl_CheckButtonQuery:Disable() end if (((results and results.last) or XPerl_ActiveScan) and UnitInRaid("player")) then XPerl_CheckButtonReport:Enable() else XPerl_CheckButtonReport:Disable() end if (results and results.last and not (fixedSelected and not regSelected) and UnitInRaid("player")) then XPerl_CheckButtonReportWith:Enable() XPerl_CheckButtonReportWithout:Enable() else XPerl_CheckButtonReportWith:Disable() XPerl_CheckButtonReportWithout:Disable() end if (ActiveScanItem) then local tex = XPerl_CheckButtonEquiped:GetNormalTexture() tex:SetTexCoord(0.75, 0.875, 0.5, 0.75) tex = XPerl_CheckButtonEquiped:GetPushedTexture() tex:SetTexCoord(0.875, 1, 0.5, 0.75) XPerl_CheckButtonEquiped.tooltipText = "XPERL_CHECK_SCANSTOP_DESC" else local tex = XPerl_CheckButtonEquiped:GetNormalTexture() tex:SetTexCoord(0.375, 0.5, 0.5, 0.75) tex = XPerl_CheckButtonEquiped:GetPushedTexture() tex:SetTexCoord(0.5, 0.625, 0.5, 0.75) XPerl_CheckButtonEquiped.tooltipText = "XPERL_CHECK_SCAN_DESC" end local myPlayer = GetSelectedPlayer() if (((results and results.last) or (XPerl_ActiveScan and XPerl_ActiveScan[SelectedPlayer])) and myPlayer and myPlayer.connected) then XPerl_CheckButtonPlayer:Enable() else XPerl_CheckButtonPlayer:Disable() end XPerl_CheckButtonEquiped:Hide() XPerl_CheckButtonEquiped:Show() if (results and not fixedSelected and GetActiveScanItem()) then XPerl_CheckButtonEquiped:Enable() else XPerl_CheckButtonEquiped:Disable() end end -- XPerl_Check_Players_Sort function XPerl_Check_Players_Sort(sortType) if (sortType == "class") then sort(XPerl_PlayerList, SortPlayersByClass) elseif (sortType == "name") then sort(XPerl_PlayerList, SortPlayersByName) elseif (sortType == "count") then sort(XPerl_PlayerList, SortPlayersByCount) elseif (sortType == "dur") then sort(XPerl_PlayerList, SortPlayersByDur) elseif (strfind("frrsrnrar", sortType)) then XPerl_Admin.ResistSort = sortType sort(XPerl_PlayerList, SortPlayersByResist) end XPerl_Check_UpdatePlayerList() end -- XPerl_Check_Report function XPerl_Check_Report(showNames) local function ReportOutput(msg) if (msg) then if (XPerlTest) then SendChatMessage(" "..msg, "WHISPER", nil, "Zek") else SendChatMessage(" "..msg, "RAID") end end end local link = GetSelectedItemLink() local msg if (link) then local myPlayer = GetSelectedPlayer() if (link == "res") then if (XPerl_ResistResults.last) then if (showNames == "player") then if (SelectedPlayer) then if (myPlayer.connected) then msg = string.format(XPERL_CHECK_REPORT_PRESISTS, SelectedPlayer, myPlayer.fr, myPlayer.nr, myPlayer.frr, myPlayer.sr, myPlayer.ar) end end else local fr, frr, nr, sr, ar, count = 0, 0, 0, 0, 0, 0 for k,v in ipairs(XPerl_PlayerList) do if (v.connected) then count = count + 1 fr = fr + v.fr frr = frr + v.frr nr = nr + v.nr sr = sr + v.sr ar = ar + v.ar end end fr = fr / count frr = frr / count nr = nr / count sr = sr / count ar = ar / count msg = string.format(XPERL_CHECK_REPORT_RESISTS, fr, nr, frr, sr, ar) end ReportOutput(msg) end elseif (link == "dur") then if (XPerl_DurResults.last) then if (showNames == "player") then if (SelectedPlayer) then if (myPlayer.connected) then msg = string.format(XPERL_CHECK_REPORT_PDURABILITY, SelectedPlayer, myPlayer.dur, myPlayer.broken) end end else local dur, broken, brokenPeople, count = 0, 0, 0, 0 for k,v in ipairs(XPerl_PlayerList) do if (v.connected) then count = count + 1 dur = dur + v.dur if (v.broken > 0) then brokenPeople = brokenPeople + 1 broken = broken + v.broken end end end dur = dur / count msg = string.format(XPERL_CHECK_REPORT_DURABILITY, dur, brokenPeople, broken) end ReportOutput(msg) end else if (showNames == "player") then if (SelectedPlayer) then if (myPlayer.connected) then if (link == "reg") then if (XPerl_RegResults.last) then msg = string.format(XPERL_CHECK_REPORT_PITEM, SelectedPlayer, myPlayer.count, XPERL_REAGENTS[myPlayer.class]) end else if (XPerl_ActiveScan and XPerl_ActiveScan[SelectedPlayer]) then if (XPerl_ActiveScan[SelectedPlayer].equipped) then msg = string.format(XPERL_CHECK_REPORT_PEQUIPED, SelectedPlayer, link) elseif (XPerl_ActiveScan[SelectedPlayer].notequipped) then msg = string.format(XPERL_CHECK_REPORT_PNOTEQUIPED, SelectedPlayer, link) end else msg = string.format(XPERL_CHECK_REPORT_PITEM, SelectedPlayer, myPlayer.count, link) end end ReportOutput(msg) end end else local equipable = "" if (strsub(link, 1, 1) == "|") then local _,_, itemId = strfind(link, "item:(%d+):") local itemName, itemString, itemQuality, itemMinLevel, itemType, itemSubType, itemStackCount, itemEquipLoc, itemTexture = GetItemInfo(itemId) if (itemEquipLoc and itemType) then if (itemType == "Armor" or itemType == "Weapon") then equipable = "_EQ" end end end local with = {} local without = {} local offline = {} local totalItems = 0 for k,v in ipairs(XPerl_PlayerList) do if (ActiveScanTotals and ActiveScanTotals.missing == 0) then local scan = XPerl_ActiveScan[v.name] if (scan.equipped) then tinsert(with, v) elseif (scan.notequipped) then tinsert(without, v) elseif (scan.offline) then tinsert(offline, v) end else if (v.connected) then if (v.count > 0) then tinsert(with, v) totalItems = totalItems + v.count elseif (not v.noCTRA) then tinsert(without, v) end else tinsert(offline, v) end end end if (ActiveScanTotals and ActiveScanTotals.missing == 0 and ActiveScanTotals.wrongZone == 0 and ActiveScanTotals.notequipped == 0) then if (ActiveScanTotals.offline == 0) then ReportOutput(string.format(XPERL_CHECK_REPORT_ALLEQUIPED, link)) else ReportOutput(string.format(XPERL_CHECK_REPORT_ALLEQUIPEDOFF, link, ActiveScanTotals.offline)) end else if (showNames) then if (link == "reg") then link,c = string.gsub(SPELL_REAGENTS, ": ", "") if (not link or c ~= 1) then link = "Reagents" end end local showList local showTitle if (showNames == "with") then if (ActiveScanTotals and ActiveScanTotals.missing == 0) then showTitle = link..XPERL_CHECK_REPORT_EQUIPED else showTitle = link..getglobal("XPERL_CHECK_REPORT_WITH"..equipable) end if (getn(with) > 0) then showList = with end elseif (showNames == "without") then if (ActiveScanTotals and ActiveScanTotals.missing == 0) then showTitle = link..XPERL_CHECK_REPORT_NOTEQUIPED else showTitle = link..getglobal("XPERL_CHECK_REPORT_WITHOUT"..equipable) end if (getn(without) > 0) then showList = without end end if (showList) then msg = showTitle local msgLocal = showTitle local first = true for k,v in ipairs(showList) do local name = XPerlColourTable[v.class]..v.name.."|r" if (strlen(msg) + strlen(name) > 240) then ReportOutput(msg.."...") DEFAULT_CHAT_FRAME:AddMessage(" "..msgLocal) msg = " ... "..v.name msgLocal = " ... "..name else if (first) then msg = msg..v.name msgLocal = msgLocal..name first = nil else msg = msg..", "..v.name msgLocal = msgLocal..", "..name end end end if (msg) then ReportOutput(msg) end if (msgLocal) then DEFAULT_CHAT_FRAME:AddMessage(" "..msgLocal) end elseif (showTitle) then DEFAULT_CHAT_FRAME:AddMessage(" "..showTitle..NONE) end else msg = link.." " local function Out(txt, num) if (num > 0) then msg = msg..string.format(txt, num) end end if (ActiveScanTotals) then -- and ActiveScanTotals.missing == 0) then Out(XPERL_CHECK_REPORT_EQUIPEDSHORT, ActiveScanTotals.equipped) Out(XPERL_CHECK_REPORT_NOTEQUIPEDSHORT, ActiveScanTotals.notequipped) Out(XPERL_CHECK_REPORT_OFFLINE, ActiveScanTotals.offline) Out(XPERL_CHECK_REPORT_NOTSCANNED, ActiveScanTotals.missing + ActiveScanTotals.wrongZone) else Out(XPERL_CHECK_REPORT_WITHSHORT, getn(with)) Out(XPERL_CHECK_REPORT_WITHOUTSHORT, getn(without)) Out(" : %d "..XPERL_LOC_OFFLINE, getn(offline)) end if (link ~= "reg") then Out(XPERL_CHECK_REPORT_TOTAL, totalItems) end ReportOutput(msg) end end end end end end -- XPerl_Check_PlayerOnClick function XPerl_Check_PlayerOnClick(button) local index = this:GetID() + XPerl_CheckListPlayersScrollBar.offset if (index < 1 or index > getn(XPerl_PlayerList)) then return end if (SelectedPlayer == XPerl_PlayerList[index].name) then SelectedPlayer = nil else SelectedPlayer = XPerl_PlayerList[index].name end XPerl_Check_UpdatePlayerList() if (button == "LeftButton") then TargetUnit(XPerl_PlayerList[index].unit) end SetPortraitTexture(XPerl_CheckButtonPlayerPortrait, XPerl_PlayerList[index].unit) XPerl_Check_ValidateButtons() --if (button == "RightButton") then -- ToggleDropDownMenu(1, nil, XPerl_CheckDropDown) --end end -- XPerl_Check_StopActiveScan function XPerl_Check_StopActiveScan() XPerl_Check:UnregisterEvent("UNIT_INVENTORY_CHANGED") XPerl_Check:UnregisterEvent("UNIT_MODEL_CHANGED") ActiveScanItem = nil end -- XPerl_Check_StartActiveScan function XPerl_Check_StartActiveScan() if (ActiveScanItem) then XPerl_Check_StopActiveScan() else local itemId, itemSlot = GetActiveScanItem() if (itemId) then XPerl_ActiveScan = {} ActiveScanItem = {id = itemId, slot = itemSlot, missing = GetNumRaidMembers()} ActiveScanTotals = {missing = 0, equipped = 0, notequipped = 0, offline = 0, wrongZone = 0} XPerl_Check:SetScript("OnUpdate", XPerl_CheckOnUpdate) XPerl_Check:RegisterEvent("UNIT_INVENTORY_CHANGED") XPerl_Check:RegisterEvent("UNIT_MODEL_CHANGED") XPerl_CheckListPlayersTitleDur:SetText(XPERL_CHECK_EQUIPED) XPerl_CheckListPlayersTitleDur:Show() end end XPerl_Check_ValidateButtons() end -- XPerl_Check_ActiveScan function XPerl_Check_ActiveScan() local function CheckSlot(unit, slot) local link = GetInventoryItemLink(unit, slot) local eq local name = UnitName(unit) if (link) then local _,_, itemId = strfind(link, "item:(%d+):") if (itemId) then itemId = tonumber(itemId) if (itemId == ActiveScanItem.id) then if (not XPerl_ActiveScan[name]) then XPerl_ActiveScan[name] = {} end XPerl_ActiveScan[name].notequipped = nil XPerl_ActiveScan[name].equipped = 1 return true end end end if (not XPerl_ActiveScan[name]) then XPerl_ActiveScan[name] = {} end XPerl_ActiveScan[name].equipped = nil XPerl_ActiveScan[name].notequipped = 1 end local myZone = GetRealZoneText() local any local update ActiveScanTotals = {missing = 0, equipped = 0, notequipped = 0, offline = 0, wrongZone = 0} for i = 1,GetNumRaidMembers() do local name, rank, subgroup, level, _, class, zone, online, isDead = GetRaidRosterInfo(i) local unit = "raid"..i local new local myScan = XPerl_ActiveScan[name] if (not myScan or myScan.changed) then if (myScan) then myScan.changed = nil end any = true if (CheckInteractDistance(unit, 1)) then -- Checks to see if in inspect range local eq if (type(ActiveScanItem.slot) == "table") then for k,v in ActiveScanItem.slot do if (CheckSlot(unit, v)) then eq = true break end end else eq = CheckSlot(unit, ActiveScanItem.slot) end if (eq) then ActiveScanTotals.equipped = ActiveScanTotals.equipped + 1 else ActiveScanTotals.notequipped = ActiveScanTotals.notequipped + 1 end update = true elseif (not UnitIsConnected(unit)) then if (not XPerl_ActiveScan[name]) then XPerl_ActiveScan[name] = {} end XPerl_ActiveScan[name].offline = 1 ActiveScanTotals.offline = ActiveScanTotals.offline + 1 update = true elseif (zone ~= myZone) then if (not XPerl_ActiveScan[name]) then XPerl_ActiveScan[name] = {} end XPerl_ActiveScan[name].notinzone = 1 ActiveScanTotals.wrongZone = ActiveScanTotals.wrongZone + 1 update = true else ActiveScanTotals.missing = ActiveScanTotals.missing + 1 end else ActiveScanTotals.missing = ActiveScanTotals.missing + (myScan.missing or 0) ActiveScanTotals.equipped = ActiveScanTotals.equipped + (myScan.equipped or 0) ActiveScanTotals.notequipped = ActiveScanTotals.notequipped + (myScan.notequipped or 0) ActiveScanTotals.offline = ActiveScanTotals.offline + (myScan.offline or 0) ActiveScanTotals.wrongZone = ActiveScanTotals.wrongZone + (myScan.notinzone or 0) end end XPerl_Check_ShowInfo() if (update) then sort(XPerl_PlayerList, SortPlayersByDur) -- It's actually by equipped, that's sorted out in sort func XPerl_Check_UpdatePlayerList() XPerl_Check_ValidateButtons() end --if (not any) then -- ActiveScanItem = nil -- XPerl_Check_ValidateButtons() --end end --[[ -- XPerl_Check_PlayerDropDown_OnLoad function XPerl_Check_PlayerDropDown_OnLoad() this.playerCheckDropDown = true; UIDropDownMenu_Initialize(this, XPerl_Check_PlayerDropDown_Initialize, "MENU"); UIDropDownMenu_SetAnchor(0, 0, this, "TOPLEFT", this:GetName(), "CENTER") end -- XPerl_Check_PlayerDropDown_Initialize function XPerl_Check_PlayerDropDown_Initialize() if ( not UIDROPDOWNMENU_OPEN_MENU or not getglobal(UIDROPDOWNMENU_OPEN_MENU).playerCheckDropDown ) then return; end --local selectedUnit = XPerl_PlayerList[SelectedPlayer] local info -- Show buffs or debuffs they are exclusive for now info = {} info.text = "Target" info.func = function() TargetUnit(selectedUnit) end UIDropDownMenu_AddButton(info) info = {} info.text = "Has Equiped Item" info.func = function() XPerl_CheckPlayerEquiped(selectedUnit) end; UIDropDownMenu_AddButton(info) end ]]