forked from Hekili/hekili
-
Notifications
You must be signed in to change notification settings - Fork 0
/
EvokerPreservation.lua
1029 lines (870 loc) · 47.4 KB
/
EvokerPreservation.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
-- EvokerPreservation.lua
-- July 2024
if UnitClassBase( "player" ) ~= "EVOKER" then return end
local addon, ns = ...
local Hekili = _G[ addon ]
local class, state = Hekili.Class, Hekili.State
local strformat = string.format
local GetSpellInfo = C_Spell.GetSpellInfo
local spec = Hekili:NewSpecialization( 1468 )
spec:RegisterResource( Enum.PowerType.Essence )
spec:RegisterResource( Enum.PowerType.Mana--[[, {
disintegrate = {
channel = "disintegrate",
talent = "energy_loop",
last = function ()
local app = state.buff.casting.applied
local t = state.query_time
return app + floor( ( t - app ) / class.auras.disintegrate.tick_time ) * class.auras.disintegrate.tick_time
end,
interval = function () return class.auras.disintegrate.tick_time end,
value = function () return 0.024 * mana.max end, -- TODO: Check if should be modmax.
}
}]] --TODO: this breaks and causes bugs because it isn't referencing mana well from State.lua, but it wouldn't be discovered in Devastation testing because Devastation doesn't have the Energy Loop talent.
)
-- Talents
spec:RegisterTalents( {
-- Evoker
aerial_mastery = { 93352, 365933, 1 }, -- Hover gains 1 additional charge.
ancient_flame = { 93271, 369990, 1 }, -- Casting Emerald Blossom or Verdant Embrace reduces the cast time of your next Living Flame by 40%.
attuned_to_the_dream = { 93292, 376930, 2 }, -- Your healing done and healing received are increased by 3%.
blast_furnace = { 93309, 375510, 1 }, -- Fire Breath's damage over time lasts 4 sec longer.
bountiful_bloom = { 93291, 370886, 1 }, -- Emerald Blossom heals 2 additional allies.
cauterizing_flame = { 93294, 374251, 1 }, -- Cauterize an ally's wounds, removing all Bleed, Poison, Curse, and Disease effects. Heals for 41,237 upon removing any effect.
clobbering_sweep = { 93296, 375443, 1 }, -- Tail Swipe's cooldown is reduced by 45 sec.
draconic_legacy = { 93300, 376166, 1 }, -- Your Stamina is increased by 6%.
enkindled = { 93295, 375554, 2 }, -- Living Flame deals 3% more damage and healing.
expunge = { 93306, 365585, 1 }, -- Expunge toxins affecting an ally, removing all Poison effects.
extended_flight = { 93349, 375517, 2 }, -- Hover lasts 4 sec longer.
exuberance = { 93299, 375542, 1 }, -- While above 75% health, your movement speed is increased by 10%.
fire_within = { 93345, 375577, 1 }, -- Renewing Blaze's cooldown is reduced by 30 sec.
foci_of_life = { 93345, 375574, 1 }, -- Renewing Blaze restores you more quickly, causing damage you take to be healed back over 4 sec.
forger_of_mountains = { 93270, 375528, 1 }, -- Landslide's cooldown is reduced by 30 sec, and it can withstand 200% more damage before breaking.
heavy_wingbeats = { 93296, 368838, 1 }, -- Wing Buffet's cooldown is reduced by 45 sec.
inherent_resistance = { 93355, 375544, 2 }, -- Magic damage taken reduced by 4%.
innate_magic = { 93302, 375520, 2 }, -- Essence regenerates 5% faster.
instinctive_arcana = { 93310, 376164, 2 }, -- Your Magic damage done is increased by 2%.
landslide = { 93305, 358385, 1 }, -- Conjure a path of shifting stone towards the target location, rooting enemies for 15 sec. Damage may cancel the effect.
leaping_flames = { 93343, 369939, 1 }, -- Fire Breath causes your next Living Flame to strike 1 additional target per empower level.
lush_growth = { 93347, 375561, 2 }, -- Green spells restore 5% more health.
natural_convergence = { 93312, 369913, 1 }, -- Disintegrate channels 20% faster.
obsidian_bulwark = { 93289, 375406, 1 }, -- Obsidian Scales has an additional charge.
obsidian_scales = { 93304, 363916, 1 }, -- Reinforce your scales, reducing damage taken by 30%. Lasts 12 sec.
oppressing_roar = { 93298, 372048, 1 }, -- Let out a bone-shaking roar at enemies in a cone in front of you, increasing the duration of crowd controls that affect them by 50% in the next 10 sec.
overawe = { 93297, 374346, 1 }, -- Oppressing Roar removes 1 Enrage effect from each enemy, and its cooldown is reduced by 30 sec.
panacea = { 93348, 387761, 1 }, -- Emerald Blossom and Verdant Embrace instantly heal you for 17,172 when cast.
permeating_chill = { 93303, 370897, 1 }, -- Your damaging Blue spells reduce the target's movement speed by 50% for 3 sec.
potent_mana = { 93715, 418101, 1 }, -- Source of Magic increases the target's healing and damage done by 3%.
protracted_talons = { 93307, 369909, 1 }, -- Azure Strike damages 1 additional enemy.
quell = { 93311, 351338, 1 }, -- Interrupt an enemy's spellcasting and prevent any spell from that school of magic from being cast for 4 sec.
recall = { 93301, 371806, 1 }, -- You may reactivate Dream Flight and Deep Breath within 3 sec after landing to travel back in time to your takeoff location.
regenerative_magic = { 93353, 387787, 1 }, -- Your Leech is increased by 2%.
renewing_blaze = { 93354, 374348, 1 }, -- The flames of life surround you for 8 sec. While this effect is active, 100% of damage you take is healed back over 8 sec.
rescue = { 93288, 370665, 1 }, -- Swoop to an ally and fly with them to the target location.
scarlet_adaptation = { 93340, 372469, 1 }, -- Store 20% of your effective healing, up to 23,667. Your next damaging Living Flame consumes all stored healing to increase its damage dealt.
sleep_walk = { 93293, 360806, 1 }, -- Disorient an enemy for 20 sec, causing them to sleep walk towards you. Damage has a chance to awaken them.
source_of_magic = { 93344, 369459, 1 }, -- Redirect your excess magic to a friendly healer for 1 |4hour:hrs;. When you cast an empowered spell, you restore 0.25% of their maximum mana per empower level. Limit 1.
spatial_paradox = { 93351, 406732, 1 }, -- Evoke a paradox for you and a friendly healer, allowing casting while moving and increasing the range of most spells by 100% for 10 sec. Affects the nearest healer within 60 yds, if you do not have a healer targeted.
tailwind = { 93290, 375556, 1 }, -- Hover increases your movement speed by 70% for the first 4 sec.
terror_of_the_skies = { 93342, 371032, 1 }, -- Deep Breath stuns enemies for 3 sec.
time_spiral = { 93351, 374968, 1 }, -- Bend time, allowing you and your allies within 40 yds to cast their major movement ability once in the next 10 sec, even if it is on cooldown.
tip_the_scales = { 93350, 370553, 1 }, -- Compress time to make your next empowered spell cast instantly at its maximum empower level.
twin_guardian = { 93287, 370888, 1 }, -- Rescue protects you and your ally from harm, absorbing damage equal to 30% of your maximum health for 5 sec.
unravel = { 93308, 368432, 1 }, -- Sunder an enemy's protective magic, dealing 80,259 Spellfrost damage to absorb shields.
verdant_embrace = { 93341, 360995, 1 }, -- Fly to an ally and heal them for 57,424, or heal yourself for the same amount.
walloping_blow = { 93286, 387341, 1 }, -- Wing Buffet and Tail Swipe knock enemies further and daze them, reducing movement speed by 70% for 4 sec.
zephyr = { 93346, 374227, 1 }, -- Conjure an updraft to lift you and your 4 nearest allies within 20 yds into the air, reducing damage taken from area-of-effect attacks by 20% and increasing movement speed by 30% for 8 sec.
-- Preservation
call_of_ysera = { 93250, 373834, 1 }, -- Verdant Embrace increases the healing of your next Dream Breath by 40%, or your next Living Flame by 100%.
cycle_of_life = { 93266, 371832, 1 }, -- Every 3 Emerald Blossoms leaves behind a tiny sprout which gathers 10% of your healing over 8 sec. The sprout then heals allies within 30 yds, divided evenly among targets.
delay_harm = { 93335, 376207, 1 }, -- Time Dilation delays 70% of damage taken.
dream_breath = { 93240, 355936, 1 }, -- Inhale, gathering the power of the Dream. Release to exhale, healing 5 injured allies in a 30 yd cone in front of you for 74,610. I: Heals 13,715 instantly and 60,894 over 16 sec. II: Heals 28,939 instantly and 45,670 over 12 sec. III: Heals 44,163 instantly and 30,447 over 8 sec.
dream_flight = { 93267, 359816, 1 }, -- Take in a deep breath and fly to the targeted location, healing all allies in your path for 32,970 immediately, and 25,855 over 15 sec. Healing increased by 100% when not in a raid. Removes all root effects. You are immune to movement impairing and loss of control effects while flying.
dreamwalker = { 93244, 377082, 1 }, -- You are able to move while communing with the Dream.
echo = { 93339, 364343, 1 }, -- Wrap an ally with temporal energy, healing them for 14,986 and causing your next non-Echo healing spell to cast an additional time on that ally at 105% of normal healing.
emerald_communion = { 93245, 370960, 1 }, -- Commune with the Emerald Dream, restoring 20% health and 2% mana every 0.8 sec for 4.0 sec. Overhealing is transferred to an injured ally within 40 yds. Castable while stunned, disoriented, incapacitated, or silenced.
empath = { 93242, 376138, 1 }, -- Spiritbloom increases your Essence regeneration rate by 100% for 8 sec.
energy_loop = { 93261, 372233, 1 }, -- Disintegrate deals 35% more damage and generates 7,200 mana over its duration.
erasure = { 93264, 376210, 1 }, -- Rewind has 2 charges, but its healing is reduced by 50%.
essence_attunement = { 93238, 375722, 1 }, -- Essence Burst stacks 2 times.
essence_burst = { 93239, 369297, 1 }, -- Living Flame has a 20% chance, and Reversion has a 15% chance to make your next Essence ability free. Stacks 2 times.
exhilarating_burst = { 93246, 377100, 2 }, -- Each time you gain Essence Burst, your critical heals are 230% effective instead of the usual 200% for 10 sec.
field_of_dreams = { 93248, 370062, 1 }, -- Gain a 30% chance for one of your Fluttering Seedlings to grow into a new Emerald Blossom.
flow_state = { 93256, 385696, 2 }, -- Empower spells cause time to flow 10% faster for you, increasing movement speed, cooldown recharge rate, and cast speed. Lasts 10 sec.
fluttering_seedlings = { 93247, 359793, 2 }, -- Emerald Blossom sends out flying seedlings when it bursts, healing 2 allies up to 40 yds away for 9,703.
font_of_magic = { 93252, 375783, 1 }, -- Your empower spells' maximum level is increased by 1.
golden_hour = { 93255, 378196, 1 }, -- Reversion instantly heals the target for 15% of damage taken in the last 5 sec.
grace_period = { 93265, 376239, 1 }, -- Your healing is increased by 10% on targets with your Reversion.
just_in_time = { 93335, 376204, 1 }, -- Time Dilation's cooldown is reduced by 2 sec each time you cast an Essence ability.
lifebind = { 93253, 373270, 1 }, -- Verdant Embrace temporarily bonds your life with an ally, causing your healing on either partner to heal the other for 40% of the amount. Lasts 5 sec.
lifeforce_mender = { 93236, 376179, 2 }, -- Living Flame and Fire Breath deal additional damage and healing equal to 1% of your maximum health.
lifegivers_flame = { 93237, 371426, 1 }, -- Fire Breath heals 5 nearby injured allies for 80% of damage done to up to 5 targets, split evenly among them.
lifespark = { 99804, 443177, 1 }, -- Reversion healing has a chance to cause your next Living Flame to cast instantly and deal 50% increased healing or damage. Stacks up to 2 charges.
nozdormus_teachings = { 93258, 376237, 1 }, -- Temporal Anomaly reduces the cooldowns of your empower spells by 5 sec.
ouroboros = { 93251, 381921, 1 }, -- Casting Echo grants one stack of Ouroboros, increasing the healing of your next Emerald Blossom by 30%, stacking up to 5 times.
power_nexus = { 93249, 369908, 1 }, -- Increases your maximum Essence to 6.
punctuality = { 93260, 371270, 1 }, -- Reversion has 2 charges.
renewing_breath = { 93268, 371257, 2 }, -- Dream Breath healing is increased by 15%.
resonating_sphere = { 93258, 376236, 1 }, -- Temporal Anomaly applies Echo at 30% effectiveness to the first 5 allies it passes through.
reversion = { 93338, 366155, 1 }, -- Reverse an ally's injuries, instantly healing them for 15% of damage taken in the last 5 sec and an additional 32,154 over 12 sec. When Reversion critically heals, its duration is extended by 2 sec, up to a maximum of 12 sec.
rewind = { 93337, 363534, 1 }, -- Rewind 33% of damage taken in the last 5 seconds by all allies within 40 yds. Always heals for at least 20,994. Healing increased by 100% when not in a raid.
rush_of_vitality = { 93244, 377086, 1 }, -- Emerald Communion increases your maximum health by 20% for 15 sec.
spark_of_insight = { 93269, 377099, 1 }, -- Consuming a full Temporal Compression grants you Essence Burst.
spiritbloom = { 93243, 367226, 1 }, -- Divert spiritual energy, healing an ally for 69,857. Splits to injured allies within 30 yds when empowered. I: Heals one ally. II: Heals a second ally. III: Heals a third ally.
spiritual_clarity = { 93242, 376150, 1 }, -- Spiritbloom's cooldown is reduced by 10 sec.
stasis = { 93262, 370537, 1 }, -- Causes your next 3 helpful spells to be duplicated and stored in a time lock. You may reactivate Stasis any time within 30 sec to quickly unleash their magic.
temporal_anomaly = { 93257, 373861, 1 }, -- Send forward a vortex of temporal energy, absorbing 16,494 damage on you and any allies in its path. Absorption is reduced beyond 5 targets.
temporal_artificer = { 93264, 381922, 1 }, -- Rewind's cooldown is reduced by 60 sec.
temporal_compression = { 93241, 362874, 1 }, -- Each cast of a Bronze spell causes your next empower spell to reach maximum level in 10% less time, stacking up to 4 times.
time_dilation = { 93336, 357170, 1 }, -- Stretch time around an ally for the next 8 sec, causing 50% of damage they would take to instead be dealt over 8 sec.
time_lord = { 93254, 372527, 2 }, -- Echo replicates 50% more healing.
time_of_need = { 93259, 368412, 1 }, -- When you or an ally fall below 30% health, a version of yourself enters your timeline and heals them for 57,424. Your alternate self continues healing for 8 sec before returning to their timeline. May only occur once every 60 sec.
timeless_magic = { 93263, 376240, 2 }, -- Reversion, Time Dilation, Echo, and Temporal Anomaly last 15% longer and cost 15% less mana.
titans_gift = { 99803, 443264, 1 }, -- Essence Burst increases the effectiveness of your next Essence ability by 25%.
-- Chronowarden
afterimage = { 94929, 431875, 1 }, -- Empower spells send up to 3 Chrono Flames to your targets.
chrono_flame = { 94954, 431442, 1, "chronowarden" }, -- Living Flame is enhanced with Bronze magic, repeating 15% of the damage or healing you dealt to the target in the last 5 sec as Arcane, up to 29,455.
doubletime = { 94932, 431874, 1 }, -- When Dream Breath or Fire Breath critically strike, their duration is extended by 2 sec, up to a maximum of 12 sec.
golden_opportunity = { 94942, 432004, 1 }, -- Casting Echo has a 20% chance to cause your next Echo to be 100% more effective.
instability_matrix = { 94930, 431484, 1 }, -- Each time you cast an empower spell, unstable time magic reduces its cooldown by up to 6 sec.
master_of_destiny = { 94930, 431840, 1 }, -- Casting Essence spells extends all your active Threads of Fate by 1 sec.
motes_of_acceleration = { 94935, 432008, 1 }, -- Warp leaves a trail of Motes of Acceleration. Allies who come in contact with a mote gain 20% increased movement speed for 30 sec.
primacy = { 94951, 431657, 1 }, -- For each healing over time effect from Spiritbloom, gain 3% haste, up to 9%.
reverberations = { 94925, 431615, 1 }, -- Spiritbloom heals for an additional 30% over 8 sec.
temporal_burst = { 94955, 431695, 1 }, -- Tip the Scales overloads you with temporal energy, increasing your haste, movement speed, and cooldown recovery rate by 30%, decreasing over 30 sec.
temporality = { 94935, 431873, 1 }, -- Warp reduces damage taken by 20%, starting high and reducing over 3 sec.
threads_of_fate = { 94947, 431715, 1 }, -- Casting an empower spell during Temporal Burst causes a nearby ally to gain a Thread of Fate for 10 sec, granting them a chance to echo their damage or healing spells, dealing 15% of the amount again.
time_convergence = { 94932, 431984, 1 }, -- Non-defensive abilities with a 45 second or longer cooldown grant 5% Intellect for 15 sec. Essence spells extend the duration by 1 sec.
warp = { 94948, 429483, 1 }, -- Hover now causes you to briefly warp out of existence and appear at your destination. Hover's cooldown is also reduced by 5 sec. Hover continues to allow Evoker spells to be cast while moving.
-- Flameshaper
burning_adrenaline = { 94946, 444020, 1 }, -- Engulf quickens your pulse, reducing the cast time of your next spell by $444019s1%. Stacks up to $444019u charges.
conduit_of_flame = { 94949, 444843, 1 }, -- Critical strike chance against targets $?c1[above][below] $s2% health increased by $s1%.
consume_flame = { 94922, 444088, 1 }, -- Engulf consumes $s1 sec of $?c1[Fire Breath][Dream Breath] from the target, detonating it and $?c1[damaging][healing] all nearby targets equal to $s3% of the amount consumed, reduced beyond $s2 targets.
draconic_instincts = { 94931, 445958, 1 }, -- Your wounds have a small chance to cauterize, healing you for $s1% of damage taken. Occurs more often from attacks that deal high damage.
engulf = { 94950, 443328, 1, "flameshaper" }, -- Engulf your target in dragonflame, damaging them for $443329s1 Fire or healing them for $443330s1. For each of your periodic effects on the target, effectiveness is increased by $s1%.
enkindle = { 94956, 444016, 1 }, -- Essence abilities are enhanced with Flame, dealing $s1% of healing or damage done as Fire over 8 sec.
expanded_lungs = { 94923, 444845, 1 }, -- Fire Breath's damage over time is increased by $s1%. Dream Breath's heal over time is increased by $s1%.
fan_the_flames = { 94923, 444318, 1 }, -- Casting Engulf reignites all active Enkindles, increasing their remaining damage or healing over time by $s1%.
lifecinders = { 94931, 444322, 1 }, -- Renewing Blaze also applies to your target or $s1 nearby injured $Lally:allies; at $s2% value.
red_hot = { 94945, 444081, 1 }, -- Engulf gains $s2 additional charge and deals $s1% increased damage and healing.
shape_of_flame = { 94937, 445074, 1 }, -- Tail Swipe and Wing Buffet scorch enemies and blind them with ash, causing their next attack within $445134d to miss.
titanic_precision = { 94920, 445625, 1 }, -- Living Flame and Azure Strike have $s1 extra chance to trigger Essence Burst when they critically strike.
trailblazer = { 94937, 444849, 1 }, -- $?c1[Hover and Deep Breath][Hover, Deep Breath, and Dream Flight] travel $s1% faster, and Hover travels $s1% further.
traveling_flame = { 99857, 444140, 1 }, -- Engulf increases the duration of $?c1[Fire Breath][Fire Breath or Dream Breath] by $s1 sec and causes it to spread to a target within $?c1[$s2][$s3] yds.
} )
-- PvP Talents
spec:RegisterPvpTalents( {
chrono_loop = 5455, -- (383005) Trap the enemy in a time loop for 5 sec. Afterwards, they are returned to their previous location and health. Cannot reduce an enemy's health below 20%.
divide_and_conquer = 5595, -- (384689)
dream_catcher = 5598, -- (410962)
dream_projection = 5454, -- (377509) Summon a flying projection of yourself that heals allies you pass through for 27,475. Detonating your projection dispels all nearby allies of Magical effects, and heals for 136,004 over 20 sec.
dreamwalkers_embrace = 5616, -- (415651)
nullifying_shroud = 5468, -- (378464) Wreathe yourself in arcane energy, preventing the next 3 full loss of control effects against you. Lasts 30 sec.
obsidian_mettle = 5459, -- (378444)
scouring_flame = 5461, -- (378438)
swoop_up = 5465, -- (370388) Grab an enemy and fly with them to the target location.
time_stop = 5463, -- (378441) Freeze an ally's timestream for 5 sec. While frozen in time they are invulnerable, cannot act, and auras do not progress. You may reactivate Time Stop to end this effect early.
unburdened_flight = 5470, -- (378437)
} )
-- Auras
spec:RegisterAuras( {
call_of_ysera = {
id = 373835,
duration = 15,
max_stack = 1
},
dream_breath = { -- TODO: This is the empowerment cast.
id = 355936,
duration = 2.5,
max_stack = 1
},
dream_breath_hot = {
id = 355941,
duration = function ()
return 16 - (4 * (empowerment_level - 1))
end,
tick_time = 2,
max_stack = 1
},
dream_breath_hot_echo = { -- This is the version applied when the target has your Echo on it.
id = 376788,
duration = function ()
return 16 - (4 * (empowerment_level - 1))
end,
tick_time = 2,
max_stack = 1
},
dream_projection = { -- TODO: PvP talent summon/pet?
id = 377509,
duration = 5,
max_stack = 1
},
dreamwalker = {
id = 377082,
},
emerald_blossom = { -- TODO: Check Aura (https://wowhead.com/beta/spell=355913)
id = 355913,
duration = 2,
max_stack = 1
},
essence_burst = { -- This is the Preservation version of the talent.
id = 369299,
duration = 15,
max_stack = function() return talent.essence_attunement.enabled and 2 or 1 end,
},
fire_breath = {
id = 357209,
duration = function ()
return 4 * empowerment_level
end,
-- TODO: damage = function () return 0.322 * stat.spell_power * action.fire_breath.spell_targets * ( talent.heat_wave.enabled and 1.2 or 1 ) * ( debuff.shattering_star.up and 1.2 or 1 ) end,
max_stack = 1,
},
flow_state = {
id = 390148,
duration = 10,
max_stack = 1
},
fly_with_me = {
id = 370665,
duration = 1,
max_stack = 1
},
hover = {
id = 358267,
duration = function () return talent.extended_flight.enabled and 8 or 6 end,
tick_time = 1,
max_stack = 1
},
lifebind = {
id = 373267,
duration = 5,
max_stack = 1
},
-- Next Living Flame's cast time reduced by $s1% and deals $s2% increased damage or healing.
lifespark = {
id = 394552,
duration = 15.0,
max_stack = 1,
},
mastery_lifebinder = {
id = 363510,
},
nullifying_shroud = {
id = 378464,
duration = 30,
max_stack = 3
},
ouroboros = {
id = 387350,
duration = 3600,
max_stack = 5
},
reversion = {
id = 366155,
duration = 12,
tick_time = 2,
max_stack = 1
},
reversion_echo = { -- This is the version applied when the target has your Echo on it.
id = 367364,
duration = 12,
tick_timer = 2,
max_stack = 1
},
rewind = {
id = 363534,
duration = 4,
tick_time = 1,
max_stack = 1
},
spiritbloom = { -- TODO: This is the empowerment channel.
id = 367226,
duration = 2.5,
max_stack = 1
},
stasis = {
id = 370537,
duration = 3600,
max_stack = 3
},
stasis_ready = {
id = 370562,
duration = 30,
max_stack = 1
},
temporal_anomaly = { -- TODO: Creates an absorb vortex effect.
id = 373861,
duration = 6,
tick_time = 2,
max_stack = 1
},
temporal_compression = {
id = 362877,
duration = 15,
max_stack = 4
},
time_dilation = {
id = 357170,
duration = 8,
max_stack = 1
},
time_of_need = { -- ICD
id = 368415,
duration = 60,
max_stack = 1
},
time_stop = {
id = 378441,
duration = 4,
max_stack = 1
},
youre_coming_with_me = {
id = 370388,
duration = 1,
max_stack = 1
}
} )
local lastEssenceTick = 0
local actual_empowered_spell_count, essence_rush_gained = 0, 0
do
local previous = 0
spec:RegisterUnitEvent( "UNIT_POWER_UPDATE", "player", nil, function( event, unit, power )
if power == "ESSENCE" then
local value, cap = UnitPower( "player", Enum.PowerType.Essence ), UnitPowerMax( "player", Enum.PowerType.Essence )
if value == cap then
lastEssenceTick = 0
elseif lastEssenceTick == 0 and value < cap or lastEssenceTick ~= 0 and value > previous then
lastEssenceTick = GetTime()
end
previous = value
end
end )
local empowered_spells = {
[382266] = 1,
[357208] = 1,
[382731] = 1,
[367226] = 1,
[382614] = 1,
[355936] = 1
}
spec:RegisterCombatLogEvent( function( _, subtype, _, sourceGUID, sourceName, _, _, destGUID, destName, destFlags, _, spellID, spellName )
if sourceGUID ~= state.GUID or state.set_bonus.tier30_4pc == 0 then return end
local now = GetTime()
if subtype == "SPELL_CAST_SUCCESS" and empowered_spells[ spellID ] and now - essence_rush_gained > 0.5 then
actual_empowered_spell_count = actual_empowered_spell_count + 1
elseif ( subtype == "SPELL_AURA_APPLIED" or subtype == "SPELL_AURA_APPLIED_DOSE" or subtype == "SPELL_AURA_REFRESH" ) and spellID == 409899 then
essence_rush_gained = now
actual_empowered_spell_count = 0
end
end )
end
spec:RegisterGear( "tier30", 202491, 202489, 202488, 202487, 202486 )
-- 2 pieces (Preservation) : Spiritbloom applies a heal over time effect for 40% of healing done over 8 sec. Dream Breath's healing is increased by 15%.
spec:RegisterAura( "spiritbloom", {
id = 409895,
duration = 8,
tick_time = 2,
max_stack = 1
} )
-- 4 pieces (Preservation) : After casting 3 empower spells, gain Essence Burst immediately and another 3 sec later.
spec:RegisterAura( "essence_rush", {
id = 409899,
duration = 3,
max_stack = 1
} )
spec:RegisterGear( "tier31", 207225, 207226, 207227, 207228, 207230 )
spec:RegisterStateExpr( "empowered_spell_count", function()
return actual_empowered_spell_count
end )
local TriggerEssenceRushT30 = setfenv( function()
addStack( "essence_burst" )
end, state )
spec:RegisterStateExpr( "empowerment_level", function()
return buff.tip_the_scales.down and args.empower_to or max_empower
end )
-- This deserves a better fix; when args.empower_to = "maximum" this will cause that value to become max_empower (i.e., 3 or 4).
spec:RegisterStateExpr( "maximum", function()
return max_empower
end )
spec:RegisterStateExpr( "empowered_spell_count", function()
return actual_empowered_spell_count
end )
spec:RegisterHook( "runHandler", function( action )
local ability = class.abilities[ action ]
local color = ability.color
empowerment.active = false
if ( set_bonus.tier30_4pc > 0 or set_bonus.tier31_4pc ) and ability.empowered then
if empowered_spell_count == 4 then
empowered_spell_count = 0
applyBuff( "essence_rush" )
addStack( "essence_burst" )
state:QueueAuraEvent( "essence_rush", TriggerEssenceRushT30, buff.essence_rush.expires, "AURA_EXPIRATION" )
else
empowered_spell_count = empowered_spell_count + 1
end
end
end )
spec:RegisterGear( "tier29", 200381, 200383, 200378, 200380, 200382, 217178, 217180, 217176, 217177, 217179 )
spec:RegisterAuras( {
time_bender = {
id = 394544,
duration = 6,
max_stack = 1
},
--[[ lifespark = { -- now a talent
id = 394552,
duration = 15,
max_stack = 2
} ]]
} )
spec:RegisterHook( "reset_precast", function()
max_empower = talent.font_of_magic.enabled and 4 or 3
if essence.current < essence.max and lastEssenceTick > 0 then
local partial = min( 0.95, ( query_time - lastEssenceTick ) * essence.regen )
gain( partial, "essence" )
if Hekili.ActiveDebug then Hekili:Debug( "Essence increased to %.2f from passive regen.", partial ) end
end
empowered_spell_count = nil
end )
spec:RegisterStateTable( "evoker", setmetatable( {},{
__index = function( t, k )
local val = state.settings[ k ]
if val ~= nil then return val end
return false
end
} ) )
local empowered_cast_time
do
local stages = {
1,
1.75,
2.5,
3.25
}
empowered_cast_time = setfenv( function()
if buff.tip_the_scales.up then return 0 end
local power_level = args.empower_to or max_empower
if settings.fire_breath_fixed > 0 then
power_level = min( settings.fire_breath_fixed, max_empower )
end
return stages[ power_level ] * ( talent.font_of_magic.enabled and 0.8 or 1 ) * ( 1 - 0.1 * buff.temporal_compression.stack ) * haste
end, state )
end
-- Abilities
spec:RegisterAbilities( {
cauterizing_flame = {
id = 374251,
cast = 0,
cooldown = 60,
gcd = "spell",
spend = 0.014,
spendType = "mana",
startsCombat = false,
healing = function () return 3.50 * stat.spell_power end,
toggle = "interrupts",
usable = function()
return buff.dispellable_poison.up or buff.dispellable_curse.up or buff.dispellable_disease.up, "requires dispellable effect" --add dispellable_bleed later?
end,
handler = function ()
removeBuff( "dispellable_poison" )
removeBuff( "dispellable_curse" )
removeBuff( "dispellable_disease" )
-- removeBuff( "dispellable_bleed" )
health.current = min( health.max, health.current + action.cauterizing_flame.healing )
if buff.stasis.stack == 1 then applyBuff( "stasis_ready" ) end
removeStack( "stasis" )
end,
},
chrono_loop = {
id = 383005,
cast = 0,
cooldown = 60,
gcd = "spell",
spend = 0.02,
spendType = "mana",
startsCombat = true,
toggle = "cooldowns",
handler = function ()
if talent.temporal_compression.enabled then addStack( "temporal_compression" ) end
end,
},
disintegrate = {
id = 356995,
cast = function() return 3 * ( talent.natural_convergence.enabled and 0.8 or 1 ) end,
channeled = true,
cooldown = 0,
gcd = "spell",
spend = function () return buff.essence_burst.up and 0 or 3 end,
spendType = "essence",
startsCombat = true,
damage = function () return 2.28 * stat.spell_power * ( talent.energy_loop.enabled and 1.2 or 1 ) end,
min_range = 0,
max_range = 25,
start = function ()
removeStack( "essence_burst" )
if talent.energy_loop.enabled then gain( 0.0277 * mana.max, "mana" ) end
end,
},
dream_breath = {
id = function() return talent.font_of_magic.enabled and 382614 or 355936 end,
known = 355936,
cast = empowered_cast_time,
empowered = true,
cooldown = 30,
gcd = "off",
icd = 0.5,
spend = 0.049,
spendType = "mana",
startsCombat = false,
handler = function ()
applyBuff( "dream_breath" )
applyBuff( "dream_breath_hot" )
removeBuff( "call_of_ysera" )
removeBuff( "temporal_compression" )
if talent.flow_state.enabled then applyBuff( "flow_state" ) end
if buff.tip_the_scales.up then
removeBuff( "tip_the_scales" )
setCooldown( "tip_the_scales", action.tip_the_scales.cooldown )
end
if buff.stasis.stack == 1 then applyBuff( "stasis_ready" ) end
removeStack( "stasis" )
end,
copy = { 382614, 355936 }
},
dream_flight = {
id = 359816,
cast = 0,
cooldown = 120,
gcd = "spell",
spend = 0.04,
spendType = "mana",
startsCombat = false,
toggle = "cooldowns",
handler = function ()
end,
},
dream_projection = {
id = 377509,
cast = 0.5,
cooldown = 90,
gcd = "spell",
spend = 0.04,
spendType = "mana",
startsCombat = false,
toggle = "cooldowns",
handler = function ()
end,
},
echo = {
id = 364343,
cast = 0,
cooldown = 0,
gcd = "spell",
spend = function () return buff.essence_burst.up and 0 or 2 end,
spendType = "essence",
startsCombat = false,
handler = function ()
removeStack( "essence_burst" )
if buff.stasis.stack == 1 then applyBuff( "stasis_ready" ) end
removeStack( "stasis" )
if talent.ouroboros.enabled then addStack( "ouroboros" ) end
if talent.temporal_compression.enabled then addStack("temporal_compression") end
end,
},
emerald_communion = {
id = 370960,
cast = 0,
cooldown = 180,
gcd = "spell",
startsCombat = false,
toggle = "cooldowns",
handler = function ()
end,
},
fire_breath = {
id = function() return talent.font_of_magic.enabled and 382266 or 357208 end,
known = 357208,
cast = empowered_cast_time,
empowered = true,
cooldown = 30,
gcd = "off",
icd = 0.5,
spend = 0.03,
spendType = "mana",
startsCombat = true,
caption = function()
local power_level = settings.fire_breath_fixed
if power_level > 0 then return power_level end
end,
spell_targets = function () return active_enemies end,
damage = function () return 1.334 * stat.spell_power * ( 1 + 0.2 * talent.blast_furnace.rank ) end,
handler = function()
applyDebuff( "target", "fire_breath" )
if talent.flow_state.enabled then applyBuff( "flow_state" ) end
if buff.tip_the_scales.up then
removeBuff( "tip_the_scales" )
setCooldown( "tip_the_scales", action.tip_the_scales.cooldown )
else
removeBuff( "temporal_compression" )
end
if talent.leaping_flames.enabled then applyBuff( "leaping_flames", nil, empowerment_level ) end
end,
copy = { 382266, 357208 }
},
living_flame = {
id = function() return talent.chrono_flame.enabled and 431443 or 361469 end,
cast = function() return buff.lifespark.up and 0 or 2 end,
cooldown = 0,
gcd = "spell",
spend = 0.02,
spendType = "mana",
startsCombat = true,
damage = function () return 1.61 * stat.spell_power end,
healing = function () return 2.75 * stat.spell_power * ( 1 + 0.03 * talent.enkindled.rank ) end,
spell_targets = function () return buff.leaping_flames.up and min( active_enemies, 1 + buff.leaping_flames.stack ) end,
handler = function ()
removeBuff( "ancient_flame" )
removeBuff( "leaping_flames" )
removeBuff( "scarlet_adaptation" )
removeBuff( "call_of_ysera" )
removeStack( "lifespark" )
if buff.stasis.stack == 1 then applyBuff( "stasis_ready" ) end
removeStack( "stasis" )
end,
copy = { 361469, "chrono_flame", 431443 }
},
naturalize = {
id = 360823,
cast = 0,
cooldown = 8,
gcd = "spell",
spend = 0.014,
spendType = "mana",
startsCombat = false,
toggle = "interrupts",
usable = function()
return buff.dispellable_poison.up or buff.dispellable_magic.up, "requires dispellable effect"
end,
handler = function ()
removeBuff( "dispellable_poison" )
removeBuff( "dispellable_magic" )
if buff.stasis.stack == 1 then applyBuff( "stasis_ready" ) end
removeStack( "stasis" )
end,
},
nullifying_shroud = {
id = 378464,
cast = 1.5,
cooldown = 90,
gcd = "spell",
spend = 0.01,
spendType = "mana",
startsCombat = false,
toggle = "cooldowns",
handler = function ()
end,
},
renewing_blaze = {
id = 374348,
cast = 0,
cooldown = function () return talent.fire_within.enabled and 60 or 90 end,
gcd = "off",
startsCombat = false,
toggle = "defensives",
handler = function ()
applyBuff( "renewing_blaze" )
applyBuff( "renewing_blaze_heal" )
end,
},
reversion = {
id = 366155,
cast = 0,
charges = function() return talent.punctuality.enabled and 2 or 1 end,
cooldown = 9,
recharge = 9,
gcd = "spell",
spend = 0.028,
spendType = "mana",
startsCombat = false,
handler = function ()
applyBuff( "reversion" )
if talent.temporal_compression.enabled then addStack( "temporal_compression" ) end
if buff.stasis.stack == 1 then applyBuff( "stasis_ready" ) end
removeStack( "stasis" )
end,
},
rewind = {
id = 363534,
cast = 0,
charges = function() return talent.erasure.enabled and 2 or nil end,
cooldown = function() return talent.temporal_artificer.enabled and 180 or 240 end,
recharge = function() return talent.temporal_artificer.enabled and 180 or 240 end,
gcd = "spell",
spend = 0.055,
spendType = "mana",
startsCombat = false,
toggle = "cooldowns",
handler = function ()
if talent.temporal_compression.enabled then addStack( "temporal_compression" ) end
end,
},
spiritbloom = {
id = function() return talent.font_of_magic.enabled and 382731 or 367226 end,
known = 367226,
cast = empowered_cast_time,
empowered = true,
cooldown = 30,
gcd = "off",
icd = 0.5,
spend = 0.042,
spendType = "mana",
startsCombat = false,
handler = function ()
if set_bonus.tier30_2pc > 0 then applyBuff( "spiritbloom" ) end
if talent.flow_state.enabled then applyBuff( "flow_state" ) end
if buff.tip_the_scales.up then
removeBuff( "tip_the_scales" )
setCooldown( "tip_the_scales", action.tip_the_scales.cooldown )
else
removeBuff( "temporal_compression" )
end
if buff.stasis.stack == 1 then applyBuff( "stasis_ready" ) end
removeStack( "stasis" )
end,
copy = { 382731, 367226 }
},
stasis = {
id = function () return buff.stasis_ready.up and 370564 or 370537 end,
cast = 0,
cooldown = 90,
gcd = "off",
spend = function () return buff.stasis_ready.up and 0 or 0.04 end,
spendType = "mana",
startsCombat = false,
toggle = "cooldowns",
usable = function () return buff.stasis_ready.up or buff.stasis.stack < 1, "Stasis not ready" end,
handler = function ()
if buff.stasis_ready.up then
setCooldown( "stasis", 90 )
removeBuff( "stasis_ready" )
-- TODO: See if we can determine the spells to cast from the stasis aura.
else
if talent.temporal_compression.enabled then addStack( "temporal_compression" ) end
addStack( "stasis", 3 )
end
end,
copy = { 370564, 370537, "stasis" }
},
temporal_anomaly = {
id = 373861,
cast = 1.5,
cooldown = 15,
gcd = "spell",
spend = 0.08,
spendType = "mana",
startsCombat = false,
handler = function ()
if talent.temporal_compression.enabled then addStack( "temporal_compression" ) end
if talent.resonating_sphere.enabled then applyBuff( "echo" ) end
if talent.nozdormus_teachings.enabled then
reduceCooldown( "dream_breath", 5 )
reduceCooldown( "fire_breath", 5 )
reduceCooldown( "spiritbloom", 5 )
end
if buff.stasis.stack == 1 then applyBuff( "stasis_ready" ) end
removeStack( "stasis" )
end,
},
time_dilation = {
id = 357170,
cast = 0,
cooldown = 60,
gcd = "off",
spend = 0.022,
spendType = "mana",
startsCombat = false,
toggle = "cooldowns",
handler = function ()
if talent.temporal_compression.enabled then addStack( "temporal_compression" ) end
end,
},
-- Talent: Fly to an ally and heal them for 4,557.
verdant_embrace = {
id = 360995,
cast = 0,
cooldown = 24,
gcd = "spell",
school = "nature",
color = "green",
icd = 0.5,
spend = 0.033,
spendType = "mana",
talent = "verdant_embrace",
startsCombat = false,
handler = function ()
if talent.lifebind.enabled then applyBuff( "lifebind" ) end
if talent.call_of_ysera.enabled then applyBuff( "call_of_ysera" ) end
end,
},
} )
spec:RegisterSetting( "experimental_msg", nil, {
type = "description",
name = "|cFFFF0000WARNING|r: Healer support in this addon is focused on DPS output only. This is more useful for solo content or downtime when your healing output is less critical in a group/encounter. Use at your own risk.",
width = "full",
} )
local spellInfo = GetSpellInfo( 357210 )
local deep_breath = spellInfo and spellInfo.name or "Deep Breath"
spec:RegisterSetting( "use_deep_breath", true, {
name = strformat( "Use %s", Hekili:GetSpellLinkWithTexture( 357210 ) ),
type = "toggle",
desc = strformat( "If checked, %s may be recommended, which will force your character to select a destination and move. By default, %s requires your Cooldowns "
.. "toggle to be active.\n\n"
.. "If unchecked, |W%s|w will never be recommended, which may result in lost DPS if left unused for an extended period of time.",
Hekili:GetSpellLinkWithTexture( 357210 ), deep_breath, deep_breath ),
width = "full",
} )
spellInfo = GetSpellInfo( 368432 )
local unravel = spellInfo and spellInfo.name or "Unravel"
spec:RegisterSetting( "use_unravel", false, {
name = strformat( "Use %s", Hekili:GetSpellLinkWithTexture( 368432 ) ),
type = "toggle",
desc = strformat( "If checked, %s may be recommended if your target has an absorb shield applied. By default, %s also requires your Interrupts toggle to be active.",
Hekili:GetSpellLinkWithTexture( 368432 ), unravel ),
width = "full",
} )
local devastation = class.specs[ 1467 ]
spec:RegisterSetting( "fire_breath_fixed", 0, {
name = strformat( "%s: Empowerment", Hekili:GetSpellLinkWithTexture( devastation.abilities.fire_breath.id ) ),
type = "range",
desc = strformat( "If set to |cffffd1000|r, %s will be recommended at different empowerment levels based on the action priority list.\n\n"
.. "To force %s to be used at a specific level, set this to 1, 2, 3 or 4.\n\n"
.. "If the selected empowerment level exceeds your maximum, the maximum level will be used instead.", Hekili:GetSpellLinkWithTexture( devastation.abilities.fire_breath.id ),
devastation.abilities.fire_breath.name ),
min = 0,
max = 4,
step = 1,
width = "full"
} )
spec:RegisterSetting( "spend_essence", false, {
name = strformat( "%s: Spend Essence", Hekili:GetSpellLinkWithTexture( devastation.abilities.disintegrate.id ) ),
type = "toggle",
desc = strformat( "If checked, %s may be recommended when you will otherwise max out on Essence and risk wasting resources.\n\n"