Skip to content

ability

One entry from your known-ability book: a spell, combat art, or other usable ability, with its recast state and icons.

Returned by Me.Ability(key), Me.AbilityID(id), and Me.AbilityByName(name) — each of which returns nil when nothing matches, so check before calling members.

local ab = mq.TLO.Me.Ability("Fireball")
if ab then
  eq2.print(("%s ready=%s recast=%.1fs")
    :format(ab.Name(), tostring(ab.IsReady()), ab.RecastRemaining()))
end

Members

number ID

Raw ability id.

string Name

Ability name. Empty until the client has warmed this ability's info — see InfoAvailable().

bool IsReady

Is the ability off recast?

This is derived from RecastRemaining() == 0.

An ability that never lands never starts a recast

Because "ready" means "no recast is ticking", an ability that is scribed but can never actually be cast — an unslotted advantage, a spell whose prerequisites are never met — reads as permanently ready. A rotation that walks rows in order and casts the first ready one will stop at that row forever, starving every row below it.

If a rotation appears to stop working, look for a row that is always ready and never fires.

number RecastRemaining

Seconds left on recast, as a float. 0 when ready.

number RecastDuration

Full recast duration in seconds.

Warning

Currently returns 0 for everything. Use RecastDurationTenths() for the raw value, or RecastTime() below if the ability has already been examined — it reads the same duration from a different cache and is not affected by this bug.

number RecastDurationTenths

Raw recast duration in tenths of a second.

number MainIconID

Main icon id. Pairs with BackDropIconID() to identify an effect on a buff bar — see HaveMaintainedIcon.

number BackDropIconID

Backdrop icon id.

Note

Note the capital D. The effect tables use BackdropIconID (lowercase d) instead — the two spellings are not interchangeable.

number SpellBookIconID

Spell-book icon id.

number Flags

Raw flags bitfield.

Warning

The decode is not settled. The read is also unaligned, so the upper half of the returned value is bleed from adjacent fields. Don't build buff-vs-combat-art classification on this yet.

bool InfoAvailable

Has the client warmed this ability's name and info yet?

Ability names arrive asynchronously. Until this is true, Name() may be empty even though ID() is valid. See AbilityCacheReady() for the book-wide version of this question.

Spell description (async)

A second, separate cache — the client's own examine/description data — backs the members below. It fills in only once the ability has actually been examined at least once this session (opening the tooltip, or the client warming it on its own); there's no explicit "prime this" call the way eq2.item_examine() exists for items.

bool DescAvailable

Has the description cache filled in for this ability? Check this before reading anything else in this section — every member below returns nil, not 0 or false, while it's false.
local ab = mq.TLO.Me.Ability("Fireball")
if ab and ab.DescAvailable() then
  eq2.print(("range %.0f-%.0f, cast %.1fs, recast %.1fs")
    :format(ab.RangeMin(), ab.RangeMax(), ab.CastTime(), ab.RecastTime()))
end

number CastTime

number RecoveryTime

number RecastTime

Cast time, recovery time, and recast time, all in seconds. RecastTime() is the working alternative to the broken RecastDuration() above.

number RangeMin

number RangeMax

Minimum and maximum range.

number ManaCost

number HealthCost

number SavageryCost

number DissonanceCost

number ConcCost

Resource costs. SavageryCost (Beastlord) and DissonanceCost (Channeler) read 0 for every other class.

number MinDuration

number MaxDuration

Duration bounds, in seconds.

bool IsBeneficial

bool IsMaintained

bool AllowRaid

bool GroupRestricted

bool DoesNotExpire

Beneficial/buff, maintained-bar, raid-targetable, group-only, and never-expires flags.

number AOERadius

number AOEMaxTargets

Area-of-effect radius and max target count. 0 on a single-target ability.

number TargetType

number SpellbookType

Raw enum values. The decode isn't settled — read these as opaque numbers to compare against each other, not against a known table yet.

See also