-- RaidFrame.lua local _; local unpack, pairs = unpack, pairs; local format = string.format; local UnitInRange = UnitInRange; local InCombatLockdown = InCombatLockdown; local CreateFrame, RegisterStateDriver, RegisterUnitWatch = CreateFrame, RegisterStateDriver, RegisterUnitWatch; local STANDARD_TEXT_FONT = STANDARD_TEXT_FONT; local GameTooltip = nil; local GameTooltip_SetDefaultAnchor = nil; local registerEvents = OmaRFEvents.RegisterEvents; local registerUnitEvents = OmaRFEvents.RegisterUnitEvents; local unitEvent = OmaRFEvents.UnitEvent; local setupIndicators = OmaRFIndicators.SetupIndicators; local Settings = OmaRFSettings; local baseColor = Settings.BaseColor; local bgColor = Settings.BgColor; local healthColor = Settings.HealthColor; local shieldColor = Settings.ShieldColor; local shieldhlColor = Settings.ShieldhlColor; local healpredColor = Settings.HealpredColor; local healabsorbColor = Settings.HealabsorbColor; local width, height = Settings.Width, Settings.Height; -- placeholders with visible values when error happens local anchorX, anchorY = 10, 10; local attributes = {}; local CFrame = CreateFrame("Frame", "OmaRFFrame", UIParent); local inheritedFrames = "SecureUnitButtonTemplate,SecureHandlerStateTemplate"; local barTexture = "Interface\\AddOns\\OmaRF\\images\\minimalist"; local class = nil; local party = {}; local raid = {}; local M = {}; OmaRaidFrame = M; local function unitUpdate(frame) -- there's no in/out of range event, have to check each frame -- from FrameXML/CompactUnitFrame.lua local inRange, checked = UnitInRange(frame.displayed); if checked and not inRange then frame:SetAlpha(0.55); else frame:SetAlpha(1); end end local function frameShow(frame) registerEvents(frame); registerUnitEvents(frame); frame:SetScript("OnUpdate", unitUpdate); unitEvent(frame, "UPDATE_ALL_BARS"); end local function frameHide(frame) frame:UnregisterAllEvents(); frame:SetScript("OnUpdate", nil); end local function showTooltip(secure) GameTooltip_SetDefaultAnchor(GameTooltip, secure); GameTooltip:SetUnit(secure:GetAttribute("unit")); end local function hideTooltip(secure) GameTooltip:FadeOut(); end local function setupFrame(frame, secure, unit) secure:SetAttribute("unit", unit); frame:SetAttribute("unit", unit); frame.unit = unit; frame.displayed = unit; -- hide frame to get initial frameShow call frame:Hide(); if unit == "player" then frame.vehicle = "vehicle" else frame.vehicle = unit.."pet" end -- create visuals secure:SetWidth(width+2); secure:SetHeight(height+2); frame:SetWidth(width+2); frame:SetHeight(height+2); frame.base = frame:CreateTexture(nil, "BACKGROUND"); frame.base:SetAllPoints(); frame.base:SetColorTexture(1, 1, 1); frame.base:SetVertexColor(unpack(baseColor)); frame.background = frame:CreateTexture(nil, "BACKGROUND", nil, 1); frame.background:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -1); frame.background:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -1, 1); frame.background:SetColorTexture(unpack(bgColor)); frame.health = frame:CreateTexture(nil, "BORDER"); frame.health:SetTexture(barTexture); frame.health:SetPoint("TOPLEFT", frame.background, "TOPLEFT"); frame.health:SetPoint("BOTTOMLEFT", frame.background, "BOTTOMLEFT"); frame.health:SetVertexColor(unpack(healthColor)); frame.mana = frame:CreateTexture(nil, "BORDER"); frame.mana:SetPoint("TOPLEFT", frame.background, "BOTTOMLEFT", 0, 2); frame.mana:SetPoint("BOTTOMLEFT", frame.background, "BOTTOMLEFT"); frame.mana:SetColorTexture(1, 1, 1); frame.mana:Hide(); frame.shield = frame:CreateTexture(nil, "BORDER"); frame.shield:SetPoint("TOPLEFT", frame.health, "TOPRIGHT"); frame.shield:SetPoint("BOTTOMLEFT", frame.health, "BOTTOMRIGHT"); frame.shield:SetTexture(barTexture); frame.shield:SetVertexColor(unpack(shieldColor)); frame.shield:Hide(); frame.shieldhl = frame:CreateTexture(nil, "ARTWORK"); frame.shieldhl:SetPoint("TOPLEFT", frame.background, "TOPRIGHT", -1, 0); frame.shieldhl:SetPoint("BOTTOMRIGHT", frame.background, "BOTTOMRIGHT", 1, 0); frame.shieldhl:SetColorTexture(unpack(shieldhlColor)); frame.shieldhl:Hide(); frame.healpred = frame:CreateTexture(nil, "ARTWORK"); frame.healpred:SetPoint("TOPLEFT", frame.health, "TOPRIGHT"); frame.healpred:SetPoint("BOTTOMLEFT", frame.health, "BOTTOMRIGHT"); frame.healpred:SetColorTexture(unpack(healpredColor)); frame.healpred:Hide(); frame.healabsorb = frame:CreateTexture(nil, "ARTWORK"); frame.healabsorb:SetPoint("TOPRIGHT", frame.health, "TOPRIGHT"); frame.healabsorb:SetPoint("BOTTOMRIGHT", frame.health, "BOTTOMRIGHT"); frame.healabsorb:SetColorTexture(unpack(healabsorbColor)); frame.healabsorb:Hide(); frame.role = frame:CreateTexture(nil, "ARTWORK"); frame.role:SetPoint("BOTTOMRIGHT", frame.background, "BOTTOMRIGHT", -2, 2); frame.role:SetPoint("TOPLEFT", frame.background, "BOTTOMRIGHT", -14, 14); frame.role:SetTexture("Interface\\LFGFRAME\\LFGROLE"); frame.role:Hide(); frame.overlay = frame:CreateTexture(nil, "ARTWORK", nil, 1); frame.overlay:SetPoint("TOPLEFT", frame.background, "TOPLEFT"); frame.overlay:SetPoint("BOTTOMRIGHT", frame.background, "BOTTOMRIGHT"); frame.overlay:SetColorTexture(1, 1, 1); frame.overlay:Hide(); frame.name = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight"); frame.name:SetPoint("CENTER", frame.background, "CENTER", 0, 11); frame.text = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight"); frame.text:SetFont(STANDARD_TEXT_FONT, 13); frame.text:SetPoint("CENTER", frame.background, "CENTER", 0, -1); frame.text:Hide(); frame.rez = frame:CreateTexture(nil, "OVERLAY"); frame.rez:SetPoint("TOPLEFT", frame.background, "CENTER", -12, 12); frame.rez:SetPoint("BOTTOMRIGHT", frame.background, "CENTER", 12, -12); frame.rez:SetTexture("Interface\\RaidFrame\\Raid-Icon-Rez"); frame.rez:Hide(); frame.ready = frame:CreateTexture(nil, "OVERLAY"); frame.ready:SetPoint("TOPLEFT", frame.background, "BOTTOMLEFT", 0, 14); frame.ready:SetPoint("BOTTOMRIGHT", frame.background, "BOTTOMLEFT", 14, 0); frame.ready:Hide(); frame.targeticon = frame:CreateTexture(nil, "OVERLAY"); frame.targeticon:SetPoint("CENTER", frame.background, "TOP"); frame.targeticon:SetWidth(12); frame.targeticon:SetHeight(12); frame.targeticon:SetTexture("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcons"); frame.targeticon:Hide(); -- set up indicators setupIndicators(frame, class); -- set scripts frame:SetScript("OnShow", frameShow); frame:SetScript("OnHide", frameHide); frame:SetScript("OnEvent", unitEvent); secure:SetScript("OnEnter", showTooltip); secure:SetScript("OnLeave", hideTooltip); -- set attributes secure:RegisterForClicks("AnyDown"); for attr, val in pairs(attributes) do secure:SetAttribute(attr, val); end -- rest give target and menu secure:SetAttribute("*type1", "target"); secure:SetAttribute("*type2", "togglemenu"); end -- vehicle toggle from Shadowed Unit Frames local vehicletoggle = [=[ local unit = self:GetAttribute("unit"); if unit and newstate == "vehicle" and not UnitTargetsVehicleInRaidUI(unit) then self:SetAttribute("toggleForVehicle", false); else self:SetAttribute("toggleForVehicle", true); end ]=] local function initializeParty(parent) local secure = CreateFrame("Button", "OmaPartySecure0", parent, inheritedFrames); local frame = CreateFrame("Frame", "OmaParty0", parent); local unit = "player"; secure:SetPoint("TOPLEFT", parent, "TOPLEFT"); frame:SetPoint("TOPLEFT", parent, "TOPLEFT"); setupFrame(frame, secure, unit); RegisterStateDriver(frame, "visibility", "[@player,group:raid] hide; show"); RegisterStateDriver(secure, "visibility", "[@player,group:raid] hide; show"); RegisterStateDriver(secure, "vehicleui", "[vehicleui] vehicle; no"); secure:SetAttribute("_onstate-vehicleui", vehicletoggle); party[0] = {secure=secure, frame=frame}; for i = 1,4 do local secure = CreateFrame("Button", "OmaPartySecure"..i, parent, inheritedFrames); local frame = CreateFrame("Frame", "OmaParty"..i, parent); local unit = "party"..i; secure:SetPoint("TOPLEFT", party[i-1].secure, "TOPRIGHT"); frame:SetPoint("TOPLEFT", party[i-1].frame, "TOPRIGHT"); setupFrame(frame, secure, unit); local visible = format("[@%s,exists,group:raid] hide; [@%s,exists] show; hide", unit, unit); local vehicle = format("[@%s,unithasvehicleui] vehicle; no", unit); RegisterStateDriver(frame, "visibility", visible); RegisterStateDriver(secure, "visibility", visible); RegisterStateDriver(secure, "vehicleui", vehicle); secure:SetAttribute("_onstate-vehicleui", vehicletoggle); party[i] = {secure=secure, frame=frame}; end end local function initializeRaid(parent) local secure = CreateFrame("Button", "OmaRaidSecure1", parent, inheritedFrames); local frame = CreateFrame("Frame", "OmaRaid1", parent); local unit = "raid1"; secure:SetPoint("TOPLEFT", parent, "TOPLEFT"); frame:SetPoint("TOPLEFT", parent, "TOPLEFT"); setupFrame(frame, secure, unit); RegisterUnitWatch(frame); RegisterUnitWatch(secure); local vehicle = format("[@%s,unithasvehicleui] vehicle; no", unit); RegisterStateDriver(secure, "vehicleui", vehicle); secure:SetAttribute("_onstate-vehicleui", vehicletoggle); raid[1] = {secure=secure, frame=frame}; for y = 1,7 do local i = y*5+1; local secure = CreateFrame("Button", "OmaRaidSecure"..i, parent, inheritedFrames); local frame = CreateFrame("Frame", "OmaRaid"..i, parent); local unit = "raid"..i; secure:SetPoint("TOPLEFT", raid[i-5].secure, "BOTTOMLEFT"); frame:SetPoint("TOPLEFT", raid[i-5].frame, "BOTTOMLEFT"); setupFrame(frame, secure, unit); RegisterUnitWatch(frame); RegisterUnitWatch(secure); local vehicle = format("[@%s,unithasvehicleui] vehicle; no", unit); RegisterStateDriver(secure, "vehicleui", vehicle); secure:SetAttribute("_onstate-vehicleui", vehicletoggle); raid[i] = {secure=secure, frame=frame}; end for y = 0,7 do for x = 1,4 do local i = y*5+x+1; local secure = CreateFrame("Button", "OmaRaidSecure"..i, parent, inheritedFrames); local frame = CreateFrame("Frame", "OmaRaid"..i, parent); local unit = "raid"..i; secure:SetPoint("TOPLEFT", raid[i-1].secure, "TOPRIGHT"); frame:SetPoint("TOPLEFT", raid[i-1].frame, "TOPRIGHT"); setupFrame(frame, secure, unit); RegisterUnitWatch(frame); RegisterUnitWatch(secure); local vehicle = format("[@%s,unithasvehicleui] vehicle; no", unit); RegisterStateDriver(secure, "vehicleui", vehicle); secure:SetAttribute("_onstate-vehicleui", vehicletoggle); raid[i] = {secure=secure, frame=frame}; end end end local function initializeFocus(parent) local secure = CreateFrame("Button", "OmaFocusSecure", parent, inheritedFrames); local frame = CreateFrame("Frame", "OmaFocus", parent); local unit = "focus"; secure:SetPoint("BOTTOMLEFT", parent, "TOPLEFT"); frame:SetPoint("BOTTOMLEFT", parent, "TOPLEFT"); setupFrame(frame, secure, unit); RegisterUnitWatch(frame); RegisterUnitWatch(secure); local vehicle = format("[@%s,unithasvehicleui] vehicle; no", unit); RegisterStateDriver(secure, "vehicleui", vehicle); secure:SetAttribute("_onstate-vehicleui", vehicletoggle); end local function initialize() -- let other addons hook these to anchor tooltip elsewhere GameTooltip = _G["GameTooltip"]; GameTooltip_SetDefaultAnchor = _G["GameTooltip_SetDefaultAnchor"]; _, class = UnitClass("player"); anchorX, anchorY = Settings.Character.AnchorX, Settings.Character.AnchorY; attributes = Settings.Character.Clickheal; CFrame:SetFrameStrata("LOW"); CFrame:SetPoint("CENTER", nil, "CENTER", anchorX, anchorY); CFrame:SetHeight((height+2)*8); CFrame:SetWidth((width+2)*5); initializeParty(CFrame); initializeRaid(CFrame); initializeFocus(CFrame); end -- hiding Blizzard frames somewhat based on ShadowedUF local function hideBlizzardRaidButton() if InCombatLockdown() then return end local manager = CompactRaidFrameManager; -- remove show and unlock buttons from manager manager.displayFrame.hiddenModeToggle:Hide(); manager.displayFrame.lockedModeToggle:Hide(); end local hidden = false; local function hideBlizzardRaid() if hidden then return end hidden = true; local function hide() if InCombatLockdown() then return end CompactRaidFrameContainer:Hide(); local shown = CompactRaidFrameManager_GetSetting("IsShown"); if shown and shown ~= "0" then CompactRaidFrameManager_SetSetting("IsShown", "0"); end end CompactRaidFrameContainer:UnregisterAllEvents(); -- there may still be frames created at startup getting events for i=1,MAX_RAID_MEMBERS do local frame = _G["CompactRaidFrame"..i]; if not frame then break end frame:UnregisterAllEvents(); end hooksecurefunc("CompactRaidFrameManager_UpdateShown", hide); hide(); CompactRaidFrameContainer:HookScript("OnShow", hide); hooksecurefunc("CompactRaidFrameManager_UpdateOptionsFlowContainer", hideBlizzardRaidButton); hideBlizzardRaidButton(); -- hide focus frame for _, frame in pairs({FocusFrame, FocusFrameToT, FocusFrameSpellBar}) do frame:UnregisterAllEvents(); if frame.healthbar then frame.healthbar:UnregisterAllEvents() end if frame.manabar then frame.manabar:UnregisterAllEvents() end if frame.spellbar then frame.spellbar:UnregisterAllEvents() end if frame.powerBarAlt then frame.powerBarAlt:UnregisterAllEvents() end frame:Hide(); end end CFrame:RegisterEvent("PLAYER_LOGIN"); CFrame:RegisterEvent("PLAYER_REGEN_ENABLED"); CFrame:SetScript("OnEvent", function(self, event, addon) if event == "PLAYER_LOGIN" then OmaRFLoadChar(); hideBlizzardRaid(); initialize(); elseif event == "PLAYER_REGEN_ENABLED" then -- if CompactRaidFrameManager_UpdateOptionsFlowContainer was called in combat -- couldn't hide the button hideBlizzardRaidButton(); end end);