diff --git a/src/types/triggers/auratrigger.lua b/src/types/triggers/auratrigger.lua index 3c33eb3..79ba382 100644 --- a/src/types/triggers/auratrigger.lua +++ b/src/types/triggers/auratrigger.lua @@ -38,7 +38,8 @@ function AuraTrigger.CreateFromConfig(unit, config) config.spellId, config.own, config.requiredCount, - config.invert + config.invert, + config.defaultData ) unit.auras:AddTrigger(trigger) return trigger @@ -57,8 +58,9 @@ end ---@param own boolean ---@param requiredCount number | nil ---@param invert boolean | nil -function AuraTrigger:Init(spellId, own, requiredCount, invert) - Trigger.Init(self, invert) +---@param defaultData table | nil +function AuraTrigger:Init(spellId, own, requiredCount, invert, defaultData) + Trigger.Init(self, invert, defaultData) self.spellId = spellId self.requiredCount = requiredCount or 1 self.own = own @@ -68,7 +70,7 @@ end --- Reset the AuraTrigger to the default state function AuraTrigger:Reset() self.count = 0 - self:SetState(self.count >= self.requiredCount, nil, false) + self:SetState(self.count >= self.requiredCount, false) end ---Check if a given aura matches this AuraTrigger @@ -90,15 +92,17 @@ function AuraTrigger:AddAura(aura) return end self.count = self.count + 1 - self:SetState(self.count >= self.requiredCount, {stacks=aura.applications}, false) + self:SetData({stacks=aura.applications}) + self:SetState(self.count >= self.requiredCount, false) end ---Inform the trigger about an updated aura ---@param before UnitAuraInfo ---@param after UnitAuraInfo function AuraTrigger:UpdateAura(before, after) + self:SetData({stacks=after.applications}) if self.active then - self.indicator:Update({stacks=after.applications}) + self.indicator:Update(self.data) end end @@ -109,5 +113,6 @@ function AuraTrigger:RemoveAura(aura) return end self.count = self.count - 1 - self:SetState(self.count >= self.requiredCount, nil, false) + self:SetData({}) + self:SetState(self.count >= self.requiredCount, false) end diff --git a/src/types/triggers/multitrigger.lua b/src/types/triggers/multitrigger.lua index 025ee92..71909e5 100644 --- a/src/types/triggers/multitrigger.lua +++ b/src/types/triggers/multitrigger.lua @@ -92,7 +92,8 @@ function MultiTrigger:OnChildActivate(idx, trigger, data) table.sort(activeChildren) -- The highest priority active trigger has changed if activeChild ~= activeChildren[1] then - self:SetState(true, data) + self:SetData(data) + self:SetState(true, true) end end @@ -113,8 +114,15 @@ function MultiTrigger:OnChildDeactivate(idx, trigger, data) end end table.remove(activeChildren, found) - if activeChild ~= activeChildren[1] then - self:SetState(activeChildren[1] ~= nil, childrenData[1], true) + local newActiveChild = activeChildren[1] + if activeChild ~= newActiveChild then + if activeChildren[1] ~= nil then + self:SetData(childrenData[newActiveChild]) + self:SetState(true, true) + else + self:SetData({}) + self:SetState(false, false) + end end end diff --git a/src/types/triggers/statustrigger.lua b/src/types/triggers/statustrigger.lua index c04249a..520d13a 100644 --- a/src/types/triggers/statustrigger.lua +++ b/src/types/triggers/statustrigger.lua @@ -30,7 +30,7 @@ types.StatusTrigger = StatusTrigger ---@param config table function StatusTrigger.CreateFromConfig(unit, config) local trigger = StatusTrigger:new(config.status, config.requiredCount, - config.invert) + config.invert, config.defaultData) unit.auras:AddTrigger(trigger) return trigger end @@ -47,8 +47,8 @@ end ---@param status string The kind of status to trigger on ---@param requiredCount number | nil ---@param invert boolean | nil -function StatusTrigger:Init(status, requiredCount, invert) - Trigger.Init(self, invert) +function StatusTrigger:Init(status, requiredCount, invert, defaultData) + Trigger.Init(self, invert, defaultData) self.status = status self.requiredCount = requiredCount or 1 self.invert = invert or false @@ -59,5 +59,5 @@ end -- status: -- Must be a valid UnitAuraInfo function StatusTrigger:UpdateStatus(count) - self:SetState(count >= self.requiredCount, nil, false) + self:SetState(count >= self.requiredCount, false) end diff --git a/src/types/triggers/trigger.lua b/src/types/triggers/trigger.lua index 700684b..6a80bc8 100644 --- a/src/types/triggers/trigger.lua +++ b/src/types/triggers/trigger.lua @@ -23,6 +23,8 @@ local types = omi.GetModule("types") ---@class Trigger: Object ---@field active boolean ---@field invert boolean +---@field indicator Indicator +---@field data table The most recent data updated by the data source local Trigger = types.CreateClass("Trigger") types.Trigger = Trigger @@ -36,10 +38,25 @@ end --- Initialize a new Trigger object ---@param invert boolean|nil -function Trigger:Init(invert) +---@param defaultData table|nil default data that is always present when this trigger updates an indicator +function Trigger:Init(invert, defaultData) invert = invert or false self.invert = invert self.active = invert + self.defaultData = defaultData + self:SetData({}) +end + +---Save new data from the datasource into the trigger. This method will make +---sure the default data is always present +---@param data table +function Trigger:SetData(data) + if self.defaultData then + for k, v in pairs(self.defaultData) do + data[k] = v + end + end + self.data = data end --- Set the target of the Trigger. @@ -49,30 +66,29 @@ end function Trigger:SetTarget(target) self.indicator = target if self.active then - target:Show() + target:Show(self.data) end end ---Set the state of the trigger. Will activate the indicator if needed. ----@param data table | nil ---@param state boolean -function Trigger:SetState(state, data, doUpdate) +function Trigger:SetState(state, doUpdate) state = state ~= self.invert -- state xor inverted if self.active ~= state then if state then - self.indicator:Show(data) + self.indicator:Show(self.data) else self.indicator:Hide() end self.active = state elseif doUpdate and self.active then - self.indicator:Update(data) + self.indicator:Update(self.data) end end -- Reset the trigger to the default state. If this changes the activation of the -- trigger then the target will be notified. function Trigger:Reset() - self:SetState(false, nil, false) + self:SetState(false, false) end