You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2557 lines
108 KiB

-- ShamanElemental.lua
-- October 2022
if UnitClassBase( "player" ) ~= "SHAMAN" then return end
local addon, ns = ...
local Hekili = _G[ addon ]
local class, state = Hekili.Class, Hekili.State
local GetWeaponEnchantInfo = GetWeaponEnchantInfo
local spec = Hekili:NewSpecialization( 262 )
spec:RegisterResource( Enum.PowerType.Maelstrom )
spec:RegisterResource( Enum.PowerType.Mana )
-- Talents
spec:RegisterTalents( {
aftershock = { 81000, 273221, 1 }, -- Earth Shock, Elemental Blast, and Earthquake have a 25% chance to refund all Maelstrom spent.
ancestral_defense = { 81083, 382947, 1 }, -- Increases Leech and Avoidance by 2%.
ancestral_guidance = { 81102, 108281, 1 }, -- For the next 10 sec, 25% of your damage and healing is converted to healing on up to 3 nearby injured party or raid members.
ancestral_wolf_affinity = { 80982, 382197, 1 }, -- Cleanse Spirit, Wind Shear, Purge, and totem casts no longer cancel Ghost Wolf.
ascendance = { 81003, 114050, 1 }, -- Transform into a Flame Ascendant for 15 sec, replacing Chain Lightning with Lava Beam, removing the cooldown on Lava Burst, and increasing the damage of Lava Burst by an amount equal to your critical strike chance. When you transform into the Flame Ascendant, instantly cast a Lava Burst at all enemies affected by your Flame Shock, and refresh your Flame Shock durations to 18 sec.
astral_bulwark = { 81056, 377933, 1 }, -- Astral Shift reduces damage taken by an additional 15%.
astral_shift = { 81057, 108271, 1 }, -- Shift partially into the elemental planes, taking 40% less damage for 12 sec.
brimming_with_life = { 81085, 381689, 1 }, -- While Reincarnation is off cooldown, your maximum health is increased by 8%. While you are at full health, Reincarnation cools down 75% faster.
call_of_fire = { 81011, 378255, 1 }, -- Increases the damage of your Flame Shock, Lava Burst, Lava Beam, and Fire Elemental by 10%.
call_of_the_elements = { 81090, 383011, 1 }, -- Reduces the cooldown of Call of the Elements by 60 sec.
call_of_thunder = { 80987, 378241, 1 }, -- Increases the damage of your Lightning Bolt, Chain Lightning, and Storm Elemental by 15%.
capacitor_totem = { 81071, 192058, 1 }, -- Summons a totem at the target location that gathers electrical energy from the surrounding air and explodes after 2 sec, stunning all enemies within 9 yards for 3 sec.
chain_heal = { 81063, 1064 , 1 }, -- Heals the friendly target for 3,305, then jumps to heal the 3 most injured nearby allies. Healing is reduced by 30% with each jump.
chain_lightning = { 81061, 188443, 1 }, -- Hurls a lightning bolt at the enemy, dealing 1,448 Nature damage and then jumping to additional nearby enemies. Affects 5 total targets. Generates 4 Maelstrom per target hit.
cleanse_spirit = { 81075, 51886 , 1 }, -- Removes all Curse effects from a friendly target.
creation_core = { 81090, 383012, 1 }, -- Call of the Elements affects an additional totem.
deeply_rooted_elements = { 81003, 378270, 1 }, -- Casting Lava Burst has a 7% chance to activate Ascendance for 6.0 sec. Ascendance Transform into a Flame Ascendant for 15 sec, replacing Chain Lightning with Lava Beam, removing the cooldown on Lava Burst, and increasing the damage of Lava Burst by an amount equal to your critical strike chance. When you transform into the Flame Ascendant, instantly cast a Lava Burst at all enemies affected by your Flame Shock, and refresh your Flame Shock durations to 18 sec.
earth_elemental = { 81064, 198103, 1 }, -- Calls forth a Greater Earth Elemental to protect you and your allies for 1 min. While this elemental is active, your maximum health is increased by 15%.
earth_shield = { 81106, 974 , 1 }, -- Protects the target with an earthen shield, increasing your healing on them by 20% and healing them for 1,158 when they take damage. This heal can only occur once every few seconds. Maximum 9 charges. Earth Shield can only be placed on one target at a time. Only one Elemental Shield can be active on the Shaman.
earth_shock = { 80984, 8042 , 1 }, -- Instantly shocks the target with concussive force, causing 3,791 Nature damage.
earthgrab_totem = { 81082, 51485 , 1 }, -- Summons a totem at the target location for 30 sec. The totem pulses every 2 sec, rooting all enemies within 9 yards for 8 sec. Enemies previously rooted by the totem instead suffer 50% movement speed reduction.
earthquake = { 80985, 61882 , 1 }, -- Causes the earth within 8 yards of the target location to tremble and break, dealing 2,036 Physical damage over 7 sec and has a 8.0% chance to knock the enemy down.
echo_chamber = { 81013, 382032, 2 }, -- Increases the damage dealt by your Elemental Overloads by 15%.
echo_of_the_elements = { 80999, 333919, 1 }, -- Lava Burst has an additional charge.
echoes_of_great_sundering = { 80991, 384087, 2 }, -- After casting Earth Shock, your next Earthquake deals 60% additional damage. After casting Elemental Blast, your next Earthquake deals 70% additional damage.
electrified_shocks = { 80996, 382086, 1 }, -- Icefury causes your Frost Shocks to damage up to 3 additional enemies and targets hit take 15% increased Nature damage from your spells for 6 sec. Chain Lightning prefers targets with this effect.
elemental_blast = { 80994, 117014, 1 }, -- Harnesses the raw power of the elements, dealing 7,151 Elemental damage and increasing your Critical Strike or Haste by 6% or Mastery by 11% for 10 sec.
elemental_equilibrium = { 80993, 378271, 2 }, -- Dealing direct Fire, Frost, and Nature damage within 10 sec will increase all damage dealt by 7% for 10 sec. This can only occur once every 30 sec.
elemental_fury = { 80983, 60188 , 1 }, -- Your damaging critical strikes deal 250% damage instead of the usual 200%.
elemental_orbit = { 81105, 383010, 1 }, -- Increases the number of Elemental Shields you can have active on yourself by 1. You can have Earth Shield on yourself and one ally at the same time.
elemental_warding = { 81084, 381650, 2 }, -- Reduces all magic damage taken by 2%.
enfeeblement = { 81078, 378079, 1 }, -- When Hex ends, the target is slowed by 70% for 4 sec.
eye_of_the_storm = { 80995, 381708, 2 }, -- Reduces the Maelstrom cost of Earth Shock and Earthquake by 5. Reduces the Maelstrom cost of Elemental Blast by 7.
fire_and_ice = { 81067, 382886, 1 }, -- Increases all Fire and Frost damage you deal by 3%.
fire_elemental = { 80981, 198067, 1 }, -- Calls forth a Greater Fire Elemental to rain destruction on your enemies for 30 sec. While the Fire Elemental is active, Flame Shock deals damage 33% faster, and newly applied Flame Shocks last 100% longer.
flames_of_the_cauldron = { 81010, 378266, 1 }, -- Reduces the cooldown of Flame Shock by 1.5 sec and Flame Shock deals damage 15% faster.
flash_of_lightning = { 80990, 381936, 1 }, -- Casting Lightning Bolt or Chain Lightning reduces the cooldown of your Nature spells by 1.0 sec.
flow_of_power = { 80998, 385923, 1 }, -- Increases the Maelstrom generated by Lightning Bolt and Lava Burst by 2, and their Elemental Overloads by 1.
flurry = { 81059, 382888, 1 }, -- Increases your attack speed by 15% for your next 3 melee swings after dealing a critical strike with a spell or ability.
flux_melting = { 80996, 381776, 1 }, -- Casting Frost Shock increases the damage of your next Lava Burst by 20%.
focused_insight = { 81058, 381666, 2 }, -- Casting Flame Shock reduces the mana cost of your next heal by 10% and increases its healing effectiveness by 15%.
frost_shock = { 81074, 196840, 1 }, -- Chills the target with frost, causing 1,072 Frost damage and reducing the target's movement speed by 50% for 6 sec.
further_beyond = { 81001, 381787, 1 }, -- Casting Earth Shock or Earthquake while Ascendance is active extends the duration of Ascendance by 2.5 sec. Casting Elemental Blast while Ascendance is active extends the duration of Ascendance by 3.5 sec.
go_with_the_flow = { 81089, 381678, 2 }, -- Reduces the cooldown of Spirit Walk by 7.5 sec. Reduces the cooldown of Gust of Wind by 5.0 sec.
graceful_spirit = { 81065, 192088, 1 }, -- Reduces the cooldown of Spiritwalker's Grace by 30 sec and increases your movement speed by 20% while it is active.
greater_purge = { 81076, 378773, 1 }, -- Purges the enemy target, removing 2 beneficial Magic effects.
guardians_cudgel = { 81070, 381819, 1 }, -- When Capacitor Totem fades or is destroyed, another Capacitor Totem is automatically dropped in the same place.
gust_of_wind = { 81088, 192063, 1 }, -- A gust of wind hurls you forward.
healing_stream_totem = { 81100, 5394 , 1 }, -- Summons a totem at your feet for 18 sec that heals an injured party or raid member within 46 yards for 740 every 1.6 sec. If you already know Healing Stream Totem, instead gain 1 additional charge of Healing Stream Totem.
heat_wave = { 80978, 386474, 1 }, -- Casting Primordial Wave triggers Lava Surge immediately and every 3 sec for 12 sec.
hex = { 81079, 51514 , 1 }, -- Transforms the enemy into a frog for 1 min. 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.
icefury = { 80997, 210714, 1 }, -- Hurls frigid ice at the target, dealing 1,404 Frost damage and causing your next 4 Frost Shocks to deal 225% increased damage and generate 8 Maelstrom. Generates 25 Maelstrom.
improved_flametongue_weapon = { 81009, 382027, 1 }, -- Imbuing your weapon with Flametongue increases your Fire spell damage by 5% for 1 hour.
improved_lightning_bolt = { 81098, 381674, 2 }, -- Increases the damage of your Lightning Bolt by 10%.
inundate = { 80986, 378776, 1 }, -- Your successful Purge, Cleanse Spirit, Healing Stream Totem, Hex, and Wind Shear casts generate 8 Maelstrom during combat.
lava_burst = { 81062, 51505 , 1 }, -- Hurls molten lava at the target, dealing 1,456 Fire damage. Lava Burst will always critically strike if the target is affected by Flame Shock. Generates 12 Maelstrom.
lava_surge = { 80979, 77756 , 1 }, -- Your Flame Shock damage over time has a 10% chance to reset the remaining cooldown on Lava Burst and cause your next Lava Burst to be instant.
lightning_lasso = { 81096, 305483, 1 }, -- Grips the target in lightning, stunning and dealing 11,020 Nature damage over 5 sec while the target is lassoed. Can move while channeling.
lightning_rod = { 80992, 210689, 1 }, -- Earth Shock, Elemental Blast, and Earthquake make your target a Lightning Rod for 8 sec. Lightning Rods take 20% of all damage you deal with Lightning Bolt and Chain Lightning.
liquid_magma_totem = { 81008, 192222, 1 }, -- Summons a totem at the target location that erupts dealing 1,532 Fire damage and applying Flame Shock to 3 enemies within 9 yards. Continues hurling liquid magma at a random nearby target every 0.8 sec for 6 sec, dealing 885 Fire damage to all enemies within 9 yards.
maelstrom_weapon = { 81060, 187880, 1 }, -- TODO: When you deal damage with a melee weapon, you have a chance to gain Maelstrom Weapon, stacking up to 5 times. Each stack of Maelstrom Weapon reduces the cast time of your next damage or healing spell by 20%. A maximum of 5 stacks of Maelstrom Weapon can be consumed at a time.
magma_chamber = { 81007, 381932, 2 }, -- Flame Shock damage increases the damage of your next Earth Shock, Elemental Blast, or Earthquake by 0.8%, stacking up to 20 times.
mana_spring_totem = { 81103, 381930, 1 }, -- Summons a totem at your feet for 2 min that restores 33 mana to you and 4 allies nearest to the totem within 35 yards when you cast Lava Burst. Allies can only benefit from one Mana Spring Totem at a time, prioritizing healers.
master_of_the_elements = { 81004, 16166 , 2 }, -- Casting Lava Burst increases the damage or healing of your next Nature, Physical, or Frost spell by 10%.
mountains_will_fall = { 81012, 381726, 1 }, -- Earth Shock, Elemental Blast, and Earthquake can trigger your Mastery: Elemental Overload at 50% effectiveness. Overloaded Earthquakes do not knock enemies down.
natures_fury = { 81086, 381655, 2 }, -- Increases the critical strike chance of your Nature spells by 2%.
natures_guardian = { 81081, 30884 , 2 }, -- When your health is brought below 35%, you instantly heal for 20% of your maximum health. Cannot occur more than once every 45 sec.
natures_swiftness = { 81099, 378081, 1 }, -- Your next healing or damaging Nature spell is instant cast and costs no mana.
oath_of_the_far_seer = { 81002, 381785, 2 }, -- Reduces the cooldown of Ascendance by 45 sec, and you gain 8% additional Haste while Ascendance is active.
planes_traveler = { 81056, 381647, 1 }, -- Reduces the cooldown of Astral Shift by 30 sec and increases its duration by 4 sec.
poison_cleansing_totem = { 81093, 383013, 1 }, -- Summons a totem at your feet that removes 1 poison effect from a nearby party or raid member within 34 yards every 1.5 sec for 9 sec.
power_of_the_maelstrom = { 81015, 191861, 2 }, -- Casting Lava Burst has a 5% chance to cause your next 2 Lightning Bolt or Chain Lightning casts to trigger Elemental Overload an additional time.
primal_elementalist = { 81008, 117013, 1 }, -- Your Earth, Fire, and Storm Elementals are drawn from primal elementals 80% more powerful than regular elementals, with additional abilities, and you gain direct control over them.
primordial_bond = { 80980, 381764, 1 }, -- While you have an elemental active, your damage taken is reduced by 5%.
primordial_fury = { 80982, 378193, 1 }, -- Your healing critical strikes heal for 250% healing instead of the usual 200%.
primordial_wave = { 81014, 375982, 1 }, -- Blast your target with a Primordial Wave, dealing 1,023 Shadow damage and apply Flame Shock to an enemy, or heal an ally for 1,023. Your next Lava Burst will also hit all targets affected by your Flame Shock for 80% of normal damage.
purge = { 81076, 370 , 1 }, -- Purges the enemy target, removing 1 beneficial Magic effect.
refreshing_waters = { 80980, 378211, 1 }, -- Your Healing Surge is 30% more effective on yourself.
rolling_magma = { 80977, 386443, 2 }, -- Lava Burst and Lava Burst Overload damage reduces the cooldown of Primordial Wave by 0.5 sec.
searing_flames = { 81005, 381782, 2 }, -- Flame Shock damage has a 100% chance to generate 1 Maelstrom.
skybreakers_fiery_demise = { 81006, 378310, 1 }, -- Flame Shock damage over time critical strikes reduce the cooldown of your Fire and Storm Elemental by 1.0 sec, and Flame Shock has a 50% increased critical strike chance.
spirit_walk = { 81088, 58875 , 1 }, -- Removes all movement impairing effects and increases your movement speed by 60% for 8 sec.
spirit_wolf = { 81072, 260878, 1 }, -- While transformed into a Ghost Wolf, you gain 5% increased movement speed and 5% damage reduction every 1 sec, stacking up to 4 times.
spiritwalkers_aegis = { 81065, 378077, 1 }, -- When you cast Spiritwalker's Grace, you become immune to Silence and Interrupt effects for 5 sec.
spiritwalkers_grace = { 81066, 79206 , 1 }, -- Calls upon the guidance of the spirits for 15 sec, permitting movement while casting Shaman spells. Castable while casting.
splintered_elements = { 80978, 382042, 1 }, -- Each additional Lava Burst generated by Primordial Wave increases your Haste by 10% for 12 sec.
static_charge = { 81070, 265046, 1 }, -- Reduces the cooldown of Capacitor Totem by 5 sec for each enemy it stuns, up to a maximum reduction of 20 sec.
stoneskin_totem = { 81095, 383017, 1 }, -- Summons a totem at your feet for 15 sec that grants 10% physical damage reduction to you and the 4 allies nearest to the totem within 35 yards.
storm_elemental = { 80981, 192249, 1 }, -- Calls forth a Greater Storm Elemental to hurl gusts of wind that damage the Shaman's enemies for 30 sec. 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 3%, stacking up to 10 times.
stormkeeper_2 = { 80992, 191634, 1 }, -- Charge yourself with lightning, causing your next 2 Lightning Bolts to deal 150% more damage, and also causes your next 2 Lightning Bolts or Chain Lightnings to be instant cast and trigger an Elemental Overload on every target. If you already know Stormkeeper, instead gain 1 additional charge of Stormkeeper.
stormkeeper = { 80989, 191634, 1 }, -- Charge yourself with lightning, causing your next 2 Lightning Bolts to deal 150% more damage, and also causes your next 2 Lightning Bolts or Chain Lightnings to be instant cast and trigger an Elemental Overload on every target. If you already know Stormkeeper, instead gain 1 additional charge of Stormkeeper.
surge_of_power = { 81000, 262303, 1 }, -- TODO: Earth Shock, Elemental Blast, and Earthquake enhance your next spell cast within 15 sec: Flame Shock: The next cast also applies Flame Shock to 1 additional target within 8 yards of the target. Lightning Bolt: Your next cast will cause an additional 2 Elemental Overloads. Chain Lightning: Your next cast will chain to 1 additional target. Lava Burst: Reduces the cooldown of your Fire and Storm Elemental by 6.0 sec. Frost Shock: Freezes the target in place for 6 sec.
surging_shields = { 81092, 382033, 2 }, -- Increases the damage dealt by Lightning Shield by 50% and causes it to generate an additional 2 Maelstrom when triggered. Increases the healing done by Earth Shield by 12%.
swelling_maelstrom = { 81016, 381707, 1 }, -- Increases your maximum Maelstrom by 50.
swirling_currents = { 81101, 378094, 2 }, -- Using Healing Stream Totem increases the healing of your next 3 Healing Surges by 25%.
thunderous_paws = { 81072, 378075, 1 }, -- Ghost Wolf removes snares and increases your movement speed by an additional 25% for the first 3 sec. May only occur once every 60 sec.
thundershock = { 81096, 378779, 1 }, -- Thunderstorm knocks enemies up instead of away and its cooldown is reduced by 5 sec.
thunderstorm = { 81097, 51490 , 1 }, -- Calls down a bolt of lightning, dealing 173 Nature damage to all enemies within 10 yards, reducing their movement speed by 40% for 5 sec, and knocking them away from the Shaman. Usable while stunned.
totemic_focus = { 81094, 382201, 2 }, -- Increases the radius of your totem effects by 15%. Increases the duration of your Earthbind and Earthgrab Totems by 5 sec. Increases the duration of your Healing Stream, Tremor, Poison Cleansing, and Wind Rush Totems by 1.5 sec.
totemic_projection = { 81080, 108287, 1 }, -- Relocates your active totems to the specified location.
totemic_recall = { 81091, 108285, 1 }, -- Resets the cooldown of your most recently used totem with a base cooldown shorter than 3 minutes.
totemic_surge = { 81104, 381867, 2 }, -- TODO: Reduces the cooldown of your totems by 2 sec.
tranquil_air_totem = { 81095, 383019, 1 }, -- Summons a totem at your feet for 20 sec that prevents cast pushback and reduces the duration of all incoming interrupt effects by 50% for you and the 4 allies nearest to the totem within 35 yards.
tremor_totem = { 81069, 8143 , 1 }, -- Summons a totem at your feet that shakes the ground around it for 13 sec, removing Fear, Charm and Sleep effects from party and raid members within 34 yards.
tumultuous_fissures = { 80986, 381743, 1 }, -- Increases the chance for Earthquake to knock enemies down by 3.0%.
unrelenting_calamity = { 80988, 382685, 1 }, -- Reduces the cast time of Lightning Bolt and Chain Lightning by 0.25 sec. Increases the duration of Earthquake by 1 sec.
voodoo_mastery = { 81078, 204268, 1 }, -- Reduces the cooldown of your Hex spell by 15 sec.
wind_rush_totem = { 81082, 192077, 1 }, -- Summons a totem at the target location for 18 sec, continually granting all allies who pass within 10 yards 40% increased movement speed for 5 sec.
wind_shear = { 81068, 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 3 sec.
winds_of_alakir = { 81087, 382215, 2 }, -- Increases the movement speed bonus of Ghost Wolf by 5%. When you have 3 or more totems active, your movement speed is increased by 7%.
windspeakers_lava_resurgence = { 81006, 378268, 1 }, -- When you cast Earth Shock or Elemental Blast, gain Lava Surge and increase the damage of your next Lava Burst by 10%.
} )
-- PvP Talents
spec:RegisterPvpTalents( {
control_of_lava = 728 , -- (204393) Flame Shock's damage occurs 15% more often. If Flame Shock is dispelled, a volcanic eruption wells up beneath the dispeller, exploding for 1,347 Fire damage and knocking them into the air.
counterstrike_totem = 3490, -- (204331) Summons a totem at your feet for 15 sec. Whenever enemies within 20 yards of the totem deal direct damage, the totem will deal 100% of the damage dealt back to attacker.
grounding_totem = 3620, -- (204336) Summons a totem at your feet that will redirect all harmful spells cast within 30 yards on a nearby party or raid member to itself. Will not redirect area of effect spells. Lasts 3 sec.
precognition = 5457, -- (377360) If an interrupt is used on you while you are not casting, gain 15% haste and become immune to control and interrupt effects for 4 sec.
seasoned_winds = 5415, -- (355630) Interrupting a spell with Wind Shear decreases your damage taken from that spell school by 15% for 12 sec.
skyfury_totem = 3488, -- (204330) Summons a totem at your feet for 15 sec that increases the critical effect of damage and healing spells of all nearby allies within 40 yards by 20% for 15 sec.
spectral_recovery = 3062, -- (204261) While in Ghost Wolf, you heal 3% health every 2 sec. Increases the movement speed of Ghost Wolf by an additional 10%.
static_field_totem = 727 , -- (355580) Summons a totem with 10% of your health at the target location for 6 sec that forms a circuit of electricity that enemies cannot pass through.
swelling_waves = 3621, -- (204264) When you cast Healing Surge on yourself, you are healed for 50% of the amount 3 sec later.
tidebringer = 5519, -- (236501) Every 8 sec, the cast time of your next Chain Heal is reduced by 50%, and jump distance increased by 100%. Maximum of 2 charges.
traveling_storms = 730 , -- (204403) Thunderstorm now can be cast on allies within 40 yards, reduces enemies movement speed by 60% and knocks enemies 25% further. Thundershock knocks enemies 100% higher.
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 4 sec. Water Shield: Summons a whirlpool for 6 sec, reducing damage and healing by 50% while they stand within it.
} )
-- 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
},
-- Talent: Transformed into a powerful Fire ascendant. Chain Lightning is transformed into Lava Beam.
-- https://wowhead.com/beta/spell=114050
ascendance = {
id = 114050,
duration = 15,
max_stack = 1,
copy = { 114051, 114052 }
},
-- Talent: Damage taken reduced by $w1%.
-- https://wowhead.com/beta/spell=108271
astral_shift = {
id = 108271,
duration = 8,
max_stack = 1
},
-- Haste increased by $w1%.
-- https://wowhead.com/beta/spell=2825
bloodlust = {
id = 2825,
duration = 40,
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 = -1,
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 = 9,
dot = "buff",
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 = {
id = 384088,
duration = 25,
max_stack = 1,
copy = 336217
},
-- 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
},
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 = 6,
type = "Magic",
max_stack = 1
},
elemental_blast_critical_strike = {
id = 118522,
duration = 10,
type = "Magic",
max_stack = 1,
},
elemental_blast_haste = {
id = 173183,
duration = 10,
type = "Magic",
max_stack = 1,
},
elemental_blast_mastery = {
id = 173184,
duration = 10,
type = "Magic",
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,
},
-- 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 = 198067,
duration = -1,
type = "Magic",
max_stack = 1
},
-- Suffering $w2 Fire damage every $t2 sec.
-- https://wowhead.com/beta/spell=188389
flame_shock = {
id = 188389,
duration = 18,
tick_time = function() return 2 * haste * ( talent.flame_of_the_cauldron.enabled and 0.85 or 1 ) end,
type = "Magic",
max_stack = 1
},
-- Each of your weapon attacks causes up to ${$max(($<coeff>*$AP),1)} additional Fire damage.
-- https://wowhead.com/beta/spell=319778
flametongue_weapon = {
id = 319778,
duration = 3600,
max_stack = 1
},
-- Talent: Attack speed increased by $w1%.
-- https://wowhead.com/beta/spell=382889
flurry = {
id = 382889,
duration = 15,
max_stack = 3
},
-- 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: The mana cost of your next heal is reduced by $w1% and its effectiveness is increased by $?s137039[${$W2}.1][$w2]%.
-- https://wowhead.com/beta/spell=381668
focused_insight = {
id = 381668,
duration = 12,
max_stack = 1
},
-- Talent: Movement speed reduced by $s2%.
-- https://wowhead.com/beta/spell=196840
frost_shock = {
id = 196840,
duration = 6,
type = "Magic",
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 = -1,
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
},
-- Talent: Frost Shock damage increased by $w2%.
-- https://wowhead.com/beta/spell=210714
icefury = {
id = 210714,
duration = 25,
type = "Magic",
max_stack = 4
},
-- 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
},
-- 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 = 8,
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
},
-- 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:
-- https://wowhead.com/beta/spell=381930
mana_spring_totem = {
id = 381930,
duration = 120,
type = "Magic",
max_stack = 1
},
-- 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 = -1,
type = "Magic",
max_stack = 1
},
-- Heals $w1 damage every $t1 seconds.
-- https://wowhead.com/beta/spell=280205
pack_spirit = {
id = 280205,
duration = -1,
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
},
-- Talent: Lightning Bolt 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
},
-- Talent: Primordial Wave
primordial_wave = {
id = 375986,
duration = 15,
max_stack = 1,
},
-- 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 = 382042,
duration = 12,
max_stack = 10
},
-- 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 = -1,
type = "Magic",
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 = {
id = 320137,
duration = 15,
type = "Magic",
max_stack = 2,
copy = 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,
},
-- 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
},
-- Talent: Movement speed increased by $378075s1%.
-- https://wowhead.com/beta/spell=378076
thunderous_paws = {
id = 378076,
duration = 3,
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,
},
wind_gust = {
id = 263806,
duration = 30,
max_stack = 20
},
-- 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 = 15,
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
},
} )
local ancestral_wolf_affinity_spells = {
cleanse_spirit = 1,
wind_shear = 1,
purge = 1,
-- TODO: List totems?
}
spec:RegisterStateExpr( "recall_totem_1", function()
return recallTotem1
end )
spec:RegisterStateExpr( "recall_totem_2", function()
return recallTotem2
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 debuff.elemental_equilibrium_debuff.down then
local ability = class.abilities[ action ]
if ability and ability.startsCombat and ability.school then
if ability.school == "fire" then last_ee_fire = query_time
elseif ability.school == "frost" then last_ee_frost = query_time
elseif ability.school == "nature" then last_ee_nature = query_time end
if max( last_ee_fire, last_ee_frost, last_ee_nature ) - min( last_ee_fire, last_ee_frost, last_ee_nature ) < 10 then
applyBuff( "elemental_equilibrium" )
applyDebuff( "player", "elemental_equilibrium_debuff" )
end
end
end
end )
-- Pets
spec:RegisterPet( "primal_storm_elemental", 77942, "storm_elemental", function() return 30 * ( 1 + ( 0.01 * conduit.call_of_flame.mod ) ) end )
spec:RegisterTotem( "greater_storm_elemental", 1020304 ) -- Texture ID
spec:RegisterPet( "primal_fire_elemental", 61029, "fire_elemental", function() return 30 * ( 1 + ( 0.01 * conduit.call_of_flame.mod ) ) end )
spec:RegisterTotem( "greater_fire_elemental", 135790 ) -- Texture ID
spec:RegisterPet( "primal_earth_elemental", 61056, "earth_elemental", 60 )
spec:RegisterTotem( "greater_earth_elemental", 136024 ) -- Texture ID
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,
mana_spring_totem = 1,
poison_cleansing_totem = 1,
skyfury_totem = 1,
stoneskin_totem = 1,
tranquil_air_totem = 1,
tremor_totem = 1,
wind_rush_totem = 1,
}
local recallTotem1
local recallTotem2
local fireDamage, frostDamage, natureDamage = 0, 0, 0
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
--[[ Tier 28
elseif summon.extends and state.set_bonus.tier28_4pc > 0 and subtype == "SPELL_ENERGIZE" and ( spellID == 51505 or spellID == 285466 ) then
summon.expires = summon.expires + 1.5
summon.duration = summon.duration + 1.5 ]]
-- 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 subtype == "SPELL_CAST_SUCCESS" then
-- Reset in case we need to deal with an instant after a hardcast.
vesper_last_proc = 0
local ability = class.abilities[ spellID ]
local key = ability and ability.key
if key and recall_totems[ key ] then
recallTotem2 = recallTotem1
recallTotem1 = key
end
end
if ( subtype == "SPELL_DAMAGE" or subtype == "SPELL_PERIODIC_DAMAGE" ) and state.talent.elemental_equilibrium.enabled then
if bit.band( school, 4 ) == 1 then fireDamage = GetTime() end
if bit.band( school, 16 ) == 1 then frostDamage = GetTime() end
if bit.band( school, 8 ) == 1 then natureDamage = 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:RegisterStateExpr( "last_ee_fire", function ()
return fireDamage
end )
spec:RegisterStateExpr( "last_ee_frost", function ()
return frostDamage
end )
spec:RegisterStateExpr( "last_ee_nature", function ()
return natureDamage
end )
spec:RegisterTotem( "liquid_magma_totem", 971079 )
spec:RegisterTotem( "tremor_totem", 136108 )
spec:RegisterTotem( "wind_rush_totem", 538576 )
spec:RegisterTotem( "vesper_totem", 3565451 )
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
} ) )
-- Tier 29
spec:RegisterGear( "tier29", 200396, 200398, 200400, 200401, 200399 )
spec:RegisterSetBonuses( "tier29_2pc", 393688, "tier29_4pc", 393690 )
-- 2-Set: - https://www.wowhead.com/beta/spell=393688
-- 4-Set: - https://www.wowhead.com/beta/spell=393690
spec:RegisterAuras( {
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 )
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 buff.flametongue_weapon.down and ( now - action.flametongue_weapon.lastCast < 1 ) then applyBuff( "flametongue_weapon" ) 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.heat_wave.enabled and query_time - action.primordial_wave.lastCast < 12 then
local expires = action.primordial_wave.lastCast + 12
while expires > query_time do
state:QueueAuraEvent( "heat_wave", TriggerHeatWave, expires, "AURA_PERIODIC" )
expires = expires - 3
end
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 )
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,
},
-- Talent: Transform into a Flame Ascendant for $d, replacing Chain Lightning with Lava Beam, removing the cooldown on Lava Burst, and increasing the damage of Lava Burst by an amount equal to your critical strike chance. When you transform into the Flame Ascendant, instantly cast a Lava Burst at all enemies affected by your Flame Shock, and refresh your Flame Shock durations to $188389d.
ascendance = {
id = function()
if state.spec.elemental then return 114050 end
if state.spec.enhancement then return 114051 end
return 114052
end,
cast = 0,
cooldown = function () return 180 - 30 * talent.oath_of_the_far_seer.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" )
if state.spec.elemental and dot.flame_shock.up then dot.flame_shock.expires = query_time + class.auras.flame_shock.duration
elseif state.spec.enhancement and talent.static_accumulation.enabled then
for i = 1, class.auras.ascendance.duration do
state:QueueAuraEvent( "ascendance", TriggerStaticAccumulation, query_time + i, "AURA_PERIODIC" )
end
end
end,
copy = { 114050, 114051, 114052 }
},
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,
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 = 2825,
cast = 0,
cooldown = 300,
gcd = "off",
school = "nature",
spend = 0.215,
spendType = "mana",
startsCombat = false,
toggle = "cooldowns",
handler = function ()
applyBuff( "bloodlust" )
applyDebuff( "player", "sated" )
stat.haste = state.haste + 0.4
end,
},
-- 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 - 2 * 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 $<jumps> 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.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.natures_swiftness.up and 0 or 0.3 end,
spendType = "mana",
talent = "chain_heal",
startsCombat = false,
handler = function ()
removeBuff( "focused_insight" )
removeBuff( "chains_of_devastation_ch" )
removeBuff( "natures_swiftness" ) -- TODO: Determine order of instant cast effect consumption.
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.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 ) )
end,
cooldown = 0,
gcd = "spell",
school = "nature",
spend = function () return buff.natures_swiftness.up and 0 or 0.01 end,
spendType = "mana",
talent = "chain_lightning",
startsCombat = true,
nobuff = "ascendance",
bind = "lava_beam",
handler = function ()
removeBuff( "chains_of_devastation_cl" )
removeBuff( "natures_swiftness" )
removeBuff( "master_of_the_elements" )
if legendary.chains_of_devastation.enabled then
applyBuff( "chains_of_devastation_ch" )
end
-- 4 MS per target, direct.
-- 3 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
gain( ( buff.stormkeeper.up and 4 + ( min( (buff.surge_of_power.up and 6 or 5),active_enemies ) * 3) or 4 ) * min( (buff.surge_of_power.up and 6 or 5), active_enemies ), "maelstrom" )
if buff.power_of_the_maelstrom.up then
gain( 3 * min( ( buff.surge_of_power.up and 6 or 5 ), active_enemies ), "maelstrom" )
end
removeStack( "stormkeeper" )
removeStack( "power_of_the_maelstrom" )
removeBuff( "surge_of_power" )
if pet.storm_elemental.up then
addStack( "wind_gust", nil, 1 )
end
if talent.flash_of_lightning.enabled then flash_of_lightning() 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,
},
-- Talent: Removes all Curse effects from a friendly target.
cleanse_spirit = {
id = 51886,
cast = 0,
cooldown = 8,
gcd = "spell",
school = "nature",
spend = 0.065,
spendType = "mana",
talent = "cleanse_spirit",
startsCombat = false,
toggle = "interrupts",
buff = "dispellable_curse",
handler = function ()
removeBuff( "dispellable_curse" )
if time > 0 and talent.inundate.enabled then gain( 8, "maelstrom" ) end
end,
},
counterstrike_totem = {
id = 204331,
cast = 0,
cooldown = function () return 45 - 2 * talent.totemic_surge.rank end,
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 )
if conduit.vital_accretion.enabled then
applyBuff( "vital_accretion" )
health.max = health.max * ( 1 + ( conduit.vital_accretion.mod * 0.01 ) )
end
end,
usable = function ()
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.1,
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, 9 )
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() return talent.lightning_rod.enabled and "lightning_rod" or nil end,
handler = function ()
removeBuff( "master_of_the_elements" )
removeBuff( "magma_chamber" )
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" )
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.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 + 2.5 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 - 2 * talent.totemic_surge.rank end,
gcd = "totem",
school = "nature",
spend = 0.025,
spendType = "mana",
startsCombat = false,
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 60 - 2 * 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 $<damage> Physical damage over $d and has a $?s381743[${$77478s2+$381743S1)}.1][$77478s2]% chance to knock the enemy down.
earthquake = {
id = 61882,
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,
handler = function ()
removeBuff( "echoes_of_great_sundering" )
removeBuff( "master_of_the_elements" )
removeBuff( "magma_chamber" )
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 + 2.5 end
if talent.windspeakers_lava_resurgence.enabled then
addStack( "lava_surge" )
gainCharges( "lava_burst", 1 )
applyBuff( "windspeakers_lava_resurgence" )
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,
},
-- 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.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() return talent.lightning_rod.enabled and "lightning_rod" or nil end,
handler = function ()
removeBuff( "master_of_the_elements" )
applyBuff( "elemental_blast" )
removeBuff( "magma_chamber" )
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" )
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
--TODO: increase ascendance duration by 3.5 seconds
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 = 188389,
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 / 3 end,
handler = function ()
applyDebuff( "target", "flame_shock" )
if talent.focused_insight.enabled then applyBuff( "focused_insight" ) end
if talent.magma_chamber.enabled then addStack( "magma_chamber", nil, 1 ) 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,
},
-- Imbue your $?s33757[off-hand ][]weapon with the element of Fire for $319778d, causing each of your attacks to deal ${$max(($<coeff>*$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" )
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,
handler = function ()
removeBuff( "master_of_the_elements" )
applyDebuff( "target", "frost_shock" )
if talent.flux_melting.enabled then applyBuff( "flux_melting" ) end
if buff.icefury.up then
gain( 8, "maelstrom" )
removeStack( "icefury", 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.2,
spendType = "mana",
talent = "greater_purge",
startsCombat = function()
if talent.elemental_equilibrium.enabled then return false end
return true
end,
toggle = "interrupts",
debuff = "dispellable_magic",
handler = function ()
removeDebuff( "target", "dispellable_magic" )
end,
},
grounding_totem = {
id = 204336,
cast = 0,
cooldown = function () return 30 - 2 * 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 = function() return 30 - 5 * talent.go_with_the_flow.rank end,
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 - 2 * talent.totemic_surge.rank end,
recharge = 30,
gcd = "totem",
spend = 0.09,
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.natures_swiftness.up then return 0 end
return 1.5 * haste
end,
cooldown = 0,
gcd = "spell",
school = "nature",
spend = function () return buff.natures_swiftness.up and 0 or 0.24 end,
spendType = "mana",
startsCombat = false,
handler = function ()
removeBuff( "focused_insight" )
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 time > 0 and talent.inundate.enabled then gain( 8, "maelstrom" ) end
end,
},
-- 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,
handler = function ()
removeBuff( "master_of_the_elements" )
applyBuff( "icefury", nil, 4 )
gain( 25, "maelstrom" )
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
end,
},
lava_beam = {
id = 114074,
cast = function () return buff.stormkeeper.up and 0 or 1.5 end,
cooldown = 0,
gcd = "spell",
school = "fire",
startsCombat = true,
texture = 236216,
buff = "ascendance",
bind = "chain_lightning",
handler = function ()
gain( ( buff.stormkeeper.up and 4 + ( min( ( buff.surge_of_power.up and 6 or 5 ), active_enemies ) * 3 ) or 4 ) * min( ( buff.surge_of_power.up and 6 or 5 ), active_enemies ), "maelstrom" )
removeStack( "stormkeeper" )
removeBuff( "surge_of_power" )
if talent.flash_of_lightning.enabled then flash_of_lightning() 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.lava_surge.up and 0 or ( 2 * haste ) end,
charges = function () return talent.echo_of_the_elements.enabled and 2 or nil end,
cooldown = function () return buff.ascendance.up and 0 or ( 8 * haste ) end,
recharge = function () return talent.echo_of_the_elements.enabled and ( buff.ascendance.up and 0 or ( 8 * haste ) ) or nil end,
gcd = "spell",
school = "fire",
spend = 0.025,
spendType = "mana",
talent = "lava_burst",
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" )
removeBuff( "lava_surge" )
removeBuff( "flux_melting" )
gain( 10 + ( talent.flow_of_power.rank * 2 ) , "maelstrom" )
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", 6 )
removeBuff( "surge_of_power" )
end
if buff.primordial_wave.up and state.spec.elemental and talent.splintered_elements.enabled then
applyBuff( "splintered_elements", nil, active_dot.flame_shock )
end
removeBuff( "primordial_wave" )
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 () 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.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 ) )
end,
cooldown = 0,
gcd = "spell",
school = "nature",
spend = 0.01,
spendType = "mana",
startsCombat = true,
handler = function ()
gain( ( talent.flow_of_power.enabled and ( buff.stormkeeper.up and 14 or 10 ) + ( buff.surge_of_power.up and 8 or 0 ) ) or ( buff.stormkeeper.up and 11 or 8 ) + ( buff.surge_of_power.up and 6 or 0 ), "maelstrom" )
if buff.power_of_the_maelstrom.up then
gain( talent.flow_of_power.enabled and 4 or 3 , "maelstrom" )
end
removeBuff( "natures_swiftness" )
removeBuff( "master_of_the_elements" )
removeStack( "power_of_the_maelstrom" )
removeBuff( "surge_of_power" )
removeStack( "stormkeeper" )
if pet.storm_elemental.up then
addStack( "wind_gust", nil, 1 )
end
if talent.flash_of_lightning.enabled then flash_of_lightning() 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,
},
-- 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.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 60 - 2 * 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 )
if buff.vesper_totem.up and vesper_totem_dmg_charges > 0 then trigger_vesper_damage() end
end,
},
-- 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 - 2 * 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",
startsCombat = false,
toggle = "cooldowns",
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 - 2 * 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 $sw2 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 an enemy, or $?a137039[heal an ally for $375985s1 and apply Riptide to them][heal an ally for $375985s1]. 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 = 45,
gcd = "spell",
school = "shadow",
spend = 0.03,
spendType = "mana",
talent = function()
if covenant.necrolord then return end
return "primordial_wave"
end,
startsCombat = true,
handler = function ()
applyDebuff( "target", "flame_shock" )
applyBuff( "primordial_wave" )
if talent.heat_wave.enabled then
applyBuff( "lava_surge" )
state:QueueAuraEvent( "heat_wave", TriggerHeatWave, query_time + 3, "AURA_PERIODIC" )
state:QueueAuraEvent( "heat_wave", TriggerHeatWave, query_time + 6, "AURA_PERIODIC" )
state:QueueAuraEvent( "heat_wave", TriggerHeatWave, query_time + 9, "AURA_PERIODIC" )
state:QueueAuraEvent( "heat_wave", TriggerHeatWave, query_time + 12, "AURA_PERIODIC" )
end
end,
copy = 326059
},
-- Talent: Purges the enemy target, removing $m1 beneficial Magic $leffect:effects;.$?(s147762&s51530) [ Successfully purging a target grants a stack of Maelstrom Weapon.][]
purge = {
id = 370,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = 0.1,
spendType = "mana",
talent = "purge",
startsCombat = true,
toggle = "interrupts",
buff = "dispellable_magic",
handler = function ()
removeBuff( "dispellable_magic" )
if time > 0 and talent.inundate.enabled then gain( 8, "maelstrom" ) end
end,
},
skyfury_totem = {
id = 204330,
cast = 0,
cooldown = function () return 40 - 2 * talent.totemic_surge.rank end,
gcd = "totem",
spend = 0.03,
spendType = "mana",
pvptalent = "skyfury_totem",
startsCombat = false,
texture = 135829,
handler = function ()
summonTotem( "skyfury_totem" )
end,
},
-- Talent: Removes all movement impairing effects and increases your movement speed by $58875s1% for $58875d.
spirit_walk = {
id = 58875,
cast = 0,
cooldown = function() return 60 - 7.5 * talent.go_with_the_flow.rank end,
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 - 2 * 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,
charges = function () return ( talent.stormkeeper.enabled and talent.stormkeeper_2.enabled ) and 2 or nil end,
cooldown = 60,
recharge = function()
if talent.stormkeeper.enabled and talent.stormkeeper_2.enabled then return 60 end
end,
gcd = "spell",
school = "nature",
talent = function () return talent.stormkeeper.enabled and "stormkeeper" or talent.stormkeeper_2.enabled and "stormkeeper_2" end,
startsCombat = false,
texture = 839977,
toggle = "cooldowns",
handler = function ()
applyBuff( "stormkeeper", nil, 2 )
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 ()
if target.within10 then applyDebuff( "target", "thunderstorm" ) 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,
toggle = "defensives",
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 for $d that prevents cast pushback and reduces the duration of all incoming interrupt effects by $383020s2% for you and the $s1 allies nearest to the totem within $?s382201[${$s2*(1+$382201s3/100)}][$s2] yards.
tranquil_air_totem = {
id = 383019,
cast = 0,
cooldown = function () return 60 - 2 * talent.totemic_surge.rank end,
gcd = "totem",
school = "nature",
spend = 0.015,
spendType = "mana",
talent = "tranquil_air_totem",
startsCombat = false,
toggle = "interrupts",
handler = function ()
summonTotem( "tranquil_air_totem" )
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 - 2 * 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 - 2 * talent.totemic_surge.rank end,
gcd = "totem",
school = "nature",
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
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 = {
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 = "|T135855:0|t Icefury and |T839977:0|t Stormkeeper Padding",
desc = "The default priority tries to avoid wasting |T839977:0|t Stormkeeper and |T135855:0|t Icefury stacks with a grace period of 1.1 GCD per stack.\n\n" ..
"Increasing this number will reduce the likelihood of wasted Icefury / Stormkeeper stacks due to other procs taking priority, and leave you with more time to react.",
type = "range",
min = 1,
max = 2,
step = 0.01,
width = "full"
} )
spec:RegisterOptions( {
enabled = true,
aoe = 3,
nameplates = false,
nameplateRange = 8,
damage = true,
damageDots = true,
damageExpiration = 8,
potion = "potion_of_spectral_intellect",
package = "Elemental",
} )
spec:RegisterPack( "Elemental", 20221105, [[Hekili:TZ1EVnUns8plbf11P3Uo2oBsBpSzp09rlYE9fQ3E3)zjAjkBEwVQEe3CiqF2Vzi1tkrk5yNKDxCOaBtKO48GdN53mCcxoB5hwUWMKqx(lZNoF(SztVyY0PNF5SlwUi52q6YfHeRTK1Wp4t8G)9DUupQFcXfFZTUbeBCgIdsJSG3Ujjjm(VF2zRzjBsxnXkW7SyMxQljHf4BfrCsWF36SLlwLYCtU2F5QUi)fx8DWCgsTGhF5CyAz22uXyPXwlxa0okWH5cu8lYmFNFCAenZChLeg4Nzs9T2q8tYmzXzMKWqxg1Es27jwitepjmIc81ksYF7QZCCbHkjWFDk1q85pJ5CfiDGioH5bu5gQTr7rnH6tw5sT7EwDzR3K4Z8xBeVHrDTX5CvQJZe5xmXoyN)OX83rjrjBQ)87UlNpOfQCJGOvSKcAFA3eV(8OMWPHJ6MQJ0t0UPzya(SS3N9EC54VOwPjWqnP3qJUnZmH5bRojBG)b(4GO8fMBimxCoNW)QR9tOrrPHWYwGtMPfjojUArdOXoMVnWOadlOcNFYm9cI4)7nC2T6lUkoKfXs2rC3sJInwhrSOpdggOdUAgQxk)eBwCcX3I(QlRtUvUbbWkFA0T4GpjxRqITO(24Olui3Dhxpw7fPH3DNvqGlQnR)8iQhH5h)QlM2Goa3rJ2cS1(tN6ZJdlIY559FA2h2fFvCseywyrCDFyP1kYAJahJKiM124(i1j6vpPXudwc1lU(dHn1uWCS2tGrecYx5(guink38mbmuS2(QRM1GnVHcEQImscGpUXkcHc8oXp2jnMjCSiE5eP3mzRpUX7KOuFQtq0A6Kyk1ogL9iIxi4kdmFd2LSzc9ptzHHu7rJlufEW(eG4OAAd1iFtBS0kGIbLgE6iG1bjmHaufEc43K5xjVV889uEg94lc3DNwr4vxD(PJgxAZH7smkDTvA3nFAn7YyWfLxNd606Qdqune)gqnWKbdpEfjG(Sy0Gnr4KbhWnaf9PEmkmfJgRNBNlloUGBsJvuI3RM3p1JHPWLM)T5EJ)NuAyM5Tq8zWPAUicEFJcCDrl6k)5aRFvt1ZE)9aFjP8U3tXw4BOr8n981)ApKVZgMwadaLarz(bm6m8RBcS2MzMIkb43sbDGiuYVfSd(OmZ3g4)vq0LDOLuMjoRatScIpfrJbvDM54IFGGHuwh4tFgoo4BU(RCDZm3YLJKne4jUbRzwzMBOr0tBjbHrmiSKnd8sUJCd9zw3AvUSelmmesL0alJkhJCpAShY5D4X5AbaldgNeWKuBlWNXAJCxe2aTCV1ika8XA3YfXOcpjsQTYxFK1DsYhhDiGmb(OUKTiQdOj3GSIIfxn8qsaO6jECKoi023YvezM)oxtaOGessMjGu1k(qyTJHMMliV)pw8bGr)vWo5dNa2e5zeWMS9wVNBz7ZtkaMJiWH4zmlGzpZlyfGL)SPtNE20zF7zZEX3Cga5Ny8tKxtdsDmmEFACIXBdmUoXW4NbSM3WZNaStwesPwBmg)RrS1m8b)lMnnWy1TvF7V)LV58V81x6VDR4hmmm(qAKpn6uJPp)fgXwruQpOIsM8FcxlRaRWtCF8K5YGGD2gEK1EKc8bWS8hXfWHfAZy(uMzgdQBRemxfZ3YSZFiZhWxGGI9X19zWkDaJNBdynWs(hiWzCYqe1aMzQ4N5BqxH4THP63wKzAtbXeEDlwKJ))ptjBP89HJlq)BTjGYdFVg(UeJ4uFBAekJLHLDPRrvt0T9p4tZdIREG5BcEs1mLBb)PIWX4(mBXMqcmlEeFmBgXoiXJcdIJzICyK0RLPpTYfCX21UVhiD9tVIShvXNZI(X1gkp3CfEV)SvjQrn8al2lQqzkksbGLpaxdj(GWcSqQRTGRH8jTB7VVaSEz(JDbB9WOHugd6OehUIa5cFP8NjuxKyEht6YbauKxMxbfkyHVFnM6eylCznJEScqIY2iJTQnFaiuzjBG9tGQnZ81GUfc3saAfXXE6x(M0O4e9lis5ID1L6GJD0y83G6Tg(dgo73HoFVeIFmh5izhb2y6GSVcaKX5iibUEdm33G8NGZYLupaHqCdUTqvqDCywmQVkTpo2Q6qIpIZSdgDpxsEdbjydQJEuX5SapgZZJc5oKqD5YQRBWUNd6bZ3vIWPyj5N51sO2gJcLqpsqbIpdWfIvYi1cK(kAmAC52ey9B6ZV4Rl8ODlT4B47MNer83(85fV2bKOwqUpD04NqqB1cwCTfflwkSo4KhwWcnVXcriuYoPcp((uhg8mhUFO3HHtIyom0wKNZdSiyETtHXvvGs83cXus5rww7ZFnRTrhtWh1kJpTIgIOivRen3n9YlAKjwaMRRW26hIcqtU8KY41Mwyas9cfB)RITlVHVVO8o4CxfEJRZZfIAMuAeItSPIfQ2db((2IOcxK948rxQLLLvxFoM6K8IPyFRAvJsEDq1VQXmPOswCl9FRSmfzM)BYn08f)uRnnxPfUB4wryvw4((51zrdrpKALOVmhQO4EuIGt0eQ5ERM7khzTlj6Rm4iDNdqRjSAyQR0OQV1c)miNg4BevFTkuGcqzkdvRu30oa6aNXdbNz7vOIZoCvG7NaCYaQrvB4BpeS1WxO3NGwA2kFOrsgRnusoEGIzm)yrE5vRTQFu0hDMQgyPlMosndwWpZ)AGHgPkNO)nZ3ooKcObJ(Qs8S)oLVwHv5RMHqvrYJzjIYV2aVXa2TURIAXg83hvsQcoQbmBK6(aklG2)rcZL9FLb5ONO9Iq9Pp5EZV32MHYcXfNWY2jbW17Yb5xTauLK07c(XftAtkBXYtk(Z1H5JlvcfvbcsnAWMvaTxiVvNBPuDTubQC(D3jL02SAWMRZ2KICot2HqlfJgepFxACXA0goGdE1KCHO8(e(P3qTiCLa6q7DCMx8Z)iY(OXvb)pu1Gmh335wot95wo70spYA3oucN9bkDgnIEZfYE0rc)nIvWITOLjM0h(Uo8r44M(xgEu3ewvDW7ifKY8RsJjCpfTtZsKYKWqa)q0cGyzfGN)opbR(4UH5RUbd38m2(0rwg3FGN7tWWlpTPHb3lRM6WHtsP8h1OmrVgWsi8gMNKjxQbL2F4hrrENpQ3qa87SKB3F4jklCxX6CAfDWM9rqMEbHKRrYx6XY11wMCYXe2W9pVNW4UDMG14bg3MaFSKvemycyeDdliLxNkwqeebHQDFwlzoecci3zhcYnKDRvoSLSG5MH1SGTz28ys59oyJ4S3FR1tgG1QMDNLLqtyY0QIKKIyo5EVflgEOYVS6EL1RS5QPgzQ)QxEyHv4s1pWCD5LFfhgIUWDh524gDxy5Z4lfRcssWDEqAP0bBanS0N37YGmOjJPOvf)c5YsHRzCJZIHNz6W1od0URGIlxCdeFggEzp5(ILl2rI4fZA5IRbVrr8Ah)cXgweTf2ds4(XLliPjBcIwUyrzB)(gSTFxUGpeSxHjbu4)9l8opo3aD5RfD2Bele)ILl6PCcWKyjgyZk(Smb45JY8k5QaN4ZLM4gdvKLX(snyOaiogz5IteUsKszbj7luqwPkabtwDRou)2X03USrzMJkiDR8vXxvYyDwxjjbEpBKMhWMqc1Cx8iO5g2ryKRi1xyIpX12xQqBxZPMEnDDxKQnkpiDaYNFZXMppEMads22Zwcdf5VvNlXpP7xRQLVQs5Is83Ducc0U204CpBQclOQuOLi4tzbxK8LnU0eS3mMZmV7oyF(WtXoZ8uX30Bru4QrzaaLQXMPJRFZ4dS88r0c5H1BrCnUm0iLA8pAe6hZLAudPcJxTk)8)ThpA2JQG22qB)rJa)yUmJAhvWxlZbwgUW(DmB1fhfPEmtfMoP80F4zevG20ZihudW1ITuwWmohkJXQVvRJwdMnSoJRU00SkmzMV6koxOgYnkFYiQg2kWrtk3N2O7qL15Qa4vvpqjX8rUr7AzA28m(gCsjCHvfmmLc7JuV4vxiBEUMvlFkLB9DGhFKJrDDP)aUDX0mZNNzErM5xx5EVREYJpS51hwN9MhhpSGsF0G8op4YCvqbZl6CxHDFQ6WV6gc9whCUcxEt)lHfvUuRcExTYGQih8hOMbS1o5QI(x3CUh59eeLI6ZQsVoHdcRJOvvQjCuxuFuT853CSCudIQjZrhlERr(toWsUitSVzWeR(AC95a8V1OS4FwvC6JzTo3RItEKAvsDvaVP5JY6ZDI6sj2sz0rvJVFlrDx6iz80Tv9sTSuD(VrpnUSZJFOJYB2hjuvbnz8SAXORTETLEnQAysXKyiUrzQcI3vL7oC6wdiJUQ318e)EqtPPpS2kHK9iZI9wVADfvspZEpAaZ2CCNkpzpH7b4H2WG6QkfhJi2Jhqq7s8Csnzce7gaRU2Ygq5(x8Ac1viUUQGWXGZLWmFXu(t7TTm5aoeqMl58r94qswCuvncLzQCWn7zlvwpn0P2AvOKnhshGU3zdPTOeFuEsfpvTgARfz95pvU7TA)sxTbQkq3ZfBSBvxcUc8uTLAr)Q2JCNKQTilCHrOO02Gpfdf1ikA0NsvJuePH0lPfFYdCQ3v1mQCLs(avAMZYSgJTEXUBooLHwv5jrvdP2YexQrnpEjhF8ATZbgUQZ(DRoS5UevLzu8XPOoEObNpemf86IEAvY(7lKUNGEETLEt9Fm61Sy01xRv1VqgjyxLDyFvrp09dBD9H6(DLZ)FB7Q(i8N0umvfks9gLdUjz7BZWj7XMbn(i4fnrvUG6puJhOoP9rpIkxfOTsxhw31QCxbsxESTbv3UdViHNlhARfXQMLw9AlxDDPc(PsaqYihwPfzAQChy37QyxxDsZD04qsD7V4LDEpRwrIQBzv(()(eO9qV1X9XQeRP4kDvwlRRax5B4BFbHwl0xZ)2G5pxZDskxmUyALCuDXWICJ6IdCF4MAuP8AHfPI6e5Vpuz)L5YlxwKz0weZhbMP5vqlYrAR5zpCupvxTXDqlsRgbolVvzLC48D1hK4wMvAeTkdPuqVUU4zfvCzwnvr(1vlFcBKur97KwzklVPUzuhvxpTfHuh(n8A7uL77uzlTquEBVwKhypXabWSNxZ6TP8WvcQ9IiRe407PwQBhoVDCFW248Ah5Cp35T8TvZNkT9tgXO8GpvVwvT3Woa0mF4aAM3pGM5CMtC37YbguWNs3uUI)quYp6b8pfLKoku6q(2MNzipgC5vIExrHBGFOXLjFRWGX9FD23rDThW1vFxX0LC8ubvR2LcFXkLi1s5RmEXItRYH18EJVUPJmn0hwVB2Q(PO0bhnQpgQIBQ)1LH0lEP4MTVPl0I)B5)7]] )