Make Trigger responsible for default data
Trigger now has a new method Trigger:SetData and two new fields Trigger.defaultData and Trigger.data Whenever SetData is used it ensures that all the keys and values from defaultData are present in the new data. The data argument from Trigger:SetState has been removed and it will now always use the Trigger.Data field for notifying indicators
This commit is contained in:
@@ -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
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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<string,any> | 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
|
||||
|
||||
|
Reference in New Issue
Block a user