1515 * with this program. If not, see <http://www.gnu.org/licenses/>.
1616 */
1717
18+ /*
19+ * Timers requires to be revisited
20+ * Looks like SPELL_ARCANE_BUBBLE and SPELL_MANA_SHIELD were removed in Cata
21+ */
22+
1823#include " ScriptMgr.h"
1924#include " Containers.h"
2025#include " ScriptedCreature.h"
2126#include " SpellScript.h"
27+ #include " SpellInfo.h"
28+ #include " SpellMgr.h"
2229#include " sethekk_halls.h"
2330
2431enum IkissTexts
@@ -32,34 +39,52 @@ enum IkissTexts
3239
3340enum IkissSpells
3441{
35- SPELL_BLINK = 38194 ,
36- SPELL_BLINK_TELEPORT = 38203 ,
37- SPELL_MANA_SHIELD = 38151 ,
38- SPELL_ARCANE_BUBBLE = 9438 ,
39- SPELL_SLOW = 35032 ,
42+ // Combat
4043 SPELL_POLYMORPH = 38245 ,
4144 SPELL_ARCANE_VOLLEY = 35059 ,
45+ SPELL_SLOW = 35032 ,
46+ SPELL_MANA_SHIELD = 38151 ,
47+
48+ // Combat - Sequence
49+ SPELL_BLINK = 38194 ,
50+ SPELL_ARCANE_BUBBLE = 9438 ,
4251 SPELL_ARCANE_EXPLOSION = 38197 ,
52+
53+ // Scripts
54+ SPELL_BLINK_TELEPORT = 38203
4355};
4456
4557enum IkissEvents
4658{
47- EVENT_POLYMORPH = 1 ,
48- EVENT_BLINK ,
49- EVENT_SLOW ,
59+ EVENT_POLYMORPH = 1 ,
5060 EVENT_ARCANE_VOLLEY ,
51- EVENT_ARCANE_EXPLOSION
61+ EVENT_SLOW ,
62+ EVENT_MANA_SHIELD ,
63+
64+ EVENT_SEQUENCE_1 ,
65+ EVENT_SEQUENCE_2 ,
66+ EVENT_SEQUENCE_3
67+ };
68+
69+ enum IkissPhases : uint8
70+ {
71+ PHASE_NONE = 0 ,
72+ PHASE_HEALTH_80 ,
73+ PHASE_HEALTH_50 ,
74+ PHASE_HEALTH_25 ,
75+ PHASE_HEALTH_15
5276};
5377
5478// 18473 - Talon King Ikiss
5579struct boss_talon_king_ikiss : public BossAI
5680{
57- boss_talon_king_ikiss (Creature* creature) : BossAI(creature, DATA_TALON_KING_IKISS ), _introDone(false ), _manaShieldTriggered( false ) { }
81+ boss_talon_king_ikiss (Creature* creature) : BossAI(creature, DATA_TALON_KING_IKISS ), _introDone(false ), _phase( PHASE_NONE ) { }
5882
5983 void Reset () override
6084 {
6185 _Reset ();
62- _manaShieldTriggered = false ;
86+ _phase = PHASE_NONE ;
87+ me->SetReactState (REACT_AGGRESSIVE );
6388 }
6489
6590 // / @todo: Handle this with GameObject 184118 (Auchindoun Arakkoa - Talon King Ikiss Intro Event - Trigger 000)
@@ -77,27 +102,51 @@ struct boss_talon_king_ikiss : public BossAI
77102 void JustEngagedWith (Unit* who) override
78103 {
79104 BossAI::JustEngagedWith (who);
105+
80106 Talk (SAY_AGGRO );
81- events. ScheduleEvent ( EVENT_ARCANE_VOLLEY , 5s);
82- events.ScheduleEvent (EVENT_POLYMORPH , 8s );
83- events.ScheduleEvent (EVENT_BLINK , 35s );
107+
108+ events.ScheduleEvent (EVENT_POLYMORPH , 5s, 15s );
109+ events.ScheduleEvent (EVENT_ARCANE_VOLLEY , 5s, 10s );
84110 if (IsHeroic ())
85- events.ScheduleEvent (EVENT_SLOW , 15s, 30s);
111+ events.ScheduleEvent (EVENT_SLOW , 10s, 20s);
112+ }
113+
114+ void OnSpellCast (SpellInfo const * spellInfo) override
115+ {
116+ if (spellInfo->Id == sSpellMgr ->GetSpellIdForDifficulty (SPELL_ARCANE_EXPLOSION , me))
117+ me->SetReactState (REACT_AGGRESSIVE );
86118 }
87119
88120 void DamageTaken (Unit* /* who*/ , uint32& damage, DamageEffectType /* damageType*/ , SpellInfo const * /* spellInfo = nullptr*/ ) override
89121 {
90- if (!_manaShieldTriggered && me->HealthBelowPctDamaged (20 , damage))
122+ if (_phase < PHASE_HEALTH_80 && me->HealthBelowPctDamaged (80 , damage))
123+ {
124+ _phase++;
125+ events.ScheduleEvent (EVENT_SEQUENCE_1 , 0s);
126+ }
127+
128+ if (_phase < PHASE_HEALTH_50 && me->HealthBelowPctDamaged (50 , damage))
129+ {
130+ _phase++;
131+ events.ScheduleEvent (EVENT_SEQUENCE_1 , 0s);
132+ }
133+
134+ if (_phase < PHASE_HEALTH_25 && me->HealthBelowPctDamaged (25 , damage))
135+ {
136+ _phase++;
137+ events.ScheduleEvent (EVENT_SEQUENCE_1 , 0s);
138+ }
139+
140+ if (_phase < PHASE_HEALTH_15 && me->HealthBelowPctDamaged (15 , damage))
91141 {
92- DoCastSelf ( SPELL_MANA_SHIELD ) ;
93- _manaShieldTriggered = true ;
142+ _phase++ ;
143+ events. ScheduleEvent ( EVENT_MANA_SHIELD , 0s) ;
94144 }
95145 }
96146
97147 void KilledUnit (Unit* who) override
98148 {
99- if (who->GetTypeId () == TYPEID_PLAYER )
100- Talk (SAY_SLAY );
149+ Talk (SAY_SLAY );
101150 }
102151
103152 void JustDied (Unit* /* killer*/ ) override
@@ -111,30 +160,35 @@ struct boss_talon_king_ikiss : public BossAI
111160 switch (eventId)
112161 {
113162 case EVENT_POLYMORPH :
114- // Second top aggro in normal, random target in heroic.
115- if (IsHeroic ())
116- DoCast (SelectTarget (SelectTargetMethod::Random, 0 ), SPELL_POLYMORPH );
117- else
118- DoCast (SelectTarget (SelectTargetMethod::MaxThreat, 1 ), SPELL_POLYMORPH );
119- events.Repeat (15s, 17500ms);
163+ if (Unit* target = SelectTarget (SelectTargetMethod::Random, 1 , 30 .0f ))
164+ DoCast (target, SPELL_POLYMORPH );
165+ events.Repeat (10s, 20s);
120166 break ;
121167 case EVENT_ARCANE_VOLLEY :
122168 DoCastSelf (SPELL_ARCANE_VOLLEY );
123- events.Repeat (7s, 12s );
169+ events.Repeat (10s );
124170 break ;
125171 case EVENT_SLOW :
126172 DoCastSelf (SPELL_SLOW );
127- events.Repeat (15s, 40s );
173+ events.Repeat (15s, 20s );
128174 break ;
129- case EVENT_BLINK :
175+ case EVENT_MANA_SHIELD :
176+ DoCastSelf (SPELL_MANA_SHIELD );
177+ break ;
178+
179+ case EVENT_SEQUENCE_1 :
180+ DoCastSelf (SPELL_BLINK );
181+ ResetThreatList ();
182+ me->SetReactState (REACT_PASSIVE );
183+ events.ScheduleEvent (EVENT_SEQUENCE_2 , 1200ms);
184+ break ;
185+ case EVENT_SEQUENCE_2 :
186+ DoCastSelf (SPELL_ARCANE_BUBBLE );
130187 Talk (EMOTE_ARCANE_EXPLOSION );
131- DoCastAOE (SPELL_BLINK );
132- events.ScheduleEvent (EVENT_BLINK , 35s, 40s);
133- events.ScheduleEvent (EVENT_ARCANE_EXPLOSION , 1s);
188+ events.ScheduleEvent (EVENT_SEQUENCE_3 , 1200ms);
134189 break ;
135- case EVENT_ARCANE_EXPLOSION :
190+ case EVENT_SEQUENCE_3 :
136191 DoCastSelf (SPELL_ARCANE_EXPLOSION );
137- DoCastSelf (SPELL_ARCANE_BUBBLE , true );
138192 break ;
139193 default :
140194 break ;
@@ -143,7 +197,7 @@ struct boss_talon_king_ikiss : public BossAI
143197
144198private:
145199 bool _introDone;
146- bool _manaShieldTriggered ;
200+ uint8 _phase ;
147201};
148202
149203// 38194 - Blink
@@ -158,24 +212,19 @@ class spell_talon_king_ikiss_blink : public SpellScript
158212
159213 void FilterTargets (std::list<WorldObject*>& targets)
160214 {
161- if (targets.empty ())
162- return ;
163-
164- WorldObject* target = Trinity::Containers::SelectRandomContainerElement (targets);
165- targets.clear ();
166- targets.push_back (target);
215+ // This is wrong, full list of targets is sent to client
216+ Trinity::Containers::RandomResize (targets, 1 );
167217 }
168218
169- void HandleDummyHitTarget (SpellEffIndex effIndex)
219+ void HandleDummy (SpellEffIndex /* effIndex*/ )
170220 {
171- PreventHitDefaultEffect (effIndex);
172221 GetHitUnit ()->CastSpell (GetCaster (), SPELL_BLINK_TELEPORT , true );
173222 }
174223
175224 void Register () override
176225 {
177226 OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn (spell_talon_king_ikiss_blink::FilterTargets, EFFECT_0 , TARGET_UNIT_SRC_AREA_ENEMY );
178- OnEffectHitTarget += SpellEffectFn (spell_talon_king_ikiss_blink::HandleDummyHitTarget , EFFECT_0 , SPELL_EFFECT_DUMMY );
227+ OnEffectHitTarget += SpellEffectFn (spell_talon_king_ikiss_blink::HandleDummy , EFFECT_0 , SPELL_EFFECT_DUMMY );
179228 }
180229};
181230
0 commit comments