X-Git-Url: https://www.aleksib.fi/git/wowui.git/blobdiff_plain/971304090ee92e27a82533041bd6b222b702552c..8b1be3abbc34907332f85244ecbdb118365b6e83:/kehys/events.lua?ds=sidebyside diff --git a/kehys/events.lua b/kehys/events.lua index f030057..ae201dd 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,85 +32,42 @@ 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"); frame:RegisterEvent("RAID_TARGET_UPDATE"); + if frame.unit == "player" then frame:RegisterEvent("PLAYER_ALIVE") end if frame.unit == "focus" then frame:RegisterEvent("PLAYER_FOCUS_CHANGED") end + if frame.unit == "target" then frame:RegisterEvent("PLAYER_TARGET_CHANGED") end + if frame.boss then frame:RegisterEvent("INSTANCE_ENCOUNTER_ENGAGE_UNIT") end + if frame.raid then + frame:RegisterEvent("PLAYER_REGEN_DISABLED"); + frame:RegisterEvent("READY_CHECK"); + frame:RegisterEvent("READY_CHECK_FINISHED"); + frame:RegisterEvent("GROUP_ROSTER_UPDATE"); + end 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); frame:RegisterUnitEvent("UNIT_PET", frame.unit, displayed); -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(); + if frame.unit == "focus" or frame.unit == "target" or frame.boss then + frame:RegisterUnitEvent("UNIT_TARGETABLE_CHANGED", frame.unit, displayed); 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(); + if frame.raid or frame.unit ~= "player" then + frame:RegisterUnitEvent("UNIT_NAME_UPDATE", frame.unit, displayed); + frame:RegisterUnitEvent("UNIT_FACTION", frame.unit, displayed); end - - if frame.dead and current > 0 then - frame.dead = nil; - updateText(frame, unit); -- update revive + if frame.raid then + frame:RegisterUnitEvent("UNIT_THREAT_SITUATION_UPDATE", frame.unit, displayed); + frame:RegisterUnitEvent("READY_CHECK_CONFIRM", frame.unit, displayed); end end +local registerUnitEvents = addon.RegisterUnitEvents; local function updateName(frame, unit) local name = UnitName(unit); - if not name then return end + if not name or not frame.name then return end name = ssub(name, 1, 6); if frame.unit == unit then frame.name:SetText(name); @@ -118,77 +77,25 @@ local function updateName(frame, unit) local _, class = UnitClass(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(); + frame.classname = class; + + if color then + if not frame.raid then + if not UnitPlayerControlled(unit) and UnitIsTapDenied(unit) then + frame.health:SetVertexColor(0.5, 0.5, 0.5); + elseif UnitIsPlayer(unit) then + frame.health:SetVertexColor(color.r, color.g, color.b); + elseif UnitPlayerControlled(unit) then + frame.health:SetVertexColor(0, 1, 0); + else + frame.health:SetVertexColor(UnitSelectionColor(unit)); + end 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(); + frame.name:SetVertexColor(color.r, color.g, color.b); end end end +addon.Events.UpdateName = updateName; local function updateAggro(frame, unit) local status = UnitThreatSituation(unit); @@ -198,10 +105,11 @@ 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 - UnitTargetsVehicleInRaidUI(frame.unit) and UnitExists(frame.vehicle); + UnitTargetsVehicleInRaidUI(frame.unit) and frame.vehicle and UnitExists(frame.vehicle); if shouldTargetVehicle then if not frame.inVehicle then frame.inVehicle = true; @@ -214,19 +122,21 @@ local function updateVehicle(frame) registerUnitEvents(frame); end end +addon.Events.UpdateVehicle = updateVehicle; local function updateRole(frame, unit) - local role = UnitGroupRolesAssigned(unit); - if role == "HEALER" then + frame.rolename = UnitGroupRolesAssigned(unit); + if frame.rolename == "HEALER" then frame.role:SetTexCoord(0.75, 1, 0, 1); frame.role:Show(); - elseif role == "TANK" then + elseif frame.rolename == "TANK" then frame.role:SetTexCoord(0.5, 0.75, 0, 1); frame.role:Show(); else frame.role:Hide(); end end +addon.Events.UpdateRole = updateRole; local function updateReadyCheck(frame, unit) local status = GetReadyCheckStatus(unit); @@ -243,6 +153,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 +164,26 @@ 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); + if frame.raid then + if frame.guid then + guids[frame.guid] = nil; + end + frame.guid = UnitGUID(frame.unit); + if frame.guid then + guids[frame.guid] = frame; + end + end end, - ["UNIT_CONNECTION"] = function(frame) - updateText(frame, frame.displayed); + ["UNIT_FACTION"] = function(frame) + updateName(frame, frame.unit); end, ["PLAYER_ROLES_ASSIGNED"] = function(frame) updateRole(frame, frame.unit); @@ -297,24 +194,48 @@ local eventFuncs = { ["RAID_TARGET_UPDATE"] = function(frame) updateRaidMarker(frame, frame.displayed); end, + ["PLAYER_REGEN_DISABLED"] = function(frame) + if frame.raid then + -- clear buff status on entering combat, should also use UnitAura to re-fill + frame.tankcd = {}; + frame.alert = {}; + frame.stacks = {}; + frame.heal = {}; + frame.buff1 = {}; + frame.buff2 = {}; + frame.stagger = {}; + addon.SetAuras(frame.unit, frame.guid); + end + end, ["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.raid or frame.unit ~= "player" then + updateName(frame, frame.unit); + end + if frame.raid then + updateRole(frame, frame.unit); + updateAggro(frame, frame.displayed); + updateReadyCheck(frame, frame.unit); + if frame.guid then + guids[frame.guid] = nil; + end + frame.guid = UnitGUID(frame.unit); + if frame.guid then + guids[frame.guid] = frame; + end + frame.tankcd = {}; + frame.alert = {}; + frame.stacks = {}; + frame.heal = {}; + frame.buff1 = {}; + frame.buff2 = {}; + addon.SetAuras(frame.unit, frame.guid); + else + frame.prev = {}; + end 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"]; @@ -323,6 +244,10 @@ 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_FOCUS_CHANGED"] = eventFuncs["UPDATE_ALL_BARS"]; +eventFuncs["PLAYER_TARGET_CHANGED"] = eventFuncs["UPDATE_ALL_BARS"]; +eventFuncs["UNIT_TARGETABLE_CHANGED"] = eventFuncs["UPDATE_ALL_BARS"]; +eventFuncs["INSTANCE_ENCOUNTER_ENGAGE_UNIT"] = eventFuncs["UPDATE_ALL_BARS"]; +eventFuncs["PLAYER_ALIVE"] = eventFuncs["UPDATE_ALL_BARS"]; function addon.UnitEvent(self, event) return eventFuncs[event](self);