1515 * with this program. If not, see <http://www.gnu.org/licenses/>.
1616 */
1717
18+ /*
19+ * Timers requires to be revisited
20+ */
21+
1822#include " ScriptMgr.h"
1923#include " auchenai_crypts.h"
20- #include " ObjectAccessor.h"
21- #include " Player.h"
2224#include " ScriptedCreature.h"
2325#include " SpellInfo.h"
2426#include " SpellScript.h"
27+ #include " TemporarySummon.h"
2528
2629enum MaladaarTexts
2730{
@@ -35,10 +38,10 @@ enum MaladaarTexts
3538
3639enum MaladaarSpells
3740{
41+ // Maladaar
3842 SPELL_SOUL_SCREAM = 32421 ,
3943 SPELL_RIBBON_OF_SOULS = 32422 ,
4044 SPELL_STOLEN_SOUL = 32346 ,
41- SPELL_SUMMON_STOLEN_SOUL = 32360 ,
4245 SPELL_SUMMON_AVATAR = 32424 ,
4346
4447 // Stolen Soul
@@ -54,7 +57,10 @@ enum MaladaarSpells
5457 SPELL_MORTAL_STRIKE = 37335 ,
5558 SPELL_FREEZING_TRAP = 37368 ,
5659 SPELL_HAMMER_OF_JUSTICE = 37369 ,
57- SPELL_PLAGUE_STRIKE = 58839
60+ SPELL_PLAGUE_STRIKE = 58839 ,
61+
62+ // Scripts
63+ SPELL_SUMMON_STOLEN_SOUL = 32360
5864};
5965
6066enum MaladaarEvents
@@ -91,7 +97,7 @@ enum MaladaarMisc
9197 MODEL_DRAENEI_FEMALE = 17004 // completely guessed
9298};
9399
94- Position const DoreSpawnPos = { -4 .40722f , -387 .277f , 40 .6294f , 6 .26573f };
100+ static Position const DoreSpawnPos = { -4 .40722f , -387 .277f , 40 .6294f , 6 .26573f };
95101
96102// 18373 - Exarch Maladaar
97103struct boss_exarch_maladaar : public BossAI
@@ -107,10 +113,12 @@ struct boss_exarch_maladaar : public BossAI
107113 void JustEngagedWith (Unit* who) override
108114 {
109115 BossAI::JustEngagedWith (who);
116+
110117 Talk (SAY_AGGRO );
111- events.ScheduleEvent (EVENT_SOUL_SCREAM , RAND (10s, 15s, 20s, 25s));
112- events.ScheduleEvent (EVENT_RIBBON_OF_SOULS , 1s, 4s);
113- events.ScheduleEvent (EVENT_STOLEN_SOUL , RAND (10s, 15s, 20s, 25s));
118+
119+ events.ScheduleEvent (EVENT_SOUL_SCREAM , 10s, 15s);
120+ events.ScheduleEvent (EVENT_RIBBON_OF_SOULS , 0s, 5s);
121+ events.ScheduleEvent (EVENT_STOLEN_SOUL , 10s, 25s);
114122 }
115123
116124 void DamageTaken (Unit* /* attacker*/ , uint32& damage, DamageEffectType /* damageType*/ , SpellInfo const * /* spellInfo = nullptr*/ ) override
@@ -122,9 +130,15 @@ struct boss_exarch_maladaar : public BossAI
122130 }
123131 }
124132
125- void OnSpellCast (SpellInfo const * spell ) override
133+ void OnSpellStart (SpellInfo const * spellInfo ) override
126134 {
127- switch (spell->Id )
135+ if (spellInfo->Id == SPELL_SUMMON_AVATAR )
136+ Talk (SAY_SUMMON );
137+ }
138+
139+ void OnSpellCast (SpellInfo const * spellInfo) override
140+ {
141+ switch (spellInfo->Id )
128142 {
129143 case SPELL_STOLEN_SOUL :
130144 if (roll_chance_i (25 ))
@@ -139,12 +153,6 @@ struct boss_exarch_maladaar : public BossAI
139153 }
140154 }
141155
142- void SpellHitTarget (WorldObject* target, SpellInfo const * spellInfo) override
143- {
144- if (spellInfo->Id == SPELL_STOLEN_SOUL )
145- target->CastSpell (target, SPELL_SUMMON_STOLEN_SOUL , true );
146- }
147-
148156 // Do not despawn avatar
149157 void JustSummoned (Creature* /* summon*/ ) override { }
150158
@@ -176,19 +184,18 @@ struct boss_exarch_maladaar : public BossAI
176184 {
177185 case EVENT_SOUL_SCREAM :
178186 DoCastSelf (SPELL_SOUL_SCREAM );
179- events.Repeat (RAND ( 15s, 20s) );
187+ events.Repeat (15s, 20s);
180188 break ;
181189 case EVENT_RIBBON_OF_SOULS :
182190 DoCastVictim (SPELL_RIBBON_OF_SOULS );
183- events.Repeat (4s, 20s); // Usually just 4
191+ events.Repeat (3600ms);
184192 break ;
185193 case EVENT_STOLEN_SOUL :
186194 if (Unit* target = SelectTarget (SelectTargetMethod::Random, 0 , 40 .0f , true , true , -SPELL_STOLEN_SOUL ))
187195 DoCast (target, SPELL_STOLEN_SOUL );
188- events.Repeat (RAND ( 20s, 25s) );
196+ events.Repeat (20s, 25s);
189197 break ;
190198 case EVENT_SUMMON_AVATAR :
191- Talk (SAY_SUMMON );
192199 DoCastSelf (SPELL_SUMMON_AVATAR );
193200 break ;
194201 default :
@@ -211,40 +218,47 @@ struct npc_stolen_soul : public ScriptedAI
211218{
212219 npc_stolen_soul (Creature* creature) : ScriptedAI(creature), _summonerClass(CLASS_NONE ) { }
213220
214- void IsSummonedBy (WorldObject* summonerWO ) override
221+ void InitializeAI ( ) override
215222 {
216- Player* summoner = summonerWO->ToPlayer ();
217- if (!summoner)
218- return ;
223+ ScriptedAI::InitializeAI ();
219224
220- _summonerGUID = summoner->GetGUID ();
221- _summonerClass = summoner->GetClass ();
222-
223- // Apparently this is the first time they tried to "clone" player
224- uint32 model = 0 ;
225- uint8 gender = summoner->GetNativeGender ();
225+ me->SetCorpseDelay (3 , true );
226226
227- switch (summoner-> GetRace ())
227+ if (TempSummon* summon = me-> ToTempSummon ())
228228 {
229- case RACE_UNDEAD_PLAYER : model = gender ? MODEL_UNDEAD_FEMALE : MODEL_UNDEAD_MALE ; break ;
230- case RACE_NIGHTELF : model = gender ? MODEL_NIGHTELF_FEMALE : MODEL_NIGHTELF_MALE ; break ;
231- case RACE_ORC : model = gender ? MODEL_ORC_FEMALE : MODEL_ORC_MALE ; break ;
232- case RACE_TAUREN : model = gender ? MODEL_TAUREN_FEMALE : MODEL_TAUREN_MALE ; break ;
233- case RACE_GNOME : model = gender ? MODEL_GNOME_FEMALE : MODEL_GNOME_MALE ; break ;
234- case RACE_HUMAN : model = gender ? MODEL_HUMAN_FEMALE : MODEL_HUMAN_MALE ; break ;
235- case RACE_DWARF : model = gender ? MODEL_DWARF_FEMALE : MODEL_DWARF_MALE ; break ;
236- case RACE_TROLL : model = gender ? MODEL_TROLL_FEMALE : MODEL_TROLL_MALE ; break ;
237- case RACE_BLOODELF : model = gender ? MODEL_BLOODELF_FEMALE : MODEL_BLOODELF_MALE ; break ;
238- case RACE_DRAENEI : model = gender ? MODEL_DRAENEI_FEMALE : MODEL_DRAENEI_MALE ; break ;
239- default : break ;
240- }
229+ Unit* summoner = summon->GetSummonerUnit ();
230+ if (summoner && summoner->IsPlayer ())
231+ {
232+ // Apparently this is the first time they tried to "clone" player
233+ uint32 model = 0 ;
234+ uint8 gender = summoner->GetNativeGender ();
241235
242- if (model)
243- me->SetDisplayId (model);
236+ _summonerClass = summoner->GetClass ();
244237
245- me->SetCorpseDelay (3 , true );
246- DoCastSelf (SPELL_STOLEN_SOUL_VISUAL );
238+ switch (summoner->GetRace ())
239+ {
240+ case RACE_UNDEAD_PLAYER : model = gender ? MODEL_UNDEAD_FEMALE : MODEL_UNDEAD_MALE ; break ;
241+ case RACE_NIGHTELF : model = gender ? MODEL_NIGHTELF_FEMALE : MODEL_NIGHTELF_MALE ; break ;
242+ case RACE_ORC : model = gender ? MODEL_ORC_FEMALE : MODEL_ORC_MALE ; break ;
243+ case RACE_TAUREN : model = gender ? MODEL_TAUREN_FEMALE : MODEL_TAUREN_MALE ; break ;
244+ case RACE_GNOME : model = gender ? MODEL_GNOME_FEMALE : MODEL_GNOME_MALE ; break ;
245+ case RACE_HUMAN : model = gender ? MODEL_HUMAN_FEMALE : MODEL_HUMAN_MALE ; break ;
246+ case RACE_DWARF : model = gender ? MODEL_DWARF_FEMALE : MODEL_DWARF_MALE ; break ;
247+ case RACE_TROLL : model = gender ? MODEL_TROLL_FEMALE : MODEL_TROLL_MALE ; break ;
248+ case RACE_BLOODELF : model = gender ? MODEL_BLOODELF_FEMALE : MODEL_BLOODELF_MALE ; break ;
249+ case RACE_DRAENEI : model = gender ? MODEL_DRAENEI_FEMALE : MODEL_DRAENEI_MALE ; break ;
250+ default : break ;
251+ }
252+
253+ if (model)
254+ me->SetDisplayId (model);
255+ }
256+ }
257+ }
247258
259+ void JustAppeared () override
260+ {
261+ DoCastSelf (SPELL_STOLEN_SOUL_VISUAL );
248262 DoZoneInCombat ();
249263 }
250264
@@ -338,8 +352,9 @@ struct npc_stolen_soul : public ScriptedAI
338352
339353 void JustDied (Unit* /* killer*/ ) override
340354 {
341- if (Unit* target = ObjectAccessor::GetUnit (*me, _summonerGUID))
342- DoCast (target, SPELL_STOLEN_SOUL_DISPEL , true );
355+ if (TempSummon* summon = me->ToTempSummon ())
356+ if (Unit* summoner = summon->GetSummonerUnit ())
357+ DoCast (summoner, SPELL_STOLEN_SOUL_DISPEL , true );
343358 }
344359
345360 void UpdateAI (uint32 diff) override
@@ -355,34 +370,55 @@ struct npc_stolen_soul : public ScriptedAI
355370
356371private:
357372 TaskScheduler _scheduler;
358- ObjectGuid _summonerGUID;
359373 uint8 _summonerClass;
360374};
361375
376+ // 32346 - Stolen Soul
377+ class spell_exarch_maladaar_stolen_soul : public SpellScript
378+ {
379+ PrepareSpellScript (spell_exarch_maladaar_stolen_soul);
380+
381+ bool Validate (SpellInfo const * /* spellInfo*/ ) override
382+ {
383+ return ValidateSpellInfo ({ SPELL_SUMMON_STOLEN_SOUL });
384+ }
385+
386+ void HandleAfterHit ()
387+ {
388+ GetHitUnit ()->CastSpell (nullptr , SPELL_SUMMON_STOLEN_SOUL , true );
389+ }
390+
391+ void Register () override
392+ {
393+ AfterHit += SpellHitFn (spell_exarch_maladaar_stolen_soul::HandleAfterHit);
394+ }
395+ };
396+
362397// 33326 - Stolen Soul Dispel
363398class spell_exarch_maladaar_stolen_soul_dispel : public AuraScript
364399{
365400 PrepareAuraScript (spell_exarch_maladaar_stolen_soul_dispel);
366401
367- bool Validate (SpellInfo const * /* spell */ ) override
402+ bool Validate (SpellInfo const * /* spellInfo */ ) override
368403 {
369404 return ValidateSpellInfo ({ SPELL_STOLEN_SOUL });
370405 }
371406
372- void OnApply (AuraEffect const * /* aurEff*/ , AuraEffectHandleModes /* mode*/ )
407+ void AfterApply (AuraEffect const * /* aurEff*/ , AuraEffectHandleModes /* mode*/ )
373408 {
374409 GetTarget ()->RemoveAurasDueToSpell (SPELL_STOLEN_SOUL );
375410 }
376411
377412 void Register () override
378413 {
379- AfterEffectApply += AuraEffectApplyFn (spell_exarch_maladaar_stolen_soul_dispel::OnApply , EFFECT_0 , SPELL_AURA_DUMMY , AURA_EFFECT_HANDLE_REAL );
414+ AfterEffectApply += AuraEffectApplyFn (spell_exarch_maladaar_stolen_soul_dispel::AfterApply , EFFECT_0 , SPELL_AURA_DUMMY , AURA_EFFECT_HANDLE_REAL );
380415 }
381416};
382417
383418void AddSC_boss_exarch_maladaar ()
384419{
385420 RegisterAuchenaiCryptsCreatureAI (boss_exarch_maladaar);
386421 RegisterAuchenaiCryptsCreatureAI (npc_stolen_soul);
422+ RegisterSpellScript (spell_exarch_maladaar_stolen_soul);
387423 RegisterSpellScript (spell_exarch_maladaar_stolen_soul_dispel);
388424}
0 commit comments