Files
coa-elvui/ElvUI/Libraries/oUF_Plugins/oUF_ResComm/oUF_ResComm.lua
T
2024-04-19 09:05:57 -07:00

175 lines
4.5 KiB
Lua

--[[
# Element: Resurrect Indicator
Handles the visibility and updating of an indicator based on the unit's incoming resurrect status.
## Widget
ResurrectIndicator - A `Texture` used to display if the unit has an incoming resurrect.
## Notes
A default texture will be applied if the widget is a Texture and doesn't have a texture or a color set.
## Examples
-- Position and size
local ResurrectIndicator = self:CreateTexture(nil, 'OVERLAY')
ResurrectIndicator:SetSize(16, 16)
ResurrectIndicator:SetPoint('TOPRIGHT', self)
-- Register it with oUF
self.ResurrectIndicator = ResurrectIndicator
--]]
local _, ns = ...
local oUF = ns.oUF
assert(oUF, "oUF_ResComm was unable to locate oUF install")
local LRC = LibStub("LibResComm-1.0")
local tremove = table.remove
local UnitIsDead = UnitIsDead
local UnitIsGhost = UnitIsGhost
local UnitName = UnitName
local enabledUF, enabled = {}
local function Update(self, event, unit, succeeded)
if not unit or self.unit ~= unit then return end
local element = self.ResurrectIndicator
--[[ Callback: ResurrectIndicator:PreUpdate()
Called before the element has been updated.
* self - the ResurrectIndicator element
--]]
if element.PreUpdate then
element:PreUpdate()
end
local incomingResurrect
if UnitIsDead(unit) or UnitIsGhost(unit) then
if event == "ResComm_ResStart" or event == "ResComm_CanRes" or event == "ResComm_Ressed" or (event == "ResComm_ResEnd" and succeeded) then
if event ~= "ResComm_ResStart" then
element.ressed = true
end
element:Show()
incomingResurrect = true
elseif (event == "ResComm_ResEnd" and not succeeded and not element.ressed) or event == "ResComm_ResExpired" then
element:Hide()
element.ressed = nil
end
else
element:Hide()
end
--[[ Callback: ResurrectIndicator:PostUpdate(incomingResurrect)
Called after the element has been updated.
* self - the ResurrectIndicator element
* incomingResurrect - indicates if the unit has an incoming resurrection (boolean)
--]]
if element.PostUpdate then
return element:PostUpdate(incomingResurrect)
end
end
local function Path(self, ...)
--[[ Override: ResurrectIndicator.Override(self, event, unit)
Used to completely override the internal update function.
* self - the parent object
* event - the event triggering the update (string)
* unit - the unit accompanying the event (string)
--]]
return (self.ResurrectIndicator.Override or Update) (self, ...)
end
local function ForceUpdate(element)
return Path(element.__owner, "ForceUpdate", element.__owner.unit)
end
local function ResComm_Update(event, ...)
local sender, endTime, target, succeeded
if event == "ResComm_ResStart" then
sender, endTime, target = ...
elseif event == "ResComm_ResEnd" then
sender, target, succeeded = ...
else
target = ...
end
for i = 1, #enabledUF do
local frame = enabledUF[i]
if frame.unit and UnitName(frame.unit) == target then
Path(frame, event, frame.unit, succeeded)
end
end
end
local function ToggleCallbacks(toggle)
if toggle and not enabled and #enabledUF > 0 then
LRC.RegisterCallback("oUF_ResComm", "ResComm_CanRes", ResComm_Update)
LRC.RegisterCallback("oUF_ResComm", "ResComm_Ressed", ResComm_Update)
LRC.RegisterCallback("oUF_ResComm", "ResComm_ResExpired", ResComm_Update)
LRC.RegisterCallback("oUF_ResComm", "ResComm_ResStart", ResComm_Update)
LRC.RegisterCallback("oUF_ResComm", "ResComm_ResEnd", ResComm_Update)
enabled = true
elseif not toggle and enabled and #enabledUF == 0 then
LRC.UnregisterCallback("oUF_ResComm", "ResComm_CanRes")
LRC.UnregisterCallback("oUF_ResComm", "ResComm_Ressed")
LRC.UnregisterCallback("oUF_ResComm", "ResComm_ResExpired")
LRC.UnregisterCallback("oUF_ResComm", "ResComm_ResStart")
LRC.UnregisterCallback("oUF_ResComm", "ResComm_ResEnd")
enabled = nil
end
end
local function Enable(self)
local element = self.ResurrectIndicator
if element then
element.__owner = self
element.ForceUpdate = ForceUpdate
self:RegisterEvent("UNIT_HEALTH", Path)
if element:IsObjectType("Texture") and not element:GetTexture() then
element:SetTexture([[Interface\Icons\Spell_Holy_Resurrection]])
end
enabledUF[#enabledUF + 1] = self
ToggleCallbacks(true)
return true
end
end
local function Disable(self)
local element = self.ResurrectIndicator
if element then
element:Hide()
self:UnregisterEvent("UNIT_HEALTH", Path)
for i = 1, #enabledUF do
if enabledUF[i] == self then
tremove(enabledUF, i)
break
end
end
ToggleCallbacks(false)
end
end
oUF:AddElement("ResurrectIndicator", Path, Enable, Disable)