-- Dragonflight/Items.lua -- December 2022 local addon, ns = ... local Hekili = _G[ addon ] local class, state = Hekili.Class, Hekili.State local all = Hekili.Class.specs[ 0 ] local FindPlayerAuraByID = ns.FindPlayerAuraByID local RegisterEvent = ns.RegisterEvent local GetSpellCooldown = _G.GetSpellCooldown -- 10.0 all:RegisterAbilities( { algethar_puzzle_box = { cast = function() return 2 * haste end, cooldown = 180, gcd = "spell", item = 193701, toggle = "cooldowns", handler = function() applyBuff( "algethar_puzzle" ) if class.auras.stealth and buff.stealth.up then removeBuff( "stealth" ) end end, proc = "mastery", self_buff = "algethar_puzzle", auras = { algethar_puzzle = { id = 383781, duration = 30, max_stack = 1, }, }, copy = 383781 }, bag_of_biscuits = { cast = 0, cooldown = 90, gcd = "off", item = 197960, toggle = "cooldowns", handler = function() applyBuff( "biscuit_giver" ) end, proc = "mastery", self_buff = "biscuit_giver", auras = { biscuit_giver = { id = 381902, duration = 15, max_stack = 1, }, } }, blazebinders_hoof = { cast = 0, cooldown = 120, gcd = "off", item = 193762, toggle = "cooldowns", handler = function() applyBuff( "bound_by_fire_and_blaze" ) end, proc = "strength", self_buff = "bound_by_fire_and_blaze", auras = { bound_by_fire_and_blaze = { id = 383926, duration = 20, max_stack = 6, }, } }, bottomless_reliquary_satchel = { cast = 0, cooldown = 60, gcd = "off", item = 198695, toggle = "cooldowns", handler = function() applyBuff( "algethar_puzzle" ) end, proc = "damage", -- don't really know. auras = { bottomless_reliquary_satchel = { duration = 0.01, max_stack = 1, }, } }, broodkeepers_promise = { cast = 1, cooldown = 5, gcd = "off", item = 194307, toggle = "cooldowns", nobuff = "broodkeepers_promise", usable = function() return group, "requires allies" end, handler = function() applyBuff( "broodkeepers_promise" ) end, proc = "versatility", self_buff = "broodkeepers_promise", auras = { broodkeepers_promise = { id = 394457, duration = 3600, max_stack = 1, }, } }, burgeoning_seed = { cast = 0, cooldown = 30, gcd = "off", item = 193634, toggle = "cooldowns", buff = "brimming_lifepod", handler = function() removeBuff( "brimming_lifepod" ) applyBuff( "supernatural" ) end, proc = "versatility", self_buff = "supernatural", auras = { brimming_lifepod = { id = 384646, duration = 360, max_stack = 5, }, supernatural = { id = 384658, duration = 12, max_stack = 1, } } }, caregivers_charm = { cast = 0, cooldown = 90, gcd = "off", item = 198081, toggle = "cooldowns", usable = function() return group and active_dot.caregivers_watch == 0, "requires an ally" end, handler = function() applyBuff( "caregivers_watch" ) end, proc = "healing", self_buff = "caregivers_watch", auras = { caregivers_watch = { id = 382161, duration = 30, max_stack = 1, dot = "buff" } } }, choker_of_shielding = { cast = 0, cooldown = 180, gcd = "off", item = 193002, toggle = "defensives", handler = function() applyBuff( "choker_of_shielding" ) end, proc = "absorb", self_buff = "choker_of_shielding", auras = { choker_of_shielding = { id = 384646, duration = 10, max_stack = 1, }, } }, conjured_chillglobe = { cast = 0, cooldown = 90, gcd = "off", item = 194300, toggle = "cooldowns", handler = function() if mana.percent < 65 then gain( 11736, "mana" ) end end, proc = "mana", }, darkmoon_deck_box_dance = { cast = 0, cooldown = 90, gcd = "off", item = 198478, toggle = "cooldowns", proc = "damage", }, darkmoon_deck_box_inferno = { cast = 0, cooldown = 90, gcd = "off", item = 194872, toggle = "cooldowns", proc = "damage", }, darkmoon_deck_box_rime = { cast = 0, cooldown = 90, gcd = "off", item = 198477, toggle = "cooldowns", handler = function() applyDebuff( "target", "awakening_rime" ) end, proc = "damage", auras = { awakening_rime = { -- TODO: Check actual aura ID. id = 384623, duration = 12, max_stack = 1, } } }, darkmoon_deck_box_watcher = { cast = 0, cooldown = 90, gcd = "off", item = 198481, toggle = "defensives", handler = function() applyBuff( "watchers_blessing" ) end, proc = "versatility", self_buff = "watchers_blessing", auras = { watchers_blessing = { id = 384532, duration = 10, max_stack = 1 }, watchers_blessing_vers = { id = 384560, duration = 10, max_stack = 1 } } }, darkmoon_deck_dance = { cast = 0, cooldown = 90, gcd = "off", item = 198088, toggle = "cooldowns", proc = "damage", auras = { ace_of_air = { id = 382860, duration = 3600, max_stack = 1 }, two_of_air = { id = 382861, duration = 3600, max_stack = 1 }, three_of_air = { id = 382862, duration = 3600, max_stack = 1 }, four_of_air = { id = 382863, duration = 3600, max_stack = 1 }, five_of_air = { id = 382864, duration = 3600, max_stack = 1 }, six_of_air = { id = 382865, duration = 3600, max_stack = 1 }, seven_of_air = { id = 382866, duration = 3600, max_stack = 1 }, eight_of_air = { id = 382867, duration = 3600, max_stack = 1 }, } }, darkmoon_deck_inferno = { cast = 0, cooldown = 90, gcd = "off", item = 198086, proc = "damage", auras = { ace_of_fire = { id = 382835, duration = 3600, max_stack = 1 }, two_of_fire = { id = 382836, duration = 3600, max_stack = 1 }, three_of_fire = { id = 382837, duration = 3600, max_stack = 1 }, four_of_fire = { id = 382838, duration = 3600, max_stack = 1 }, five_of_fire = { id = 382839, duration = 3600, max_stack = 1 }, six_of_fire = { id = 382840, duration = 3600, max_stack = 1 }, seven_of_fire = { id = 382841, duration = 3600, max_stack = 1 }, eight_of_fire = { id = 382842, duration = 3600, max_stack = 1 } } }, darkmoon_deck_rime = { cast = 0, cooldown = 90, gcd = "off", item = 198087, handler = function() applyDebuff( "target", "awakening_rime" ) end, proc = "damage", auras = { ace_of_frost = { id = 382844, duration = 3600, max_stack = 1 }, two_of_frost = { id = 382845, duration = 3600, max_stack = 1 }, three_of_frost = { id = 382846, duration = 3600, max_stack = 1 }, four_of_frost = { id = 382847, duration = 3600, max_stack = 1 }, five_of_frost = { id = 382848, duration = 3600, max_stack = 1 }, six_of_frost = { id = 382849, duration = 3600, max_stack = 1 }, seven_of_frost = { id = 382850, duration = 3600, max_stack = 1 }, eight_of_frost = { id = 382851, duration = 3600, max_stack = 1 }, } }, darkmoon_deck_watcher = { cast = 0, cooldown = 90, gcd = "off", item = 198089, toggle = "defensives", handler = function() applyBuff( "watchers_blessing" ) end, proc = "versatility", auras = { ace_of_earth = { id = 382852, duration = 3600, max_stack = 1 }, two_of_earth = { id = 382853, duration = 3600, max_stack = 1 }, three_of_earth = { id = 382854, duration = 3600, max_stack = 1 }, four_of_earth = { id = 382855, duration = 3600, max_stack = 1 }, five_of_earth = { id = 382856, duration = 3600, max_stack = 1 }, six_of_earth = { id = 382857, duration = 3600, max_stack = 1 }, seven_of_earth = { id = 382858, duration = 3600, max_stack = 1 }, eight_of_earth = { id = 382859, duration = 3600, max_stack = 1 }, } }, decoration_of_flame = { cast = 0, cooldown = 120, gcd = "off", item = 194299, toggle = "cooldowns", handler = function() applyBuff( "decoration_of_flame" ) end, proc = "damage", self_buff = "decoration_of_flame", auras = { decoration_of_flame = { id = 382058, duration = 30, max_stack = 1 } } }, desperate_invokers_codex = { cast = 0, cooldown = function() return 240 - buff.hatred.stack end, gcd = "off", item = 194310, toggle = "cooldowns", proc = "damage", auras = { hatred = { id = 382419, duration = 3600, max_stack = 180 } } }, dragon_games_equipment = { cast = 0, cooldown = 120, gcd = "off", item = 193719, toggle = "cooldowns", proc = "damage", }, emerald_coachs_whistle = { cast = 0, cooldown = 1, gcd = "off", item = 193718, usable = function() return group, "requires an ally" end, nobuff = "coaching", handler = function() applyBuff( "coaching" ) active_dot.coached = 1 end, proc = "mastery", auras = { coaching = { id = 389581, duration = 3600, max_stack = 1, }, coached = { id = 386578, duration = 3600, max_stack = 1, dot = "buff" }, time_to_shine = { id = 383799, duration = 10, max_stack = 1 } } }, erupting_spear_fragment = { cast = 0, cooldown = 90, gcd = "off", item = 193769, toggle = "cooldowns", handler = function() applyBuff( "erupting_spear_fragment", nil, min( 5, active_enemies ) ) end, proc = "crit", self_buff = "erupting_spear_fragment", auras = { erupting_spear_fragment = { id = 381484, duration = 10, max_stack = 5 } } }, essence_of_somnikuss_shade = { cast = 0, cooldown = 300, gcd = "off", item = 200679, toggle = "cooldowns", handler = function() applyDebuff( "target", "ancient_poison_cloud" ) end, proc = "damage", auras = { ancient_poison_cloud = { id = 391621, duration = 45, max_stack = 1 } } }, globe_of_jagged_ice = { cast = 0, cooldown = 30, gcd = "off", item = 212683, -- usable = function() return active_dot.skewering_cold > 0, "requires skewering_cold stacks" end, handler = function() if debuff.skewering_cold.up then removeDebuff( "target", "skewering_cold" ) applyDebuff( "target", "breaking_the_ice" ) end active_dot.skewering_cold = 0 end, proc = "damage", auras = { skewering_cold = { id = 388929, duration = 60, max_stack = 4 }, breaking_the_ice = { id = 388948, duration = 10, max_stack = 1 } } }, homeland_raid_horn = { cast = 0, cooldown = 120, gcd = "off", item = 193815, toggle = "cooldowns", proc = "damage", }, iceblood_deathsnare = { cast = 0, cooldown = 120, gcd = "off", item = 194304, toggle = "cooldowns", handler = function() applyDebuff( "target", "crystalline_web" ) end, proc = "damage", auras = { crystalline_web = { id = 382130, duration = 15, max_stack = 5, copy = 394618 }, } }, integrated_primal_fire = { cast = 0, cooldown = 180, gcd = "off", item = 200868, toggle = "cooldowns", }, irideus_fragment = { cast = 0, cooldown = 180, gcd = "off", item = 193743, toggle = "cooldowns", handler = function() applyBuff( "crumbling_power", nil, 20 ) end, proc = "primary", self_buff = "crumbling_power", auras = { crumbling_power = { id = 383941, duration = 20, max_stack = 20 } } }, kharnalex_the_first_light = { cast = 3, channeled = true, cooldown = 180, gcd = "off", item = 195519, toggle = "cooldowns", usable = function() return class.evoker, "evoker only" end, }, lifeflame_ampoule = { cast = 0, cooldown = 120, gcd = "off", item = 198451, toggle = "cooldowns", }, manic_grieftorch = { cast = function() return 2 * haste end, channeled = true, cooldown = 120, gcd = "off", cycle = function() -- Recommend a different target if yours is expected to die before the channel would complete, with a little buffer added. if active_enemies > 1 and fight_remains > 3 * haste and target.time_to_die < 3 * haste then return "cycle" end end, item = 194308, toggle = "cooldowns", }, miniature_singing_stone = { cast = 0, cooldown = 120, gcd = "off", item = 193678, toggle = "defensives", -- TODO: May require an ally? handler = function() applyBuff( "miniature_singing_stone" ) end, proc = "absorb", auras = { miniature_singing_stone = { id = 388855, duration = 10, max_stack = 1 } } }, mote_of_sanctification = { cast = 0, cooldown = 90, gcd = "off", item = 133646, toggle = "cooldowns", handler = function() end, }, primal_ritual_shell = { cast = 0, cooldown = 1, gcd = "off", item = 200563, usable = false, auras = { stone_turtles_blessing = { id = 390643, duration = 3600, max_stack = 1, }, flame_turtles_blessing = { id = 390835, duration = 3600, max_stack = 1, }, sea_turtles_blessing = { id = 390869, duration = 3600, max_stack = 1, }, wind_turtles_blessing = { id = 390899, duration = 3600, max_stack = 1 }, primal_turtles_wish = { id = 390936, duration = 20, max_stack = 1, }, } }, restored_titan_artifact = { cast = 0, cooldown = 60, gcd = "off", item = 200549, handler = function() applyBuff( "restored_titan_artifact" ) end, proc = "absorb", auras = { restored_titan_artifact = { id = 390420, duration = 10, max_stack = 1 } } }, --[[ ringbound_hourglass = { cast = 0, cooldown = 3600, gcd = "off", item = 193000, toggle = "cooldowns", }, ]] ruby_whelp_shell = { cast = 0, cooldown = 1, gcd = "off", item = 193757, usable = false, auras = { under_red_wings = { id = 389820, duration = 12, max_stack = 1 } } }, spoils_of_neltharus = { cast = 0, cooldown = 120, gcd = "off", item = 193773, toggle = "cooldowns", proc = function() if buff.spoils_of_neltharus_crit.up then return "critical_strike" elseif buff.spoils_of_neltharus_haste.up then return "haste" elseif buff.spoils_of_neltharus_mastery.up then return "mastery" elseif buff.spoils_of_neltharus_vers.up then return "versatility" end return "random" end, self_buff = "spoils_of_neltharus_crit", handler = function() if buff.spoils_of_neltharus_crit.up then applyBuff( "spoils_of_neltharus_crit" ) elseif buff.spoils_of_neltharus_haste.up then applyBuff( "spoils_of_neltharus_haste" ) elseif buff.spoils_of_neltharus_mastery.up then applyBuff( "spoils_of_neltharus_mastery" ) elseif buff.spoils_of_neltharus_vers.up then applyBuff( "spoils_of_neltharus_vers" ) end end, auras = { spoils_of_neltharus_crit = { id = 381954, duration = 20, max_stack = 1, }, spoils_of_neltharus_haste = { id = 381955, duration = 20, max_stack = 1, }, spoils_of_neltharus_mastery = { id = 381956, duration = 20, max_stack = 1, }, spoils_of_neltharus_vers = { id = 381957, duration = 20, max_stack = 1 } } }, stormeaters_boon = { cast = 0, cooldown = 180, gcd = "off", item = 194302, toggle = "cooldowns", handler = function() applyBuff( "stormeaters_boon" ) applyDebuff( "player", "rooted", 10 ) end, proc = "damage", auras = { stormeaters_boon = { id = 377453, duration = 10, max_stack = 1 } } }, timebreaching_talon = { cast = 0, cooldown = 150, gcd = "off", item = 193791, toggle = "cooldowns", proc = "primary", self_buff = "power_theft", handler = function() applyBuff( "power_theft" ) end, auras = { power_theft = { id = 382126, duration = 15, max_stack = 1, }, price_of_power = { id = 384050, duration = 15, max_stack = 1 }, } }, tome_of_unstable_power = { cast = 0, cooldown = 180, gcd = "off", item = 193628, toggle = "cooldowns", handler = function() applyBuff( "tome_of_unstable_power" ) end, proc = "primary", self_buff = "tome_of_unstable_power", auras = { tome_of_unstable_power = { id = 388583, duration = 15, max_stack = 1 } } }, torrent_callers_shell = { cast = 3, channeled = true, cooldown = 150, gcd = "off", item = 200552, toggle = "cooldowns" }, treemouths_festering_splinter = { cast = 0, cooldown = 90, gcd = "off", item = 193652, toggle = "defensives", handler = function() applyBuff( "treemouths_festering_splinter" ) end, proc = "absorb", auras = { treemouths_festering_splinter = { id = 395175, duration = 15, max_stack = 1 } } }, uncanny_pocketwatch = { cast = 0, cooldown = 180, gcd = "off", item = 195220, toggle = "interrupts", handler = function() applyBuff( "pocketwatch_acceleration" ) end, proc = "speed", self_buff = "pocketwatch_acceleration", auras = { pocketwatch_acceleration = { id = 381609, duration = 8, max_stack = 1 } } }, waters_beating_heart = { cast = 8, channeled = true, cooldown = 120, gcd = "off", item = 193736, toggle = "defensives", start = function() applyBuff( "waters_beating_heart" ) end, auras = { waters_beating_heart = { id = 383934, duration = 8, tick_time = 2, max_stack = 1, dot = "buff" } } }, -- Shadowmoon Burial Grounds bonemaws_big_toe = { cast = 0, cooldown = 120, gcd = "off", item = 110012, toggle = "cooldowns", handler = function() applyBuff( "bonemaws_big_toe" ) end, proc = "crit", self_buff = "bonemaws_big_toe", auras = { bonemaws_big_toe = { id = 397400, duration = 20, max_stack = 1 } } }, voidmenders_shadowgem = { cast = 0, cooldown = 90, gcd = "off", item = 110007, toggle = "cooldowns", handler = function() applyBuff( "voidmenders_shadowgem" ) end, proc = "crit", self_buff = "voidmenders_shadowgem", auras = { voidmenders_shadowgem = { id = 397399, duration = 15, max_stack = 1 } } }, -- Trial of Valor gift_of_radiance = { cast = 0, cooldown = 60, gcd = "off", item = 133647, }, -- 10.0.7 winterpelt_totem = { cast = 0, cooldown = 120, gcd = "off", item = 202268, toggle = "cooldowns", handler = function() applyBuff( "winterpelts_blessing" ) end, auras = { winterpelts_blessing = { id = 398293, duration = 20, max_stack = 1 } } } } ) -- 10.1 -- TODO: Add triggers to specs' cooldowns. all:RegisterGear( "neltharions_call_to_dominance", 204202 ) all:RegisterAuras( { domineering_arrogance = { id = 411661, duration = 10, max_stack = 10 }, call_to_dominance = { id = 403380, duration = 10, max_stack = 10 } } ) all:RegisterGear( "neltharions_call_to_suffering", 204211 ) all:RegisterAura( "call_to_suffering", { id = 403386, duration = 12, max_stack = 1 } ) all:RegisterGear( "neltharions_call_to_chaos", 204201 ) all:RegisterAura( "call_to_chaos", { id = 403382, duration = 18, max_stack = 1 } ) all:RegisterGear( "igneous_flowstone", 203996 ) all:RegisterAuras( { igneous_ebb_tide = { id = 402898, duration = 30, max_stack = 1 }, igneous_low_tide = { id = 402896, duration = 60, max_stack = 1 }, igneous_fury = { id = 402897, duration = 12, max_stack = 1 }, igneous_flood_tide = { id = 402894, duration = 30, max_stack = 1 }, igneous_high_tide = { id = 402903, duration = 60, max_stack = 1 }, } ) all:RegisterGear( "ominous_chromatic_essence", 203729 ) all:RegisterAuras( { obsidian_resonance = { id = 402221, duration = 3600, max_stack = 1 }, ruby_resonance = { id = 401516, duration = 3600, max_stack = 1 }, bronze_resonance = { id = 401518, duration = 3600, max_stack = 1 }, azure_resonance = { id = 401519, duration = 3600, max_stack = 1 }, emerald_resonance = { id = 401521, duration = 3600, max_stack = 1 }, minor_obsidian_resonance = { id = 405615, duration = 3600, max_stack = 1 }, minor_ruby_resonance = { id = 405613, duration = 3600, max_stack = 1 }, minor_bronze_resonance = { id = 405612, duration = 3600, max_stack = 1 }, minor_azure_resonance = { id = 405611, duration = 3600, max_stack = 1 }, minor_emerald_resonance = { id = 405608, duration = 3600, max_stack = 1 }, } ) all:RegisterGear( "rashoks_molten_heart", 202614 ) all:RegisterAuras( { molten_radiance = { id = 409898, duration = 10, tick_time = 1, max_stack = 1 }, molten_overflow = { id = 401187, duration = 12, max_stack = 1 } } ) all:RegisterGear( "vessel_of_searing_shadow", 202615 ) all:RegisterAuras( { ravenous_shadowflame = { id = 401428, duration = 12, tick_time = 2, max_stack = 1 }, unstable_flames = { id = 401394, duration = 30, max_stack = 5 } } ) all:RegisterGear( "buzzing_orb_core", 204387 ) all:RegisterAuras( { buzzing_intensifies = { id = 405197, duration = 3600, max_stack = 120 }, orb_activated = { id = 405202, duration = 20, max_stack = 1 }, } ) all:RegisterGear( "stirring_twilight_ember", 205200 ) all:RegisterAuras( { stirring_twilight_ember = { id = 409067, duration = 10, tick_time = 2, max_stack = 1 }, twilight_celerity = { id = 409077, duration = 10, max_stack = 1 } } ) all:RegisterGear( "underlight_globe", 205191 ) -- Drogbar Rocks / Drogbar Stones all:RegisterAuras( { drogbar_stones = { id = 407904, duration = 10, max_stack = 1 }, might_of_the_drogbar = { id = 407913, duration = 10, max_stack = 1 } } ) all:RegisterAbilities( { beacon_to_the_beyond = { cast = function() return 2 * haste end, cooldown = 150, gcd = "off", item = 203963, toggle = "cooldowns", handler = function() end, copy = "anshuul_the_cosmic_wanderer" }, ward_of_faceless_ire = { cast = 0, cooldown = 120, gcd = "off", item = 203714, handler = function() applyBuff( "writhing_ward" ) end, auras = { writhing_ward = { id = 401238, duration = 10, max_stack = 1 }, writhing_ire = { id = 401257, duration = 6, tick_time = 1, max_stack = 1 } } }, screaming_black_dragonscale = { cast = 0, cooldown = 180, gcd = "off", item = 202612, toggle = "interrupts", -- utility. usable = function() return target.minR > 15, "only does damage if jumping 15+ yards" end, handler = function() setDistance( 5 ) applyBuff( "seething_descent" ) end, auras = { seething_descent = { id = 405940, duration = 5, max_stack = 1 }, screaming_flight = { id = 401469, duration = 15, max_stack = 1 } } }, dragonfire_bomb_dispenser = { cast = 0, charges = 3, cooldown = 30, recharge = 30, gcd = "off", icd = 10, item = 202610, no_icd = true, -- Does not trigger trinket CD, but looks confusing next to the icd. handler = function() applyDebuff( "target", "dragonfire_bomb_dispenser" ) end, auras = { dragonfire_bomb_dispenser = { id = 408675, duration = 7, max_stack = 1 }, flash_of_inspiration = { id = 408770, duration = 3600, max_stack = 60 } } }, elementium_pocket_anvil = { cast = 0.5, cooldown = 60, gcd = "off", item = 202617, no_icd = true, handler = function() addStack( "anvil_strike", nil, 1 ) end, auras = { anvil_strike = { id = 408578, duration = 3600, max_stack = 5, copy = { "anvil_strike_combat", 408533, "anvil_strike_no_combat" } } } }, zaqali_chaos_grapnel = { cast = 0, cooldown = 90, gcd = "off", item = 202613, toggle = "cooldowns", handler = function() setDistance( 5 ) end, }, enduring_dreadplate = { cast = 0, cooldown = 90, gcd = "off", item = 202616, toggle = "cooldowns", handler = function() applyBuff( "enduring_dreadplate", nil, 5 ) end, auras = { hellsteel_plating = { id = 400986, duration = 15, max_stack = 5 } } }, smoldering_lava_puffer = { cast = 0, cooldown = 0, gcd = "spell", item = 203987, nobuff = "volcanic_heartburn", handler = function() applyBuff( "volcanic_heartburn" ) end, auras = { volcanic_heartburn = { id = 402685, duration = 3600, max_stack = 1 } } }, draconic_cauterizing_magma = { cast = 2.5, channeled = true, cooldown = 120, gcd = "spell", item = 204388, toggle = "defensives", handler = function() applyBuff( "cauterizing_shield" ) end, auras = { cauterizing_shield = { id = 405109, duration = 2.5, max_stack = 1 }, cauterizing_flame = { id = 405068, duration = 2.5, max_stack = 1 } } }, pocket_darkened_elemental_core = { cast = 1, cooldown = 90, gcd = "off", item = 204386, toggle = "cooldowns", handler = function() end, }, magma_serpent_lure = { cast = 0, cooldown = 150, gcd = "off", item = 205229, toggle = "cooldowns", handler = function() end, }, heatbound_medallion = { cast = 0, cooldown = 90, gcd = "off", item = 204736, toggle = "cooldowns", handler = function() end, }, satchel_of_healing_spores = { cast = 0, cooldown = 120, gcd = "off", item = 204714, toggle = "defensives", handler = function() applyBuff( "satchel_of_healing_spores" ) end, auras = { satchel_of_healing_spores = { id = 406448, duration = 15, max_stack = 1 } } }, friendship_censer = { cast = 0, cooldown = 90, gcd = "off", item = 204728, toggle = "cooldowns", handler = function() applyBuff( "friendship_censer" ) end, auras = { encouraging_friend = { id = 406485, duration = 20, max_stack = 1 }, angry_friend = { id = 406488, duration = 2, max_stack = 1 } } }, magmaclaw_lure = { cast = 0, cooldown = 150, gcd = "off", item = 205262, toggle = "defensives", handler = function() applyBuff( "magmaclaw_lure" ) end, auras = { magmaclaw_lure = { id = 409296, duration = 10, max_stack = 1 } } }, zaqali_hand_cannon = { cast = 0, cooldown = 90, gcd = "off", item = 205196, toggle = "cooldowns", handler = function() applyDebuff( "target", "zaqali_hand_cannon" ) end, auras = { magma_pour = { id = 408635, duration = 8, tick_time = 2, max_stack = 1 } } }, deepflayer_lure = { cast = 0, cooldown = 120, gcd = "off", item = 205276, toggle = "defensives", handler = function() applyBuff( "deepflayers_tenacity" ) end, auras = { deepflayers_tenacity = { id = 409347, duration = 10, max_stack = 1 } } }, fractured_crystalspine_quill = { cast = 0, cooldown = 120, gcd = "off", item = 205194, toggle = "cooldowns", handler = function() applyBuff( "fractured_crystalspine_quill" ) end, auras = { fractured_crystalspine_quill = { id = 408625, duration = 15, max_stack = 1 } } }, smoldering_howler_horn = { cast = 0, cooldown = 90, gcd = "off", item = 205201, toggle = "cooldowns", handler = function() applyBuff( "smoldering_howl" ) end, auras = { smoldering_howl = { id = 408652, duration = 20, max_stack = 1 } } }, sturdy_deepflayer_scute = { cast = 0, cooldown = 90, gcd = "off", item = 205193, toggle = "cooldowns", handler = function() applyBuff( "sturdy_deepflayer_scute" ) end, auras = { sturdy_deepflayer_scute = { id = 408612, duration = 15, max_stack = 1 } } }, -- Other slots. djaruun_pillar_of_the_elder_flame = { cast = 0, cooldown = 150, gcd = "off", item = 202569, no_icd = true, toggle = "cooldowns", handler = function() end, auras = { seething_rage = { id = 408835, duration = 10, max_stack = 1 } } }, shadowed_razing_annihilator = { cast = 0, cooldown = 180, gcd = "off", item = 205046, toggle = "cooldowns", handler = function() end, }, -- Patch 10.1.5 mirror_of_fractured_tomorrows = { cast = 0, cooldown = 180, gcd = "off", item = 207581, toggle = "cooldowns", handler = function() applyBuff( "mirror_of_fractured_tomorrows" ) end, proc = "primary", self_buff = "mirror_of_fractured_tomorrows", auras = { mirror_of_fractured_tomorrows = { id = 418527, duration = 20, max_stack = 1 } } }, echoing_tyrstone = { cast = 0, cooldown = 120, gcd = "off", item = 207552, toggle = "defensives", usable = function() return buff.echoing_tyrstone_stored.down, "don't use when stored healing was not spent" end, handler = function() applyBuff( "echoing_tyrstone_stored" ) end, auras = { echoing_tyrstone = { id = 417939, duration = 10, max_stack = 1 }, echoing_tyrstone_stored = { id = 417967, duration = 3600, max_stack = 1 } } }, paracausal_fragment_of_frostmourne = { cast = 2, cooldown = 150, gcd = "off", item = 206983, toggle = "cooldowns", usable = function() return buff.lost_soul.stack > 9, "requires lost souls" end, handler = function() removeBuff( "lost_soul" ) end, auras = { lost_soul = { id = 415007, duration = 3600, max_stack = 10 }, } }, iridal_the_earths_master = { cast = 0, cooldown = 180, gcd = "off", item = 208321, toggle = "cooldowns", usable = function() return target.health_pct < 35, "requires target below 35% health" end, handler = function() end, }, timethiefs_gambit = { cast = 0, cooldown = 60, gcd = "off", item = 207579, toggle = "essences", handler = function() applyBuff( "timethiefs_gambit" ) applyDebuff( "player", "paradox" ) end, proc = "haste", self_buff = "timethiefs_gambit", auras = { timethiefs_gambit = { id = 417534, duration = 15, max_stack = 1 }, paradox = { id = 417543, duration = 120, max_stack = 1 } } }, paracausal_fragment_of_doomhammer = { cast = 1.5, cooldown = 90, gcd = "spell", item = 206964, toggle = "cooldowns", handler = function() end, }, paracausal_fragment_of_shalamayne = { cast = 1.5, cooldown = 90, gcd = "spell", item = 207024, toggle = "cooldowns", handler = function() end, }, -- 10.2 ashes_of_the_embersoul = { cast = 0, cooldown = 120, gcd = "off", item = 207167, toggle = "cooldowns", proc = "primary", self_buff = "soul_ignition", handler = function() applyBuff( "soul_ignition" ) end, auras = { soul_ignition = { id = 423611, duration = 20, tick_time = 3, max_stack = 6 }, blazing_soul = { id = 426911, duration = 20, tick_time = 3, max_stack = 6 }, burned_out = { id = 426897, duration = 60, max_stack = 1 } } }, bandolier_of_twisted_blades = { cast = 0, cooldown = 90, gcd = "off", item = 207165, toggle = "cooldowns", handler = function() applyDebuff( "target", "embed_blade" ) end, auras = { embed_blade = { id = 422303, duration = 3, max_stack = 1 } } }, belorrelos_the_suncaller = { cast = 2, cooldown = 120, gcd = "off", item = 207172, toggle = "cooldowns", handler = function() applyBuff( "solar_maelstrom" ) end, proc = "damage", auras = { solar_maelstrom = { id = 425417, duration = 12, tick_time = 3, max_stack = 1 } } }, branch_of_the_tormented_ancient = { cast = 0, cooldown = 150, gcd = "off", item = 207169, toggle = "cooldowns", proc = "damage", handler = function() applyBuff( "roots_of_the_tormented_ancient", nil, 4 ) end, auras = { roots_of_the_tormented_ancient = { id = 422441, duration = 4, max_stack = 1 } } }, fyrakks_tainted_rageheart = { cast = 0, cooldown = 90, gcd = "off", item = 207174, toggle = "cooldowns", handler = function() applyBuff( "shadowflame_rage" ) end, proc = "absorb", self_buff = "shadowflame_rage", auras = { shadowflame_rage = { id = 422750, duration = 10, max_stack = 1 } } }, nymues_unraveling_spindle = { cast = 3, channeled = true, cooldown = 120, gcd = "off", item = 208615, toggle = "cooldowns", start = function() applyBuff( "nymues_vengeful_spindle" ) end, proc = "mastery", self_buff = "nymues_vengeful_spindle", auras = { nymues_vengeful_spindle = { id = 427072, duration = 18, max_stack = 1 } }, copy = 422956 }, smoldering_seedling = { cast = 0, cooldown = 120, gcd = "off", item = 207170, toggle = "cooldowns", handler = function() applyBuff( "smoldering_seedling" ) end, proc = "mastery", self_buff = "smoldering_seedling", auras = { smoldering_seedling = { id = 426566, duration = 12, max_stack = 1 }, seedlings_thanks = { id = 426624, duration = 10, max_stack = 1 } } }, witherbarks_branch = { cast = 0, cooldown = 120, gcd = "off", item = 109999, toggle = "cooldowns", proc = "mastery", self_buff = "aqueous_enrichment", handler = function() -- Do nothing; it's up to the player to collect orbs. end, auras = { aqueous_enrichment = { id = 429262, duration = 10, max_stack = 3 } } }, dreambinder_loom_of_the_great_cycle = { cast = 2, channeled = true, cooldown = 120, gcd = "off", item = 208616, toggle = "cooldowns", start = function() applyBuff( "web_of_dreams" ) end, auras = { web_of_dreams = { id = 427112, duration = 6, max_stack = 1 } } }, leaf_of_the_ancient_protectors = { cast = 0, cooldown = 60, gcd = "off", item = 110009, toggle = "defensives", handler = function() applyBuff( "ancient_protection" ) end, proc = "absorb", self_buff = "ancient_protection", auras = { ancient_protection = { id = 429271, duration = 15, max_stack = 1 }, ancient_resurgence = { id = 429272, duration = 15, max_stack = 1 } } }, -- Everbloom spores_of_alacrity = { cast = 0, cooldown = 120, gcd = "off", item = 110014, toggle = "cooldowns", handler = function() applyBuff( "alacritous_spores" ) end, proc = "haste", self_buff = "alacritous_spores", auras = { alacritous_spores = { id = 429276, duration = 20, max_stack = 10 -- Ticks down? } } }, -- Throne of the Tides might_of_the_ocean = { cast = 0, cooldown = 90, gcd = "off", item = 133197, toggle = "cooldowns", handler = function() applyBuff( "tidehunters_blessing" ) end, proc = "primary", self_buff = "tidehunters_blessing", auras = { tidehunters_blessing = { id = 91340, duration = 20, max_stack = 1 } } }, -- Legendary fyralath_the_dreamrender = { cast = 0, cooldown = 120, gcd = "off", item = 206448, toggle = "cooldowns", handler = function() removeDebuff( "target", "mark_of_fyralath" ) active_dot.mark_of_fyralath = 0 setDistance( 5 ) end, auras = { mark_of_fyralath = { id = 414532, duration = 15, max_stack = 1 }, }, copy = { "fyralath_the_dream_render", "rage_of_fyralath_417131" } }, -- Missed items? granyths_enduring_scale = { cast = 0, cooldown = 120, gcd = "off", item = 212757, toggle = "defensives", handler = function() applyBuff( "granyths_enduring_scale" ) end, auras = { granyths_enduring_scale = { id = 434064, duration = 20, max_stack = 20 } } } } )