X-Git-Url: https://www.aleksib.fi/git/wowui.git/blobdiff_plain/306a5758edfa15a3005853642548eb57a4fba236..b00e4e3ae9ca9e8837d92d8f594140ab17d4cc68:/kehys/events.lua diff --git a/kehys/events.lua b/kehys/events.lua index 16c6479..170c029 100644 --- a/kehys/events.lua +++ b/kehys/events.lua @@ -23,6 +23,7 @@ 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}; @@ -31,93 +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 -addon.Events.UpdateText = updateText; - -local function updateMaxHealth(frame, unit) - frame.health.max = UnitHealthMax(unit); -end -addon.Events.UpdateMaxHealth = updateMaxHealth; - -local function updateHealth(frame, unit) - local current, max = UnitHealth(unit), frame.health.max; - if current == frame.prev.health then - return false; - end - frame.prev.health = current; - 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(); - 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 - return true; end -addon.Events.UpdateHealth = updateHealth; +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); @@ -127,83 +77,23 @@ 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 -addon.Events.UpdateName = updateName; - -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)); - if not frame.healpred:IsShown() then frame.healpred:Show() end - else - if frame.healpred:IsShown() then frame.healpred:Hide() end - end -end -addon.Events.UpdateHealPred = updateHealPred; - -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 - if frame.shield:IsShown() then frame.shield:Hide() end - if not frame.shieldhl:IsShown() then frame.shieldhl:Show() end - elseif space < shield then - frame.shield:SetWidth(space); - if not frame.shield:IsShown() then frame.shield:Show() end - if not frame.shieldhl:IsShown() then frame.shieldhl:Show() end + 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); - if not frame.shield:IsShown() then frame.shield:Show() end - if frame.shieldhl:IsShown() then frame.shieldhl:Hide() end + frame.name:SetVertexColor(color.r, color.g, color.b); end - else - if frame.shield:IsShown() then frame.shield:Hide() end - if frame.shieldhl:IsShown() then frame.shieldhl:Hide() end - end -end -addon.Events.UpdateShield = updateShield; - -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 -addon.Events.UpdateHealAbsorb = updateHealAbsorb; - -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 - else--]] - if UnitDebuff(unit, 1, "RAID") ~= nil then - -- something dispellable - if frame.overlay.color ~= overlayColorDispel then - frame.overlay:SetVertexColor(unpack(overlayColorDispel)); - frame.overlay.color = overlayColorDispel; - if not frame.overlay:IsShown() then frame.overlay:Show() end - end - else - if frame.overlay.color ~= nil then - frame.overlay.color = nil; - if frame.overlay:IsShown() then frame.overlay:Hide() end - end - end -end -addon.Events.UpdateAuras = updateAuras; +addon.Events.UpdateName = updateName; local function updateAggro(frame, unit) local status = UnitThreatSituation(unit); @@ -217,7 +107,7 @@ 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; @@ -275,39 +165,23 @@ end addon.Events.UpdateRaidMarker = updateRaidMarker; local eventFuncs = { - ["UNIT_HEALTH"] = function(frame) - if updateHealth(frame, frame.displayed) then - updateShield(frame, frame.displayed); - updateHealAbsorb(frame, frame.displayed); - -- no heal prediction update, that doesn't overflow too much - end - 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); @@ -318,24 +192,47 @@ 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 = {}; + 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"]; @@ -344,6 +241,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);