TrinityCore
boss_exarch_maladaar.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
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#include "ScriptMgr.h"
19#include "auchenai_crypts.h"
20#include "ObjectAccessor.h"
21#include "Player.h"
22#include "ScriptedCreature.h"
23#include "SpellInfo.h"
24#include "SpellScript.h"
25
27{
33 SAY_DEATH = 5
34};
35
37{
43
44 // Stolen Soul
47
58};
59
61{
66};
67
68enum Misc
69{
70 NPC_DORE = 19412,
71
72 MODEL_UNDEAD_MALE = 1027, // guessed
73 MODEL_UNDEAD_FEMALE = 1029, // guessed
74 MODEL_NIGHTELF_MALE = 2572, // guessed
75 MODEL_NIGHTELF_FEMALE = 2575, // guessed
76 MODEL_ORC_MALE = 2576, // guessed
77 MODEL_ORC_FEMALE = 2577, // guessed
78 MODEL_TAUREN_MALE = 2578, // sniff
79 MODEL_TAUREN_FEMALE = 2579, // guessed
80 MODEL_GNOME_MALE = 2581, // guessed
81 MODEL_GNOME_FEMALE = 2590, // guessed
82 MODEL_HUMAN_MALE = 2582, // sniff
83 MODEL_HUMAN_FEMALE = 2583, // sniff
84 MODEL_DWARF_MALE = 2584, // sniff
85 MODEL_DWARF_FEMALE = 2585, // guessed
86 MODEL_TROLL_MALE = 2588, // guessed
87 MODEL_TROLL_FEMALE = 2589, // guessed
88 MODEL_BLOODELF_MALE = 17267, // completely guessed
89 MODEL_BLOODELF_FEMALE = 17268, // completely guessed
90 MODEL_DRAENEI_MALE = 16721, // completely guessed
91 MODEL_DRAENEI_FEMALE = 17004 // completely guessed
92};
93
94Position const DoreSpawnPos = { -4.40722f, -387.277f, 40.6294f, 6.26573f };
95
97{
99
100 void Reset() override
101 {
102 _Reset();
103 _avatarSummoned = false;
104 }
105
106 void JustEngagedWith(Unit* who) override
107 {
110 events.ScheduleEvent(EVENT_SOUL_SCREAM, RAND(10s, 15s, 20s, 25s));
112 events.ScheduleEvent(EVENT_STOLEN_SOUL, RAND(10s, 15s, 20s, 25s));
113 }
114
115 void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
116 {
117 if (!_avatarSummoned && me->HealthBelowPctDamaged(25, damage))
118 {
119 _avatarSummoned = true;
121 }
122 }
123
124 void OnSpellCast(SpellInfo const* spell) override
125 {
126 if (spell->Id == SPELL_STOLEN_SOUL)
127 if (roll_chance_i(25))
129 }
130
131 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
132 {
133 if (spellInfo->Id == SPELL_STOLEN_SOUL)
134 target->CastSpell(target, SPELL_SUMMON_STOLEN_SOUL, true);
135 }
136
137 // Do not despawn avatar
138 void JustSummoned(Creature* /*summon*/) override { }
139
140 void KilledUnit(Unit* /*victim*/) override
141 {
142 Talk(SAY_SLAY);
143 }
144
145 void JustDied(Unit* /*killer*/) override
146 {
147 _JustDied();
150 }
151
152 void UpdateAI(uint32 diff) override
153 {
154 if (!UpdateVictim())
155 return;
156
157 events.Update(diff);
158
160 return;
161
162 while (uint32 eventId = events.ExecuteEvent())
163 {
164 switch (eventId)
165 {
167 if (roll_chance_i(25))
168 Talk(SAY_ROAR);
170 events.Repeat(RAND(15s, 20s));
171 break;
174 events.Repeat(4s, 20s); // Usually just 4
175 break;
177 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 40.0f, true, true, -SPELL_STOLEN_SOUL))
178 DoCast(target, SPELL_STOLEN_SOUL);
179 events.Repeat(RAND(20s, 25s));
180 break;
184 break;
185 default:
186 break;
187 }
188
190 return;
191 }
192 }
193
194private:
196};
197
199{
201
202 void IsSummonedBy(WorldObject* summonerWO) override
203 {
204 Player* summoner = summonerWO->ToPlayer();
205 if (!summoner)
206 return;
207
208 _summonerGUID = summoner->GetGUID();
209 _summonerClass = summoner->GetClass();
210
211 // Apparently this is the first time they tried to "clone" player
212 uint32 model = 0;
213 uint8 gender = summoner->GetNativeGender();
214
215 switch (summoner->GetRace())
216 {
217 case RACE_UNDEAD_PLAYER: model = gender ? MODEL_UNDEAD_FEMALE : MODEL_UNDEAD_MALE; break;
218 case RACE_NIGHTELF: model = gender ? MODEL_NIGHTELF_FEMALE : MODEL_NIGHTELF_MALE; break;
219 case RACE_ORC: model = gender ? MODEL_ORC_FEMALE : MODEL_ORC_MALE; break;
220 case RACE_TAUREN: model = gender ? MODEL_TAUREN_FEMALE : MODEL_TAUREN_MALE; break;
221 case RACE_GNOME: model = gender ? MODEL_GNOME_FEMALE : MODEL_GNOME_MALE; break;
222 case RACE_HUMAN: model = gender ? MODEL_HUMAN_FEMALE : MODEL_HUMAN_MALE; break;
223 case RACE_DWARF: model = gender ? MODEL_DWARF_FEMALE : MODEL_DWARF_MALE; break;
224 case RACE_TROLL: model = gender ? MODEL_TROLL_FEMALE : MODEL_TROLL_MALE; break;
225 case RACE_BLOODELF: model = gender ? MODEL_BLOODELF_FEMALE : MODEL_BLOODELF_MALE; break;
226 case RACE_DRAENEI: model = gender ? MODEL_DRAENEI_FEMALE : MODEL_DRAENEI_MALE; break;
227 default: break;
228 }
229
230 if (model)
231 me->SetDisplayId(model);
232
233 me->SetCorpseDelay(3, true);
235
237 }
238
239 void Reset() override
240 {
242 }
243
244 void JustEngagedWith(Unit* /*who*/) override
245 {
246 switch (_summonerClass)
247 {
248 case CLASS_WARRIOR: //
249 _scheduler.Schedule(5s, 10s, [this](TaskContext task)
250 {
252 task.Repeat(5s, 10s);
253 });
254 break;
255 case CLASS_PALADIN: // video & sniff
256 _scheduler.Schedule(2s, 7s, [this](TaskContext task)
257 {
259 task.Repeat(8s, 15s);
260 });
261 break;
262 case CLASS_HUNTER: // video
263 _scheduler.Schedule(5s, [this](TaskContext task)
264 {
266 task.Repeat(20s);
267 });
268 break;
269 case CLASS_ROGUE: //
270 _scheduler.Schedule(5s, [this](TaskContext task)
271 {
273 task.Repeat(10s);
274 });
275 break;
276 case CLASS_PRIEST: //
277 _scheduler.Schedule(2s, [this](TaskContext task)
278 {
280 task.Repeat(3s, 5s);
281 });
282 break;
283 case CLASS_SHAMAN: // video
284 _scheduler.Schedule(0s, [this](TaskContext task)
285 {
286 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 20.0f, true, true, -SPELL_FROST_SHOCK))
287 DoCast(target, SPELL_FROST_SHOCK);
288 task.Repeat(3s, 8s);
289 });
290 break;
291 case CLASS_MAGE: // video
292 _scheduler.Schedule(0s, [this](TaskContext task)
293 {
295 task.Repeat(3s);
296 });
297 break;
298 case CLASS_WARLOCK: // video
299 _scheduler.Schedule(10s, [this](TaskContext task)
300 {
301 if (Unit* victim = me->GetVictim())
302 if (!victim->HasAura(SPELL_CURSE_OF_AGONY))
304
305 task.Repeat(7s);
306 });
307 break;
308 case CLASS_DRUID: //
309 _scheduler.Schedule(5s, [this](TaskContext task)
310 {
312 task.Repeat(10s);
313 });
314 break;
315 case CLASS_DEATH_KNIGHT: //
316 _scheduler.Schedule(3s, 6s, [this](TaskContext task)
317 {
319 task.Repeat(6s, 12s);
320 });
321 break;
322 default:
323 break;
324 }
325 }
326
327 void JustDied(Unit* /*killer*/) override
328 {
330 DoCast(target, SPELL_STOLEN_SOUL_DISPEL, true);
331 }
332
333 void UpdateAI(uint32 diff) override
334 {
335 if (!UpdateVictim())
336 return;
337
338 _scheduler.Update(diff);
339 }
340
341private:
345};
346
347// 33326 - Stolen Soul Dispel
349{
350 bool Validate(SpellInfo const* /*spell*/) override
351 {
353 }
354
355 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
356 {
358 }
359
360 void Register() override
361 {
363 }
364};
365
367{
371}
Texts
First const & RAND(First const &first, Second const &second, Rest const &... rest)
uint8_t uint8
Definition: Define.h:144
uint32_t uint32
Definition: Define.h:142
@ TEMPSUMMON_MANUAL_DESPAWN
Definition: ObjectDefines.h:70
Spells
Definition: PlayerAI.cpp:32
@ RACE_TROLL
Definition: RaceMask.h:35
@ RACE_UNDEAD_PLAYER
Definition: RaceMask.h:32
@ RACE_ORC
Definition: RaceMask.h:29
@ RACE_DRAENEI
Definition: RaceMask.h:38
@ RACE_NIGHTELF
Definition: RaceMask.h:31
@ RACE_BLOODELF
Definition: RaceMask.h:37
@ RACE_DWARF
Definition: RaceMask.h:30
@ RACE_GNOME
Definition: RaceMask.h:34
@ RACE_HUMAN
Definition: RaceMask.h:28
@ RACE_TAUREN
Definition: RaceMask.h:33
bool roll_chance_i(int chance)
Definition: Random.h:59
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
@ EFFECT_0
Definition: SharedDefines.h:30
@ CLASS_HUNTER
@ CLASS_DRUID
@ CLASS_SHAMAN
@ CLASS_PRIEST
@ CLASS_WARRIOR
@ CLASS_WARLOCK
@ CLASS_MAGE
@ CLASS_DEATH_KNIGHT
@ CLASS_PALADIN
@ CLASS_NONE
@ CLASS_ROGUE
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_DUMMY
#define AuraEffectApplyFn(F, I, N, M)
Definition: SpellScript.h:2029
DamageEffectType
Definition: UnitDefines.h:131
@ UNIT_STATE_CASTING
Definition: Unit.h:270
@ DATA_EXARCH_MALADAAR
#define RegisterAuchenaiCryptsCreatureAI(ai_name)
@ MODEL_GNOME_MALE
@ MODEL_NIGHTELF_FEMALE
@ MODEL_HUMAN_FEMALE
@ MODEL_TAUREN_MALE
@ MODEL_ORC_MALE
@ MODEL_HUMAN_MALE
@ MODEL_DRAENEI_MALE
@ MODEL_TROLL_MALE
@ MODEL_DRAENEI_FEMALE
@ MODEL_TAUREN_FEMALE
@ MODEL_NIGHTELF_MALE
@ MODEL_UNDEAD_FEMALE
@ MODEL_UNDEAD_MALE
@ MODEL_TROLL_FEMALE
@ MODEL_GNOME_FEMALE
@ MODEL_DWARF_FEMALE
@ MODEL_ORC_FEMALE
@ MODEL_BLOODELF_MALE
@ MODEL_BLOODELF_FEMALE
@ MODEL_DWARF_MALE
@ SPELL_HAMMER_OF_JUSTICE
@ SPELL_SUMMON_AVATAR
@ SPELL_MOONFIRE
@ SPELL_PLAGUE_STRIKE
@ SPELL_STOLEN_SOUL_VISUAL
@ SPELL_FREEZING_TRAP
@ SPELL_FROST_SHOCK
@ SPELL_MORTAL_STRIKE
@ SPELL_FIREBALL
@ SPELL_CURSE_OF_AGONY
@ SPELL_SUMMON_STOLEN_SOUL
@ SPELL_SOUL_SCREAM
@ SPELL_MIND_FLAY
@ SPELL_HEMORRHAGE
@ SPELL_RIBBON_OF_SOULS
@ SPELL_STOLEN_SOUL_DISPEL
@ SPELL_STOLEN_SOUL
void AddSC_boss_exarch_maladaar()
@ SAY_SOUL_CLEAVE
Position const DoreSpawnPos
@ EVENT_SUMMON_AVATAR
@ EVENT_RIBBON_OF_SOULS
@ EVENT_SOUL_SCREAM
@ EVENT_STOLEN_SOUL
HookList< EffectApplyHandler > AfterEffectApply
Definition: SpellScript.h:2028
Unit * GetTarget() const
void JustEngagedWith(Unit *who) override
EventMap events
void _JustDied()
void DoZoneInCombat()
Definition: CreatureAI.h:161
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
Creature *const me
Definition: CreatureAI.h:61
void SetDisplayId(uint32 displayId, bool setNative=false) override
Definition: Creature.cpp:3402
void SetCorpseDelay(uint32 delay, bool ignoreCorpseDecayRatio=false)
Definition: Creature.h:104
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
void Repeat(Milliseconds time)
Definition: EventMap.cpp:63
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
static Player * ToPlayer(Object *o)
Definition: Object.h:213
Gender GetNativeGender() const override
Definition: Player.h:1217
uint32 const Id
Definition: SpellInfo.h:325
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
TaskContext & Repeat(std::chrono::duration< Rep, Period > duration)
TaskScheduler & CancelAll()
TaskScheduler & Schedule(std::chrono::duration< Rep, Period > time, task_handler_t task)
TaskScheduler & Update(success_t const &callback=nullptr)
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:79
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
uint8 GetClass() const
Definition: Unit.h:752
Unit * GetVictim() const
Definition: Unit.h:715
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition: Unit.h:781
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
uint8 GetRace() const
Definition: Unit.h:749
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition: Object.cpp:2025
void OnApply(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
void KilledUnit(Unit *) override
boss_exarch_maladaar(Creature *creature)
void SpellHitTarget(WorldObject *target, SpellInfo const *spellInfo) override
void UpdateAI(uint32 diff) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void JustSummoned(Creature *) override
void JustDied(Unit *) override
void JustEngagedWith(Unit *who) override
void OnSpellCast(SpellInfo const *spell) override
void JustEngagedWith(Unit *) override
void JustDied(Unit *) override
void UpdateAI(uint32 diff) override
npc_stolen_soul(Creature *creature)
void IsSummonedBy(WorldObject *summonerWO) override