From: Aleksi Blinnikka Date: Sun, 4 Feb 2018 02:56:28 +0000 (+0200) Subject: Add pet, boss and arena frames X-Git-Url: https://www.aleksib.fi/git/wowui.git/commitdiff_plain/3e6730c2c495d9016dde6cbb76c2bd6f86b05cbe?ds=sidebyside Add pet, boss and arena frames Due to pet frame not having most features, added more flexibility to remove unneeded parts --- diff --git a/OmaUF/Auras.lua b/OmaUF/Auras.lua index 499bd77..90da28d 100644 --- a/OmaUF/Auras.lua +++ b/OmaUF/Auras.lua @@ -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 index 0000000..a66b862 --- /dev/null +++ b/OmaUF/BossFrames.lua @@ -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 diff --git a/OmaUF/Events.lua b/OmaUF/Events.lua index fa8965a..862e7df 100644 --- a/OmaUF/Events.lua +++ b/OmaUF/Events.lua @@ -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); diff --git a/OmaUF/OmaUF.toc b/OmaUF/OmaUF.toc index 62573bf..8dcd06b 100644 --- a/OmaUF/OmaUF.toc +++ b/OmaUF/OmaUF.toc @@ -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 index 0000000..e739ba5 --- /dev/null +++ b/OmaUF/PetFrame.lua @@ -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 diff --git a/OmaUF/PlayerFrame.lua b/OmaUF/PlayerFrame.lua index 25d361e..1ce80da 100644 --- a/OmaUF/PlayerFrame.lua +++ b/OmaUF/PlayerFrame.lua @@ -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 diff --git a/OmaUF/Settings.lua b/OmaUF/Settings.lua index 8b3e67e..2a9a3b7 100644 --- a/OmaUF/Settings.lua +++ b/OmaUF/Settings.lua @@ -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}, diff --git a/OmaUF/TargetFrame.lua b/OmaUF/TargetFrame.lua index c88519d..4d0d875 100644 --- a/OmaUF/TargetFrame.lua +++ b/OmaUF/TargetFrame.lua @@ -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); diff --git a/OmaUF/UnitFrames.lua b/OmaUF/UnitFrames.lua index 0a812d4..b0738ee 100644 --- a/OmaUF/UnitFrames.lua +++ b/OmaUF/UnitFrames.lua @@ -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);