Introduction
What's an attribute?
An attribute is just a key within an awful object that is expected to return some value.
All attributes are non-case-sensitive and many have fallback aliases for added intuitiveness factor.
This means that
object.enemywill work, but so willobject.Enemyandobject.isEnemy
Attribute Performance
Reading attributes is extremely performant. They act as normal key-value pairs, but their value is generated upon reference of the key, and the value is cached until the next "tick".
Multi-returns
A few attributes have multiple returns that are only available by selection #, which you can add to the end of the key. Example,
player.casting9==select(9,UnitCastingInfo("player")). You can also use bracket notation to access them variablyplayer["casting" .. selection]. It will be documented where all it is possible to use multi-return selection on attributes.
General Attributes
exists
unit.exists : true | nil
print(target.exists)
-- trueabsorbs
number: unit.absorbs : absorbs | 0
Amount of absorption (shields) remaining on the object
if execute.damage > target.health + target.absorbs then
print("they gon die")
endLimitations:
- Not available in Classic due to lack of supported WoW API to fetch asborbs.
class
The class of the object, plus all returns of UnitClass available by multi-selection #
unit.class : "class" | nil
unit.class2 : "CLASS" | nil
Alternative:
classLiteral- 2nd return fromUnitClass. Upper case class name which is always the same across different localizations. Equivalent ofclass2.
if target.class == "Rogue" then
print("oh boy, it's a rogue!")
elseif target.class2 == "MAGE" then
print("wow, it's a mage!")
endcombat
Returns true if the unit is in combat
unit.combat : isInCombat | nil
if not enemy.combat then
sap:Cast(enemy)
endcovenant
The unit's covenant
unit.covenant : "Covenant Name" | nil
target.covenantdead
Returns true if the unit is dead
unit.dead : isDead | false
if player.dead then
awful.alert("rez pls")
endenemy
Returns true if the unit is an enemy
unit.enemy : isEnemy | false
if target.enemy then
-- do things to your enemy target!
endfriend / friendly
Returns true if the unit is friendly
unit.friend : isFriend | false
if target.friendly then
-- do things to your friendly target!
endguid
The GUID of the object
unit.guid : "UnitGUID" | nil
hp
The health of the object in percentage
unit.hp : hpPercentage | 0
print(target.hp)
-- 69Other HP attributes:
health - actual current health of object, as returned from
UnitHealth(instead of percentage)healthMax - max health of object, as returned from
UnitHealthMax
height
The height of the object.
unit.height : height | nil
print(target.height)
-- 2.29id
Returns ObjectID of the object
unit.id : ObjectID | false
- not for use on players
if object.id == 123 then
print("found the object/unit i was lookin for")
endisHealer
Checks if the object is a healer.
- Bound by limitations of role
unit.healer : isHealer | false
if unit.healer then
print("wow, it's a healer!")
endisMelee
Checks if the object is a melee dps.
- Bound by limitations of role
unit.melee : isMelee | false
if unit.melee then
print("wow, it's a melee!")
endisPlayer
Checks if the object is a player.
unit.player : isPlayer | false
if unit.player then
print("wow, it's a player!")
endisRanged
Checks if the object is a player.
- Bound by limitations of role
unit.isRanged : isRanged | false
if unit.ranged then
print("wow, it's a ranged dps!")
endisPet
Checks if the object is another player's pet
unit.isPet : isPet | false
if unit.pet then
print("wow, it's a pet!")
endlevel
The level of the object via UnitLevel
unit.level : level
if player.level < 60 then
print("wow, i am leveling")
endname
The name of the object
unit.name : "name" | nil
print(target.name)
-- Awfulplayerpointer
Pointer should be used when passing the object to any non-awful API, as any "normal" function like
UnitHealthwill not work with an awful object.
Uniquely identifying pointer to the object in memory. In the case of Tinkr, returns the associated "WoWGameObject". In the case of Daemonic, returns the unit's GUID.
unit.pointer : pointer | nil
print( UnitName(target.pointer) )
-- Awfulplayer, Awfulplayerrace
The race of the object (in game)
role
The role of the object, either
healer,melee,ranged,tank, orpet.
unit.role : role | nil
if enemy.role == "healer" then
kidneyShot:Cast(enemy)
endLimitations:
- Built primarily for use in arena or on party members. For enemies in BG, World PVP, etc. or for friendly players who are not in your group, it is essentially guessing based on buffs, power resources, etc, and could be wrong sometimes.
spec
The unit's specialization as a string, acquired by inspect, so it faces the same limitations (group/player only..)
unit.spec : "Spec" | "Unknown"
-- print spec when spec changes
awful.onEvent(function() print(player.spec) end, "PLAYER_SPECIALIZATION_CHANGED")
if player.spec == "Fire" then
-- do fire stuff
endstealth
If the object has an active stealth or invisibility effect, returns the spellID of that effect. Otherwise returns false.
Does not use a specific stealth list, but instead efficiently parses
debuffDescriptions- should work on all current & future stealth/invis effects in the game. If it does not, let us know the specific stealth effect.
unit.stealthed : stealthID | false
if enemy.stealth and enemy.distance < 8 then
if frostNova:Cast() then
local stealthName = GetSpellInfo(enemy.stealth)
awful.alert("Nova (".. stealthName ..")", 122)
end
endtarget
The target of the object, returned as an Awful Object with all attributes & functions available.
unit.target : targetObject | emptyObject
if enemy.target.isUnit(player) then
barkskin:Cast()
endvisible
Checks if the unit is visible (within render range) using UnitIsVisible
unit.visible : visible | false
v2attackers()
The amount of attackers for the provided object and their combined cooldown usage.
unit.v2attackers() : totalUnits, meleeUnits, rangedUnits, cooldowns | 0, 0, 0, 0
local total, melee, ranged, cooldowns = player.v2attackers()
if melee > 1 and cooldowns > 0 then
barkskin:Cast()
endthreat
The player's threat for the unit, based on UnitThreatSituation. https://wowpedia.fandom.com/wiki/API_UnitThreatSituation
unit.threat : status | -1
if target.threat < 2 then
taunt:Cast()
endaggro
The player's aggro status for the unit, based on threat returning >= 2.
unit.aggro : aggro | false
if not target.aggro then
taunt:Cast()
endBuffs & Debuffs
There are also powerful Buff & Debuff related functions, rather than attributes... Be sure to check those out before beginning your implementation.
buffCount
Returns number of buffs the unit has
unit.buffCount : numBuffs | 0
buffs
Returns an array of all buffs the unit has. Each buff is indexed appropriately, and contains all UnitBuff returns.
unit.buffs : { { buffName, ... }, { buffName, ... }, ... } | {}
for i, buff in ipairs(player.buffs) do
local name, rank, icon, count = unpack(buff)
-- do stuff with cached, performant buffs!
enddebuffCount
Returns number of debuffs the unit has
unit.debuffCount : numDebuffs | 0
debuffs
Returns an array of all debuffs the unit has. Each debuff is indexed appropriately, and contains all UnitDebuff returns.
unit.debuffs : { { debuffName, ... }, { debuffName, ... }, ... } | {}
for i, debuff in ipairs(player.debuffs) do
local name, rank, icon, count = unpack(debuff)
-- do stuff with cached, performant debuffs!
endbuff[index]
Returns an array of all returns provided by UnitBuff on the object at the given index. You must provide a specific index to this attribute to get the appropriate return.
Sister Function: buff - Check the unit for a specific buff by spellID or spellName, and get back all the normal
UnitBuffreturns.
(unit.buff3 / unit["buff"..index]) : { buffName, ... } | nil
for i=1,#player.buffs do
-- buffs by index
local name, _, _, count = unpack(player['buff'..i])
print(name, count)
enddebuff[index]
Returns an array of all returns provided by UnitDebuff on the object at the given index. You must provide a specific index to this attribute to get the appropriate return.
Sister Function: debuff - Check the unit for a specific debuff by spellID or spellName, and get back all the normal
UnitDebuffreturns.
(unit.debuff3 / unit["debuff"..index]) : { debuffName, ... } | nil
for i=1,#player.debuffs do
-- debuffs by index
local name, _, _, count = unpack(player['debuff'..i])
print(name, count)
endbuffDescriptions
Returns an array of description text for each buff the unit has. Can parse these descriptions to determine whether or not the unit has an effect of a certain type, or get creative with it! The indexing of the descriptions correspond with their parent buffs, so you can use something like unit["buff" .. index] to obtain more info about the buff after finding a match by string.
unit.buffDescriptions : { "desc", "desc", ... } | {}
local desc = enemy.buffDescriptions
for i, str in ipairs(desc) do
local lower = str:lower()
if lower:match("stealthed") or lower:match("invisible") then
print("That man is in stealth! Wow!")
local thisStealth = enemy["buff" .. i]
print("Stealth Name: " .. thisStealth[1])
print("Stealth SpellID: " .. thisStealth[10])
end
enddebuffDescriptions
Returns an array of description text for each debuff the unit has. Can parse these descriptions to determine whether or not the unit has an effect of a certain type, or get creative with it! The indexing of the descriptions correspond with their parent debuffs, so you can use something like unit["debuff" .. index] to obtain more info about the debuff after finding a match by string.
unit.debuffDescriptions : { "desc", "desc", ... } | {}
local desc = player.debuffDescriptions
for index, str in ipairs(desc) do
if str:match("Disarmed.") then
print("We have no arms, wow!")
local thisDisarm = player["debuff" .. index]
print("Disarm Name: " .. thisDisarm[1])
print("Disarm SpellID: " .. thisDisarm[10])
end
endcds
Returns true if the object has offensive cooldowns up, false if not.
if obj.cds and obj.target.isUnit(player) then
print("uh oh we in troub")
turtle:Cast()
endcharmed
Checks if the object is charmed (mind control, etc.) using UnitIsCharmed
unit.charmed : charmed | false
dotted
Returns true if the target has an active damage over time effect, false if not.
Does not use a specific DoT list, but instead efficiently parses
debuffDescriptions- should work on all current & future DoT effects in the game. If it does not, let us know which DoT.
unit.dotted : hasDot | false
if not enemy.dotted and not enemy.combat then
sap:Cast(enemy)
endpurgeCount
Returns the number of purgeable buffs on the unit
unit.purgeCount : purgeCount | 0
if enemy.purgeCount > 0 then
purge:Cast(enemy)
endPower / PowerTypes
powerTypes
First, know your powerType aliases (these are non-case-sensitive)
awful.powerTypes = {
["mana"] = 0,
["rage"] = 1,
["focus"] = 2,
["energy"] = 3,
["combopoints"] = 4,
["cp"] = 4,
["runes"] = 5,
["runicpower"] = 6,
["soulshards"] = 7,
["shards"] = 7,
["astralpower"] = 8,
["ap"] = 8,
["lunarpower"] = 8,
["holypower"] = 9,
["alternatepower"] = 10,
["maelstrom"] = 11,
["chi"] = 12,
["insanity"] = 13,
["arcanecharges"] = 16,
["fury"] = 17,
["pain"] = 18,
["essence"] = 19
}power attributes
Now you can check power, powerMax, or powerPct for any powerType on the unit - just replace power with your powerType alias.
unit.power -- default UnitPower return w/ no powerType specified
unit.energy -- energy
unit.energyMax -- max energy
unit.mana -- mana
unit.manaPct -- mana percentage (mana / manaMax) * 100
unit.comboPoints -- combo points
unit.comboPointsMax -- max combo points
unit.cpMax -- also combo points
unit.rage -- current rage
unit.astralPowerMax -- you get it now ;) this works for all powerTypes..
if player.energy < 30 then
-- pooling energy! blabla!
end
if player.cp >= 5 then
kidney:Cast()
endCasts / Channels
casting
If the object is casting, returns the Casting Info from UnitCastingInfo
unit.casting : "castName" | nil
Returns: string
spellName|nil// Every return of UnitCastingInfo can be queried with selection # e.g,unit.casting9.
-- target is casting a polymorph...
print(target.casting)
-- "Polymorph"
print(target.casting9) -- same as target.castID
-- 118
print(target.casting8) -- same as target.castInt
-- nilcastID
The spellID of the spell being cast by the object, if they are casting.
unit.castID : castID | nil
if player.castID == 118 and player.castRemains < awful.latency + awful.tickRate + 0.03 then
blinkTo(player.castTarget)
endcastTarget
If the object is casting, returns the Awful Object being targeted by that spellcast.
unit.castTarget : castTargetObject | nil
if enemy.cast == "Chaos Bolt" and enemy.castTarget.isUnit(player) and enemy.castTimeLeft < awful.buffer then
blazingBarrier:Cast()
endcastPct
Current percentage of total cast time completed
unit.castPct : castPctComplete | 0
-- 70% kick i guess lolz
if target.casting == "Polymorph" and target.castPct > 70 then
kick:Cast(target)
endcastRemains
The time remaining on the object's cast, minus latency.
unit.castRemains : castTimeLeft | 0
local target = awful.target
if target.casting == "Polymorph" and target.castRemains < 0.5 then
kick:Cast(target)
endchanneling
If the object is channeling, returns the Channeling Info from UnitChannelInfo
unit.channel : "channelName" | nil
Returns: string
spellName|nil// Every return of UnitChannelInfo can be queried with selection # e.g,unit.channel3.
-- target is channeling soothing mist...
print(target.channel)
-- "Soothing Mist"
print(target.channel3) -- equivalent of the 3rd return of UnitChannelInfo, 'texture' - The texture path associated with the spell icon.
-- "Interface\\Icons\\Soothing-Mist-Icon.blp" < not accurate, just examplechannelID
The spellID of the spell being channeled by the object, if they are channeling.
unit.channelID : channelID | nil
if enemy.channel == "Lightning Lasso" then
para:Cast(enemy)
endchannelRemains
The time remaining on the object's channel, minus latency.
unit.channelRemains : channelTimeLeft | 0
if target.channel == "Soothing Mist" and target.channelRemains < 0.5 then
print("The soothing mist is about to finish!")
endgcdRemains
Time until the unit's next GCD is available (if any)
- only works on players (duh)
unit.gcdRemains : gcdRemains | 0
if enemyHealer.gcdRemains > trapTravelTime then
if trap:AoECast(enemyHealer) then
awful.alert("haha gotcha on gcd idiot")
end
endIf you like this one, check out the cooldown function
lastCast
Latest spellID cast by the object
- only works on players (duh)
Similar: recentlyCast - Checks if unit has cast X spell in the past Y seconds
unit.lastCast : lastCast | nil
if enemy.lastCast == 118 then
print("they just cast sheep!!!")
endMovement & Positioning
distance
Distance between the player and the object, accounting for combat reach and bounding radius.
unit.distance : distance | 9999
Sister Attribute: distanceTo - checks distance from the object to another object
Similar:
distanceLiteral- checks distance without accounting for combat reach or bounding radius
if target.distance > 15 then
charge:Cast(target)
endcombatReach
The combat reach of the object
unit.combatReach : combatReach | 0
boundingRadius
The bounding radius of the object
unit.boundingRadius : boundingRadius | 0
playerFacing [,angle]
Checks if the player is facing the object [at a 180 degree angle by default - the required facing angle to cast spells], however, you can check a specific angle by adding it to the referenced key.
unit.playerFacing : playerIsFacing | false
unit.playerFacing45 : facing45Degrees | false
Sister Function:
facing(otherUnit[,angle])- checks if one object is facing another object. e.g,player.facing(target)ortarget.facing(player, 45)
Alternate Aliases:
amIFacing,iAmFacing,
if target.playerFacing then
print("I'm facing my target, so can cast normal spells that require facing!")
end
if target.playerFacing45 then
print("I'm facing my target at a <45 degree angle!")
end
-- Passing a dynamic angle variable using the power of concatenation and bracket notation! Wow!
local shockwaveAngle = 45 + awful.bin(player.hasTalent("Double-Wide Shockwave Surprise")) * 30
local caught = 0
for _, enemy in ipairs(awful.enemies) do
if enemy.distance < 8 and enemy["playerFacing" .. shockwaveAngle] then
caught = caught + 1
end
end
if caught >= 3 then
shockwave:Cast()
endlos
Checks if the object is in line of sight of the player.
unit.los : isLoS | false
Sister Function:
losOf(otherObject)- checks this between the object and another object
Similar:
losLiteral- checks LoS without accounting for LoS-impairing effects like smoke bomb.
if enemy.los then
print("he can see me!")
endrotation
Facing direction (rotation) of the object in radians.
unit.rotation : facingDirection | nil
print(target.rotation)
-- 4.24520301...meleeRange
Returns true if the player is in melee range of the object.
unit.meleeRange : true | false
Sister Function:
meleeRangeOf(otherObject)- Checks if object is in meleeRange of another object
if enemy.meleeRange then
warbreaker:Cast()
endmovementFlags
Movement flags of the object as an integer.
unit.movementFlags : flags | 0
-- convert integer flags to direction in radians
local flags = band(player.movementFlags, 0xF)
local dir = player.rotation
local mod = 0
if flags == 0x2 then
mod = pi
elseif flags == 0x4 then
mod = pi * 0.5
elseif flags == 0x8 then
mod = pi * 1.5
elseif flags == bor(0x1, 0x4) then
mod = pi * (1 / 8) * 2
elseif flags == bor(0x1, 0x8) then
mod = pi * (7 / 8) * 2
elseif flags == bor(0x2, 0x4) then
mod = pi * (3 / 8) * 2
elseif flags == bor(0x2, 0x8) then
mod = pi * (5 / 8) * 2
end
return (dir + mod) % (pi * 2)moving
Checks if the unit is moving : (speed > 0)
unit.moving : isMoving | false
if player.moving then
print("hey, stop moving buddy")
endmovingDirection
Moving direction of the object as an angle in radians.
unit.direction : movingDirection | nil
print(enemy.direction)
-- 3.189384speed
The current speed of the object (in yards per second), plus all other returns of GetUnitSpeed available by selection #, e.g unit.speed2
unit.speed : currentSpeed | 0
unit.speed2 : runSpeed | 0
if target.speed < player.speed then
print("we are moving faster than our target!")
end
if target.speed2 < player.speed2 then
print("we are able to move faster than our target!")
endCrowd Control
bcc
If the object is in breakable crowd control, returns the spellID of that crowd control debuff.
- If there is more than one bCC effect active, the one with the longest remaining duration's ID is returned.
unit.bcc : ccDebuffID | nil
if target.bcc then
print("i'm not gonna attack that, it's in breakable cc")
endbccRemains
The remaining time of breakable cc effects on the object.
unit.bccRemains : remains | 0
-- only cast spell if bcc remains < spell cast time
if target.bccRemains < spell.castTime then
spell:Cast(target)
endcc
If the object is in crowd control, returns the spellID of that crowd control debuff.
- If there is more than one CC effect active, the one with the longest remaining duration's ID is returned.
unit.cc : ccDebuffID | nil
if healer.cc then
print("our healer is in cc! help!")
endccRemains
The remaining time of crowd control effects on the object.
unit.ccRemains : remains | 0
if enemyHealer.ccRemains < awful.buffer + awful.latency and enemyHealer.incapDR >= 0.25 then
sheep:Cast(enemyHealer)
endccInfo
Returns an array containing detailed info about the longest remaining crowd control effect on the object.
unit.ccInfo : { debuffID, debuffName, debuffRemains, drCategory, castSource } | {}
note: The contents can't be accessed with selection #, it is a single array being returned
if healer.cc then
local id, name, remains, drCat, source = unpack(healer.ccInfo)
print(id, name, remains, drCat, source)
end
-- 118, "Polymorph", 3.839, "Incapacitate", SourceGUIDdisarmed
If the object is currently affected by a disarm, returns the spellID of that effect. Otherwise returns false.
Does not use a specific disarm list, but instead efficiently parses
debuffDescriptions- should work on all current & future disarm effects in the game. If it does not, let us know which disarm.
unit.disarm : disarmID | false
if player.disarm then
print("wow, i ain't got no arms!")
end1
disorient
If the object is disoriented, returns the spellID of the disorient debuff.
unit.disorient : disorientID | nil
if player.disorient then
print("wow, i'm disoriented!")
enddisorientRemains
The remaining time of disorient CC effects on the object.
unit.disorientRemains : remains | 0
if player.disorientRemains > 3 then
print("wow, i'm disoriented for a long time!")
enddisorientInfo
If the object is affected by a disorient crowd control, returns the ccInfo of the effect.
unit.disorientInfo : { debuffID, debuffName, debuffRemains, drCategory, castSource } | {}
local id, name, remains, drCat, source = healer.disorientInfo
if name == "Mind Control"
and remains > gcd
and purge:Cast(source)
or name == "Psychic Scream"
and remains > gcd
and tremor:Cast() then
print("wow, we really took care of 'em!")
endincap
If the object is incapacitated, returns the spellID of the incapacitate debuff.
unit.incap : incapID | nil
-- player.incap is also valid, this is another alias (obj.incapacitated as well)
if player.incapped then
print("wow, i'm incapacitated!")
endincapacitateRemains
The remaining time of incapacitate CC effects on the object.
unit.incapRemains : remains | 0
if player.incapRemains > 3 then
print("wow, i'm incapacitated for a long time!")
endincapacitateInfo
If the object is affected by an incapacitate crowd control, returns the ccInfo of the effect.
unit.incapacitateInfo : { debuffID, debuffName, debuffRemains, drCategory, castSource } | {}
if healer.incap then
local id, name, remains, drCat, source = unpack(healer.incapacitateInfo)
print(id, name, remains, drCat, source)
end
-- 118, "Polymorph", 3.839, "Incapacitate", SourceGUIDslowed
If the object is slowed, returns the spellID of the slow debuff.
unit.slowed : slowID | nil
if player.slowed then
print("wowie, i'm real slow!")
endstunned
If the object is stunned, returns the spellID of the stun debuff.
unit.stunned : stunID | nil
if player.stun then
print("wow, i'm stunned!")
endstunRemains
The remaining time of stun effects on the object.
unit.stunRemains : remains | 0
if player.stunRemains > 3 then
print("wow, i'm stunned for a long time!")
endstunInfo
If the object is affected by a stun, returns the ccInfo of the effect.
unit.stunInfo : { debuffID, debuffName, debuffRemains, drCategory, castSource } | {}
-- same thing as other cc info :Prooted
If the object is rooted, returns the spellID of the root debuff.
unit.rooted : rootID | nil
if player.rooted then
print("wow, i'm rooted!")
endrootRemains
The remaining time of root effects on the object.
unit.rootRemains : remains | 0
if player.rootRemains > 3 then
print("wow, i'm rooted for a long time!")
endrootInfo
If the object is affected by a root, returns the ccInfo of the effect.
unit.rootInfo : { debuffID, debuffName, debuffRemains, drCategory, castSource } | {}
-- same thing as other cc info :Psilenced
If the object is silenced, returns the spellID of the silence debuff.
unit.silenced : silenceID | nil
if player.silence then
print("wow, i'm silenced!")
endsilenceRemains
The remaining time of silence effects on the object.
unit.silenceRemains : remains | 0
if player.silenceRemains > 3 then
print("wow, i'm silenced for a long time!")
endsilenceInfo
If the object is affected by a silence, returns the ccInfo of the effect.
unit.silenceInfo : { debuffID, debuffName, debuffRemains, drCategory, castSource } | {}
-- same thing as other cc info :PDiminishing Returns
disorientDR
The disorient DR of the object. 0.25 is quarter DR, 0.5 is half DR, 1 is full DR.
unit.ddr : disorientDR | 1
if enemy.disorientDR == 1 then
fear:Cast(enemy)
enddisorientDRRemains
The time remaining before the disorient DR of the object resets.
unit.ddrr : remainingDR | 18
if enemy.ddrRemains >= 16 or enemy.disorientDR == 1 then
fear:Cast(enemy)
endincapacitateDR
The incapacitate DR of the object. 0.25 is quarter DR, 0.5 is half DR, 1 is full DR.
unit.idr : incapacitateDR | 1
if enemy.incapDR == 1 then
sheep:Cast(enemy)
endincapacitateDRRemains
The time remaining before the incapacitate DR of the object resets.
unit.idrr : remainingDR | 18
if enemy.idrRemains >= 16 or enemy.idr == 1 then
sheep:Cast(enemy)
endstunDR
The stun DR of the object. 0.25 is quarter DR, 0.5 is half DR, 1 is full DR.
unit.sdr : incapacitateDR | 1
if enemy.stunDR >= 0.25 and enemy.stunRemains < 0.4 then
cheapShot:Cast(enemy)
endstunDRRemains
The time remaining before the stun DR of the object resets.
unit.stunDRRemains : remainingDR | 18
if enemy.sdrr >= 16 or enemy.stunDR == 1 then
cheapShot:Cast(enemy)
endrootDR
The root DR of the object. 0.25 is quarter DR, 0.5 is half DR, 1 is full DR.
unit.rdr : rootDR | 1
if enemy.rootDR >= 0.5 and enemy.rootRemains < 0.4 then
root:Cast(enemy)
endrootDRRemains
The time remaining before the root DR of the object resets.
unit.rdrr : remainingDR | 18
if enemy.rootDRRemains >= 12 or enemy.rootDR == 1 then
root:Cast(enemy)
endsilenceDR
The silence DR of the object. 0.25 is quarter DR, 0.5 is half DR, 1 is full DR.
unit.silenceDR : rootDR | 1
if enemy.silenceDR == 1 then
silence:Cast(enemy)
endsilenceDRRemains
The time remaining before the silence DR of the object resets.
unit.silenceDRR : remainingDR | 18
if enemy.silenceDRR >= 12 or enemy.silenceDR == 1 then
silence:Cast(enemy)
endImmunities & Defensives
About immunities...
For the most common applications, you don't need to use these...
Spell Objects handle literally all immunity checking you would otherwise need to do when attempting to cast a spell, you just have to set your options when initializing the spell object (or when casting). Definitely read more on the available spell object options before making too much use of the following immunity attributes.
Immunity to effects means things like damage over time debuffs, crowd control debuffs, etc. Immunity to damage is as it sounds, immunity to damage. Most immunities are to both effects and damage, but we offer separate attributes for them because it's better to be precise.
beast
Checks if the unit is currently immune to polymorph effects.
Does not use a specific buff list, but instead efficiently parses
debuffDescriptions- should work on all current & future polymorph immunity effects in the game. If it does not, let us know which one.
Alternatively:
immuneSheep,sheepImmune
unit.beast : true | false
if target.beast then
print("damn bruh, i can't sheep the man")
endccImmunityRemains
Remaining duration of CC immunity effects on the unit
unit.ccImmunityRemains : remains | 0
- specifically checks for pvp-related buffs/debuffs that make the unit immune to cc (holy ward, bladestorm, fleshcraft, etc.)
if target.ccImmunityRemains > spell.castTime then
print("sry mate can't cc ya")
else
spell:Cast(target)
print("noice")
endhealingImmunityRemains
Remaining duration of healing immunity effects on the unit
unit.healingImmunityRemains : remains | 0
- specifically checks for pvp-related buffs/debuffs that make the unit immune to healing (cyclone, etc.)
if target.healingImmunityRemains > spell.castTime then
print("sry mate can't heal ya")
else
spell:Cast(target)
print("noice")
endimmuneCC
Checks if the unit is currently immune to crowd control effects
unit.immuneCC : true | false
if target.immuneCC then
print("shieeee dawg, I can't cc them!")
endimmuneHealing
Checks if the unit is currently immune to healing effects
unit.immuneHealing : true | false
- specifically checks for pvp-related buffs/debuffs that make the unit immune to healing (cyclone, etc.)
if target.immuneHealing then
print("sry mate can't heal ya")
endimmuneMagic
Checks if the unit is currently immune to magic damage or effects
unit.immuneMagic : true | false
if target.immuneMagic then
print("I cannot do anything magic to this man")
endimmuneMagicDamage
Checks if the unit is currently immune to magic damage
unit.immuneMagicDamage : true | false
if target.immuneMagicDamage and not target.immuneMagicEffects then
print("I cannot do magic damage to the man, but I can sheep him")
endimmuneMagicEffects
Checks if the unit is currently immune to magic effects
unit.immuneMagicEffects : true | false
magicDamageImmunityRemains
Remaining duration of magic damage immunities
unit.magicDamageImmunityRemains : remains | 0
magicEffectImmunityRemains
Remaining duration of magic effect immunities
unit.magicEffectImmunityRemains : remains | 0
immunePhysical
Checks if the unit is currently immune to physical damage or effects
unit.immunePhysical : true | false
if target.immunePhysical then
print("I cannot do anything physical to this man :eggplant:")
endimmunePhysicalDamage
Checks if the unit is currently immune to physical damage
unit.immunePhysicalDamage : true | false
if target.immunePhysicalDamage and not target.immunePhysicalEffects then
print("I cannot do physical damage to the man, but I storm bolt him")
endimmunePhysicalEffects
Checks if the unit is currently immune to physical effects
unit.immunePhysicalEffects : true | false
physicalDamageImmunityRemains
Remaining duration of physical damage immunities
unit.physicalDamageImmunityRemains : remains | 0
physicalEffectImmunityRemains
Remaining duration of physical effect immunities
unit.physicalEffectImmunityRemains : remains | 0
immuneSlows
Checks if the unit is currently immune to slows / snares
unit.immuneSlows : true | false
immuneStuns
Checks if the unit is currently immune to stuns
unit.immuneStuns : true | false
Misc. Attributes
inspect
Returns detailed information gathered from inspecting a unit.
Can only be used on players who are in your party and visible
-- return value from player.inspect
{
class_id = 11,
glyphs = {
},
guid = "Player-11-0D13D216",
class = "DRUID",
spec_description = "bla bla",
spec_icon = 132115,
race = "Tauren",
spec_background = "DAMAGER",
class_localized = "Druid",
lku = "player",
global_spec_id = 103,
pvp_talents = {
3751 = {
spell_id = 202626,
name_localized = "Leader of the Pack",
icon = 135881,
talent_id = 3751,
},
...etc
},
spec_index = 2,
gender = 3,
spec_role = "DAMAGER",
spec_group = 1,
name = "Awfulcat",
talents = {
18571 = {
name_localized = "Wild Charge",
talent_id = 18571,
spell_id = 102401,
column = 3,
icon = 538771,
tier = 2,
},
21778 = {
name_localized = "Mighty Bash",
talent_id = 21778,
spell_id = 5211,
column = 1,
icon = 132114,
tier = 4,
},
...etc
},
race_localized = "Tauren",
spec_role_detailed = "melee",
spec_name_localized = "Feral",
}mgr
Remaining healing absorption effect of Mindgames
mindGamesRemains works too
unit.mgr : mgr | 0
ttd
Remaining time to die of the unit, based on linear regression algorithm lifted from HeroLib
Must set
awful.ttd_enabledtotruefor ttd functions / attributes to work.
if target.ttd < 20 then
-- do pve stuff idk
end