-- ShamanElemental.lua -- August 2025 -- Patch 11.2 if UnitClassBase( "player" ) ~= "SHAMAN" then return end local addon, ns = ... local Hekili = _G[ addon ] local class, state = Hekili.Class, Hekili.State local spec = Hekili:NewSpecialization( 262 ) ---- Local function declarations for increased performance -- Strings local strformat = string.format -- Tables local insert, remove, sort, wipe = table.insert, table.remove, table.sort, table.wipe -- Math local abs, ceil, floor, max, sqrt = math.abs, math.ceil, math.floor, math.max, math.sqrt -- Common WoW APIs, comment out unneeded per-spec -- local GetSpellCastCount = C_Spell.GetSpellCastCount -- local GetSpellInfo = C_Spell.GetSpellInfo -- local GetSpellInfo = ns.GetUnpackedSpellInfo -- local GetPlayerAuraBySpellID = C_UnitAuras.GetPlayerAuraBySpellID local FindUnitBuffByID, FindUnitDebuffByID = ns.FindUnitBuffByID, ns.FindUnitDebuffByID -- local IsSpellOverlayed = C_SpellActivationOverlay.IsSpellOverlayed -- local IsSpellKnownOrOverridesKnown = C_SpellBook.IsSpellInSpellBook -- local IsActiveSpell = ns.IsActiveSpell -- Specialization-specific local functions (if any) local GetWeaponEnchantInfo = GetWeaponEnchantInfo spec:RegisterResource( Enum.PowerType.Maelstrom ) spec:RegisterResource( Enum.PowerType.Mana ) -- Talents spec:RegisterTalents( { -- Shaman ancestral_wolf_affinity = { 103610, 382197, 1 }, -- Cleanse Spirit, Wind Shear, Purge, and totem casts no longer cancel Ghost Wolf arctic_snowstorm = { 103619, 462764, 1 }, -- Enemies within $s1 yds of your Frost Shock are snared by $s2% ascending_air = { 103607, 462791, 1 }, -- Wind Rush Totem's cooldown is reduced by $s1 sec and its movement speed effect lasts an additional $s2 sec astral_bulwark = { 103611, 377933, 1 }, -- Astral Shift reduces damage taken by an additional $s1% astral_shift = { 103616, 108271, 1 }, -- Shift partially into the elemental planes, taking $s1% less damage for $s2 sec brimming_with_life = { 103582, 381689, 1 }, -- Maximum health increased by $s1%, and while you are at full health, Reincarnation cools down $s2% faster call_of_the_elements = { 103592, 383011, 1 }, -- Reduces the cooldown of Totemic Recall by $s1 sec capacitor_totem = { 103579, 192058, 1 }, -- Summons a totem at the target location that gathers electrical energy from the surrounding air and explodes after $s1 sec, stunning all enemies within $s2 yards for $s3 sec chain_heal = { 103588, 1064, 1 }, -- Heals the friendly target for $s1, then jumps up to $s2 yards to heal the $s3 most injured nearby allies. Healing is reduced by $s4% with each jump chain_lightning = { 103583, 188443, 1 }, -- Hurls a lightning bolt at the enemy, dealing $s$s2 Nature damage and then jumping to additional nearby enemies. Affects $s3 total targets. Generates $s4 Maelstrom per target hit cleanse_spirit = { 103608, 51886, 1 }, -- Removes all Curse effects from a friendly target creation_core = { 103592, 383012, 1 }, -- Totemic Recall affects an additional totem earth_elemental = { 103585, 198103, 1 }, -- Calls forth a Greater Earth Elemental to protect you and your allies for $s1 min. While this elemental is active, your maximum health is increased by $s2% earth_shield = { 103596, 974, 1 }, -- Protects the target with an earthen shield, increasing your healing on them by $s1% and healing them for $s2 when they take damage. This heal can only occur once every $s3 sec. Maximum $s4 charges. Earth Shield can only be placed on one target at a time. Only one Elemental Shield can be active on the Shaman earthgrab_totem = { 103617, 51485, 1 }, -- Summons a totem at the target location for $s1 sec. The totem pulses every $s2 sec, rooting all enemies within $s3 yards for $s4 sec. Enemies previously rooted by the totem instead suffer $s5% movement speed reduction elemental_orbit = { 103602, 383010, 1 }, -- Increases the number of Elemental Shields you can have active on yourself by $s1. You can have Earth Shield on yourself and one ally at the same time elemental_resistance = { 103601, 462368, 1 }, -- Healing from Healing Stream Totem reduces Fire, Frost, and Nature damage taken by $s1% for $s2 sec elemental_warding = { 103597, 381650, 1 }, -- Reduces all magic damage taken by $s1% encasing_cold = { 103619, 462762, 1 }, -- Frost Shock snares its targets by an additional $s1% and its duration is increased by $s2 sec enhanced_imbues = { 103606, 462796, 1 }, -- The effects of your weapon and shield imbues are increased by $s1% fire_and_ice = { 103605, 382886, 1 }, -- Increases all Fire and Frost damage you deal by $s1% frost_shock = { 103604, 196840, 1 }, -- Chills the target with frost, causing $s$s2 Frost damage and reducing the target's movement speed by $s3% for $s4 sec. Generates $s5 Maelstrom graceful_spirit = { 103626, 192088, 1 }, -- Reduces the cooldown of Spiritwalker's Grace by $s1 sec and increases your movement speed by $s2% while it is active greater_purge = { 103624, 378773, 1 }, -- Purges the enemy target, removing $s1 beneficial Magic effects guardians_cudgel = { 103618, 381819, 1 }, -- When Capacitor Totem fades or is destroyed, another Capacitor Totem is automatically dropped in the same place gust_of_wind = { 103591, 192063, 1 }, -- A gust of wind hurls you forward healing_stream_totem = { 103590, 5394, 1 }, -- Summons a totem at your feet for $s1 sec that heals an injured party or raid member within $s2 yards for $s3 every $s4 sec. If you already know Healing Stream Totem, instead gain $s5 additional charge of Healing Stream Totem hex = { 103623, 51514, 1 }, -- Transforms the enemy into a frog for $s1 min. While hexed, the victim is incapacitated, and cannot attack or cast spells. Damage may cancel the effect. Limit $s2. Only works on Humanoids and Beasts jet_stream = { 103607, 462817, 1 }, -- Wind Rush Totem's movement speed bonus is increased by $s1% and now removes snares lava_burst = { 103598, 51505, 1 }, -- Hurls molten lava at the target, dealing $s$s2 Fire damage. Lava Burst will always critically strike if the target is affected by Flame Shock. Generates $s3 Maelstrom lightning_lasso = { 103589, 305483, 1 }, -- Grips the target in lightning, stunning and dealing $s$s2 Nature damage over $s3 sec while the target is lassoed. Can move while channeling mana_spring = { 103587, 381930, 1 }, -- Your Lava Burst casts restore $s1 mana to you and $s2 allies nearest to you within $s3 yards. Allies can only benefit from one Shaman's Mana Spring effect at a time, prioritizing healers natures_fury = { 103622, 381655, 1 }, -- Increases the critical strike chance of your Nature spells and abilities by $s1% natures_guardian = { 103613, 30884, 1 }, -- When your health is brought below $s1%, you instantly heal for $s2% of your maximum health. Cannot occur more than once every $s3 sec natures_swiftness = { 103620, 378081, 1 }, -- Your next healing or damaging Nature spell is instant cast and costs no mana planes_traveler = { 103611, 381647, 1 }, -- Reduces the cooldown of Astral Shift by $s1 sec poison_cleansing_totem = { 103609, 383013, 1 }, -- Summons a totem at your feet that removes all Poison effects from a nearby party or raid member within $s1 yards every $s2 sec for $s3 sec primordial_bond = { 103612, 381764, 1 }, -- While you have an elemental active, your damage taken is reduced by $s1% purge = { 103624, 370, 1 }, -- Purges the enemy target, removing $s1 beneficial Magic effect refreshing_waters = { 103594, 378211, 1 }, -- Your Healing Surge is $s1% more effective on yourself seasoned_winds = { 103628, 355630, 1 }, -- Interrupting a spell with Wind Shear decreases your damage taken from that spell school by $s1% for $s2 sec. Stacks up to $s3 times spirit_walk = { 103591, 58875, 1 }, -- Removes all movement impairing effects and increases your movement speed by $s1% for $s2 sec spirit_wolf = { 103581, 260878, 1 }, -- While transformed into a Ghost Wolf, you gain $s1% increased movement speed and $s2% damage reduction every $s3 sec, stacking up to $s4 times spiritwalkers_aegis = { 103626, 378077, 1 }, -- When you cast Spiritwalker's Grace, you become immune to Silence and Interrupt effects for $s1 sec spiritwalkers_grace = { 103584, 79206, 1 }, -- Calls upon the guidance of the spirits for $s1 sec, permitting movement while casting Shaman spells. Castable while casting. Increases movement speed by $s2% static_charge = { 103618, 265046, 1 }, -- Reduces the cooldown of Capacitor Totem by $s1 sec for each enemy it stuns, up to a maximum reduction of $s2 sec stone_bulwark_totem = { 103629, 108270, 1 }, -- Summons a totem at your feet that grants you an absorb shield preventing $s$s2 million damage for $s3 sec, and an additional $s4 every $s5 sec for $s6 sec thunderous_paws = { 103581, 378075, 1 }, -- Ghost Wolf removes snares and increases your movement speed by an additional $s1% for the first $s2 sec. May only occur once every $s3 sec thundershock = { 103621, 378779, 1 }, -- Thunderstorm knocks enemies up instead of away and its cooldown is reduced by $s1 sec thunderstorm = { 103603, 51490, 1 }, -- Calls down a bolt of lightning, dealing $s$s2 Nature damage to all enemies within $s3 yards, reducing their movement speed by $s4% for $s5 sec, and knocking them upward. Usable while stunned totemic_focus = { 103625, 382201, 1 }, -- Increases the radius of your totem effects by $s1%. Increases the duration of your Earthbind and Earthgrab Totems by $s2 sec. Increases the duration of your Healing Stream, Tremor, Poison Cleansing, and Wind Rush Totems by $s3 sec totemic_projection = { 103586, 108287, 1 }, -- Relocates your active totems to the specified location totemic_recall = { 103595, 108285, 1 }, -- Resets the cooldown of your most recently used totem with a base cooldown shorter than $s1 minutes totemic_surge = { 103599, 381867, 1 }, -- Reduces the cooldown of your totems by $s1 sec traveling_storms = { 103621, 204403, 1 }, -- Thunderstorm now can be cast on allies within $s1 yards, reduces enemies movement speed by $s2%, and knocks enemies $s3% further tremor_totem = { 103593, 8143, 1 }, -- Summons a totem at your feet that shakes the ground around it for $s1 sec, removing Fear, Charm and Sleep effects from party and raid members within $s2 yards voodoo_mastery = { 103600, 204268, 1 }, -- Your Hex target is slowed by $s1% during Hex and for $s2 sec after it ends. Reduces the cooldown of Hex by $s3 sec wind_rush_totem = { 103627, 192077, 1 }, -- Summons a totem at the target location for $s1 sec, continually granting all allies who pass within $s2 yards $s3% increased movement speed for $s4 sec wind_shear = { 103615, 57994, 1 }, -- Disrupts the target's concentration with a burst of wind, interrupting spellcasting and preventing any spell in that school from being cast for $s1 sec winds_of_alakir = { 103614, 382215, 1 }, -- Increases the movement speed bonus of Ghost Wolf by $s1%. When you have $s2 or more totems active, your movement speed is increased by $s3% -- Elemental aftershock = { 81000, 273221, 1 }, -- Earth Shock, Elemental Blast, and Earthquake have a $s1% chance to refund all Maelstrom spent ascendance = { 80989, 114050, 1 }, -- Transform into a Flame Ascendant for $s1 sec, instantly casting a Flame Shock and a $s2% effectiveness Lava Burst at up to $s3 nearby enemies. While ascended, Elemental Overload damage is increased by $s4% and spells affected by your Mastery: Elemental Overload cause $s5 additional Elemental Overload charged_conduit = { 80991, 468625, 1 }, -- Increases the duration of Lightning Rod by $s1 sec and its damage bonus by $s2% deeply_rooted_elements = { 80992, 378270, 1 }, -- Each Maelstrom spent has a $s1% chance to activate Ascendance for $s2 sec. Ascendance Transform into a Flame Ascendant for $s5 sec, instantly casting a Flame Shock and a $s6% effectiveness Lava Burst at up to $s7 nearby enemies. While ascended, Elemental Overload damage is increased by $s8% and spells affected by your Mastery: Elemental Overload cause $s9 additional Elemental Overload earth_shock = { 80984, 8042, 1 }, -- Instantly shocks the target with concussive force, causing $s$s2 Nature damage earthen_rage = { 103634, 170374, 1 }, -- Your damaging spells incite the earth around you to come to your aid for $s2 sec, repeatedly dealing $s$s3 Nature damage to your most recently attacked target earthquake = { 80985, 61882, 1 }, -- Causes the earth within $s2 yards of the target location to tremble and break, dealing $s$s3 Physical damage over $s4 sec and has a $s5% chance to knock the enemy down. Multiple uses of Earthquake may overlap. This spell is cast at a selected location earthshatter = { 80995, 468626, 1 }, -- Increases Earth Shock and Earthquake damage by $s1% and the stat bonuses granted by Elemental Blast by $s2% echo_chamber = { 81013, 382032, 1 }, -- Increases the damage dealt by your Elemental Overloads by $s1% echo_of_the_elementals = { 81008, 462864, 1 }, -- When your Storm Elemental or Fire Elemental expires, it leaves behind a lesser Elemental to continue attacking your enemies for $s1 sec echo_of_the_elements = { 80999, 333919, 1 }, -- Lava Burst has an additional charge echoes_of_great_sundering = { 103641, 384087, 1 }, -- After casting Earth Shock, your next Earthquake deals $s1% additional damage. After casting Elemental Blast, your next Earthquake deals $s2% additional damage elemental_blast = { 80984, 117014, 1 }, -- Harnesses the raw power of the elements, dealing $s1 million Elemental damage and increasing your Critical Strike or Haste by $s2% or Mastery by $s3% for $s4 sec elemental_equilibrium = { 80993, 378271, 1 }, -- Dealing direct Fire, Frost, and Nature damage within $s1 sec will increase all damage dealt by $s2% for $s3 sec. This can only occur once every $s4 sec elemental_fury = { 80983, 60188, 1 }, -- Your damaging critical strikes deal $s1% damage instead of the usual $s2% elemental_unity = { 103630, 462866, 1 }, -- While a Storm Elemental is active, your Nature damage dealt is increased by $s1%. While a Fire Elemental is active, your Fire damage dealt is increased by $s2% erupting_lava = { 81006, 468574, 1 }, -- Increases the duration of Flame Shock by $s1 sec and its damage by $s2%. Lava Burst consumes up to $s3 sec of Flame Shock, instantly dealing that damage. Lava Burst overloads benefit at $s4% effectiveness everlasting_elements = { 103633, 462867, 1 }, -- Increases the duration of your Elementals by $s1% eye_of_the_storm = { 81003, 381708, 1 }, -- Reduces the Maelstrom cost of Earth Shock and Earthquake by $s1. Reduces the Maelstrom cost of Elemental Blast by $s2 fire_elemental = { 80981, 198067, 1 }, -- Calls forth a Greater Fire Elemental to rain destruction on your enemies for $s1 sec. While the Fire Elemental is active, Flame Shock deals damage $s2% faster, and newly applied Flame Shocks last $s3% longer first_ascendant = { 103640, 462440, 1 }, -- The cooldown of Ascendance is reduced by $s1 sec flames_of_the_cauldron = { 81010, 378266, 1 }, -- Reduces the cooldown of Flame Shock by $s1 sec and Flame Shock deals damage $s2% faster flash_of_lightning = { 80990, 381936, 1 }, -- Increases the critical strike chance of Lightning Bolt and Chain Lightning by $s1% flux_melting = { 80996, 381776, 1 }, -- Casting Frost Shock or Icefury increases the damage of your next Lava Burst by $s1% fury_of_the_storms = { 80998, 191717, 1 }, -- Casting Stormkeeper summons a powerful Lightning Elemental to fight by your side for $s1 sec fusion_of_elements = { 103638, 462840, 1 }, -- After casting Icefury, the next time you cast a damaging Nature and Fire spell, you additionally cast an Elemental Blast at your target at $s1% effectiveness herald_of_the_storms = { 80998, 468571, 1 }, -- Casting Lightning Bolt or Chain Lightning reduces the cooldown of Stormkeeper by $s1 sec icefury = { 80997, 462816, 1 }, -- Casting Lightning Bolt, Lava Burst, or Chain Lightning has a chance to replace your next Frost Shock with Icefury, stacking up to $s2 times. Icefury Hurls frigid ice at the target, dealing $s$s5 Frost damage and causing your next Frost Shock to deal $s6% increased damage, damage $s7 additional targets, and generate $s8 additional Maelstrom. Generates $s9 Maelstrom improved_flametongue_weapon = { 81009, 382027, 1 }, -- Imbuing your weapon with Flametongue increases your Fire spell damage by $s1% for $s2 |$s3hour:hrs; lightning_capacitor = { 103631, 462862, 1 }, -- While Lightning Shield is active, your Nature damage dealt is increased by $s1% lightning_rod = { 81012, 210689, 1 }, -- Earth Shock, Elemental Blast, and Earthquake make your target a Lightning Rod for $s1 sec. Lightning Rods take $s2% of all damage you deal with Lightning Bolt and Chain Lightning liquid_magma_totem = { 103637, 192222, 1 }, -- Summons a totem at the target location that erupts dealing $s$s3 Fire damage and applying Flame Shock to $s4 enemies within $s5 yards. Continues hurling liquid magma at a random nearby target every $s6 sec for $s7 sec, dealing $s$s8 Fire damage to all enemies within $s9 yards. Generates $s10 Maelstrom magma_chamber = { 81007, 381932, 1 }, -- Flame Shock damage increases the damage of your next Earth Shock, Elemental Blast, or Earthquake by $s1%, stacking up to $s2 times master_of_the_elements = { 81004, 16166, 1 }, -- Casting Lava Burst increases the damage or healing of your next Nature, Physical, or Frost spell by $s1% mountains_will_fall = { 81002, 381726, 1 }, -- Earth Shock, Elemental Blast, and Earthquake can trigger your Mastery: Elemental Overload at $s1% effectiveness. Overloaded Earthquakes do not knock enemies down power_of_the_maelstrom = { 81015, 191861, 1 }, -- Casting Lava Burst has a $s1% chance to cause your next Lightning Bolt or Chain Lightning cast to trigger Elemental Overload an additional time, stacking up to $s2 times preeminence = { 103640, 462443, 1 }, -- Your haste is increased by $s1% while Ascendance is active and its duration is increased by $s2 sec primal_elementalist = { 103632, 117013, 1 }, -- Your Earth, Fire, and Storm Elementals are drawn from primal elementals $s1% more powerful than regular elementals, with additional abilities, and you gain direct control over them primordial_fury = { 103639, 378193, 1 }, -- Elemental Fury increases critical strike damage by an additional $s1% primordial_wave = { 81014, 375982, 1 }, -- Blast all targets affected by your Flame Shock within $s2 yards with a Primordial Wave, dealing $s$s3 Elemental damage, and granting you Lava Surge. Generates $s4 Maelstrom searing_flames = { 81005, 381782, 1 }, -- Flame Shock damage has a chance to generate $s1 Maelstrom splintered_elements = { 80978, 382042, 1 }, -- Primordial Wave grants you $s1% Haste plus $s2% for each additional targets blasted by Primordial Wave for $s3 sec storm_elemental = { 80981, 192249, 1 }, -- Calls forth a Greater Storm Elemental to hurl gusts of wind at your enemies for $s1 sec. While the Storm Elemental is active, casting Lightning Bolt or Chain Lightning increases your haste by $s2%, stacking up to $s3 times storm_frenzy = { 103635, 462695, 1 }, -- Your next Chain Lightning or Lightning Bolt has $s1% reduced cast time after casting Earth Shock, Elemental Blast, or Earthquake. Can accumulate up to $s2 charges stormkeeper = { 80988, 191634, 1 }, -- Charge yourself with lightning, causing your next $s1 Lightning Bolts to deal $s2% more damage, and also causes your next $s3 Lightning Bolts or Chain Lightnings to be instant cast and trigger an Elemental Overload on every target surge_of_power = { 81000, 262303, 1 }, -- Earth Shock, Elemental Blast, and Earthquake enhance your next spell cast within $s1 sec: Flame Shock: The next cast also applies Flame Shock to $s2 additional target within $s3 yards of the target. Lightning Bolt: Your next cast will cause $s4 additional Elemental Overload. Chain Lightning: Your next cast will chain to $s5 additional target. Lava Burst: Reduces the cooldown of your Fire and Storm Elemental by $s6 sec. Frost Shock: Freezes the target in place for $s7 sec swelling_maelstrom = { 81016, 381707, 1 }, -- Increases your maximum Maelstrom by $s1. Increases Earth Shock, Elemental Blast, and Earthquake damage by $s2% thunderstrike_ward = { 103636, 462757, 1 }, -- Imbue your shield with the element of Lightning for $s2 |$s3hour:hrs;, giving Lightning Bolt and Chain Lightning a chance to call down $s4 Thunderstrikes on your target for $s$s5 Nature damage -- Farseer ancestral_swiftness = { 94894, 443454, 1 }, -- Your next healing or damaging spell is instant, costs no mana, and deals $s1% increased damage and healing. If you know Nature's Swiftness, it is replaced by Ancestral Swiftness and causes Ancestral Swiftness to call an Ancestor to your side for $s2 sec ancient_fellowship = { 94862, 443423, 1 }, -- Ancestors have a $s1% chance to call another Ancestor for $s2 sec when they depart call_of_the_ancestors = { 94888, 443450, 1 }, -- Primordial Wave calls an Ancestor to your side for $s1 sec. Whenever you cast a healing or damaging spell, the Ancestor will cast a similar spell earthen_communion = { 94858, 443441, 1 }, -- Earth Shield has an additional $s1 charges and heals you for $s2% more elemental_reverb = { 94869, 443418, 1 }, -- Lava Burst gains an additional charge and deals $s1% increased damage final_calling = { 94875, 443446, 1 }, -- When an Ancestor departs, they cast Elemental Blast at a nearby enemy heed_my_call = { 94884, 443444, 1 }, -- Ancestors last an additional $s1 sec latent_wisdom = { 94862, 443449, 1 }, -- Your Ancestors' spells are $s1% more powerful maelstrom_supremacy = { 94883, 443447, 1 }, -- Increases the damage of Earth Shock, Elemental Blast, and Earthquake by $s1%. Increases the healing of Healing Surge and Chain Heal by $s2% natural_harmony = { 94858, 443442, 1 }, -- Reduces the cooldown of Nature's Guardian by $s1 sec and causes it to heal for an additional $s2% of your maximum health offering_from_beyond = { 94887, 443451, 1 }, -- When an Ancestor is called, they reduce the cooldown of Fire Elemental and Storm Elemental by $s1 sec primordial_capacity = { 94860, 443448, 1 }, -- Increases your maximum Maelstrom by $s1 routine_communication = { 94884, 443445, 1 }, -- Lightning Bolt, Lava Burst, Chain Lightning, Icefury, and Frost Shock casts have a $s1% chance to call an Ancestor to your side for $s2 sec spiritwalkers_momentum = { 94861, 443425, 1 }, -- Using spells with a cast time increases the duration of Spiritwalker's Grace and Spiritwalker's Aegis by $s1 sec, up to a maximum of $s2 sec -- Stormbringer arc_discharge = { 94885, 455096, 1 }, -- Tempest causes your next $s1 Chain Lightning or Lightning Bolt spells to be instant cast and deal $s2% increased damage. Can accumulate up to $s3 charges awakening_storms = { 94867, 455129, 1 }, -- Lightning Bolt and Chain Lightning have a chance to strike your target for $s$s2 Nature damage. Every $s3 times this occurs, your next Lightning Bolt is replaced by Tempest conductive_energy = { 94868, 455123, 1 }, -- Lightning Rod targets now also take $s1% of the damage that Tempest deals, and Tempest also applies Lightning Rod effect electroshock = { 94863, 454022, 1 }, -- Tempest increases your movement speed by $s1% for $s2 sec lightning_conduit = { 94863, 467778, 1 }, -- You have a chance to get struck by lightning, increasing your movement speed by $s1% for $s2 sec. The effectiveness is increased to $s3% in outdoor areas. You call down a Thunderstorm when you Reincarnate natures_protection = { 94880, 454027, 1 }, -- Lightning Shield reduces the damage you take by $s1% rolling_thunder = { 94889, 454026, 1 }, -- Gain one stack of Stormkeeper every $s1 sec storm_swell = { 94873, 455088, 1 }, -- Tempest grants $s1% Mastery for $s2 sec stormcaller = { 94893, 454021, 1 }, -- Increases the critical strike chance of your Nature damage spells by $s1% and the critical strike damage of your Nature spells by $s2% supercharge = { 94873, 455110, 1 }, -- Lightning Bolt, Tempest, and Chain Lightning have a $s1% chance to cause an additional Elemental Overload surging_currents = { 94880, 454372, 1 }, -- When you cast Tempest you gain Surging Currents, increasing the effectiveness of your next Chain Heal or Healing Surge by $s1%, up to $s2% tempest = { 94892, 454009, 1 }, -- Every $s1 Maelstrom spent replaces your next Lightning Bolt with Tempest unlimited_power = { 94886, 454391, 1 }, -- Spending Maelstrom grants you $s1% haste for $s2 sec. Multiple applications may overlap voltaic_surge = { 94870, 454919, 1 }, -- Earthquake and Chain Lightning damage increased by $s1% } ) -- PvP Talents spec:RegisterPvpTalents( { burrow = 5574, -- (409293) Burrow beneath the ground, becoming unattackable, removing movement impairing effects, and increasing your movement speed by $s2% for $s3 sec. When the effect ends, enemies within $s4 yards are knocked in the air and take $s$s5 Physical damage counterstrike_totem = 3490, -- (204331) Summons a totem at your feet for $s1 sec. Whenever enemies within $s2 yards of the totem deal direct damage, the totem will deal $s3% of the damage dealt back to attacker electrocute = 5659, -- (206642) When you successfully Purge a beneficial effect, the enemy suffers $s$s2 Nature damage over $s3 sec grounding_totem = 3620, -- (204336) Summons a totem at your feet that will redirect all harmful spells cast within $s1 yards on a nearby party or raid member to itself. Will not redirect area of effect spells. Lasts $s2 sec shamanism = 5660, -- (193876) Your Bloodlust spell now has a $s1 sec. cooldown, but increases Haste by $s2%, and only affects you and your friendly target when cast for $s3 sec. In addition, Bloodlust is no longer affected by Sated static_field_totem = 727, -- (355580) Summons a totem with $s1% of your health at the target location for $s2 sec that forms a circuit of electricity that enemies cannot pass through storm_conduit = 5681, -- (1217092) Casting Lightning Bolt or Chain Lightning reduces the cooldown of Astral Shift, Gust of Wind, Wind Shear, and Nature Totems by $s1 sec. Interrupt duration reduced by $s2% on Lightning Bolt and Chain Lightning casts totem_of_wrath = 3488, -- (460697) Primordial Wave summons a totem at your feet for $s1 sec that increases the critical effect of damage and healing spells of all nearby allies within $s2 yards by $s3% for $s4 sec unleash_shield = 3491, -- (356736) Unleash your Elemental Shield's energy on an enemy target: Lightning Shield: Knocks them away. Earth Shield: Roots them in place for $s5 sec. Water Shield: Summons a whirlpool for $s8 sec, reducing damage and healing by $s9% while they stand within it } ) spec:RegisterHook( "TALENTS_UPDATED", function() talent.earthquake = talent.earthquake_targeted.enabled and talent.earthquake_targeted or talent.earthquake_ground end ) -- Auras spec:RegisterAuras( { -- Talent: A percentage of damage or healing dealt is copied as healing to up to 3 nearby injured party or raid members. -- https://wowhead.com/beta/spell=108281 --[[ancestral_guidance = { id = 108281, duration = 10, tick_time = 0.5, max_stack = 1 },--]] -- Health increased by $s1%. If you die, the protection of the ancestors will allow you to return to life. -- https://wowhead.com/beta/spell=207498 ancestral_protection = { id = 207498, duration = 30, max_stack = 1 }, -- Your next healing or damaging spell is instant, costs no mana, and deals $s6% increased damage and healing. ancestral_swiftness = { id = 443454, duration = 3600, max_stack = 1, onRemove = function( t ) setCooldown( "ancestral_swiftness", action.ancestral_swiftness.cooldown ) end }, -- Your next $s3 Chain Lightning or Lightning Bolt spells are instant cast and will deal $s2% increased damage. arc_discharge = { id = 455097, duration = 15.0, max_stack = 2 }, -- Movement speed reduced by $w1%. arctic_snowstorm = { id = 462765, duration = 8.0, max_stack = 1 }, -- Talent: Transformed into a powerful Fire ascendant. Chain Lightning is transformed into Lava Beam. -- https://wowhead.com/beta/spell=114050 ascendance = { id = 1219480, duration = function() return 15 + 3 * talent.preeminence.rank end, max_stack = 1, copy = { 114051, 114052, 114050 } }, -- Talent: Damage taken reduced by $w1%. -- https://wowhead.com/beta/spell=108271 astral_shift = { id = 108271, duration = 12, max_stack = 1 }, -- Haste increased by $w1%. -- https://wowhead.com/beta/spell=2825 bloodlust = { id = 2825, duration = function() return pvptalent.shamanism.enabled and 10 or 40 end, max_stack = 1, shared = "player", copy = { 32182, 204361, "heroism" } }, call_of_the_ancestors = { id = 447244, duration = 6, max_stack = 1 }, -- When you deal damage, $w1% is dealt to your lowest health ally within $204331m2 yards. counterstrike_totem = { id = 208997, duration = 15.0, max_stack = 1 }, -- Chance to activate Windfury Weapon increased to ${$319773h}.1%. Damage dealt by Windfury Weapon increased by $s2%. -- https://wowhead.com/beta/spell=384352 doom_winds = { id = 384352, duration = 8, max_stack = 1 }, -- Talent: -- https://wowhead.com/beta/spell=198103 earth_elemental = { id = 198103, duration = function() return 60 * ( 1 + 0.2 * talent.everlasting_elements.rank ) end, type = "Magic", max_stack = 1 }, -- Talent: Heals for ${$w2*(1+$w1/100)} upon taking damage. -- https://wowhead.com/beta/spell=974 earth_shield = { id = function () return talent.elemental_orbit.enabled and 383648 or 974 end, duration = 600, type = "Magic", max_stack = function() return 9 + 3 * talent.earthen_communion.rank end, dot = "buff", friendly = true, shared = "player", copy = { 383648, 974 } }, -- Movement speed reduced by $s1%. -- https://wowhead.com/beta/spell=3600 earthbind = { id = 3600, duration = 5, mechanic = "snare", type = "Magic", max_stack = 1 }, -- Rooted. -- https://wowhead.com/beta/spell=64695 earthgrab = { id = 64695, duration = 8, mechanic = "root", type = "Magic", max_stack = 1 }, -- Heals $w1 every $t1 sec. -- https://wowhead.com/beta/spell=382024 earthliving_weapon = { id = 382024, duration = 12, max_stack = 1 }, echoes_of_great_sundering_eb = { id = 384088, duration = 25, max_stack = 1 }, echoes_of_great_sundering_es = { id = 336217, duration = 25, max_stack = 1 }, echoes_of_great_sundering = { alias = { "echoes_of_great_sundering_eb", "echoes_of_great_sundering_es" }, aliasType = "buff", aliasMode = "first", duration = 25 }, -- Your next damage or healing spell will be cast a second time ${$s2/1000}.1 sec later for free. -- https://wowhead.com/beta/spell=320125 echoing_shock = { id = 320125, duration = 8, type = "Magic", max_stack = 1 }, -- $w1 Nature damage every $t1 sec. electrocute = { id = 206647, duration = 3.0, tick_time = 1.0, pandemic = true, max_stack = 1 }, -- Movement speed increased by $w1%. electroshock = { id = 454025, duration = 5.0, max_stack = 1 }, elemental_blast = { alias = { "elemental_blast_critical_strike", "elemental_blast_haste", "elemental_blast_mastery" }, aliasMode = "first", -- use duration info from the first buff that's up, as they should all be equal. aliasType = "buff" }, electrified_shocks = { id = 382089, duration = 9, type = "Magic", max_stack = 1 }, elemental_blast_critical_strike = { id = 118522, duration = 10, type = "Magic", pandemic = true, max_stack = 1 }, elemental_blast_haste = { id = 173183, duration = 10, type = "Magic", pandemic = true, max_stack = 1 }, elemental_blast_mastery = { id = 173184, duration = 10, type = "Magic", pandemic = true, max_stack = 1 }, -- Talent: Damage dealt increased by $s1%. -- https://wowhead.com/beta/spell=378275 elemental_equilibrium = { id = 378275, duration = 10, max_stack = 1, copy = 347348 }, elemental_equilibrium_debuff = { id = 378277, duration = 30, max_stack = 1, copy = 347349 }, -- Fire, Frost, and Nature damage taken reduced by $w1%. elemental_resistance = { id = 462568, duration = 3.0, pandemic = true, max_stack = 1 }, enfeeblement = { id = 378080, duration = 6, max_stack = 1 }, -- Cannot move while using Far Sight. -- https://wowhead.com/beta/spell=6196 far_sight = { id = 6196, duration = 60, type = "Magic", max_stack = 1 }, -- Talent: $188592s2% -- https://wowhead.com/beta/spell=198067 fire_elemental = { id = 188592, duration = function() return 20 * ( 1 + 0.2 * talent.everlasting_elements.rank ) end, type = "Magic", max_stack = 1 }, fury_of_the_storms = { id = 191716, duration = function() return 10 * ( 1 + 0.2 * talent.everlasting_elements.rank ) end, type = "Magic", max_stack = 1, copy = "fury_of_storms", generate = function( t ) if action.stormkeeper.time_since < t.duration then t.applied = action.stormkeeper.time_since t.expires = action.stormkeeper.lastCast + t.duration t.stack = 1 t.caster = "player" return end t.applied = 0 t.expires = 0 t.stack = 0 t.caster = nil end }, lesser_fire_elemental = { id = 462992, duration = 15, max_stack = 1 }, -- Suffering $w2 Fire damage every $t2 sec. -- https://wowhead.com/beta/spell=188389 flame_shock = { id = 188389, duration = function() return ( 18 + 6 * talent.erupting_lava.rank ) * ( buff.fire_elemental.up and 2 or 1 ) * ( buff.lesser_fire_elemental.up and 2 or 1 ) end, tick_time = function() return 2 * haste * ( talent.flame_of_the_cauldron.enabled and 0.85 or 1 ) * ( buff.fire_elemental.up and 0.75 or 1 ) * ( buff.lesser_fire_elemental.up and 0.75 or 1 ) end, type = "Magic", max_stack = 1 }, -- Each of your weapon attacks causes up to ${$max(($*$AP),1)} additional Fire damage. -- https://wowhead.com/beta/spell=319778 flametongue_weapon = { id = 319778, duration = 3600, max_stack = 1 }, improved_flametongue_weapon = { id = 382028, duration = 3600, max_stack = 1 }, -- Talent: Your next Lava Burst will deal $s1% increased damage. -- https://wowhead.com/beta/spell=381777 flux_melting = { id = 381777, duration = 12, max_stack = 1 }, -- Talent: Movement speed reduced by $s2%. -- https://wowhead.com/beta/spell=196840 frost_shock = { id = 196840, duration = function() return 6 + 2 * talent.encasing_cold.rank end, type = "Magic", max_stack = 1 }, -- After casting a damaging Fire$?a462841[ and a Nature][] spell, you additionally cast an Elemental Blast at your target. fusion_of_elements_fire = { id = 462843, duration = 20.0, max_stack = 1 }, fusion_of_elements_nature = { id = 462841, duration = 20.0, max_stack = 1 }, -- Increases movement speed by $?s382215[${$382216s1+$w2}][$w2]%.$?$w3!=0[ Less hindered by effects that reduce movement speed.][] -- https://wowhead.com/beta/spell=2645 ghost_wolf = { id = 2645, duration = 3600, type = "Magic", max_stack = 1 }, -- Your next Frost Shock will deal $s1% additional damage, and hit up to ${$334195s1/$s2} additional $Ltarget:targets;. -- https://wowhead.com/beta/spell=334196 hailstorm = { id = 334196, duration = 20, max_stack = 5 }, -- Your Healing Rain is currently active. $?$w1!=0[Magic damage taken reduced by $w1%.][] -- https://wowhead.com/beta/spell=73920 healing_rain = { id = 73920, duration = 10, max_stack = 1 }, -- Healing $?s147074[two injured party or raid members][an injured party or raid member] every $t1 sec. -- https://wowhead.com/beta/spell=5672 healing_stream = { id = 5672, duration = 15, tick_time = 2, type = "Magic", max_stack = 1 }, -- Talent: Incapacitated. -- https://wowhead.com/beta/spell=51514 hex = { id = 51514, duration = 60, mechanic = "polymorph", type = "Magic", max_stack = 1 }, -- Movement speed reduced by $s2%. -- https://wowhead.com/beta/spell=342240 ice_strike = { id = 342240, duration = 6, max_stack = 1 }, icefury = { id = 462818, duration = 30, max_stack = 1 }, -- Talent: Frost Shock damage increased by $w2%. -- https://wowhead.com/beta/spell=210714 icefury_dmg = { id = 210714, duration = 25, type = "Magic", max_stack = 4, copy = "icefury_dmg" }, -- Fire damage inflicted every $t2 sec. -- https://wowhead.com/beta/spell=118297 immolate = { id = 118297, duration = 21, type = "Magic", max_stack = 1 }, -- Talent: Your next Lava Burst casts instantly. -- https://wowhead.com/beta/spell=77762 lava_surge = { id = 77762, duration = 10, max_stack = 1 }, lightning_conduit = { id = 468226, duration = 5, max_stack = 1 }, -- Talent: Stunned. Suffering $w1 Nature damage every $t1 sec. -- https://wowhead.com/beta/spell=305485 lightning_lasso = { id = 305485, duration = 5, tick_time = 1, mechanic = "stun", type = "Magic", max_stack = 1 }, lightning_rod = { id = 197209, duration = function() return talent.charged_conduit.enabled and 12 or 8 end, max_stack = 1 }, -- Chance to deal $192109s1 Nature damage when you take melee damage$?a137041[ and have a $s3% chance to generate a stack of Maelstrom Weapon]?a137040[ and have a $s4% chance to generate $s5 Maelstrom][]. -- https://wowhead.com/beta/spell=192106 lightning_shield = { id = 192106, duration = 1800, max_stack = 1 }, maelstrom_surge = { -- TWW Tier 1 4pc id = 457727, duration = 5, max_stack = 1 }, -- Talent: Flame Shock damage increases the damage of your next Earth Shock, Elemental Blast, or Earthquake by 0.8%, stacking up to 20 times. -- https://www.wowhead.com/beta/spell=381933 magma_chamber = { id = 381933, duration = 20, type = "magic", max_stack = 20 }, -- Talent: Your next Nature, Physical, or Frost spell will deal $s1% increased damage or healing. -- https://wowhead.com/beta/spell=260734 master_of_the_elements = { id = 260734, duration = 15, type = "Magic", max_stack = 1 }, -- Talent: Your next healing or damaging Nature spell is instant cast and costs no mana. -- https://wowhead.com/beta/spell=378081 natures_swiftness = { id = 378081, duration = 3600, type = "Magic", max_stack = 1, onRemove = function( t ) setCooldown( "natures_swiftness", action.natures_swiftness.cooldown ) end }, -- Heals $w1 damage every $t1 seconds. -- https://wowhead.com/beta/spell=280205 pack_spirit = { id = 280205, duration = 3600, max_stack = 1 }, -- Cleansing $383015s1 poison effect from a nearby party or raid member every $t1 sec. -- https://wowhead.com/beta/spell=383014 poison_cleansing = { id = 383014, duration = 6, tick_time = 1.5, type = "Magic", max_stack = 1 }, -- Lightning Bolt$?a454009[, Tempest,][] and Chain Lightning will trigger Elemental Overload an additional time. -- https://wowhead.com/beta/spell=191877 power_of_the_maelstrom = { id = 191877, duration = 20, max_stack = 2 }, -- Heals $w2 every $t2 seconds. -- https://wowhead.com/beta/spell=61295 riptide = { id = 61295, duration = 18, type = "Magic", max_stack = 1 }, spirit_wolf = { id = 260881, duration = 3600, max_stack = 4 }, -- Talent: Increases movement speed by $s1%. -- https://wowhead.com/beta/spell=58875 spirit_walk = { id = 58875, duration = 8, max_stack = 1 }, -- Talent: Immune to Silence/Interrupt. -- https://wowhead.com/beta/spell=378078 spiritwalkers_aegis = { id = 378078, duration = 5, max_stack = 1 }, -- Talent: Able to move while casting all Shaman spells. -- https://wowhead.com/beta/spell=79206 spiritwalkers_grace = { id = 79206, duration = 15, type = "Magic", max_stack = 1 }, -- Talent splintered_elements = { id = 382043, duration = 12, max_stack = 10, copy = { 382042, 354648 } -- Old spell ID, just in case. }, -- Talent: Stunned. -- https://wowhead.com/beta/spell=118905 static_charge = { id = 118905, duration = 3, mechanic = "stun", type = "Magic", max_stack = 1 }, stoneskin = { id = 383018, duration = 15, max_stack = 1 }, -- Talent: -- https://wowhead.com/beta/spell=192249 storm_elemental = { id = 192249, duration = function() return 30 * ( 1 + 0.2 * talent.everlasting_elements.rank ) end, type = "Magic", max_stack = 1 }, lesser_storm_elemental = { id = 192249, duration = function() return 15 * ( 1 + 0.2 * talent.everlasting_elements.rank ) end, type = "Magic", max_stack = 1 }, storm_frenzy = { id = 462725, duration = 12, max_stack = 2 }, -- Mastery increased by $w1%. storm_swell = { id = 455089, duration = 6.0, max_stack = 1 }, -- Stormstrike cooldown has been reset$?$?a319930[ and will deal $319930w1% additional damage as Nature][]. -- https://wowhead.com/beta/spell=201846 stormbringer = { id = 201846, duration = 12, max_stack = 1 }, -- Talent: Your next Chain Lightning will deal $s2% increased damage and be instant cast. -- https://wowhead.com/beta/spell=320137 stormkeeper = { -- Elemental: 191634 -- Enhancement: 320137 -- Restoration: 383009 id = 191634, duration = 15, type = "Magic", max_stack = 2, copy = { 320137, 383009 } }, -- Incapacitated. -- https://wowhead.com/beta/spell=197214 sundering = { id = 197214, duration = 2, max_stack = 1 }, -- Talent: Your next spell cast will be enhanced. -- https://wowhead.com/beta/spell=285514 surge_of_power = { id = 285514, duration = 15, max_stack = 1 }, surge_of_power_debuff = { id = 285515, duration = 6, max_stack = 1, }, -- Your next Chain Heal or Healing Surge has $w1% increased effectiveness. surging_currents = { id = 454376, duration = 30.0, max_stack = 1 }, -- Talent: Your next Healing Surge$?s137039[, Healing Wave, or Riptide][] will be $w1% more effective. -- https://wowhead.com/beta/spell=378102 swirling_currents = { id = 378102, duration = 15, type = "Magic", max_stack = 3, copy = 338340 }, tempest = { id = 454015, duration = 30, max_stack = 1 }, -- Talent: Movement speed increased by $378075s1%. -- https://wowhead.com/beta/spell=378076 thunderous_paws = { id = 378076, duration = 3, max_stack = 1 }, thunderstrike_ward = { id = 462760, duration = 3600, max_stack = 1 }, -- Talent: Movement speed reduced by $s3%. -- https://wowhead.com/beta/spell=51490 thunderstorm = { id = 51490, duration = 5, type = "Magic", max_stack = 1 }, water_walking = { id = 546, duration = 600, max_stack = 1 }, wind_rush = { id = 192082, duration = 5, max_stack = 1 }, -- Haste increased by $w1%. wind_gust = { id = 263806, duration = 20, max_stack = 4 }, -- Talent: Lava Burst damage increased by $s1%. -- https://wowhead.com/beta/spell=378269 windspeakers_lava_resurgence = { id = 378269, duration = 15, max_stack = 1, copy = 336065 }, -- Pet aura. call_lightning = { duration = 20, generate = function( t, db ) if storm_elemental.up then local name, _, count, _, duration, expires = FindUnitBuffByID( "pet", 157348 ) if name then t.count = count t.expires = expires t.applied = expires - duration t.caster = "pet" return end end t.count = 0 t.expires = 0 t.applied = 0 t.caster = "nobody" end, }, -- Conduit vital_accretion = { id = 337984, duration = 60, max_stack = 1 }, } ) spec:RegisterTotems( { greater_storm_elemental = { id = 1020304 }, greater_fire_elemental = { id = 135790 }, greater_earth_elemental = { id = 136024 }, liquid_magma_totem = { id = 971079 }, tremor_totem = { id = 136108 }, wind_rush_totem = { id = 538576 }, vesper_totem = { id = 3565451 }, } ) -- Pets spec:RegisterPets({ primal_storm_elemental = { id = 77942, spell = "storm_elemental", duration = function() if not talent.primal_elementalist.enabled then return 0 end return 30 * ( 1 + ( 0.01 * conduit.call_of_flame.mod ) ) end }, primal_fire_elemental = { id = 61029, spell = "fire_elemental", duration = function() if not talent.primal_elementalist.enabled then return 0 end return 30 * ( 1 + ( 0.01 * conduit.call_of_flame.mod ) ) end }, primal_earth_elemental = { id = 61056, spell = "earth_elemental", duration = function() if not talent.primal_elementalist.enabled then return 0 end return 60 end }, risen_skulker = { id = 99541, spell = "raise_dead", duration = function() return talent.raise_dead_2.enabled and 3600 or 60 end, }, }) local elementals = { [77942] = { "primal_storm_elemental", function() return 30 * ( 1 + ( 0.01 * state.conduit.call_of_flame.mod ) ) end, true }, [61029] = { "primal_fire_elemental", function() return 30 * ( 1 + ( 0.01 * state.conduit.call_of_flame.mod ) ) end, true }, [61056] = { "primal_earth_elemental", function () return 60 end, false } } local death_events = { UNIT_DIED = true, UNIT_DESTROYED = true, UNIT_DISSIPATES = true, PARTY_KILL = true, SPELL_INSTAKILL = true, } local summon = {} local wipe = table.wipe local vesper_heal = 0 local vesper_damage = 0 local vesper_used = 0 local vesper_expires = 0 local vesper_guid local vesper_last_proc = 0 local recall_totems = { capacitor_totem = 1, earthbind_totem = 1, earthgrab_totem = 1, grounding_totem = 1, healing_stream_totem = 1, liquid_magma_totem = 1, poison_cleansing_totem = 1, stoneskin_totem = 1, tranquil_air_totem = 1, tremor_totem = 1, wind_rush_totem = 1, } local ancestral_wolf_affinity_spells = { cleanse_spirit = 1, wind_shear = 1, purge = 1, -- TODO: List totems? } local recallTotem1 local recallTotem2 local fireDamage, frostDamage, natureDamage, lastEEApplied = 0, 0, 0, 0 local stormkeeperCastStart, stormkeeperLastProc = 0, 0 local eeSchools = { "fire", "frost", "nature", "volcanic", "elemental" } spec:RegisterStateExpr( "recall_totem_1", function() return recallTotem1 end ) spec:RegisterStateExpr( "recall_totem_2", function() return recallTotem2 end ) spec:RegisterStateExpr( "lightning_rod", function() end ) spec:RegisterHook( "runHandler", function( action ) if buff.ghost_wolf.up then if talent.ancestral_wolf_affinity.enabled then local ability = class.abilities[ action ] if not ancestral_wolf_affinity_spells[ action ] and not ability.gcd == "totem" then removeBuff( "ghost_wolf" ) end else removeBuff( "ghost_wolf" ) end end if talent.totemic_recall.enabled and recall_totems[ action ] then recall_totem_2 = recall_totem_1 recall_totem_1 = action end if talent.elemental_equilibrium.enabled and elemental_equilibrium.ready then local ability = class.abilities[ action ] if ability and ability.startsCombat and eeSchools[ ability.school ] then elemental_equilibrium.register_damage( ability.school ) end end end ) local further_beyond_duration_remains, fbSpells = 0, { earth_shock = 1, earthquake = 1, elemental_blast = 1, ascendance = 1 } spec:RegisterStateExpr( "fb_extension_remaining", function() return further_beyond_duration_remains end ) local filter_lvb = 0 local resetFilter = function() filter_lvb = 0 end spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName, school ) -- Deaths/despawns. if death_events[ subtype ] then if destGUID == summon.guid then wipe( summon ) elseif destGUID == vesper_guid then vesper_guid = nil end return end if sourceGUID == state.GUID then -- Summons. if subtype == "SPELL_SUMMON" then local npcid = destGUID:match("(%d+)-%x-$") npcid = npcid and tonumber( npcid ) or -1 local elem = elementals[ npcid ] if elem then summon.guid = destGUID summon.type = elem[1] summon.duration = elem[2]() summon.expires = GetTime() + summon.duration summon.extends = elem[3] end if spellID == 324386 then vesper_guid = destGUID vesper_expires = GetTime() + 30 vesper_heal = 3 vesper_damage = 3 vesper_used = 0 end elseif spellID == 191634 then -- Stormkeeper. if subtype == "SPELL_CAST_START" then stormkeeperCastStart = GetTime() elseif subtype == "SPELL_CAST_SUCCESS" or subtype == "SPELL_CAST_FAILED" then stormkeeperCastStart = 0 elseif subtype == "SPELL_AURA_APPLIED" and stormkeeperCastStart == 0 then stormkeeperLastProc = GetTime() end -- Vesper Totem heal elseif spellID == 324522 then local now = GetTime() if vesper_last_proc + 0.75 < now then vesper_last_proc = now vesper_used = vesper_used + 1 vesper_heal = vesper_heal - 1 end -- Vesper Totem damage; only fires on SPELL_DAMAGE... elseif spellID == 324520 then local now = GetTime() if vesper_last_proc + 0.75 < now then vesper_last_proc = now vesper_used = vesper_used + 1 vesper_damage = vesper_damage - 1 end end if spellID == spec.auras.ascendance.id and ( subtype == "SPELL_AURA_APPLIED" or subtype == "SPELL_AURA_REFRESH" ) then filter_lvb = GetTime() C_Timer.After( 2, resetFilter ) end if state.talent.elemental_equilibrium.enabled then if ( subtype == "SPELL_DAMAGE" or subtype == "SPELL_PERIODIC_DAMAGE" ) then if bit.band( school, 4 ) > 0 then fireDamage = GetTime() end if bit.band( school, 16 ) > 0 then frostDamage = GetTime() end if bit.band( school, 8 ) > 0 then natureDamage = GetTime() end elseif subtype == "SPELL_AURA_APPLIED" and ( spellID == 378275 or spellID == 347348 ) then lastEEApplied = GetTime() end end end end ) spec:RegisterStateExpr( "vesper_totem_heal_charges", function() return vesper_heal end ) spec:RegisterStateExpr( "vesper_totem_dmg_charges", function () return vesper_damage end ) spec:RegisterStateExpr( "vesper_totem_used_charges", function () return vesper_used end ) spec:RegisterStateFunction( "trigger_vesper_heal", function () if vesper_totem_heal_charges > 0 then vesper_totem_heal_charges = vesper_totem_heal_charges - 1 vesper_totem_used_charges = vesper_totem_used_charges + 1 end end ) spec:RegisterStateFunction( "trigger_vesper_damage", function () if vesper_totem_dmg_charges > 0 then vesper_totem_dmg_charges = vesper_totem_dmg_charges - 1 vesper_totem_used_charges = vesper_totem_used_charges + 1 end end ) spec:RegisterStateTable( "rolling_thunder", setmetatable( {}, { __index = setfenv( function( t, k ) if not talent.rolling_thunder.enabled and set_bonus.tier30_2pc == 0 then return 0 end if k == "next_tick" then return max( 0, t.last_tick + 50 - query_time ) elseif k == "last_tick" then return 0 end end, state ) } ) ) spec:RegisterStateExpr( "t30_2pc_timer", function() return rolling_thunder end ) spec:RegisterStateExpr( "lightning_rod", function() return active_dot.lightning_rod end ) spec:RegisterStateTable( "fire_elemental", setmetatable( { onReset = function( self ) self.cast_time = nil end }, { __index = function( t, k ) if k == "cast_time" then t.cast_time = class.abilities.fire_elemental.lastCast or 0 return t.cast_time end local elem = talent.primal_elementalist.enabled and pet.primal_fire_elemental or pet.greater_fire_elemental if k == "active" or k == "up" then return elem.up elseif k == "down" then return not elem.up elseif k == "remains" then return max( 0, elem.remains ) end return false end } ) ) spec:RegisterStateTable( "storm_elemental", setmetatable( { onReset = function( self ) self.cast_time = nil end }, { __index = function( t, k ) if k == "cast_time" then t.cast_time = class.abilities.storm_elemental.lastCast or 0 return t.cast_time end local elem = talent.primal_elementalist.enabled and pet.primal_storm_elemental or pet.greater_storm_elemental if k == "active" or k == "up" then return elem.up elseif k == "down" then return not elem.up elseif k == "remains" then return max( 0, elem.remains ) end return false end } ) ) spec:RegisterStateTable( "earth_elemental", setmetatable( { onReset = function( self ) self.cast_time = nil end }, { __index = function( t, k ) if k == "cast_time" then t.cast_time = class.abilities.earth_elemental.lastCast or 0 return t.cast_time end local elem = talent.primal_elementalist.enabled and pet.primal_earth_elemental or pet.greater_earth_elemental if k == "active" or k == "up" then return elem.up elseif k == "down" then return not elem.up elseif k == "remains" then return max( 0, elem.remains ) end return false end } ) ) spec:RegisterStateTable( "elemental_equilibrium", setmetatable( { last_application = 0, last_fire = 0, last_frost = 0, last_nature = 0, refresh_timers = setfenv( function() -- reset_precast function to sync with gamestate elemental_equilibrium.last_fire = fireDamage elemental_equilibrium.last_frost = frostDamage elemental_equilibrium.last_nature = natureDamage elemental_equilibrium.last_application = lastEEApplied if elemental_equilibrium.cooldown then applyDebuff( "player", "elemental_equilibrium_debuff", elemental_equilibrium.time_to_ready ) else removeDebuff( "player", "elemental_equilibrium_debuff" ) end end, state ), register_damage = setfenv( function( school ) elemental_equilibrium.last_fire = ( school == "fire" or school == "volcanic" or school == "elemental" ) and query_time or elemental_equilibrium.last_fire elemental_equilibrium.last_frost = ( school == "frost" or school == "elemental" ) and query_time or elemental_equilibrium.last_frost elemental_equilibrium.last_nature = ( school == "nature" or school == "volcanic" or school == "elemental" ) and query_time or elemental_equilibrium.last_nature if max( elemental_equilibrium.last_fire, elemental_equilibrium.last_frost, elemental_equilibrium.last_nature ) - min( elemental_equilibrium.last_fire, elemental_equilibrium.last_frost, elemental_equilibrium.last_nature ) < 10 then applyBuff( "elemental_equilibrium" ) applyDebuff( "player", "elemental_equilibrium_debuff" ) end end, state ), }, { __index = function( t, k ) local ee_remains = buff.elemental_equilibrium.remains local cd_remains = max( 0, elemental_equilibrium.last_application + 30 - state.query_time ) if k == "ready" then return cd_remains == 0 elseif k == "active" then return ee_remains > 0 elseif k == "active_remains" then return ee_remains elseif k == "cooldown" then return cd_remains > 0 elseif k == "cooldown_remains" then return cd_remains elseif k == "needs_frost" then return cd_remains == 0 and ( query_time - elemental_equilibrium.last_frost > 10 ) elseif k == "needs_fire" then return cd_remains == 0 and ( query_time - elemental_equilibrium.last_fire > 10 ) elseif k == "needs_nature" then return cd_remains == 0 and ( query_time - elemental_equilibrium.last_nature > 10 ) elseif k == "cycle_started" then return cd_remains == 0 and min( query_time - elemental_equilibrium.last_nature, query_time - elemental_equilibrium.last_fire, query_time - elemental_equilibrium.last_frost ) < 10 end end } ) ) spec:RegisterGear({ -- The War Within tww3 = { items = { 237640, 237536, 237637, 237636, 237638 }, auras = { -- Stormbringer -- Elemental storms_eye = { id = 1239315, duration = 30, max_stack = 2 }, -- Farseer both specs ancestral_wisdom = { id = 1238279, duration = 8, max_stack = 1 }, } }, tww2 = { items = { 229260, 229261, 229262, 229263, 229265 }, auras = { -- https://www.wowhead.com/spell=1218612 jackpot = { id = 1218612, duration = 8, max_stack = 1 } } }, tww1 = { items = { 212014, 212012, 212011, 212010, 212009 }, auras = { maelstrom_surge = { id = 457727, duration = 5, max_stack = 1 } } }, -- Dragonflight tier31 = { items = { 207207, 207208, 207209, 207210, 207212, 217238, 217240, 217236, 217237, 217239 }, auras = { molten_slag = { id = 426577, duration = 4, max_stack = 1 }, molten_charge = { id = 426578, duration = 20, max_stack = 1 } } }, tier30 = { items = { 202473, 202471, 202470, 202469, 202468 }, auras = { primal_fracture = { id = 410018, duration = 8, max_stack = 1, copy = "t30_4pc_ele" } } }, tier29 = { items = { 200396, 200398, 200400, 200401, 200399 }, auras = { seismic_accumulation = { id = 394651, duration = 15, max_stack = 5 }, elemental_mastery = { id = 394670, duration = 5, max_stack = 1 } } }, }) local TriggerHeatWave = setfenv( function() applyBuff( "lava_surge" ) end, state ) local TriggerStaticAccumulation = setfenv( function() addStack( "maelstrom_weapon", nil, talent.static_accumulation.rank ) end, state ) local TriggerStormkeeperRT = setfenv( function() addStack( "stormkeeper" ) rolling_thunder.last_tick = query_time end, state ) spec:RegisterHook( "reset_precast", function () local mh, _, _, mh_enchant, oh, _, _, oh_enchant = GetWeaponEnchantInfo() if mh and mh_enchant == 5400 then applyBuff( "flametongue_weapon" ) end if oh and oh_enchant == 7587 then applyBuff( "thunderstrike_ward" ) end if buff.flametongue_weapon.down and ( now - action.flametongue_weapon.lastCast < 1 ) then applyBuff( "flametongue_weapon" ) end if talent.thunderstrike_ward.enabled and buff.thunderstrike_ward.down and ( now - action.thunderstrike_ward.lastCast < 1 ) then applyBuff( "thunderstrike_ward" ) end if talent.master_of_the_elements.enabled and action.lava_burst.in_flight and buff.master_of_the_elements.down then applyBuff( "master_of_the_elements" ) end if vesper_expires > 0 and now > vesper_expires then vesper_expires = 0 vesper_heal = 0 vesper_damage = 0 vesper_used = 0 end vesper_totem_heal_charges = nil vesper_totem_dmg_charges = nil vesper_totem_used_charges = nil recall_totem_1 = nil recall_totem_2 = nil if totem.vesper_totem.up then applyBuff( "vesper_totem", totem.vesper_totem.remains ) end rawset( state.pet, "earth_elemental", talent.primal_elementalist.enabled and state.pet.primal_earth_elemental or state.pet.greater_earth_elemental ) rawset( state.pet, "fire_elemental", talent.primal_elementalist.enabled and state.pet.primal_fire_elemental or state.pet.greater_fire_elemental ) rawset( state.pet, "storm_elemental", talent.primal_elementalist.enabled and state.pet.primal_storm_elemental or state.pet.greater_storm_elemental ) if talent.primal_elementalist.enabled then dismissPet( "primal_fire_elemental" ) dismissPet( "primal_storm_elemental" ) dismissPet( "primal_earth_elemental" ) if summon.expires then if summon.expires <= now then wipe( summon ) else summonPet( summon.type, summon.expires - now ) end end end if talent.primordial_surge.enabled and query_time - action.primordial_wave.lastCast < 12 then local expires = action.primordial_wave.lastCast + 12 while expires > query_time do state:QueueAuraEvent( "primordial_surge", TriggerHeatWave, expires, "AURA_PERIODIC" ) expires = expires - 3 end end if talent.rolling_thunder.enabled or set_bonus.tier30_2pc > 0 then rolling_thunder.last_tick = stormkeeperLastProc if rolling_thunder.next_tick > 0 then state:QueueAuraEvent( "stormkeeper", TriggerStormkeeperRT, query_time + rolling_thunder.next_tick, "AURA_PERIODIC" ) end end if buff.ascendance.down or not talent.further_beyond.enabled then fb_extension_remaining = 0 end if talent.elemental_equilibrium.enabled then elemental_equilibrium.refresh_timers() end --[[ TODO: Not really needed; shift to Enhancement module. if talent.static_accumulation.enabled and buff.ascendance.up then local expires = buff.ascendance.expires while expires > query_time do state:QueueAuraEvent( "ascendance", TriggerStaticAccumulation, query_time + expires ) expires = expires - 1 end end ]] end ) spec:RegisterHook( "spend", function( amt, resource ) if amt > 0 and resource == "maelstrom" and set_bonus.tww1_4pc > 0 then applyBuff( "maelstrom_surge" ) end end ) spec:RegisterHook( "filter_target", function( id, time, mine, spellID ) if filter_lvb > 0 then id = nil end return id, time, mine, spellID end ) local fol_spells = {} spec:RegisterStateFunction( "flash_of_lightning", function() if #fol_spells == 0 then for k, v in pairs( class.abilityList ) do if v.school == "nature" then table.insert( fol_spells, k ) end end end for _, spell in ipairs( fol_spells ) do reduceCooldown( spell, 1 ) end end ) -- Abilities spec:RegisterAbilities( { -- Talent: For the next $d, $s1% of your damage and healing is converted to healing on up to 3 nearby injured party or raid members. --[[ancestral_guidance = { id = 108281, cast = 0, cooldown = 120, gcd = "off", school = "nature", talent = "ancestral_guidance", startsCombat = false, toggle = "defensives", handler = function () applyBuff( "ancestral_guidance" ) end, },--]] ancestral_swiftness = { id = 443454, cast = 0, cooldown = 30, gcd = "off", school = "nature", talent = "ancestral_swiftness", startsCombat = false, toggle = "cooldowns", nobuff = "ancestral_swiftness", handler = function () if talent.natures_swiftness.enabled then -- Summon an ancestor. end applyBuff( "ancestral_swiftness" ) end, }, -- Transform into a Flame Ascendant for $d, instantly casting a Flame Shock and a $s10% effectiveness Lava Burst at up to $s7 nearby enemies.; While ascended, Elemental Overload damage is increased by $s8% and spells affected by your Mastery: Elemental Overload cause $s9 additional Elemental $LOverload:Overloads;. ascendance = { id = 114050, cast = 0, cooldown = function () return 180 - 60 * talent.first_ascendant.rank end, gcd = "spell", school = function() if spec.elemental then return "fire" end return "nature" end, talent = "ascendance", startsCombat = function() if state.spec.elemental and active_dot.flame_shock > 0 then return true end return false end, toggle = "cooldowns", handler = function () applyBuff( "ascendance" ) spec.abilities.flame_shock.handler() spec.abilities.lava_burst.handler() active_dot.flame_shock = min( true_active_enemies, active_dot.flame_shock + 6 ) if set_bonus.tww3_stormbringer >= 2 then addStack( "tempest" ) if set_bonus.tww3 >= 4 then applyBuff( "storms_eye", nil, 2 ) end elseif set_bonus.tww2 >= 2 then summonPet( talent.primal_elementalist.enabled and "primal_storm_elemental" or "greater_storm_elemental", 6 ) end end, }, astral_recall = { id = 556, cast = 10, cooldown = 600, gcd = "spell", startsCombat = false, texture = 136010, handler = function () end, }, astral_shift = { id = 108271, cast = 0, cooldown = function () return talent.planes_traveler.enabled and 90 or 120 end, gcd = "off", school = "nature", talent = "astral_shift", startsCombat = false, nopvptalent = "ethereal_form", toggle = "defensives", handler = function () applyBuff( "astral_shift" ) end, }, -- Increases haste by $s1% for all party and raid members for $d. Allies receiving this effect will become Sated and unable to benefit from Bloodlust or Time Warp again for $57724d. bloodlust = { id = function() return state.faction == "Alliance" and 32182 or 2825 end, cast = 0, cooldown = 300, gcd = "off", school = "nature", spend = 0.02, spendType = "mana", startsCombat = false, toggle = "cooldowns", nodebuff = "sated", handler = function () applyBuff( "bloodlust" ) applyDebuff( "player", "sated" ) stat.haste = state.haste + 0.4 end, copy = { 2825, "heroism" } }, -- PvP Talent: Burrow beneath the ground, becoming unattackable, removing movement impairing effects, and increasing your movement speed by ${$s3-100}% for $d.; When the effect ends, enemies within $409304A1 yards are knocked in the air and take $ Physical damage. burrow = { id = 409293, cast = 0, cooldown = 120, gcd = "spell", startsCombat = false, pvptalent = "burrow", handler = function() applyBuff( "burrow" ) setCooldown( "global_cooldown", 5 ) end, auras = { burrow = { id = 409293, duration = 5, max_stack = 1 } } }, -- Talent: Summons a totem at the target location that gathers electrical energy from the surrounding air and explodes after $s2 sec, stunning all enemies within $118905A1 yards for $118905d. capacitor_totem = { id = 192058, cast = 0, cooldown = function () return 60 - 3 * talent.totemic_surge.rank + conduit.totemic_surge.mod * 0.001 end, gcd = "totem", school = "nature", spend = 0.1, spendType = "mana", talent = "capacitor_totem", startsCombat = false, toggle = "interrupts", handler = function () summonTotem( "capacitor_totem" ) end, }, -- Talent: Heals the friendly target for $s1, then jumps to heal the $ most injured nearby allies. Healing is reduced by $s2% with each jump. chain_heal = { id = 1064, cast = function () if buff.chains_of_devastation_ch.up then return 0 end if buff.ancestral_swiftness.up then return 0 end if buff.natures_swiftness.up then return 0 end return 2.5 * ( 1 - 0.2 * min( 5, buff.maelstrom_weapon.stack ) ) end, cooldown = 0, gcd = "spell", school = "nature", spend = function () return ( buff.ancestral_swiftness.up or buff.natures_swiftness.up ) and 0 or 0.15 end, spendType = "mana", talent = "chain_heal", startsCombat = false, handler = function () if buff.surging_currents.up then removeBuff( "surging_currents" ) end removeBuff( "chains_of_devastation_ch" ) if buff.ancestral_swiftness.up then removeBuff( "ancestral_swiftness" ) end if buff.natures_swiftness.up then removeBuff( "natures_swiftness" ) end -- TODO: Determine order of instant cast effect consumption. removeBuff( "echoing_shock" ) if legendary.chains_of_devastation.enabled then applyBuff( "chains_of_devastation_cl" ) end if buff.vesper_totem.up and vesper_totem_heal_charges > 0 then trigger_vesper_heal() end end, }, -- Talent: Hurls a lightning bolt at the enemy, dealing $s1 Nature damage and then jumping to additional nearby enemies. Affects $x1 total targets.$?s187874[ If Chain Lightning hits more than 1 target, each target hit by your Chain Lightning increases the damage of your next Crash Lightning by $333964s1%.][]$?s187874[ Each target hit by Chain Lightning reduces the cooldown of Crash Lightning by ${$s3/1000}.1 sec.][]$?a343725[ |cFFFFFFFFGenerates $343725s5 Maelstrom per target hit.|r][] chain_lightning = { id = 188443, cast = function () if buff.chains_of_devastation_cl.up then return 0 end if buff.ancestral_swiftness.up then return 0 end if buff.natures_swiftness.up then return 0 end if buff.stormkeeper.up then return 0 end return ( talent.unrelenting_calamity.enabled and 1.75 or 2 ) * ( 1 - 0.2 * min( 5, buff.maelstrom_weapon.stack ) ) * ( buff.storm_frenzy.up and 0.6 or 1 ) end, cooldown = 0, gcd = "spell", school = "nature", spend = function () return ( buff.ancestral_swiftness.up or buff.natures_swiftness.up ) and 0 or 0.01 end, spendType = "mana", talent = "chain_lightning", startsCombat = true, handler = function () removeBuff( "chains_of_devastation_cl" ) if buff.ancestral_swiftness.up then removeBuff( "ancestral_swiftness" ) end if buff.natures_swiftness.up then removeBuff( "natures_swiftness" ) end removeBuff( "master_of_the_elements" ) removeBuff( "echoing_shock" ) removeStack( "storm_frenzy" ) if buff.fusion_of_elements_nature.up then removeBuff( "fusion_of_elements_nature" ) class.abilities.elemental_blast.handler() end if legendary.chains_of_devastation.enabled then applyBuff( "chains_of_devastation_ch" ) end -- 2 MS per target, direct. -- 1 MS per target, overload. -- stormkeeper guarantees overload on every target hit -- power of the maelstrom guarantees 1 extra overload on the initial target -- surge of power adds 1 extra target to total potential enemies hit local amount = ( buff.stormkeeper.up and 3 or 2 ) * min( ( level > 42 and 5 or 3 ) + ( buff.surge_of_power.up and 1 or 0 ), true_active_enemies ) + ( buff.power_of_the_maelstrom.up and 1 or 0 ) gain( amount, "maelstrom" ) if buff.stormkeeper.up then removeStack( "stormkeeper" ) if set_bonus.tier30_4pc > 0 then applyBuff( "primal_fracture" ) end end removeStack( "power_of_the_maelstrom" ) removeBuff( "surge_of_power" ) if pet.storm_elemental.up or buff.lesser_storm_elemental.up then addStack( "wind_gust" ) end if talent.flash_of_lightning.enabled then flash_of_lightning() end if set_bonus.tier29_2pc > 0 then addStack( "seismic_accumulation" ) end if talent.conductive_energy.enabled then if debuff.lightning_rod.down then applyDebuff( "target", "lightning_rod" ) else active_dot.lightning_rod = min( active_enemies, active_dot.lightning_rod + 1 ) end end if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end end, }, -- Talent: Removes all Curse effects from a friendly target. cleanse_spirit = { id = 51886, cast = 0, cooldown = 8, gcd = "spell", school = "nature", spend = 0.10, spendType = "mana", talent = "cleanse_spirit", startsCombat = false, toggle = "interrupts", buff = "dispellable_curse", handler = function () removeBuff( "dispellable_curse" ) if state.spec.elemental and time > 0 and talent.inundate.enabled then gain( 8, "maelstrom" ) end end, }, -- Summons a totem at your feet for $d.; Whenever enemies within $ yards of the totem deal direct damage, the totem will deal $208997s1% of the damage dealt back to attacker. counterstrike_totem = { id = 204331, cast = 0, cooldown = 45, gcd = "totem", school = "fire", spend = 0.03, spendType = "mana", pvptalent = "counterstrike_totem", startsCombat = false, texture = 511726, handler = function () summonTotem( "counterstrike_totem" ) end, }, -- Talent: Calls forth a Greater Earth Elemental to protect you and your allies for $188616d. While this elemental is active, your maximum health is increased by $381755s1%. earth_elemental = { id = 198103, cast = 0, cooldown = function () return 300 * ( buff.deadened_earth.up and 0.6 or 1 ) end, gcd = "spell", school = "nature", talent = "earth_elemental", startsCombat = false, toggle = "defensives", handler = function () summonPet( talent.primal_elementalist.enabled and "primal_earth_elemental" or "greater_earth_elemental", 60 * ( 1 + 0.2 * talent.everlasting_elements.rank ) ) if conduit.vital_accretion.enabled then applyBuff( "vital_accretion" ) health.max = health.max * ( 1 + ( conduit.vital_accretion.mod * 0.01 ) ) end end, usable = function () if state.spec.restoration then return end return max( cooldown.fire_elemental.true_remains, cooldown.storm_elemental.true_remains ) > 0, "DPS elementals must be on CD first" end, timeToReady = function () return max( pet.fire_elemental.remains, pet.storm_elemental.remains, pet.primal_fire_elemental.remains, pet.primal_storm_elemental.remains ) end, }, -- Talent: Protects the target with an earthen shield, increasing your healing on them by $s1% and healing them for ${$379s1*(1+$s1/100)} when they take damage. This heal can only occur once every few seconds. Maximum $n charges. $?s383010[Earth Shield can only be placed on the Shaman and one other target at a time. The Shaman can have up to two Elemental Shields active on them.][Earth Shield can only be placed on one target at a time. Only one Elemental Shield can be active on the Shaman.] earth_shield = { id = 974, cast = 0, cooldown = 0, gcd = "spell", school = "nature", spend = 0.02, spendType = "mana", talent = "earth_shield", startsCombat = false, --This can be fine, as long as the APL doesn't recommend casting both unless elemental orbit is picked. handler = function () applyBuff( "earth_shield", nil, class.auras.earth_shield.max_stack ) if not talent.elemental_orbit.enabled then removeBuff( "lightning_shield" ) end if buff.vesper_totem.up and vesper_totem_heal_charges > 0 then trigger_vesper_heal() end end, }, -- Talent: Instantly shocks the target with concussive force, causing $s1 Nature damage.$?a190493[ Earth Shock will consume all stacks of Fulmination to deal extra Nature damage to your target.][] earth_shock = { id = 8042, cast = 0, cooldown = 0, gcd = "spell", school = "nature", spend = function () return 60 - 5 * talent.eye_of_the_storm.rank end, spendType = "maelstrom", talent = "earth_shock", notalent = "elemental_blast", startsCombat = true, cycle = function() if talent.lightning_rod.enabled then return "lightning_rod" end end, handler = function () removeBuff( "master_of_the_elements" ) removeBuff( "magma_chamber" ) removeBuff( "echoing_shock" ) if buff.fusion_of_elements_nature.up then removeBuff( "fusion_of_elements_nature" ) class.abilities.elemental_blast.handler() end if talent.surge_of_power.enabled then applyBuff( "surge_of_power" ) end if talent.echoes_of_great_sundering.enabled or runeforge.echoes_of_great_sundering.enabled then applyBuff( "echoes_of_great_sundering_es" ) end if talent.windspeakers_lava_resurgence.enabled or runeforge.windspeakers_lava_resurgence.enabled then applyBuff( "lava_surge" ) gainCharges( "lava_burst", 1 ) applyBuff( "windspeakers_lava_resurgence" ) end if talent.further_beyond.enabled and buff.ascendance.up then local extension = min( 2.5, fb_extension_remaining ) buff.ascendance.expires = buff.ascendance.expires + extension fb_extension_remaining = fb_extension_remaining - extension end if talent.lightning_rod.enabled then applyDebuff( "target", "lightning_rod" ) end if talent.storm_frenzy.enabled then addStack( "storm_frenzy", nil, 2 ) end if set_bonus.tier29_2pc > 0 then removeBuff( "seismic_accumulation" ) end if set_bonus.tier29_4pc > 0 then applyBuff( "elemental_mastery" ) end if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end end, }, -- Summons a totem at the target location for $d that slows the movement speed of enemies within $3600A1 yards by $3600s1%. earthbind_totem = { id = 2484, cast = 0, cooldown = function () return 30 - 6 * talent.totemic_surge.rank end, gcd = "totem", school = "nature", spend = 0.025, spendType = "mana", startsCombat = false, notalent = "earthgrab_totem", toggle = "interrupts", handler = function () summonTotem( "earthbind_totem" ) end, }, -- Talent: Summons a totem at the target location for $d. The totem pulses every $116943t1 sec, rooting all enemies within $64695A1 yards for $64695d. Enemies previously rooted by the totem instead suffer $116947s1% movement speed reduction. earthgrab_totem = { id = 51485, cast = 0, cooldown = function () return 30 - 6 * talent.totemic_surge.rank end, gcd = "spell", school = "nature", spend = 0.025, spendType = "mana", talent = "earthgrab_totem", startsCombat = false, toggle = "interrupts", handler = function () summonTotem( "earthgrab_totem" ) end, }, -- Talent: Causes the earth within $a1 yards of the target location to tremble and break, dealing $ Physical damage over $d and has a $?s381743[${$77478s2+$381743S1)}.1][$77478s2]% chance to knock the enemy down. earthquake = { id = function() return talent.earthquake_targeted.enabled and 462620 or 61882 end, cast = 0, cooldown = 0, gcd = "spell", school = "nature", spend = function () return 60 - 5 * talent.eye_of_the_storm.rank end, spendType = "maelstrom", talent = "earthquake", startsCombat = true, cycle = function() if talent.lightning_rod.enabled then return "lightning_rod" end end, handler = function () removeBuff( "echoes_of_great_sundering" ) removeBuff( "master_of_the_elements" ) removeBuff( "magma_chamber" ) removeBuff( "echoing_shock" ) if buff.fusion_of_elements_nature.up then removeBuff( "fusion_of_elements_nature" ) class.abilities.elemental_blast.handler() end if talent.lightning_rod.enabled then applyDebuff( "target", "lightning_rod" ) end if talent.further_beyond.enabled and buff.ascendance.up then local extension = min( 2.5, fb_extension_remaining ) buff.ascendance.expires = buff.ascendance.expires + extension fb_extension_remaining = fb_extension_remaining - extension end if talent.windspeakers_lava_resurgence.enabled then addStack( "lava_surge" ) gainCharges( "lava_burst", 1 ) applyBuff( "windspeakers_lava_resurgence" ) end if talent.storm_frenzy.enabled then addStack( "storm_frenzy", nil, 2 ) end if talent.surge_of_power.enabled then applyBuff( "surge_of_power" ) end if set_bonus.tier29_2pc > 0 then removeBuff( "seismic_accumulation" ) end if set_bonus.tier29_4pc > 0 then applyBuff( "elemental_mastery" ) end if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end end, copy = { 462620, 61882 } }, -- Shock the target for $s1 Elemental damage and create an ancestral echo, causing your next damage or healing spell to be cast a second time ${$s2/1000}.1 sec later for free. echoing_shock = { id = 320125, cast = 0.0, cooldown = 30.0, gcd = "spell", spend = 0.0325, spendType = 'mana', startsCombat = true, handler = function() applyBuff( "echoing_shock" ) end, }, -- Talent: Harnesses the raw power of the elements, dealing $s1 Elemental damage and increasing your Critical Strike or Haste by $118522s1% or Mastery by ${$173184s1*$168534bc1}% for $118522d.$?s137041[ If Lava Burst is known, Elemental Blast replaces Lava Burst and gains $394152s2 additional $Lcharge:charges;.][] elemental_blast = { id = 117014, cast = function () if ( buff.ancestral_swiftness.up or buff.natures_swiftness.up ) then return 0 end return 2 * ( 1 - 0.2 * min( 5, buff.maelstrom_weapon.stack ) ) end, gcd = "spell", school = "elemental", spend = function () return 90 - 7.5 * talent.eye_of_the_storm.rank end, spendType = "maelstrom", talent = "elemental_blast", startsCombat = true, cycle = function() if talent.lightning_rod.enabled then return "lightning_rod" end end, handler = function () removeBuff( "master_of_the_elements" ) if buff.ancestral_swiftness.up then removeBuff( "ancestral_swiftness" ) end if buff.natures_swiftness.up then removeBuff( "natures_swiftness" ) end removeBuff( "magma_chamber" ) removeBuff( "echoing_shock" ) applyBuff( "elemental_blast" ) if talent.surge_of_power.enabled then applyBuff( "surge_of_power" ) end if talent.echoes_of_great_sundering.enabled or runeforge.echoes_of_great_sundering.enabled then applyBuff( "echoes_of_great_sundering_eb" ) end if talent.windspeakers_lava_resurgence.enabled or runeforge.windspeakers_lava_resurgence.enabled then applyBuff( "lava_surge" ) gainCharges( "lava_burst", 1 ) applyBuff( "windspeakers_lava_resurgence" ) end if talent.further_beyond.enabled and buff.ascendance.up then local extension = min( 3.5, fb_extension_remaining ) buff.ascendance.expires = buff.ascendance.expires + extension fb_extension_remaining = fb_extension_remaining - extension end if talent.storm_frenzy.enabled then addStack( "storm_frenzy", nil, 2 ) end if set_bonus.tier29_2pc > 0 then removeBuff( "seismic_accumulation" ) end if set_bonus.tier29_4pc > 0 then applyBuff( "elemental_mastery" ) end if talent.lightning_rod.enabled then applyDebuff( "target", "lightning_rod" ) end if talent.further_beyond.enabled and buff.ascendance.up then buff.ascendance.expires = buff.ascendance.expires + 3.5 end if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end end, }, -- Changes your viewpoint to the targeted location for $d. far_sight = { id = 6196, cast = 2, cooldown = 0, gcd = "spell", school = "nature", startsCombat = false, handler = function () applyBuff( "far_sight" ) end, }, -- Talent: Calls forth a Greater Fire Elemental to rain destruction on your enemies for $188592d. While the Fire Elemental is active, Flame Shock deals damage ${100*(1/(1+$188592s2/100)-1)}% faster, and newly applied Flame Shocks last $188592s3% longer. fire_elemental = { id = 198067, cast = 0, charges = 1, cooldown = 150, recharge = 150, gcd = "spell", school = "fire", spend = 0.05, spendType = "mana", talent = "fire_elemental", startsCombat = false, toggle = "cooldowns", timeToReady = function () return max( pet.earth_elemental.remains, pet.primal_earth_elemental.remains, pet.storm_elemental.remains, pet.primal_storm_elemental.remains ) end, handler = function () summonPet( talent.primal_elementalist.enabled and "primal_fire_elemental" or "greater_fire_elemental" ) end, }, -- Sears the target with fire, causing $s1 Fire damage and then an additional $o2 Fire damage over $d. Flame Shock can be applied to a maximum of $I targets. flame_shock = { id = 470411, cast = 0, cooldown = function () return talent.flames_of_the_cauldron.enabled and 4.5 or 6 end, gcd = "spell", school = "fire", spend = 0.015, spendType = "mana", startsCombat = true, cycle = "flame_shock", min_ttd = function () return debuff.flame_shock.duration * 0.3 end, handler = function () applyDebuff( "target", "flame_shock" ) removeBuff( "echoing_shock" ) if buff.fusion_of_elements_fire.up then removeBuff( "fusion_of_elements_fire" ) class.abilities.elemental_blast.handler() end if talent.magma_chamber.enabled then addStack( "magma_chamber" ) end if buff.surge_of_power.up then active_dot.surge_of_power_debuff = min( active_enemies, active_dot.flame_shock + 1 ) removeBuff( "surge_of_power" ) end -- TODO: should also gain on every tick of damage. if talent.searing_flames.enabled then gain( talent.searing_flames.rank, "maelstrom" ) end if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end end, copy = 188389 }, -- Imbue your $?s33757[off-hand ][]weapon with the element of Fire for $319778d, causing each of your attacks to deal ${$max(($*$AP),1)} additional Fire damage$?s382027[ and increasing the damage of your Fire spells by $382028s1%][]. flametongue_weapon = { id = 318038, cast = 0, cooldown = 0, gcd = "spell", school = "fire", startsCombat = false, nobuff = "flametongue_weapon", handler = function () applyBuff( "flametongue_weapon" ) if talent.improved_flametongue_weapon.enabled then applyBuff( "improved_flametongue_weapon" ) end end, }, -- Talent: Chills the target with frost, causing $s1 Frost damage and reducing the target's movement speed by $s2% for $d. frost_shock = { id = 196840, cast = 0, cooldown = 0, gcd = "spell", school = "frost", spend = 0.01, spendType = "mana", talent = "frost_shock", startsCombat = true, nobuff = "icefury", texture = 135849, bind = "icefury", handler = function () removeBuff( "master_of_the_elements" ) removeBuff( "echoing_shock" ) applyDebuff( "target", "frost_shock" ) if talent.encasing_cold.enabled then applyDebuff( "target", "encasing_cold" ) end if talent.flux_melting.enabled then applyBuff( "flux_melting" ) end if buff.icefury_dmg.up then gain( buff.primal_fracture.up and 15 or 10, "maelstrom" ) removeStack( "icefury_dmg", 1 ) if talent.electrified_shocks.enabled then applyDebuff( "target", "electrified_shocks" ) active_dot.electrified_shocks = min( true_active_enemies, active_dot.electrified_shocks + 2 ) end end if buff.surge_of_power.up then applyDebuff( "target", "surge_of_power_debuff" ) removeBuff( "surge_of_power" ) end if talent.flux_melting.enabled then applyBuff( "flux_melting" ) end if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end end, }, -- Turn into a Ghost Wolf, increasing movement speed by $?s382215[${$s2+$382216s1}][$s2]% and preventing movement speed from being reduced below $s3%. ghost_wolf = { id = 2645, cast = 0, cooldown = 0, gcd = "spell", school = "nature", startsCombat = false, handler = function () applyBuff( "ghost_wolf" ) if talent.spirit_wolf.enabled then applyBuff( "spirit_wolf" ) end end, }, -- Talent: Purges the enemy target, removing $m1 beneficial Magic effects. greater_purge = { id = 378773, cast = 0, cooldown = 12, gcd = "spell", school = "nature", spend = 0.024, spendType = "mana", talent = "greater_purge", startsCombat = function() if talent.elemental_equilibrium.enabled then return false end return true end, toggle = "interrupts", buff = "dispellable_magic", handler = function () removeBuff( "dispellable_magic" ) if buff.fusion_of_elements_nature.up then -- ??? removeBuff( "fusion_of_elements_nature" ) class.abilities.elemental_blast.handler() end end, }, grounding_totem = { id = 204336, cast = 0, cooldown = function () return 30 - 3 * talent.totemic_surge.rank end, gcd = "totem", school = "nature", spend = 0.06, spendType = "mana", pvptalent = "grounding_totem", startsCombat = false, texture = 136039, handler = function () summonTotem( "grounding_totem" ) end, }, -- Talent: A gust of wind hurls you forward. gust_of_wind = { id = 192063, cast = 0, cooldown = 20, gcd = "spell", school = "nature", talent = "gust_of_wind", startsCombat = false, toggle = "interrupts", handler = function () end, }, -- Talent: Summons a totem at your feet for $d that heals $?s147074[two injured party or raid members][an injured party or raid member] within $52042A1 yards for $52042s1 every $5672t1 sec. If you already know $?s157153[$@spellname157153][$@spellname5394], instead gain $392915s1 additional $Lcharge:charges; of $?s157153[$@spellname157153][$@spellname5394]. healing_stream_totem = { id = 5394, cast = 0, charges = 1, cooldown = function () return 30 - 6 * talent.totemic_surge.rank end, recharge = 30, gcd = "totem", spend = 0.05, spendType = "mana", talent = "healing_stream_totem", startsCombat = false, handler = function () summonTotem( "healing_stream_totem" ) if buff.vesper_totem.up and vesper_totem_heal_charges > 0 then trigger_vesper_heal() end if conduit.swirling_currents.enabled or talent.swirling_currents.enabled then applyBuff( "swirling_currents" ) end if time > 0 and talent.inundate.enabled then gain( 8, "maelstrom" ) end end, }, -- A quick surge of healing energy that restores $s1 of a friendly target's health. healing_surge = { id = 8004, cast = function () if buff.ancestral_swiftness.up or buff.natures_swiftness.up then return 0 end return 1.5 * haste end, cooldown = 0, gcd = "spell", school = "nature", spend = function () return ( buff.ancestral_swiftness.up or buff.natures_swiftness.up or buff.surging_currents.up ) and 0 or 0.1 end, spendType = "mana", startsCombat = false, handler = function () if buff.ancestral_swiftness.up then removeBuff( "ancestral_swiftness" ) elseif buff.natures_swiftness.up then removeBuff( "natures_swiftness" ) end if buff.surging_currents.up then removeBuff( "surging_currents" ) end removeBuff( "echoing_shock" ) if buff.vesper_totem.up and vesper_totem_heal_charges > 0 then trigger_vesper_heal() end if buff.swirling_currents.up then removeStack( "swirling_currents" ) end end, }, -- Talent: Transforms the enemy into a frog for $d. While hexed, the victim is incapacitated, and cannot attack or cast spells. Damage may cancel the effect. Limit 1. Only works on Humanoids and Beasts. hex = { id = 51514, cast = 1.7, cooldown = function () return 30 - 15 * talent.voodoo_mastery.rank end, gcd = "spell", school = "nature", talent = "hex", startsCombat = false, handler = function () applyDebuff( "target", "hex" ) if talent.enfeeblement.enabled then applyDebuff( "target", "enfeeblement" ) end if time > 0 and talent.inundate.enabled then gain( 8, "maelstrom" ) end end, copy = { 210873, 211004, 211010, 211015, 269352, 277778, 277784, 309328 } }, -- Talent: Hurls frigid ice at the target, dealing $s1 Frost damage and causing your next $n Frost Shocks to deal $s2% increased damage and generate $343725s7 Maelstrom. |cFFFFFFFFGenerates $343725s8 Maelstrom.|r icefury = { id = 210714, cast = 2, cooldown = 30, gcd = "spell", school = "frost", spend = 0.03, spendType = "mana", talent = "icefury", startsCombat = true, buff = "icefury", texture = 135855, bind = "frost_shock", handler = function () removeBuff( "icefury" ) removeBuff( "master_of_the_elements" ) removeBuff( "echoing_shock" ) applyBuff( "icefury_dmg", nil, 2 ) gain( 25 * ( buff.primal_fracture.up and 1.5 or 1 ), "maelstrom" ) if talent.fusion_of_elements.enabled then applyBuff( "fusion_of_elements_fire" ) applyBuff( "fusion_of_elements_nature" ) end if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end end, }, -- Talent: Hurls molten lava at the target, dealing $285452s1 Fire damage. Lava Burst will always critically strike if the target is affected by Flame Shock.$?a343725[ |cFFFFFFFFGenerates $343725s3 Maelstrom.|r][] lava_burst = { id = 51505, cast = function () return ( buff.ancestral_swiftness.up or buff.natures_swiftness.up or buff.lava_surge.up ) and 0 or ( 2 * haste ) end, charges = function () return talent.echo_of_the_elements.enabled and 3 or 2 end, cooldown = function () return 8 * haste end, recharge = function () return 8 * haste end, gcd = "spell", school = "fire", spend = function() return ( buff.ancestral_swiftness.up or buff.natures_swiftness.up ) and 0 or 0.025 end, spendType = "mana", talent = "lava_burst", notalent = function() if state.spec.enhancement then return "elemental_blast" end end, startsCombat = true, velocity = 30, indicator = function() return active_enemies > 1 and settings.cycle and dot.flame_shock.down and active_dot.flame_shock > 0 and "cycle" or nil end, handler = function () removeBuff( "windspeakers_lava_resurgence" ) if buff.lava_surge.up then removeStack( "lava_surge" ) end if buff.ancestral_swiftness.up then removeBuff( "ancestral_swiftness" ) end if buff.natures_swiftness.up then removeBuff( "natures_swiftness" ) end removeBuff( "flux_melting" ) removeStack( "molten_charge" ) removeBuff( "echoing_shock" ) gain( ( 8 + ( talent.flow_of_power.rank * 2 ) ) * ( buff.primal_fracture.up and 1.5 or 1 ), "maelstrom" ) if talent.erupting_lava.enabled and debuff.flame_shock.up then if debuff.flame_shock.remains > 3 then debuff.flame_shock.expires = debuff.flame_shock.expires - 3 else removeDebuff( "target", "flame_shock" ) end end if buff.fusion_of_elements_fire.up then removeBuff( "fusion_of_elements_fire" ) class.abilities.elemental_blast.handler() end if talent.master_of_the_elements.enabled then applyBuff( "master_of_the_elements" ) end if talent.rolling_magma.enabled and talent.primordial_wave.enabled then reduceCooldown( "primordial_wave", 0.5 ) end if talent.surge_of_power.enabled then gainChargeTime( "fire_elemental", 4 ) gainChargeTime( "storm_elemental", 4 ) removeBuff( "surge_of_power" ) end if buff.primordial_wave.up then if state.spec.elemental and talent.splintered_elements.enabled then if buff.splintered_elements.down then stat.haste = state.haste + 0.1 * active_dot.flame_shock end applyBuff( "splintered_elements", nil, active_dot.flame_shock ) end if set_bonus.tier31_4pc > 0 then applyBuff( "molten_charge", nil, 2 ) end removeBuff( "primordial_wave" ) end if talent.rolling_magma.enabled then reduceCooldown( "primordial_wave", 0.2 * talent.rolling_magma.rank ) end if set_bonus.tier29_2pc > 0 then addStack( "seismic_accumulation" ) end if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end end, impact = function () if set_bonus.tier31_4pc > 0 then applyDebuff( "target", "molten_slag" ) end end, -- This + velocity makes action.lava_burst.in_flight work in APL logic. }, -- Hurls a bolt of lightning at the target, dealing $s1 Nature damage.$?a343725[ |cFFFFFFFFGenerates $343725s1 Maelstrom.|r][] lightning_bolt = { id = 188196, cast = function () if buff.ancestral_swiftness.up or buff.natures_swiftness.up then return 0 end if buff.stormkeeper.up then return 0 end if buff.arc_discharge.up then return 0 end return ( talent.unrelenting_calamity.enabled and 1.75 or 2 ) * ( 1 - 0.2 * min( 5, buff.maelstrom_weapon.stack ) ) * ( buff.storm_frenzy.up and 0.6 or 1 ) end, cooldown = 0, gcd = "spell", school = "nature", spend = function() return ( buff.ancestral_swiftness.up or buff.natures_swiftness.up ) and 0 or 0.01 end, spendType = "mana", startsCombat = true, nobuff = "tempest", texture = 136048, handler = function () local ms = 6 + ( 2 * talent.flow_of_power.rank ) local overload = 2 ms = ms + ( buff.stormkeeper.up and overload or 0 ) + ( buff.surge_of_power.up and ( 2 * overload ) or 0 ) + ( buff.power_of_the_maelstrom.up and overload or 0 ) ms = ms * ( buff.primal_fracture.up and 1.5 or 1 ) gain( ms, "maelstrom" ) if buff.ancestral_swiftness.up then removeBuff( "ancestral_swiftness" ) end if buff.natures_swiftness.up then removeBuff( "natures_swiftness" ) end removeStack( "arc_discharge" ) removeBuff( "master_of_the_elements" ) removeBuff( "surge_of_power" ) removeStack( "power_of_the_maelstrom" ) removeBuff( "echoing_shock" ) removeStack( "storm_frenzy" ) if buff.fusion_of_elements_nature.up then removeBuff( "fusion_of_elements_nature" ) class.abilities.elemental_blast.handler() end if buff.stormkeeper.up then removeStack( "stormkeeper" ) if set_bonus.tier30_4pc > 0 then applyBuff( "primal_fracture" ) end end if pet.storm_elemental.up or buff.lesser_storm_elemental.up then addStack( "wind_gust" ) end if talent.flash_of_lightning.enabled then flash_of_lightning() end if talent.arc_discharge.enabled and active_enemies > 1 then addStack( "arc_discharge", nil, 2 ) end if set_bonus.tier29_2pc > 0 then addStack( "seismic_accumulation" ) end if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end end, bind = "tempest" }, -- Hurls a bolt of lightning at the target, dealing $s1 Nature damage.$?a343725[ |cFFFFFFFFGenerates $343725s1 Maelstrom.|r][] tempest = { id = 452201, cast = function () if buff.ancestral_swiftness.up or buff.natures_swiftness.up then return 0 end if buff.stormkeeper.up then return 0 end return ( talent.unrelenting_calamity.enabled and 1.75 or 2 ) * ( 1 - 0.03 * min( 10, buff.wind_gust.stacks ) ) * ( 1 - 0.2 * min( 5, buff.maelstrom_weapon.stack ) ) * ( buff.storm_frenzy.up and 0.6 or 1 ) end, cooldown = 0, gcd = "spell", school = "nature", spend = function() return ( buff.ancestral_swiftness.up or buff.natures_swiftness.up ) and 0 or 0.01 end, spendType = "mana", startsCombat = true, texture = 5927653, buff = "tempest", cycle = function() if talent.conductive_energy.enabled then return "lightning_rod" end end, handler = function () removeBuff( "tempest" ) local ms = 6 + ( 2 * talent.flow_of_power.rank ) local overload = 2 ms = ms + ( buff.stormkeeper.up and overload or 0 ) + ( buff.surge_of_power.up and ( 2 * overload ) or 0 ) + ( buff.power_of_the_maelstrom.up and overload or 0 ) ms = ms * ( buff.primal_fracture.up and 1.5 or 1 ) gain( ms, "maelstrom" ) if buff.ancestral_swiftness.up then removeBuff( "ancestral_swiftness" ) end if buff.natures_swiftness.up then removeBuff( "natures_swiftness" ) end removeStack( "arc_discharge" ) removeBuff( "master_of_the_elements" ) removeBuff( "surge_of_power" ) removeStack( "power_of_the_maelstrom" ) removeBuff( "echoing_shock" ) removeStack( "storm_frenzy" ) if buff.fusion_of_elements_nature.up then removeBuff( "fusion_of_elements_nature" ) class.abilities.elemental_blast.handler() end if buff.stormkeeper.up then removeStack( "stormkeeper" ) if set_bonus.tier30_4pc > 0 then applyBuff( "primal_fracture" ) end end if pet.storm_elemental.up or buff.lesser_storm_elemental.up then addStack( "wind_gust" ) end if talent.flash_of_lightning.enabled then flash_of_lightning() end if talent.arc_discharge.enabled and active_enemies > 1 then addStack( "arc_discharge", nil, 2 ) end if talent.lightning_rod.enabled then applyDebuff( "target", "lightning_rod" ) end if set_bonus.tier29_2pc > 0 then addStack( "seismic_accumulation" ) end if set_bonus.tww3 >= 4 then removeStack( "storms_eye" ) end if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end end, bind = "lightning_bolt", flash = 188196 }, -- Talent: Grips the target in lightning, stunning and dealing $305485o1 Nature damage over $305485d while the target is lassoed. Can move while channeling. lightning_lasso = { id = 305483, cast = 5, channeled = true, cooldown = 45, gcd = "spell", school = "nature", talent = "lightning_lasso", startsCombat = true, start = function () applyDebuff( "target", "lightning_lasso" ) if buff.fusion_of_elements_nature.up then removeBuff( "fusion_of_elements_nature" ) class.abilities.elemental_blast.handler() end if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end end, copy = 305485 }, -- Surround yourself with a shield of lightning for $d. Melee attackers have a $h% chance to suffer $192109s1 Nature damage$?a137041[ and have a $s3% chance to generate a stack of Maelstrom Weapon]?a137040[ and have a $s4% chance to generate $s5 Maelstrom][]. $?s383010[The Shaman can have up to two Elemental Shields active on them.][Only one Elemental Shield can be active on the Shaman at a time.] lightning_shield = { id = 192106, cast = 0, cooldown = 0, gcd = "spell", school = "nature", spend = 0.015, spendType = "mana", startsCombat = false, readyTime = function () return buff.lightning_shield.remains - 120 end, handler = function () applyBuff( "lightning_shield" ) if not talent.elemental_orbit.enabled then removeBuff( "earth_shield" ) end end, }, -- Talent: Summons a totem at the target location that erupts dealing $383061s1 Fire damage and applying Flame Shock to $383061s2 enemies within $383061A1 yards. Continues hurling liquid magma at a random nearby target every $192226t1 sec for $d, dealing ${$192231s1*(1+($137040s3/100))} Fire damage to all enemies within $192223A1 yards. liquid_magma_totem = { id = 192222, cast = 0, cooldown = function () return 30 - 6 * talent.totemic_surge.rank end, gcd = "totem", school = "fire", spend = 0.035, spendType = "mana", talent = "liquid_magma_totem", startsCombat = false, toggle = "cooldowns", handler = function () summonTotem( "liquid_magma_totem" ) applyDebuff( "target", "flame_shock" ) active_dot.flame_shock = min( active_enemies, active_dot.flame_shock + 2 ) gain( 8, "maelstrom" ) if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end end, }, --[[ Passive in 10.0.5 -- Talent: Summons a totem at your feet for $d that restores $381931s1 mana to you and $s1 allies nearest to the totem within $?s382201[${$s2*(1+$382201s3/100)}][$s2] yards when you cast $?!s137041[Lava Burst][]$?s137039[ or Riptide][]$?s137041[Stormstrike][]. Allies can only benefit from one Mana Spring Totem at a time, prioritizing healers. mana_spring_totem = { id = 381930, cast = 0, cooldown = function () return 45 - 3 * talent.totemic_surge.rank end, gcd = "totem", school = "nature", spend = 0.015, spendType = "mana", talent = "mana_spring_totem", startsCombat = false, handler = function () summonTotem( "mana_spring_totem" ) end, }, ]] -- Talent: Your next healing or damaging Nature spell is instant cast and costs no mana. natures_swiftness = { id = 378081, cast = 0, cooldown = 60, gcd = "off", school = "nature", talent = "natures_swiftness", notalent = "ancestral_swiftness", startsCombat = false, toggle = "cooldowns", nobuff = "natures_swiftness", handler = function () applyBuff( "natures_swiftness" ) end, }, -- Talent: Summons a totem at your feet that removes $383015s1 poison effect from a nearby party or raid member within $383015a yards every $383014t1 sec for $d. poison_cleansing_totem = { id = 383013, cast = 0, cooldown = function () return 45 - 6 * talent.totemic_surge.rank end, gcd = "totem", school = "nature", spend = 0.025, spendType = "mana", talent = "poison_cleansing_totem", startsCombat = false, handler = function () summonTotem( "poison_cleansing_totem" ) end, }, -- An instant weapon strike that causes $s1 Physical damage. primal_strike = { id = 73899, cast = 0, charges = 0, cooldown = 12, recharge = 12, gcd = "spell", school = "physical", spend = 0.094, spendType = "mana", notalent = "stormstrike", startsCombat = true, handler = function () if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end end, }, -- Talent: Blast your target with a Primordial Wave, dealing $375984s1 Shadow damage and apply Flame Shock to them.; Your next $?a137040[Lava Burst]?a137041[Lightning Bolt][Healing Wave] will also hit all targets affected by your $?a137040|a137041[Flame Shock][Riptide] for $?a137039[$s2%]?a137040[$s3%][$s4%] of normal $?a137039[healing][damage].$?s384405[; Primordial Wave generates $s5 stacks of Maelstrom Weapon.][] primordial_wave = { id = function() return talent.primordial_wave.enabled and 375982 or 326059 end, cast = 0, cooldown = 30, gcd = "spell", school = "elemental", spend = 0.03, spendType = "mana", talent = function() if covenant.necrolord then return end return "primordial_wave" end, startsCombat = true, -- velocity = 30, usable = function() if active_dot.flame_shock < 1 then return false, "requires active flame_shock" end end, handler = function () if talent.call_of_the_ancestors.enabled then applyBuff( "call_of_the_ancestors" ) end gain_maelstrom( 12 ) if talent.conductive_energy.enabled then active_dot.lightning_rod = min( active_enemies, max( active_dot.lightning_rod, active_dot.flame_shock ) ) end removeBuff( "echoing_shock" ) if talent.splintered_elements.enabled then applyBuff( "splintered_elements" ) end if set_bonus.tier31_2pc > 0 and state.spec.elemental then applyBuff( "elemental_blast_critical_strike", 10 ) applyBuff( "elemental_blast_haste", 10 ) applyBuff( "elemental_blast_mastery", 10 ) end end, copy = { 326059, 375982 } }, -- Talent: Removes all movement impairing effects and increases your movement speed by $58875s1% for $58875d. spirit_walk = { id = 58875, cast = 0, cooldown = 60, gcd = "off", school = "physical", talent = "spirit_walk", startsCombat = false, toggle = "interrupts", handler = function () applyBuff( "spirit_walk" ) end, }, -- Talent: Calls upon the guidance of the spirits for $d, permitting movement while casting Shaman spells. Castable while casting.$?a192088[ Increases movement speed by $192088s2%.][] spiritwalkers_grace = { id = 79206, cast = 0, cooldown = function () return 120 - 30 * talent.graceful_spirit.rank end, gcd = "spell", school = "nature", spend = 0.141, spendType = "mana", talent = "spiritwalkers_grace", startsCombat = false, toggle = "interrupts", handler = function () applyBuff( "spiritwalkers_grace" ) end, }, -- Talent: Summons a totem at your feet for $d that grants $383018s1% physical damage reduction to you and the $s1 allies nearest to the totem within $?s382201[${$s2*(1+$382201s3/100)}][$s2] yards. stoneskin_totem = { id = 383017, cast = 0, cooldown = function () return 30 - 3 * talent.totemic_surge.rank end, gcd = "totem", school = "nature", spend = 0.015, spendType = "mana", talent = "stoneskin_totem", startsCombat = false, handler = function () summonTotem( "stoneskin_totem" ) applyBuff( "stoneskin" ) end, }, -- Talent: Calls forth a Greater Storm Elemental to hurl gusts of wind that damage the Shaman's enemies for $157299d. While the Storm Elemental is active, each time you cast Lightning Bolt or Chain Lightning, the cast time of Lightning Bolt and Chain Lightning is reduced by $263806s1%, stacking up to $263806u times. storm_elemental = { id = 192249, cast = 0, charges = 1, cooldown = 150, recharge = 150, gcd = "spell", school = "nature", talent = "storm_elemental", startsCombat = false, toggle = "cooldowns", timeToReady = function () return max( pet.earth_elemental.remains, pet.primal_earth_elemental.remains, pet.fire_elemental.remains, pet.primal_fire_elemental.remains ) end, handler = function () summonPet( talent.primal_elementalist.enabled and "primal_storm_elemental" or "greater_storm_elemental" ) end, }, -- Talent: Charge yourself with lightning, causing your next $n Chain Lightnings to deal $s2% more damage and be instant cast. stormkeeper = { id = 191634, cast = 1.5, cooldown = 60, gcd = "spell", school = "nature", talent = "stormkeeper", startsCombat = false, texture = 839977, toggle = "cooldowns", handler = function () applyBuff( "stormkeeper", nil, 2 ) if buff.fusion_of_elements_nature.up then removeBuff( "fusion_of_elements_nature" ) class.abilities.elemental_blast.handler() end if talent.fury_of_the_storms.enabled then applyBuff( "fury_of_storms" ) summonPet( talent.primal_elementalist.enabled and "primal_storm_elemental" or "greater_storm_elemental" ) end end, }, -- Imbue your shield with the element of Lightning for $d, giving Lightning Bolt and Chain Lightning a chance to call down $s1 Thunderstrikes on your target for $462763s1 Nature damage. thunderstrike_ward = { id = 462757, cast = 0.0, cooldown = 0.0, gcd = "spell", talent = "thunderstrike_ward", startsCombat = false, equipped = "shield", nobuff = "thunderstrike_ward", handler = function() -- TODO: Check if we need to use Imbue system instead. applyBuff( "thunderstrike_ward" ) end, }, -- Talent: Calls down a bolt of lightning, dealing $s1 Nature damage to all enemies within $A1 yards, reducing their movement speed by $s3% for $d, and knocking them $?s378779[upward][away from the Shaman]. Usable while stunned. thunderstorm = { id = 51490, cast = 0, cooldown = function () return 30 - 5 * talent.thundershock.rank end, gcd = "spell", school = "nature", talent = "thunderstorm", startsCombat = true, handler = function () removeBuff( "echoing_shock" ) applyDebuff( "target", "thunderstorm" ) if buff.fusion_of_elements_nature.up then removeBuff( "fusion_of_elements_nature" ) class.abilities.elemental_blast.handler() end if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end end, }, -- Talent: Relocates your active totems to the specified location. totemic_projection = { id = 108287, cast = 0, cooldown = 10, gcd = "off", school = "nature", talent = "totemic_projection", startsCombat = false, handler = function () end, }, -- Talent: Resets the cooldown of your most recently used totem with a base cooldown shorter than 3 minutes. totemic_recall = { id = 108285, cast = 0, cooldown = function() return talent.call_of_the_elements.enabled and 120 or 180 end, gcd = "spell", school = "nature", talent = "totemic_recall", startsCombat = false, usable = function() return recall_totem_1 ~= nil end, handler = function () if recall_totem_1 then setCooldown( recall_totem_1, 0 ) end if talent.creation_core.enabled and recall_totem_2 then setCooldown( recall_totem_2, 0 ) end end, }, -- Talent: Summons a totem at your feet that shakes the ground around it for $d, removing Fear, Charm and Sleep effects from party and raid members within $8146a1 yards. tremor_totem = { id = 8143, cast = 0, cooldown = function () return 60 - 6 * talent.totemic_surge.rank + ( conduit.totemic_surge.mod * 0.001 ) end, gcd = "totem", school = "nature", spend = 0.023, spendType = "mana", talent = "tremor_totem", startsCombat = false, toggle = "interrupts", handler = function () summonTotem( "tremor_totem" ) end, }, -- Talent: Summons a totem at the target location for $d, continually granting all allies who pass within $192078s1 yards $192082s% increased movement speed for $192082d. wind_rush_totem = { id = 192077, cast = 0, cooldown = function () return 120 - 3 * talent.totemic_surge.rank end, gcd = "totem", school = "nature", spend = 0.01, spendType = "mana", talent = "wind_rush_totem", startsCombat = false, toggle = "cooldowns", handler = function () summonTotem( "wind_rush_totem" ) end, }, -- Talent: Disrupts the target's concentration with a burst of wind, interrupting spellcasting and preventing any spell in that school from being cast for $d. wind_shear = { id = 57994, cast = 0, cooldown = 12, gcd = "off", school = "nature", talent = "wind_shear", startsCombat = false, toggle = "interrupts", debuff = "casting", readyTime = state.timeToInterrupt, handler = function () interrupt() if time > 0 and talent.inundate.enabled then gain( 8, "maelstrom" ) end if buff.fusion_of_elements_nature.up then -- ??? removeBuff( "fusion_of_elements_nature" ) class.abilities.elemental_blast.handler() end end, }, -- Pet Abilities meteor = { id = 117588, known = function () return talent.primal_elementalist.enabled and not talent.storm_elemental.enabled and fire_elemental.up end, cast = 0, cooldown = 60, gcd = "off", startsCombat = true, texture = 1033911, talent = "primal_elementalist", usable = function () return fire_elemental.up end, handler = function () end, }, tempest_pet = { -- TODO: Rename to Tempest (Pet) ? id = 157375, known = function () return talent.primal_elementalist.enabled and talent.storm_elemental.enabled and storm_elemental.up end, cast = 0, cooldown = 40, gcd = "off", startsCombat = true, talent = "primal_elementalist", usable = function () return storm_elemental.up end, handler = function () end, }, } ) spec:RegisterStateExpr( "funneling", function () return false -- return active_enemies > 1 and settings.cycle and settings.funnel_damage end ) spec:RegisterSetting( "stack_buffer", 1.1, { name = strformat( "%s and %s Padding", Hekili:GetSpellLinkWithTexture( spec.abilities.icefury.id ), Hekili:GetSpellLinkWithTexture( spec.abilities.stormkeeper.id ) ), desc = strformat( "The default priority tries to avoid wasting %s and %s stacks with a grace period of 1.1 GCD per stack.\n\n" .. "Increasing this number will reduce the likelihood of wasted |W%s|w / |W%s|w stacks due to other procs taking priority, leaving you with more time to react.", Hekili:GetSpellLinkWithTexture( spec.abilities.icefury.id ), Hekili:GetSpellLinkWithTexture( spec.abilities.stormkeeper.id ), spec.abilities.icefury.name, spec.abilities.stormkeeper.name ), type = "range", min = 1, max = 2, step = 0.01, width = "full" } ) spec:RegisterSetting( "hostile_dispel", false, { name = strformat( "Use %s or %s", Hekili:GetSpellLinkWithTexture( 370 ), Hekili:GetSpellLinkWithTexture( 378773 ) ), desc = strformat( "If checked, %s or %s can be recommended your target has a dispellable magic effect.\n\n" .. "These abilities are also on the Interrupts toggle by default.", Hekili:GetSpellLinkWithTexture( 370 ), Hekili:GetSpellLinkWithTexture( 378773 ) ), type = "toggle", width = "full" } ) spec:RegisterSetting( "purge_icd", 12, { name = strformat( "%s Internal Cooldown", Hekili:GetSpellLinkWithTexture( 370 ) ), desc = strformat( "If set above zero, %s cannot be recommended again until time has passed since it was last used, even if there are more " .. "dispellable magic effects on your target.\n\nThis feature can prevent you from being encouraged to spam your dispel endlessly against enemies " .. "with rapidly stacking magic buffs.", Hekili:GetSpellLinkWithTexture( 370 ) ), type = "range", min = 0, max = 20, step = 1, width = "full" } ) spec:RegisterRanges( "lightning_bolt", "flame_shock", "wind_shear", "primal_strike" ) spec:RegisterOptions( { enabled = true, aoe = 3, cycle = false, nameplates = false, nameplateRange = 40, rangeFilter = false, canFunnel = true, funnel = false, damage = true, damageDots = true, damageExpiration = 8, potion = "tempered_potion", package = "Elemental", } ) spec:RegisterPack( "Elemental", 20250505, [[Hekili:T3t)ZTTnY(3INoJIuSTIeLDQBp7KPxM0xtEPD6CQVP)WnNKOKGS5yksE8d763Zp93(Tlaijai(GsY2XjTtBsSfxaSFVl2fGAYWj)2KXl9Zjt(fVbENoa(V(dF9jEdoDY487sitgN4V4A)lHFiYFn83VpKSMeL7hIp5UWy)L4mKfxKUaE6v55jzF)RE1Lb5xvmV)I41VklyDrOFEqC0Iu)v54VV4vtgpViim)drtMRB5ho4BH5mHSa(4x7btBWYLegSKSftgJWE8a8))(nZghS(DWFFx0InFK9Grh79ThTz2Gto2Zda4FqUjiJSz2pKTGeT0pAb5v5PbrxtY3mldh2SW4ldeh9jWO(54uPXSz2QG)GK932mljLCmBC3cK5MzbraDgeDzjQS4k)Oljz1Z3WtOyX64BiLWGexWkyrNLhGJndM(4uP1RE4dQOYIeKzv(iVJ9oJoZIydciiBsJxfecsKV5B2mRTsL5HXZFv(vKB9tX5ki6v)WceKFnnioni)UpfKLN9QSR8x7hnLuQi0hh7MpIl0)tcqpXBMrrsb8bqYFijniCZmVHWFaKFZSJ3m70rRgmWhihy0BM9(OScKLFlXpjoAZmseYibzuaWC8tscdilHFz1Mz3fx8cKvMb4WIC8t)WAGGVb)PFmeutZJJUSaa43Ptv)nF0Nshz9brhq9Z9Zp8IxTQgYPS18OGvxaeeqv9d4t40Mq1Ne5ppewlTZA213TQi9o9pmm4YRYJaX90SRciHgMcqifTKKMbkPxdlQFQb4i(P5xXNje1pyEXQv9f)0(fjD4euL4AAC68GCdiFEC66RjKesQEaUXpnaj(JqNbxS2NeoDHFYr34hwqUy4GbhE6GxYxWSBjHHiPIqb0s86(P(rxFO3PLqaAeRJtxg4tNe)fGggfK2S0u7hyGCd5HCuOl)37pSFqw)RIlYitJxbtF6YS7Vx6HRkIyphWLSEDoOAOE9VYpBk(eKFwpkpnJItjRcaP1uFUTRbMRvcWtLa8Sra6qLdeOD9eGoY2ebqTi)quojnTibSbJbZUf(G5FTXeqs3geTeu1avoUfmsFBMTM66eD3HQCsJilja8KCRF41Gc(0lt9xqocae0tUyOiCGROyW4dSKOA2C00VY7yPr493tv6fEqrY93ViooCz8TrIFEkzTFqu2BoDG06aObj9Ay93(1rCEagiHIZB)0SnOl(iWwIAXeg(ySwGyCCYDRbrnj9fzOl05IiaQ5eKtwFuwyC(fvwFOJtrTSSYPidCAoVt3URqpFtlxOHNnOdf5eGlLKeNcUnYH8nEJ3PCS3eaJaaKMZZpBqVo6jo)L31PlD2q9j0CI6NlJYpk5FLpcc)XFCVoDRMpbxv36FtnhdXZdA6odH5(7bt8qWa3p9scy3abZcIMwfb4nx41dOX4SSoY0H3WEoz4EImCV)IHV)mCqT)xifGHfnts)emFX3hDfsqPAfhuN4r0HmnJnIPe(aoI51E10lxS8cQXHQLyLCXZUf5qMf5pHESzoHFhgjyZSdH0OaxSbrf5YzPAexLJL0ef7wgFQVAS17V30J861XgLPYNP0YpYdaTz2NGiq7cLifc7ZhH8lGolQVWNImNwTdBIRhyZR5bgjeW(E7nVe00eYZtqv7X3(ZG)coc0WdJ3WMXWQflTXnPzgUoVMgz4E)fdNXWfu7zBgYIwpoSPGdXLAmrF(XmDZQmZyCQiQZYFNsxV7USnfhr2rMc5FxeKKqw23qenbiMdjGofKSi9L1ZE4lVb3FVacxbA9ZR56gwzTWkHdcq0B38jSd8ujrr7LGptefdFQffQf(OkNi1h0hNuXrg5NxKsYMMDBWQ8iswgwPjSutyge)A8Tq6zW(uxvKfG1mc)Z7krnwnPQNQGOBIVgiN)ay8ra9HialJIeCEaQGnn6syZ1wNgjTnTK4CX5HUXWWISC60OQbarEQ)8wLaYOHDW8yPUJ)N)e56GWG)LZYB(32mlLwi0LSA0HvM4gK7D7veGR5xLidRGBfuaF5CYkyZ8VuC2L2pVCrnQX(YiN8YAyIMnyc1XwEro8qw)q6grMwk1ehMgT)EsEQ0JmAYzWHpI6hAcz06vSNB3acr7CyUEXabvx3M29m5Gryf1A0lTogDlGbGDiZLz)IABPfrtz)gKMtwoxPlMCewR0f5m352tkAOZ5ldalKWNaSsyLfZdwiELEQl(T6tP5Mu)46YYQ8aPSDilUkUmBNkiY0o1LfNLwMguNIxXBWu)Q4fxx2gHFLM2J6megac2Ltx7F5A)P5XyOrmzmxPnD(PVeIvAjZPU4YCdz6YyiZneBMsrMZVG)5KiY6as2XJU)Edq2vgY382r9CKq2GgYL6P7Of3TOscMX0kCsKaj25af8QFEWcS2GGH8UKb(5xmABPcLfaXC9SSlu5yVwW6RPGwkt2sbztWurheBz1Bum(RyuN)rvmf5yoAcXOj(cl8I(OlLOq1JOkR6lyTsesWrZGMLRsy7)ndu1ZCfRSVXdpRL0IzPwaQhSY3WZyb5ayprWMgc7qIA9weszimwt)nZE7BvzfGakbeh6uVzjpKUy6YGmqleEclLYZ940vgIdiYrZ1rY9J8J610RrzkAZJdZRwmrMrrsh9lshR2hx4PUwkaiO(xQNFXRnSuTyQeCeVkLe9)EhJhDHxh9SIovTU68knNYEEDC3HNEOggXlTsX2FktBHMz7N8VXVsXjjnErgZKAbqGfRPnJgTBs8t5nNPmdyE)rXU1Gz1fMbdIggD27Xgd(Vl8VUQ1Sb5ndraRle2nvVwwPLayubdJjiOJGY3Qudy4cYg5rZYMIOl(CwWqwcukH8qJToDRy5V5uVJRAvi5oIKHfxPgdCc7naEYLagLdOb24uuvLK1icRwa7XTqtirlfyE(iZDrymkkOSD)KJ2m7NPOnJFdOcWs5yEjlM6ylbaqUt(SoyppUiNnBK)ibzhQ8EsLaI6PRMt0u5B4Gx21QQ0Hd7X3rHrETU(dzQkONpsBPZpTxBfeUGAE7exWUUZv7N98qGcRYSO0pXWd5aYDA2RHFnLzqN((xkYazA)8lujEy7gUySh0gjutEi)WgyiPRVq4F7pZjJgaQ2rcALNXZp)tL0dKSum3jZVXKlmpfJfsSN7cXHVHQ83kJmNgVSJ0VDUSkrzsasHQ4mpUoITuc(62k)PNB(C1E9jNtS)KzLLhnTPpSGqp9vudqmTjSFJ8sdUQoEDdZRa24e4bnZHPZbDnLDdRiL1KU5eG0i8prWIqvD3PPcl9L)P3XJY)xosDKLIY5(r3HhTVlFtzwG)CC(7zvofMfauUZ4h6mdDL5hNs1dqhvM2ib6()7h9tZiK0)FodWpmSKlqXxj6pdDqtsZG05g)Fp9DFIV)RkhY24jmF3rXyACuSLEGeJWjx2j)wY82pwtlnbRdfFMhg71qM1IaUFzGR4Sxw1UxVMI0ohO1)d)dXd8ujgWklrCkVyeEv6(wf9wv93vfFxYozQS5oEDu2kF9f)zGZnAzoeQtFkDCfKvnthg7LBo1fzNV(WESCBuSRgh)RU22Jo1z7Lr4nx86g67vHw(tvMm6zEnQGYwWTEUMPYdoLU)KbltefR704SCovuwakEUgtxU(Y64IY7G5aDeND)GYRRIfInNoLN(we)sjRsjzxrpfVwOK6dSBnusDnXsBsuH7bTHjGBPpwGEBONVmH9v13bcWGIU45L5)z5eOyPhcgBtcf7(HKKW7KBzdlPIaEzXPjxiT)pv8vFtCm25coZSrHzDe3YIGvq35rzHRAUFf)BZSFhzGZ8bg06IfxX(PeyV8byffmJRnebMa8ZAFoAGmTRJhp9nZyppHv7CVqe7eIkZQSNivL33CFbAAjPVXgTFgAS4TV3c13IOQs()Z)gtDYxYjXyQv126pq1QuWZERSa)zqAMd)rNVQCL9(8E8kIq36dM5TfuvX1HBCCR9EufgNJstXK3vRWVqD9rZ2f(juKhtxLTHaw(SLvIB2pMgaJn7QGe8sPTejCw2SVNMmatz()cthavV55dyHnOMihWkSwN0tDvfullLqwupalZUxMfvetOGlpiLvrTZz)DC)AI4NXE3yZ0AV25xvQ)6bHttsfjrZ221KjOyJ(RWW(SU(cCKug54h(MH9p753((v38inND69fTzObMH4kPnsQuXCB2zYBS0fE3(n(vgE1HCYWEn6yxVyR8B85bpKDQ8zbh4l32hCVXUkyvsHEtgVepIMSJnXjnC2DmSIiktVKX4MH4HMr))f5zbl5QUTkfVNU9fI34MGWq0AIwefiE2peER)DyhPVXpiKgeO(ZOUgNhNNhVEZSWGiBeHmlUDH9f3Tz1feDzaW0bu(nW(1L2c63iZQzXKJlsRVCP4bHaPUwYRlx(jJHa)yWe(7DGt88Mm(w)uKAYMm(3qUqWA8KzZD)8ILKv(fH5VaZ2hs4IQgKfJzg5xamlFA(q8B(pGmFcyDBM9TFpECKJG1I(4xy5uT(cM3WkqY1dt3H)rVQP)mdtVMZPAJPxpmst)qVhx0F4Ohz8)uJ4V4bmvdQR842oRQhay9mfvqA3S7zhNB842oRoXzTG02zx9SnRz21aYJ5SxpVV(rHtBEwFi40MM99tJ28S6eNBHgT5z3P8tlipMZE186n4XGtBzwD7XRfEuTp)7RK0YSNkD7g0m3naOTZ8UifFCND3Z7E5bXYS6whPfrfTp)7RhklZUdDena02z2Pu0DuMh4z398(44hzh1828rnz8w9UR5fBvoVMskvZBKh9(GAatRY59bXdN5eQ3j2QRj1jg72E77Sn5o426HP9t)JfUVxMgMNuNySn9JnF8duJdCopP8sLI7qM9krAYy6pHVk88JjW)8l0xSEmWMmwUzOtgZR9)K)(KCydOiK1FY4fPbGV7a)jJpGvbmnfTyZS7VFZm45wBiAzpgQreLzcx(rIiQqPfuWYtuWYYr0S9dSxsFPbjmaCFn1ej5U4vCWEpM2m78nZoDZSxUz2Llw2FT)FOYnuhyzRwM1BZSoGiLx0XghRgyMVO6z8dra9fv3i2kyCuIZz14EZBPdSx5YA5IGbadPYoa5ZNAGplSGI8RwXSQytDOCjdDSTK34IjICcRNhhgBC0wq3JLkVoA8aCIxB0UWKCqJWdfcVMHZT42XXWNtv1N0mGgwwkSlKa(wrllnDywXc7mds(A2MIL1JyZPvmj13cAzvcPtvpLr6nyG2hbAKNXFILEylyTsDc2Ox2ksvn9ZMjo9ufNn7STGhcus8DgKe8IoRrDvGDXkBBZBIhLU9KiPMDAwbtn0Yyalv8XUdnvhVGHiXcMFMSZ0uTzk(Bc5740XayH6jg7qSaYuKzOlJ(Al7lOw2grN6LrblORJ5GUcrCfBKpd3lDH6q(aav1nnQCVr7wPHv6YC2COyyEbo9lDYoDdrp7SHrMIQx1xr7k7Yh77APHuxnR)yZnWTKXsbZChO5wpcmxWc)up2Btwk)WqBlLKnL2FUomFAsYsl4sjyOAB(KEDoPcvtPQv3p0gPO9z42pQeIrwKQ3Ez4aQiURtTEWIAivyGcqxQuvWi1RTALwDPTCEvoH0xeliSndYDQAiSwPV5cY57MMjdnegICZKLJL3WxlLFEy1GlB2RSEpQ7zk9vLL7pxcFv2jMESD(jo5BLS9G2Q40tFY2dvZ2wYPrZ9D8vUq7HM3NrtirlJ)B3rV1OR096kMkkoR2OJWfVrIgLEcLxPQulMxRsImvYR6djsRZ09pBoqnTlqloqF(l8(sWbOPn9zWb4ZCM(dnVZSdmp19pwY44NNjDPd32ZpQggEZTqOskDnVzJQduQah22EsSQaFsdNi28iSv(AOUc8u3l8J3MZA3gV44VbGeLc6yxJuRE1JWDwMY2u3A)2Y2EOzgBTnUCIvN5jMjLZT32CcEm2ES2yOMu)RQaUw1IsfqNou5aO9CowcOwDSNH3pCQI6(w8L2POQY0zLGtHn9GEbQPeNPIqyOpgCSuxj9hu75Yr9JAF(zBL3ynmr35ZziyPX9h3IS9zcH2EnRv2TMjVqDCU1mEHw16UskzdNPb6YRYxj5W7zCV0wlcIfjudu5btK8fqM5Ew3HS2st80ZkFO5iwY3wDhIkTUq(AeiTEnlxYbMzuTlCBLB96dzpfj)oXEFQ25b5(EosDdeSFCk7S6ltHc3oadHu4JIXRgrtHU(JAo16WFj0dSsLUqbF5D2o0y5iDmpKc3y46ZRG55L7fZCJurAy7oCcYuTHJFWEDuuA9TVxHCTDGjQKJABhQZu00DKpEYwBTwqAo5fn3aFRVB(1RXF6pGep)oRdLRPB7u80C04yXy(yw1QdrXEFcgE7BBe8R5PaOnNWbZhDGT6eki4pFhp5an5s6oRcT2FN7xRaIOVLRJFl9Ny7efifKwcl3Jx1a7c6VJolLYYt8TlGyKjZTExnZFt9F)P5DtGiFRvTX7uHmKTl)nhm7bCH0UfaBDX8bUw0pWvz2AFaFyRgK02FDv8YkSxPIXgRCP29sif5Y6lSawmS(N91BzqnF2G2Ixyf27tylkKeDpW7XRCbLKFCXL22Y6iNluR0XA1o170EDFTDeSjr)5b3mgvrx34E(H0YUS9K2mDvYHsj(3OLoAZ5sEp0D4eMYl2b6wopXwcEgllVujcmghzhEnr85Teo6kwVe1TFV(iSYQvtwG9JAR8tJxweuN68k3TLLfQrbABSUYmGw(kOWGQI4stZ8J(IKOQosMy7A)YxVEjQ)QxxxDMStqg(EAxO(qn)wAxTYA2QzbxVtqxTzkfkkYsjjy4IIC6GAmS(7hEDveA)WgHvP6BhEN1PzRxLTNMR(oMxxnAEQrM6Y1GUxQQMJg)M8ACajRIFzWj(714S8DWt(cmxMnqxD3XKHNj0EqdFTAkv(cNaoIdO(lTITR0K)Y7AtvC(mxCgeSw0XpVnvNgtZNxsVHnZPDCjV9fam)ozUTk3Xf7EAvf0Cx2)lvHN7QcsM4E2QdOHVjkNmMDFKxHF)8s3Il(LYOfWvYDY0Lm0RDU4WlJOK68Vqxxi6pBHHTHvUY6QSyjXjFRQnrtQqjLRUXV83zeIXVQYl1xAd3qNyuH()PyAZGWuqEhILM)c7xB1rRIDjETQnXpua65i74h5OiSTDsKlMHPc3AoIOkFroQURGKhyLnv56C)9ijzjzSzedEU46YOB6Mx6x9o20L0KQcKACWYVN85cGmRvhVoqOId0wQrykwPfncV)sJ4rxJWwlbqyNcHswwkZf(aZc9VsewBNiWoJ2GD3Te)K4OmTnLypDe3vYxS0xw1u81YBuebEQYe5zBIA(YuPLPWwktC91jUcusF9DxL(Nl5Lh)w9ltwQVCKQavudWX3l5AhJ2VJXRGS804zSNq7Op39sMzs4V1ArFzi8B(2t7Pw4RwucLDluxtYSRciHl7JZTUswYECDNxQ2fdTxFzgpZkwAIafbO1ZjSOr54LcLl)SToj2rSK)WnVvJ4jX0)vxldItatcsEnSLPqG)uybPSQ76XrBQ1SmsSNhRtv)kBibOsLE1X1ysmQf2tNdlR4S2mTAVDVauwXzlUn71wJALq3oTYyN1EjBDNJXaoP4crbtmy7Qz9DALxMVrl14KfUgpUy17J7v8HwEGXcJVmyXryhhkpqznpbz(B0DiYEj7uK9sLw)a2wtz7(T5XcRU)yADG4kBxWNaEuptdwKtdJvAoNwenL9ZtX3AzS3DzLirmrBh3AZyLpNS0MDu9oeux7oKAutEC0LfKPSS2A0VIScStfShIh0f8LoiN7IhRPaYYQxFfVapnIzKqYc65g6dRtsbHZs(PlITmyHjXPs3fmmGpGPnrlPEMjgfi767yhVejF)sVz1Aekrg2teHn)kAlXrr31WA7NQcT1orqDox2LvAqnLtVuvxJJtNhKBUdTLr8ETePkE0HLqk1qTUdJmeFbrDi2xbXdLr2TGAnYOQo)g9t9JUMvRfPJVHW2lw4N4Vii)okOIwvLhViDLH2ng2vnwKCj7AD0QhM8gl3AN(tzQivRw9hDfID7OEnVSiBnEVVj7UNuV3eU3i)I8RIb12XbRlc9rI(DP(RypCY)j]] )