TrinityCore
Loading...
Searching...
No Matches
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 "ConversationAI.h"
22#include "CreatureAI.h"
23#include "CreatureAIImpl.h"
24#include "InstanceScript.h"
25#include "Map.h"
26#include "MotionMaster.h"
27#include "Player.h"
28#include "ScriptMgr.h"
29#include "ScriptedCreature.h"
31
33{
34 { 231.15799f, -832.816f, 4105.0386f },
35 { 242.00348f, -840.51215f, 4105.0386f },
36 { 241.23091f, -830.0955f, 4105.0386f },
37 { 225.73611f, -844.0746f, 4104.9882f, 1.3613f }
38};
39
52
61
67
73
80
87
94
99
116
117// 178355 - Sylvanas Shadowcopy (Riding)
119{
121
122 void JustAppeared() override
123 {
124 me->SetImmuneToAll(true, true);
125 me->SetUninteractible(true);
127 }
128};
129
130// 175732 - Sylvanas Windrunner
132{
134
135 void JustAppeared() override
136 {
139
140 me->SetPower(me->GetPowerType(), 0);
141
143 {
145 me->SetImmuneToAll(false);
146 me->SetSpeed(MOVE_RUN, 14.0f);
147 }
148 else
149 {
151 me->SetImmuneToAll(true);
152 me->SetSpeed(MOVE_RUN, 4.0f);
153 }
154 }
155
167
168 void Reset() override
169 {
170 _Reset();
171
172 // 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.
174
176
177 events.Reset();
178 }
179
180 void JustSummoned(Creature* summon) override
181 {
182 summons.Summon(summon);
183 }
184
185 void MovementInform(uint32 type, uint32 id) override
186 {
187 if (type != POINT_MOTION_TYPE)
188 return;
189
190 if (id == POINT_INTRODUCTION)
192 }
193
194 void KilledUnit(Unit* victim) override
195 {
196 if (!victim->IsPlayer())
197 return;
198
199 Talk(SAY_SLAY);
200 }
201
202 void JustEngagedWith(Unit* who) override
203 {
206
208
210
212
213 // Note: Sylvanas uses her root with 2s at the beginning of the encounter, most likely to avoid moving when engaging at stance switch.
215
216 // Note: we won't allow engaging until Phase 1 PR is merged.
217 me->Say("Only introduction is implemented so far, evading.", LANG_UNIVERSAL);
219 }
220};
221
222// 45 - Sylvanas Windrunner's Position Z Check (Serverside)
224{
226
227 void OnUnitEnter(Unit* unit) override
228 {
229 if (!unit->IsAlive())
230 return;
231
232 if (Player* player = unit->ToPlayer())
233 {
234 if (player->IsGameMaster())
235 return;
236
237 if (player->IsAlive())
238 player->KillSelf(false);
239 }
240 }
241};
242
243// 46 - Sylvanas Windrunner's Conversation Introduction (Serverside)
245{
247
248 void OnUnitEnter(Unit* unit) override
249 {
250 InstanceScript* instance = at->GetInstanceScript();
251 if (!instance)
252 return;
253
254 Player* player = unit->ToPlayer();
255 if (!player || player->IsGameMaster())
256 return;
257
258 if (Creature* sylvanas = instance->GetCreature(DATA_SYLVANAS_WINDRUNNER))
260
261 at->Remove();
262 }
263};
264
265// 17368 - Sylvanas Windrunner's Introduction (Conversation)
267{
268public:
270
271 void OnCreate(Unit* creator) override
272 {
273 InstanceScript* instance = creator->GetInstanceScript();
274 if (!instance)
275 return;
276
278 if (!bolvar)
279 return;
280
283
285 }
286
287 void OnUpdate(uint32 diff) override
288 {
289 _events.Update(diff);
290
291 uint32 eventId = _events.ExecuteEvent();
292 Creature* sylvanas = nullptr;
293 Creature* bolvar = nullptr;
294
295 if (eventId)
296 {
298 if (!sylvanas)
299 return;
300
302 if (!bolvar)
303 return;
304 }
305
306 switch (eventId)
307 {
309 {
311 sylvanas->SetFacingToObject(bolvar);
312
314 break;
315 }
316
317 case EVENT_INTRODUCTION + 1:
318 {
320
322 break;
323 }
324
325 case EVENT_INTRODUCTION + 2:
326 {
328
330 break;
331 }
332
333 case EVENT_INTRODUCTION + 3:
334 {
336
338 break;
339 }
340
341 case EVENT_INTRODUCTION + 4:
342 {
344
346 break;
347 }
348
349 case EVENT_INTRODUCTION + 5:
350 {
352
354 break;
355 }
356
357 case EVENT_INTRODUCTION + 6:
358 {
360
362 break;
363 }
364
365 case EVENT_INTRODUCTION + 7:
366 {
367 sylvanas->SetFacingToObject(bolvar);
368
370 break;
371 }
372
373 case EVENT_INTRODUCTION + 8:
374 {
376
378 break;
379 }
380
381 case EVENT_INTRODUCTION + 9:
382 {
384
386 break;
387 }
388
389 case EVENT_INTRODUCTION + 10:
390 {
391 bolvar->SetFacingToObject(sylvanas);
393
394 _events.ScheduleEvent(EVENT_INTRODUCTION + 11, 13s + 567ms);
395 break;
396 }
397
398 case EVENT_INTRODUCTION + 11:
399 {
400 sylvanas->SetFacingToObject(bolvar);
401
403 break;
404 }
405
406 case EVENT_INTRODUCTION + 12:
407 {
409
410 _events.ScheduleEvent(EVENT_INTRODUCTION + 13, 5s + 516ms);
411 break;
412 }
413
414 case EVENT_INTRODUCTION + 13:
415 {
417
418 _events.ScheduleEvent(EVENT_INTRODUCTION + 14, 1s + 516ms);
419 break;
420 }
421
422 case EVENT_INTRODUCTION + 14:
423 {
424 sylvanas->NearTeleportTo(SylvanasIntroPos[3], false);
426
427 _events.ScheduleEvent(EVENT_INTRODUCTION + 15, 1s + 265ms);
428 break;
429 }
430
431 case EVENT_INTRODUCTION + 15:
432 {
433 sylvanas->SetFacingToObject(bolvar);
434
436 break;
437 }
438
439 case EVENT_INTRODUCTION + 16:
440 {
442
443 _events.ScheduleEvent(EVENT_INTRODUCTION + 17, 4s + 766ms);
444 break;
445 }
446
447 case EVENT_INTRODUCTION + 17:
448 {
450
451 _events.ScheduleEvent(EVENT_INTRODUCTION + 18, 3s + 250ms);
452 break;
453 }
454
455 case EVENT_INTRODUCTION + 18:
456 {
457 sylvanas->CastSpell(sylvanas, SPELL_RANGER_BOW_STANCE);
458
460 break;
461 }
462
463 case EVENT_INTRODUCTION + 19:
464 {
465 sylvanas->CastSpell(sylvanas, SPELL_GENERIC_ANCHOR_HERE);
466
467 if (InstanceScript* instance = sylvanas->GetInstanceScript())
468 instance->SetData(DATA_SYLVANAS_INTRODUCTION, DONE);
469 break;
470 }
471
472 default:
473 break;
474 }
475 }
476
477private:
479};
480
uint32_t uint32
Definition Define.h:154
@ IN_PROGRESS
@ DONE
@ ENCOUNTER_FRAME_DISENGAGE
@ ENCOUNTER_FRAME_ENGAGE
@ POINT_MOTION_TYPE
#define RegisterAreaTriggerAI(ai_name)
Definition ScriptMgr.h:1428
#define RegisterConversationAI(ai_name)
Definition ScriptMgr.h:1437
@ LANG_UNIVERSAL
@ SPELLVALUE_DURATION
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
EvadeReason
@ MOVE_RUN
@ REACT_PASSIVE
@ UNIT_FLAG_NOT_ATTACKABLE_1
@ 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
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
bool IsPlayer() const
Definition BaseEntity.h:173
InstanceScript *const instance
void JustEngagedWith(Unit *who) override
void _DespawnAtEvade(Seconds delayToRespawn=30s, Creature *who=nullptr)
SummonList summons
EventMap events
Conversation *const conversation
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
bool _EnterEvadeMode(EvadeReason why=EvadeReason::Other)
Creature *const me
Definition CreatureAI.h:63
void SetReactState(ReactStates st)
Definition Creature.h:174
void SetImmuneToAll(bool apply) override
Definition Creature.h:181
uint32 ExecuteEvent()
Definition EventMap.cpp:77
void Update(uint32 time)
Definition EventMap.h:61
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition EventMap.cpp:40
void SetPhase(uint8 phase)
Definition EventMap.cpp:32
void Reset()
Definition EventMap.cpp:25
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={}, Optional< MovementFadeObject > fadeObject={}, Scripting::v2::ActionResultSetter< MovementStopReason > &&scriptResult={})
static ObjectGuid const Empty
Definition ObjectGuid.h:314
Player * ToPlayer()
Definition Object.h:126
bool IsGameMaster() const
Definition Player.h:1309
void Summon(Creature const *summon)
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:160
Definition Unit.h:635
virtual void Say(std::string_view text, Language language, WorldObject const *target=nullptr)
Definition Unit.cpp:14332
void SetSpeed(UnitMoveType mtype, float newValue)
Definition Unit.cpp:8937
void SetPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:10046
MotionMaster * GetMotionMaster()
Definition Unit.h:1723
Powers GetPowerType() const
Definition Unit.h:811
void SetFacingToObject(WorldObject const *object, bool force=true)
Definition Unit.cpp:13307
bool IsAlive() const
Definition Unit.h:1185
void SetUninteractible(bool apply)
Definition Unit.cpp:8564
void NearTeleportTo(TeleportLocation const &target, bool casting=false)
Definition Unit.cpp:12958
void SendPlaySpellVisualKit(uint32 id, uint32 type, uint32 duration) const
Definition Unit.cpp:12342
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:846
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:847
InstanceScript * GetInstanceScript() const
Definition Object.cpp:396
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition Object.cpp:1507
virtual uint32 GetData(uint32) const
Definition ZoneScript.h:99
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:100
conversation_sylvanas_windrunner_introduction(Conversation *conversation)
@ 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)