--- 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 CTimerAfter = C_Timer.After;
-local STANDARD_TEXT_FONT = STANDARD_TEXT_FONT;
-local GameTooltip = GameTooltip;
-local GameTooltip_SetDefaultAnchor = GameTooltip_SetDefaultAnchor;
-
-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 updaters = {};
-
-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
- if frame.updating then
- local inRange, checked = UnitInRange(frame.displayed);
- if checked and not inRange then
- frame:SetAlpha(0.55);
- else
- frame:SetAlpha(1);
- end
- CTimerAfter(0.25, updaters[frame]);
- end
-end
-
-local function frameShow(frame)
- registerEvents(frame);
- registerUnitEvents(frame);
- frame.updating = true;
- CTimerAfter(0.25, updaters[frame]);
- unitEvent(frame, "UPDATE_ALL_BARS");
-end
-
-local function frameHide(frame)
- frame:UnregisterAllEvents();
- frame.updating = nil;
-end
-
-local function showTooltip(secure)
- -- only show raid frame tooltips out of combat
- if not InCombatLockdown() then
- GameTooltip_SetDefaultAnchor(GameTooltip, secure);
- GameTooltip:SetUnit(secure:GetAttribute("unit"));
- end
-end
-
-local function hideTooltip(secure)
- if GameTooltip:IsOwned(secure) then GameTooltip:Hide() end
-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.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.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.role = frame:CreateTexture(nil, "ARTWORK", nil, 2);
- 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.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.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 up periodic updates
- updaters[frame] = function() return unitUpdate(frame) end
- -- 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()
- _, 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_REGEN_ENABLED" then
- -- if CompactRaidFrameManager_UpdateOptionsFlowContainer was called in combat
- -- couldn't hide the button
- hideBlizzardRaidButton();
- elseif event == "PLAYER_LOGIN" then
- OmaRFLoadChar();
- hideBlizzardRaid();
- initialize();
- end
-end);