--Lua functions local _G = _G local loadstring = loadstring local pcall = pcall local print = print local select = select local tostring = tostring local type = type local find, format, match = string.find, string.format, string.match local tconcat = table.concat --WoW API / Variables local FrameStackTooltip_Toggle = FrameStackTooltip_Toggle local GetMouseFocus = GetMouseFocus local tostringall = tostringall local WorldFrame = WorldFrame local DEFAULT_CHAT_FRAME = DEFAULT_CHAT_FRAME local oldAddMessage local function printNoTimestamp(...) if oldAddMessage or DEFAULT_CHAT_FRAME.OldAddMessage then if not oldAddMessage then oldAddMessage = DEFAULT_CHAT_FRAME.OldAddMessage end if select("#", ...) > 1 then oldAddMessage(DEFAULT_CHAT_FRAME, tconcat({tostringall(...)}, ", ")) else oldAddMessage(DEFAULT_CHAT_FRAME, ...) end elseif CHAT_TIMESTAMP_FORMAT then local tsformat = CHAT_TIMESTAMP_FORMAT CHAT_TIMESTAMP_FORMAT = nil print(...) CHAT_TIMESTAMP_FORMAT = tsformat else print(...) end end local function updateCopyChat() if CopyChatFrame and CopyChatFrame:IsShown() then CopyChatFrame:Hide() ElvUI[1]:GetModule("Chat"):CopyChat(DEFAULT_CHAT_FRAME) end end local function getObject(objName) local obj if objName == "" then obj = GetMouseFocus() else obj = _G[objName] if not obj then local pass if find(objName, "^[%.:]([A-z0-9_]+)") then local _obj = GetMouseFocus() if _obj and _obj ~= WorldFrame then local res = match(objName, "^[%.:]([A-z0-9_]+)") if res and _obj[res] and _obj:GetName() then objName = format("%s%s", _obj:GetName(), objName) end pass = true end elseif find(objName, "[%.()%[%]'\"]") then pass = true end if pass then local success, ret = pcall(loadstring(format("return %s", objName))) if success then ret = ret == "string" and _G[ret] or ret if type(ret) == "table" and ret.GetName then obj = ret end end end end end if obj then return obj ~= WorldFrame and obj or nil else printNoTimestamp(format("Object |cffFFD100%s|r not found!", objName)) end end local FrameStackHighlight = CreateFrame("Frame", "FrameStackHighlight") FrameStackHighlight:SetFrameStrata("TOOLTIP") FrameStackHighlight.t = FrameStackHighlight:CreateTexture(nil, "BORDER") FrameStackHighlight.t:SetAllPoints() FrameStackHighlight.t:SetTexture(0, 1, 0, 0.5) local FrameStackHitRectHighlight = CreateFrame("Frame", "FrameStackHitRectHighlight") FrameStackHitRectHighlight:SetFrameStrata("TOOLTIP") FrameStackHitRectHighlight.t = FrameStackHitRectHighlight:CreateTexture(nil, "ARTWORK") FrameStackHitRectHighlight.t:SetAllPoints() FrameStackHitRectHighlight.t:SetTexture(0, 0, 1, 0.5) FrameStackHitRectHighlight.t:SetBlendMode("ADD") hooksecurefunc("FrameStackTooltip_Toggle", function() if not FrameStackTooltip:IsVisible() then FrameStackHighlight:Hide() FrameStackHitRectHighlight:Hide() end end) local _timeSinceLast = 0 FrameStackTooltip:HookScript("OnUpdate", function(_, elapsed) _timeSinceLast = _timeSinceLast - elapsed if _timeSinceLast <= 0 then _timeSinceLast = FRAMESTACK_UPDATE_TIME local highlightFrame = GetMouseFocus() if highlightFrame and highlightFrame ~= WorldFrame then FrameStackHighlight:ClearAllPoints() FrameStackHighlight:SetPoint("BOTTOMLEFT", highlightFrame) FrameStackHighlight:SetPoint("TOPRIGHT", highlightFrame) FrameStackHighlight:Show() local l, r, t, b = highlightFrame:GetHitRectInsets() if l ~= 0 or r ~= 0 or t ~= 0 or b ~= 0 then local scale = highlightFrame:GetEffectiveScale() FrameStackHitRectHighlight:ClearAllPoints() FrameStackHitRectHighlight:SetPoint("TOPLEFT", highlightFrame, l * scale, -t * scale) FrameStackHitRectHighlight:SetPoint("BOTTOMRIGHT", highlightFrame, -r * scale, b * scale) FrameStackHitRectHighlight:Show() else FrameStackHitRectHighlight:Hide() end else FrameStackHighlight:Hide() FrameStackHitRectHighlight:Hide() end end end) SLASH_FRAME1 = "/frame" SlashCmdList.FRAME = function(frame) frame = getObject(frame) if not frame then return end local parent = frame:GetParent() local parentName = parent and parent.GetName and parent:GetName() printNoTimestamp("|cffCC0000----------------------------") printNoTimestamp(format("Name: |cffFFD100%s|r; ObjectType: |cffFFD100%s|r", frame:GetName() or "nil", frame:GetObjectType())) printNoTimestamp(format("Parent: |cffFFD100%s|r", parentName or (parent and tostring(parent)) or "nil")) if frame.GetFrameStrata then printNoTimestamp(format("Strata: |cffFFD100%s|r; FrameLevel: |cffFFD100%d|r", frame:GetFrameStrata(), frame:GetFrameLevel())) else printNoTimestamp(format("DrawLayer: |cffFFD100%s|r", frame:GetDrawLayer())) end if frame.GetScale then printNoTimestamp(format("Width: |cffFFD100%.0f|r; Height: |cffFFD100%.0f|r; Scale: |cffFFD100%s|r", frame:GetWidth(), frame:GetHeight(), frame:GetScale())) else printNoTimestamp(format("Width: |cffFFD100%.0f|r; Height: |cffFFD100%.0f|r", frame:GetWidth(), frame:GetHeight())) end local point, relativeTo, relativePoint, x, y, relativeName for i = 1, frame:GetNumPoints() do point, relativeTo, relativePoint, x, y = frame:GetPoint(i) relativeName = relativeTo and relativeTo.GetName and (relativeTo:GetName() or tostring(relativeTo)) or "nil" if point == relativePoint and relativeTo == parent then printNoTimestamp(format("Point %d: |cffFFD100\"%s\", %.0f, %.0f|r", i, point, x, y)) else printNoTimestamp(format("Point %d: |cffFFD100\"%s\", %s, \"%s\", %.0f, %.0f|r", i, point, relativeName, relativePoint, x, y)) end end printNoTimestamp("|cffCC0000----------------------------") updateCopyChat() end SLASH_FRAMELIST1 = "/framelist" SlashCmdList.FRAMELIST = function(showHidden) if not FrameStackTooltip then UIParentLoadAddOn("Blizzard_DebugTools") end local isPreviouslyShown = FrameStackTooltip:IsShown() if not isPreviouslyShown then if showHidden == "true" then FrameStackTooltip_Toggle(true) else FrameStackTooltip_Toggle() end end printNoTimestamp("|cffCC0000----------------------------|r") for i = 2, FrameStackTooltip:NumLines() do local text = _G["FrameStackTooltipTextLeft"..i]:GetText() if text and text ~= "" then printNoTimestamp(text) end end printNoTimestamp("|cffCC0000----------------------------|r") updateCopyChat() if not isPreviouslyShown then FrameStackTooltip_Toggle() end end SLASH_TEXLIST1 = "/texlist" SlashCmdList.TEXLIST = function(frame) frame = getObject(frame) if not (frame and frame.GetNumRegions) then return end for i = 1, frame:GetNumRegions() do local region = select(i, frame:GetRegions()) if region.IsObjectType and region:IsObjectType("Texture") and region:GetTexture() then printNoTimestamp(region:GetTexture(), region:GetName(), region:GetDrawLayer()) end end updateCopyChat() end SLASH_REGLIST1 = "/reglist" SlashCmdList.REGLIST = function(frame) frame = getObject(frame) if not (frame and frame.GetNumRegions) then return end for i = 1, frame:GetNumRegions() do local region = select(i, frame:GetRegions()) printNoTimestamp(i, region:GetObjectType(), region:GetName(), region:GetDrawLayer()) end updateCopyChat() end SLASH_CHILDLIST1 = "/childlist" SlashCmdList.CHILDLIST = function(frame) frame = getObject(frame) if not (frame and frame.GetNumChildren) then return end for i = 1, frame:GetNumChildren() do local obj = select(i, frame:GetChildren()) printNoTimestamp(i, obj:GetObjectType(), obj:GetName(), obj:GetFrameStrata(), obj:GetFrameLevel()) end updateCopyChat() end SLASH_GETPOINT1 = "/getpoint" SlashCmdList.GETPOINT = function(frame) frame = getObject(frame) if not frame then return end local parent = frame:GetParent() local point, relativeTo, relativePoint, x, y, relativeName for i = 1, frame:GetNumPoints() do point, relativeTo, relativePoint, x, y = frame:GetPoint(i) relativeName = relativeTo and relativeTo.GetName and (relativeTo:GetName() or tostring(relativeTo)) or "nil" if point == relativePoint and relativeTo == parent then printNoTimestamp(format("\"%s\", %.0f, %.0f", point, x, y)) else printNoTimestamp(format("\"%s\", %s, \"%s\", %.0f, %.0f", point, relativeName, relativePoint, x, y)) end end updateCopyChat() end