3e6730c - Add pet, boss and arena frames
authorAleksi Blinnikka <aleksi.blinnikka@gmail.com>
Sun, 4 Feb 2018 02:56:28 +0000
committerAleksi Blinnikka <aleksi.blinnikka@gmail.com>
Sun, 4 Feb 2018 02:56:28 +0000
Due to pet frame not having most features, added more flexibility to
remove unneeded parts

OmaUF/Auras.lua
OmaUF/BossFrames.lua [new file with mode: 0644]
OmaUF/Events.lua
OmaUF/OmaUF.toc
OmaUF/PetFrame.lua [new file with mode: 0644]
OmaUF/PlayerFrame.lua
OmaUF/Settings.lua
OmaUF/TargetFrame.lua
OmaUF/UnitFrames.lua

index 499bd77..90da28d 100644 (file)
@@ -18,7 +18,7 @@ local function updateTooltip(frame)
 end
 
 local function showTooltip(frame)
-    -- tooltip handling from TargetFrame.xml
+    -- tooltip handling from FrameXML/TargetFrame.xml
     GameTooltip:SetOwner(frame, "ANCHOR_BOTTOMRIGHT", 15, -25);
     GameTooltip:SetUnitAura(frame.unit, frame.index, frame.filter);
     frame:SetScript("OnUpdate", updateTooltip);
@@ -40,7 +40,7 @@ local function createAura(parent, prev, anchor, name, unit)
     aura.cd:SetReverse(true);
     aura.cd:SetHideCountdownNumbers(true);
     aura.cd:SetAllPoints();
-    aura.unit = unit;
+    aura.unit = unit; -- TODO add aura.stack text
     aura:SetScript("OnEnter", showTooltip);
     aura:SetScript("OnLeave", hideTooltip);
     aura:Hide();
diff --git a/OmaUF/BossFrames.lua b/OmaUF/BossFrames.lua
new file mode 100644 (file)
index 0000000..a66b862
--- /dev/null
@@ -0,0 +1,157 @@
+-- BossFrames.lua
+local _;
+local unpack, pairs = unpack, pairs;
+local format = string.format;
+local GameTooltip = nil;
+local GameTooltip_SetDefaultAnchor = nil;
+
+local registerUnitEvents = OmaUFEvents.RegisterUnitEvents;
+local unitEvent = OmaUFEvents.UnitEvent;
+
+local Settings = OmaUFSettings;
+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.Boss.Width, Settings.Boss.Height;
+local anchorX, anchorY = Settings.Boss.AnchorX, Settings.Boss.AnchorY;
+-- placeholders with visible values when error happens
+local attributes = {};
+
+local inheritedFrames = "SecureUnitButtonTemplate,SecureHandlerStateTemplate";
+
+local function frameShow(frame)
+    frame:RegisterEvent("PLAYER_ENTERING_WORLD");
+    frame:RegisterEvent("INSTANCE_ENCOUNTER_ENGAGE_UNIT");
+    frame:RegisterEvent("UNIT_TARGETABLE_CHANGED");
+    frame:RegisterUnitEvent("UNIT_LEVEL", frame.unit);
+    registerUnitEvents(frame);
+    unitEvent(frame, "UPDATE_ALL_BARS");
+end
+
+local function frameHide(frame)
+    frame:UnregisterAllEvents();
+end
+
+local function showTooltip(secure)
+    GameTooltip_SetDefaultAnchor(GameTooltip, secure);
+    GameTooltip:SetUnit(secure:GetAttribute("unit"));
+end
+
+local function hideTooltip(secure)
+    GameTooltip:FadeOut();
+end
+
+local function createFrame(framename, securename, parent, unit, anchorX, anchorY)
+    local secure = CreateFrame("Button", securename, parent, inheritedFrames);
+    local frame = CreateFrame("Frame", framename, parent);
+    secure:SetPoint("CENTER", parent, "CENTER", anchorX, anchorY);
+    secure:SetAttribute("unit", unit);
+    frame:SetPoint("CENTER", parent, "CENTER", anchorX, anchorY);
+    frame:SetAttribute("unit", unit);
+    frame.unit = unit;
+    frame.displayed = unit;
+    -- hide frame to get initial frameShow call
+    frame:Hide();
+    -- create visuals
+    secure:SetWidth(width+2);
+    secure:SetHeight(height+2);
+    frame:SetWidth(width+2);
+    frame:SetHeight(height+2);
+    frame.width = width;
+    frame.base = frame:CreateTexture(nil, "BACKGROUND");
+    frame.base:SetAllPoints();
+    frame.base:SetColorTexture(1, 1, 1);
+    frame.base:SetVertexColor(unpack(baseColor));
+    frame.healthback = frame:CreateTexture(nil, "BACKGROUND", nil, 1);
+    frame.healthback:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -1);
+    frame.healthback:SetPoint("BOTTOMRIGHT", frame, "RIGHT", -1, -5);
+    frame.healthback:SetTexture("Interface\\RaidFrame\\Raid-Bar-Hp-Fill");
+    frame.healthback:SetVertexColor(unpack(bgColor));
+    frame.health = frame:CreateTexture(nil, "BORDER");
+    frame.health:SetPoint("TOPLEFT", frame.healthback, "TOPLEFT");
+    frame.health:SetPoint("BOTTOMLEFT", frame.healthback, "BOTTOMLEFT");
+    frame.health:SetTexture("Interface\\RaidFrame\\Raid-Bar-Hp-Fill");
+    frame.health:SetVertexColor(unpack(healthColor));
+    frame.healthText = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight");
+    frame.healthText:SetPoint("RIGHT", frame.healthback, "RIGHT", -2, 0);
+    frame.healthText.percent = true;
+    frame.manaback = frame:CreateTexture(nil, "BACKGROUND", nil, 1);
+    frame.manaback:SetPoint("TOPLEFT", frame, "LEFT", 1, -5);
+    frame.manaback:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -1, 1);
+    frame.manaback:SetTexture("Interface\\RaidFrame\\Raid-Bar-Hp-Fill");
+    frame.manaback:SetVertexColor(unpack(bgColor));
+    frame.mana = frame:CreateTexture(nil, "BORDER");
+    frame.mana:SetPoint("TOPLEFT", frame.manaback, "TOPLEFT");
+    frame.mana:SetPoint("BOTTOMLEFT", frame.manaback, "BOTTOMLEFT");
+    frame.mana:SetTexture("Interface\\RaidFrame\\Raid-Bar-Hp-Fill");
+    frame.manaText = frame:CreateFontString(nil, "ARTWORK", "GameFontWhiteTiny");
+    frame.manaText:SetPoint("RIGHT", frame.manaback, "RIGHT", -2, 0);
+    frame.manaText:Hide();
+    frame.shield = frame:CreateTexture(nil, "BORDER");
+    frame.shield:SetPoint("TOPLEFT", frame.health, "TOPRIGHT");
+    frame.shield:SetPoint("BOTTOMLEFT", frame.health, "BOTTOMRIGHT");
+    frame.shield:SetTexture("Interface\\RaidFrame\\Shield-Fill");
+    frame.shield:SetVertexColor(unpack(shieldColor));
+    frame.shield:Hide();
+    frame.shieldhl = frame:CreateTexture(nil, "ARTWORK");
+    frame.shieldhl:SetPoint("TOPLEFT", frame.healthback, "TOPRIGHT", -1, 0);
+    frame.shieldhl:SetPoint("BOTTOMRIGHT", frame.healthback, "BOTTOMRIGHT", 1, 0);
+    frame.shieldhl:SetColorTexture(unpack(shieldhlColor));
+    frame.shieldhl: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.name = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
+    frame.name:SetPoint("LEFT", frame.healthback, "LEFT", 2, 1);
+    frame.name.count = 10;
+    frame.level = frame:CreateFontString(nil, "OVERLAY", "GameFontWhiteTiny");
+    frame.level:SetPoint("LEFT", frame.manaback, "LEFT", 2, 1);
+    frame.targeticon = frame:CreateTexture(nil, "OVERLAY");
+    frame.targeticon:SetPoint("CENTER", frame.healthback, "TOP");
+    frame.targeticon:SetWidth(16);
+    frame.targeticon:SetHeight(16);
+    frame.targeticon:SetTexture("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcons");
+    frame.targeticon:Hide();
+    -- set scripts
+    frame:SetScript("OnShow", frameShow);
+    frame:SetScript("OnHide", frameHide);
+    frame:SetScript("OnEvent", unitEvent);
+    secure:SetScript("OnEnter", showTooltip);
+    secure:SetScript("OnLeave", hideTooltip);
+    -- set attributes
+    -- TODO other set of click cast on boss frames possibly
+    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");
+    secure:SetAttribute("toggleForVehicle", false);
+    RegisterUnitWatch(frame);
+    RegisterUnitWatch(secure);
+end
+
+function OmaUnitFrames.InitializeBoss(parent)
+    GameTooltip = _G["GameTooltip"];
+    GameTooltip_SetDefaultAnchor = _G["GameTooltip_SetDefaultAnchor"];
+    attributes = Settings.Character.Clickheal;
+
+    createFrame("OmaBoss1", "OmaBossSecure1", parent, "boss1", anchorX, anchorY);
+    for i = 2,MAX_BOSS_FRAMES do
+        createFrame("OmaBoss"..i, "OmaBossSecure"..i, _G["OmaBoss"..(i-1)], "boss"..i, 0, -height-15);
+    end
+    -- Arena frames are in the same spot
+    createFrame("OmaArena1", "OmaArenaSecure1", parent, "arena1", anchorX, anchorY);
+    -- MAX_ARENA_ENEMIES from AddOns/Blizzard_ArenaUI/Blizzard_ArenaUI.lua not available
+    -- as the addon is not loaded yet, update manually if it changes
+    for i = 2,5 do
+        createFrame("OmaArena"..i, "OmaArenaSecure"..i, _G["OmaArena"..(i-1)], "arena"..i, 0, -height-15);
+    end
+end
index fa8965a..862e7df 100644 (file)
@@ -20,6 +20,7 @@ local UnitIsGroupLeader, UnitIsGroupAssistant = UnitIsGroupLeader, UnitIsGroupAs
 local HasLFGRestrictions = HasLFGRestrictions;
 local UnitPlayerControlled, UnitIsPlayer = UnitPlayerControlled, UnitIsPlayer;
 local UnitIsTapDenied, UnitSelectionColor = UnitIsTapDenied, UnitSelectionColor;
+local GetRaidTargetIndex, SetRaidTargetIconTexture = GetRaidTargetIndex, SetRaidTargetIconTexture;
 local RAID_CLASS_COLORS = RAID_CLASS_COLORS;
 
 local updateAuraFrames = OmaUFAuras.UpdateAuras;
@@ -32,23 +33,33 @@ local powerColors = Settings.PowerColors;
 local M = {};
 OmaUFEvents = M;
 function M.RegisterUnitEvents(frame)
-    -- events are taken from FrameXML/CompactUnitFrame.lua
-    -- TODO raid marker support,
-    -- player flags support (/afk, /dnd)
+    -- events are taken from FrameXML/CompactUnitFrame.lua and FrameXML/TargetFrame.lua
+    -- TODO player flags support (/afk, /dnd)
+    frame:RegisterEvent("RAID_TARGET_UPDATE"); -- have to register all and just check
     local displayed = frame.unit ~= frame.displayed and frame.displayed or nil;
     frame:RegisterUnitEvent("UNIT_HEALTH", frame.unit, displayed);
     frame:RegisterUnitEvent("UNIT_HEALTH_FREQUENT", frame.unit, displayed);
     frame:RegisterUnitEvent("UNIT_MAXHEALTH", frame.unit, displayed);
-    frame:RegisterUnitEvent("UNIT_POWER", frame.unit, displayed);
-    frame:RegisterUnitEvent("UNIT_MAXPOWER", frame.unit, displayed);
-    frame:RegisterUnitEvent("UNIT_DISPLAYPOWER", frame.unit, displayed);
-    frame:RegisterUnitEvent("UNIT_POWER_BAR_SHOW", frame.unit, displayed);
-    frame:RegisterUnitEvent("UNIT_POWER_BAR_HIDE", frame.unit, displayed);
+    if frame.mana then
+        frame:RegisterUnitEvent("UNIT_POWER", frame.unit, displayed);
+        frame:RegisterUnitEvent("UNIT_MAXPOWER", frame.unit, displayed);
+        frame:RegisterUnitEvent("UNIT_DISPLAYPOWER", frame.unit, displayed);
+        frame:RegisterUnitEvent("UNIT_POWER_BAR_SHOW", frame.unit, displayed);
+        frame:RegisterUnitEvent("UNIT_POWER_BAR_HIDE", frame.unit, displayed);
+    end
+    if frame.healpred then
+        frame:RegisterUnitEvent("UNIT_HEAL_PREDICTION", frame.unit, displayed);
+    end
+    if frame.shield then
+        frame:RegisterUnitEvent("UNIT_ABSORB_AMOUNT_CHANGED", frame.unit, displayed);
+    end
+    if frame.healabsorb then
+        frame:RegisterUnitEvent("UNIT_HEAL_ABSORB_AMOUNT_CHANGED", frame.unit, displayed);
+    end
+    if frame.auras then
+        frame:RegisterUnitEvent("UNIT_AURA", frame.unit, displayed);
+    end
     frame:RegisterUnitEvent("UNIT_NAME_UPDATE", frame.unit, displayed);
-    frame:RegisterUnitEvent("UNIT_AURA", frame.unit, displayed);
-    frame:RegisterUnitEvent("UNIT_HEAL_PREDICTION", frame.unit, displayed);
-    frame:RegisterUnitEvent("UNIT_ABSORB_AMOUNT_CHANGED", frame.unit, displayed);
-    frame:RegisterUnitEvent("UNIT_HEAL_ABSORB_AMOUNT_CHANGED", frame.unit, displayed);
     frame:RegisterUnitEvent("UNIT_THREAT_SITUATION_UPDATE", frame.unit, displayed);
     frame:RegisterUnitEvent("UNIT_CONNECTION", frame.unit, displayed);
     frame:RegisterUnitEvent("UNIT_FACTION", frame.unit, displayed);
@@ -79,12 +90,14 @@ local function updateHealthText(frame, unit)
         frame.healthText:SetText("Dead");
     elseif not UnitIsConnected(unit) then
         frame.healthText:SetText("DC");
+    elseif frame.healthText.percent then
+        frame.healthText:SetFormattedText("%.1f", UnitHealth(unit)/frame.health.max*100);
     else
         local current = UnitHealth(unit);
-        if current > 1200000000 then -- 1.2B
-            frame.healthText:SetFormattedText("%.1fB", current / 1000000000);
-        elseif current > 1200000 then -- 1.2M
-            frame.healthText:SetFormattedText("%.1fM", current / 1000000);
+        if current > 1000000000 then -- 1.0B
+            frame.healthText:SetFormattedText("%.2fB", current / 1000000000);
+        elseif current > 1000000 then -- 1.0M
+            frame.healthText:SetFormattedText("%.2fM", current / 1000000);
         elseif current > 1000 then -- 1K
             frame.healthText:SetFormattedText("%.1fK", current / 1000);
         else
@@ -130,7 +143,7 @@ end
 local function updateName(frame, unit)
     local name = UnitName(unit);
     if not name then return end
-    frame.name:SetText(ssub(name, 1, 10));
+    frame.name:SetText(ssub(name, 1, frame.name.count));
 end
 
 local function updateHealPred(frame, unit)
@@ -193,9 +206,10 @@ local function updateAggro(frame, unit)
     end
 end
 
+-- only works for player frame
 local function updateVehicle(frame)
-    local shouldTargetVehicle = UnitHasVehicleUI(frame.unit) and
-        UnitTargetsVehicleInRaidUI(frame.unit) and UnitExists(frame.vehicle);
+    local shouldTargetVehicle = UnitHasVehicleUI("player") and
+        UnitTargetsVehicleInRaidUI("player") and UnitExists("vehicle");
     if shouldTargetVehicle then
         if not frame.inVehicle then
             frame.inVehicle = true;
@@ -314,12 +328,22 @@ local function updateHealthColor(frame, unit)
     end
 end
 
+local function updateRaidMarker(frame, unit)
+    local index = GetRaidTargetIndex(unit);
+    if index then
+        SetRaidTargetIconTexture(frame.targeticon, index);
+        frame.targeticon:Show();
+    else
+        frame.targeticon:Hide();
+    end
+end
+
 local eventFuncs = {
     ["UNIT_HEALTH"] = function(frame)
         updateHealth(frame, frame.displayed);
         updateHealthText(frame, frame.displayed);
-        updateShield(frame, frame.displayed);
-        updateHealAbsorb(frame, frame.displayed);
+        if frame.shield then updateShield(frame, frame.displayed) end
+        if frame.healabsorb then updateHealAbsorb(frame, frame.displayed) end
     end,
     ["UNIT_POWER"] = function(frame)
         updatePower(frame, frame.displayed);
@@ -344,8 +368,8 @@ local eventFuncs = {
         updateMaxHealth(frame, frame.displayed);
         updateHealth(frame, frame.displayed);
         updateHealthText(frame, frame.displayed);
-        updateShield(frame, frame.displayed);
-        updateHealAbsorb(frame, frame.displayed);
+        if frame.shield then updateShield(frame, frame.displayed) end
+        if frame.healabsorb then updateHealAbsorb(frame, frame.displayed) end
     end,
     ["UNIT_MAXPOWER"] = function(frame)
         updateMaxPower(frame, frame.displayed);
@@ -392,26 +416,32 @@ local eventFuncs = {
     ["PARTY_LEADER_CHANGED"] = function(frame)
         updateLeaderIcon(frame, frame.unit);
     end,
+    ["RAID_TARGET_UPDATE"] = function(frame)
+        updateRaidMarker(frame, frame.displayed);
+    end,
     ["UPDATE_ALL_BARS"] = function(frame)
         if frame.vehicle then updateVehicle(frame) end
         updateMaxHealth(frame, frame.displayed);
-        updateMaxPower(frame, frame.displayed);
         updateHealth(frame, frame.displayed);
         updateHealthText(frame, frame.displayed);
-        updatePower(frame, frame.displayed);
-        updatePowerText(frame, frame.displayed);
-        updateAuras(frame, frame.displayed);
-        updateShield(frame, frame.displayed);
-        updateHealPred(frame, frame.displayed);
-        updateHealAbsorb(frame, frame.displayed);
-        updatePowerColor(frame, frame.displayed);
+        updateHealthColor(frame, frame.displayed);
         updateAggro(frame, frame.displayed);
+        updateRaidMarker(frame, frame.displayed);
+        if frame.mana then
+            updateMaxPower(frame, frame.displayed);
+            updatePower(frame, frame.displayed);
+            updatePowerText(frame, frame.displayed);
+            updatePowerColor(frame, frame.displayed);
+        end
+        if frame.auras then updateAuras(frame, frame.displayed) end
+        if frame.shield then updateShield(frame, frame.displayed) end
+        if frame.healpred then updateHealPred(frame, frame.displayed) end
+        if frame.healabsorb then updateHealAbsorb(frame, frame.displayed) end
         if frame.name then updateName(frame, frame.displayed) end
         if frame.level then updateLevelText(frame, frame.unit) end
         if frame.status then updateStatus(frame, frame.unit) end
         if frame.pvp then updatePVP(frame, frame.unit) end
         if frame.leader then updateLeaderIcon(frame, frame.unit) end
-        updateHealthColor(frame, frame.displayed);
     end,
 };
 eventFuncs["UNIT_HEALTH_FREQUENT"] = eventFuncs["UNIT_HEALTH"];
@@ -423,6 +453,8 @@ eventFuncs["UNIT_PET"] = eventFuncs["UPDATE_ALL_BARS"];
 eventFuncs["GROUP_ROSTER_UPDATE"] = eventFuncs["UPDATE_ALL_BARS"];
 eventFuncs["PLAYER_ENTERING_WORLD"] = eventFuncs["UPDATE_ALL_BARS"];
 eventFuncs["PLAYER_TARGET_CHANGED"] = eventFuncs["UPDATE_ALL_BARS"];
+eventFuncs["INSTANCE_ENCOUNTER_ENGAGE_UNIT"] = eventFuncs["UPDATE_ALL_BARS"];
+eventFuncs["UNIT_TARGETABLE_CHANGED"] = eventFuncs["UPDATE_ALL_BARS"];
 
 function M.UnitEvent(self, event, arg1)
     eventFuncs[event](self, arg1);
index 62573bf..8dcd06b 100644 (file)
@@ -9,4 +9,6 @@ Auras.lua
 Events.lua
 UnitFrames.lua
 PlayerFrame.lua
+PetFrame.lua
 TargetFrame.lua
+BossFrames.lua
diff --git a/OmaUF/PetFrame.lua b/OmaUF/PetFrame.lua
new file mode 100644 (file)
index 0000000..e739ba5
--- /dev/null
@@ -0,0 +1,123 @@
+-- PetFrame.lua
+local _;
+local unpack, pairs = unpack, pairs;
+local format = string.format;
+local GameTooltip = nil;
+local GameTooltip_SetDefaultAnchor = nil;
+
+local registerUnitEvents = OmaUFEvents.RegisterUnitEvents;
+local unitEvent = OmaUFEvents.UnitEvent;
+
+local Settings = OmaUFSettings;
+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.Pet.Width, Settings.Pet.Height;
+local anchorX, anchorY = Settings.Pet.AnchorX, Settings.Pet.AnchorY;
+-- placeholders with visible values when error happens
+local attributes = {};
+
+local inheritedFrames = "SecureUnitButtonTemplate,SecureHandlerStateTemplate";
+
+local function frameShow(frame)
+    frame:RegisterEvent("UNIT_ENTERED_VEHICLE");
+    frame:RegisterEvent("UNIT_EXITED_VEHICLE");
+    frame:RegisterEvent("UNIT_PET");
+    frame:RegisterEvent("PLAYER_ENTERING_WORLD");
+    registerUnitEvents(frame);
+    unitEvent(frame, "UPDATE_ALL_BARS");
+end
+
+local function frameHide(frame)
+    frame:UnregisterAllEvents();
+end
+
+local function showTooltip(secure)
+    GameTooltip_SetDefaultAnchor(GameTooltip, secure);
+    GameTooltip:SetUnit(secure:GetAttribute("displayed"));
+end
+
+local function hideTooltip(secure)
+    GameTooltip:FadeOut();
+end
+
+local vehicletoggle = [=[
+    if newstate == "vehicle" then
+        self:SetAttribute("displayed", self:GetAttribute("vehicle"));
+    else
+        self:SetAttribute("displayed", self:GetAttribute("unit"));
+    end
+]=]
+
+function OmaUnitFrames.InitializePet(parent)
+    GameTooltip = _G["GameTooltip"];
+    GameTooltip_SetDefaultAnchor = _G["GameTooltip_SetDefaultAnchor"];
+    attributes = Settings.Character.Clickheal; -- TODO pet clickheal separate with Mend Pet etc.
+
+    local secure = CreateFrame("Button", "OmaPetSecure", parent, inheritedFrames);
+    local frame = CreateFrame("Frame", "OmaPet", parent);
+    local unit = "pet";
+    secure:SetPoint("TOPRIGHT", parent, "TOPLEFT", anchorX, anchorY);
+    secure:SetAttribute("unit", unit);
+    secure:SetAttribute("displayed", unit);
+    secure:SetAttribute("vehicle", "player");
+    frame:SetPoint("TOPRIGHT", parent, "TOPLEFT", anchorX, anchorY);
+    frame:SetAttribute("unit", unit);
+    frame.unit = unit;
+    frame.displayed = unit;
+    frame.vehicle = "player";
+    -- hide frame to get initial frameShow call
+    frame:Hide();
+    -- create visuals
+    secure:SetWidth(width+2);
+    secure:SetHeight(height+2);
+    frame:SetWidth(width+2);
+    frame:SetHeight(height+2);
+    frame.width = width;
+    frame.base = frame:CreateTexture(nil, "BACKGROUND");
+    frame.base:SetAllPoints();
+    frame.base:SetColorTexture(1, 1, 1);
+    frame.base:SetVertexColor(unpack(baseColor));
+    frame.healthback = frame:CreateTexture(nil, "BACKGROUND", nil, 1);
+    frame.healthback:SetPoint("TOPLEFT", frame, "TOPLEFT", 1, -1);
+    frame.healthback:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -1, 1);
+    frame.healthback:SetTexture("Interface\\RaidFrame\\Raid-Bar-Hp-Fill");
+    frame.healthback:SetVertexColor(unpack(bgColor));
+    frame.health = frame:CreateTexture(nil, "BORDER");
+    frame.health:SetPoint("TOPLEFT", frame.healthback, "TOPLEFT");
+    frame.health:SetPoint("BOTTOMLEFT", frame.healthback, "BOTTOMLEFT");
+    frame.health:SetTexture("Interface\\RaidFrame\\Raid-Bar-Hp-Fill");
+    frame.health:SetVertexColor(unpack(healthColor));
+    frame.healthText = frame:CreateFontString(nil, "ARTWORK", "GameFontHighlight");
+    frame.healthText:SetPoint("RIGHT", frame.healthback, "RIGHT", -2, 0);
+    frame.targeticon = frame:CreateTexture(nil, "OVERLAY");
+    frame.targeticon:SetPoint("CENTER", frame.healthback, "TOP");
+    frame.targeticon:SetWidth(18);
+    frame.targeticon:SetHeight(18);
+    frame.targeticon:SetTexture("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcons");
+    frame.targeticon:Hide();
+    -- 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");
+    secure:SetAttribute("toggleForVehicle", true);
+    RegisterUnitWatch(frame);
+    RegisterUnitWatch(secure);
+    RegisterStateDriver(secure, "vehicleui", "[vehicleui] vehicle; no");
+    secure:SetAttribute("_onstate-vehicleui", vehicletoggle);
+    return frame;
+end
index 25d361e..1ce80da 100644 (file)
@@ -2,14 +2,11 @@
 local _;
 local unpack, pairs = unpack, pairs;
 local format = string.format;
-local CreateFrame, RegisterStateDriver, RegisterUnitWatch = CreateFrame, RegisterStateDriver, RegisterUnitWatch;
-local STANDARD_TEXT_FONT = STANDARD_TEXT_FONT;
 local GameTooltip = nil;
 local GameTooltip_SetDefaultAnchor = nil;
 
 local registerUnitEvents = OmaUFEvents.RegisterUnitEvents;
 local unitEvent = OmaUFEvents.UnitEvent;
-local createAuraFrame = OmaUFAuras.CreateAuraFrame;
 
 local Settings = OmaUFSettings;
 local baseColor = Settings.BaseColor;
@@ -29,7 +26,7 @@ local inheritedFrames = "SecureUnitButtonTemplate,SecureHandlerStateTemplate";
 local function frameShow(frame)
     frame:RegisterEvent("UNIT_ENTERED_VEHICLE");
     frame:RegisterEvent("UNIT_EXITED_VEHICLE");
-    frame:RegisterEvent("UNIT_PET"); -- TODO needed?
+    frame:RegisterEvent("GROUP_ROSTER_UPDATE");
     frame:RegisterEvent("PLAYER_ENTERING_WORLD");
     frame:RegisterEvent("PLAYER_LEVEL_UP");
     frame:RegisterEvent("PLAYER_REGEN_DISABLED");
@@ -46,13 +43,21 @@ end
 
 local function showTooltip(secure)
     GameTooltip_SetDefaultAnchor(GameTooltip, secure);
-    GameTooltip:SetUnit(secure:GetAttribute("unit"));
+    GameTooltip:SetUnit(secure:GetAttribute("displayed"));
 end
 
 local function hideTooltip(secure)
     GameTooltip:FadeOut();
 end
 
+local vehicletoggle = [=[
+    if newstate == "vehicle" then
+        self:SetAttribute("displayed", self:GetAttribute("vehicle"));
+    else
+        self:SetAttribute("displayed", self:GetAttribute("unit"));
+    end
+]=]
+
 function OmaUnitFrames.InitializePlayer(parent)
     GameTooltip = _G["GameTooltip"];
     GameTooltip_SetDefaultAnchor = _G["GameTooltip_SetDefaultAnchor"];
@@ -63,6 +68,8 @@ function OmaUnitFrames.InitializePlayer(parent)
     local unit = "player";
     secure:SetPoint("CENTER", parent, "CENTER", anchorX, anchorY);
     secure:SetAttribute("unit", unit);
+    secure:SetAttribute("displayed", unit);
+    secure:SetAttribute("vehicle", "vehicle");
     frame:SetPoint("CENTER", parent, "CENTER", anchorX, anchorY);
     frame:SetAttribute("unit", unit);
     frame.unit = unit;
@@ -141,6 +148,12 @@ function OmaUnitFrames.InitializePlayer(parent)
     frame.leader:Hide();
     frame.level = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
     frame.level:SetPoint("LEFT", frame.manaback, "LEFT", 2, 1);
+    frame.targeticon = frame:CreateTexture(nil, "OVERLAY");
+    frame.targeticon:SetPoint("CENTER", frame.healthback, "TOP");
+    frame.targeticon:SetWidth(18);
+    frame.targeticon:SetHeight(18);
+    frame.targeticon:SetTexture("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcons");
+    frame.targeticon:Hide();
     -- set scripts
     frame:SetScript("OnShow", frameShow);
     frame:SetScript("OnHide", frameHide);
@@ -155,7 +168,10 @@ function OmaUnitFrames.InitializePlayer(parent)
     -- rest give target and menu
     secure:SetAttribute("*type1", "target");
     secure:SetAttribute("*type2", "togglemenu");
+    secure:SetAttribute("toggleForVehicle", true);
     RegisterUnitWatch(frame);
     RegisterUnitWatch(secure);
+    RegisterStateDriver(secure, "vehicleui", "[vehicleui] vehicle; no");
+    secure:SetAttribute("_onstate-vehicleui", vehicletoggle);
     return frame;
 end
index 8b3e67e..2a9a3b7 100644 (file)
@@ -75,11 +75,11 @@ local settings = {
         AnchorX = 300,
         AnchorY = -175,
     },
-    ToT = {
-        Width = 80,
-        Height = 25,
-        AnchorX = 10,
-        AnchorY = 0,
+    Boss = {
+        Width = 140,
+        Height = 30,
+        AnchorX = 550,
+        AnchorY = 300,
     },
     BaseColor = {0, 0, 0, 0.5},
     BgColor = {0.1, 0.1, 0.1, 0.4},
index c88519d..4d0d875 100644 (file)
@@ -2,8 +2,6 @@
 local _;
 local unpack, pairs = unpack, pairs;
 local format = string.format;
-local CreateFrame, RegisterStateDriver, RegisterUnitWatch = CreateFrame, RegisterStateDriver, RegisterUnitWatch;
-local STANDARD_TEXT_FONT = STANDARD_TEXT_FONT;
 local GameTooltip = nil;
 local GameTooltip_SetDefaultAnchor = nil;
 
@@ -27,10 +25,7 @@ local attributes = {};
 local inheritedFrames = "SecureUnitButtonTemplate,SecureHandlerStateTemplate";
 
 local function frameShow(frame)
-    frame:RegisterEvent("UNIT_ENTERED_VEHICLE");
-    frame:RegisterEvent("UNIT_EXITED_VEHICLE");
-    frame:RegisterEvent("UNIT_PET");
-    frame:RegisterEvent("GROUP_ROSTER_UPDATE"); -- TODO needed? won't be having group number in frames
+    frame:RegisterEvent("GROUP_ROSTER_UPDATE");
     frame:RegisterEvent("PLAYER_ENTERING_WORLD");
     frame:RegisterEvent("PLAYER_TARGET_CHANGED");
     frame:RegisterEvent("PARTY_LEADER_CHANGED");
@@ -66,7 +61,6 @@ function OmaUnitFrames.InitializeTarget(parent)
     frame:SetAttribute("unit", unit);
     frame.unit = unit;
     frame.displayed = unit;
-    --frame.vehicle = unit.."pet"; -- TODO nothing extra needed for target vehicles?
     -- hide frame to get initial frameShow call
     frame:Hide();
     -- create visuals
@@ -140,8 +134,15 @@ function OmaUnitFrames.InitializeTarget(parent)
     frame.leader:Hide();
     frame.name = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightLarge");
     frame.name:SetPoint("LEFT", frame.healthback, "LEFT", 2, 1);
+    frame.name.count = 9;
     frame.level = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
     frame.level:SetPoint("LEFT", frame.manaback, "LEFT", 2, 1);
+    frame.targeticon = frame:CreateTexture(nil, "OVERLAY");
+    frame.targeticon:SetPoint("CENTER", frame.healthback, "TOP");
+    frame.targeticon:SetWidth(18);
+    frame.targeticon:SetHeight(18);
+    frame.targeticon:SetTexture("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcons");
+    frame.targeticon:Hide();
     -- set scripts
     frame:SetScript("OnShow", frameShow);
     frame:SetScript("OnHide", frameHide);
@@ -156,6 +157,7 @@ function OmaUnitFrames.InitializeTarget(parent)
     -- rest give target and menu
     secure:SetAttribute("*type1", "target");
     secure:SetAttribute("*type2", "togglemenu");
+    secure:SetAttribute("toggleForVehicle", false);
     createAuraFrame(frame, unit);
     RegisterUnitWatch(frame);
     RegisterUnitWatch(secure);
index 0a812d4..b0738ee 100644 (file)
@@ -1,6 +1,7 @@
 -- UnitFrames.lua
 local _;
 local pairs = pairs;
+local InCombatLockdown = InCombatLockdown;
 
 local UnitFrames = CreateFrame("Frame", "OmaUnitFrames");
 
@@ -9,9 +10,10 @@ OmaUnitFrames = M;
 
 local function initialize()
     local player = M.InitializePlayer(UIParent);
-    --M.InitializePet(player);
+    M.InitializePet(player);
     local target = M.InitializeTarget(UIParent);
-    --M.InitializeToT(target);
+    --M.InitializeToT(target); -- might not do this
+    M.InitializeBoss(UIParent);
     -- TODO boss frames, (arena frames)
 end
 
@@ -20,22 +22,31 @@ local function hideBlizzardFrames()
     if hidden then return end
     hidden = true;
 
-    for _, frame in pairs({PlayerFrame, TargetFrame, TargetFrameToT, PetFrame}) do
+    local frames = {PlayerFrame, TargetFrame, TargetFrameToT, PetFrame,
+        PlayerFrameAlternateManaBar, ComboFrame, PriestBarFrame, RuneFrame,
+        WarlockPowerFrame, MonkHarmonyBarFrame, PaladinPowerBarFrame,
+        MageArcaneChargesFrame};
+    for i = 1,MAX_BOSS_FRAMES do
+        table.insert(frames, _G["Boss"..i.."TargetFrame"]);
+        table.insert(frames, _G["Boss"..i.."TargetFrameHealthBar"]);
+        table.insert(frames, _G["Boss"..i.."TargetFrameManaBar"]);
+    end
+    for _, frame in pairs(frames) do
         frame:UnregisterAllEvents();
-        frame.healthbar:UnregisterAllEvents();
-        frame.manabar: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
 
     -- TODO create frames for class powers, currently using Simple Holy Power
-    for _, frame in pairs({PlayerFrameAlternateManaBar, ComboFrame,
-            PriestBarFrame, RuneFrame, WarlockPowerFrame, MonkHarmonyBarFrame,
-            PaladinPowerBarFrame, MageArcaneChargesFrame}) do
-        frame:UnregisterAllEvents();
-        frame:Hide();
-    end
+    --for _, frame in pairs({PlayerFrameAlternateManaBar, ComboFrame,
+    --        PriestBarFrame, RuneFrame, WarlockPowerFrame, MonkHarmonyBarFrame,
+    --        PaladinPowerBarFrame, MageArcaneChargesFrame}) do
+    --    frame:UnregisterAllEvents();
+    --    frame:Hide();
+    --end
 
     -- from ShadowedUF, re-register vehicle events for default auras
     PlayerFrame:RegisterEvent("PLAYER_ENTERING_WORLD");
@@ -48,11 +59,30 @@ local function hideBlizzardFrames()
     PlayerFrame:SetDontSavePosition(true);
 end
 
+-- untested, not playing arena, from ShadowedUF
+local hiddenFrame = CreateFrame("Frame");
+hiddenFrame:Hide();
+local arenaHidden = false;
+local function hideArenaFrames()
+    -- not run if /reload happens in combat, may cause problems?
+    if not arenaHidden and not InCombatLockdown() then
+        arenaHidden = true;
+        ArenaEnemyFrames:UnregisterAllEvents();
+        ArenaEnemyFrames:SetParent(hiddenFrame);
+        ArenaPrepFrames:UnregisterAllEvents();
+        ArenaPrepFrames:SetParent(hiddenFrame);
+        SetCVar("showArenaEnemyFrames", 0, "SHOW_ARENA_ENEMY_FRAMES_TEXT");
+    end
+end
+
 UnitFrames:RegisterEvent("PLAYER_LOGIN");
-UnitFrames:SetScript("OnEvent", function(self, event)
+UnitFrames:RegisterEvent("ADDON_LOADED");
+UnitFrames:SetScript("OnEvent", function(self, event, addon)
     if event == "PLAYER_LOGIN" then
         OmaUFLoadChar();
         hideBlizzardFrames();
         initialize();
+    elseif event == "ADDON_LOADED" and addon == "Blizzard_ArenaUI" then
+        hideArenaFrames();
     end
 end);