Shield Tank One-Button Threat Macro (Concise Annotations)
About 2 min
Shield Tank One-Button Threat Macro [Requires Defensive Stance] (Concise Annotations)
Step 1: Open the Heitu client → click "Super Macro" → create a new macro → paste the code below.
Step 2: Create a regular macro in-game with /s S DTank_Main(), bind it to a key.
-- ============ Shield Tank One-Button Threat Macro [Defensive Stance] ============
-- Usage: /s S DTank_Main()
-- Priority: Life Gem + Last Stand > Dual Trinkets > Bloodrage > Battle Shout (Sunder >= 3) > Taunt > Demoralizing Shout (5 Sunder) > Revenge > Maintain 5 Sunder > Shield Slam > Heroic Strike > Shield Block > Cleave
-- Notes: Auto Life Gem at 41% HP, auto Last Stand at 26% HP; Bloodrage when rage < 26; Demoralizing Shout at full Sunder stacks; Revenge for rage dump; Shield Slam for threat filler; high rage dump
-- Manual skills: Shield Wall, Challenging Shout
function DTank_Main()
-- ====================== Constants: Skill/Trinket IDs ======================
-- Rage, raid buffs
local SPELL_BLOODRAGE = 2687 -- Bloodrage: available when rage < 26
local SPELL_BATTLE_SHOUT = 25289 -- Battle Shout: refresh when Sunder >= 3 and buff about to expire
local SPELL_TAUNT = 355 -- Taunt: grab aggro when target isn't on you
local SPELL_PAIN_SUPPRESS = 12975 -- Last Stand: auto-use when HP < 26%
-- Threat/mitigation skills
local SPELL_SUNDER_ARMOR = 11597 -- Sunder Armor: maintain 5 stacks
local SPELL_REVENGE = 11601 -- Revenge: priority rage dump when it procs
local SPELL_DEMORALIZE = 11556 -- Demoralizing Shout: at 5 Sunder, refresh before debuff expires
local SPELL_SHIELD_SLAM = 23922 -- Shield Slam: threat filler
local SPELL_SHIELD_BLOCK = 2565 -- Shield Block: rage > 45, activate when Shield Slam is ready
-- Rage dump skills
local SPELL_HEROIC_STRIKE= 25286 -- Heroic Strike: medium-high rage dump
local SPELL_CLEAVE = 20569 -- Cleave: high rage dump fallback
-- Survival trinket
local ITEM_LIFE_GEM = 19341 -- Life Gem: heal when HP < 41%
-- DPS trinkets
local ITEM_SPIDER = 22954 -- Kiss of the Spider
local ITEM_BUG_BADGE = 21670 -- Badge of the Swarmguard
-- ====================== State pre-read ======================
local me = GetMeInfo()
local inCombat = IsCombat()
local rage = Power(1)
local brCD = SCT(SPELL_BLOODRAGE)
local shoutLeft = AuraRemainingTime(SPELL_BATTLE_SHOUT)
local tauntCD = SCT(SPELL_TAUNT)
local painSupCD = SCT(SPELL_PAIN_SUPPRESS)
local demoralizeCD = SCT(SPELL_DEMORALIZE)
local demoralizeDebuffDur,_ = TART(SPELL_DEMORALIZE)
local ssCD = SCT(SPELL_SHIELD_SLAM)
local sbCD = SCT(SPELL_SHIELD_BLOCK)
local spiderCD = SCT(ITEM_SPIDER)
local bugBadgeCD = SCT(ITEM_BUG_BADGE)
local sunderDur, sunderStack = TART(SPELL_SUNDER_ARMOR)
local lifeGemCD = SCT(ITEM_LIFE_GEM)
local hpPercent = me and (me.health / me.maxHealth * 100) or 100
local isTargetSelf = TTIS()
-- ====================== 1. Survival ======================
if inCombat then
-- Life Gem first
if lifeGemCD <= 0 and hpPercent < 41 then
M('/use Life Gem')
lifeGemCD = SCT(ITEM_LIFE_GEM)
end
-- Last Stand
if hpPercent < 26 and painSupCD <= 0 then
S(SPELL_PAIN_SUPPRESS)
painSupCD = SCT(SPELL_PAIN_SUPPRESS)
end
end
-- ====================== 2. Auto Trinkets ======================
if inCombat then
if spiderCD <= 0 then
M('/use Kiss of the Spider')
spiderCD = SCT(ITEM_SPIDER)
end
if bugBadgeCD <= 0 then
M('/use Badge of the Swarmguard')
bugBadgeCD = SCT(ITEM_BUG_BADGE)
end
end
-- ====================== 3. Rage ======================
if brCD <= 0 and rage < 26 then
S(SPELL_BLOODRAGE)
rage = Power(1)
brCD = SCT(SPELL_BLOODRAGE)
end
-- ====================== 4. Battle Shout ======================
if inCombat and shoutLeft < 2000 and rage > 9 and sunderStack >= 3 then
S(SPELL_BATTLE_SHOUT)
rage = Power(1)
end
-- ====================== 5. Taunt ======================
if inCombat and not isTargetSelf and rage > 9 and tauntCD <= 0 then
S(SPELL_TAUNT)
tauntCD = SCT(SPELL_TAUNT)
end
-- ====================== 6. Demoralizing Shout ======================
if inCombat and sunderStack == 5 and demoralizeDebuffDur < 2000 and rage > 9 and demoralizeCD <= 0 then
S(SPELL_DEMORALIZE)
rage = Power(1)
demoralizeCD = SCT(SPELL_DEMORALIZE)
end
-- ====================== 7. Revenge ======================
if CanDefensiveStrike() and SCT(SPELL_REVENGE) <= 0 and rage > 4 then
Spell(SPELL_REVENGE)
rage = Power(1)
end
-- ====================== 8. Maintain 5 Sunder ======================
if (sunderStack < 5 or sunderDur < 3000) and rage > 14 then
S(SPELL_SUNDER_ARMOR)
rage = Power(1)
sunderDur, sunderStack = TART(SPELL_SUNDER_ARMOR)
end
-- ====================== 9. Shield Slam ======================
if rage > 24 and ssCD <= 0 then
S(SPELL_SHIELD_SLAM)
rage = Power(1)
ssCD = SCT(SPELL_SHIELD_SLAM)
end
-- ====================== 10. Heroic Strike ======================
if rage > 36 then
S(SPELL_HEROIC_STRIKE)
rage = Power(1)
end
-- ====================== 11. Shield Block ======================
if rage > 45 and sbCD <= 0 and ssCD <= 0 then
S(SPELL_SHIELD_BLOCK)
rage = Power(1)
sbCD = SCT(SPELL_SHIELD_BLOCK)
end
-- ====================== 12. Cleave ======================
if rage > 74 then
S(SPELL_CLEAVE)
rage = Power(1)
end
end