TrinityCore
boss_mograine_and_whitemane.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 "scarlet_monastery.h"
19#include "InstanceScript.h"
20#include "MotionMaster.h"
21#include "ScriptedCreature.h"
22#include "ScriptMgr.h"
23#include "SpellInfo.h"
24#include "Timer.h"
25
27{
28 // Mograine
32
33 // Whitemaine
37};
38
40{
41 // Mograine Spells
46
47 // Whitemane Spells
52 SPELL_HEAL = 12039,
54};
55
57{
58 // Mograine
61
62 // Whitemane
66};
67
69{
71};
72
73Position const WhitemaneIntroMovePos = { 1163.113370f, 1398.856812f, 32.527786f, 0.f };
74
75// Scarlet Commander Mograine - 3976
77{
78public:
80 {
81 Initialize();
82 }
83
85 {
86 _fakeDeath = false;
87 _canDie = true;
88 }
89
90 void Reset() override
91 {
92 Initialize();
93
94 _Reset();
96
99 me->SetUninteractible(false);
102
104 }
105
106 void JustEngagedWith(Unit* who) override
107 {
109
111
112 // Call for help (from old script)
114
115 // Just to be sure it's MOTION_SLOT_DEFAULT is static
117
118 // Schedule events
121 }
122
123 void KilledUnit(Unit* who) override
124 {
125 if (who->GetTypeId() != TYPEID_PLAYER)
126 return;
127
129 {
132 }
133 }
134
135 void ExecuteEvent(uint32 eventId) override
136 {
137 switch (eventId)
138 {
141 events.Repeat(10s);
142 break;
145 events.Repeat(60s);
146 break;
147 default:
148 break;
149 }
150 }
151
152 void DamageTaken(Unit* /*who*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
153 {
154 if (damage >= me->GetHealth() && !_fakeDeath)
155 {
156 _fakeDeath = true;
157 _canDie = false;
158
159 // Open the door
161
162 // Tell whitemane to move
163 if (Creature* whitemane = instance->GetCreature(DATA_WHITEMANE))
164 {
165 whitemane->GetMotionMaster()->MovePoint(0, WhitemaneIntroMovePos);
166 DoZoneInCombat(whitemane);
167 }
168
173 me->SetUninteractible(true);
175 me->SetReactState(REACT_PASSIVE); // prevent Mograine from attacking while fake death
176
177 // Stop moving
179 }
180
181 if (!_canDie && damage >= me->GetHealth())
182 damage = 0;
183 }
184
185 void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
186 {
187 // Casted from Whitemane
188 if (spellInfo->Id == SPELL_SCARLET_RESURRECTION)
189 {
190 scheduler.Schedule(3s, [this](TaskContext /*context*/)
191 {
192 // Say text
194
195 me->SetUninteractible(false);
197 });
198
199 scheduler.Schedule(5s, [this](TaskContext /*context*/)
200 {
201 // Schedule events after ressurrect
204
205 // We can now die
208 _canDie = true;
210 });
211 }
212 }
213
214 void UpdateAI(uint32 diff) override
215 {
216 if (!UpdateVictim())
217 return;
218
219 events.Update(diff);
220 scheduler.Update(diff);
221
223 return;
224
225 while (uint32 eventId = events.ExecuteEvent())
226 {
227 ExecuteEvent(eventId);
229 return;
230 }
231 }
232
233private:
237};
238
239// High Inquisitor Whitemane - 3977
241{
242public:
243 boss_high_inquisitor_whitemane(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()), _killYellTimer(0s)
244 {
245 Initialize();
246 }
247
249 {
251 _canDie = true;
252 }
253
254 void Reset() override
255 {
256 Initialize();
257
258 _events.Reset();
261
264 }
265
266 void JustEngagedWith(Unit* /*who*/) override
267 {
269
270 // Just to be sure it's MOTION_SLOT_DEFAULT is static
272
273 // Start events after 5 seconds
274 _scheduler.Schedule(5s, [this](TaskContext /*context*/)
275 {
279 });
280 }
281
282 void KilledUnit(Unit* who) override
283 {
284 if (who->GetTypeId() != TYPEID_PLAYER)
285 return;
286
288 {
291 }
292 }
293
294 void UpdateAI(const uint32 diff) override
295 {
296 if (!UpdateVictim())
297 return;
298
299 _events.Update(diff);
300 _scheduler.Update(diff);
301
302 if (!_killYellTimer.Passed())
304
306 return;
307
308 while (uint32 eventId = _events.ExecuteEvent())
309 {
310 switch (eventId)
311 {
312 case EVENT_HEAL:
313 {
314 Creature* target = nullptr;
315 if (HealthBelowPct(75))
316 target = me;
318 {
319 if (mograine->IsAlive() && mograine->HealthBelowPct(75))
320 target = mograine;
321 }
322
323 if (target)
324 DoCast(target, SPELL_HEAL);
325
326 _events.Repeat(13s);
327 break;
328 }
331 _events.Repeat(15s);
332 break;
333 case EVENT_HOLY_SMITE:
335 _events.Repeat(6s);
336 break;
337 default:
338 break;
339 }
340
342 return;
343 }
344 }
345
346 void DamageTaken(Unit* /*who*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
347 {
348 // When Whitemane falls below 50% cast Deep sleep and schedule to ressurrect
350 {
352 _canDie = false;
353
354 // Cancel all combat events
358
360
361 // Sleep all players
363
365 {
368
369 Position movePosition = mograine->GetPosition();
370
371 // Get a position within 2 yards of mograine, and facing him
372 me->MovePosition(movePosition, 2.0f, me->GetRelativeAngle(movePosition));
374 }
375 }
376
377 if (!_canDie && damage >= me->GetHealth())
378 damage = 0;
379 }
380
381 void MovementInform(uint32 type, uint32 id) override
382 {
384 return;
385
388
389 // After 3 seconds cast scarlet ressurection
390 _scheduler.Schedule(3s, [this](TaskContext /*context*/)
391 {
394 else
396 });
397 }
398
399 void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
400 {
401 if (target->GetEntry() == NPC_MOGRAINE && spellInfo->Id == SPELL_SCARLET_RESURRECTION)
403 }
404
405private:
407 {
409
410 // Schedule events again
414
415 _canDie = true;
416
418
419 if (me->GetVictim())
421 }
422
429};
430
432{
435}
uint32_t uint32
Definition: Define.h:142
@ MOTION_PRIORITY_NORMAL
@ POINT_MOTION_TYPE
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
#define VISIBLE_RANGE
Definition: ScriptMgr.h:97
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ REACT_AGGRESSIVE
Definition: UnitDefines.h:508
@ UNIT_STAND_STATE_DEAD
Definition: UnitDefines.h:49
@ UNIT_STAND_STATE_STAND
Definition: UnitDefines.h:42
DamageEffectType
Definition: UnitDefines.h:131
@ UNIT_FLAG_NON_ATTACKABLE
Definition: UnitDefines.h:145
@ UNIT_STATE_CASTING
Definition: Unit.h:270
Position const WhitemaneIntroMovePos
@ SPELL_SCARLET_RESURRECTION
void AddSC_boss_mograine_and_whitemane()
@ POINT_WHITEMANE_MOVE_TO_MOGRAINE
mograine
Definition: chapter5.cpp:31
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
TaskScheduler scheduler
EventMap events
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 CallForHelp(float fRadius)
Definition: Creature.cpp:2563
void SetReactState(ReactStates st)
Definition: Creature.h:160
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
void CancelEvent(uint32 eventId)
Definition: EventMap.cpp:131
void Reset()
Definition: EventMap.cpp:21
Creature * GetCreature(uint32 type)
void HandleGameObject(ObjectGuid guid, bool open, GameObject *go=nullptr)
GameObject * GetGameObject(uint32 type)
void MoveChase(Unit *target, Optional< ChaseRange > dist={}, Optional< ChaseAngle > angle={})
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={}, Optional< float > speed={}, MovementWalkRunSpeedSelectionMode speedSelectionMode=MovementWalkRunSpeedSelectionMode::Default, Optional< float > closeEnoughDistance={})
static ObjectGuid const Empty
Definition: ObjectGuid.h:274
TypeID GetTypeId() const
Definition: Object.h:173
uint32 GetEntry() const
Definition: Object.h:161
uint32 const Id
Definition: SpellInfo.h:325
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
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:161
SpellCastResult DoCast(uint32 spellId)
Definition: UnitAI.cpp:89
Definition: Unit.h:627
void SetStandState(UnitStandStateType state, uint32 animKitID=0)
Definition: Unit.cpp:10100
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true)
Definition: Unit.cpp:3089
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition: Unit.cpp:12671
void SetUninteractible(bool apply)
Definition: Unit.cpp:8147
void ClearAllReactives()
Definition: Unit.cpp:10227
uint64 GetHealth() const
Definition: Unit.h:776
Unit * GetVictim() const
Definition: Unit.h:715
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
void RemoveAllAuras()
Definition: Unit.cpp:4242
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition: Unit.h:781
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:833
void RemoveUnitFlag(UnitFlags flags)
Definition: Unit.h:834
void MovePosition(Position &pos, float dist, float angle)
Definition: Object.cpp:3436
@ DATA_MOGRAINE
@ DATA_WHITEMANE
@ DATA_MOGRAINE_AND_WHITE_EVENT
@ DATA_HIGH_INQUISITORS_DOOR
#define RegisterScarletMonasteryCreatureAI(ai)
@ NPC_MOGRAINE
float GetRelativeAngle(float x, float y) const
Definition: Position.h:136
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
bool HealthBelowPct(uint32 pct) const
void Update(int32 diff)
Definition: Timer.h:121
bool Passed() const
Definition: Timer.h:131
void Reset(int32 expiry)
Definition: Timer.h:136
void UpdateAI(const uint32 diff) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void MovementInform(uint32 type, uint32 id) override
void SpellHitTarget(WorldObject *target, SpellInfo const *spellInfo) override
void DamageTaken(Unit *, uint32 &damage, DamageEffectType, SpellInfo const *) override
void SpellHit(WorldObject *, SpellInfo const *spellInfo) override
void ExecuteEvent(uint32 eventId) override