TrinityCore
boss_sylvanas_windrunner.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 "AreaTrigger.h"
19#include "AreaTriggerAI.h"
20#include "Conversation.h"
21#include "CreatureAI.h"
22#include "CreatureAIImpl.h"
23#include "InstanceScript.h"
24#include "Map.h"
25#include "MotionMaster.h"
26#include "Player.h"
27#include "ScriptMgr.h"
28#include "ScriptedCreature.h"
30
32{
33 { 231.15799f, -832.816f, 4105.0386f },
34 { 242.00348f, -840.51215f, 4105.0386f },
35 { 241.23091f, -830.0955f, 4105.0386f },
36 { 225.73611f, -844.0746f, 4104.9882f, 1.3613f }
37};
38
40{
41 // Stances
44
45 // Miscellanea
49 SPELL_SYLVANAS_ROOT = 347608
50};
51
53{
59};
60
62{
65};
66
68{
70 EVENT_SIZE_MAX = 200
71};
72
74{
78};
79
81{
85};
86
88{
92};
93
95{
97};
98
100{
112
115
116// 178355 - Sylvanas Shadowcopy (Riding)
118{
120
121 void JustAppeared() override
122 {
123 me->SetImmuneToAll(true, true);
124 me->SetUninteractible(true);
126 }
127};
128
129// 175732 - Sylvanas Windrunner
131{
133
134 void JustAppeared() override
135 {
138
139 me->SetPower(me->GetPowerType(), 0);
140
142 {
144 me->SetImmuneToAll(false);
145 me->SetSpeed(MOVE_RUN, 14.0f);
146 }
147 else
148 {
150 me->SetImmuneToAll(true);
151 me->SetSpeed(MOVE_RUN, 4.0f);
152 }
153 }
154
155 void EnterEvadeMode(EvadeReason /*why*/) override
156 {
158
160
163
165 }
166
167 void Reset() override
168 {
169 _Reset();
170
171 // Note: every creature involved in the fight adds UNIT_FLAG_PET_IN_COMBAT or UNIT_FLAG_RENAME when engaging, meaning they're most likely summoned by Sylvanas.
173
175
176 events.Reset();
177 }
178
179 void JustSummoned(Creature* summon) override
180 {
181 summons.Summon(summon);
182 }
183
184 void MovementInform(uint32 type, uint32 id) override
185 {
186 if (type != POINT_MOTION_TYPE)
187 return;
188
189 if (id == POINT_INTRODUCTION)
191 }
192
193 void KilledUnit(Unit* victim) override
194 {
195 if (!victim->IsPlayer())
196 return;
197
198 Talk(SAY_SLAY);
199 }
200
201 void JustEngagedWith(Unit* who) override
202 {
205
207
209
211
212 // Note: Sylvanas uses her root with 2s at the beginning of the encounter, most likely to avoid moving when engaging at stance switch.
214
215 // Note: we won't allow engaging until Phase 1 PR is merged.
216 me->Say("Only introduction is implemented so far, evading.", LANG_UNIVERSAL);
218 }
219};
220
221// 45 - Sylvanas Windrunner's Position Z Check (Serverside)
223{
225
226 void OnUnitEnter(Unit* unit) override
227 {
228 if (!unit->IsAlive())
229 return;
230
231 if (Player* player = unit->ToPlayer())
232 {
233 if (player->IsGameMaster())
234 return;
235
236 if (player->IsAlive())
237 player->KillSelf(false);
238 }
239 }
240};
241
242// 46 - Sylvanas Windrunner's Conversation Introduction (Serverside)
244{
246
247 void OnUnitEnter(Unit* unit) override
248 {
249 InstanceScript* instance = at->GetInstanceScript();
250 if (!instance)
251 return;
252
253 Player* player = unit->ToPlayer();
254 if (!player || player->IsGameMaster())
255 return;
256
257 if (Creature* sylvanas = instance->GetCreature(DATA_SYLVANAS_WINDRUNNER))
259
260 at->Remove();
261 }
262};
263
264// 17368 - Sylvanas Windrunner's Introduction (Conversation)
266{
267public:
268 conversation_sylvanas_windrunner_introduction() : ConversationScript("conversation_sylvanas_windrunner_introduction") { }
269
270 void OnConversationCreate(Conversation* conversation, Unit* creator) override
271 {
272 InstanceScript* instance = creator->GetInstanceScript();
273 if (!instance)
274 return;
275
277 if (!bolvar)
278 return;
279
282
284 }
285
286 void OnConversationUpdate(Conversation* conversation, uint32 diff) override
287 {
288 _events.Update(diff);
289
290 uint32 eventId = _events.ExecuteEvent();
291 Creature* sylvanas = nullptr;
292 Creature* bolvar = nullptr;
293
294 if (eventId)
295 {
297 if (!sylvanas)
298 return;
299
301 if (!bolvar)
302 return;
303 }
304
305 switch (eventId)
306 {
308 {
310 sylvanas->SetFacingToObject(bolvar);
311
313 break;
314 }
315
316 case EVENT_INTRODUCTION + 1:
317 {
319
321 break;
322 }
323
324 case EVENT_INTRODUCTION + 2:
325 {
327
329 break;
330 }
331
332 case EVENT_INTRODUCTION + 3:
333 {
335
337 break;
338 }
339
340 case EVENT_INTRODUCTION + 4:
341 {
343
345 break;
346 }
347
348 case EVENT_INTRODUCTION + 5:
349 {
351
353 break;
354 }
355
356 case EVENT_INTRODUCTION + 6:
357 {
359
361 break;
362 }
363
364 case EVENT_INTRODUCTION + 7:
365 {
366 sylvanas->SetFacingToObject(bolvar);
367
369 break;
370 }
371
372 case EVENT_INTRODUCTION + 8:
373 {
375
377 break;
378 }
379
380 case EVENT_INTRODUCTION + 9:
381 {
383
385 break;
386 }
387
388 case EVENT_INTRODUCTION + 10:
389 {
390 bolvar->SetFacingToObject(sylvanas);
392
393 _events.ScheduleEvent(EVENT_INTRODUCTION + 11, 13s + 567ms);
394 break;
395 }
396
397 case EVENT_INTRODUCTION + 11:
398 {
399 sylvanas->SetFacingToObject(bolvar);
400
402 break;
403 }
404
405 case EVENT_INTRODUCTION + 12:
406 {
408
409 _events.ScheduleEvent(EVENT_INTRODUCTION + 13, 5s + 516ms);
410 break;
411 }
412
413 case EVENT_INTRODUCTION + 13:
414 {
416
417 _events.ScheduleEvent(EVENT_INTRODUCTION + 14, 1s + 516ms);
418 break;
419 }
420
421 case EVENT_INTRODUCTION + 14:
422 {
423 sylvanas->NearTeleportTo(SylvanasIntroPos[3], false);
425
426 _events.ScheduleEvent(EVENT_INTRODUCTION + 15, 1s + 265ms);
427 break;
428 }
429
430 case EVENT_INTRODUCTION + 15:
431 {
432 sylvanas->SetFacingToObject(bolvar);
433
435 break;
436 }
437
438 case EVENT_INTRODUCTION + 16:
439 {
441
442 _events.ScheduleEvent(EVENT_INTRODUCTION + 17, 4s + 766ms);
443 break;
444 }
445
446 case EVENT_INTRODUCTION + 17:
447 {
449
450 _events.ScheduleEvent(EVENT_INTRODUCTION + 18, 3s + 250ms);
451 break;
452 }
453
454 case EVENT_INTRODUCTION + 18:
455 {
456 sylvanas->CastSpell(sylvanas, SPELL_RANGER_BOW_STANCE);
457
459 break;
460 }
461
462 case EVENT_INTRODUCTION + 19:
463 {
464 sylvanas->CastSpell(sylvanas, SPELL_GENERIC_ANCHOR_HERE);
465
466 if (InstanceScript* instance = sylvanas->GetInstanceScript())
467 instance->SetData(DATA_SYLVANAS_INTRODUCTION, DONE);
468 break;
469 }
470
471 default:
472 break;
473 }
474 }
475
476private:
478};
479
481{
484
487
489}
uint32_t uint32
Definition: Define.h:142
@ IN_PROGRESS
@ DONE
@ ENCOUNTER_FRAME_DISENGAGE
@ ENCOUNTER_FRAME_ENGAGE
@ POINT_MOTION_TYPE
#define RegisterAreaTriggerAI(ai_name)
Definition: ScriptMgr.h:1416
@ LANG_UNIVERSAL
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
Definition: SpellDefines.h:266
@ SPELLVALUE_DURATION
Definition: SpellDefines.h:234
EvadeReason
Definition: UnitAICommon.h:30
@ MOVE_RUN
Definition: UnitDefines.h:118
@ REACT_PASSIVE
Definition: UnitDefines.h:506
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition: UnitDefines.h:151
@ EVENT_GROUP_WINDRUNNER_EVENTS
@ EVENT_GROUP_NORMAL_EVENTS
Position const SylvanasIntroPos[4]
@ PHASE_INTERMISSION_WORLD_STATE
@ SPAWN_GROUP_CHAMPIONS_THIRD_PHASE
@ SPAWN_GROUP_CHAMPIONS_OUTRODUCTION
@ SPAWN_GROUP_CHAMPIONS_FIRST_PHASE
@ SPELL_VISUAL_KIT_SYLVANAS_INTRODUCTION_TALK_07
@ SPELL_VISUAL_KIT_SYLVANAS_INTRODUCTION_TALK_08
@ SPELL_VISUAL_KIT_SYLVANAS_INTRODUCTION_TALK_06
@ SPELL_VISUAL_KIT_SYLVANAS_INTRODUCTION_TALK_09
@ SPELL_VISUAL_KIT_SYLVANAS_INTRODUCTION_TALK_10
@ SPELL_VISUAL_KIT_SYLVANAS_TELEPORT
@ SPELL_VISUAL_KIT_SYLVANAS_INTRODUCTION_TALK_05
@ SPELL_VISUAL_KIT_SYLVANAS_INTRODUCTION_TALK_02
@ SPELL_VISUAL_KIT_SYLVANAS_INTRODUCTION_TALK_01
@ SPELL_VISUAL_KIT_SYLVANAS_INTRODUCTION_TALK_04
@ SPELL_VISUAL_KIT_BOLVAR_INTRODUCTION_TALK_01
@ SPELL_VISUAL_KIT_SYLVANAS_INTRODUCTION_TALK_03
@ SPELL_GENERIC_ANCHOR_HERE
@ SPELL_SYLVANAS_DISPLAY_POWER_SUFFERING
@ SPELL_RANGER_DAGGERS_STANCE
@ SPELL_RANGER_BOW_STANCE
@ SPELL_GENERIC_DUAL_WIELD
@ CONVERSATION_SYLVANAS_INTRODUCTION
@ CONVERSATION_SYLVANAS_INTRODUCTION_ACTOR_BOLVAR_ID
@ CONVERSATION_SYLVANAS_INTRODUCTION_ACTOR_SYLVANAS_ID
void AddSC_boss_sylvanas_windrunner()
AreaTrigger *const at
Definition: AreaTriggerAI.h:33
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
SummonList summons
EventMap events
void AddActor(int32 actorId, uint32 actorIdx, ObjectGuid const &actorGuid)
static Conversation * CreateConversation(uint32 conversationEntry, Unit *creator, Position const &pos, ObjectGuid privateObjectOwner, SpellInfo const *spellInfo=nullptr, bool autoStart=true)
Creature * GetActorCreature(uint32 actorIdx) const
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool _EnterEvadeMode(EvadeReason why=EvadeReason::Other)
Definition: CreatureAI.cpp:299
Creature *const me
Definition: CreatureAI.h:61
void SetReactState(ReactStates st)
Definition: Creature.h:160
void SetImmuneToAll(bool apply) override
Definition: Creature.h:167
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
void SetPhase(uint8 phase)
Definition: EventMap.cpp:28
void Reset()
Definition: EventMap.cpp:21
Creature * GetCreature(uint32 type)
void DoUpdateWorldState(int32 worldStateId, int32 value)
void SendEncounterUnit(EncounterFrameType type, Unit const *unit, Optional< int32 > param1={}, Optional< int32 > param2={})
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
bool IsPlayer() const
Definition: Object.h:212
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
static Player * ToPlayer(Object *o)
Definition: Object.h:213
bool IsGameMaster() const
Definition: Player.h:1178
void Summon(Creature const *summon)
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
Definition: Unit.h:627
virtual void Say(std::string_view text, Language language, WorldObject const *target=nullptr)
Definition: Unit.cpp:13562
void SetSpeed(UnitMoveType mtype, float newValue)
Definition: Unit.cpp:8520
void SetPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition: Unit.cpp:9419
MotionMaster * GetMotionMaster()
Definition: Unit.h:1652
Powers GetPowerType() const
Definition: Unit.h:799
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition: Unit.cpp:12671
bool IsAlive() const
Definition: Unit.h:1164
void SetUninteractible(bool apply)
Definition: Unit.cpp:8147
void NearTeleportTo(Position const &pos, bool casting=false)
Definition: Unit.cpp:12327
void SendPlaySpellVisualKit(uint32 id, uint32 type, uint32 duration) const
Definition: Unit.cpp:11711
void SetUnitFlag(UnitFlags flags)
Definition: Unit.h:833
void RemoveUnitFlag(UnitFlags flags)
Definition: Unit.h:834
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition: Object.cpp:2131
virtual uint32 GetData(uint32) const
Definition: ZoneScript.h:91
virtual void SetData(uint32, uint32)
Definition: ZoneScript.h:92
void OnConversationCreate(Conversation *conversation, Unit *creator) override
void OnConversationUpdate(Conversation *conversation, uint32 diff) override
@ NPC_BOLVAR_FORDRAGON_PINNACLE
@ WORLD_STATE_SYLVANAS_ENCOUNTER_PHASE
@ DATA_SYLVANAS_INTRODUCTION
@ DATA_BOLVAR_FORDRAGON_PINNACLE
@ DATA_SYLVANAS_WINDRUNNER
#define RegisterSanctumOfDominationCreatureAI(ai_name)
at_sylvanas_windrunner_introduction(AreaTrigger *areatrigger)
at_sylvanas_windrunner_z_check(AreaTrigger *areatrigger)
void KilledUnit(Unit *victim) override
void MovementInform(uint32 type, uint32 id) override
void JustEngagedWith(Unit *who) override
void EnterEvadeMode(EvadeReason) override
void JustSummoned(Creature *summon) override
boss_sylvanas_windrunner(Creature *creature)