Dual Wield Fury Warrior Boss Fight (Detailed Annotations)
About 4 min
Dual Wield Fury Warrior Boss Fight One-Button Macro (Detailed 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 Fury_DualWield(), bind it to a key.
-- ============ Dual Wield Fury Warrior One-Button DPS Macro [Full Detailed Annotations] ============
-- Execution priority (top to bottom): Limited Invulnerability Potion survival > Bloodrage rage gen > Battle Shout AP buff > single-target rotation > Death Wish burst after 2 Sunder Armor stacks > Hamstring to refresh Flurry haste buff > auto dual trinkets in combat
-- Core DPS logic: Bloodthirst has the highest priority — all skills yield to Bloodthirst. At 42 rage, weave Heroic Strike for mid-range rage dump; at 66+ rage overflow, use Whirlwind; during low-rage gaps, use Hamstring to trigger Flurry
-- Anti-aggro design notes:
-- 1. Heroic Strike fires at 42+ rage instead of spamming, reducing threat spikes from frequent Heroic Strikes
-- 2. Death Wish requires 2+ Sunder Armor stacks on target before activating, giving the tank time to build threat and preventing early-burst aggro death
-- 3. Sandstalker Figurine is the core anti-aggro trinket — 20 seconds of 70% threat reduction after use; keep it equipped at all times
-- Core survival philosophy: staying alive is the only way to maintain DPS — avoid pulling aggro and survive low-HP situations above all else
-- Usage: /s S Fury_DualWield()
function Fury_DualWield()
-- ====================== [Unified Constant Definition Area] Centralized management of skills, survival consumables, and DPS trinket IDs for easy tuning ======================
-- Rage generation and party AP buff skills
local SPELL_BLOODRAGE = 2687 -- Bloodrage: rapidly generate a large batch of rage, resolves rotation rage starvation
local SPELL_BATTLE_SHOUT = 25289 -- Battle Shout (max rank): high AP buff for self and party, maintain without interruption
-- Core single-target / filler DPS skills
local SPELL_BLOODTHIRST = 23894 -- Bloodthirst: core Fury Warrior DPS skill, highest global cast priority
local SPELL_WHIRLWIND = 1680 -- Whirlwind: high-rage AOE rage dump filler, used during Bloodthirst cooldown windows
local SPELL_EXECUTE = 20662 -- Execute: high-damage finisher on low-HP targets, priority second only to Bloodthirst
local SPELL_YYDJ = 25286 -- Heroic Strike: syncs with main-hand auto-attack for bonus damage, fires at 41+ rage to reduce threat generation frequency
-- Buff refresh, burst, and target debuff skills
local SPELL_FLURRY_PROC = 7373 -- Hamstring: cast when Flurry buff is absent to trigger Flurry haste — only used during Bloodthirst cooldown gaps
local AURA_FLURRY = 12970 -- Flurry buff: core Fury Warrior haste buff, massively boosts auto-attack damage
local SPELL_DEATH_WISH = 12328 -- Death Wish: high physical damage burst — only activate after tank has built 2+ Sunder Armor stacks of threat
local SPELL_SUNDER = 11597 -- Sunder Armor debuff: reduces target armor; 2 stacks indicate stable tank threat, safe to activate Death Wish
-- Survival consumables and active DPS trinkets
local ITEM_POTION_INVUL = 3387 -- Limited Invulnerability Potion: auto-use when HP below 40%, short-duration full damage immunity for survival
local ITEM_SPIDER = 22954 -- Kiss of the Spider: short-cycle DPS trinket; activate only when target is not at full HP to prevent early-burst aggro
local ITEM_SAND = 21647 -- Sandstalker Figurine: core anti-aggro artifact — 70% threat reduction for 20 seconds after use; activate on cooldown
-- ====================== [Combat State Batch Pre-read Area] Read all states at once to reduce repeated API calls and improve script efficiency ======================
local me = GetMeInfo() -- Fetch complete character info including current and max HP
local inCombat = IsCombat() -- Boolean check: true = in combat; invul potion and trinkets only work in combat
local rage = Power(1) -- Power(1) reads current rage; stored globally for reuse to reduce repeated reads
local brCD = SCT(SPELL_BLOODRAGE) -- Bloodrage remaining cooldown
local btCD = SCT(SPELL_BLOODTHIRST) -- Bloodthirst remaining cooldown
local wwCD = SCT(SPELL_WHIRLWIND) -- Whirlwind remaining cooldown
local dwCD = SCT(SPELL_DEATH_WISH) -- Death Wish burst remaining cooldown
local potionCD = SCT(ITEM_POTION_INVUL) -- Limited Invulnerability Potion remaining cooldown
local shoutLeft = AuraRemainingTime(SPELL_BATTLE_SHOUT) -- Battle Shout buff remaining duration in seconds
-- ====================== [Priority 1: Low-HP Invul Potion survival — placed before all other functions; survival at low HP is paramount] ======================
-- Prerequisites: in combat + invul potion cooldown ready
if inCombat and potionCD <= 0 then
-- Calculate current HP percentage in real time
local hpPercent = me.health / me.maxHealth * 100
-- HP below 40% → auto-use Limited Invulnerability Potion to avoid lethal damage
if hpPercent < 40 then
M('/use Limited Invulnerability Potion')
potionCD = SCT(ITEM_POTION_INVUL) -- Refresh potion CD variable immediately after use to prevent repeated consumption in a single cycle
end
end
-- ====================== [Priority 2: Bloodrage fallback — prioritize rage generation when low to keep the rotation running] ======================
-- Condition: current rage < 26 + Bloodrage off cooldown
if rage < 26 and brCD <= 0 then
S(SPELL_BLOODRAGE)
rage = Power(1) -- Re-read latest rage value after cast, update variable
brCD = SCT(SPELL_BLOODRAGE) -- Sync-refresh Bloodrage cooldown
end
-- ====================== [Priority 3: Maintain Battle Shout AP buff for consistent output throughout] ======================
-- Condition: rage > 9 to cover skill cost + Battle Shout buff has expired
if rage > 9 and shoutLeft <= 0 then
S(SPELL_BATTLE_SHOUT)
rage = Power(1) -- Update remaining rage value after cast
shoutLeft = AuraRemainingTime(SPELL_BATTLE_SHOUT) -- Update buff remaining duration
end
-- ====================== [Priority 4: Core single-target rotation — fixed priority: Execute > Bloodthirst > Heroic Strike > Whirlwind; Bloodthirst has the highest global weight] ======================
-- 4.1 Execute logic: target in execute phase, Bloodthirst on cooldown, rage > 29 → prioritize high-damage finisher
if CanWarriorExecute() and btCD > 0 and rage > 29 then
S(SPELL_EXECUTE)
rage = Power(1)
btCD = SCT(SPELL_BLOODTHIRST)
end
-- 4.2 Bloodthirst core DPS logic: rage sufficient and Bloodthirst cooldown ready → unconditional priority cast; all skills yield to Bloodthirst
if rage > 29 and btCD <= 0 then
S(SPELL_BLOODTHIRST)
rage = Power(1)
btCD = SCT(SPELL_BLOODTHIRST)
end
-- 4.3 Heroic Strike auto-attack sync rage dump logic: read main-hand weapon swing timer; 41-rage threshold reduces threat generation
local swingTimer = AttackTime1()
local curRage = rage
-- Trigger condition: swing timer > 220ms / rage overflow > 41 → sync auto-attack bonus damage while dumping rage to control threat
if swingTimer > 220 or curRage > 41 then
S(SPELL_YYDJ)
-- Delayed fallback: if swing timer is long, delay and fire an extra Heroic Strike; if rage is insufficient, cancel cast to avoid wasting rage
if swingTimer > 220 then
Sleep(1, swingTimer - 220, function()
if curRage > 41 then
S(SPELL_YYDJ)
else
StopCasting()
end
end)
end
end
-- 4.4 Whirlwind high-rage filler logic: Bloodthirst on cooldown, rage overflow > 66 → release to handle massive excess rage
if wwCD <= 0 and rage > 66 and btCD > 0 then
S(SPELL_WHIRLWIND)
rage = Power(1)
wwCD = SCT(SPELL_WHIRLWIND)
end
-- ====================== [Priority 5: Death Wish burst — activate after 2 Sunder Armor stacks, reserving time for tank to build threat and prevent aggro] ======================
-- TART reads Sunder Armor debuff stack count on target; stackNow is the current number of stacks
local _, stackNow = TART(SPELL_SUNDER)
-- Trigger condition: sufficient rage to cast, skill off cooldown, target Sunder Armor stacks > 1 (2+ stacks means tank threat is stable)
if rage > 9 and dwCD <= 0 and stackNow > 1 then
S(SPELL_DEATH_WISH)
rage = Power(1)
dwCD = SCT(SPELL_DEATH_WISH)
end
-- ====================== [Priority 6: Hamstring to refresh Flurry haste buff — fill Bloodthirst cooldown gaps with buff maintenance] ======================
-- Read Flurry buff remaining duration
local flurryLeft = AuraRemainingTime(AURA_FLURRY)
local flurryActive = flurryLeft > 0 -- flurryActive = true means self currently has Flurry haste buff
-- No Flurry buff, sufficient rage, Bloodthirst on cooldown → cast Hamstring to trigger Flurry
if not flurryActive and rage > 9 and btCD > 0 then
S(SPELL_FLURRY_PROC)
rage = Power(1)
flurryLeft = AuraRemainingTime(AURA_FLURRY)
end
-- ====================== [Priority 7: Auto dual trinket burst in combat — refresh cooldown variables in real time after use; will not trigger more than once per cycle] ======================
if inCombat then
local spiderCD = SCT(ITEM_SPIDER)
local sandCD = SCT(ITEM_SAND)
-- Kiss of the Spider: activate when target HP < 98% (non-full-HP phase) and trinket cooldown ready — avoids early-burst aggro
if HTP(0, 98) and spiderCD <= 0 then
M('/use Kiss of the Spider')
spiderCD = SCT(ITEM_SPIDER)
end
-- Sandstalker Figurine: no target HP restriction — activate immediately on cooldown; 20 seconds of 70% threat reduction — the core anti-aggro tool
if sandCD <= 0 then
M('/use Sandstalker Figurine')
sandCD = SCT(ITEM_SAND)
end
end
end