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.
3304 lines
148 KiB
3304 lines
148 KiB
-- DruidBalance.lua
|
|
-- August 2025
|
|
-- Patch 11.2
|
|
|
|
if UnitClassBase( "player" ) ~= "DRUID" then return end
|
|
|
|
local addon, ns = ...
|
|
local Hekili = _G[ addon ]
|
|
local class, state = Hekili.Class, Hekili.State
|
|
local PTR = ns.PTR
|
|
local spec = Hekili:NewSpecialization( 102 )
|
|
|
|
---- Local function declarations for increased performance
|
|
-- Strings
|
|
local strformat = string.format
|
|
-- Tables
|
|
local insert, remove, sort, wipe = table.insert, table.remove, table.sort, table.wipe
|
|
-- Math
|
|
local abs, ceil, floor, max, sqrt = math.abs, math.ceil, math.floor, math.max, math.sqrt
|
|
|
|
-- Common WoW APIs, comment out unneeded per-spec
|
|
local GetSpellCastCount = C_Spell.GetSpellCastCount
|
|
-- local GetSpellInfo = C_Spell.GetSpellInfo
|
|
-- local GetSpellInfo = ns.GetUnpackedSpellInfo
|
|
-- local GetPlayerAuraBySpellID = C_UnitAuras.GetPlayerAuraBySpellID
|
|
-- local FindUnitBuffByID, FindUnitDebuffByID = ns.FindUnitBuffByID, ns.FindUnitDebuffByID
|
|
-- local IsSpellOverlayed = C_SpellActivationOverlay.IsSpellOverlayed
|
|
local IsSpellKnownOrOverridesKnown = C_SpellBook.IsSpellInSpellBook
|
|
local IsActiveSpell = ns.IsActiveSpell
|
|
|
|
-- Specialization-specific local functions (if any)
|
|
local GetSpellBookItemName = function( index, bookType )
|
|
local spellBank = ( bookType == BOOKTYPE_SPELL ) and Enum.SpellBookSpellBank.Player or Enum.SpellBookSpellBank.Pet;
|
|
return C_SpellBook.GetSpellBookItemName( index, spellBank );
|
|
end
|
|
|
|
spec:RegisterResource( Enum.PowerType.Rage )
|
|
spec:RegisterResource( Enum.PowerType.LunarPower, {
|
|
fury_of_elune = {
|
|
aura = "fury_of_elune_ap",
|
|
|
|
last = function ()
|
|
local app = state.buff.fury_of_elune_ap.applied
|
|
local t = state.query_time
|
|
|
|
return app + floor( ( t - app ) * 2 ) * 0.5
|
|
end,
|
|
|
|
interval = 0.5,
|
|
value = 2.5
|
|
},
|
|
|
|
celestial_infusion = {
|
|
aura = "celestial_infusion",
|
|
|
|
last = function ()
|
|
local app = state.buff.celestial_infusion.applied
|
|
local t = state.query_time
|
|
|
|
return app + floor( ( t - app ) * 2 ) * 0.5
|
|
end,
|
|
|
|
interval = 0.5,
|
|
value = 2.5
|
|
},
|
|
|
|
natures_balance = {
|
|
talent = "natures_balance",
|
|
|
|
last = function ()
|
|
local app = state.combat
|
|
local t = state.query_time
|
|
|
|
return app + floor( ( t - app ) / 2 ) * 2
|
|
end,
|
|
|
|
interval = 3,
|
|
value = 2,
|
|
}
|
|
} )
|
|
spec:RegisterResource( Enum.PowerType.Mana )
|
|
spec:RegisterResource( Enum.PowerType.ComboPoints )
|
|
spec:RegisterResource( Enum.PowerType.Energy )
|
|
|
|
-- Talents
|
|
spec:RegisterTalents( {
|
|
|
|
-- Druid
|
|
aessinas_renewal = { 82232, 474678, 1 }, -- When a hit deals more than $s1% of your maximum health, instantly heal for $s2% of your health. This effect cannot occur more than once every $s3 seconds
|
|
astral_influence = { 82210, 197524, 1 }, -- Increases the range of all of your spells by $s1 yards
|
|
circle_of_the_heavens = { 104078, 474541, 1 }, -- Magical damage dealt by your spells increased by $s1%
|
|
circle_of_the_wild = { 104078, 474530, 1 }, -- Physical damage dealt by your abilities increased by $s1%
|
|
cyclone = { 82229, 33786, 1 }, -- Tosses the enemy target into the air, disorienting them but making them invulnerable for up to $s1 sec. Only one target can be affected by your Cyclone at a time
|
|
feline_swiftness = { 82236, 131768, 1 }, -- Increases your movement speed by $s1%
|
|
fluid_form = { 82246, 449193, 1 }, -- Shred, Rake, and Skull Bash can be used in any form and shift you into Cat Form, if necessary. Mangle can be used in any form and shifts you into Bear Form. Wrath and Starfire shift you into Moonkin Form, if known
|
|
forestwalk = { 82243, 400129, 1 }, -- Casting Regrowth increases your movement speed and healing received by $s1% for $s2 sec
|
|
frenzied_regeneration = { 82220, 22842, 1 }, -- Heals you for $s1% health over $s2 sec, and increases healing received by $s3%
|
|
gale_winds = { 104079, 400142, 1 }, -- Increases Typhoon's radius by $s1% and its range by $s2 yds
|
|
grievous_wounds = { 82239, 474526, 1 }, -- Rake, Rip, and Thrash damage increased by $s1%
|
|
heart_of_the_wild = { 82231, 319454, 1 }, -- Abilities not associated with your specialization are substantially empowered for $s1 sec. Feral: Gain $s2 Combo Point every $s3 sec while in Cat Form and Physical damage increased by $s4%. Guardian: Bear Form gives an additional $s5% Stamina, multiple uses of Ironfur may overlap, and Frenzied Regeneration has $s6 charges. Restoration: Healing increased by $s7%, and mana costs reduced by $s8%
|
|
hibernate = { 82211, 2637, 1 }, -- Forces the enemy target to sleep for up to $s2 sec$s$s3 Any damage will awaken the target. Only one target can be forced to hibernate at a time. Only works on Beasts and Dragonkin
|
|
improved_barkskin = { 104085, 327993, 1 }, -- Barkskin's duration is increased by $s1 sec
|
|
improved_stampeding_roar = { 82230, 288826, 1 }, -- Cooldown reduced by $s1 sec
|
|
incapacitating_roar = { 82237, 99, 1 }, -- Shift into Bear Form and invoke the spirit of Ursol to let loose a deafening roar, incapacitating all enemies within $s1 yards for $s2 sec. Damage may cancel the effect
|
|
incessant_tempest = { 104079, 400140, 1 }, -- Reduces the cooldown of Typhoon by $s1 sec
|
|
innervate = { 100175, 29166, 1 }, -- Infuse a friendly healer with energy, allowing them to cast spells without spending mana for $s1 sec
|
|
instincts_of_the_claw = { 104081, 449184, 1 }, -- Ferocious Bite and Maul damage increased by $s1%
|
|
ironfur = { 82227, 192081, 1 }, -- Increases armor by $s1 for $s2 sec
|
|
killer_instinct = { 82225, 108299, 2 }, -- Physical damage and Armor increased by $s1%
|
|
light_of_the_sun = { 104083, 202918, 1 }, -- Reduces the remaining cooldown on Solar Beam by $s1 sec when it interrupts the primary target
|
|
lingering_healing = { 82240, 231040, 1 }, -- Rejuvenation's duration is increased by $s1 sec. Regrowth's duration is increased by $s2 sec when cast on yourself
|
|
lore_of_the_grove = { 104080, 449185, 1 }, -- Moonfire and Sunfire damage increased by $s1%
|
|
lycaras_inspiration = { 92229, 1232897, 1 }, -- You gain a bonus while in each form inspired by the breadth of your Druidic knowledge: No Form: $s1% Magic Damage Cat Form: $s2% Stamina Bear Form: $s3% Movement Speed Moonkin Form: $s4% Area damage taken reduction
|
|
lycaras_teachings = { 82233, 378988, 2 }, -- You gain $s1% of a stat while in each form: No Form: Haste Cat Form: Critical Strike Bear Form: Versatility Moonkin Form: Mastery
|
|
maim = { 82221, 22570, 1 }, -- Finishing move that causes Physical damage and stuns the target. Damage and duration increased per combo point: $s1 point : $s2 damage, $s3 sec $s4 points: $s5 damage, $s6 sec $s7 points: $s8 damage, $s9 sec $s10 points: $s11 damage, $s12 sec $s13 points: $s14 damage, $s15 sec
|
|
mass_entanglement = { 82207, 102359, 1 }, -- Roots the target and all enemies within $s1 yards in place for $s2 sec. Damage may interrupt the effect. Usable in all shapeshift forms
|
|
matted_fur = { 100177, 385786, 1 }, -- When you use Barkskin or Survival Instincts, absorb $s1 damage for $s2 sec
|
|
mighty_bash = { 82237, 5211, 1 }, -- Invokes the spirit of Ursoc to stun the target for $s1 sec. Usable in all shapeshift forms
|
|
moonkin_form = { 82208, 24858, 1 }, -- Shapeshift into Moonkin Form, increasing the damage of your spells by $s1% and your armor by $s2%, and granting protection from Polymorph effects. While in this form, single-target attacks against you have a $s3% chance to make your next Starfire instant. The act of shapeshifting frees you from movement impairing effects
|
|
natural_recovery = { 82206, 377796, 1 }, -- Healing you receive is increased by $s1%
|
|
natures_vigil = { 82244, 124974, 1 }, -- For $s1 sec, all single-target damage also heals a nearby friendly target for $s2% of the damage done
|
|
nurturing_instinct = { 82214, 33873, 2 }, -- Magical damage and healing increased by $s1%
|
|
oakskin = { 100176, 449191, 1 }, -- Survival Instincts and Barkskin reduce damage taken by an additional $s1%
|
|
perfectlyhoned_instincts = { 104082, 1213597, 1 }, -- Well-Honed Instincts can trigger up to once every $s1 sec
|
|
primal_fury = { 82224, 159286, 1 }, -- While in Cat Form, when you critically strike with an attack that generates a combo point, you gain an additional combo point. Damage over time cannot trigger this effect. Mangle critical strike damage increased by $s1%
|
|
rake = { 82199, 1822, 1 }, -- Rake the target for $s$s3 Bleed damage and an additional $s$s4 Bleed damage over $s5 sec. While stealthed, Rake will also stun the target for $s6 sec and deal $s7% increased damage. Awards $s8 combo point
|
|
rejuvenation = { 82217, 774, 1 }, -- Heals the target for $s1 over $s2 sec
|
|
remove_corruption = { 82241, 2782, 1 }, -- Nullifies corrupting effects on the friendly target, removing all Curse and Poison effects
|
|
renewal = { 82232, 108238, 1 }, -- Instantly heals you for $s1% of maximum health. Usable in all shapeshift forms
|
|
rip = { 82222, 1079, 1 }, -- Finishing move that causes Bleed damage over time. Lasts longer per combo point. $s1 point : $s2 over $s3 sec $s4 points: $s5 over $s6 sec $s7 points: $s8 over $s9 sec $s10 points: $s11 over $s12 sec $s13 points: $s14 over $s15 sec
|
|
soothe = { 82229, 2908, 1 }, -- Soothes the target, dispelling all enrage effects
|
|
stampeding_roar = { 82234, 106898, 1 }, -- Shift into Bear Form and let loose a wild roar, increasing the movement speed of all friendly players within $s1 yards by $s2% for $s3 sec
|
|
starfire = { 82201, 194153, 1 }, -- Call down a burst of energy, causing $s$s3 Arcane damage to the target, and $s$s4 Arcane damage to all other enemies within $s5 yards. Deals reduced damage beyond $s6 targets. Generates $s7 Astral Power
|
|
starlight_conduit = { 100223, 451211, 1 }, -- Wrath, Starsurge, and Starfire damage increased by $s1%
|
|
starsurge = { 82202, 78674, 1 }, -- Launch a surge of stellar energies at the target, dealing $s$s2 Astral damage
|
|
sunfire = { 93714, 93402, 1 }, -- A quick beam of solar light burns the enemy for $s$s3 Nature damage and then an additional $s$s4 Nature damage over $s5 sec to the primary target and all enemies within $s6 yards. Generates $s7 Astral Power
|
|
symbiotic_relationship = { 100173, 474750, 1 }, -- Form a bond with an ally. Your self-healing also heals your bonded ally for $s1% of the amount healed. Your healing to your bonded ally also heals you for $s2% of the amount healed
|
|
thick_hide = { 82228, 16931, 1 }, -- Reduces all damage taken by $s1%
|
|
thrash = { 82223, 106832, 1 }, -- Thrash all nearby enemies, dealing immediate physical damage and periodic bleed damage. Damage varies by shapeshift form
|
|
tiger_dash = { 82198, 252216, 1 }, -- Shift into Cat Form and increase your movement speed by $s1%, reducing gradually over $s2 sec
|
|
typhoon = { 82209, 132469, 1 }, -- Blasts targets within $s1 yards in front of you with a violent Typhoon, knocking them back and reducing their movement speed by $s2% for $s3 sec. Usable in all shapeshift forms
|
|
ursine_vigor = { 100174, 377842, 1 }, -- For $s1 sec after shifting into Bear Form, your health and armor are increased by $s2%
|
|
ursocs_spirit = { 82219, 449182, 1 }, -- Stamina increased by $s1%. Stamina in Bear Form is increased by an additional $s2%
|
|
ursols_vortex = { 82207, 102793, 1 }, -- Conjures a vortex of wind for $s1 sec at the destination, reducing the movement speed of all enemies within $s2 yards by $s3%. The first time an enemy attempts to leave the vortex, winds will pull that enemy back to its center. Usable in all shapeshift forms
|
|
verdant_heart = { 82218, 301768, 1 }, -- Frenzied Regeneration and Barkskin increase all healing received by $s1%
|
|
wellhoned_instincts = { 82235, 377847, 1 }, -- When you fall below $s1% health, you cast Frenzied Regeneration, up to once every $s2 sec
|
|
wild_charge = { 82198, 102401, 1 }, -- Fly to a nearby ally's position
|
|
wild_growth = { 82205, 48438, 1 }, -- Heals up to $s1 injured allies within $s2 yards of the target for $s3 over $s4 sec. Healing starts high and declines over the duration
|
|
|
|
-- Balance
|
|
aetherial_kindling = { 88209, 327541, 1 }, -- Casting Starfall extends the duration of active Moonfires and Sunfires by $s1 sec, up to $s2 sec
|
|
astral_communion = { 88235, 450598, 1 }, -- Increases maximum Astral Power by $s1. Entering Eclipse reduces the Astral Power cost of your next Starsurge or Starfall by $s2
|
|
astral_smolder = { 88204, 394058, 1 }, -- Your Starfire and Wrath damage has a $s1% chance to cause the target to languish for an additional $s2% of your spell's damage over $s3 sec
|
|
astronomical_impact = { 88232, 468960, 1 }, -- The critical strike damage of your Astral spells is increased by $s1%
|
|
balance_of_all_things = { 88214, 394048, 2 }, -- Entering Eclipse increases your critical strike chance with Arcane or Nature spells by $s1%, decreasing by $s2% every $s3 sec
|
|
celestial_alignment = { 88215, 194223, 1 }, -- Celestial bodies align, maintaining both Eclipses and granting $s1% haste for $s2 sec
|
|
convoke_the_spirits = { 88206, 391528, 1 }, -- Call upon the spirits for an eruption of energy, channeling a rapid flurry of $s1 Druid spells and abilities over $s2 sec. You will cast Starsurge, Starfall, Moonfire, Wrath, Regrowth, Rejuvenation, Rake, and Thrash on appropriate nearby targets, favoring your current shapeshift form
|
|
cosmic_rapidity = { 88227, 400059, 2 }, -- Your Moonfire, Sunfire, and Stellar Flare deal damage $s1% more frequently
|
|
crashing_star = { 103847, 468978, 1 }, -- Shooting Stars has a $s2% chance to instead call down a Crashing Star, dealing $s$s3 Astral damage to the target and generating $s4 Astral Power
|
|
denizen_of_the_dream = { 88234, 394065, 1 }, -- Your Moonfire and Sunfire have a chance to summon a Faerie Dragon to assist you in battle for $s1 sec
|
|
eclipse = { 88223, 79577, 1 }, -- Casting $s1 Starfires empowers Wrath for $s2 sec. Casting $s3 Wraths empowers Starfire for $s4 sec. Eclipse (Solar) Nature spells deal $s7% additional damage and Wrath damage is increased by $s8%. Eclipse (Lunar) Arcane spells deal $s11% additional damage and the damage Starfire deals to nearby enemies is increased by $s12%
|
|
elunes_guidance = { 88228, 393991, 1 }, -- Incarnation: Chosen of Elune Reduces the Astral Power cost of Starsurge by $s3, and the Astral Power cost of Starfall by $s4. Convoke the Spirits Cooldown is reduced by $s7% and its duration and number of spells cast is reduced by $s8%. Convoke the Spirits has an increased chance to use an exceptional spell or ability
|
|
force_of_nature = { 88210, 205636, 1 }, -- Summons a stand of $s1 Treants for $s2 sec which immediately taunt and attack enemies in the targeted area. Generates $s3 Astral Power
|
|
fury_of_elune = { 88224, 202770, 1 }, -- Calls down a beam of pure celestial energy that follows the enemy, dealing up to $s$s2 Astral damage over $s3 sec within its area. Damage reduced on secondary targets. Generates $s4 Astral Power over its duration
|
|
hail_of_stars = { 103846, 469004, 1 }, -- Casting a free Starsurge or Starfall grants Solstice for $s1 sec
|
|
harmony_of_the_heavens = { 88218, 450558, 1 }, -- Starsurge or Starfall increase your current Eclipse's Arcane or Nature damage bonus by an additional $s1%, up to $s2%
|
|
incarnation_chosen_of_elune = { 88206, 102560, 1 }, -- An improved Moonkin Form that grants both Eclipses, any learned Celestial Alignment bonuses, and $s1% critical strike chance. Lasts $s2 sec. You may shapeshift in and out of this improved Moonkin Form for its duration
|
|
natures_balance = { 88226, 202430, 1 }, -- While in combat you generate $s1 Astral Power every $s2 sec. While out of combat your Astral Power rebalances to $s3 instead of depleting to empty
|
|
natures_grace = { 88208, 450347, 1 }, -- When Eclipse ends or when you enter combat, enter a Dreamstate, reducing the cast time of your next $s1 Starfires or Wraths by $s2%
|
|
new_moon = { 88224, 274281, 1 }, -- Deals $s$s2 Astral damage to the target and empowers New Moon to become Half Moon. Generates $s3 Astral Power
|
|
orbit_breaker = { 88199, 383197, 1 }, -- Every $s1th Shooting Star calls down a Full Moon at $s2% effectiveness upon its target
|
|
orbital_strike = { 88221, 390378, 1 }, -- Incarnation: Chosen of Elune blasts all enemies in a targeted area for $s$s2 Astral damage and applies Stellar Flare to them. Reduces the cooldown of Incarnation: Chosen of Elune by $s3 sec
|
|
power_of_goldrinn = { 88200, 394046, 1 }, -- Starsurge has a chance to summon the Spirit of Goldrinn, which immediately deals $s$s2 Astral damage to the target
|
|
radiant_moonlight = { 88213, 394121, 1 }, -- New Moon, Half Moon, and Full Moon deal $s1% increased damage. Full Moon becomes Full Moon once more before resetting to New Moon. Fury of Elune deals $s2% increased damage and its cooldown is reduced by $s3 sec
|
|
rattle_the_stars = { 88236, 393954, 1 }, -- Starsurge and Starfall deal $s1% increased damage and their cost is reduced by $s2%
|
|
shooting_stars = { 88225, 202342, 1 }, -- Moonfire and Sunfire damage over time has a chance to call down a falling star, dealing $s$s2 Astral damage and generating $s3 Astral Power
|
|
solar_beam = { 88231, 78675, 1 }, -- Summons a beam of solar light over an enemy target's location, interrupting the target and silencing all enemies within the beam. Lasts $s1 sec
|
|
solstice = { 88203, 343647, 1 }, -- During the first $s1 sec of every Eclipse, Shooting Stars fall $s2% more often
|
|
soul_of_the_forest = { 88212, 114107, 1 }, -- Solar Eclipse increases Wrath's Astral Power generation by $s1% and Lunar Eclipse increases Starfire's damage and Astral Power generation by $s2% for each target hit beyond the first, up to $s3%
|
|
starlord = { 88207, 202345, 2 }, -- Starsurge and Starfall grant you $s1% Haste for $s2 sec. Stacks up to $s3 times. Gaining a stack does not refresh the duration
|
|
starweaver = { 88236, 393940, 1 }, -- Starsurge has a $s1% chance to make Starfall free. Starfall has a $s2% chance to make Starsurge free
|
|
stellar_amplification = { 88229, 450212, 1 }, -- Starsurge increases the damage the target takes from your periodic effects and Shooting Stars by $s1% for $s2 sec. Reapplying this effect extends its duration, up to $s3 sec
|
|
stellar_flare = { 91048, 202347, 1 }, -- Burns the target for $s$s2 Astral damage, and then an additional $s3 damage over $s4 sec. If dispelled, causes $s5 damage to the dispeller and blasts them upwards. Generates $s6 Astral Power
|
|
sundered_firmament = { 88199, 394094, 1 }, -- Every other Eclipse creates a Fury of Elune at $s1% effectiveness that follows your current target for $s2 sec
|
|
sunseeker_mushroom = { 88202, 468936, 1 }, -- Sunfire damage has a chance to grow a magical mushroom at a target's location. After $s3 sec, the mushroom detonates, dealing $s$s4 Nature damage and then an additional $s$s5 Nature damage over $s6 sec. Affected targets are slowed by $s7%. Generates up to $s8 Astral Power based on targets hit
|
|
touch_the_cosmos = { 88222, 450356, 1 }, -- Casting Wrath in an Eclipse has a $s1% chance to make your next Starsurge or Starfall free. Casting Starfire in an Eclipse has a $s2% chance to make your next Starsurge or Starfall free
|
|
twin_moons = { 88201, 279620, 1 }, -- Moonfire deals $s1% increased damage and also hits another nearby enemy within $s2 yds of the target
|
|
umbral_embrace = { 88216, 393760, 1 }, -- Wrath and Starfire have a $s1% chance to cause your next Wrath or Starfire cast during an Eclipse to become Astral and deal $s2% additional damage
|
|
umbral_inspiration = { 88217, 450418, 1 }, -- Consuming Umbral Embrace increases the damage of your Moonfire, Sunfire, Stellar Flare, Shooting Stars, and Starfall by $s1% for $s2 sec
|
|
umbral_intensity = { 88219, 383195, 1 }, -- Solar Eclipse increases the damage of Wrath by an additional $s1%. Lunar Eclipse increases Starfire's damage by $s2% and the damage it deals to nearby enemies by an additional $s3%
|
|
waning_twilight = { 88220, 393956, 1 }, -- When you have $s1 periodic effects from your spells on a target, your damage and healing on them are increased by $s2%
|
|
warrior_of_elune = { 88210, 202425, 1 }, -- Your next $s1 Starfires are instant cast and generate $s2% increased Astral Power
|
|
whirling_stars = { 88221, 468743, 1 }, -- Incarnation: Chosen of Elune's cooldown is reduced to $s1 seconds and it has two charges, but its duration is reduced by $s2%
|
|
wild_mushroom = { 88202, 88747, 1 }, -- Grow a magical mushroom at the target enemy's location. After $s3 sec, the mushroom detonates, dealing $s$s4 Nature damage and then an additional $s$s5 Nature damage over $s6 sec. Affected targets are slowed by $s7%. Generates up to $s8 Astral Power based on targets hit
|
|
wild_surges = { 91048, 406890, 1 }, -- Your Wrath and Starfire chance to critically strike is increased by $s1% and they generate $s2 additional Astral Power
|
|
|
|
-- Elunes Chosen
|
|
arcane_affinity = { 94586, 429540, 1 }, -- All Arcane damage from your spells and abilities is increased by $s1%
|
|
astral_insight = { 94585, 429536, 1 }, -- Incarnation: Chosen of Elune increases Arcane damage from spells and abilities by $s1% while active. Increases the duration and number of spells cast by Convoke the Spirits by $s2%
|
|
atmospheric_exposure = { 94607, 429532, 1 }, -- Enemies damaged by Full Moon or Fury of Elune take $s1% increased damage from you for $s2 sec
|
|
boundless_moonlight = { 94608, 424058, 1 }, -- Fury of Elune Fury of Elune now ends with a flash of energy, blasting nearby enemies for $s$s5 Astral damage. Full Moon Full Moon calls down $s8 Minor Moons that deal $s$s9 Astral damage and generate $s10 Astral Power
|
|
elunes_grace = { 94597, 443046, 1 }, -- Using Wild Charge while in Bear Form or Moonkin Form incurs a $s1 sec shorter cooldown
|
|
glistening_fur = { 94594, 429533, 1 }, -- Bear Form and Moonkin Form reduce Arcane damage taken by $s1% and all other magic damage taken by $s2%
|
|
lunar_amplification = { 94596, 429529, 1 }, -- Each non-Arcane damaging ability you use increases the damage of your next Arcane damaging ability by $s1%, stacking up to $s2 times
|
|
lunar_calling = { 94590, 429523, 1 }, -- Starfire deals $s1% increased damage to its primary target, but no longer triggers Solar Eclipse
|
|
lunar_insight = { 94588, 429530, 1 }, -- Moonfire deals $s1% additional damage
|
|
lunation = { 94586, 429539, 1 }, -- Your Arcane abilities reduce the cooldown of Fury of Elune by $s1 sec and the cooldown of New Moon, Half Moon, and Full Moon by $s2 sec
|
|
moon_guardian = { 94598, 429520, 1 }, -- Moonfire and Starfire generate $s1 additional Astral Power
|
|
moondust = { 94597, 429538, 1 }, -- Enemies affected by Moonfire are slowed by $s1%
|
|
stellar_command = { 94590, 429668, 1 }, -- Increases the damage of Fury of Elune by $s1% and the damage of Full Moon by $s2%
|
|
the_eternal_moon = { 94587, 424113, 1 }, -- Further increases the power of Boundless Moonlight. Fury of Elune The flash of energy now generates $s3 Astral Power and its damage is increased by $s4%. Full Moon New Moon and Half Moon now also call down $s7 Minor Moon
|
|
the_light_of_elune = { 94585, 428655, 1 }, -- Moonfire damage has a chance to call down a Fury of Elune to follow your target for $s2 sec. Fury of Elune Calls down a beam of pure celestial energy, dealing $s$s5 Astral damage over $s6 sec within its area. Generates $s7 Astral Power over its duration
|
|
|
|
-- Keeper Of The Grove
|
|
blooming_infusion = { 94601, 429433, 1 }, -- Every $s1 Regrowths you cast makes your next Wrath, Starfire, or Entangling Roots instant and increases damage it deals by $s2%. Every $s3 Starsurges or Starfalls you cast makes your next Regrowth or Entangling roots instant
|
|
bounteous_bloom = { 94591, 429215, 1 }, -- Your Force of Nature treants generate $s1 Astral Power every $s2 sec
|
|
cenarius_might = { 94604, 455797, 1 }, -- Entering Eclipse increases your Haste by $s1% for $s2 sec
|
|
control_of_the_dream = { 94592, 434249, 1 }, -- Time elapsed while your major abilities are available to be used or at maximum charges is subtracted from that ability's cooldown after the next time you use it, up to $s1 seconds. Affects Force of Nature, Incarnation: Chosen of Elune, and Convoke the Spirits
|
|
dream_surge = { 94600, 433831, 1 }, -- Force of Nature grants $s2 charges of Dream Burst, causing your next Wrath or Starfire to explode on the target, dealing $s$s3 Nature damage to nearby enemies. Damage reduced above $s4 targets
|
|
durability_of_nature = { 94605, 429227, 1 }, -- Your Force of Nature treants have $s1% increased health
|
|
early_spring = { 94591, 428937, 1 }, -- Force of Nature cooldown reduced by $s1 sec
|
|
expansiveness = { 94602, 429399, 1 }, -- Your maximum mana is increased by $s1% and your maximum Astral Power is increased by $s2
|
|
groves_inspiration = { 94595, 429402, 1 }, -- Wrath and Starfire damage increased by $s1%. Regrowth and Wild Growth healing increased by $s2%
|
|
harmony_of_the_grove = { 94606, 428731, 1 }, -- Each of your Force of Nature treants increases damage your spells deal by $s1% while active
|
|
potent_enchantments = { 94595, 429420, 1 }, -- Orbital Strike applies Stellar Flare for $s1 additional sec and deals $s2% increased damage. Whirling Stars reduces the cooldown of Incarnation: Chosen of Elune by an additional $s3 sec
|
|
power_of_nature = { 94605, 428859, 1 }, -- Your Force of Nature treants no longer taunt and deal $s1% increased melee damage
|
|
power_of_the_dream = { 94592, 434220, 1 }, -- Force of Nature grants an additional stack of Dream Burst
|
|
protective_growth = { 94593, 433748, 1 }, -- Your Regrowth protects you, reducing damage you take by $s1% while your Regrowth is on you
|
|
treants_of_the_moon = { 94599, 428544, 1 }, -- Your Force of Nature treants cast Moonfire on nearby targets about once every $s1 sec
|
|
} )
|
|
|
|
-- PvP Talents
|
|
spec:RegisterPvpTalents( {
|
|
celestial_guardian = 180, -- (233754)
|
|
crescent_burn = 182, -- (200567)
|
|
deep_roots = 834, -- (233755)
|
|
dying_stars = 822, -- (410544)
|
|
faerie_swarm = 836, -- (209749) Swarms the target with Faeries, disarming the enemy, preventing the use of any weapons or shield and reducing movement speed by $s1% for $s2 sec
|
|
high_winds = 5383, -- (200931) Increases the range of Cyclone, Typhoon, and Entangling Roots by $s1 yds
|
|
malornes_swiftness = 5515, -- (236147) Your Travel Form movement speed while within a Battleground or Arena is increased by $s1% and you always move at $s2% movement speed while in Travel Form
|
|
master_shapeshifter = 5604, -- (411266)
|
|
moon_and_stars = 184, -- (233750)
|
|
moonkin_aura = 185, -- (209740)
|
|
owlkin_adept = 5407, -- (354541)
|
|
protector_of_the_grove = 3728, -- (209730)
|
|
star_burst = 3058, -- (356517)
|
|
thorns = 3731, -- (1217017) Casting Barkskin sprouts thorns on you for $s2 sec. When victim to melee attacks, thorns deals $s$s3 Nature damage back to the attacker. Attackers also have their movement speed reduced by $s4% for $s5 sec
|
|
tireless_pursuit = 5646, -- (377801) For $s1 sec after leaving Cat Form or Travel Form, you retain up to $s2% movement speed
|
|
} )
|
|
|
|
spec:RegisterPower( "lively_spirit", 279642, {
|
|
id = 279648,
|
|
duration = 20,
|
|
max_stack = 1,
|
|
} )
|
|
|
|
local mod_circle_hot = setfenv( function( x )
|
|
return x
|
|
end, state )
|
|
|
|
local mod_circle_dot = setfenv( function( x )
|
|
return x
|
|
end, state )
|
|
|
|
-- Auras
|
|
spec:RegisterAuras( {
|
|
astral_communion = {
|
|
id = 450599,
|
|
duration = 15,
|
|
max_stack = 1
|
|
},
|
|
astral_smolder = {
|
|
id = 394061,
|
|
duration = 6,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Critical strike chance with Nature spells increased $w1%.
|
|
-- https://wowhead.com/beta/spell=394049
|
|
balance_of_all_things_nature = {
|
|
id = 394049,
|
|
duration = 10,
|
|
max_stack = 10,
|
|
copy = 339943
|
|
},
|
|
-- Talent: Critical strike chance with Arcane spells increased $w1%.
|
|
-- https://wowhead.com/beta/spell=394050
|
|
balance_of_all_things_arcane = {
|
|
id = 394050,
|
|
duration = 10,
|
|
max_stack = 10,
|
|
copy = 339946
|
|
},
|
|
-- All damage taken reduced by $w1%.
|
|
-- https://wowhead.com/beta/spell=22812
|
|
barkskin = {
|
|
id = 22812,
|
|
duration = 8,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Armor increased by $w4%. Stamina increased by $1178s2%. Immune to Polymorph effects.
|
|
-- https://wowhead.com/beta/spell=5487
|
|
bear_form = {
|
|
id = 5487,
|
|
duration = 3600,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Generate $343216s1 combo $lpoint:points; every $t1 sec. Combo point generating abilities generate $s2 additional combo $lpoint:points;. Finishing moves restore up to $405189u combo points generated over the cap. All attack and ability damage is increased by $s3%.
|
|
berserk = {
|
|
id = 106951,
|
|
duration = 15.0,
|
|
max_stack = 1,
|
|
},
|
|
-- Your next Wrath, Starfire, or Entangling Roots is instant and deals $w2% increased damage.
|
|
blooming_infusion = {
|
|
id = 429474,
|
|
duration = 12.0,
|
|
max_stack = 1,
|
|
},
|
|
blooming_infusion_regrowth = {
|
|
id = 429438,
|
|
duration = 12.0,
|
|
max_stack = 1,
|
|
},
|
|
-- Autoattack damage increased by $w4%. Immune to Polymorph effects. Movement speed increased by $113636s1% and falling damage reduced.
|
|
-- https://wowhead.com/beta/spell=768
|
|
cat_form = {
|
|
id = 768,
|
|
duration = 3600,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
|
|
-- Affected by:
|
|
-- druid[137009] #3: { 'type': APPLY_AURA, 'subtype': MOD_GLOBAL_COOLDOWN_BY_HASTE_REGEN, 'sp_bonus': 0.25, 'points': 100.0, 'value': 11, 'schools': ['physical', 'holy', 'nature'], 'target': TARGET_UNIT_CASTER, }
|
|
-- starfall[191034] #1: { 'type': APPLY_AURA, 'subtype': CAST_WHILE_WALKING, 'target': TARGET_UNIT_CASTER, }
|
|
-- starfall[344869] #1: { 'type': APPLY_AURA, 'subtype': CAST_WHILE_WALKING, 'target': TARGET_UNIT_CASTER, }
|
|
},
|
|
-- Talent: Both Eclipses active. Haste increased by $w2%.
|
|
-- https://wowhead.com/beta/spell=194223
|
|
celestial_alignment = {
|
|
id = 194223,
|
|
duration = function () return 15 * ( talent.whirling_stars.enabled and 0.8 or 1 ) + ( conduit.precise_alignment.mod * 0.001 ) end,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
copy = 383410
|
|
|
|
-- Affected by:
|
|
-- orbital_strike[390378] #0: { 'type': APPLY_AURA, 'subtype': OVERRIDE_ACTIONBAR_SPELLS, 'spell': 383410, 'value': 194223, 'schools': ['physical', 'holy', 'fire', 'nature', 'shadow'], 'value1': 2, 'target': TARGET_UNIT_CASTER, }
|
|
-- orbital_strike[390378] #2: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'points': -60000.0, 'target': TARGET_UNIT_CASTER, 'modifies': COOLDOWN, }
|
|
},
|
|
ca_inc = {}, -- stub for celestial vs. incarnation
|
|
-- Heals $w1 damage every $t1 seconds.
|
|
-- https://wowhead.com/beta/spell=102352
|
|
cenarion_ward = {
|
|
id = 102352,
|
|
duration = 8,
|
|
tick_time = 2,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Haste increased by $w1%.
|
|
cenarius_might = {
|
|
id = 455801,
|
|
duration = 6.0,
|
|
max_stack = 1,
|
|
},
|
|
-- Talent / Covenant (Night Fae): Every 0.25 sec, casting Wild Growth, Swiftmend, Moonfire, Wrath, Regrowth, Rejuvenation, Rake or Thrash on appropriate nearby targets.
|
|
-- https://wowhead.com/beta/spell=391528
|
|
convoke_the_spirits = {
|
|
id = 391528,
|
|
duration = function() return talent.astral_insight.enabled and 5 or 4 end,
|
|
tick_time = 0.25,
|
|
max_stack = 99,
|
|
copy = 323764
|
|
},
|
|
-- Heals $w1 damage every $t1 seconds.
|
|
-- https://wowhead.com/beta/spell=200389
|
|
cultivation = {
|
|
id = 200389,
|
|
duration = 6,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Disoriented and invulnerable.
|
|
-- https://wowhead.com/beta/spell=33786
|
|
cyclone = {
|
|
id = 33786,
|
|
duration = 5,
|
|
mechanic = "banish",
|
|
type = "Magic",
|
|
max_stack = 1
|
|
|
|
-- Affected by:
|
|
-- cat_form[3025] #3: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'points': -500.0, 'target': TARGET_UNIT_CASTER, 'modifies': GLOBAL_COOLDOWN, }
|
|
-- heart_of_the_wild[319454] #12: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': -30.0, 'target': TARGET_UNIT_CASTER, 'modifies': CAST_TIME, }
|
|
},
|
|
-- Increased movement speed by $s1% while in Cat Form.
|
|
-- https://wowhead.com/beta/spell=1850
|
|
dream_burst = {
|
|
id = 433832,
|
|
duration = 30,
|
|
type = "Magic",
|
|
max_stack = function() return talent.power_of_the_dream.enabled and 4 or 3 end,
|
|
},
|
|
dash = {
|
|
id = 1850,
|
|
duration = 10,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Arcane spells deal $w1% additional damage$?<$w5>0>[, area effect damage increased $w5%,][] and Starfire's critical strike chance is increased by $w2%.
|
|
-- https://wowhead.com/beta/spell=48518
|
|
eclipse_lunar = {
|
|
id = 48518,
|
|
duration = 16,
|
|
max_stack = 1,
|
|
},
|
|
-- Nature spells deal $w1% additional damage$?<$w5>0>[, Astral Power generation increased $w5%,][] and Wrath's damage is increased by $w2%.
|
|
-- https://wowhead.com/beta/spell=48517
|
|
eclipse_solar = {
|
|
id = 48517,
|
|
duration = 16,
|
|
max_stack = 1,
|
|
},
|
|
-- Rooted.$?<$w2>0>[ Suffering $w2 Nature damage every $t2 sec.][]
|
|
-- https://wowhead.com/beta/spell=339
|
|
entangling_roots = {
|
|
id = 339,
|
|
duration = 30,
|
|
tick_time = 2,
|
|
mechanic = "root",
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
faerie_swarm = {
|
|
id = 209749,
|
|
duration = 5,
|
|
max_stack = 1
|
|
},
|
|
force_of_nature = { -- TODO: Is a totem? Summon?
|
|
id = 205644,
|
|
duration = 15,
|
|
max_stack = 1,
|
|
},
|
|
forestwalk = {
|
|
id = 400129,
|
|
duration = 6.0,
|
|
max_stack = 1
|
|
},
|
|
-- Bleeding for $w1 damage every $t sec.
|
|
-- https://wowhead.com/beta/spell=391140
|
|
frenzied_assault = {
|
|
id = 391140,
|
|
duration = 8,
|
|
tick_time = 2,
|
|
mechanic = "bleed",
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Healing $w1% health every $t1 sec.
|
|
-- https://wowhead.com/beta/spell=22842
|
|
frenzied_regeneration = {
|
|
id = 22842,
|
|
duration = 3,
|
|
tick_time = 1,
|
|
max_stack = 1
|
|
},
|
|
-- Movement speed reduced by $s2%. Suffering $w1 Nature damage every $t1 sec.
|
|
fungal_growth = {
|
|
id = 81281,
|
|
duration = 10,
|
|
tick_time = 2,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Generating ${$m3/10/$t3*$d} Astral Power over $d.
|
|
-- https://wowhead.com/beta/spell=202770
|
|
fury_of_elune_ap = {
|
|
id = 202770,
|
|
duration = 8,
|
|
tick_time = 0.5,
|
|
max_stack = 1,
|
|
|
|
generate = function ( t )
|
|
local applied = action.fury_of_elune.lastCast
|
|
|
|
if applied and now - applied < 8 then
|
|
t.count = 1
|
|
t.expires = applied + 8
|
|
t.applied = applied
|
|
t.caster = "player"
|
|
return
|
|
end
|
|
|
|
t.count = 0
|
|
t.expires = 0
|
|
t.applied = 0
|
|
t.caster = "nobody"
|
|
end,
|
|
|
|
copy = "fury_of_elune"
|
|
|
|
-- Affected by:
|
|
-- mastery_astral_invocation[393014] #0: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'sp_bonus': 0.6, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, }
|
|
-- mastery_astral_invocation[393014] #1: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'sp_bonus': 0.6, 'target': TARGET_UNIT_CASTER, 'modifies': PERIODIC_DAMAGE_HEALING, }
|
|
-- mastery_astral_invocation[393014] #2: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'sp_bonus': 0.6, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, }
|
|
-- mastery_astral_invocation[393014] #3: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'sp_bonus': 0.6, 'target': TARGET_UNIT_CASTER, 'modifies': PERIODIC_DAMAGE_HEALING, }
|
|
-- moonfire[164812] #2: { 'type': APPLY_AURA, 'subtype': MOD_SPELL_DAMAGE_FROM_CASTER, 'target': TARGET_UNIT_TARGET_ENEMY, }
|
|
-- moonfire[164812] #3: { 'type': APPLY_AURA, 'subtype': MOD_SPELL_DAMAGE_FROM_CASTER, 'target': TARGET_UNIT_TARGET_ENEMY, }
|
|
-- sunfire[164815] #2: { 'type': APPLY_AURA, 'subtype': MOD_SPELL_DAMAGE_FROM_CASTER, 'radius': 8.0, 'target': TARGET_DEST_TARGET_ENEMY, 'target2': TARGET_UNIT_DEST_AREA_ENEMY, }
|
|
-- sunfire[164815] #3: { 'type': APPLY_AURA, 'subtype': MOD_SPELL_DAMAGE_FROM_CASTER, 'radius': 8.0, 'target': TARGET_DEST_TARGET_ENEMY, 'target2': TARGET_UNIT_DEST_AREA_ENEMY, }
|
|
-- radiant_moonlight[394121] #0: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'points': -15000.0, 'target': TARGET_UNIT_CASTER, 'modifies': COOLDOWN, }
|
|
-- radiant_moonlight[394121] #2: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 50.0, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, }
|
|
-- balance_of_all_things[394049] #0: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'target': TARGET_UNIT_CASTER, 'modifies': CRIT_CHANCE, }
|
|
-- eclipse_solar[48517] #0: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'points': 15.0, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, }
|
|
-- eclipse_solar[48517] #2: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'target': TARGET_UNIT_CASTER, 'modifies': DAMAGE_HEALING, }
|
|
-- eclipse_solar[48517] #3: { 'type': APPLY_AURA, 'subtype': ADD_PCT_MODIFIER, 'target': TARGET_UNIT_CASTER, 'modifies': PERIODIC_DAMAGE_HEALING, }
|
|
},
|
|
-- Taunted.
|
|
-- https://wowhead.com/beta/spell=6795
|
|
growl = {
|
|
id = 6795,
|
|
duration = 3,
|
|
mechanic = "taunt",
|
|
max_stack = 1
|
|
},
|
|
harmony_of_the_grove = {
|
|
id = 428735,
|
|
duration = 10,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Abilities not associated with your specialization are substantially empowered.
|
|
-- https://wowhead.com/beta/spell=319454
|
|
heart_of_the_wild = {
|
|
id = 319454,
|
|
duration = 45,
|
|
tick_time = 2,
|
|
max_stack = 1,
|
|
copy = { 108291, 108292, 108293, 108294 }
|
|
},
|
|
-- Talent: Asleep.
|
|
-- https://wowhead.com/beta/spell=2637
|
|
hibernate = {
|
|
id = 2637,
|
|
duration = 40,
|
|
mechanic = "sleep",
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Incapacitated.
|
|
-- https://wowhead.com/beta/spell=99
|
|
incapacitating_roar = {
|
|
id = 99,
|
|
duration = 3,
|
|
mechanic = "incapacitate",
|
|
max_stack = 1
|
|
|
|
-- Affected by:
|
|
-- druid[137009] #3: { 'type': APPLY_AURA, 'subtype': MOD_GLOBAL_COOLDOWN_BY_HASTE_REGEN, 'sp_bonus': 0.25, 'points': 100.0, 'value': 11, 'schools': ['physical', 'holy', 'nature'], 'target': TARGET_UNIT_CASTER, }
|
|
-- astral_influence[197524] #2: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'points': 3.0, 'target': TARGET_UNIT_CASTER, 'modifies': RADIUS, }
|
|
-- starfall[191034] #1: { 'type': APPLY_AURA, 'subtype': CAST_WHILE_WALKING, 'target': TARGET_UNIT_CASTER, }
|
|
-- starfall[344869] #1: { 'type': APPLY_AURA, 'subtype': CAST_WHILE_WALKING, 'target': TARGET_UNIT_CASTER, }
|
|
},
|
|
-- Talent: Both Eclipses active. Critical strike chance increased by $w2%$?s194223[ and haste increased by $w1%][].
|
|
-- https://wowhead.com/beta/spell=102560
|
|
incarnation = {
|
|
id = 102560,
|
|
duration = function () return 20 + ( conduit.precise_alignment.mod * 0.001 ) end,
|
|
max_stack = 1,
|
|
copy = "incarnation_chosen_of_elune",
|
|
|
|
-- Affected by:
|
|
-- druid[137009] #3: { 'type': APPLY_AURA, 'subtype': MOD_GLOBAL_COOLDOWN_BY_HASTE_REGEN, 'sp_bonus': 0.25, 'points': 100.0, 'value': 11, 'schools': ['physical', 'holy', 'nature'], 'target': TARGET_UNIT_CASTER, }
|
|
-- elunes_guidance[393991] #4: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER_BY_LABEL, 'points': -80.0, 'target': TARGET_UNIT_CASTER, 'modifies': EFFECT_3_VALUE, }
|
|
-- elunes_guidance[393991] #5: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER_BY_LABEL, 'points': -100.0, 'target': TARGET_UNIT_CASTER, 'modifies': EFFECT_4_VALUE, }
|
|
-- orbital_strike[390378] #1: { 'type': APPLY_AURA, 'subtype': OVERRIDE_ACTIONBAR_SPELLS, 'spell': 390414, 'value': 102560, 'schools': ['shadow'], 'value1': 2, 'target': TARGET_UNIT_CASTER, }
|
|
-- orbital_strike[390378] #2: { 'type': APPLY_AURA, 'subtype': ADD_FLAT_MODIFIER, 'points': -60000.0, 'target': TARGET_UNIT_CASTER, 'modifies': COOLDOWN, }
|
|
},
|
|
-- Movement speed slowed by $w1%.$?e1[ Healing taken reduced by $w2%.][]
|
|
-- https://wowhead.com/beta/spell=58180
|
|
infected_wounds = {
|
|
id = 58180,
|
|
duration = 12,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Mana costs reduced $w1%.
|
|
-- https://wowhead.com/beta/spell=29166
|
|
innervate = {
|
|
id = 29166,
|
|
duration = 10,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
-- Affected by:
|
|
-- cat_form[768] #1: { 'type': APPLY_AURA, 'subtype': MOD_IGNORE_SHAPESHIFT, 'target': TARGET_UNIT_CASTER, }
|
|
-- bear_form[5487] #1: { 'type': APPLY_AURA, 'subtype': MOD_IGNORE_SHAPESHIFT, 'target': TARGET_UNIT_CASTER, }
|
|
},
|
|
-- Talent: Armor increased by ${$w1*$AGI/100}.
|
|
-- https://wowhead.com/beta/spell=192081
|
|
ironfur = {
|
|
id = 192081,
|
|
duration = 7,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- The damage of your next Arcane ability is increased by $w1%.
|
|
lunar_amplification = {
|
|
id = 431250,
|
|
duration = 45.0,
|
|
max_stack = 1,
|
|
},
|
|
-- Versatility increased by $w1%.
|
|
-- https://wowhead.com/beta/spell=1126
|
|
mark_of_the_wild = {
|
|
id = 1126,
|
|
duration = 3600,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
shared = "player"
|
|
},
|
|
-- Talent: Rooted.
|
|
-- https://wowhead.com/beta/spell=102359
|
|
mass_entanglement = {
|
|
id = 102359,
|
|
duration = 10,
|
|
tick_time = 2,
|
|
mechanic = "root",
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Absorbs $w1 damage.
|
|
-- https://wowhead.com/beta/spell=385787
|
|
matted_fur = {
|
|
id = 385787,
|
|
duration = 8,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Stunned.
|
|
-- https://wowhead.com/beta/spell=5211
|
|
mighty_bash = {
|
|
id = 5211,
|
|
duration = 4,
|
|
mechanic = "stun",
|
|
max_stack = 1
|
|
},
|
|
-- PvP Talent: Entering an Eclipse summons a beam of light at your location granting you 50% reduction in silence and interrupts for 6 sec.
|
|
-- https://www.wowhead.com/spell=234084
|
|
moon_and_stars = {
|
|
id = 234084,
|
|
duration = 6,
|
|
max_stack = 1
|
|
},
|
|
-- Suffering $w2 Arcane damage every $t2 seconds.$?$w8<0[; Movement slowed by $w8%.][]
|
|
moonfire = {
|
|
id = 164812,
|
|
duration = function () return mod_circle_dot( level > 13 and 22 or 18 ) end,
|
|
tick_time = function () return mod_circle_dot( 2 ) * ( 1 - 0.125 * talent.cosmic_rapidity.rank ) * haste end,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
copy = { 155625, "moonfire_dmg" }
|
|
},
|
|
-- PvP Talent: Starsurge grants 4% spell critical strike chance to 8 allies within 40 yards for 18 sec, stacking up to 3 times.
|
|
-- https://www.wowhead.com/spell=209746
|
|
moonkin_aura = {
|
|
id = 209746,
|
|
duration = 18,
|
|
max_stack = 3
|
|
},
|
|
-- Spell damage increased by $s9%.; Immune to Polymorph effects.$?$w3>0[; Armor increased by $w3%.][]$?$w12<0[; Arcane damage taken reduced by $w13% and all other magic damage taken reduced by $w12%.][]
|
|
moonkin_form = {
|
|
id = 24858,
|
|
duration = 3600,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
copy = 197625
|
|
},
|
|
-- Talent: $?s137012[Single-target healing also damages a nearby enemy target for $w3% of the healing done][Single-target damage also heals a nearby friendly target for $w3% of the damage done].
|
|
-- https://wowhead.com/beta/spell=124974
|
|
natures_vigil = {
|
|
id = 124974,
|
|
duration = 15,
|
|
tick_time = 0.5,
|
|
max_stack = 1
|
|
},
|
|
orbit_breaker = {
|
|
id = 329970,
|
|
duration = 3600,
|
|
max_stack = 20
|
|
},
|
|
-- Your next Starfire is instant cast$?s354541[ or your next Cyclone or Entangling Roots cast time is reduced by $s2%.][.]
|
|
-- https://wowhead.com/beta/spell=157228
|
|
owlkin_frenzy = {
|
|
id = 157228,
|
|
duration = 10,
|
|
type = "Magic",
|
|
max_stack = function () return pvptalent.owlkin_adept.enabled and 2 or 1 end
|
|
},
|
|
parting_skies = {
|
|
id = 395110,
|
|
duration = 60,
|
|
max_stack = 1,
|
|
},
|
|
-- All damage taken reduced by $w1%.
|
|
protective_growth = {
|
|
id = 433749,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
-- Stealthed.
|
|
-- https://wowhead.com/beta/spell=5215
|
|
prowl_base = {
|
|
id = 5215,
|
|
duration = 3600,
|
|
multiplier = function() return talent.pouncing_strikes.enabled and 1.6 or 1 end,
|
|
},
|
|
prowl_incarnation = {
|
|
id = 102547,
|
|
duration = 3600,
|
|
multiplier = function() return talent.pouncing_strikes.enabled and 1.6 or 1 end,
|
|
},
|
|
prowl = {
|
|
alias = { "prowl_base", "prowl_incarnation" },
|
|
aliasMode = "first",
|
|
aliasType = "buff",
|
|
duration = 3600
|
|
},
|
|
-- Cost of Starsurge and Starfall reduced by $w1%, and their damage increased by $w2%.
|
|
-- https://wowhead.com/beta/spell=393955
|
|
rattled_stars = {
|
|
id = 393955,
|
|
duration = 6,
|
|
max_stack = 2,
|
|
copy = "rattle_the_stars"
|
|
},
|
|
-- Heals $w2 every $t2 sec.
|
|
-- https://wowhead.com/beta/spell=8936
|
|
regrowth = {
|
|
id = 8936,
|
|
duration = function () return mod_circle_hot( 12 ) end,
|
|
tick_time = function () return mod_circle_hot( 2 ) end,
|
|
type = "Magic",
|
|
max_stack = 1,
|
|
dot = "buff",
|
|
friendly = true
|
|
},
|
|
-- Healing $w1 every $t1 sec.
|
|
rejuvenation = {
|
|
id = 774,
|
|
duration = 12.0,
|
|
pandemic = true,
|
|
max_stack = 1,
|
|
},
|
|
-- Healing $w1 every $t1 sec.
|
|
-- https://wowhead.com/beta/spell=155777
|
|
rejuvenation_germination = {
|
|
id = 155777,
|
|
duration = 12,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Healing $s1 every $t sec.
|
|
-- https://wowhead.com/beta/spell=364686
|
|
renewing_bloom = {
|
|
id = 364686,
|
|
duration = 8,
|
|
max_stack = 1
|
|
},
|
|
-- Bleeding for $w1 damage every $t1 sec.
|
|
rip = {
|
|
id = 1079,
|
|
duration = 4.0,
|
|
tick_time = 2.0,
|
|
pandemic = true,
|
|
max_stack = 1,
|
|
},
|
|
rising_light_falling_night_day = {
|
|
id = 417714,
|
|
duration = 3600,
|
|
max_stack = 1
|
|
},
|
|
rising_light_falling_night_night = {
|
|
id = 417715,
|
|
duration = 3600,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Silenced.
|
|
-- https://wowhead.com/beta/spell=81261
|
|
solar_beam = {
|
|
id = 81261,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
-- Talent: Interrupted.
|
|
-- https://wowhead.com/beta/spell=78675
|
|
solar_beam_silence = { -- Silence.
|
|
id = 78675,
|
|
duration = 8,
|
|
max_stack = 1
|
|
},
|
|
solstice = {
|
|
id = 343648,
|
|
duration = 6,
|
|
max_stack = 1,
|
|
},
|
|
-- Heals $w1 damage every $t1 seconds.
|
|
-- https://wowhead.com/beta/spell=207386
|
|
spring_blossoms = {
|
|
id = 207386,
|
|
duration = 6,
|
|
max_stack = 1
|
|
},
|
|
stag_form = {
|
|
id = 210053,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
generate = function ()
|
|
local form = GetShapeshiftForm()
|
|
local stag = form and form > 0 and select( 4, GetShapeshiftFormInfo( form ) )
|
|
|
|
local sf = buff.stag_form
|
|
|
|
if stag == 210053 then
|
|
sf.count = 1
|
|
sf.applied = now
|
|
sf.expires = now + 3600
|
|
sf.caster = "player"
|
|
return
|
|
end
|
|
|
|
sf.count = 0
|
|
sf.applied = 0
|
|
sf.expires = 0
|
|
sf.caster = "nobody"
|
|
end,
|
|
copy = "mount_form"
|
|
},
|
|
-- Movement speed increased by $s1%.
|
|
stampeding_roar = {
|
|
id = 106898,
|
|
duration = 8.0,
|
|
max_stack = 1,
|
|
},
|
|
-- Talent: Calling down falling stars on nearby enemies.
|
|
-- https://wowhead.com/beta/spell=191034
|
|
starfall = {
|
|
id = 191034,
|
|
duration = 8,
|
|
tick_time = 1.0,
|
|
type = "Magic",
|
|
max_stack = 20,
|
|
copy = 393040
|
|
},
|
|
starlord = {
|
|
id = 279709,
|
|
duration = 20,
|
|
max_stack = 3,
|
|
},
|
|
starweavers_warp = { -- free Starfall.
|
|
id = 393942,
|
|
duration = 30,
|
|
max_stack = 1,
|
|
},
|
|
starweavers_weft = { -- free Starsurge.
|
|
id = 393944,
|
|
duration = 30,
|
|
max_stack = 1,
|
|
},
|
|
-- Damage over time from $@auracaster increased by $w1%.
|
|
stellar_amplification = {
|
|
id = 450214,
|
|
duration = 5.0,
|
|
max_stack = 1,
|
|
},
|
|
-- Talent: Suffering $w2 Astral damage every $t2 sec.
|
|
-- https://wowhead.com/beta/spell=202347
|
|
stellar_flare = {
|
|
id = 202347,
|
|
duration = function () return mod_circle_dot( 24 ) end,
|
|
tick_time = function () return mod_circle_dot( 2 ) * ( 1 - 0.125 * talent.cosmic_rapidity.rank ) * haste end,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Suffering $w2 Nature damage every $t2 seconds.
|
|
-- https://wowhead.com/beta/spell=164815
|
|
sunfire = {
|
|
id = 164815,
|
|
duration = function () return mod_circle_dot( 18 ) end,
|
|
tick_time = function () return mod_circle_dot( 2 ) * ( 1 - 0.125 * talent.cosmic_rapidity.rank ) * haste end,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Bleeding for $w1 damage every $t1 seconds.
|
|
-- https://wowhead.com/beta/spell=391356
|
|
tear = {
|
|
id = 391356,
|
|
duration = 8,
|
|
tick_time = 2,
|
|
mechanic = "bleed",
|
|
max_stack = 1
|
|
},
|
|
-- Melee attackers take Nature damage when hit and their movement speed is slowed by $232559s1% for $232559d.
|
|
-- https://wowhead.com/beta/spell=305497
|
|
thorns = {
|
|
id = 305497,
|
|
duration = 12,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Increased movement speed by $s1% while in Cat Form, reducing gradually over time.
|
|
-- https://wowhead.com/beta/spell=252216
|
|
tiger_dash = {
|
|
id = 252216,
|
|
duration = 5,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
touch_the_cosmos = {
|
|
id = 450360,
|
|
duration = 15,
|
|
max_stack = 1,
|
|
copy = { "touch_the_cosmos_starfall", "touch_the_cosmos_starsurge" }
|
|
},
|
|
-- Immune to Polymorph effects. Movement speed increased.
|
|
-- https://wowhead.com/beta/spell=783
|
|
travel_form = {
|
|
id = 783,
|
|
duration = 3600,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
treant_form = {
|
|
id = 114282,
|
|
duration = 3600,
|
|
max_stack = 1,
|
|
},
|
|
-- Talent: Dazed.
|
|
-- https://wowhead.com/beta/spell=61391
|
|
typhoon = {
|
|
id = 61391,
|
|
duration = 6,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Your next Wrath of Starfire deals Astral damage and deals $w1% additional damage.
|
|
-- https://wowhead.com/beta/spell=393763
|
|
umbral_embrace = {
|
|
id = 393763,
|
|
duration = 15,
|
|
max_stack = 1
|
|
},
|
|
-- Moonfire, Sunfire, Stellar Flare, Shooting Stars, and Starfall damage increased by $w1%
|
|
umbral_inspiration = {
|
|
id = 450419,
|
|
duration = 6.0,
|
|
max_stack = 1,
|
|
},
|
|
ursine_vigor = {
|
|
id = 340541,
|
|
duration = 4,
|
|
max_stack = 1
|
|
},
|
|
-- Movement speed slowed by $s1% and winds impeding movement.
|
|
-- https://wowhead.com/beta/spell=102793
|
|
ursols_vortex = {
|
|
id = 102793,
|
|
duration = 10,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Starfire is instant cast and generates $s2% increased Astral Power.
|
|
-- https://wowhead.com/beta/spell=202425
|
|
warrior_of_elune = {
|
|
id = 202425,
|
|
duration = 25,
|
|
type = "Magic",
|
|
max_stack = 3
|
|
},
|
|
-- Talent: Flying to an ally's position.
|
|
-- https://wowhead.com/beta/spell=102401
|
|
wild_charge = {
|
|
id = 102401,
|
|
duration = 0.5,
|
|
max_stack = 1
|
|
},
|
|
-- Talent: Heals $w1 damage every $t1 sec.
|
|
-- https://wowhead.com/beta/spell=48438
|
|
wild_growth = {
|
|
id = 48438,
|
|
duration = 7,
|
|
type = "Magic",
|
|
max_stack = 1
|
|
},
|
|
|
|
-- Legendaries
|
|
celestial_infusion = {
|
|
id = 367907,
|
|
duration = 8,
|
|
max_stack = 1
|
|
},
|
|
oath_of_the_elder_druid = {
|
|
id = 338643,
|
|
duration = 60,
|
|
max_stack = 1
|
|
},
|
|
oneths_perception = {
|
|
id = 339800,
|
|
duration = 30,
|
|
max_stack = 1,
|
|
},
|
|
oneths_clear_vision = {
|
|
id = 339797,
|
|
duration = 30,
|
|
max_stack = 1,
|
|
},
|
|
primordial_arcanic_pulsar = {
|
|
id = 393961,
|
|
duration = 3600,
|
|
max_stack = 100,
|
|
copy = 338825
|
|
},
|
|
timeworn_dreambinder = {
|
|
id = 340049,
|
|
duration = 6,
|
|
max_stack = 2,
|
|
},
|
|
} )
|
|
|
|
spec:RegisterGear({
|
|
-- The War Within
|
|
tww3 = {
|
|
items = { 237685, 237680, 237683, 237681, 237682 },
|
|
auras = {
|
|
-- Elunes Chosen
|
|
gathering_moonlight = {
|
|
id = 1236989,
|
|
duration = 20,
|
|
max_stack = 15
|
|
},
|
|
moonlight_suffusion = {
|
|
id = 1236990,
|
|
duration = 12,
|
|
max_stack = 15
|
|
},
|
|
-- Keeper of the Grove
|
|
-- Dryad A dryad is assisting you! $s1 seconds remaining
|
|
-- https://www.wowhead.com/spell=1236556
|
|
dryad = {
|
|
id = 1236556,
|
|
duration = 5, -- 10 for balance
|
|
max_stack = 1
|
|
},
|
|
-- Dryad's Favor The healing of your next Swiftmend is increased by $s1 and it splashes $s2% of its healing done to nearby allies, reduced beyond $s3 targets. $s4 seconds remaining
|
|
-- https://www.wowhead.com/spell=1236807
|
|
dryads_favor = {
|
|
id = 1236807,
|
|
duration = 45,
|
|
max_stack = 2
|
|
},
|
|
-- New tier set hot version
|
|
-- https://www.wowhead.com/spell=1236573
|
|
tranquility = {
|
|
id = 1236573,
|
|
duration = 8,
|
|
max_stack = 5
|
|
},
|
|
-- New tier set version on dryad
|
|
starfall = {
|
|
id = 1236607,
|
|
duration = 10,
|
|
max_stack = 1
|
|
},
|
|
}
|
|
},
|
|
tww2 = {
|
|
items = { 229310, 229308, 229306, 229307, 229305 }
|
|
},
|
|
tww1 = {
|
|
items = { 212059, 212057, 212056, 212055, 212054 }
|
|
},
|
|
-- Dragonflight
|
|
tier31 = {
|
|
items = { 207252, 207253, 207254, 207255, 207257 },
|
|
auras = {
|
|
dreamstate = {
|
|
id = 424248,
|
|
duration = 3600,
|
|
max_stack = 2,
|
|
copy = 450346
|
|
}
|
|
}
|
|
},
|
|
tier30 = {
|
|
items = { 202518, 202516, 202515, 202514, 202513 }
|
|
},
|
|
tier29 = {
|
|
items = { 200351, 200353, 200354, 200355, 200356, 217193, 217195, 217191, 217192, 217194 },
|
|
auras = {
|
|
gathering_starstuff = {
|
|
id = 394412,
|
|
duration = 15,
|
|
max_stack = 3
|
|
},
|
|
touch_the_cosmos = {
|
|
id = 394414,
|
|
duration = 15,
|
|
max_stack = 1
|
|
}
|
|
}
|
|
},
|
|
|
|
-- Legacy
|
|
tier21 = {
|
|
items = { 152127, 152129, 152125, 152124, 152126, 152128 },
|
|
auras = {
|
|
solar_solstice = {
|
|
id = 252767,
|
|
duration = 6,
|
|
max_stack = 1
|
|
}
|
|
}
|
|
},
|
|
tier20 = { items = { 147136, 147138, 147134, 147133, 147135, 147137 } },
|
|
tier19 = { items = { 138330, 138336, 138366, 138324, 138327, 138333 } },
|
|
class = { items = { 139726, 139728, 139723, 139730, 139725, 139729, 139727, 139724 } },
|
|
impeccable_fel_essence = { items = { 137039 } },
|
|
oneths_intuition = {
|
|
items = { 137092 },
|
|
auras = {
|
|
oneths_intuition = {
|
|
id = 209406,
|
|
duration = 3600,
|
|
max_stacks = 1
|
|
},
|
|
oneths_overconfidence = {
|
|
id = 209407,
|
|
duration = 3600,
|
|
max_stacks = 1
|
|
}
|
|
}
|
|
},
|
|
radiant_moonlight = { items = { 151800 } },
|
|
the_emerald_dreamcatcher = {
|
|
items = { 137062 },
|
|
auras = {
|
|
the_emerald_dreamcatcher = {
|
|
id = 224706,
|
|
duration = 5,
|
|
max_stack = 2
|
|
}
|
|
}
|
|
}
|
|
} )
|
|
|
|
-- Adaptive Swarm Stuff
|
|
do
|
|
local applications = {
|
|
SPELL_AURA_APPLIED = true,
|
|
SPELL_AURA_REFRESH = true,
|
|
SPELL_AURA_APPLIED_DOSE = true
|
|
}
|
|
|
|
local casts = { SPELL_CAST_SUCCESS = true }
|
|
|
|
local removals = {
|
|
SPELL_AURA_REMOVED = true,
|
|
SPELL_AURA_BROKEN = true,
|
|
SPELL_AURA_BROKEN_SPELL = true,
|
|
SPELL_AURA_REMOVED_DOSE = true,
|
|
SPELL_DISPEL = true
|
|
}
|
|
|
|
local deaths = {
|
|
UNIT_DIED = true,
|
|
UNIT_DESTROYED = true,
|
|
UNIT_DISSIPATES = true,
|
|
PARTY_KILL = true,
|
|
SPELL_INSTAKILL = true,
|
|
}
|
|
|
|
local spellIDs = {
|
|
[325733] = true,
|
|
[325889] = true,
|
|
[325748] = true,
|
|
[325891] = true,
|
|
[325727] = true
|
|
}
|
|
|
|
local flights = {}
|
|
local pending = {}
|
|
local swarms = {}
|
|
|
|
-- Flow: Cast -> In Flight -> Application -> Ticks -> Removal -> In Flight -> Application -> Ticks -> Removal -> ...
|
|
-- If the swarm target dies, it will jump again.
|
|
local insert, remove = table.insert, table.remove
|
|
|
|
function Hekili:EmbedAdaptiveSwarm( s )
|
|
s:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName )
|
|
if not state.covenant.necrolord and not state.talent.adaptive_swarm.enabled then return end
|
|
|
|
if sourceGUID == state.GUID and spellIDs[ spellID ] then
|
|
-- On cast, we need to show we have a cast-in-flight.
|
|
if casts[ subtype ] then
|
|
local dot
|
|
|
|
if bit.band( destFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY ) == 0 then
|
|
dot = "adaptive_swarm_damage"
|
|
else
|
|
dot = "adaptive_swarm_heal"
|
|
end
|
|
|
|
insert( flights, { destGUID, 3, GetTime() + 5, dot } )
|
|
|
|
-- On application, we need to store the GUID of the unit so we can get the stacks and expiration time.
|
|
elseif applications[ subtype ] and #flights > 0 then
|
|
local n, flight
|
|
|
|
for i, v in ipairs( flights ) do
|
|
if v[1] == destGUID then
|
|
n = i
|
|
flight = v
|
|
break
|
|
end
|
|
if not flight and v[1] == "unknown" then
|
|
n = i
|
|
flight = v
|
|
end
|
|
end
|
|
|
|
if flight then
|
|
local swarm = swarms[ destGUID ]
|
|
local now = GetTime()
|
|
|
|
if swarm and swarm.expiration > now then
|
|
swarm.stacks = swarm.stacks + flight[2]
|
|
swarm.dot = bit.band( destFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY ) == 0 and "adaptive_swarm_damage" or "adaptive_swarm_heal"
|
|
swarm.expiration = now + class.auras[ swarm.dot ].duration
|
|
else
|
|
swarms[ destGUID ] = {}
|
|
swarms[ destGUID ].stacks = flight[2]
|
|
swarms[ destGUID ].dot = bit.band( destFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY ) == 0 and "adaptive_swarm_damage" or "adaptive_swarm_heal"
|
|
swarms[ destGUID ].expiration = now + class.auras[ swarms[ destGUID ].dot ].duration
|
|
end
|
|
remove( flights, n )
|
|
else
|
|
swarms[ destGUID ] = {}
|
|
swarms[ destGUID ].stacks = 3 -- We'll assume it's fresh.
|
|
swarms[ destGUID ].dot = bit.band( destFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY ) == 0 and "adaptive_swarm_damage" or "adaptive_swarm_heal"
|
|
swarms[ destGUID ].expiration = GetTime() + class.auras[ swarms[ destGUID ].dot ].duration
|
|
end
|
|
|
|
elseif removals[ subtype ] then
|
|
-- If we have a swarm for this, remove it.
|
|
local swarm = swarms[ destGUID ]
|
|
|
|
if swarm then
|
|
swarms[ destGUID ] = nil
|
|
|
|
if swarm.stacks > 1 then
|
|
local dot
|
|
|
|
if bit.band( destFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY ) == 0 then
|
|
dot = "adaptive_swarm_heal"
|
|
else
|
|
dot = "adaptive_swarm_damage"
|
|
end
|
|
|
|
insert( flights, { "unknown", swarm.stacks - 1, GetTime() + 5, dot } )
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
elseif swarms[ destGUID ] and deaths[ subtype ] then
|
|
-- If we have a swarm for this, remove it.
|
|
local swarm = swarms[ destGUID ]
|
|
|
|
if swarm then
|
|
swarms[ destGUID ] = nil
|
|
|
|
if swarm.stacks > 1 then
|
|
if bit.band( destFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY ) == 0 then
|
|
dot = "adaptive_swarm_heal"
|
|
else
|
|
dot = "adaptive_swarm_damage"
|
|
end
|
|
|
|
insert( flights, { "unknown", swarm.stacks - 1, GetTime() + 5, dot } )
|
|
|
|
end
|
|
end
|
|
end
|
|
end )
|
|
|
|
function s.GetActiveSwarms()
|
|
return swarms
|
|
end
|
|
|
|
function s.GetPendingSwarms()
|
|
return pending
|
|
end
|
|
|
|
function s.GetInFlightSwarms()
|
|
return flights
|
|
end
|
|
|
|
local flySwarm, landSwarm
|
|
|
|
landSwarm = setfenv( function( aura )
|
|
if aura.key == "adaptive_swarm_heal_in_flight" then
|
|
applyBuff( "adaptive_swarm_heal", 12, min( 5, buff.adaptive_swarm_heal.stack + aura.count ) )
|
|
buff.adaptive_swarm_heal.expires = query_time + 12
|
|
state:QueueAuraEvent( "adaptive_swarm", flySwarm, buff.adaptive_swarm_heal.expires, "AURA_EXPIRATION", buff.adaptive_swarm_heal )
|
|
else
|
|
applyDebuff( "target", "adaptive_swarm_damage", 12, min( 5, debuff.adaptive_swarm_damage.stack + aura.count ) )
|
|
debuff.adaptive_swarm_damage.expires = query_time + 12
|
|
state:QueueAuraEvent( "adaptive_swarm", flySwarm, debuff.adaptive_swarm_damage.expires, "AURA_EXPIRATION", debuff.adaptive_swarm_damage )
|
|
end
|
|
end, state )
|
|
|
|
flySwarm = setfenv( function( aura )
|
|
if aura.key == "adaptive_swarm_heal" then
|
|
applyBuff( "adaptive_swarm_heal_in_flight", 5, aura.count - 1 )
|
|
state:QueueAuraEvent( "adaptive_swarm", landSwarm, query_time + 5, "AURA_EXPIRATION", buff.adaptive_swarm_heal_in_flight )
|
|
else
|
|
applyBuff( "adaptive_swarm_damage_in_flight", 5, aura.count - 1 )
|
|
state:QueueAuraEvent( "adaptive_swarm", landSwarm, query_time + 5, "AURA_EXPIRATION", buff.adaptive_swarm_damage_in_flight )
|
|
end
|
|
end, state )
|
|
|
|
s.SwarmOnReset = setfenv( function()
|
|
for k, v in pairs( swarms ) do
|
|
if v.expiration + 0.1 <= now then swarms[ k ] = nil end
|
|
end
|
|
|
|
for i = #flights, 1, -1 do
|
|
if flights[i][3] + 0.1 <= now then remove( flights, i ) end
|
|
end
|
|
|
|
local target = UnitGUID( "target" )
|
|
local tSwarm = swarms[ target ]
|
|
|
|
if not UnitIsFriend( "target", "player" ) and tSwarm and tSwarm.expiration > now then
|
|
applyDebuff( "target", "adaptive_swarm_damage", tSwarm.expiration - now, tSwarm.stacks )
|
|
debuff.adaptive_swarm_damage.expires = tSwarm.expiration
|
|
|
|
if tSwarm.stacks > 1 then
|
|
state:QueueAuraEvent( "adaptive_swarm", flySwarm, tSwarm.expiration, "AURA_EXPIRATION", debuff.adaptive_swarm_damage )
|
|
end
|
|
end
|
|
|
|
if buff.adaptive_swarm_heal.up and buff.adaptive_swarm_heal.stack > 1 then
|
|
state:QueueAuraEvent( "adaptive_swarm", flySwarm, buff.adaptive_swarm_heal.expires, "AURA_EXPIRATION", buff.adaptive_swarm_heal )
|
|
else
|
|
for k, v in pairs( swarms ) do
|
|
if k ~= target and v.dot == "adaptive_swarm_heal" then
|
|
applyBuff( "adaptive_swarm_heal", v.expiration - now, v.stacks )
|
|
buff.adaptive_swarm_heal.expires = v.expiration
|
|
|
|
if v.stacks > 1 then
|
|
state:QueueAuraEvent( "adaptive_swarm", flySwarm, buff.adaptive_swarm_heal.expires, "AURA_EXPIRATION", buff.adaptive_swarm_heal )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local flight
|
|
|
|
for i, v in ipairs( flights ) do
|
|
if not flight or v[3] > now and v[3] > flight then flight = v end
|
|
end
|
|
|
|
if flight then
|
|
local dot = flight[4] .. "_in_flight"
|
|
applyBuff( dot, flight[3] - now, flight[2] )
|
|
state:QueueAuraEvent( dot, landSwarm, flight[3], "AURA_EXPIRATION", buff[ dot ] )
|
|
end
|
|
|
|
Hekili:Debug( "Swarm Info:\n Damage - %.2f remains, %d stacks.\n Dmg In Flight - %.2f remains, %d stacks.\n Heal - %.2f remains, %d stacks.\n Heal In Flight - %.2f remains, %d stacks.\n Count Dmg: %d, Count Heal: %d.", dot.adaptive_swarm_damage.remains, dot.adaptive_swarm_damage.stack, buff.adaptive_swarm_damage_in_flight.remains, buff.adaptive_swarm_damage_in_flight.stack, buff.adaptive_swarm_heal.remains, buff.adaptive_swarm_heal.stack, buff.adaptive_swarm_heal_in_flight.remains, buff.adaptive_swarm_heal_in_flight.stack, active_dot.adaptive_swarm_damage, active_dot.adaptive_swarm_heal )
|
|
end, state )
|
|
|
|
function Hekili:DumpSwarmInfo()
|
|
local line = "Flights:"
|
|
for k, v in pairs( flights ) do
|
|
line = line .. " " .. k .. ":" .. table.concat( v, ":" )
|
|
end
|
|
print( line )
|
|
|
|
line = "Pending:"
|
|
for k, v in pairs( pending ) do
|
|
line = line .. " " .. k .. ":" .. v
|
|
end
|
|
print( line )
|
|
|
|
line = "Swarms:"
|
|
for k, v in pairs( swarms ) do
|
|
line = line .. " " .. k .. ":" .. v.stacks .. ":" .. v.expiration
|
|
end
|
|
print( line )
|
|
end
|
|
|
|
-- Druid - Necrolord - 325727 - adaptive_swarm (Adaptive Swarm)
|
|
spec:RegisterAbility( "adaptive_swarm", {
|
|
id = function() return talent.adaptive_swarm.enabled and 391888 or 325727 end,
|
|
cast = 0,
|
|
cooldown = 25,
|
|
gcd = "spell",
|
|
|
|
spend = 0.05,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
|
|
-- For Feral, we want to put Adaptive Swarm on the highest health enemy.
|
|
indicator = function ()
|
|
if state.spec.feral and active_enemies > 1 and target.time_to_die < longest_ttd then return "cycle" end
|
|
end,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "adaptive_swarm_dot", nil, 3 )
|
|
if soulbind.kevins_oozeling.enabled then applyBuff( "kevins_oozeling" ) end
|
|
end,
|
|
|
|
copy = { "adaptive_swarm_damage", "adaptive_swarm_heal", 325727, 325733, 325748, 391888 },
|
|
|
|
auras = {
|
|
-- Suffering $w1 Shadow damage every $t1 sec and damage over time from $@auracaster increased by $w2%.
|
|
-- https://wowhead.com/beta/spell=325733
|
|
adaptive_swarm_dot = {
|
|
id = 325733,
|
|
duration = 12,
|
|
tick_time = 2,
|
|
type = "Magic",
|
|
max_stack = 5,
|
|
copy = { 391889, "adaptive_swarm_damage" }
|
|
},
|
|
-- Restoring $w1 health every $t1 sec and healing over time from $@auracaster increased by $w2%.
|
|
-- https://wowhead.com/beta/spell=325748
|
|
adaptive_swarm_hot = {
|
|
id = 325748,
|
|
duration = 12,
|
|
max_stack = 5,
|
|
dot = "buff",
|
|
copy = { 391891, "adaptive_swarm_heal" }
|
|
},
|
|
adaptive_swarm_damage_in_flight = {
|
|
duration = 5,
|
|
max_stack = 5
|
|
},
|
|
adaptive_swarm_heal_in_flight = {
|
|
duration = 5,
|
|
max_stack = 5,
|
|
},
|
|
adaptive_swarm = {
|
|
alias = { "adaptive_swarm_damage", "adaptive_swarm_heal" },
|
|
aliasMode = "first", -- use duration info from the first buff that's up, as they should all be equal.
|
|
aliasType = "any",
|
|
},
|
|
adaptive_swarm_in_flight = {
|
|
alias = { "adaptive_swarm_damage", "adaptive_swarm_heal" },
|
|
aliasMode = "shortest", -- use duration info from the first buff that's up, as they should all be equal.
|
|
aliasType = "any",
|
|
},
|
|
}
|
|
} )
|
|
end
|
|
end
|
|
|
|
Hekili:EmbedAdaptiveSwarm( spec )
|
|
|
|
spec:RegisterStateFunction( "break_stealth", function ()
|
|
removeBuff( "shadowmeld" )
|
|
if buff.prowl.up then
|
|
setCooldown( "prowl", 6 )
|
|
removeBuff( "prowl" )
|
|
end
|
|
end )
|
|
|
|
-- Function to remove any form currently active.
|
|
spec:RegisterStateFunction( "unshift", function()
|
|
if conduit.tireless_pursuit.enabled and ( buff.cat_form.up or buff.travel_form.up ) then applyBuff( "tireless_pursuit" ) end
|
|
|
|
removeBuff( "cat_form" )
|
|
removeBuff( "bear_form" )
|
|
removeBuff( "travel_form" )
|
|
removeBuff( "moonkin_form" )
|
|
removeBuff( "travel_form" )
|
|
removeBuff( "aquatic_form" )
|
|
removeBuff( "stag_form" )
|
|
removeBuff( "celestial_guardian" )
|
|
|
|
if legendary.oath_of_the_elder_druid.enabled and debuff.oath_of_the_elder_druid_icd.down and talent.restoration_affinity.enabled then
|
|
applyBuff( "heart_of_the_wild" )
|
|
applyDebuff( "player", "oath_of_the_elder_druid_icd" )
|
|
end
|
|
end )
|
|
|
|
local affinities = {
|
|
bear_form = "guardian_affinity",
|
|
cat_form = "feral_affinity",
|
|
moonkin_form = "balance_affinity",
|
|
}
|
|
|
|
-- Function to apply form that is passed into it via string.
|
|
spec:RegisterStateFunction( "shift", function( form )
|
|
if conduit.tireless_pursuit.enabled and ( buff.cat_form.up or buff.travel_form.up ) then applyBuff( "tireless_pursuit" ) end
|
|
|
|
removeBuff( "cat_form" )
|
|
removeBuff( "bear_form" )
|
|
removeBuff( "travel_form" )
|
|
removeBuff( "moonkin_form" )
|
|
removeBuff( "travel_form" )
|
|
removeBuff( "aquatic_form" )
|
|
removeBuff( "stag_form" )
|
|
applyBuff( form )
|
|
|
|
if affinities[ form ] and legendary.oath_of_the_elder_druid.enabled and debuff.oath_of_the_elder_druid_icd.down then
|
|
applyBuff( "heart_of_the_wild" )
|
|
applyDebuff( "player", "oath_of_the_elder_druid_icd" )
|
|
end
|
|
|
|
if form == "bear_form" and pvptalent.celestial_guardian.enabled then
|
|
applyBuff( "celestial_guardian" )
|
|
end
|
|
end )
|
|
|
|
spec:RegisterStateExpr( "energize_amount", function ()
|
|
local ability = class.abilities[ this_action ]
|
|
local amount = ability and ability.energize_amount
|
|
|
|
if not amount then return 0 end
|
|
return -amount
|
|
end )
|
|
|
|
spec:RegisterHook( "runHandler", function( ability )
|
|
local a = class.abilities[ ability ]
|
|
|
|
if not a or a.startsCombat then
|
|
break_stealth()
|
|
end
|
|
end )
|
|
|
|
--[[ This is intended to cause an AP reset on entering an encounter, but it's not working.
|
|
spec:RegisterHook( "start_combat", function( action )
|
|
if boss and astral_power.current > 50 then
|
|
spend( astral_power.current - 50, "astral_power" )
|
|
end
|
|
end ) ]]
|
|
|
|
spec:RegisterHook( "pregain", function( amt, resource, overcap, clean )
|
|
if buff.memory_of_lucid_dreams.up then
|
|
if amt > 0 and resource == "astral_power" then
|
|
return amt * 2, resource, overcap, true
|
|
end
|
|
end
|
|
end )
|
|
|
|
spec:RegisterHook( "prespend", function( amt, resource, overcap, clean )
|
|
if buff.memory_of_lucid_dreams.up then
|
|
if amt < 0 and resource == "astral_power" then
|
|
return amt * 2, resource, overcap, true
|
|
end
|
|
end
|
|
end )
|
|
|
|
local check_for_ap_overcap = setfenv( function( ability )
|
|
local a = ability or this_action
|
|
if not a then return true end
|
|
|
|
a = action[ a ]
|
|
if not a then return true end
|
|
|
|
local cost = 0
|
|
if a.spendType == "astral_power" then cost = a.cost end
|
|
|
|
return astral_power.current - cost + ( talent.shooting_stars.enabled and 4 or 0 ) + ( talent.natures_balance.enabled and ceil( execute_time / 2 ) or 0 ) < astral_power.max
|
|
end, state )
|
|
|
|
spec:RegisterStateExpr( "ap_check", function() return check_for_ap_overcap() end )
|
|
|
|
-- Simplify lookups for AP abilities consistent with SimC.
|
|
local ap_checks = {
|
|
"force_of_nature", "full_moon", "half_moon", "incarnation", "moonfire", "new_moon", "starfall", "starfire", "starsurge", "sunfire", "wrath"
|
|
}
|
|
|
|
for i, lookup in ipairs( ap_checks ) do
|
|
spec:RegisterStateExpr( lookup, function ()
|
|
return action[ lookup ]
|
|
end )
|
|
end
|
|
|
|
spec:RegisterStateExpr( "active_moon", function ()
|
|
return "new_moon"
|
|
end )
|
|
|
|
local ExitEclipse = setfenv( function()
|
|
eclipse.state = "IN_NONE"
|
|
eclipse.reset_stacks()
|
|
if talent.dreamstate.enabled then applyBuff( "dreamstate", nil, 2 ) end
|
|
if Hekili.ActiveDebug then Hekili:Debug( "Expire Eclipse: %s - Starfire(%d), Wrath(%d), Solar(%.2f), Lunar(%.2f)", eclipse.state, eclipse.starfire_counter, eclipse.wrath_counter, buff.eclipse_solar.remains, buff.eclipse_lunar.remains ) end
|
|
end, state )
|
|
|
|
spec:RegisterStateTable( "eclipse", setmetatable( {
|
|
-- IN_SOLAR, IN_LUNAR, IN_BOTH, IN_NONE
|
|
state = "IN_NONE",
|
|
wrath_counter = 2,
|
|
starfire_counter = state.talent.lunar_calling.enabled and 0 or 2, -- With the talent, the starfire counter API call is hard-set to return 0 and cannot be changed
|
|
|
|
reset = setfenv( function()
|
|
-- Refresh/sync current gamestate during reset_precast
|
|
eclipse.starfire_counter = GetSpellCastCount( 197628 ) or 0
|
|
eclipse.wrath_counter = GetSpellCastCount( 5176 ) or 0
|
|
|
|
if buff.eclipse_solar.up and buff.eclipse_lunar.up then
|
|
eclipse.state = "IN_BOTH"
|
|
state:QueueAuraExpiration( "ca_inc", ExitEclipse, buff.ca_inc.expires )
|
|
elseif buff.eclipse_solar.up then
|
|
eclipse.state = "IN_SOLAR"
|
|
state:QueueAuraExpiration( "eclipse_solar", ExitEclipse, buff.eclipse_solar.expires )
|
|
elseif buff.eclipse_lunar.up then
|
|
eclipse.state = "IN_LUNAR"
|
|
state:QueueAuraExpiration( "eclipse_lunar", ExitEclipse, buff.eclipse_lunar.expires )
|
|
else
|
|
eclipse.state = "IN_NONE"
|
|
end
|
|
end, state ),
|
|
|
|
reset_stacks = setfenv( function()
|
|
-- Fresh out of any eclipse
|
|
eclipse.wrath_counter = 2
|
|
eclipse.starfire_counter = talent.lunar_calling.enabled and 0 or 2
|
|
end, state ),
|
|
|
|
trigger_eclipse = setfenv( function( eclipseType, duration )
|
|
-- Both are forcibly set to 0 in-game when you enter any eclipse (or both)
|
|
eclipse.wrath_counter = 0
|
|
eclipse.starfire_counter = 0
|
|
-- Clear out any old aura queues and overwrite them down below. This might matter as eclipses do not currently extend, they overwrite with a fresh copy
|
|
state:RemoveAuraExpiration( "eclipse_lunar" )
|
|
state:RemoveAuraExpiration( "eclipse_solar" )
|
|
state:RemoveAuraExpiration( "ca_inc" )
|
|
local partingSkies = 1
|
|
-- These interactions, it matters which type of eclipse
|
|
if eclipseType == "both" then
|
|
eclipse.state = "IN_BOTH"
|
|
applyBuff( "eclipse_solar", duration )
|
|
applyBuff( "eclipse_lunar", duration )
|
|
state:QueueAuraExpiration( "ca_inc", ExitEclipse, buff.ca_inc.expires )
|
|
if talent.balance_of_all_things.enabled then
|
|
applyBuff( "balance_of_all_things_nature" )
|
|
applyBuff( "balance_of_all_things_arcane" )
|
|
end
|
|
partingSkies = 2 -- overwrite to 2 if its a double eclipse
|
|
elseif eclipseType == "lunar" then
|
|
eclipse.state = "IN_LUNAR"
|
|
applyBuff( "eclipse_lunar", duration )
|
|
state:QueueAuraExpiration( "eclipse_lunar", ExitEclipse, buff.eclipse_lunar.expires )
|
|
if talent.balance_of_all_things.enabled then applyBuff( "balance_of_all_things_arcane" ) end
|
|
else
|
|
eclipse.state = "IN_SOLAR"
|
|
applyBuff( "eclipse_solar", duration )
|
|
state:QueueAuraExpiration( "eclipse_solar", ExitEclipse, buff.eclipse_solar.expires )
|
|
if talent.balance_of_all_things.enabled then applyBuff( "balance_of_all_things_nature" ) end
|
|
end
|
|
|
|
-- There interactions happen regardless of eclipse type
|
|
if talent.astral_communion.enabled then applyBuff( "astral_communion" ) end
|
|
if talent.solstice.enabled then applyBuff( "solstice" ) end
|
|
if talent.cenarius_might.enabled then applyBuff( "cenarius_might" ) end
|
|
if talent.parting_skies.enabled then
|
|
if partingSkies == 2 then -- Trigger spell. If buff is up, refresh it
|
|
applyDebuff( "target", "fury_of_elune", 8 )
|
|
applyBuff( "fury_of_elune_ap", 8 )
|
|
if buff.parting_skies.up then
|
|
buff.parting_skies.remains = spec.auras.parting_skies.duration
|
|
end
|
|
else
|
|
if buff.parting_skies.up then
|
|
removeBuff( "parting_skies" )
|
|
applyDebuff( "target", "fury_of_elune", 8 )
|
|
applyBuff( "fury_of_elune_ap", 8 )
|
|
else applyBuff( "parting_skies" )
|
|
end
|
|
end
|
|
end
|
|
-- Legacy
|
|
if set_bonus.tier29_4pc > 0 then applyBuff( "touch_the_cosmos" ) end
|
|
|
|
end, state ),
|
|
|
|
advance = setfenv( function( spell )
|
|
|
|
if spell == "wrath" then
|
|
eclipse.wrath_counter = eclipse.wrath_counter - 1
|
|
if eclipse.wrath_counter == 0 then eclipse.trigger_eclipse( "lunar", 15 ) end
|
|
elseif spell == "starfire" then
|
|
eclipse.starfire_counter = eclipse.starfire_counter - 1
|
|
if eclipse.starfire_counter == 0 then eclipse.trigger_eclipse( "solar", 15 ) end
|
|
end
|
|
|
|
end, state ),
|
|
|
|
}, {
|
|
__index = function( t, k )
|
|
-- any_next
|
|
if k == "any_next" then
|
|
return eclipse.state == "IN_NONE"
|
|
-- in_any
|
|
elseif k == "in_any" or k == "in_eclipse" then
|
|
return eclipse.state ~= "IN_NONE"
|
|
elseif k == "in_none" then
|
|
return eclipse.state == "IN_NONE"
|
|
-- in_solar
|
|
elseif k == "in_solar" then
|
|
return eclipse.state == "IN_SOLAR"
|
|
-- in_lunar
|
|
elseif k == "in_lunar" then
|
|
return eclipse.state == "IN_LUNAR"
|
|
-- in_both
|
|
elseif k == "in_both" then
|
|
return eclipse.state == "IN_BOTH"
|
|
-- solar_in
|
|
elseif k == "solar_in" then
|
|
return eclipse.starfire_counter
|
|
-- solar_in_2
|
|
elseif k == "solar_in_2" then
|
|
return eclipse.starfire_counter == 2
|
|
-- solar_in_1
|
|
elseif k == "solar_in_1" then
|
|
return eclipse.starfire_counter == 1
|
|
-- lunar_in
|
|
elseif k == "lunar_in" then
|
|
return eclipse.wrath_counter
|
|
-- lunar_in_2
|
|
elseif k == "lunar_in_2" then
|
|
return eclipse.wrath_counter == 2
|
|
-- lunar_in_1
|
|
elseif k == "lunar_in_1" then
|
|
return eclipse.wrath_counter == 1
|
|
elseif k == "remains" then
|
|
return eclipse.state == "IN_NONE" and 0 or max( buff.eclipse_solar.remains, buff.eclipse_lunar.remains )
|
|
end
|
|
end
|
|
} ) )
|
|
|
|
spec:RegisterStateTable( "druid", setmetatable( {},{
|
|
__index = function( t, k )
|
|
if k == "catweave_bear" then return false
|
|
elseif k == "owlweave_bear" then return false
|
|
elseif k == "primal_wrath" then return debuff.rip
|
|
elseif k == "lunar_inspiration" then return debuff.moonfire_cat
|
|
elseif k == "no_cds" then return not toggle.cooldowns
|
|
elseif k == "delay_berserking" then return settings.delay_berserking
|
|
elseif rawget( debuff, k ) ~= nil then return debuff[ k ] end
|
|
return false
|
|
end
|
|
} ) )
|
|
|
|
local LycarasHandler = setfenv( function ()
|
|
if buff.travel_form.up then state:RunHandler( "stampeding_roar" )
|
|
elseif buff.moonkin_form.up then state:RunHandler( "starfall" )
|
|
elseif buff.bear_form.up then state:RunHandler( "barkskin" )
|
|
elseif buff.cat_form.up then state:RunHandler( "primal_wrath" )
|
|
else state:RunHandler( "wild_growth" ) end
|
|
end, state )
|
|
|
|
local SinfulHysteriaHandler = setfenv( function ()
|
|
applyBuff( "ravenous_frenzy_sinful_hysteria" )
|
|
end, state )
|
|
|
|
spec:RegisterPet( "treants",
|
|
103822,
|
|
"force_of_nature",
|
|
10,
|
|
103822 )
|
|
|
|
spec:RegisterTotem( "treants", 103822 )
|
|
|
|
local TreantMoonfires = setfenv( function()
|
|
for i = 1, 3 do -- # of treants
|
|
spec.abilities.moonfire.handler()
|
|
end
|
|
end, state )
|
|
|
|
|
|
spec:RegisterHook( "reset_precast", function ()
|
|
if IsActiveSpell( class.abilities.new_moon.id ) then active_moon = "new_moon"
|
|
elseif IsActiveSpell( class.abilities.half_moon.id ) then active_moon = "half_moon"
|
|
elseif IsActiveSpell( class.abilities.full_moon.id ) then active_moon = "full_moon"
|
|
else active_moon = nil end
|
|
|
|
-- UGLY
|
|
if talent.incarnation.enabled then
|
|
rawset( cooldown, "ca_inc", cooldown.incarnation )
|
|
rawset( buff, "ca_inc", buff.incarnation )
|
|
else
|
|
rawset( cooldown, "ca_inc", cooldown.celestial_alignment )
|
|
rawset( buff, "ca_inc", buff.celestial_alignment )
|
|
end
|
|
|
|
--[[ Needs more work
|
|
if pet.treants.up then
|
|
local tick, expires = action.force_of_nature.lastCast, pet.treants.expires
|
|
local tick2 = tick + 6
|
|
tick = tick + 2
|
|
if tick > query_time and tick < expires then
|
|
state:QueueAuraEvent( "treant_moonfires", TreantMoonfires, tick, "AURA_TICK" )
|
|
end
|
|
end
|
|
end
|
|
--]]
|
|
|
|
if talent.fungal_growth.enabled and query_time - action.wild_mushroom.lastCast < 1 then
|
|
if debuff.fungal_growth.up then debuff.fungal_growth.expires = action.wild_mushroom.lastCast + 7
|
|
else applyDebuff( "target", "wild_growth", 7 ) end
|
|
end
|
|
|
|
if buff.warrior_of_elune.up then
|
|
setCooldown( "warrior_of_elune", 3600 )
|
|
end
|
|
|
|
eclipse.reset() -- sync all eclipse components with gamestate
|
|
|
|
--[[ if buff.lycaras_fleeting_glimpse.up then
|
|
state:QueueAuraExpiration( "lycaras_fleeting_glimpse", LycarasHandler, buff.lycaras_fleeting_glimpse.expires )
|
|
end ]]
|
|
|
|
if legendary.sinful_hysteria.enabled and buff.ravenous_frenzy.up then
|
|
state:QueueAuraExpiration( "ravenous_frenzy", SinfulHysteriaHandler, buff.ravenous_frenzy.expires )
|
|
end
|
|
end )
|
|
|
|
spec:RegisterHook( "step", function()
|
|
if Hekili.ActiveDebug then Hekili:Debug( "Eclipse State: %s, Wrath: %d, Starfire: %d; Lunar: %.2f, Solar: %.2f\n", eclipse.state or "NOT SET", eclipse.wrath_counter, eclipse.starfire_counter, buff.eclipse_lunar.remains, buff.eclipse_solar.remains ) end
|
|
end )
|
|
|
|
spec:RegisterHook( "spend", function( amt, resource )
|
|
if legendary.primordial_arcanic_pulsar.enabled and resource == "astral_power" and amt > 0 then
|
|
local v1 = ( buff.primordial_arcanic_pulsar.v1 or 0 ) + amt
|
|
|
|
if v1 >= 300 then
|
|
applyBuff( talent.incarnation.enabled and "incarnation" or "celestial_alignment", 9 )
|
|
v1 = v1 - 300
|
|
end
|
|
|
|
if v1 > 0 then
|
|
applyBuff( "primordial_arcanic_pulsar", nil, max( 1, floor( amt / 30 ) ) )
|
|
buff.primordial_arcanic_pulsar.v1 = v1
|
|
else
|
|
removeBuff( "primordial_arcanic_pulsar" )
|
|
end
|
|
end
|
|
end )
|
|
|
|
-- Abilities
|
|
spec:RegisterAbilities( {
|
|
barkskin = {
|
|
id = 22812,
|
|
cast = 0,
|
|
cooldown = function () return 60 * ( 1 - 0.15 * talent.survival_of_the_fittest.rank ) * ( 1 + ( conduit.tough_as_bark.mod * 0.01 ) ) end,
|
|
gcd = "off",
|
|
school = "nature",
|
|
|
|
startsCombat = false,
|
|
|
|
toggle = "defensives",
|
|
defensive = true,
|
|
|
|
handler = function ()
|
|
applyBuff( "barkskin" )
|
|
|
|
if legendary.the_natural_orders_will.enabled and buff.bear_form.up then
|
|
applyBuff( "ironfur" )
|
|
applyBuff( "frenzied_regeneration" )
|
|
end
|
|
|
|
if talent.matted_fur.enabled then applyBuff( "matted_fur" ) end
|
|
end
|
|
},
|
|
|
|
-- Shapeshift into Bear Form, increasing armor by $m4% and Stamina by $1178s2%, granting protection from Polymorph effects, and increasing threat generation. The act of shapeshifting frees you from movement impairing effects.
|
|
bear_form = {
|
|
id = 5487,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
spend = -25,
|
|
spendType = "rage",
|
|
|
|
startsCombat = false,
|
|
|
|
essential = true,
|
|
noform = "bear_form",
|
|
|
|
handler = function ()
|
|
shift( "bear_form" )
|
|
if talent.ursine_vigor.enabled or conduit.ursine_vigor.enabled then applyBuff( "ursine_vigor" ) end
|
|
end,
|
|
},
|
|
|
|
-- Go Berserk for $d. While Berserk:; Generate $343216s1 combo $lpoint:points; every $t1 sec. Combo point generating abilities generate $s2 additional combo $lpoint:points;. Finishing moves restore up to $405189u combo points generated over the cap.; All attack and ability damage is increased by $s3%.
|
|
berserk = {
|
|
id = 106951,
|
|
cast = 0.0,
|
|
cooldown = 180.0,
|
|
gcd = "off",
|
|
|
|
startsCombat = false,
|
|
|
|
handler = function()
|
|
applyBuff( "berserk" )
|
|
end
|
|
},
|
|
|
|
-- Shapeshift into Cat Form, increasing auto-attack damage by $s4%, movement speed by $113636s1%, granting protection from Polymorph effects, and reducing falling damage. The act of shapeshifting frees you from movement impairing effects.
|
|
cat_form = {
|
|
id = 768,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
startsCombat = false,
|
|
|
|
noform = "cat_form",
|
|
|
|
handler = function ()
|
|
shift( "cat_form" )
|
|
if pvptalent.master_shapeshifter.enabled and talent.feral_affinity.enabled then
|
|
applyBuff( "master_shapeshifter_feral" )
|
|
end
|
|
end,
|
|
},
|
|
|
|
-- Talent: Celestial bodies align, maintaining both Eclipses and granting $s1% haste for $d.
|
|
-- TODO: Revisit if Orbital Strike needs its own button.
|
|
celestial_alignment = {
|
|
id = function() return talent.orbital_strike.enabled and 383410 or 194223 end,
|
|
cast = 0,
|
|
charges = function () if talent.whirling_stars.enabled then return 2 end end,
|
|
cooldown = function () return ( essence.vision_of_perfection.enabled and 0.85 or 1 ) * ( talent.whirling_stars.enabled and ( talent.potent_enchantmeents.enabled and 90 or 100 ) or 180 ) - 60 * talent.orbital_strike.rank end,
|
|
recharge = function () if talent.whirling_stars.enabled then return ( essence.vision_of_perfection.enabled and 0.85 or 1 ) * 100 - 60 * talent.orbital_strike.rank end end,
|
|
gcd = "off",
|
|
school = "astral",
|
|
|
|
talent = "celestial_alignment",
|
|
notalent = "incarnation",
|
|
startsCombat = false,
|
|
|
|
toggle = "cooldowns",
|
|
|
|
handler = function ()
|
|
applyBuff( "celestial_alignment" )
|
|
if set_bonus.tww2 >= 2 then summonTotem( "wild_mushroom" ) end
|
|
stat.haste = stat.haste + 0.1
|
|
|
|
eclipse.trigger_eclipse( "both", spec.auras.celestial_alignment.duration )
|
|
|
|
if pvptalent.moon_and_stars.enabled then applyBuff( "moon_and_stars" ) end
|
|
end,
|
|
|
|
copy = { 194223, 383410, "ca_inc" }
|
|
},
|
|
|
|
-- Talent / Covenant (Night_Fae): Call upon the Night Fae for an eruption of energy, channeling a rapid flurry of $s2 Druid spells and abilities over $d. You will cast $?a24858|a197625[Starsurge, Starfall,]?a768[Ferocious Bite, Shred, Tiger's Fury,]?a5487[Mangle, Ironfur,][Wild Growth, Swiftmend,] Moonfire, Wrath, Regrowth, Rejuvenation, Rake, and Thrash on appropriate nearby targets, favoring your current shapeshift form.
|
|
convoke_the_spirits = {
|
|
id = function() return talent.convoke_the_spirits.enabled and 391528 or 323764 end,
|
|
cast = function() return 4 * ( legendary.celestial_spirits.enabled and 0.75 or 1 ) * ( talent.ashamanes_guidance.enabled and 0.75 or 1 ) end,
|
|
channeled = true,
|
|
cooldown = function() return 120 * ( legendary.celestial_spirits.enabled and 0.5 or 1 ) * ( talent.ashamanes_guidance.enabled and 0.5 or 1 ) end,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
|
|
talent = function()
|
|
if covenant.night_fae then return end
|
|
return "convoke_the_spirits"
|
|
end,
|
|
startsCombat = true,
|
|
|
|
toggle = "cooldowns",
|
|
|
|
disabled = function ()
|
|
return not talent.convoke_the_spirits.enabled and covenant.night_fae and not IsSpellKnownOrOverridesKnown( 323764 ), "you have not finished your night_fae covenant intro"
|
|
end,
|
|
|
|
finish = function ()
|
|
-- Can we safely assume anything is going to happen?
|
|
if state.spec.feral then
|
|
applyBuff( "tigers_fury" )
|
|
if target.maxR < 8 then
|
|
gain( 5, "combo_points" )
|
|
end
|
|
elseif state.spec.guardian then
|
|
elseif state.spec.balance then
|
|
end
|
|
end,
|
|
|
|
copy = { 391528, 323764 }
|
|
},
|
|
|
|
-- Talent: Tosses the enemy target into the air, disorienting them but making them invulnerable for up to $d. Only one target can be affected by your Cyclone at a time.
|
|
cyclone = {
|
|
id = 33786,
|
|
cast = function() return 1.7 * ( buff.heart_of_the_wild.up and 0.7 or 1 ) * haste end,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
|
|
spend = 0.1,
|
|
spendType = "mana",
|
|
|
|
talent = "cyclone",
|
|
startsCombat = true,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "cyclone" )
|
|
end,
|
|
},
|
|
|
|
-- Shift into Cat Form and increase your movement speed by $s1% while in Cat Form for $d.
|
|
dash = {
|
|
id = 1850,
|
|
cast = 0,
|
|
cooldown = 120,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
startsCombat = false,
|
|
|
|
toggle = "defensives",
|
|
|
|
handler = function ()
|
|
if buff.cat_form.down then shift( "cat_form" ) end
|
|
applyBuff( "dash" )
|
|
end,
|
|
},
|
|
|
|
-- Roots the target in place for $d. Damage may cancel the effect.$?s33891[ |C0033AA11Tree of Life: Instant cast.|R][]
|
|
entangling_roots = {
|
|
id = 339,
|
|
cast = function () return pvptalent.owlkin_adept.enabled and buff.owlkin_frenzy.up and 0.85 or 1.7 * haste end,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = 0.06,
|
|
spendType = "mana",
|
|
|
|
startsCombat = true,
|
|
texture = 136100,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "entangling_roots" )
|
|
removeBuff( "natures_swiftness" )
|
|
end,
|
|
},
|
|
|
|
faerie_swarm = {
|
|
id = 209749,
|
|
cast = 0.0,
|
|
cooldown = 30.0,
|
|
gcd = "spell",
|
|
|
|
startsCombat = true,
|
|
pvptalent = "faerie_swarm",
|
|
|
|
handler = function()
|
|
applyDebuff( "target", "faerie_swarm" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Summons a stand of $s1 Treants for $248280d which immediately taunt and attack enemies in the targeted area. |cFFFFFFFFGenerates ${$m5/10} Astral Power.|r
|
|
force_of_nature = {
|
|
id = 205636,
|
|
cast = 0,
|
|
cooldown = function() return talent.early_spring.enabled and 45 or 60 end,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
spend = -20,
|
|
spendType = "astral_power",
|
|
|
|
talent = "force_of_nature",
|
|
startsCombat = true,
|
|
|
|
toggle = "cooldowns",
|
|
ap_check = function() return check_for_ap_overcap( "force_of_nature" ) end,
|
|
|
|
handler = function ()
|
|
summonPet( "treants", 10 )
|
|
if talent.harmony_of_the_grove.enabled then applyBuff( "harmony_of_the_grove" ) end
|
|
if talent.dream_surge.enabled then applyBuff( "dream_burst") end
|
|
-- queue aura ticks +2, +8 3 moonfires, actually triggers the handler
|
|
state:QueueAuraEvent( "treant_moonfires", TreantMoonfires, query_time + 2, "AURA_TICK" )
|
|
state:QueueAuraEvent( "treant_moonfires", TreantMoonfires, query_time + 8, "AURA_TICK" )
|
|
end,
|
|
},
|
|
|
|
|
|
full_moon = {
|
|
id = 274283,
|
|
known = 274281,
|
|
flash = 274281,
|
|
cast = 3,
|
|
charges = 3,
|
|
cooldown = 20,
|
|
recharge = 20,
|
|
gcd = "spell",
|
|
|
|
spend = -48,
|
|
spendType = "astral_power",
|
|
|
|
texture = 1392542,
|
|
startsCombat = true,
|
|
|
|
talent = "new_moon",
|
|
bind = "half_moon",
|
|
|
|
ap_check = function() return check_for_ap_overcap( "full_moon" ) end,
|
|
energize_amount = function() return action.full_moon.spend * -1 end,
|
|
|
|
usable = function () return active_moon == "full_moon" end,
|
|
handler = function ()
|
|
spendCharges( "new_moon", 1 )
|
|
spendCharges( "half_moon", 1 )
|
|
|
|
if talent.radiant_moonlight.disabled or ( action.half_moon.lastCast < action.full_moon.lastCast ) then
|
|
active_moon = "new_moon"
|
|
end
|
|
|
|
end,
|
|
},
|
|
|
|
-- [428655] Moonfire damage has a chance to call down a Fury of Elune to follow your target for ${$s2/1000} sec.; $@spellicon202770 $@spellname202770; Calls down a beam of pure celestial energy, dealing $<dmg> Astral damage over ${$s2/1000} sec within its area.; Generates $?a137010[${$202770m4/$202770t4*$s2/10000} Rage][${$202770m3/$202770t3*$s2/10000} Astral Power] over its duration.
|
|
fury_of_elune = {
|
|
id = 202770,
|
|
cast = 0,
|
|
cooldown = function() return talent.radiant_moonlight.enabled and 45 or 60 end,
|
|
gcd = "spell",
|
|
|
|
-- toggle = "cooldowns",
|
|
|
|
startsCombat = true,
|
|
texture = 132123,
|
|
|
|
handler = function ()
|
|
if not buff.moonkin_form.up then unshift() end
|
|
applyDebuff( "target", "fury_of_elune_ap" )
|
|
end,
|
|
},
|
|
|
|
-- Taunts the target to attack you.
|
|
growl = {
|
|
id = 6795,
|
|
cast = 0,
|
|
cooldown = 8,
|
|
gcd = "off",
|
|
school = "physical",
|
|
|
|
startsCombat = true,
|
|
|
|
handler = function ()
|
|
applyBuff( "growl" )
|
|
end,
|
|
},
|
|
|
|
half_moon = {
|
|
id = 274282,
|
|
known = 274281,
|
|
flash = 274281,
|
|
cast = 2,
|
|
charges = 3,
|
|
cooldown = 20,
|
|
recharge = 20,
|
|
gcd = "spell",
|
|
|
|
spend = -20,
|
|
spendType = "astral_power",
|
|
|
|
texture = 1392543,
|
|
startsCombat = true,
|
|
|
|
talent = "new_moon",
|
|
bind = { "new_moon", "full_moon" },
|
|
|
|
ap_check = function() return check_for_ap_overcap( "half_moon" ) end,
|
|
|
|
usable = function () return active_moon == "half_moon" end,
|
|
handler = function ()
|
|
spendCharges( "new_moon", 1 )
|
|
spendCharges( "full_moon", 1 )
|
|
|
|
active_moon = "full_moon"
|
|
end,
|
|
},
|
|
|
|
-- Talent: Abilities not associated with your specialization are substantially empowered for $d.$?!s137013[ |cFFFFFFFFBalance:|r Magical damage increased by $s1%.][]$?!s137011[ |cFFFFFFFFFeral:|r Physical damage increased by $s4%.][]$?!s137010[ |cFFFFFFFFGuardian:|r Bear Form gives an additional $s7% Stamina, multiple uses of Ironfur may overlap, and Frenzied Regeneration has ${$s9+1} charges.][]$?!s137012[ |cFFFFFFFFRestoration:|r Healing increased by $s10%, and mana costs reduced by $s12%.][]
|
|
heart_of_the_wild = {
|
|
id = 319454,
|
|
cast = 0,
|
|
cooldown = function () return 300 * ( 1 - ( conduit.born_of_the_wilds.mod * 0.01 ) ) end,
|
|
gcd = "spell",
|
|
|
|
toggle = "cooldowns",
|
|
talent = "heart_of_the_wild",
|
|
|
|
startsCombat = false,
|
|
texture = 135879,
|
|
|
|
handler = function ()
|
|
applyBuff( "heart_of_the_wild" )
|
|
|
|
if talent.feral_affinity.enabled then
|
|
shift( "cat_form" )
|
|
elseif talent.guardian_affinity.enabled then
|
|
shift( "bear_form" )
|
|
elseif talent.restoration_affinity.enabled then
|
|
unshift()
|
|
end
|
|
end,
|
|
},
|
|
|
|
-- Talent: Forces the enemy target to sleep for up to $d. Any damage will awaken the target. Only one target can be forced to hibernate at a time. Only works on Beasts and Dragonkin.
|
|
hibernate = {
|
|
id = 2637,
|
|
cast = function() return 1.5 * ( buff.heart_of_the_wild.up and 0.7 or 1 ) * haste end,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
|
|
spend = 0.06,
|
|
spendType = "mana",
|
|
|
|
talent = "hibernate",
|
|
startsCombat = false,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "hibernate" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Shift into Bear Form and invoke the spirit of Ursol to let loose a deafening roar, incapacitating all enemies within $A1 yards for $d. Damage will cancel the effect.
|
|
incapacitating_roar = {
|
|
id = 99,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
talent = "incapacitating_roar",
|
|
startsCombat = true,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "incapacitating_roar" )
|
|
end,
|
|
},
|
|
|
|
-- An improved Moonkin Form that grants both Eclipses, any learned Celestial Alignment bonuses, $?a429536[$s6% increased Arcane damage, ][]and $s2% critical strike chance.; Lasts $d. You may shapeshift in and out of this improved Moonkin Form for its duration.
|
|
incarnation = {
|
|
id = function() return talent.orbital_strike.enabled and 390414 or 102560 end,
|
|
cast = 0,
|
|
cooldown = function () return ( essence.vision_of_perfection.enabled and 0.85 or 1 ) * ( talent.whirling_stars.enabled and ( talent.potent_enchantmeents.enabled and 90 or 100 ) or 180 ) - 60 * talent.orbital_strike.rank end,
|
|
gcd = "off",
|
|
|
|
spend = -40,
|
|
spendType = "astral_power",
|
|
|
|
toggle = "cooldowns",
|
|
|
|
startsCombat = false,
|
|
texture = 571586,
|
|
|
|
talent = "incarnation",
|
|
|
|
handler = function ()
|
|
shift( "moonkin_form" )
|
|
if set_bonus.tww2 >= 2 then summonTotem( "wild_mushroom" ) end
|
|
|
|
applyBuff( "incarnation" )
|
|
stat.crit = stat.crit + 0.10
|
|
stat.haste = stat.haste + 0.10
|
|
|
|
eclipse.trigger_eclipse( "both", spec.auras.incarnation.duration )
|
|
|
|
if pvptalent.moon_and_stars.enabled then applyBuff( "moon_and_stars" ) end
|
|
end,
|
|
|
|
copy = { "incarnation_chosen_of_elune", "Incarnation", 102560, 390414 },
|
|
},
|
|
|
|
-- Talent: Infuse a friendly healer with energy, allowing them to cast spells without spending mana for $d.$?s326228[ If cast on somebody else, you gain the effect at $326228s1% effectiveness.][]
|
|
innervate = {
|
|
id = 29166,
|
|
cast = 0,
|
|
cooldown = 180,
|
|
gcd = "off",
|
|
school = "nature",
|
|
|
|
talent = "innervate",
|
|
startsCombat = false,
|
|
texture = 136048,
|
|
|
|
toggle = "cooldowns",
|
|
|
|
usable = function () return group end,
|
|
handler = function ()
|
|
active_dot.innervate = 1
|
|
end,
|
|
},
|
|
|
|
-- Talent: Increases armor by ${$s1*$AGI/100} for $d.$?a231070[ Multiple uses of this ability may overlap.][]
|
|
ironfur = {
|
|
id = 192081,
|
|
cast = 0,
|
|
cooldown = 0.5,
|
|
gcd = "off",
|
|
school = "nature",
|
|
|
|
spend = 40,
|
|
spendType = "rage",
|
|
|
|
talent = "ironfur",
|
|
startsCombat = false,
|
|
|
|
handler = function ()
|
|
applyBuff( "ironfur" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Finishing move that causes Physical damage and stuns the target. Damage and duration increased per combo point: 1 point : ${$s2*1} damage, 1 sec 2 points: ${$s2*2} damage, 2 sec 3 points: ${$s2*3} damage, 3 sec 4 points: ${$s2*4} damage, 4 sec 5 points: ${$s2*5} damage, 5 sec
|
|
maim = {
|
|
id = 22570,
|
|
cast = 0,
|
|
cooldown = 30,
|
|
gcd = "totem",
|
|
school = "physical",
|
|
|
|
spend = 30,
|
|
spendType = "energy",
|
|
|
|
talent = "maim",
|
|
startsCombat = true,
|
|
|
|
usable = function () return combo_points.current > 0, "requires combo points" end,
|
|
handler = function ()
|
|
applyDebuff( "target", "maim" )
|
|
spend( combo_points.current, "combo_points" )
|
|
end,
|
|
},
|
|
|
|
-- Mangle the target for $s2 Physical damage.$?a231064[ Deals $s3% additional damage against bleeding targets.][] |cFFFFFFFFGenerates ${$m4/10} Rage.|r
|
|
mangle = {
|
|
id = 33917,
|
|
cast = 0,
|
|
cooldown = 6,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
spend = -10,
|
|
spendType = "rage",
|
|
|
|
startsCombat = true,
|
|
texture = 132135,
|
|
|
|
form = function()
|
|
if talent.fluid_form.enabled then return end
|
|
return "bear_form"
|
|
end,
|
|
|
|
handler = function ()
|
|
end,
|
|
},
|
|
|
|
-- Infuse a friendly target with the power of the wild, increasing their Versatility by $s1% for 60 minutes. If target is in your party or raid, all party and raid members will be affected.
|
|
mark_of_the_wild = {
|
|
id = 1126,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
essential = true,
|
|
|
|
spend = 0.01,
|
|
spendType = "mana",
|
|
|
|
startsCombat = false,
|
|
nobuff = "mark_of_the_wild",
|
|
|
|
handler = function ()
|
|
applyBuff( "mark_of_the_wild" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Roots the target and all enemies within $A1 yards in place for $d. Damage may interrupt the effect. Usable in all shapeshift forms.
|
|
mass_entanglement = {
|
|
id = 102359,
|
|
cast = 0,
|
|
cooldown = function () return 30 * ( 1 - ( conduit.born_of_the_wilds.mod * 0.01 ) ) end,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
|
|
talent = "mass_entanglement",
|
|
startsCombat = true,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "mass_entanglement" )
|
|
active_dot.mass_entanglement = max( active_dot.mass_entanglement, active_enemies )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Invokes the spirit of Ursoc to stun the target for $d. Usable in all shapeshift forms.
|
|
mighty_bash = {
|
|
id = 5211,
|
|
cast = 0,
|
|
cooldown = function () return 60 * ( 1 - ( conduit.born_of_the_wilds.mod * 0.01 ) ) end,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
talent = "mighty_bash",
|
|
startsCombat = true,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "mighty_bash" )
|
|
end,
|
|
},
|
|
|
|
-- A quick beam of lunar light burns the enemy for $164812s1 Arcane damage and then an additional $164812o2 Arcane damage over $164812d$?s238049[, and causes enemies to deal $238049s1% less damage to you.][.]$?a372567[ Hits a second target within $279620s1 yds of the first.][]$?s197911[ |cFFFFFFFFGenerates ${$m3/10} Astral Power.|r][]
|
|
moonfire = {
|
|
id = 8921,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
school = "arcane",
|
|
|
|
spend = function () return talent.moon_guardian.enabled and -8 or -6 end,
|
|
spendType = "astral_power",
|
|
|
|
readyTime = function () if state.spec.balance and talent.treants_of_the_moon.enabled then return pet.treants.remains end end,
|
|
|
|
startsCombat = true,
|
|
|
|
cycle = "moonfire",
|
|
|
|
ap_check = function() return check_for_ap_overcap( "moonfire" ) end,
|
|
energize_amount = function() return action.moonfire.spend * -1 end,
|
|
|
|
handler = function ()
|
|
if not buff.moonkin_form.up and not buff.bear_form.up then unshift() end
|
|
applyDebuff( "target", "moonfire" )
|
|
|
|
if talent.twin_moons.enabled and active_enemies > 1 then
|
|
active_dot.moonfire = min( active_enemies, active_dot.moonfire + 1 )
|
|
end
|
|
end,
|
|
},
|
|
|
|
-- Talent: Shapeshift into $?s114301[Astral Form][Moonkin Form], increasing the damage of your spells by $s9% and your armor by $m3%, and granting protection from Polymorph effects.$?a231042[ While in this form, single-target attacks against you have a $h% chance to make your next Starfire instant.][] The act of shapeshifting frees you from movement impairing effects.
|
|
moonkin_form = {
|
|
id = function() return state.spec.restoration and 197625 or 24858 end,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
startsCombat = false,
|
|
|
|
noform = "moonkin_form",
|
|
essential = true,
|
|
|
|
handler = function ()
|
|
shift( "moonkin_form" )
|
|
end,
|
|
|
|
copy = { 24858, 197625 }
|
|
},
|
|
|
|
-- Talent: For $d, $?s137012[all single-target healing also damages a nearby enemy target for $s3% of the healing done][all single-target damage also heals a nearby friendly target for $s3% of the damage done].
|
|
natures_vigil = {
|
|
id = 124974,
|
|
cast = 0,
|
|
cooldown = 90,
|
|
gcd = "off",
|
|
school = "nature",
|
|
|
|
talent = "natures_vigil",
|
|
startsCombat = false,
|
|
|
|
toggle = "defensives",
|
|
usable = function()
|
|
local hp = health.percent or 100
|
|
local vd = settings.vigil_damage or 50
|
|
return hp <= vd, strformat( "health %d%% must be under %d%%", hp, vd )
|
|
end,
|
|
|
|
handler = function ()
|
|
applyBuff( "natures_vigil" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Deals $m1 Astral damage to the target and empowers New Moon to become Half Moon. |cFFFFFFFFGenerates ${$m3/10} Astral Power.|r
|
|
new_moon = {
|
|
id = 274281,
|
|
cast = 1,
|
|
charges = 3,
|
|
cooldown = 20,
|
|
recharge = 20,
|
|
gcd = "totem",
|
|
school = "astral",
|
|
|
|
spend = -10,
|
|
spendType = "astral_power",
|
|
|
|
talent = "new_moon",
|
|
startsCombat = true,
|
|
bind = { "half_moon", "full_moon" },
|
|
|
|
ap_check = function() return check_for_ap_overcap( "new_moon" ) end,
|
|
|
|
usable = function () return active_moon == "new_moon" end,
|
|
handler = function ()
|
|
spendCharges( "half_moon", 1 )
|
|
spendCharges( "full_moon", 1 )
|
|
|
|
active_moon = "half_moon"
|
|
end,
|
|
},
|
|
|
|
-- Shift into Cat Form and enter stealth.
|
|
prowl = {
|
|
id = 5215,
|
|
cast = 0,
|
|
cooldown = 6,
|
|
gcd = "off",
|
|
school = "physical",
|
|
|
|
startsCombat = false,
|
|
|
|
usable = function ()
|
|
if time > 0 and ( not boss or not buff.shadowmeld.up ) then return false, "cannot stealth in combat"
|
|
elseif buff.prowl.up then return false, "player is already prowling" end
|
|
return true
|
|
end,
|
|
|
|
handler = function ()
|
|
shift( "cat_form" )
|
|
applyBuff( "prowl" )
|
|
end,
|
|
|
|
copy = 102547
|
|
},
|
|
|
|
rebirth ={
|
|
id = 20484,
|
|
cast = function() return buff.natures_swiftness.up and 0 or 2 * haste end,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
-- readyTime = there is a brez available .. API for this?
|
|
|
|
handler = function ()
|
|
removeBuff( "natures_swiftness" )
|
|
end
|
|
},
|
|
|
|
-- Heals a friendly target for $s1 and another ${$o2*$<mult>} over $d.$?s231032[ Initial heal has a $231032s1% increased chance for a critical effect if the target is already affected by Regrowth.][]$?s24858|s197625[ Usable while in Moonkin Form.][]$?s33891[ |C0033AA11Tree of Life: Instant cast.|R][]
|
|
regrowth = {
|
|
id = 8936,
|
|
cast = function() return buff.blooming_infusion_regrowth.up and 0 or 1.5 * haste end,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
|
|
spend = function() return 0.10 * ( 1 - 0.08 * buff.abundance.stack ) end,
|
|
spendType = "mana",
|
|
|
|
startsCombat = false,
|
|
|
|
handler = function ()
|
|
if buff.moonkin_form.down then unshift() end
|
|
applyBuff( "regrowth" )
|
|
if talent.forestwalk.enabled then applyBuff( "forestwalk" ) end
|
|
end,
|
|
},
|
|
|
|
-- Talent: Heals the target for $o1 over $d.$?s155675[ You can apply Rejuvenation twice to the same target.][]$?s33891[ |C0033AA11Tree of Life: Healing increased by $5420s5% and Mana cost reduced by $5420s4%.|R][]
|
|
rejuvenation = {
|
|
id = 774,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
|
|
spend = 0.05,
|
|
spendType = "mana",
|
|
|
|
talent = "rejuvenation",
|
|
startsCombat = false,
|
|
|
|
handler = function ()
|
|
if buff.moonkin_form.down then unshift() end
|
|
applyBuff( "rejuvenation" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Nullifies corrupting effects on the friendly target, removing all Curse and Poison effects.
|
|
remove_corruption = {
|
|
id = 2782,
|
|
cast = 0,
|
|
cooldown = 8,
|
|
gcd = "spell",
|
|
school = "arcane",
|
|
|
|
spend = 0.10,
|
|
spendType = "mana",
|
|
|
|
talent = "remove_corruption",
|
|
startsCombat = false,
|
|
|
|
usable = function() return debuff.dispellable_curse.up or debuff.dispellable_poison.up, "requires curse/poison" end,
|
|
|
|
handler = function ()
|
|
removeDebuff( "target", "dispellable_curse" )
|
|
removeDebuff( "target", "dispellable_poison" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Instantly heals you for $s1% of maximum health. Usable in all shapeshift forms.
|
|
renewal = {
|
|
id = 108238,
|
|
cast = 0,
|
|
cooldown = 90,
|
|
gcd = "off",
|
|
school = "nature",
|
|
|
|
talent = "renewal",
|
|
startsCombat = false,
|
|
|
|
toggle = "defensives",
|
|
|
|
handler = function ()
|
|
gain( health.max * 0.2, "health" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: You charge and bash the target's skull, interrupting spellcasting and preventing any spell in that school from being cast for $93985d.
|
|
skull_bash = {
|
|
id = 106839,
|
|
cast = 0,
|
|
cooldown = 15,
|
|
gcd = "off",
|
|
school = "physical",
|
|
|
|
talent = "skull_bash",
|
|
startsCombat = true,
|
|
|
|
toggle = "interrupts",
|
|
|
|
debuff = "casting",
|
|
readyTime = state.timeToInterrupt,
|
|
|
|
handler = function ()
|
|
interrupt()
|
|
end,
|
|
},
|
|
|
|
-- Talent: Summons a beam of solar light over an enemy target's location, interrupting the target and silencing all enemies within the beam. Lasts $d.
|
|
solar_beam = {
|
|
id = 78675,
|
|
cast = 0,
|
|
cooldown = 60,
|
|
gcd = "off",
|
|
school = "nature",
|
|
|
|
spend = 0.168,
|
|
spendType = "mana",
|
|
|
|
talent = "solar_beam",
|
|
startsCombat = true,
|
|
|
|
toggle = "interrupts",
|
|
|
|
debuff = "casting",
|
|
readyTime = state.timeToInterrupt,
|
|
|
|
handler = function ()
|
|
interrupt()
|
|
-- trigger 97547, 97547, 97547
|
|
applyBuff( "solar_beam" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Soothes the target, dispelling all enrage effects.
|
|
soothe = {
|
|
id = 2908,
|
|
cast = 0,
|
|
cooldown = 10,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
|
|
spend = 0.056,
|
|
spendType = "mana",
|
|
|
|
talent = "soothe",
|
|
startsCombat = true,
|
|
|
|
usable = function () return buff.dispellable_enrage.up end,
|
|
handler = function ()
|
|
if buff.moonkin_form.down then unshift() end
|
|
removeBuff( "dispellable_enrage" )
|
|
end,
|
|
},
|
|
|
|
|
|
stag_form = {
|
|
id = 210053,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 1394966,
|
|
|
|
noform = "travel_form",
|
|
handler = function ()
|
|
shift( "stag_form" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Let loose a wild roar, increasing the movement speed of all friendly players within $A1 yards by $s1% for $d.
|
|
stampeding_roar = {
|
|
id = 106898,
|
|
cast = 0,
|
|
cooldown = function () return 120 - ( talent.improved_stampeding_roar.enabled and 60 or 0 ) end,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
talent = "stampeding_roar",
|
|
startsCombat = false,
|
|
|
|
toggle = "interrupts",
|
|
|
|
handler = function ()
|
|
applyBuff( "stampeding_roar" )
|
|
if buff.bear_form.down and buff.cat_form.down then
|
|
shift( "bear_form" )
|
|
end
|
|
end,
|
|
|
|
copy = { 77761, 77764 }
|
|
},
|
|
|
|
-- Talent: Calls down waves of falling stars upon enemies within $50286A1 yds, dealing $<damage> Astral damage over $191034d. Multiple uses of this ability may overlap.$?s327541[ Extends the duration of active Moonfires and Sunfires by $327541s1 sec.][]
|
|
starfall = {
|
|
id = 191034,
|
|
cast = 0,
|
|
cooldown = function () return talent.stellar_drift.enabled and 12 or 0 end,
|
|
gcd = "spell",
|
|
school = "astral",
|
|
|
|
spend = function ()
|
|
if buff.oneths_perception.up or buff.starweavers_warp.up or buff.touch_the_cosmos.up then return 0 end
|
|
return ( 50 - ( buff.incarnation.up and talent.elunes_guidance.enabled and 10 or 0 ) - ( buff.touch_the_cosmos.up and 5 or 0 ) - ( buff.astral_communion.up and 15 or 0 ) ) * ( 1 - 0.05 * buff.rattled_stars.stack ) * ( 1 - 0.1 * buff.timeworn_dreambinder.stack )
|
|
end,
|
|
spendType = "astral_power",
|
|
|
|
startsCombat = true,
|
|
texture = 236168,
|
|
|
|
ap_check = function() return check_for_ap_overcap( "starfall" ) end,
|
|
|
|
handler = function ()
|
|
if talent.hail_of_stars.enabled and ( buff.oneths_perception.up or buff.starweavers_warp.up or buff.touch_the_cosmos.up ) then
|
|
applyBuff( "solstice", 3 )
|
|
end
|
|
|
|
if buff.starweavers_warp.up then removeBuff( "starweavers_warp" )
|
|
else removeBuff( "touch_the_cosmos" ) end
|
|
|
|
if talent.rattle_the_stars.enabled then addStack( "rattled_stars" ) end
|
|
if talent.starlord.enabled then
|
|
if buff.starlord.stack < 3 then stat.haste = stat.haste + 0.04 end
|
|
addStack( "starlord", buff.starlord.remains > 0 and buff.starlord.remains or nil, 1 )
|
|
end
|
|
|
|
if set_bonus.tier29_2pc > 0 then
|
|
addStack( "gathering_starstuff" )
|
|
end
|
|
|
|
applyBuff( "starfall" )
|
|
if level > 53 then
|
|
if debuff.moonfire.up then debuff.moonfire.expires = debuff.moonfire.expires + 4 end
|
|
if debuff.sunfire.up then debuff.sunfire.expires = debuff.sunfire.expires + 4 end
|
|
end
|
|
|
|
removeBuff( "oneths_perception" )
|
|
|
|
if legendary.timeworn_dreambinder.enabled then
|
|
addStack( "timeworn_dreambinder", nil, 1 )
|
|
end
|
|
end,
|
|
},
|
|
|
|
-- Call down a burst of energy, causing $s1 Arcane damage to the target, and $?a429523[${($m1*$m3/100)/(1+$429523s1/100)}][${$m1*$m3/100}] Arcane damage to all other enemies within $A1 yards. Deals reduced damage beyond $s5 targets.; Generates ${$m2/10} Astral Power.
|
|
starfire = {
|
|
id = function () return state.spec.balance and 194153 or 197628 end,
|
|
known = function () return state.spec.balance and IsPlayerSpell( 194153 ) or IsPlayerSpell( 197628 ) end,
|
|
cast = function ()
|
|
if buff.blooming_infusion.up or buff.warrior_of_elune.up or buff.owlkin_frenzy.up then return 0 end
|
|
return haste * 2.25 * ( buff.dreamstate.up and 0.6 or 1 )
|
|
end,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = function () return ( -8 + ( talent.wild_surges.enabled and -2 or 0 ) + ( talent.moon_guardian.enabled and -2 or 0 ) + ( set_bonus.tww1 >= 4 and -2 or 0 ) ) * ( talent.soul_of_the_forest.enabled and buff.eclipse_lunar.up and 1.2 or 1 ) * ( buff.warrior_of_elune.up and 1.3 or 1 ) end,
|
|
spendType = "astral_power",
|
|
|
|
startsCombat = true,
|
|
texture = 135753,
|
|
|
|
ap_check = function() return check_for_ap_overcap( "starfire" ) end,
|
|
|
|
talent = "starfire",
|
|
|
|
energize_amount = function() return action.starfire.spend * -1 end,
|
|
|
|
handler = function ()
|
|
if talent.fluid_form.enabled and not buff.moonkin_form.up then unshift() end
|
|
|
|
removeBuff( "gathering_starstuff" )
|
|
if talent.natures_grace.enabled and buff.dreamstate.up then removeStack( "dreamstate" ) end
|
|
if talent.dream_surge.enabled and buff.dream_burst.up then removeStack( "dream_burst" ) end
|
|
if talent.lunar_calling.disabled then eclipse.advance( "starfire" ) end
|
|
|
|
if buff.blooming_infusion.up then
|
|
removeBuff( "blooming_infusion" )
|
|
elseif buff.warrior_of_elune.up then
|
|
removeStack( "warrior_of_elune" )
|
|
if buff.warrior_of_elune.down then
|
|
setCooldown( "warrior_of_elune", 45 )
|
|
end
|
|
elseif buff.owlkin_frenzy.up then
|
|
removeStack( "owlkin_frenzy" )
|
|
end
|
|
|
|
if azerite.dawning_sun.enabled then applyBuff( "dawning_sun" ) end
|
|
end,
|
|
|
|
finish = function ()
|
|
if talent.fluid_form.enabled and buff.moonkin_form.down then shift( "moonkin_form" ) end
|
|
end,
|
|
|
|
copy = { 194153, 197628 }
|
|
},
|
|
|
|
|
|
starsurge = {
|
|
id = 78674,
|
|
cast = 0,
|
|
cooldown = function() return state.spec.balance and 0 or ( talent.starlight_conduit.enabled and 6 or 10 ) end,
|
|
gcd = "spell",
|
|
|
|
spend = function ()
|
|
if not state.spec.balance then return ( talent.starlight_conduit.enabled and 0.003 or 0.006 ) end
|
|
if buff.oneths_clear_vision.up or buff.starweavers_weft.up or buff.touch_the_cosmos.up then return 0 end
|
|
return ( 40 - ( buff.incarnation.up and talent.elunes_guidance.enabled and 8 or 0 ) - ( buff.touch_the_cosmos.up and 5 or 0 ) - ( buff.astral_communion.up and 15 or 0 ) ) * ( 1 - 0.05 * buff.rattled_stars.stack ) * ( 1 - 0.1 * buff.timeworn_dreambinder.stack )
|
|
end,
|
|
spendType = function ()
|
|
if not state.spec.balance then return "mana" end
|
|
return "astral_power"
|
|
end,
|
|
|
|
startsCombat = true,
|
|
texture = 135730,
|
|
talent = "starsurge",
|
|
|
|
ap_check = function() return check_for_ap_overcap( "starsurge" ) end,
|
|
|
|
handler = function ()
|
|
if buff.bear_form.up or buff.cat_form.up then unshift() end
|
|
|
|
if not state.spec.balance then return end
|
|
|
|
if talent.hall_of_stars.enabled and ( buff.oneths_clear_vision.up or buff.starweavers_weft.up or buff.touch_the_cosmos.up ) then
|
|
applyBuff( "solstice", 3 )
|
|
end
|
|
|
|
if buff.starweavers_weft.up then removeBuff( "starweavers_weft" )
|
|
else removeBuff( "touch_the_cosmos" ) end
|
|
|
|
if talent.rattle_the_stars.enabled then addStack( "rattled_stars" ) end
|
|
if talent.starlord.enabled then
|
|
if buff.starlord.stack < 3 then stat.haste = stat.haste + 0.04 end
|
|
addStack( "starlord", buff.starlord.remains > 0 and buff.starlord.remains or nil, 1 )
|
|
end
|
|
if talent.stellar_amplification.enabled then
|
|
if debuff.stellar_amplification.up and buff.stellar_amplification.duration < 20 then
|
|
buff.stellar_amplification.duration = buff.stellar_amplification.duration + 5
|
|
buff.stellar_amplification.expires = buff.stellar_amplification.expires + 5
|
|
else
|
|
applyDebuff( "target", "stellar_amplification" )
|
|
end
|
|
end
|
|
|
|
if set_bonus.tier29_2pc > 0 then
|
|
addStack( "gathering_starstuff" )
|
|
end
|
|
|
|
removeBuff( "oneths_clear_vision" )
|
|
removeBuff( "sunblaze" )
|
|
|
|
if pvptalent.moonkin_aura.enabled then
|
|
addStack( "moonkin_aura", nil, 1 )
|
|
end
|
|
|
|
if azerite.arcanic_pulsar.enabled then
|
|
addStack( "arcanic_pulsar" )
|
|
if buff.arcanic_pulsar.stack == 9 then
|
|
removeBuff( "arcanic_pulsar" )
|
|
applyBuff( "ca_inc", 6 )
|
|
eclipse.trigger_both( 6 )
|
|
end
|
|
end
|
|
|
|
if legendary.timeworn_dreambinder.enabled then
|
|
addStack( "timeworn_dreambinder", nil, 1 )
|
|
end
|
|
end,
|
|
|
|
copy = { 78674, 197626 },
|
|
|
|
},
|
|
|
|
-- Talent: Burns the target for $s1 Astral damage, and then an additional $o2 damage over $d. |cFFFFFFFFGenerates ${$m3/10} Astral Power.|r
|
|
stellar_flare = {
|
|
id = 202347,
|
|
cast = 1.5,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
school = "astral",
|
|
|
|
spend = -12,
|
|
spendType = "astral_power",
|
|
|
|
talent = "stellar_flare",
|
|
startsCombat = true,
|
|
|
|
ap_check = function() return check_for_ap_overcap( "stellar_flare" ) end,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "stellar_flare" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: A quick beam of solar light burns the enemy for $164815s1 Nature damage and then an additional $164815o2 Nature damage over $164815d$?s231050[ to the primary target and all enemies within $164815A2 yards][].$?s137013[ |cFFFFFFFFGenerates ${$m3/10} Astral Power.|r][]
|
|
sunfire = {
|
|
id = 93402,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
|
|
spend = -6,
|
|
spendType = "astral_power",
|
|
|
|
startsCombat = true,
|
|
texture = 236216,
|
|
|
|
cycle = "sunfire",
|
|
|
|
ap_check = function()
|
|
return astral_power.current - action.sunfire.cost + ( talent.shooting_stars.enabled and 4 or 0 ) + ( talent.natures_balance.enabled and ceil( execute_time / 1.5 ) or 0 ) < astral_power.max
|
|
end,
|
|
|
|
readyTime = function()
|
|
return mana[ "time_to_" .. ( 0.12 * mana.max ) ]
|
|
end,
|
|
|
|
handler = function ()
|
|
if buff.bear_form.up or buff.cat_form.up then unshift() end
|
|
spend( 0.12 * mana.max, "mana" ) -- I want to see AP in mouseovers.
|
|
applyDebuff( "target", "sunfire" )
|
|
if talent.improved_sunfire.enabled then active_dot.sunfire = active_enemies end
|
|
end,
|
|
},
|
|
|
|
-- Talent: Consumes a Regrowth, Wild Growth, or Rejuvenation effect to instantly heal an ally for $s1.$?a383192[ Swiftmend heals the target for $383193o1 over $383193d.][]
|
|
swiftmend = {
|
|
id = 18562,
|
|
cast = 0,
|
|
cooldown = 15,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
|
|
spend = 0.10,
|
|
spendType = "mana",
|
|
|
|
talent = "swiftmend",
|
|
startsCombat = false,
|
|
|
|
handler = function ()
|
|
if buff.moonkin_form.down then unshift() end
|
|
gain( health.max * 0.1, "health" )
|
|
end,
|
|
},
|
|
|
|
-- Sprout thorns for $d on the friendly target. When victim to melee attacks, thorns deals $305496s1 Nature damage back to the attacker. Attackers also have their movement speed reduced by $232559s1% for $232559d.
|
|
thorns = {
|
|
id = 305497,
|
|
cast = 0,
|
|
cooldown = 45,
|
|
gcd = "totem",
|
|
school = "nature",
|
|
|
|
spend = 0.12,
|
|
spendType = "mana",
|
|
|
|
pvptalent = function ()
|
|
if essence.conflict_and_strife.enabled then return end
|
|
return "thorns"
|
|
end,
|
|
startsCombat = false,
|
|
texture = 136104,
|
|
|
|
handler = function ()
|
|
applyBuff( "thorns" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Shift into Cat Form and increase your movement speed by $s1%, reducing gradually over $d.
|
|
tiger_dash = {
|
|
id = 252216,
|
|
cast = 0,
|
|
cooldown = 45,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
talent = "tiger_dash",
|
|
startsCombat = false,
|
|
|
|
handler = function ()
|
|
shift( "cat_form" )
|
|
applyBuff( "tiger_dash" )
|
|
end,
|
|
},
|
|
|
|
-- Shapeshift into a travel form appropriate to your current location, increasing movement speed on land, in water, or in the air, and granting protection from Polymorph effects. The act of shapeshifting frees you from movement impairing effects.$?a159456[ Land speed increased when used out of combat. This effect is disabled in battlegrounds and arenas.][]
|
|
travel_form = {
|
|
id = 783,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
school = "physical",
|
|
|
|
startsCombat = false,
|
|
|
|
noform = "travel_form",
|
|
handler = function ()
|
|
shift( "travel_form" )
|
|
end,
|
|
},
|
|
|
|
|
|
treant_form = {
|
|
id = 114282,
|
|
cast = 0,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
startsCombat = false,
|
|
texture = 132145,
|
|
|
|
handler = function ()
|
|
shift( "treant_form" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Blasts targets within $61391a1 yards in front of you with a violent Typhoon, knocking them back and dazing them for $61391d. Usable in all shapeshift forms.
|
|
typhoon = {
|
|
id = 132469,
|
|
cast = 0,
|
|
cooldown = function() return 30 - 5 * talent.incessant_tempest.rank end,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
|
|
talent = "typhoon",
|
|
startsCombat = true,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "typhoon" )
|
|
if target.maxR < 15 then setDistance( target.distance + 5 ) end
|
|
end,
|
|
},
|
|
|
|
-- Talent: Conjures a vortex of wind for $d at the destination, reducing the movement speed of all enemies within $A1 yards by $s1%. The first time an enemy attempts to leave the vortex, winds will pull that enemy back to its center. Usable in all shapeshift forms.
|
|
ursols_vortex = {
|
|
id = 102793,
|
|
cast = 0,
|
|
cooldown = 60,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
|
|
talent = "ursols_vortex",
|
|
startsCombat = false,
|
|
|
|
handler = function ()
|
|
applyDebuff( "target", "ursols_vortex" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Your next $n Starfires are instant cast and generate $s2% increased Astral Power.
|
|
warrior_of_elune = {
|
|
id = 202425,
|
|
cast = 0,
|
|
cooldown = 45,
|
|
gcd = "off",
|
|
school = "arcane",
|
|
|
|
talent = "warrior_of_elune",
|
|
startsCombat = false,
|
|
|
|
handler = function ()
|
|
applyBuff( "warrior_of_elune", nil, 3 )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Bound backward away from your enemies.
|
|
wild_charge = {
|
|
id = function ()
|
|
if buff.bear_form.up then return 16979
|
|
elseif buff.cat_form.up then return 49376
|
|
elseif buff.moonkin_form.up then return 102383 end
|
|
return 102401
|
|
end,
|
|
known = 102401,
|
|
cast = 0,
|
|
cooldown = 15,
|
|
gcd = "off",
|
|
school = "physical",
|
|
|
|
talent = "wild_charge",
|
|
startsCombat = false,
|
|
|
|
usable = function () return target.exists and target.maxR > 7, "target must be 8+ yards away" end,
|
|
|
|
handler = function ()
|
|
if buff.bear_form.up then target.maxR = 5; applyDebuff( "target", "immobilized" )
|
|
elseif buff.cat_form.up then target.maxR = 5; applyDebuff( "target", "dazed" )
|
|
elseif buff.moonkin_form.up then setDistance( target.maxR + 10 ) end
|
|
end,
|
|
|
|
copy = { 49376, 16979, 102401, 102383 }
|
|
},
|
|
|
|
-- Talent: Heals up to $s2 injured allies within $A1 yards of the target for $o1 over $d. Healing starts high and declines over the duration.$?s33891[ |C0033AA11Tree of Life: Affects $33891s3 additional $ltarget:targets;.|R][]
|
|
wild_growth = {
|
|
id = 48438,
|
|
cast = 1.5,
|
|
cooldown = 10,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
|
|
spend = 0.15,
|
|
spendType = "mana",
|
|
|
|
talent = "wild_growth",
|
|
startsCombat = false,
|
|
|
|
handler = function ()
|
|
unshift()
|
|
applyBuff( "wild_growth" )
|
|
end,
|
|
},
|
|
|
|
-- Talent: Grow a magical mushroom at the target enemy's location. After $d, the mushroom detonates, dealing $88751s1 Nature damage and generating up to $88751s2 Astral Power based on targets hit.
|
|
wild_mushroom = {
|
|
id = 88747,
|
|
cast = 0,
|
|
charges = 3,
|
|
cooldown = 30,
|
|
recharge = 30,
|
|
gcd = "spell",
|
|
school = "nature",
|
|
|
|
talent = "wild_mushroom",
|
|
startsCombat = false,
|
|
notalent = "sunseeker_mushroom",
|
|
|
|
handler = function ()
|
|
summonTotem( "wild_mushroom" )
|
|
if talent.fungal_growth.enabled then
|
|
if debuff.fungal_growth.up then debuff.fungal_growth.expires = query_time + 7
|
|
else applyDebuff( "target", "fungal_growth", 7 ) end
|
|
end
|
|
end,
|
|
},
|
|
|
|
-- Hurl a ball of energy at the target, dealing $s1 Nature damage.$?a197911[ |cFFFFFFFFGenerates ${$m2/10} Astral Power.|r][]
|
|
wrath = {
|
|
id = 190984,
|
|
known = function () return state.spec.balance and IsPlayerSpell( 190984 ) or IsPlayerSpell( 5176 ) end,
|
|
cast = function ()
|
|
if buff.blooming_infusion.up then return 0 end
|
|
return haste * 1.5 * ( buff.dreamstate.up and 0.6 or 1 )
|
|
end,
|
|
cooldown = 0,
|
|
gcd = "spell",
|
|
|
|
spend = function ()
|
|
if state.spec.balance then return -1 * ( 6 + ( talent.wild_surges.enabled and 2 or 0 ) + ( set_bonus.tww1 >= 4 and 2 or 0 ) ) * ( talent.soul_of_the_forest.enabled and buff.eclipse_solar.up and 1.6 or 1 ) end
|
|
return 0.002
|
|
end,
|
|
spendType = function()
|
|
if state.spec.balance then return "astral_power" end
|
|
return "mana"
|
|
end,
|
|
|
|
startsCombat = function() return action.wrath.in_flight end,
|
|
texture = 535045,
|
|
|
|
ap_check = function () return check_for_ap_overcap( "solar_wrath" ) end,
|
|
|
|
velocity = 20,
|
|
|
|
impact = function ()
|
|
if talent.dream_surge.enabled and buff.dream_burst.up then removeStack( "dream_burst" ) end
|
|
end,
|
|
|
|
energize_amount = function() return action.wrath.spend * -1 end,
|
|
|
|
handler = function ()
|
|
if talent.fluid_form.enabled and not buff.moonkin_form.up then unshift() end
|
|
|
|
removeBuff( "blooming_infusion" )
|
|
removeBuff( "gathering_starstuff" )
|
|
if talent.natures_grace.enabled and buff.dreamstate.up then removeStack( "dreamstate" ) end
|
|
|
|
eclipse.advance( "wrath" )
|
|
|
|
removeBuff( "dawning_sun" )
|
|
if azerite.sunblaze.enabled then applyBuff( "sunblaze" ) end
|
|
end,
|
|
|
|
finish = function ()
|
|
if talent.fluid_form.enabled and buff.moonkin_form.down then shift( "moonkin_form" ) end
|
|
end,
|
|
|
|
copy = { "solar_wrath", 5176 }
|
|
},
|
|
} )
|
|
|
|
spec:RegisterRanges( "moonfire", "entangling_roots", "growl", "shred" )
|
|
|
|
spec:RegisterOptions( {
|
|
enabled = true,
|
|
|
|
aoe = 3,
|
|
cycle = false,
|
|
|
|
nameplates = false,
|
|
nameplateRange = 40,
|
|
rangeFilter = false,
|
|
|
|
damage = true,
|
|
damageDots = true,
|
|
damageExpiration = 6,
|
|
|
|
potion = "tempered_potion",
|
|
|
|
package = "Balance",
|
|
} )
|
|
|
|
spec:RegisterSetting( "vigil_damage", 50, {
|
|
name = strformat( "%s Damage Threshold", Hekili:GetSpellLinkWithTexture( spec.abilities.natures_vigil.id ) ),
|
|
desc = strformat( "If set below 100%%, |W%s|w may only be recommended if your health has dropped below the specified percentage.\n\n"
|
|
.. "By default, |W%s|w also requires the |cFFFFD100Defensives|r toggle to be active.", spec.abilities.natures_vigil.name, spec.abilities.natures_vigil.name ),
|
|
type = "range",
|
|
min = 1,
|
|
max = 100,
|
|
step = 1,
|
|
width = "full"
|
|
} )
|
|
|
|
spec:RegisterSetting( "starlord_cancel", false, {
|
|
name = strformat( "%s |TInterface\\Addons\\Hekili\\Textures\\Cancel:0|t Cancel", Hekili:GetSpellLinkWithTexture( spec.auras.starlord.id ) ),
|
|
desc = strformat( "If checked, canceling |TInterface\\Addons\\Hekili\\Textures\\Cancel:0|t your %s may be recommended. Canceling it allows you to start building stacks via %s and %s at its full duration.\n\n"
|
|
.. "You will likely want a |cFFFFD100/cancelaura %s|r macro to manage this during combat.", spec.auras.starlord.name, Hekili:GetSpellLinkWithTexture( spec.abilities.starsurge.id ),
|
|
Hekili:GetSpellLinkWithTexture( spec.abilities.starfall.id ), spec.auras.starlord.name ),
|
|
icon = 462651,
|
|
iconCoords = { 0.1, 0.9, 0.1, 0.9 },
|
|
type = "toggle",
|
|
width = "full"
|
|
} )
|
|
|
|
-- Starlord Cancel Override
|
|
class.specs[0].abilities.cancel_buff.funcs.usable = setfenv( function ()
|
|
if not settings.starlord_cancel and args.buff_name == "starlord" then return false, "starlord cancel option disabled" end
|
|
return args.buff_name ~= nil, "no buff name detected"
|
|
end, state )
|
|
|
|
--[[ spec:RegisterSetting( "delay_berserking", false, {
|
|
name = strformat( "Delay %s", Hekili:GetSpellLinkWithTexture( class.specs[ 0 ].auras.berserking.id ) ),
|
|
desc = strformat( "If checked, the default priority will attempt to adjust the timing of %s to be consistent with simmed %s usage.",
|
|
Hekili:GetSpellLinkWithTexture( class.specs[ 0 ].auras.berserking.id ), Hekili:GetSpellLinkWithTexture( class.specs[ 0 ].auras.power_infusion.id ) ),
|
|
type = "toggle",
|
|
width = "full",
|
|
} ) ]]
|
|
|
|
spec:RegisterPack( "Balance", 20250506, [[Hekili:T31EZTnos(plU2kkK2rpiLL94TK1wzMZ3vzUmpQ4SZ8hxTsIsIYIxKi1YhXXxPsF2VgaKGaGaGGYYozMX1mvCIjyJgn6Ur3)qtGXoJ)44Bx4L6p(ND75oO3GEx0XP35xny8TPpS1F8TB9M)jV7G)sO3g4p)EV1EHZX)(hwh5Ta96jrzXOF1Q00Tj)9UDVliDv2SoZJ20njyt2AV0GOW5XEltr)75DNToAw30v(37fFp00GWUVDoQj)ACquCq6dVpijnP7I4SGftMr6VoOxC8TZYcwN(UWXZKYZ9VA8TEzPRIIhF7TbB(bGJcwSWN0C)e49rnVDp4)V4VVFkQjWF(q489)i5bN32DG0h0VD)EkEGZ58pyQvACq4N8t3pDEu4Ia0alXMP99H2)XIMSm4l(jLpS33bp8d(Bx7n3F)0p7fh4nBn0GPi50(P(ZxhSnbEYg)uVu0JGF3x2g7NKG6fg6matNnrFgAXmFVyONII3SFAsA2YL4)X(PHr3Z8gUi263)Dyu47LefUFQ7(PzBrs5Ig5seBFW)Z(XaRBHOHpmaTb2lk(tEXrzHlsYj(9XEiooARFOFmMcN3UNdR8LH4N32XTTlIdUD7dB8ss9Jb6eSzBmma24hMw0khYiJJatTUnlCzqSVDrR6129kOv)NbFz)03(l3SF6n5YTYNFHavEZ(PEl(FZssr9wXyynmsxheEhZ71xb73JW(ooD61zq5VS3faHHF64q(PRJ83V3vTD)oOjOFELYM0ZH0KENN)Z8xXPx(phKtcv9Y3bmc8OFYl(tWudOhagH7N(7bRxu0IljdXpI)9i1MFhBGo(21iBsSVc)LEzRtH)6pJ9D4HnDrobw7fpb012m(w)qKU5IXF)4uWef1QYFd9fWAiedZ4GTKF3)ZnG(K)I)f2c5U7anNPVpleXhftHtda2(E4Nl9caccdHO9tblG5GwdWTeTUV4o(wGOGAuGh4hlyd0(Hyn6wuJOoRreEsq4ehex2xGlJ2cdj)0s2TWye93wNb)4I9t7cguB9xVEYkKo7(PNbSJ3AqdQtOxAgywsDFLtz2MefpliDYSyFVp5hx2Gt3pDruANnrryL6oPbZ)eshe9alWygSFfE1KuWf9(PJWp39Y9tBJhQNM3yyIjbiIFNST7NAJ)F4rUNli6)T3(H392V)93ClEOoH4TFRh4z5Z(t8s2IesN3yH08OO1lIUpSZCpqupVZYmqAbZwR8IVZFs(mZ)a5QmVDGH3C)jrlNqKGDI934feMWYuaP8xU0h6sGZMVaXydAmJnlkjbRoSm4UvPtY7gSAIipVilgVcgEYRGqDe5cggCnOnmH8YiM7IgZCW84ju9K7xfeJ8cnbMNJtkvu2TJTvWAnFo6tGiDL)KKTbGYVqtlhvsAj7W)U5l6SX7leTeY7QtgPJAG8QFt69rvf(YuyaY6maZFLd(04O1i1geDxaggBkh9245zlM5UOWjzja1kwf(AWTjHpRPvoKwPRj9z6W8FFNuNo0X1bmyTA84Tb6gaNUYpocgd(GBkWPi41A(QOe)q8ZogdH26SPqSQH8PLP6rdXtd5VHFWA8FXQIECB0AYy5v3AOCj7Atg1AjQwz2b2P2n0oslp06imVnSM(i3inNVRRPxGzAbrP6x0BXdusRZy0TILO7HRg)IL4FCTeLnTFGD6bBjkJho2wIY6dfwIkAA9wIUYSeTLowKgxrlSfbo208MLTLlOZyuavtOzpJIH6Yghdf1TGi5kuhRgutU1nie4SXbo0loelSZThrM7yduotDsa6oefp9XUbnTxh3Y5e0unizH56jPrtwe4JNeqANeE9ewxdFY3FRFCHlN7IXj5JidwKcQnBIcFG7X0q)5cJwqe)DnweRjg6b0WP4NNfTDeutGb959ycG6ymU56qfPxqe3deLq5w2CIPRASykxxGKV5CV1ifc(yZjjrs0csq5ZfJs9dZu9XQtwunQSnZI9wdsTu)WKG0h6e7f(joF3jrz01JGHRFskJwQy(23(qCWY)fUp(TC(E)0ycaulmd2jwjg0)WmeEKIKvo9ASWcpxMN1mAu4HemRajwYeV45EGjxE6UNLpVlVT5tV42YYGZI8sNG)Tjyg0rGb5KoV7J38t3wa8zcfzQj37pJfFHYucL4LHKcE57cY2O4uMC2DVkxj(qsi1U231Thden8db04xf4mbBatnu2TqQ)Z9dxaI4hMK4hNTHDKJaQiHa(gVnCXONdjdHwWOYcM3EHPjfATO3qz4gkTGhst2Sw)GTuNhpMoogiwvLzSAcZOqyMZk5rwWVIRE9RHOyGVQqfwZKksxqecScDb0SZCKB4SeWrSxyYMGuOVyveSA0CuLKJds6WRBwjIdjTWKX)ORjgy20LJmlSnkyHvxPcl(B1ObRjZrQuN(2qrZUqfsLUas)P5OdshcHrOq0iEdQ127zBGZgbJYPpnycItS4IImvqZXAD8mQC2wlsvSRNDhA7vcMx0a(qvCeHfT0Ig3Ahwt4tQZIKe2oFBu7rrE7vO(iVXOazw7NMIIFooB2dfZVkfoNqqORvnnHyuwhIaftfAueTiT6mYpoveOHvEjOoV(EdzMpGn3sk7RC6fBsMSokLzYenJlI1SWmURQzCPEyfMuCB4mUBtMXDpOzCQF66ahXedR(gtPwh3Kt0JlYGcikKPd1m4qQFnRM1H1h(Pwteh5MiYe8hftexSjIiucfMiZGmLG(cEHewRKAMIBzYmSoy9SmdbiwpsczutxCMDeGgPIz0xmsd9Zq5qM8qOhKw3e)WvOmOILMtJ8nbPI7AreHmDLyLsggOtROUmzgUigE89rHGtLabjefZ3)ijeDL4b85qi6(1qi6kIdqPmsPVdKdzMCx3gvevJRyo7se4nkEsimjgNaXWIzOnCh3vIPhx2vCq2qGpc(LGyEosPPKGXzHti)9jOsOGuif5bV5f5J7fvjEP7DH)j6)qGLopAZmVQfKXgV4pvmxEFW6fYkldABHmUHbncViXY3O5fgbZ2D4Vg5sc0k8whCxiQ2A4YR)KMHXkAEexvyK5xUIcGDg)WkvbU4Q5TyvvIbElwiNGkidBrPOXRwLiHJ(CqO3xsMSXpEEwmsE6F3DkcAwaMk8GdeKjfJq8y1rvDjCmgrsCXujspZgrsIkv1iYv2Ue0KvXl1fH(AnQwMwc)HpN(krWaUNHx7(0vea7taDxs9fLJxVhjLoe2xfTSiXnQLD(VxgU7fTrA9r5tRpQvbGBhWf7cC9bMIkyl(AUB6mVeeFJIec)yiHvurkHQ7RCeDzLqILfLmSU5ZDOoPLILmyWJmhO7sOIlFcdr5DiLs8Bw4TZqb3B)LBKUqbdG1yEUqka(cPOEZ8R5qLfvLpKGZiQpsXbESKkGJtm(mYksf8I(3lzoGOOf03gDVFCNf(ldMhKswyMsEM6dJS5Hc9H361YCgZUSdMpy61y)LX(jRqTTi6ezBpwB02uKlbiP(CbtEzMGRmA1eHvXBZz8wWDtwS5UIEGd9iDBMu)IPctaJ(es8jGy4H5R9l4hKgUKfEOc4SJQSJSltccKU4avTLZyQWA4Lz1COPvoLQEDkLEdS4CiegfMdVqnUdSR4rOYURl43uYksM5V6q5q5ULuL2LWkdpknS20MKfICTbtWxIDJjOareIc)Y86fGB7(vS5Setlx2Aki33AYgqPJT6FTzjNIDmwH5yLnBvIwv1AHGhoCTf)0Ggx5LJkczAsrxu1AwBPgzay95ZLNrc)6iWGY3TfJ5cTnKRuIhSVSqh0c4pDNiQbvgda4K2H1bZzZNSLPjjdcwnOgjIT3JPI(EggaAkeQQWVktv7mAHYu)M(ZQJDjvuvtDg1YmZSwMQFpsZ6KL62TPPcvvgyw)WhkPqpnwwHBunrMY4MzOuw8duGfgRRaiqEDvc(cXn6yzBAEnLfcthufBKXY2fvJjidekJLT5FYsEtXkmTYdWjx(nb)T9WTa(LCQFQjtrOsytnCcO4I9JgYHxm6B(JFkrmUsUYmWeExv5ur8ssnqLmerbVv)GphgGcc3HjAg2aEOrbPieNk7ebdQO4TCgA79(EFgJ8Hx8wkwS4NMgLnFf26zEeegrYKIeU4eWSzHvz)a01F(ltRqOKmqIoMckEL(qaGr1XJyPqXGtLjpykF0pMtFQQ52sDstN9)tyXlYPQjXb7yk85fnk0)ECcuIZDCOdVYB9sPTQpBRWrnkRvQ9ODc(t37ZtqLgSthei1t2KLSkokIUBYOu2wMfEhOjqbDd)bXX4eH99W9OwxFANt0UOJRApt1xJNC(uWTRov6ryTOAlauUEXKAavPdj3lzNpZHrJDUmfVVd6GEt0FopkC3(XMjZmXzF10lbd9l1d72xdm3OzxRoIHVbqdufsDsbBQSlZl8sj5GxpW7ACVHJPoxrOEcjDyQmDzvWQzc6vcdDXuARfGkJ8OBkwtndCodJR1aeQAuyTQd9Ozr1QEhjEcXLIA6QbILNpKX0K6JclaGfKJL)inq5NhKROgkARLUl4)dA3MOSWuvbiAGV3xWIQEgSoObEblQJeuoVGf1lyrDWyrPoIUb81hoNp2HY9kRdSk1zsr3mEV41rXlQcLd9jfF1bGjOkN3h2ookpoeLvKSjXz9nxuvklE0VkBlLcEuDSwMPWpSYzacxW1v(Oi1HrunHPOMwQqVqtLeYPMZHkd)iG5BaCp(leQVk)ENRySPPeeBEGwcruPIxk84RBvb2kzKIStQ26y8iWVTQIMkbFdwwZ)l(ZZs9zGjvhiRvEb7JLyPelRujvE5FDLlLO3PhYovifZW7srMgB7Ogrznq29KGfUgO8uu2t1NQeonrXeKWnWQ6EgiRzY7aBUJ(l17kHfVB7(Yq6RuERob)6WArBSqUQx8rhsEYZ019Q6XJmhYcjysYH84V(HBM8d)hFB)TCZieQ8HABq(0YXpHVG2p4DRSS87vHqyEMiFB9nfEeZtvHaQ63GxnF0LFB9j4vF6TMmUDhN)1iG8pJEm5Cz98EU4TeieDKmm(w8HkjW8rOtpu8bS5RZpmjFnk63)Dgy2dHYNeHwyZllnAJxk6xmFLx4D(jD2)JVpabDg6aQ8hGWd9JXpocKgytiWalaSJE9fVI5qz8SC3okoqglES0dJXtLDqmEQf2nGKJGXrwUx229uIxIYdDrB7tDphgHOdQYxFr3Vb5nQK9cEj7Rl0JQIltX4rd0nqtSC(I9teXFIi7l88l88l8SHeVzK1BXd6jkPbnNFnIW1sYQq3wHOsBIr87Hr8Aj7HnTzipFyeVwYEyIcd55dJ4prK9fE(VC8SmxrsAqZ5xJiSkswjczRt0Uxn72Ds97uZUD0ExdAYdZHK4u3D74sgEOjV9z9nRxgv2iv7A8zodo1GDEZULLIuIUU3UDkFMZUDQEuFGKACyAcRBziVB08wlfFwMTECmzBXMuaSXUDgWtwMmlpSp0o)G1wwCAsTD6z)kTVFbRyps2RRzC3asBBOMQMER1JqkpudDbvFG701GlgXjsu1yWhJTAfDxg98Qosnqf6f98Nh98QtonG0nwpVAVDC0ZRsxb9CjnqTEU4AP22v4sHv0ADcFXHxS88lRT(YAR)PYNtxZCmCiRTAiPBSpNxwB9f98Vo65YxB1qs3y98)YS2knZwN(krRQYUNjbUkzTHlzCL0xYUZjjH86P)51KAo1da7bA1UDODuUf)I8LBmh)bjBllDL2wTQyehrw62R7Zu11V6c7rUx1s1Jh52tTlUEfIZ)qlb6(OKaLQjdEIvZ1sF1BWS8(sB7Bq)QyJQL3PQBCd6rXdCwfYYQTYS(4WGC8PL6Mq38ZVnjKR8jpL84tl1lPRAOxR3kZeN9APFdSYQV9nOFn1kRMg3GESwRmvTYS(4W2OQNwQ)ur3V2CnJ5uryJ6m5yAJz89Hs)Nok)1NZDu6p2rP)4JREXtl1vs3kbhFIoVVToXu)LITuHtoXMj6GsjCwdD1MiSUya7xZB2Y6eTfNleNS(qFLL77a7xPtfvEkV0MP4RTPEYAlnOEl3EN527uRQk56endDhyZIFIYtfE7cnYx0LEI0L6(0OlPNSFL0LkDD9DM4s0Okvs0z7XJYMqt2JUz1R3u8yEo9Q6xA0Wkz4PJYMqtTYGkpoNt3)JsQVz6PZ(RBufoRoN1hX0J2eHLEEClPd00uZ7Shp(fQdc7GM7QJOglG02uZ7ShtQNs1d9I8FuAGvIeJ5ZATLv1pO125UsThDrBlUpB1x5sxb(GPrxxwpV9mX)OXbJk6554s9gsxJ8QFqCSruUEAEyaWykhFyuVH01Ovnoio2ikRYInPHlz44AY0UXkQId4Jl1BiDnsz9G4yJOC908WuunLJpmQ3q6AKY6bXXgrznbqnz(IMzkC(tBShAjFda1T(2BE3AkMUnzNtud6E9Irdahxl5BGyS(2BE3AQy0mOX3)JVdRlJ6NbfFb47NIoV1qkROpZx)5Odvmx0NXC0Ya0zOYF7VTF6Q00Tj)9UDVliDv2mWuzt3KGnzRXrGnp2Bzk6FpV7S1rZ6c5KFVxm6I6oiS7BX9XVIodgdsF49OEQl(gtI(TfIEX9)iQx(NBjdRf4BfgYn99TbB(bqa92TXORrq3lXhgjx0R)SblVenGiJHKo08Ao76UI3ZukAfZnmL8wuKV9BqFJ2xZU5VVbFh)CnTWuQEeZ1Q4zbQVhP2TJ9UJYeEGhpLCUOhr6XEZPFd(s5zp5w2zM)6O7XF8SfelHiNN5t(QBbVwZZf1VghoDkW4inJMZrrBV2BXI3eS86sVbSz4uI6K6m3eAdVrB(y25nLx6sibWrGrDvWOQZGsOnszuxbgfnt9b6DWeAwi)J1hV6Y)ngZlYnIeEU7)cJTvNoYhHfxAtOHHwGZOAJCNkqTYpciKC7rn0Ph(Pc3Au4raOQDCV0NKp4WKbnYkouclUhOK38IJPb0BiF0Q6cdub5yEvghnOhHoOlMmZ3BdryCdvyehC3DOH87jh0I3uCSOgaJ17HFU0d8OUGmTJ6mqBz)0FNiU(IlBFqh8OPKHUTeLbtCW99V92p8U3(9V)MBzFxE9EMtUJCvst(A0L(LEFe)cVvZVc1NsoptdotzrKn8FqBJQtBlL95AqsmHq58(tc0TISqbsVkR8gnZjch0K5DQIc1wBbqwBTdry()Guy2pTfKTK9CWaoUM6uvF9PwBDPEq80bvwQp6Yr1WVhdTLJA1HBdOCtRg1QD2rPyuRsw(ArvYZvwkQIP2Bwfxxn5AduAErrUHQBAvKRof0ak3uf5QD2rrrUkz5vKL8CLkYI4N08sQwtibvxQKAKiUuAllHnC1zWzu1En5IzFQLtBPl)EAVoUiHsLTdyKZJCdRTT1mMZvleh4scmzqrPbtfLSQxCY(rN3Z(XXZmKwrywJaDisGXmjK(B5doeSzBx7nhffmjbF6DhWgFiXasB8)cmTMKGtbfLWKkHuXrpxEpxiIYuD(go8FO5eRt5uHF5HNEEpKRNWDWXTBN8BnJr9BBL3EPxgFupDvVHm0OEWCIHYoQZJEhrg0PQpcbM7sM4fp3l0pVoX10U85rscPOzW39XB(jUulqRhbj7SHWecj8czRugkmNjPUcxFK7vsRucvEVKxxfU9uZMQHIdXYOCAYpgHlTsAzXLQd93tNSKC0)YSSKclJH9RXFGYQ0FOJIrTy48pHFac2T0nno8A3RupfOazsK83YaXgBi8vaAHDnOkpuptpcyA0hwHjlgdjHx1PkixAza7xNGtCw85DEvJBgLfAK4YW)r8lJ5r9TbjvxhDeewGNOdbik16TcWCAsb9PBZsern10Y57KRDAP8rLfSNKuoqYhdkXn3kv4wvAzEbUvRC3LtURTsknUqknRokp4YO8GRIYNZIO8vsM9E81qPwQAwjuwTckFmfqP61WMH2INqKQws94TRxeRkxAR6ZQJy1XfTVgEo0pdFPo)qOhkGx)WvOW(I5cvtelnwhj850vNVAfdlmWcItwKnz5aj4rDa7YAbF0hWUh9bm5GpgnIKyCCD)89y6xFh(SY9d)ZFE)03(RVxmpQaYIP(Fb8GfccmeBLJnn6ugh0SwMLK3nsdQNLJkprN5AETXe4mGLkXzHSxdyeUXlY)njGSCoOyIioxowJCQ99tsr7Ddm0F7VCt5g9auLDpwOCmtMETQE921s42XAi9MXQ1j6Lr5Di3wu9S2PqsEOo1tYbj)qgSuk3QOZUqKofjd9gUB4dYSI51nzl6ECijdkHuOB7nNUbKf9(KfBUB0fgacr)C4LuMQ1j4JeDrHv2rymwT(s)ZUSKikz8WiAHPcokQY8zfGck1SWs4YQB3oLwf2Y4dwdpZzf5MOnJxAIhNMqzgMRYTwxJ960KoUk1z2N8hH(CBYJgD5zC6T2T4(NdTCOO0kfnT2wUfG9M7SlzdmF7hB3wgODvgocMaCZvIc6QOSkztxguZoEs3KKsRzjz6wBEWyz4zo9mT3oOTbwBJOBh(GN9nXTozSA4WrbtRkA3dER4ooSJKnuHp)k6C5zdupBYr)ZU0McGj)EC0sZUTzIQXiLRHuOw02Pxl5SVwvUkHHWDf0XwDqmxdXcVI4fmlBnyuPTvRKV6dbo)Dz2DjJFhXRNA2QxIZtvl17CXWlPZQ8VczvB(7ZEnloyjVJLVTgx7yNNmdppLTvhNs68Y7Ci66kLl5KVgKKfAkJJLa3xALlGP8mJ1D5ljJS47Gi50n)QKsbVur7PQMmrWwDIiFYjFrmF0pWvhLcXnAow3eXFi2vWkZPf3iCI)E6vIwvR)1RL(aUBCFSrKQRX)wNO8c83GGb0lK0zDjFpd5SvwNFh8RqhyKL6Tsu3Uikpm088IjxdvLTG4w8SVn2Qp(y5PS2c8mGmWybzwYNuYD61HnG31bNphMpv3hkjsyfWMiF5c6Bvc)JPVX3gBpXbg33JAq(SVxaQdyuX4aBdE7hlhqjPkIkqU)d5lzlM(21xk2bpFqFLuP4SFU6tDy5qOy)D74spvpM(AwIdIphMl0)6s5zBbM2uKHOJGAabQ2LLRdBhb(ZSyPjn9GcLg)QnlsAd0Opmeomu19rsCA0NYxrvgMTJKczBEW1IZ0I3RN8CWlaE8cGhVa4X3KaEqSpfX7yWzYm(hkZnHoNnfPlKsUDYBrt9T8k5Fy)MSIA5Lk)HTI2Z76yp1WwRt0BIEq5hSdtCdILeS4cUYrFW43xouiS3D9JoVKByQa1rx3x0G8CbAxKPpI0MVIMWsxYktovEwy2BzchqXu4rXccyEXvDXJyVi0fsTNdgmUgA)Ogvuar(t1OYiq50b2xXD7USy5oMyiwLBLUf76cxt6D0(zw5pTi6ZknqgjTpvgISfZawfUu6Bl6E6ra0vLyKLLqQSy1XxpZJ)))d]] )
|