What are they?
They function the same as awful object attributes, so it's worth reading up on those if you haven't.
Spell Objects have many attributes of their own though, usually relating to some information about the spell, most of which is derived from the Spell ID using WoW API, which is why you must provide it instead of a spell name. Here are some examples of spell attributes:
spell.cd - Current cooldown of the spell
spell.name - Name of the spell
spell.range - Max range of the spell
Simple and effective :)
-- creating new spell object
local mortalStrike = awful.Spell(1234, { damage = "physical" })
-- can use methods on it, like :Callback
mortalStrike:Callback(function(spell)
return spell:Cast(target)
end)
-- casting methods outside of :Callback are also valid ofc
mortalStrike:Cast(target)
heroicLeap:SmartAoE(target)
-- all of the attributes are stored right inside the same object
if mortalStrike.cd < 2 then
print(mortalStrike.name .. " coming off cd!")
endSpell Attributes
baseCD
The base cooldown of the spell, according to
GetSpellBaseCooldown, but with fixes applies for spells that have multiple charges
if target.cooldown("survival instincts") > spell.baseCD then
spell:Cast(target)
endcastTime
The cast time of the spell (0 for instant cast spells)
-- this calculation is already handled inside `:Cast`!
if target.magicImmunityRemains < spell.castTime then
spell:Cast(target)
endcd
Current cooldown of the spell
cooldownis another valid key for the same attribute
if spell.cd > 10 then
print("dang it, gonna be a while before i can use this one")
endcharges
Number of charges available for the spell.
- Round integer, does not include fractional charges.
if spell.charges >= 2 then
spell:Cast(target)
endchargesFrac
Number of charges available for the spell, including fractional charges.
- Float, includes frac charges.
fracis another valid key for the same attribute
if fireBlast.frac >= 1.5 then
fireBlast:Cast()
endchargesMax
Number of maximum charges for the spell
if spell.frac >= spell.chargesMax - 0.5 then
spell:Cast()
endnextChargeCD
Remaining cooldown on the next charge coming back
if fireBlast.nextChargeCD <= gcd then
-- blablablabla
endcost
The resource cost(s) of the spell, returned as a meta object including all resource costs.
- You can check costs by powerType
spell.cost[powerType]- though actual stored keys are identical to
GetSpellPowerCostreturns
- though actual stored keys are identical to
- Values are stored as numbers
- If the indexed powertype is unknown, it will return 0.
if spell.cost.energy < 25 then
spell:Cast()
end
-- combo points
if spell.cost.cp > 3 then
-- blbllalb
end
if spell.cost.astralPower > 50 then
--bla
enddamage / effect
Attempts to scrape damage / healing effect of the spell from its tooltip
damageandeffectare different keys for the same attribute.- For combo-point spending abilities, grabs the 1 combo point damage, and multiplies that by current combo points.
- For other spells, it essentially just grabs the biggest number in the tooltip and returns that.
- Does not account for versatility, armor, defensive buffs, etc - although buffs that alter damage or stats do seem to affect tooltip damage values.. it's very tough to accurately estimate damage of a spell, but can be done.
-- executie
if target.health < spell.damage then
if spell:Cast(target) then
awful.alert("EXECUTE!!!!", spell.id)
end
end
-- healing stuff??
if spell.effect < friend.missingHealth then
spell:Cast(friend)
endflying
Checks missiles OM and combat log event history to determine whether or not a spell is still in the air.
- Currently experimental, big changes to come soon.
if not pyroblast.flying then
fireBlast:Cast()
endgcd
The global cooldown duration the spell will incur, if any
- Most GCD incurring spells incur a base GCD of 1.5s, but some are different. For example:
- Mighty Bash: 1500ms Base GCD / Haste Modifier
- Rake: 1000ms Base GCD / Haste Modifier
if moreImportantSpell.cooldown > lessImportantSpell.gcd then
lessImportantSpell:Cast()
endid
The SpellID of the spell. You provided it we're just giving it back.
known
Whether or not we know the spell, which can be surprisingly annoying to find out.
knownis an exhaustive method, requiring one of the following to have a positive return:IsSpellKnownIsPlayerSpellGetSpellInfo(spell.name)- must return the spell name
if not spell.known then
print("we know not what we think we not know, we know only the now know that we know")
endname
The proper name of the spell
awful.alert(spell.name, spell.id)queued
Whether or not the spell is current & queued for next GCD
if spell.queued then
print("It's really happening!")
endrange
The max range the spell can be cast at
if target.dist < spell.range then
awful.alert('hallelujah', spell.id)
endusable
Whether or not the spell is currently "usable"
- Based on
IsUsableSpellapi
if spell.usable then
spell:Cast()
endused
Checks if the spell has been recently used by the player
- these last couple are functions btw, just too lazy to make a whole section til more spell object functions exist
if spell.used(5) then
print("we have cast the spell in the last 5 seconds, wow!")
endinRange
Whether or not the spell is in range of a unit
if spell.inRange(unit) then
print("spel in range of unit, nioce")
end