Move ivert logic and trigger logic into Trigger
The base Trigger class is now responsible for inverting the trigger state and also for signaling trigger activation to the target/indicator. In addition the following non-function changes also occured: - The triggers moved into their own directory - The trigger code has been annotated to help lua-language-server deduce type information - AuraTrigger was moved into its own file All these changes should make future development of other triggers easier
This commit is contained in:
@@ -9,7 +9,8 @@ main.lua
|
|||||||
|
|
||||||
types/types.lua
|
types/types.lua
|
||||||
types/object.lua
|
types/object.lua
|
||||||
types/trigger.lua
|
types/triggers/trigger.lua
|
||||||
|
types/triggers/auratrigger.lua
|
||||||
types/statusbar.lua
|
types/statusbar.lua
|
||||||
types/auralist.lua
|
types/auralist.lua
|
||||||
types/indicator.lua
|
types/indicator.lua
|
||||||
|
@@ -1,151 +0,0 @@
|
|||||||
-- Copyright 2023 <omicron.me@protonmail.com>
|
|
||||||
--
|
|
||||||
-- This file is part of Omicron Frames
|
|
||||||
--
|
|
||||||
-- Omicron Frames is free software: you can redistribute it and/or modify it
|
|
||||||
-- under the terms of the GNU General Public License as published by the Free
|
|
||||||
-- Software Foundation, either version 3 of the License, or (at your option)
|
|
||||||
-- any later version.
|
|
||||||
--
|
|
||||||
-- Omicron Frames is distributed in the hope that it will be useful, but
|
|
||||||
-- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
||||||
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
||||||
-- more details.
|
|
||||||
--
|
|
||||||
-- You should have received a copy of the GNU General Public License along with
|
|
||||||
-- Omicron Frames. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
local omi = select(2, ...)
|
|
||||||
local types = omi.GetModule("types")
|
|
||||||
|
|
||||||
---
|
|
||||||
-- Trigger objects provide a link between indicators and some data source. They
|
|
||||||
-- can pass data from the data source into the trigger. This is just a
|
|
||||||
-- supertype for all indicators and should not be constructed on its own. It
|
|
||||||
-- has no functionality other than providing default implementations that do
|
|
||||||
-- nothing.
|
|
||||||
types.Trigger = types.CreateClass("Trigger")
|
|
||||||
local Trigger = types.Trigger
|
|
||||||
|
|
||||||
|
|
||||||
-- Initialize a new Trigger object
|
|
||||||
-- indicator:
|
|
||||||
-- The indicator that gets activated by this trigger.
|
|
||||||
function Trigger:Init(indicator)
|
|
||||||
self.indicator = indicator
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Returns whether or not the trigger is active
|
|
||||||
function Trigger:IsActive()
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Reset the trigger to the default state. Deactivates the indicator if it is
|
|
||||||
-- active when Reset is called.
|
|
||||||
function Trigger:Reset()
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
-- AuraTrigger is a trigger that can be attached to AuraList as datasource
|
|
||||||
types.AuraTrigger = types.CreateClass("AuraTrigger", Trigger)
|
|
||||||
local AuraTrigger = types.AuraTrigger
|
|
||||||
|
|
||||||
--- Initialize a new AuraTrigger object
|
|
||||||
-- indicator
|
|
||||||
-- Indicator that gets controlled by this trigger.
|
|
||||||
-- spellId
|
|
||||||
-- Spell id to trigger on
|
|
||||||
-- own
|
|
||||||
-- Only trigger on auras by the player
|
|
||||||
-- requiredCount=1
|
|
||||||
-- Number of aura applications to activate trigger
|
|
||||||
-- invert=false
|
|
||||||
-- Whether to invert trigger activation
|
|
||||||
function AuraTrigger:Init(indicator, spellId, own, requiredCount, invert)
|
|
||||||
Trigger.Init(self, indicator)
|
|
||||||
self.spellId = spellId
|
|
||||||
self.requiredCount = requiredCount or 1
|
|
||||||
self.own = own
|
|
||||||
self.count = 0
|
|
||||||
self.invert = invert or false
|
|
||||||
end
|
|
||||||
|
|
||||||
--- See Trigger:Reset
|
|
||||||
function AuraTrigger:Reset()
|
|
||||||
local before = self:IsActive()
|
|
||||||
self.count = 0
|
|
||||||
local after = self:IsActive()
|
|
||||||
if not before and after then
|
|
||||||
self.indicator:Show()
|
|
||||||
elseif before and not after then
|
|
||||||
self.indicator:Hide()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Return true if the aura matches the trigger
|
|
||||||
-- aura:
|
|
||||||
-- Must be a valid UnitAuraInfo structure.
|
|
||||||
function AuraTrigger:IsMatching(aura)
|
|
||||||
if aura.spellId ~= aura.spellId then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
if self.own and aura.sourceUnit ~= "player" then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Inform the trigger about an added aura
|
|
||||||
-- aura:
|
|
||||||
-- Must be a valid UnitAuraInfo
|
|
||||||
function AuraTrigger:AddAura(aura)
|
|
||||||
if not self:IsMatching(aura) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
self.count = self.count + 1
|
|
||||||
|
|
||||||
-- Be mindful, this works only if count always changes by 1.
|
|
||||||
if self.count == self.requiredCount then
|
|
||||||
if self.invert then
|
|
||||||
self.indicator:Hide()
|
|
||||||
else
|
|
||||||
self.indicator:Show()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Inform the trigger about an updated aura
|
|
||||||
-- before:
|
|
||||||
-- Must be a valid UnitAuraInfo for the aura before the update
|
|
||||||
-- after:
|
|
||||||
-- Must be a valid UnitAuraInfo for the aura after the update
|
|
||||||
function AuraTrigger:UpdateAura(before, after)
|
|
||||||
--
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Inform the trigger about an aura that got removed
|
|
||||||
-- aura:
|
|
||||||
-- Must be a valid UnitAuraInfo for the aura before it got removed
|
|
||||||
function AuraTrigger:RemoveAura(aura)
|
|
||||||
if not self:IsMatching(aura) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
self.count = self.count - 1
|
|
||||||
-- Be mindful, this works only if count always changes by 1.
|
|
||||||
if self.count == self.requiredCount - 1 then
|
|
||||||
if self.invert then
|
|
||||||
self.indicator:Show()
|
|
||||||
else
|
|
||||||
self.indicator:Hide()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Returns true if the trigger is active, false otherwise
|
|
||||||
function AuraTrigger:IsActive()
|
|
||||||
if self.invert then
|
|
||||||
return self.count < self.requiredCount
|
|
||||||
else
|
|
||||||
return self.count >= self.requiredCount
|
|
||||||
end
|
|
||||||
end
|
|
94
src/types/triggers/auratrigger.lua
Normal file
94
src/types/triggers/auratrigger.lua
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
-- Copyright 2023 <omicron.me@protonmail.com>
|
||||||
|
--
|
||||||
|
-- This file is part of Omicron Frames
|
||||||
|
--
|
||||||
|
-- Omicron Frames is free software: you can redistribute it and/or modify it
|
||||||
|
-- under the terms of the GNU General Public License as published by the Free
|
||||||
|
-- Software Foundation, either version 3 of the License, or (at your option)
|
||||||
|
-- any later version.
|
||||||
|
--
|
||||||
|
-- Omicron Frames is distributed in the hope that it will be useful, but
|
||||||
|
-- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
-- more details.
|
||||||
|
--
|
||||||
|
-- You should have received a copy of the GNU General Public License along with
|
||||||
|
-- Omicron Frames. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
local omi = select(2, ...)
|
||||||
|
local types = omi.GetModule("types")
|
||||||
|
---@class Trigger
|
||||||
|
local Trigger = types.Trigger
|
||||||
|
|
||||||
|
---AuraTrigger is a Trigger that can be attached to AuraList as datasource
|
||||||
|
---@class AuraTrigger: Trigger
|
||||||
|
---@field spellId number
|
||||||
|
---@field count number
|
||||||
|
---@field requiredCount number
|
||||||
|
local AuraTrigger = types.CreateClass("AuraTrigger", Trigger)
|
||||||
|
types.AuraTrigger = AuraTrigger
|
||||||
|
|
||||||
|
---@return AuraTrigger
|
||||||
|
function AuraTrigger.new(cls, ...)
|
||||||
|
--- I really dislike duplicating this everywhere but it makes
|
||||||
|
--lua-language-server able to deduce the type of Object:new calls and that
|
||||||
|
--is honestly worth it
|
||||||
|
return types.Object.new(cls, ...)
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Initialize a new AuraTrigger object
|
||||||
|
---@param spellId number
|
||||||
|
---@param own boolean
|
||||||
|
---@param requiredCount number | nil
|
||||||
|
---@param invert boolean | nil
|
||||||
|
function AuraTrigger:Init(spellId, own, requiredCount, invert)
|
||||||
|
Trigger.Init(self, invert)
|
||||||
|
self.spellId = spellId
|
||||||
|
self.requiredCount = requiredCount or 1
|
||||||
|
self.own = own
|
||||||
|
self.count = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Reset the AuraTrigger to the default state
|
||||||
|
function AuraTrigger:Reset()
|
||||||
|
self.count = 0
|
||||||
|
self:SetState(self.count >= self.requiredCount)
|
||||||
|
end
|
||||||
|
|
||||||
|
---Check if a given aura matches this AuraTrigger
|
||||||
|
---@param aura UnitAuraInfo
|
||||||
|
function AuraTrigger:IsMatching(aura)
|
||||||
|
if aura.spellId ~= aura.spellId then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
if self.own and aura.sourceUnit ~= "player" then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
---Inform the trigger about an added aura
|
||||||
|
---@param aura UnitAuraInfo
|
||||||
|
function AuraTrigger:AddAura(aura)
|
||||||
|
if not self:IsMatching(aura) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
self.count = self.count + 1
|
||||||
|
self:SetState(self.count >= self.requiredCount)
|
||||||
|
end
|
||||||
|
|
||||||
|
---Inform the trigger about an updated aura
|
||||||
|
---@param before UnitAuraInfo
|
||||||
|
---@param after UnitAuraInfo
|
||||||
|
function AuraTrigger:UpdateAura(before, after)
|
||||||
|
--
|
||||||
|
end
|
||||||
|
|
||||||
|
---Inform the trigger about an aura that got removed
|
||||||
|
---@param aura UnitAuraInfo
|
||||||
|
function AuraTrigger:RemoveAura(aura)
|
||||||
|
if not self:IsMatching(aura) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
self.count = self.count - 1
|
||||||
|
self:SetState(self.count >= self.requiredCount)
|
||||||
|
end
|
67
src/types/triggers/trigger.lua
Normal file
67
src/types/triggers/trigger.lua
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
-- Copyright 2023 <omicron.me@protonmail.com>
|
||||||
|
--
|
||||||
|
-- This file is part of Omicron Frames
|
||||||
|
--
|
||||||
|
-- Omicron Frames is free software: you can redistribute it and/or modify it
|
||||||
|
-- under the terms of the GNU General Public License as published by the Free
|
||||||
|
-- Software Foundation, either version 3 of the License, or (at your option)
|
||||||
|
-- any later version.
|
||||||
|
--
|
||||||
|
-- Omicron Frames is distributed in the hope that it will be useful, but
|
||||||
|
-- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||||
|
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
-- more details.
|
||||||
|
--
|
||||||
|
-- You should have received a copy of the GNU General Public License along with
|
||||||
|
-- Omicron Frames. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
local omi = select(2, ...)
|
||||||
|
local types = omi.GetModule("types")
|
||||||
|
|
||||||
|
--- Triggers objects provide a link between indicators and some data source. They
|
||||||
|
-- can pass data from the data source into the indicator. This is a supertype for
|
||||||
|
-- all triggers and should not be constructed on its own.
|
||||||
|
---@class Trigger: Object
|
||||||
|
---@field active boolean
|
||||||
|
---@field invert boolean
|
||||||
|
local Trigger = types.CreateClass("Trigger")
|
||||||
|
types.Trigger = Trigger
|
||||||
|
|
||||||
|
|
||||||
|
--- Initialize a new Trigger object
|
||||||
|
---@param invert boolean|nil
|
||||||
|
function Trigger:Init(invert)
|
||||||
|
invert = invert or false
|
||||||
|
self.invert = invert
|
||||||
|
self.active = invert
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Set the target of the Trigger.
|
||||||
|
-- The target will get notified every time the trigger changes state. If the trigger
|
||||||
|
-- is currently active when the target is set, it will get notified immediately.
|
||||||
|
---@param target Indicator
|
||||||
|
function Trigger:SetTarget(target)
|
||||||
|
self.indicator = target
|
||||||
|
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)
|
||||||
|
state = state ~= self.invert -- state xor inverted
|
||||||
|
|
||||||
|
if self.active ~= state then
|
||||||
|
if state then
|
||||||
|
self.indicator:Show(data)
|
||||||
|
else
|
||||||
|
self.indicator:Hide()
|
||||||
|
end
|
||||||
|
self.active = state
|
||||||
|
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)
|
||||||
|
end
|
||||||
|
|
@@ -19,10 +19,13 @@ local types = omif.GetModule("types")
|
|||||||
local StatusBar = types.StatusBar
|
local StatusBar = types.StatusBar
|
||||||
local AuraList = types.AuraList
|
local AuraList = types.AuraList
|
||||||
local SquareIndicator = types.SquareIndicator
|
local SquareIndicator = types.SquareIndicator
|
||||||
|
|
||||||
|
---@class AuraTrigger
|
||||||
local AuraTrigger = types.AuraTrigger
|
local AuraTrigger = types.AuraTrigger
|
||||||
|
|
||||||
types.UnitFrame = types.CreateClass("UnitFrame")
|
---@class UnitFrame
|
||||||
local UnitFrame = types.UnitFrame
|
local UnitFrame = types.CreateClass("UnitFrame")
|
||||||
|
types.UnitFrame = UnitFrame
|
||||||
|
|
||||||
|
|
||||||
local colors = {
|
local colors = {
|
||||||
@@ -83,19 +86,20 @@ function UnitFrame:CreateTriggers(triggers)
|
|||||||
for _, trigger in ipairs(triggers) do
|
for _, trigger in ipairs(triggers) do
|
||||||
local kind = trigger.kind
|
local kind = trigger.kind
|
||||||
if kind == "AuraTrigger" then
|
if kind == "AuraTrigger" then
|
||||||
self.auras:AddTrigger(
|
local indicator = self:CreateIndicator(trigger.indicator)
|
||||||
AuraTrigger:new(
|
local at = AuraTrigger:new(
|
||||||
self:CreateIndicator(trigger.indicator),
|
|
||||||
trigger.spellId,
|
trigger.spellId,
|
||||||
trigger.own,
|
trigger.own,
|
||||||
trigger.requiredCount,
|
trigger.requiredCount,
|
||||||
trigger.invert
|
trigger.invert
|
||||||
)
|
)
|
||||||
)
|
at:SetTarget(indicator)
|
||||||
|
self.auras:AddTrigger(at)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function UnitFrame:CreateIndicator(indicator)
|
function UnitFrame:CreateIndicator(indicator)
|
||||||
local kind = indicator.kind
|
local kind = indicator.kind
|
||||||
if kind == "SquareIndicator" then
|
if kind == "SquareIndicator" then
|
||||||
|
Reference in New Issue
Block a user