refactor spell traits

João Fidalgo 4 months ago
parent 6280196711
commit c108f53d29
  1. 81
      src/Spell/Spell.lua
  2. 24
      src/SpellTrait/SpellTrait.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

@ -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
Loading…
Cancel
Save