X-Git-Url: https://www.aleksib.fi/git/wowui.git/blobdiff_plain/971304090ee92e27a82533041bd6b222b702552c..521041f750bcf5d25bbf7fcab475e47665cb748b:/kehys/events.lua diff --git a/kehys/events.lua b/kehys/events.lua index f030057..4a9264f 100644 --- a/kehys/events.lua +++ b/kehys/events.lua @@ -22,6 +22,8 @@ local READY_CHECK_NOT_READY_TEXTURE = READY_CHECK_NOT_READY_TEXTURE; local READY_CHECK_WAITING_TEXTURE = READY_CHECK_WAITING_TEXTURE; local _, addon = ...; +addon.Events = {}; +local guids = addon.FrameGuids; local baseColor = {0, 0, 0}; local overlayColorDispel = {1, 0.5, 0, 0.5}; local overlayColorCharm = {0.8, 0, 1, 0.5}; @@ -30,7 +32,6 @@ local width = 80; function addon.RegisterEvents(frame) frame:RegisterEvent("PLAYER_ENTERING_WORLD"); - frame:RegisterEvent("PLAYER_ROLES_ASSIGNED"); frame:RegisterEvent("READY_CHECK"); frame:RegisterEvent("READY_CHECK_FINISHED"); frame:RegisterEvent("GROUP_ROSTER_UPDATE"); @@ -41,16 +42,8 @@ end function addon.RegisterUnitEvents(frame) -- events are taken from FrameXML/CompactUnitFrame.lua local displayed = frame.unit ~= frame.displayed and frame.displayed or nil; - frame:RegisterUnitEvent("UNIT_HEALTH_FREQUENT", frame.unit, displayed); - frame:RegisterUnitEvent("UNIT_MAXHEALTH", frame.unit, displayed); 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("PLAYER_FLAGS_CHANGED", frame.unit, displayed); frame:RegisterUnitEvent("READY_CHECK_CONFIRM", frame.unit, displayed); frame:RegisterUnitEvent("UNIT_ENTERED_VEHICLE", frame.unit, displayed); frame:RegisterUnitEvent("UNIT_EXITED_VEHICLE", frame.unit, displayed); @@ -58,54 +51,6 @@ function addon.RegisterUnitEvents(frame) end local registerUnitEvents = addon.RegisterUnitEvents; -local function updateText(frame, unit) - if UnitIsDeadOrGhost(unit) then - frame.dead = true; - frame.text:SetText("Dead"); - frame.text:Show(); - elseif not UnitIsConnected(unit) then - frame.text:SetText("DC"); - frame.text:Show(); - elseif UnitIsAFK(unit) then - frame.text:SetText("afk"); - frame.text:Show(); - elseif UnitIsDND(unit) then - frame.text:SetText("dnd"); - frame.text:Show(); - else - frame.text:Hide(); - end -end - -local function updateMaxHealth(frame, unit) - frame.health.max = UnitHealthMax(unit); -end - -local function updateHealth(frame, unit) - local current, max = UnitHealth(unit), frame.health.max; - if current > max or max <= 0 then - -- somehow current health has gone over the maximum (missed maxhealth event possibly) - -- just put health bar full and update max health for next event - frame.health:SetWidth(width); - frame.health.width = width; - updateMaxHealth(frame, unit); - frame.health:Show(); - elseif current <= 0 or UnitIsDeadOrGhost(unit) then - frame.health:Hide(); - return updateText(frame, unit); -- update death - else - local w = current/max*width; - frame.health:SetWidth(w); - frame.health.width = w; - frame.health:Show(); - end - - if frame.dead and current > 0 then - frame.dead = nil; - updateText(frame, unit); -- update revive - end -end - local function updateName(frame, unit) local name = UnitName(unit); if not name then return end @@ -120,75 +65,7 @@ local function updateName(frame, unit) local color = RAID_CLASS_COLORS[class]; if color then frame.name:SetVertexColor(color.r, color.g, color.b) end end - -local function updateHealPred(frame, unit) - local incoming = UnitGetIncomingHeals(unit) or 0; - if incoming > 0 then - incoming = (incoming / frame.health.max) * width; - -- always at least 1 pixel space for heal prediction - frame.healpred:SetWidth(min(width - frame.health.width + 1, incoming)); - frame.healpred:Show(); - else - frame.healpred:Hide(); - end -end - -local function updateShield(frame, unit) - local shield = UnitGetTotalAbsorbs(unit) or 0; - if shield > 0 then - local space = width - frame.health.width; - shield = (shield / frame.health.max) * width; - if space == 0 then - frame.shield:Hide(); - frame.shieldhl:Show(); - elseif space < shield then - frame.shield:SetWidth(space); - frame.shield:Show(); - frame.shieldhl:Show(); - else - frame.shield:SetWidth(shield); - frame.shield:Show(); - frame.shieldhl:Hide(); - end - else - frame.shield:Hide(); - frame.shieldhl:Hide(); - end -end - -local function updateHealAbsorb(frame, unit) - local absorb = UnitGetTotalHealAbsorbs(unit) or 0; - if absorb > 0 then - absorb = (absorb / frame.health.max) * width; - frame.healabsorb:SetWidth(min(frame.health.width, absorb)); - frame.healabsorb:Show(); - else - frame.healabsorb:Hide(); - end -end - -local function updateAuras(frame, unit) - -- don't overlay charmed when in vehicle - if UnitIsCharmed(unit) and unit == frame.unit then - if frame.overlay.color ~= overlayColorCharm then - frame.overlay:SetVertexColor(unpack(overlayColorCharm)); - frame.overlay.color = overlayColorCharm; - frame.overlay:Show(); - end - elseif UnitDebuff(unit, 1, "RAID") ~= nil then - -- something dispellable - if frame.overlay.color ~= overlayColorDispel then - frame.overlay:SetVertexColor(unpack(overlayColorDispel)); - frame.overlay.color = overlayColorDispel; - frame.overlay:Show(); - end - else - if frame.overlay.color ~= nil then - frame.overlay.color = nil; - frame.overlay:Hide(); - end - end -end +addon.Events.UpdateName = updateName; local function updateAggro(frame, unit) local status = UnitThreatSituation(unit); @@ -198,6 +75,7 @@ local function updateAggro(frame, unit) frame.base:SetVertexColor(unpack(baseColor)); end end +addon.Events.UpdateAggro = updateAggro; local function updateVehicle(frame) local shouldTargetVehicle = UnitHasVehicleUI(frame.unit) and @@ -214,6 +92,7 @@ local function updateVehicle(frame) registerUnitEvents(frame); end end +addon.Events.UpdateVehicle = updateVehicle; local function updateRole(frame, unit) local role = UnitGroupRolesAssigned(unit); @@ -227,6 +106,7 @@ local function updateRole(frame, unit) frame.role:Hide(); end end +addon.Events.UpdateRole = updateRole; local function updateReadyCheck(frame, unit) local status = GetReadyCheckStatus(unit); @@ -243,6 +123,7 @@ local function updateReadyCheck(frame, unit) frame.ready:Hide() end end +addon.Events.UpdateReadyCheck = updateReadyCheck; local function updateRaidMarker(frame, unit) local index = GetRaidTargetIndex(unit); @@ -253,40 +134,21 @@ local function updateRaidMarker(frame, unit) frame.targeticon:Hide(); end end +addon.Events.UpdateRaidMarker = updateRaidMarker; local eventFuncs = { - ["UNIT_HEALTH"] = function(frame) - updateHealth(frame, frame.displayed); - updateShield(frame, frame.displayed); - updateHealAbsorb(frame, frame.displayed); - -- no heal prediction update, that doesn't overflow too much - 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, - ["UNIT_MAXHEALTH"] = function(frame) - updateMaxHealth(frame, frame.displayed); - updateHealth(frame, frame.displayed); - updateShield(frame, frame.displayed); - updateHealAbsorb(frame, frame.displayed); - end, ["UNIT_NAME_UPDATE"] = function(frame) updateName(frame, frame.unit); - end, - ["UNIT_CONNECTION"] = function(frame) - updateText(frame, frame.displayed); + if frame.guid then + guids[frame.guid] = nil; + end + frame.guid = UnitGUID(frame.unit); + if frame.guid then + guids[frame.guid] = frame; + end end, ["PLAYER_ROLES_ASSIGNED"] = function(frame) updateRole(frame, frame.unit); @@ -300,21 +162,21 @@ local eventFuncs = { ["UPDATE_ALL_BARS"] = function(frame) updateRole(frame, frame.unit); updateVehicle(frame); - updateMaxHealth(frame, frame.displayed); - updateHealth(frame, frame.displayed); - updateText(frame, frame.displayed); - updateAuras(frame, frame.displayed); - updateShield(frame, frame.displayed); - updateHealPred(frame, frame.displayed); - updateHealAbsorb(frame, frame.displayed); updateAggro(frame, frame.displayed); updateName(frame, frame.unit); updateReadyCheck(frame, frame.unit); updateRaidMarker(frame, frame.displayed); + + if frame.guid then + guids[frame.guid] = nil; + end + frame.guid = UnitGUID(frame.unit); + if frame.guid then + guids[frame.guid] = frame; + end + -- TODO update initial aura state end, }; -eventFuncs["UNIT_HEALTH_FREQUENT"] = eventFuncs["UNIT_HEALTH"]; -eventFuncs["PLAYER_FLAGS_CHANGED"] = eventFuncs["UNIT_CONNECTION"]; eventFuncs["READY_CHECK_CONFIRM"] = eventFuncs["READY_CHECK"]; eventFuncs["READY_CHECK_FINISHED"] = eventFuncs["READY_CHECK"]; eventFuncs["UNIT_ENTERED_VEHICLE"] = eventFuncs["UPDATE_ALL_BARS"];