feat: add spell traits

main
João Fidalgo 7 months ago committed by vibe
parent c0c8ab8362
commit 073a9e03b7
  1. 59
      src/Spell/Spell.lua
  2. 6
      src/SpellBook/SpellBook.lua

@ -12,7 +12,15 @@ local Spell = {
lastCastAt = false, lastCastAt = false,
conditions = {}, conditions = {},
target = false, target = false,
release_at = false release_at = false,
traits = {
ignoreChanneling = false,
ignoreFacing = false,
ignoreLoS = false,
ignoreGCD = false,
ignoreMoving = false,
targeted = false
}
} }
local usableExcludes = { local usableExcludes = {
@ -48,12 +56,20 @@ end
-- Constructor -- Constructor
---@param id number ---@param id number
---@param traits? table
---@return Spell ---@return Spell
function Spell:New(id) function Spell:New(id, traits)
local self = setmetatable({}, Spell) local self = setmetatable({}, Spell)
self.spellID = id 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 return self
end end
@ -329,7 +345,44 @@ function Spell:Castable()
return self:GetCastableFunction()(self) return self:GetCastableFunction()(self)
end end
return self:IsKnownAndUsable() 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
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
end
return true
end end
-- Set a script to check if the spell is castable -- Set a script to check if the spell is castable

@ -14,10 +14,12 @@ function SpellBook:New()
end end
-- Get a spell from the spellbook -- Get a spell from the spellbook
---@param id number
---@param traits? table
---@return Spell ---@return Spell
function SpellBook:GetSpell(id) function SpellBook:GetSpell(id, traits)
if self.spells[id] == nil then if self.spells[id] == nil then
self.spells[id] = Bastion.Spell:New(id) self.spells[id] = Bastion.Spell:New(id, traits)
end end
return self.spells[id] return self.spells[id]

Loading…
Cancel
Save