diff --git a/src/Spell/Spell.lua b/src/Spell/Spell.lua index 4f134de..2a9ff29 100644 --- a/src/Spell/Spell.lua +++ b/src/Spell/Spell.lua @@ -13,14 +13,7 @@ local Spell = { conditions = {}, target = false, release_at = false, - traits = { - ignoreChanneling = false, - ignoreFacing = false, - ignoreLoS = false, - ignoreGCD = false, - ignoreMoving = false, - targeted = false - } + traits = {}, } local usableExcludes = { @@ -56,20 +49,12 @@ end -- Constructor ---@param id number ----@param traits? table ---@return Spell -function Spell:New(id, traits) +function Spell:New(id) local self = setmetatable({}, Spell) self.spellID = id - if traits == nil then traits = {} end - for k in pairs(traits) do - if self.traits[k] ~= nil and traits[k] ~= nil then - self.traits[k] = traits[k] - end - end - return self end @@ -341,48 +326,15 @@ end -- Check if the spell is castable ---@return boolean function Spell:Castable() - if self:GetCastableFunction() then - return self:GetCastableFunction()(self) - end - - if not self:IsKnownAndUsable() then return false end - - local player = Bastion.UnitManager:Get("player") - - if self.traits.targeted then - local target = self:GetTarget() - - if not target or - not target:Exists() then return false end - - if not self:IsInRange(target) then return false end - - if not self.traits.ignoreFacing then - if not player:IsFacing(target) then return false end - end - - if not self.traits.ignoreLoS then - if not player:CanSee(target) then return false end - end - end - - if not self.traits.ignoreCasting then - if player:IsCasting() then return false end + if #self.traits > 0 then + return self:EvaluateTraits() end - if not self.traits.ignoreChanneling then - if player:IsChanneling() then return false end - end - - if not self.traits.ignoreGCD then - if player:GetGCD() > C_Spell.GetSpellQueueWindow() then return false end - end - - if not self.traits.ignoreMoving then - if self:GetCastLength() > 0 and player:IsMoving() then return false end + if self:GetCastableFunction() then + return self:GetCastableFunction()(self) end - return true + return self:IsKnownAndUsable() end -- Set a script to check if the spell is castable @@ -701,4 +653,23 @@ function Spell:IsFree() return self:GetCost() == 0 end +-- AddTraits +---@param traits table +function Spell:AddTraits(traits) + for _, trait in ipairs(traits) do + table.insert(self.traits, trait) + end +end + +-- EvaluateTraits +---@return boolean +function Spell:EvaluateTraits() + for _, trait in ipairs(self.traits) do + if not trait:Evaluate(self) then + return false + end + end + return true +end + return Spell diff --git a/src/SpellTrait/SpellTrait.lua b/src/SpellTrait/SpellTrait.lua new file mode 100644 index 0000000..fc09661 --- /dev/null +++ b/src/SpellTrait/SpellTrait.lua @@ -0,0 +1,24 @@ +---@class SpellTrait +local SpellTrait = { + func = nil, +} + +SpellTrait.__index = SpellTrait + +-- Constructor +---@param func function +---@return SpellTrait +function SpellTrait:New(func) + local self = setmetatable({}, SpellTrait) + self.func = func + return self +end + +-- Evaluate the trait +---@param spell Spell +---@return boolean +function SpellTrait:Evaluate(spell) + return self.func(spell) +end + +return SpellTrait