View difference between Paste ID: ALsx7cps and ytuXWABC
SHOW: | | - or go back to the newest paste.
1
/*
2
 * Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
3
 *
4
 * This program is free software; you can redistribute it and/or modify it
5
 * under the terms of the GNU General Public License as published by the
6
 * Free Software Foundation; either version 2 of the License, or (at your
7
 * option) any later version.
8
 *
9
 * This program is distributed in the hope that it will be useful, but WITHOUT
10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
 * more details.
13
 *
14
 * You should have received a copy of the GNU General Public License along
15
 * with this program. If not, see <http://www.gnu.org/licenses/>.
16
 */
17
18
/* ScriptData
19
SDName: Argent Challenge Encounter.
20
SD%Complete: 90 %
21
SDComment: AI from bosses need more improvements. Need AI for lightwell
22
SDCategory: Trial of the Champion
23
EndScriptData */
24
25
#include "ScriptPCH.h"
26
#include "ScriptMgr.h"
27
#include "ScriptedCreature.h"
28
#include "SpellScript.h"
29
#include "trial_of_the_champion.h"
30
#include "ScriptedEscortAI.h"
31
/*
32
enum Yells
33
{
34
    // Eadric the Pure
35
    SAY_INTRO                   = 0,
36
    SAY_AGGRO                   = 1,
37
    EMOTE_RADIANCE              = 2,
38
    EMOTE_HAMMER_RIGHTEOUS      = 3,
39
    SAY_HAMMER_RIGHTEOUS        = 4,
40
    SAY_KILL_PLAYER             = 5,
41
    SAY_DEFEATED                = 6,
42
43
    // Argent Confessor Paletress
44
    SAY_INTRO_1                 = 0,
45
    SAY_INTRO_2                 = 1,
46
    SAY_AGGRO                   = 2,
47
    SAY_MEMORY_SUMMON           = 3,
48
    SAY_MEMORY_DEATH            = 4,
49
    SAY_KILL_PLAYER             = 5,
50
    SAY_DEFEATED                = 6,
51
52
    // Memory of X
53
    EMOTE_WAKING_NIGHTMARE      = 0
54
};
55
*/
56
57
enum Spells
58
{
59
    // Eadric the Pure
60
    SPELL_EADRIC_ACHIEVEMENT    = 68197,
61
    SPELL_HAMMER_JUSTICE        = 66863,
62
	SPELL_HAMMER_JUSTICE_STUN   = 66940,
63
    SPELL_HAMMER_RIGHTEOUS      = 66867,
64
	SPELL_HAMMER_OVERRIDE_BAR   = 66904, // overrides players cast bar
65
	SPELL_HAMMER_THROWBACK_DMG  = 66905, // the hammer that is thrown back by the player
66
    SPELL_RADIANCE              = 66935,
67
    SPELL_VENGEANCE             = 66865,
68
69
    // Paletress
70
	SPELL_CONFESSOR_ACHIEVEMENT = 68206,
71
    SPELL_SMITE                 = 66536,
72
    SPELL_SMITE_H               = 67674,
73
    SPELL_HOLY_FIRE             = 66538,
74
    SPELL_HOLY_FIRE_H           = 67676,
75
    SPELL_RENEW                 = 66537,
76
    SPELL_RENEW_H               = 67675,
77
    SPELL_HOLY_NOVA             = 66546,
78
    SPELL_SHIELD                = 66515,
79
    SPELL_CONFESS               = 66680,
80
    /*SPELL_SUMMON_MEMORY         = 66545,*/
81
82
	//Npc_argent_soldier
83
	SPELL_STRIKE = 67237,
84
	SPELL_CLEAVE = 15284,
85
	SPELL_PUMMEL = 67235,
86
	SPELL_PAIN = 34942,
87
	SPELL_MIND = 67229,
88
	SPELL_SSMITE = 67289,
89
	SPELL_LIGHT_H = 67290,
90
	SPELL_LIGHT = 67247,
91
	SPELL_FLURRY = 67233,
92
	SPELL_FINAL = 67255,
93
	SPELL_DIVINE = 67251,
94
95
    // Memory of X (Summon)
96
    SPELL_MEMORY_ALGALON        = 66715,
97
    SPELL_MEMORY_ARCHIMONDE     = 66704,
98
    SPELL_MEMORY_CHROMAGGUS     = 66697,
99
    SPELL_MEMORY_CYANIGOSA      = 66709,
100
    SPELL_MEMORY_DELRISSA       = 66706,
101
    SPELL_MEMORY_ECK            = 66710,
102
    SPELL_MEMORY_ENTROPIUS      = 66707,
103
    SPELL_MEMORY_GRUUL          = 66702,
104
    SPELL_MEMORY_HAKKAR         = 66698,
105
    SPELL_MEMORY_HEIGAN         = 66712,
106
    SPELL_MEMORY_HEROD          = 66694,
107
    SPELL_MEMORY_HOGGER         = 66543,
108
    SPELL_MEMORY_IGNIS          = 66713,
109
    SPELL_MEMORY_ILLIDAN        = 66705,
110
    SPELL_MEMORY_INGVAR         = 66708,
111
    SPELL_MEMORY_KALITHRESH     = 66700,
112
    SPELL_MEMORY_LUCIFRON       = 66695,
113
    SPELL_MEMORY_MALCHEZAAR     = 66701,
114
    SPELL_MEMORY_MUTANUS        = 66692,
115
    SPELL_MEMORY_ONYXIA         = 66711,
116
    SPELL_MEMORY_THUNDERAAN     = 66696,
117
    SPELL_MEMORY_VANCLEEF       = 66691,
118
    SPELL_MEMORY_VASHJ          = 66703,
119
    SPELL_MEMORY_VEKNILASH      = 66699,
120
    SPELL_MEMORY_VEZAX          = 66714,
121
122
    // Memory
123
    SPELL_OLD_WOUNDS            = 66620,
124
    SPELL_OLD_WOUNDS_H          = 67679,
125
    SPELL_SHADOWS_PAST          = 66619,
126
    SPELL_SHADOWS_PAST_H        = 67678,
127
    SPELL_WAKING_NIGHTMARE      = 66552,
128
    SPELL_WAKING_NIGHTMARE_H    = 67677,
129
};
130
// custom
131
const uint32 summonMemory[] = {
132
	66543,
133
	66705,
134
	66706,
135
	66707,
136
	66708,
137
	66709,
138
	66710,
139
	66711,
140
	66712,
141
	66713,
142
	66714,
143
	66704,
144
	66703,
145
	66702,
146
	66691,
147
	66692,
148
	66694,
149
	66695,
150
	66696,
151
	66697,
152
	66698,
153
	66699,
154
	66700,
155
	66701,
156
	66715,
157
};
158
159
enum Misc
160
{
161
	ACHIEV_FACEROLLER = 3803,
162
	ACHIEV_CONF = 3802
163
};
164
165
enum Talk
166
{
167
	SAY_ARGENT_ENTERS = 19,
168
	SAY_ARGENT_READY = 20,
169
170
	// Paletress
171
	SAY_PALETRESS_AGGRO = 2,
172
	SAY_PALETRESS_SUMMON_MEMORY = 3,
173
	SAY_PALETRESS_MEMORY_DIES = 4,
174
	SAY_PALETRESS_PLAYER_DIES = 5,
175
	SAY_PALETRESS_DEFEATED = 6,
176
177
	// Eadric
178
	SAY_EADRIC_AGGRO = 1,
179
	SAY_EADRIC_HAMMER = 2,
180
	SAY_EADRIC_PLAYER_DIES = 3,
181
	SAY_EADRIC_DEFEATED = 4
182
};
183
184
class OrientationCheck
185
{
186
    public:
187
        explicit OrientationCheck(Unit* _caster) : caster(_caster) { }
188
		bool operator() (WorldObject* object)
189
        {
190
			return !object->isInFront(caster, 40.0f) || !object->IsWithinDist(caster, 40.0f);
191
        }
192
193
    private:
194
        Unit* caster;
195
};
196
197
class spell_eadric_radiance : public SpellScriptLoader
198
{
199
    public:
200
        spell_eadric_radiance() : SpellScriptLoader("spell_eadric_radiance") { }
201
202
        class spell_eadric_radiance_SpellScript : public SpellScript
203
        {
204
            PrepareSpellScript(spell_eadric_radiance_SpellScript);
205
206
			void FilterTargets(std::list<WorldObject*>& targets)
207
            {
208
				targets.remove_if(OrientationCheck(GetCaster()));
209
            }
210
211
            void Register() OVERRIDE
212
            {
213
                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
214
                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_eadric_radiance_SpellScript::FilterTargets, EFFECT_1, TARGET_UNIT_SRC_AREA_ENEMY);
215
            }
216
        };
217
218
        SpellScript *GetSpellScript() const /*OVERRIDE*/
219
        {
220
            return new spell_eadric_radiance_SpellScript();
221
        }
222
};
223
224
class spell_eadric_hoj : public SpellScriptLoader
225
{
226
public:
227
	spell_eadric_hoj() : SpellScriptLoader("spell_eadric_hoj") { }
228
229
	class spell_eadric_hoj_SpellScript : public SpellScript
230
	{
231
		PrepareSpellScript(spell_eadric_hoj_SpellScript);
232
233
		void HandleOnHit()
234
		{
235
			if (GetHitUnit() && GetHitUnit()->GetTypeId() == TYPEID_PLAYER)
236
			if (!GetHitUnit()->HasAura(SPELL_HAMMER_JUSTICE_STUN))
237
			{
238
				SetHitDamage(0);
239
				GetHitUnit()->AddAura(SPELL_HAMMER_OVERRIDE_BAR, GetHitUnit());
240
			}
241
		}
242
243
		void Register()
244
		{
245
			OnHit += SpellHitFn(spell_eadric_hoj_SpellScript::HandleOnHit);
246
		}
247
	};
248
249
	SpellScript* GetSpellScript() const
250
	{
251
		return new spell_eadric_hoj_SpellScript();
252
	}
253
};
254
255
256
class boss_eadric : public CreatureScript
257
{
258
    public:
259
		boss_eadric() : CreatureScript("boss_eadric") {}
260
261
	struct boss_eadricAI : public BossAI
262
    {
263
		boss_eadricAI(Creature* creature) : BossAI(creature, BOSS_ARGENT_CHALLENGE_E)
264
        {
265
            instance = creature->GetInstanceScript();
266
            creature->SetReactState(REACT_PASSIVE);
267
            creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
268
269
			hasBeenInCombat = false;
270
			bCredit = false;
271
        }
272
273
        InstanceScript* instance;
274
275
        uint32 uiVenganceTimer;
276
        uint32 uiRadianceTimer;
277
        uint32 uiHammerJusticeTimer;
278
        uint32 uiResetTimer;
279
280
        bool bDone;
281
		bool hasBeenInCombat;
282
		bool bCredit;
283
284
        void Reset() OVERRIDE
285
        {
286
            uiVenganceTimer = 10000;
287
            uiRadianceTimer = 16000;
288
            uiHammerJusticeTimer = 25000;
289
            uiResetTimer = 5000;
290
291
            bDone = false;
292
			Map* pMap = me->GetMap();
293
			if (hasBeenInCombat && pMap && pMap->IsDungeon())
294
			{
295
				Map::PlayerList const &players = pMap->GetPlayers();
296
				for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
297
				{
298
					if (itr->GetSource() && itr->GetSource()->IsAlive() && !itr->GetSource()->IsGameMaster())
299
						return;
300
				}
301
302
				if (instance)
303
				{
304
					GameObject* GO = GameObject::GetGameObject(*me, instance->GetData64(DATA_MAIN_GATE1));
305
					if (GO)
306
						instance->HandleGameObject(GO->GetGUID(), true);
307
					Creature* announcer = pMap->GetCreature(instance->GetData64(DATA_ANNOUNCER));
308
					instance->SetData(DATA_ARGENT_SOLDIER_DEFEATED, 0);
309
					announcer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
310
				}
311
				me->RemoveFromWorld();
312
			}
313
        }
314
315
		void DamageTaken(Unit* /*who*/, uint32& damage) /*OVERRIDE*/
316
        {
317
            if (damage >= me->GetHealth())
318
            {
319
                damage = 0;
320
				if (!bCredit)
321
				{
322
					bCredit = true;
323
					HandleSpellOnPlayersInInstanceToC5(me, 68575);
324
				}
325
                EnterEvadeMode();
326
				me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
327
				Talk(SAY_EADRIC_DEFEATED);
328
                me->setFaction(35);
329
                bDone = true;
330
				if (GameObject* pGO = GameObject::GetGameObject(*me, instance->GetData64(DATA_MAIN_GATE)))
331
					instance->HandleGameObject(pGO->GetGUID(), true);
332
				if (GameObject* pGO = GameObject::GetGameObject(*me, instance->GetData64(DATA_MAIN_GATE1)))
333
					instance->HandleGameObject(pGO->GetGUID(), true);
334
				if (instance)
335
					instance->SetData(BOSS_ARGENT_CHALLENGE_E, DONE);
336
            }
337
        }
338
339
		void MovementInform(uint32 MovementType, uint32 Data) /*OVERRIDE*/
340
		{
341
			if (MovementType != POINT_MOTION_TYPE)
342
				return;
343
		}
344
345
		void EnterCombat(Unit* pWho)
346
		{
347
			me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
348
			_EnterCombat();
349
			me->SetHomePosition(746.843f, 665.000f, 412.339f, 4.670f);
350
			Talk(SAY_EADRIC_AGGRO);
351
			hasBeenInCombat = true;
352
		}
353
354
		void SpellHit(Unit* caster, SpellInfo const* spell)
355
		{
356
			if (IsHeroic() && !bDone)
357
			    if (caster->GetTypeId() == TYPEID_PLAYER)
358
				    if (spell->Id == SPELL_HAMMER_THROWBACK_DMG && me->GetHealth() <= spell->Effects[0].BasePoints)
359
						DoCast(caster, SPELL_EADRIC_ACHIEVEMENT);
360
        }
361
362
        void UpdateAI(uint32 uiDiff) OVERRIDE
363
        {
364
			if (bDone && uiResetTimer <= uiDiff)
365
			{
366
				me->GetMotionMaster()->MovePoint(0, 746.843f, 695.68f, 412.339f);
367
				bDone = false;
368
				if (GameObject* pGO = GameObject::GetGameObject(*me, instance->GetData64(DATA_MAIN_GATE)))
369
					instance->HandleGameObject(pGO->GetGUID(), false);
370
			}
371
			else
372
				uiResetTimer -= uiDiff;
373
374
            if (!UpdateVictim())
375
                return;
376
377
			if (uiHammerJusticeTimer <= uiDiff)
378
			{
379
				me->InterruptNonMeleeSpells(true);
380
381
				if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 250, true))
382
				{
383
					if (target && target->IsAlive())
384
					{
385
						Talk(SAY_EADRIC_HAMMER);
386
						DoCast(target, SPELL_HAMMER_JUSTICE);
387
						DoCast(target, SPELL_HAMMER_RIGHTEOUS);
388
					}
389
				}
390
391
				uiHammerJusticeTimer = 25000;
392
			}
393
			else
394
				uiHammerJusticeTimer -= uiDiff;
395
396
397
			if (uiVenganceTimer <= uiDiff)
398
			{
399
				DoCast(me, SPELL_VENGEANCE);
400
401
				uiVenganceTimer = 10000;
402
			}
403
			else
404
				uiVenganceTimer -= uiDiff;
405
406
			if (uiRadianceTimer <= uiDiff)
407
			{
408
				DoCastAOE(SPELL_RADIANCE);
409
410
				uiRadianceTimer = 16000;
411
			}
412
			else
413
				uiRadianceTimer -= uiDiff;
414
415
            DoMeleeAttackIfReady();
416
        }
417
    };
418
419
    CreatureAI* GetAI(Creature* creature) const OVERRIDE
420
    {
421
        return GetInstanceAI<boss_eadricAI>(creature);
422
	};
423
};
424
425
class boss_paletress : public CreatureScript
426
{
427
    public:
428
		boss_paletress() : CreatureScript("boss_paletress") {}
429
430
	struct boss_paletressAI : public BossAI
431
    {
432
		boss_paletressAI(Creature* creature) : BossAI(creature, BOSS_ARGENT_CHALLENGE_P)
433
        {
434
			pInstance = creature->GetInstanceScript();
435
436
			hasBeenInCombat = false;
437
			bCredit = false;
438
            MemoryGUID = 0;
439
            creature->SetReactState(REACT_PASSIVE);
440
            creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
441
            creature->RestoreFaction();
442
        }
443
444
		InstanceScript* pInstance;
445
446
		Creature* pMemory;
447
        uint64 MemoryGUID;
448
449
        bool bHealth;
450
        bool bDone;
451
		bool hasBeenInCombat;
452
		bool bCredit;
453
454
        uint32 uiHolyFireTimer;
455
        uint32 uiHolySmiteTimer;
456
        uint32 uiRenewTimer;
457
        uint32 uiResetTimer;
458
459
        void Reset() OVERRIDE
460
        {
461
            me->RemoveAllAuras();
462
463
            uiHolyFireTimer     = urand(9000, 12000);
464
            uiHolySmiteTimer    = urand(5000, 7000);
465
            uiRenewTimer        = urand(2000, 5000);
466
467
            uiResetTimer        = 7000;
468
469
            bHealth = false;
470
            bDone = false;
471
472
            if (Creature* pMemory = Unit::GetCreature(*me, MemoryGUID))
473
                if (pMemory->IsAlive())
474
                    pMemory->RemoveFromWorld();
475
476
			Map* pMap = me->GetMap();
477
			if (hasBeenInCombat && pMap && pMap->IsDungeon())
478
			{
479
				Map::PlayerList const &players = pMap->GetPlayers();
480
				for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
481
				{
482
					if (itr->GetSource() && itr->GetSource()->IsAlive() && !itr->GetSource()->IsGameMaster())
483
						return;
484
				}
485
486
				if (pInstance)
487
				{
488
					GameObject* GO = GameObject::GetGameObject(*me, pInstance->GetData64(DATA_MAIN_GATE1));
489
					if (GO)
490
						pInstance->HandleGameObject(GO->GetGUID(), true);
491
					Creature* announcer = pMap->GetCreature(pInstance->GetData64(DATA_ANNOUNCER));
492
					pInstance->SetData(DATA_ARGENT_SOLDIER_DEFEATED, 0);
493
					announcer->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
494
				}
495
496
				me->RemoveFromWorld();
497
			}
498
        }
499
500
		void EnterCombat(Unit* pWho)
501
		{
502
			me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
503
			_EnterCombat();
504
			me->SetHomePosition(746.843f, 665.000f, 412.339f, 4.670f);
505
			hasBeenInCombat = true;
506
			Talk(SAY_PALETRESS_AGGRO);
507
		}
508
509
		void SetData(uint32 uiId, uint32 uiValue) OVERRIDE
510
        {
511
            if (uiId == 1)
512
                me->RemoveAura(SPELL_SHIELD);
513
			    Talk(SAY_PALETRESS_MEMORY_DIES);
514
        }
515
516
		void DamageTaken(Unit* /*who*/, uint32& damage) /*OVERRIDE*/
517
        {
518
            if (damage >= me->GetHealth())
519
            {
520
                damage = 0;
521
				if (!bCredit)
522
				{
523
					bCredit = true;
524
					HandleSpellOnPlayersInInstanceToC5(me, 68574);
525
				}
526
                EnterEvadeMode();
527
				me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
528
				Talk(SAY_PALETRESS_DEFEATED);
529
                me->setFaction(35);
530
                bDone = true;
531
				if (GameObject* pGO = GameObject::GetGameObject(*me, pInstance->GetData64(DATA_MAIN_GATE)))
532
					pInstance->HandleGameObject(pGO->GetGUID(), true);
533
				if (GameObject* pGO = GameObject::GetGameObject(*me, pInstance->GetData64(DATA_MAIN_GATE1)))
534
					pInstance->HandleGameObject(pGO->GetGUID(), true);
535
				    pInstance->SetData(BOSS_ARGENT_CHALLENGE_P, DONE);
536
            }
537
        }
538
539
		void MovementInform(uint32 MovementType, uint32 Data) /*OVERRIDE*/
540
        {
541
			if (MovementType != POINT_MOTION_TYPE)
542
                return;
543
        }
544
545
        void UpdateAI(uint32 uiDiff) OVERRIDE
546
        {
547
			if (bDone && uiResetTimer <= uiDiff)
548
			{
549
				me->GetMotionMaster()->MovePoint(0, 746.843f, 695.68f, 412.339f);
550
				bDone = false;
551
				if (GameObject* pGO = GameObject::GetGameObject(*me, pInstance->GetData64(DATA_MAIN_GATE)))
552
					pInstance->HandleGameObject(pGO->GetGUID(), false);
553
			}
554
			else
555
				uiResetTimer -= uiDiff;
556
557
            if (!UpdateVictim())
558
                return;
559
560
			if (uiHolyFireTimer <= uiDiff)
561
			{
562
				if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 250, true))
563
				{
564
					if (target && target->IsAlive())
565
						DoCast(target, DUNGEON_MODE(SPELL_HOLY_FIRE, SPELL_HOLY_FIRE_H));
566
				}
567
568
				if (me->HasAura(SPELL_SHIELD))
569
					uiHolyFireTimer = 13000;
570
				else
571
					uiHolyFireTimer = urand(9000, 12000);
572
			}
573
			else
574
				uiHolyFireTimer -= uiDiff;
575
576
			if (uiHolySmiteTimer <= uiDiff)
577
			{
578
				if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 250, true))
579
				{
580
					if (target && target->IsAlive())
581
						DoCast(target, DUNGEON_MODE(SPELL_SMITE, SPELL_SMITE_H));
582
				}
583
584
				if (me->HasAura(SPELL_SHIELD))
585
					uiHolySmiteTimer = 9000;
586
				else
587
					uiHolySmiteTimer = urand(5000, 7000);
588
			}
589
			else
590
				uiHolySmiteTimer -= uiDiff;
591
592
            if (me->HasAura(SPELL_SHIELD))
593
            {
594
				if (uiRenewTimer <= uiDiff)
595
				{
596
					me->InterruptNonMeleeSpells(true);
597
					uint8 uiTarget = urand(0, 1);
598
					switch (uiTarget)
599
					{
600
					case 0:
601
						DoCast(me, DUNGEON_MODE(SPELL_RENEW, SPELL_RENEW_H));
602
						break;
603
					case 1:
604
						if (Creature* pMemory = Unit::GetCreature(*me, MemoryGUID))
605
						if (pMemory->IsAlive())
606
							DoCast(pMemory, DUNGEON_MODE(SPELL_RENEW, SPELL_RENEW_H));
607
						break;
608
					}
609
					uiRenewTimer = urand(15000, 17000);
610
				}
611
				else
612
					uiRenewTimer -= uiDiff;
613
            }
614
615
			if (!bHealth && me->GetHealth() * 100 / me->GetMaxHealth() <= 35)
616
            {
617
				Talk(SAY_PALETRESS_SUMMON_MEMORY);
618
                me->InterruptNonMeleeSpells(true);
619
                DoCastAOE(SPELL_HOLY_NOVA, false);
620
                DoCast(me, SPELL_SHIELD);
621
                DoCastAOE(SPELL_CONFESS, false);
622
623
                bHealth = true;
624
				switch (urand(0, 24))
625
				{
626
				case 0:
627
					me->SummonCreature(MEMORY_ALGALON, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
628
					break;
629
				case 1:
630
					me->SummonCreature(MEMORY_CHROMAGGUS, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
631
					break;
632
				case 2:
633
					me->SummonCreature(MEMORY_CYANIGOSA, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
634
					break;
635
				case 3:
636
					me->SummonCreature(MEMORY_DELRISSA, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
637
					break;
638
				case 4:
639
					me->SummonCreature(MEMORY_ECK, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
640
					break;
641
				case 5:
642
					me->SummonCreature(MEMORY_ENTROPIUS, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
643
					break;
644
				case 6:
645
					me->SummonCreature(MEMORY_GRUUL, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
646
					break;
647
				case 7:
648
					me->SummonCreature(MEMORY_HAKKAR, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
649
					break;
650
				case 8:
651
					me->SummonCreature(MEMORY_HEIGAN, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
652
					break;
653
				case 9:
654
					me->SummonCreature(MEMORY_HEROD, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
655
					break;
656
				case 10:
657
					me->SummonCreature(MEMORY_HOGGER, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
658
					break;
659
				case 11:
660
					me->SummonCreature(MEMORY_IGNIS, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
661
					break;
662
				case 12:
663
					me->SummonCreature(MEMORY_ILLIDAN, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
664
					break;
665
				case 13:
666
					me->SummonCreature(MEMORY_INGVAR, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
667
					break;
668
				case 14:
669
					me->SummonCreature(MEMORY_KALITHRESH, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
670
					break;
671
				case 15:
672
					me->SummonCreature(MEMORY_LUCIFRON, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
673
					break;
674
				case 16:
675
					me->SummonCreature(MEMORY_MALCHEZAAR, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
676
					break;
677
				case 17:
678
					me->SummonCreature(MEMORY_MUTANUS, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
679
					break;
680
				case 18:
681
					me->SummonCreature(MEMORY_ONYXIA, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
682
					break;
683
				case 19:
684
					me->SummonCreature(MEMORY_THUNDERAAN, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
685
					break;
686
				case 20:
687
					me->SummonCreature(MEMORY_VANCLEEF, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
688
					break;
689
				case 21:
690
					me->SummonCreature(MEMORY_VASHJ, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
691
					break;
692
				case 22:
693
					me->SummonCreature(MEMORY_VEKNILASH, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
694
					break;
695
				case 23:
696
					me->SummonCreature(MEMORY_VEZAX, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
697
					break;
698
				case 24:
699
					me->SummonCreature(MEMORY_ARCHIMONDE, 0.0f, 0.0f, 0.0f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
700
					break;
701
				}
702
            }
703
704
            DoMeleeAttackIfReady();
705
        }
706
707
        void JustSummoned(Creature* summon) OVERRIDE
708
        {
709
            MemoryGUID = summon->GetGUID();
710
        }
711
    };
712
713
    CreatureAI* GetAI(Creature* creature) const OVERRIDE
714
    {
715
        return GetInstanceAI<boss_paletressAI>(creature);
716
	};
717
};
718
719
class npc_memory : public CreatureScript
720
{
721
    public:
722
		npc_memory() : CreatureScript("npc_memory") {}
723
724
    struct npc_memoryAI : public ScriptedAI
725
    {
726
        npc_memoryAI(Creature* creature) : ScriptedAI(creature) { }
727
728
        uint32 uiOldWoundsTimer;
729
        uint32 uiShadowPastTimer;
730
        uint32 uiWakingNightmare;
731
732
        void Reset() OVERRIDE
733
        {
734
            uiOldWoundsTimer = 12000;
735
            uiShadowPastTimer = 5000;
736
            uiWakingNightmare = 7000;
737
        }
738
739
        void UpdateAI(uint32 uiDiff) OVERRIDE
740
        {
741
            if (!UpdateVictim())
742
                return;
743
744
			if (uiOldWoundsTimer <= uiDiff)
745
			{
746
				if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
747
				{
748
					if (target && target->IsAlive())
749
						DoCast(target, DUNGEON_MODE(SPELL_OLD_WOUNDS, SPELL_OLD_WOUNDS_H));
750
				}
751
				uiOldWoundsTimer = 12000;
752
753
				uiOldWoundsTimer = 23000;
754
			}
755
			else
756
				uiOldWoundsTimer -= uiDiff;
757
758
			if (uiWakingNightmare <= uiDiff)
759
			{
760
				DoCast(me, DUNGEON_MODE(SPELL_WAKING_NIGHTMARE, SPELL_WAKING_NIGHTMARE_H));
761
				uiWakingNightmare = 15000;
762
			}
763
			else
764
				uiWakingNightmare -= uiDiff;
765
766
			if (uiShadowPastTimer <= uiDiff)
767
			{
768
				if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1))
769
				{
770
					if (target && target->IsAlive())
771
						DoCast(target, DUNGEON_MODE(SPELL_SHADOWS_PAST, SPELL_SHADOWS_PAST_H));
772
				}
773
774
				uiShadowPastTimer = 20000;
775
			}
776
			else
777
				uiShadowPastTimer -= uiDiff;
778
779
            DoMeleeAttackIfReady();
780
        }
781
782
		void JustDied(Unit* killer) /*OVERRIDE*/
783
        {
784
			if (me->IsSummon())
785
			{
786
				if (Unit* summoner = me->ToTempSummon()->GetSummoner())
787
				{
788
					if (summoner && summoner->IsAlive())
789
					    if (Creature* summoner = summoner->ToCreature())
790
							summoner->AI()->SetData(1, 0);
791
				}
792
			}
793
        }
794
    };
795
796
    CreatureAI* GetAI(Creature* creature) const OVERRIDE
797
    {
798
        return new npc_memoryAI(creature);
799
	};
800
};
801
802
class npc_argent_soldier : public CreatureScript
803
{
804
    public:
805
		npc_argent_soldier() : CreatureScript("npc_argent_soldier") {}
806
807
    struct npc_argent_soldierAI : public npc_escortAI
808
    {
809
        npc_argent_soldierAI(Creature* creature) : npc_escortAI(creature)
810
        {
811
			pInstance = creature->GetInstanceScript();
812
			me->SetReactState(REACT_PASSIVE);
813
			me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
814
			me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
815
			if (GameObject* pGO = GameObject::GetGameObject(*me, pInstance->GetData64(DATA_MAIN_GATE)))
816
				pInstance->HandleGameObject(pGO->GetGUID(), true);
817
            SetDespawnAtEnd(false);
818
            uiWaypoint = 0;
819
			bStarted = false;
820
        }
821
822
		InstanceScript* pInstance;
823
824
        uint8 uiWaypoint;
825
826
		uint32 uiStrikeTimer;
827
		uint32 uiCleaveTimer;
828
		uint32 uiPummelTimer;
829
		uint32 uiPainTimer;
830
		uint32 uiMindTimer;
831
		uint32 uiSsmiteTimer;
832
		uint32 uiLightTimer;
833
		uint32 uiFlurryTimer;
834
		uint32 uiFinalTimer;
835
		uint32 uiDivineTimer;
836
837
		bool bStarted;
838
839
		void Reset()
840
		{
841
			uiStrikeTimer = 5000;
842
			uiCleaveTimer = 6000;
843
			uiPummelTimer = 10000;
844
			uiPainTimer = 60000;
845
			uiMindTimer = 70000;
846
			uiSsmiteTimer = 6000;
847
			uiLightTimer = 3000;
848
			uiFlurryTimer = 6000;
849
			uiFinalTimer = 30000;
850
			uiDivineTimer = 70000;
851
852
			if (bStarted)
853
			{
854
				me->SetReactState(REACT_AGGRESSIVE);
855
				me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
856
			}
857
		}
858
		void WaypointReached(uint32 uiPoint)
859
		{
860
			if (uiPoint == 0)
861
			{
862
				switch (uiWaypoint)
863
				{
864
				case 1:
865
					me->SetFacingTo(4.60f);
866
					me->SetReactState(REACT_AGGRESSIVE);
867
					me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
868
					bStarted = true;
869
					break;
870
				}
871
			}
872
873
			if (uiPoint == 1)
874
			{
875
				switch (uiWaypoint)
876
				{
877
				case 0:
878
					me->SetOrientation(5.81f);
879
					me->SetReactState(REACT_AGGRESSIVE);
880
					me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
881
					bStarted = true;
882
                    break;
883
                 case 2:
884
					 me->SetOrientation(3.39f);
885
					 me->SetReactState(REACT_AGGRESSIVE);
886
					 me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
887
					 bStarted = true;
888
					 if (GameObject* pGO = GameObject::GetGameObject(*me, pInstance->GetData64(DATA_MAIN_GATE)))
889
						 pInstance->HandleGameObject(pGO->GetGUID(), false);
890
                     break;
891
                }
892
            }
893
        }
894
895
		void SetData(uint32 uiType, uint32 uiData) /*OVERRIDE*/
896
        {
897
            switch (me->GetEntry())
898
            {
899
                case NPC_ARGENT_LIGHWIELDER:
900
					switch (uiType)
901
                    {
902
                        case 0:
903
							AddWaypoint(0, 737.14f, 655.42f, 412.88f);
904
							AddWaypoint(1, 712.14f, 628.42f, 411.88f);
905
                            break;
906
                        case 1:
907
                            AddWaypoint(0, 742.44f, 650.29f, 411.79f);
908
                            break;
909
                        case 2:
910
							AddWaypoint(0, 756.14f, 655.42f, 411.88f);
911
							AddWaypoint(1, 775.912f, 639.033f, 411.907f);
912
                            break;
913
                    }
914
                    break;
915
                case NPC_ARGENT_MONK:
916
                    switch (uiType)
917
                    {
918
                        case 0:
919
							AddWaypoint(0, 737.14f, 655.42f, 412.88f);
920
							AddWaypoint(1, 713.12f, 632.97f, 411.90f);
921
                            break;
922
                        case 1:
923
                            AddWaypoint(0, 746.73f, 650.24f, 411.56f);
924
                            break;
925
                        case 2:
926
							AddWaypoint(0, 756.14f, 655.42f, 411.88f);
927
							AddWaypoint(1, 784.817f, 629.883f, 411.908f);
928
                            break;
929
                    }
930
                    break;
931
                case NPC_PRIESTESS:
932
                    switch (uiType)
933
                    {
934
                        case 0:
935
							AddWaypoint(0, 737.14f, 655.42f, 412.88f);
936
							AddWaypoint(1, 715.06f, 637.07f, 411.91f);
937
                            break;
938
                        case 1:
939
                            AddWaypoint(0, 750.72f, 650.20f, 411.77f);
940
                            break;
941
                        case 2:
942
							AddWaypoint(0, 756.14f, 655.42f, 411.88f);
943
							AddWaypoint(1, 779.942f, 634.061f, 411.905f);
944
                            break;
945
                    }
946
                    break;
947
            }
948
949
            Start(false, true, 0);
950
            uiWaypoint = uiType;
951
        }
952
953
        void UpdateAI(uint32 uiDiff) OVERRIDE
954
        {
955
            npc_escortAI::UpdateAI(uiDiff);
956
957
            if (!UpdateVictim())
958
                return;
959
960
			if (uiCleaveTimer <= uiDiff)
961
			{
962
				if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
963
					DoCast(target, SPELL_STRIKE);
964
				uiCleaveTimer = 20000;
965
			}
966
			else
967
				uiCleaveTimer -= uiDiff;
968
969
			if (uiStrikeTimer <= uiDiff)
970
			{
971
				if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
972
					DoCast(target, SPELL_CLEAVE);
973
				uiStrikeTimer = 25000;
974
			}
975
			else
976
				uiStrikeTimer -= uiDiff;
977
978
			if (uiPummelTimer <= uiDiff)
979
			{
980
				if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
981
					DoCast(target, SPELL_PUMMEL);
982
				uiPummelTimer = 35000;
983
			}
984
			else
985
				uiPummelTimer -= uiDiff;
986
987
			if (uiPainTimer <= uiDiff)
988
			{
989
				if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
990
					DoCast(target, SPELL_PAIN);
991
				uiPainTimer = 30000;
992
			}
993
			else
994
				uiPainTimer -= uiDiff;
995
996
			if (uiMindTimer <= uiDiff)
997
			{
998
				if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
999
					DoCast(target, SPELL_MIND);
1000
				uiMindTimer = 90000;
1001
			}
1002
			else
1003
				uiMindTimer -= uiDiff;
1004
1005
			if (uiSsmiteTimer <= uiDiff)
1006
			{
1007
				if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
1008
					DoCast(target, SPELL_SSMITE);
1009
				uiSsmiteTimer = 25000;
1010
			}
1011
			else
1012
				uiSsmiteTimer -= uiDiff;
1013
1014
			if (uiLightTimer <= uiDiff)
1015
			{
1016
				DoCast(me, DUNGEON_MODE(SPELL_LIGHT, SPELL_LIGHT_H));
1017
				uiLightTimer = urand(15000, 17000);
1018
			}
1019
			else
1020
				uiLightTimer -= uiDiff;
1021
1022
			if (uiFlurryTimer <= uiDiff)
1023
			{
1024
				DoCast(me, SPELL_FLURRY);
1025
				uiFlurryTimer = 22000;
1026
			}
1027
			else
1028
				uiFlurryTimer -= uiDiff;
1029
1030
			if (uiFinalTimer <= uiDiff)
1031
			{
1032
				DoCast(me, SPELL_FINAL);
1033
				uiFinalTimer = 70000;
1034
			}
1035
			else
1036
				uiFinalTimer -= uiDiff;
1037
1038
			if (uiDivineTimer <= uiDiff)
1039
			{
1040
				DoCast(me, SPELL_DIVINE);
1041
				uiDivineTimer = 85000;
1042
			}
1043
			else
1044
				uiDivineTimer -= uiDiff;
1045
1046
            DoMeleeAttackIfReady();
1047
        }
1048
1049
		void JustDied(Unit* killer) /*OVERRIDE*/
1050
        {
1051
			if (pInstance)
1052
				pInstance->SetData(DATA_ARGENT_SOLDIER_DEFEATED, pInstance->GetData(DATA_ARGENT_SOLDIER_DEFEATED) + 1);
1053
        }
1054
    };
1055
1056
    CreatureAI* GetAI(Creature* creature) const OVERRIDE
1057
    {
1058
        return GetInstanceAI<npc_argent_soldierAI>(creature);
1059
	};
1060
};
1061
1062
enum ReflectiveShield
1063
{
1064
	SPELL_REFLECTIVE_SHIELD_TRIGGERED = 33619,
1065
};
1066
1067
// Reflective Shield 66515
1068
class spell_gen_reflective_shield : public SpellScriptLoader
1069
{
1070
    public:
1071
		spell_gen_reflective_shield() : SpellScriptLoader("spell_gen_reflective_shield") { }
1072
1073
		class spell_gen_reflective_shield_AuraScript : public AuraScript
1074
		{
1075
			PrepareAuraScript(spell_gen_reflective_shield_AuraScript);
1076
1077
			bool Validate(SpellInfo const* /*spellEntry*/)
1078
			{
1079
				return sSpellStore.LookupEntry(SPELL_REFLECTIVE_SHIELD_TRIGGERED);
1080
			}
1081
1082
			void Trigger(AuraEffect * aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount)
1083
			{
1084
				Unit * target = dmgInfo.GetAttacker();
1085
				if (!target)
1086
					return;
1087
				Unit * caster = GetCaster();
1088
				if (!caster)
1089
					return;
1090
				int32 bp = CalculatePct(absorbAmount, 25);
1091
				target->CastCustomSpell(target, SPELL_REFLECTIVE_SHIELD_TRIGGERED, &bp, NULL, NULL, true, NULL, aurEff);
1092
			}
1093
1094
			void Register()
1095
			{
1096
				AfterEffectAbsorb += AuraEffectAbsorbFn(spell_gen_reflective_shield_AuraScript::Trigger, EFFECT_0);
1097
			}
1098
		};
1099
1100
		AuraScript *GetAuraScript() const
1101
		{
1102
			return new spell_gen_reflective_shield_AuraScript();
1103
		}
1104
};
1105
1106
class achievement_toc5_argent_challenge : public AchievementCriteriaScript
1107
{
1108
    public:
1109
		uint32 creature_entry;
1110
1111
		achievement_toc5_argent_challenge(const char* name, uint32 original_entry) : AchievementCriteriaScript(name)
1112
		{
1113
			creature_entry = original_entry;
1114
		}
1115
1116
		bool OnCheck(Player* source, Unit* target)
1117
		{
1118
			if (!target)
1119
				return false;
1120
1121
			if (Creature* creature = target->ToCreature())
1122
			    if (creature->GetOriginalEntry() == creature_entry)
1123
				    return true;
1124
1125
			return false;
1126
		}
1127
};
1128
1129
uint32 const memorySpellId[25] =
1130
{
1131
    SPELL_MEMORY_ALGALON,
1132
    SPELL_MEMORY_ARCHIMONDE,
1133
    SPELL_MEMORY_CHROMAGGUS,
1134
    SPELL_MEMORY_CYANIGOSA,
1135
    SPELL_MEMORY_DELRISSA,
1136
    SPELL_MEMORY_ECK,
1137
    SPELL_MEMORY_ENTROPIUS,
1138
    SPELL_MEMORY_GRUUL,
1139
    SPELL_MEMORY_HAKKAR,
1140
    SPELL_MEMORY_HEIGAN,
1141
    SPELL_MEMORY_HEROD,
1142
    SPELL_MEMORY_HOGGER,
1143
    SPELL_MEMORY_IGNIS,
1144
    SPELL_MEMORY_ILLIDAN,
1145
    SPELL_MEMORY_INGVAR,
1146
    SPELL_MEMORY_KALITHRESH,
1147
    SPELL_MEMORY_LUCIFRON,
1148
    SPELL_MEMORY_MALCHEZAAR,
1149
    SPELL_MEMORY_MUTANUS,
1150
    SPELL_MEMORY_ONYXIA,
1151
    SPELL_MEMORY_THUNDERAAN,
1152
    SPELL_MEMORY_VANCLEEF,
1153
    SPELL_MEMORY_VASHJ,
1154
    SPELL_MEMORY_VEKNILASH,
1155
    SPELL_MEMORY_VEZAX
1156
};
1157
1158
// 66545 - Summon Memory
1159
class spell_paletress_summon_memory : public SpellScriptLoader
1160
{
1161
    public:
1162
        spell_paletress_summon_memory() : SpellScriptLoader("spell_paletress_summon_memory") { }
1163
1164
        class spell_paletress_summon_memory_SpellScript : public SpellScript
1165
        {
1166
            PrepareSpellScript(spell_paletress_summon_memory_SpellScript);
1167
1168
            bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
1169
            {
1170
                for (uint8 i = 0; i < 25; ++i)
1171
                    if (!sSpellMgr->GetSpellInfo(memorySpellId[i]))
1172
                        return false;
1173
                return true;
1174
            }
1175
1176
            void FilterTargets(std::list<WorldObject*>& targets)
1177
            {
1178
                if (targets.empty())
1179
                    return;
1180
1181
                WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets);
1182
                targets.clear();
1183
                targets.push_back(target);
1184
            }
1185
1186
            void HandleScript(SpellEffIndex /*effIndex*/)
1187
            {
1188
                GetHitUnit()->CastSpell(GetHitUnit(), memorySpellId[urand(0, 24)], true, NULL, NULL, GetCaster()->GetGUID());
1189
            }
1190
1191
            void Register() OVERRIDE
1192
            {
1193
                OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_paletress_summon_memory_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY);
1194
                OnEffectHitTarget += SpellEffectFn(spell_paletress_summon_memory_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
1195
            }
1196
        };
1197
1198
        SpellScript* GetSpellScript() const OVERRIDE
1199
        {
1200
            return new spell_paletress_summon_memory_SpellScript();
1201
        }
1202
};
1203
1204
void AddSC_boss_argent_challenge()
1205
{
1206
    new boss_eadric();
1207
    new spell_eadric_radiance();
1208
	new spell_eadric_hoj();
1209
    new boss_paletress();
1210
    new npc_memory();
1211
    new npc_argent_soldier();
1212
	new spell_gen_reflective_shield();
1213
	new achievement_toc5_argent_challenge("achievement_toc5_paletress", NPC_PALETRESS);
1214
	new achievement_toc5_argent_challenge("achievement_toc5_eadric", NPC_EADRIC);
1215
    new spell_paletress_summon_memory();
1216
}