X-Git-Url: https://www.aleksib.fi/git/wowui.git/blobdiff_plain/fdbd89d788a6442f2fe57abb8f2321bd6c452889..befb5530a79adcd88cbeb364b7d97d4f906cc1f9:/OmaUF/Events.lua diff --git a/OmaUF/Events.lua b/OmaUF/Events.lua index fa8965a..03e790c 100644 --- a/OmaUF/Events.lua +++ b/OmaUF/Events.lua @@ -10,7 +10,6 @@ local UnitHealth, UnitHealthMax = UnitHealth, UnitHealthMax; local UnitGetIncomingHeals, UnitGetTotalAbsorbs = UnitGetIncomingHeals, UnitGetTotalAbsorbs; local UnitThreatSituation, GetThreatStatusColor = UnitThreatSituation, GetThreatStatusColor; local UnitIsDeadOrGhost, UnitIsConnected = UnitIsDeadOrGhost, UnitIsConnected; -local UnitGetTotalHealAbsorbs = UnitGetTotalHealAbsorbs; local UnitHasVehicleUI, UnitTargetsVehicleInRaidUI = UnitHasVehicleUI, UnitTargetsVehicleInRaidUI; local UnitLevel, UnitClassification = UnitLevel, UnitClassification; local UnitAffectingCombat, IsResting = UnitAffectingCombat, IsResting; @@ -20,9 +19,10 @@ 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; +local updateAuras = OmaUFAuras.UpdateAuras; local Settings = OmaUFSettings; local baseColor = Settings.BaseColor; @@ -32,23 +32,27 @@ 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_UPDATE", 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.shield then + frame:RegisterUnitEvent("UNIT_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); @@ -58,6 +62,7 @@ local registerUnitEvents = M.RegisterUnitEvents; local function updateMaxHealth(frame, unit) frame.health.max = UnitHealthMax(unit); end +M.UpdateMaxHealth = updateMaxHealth; local function updateHealth(frame, unit) local current, max = UnitHealth(unit), frame.health.max; @@ -73,18 +78,21 @@ local function updateHealth(frame, unit) frame.health:Show(); end end +M.UpdateHealth = updateHealth; local function updateHealthText(frame, unit) if UnitIsDeadOrGhost(unit) then 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 @@ -92,10 +100,12 @@ local function updateHealthText(frame, unit) end end end +M.UpdateHealthText = updateHealthText; local function updateMaxPower(frame, unit) frame.mana.max = UnitPowerMax(unit); end +M.UpdateMaxPower = updateMaxPower; local function updatePower(frame, unit) local current, max = UnitPower(unit), frame.mana.max; @@ -110,6 +120,7 @@ local function updatePower(frame, unit) frame.mana:Show(); end end +M.UpdatePower = updatePower; local function updatePowerText(frame, unit) local current, max = UnitPower(unit), frame.mana.max; @@ -122,28 +133,19 @@ local function updatePowerText(frame, unit) frame.manaText:Hide(); end end +M.UpdatePowerText = updatePowerText; local function updatePowerColor(frame, unit) frame.mana:SetVertexColor(unpack(powerColors[UnitPowerType(unit)])); end +M.UpdatePowerColor = updatePowerColor; local function updateName(frame, unit) local name = UnitName(unit); if not name then return end - frame.name:SetText(ssub(name, 1, 10)); -end - -local function updateHealPred(frame, unit) - local incoming = UnitGetIncomingHeals(unit) or 0; - if incoming > 0 then - local space = frame.width - frame.health:GetWidth() + 1; - incoming = (incoming / frame.health.max) * frame.width; - frame.healpred:SetWidth(min(space, incoming)); - frame.healpred:Show(); - else - frame.healpred:Hide(); - end + frame.name:SetText(ssub(name, 1, frame.name.count)); end +M.UpdateName = updateName; local function updateShield(frame, unit) local shield = UnitGetTotalAbsorbs(unit) or 0; @@ -167,22 +169,7 @@ local function updateShield(frame, unit) frame.shieldhl:Hide(); end end - -local function updateHealAbsorb(frame, unit) - local absorb = UnitGetTotalHealAbsorbs(unit) or 0; - if absorb > 0 then - local space = frame.health:GetWidth(); - absorb = (absorb / frame.health.max) * frame.width; - frame.healabsorb:SetWidth(min(space, absorb)); - frame.healabsorb:Show(); - else - frame.healabsorb:Hide(); - end -end - -local function updateAuras(frame, unit) - if frame.auras then updateAuraFrames(frame, unit) end -end +M.UpdateShield = updateShield; local function updateAggro(frame, unit) local status = UnitThreatSituation(unit); @@ -192,10 +179,12 @@ local function updateAggro(frame, unit) frame.base:SetVertexColor(unpack(baseColor)); end end +M.UpdateAggro = updateAggro; +-- 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; @@ -208,6 +197,7 @@ local function updateVehicle(frame) registerUnitEvents(frame); end end +M.UpdateVehicle = updateVehicle; local function updateLevelText(frame, unit, levelup) if levelup then @@ -238,6 +228,7 @@ local function updateLevelText(frame, unit, levelup) frame.level:SetFormattedText("%s%s", leveltext, classtext); end end +M.UpdateLevelText = updateLevelText; local function updateStatus(frame, unit) -- coords from FrameXML/PlayerFrame.lua @@ -251,7 +242,12 @@ local function updateStatus(frame, unit) frame.status:Hide(); end end +M.UpdateStatus = updateStatus; +local pvpIcons = { + Alliance = "Interface\\TARGETINGFRAME\\UI-PVP-Alliance", + Horde = "Interface\\TARGETINGFRAME\\UI-PVP-Horde" +}; local function updatePVP(frame, unit) if UnitIsPVPFreeForAll(unit) then frame.pvp:SetTexture("Interface\\TARGETINGFRAME\\UI-PVP-FFA"); @@ -267,7 +263,7 @@ local function updatePVP(frame, unit) faction = "Horde"; end end - frame.pvp:SetTexture("Interface\\TARGETINGFRAME\\UI-PVP-"..faction); + frame.pvp:SetTexture(pvpIcons[faction]); frame.pvp:Show(); else frame.pvp:Hide(); @@ -276,6 +272,7 @@ local function updatePVP(frame, unit) frame.pvp:Hide(); end end +M.UpdatePVP = updatePVP; local function updateLeaderIcon(frame, unit) if UnitIsGroupLeader(frame.unit) then @@ -295,6 +292,7 @@ local function updateLeaderIcon(frame, unit) frame.leader:Hide(); end end +M.UpdateLeaderIcon = updateLeaderIcon; local function updateHealthColor(frame, unit) if not UnitPlayerControlled(unit) and UnitIsTapDenied(unit) then @@ -313,30 +311,35 @@ local function updateHealthColor(frame, unit) frame.health:SetVertexColor(UnitSelectionColor(unit)); end end +M.UpdateHealthColor = updateHealthColor; + +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 +M.UpdateRaidMarker = updateRaidMarker; 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 end, - ["UNIT_POWER"] = function(frame) + ["UNIT_POWER_UPDATE"] = function(frame) updatePower(frame, frame.displayed); updatePowerText(frame, frame.displayed); end, ["UNIT_AURA"] = function(frame) updateAuras(frame, frame.displayed); end, - ["UNIT_HEAL_PREDICTION"] = function(frame) - updateHealPred(frame, frame.displayed); - end, ["UNIT_ABSORB_AMOUNT_CHANGED"] = function(frame) updateShield(frame, frame.displayed); end, - ["UNIT_HEAL_ABSORB_AMOUNT_CHANGED"] = function(frame) - updateHealAbsorb(frame, frame.displayed); - end, ["UNIT_THREAT_SITUATION_UPDATE"] = function(frame) updateAggro(frame, frame.displayed); end, @@ -344,8 +347,7 @@ 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 end, ["UNIT_MAXPOWER"] = function(frame) updateMaxPower(frame, frame.displayed); @@ -392,26 +394,30 @@ 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.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,7 +429,9 @@ 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); + return eventFuncs[event](self, arg1); end