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.
2570 lines
111 KiB
2570 lines
111 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 strformat = string.format
|
|
|
|
local spec = Hekili:NewSpecialization( 262 )
|
|
|
|
spec:RegisterResource( Enum.PowerType.Maelstrom )
|
|
spec:RegisterResource( Enum.PowerType.Mana )
|
|
|
|
-- Talents
|
|
spec:RegisterTalents( {
|
|
-- Shaman
|
|
ancestral_defense = { 92682, 382947, 1 }, -- Increases Leech by 2% and reduces damage taken from area-of-effect attacks 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 = { 81058, 382197, 1 }, -- Cleanse Spirit, Wind Shear, Purge, and totem casts no longer cancel Ghost Wolf.
|
|
astral_bulwark = { 81056, 377933, 1 }, -- Astral Shift reduces damage taken by an additional 20%.
|
|
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_the_elements = { 81090, 383011, 1 }, -- Reduces the cooldown of Totemic Recall by 60 sec.
|
|
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.
|
|
creation_core = { 81090, 383012, 1 }, -- Totemic Recall affects an additional totem.
|
|
earth_elemental = { 81064, 198103, 1 }, -- Calls forth a Greater Earth Elemental to protect you and your allies for 60 sec. 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 7,938 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.
|
|
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.
|
|
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 }, -- During Hex, the target is slowed by 70% and for 6 sec after Hex ends.
|
|
fire_and_ice = { 81067, 382886, 1 }, -- Increases all Fire and Frost damage you deal by 3%.
|
|
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.
|
|
frost_shock = { 81074, 196840, 1 }, -- Chills the target with frost, causing 5,834 Frost damage and reducing the target's movement speed by 50% for 6 sec.
|
|
go_with_the_flow = { 81089, 381678, 2 }, -- Reduces the cooldown of Spirit Walk by 10 sec. Reduces the cooldown of Gust of Wind by 5 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 3,803 every 1.6 sec. If you already know Healing Stream Totem, instead gain 1 additional charge of Healing Stream Totem.
|
|
hex = { 81079, 51514 , 1 }, -- Transforms the enemy into a frog for 60 sec. 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.
|
|
lightning_lasso = { 81096, 305483, 1 }, -- Grips the target in lightning, stunning and dealing 47,198 Nature damage over 5 sec while the target is lassoed. Can move while channeling.
|
|
mana_spring = { 81103, 381930, 1 }, -- Your Lava Burst casts restore 150 mana to you and 4 allies nearest to you within 40 yards. Allies can only benefit from one Shaman's Mana Spring effect at a time, prioritizing healers.
|
|
natures_fury = { 81086, 381655, 2 }, -- Increases the critical strike chance of your Nature spells and abilities 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.
|
|
planes_traveler = { 81056, 381647, 1 }, -- Reduces the cooldown of Astral Shift by 30 sec.
|
|
poison_cleansing_totem = { 81093, 383013, 1 }, -- Summons a totem at your feet that removes all Poison effects from a nearby party or raid member within 34 yards every 1.5 sec for 9 sec.
|
|
purge = { 81076, 370 , 1 }, -- Purges the enemy target, removing 1 beneficial Magic effect.
|
|
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.
|
|
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.
|
|
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%.
|
|
swirling_currents = { 81101, 378094, 2 }, -- Increases the healing done by Healing Stream Totem by 26%.
|
|
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 20 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 740 Nature damage to all enemies within 10 yards, reducing their movement speed by 40% for 5 sec, and knocking them upward. 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 }, -- Reduces the cooldown of your totems by 3 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.
|
|
voodoo_mastery = { 81078, 204268, 1 }, -- Reduces the cooldown of Hex 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 11 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%.
|
|
|
|
-- Elemental
|
|
aftershock = { 81000, 273221, 1 }, -- Earth Shock, Elemental Blast, and Earthquake have a 25% chance to refund all Maelstrom spent.
|
|
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.
|
|
call_of_fire = { 81011, 378255, 1 }, -- Increases the damage of your Flame Shock, Lava Burst, Lava Beam, and Fire Elemental by 10%.
|
|
call_of_thunder = { 80987, 378241, 1 }, -- Increases the damage of your Lightning Bolt, Chain Lightning, and Storm Elemental by 15%.
|
|
chain_heal = { 81063, 1064 , 1 }, -- Heals the friendly target for 15,576, then jumps up to 15 yards 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 7,496 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.
|
|
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_shock = { 80984, 8042 , 1 }, -- Instantly shocks the target with concussive force, causing 18,930 Nature damage.
|
|
earthquake = { 80985, 61882 , 1 }, -- Causes the earth within 8 yards of the target location to tremble and break, dealing 10,556 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 9 sec.
|
|
elemental_blast = { 80994, 117014, 1 }, -- Harnesses the raw power of the elements, dealing 35,711 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%.
|
|
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_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.
|
|
flux_melting = { 80996, 381776, 1 }, -- Casting Frost Shock increases the damage of your next Lava Burst by 20%.
|
|
focused_insight = { 80982, 381666, 1 }, -- Casting Flame Shock reduces the mana cost of your next heal by 20% and increases its healing effectiveness by 30%.
|
|
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.
|
|
icefury = { 80997, 210714, 1 }, -- Hurls frigid ice at the target, dealing 11,912 Frost damage and causing your next 4 Frost Shocks to deal 225% increased damage and generate 14 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.
|
|
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 9,504 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_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 7,219 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 4,169 Fire damage to all enemies within 9 yards.
|
|
maelstrom_weapon = { 81060, 187880, 1 }, -- 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 1.5%, stacking up to 20 times.
|
|
master_of_the_elements = { 81004, 16166 , 2 }, -- Casting Lava Burst increases the damage or healing of your next Nature, Physical, or Frost spell by 20%.
|
|
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.
|
|
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.
|
|
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 }, --
|
|
primordial_fury = { 80982, 378193, 1 }, -- Your healing critical strikes heal for 250% healing instead of the usual 200%.
|
|
primordial_surge = { 80978, 386474, 1 }, -- Casting Primordial Wave triggers Lava Surge immediately and every 3 sec for 12 sec. Lava Surges triggered by Primordial Wave increase the damage of your next Lava Burst by 25%.
|
|
primordial_wave = { 81014, 375982, 1 }, -- Blast your target with a Primordial Wave, dealing 4,383 Shadow damage and apply Flame Shock to an enemy, or heal an ally for 4,383. Your next Lava Burst will also hit all targets affected by your Flame Shock for 80% of normal damage.
|
|
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.
|
|
splintered_elements = { 80978, 382042, 1 }, -- Each additional Lava Burst generated by Primordial Wave increases your Haste by 10% for 12 sec.
|
|
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 = { 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.
|
|
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.
|
|
surge_of_power = { 81000, 262303, 1 }, -- 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.
|
|
swelling_maelstrom = { 81016, 381707, 1 }, -- Increases your maximum Maelstrom by 50.
|
|
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.
|
|
windspeakers_lava_resurgence = { 81006, 378268, 1 }, -- When you cast Earth Shock, Elemental Blast, or Earthquake, 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 = 12,
|
|
max_stack = 1
|
|
},
|
|
-- Haste increased by $w1%.
|
|
-- https://wowhead.com/beta/spell=2825
|
|
bloodlust = {
|
|
id = 2825,
|
|
duration = 40,
|
|
max_stack = 1,
|
|
shared = "player",
|
|
copy = { 32182, "heroism" }
|
|
},
|
|
-- 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 = 60,
|
|
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 = 9,
|
|
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,
|
|
},
|
|
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 = 198067,
|
|
duration = 60,
|
|
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 = 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
|
|
},
|
|
-- 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
|
|
},
|
|
--[[ Removed in 10.0.5 -- 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 = 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
|
|
},
|
|
-- 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
|
|
},
|
|
-- 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 = 60,
|
|
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 = {
|
|
-- 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,
|
|
},
|
|
-- 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,
|
|
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.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
|
|
|
|
--[[ 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,
|
|
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.215,
|
|
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" }
|
|
},
|
|
|
|
-- 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 $<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" )
|
|
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 - 3 * 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 - 3 * 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 60 - 3 * 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" ) 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 - 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 = 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 - 3 * 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 talent.enfeeblement.enabled then applyDebuff( "target", "enfeeblement" ) end
|
|
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" )
|
|
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 - 3 * 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,
|
|
},
|
|
|
|
--[[ 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",
|
|
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 - 3 * 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.primordial_surge.enabled then
|
|
applyBuff( "lava_surge" )
|
|
state:QueueAuraEvent( "primordial_surge", TriggerHeatWave, query_time + 3, "AURA_PERIODIC" )
|
|
state:QueueAuraEvent( "primordial_surge", TriggerHeatWave, query_time + 6, "AURA_PERIODIC" )
|
|
state:QueueAuraEvent( "primordial_surge", TriggerHeatWave, query_time + 9, "AURA_PERIODIC" )
|
|
state:QueueAuraEvent( "primordial_surge", TriggerHeatWave, query_time + 12, "AURA_PERIODIC" )
|
|
end
|
|
end,
|
|
|
|
copy = { 326059, 375982 }
|
|
},
|
|
|
|
|
|
skyfury_totem = {
|
|
id = 204330,
|
|
cast = 0,
|
|
cooldown = function () return 40 - 3 * 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 - 10 * 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 - 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,
|
|
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,
|
|
|
|
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 - 3 * 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 - 3 * 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",
|
|
|
|
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 = 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: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", 20230201, [[Hekili:TZtAZTTrw(Br1uJS0m2uKuwkzNYsBn(iPSxNzsf6SZ3eytWMK9kCWGdrRTuHF7Z79AC2aDdqsqjfN5ljYen6(DFJ(Mr38LBMmNfXV5FmE44Zho68HdgnA8RhF5ntIUFn)MjRz23Ywc)HhZf(VFWH7Y9Iyo4tU3XNnh3Hq)4aB4PRIIwh(3o7SLIOvXZgy77EwOWn2Hfj89SdylIW)T9z3mzwSWj6JE3mR5J)cypxZTHF(YXW2kMpNlxlp0(MjWzh4Vq4aN4Fkz6h8cJd4jt3WzR99sMY9SxX8IsMkctMYwV2rWNpi5tmBeichSoGdW1mw0F9QZw4aivKV3YyUL81FPyXva2bO4aHlCk3XNBvFvd4ESzo85nVRoILRI8eElTcxj4oZX9Cw8IfduFWG5(B8o(e6zCwq0QY)(dpKch8msULFWmru2zFAZhE59r)bhV(4Mp1JnFOnFMR9XFl5tjFczhFLBhhblDk)oEW9jtJeUa3jAf8FGx2piLXCht4G75a6T(OxepiiEnW28xKm1MfgfwW0GZyJWBoaOaax(xxhhSKJOzipkcWVWbR8dJajdR5cqaYP8AxgWbjTaR2FhsOcHTKPU(b0)9oICubIcxlcerByo3YdcTwgWS5VewiSJxnc3(8xc22iMNn)6ll)6ZC89bzR4G7XfFukDNfAZ9MJRoJK)WdeNQ0dIx)Wd2((oi)Q8VhWDzcVWRVyyLZbGoEWTayT9Nt59zHiGtW82VnBd4Ipkmkae8Szooh2ZAgBPL)cROaH9THTDuhzM8ehYTerC3WY)iy2G7xrGfwXAa)Y1mrK0kx9uzpVJdYJbwr(WBv(39yrGfVqRWnIfrE8WkNzMYyXVee7zj)xWjbNnAj)kMp)LHiMhjLwXfCh3I7XDf8WRhF8jOUGJved0waDrWMQWRasVE8dpuDboGgT1moZ96XN26PhcBbOWjF3udh)pC(6KP3dUsa9)uEiyOiW3XbjnfMEaq)kuA0k3i1w)(O6lykYTh2IBH3HhqspehT0psStyB)foyQjz6N)PVKm9DVhS9b7jyiZ5E5FU2pmuiTewD)jgVW2cm1MQlKlB7i(TyXClx2sxMuajxg)1xSl4s9nK2fWtlNb2Y)b0hi8px5BFBY0yK)b)l0sQ0G9p7VbW3KPV337faQUbSFdpbjiWzodq0aKga)9jz)bdnSU03J)sCDW78Xx44Km9wcSJwXGFXXFPWoz6kEa)0Aa86abyCEUaSuSHDh)L23BNlrfkLPLmeLfM77leHEu)Fnb7WpNYaHigqVrGN)uPJWmg53MuJuJEZHZY5ERaFG5xc1tnaECMTrfYw(J)dnTZfHYaYzYkUEAxrCyb(ZlIPABPoWdqmZpz6L1qgkyviqj49Bcrc4laY2k8G1PfCIrOnpS0WBVFgaZuWpleqKEwZbJvH5Emp945(rdkbozgOEJeGgGXfcwAGOU4V6IJt9)O8oV5sduh2sC7iU7gGCi9La26I9qPcbqT(jITiPCuaOPPVesYvjtdboLnfRAVqq7bHHdordrYLmxk4wmBP3tA9GpksTpNcbELc8Td7xcZ(zHP)Om)Ie0(dS2MMfF9qt0N)J(2or2(dIgNzAZN(1jqWVV)FcoN)YrGJ40cfjgC79UVYEUhvRiaucGKpotyd48zU(ZGKYpB4WHNnC03F2Ox)DNnzLGz9z2B5(XlSS(uCyK179T(yKL1pbz9ChvMjW58K1CU9kRt(NbILc8h(FfZ5(wZUV4D)L)87o)p)2l9U9w5Fyzz9L4apEWPwdF1RTcTd4CparIg8)TEPkFOijqc3Ehdvk(mK)tY03ghG)dK)Hk8zbGlCD5qCdrCKXVacb3FZRq(8hW6V8BXGEnOHiIwzqfQEe7ucx451KWqwi)qYdWRjT(qVbXR3IqxO3uZIq7xUmUdKiPV71xD5WxDXFjRas3ZZwoLr0GaM3TVAC2JxauGAcCNwyne4F(qgUWkOY2aqT3CEaM4s1C)1VU4142vpP9JvY098mcrSxah)d0cbKVfZveDFXPv7ToAhETRo)usI5xdZQiMCtcj5Kc7Jy4VI5P)OW7ookt57HcpJW8ffu5nbBjIO)BS2z4MHfvZMj3yrifb8mSKBWw9ZtsMoNdI0WJRjgXZfblxbKwP)1jJTuWGZ1xWGVHOk5RmV(PZCaDhnuTRAJQDLEQ2ZFzPwvqF6H)8GK)Cgfh9lpxAahJyXL5DFwSoHTuUgfEEtwLBto6PNI0co1vCiVprGlrhY)icbOFcVLO7niTCVQU)YJU88C6DxGMAkuDwx9PNw3VsFPTYrtWHTrvE6PggWNUc)tkQ9Azbo408aOg2RyN5YJpoSstblhrfyBn36vdfZDppdfd8MoP0SpZJe8NYI0Axo364gf6vwmA5rXLxE0g6Ec2volQDE9o4PJSOfijq4VNzZ4YsAjyhgLTTREM8QWrwu3PbVdKNKPbm4SYnrvkSEZ0uL4HU6sDz83nQBVHAVdPSvmX0DeSbUsxrtPicKrR2eEd7MnFZP5OnRtdz80ssX0lITBgc8swWfAxGuRX9jRZFyEFaqg7Ynx2dfXRoOxQpxRUj5ij6gGPdjvVM74oLLjb3)yAnsyByusYbMKCsRvYMvWjDhINssCQAHlW3cvsjxQ3WxSqylqiYagFqKRkCW(rBo22FzjZixP2OIivnnIvTiw6L0JVqa)2cYM6hqxWbIfcKqqLwc4At)4ImmRikb8FTgBoc5nEPh9yrDmwiHJYExlodjEhQjXL3CrLsm7JDDrwPJFiWhP2P1(IMJdz8mC31sdvfb2OAAQTqCwG7DribeNifjkXgmGehnNltkP(sQvyaefBtv1SUOrBPMQTx(uKyUiFMipzBX22B9knM)VkN6JDTj5Q7vtDCF7BnU6U(40KC1tvt7Yj97FoVnHjt)xS74PI8X2RQIusVdKUd2LtY3m1NtdN7(0RsZTOvReG5IoRyWF0XLRc9rgInqF7PCJDIeRDkBttMJbAVmpXeyR4L7OGSrVkgnRy1ZeMvpYMrTvqRr6lO1Ot7cz44t6KJJ8Ea10ujL(ivUDT2hb6uamlhLX67Sumgqq3zLQgRk7UfnB1bHPAvxBE4y0THfVBX(1N5IvxDoR3qZ8DI0KuMPiD7piXqof7PiztOK5oa1VOw7zt80GGVngButyz0mTxm(rFqgJzYup)OQDiUvEywOKncvTePFlnMR7bv3BmVUPH0cCBgRFgcWhTfu6AzKFiG(6gF0TdBt09g8rUVHCFIXyUt7Ix2oM1G5RwAxE(27DGQuplVy4X6bWm4z8FbaOMmV0MnGdND89T6D)RIcC8I8uL)L8ACuw6Tyy8cfrYzyWyCvny(RlLtPsg84P7XzWXm9xJeoI)F1uynFOT297sg(Lr)7X)AuLAyoznhlTCvFbyeOinyJKEyZYZEOGf0vyStMwA1trvr5CZzB4ugmLKmQj7)MR((HFJsg2kQWOZh(038JP)95Zfi5cYH9(o3(m)FCYG6h1Cjxjg)7YDydvCL8ISmRmWK2Yw5wAYn6uNVFZ4AJuXOs9ZUXgdgTblJKC1a655GF5ds2XkknBQTzoGeIhJMzyUnJicOp5pqaV8V)re8rtnzWFxjd9RD8o3PY2MQadGF1xOf8u62tYfYm6MxiX2QmXUvX4XsBZlCI)QLl3jkvAsLqlJWQISRs5DZ1pU9aaJvbNRgTfv8THsKMx)34qg5RREzGLL0vk8IVik1YST9DxZ8Oca3g3OBHivHSx1uRch5zmUCs7X7TlXGE5Pvveipdg655mYlQi3tAPgU9wieEPeAArWjSgiA)AXSJHJry6WJT1zfOpwWusJPzuR1misz9yRrRJtlsZyRIll677KuzgG6NW6w57H9ZHHoabHO7e(XyHqde(bGxpUr7k1W51GJlLAjpqECzHYxDuFrzKoiaOLkkfe(4Ik(AKbcHZWjLAhlGtoDr)kbIWBts)mwxVMOwF(U3(sW(eglv2RIEJ)HGjN953U7I(Teu0r1J7TSReTAlMSouuC9CBPOBpy3dTweiXdMZBgnipkSc3BnN78oI7gaYNo(Lgf0TJfDsFtJnKk9o6rSisnf3aKT8sUbMlMt050pM(kbyV7Y97Pqmb9VlRLl1hqcwwWMPedPfnx0cwE)JZhFIQMeFcl)jHv)GWXHMgeCzyAfoBy3JMJl(C7Z)nIvmZpkcDFb5jzSKMveSnW42N2y2PntO5lR)pP27zKNjZjnD5jtxquNok3LDI3m5oEqiS8SlPIXNFZKnSaQJ13m5liveeV9dIsNAHxW85Va)of)Tyb5Qp0h7Wflgi0mQxv4fuXsYR3NbYEY0Xd)B04Kahe98x0wMbVqMStRRltIhw)jJ(6Pfh4Oh7d88h7d81pAhyYN(iX(XJ51YiFqNf4x7oYIVzc9x49Kciya)V)bDRRKUn38w5TAsGyn(A3mPLwsdBITCHvBn)nrG4zVSVkHwHB85kBCLLklg62EAWsbxIc2ntos61qPYQ4X(AnhB1w(RCYDDIckdcDyIbsMEnWDVabRl6fYC9Jc37l1GYkn4fa5Y2urrQgOO1NbGKPhNrTR1jb8r58IghsafuDR(MLpOFr3iL77EeOCDlT)ucz6I104XFNtT)(hpQDl9ERk1UXpYZN1uY)lnuYsb)yMkwouQwuVpPvsvY0hEOq0TLp64KPNsBRM0esM(M8cnx6Bfnz6RsMEb9IPX)Q8(07D5(W0k)r0I04rd7BICVjB(etapmFt3enxnkN(IM3xwFF6i67(xeoryvdZBVjS)oYIH2xeIoByTib31R5bImRlO3DMm)mXMrpqcpGwn0fZ)(s1FYTA0dK990UHX8w(D9f0qHysXCVqOSU0Pkk7PzHPQZrsHXYQZsYwRCBUOWzgEDlAU01xbCXHzst)L8JRXBzbAzJlVSgVTfYSfxXeFRL9qAUx2mftFA3v2CA5vV6el5inVL(xtFssfetJTTIGdT7Wr7XMCfTjNQOG8iDlFqIT6YLTyAeuaUNYzxrjJUUlizsc4K0syRRu4zlf5FAkjE2soLiP6sy9BosAP1RzArAIWFv3j8x1oH)QseED53(SNW3QnoQKR6YSuH4B2ntxzWpJOuj71Lxar60LGyns3ZgKEN4ziQQlLnZOAhNcWwUenkd0Av73cRmecPl5OsZr2)rKVUiVUSBQq2E2GW7e)crt1mnQg2n4IqTmjB3h9rnR01BD0yDr(R4o7Wdi6ILthTyVUwnQbq6V)mYZLP(Nkaf5u(NlaHf6cFYm58rcxiiuxCg6OZ92fSr3U7qmzfMYURTkX1zE156cjXmVQ3OhBZfoY(qviCvxmeDnbFJvLPd573HYkrBqlFamQ6n7W9Mcro0fNHoLGD6kmPMIP5kz0DbxDbv0FmtTX)0PY30ixAlVOvievxyaLr0kh1J8DJY2ru3hneICOlCH0j(RPiIEQUdvAkKi9FwLnjY9MKP0uKCUUiukndAA6M0b66wPMEDXexwMH2c(EegaPm35Mg2AZ0e1GLuaOwTI0GbpCBPOx06gS48W1sXriN9pY8I8PwP)YE2rcLd71d78HvwOO8EawkQmeJ38T08L9epOxQMP3n8T5b9sNnV(CaA2Q5lQNU6AqCtRLTkAmMkkXic(vBL3rAdfSovkQ(eHziuZStS9QFkxABLDEuw)p6mkKD8DYRzLEUx)AHPYJ1C1WuTT9nE9WuzjnEfXqDjPUaAJ87ooxe97L)dkgOM6AD1N6DMsZmPw1gw6GVgvFgUQFe62iL(vQl1TQJF)bTOfTKXL2X65auBNhp1uD0H2gjaIIOlPRdwPM(DcDPlPZvHKSJxepDrGUBnDVn0AlsvmYWSS8yRn3j0Ym5HWhTL195i(C02WP0oNigXSALeBxqVgnYQp0LwtcRE6Zrn0(7(itVt6qYE5dlIYNxnKZheM3s75a35RuyenLPtud9pUpGCLjR5czDmA9EaIsuvoyn5qEZgj1Io16x8tMv9(OZanNUT2g7Q1W)EFzevtSOT6TgzOPSAbZUCdf1u2MgNEmcu2rxL33Z3zpnyOP3gOTM15kzkx7L1J6RJwo((HeDBRlK63k0TDIOn6CjvtNF8NLJKZt1vJuntkMh3XJvhKYTy4RKEv0mpJJshKkTD02mx7r(Mu6PXH2wm9kQRVz2erW)UYvnU2K6uWjIY6pEfostfRTTUuVFT4ACHhg1BVNMK6qcOQeJMB9jQgTARnrVb6QqyEHa7urXuJox0TBlkc30(TkTn9IP)UlK6yuUnE3wu2ZIIyaHQA)6HEEIQN01y63NurObnGSYQVh0MYe8j4sIQgDZC88P0qtddpH(VUSDS8(VwXgM221Aoz5d8fivz6H(liQY55PEjrLjU1rPid0BPK023F3d4vwuBQzDiq0JAk7L6UtBrhTntxD7UpI0zhnOsSWMVdKiwslTxU7wz1MF)56guoJkhpMm(DLjFYHJ3KPX0PGJ6w8eneksuw)23kDY9(sUQnPSEs5HqpDHXyUtehOBcRh9ubisGXzuy)UDS0QmJNlf3qNMKJEySrul7rTdRyxQDxzrKRl1apfiaEmQo6RDmvjUD823sJwx5JMSpUGf70(4S8rCWgcIxhLzveV0LkocSoGWjazKrPFP1(Fipc1bchScajbGKa5cesk2O1OTqYk1UVhukPGT389Qp5JHRfWI3WCOsEUemhRwpGpq7EwK55BOcxxLPxacfgG0nYbQvnolGPChhAQO8fdlWJzo((ZTYACHAqu7h0u6uaIep4weTJmnPi7YPS94moQveEJaJX5v4rayWhcXYYCSOHUkQLXBOfiQXzSOeFGTKIkiqaU7WZsocezpgsF0col3qflGYPqiBvU8iUFG6s0RStaeICf(zQauWbUgib0UCE5d6ooOqhKoexkhxLmN8yrXGXBRWnIfrE8WAW)fLx9AF5)V6s0l63G30XD3B6429MoM6ixiYvIQmrpbXEwY)2cVu7KxTDwEmQxq(Yzyr3h8IP3T6imsoaGS8S9DNXA0fqfNxr(ElJ5wB4S14VPyZdcILJdme(qSON4DVyAI2qe0ocLMYMkoNgk3CR6NqLAeAwgRioHWvcUZ8bOoygNsMLzAPcl90sdDvrrh9dMjIkhVCdXIi3fZ(OAgSkNeydq0XTbqfqt53o3dNj5CIxZIJwHkWteUXo0LeX7cylKp8M)9]] )
|