TrinityCore
Loading...
Searching...
No Matches
chapter2.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 "ScriptedGossip.h"
19#include "ScriptMgr.h"
20#include "GameObject.h"
21#include "MotionMaster.h"
22#include "ObjectAccessor.h"
23#include "Player.h"
24#include "ScriptedEscortAI.h"
25#include "SpellScript.h"
26
48
72
97
99{
100 { 1653.36f, -6038.34f, 127.584f },
101 { 1653.765f, -6035.075f, 127.5844f },
102 { 1651.89f, -6037.101f, 127.5844f }
103};
104
106{
108 {
109 _eventGossip = false;
110 }
111
112 bool OnGossipHello(Player* player) override
113 {
114 ObjectGuid const guid = me->GetGUID();
115 _playerGUID = player->GetGUID();
116
117 if (me->IsQuestGiver())
118 player->PrepareQuestMenu(guid);
119
120 // override default gossip
121 if (_eventGossip)
122 {
123 SendGossipMenuFor(player, TEXT_ID_EVENT, guid);
124 return true;
125 }
126
127 return false;
128 }
129
130 void OnQuestAccept(Player* /* player */, Quest const* quest) override
131 {
132 if (quest->GetQuestId() == QUEST_BLOODY_BREAKOUT)
133 {
136 }
137 }
138
151
153 {
155 fakeValroth->AI()->Talk(id);
156 }
157
158 void UpdateAI(uint32 diff) override
159 {
160 _events.Update(diff);
161
162 while (uint32 eventId = _events.ExecuteEvent())
163 {
164 switch (eventId)
165 {
166 case EVENT_INTRO_0:
170
172 break;
173 case EVENT_INTRO_1:
176
178 break;
179 case EVENT_INTRO_2:
180 me->GetMotionMaster()->MoveJump(koltiraPos[0], 25.0f, 15.0f);
181
183 break;
184
185 case EVENT_INTRO_3:
186 me->SetWalk(true);
188
189 break;
190 case EVENT_INTRO_4:
194 me->GetMotionMaster()->MovePoint(POINT_ID_2, koltiraPos[2], true, 3.839724f);
195
196 break;
197 case EVENT_INTRO_5:
200
202 break;
203 case EVENT_INTRO_6:
207 _eventGossip = true;
208
209 break;
212
214 break;
219
221 break;
226
228 break;
233
235 break;
239
240 break;
241 case EVENT_OUTRO_1:
246
249 break;
250 case EVENT_OUTRO_2:
252
254 break;
255 case EVENT_OUTRO_3:
257
259 break;
260 case EVENT_OUTRO_4:
261 me->SetWalk(false);
264 me->GetMotionMaster()->MovePath(NPC_KOLTIRA << 3, false);
265
266 break;
268 if (!_playerGUID)
269 return;
270
272 {
273 if (!player->IsAlive() || !player->IsWithinDist(me, INTERACTION_DISTANCE * 6))
274 {
277 player->FailQuest(QUEST_BLOODY_BREAKOUT);
278 }
279 }
280
282 break;
283 }
284 }
285 }
286
287 void MovementInform(uint32 type, uint32 pointId) override
288 {
289 if (type == POINT_MOTION_TYPE)
290 {
291 if (pointId == POINT_ID_1)
292 {
295
298 }
299 else if (pointId == POINT_ID_2)
301 }
302 else
303 {
304 if (pointId == POINT_ID_6)
306 }
307 }
308
309 void JustSummoned(Creature* summon) override
310 {
311 _summons.Summon(summon);
312 }
313
314 void SummonedCreatureDespawn(Creature* summon) override
315 {
316 if (summon->GetEntry() == NPC_VALROTH)
318
319 _summons.Despawn(summon);
320 }
321
322private:
326
328};
329
330//Scarlet courier
339
341{
342public:
343 npc_scarlet_courier() : CreatureScript("npc_scarlet_courier") { }
344
345 CreatureAI* GetAI(Creature* creature) const override
346 {
347 return new npc_scarlet_courierAI(creature);
348 }
349
351 {
353 {
354 Initialize();
355 }
356
358 {
359 uiStage = 1;
360 uiStage_timer = 3000;
361 }
362
365
366 void Reset() override
367 {
368 me->Mount(14338); // not sure about this id
369 Initialize();
370 }
371
372 void JustEngagedWith(Unit* /*who*/) override
373 {
375 me->Dismount();
376 uiStage = 0;
377 }
378
379 void MovementInform(uint32 type, uint32 id) override
380 {
381 if (type != POINT_MOTION_TYPE)
382 return;
383
384 if (id == 1)
385 uiStage = 2;
386 }
387
388 void UpdateAI(uint32 diff) override
389 {
390 if (uiStage && !me->IsInCombat())
391 {
392 if (uiStage_timer <= diff)
393 {
394 switch (uiStage)
395 {
396 case 1:
397 me->SetWalk(true);
399 {
401 float x, y, z;
402 tree->GetContactPoint(me, x, y, z);
403 me->GetMotionMaster()->MovePoint(1, x, y, z);
404 }
405 break;
406 case 2:
408 if (Unit* unit = tree->GetOwner())
409 AttackStart(unit);
410 break;
411 }
412 uiStage_timer = 3000;
413 uiStage = 0;
414 } else uiStage_timer -= diff;
415 }
416
417 if (!UpdateVictim())
418 return;
419
421 }
422 };
423
424};
425
426/*######
427## npc_a_special_surprise
428######*/
429//used by 29032, 29061, 29065, 29067, 29068, 29070, 29074, 29072, 29073, 29071 but signed for 29032
446
448{
449public:
450 npc_a_special_surprise() : CreatureScript("npc_a_special_surprise") { }
451
452 CreatureAI* GetAI(Creature* creature) const override
453 {
454 return new npc_a_special_surpriseAI(creature);
455 }
456
458 {
460 {
461 Initialize();
462 }
463
465 {
469 }
470
474
475 void Reset() override
476 {
477 Initialize();
478
479 me->SetImmuneToPC(true);
480 }
481
483 {
484 switch (me->GetEntry())
485 {
486 case 29061: // Ellen Stanbridge
487 if (player->GetQuestStatus(12742) == QUEST_STATUS_INCOMPLETE)
488 return true;
489 break;
490 case 29072: // Kug Ironjaw
491 if (player->GetQuestStatus(12748) == QUEST_STATUS_INCOMPLETE)
492 return true;
493 break;
494 case 29067: // Donovan Pulfrost
495 if (player->GetQuestStatus(12744) == QUEST_STATUS_INCOMPLETE)
496 return true;
497 break;
498 case 29065: // Yazmina Oakenthorn
499 if (player->GetQuestStatus(12743) == QUEST_STATUS_INCOMPLETE)
500 return true;
501 break;
502 case 29071: // Antoine Brack
503 if (player->GetQuestStatus(12750) == QUEST_STATUS_INCOMPLETE)
504 return true;
505 break;
506 case 29032: // Malar Bravehorn
507 if (player->GetQuestStatus(12739) == QUEST_STATUS_INCOMPLETE)
508 return true;
509 break;
510 case 29068: // Goby Blastenheimer
511 if (player->GetQuestStatus(12745) == QUEST_STATUS_INCOMPLETE)
512 return true;
513 break;
514 case 29073: // Iggy Darktusk
515 if (player->GetQuestStatus(12749) == QUEST_STATUS_INCOMPLETE)
516 return true;
517 break;
518 case 29074: // Lady Eonys
519 if (player->GetQuestStatus(12747) == QUEST_STATUS_INCOMPLETE)
520 return true;
521 break;
522 case 29070: // Valok the Righteous
523 if (player->GetQuestStatus(12746) == QUEST_STATUS_INCOMPLETE)
524 return true;
525 break;
526 }
527
528 return false;
529 }
530
531 void MoveInLineOfSight(Unit* who) override
532
533 {
535 return;
536
537 if (MeetQuestCondition(who->ToPlayer()))
538 PlayerGUID = who->GetGUID();
539 }
540
541 void UpdateAI(uint32 diff) override
542 {
543 if (!PlayerGUID.IsEmpty() && !me->GetVictim() && me->IsAlive())
544 {
545 if (ExecuteSpeech_Timer <= diff)
546 {
548
549 if (!player)
550 {
551 Reset();
552 return;
553 }
554
555 switch (ExecuteSpeech_Counter)
556 {
557 case 0:
558 Talk(SAY_EXEC_START, player);
559 break;
560 case 1:
562 break;
563 case 2:
564 Talk(SAY_EXEC_PROG, player);
565 break;
566 case 3:
567 Talk(SAY_EXEC_NAME, player);
568 break;
569 case 4:
570 Talk(SAY_EXEC_RECOG, player);
571 break;
572 case 5:
573 Talk(SAY_EXEC_NOREM, player);
574 break;
575 case 6:
576 Talk(SAY_EXEC_THINK, player);
577 break;
578 case 7:
579 Talk(SAY_EXEC_LISTEN, player);
580 break;
581 case 8:
582 if (Creature* Plaguefist = GetClosestCreatureWithEntry(me, NPC_PLAGUEFIST, 85.0f))
583 Plaguefist->AI()->Talk(SAY_PLAGUEFIST, player);
584 break;
585 case 9:
586 Talk(SAY_EXEC_TIME, player);
588 me->SetImmuneToPC(false);
589 break;
590 case 10:
591 Talk(SAY_EXEC_WAITING, player);
592 break;
593 case 11:
596 me->SetHealth(0);
597 return;
598 }
599
600 if (ExecuteSpeech_Counter >= 9)
601 ExecuteSpeech_Timer = 15000;
602 else
603 ExecuteSpeech_Timer = 7000;
604
606 }
607 else
608 ExecuteSpeech_Timer -= diff;
609 }
610 }
611 };
612};
613
614// 53110 - Devour Humanoid
629
uint32_t uint32
Definition Define.h:133
@ POINT_MOTION_TYPE
#define INTERACTION_DISTANCE
#define INSPECT_DISTANCE
@ TYPEID_PLAYER
Definition ObjectGuid.h:39
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:107
#define RegisterCreatureAI(ai_name)
Definition ScriptMgr.h:1139
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1128
Creature * GetClosestCreatureWithEntry(WorldObject *source, uint32 entry, float maxSearchRange, bool alive=true)
void SendGossipMenuFor(Player *player, uint32 npcTextID, ObjectGuid const &guid)
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_SCRIPT_EFFECT
#define SpellEffectFn(F, I, N)
@ UNIT_STAND_STATE_DEAD
Definition UnitDefines.h:41
@ UNIT_STAND_STATE_KNEEL
Definition UnitDefines.h:42
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:34
@ UNIT_STAND_STATE_SIT
Definition UnitDefines.h:35
@ UNIT_NPC_FLAG_GOSSIP
@ UNIT_FLAG_IMMUNE_TO_NPC
@ JUST_DIED
Definition Unit.h:212
SpecialSurprise
Definition chapter2.cpp:431
@ EMOTE_DIES
Definition chapter2.cpp:441
@ SAY_EXEC_PROG
Definition chapter2.cpp:433
@ SAY_EXEC_NAME
Definition chapter2.cpp:434
@ SAY_EXEC_TIME
Definition chapter2.cpp:439
@ NPC_PLAGUEFIST
Definition chapter2.cpp:444
@ SAY_EXEC_THINK
Definition chapter2.cpp:437
@ SAY_EXEC_NOREM
Definition chapter2.cpp:436
@ SAY_PLAGUEFIST
Definition chapter2.cpp:443
@ SAY_EXEC_WAITING
Definition chapter2.cpp:440
@ SAY_EXEC_LISTEN
Definition chapter2.cpp:438
@ SAY_EXEC_START
Definition chapter2.cpp:432
@ SAY_EXEC_RECOG
Definition chapter2.cpp:435
ScarletCourierEnum
Definition chapter2.cpp:332
@ SPELL_SHOOT
Definition chapter2.cpp:335
@ SAY_TREE1
Definition chapter2.cpp:333
@ NPC_SCARLET_COURIER
Definition chapter2.cpp:337
@ GO_INCONSPICUOUS_TREE
Definition chapter2.cpp:336
@ SAY_TREE2
Definition chapter2.cpp:334
BloodyBreakoutTexts
Definition chapter2.cpp:28
@ SAY_KOLTIRA_4
Definition chapter2.cpp:33
@ SAY_KOLTIRA_2
Definition chapter2.cpp:31
@ SAY_VALROTH_0
Definition chapter2.cpp:41
@ SAY_KOLTIRA_0
Definition chapter2.cpp:29
@ SAY_KOLTIRA_6
Definition chapter2.cpp:35
@ SAY_KOLTIRA_5
Definition chapter2.cpp:34
@ SAY_KOLTIRA_1
Definition chapter2.cpp:30
@ SAY_VALROTH_1
Definition chapter2.cpp:42
@ SAY_KOLTIRA_10
Definition chapter2.cpp:39
@ SAY_KOLTIRA_3
Definition chapter2.cpp:32
@ TEXT_ID_EVENT
Definition chapter2.cpp:46
@ SAY_VALROTH_2
Definition chapter2.cpp:43
@ SAY_KOLTIRA_8
Definition chapter2.cpp:37
@ SAY_VALROTH_3
Definition chapter2.cpp:44
@ SAY_KOLTIRA_9
Definition chapter2.cpp:38
@ SAY_KOLTIRA_7
Definition chapter2.cpp:36
Position const koltiraPos[3]
Definition chapter2.cpp:98
void AddSC_the_scarlet_enclave_c2()
Definition chapter2.cpp:630
BloodyBreakout
Definition chapter2.cpp:74
@ SPELL_ANTI_MAGIC_ZONE
Definition chapter2.cpp:94
@ SPELL_HERO_AGGRO
Definition chapter2.cpp:95
@ SUMMON_ACOLYTES_2
Definition chapter2.cpp:82
@ SPELL_KOLTIRA_TRANSFORM
Definition chapter2.cpp:93
@ SUMMON_ACOLYTES_0
Definition chapter2.cpp:80
@ NPC_FAKE_VALROTH
Definition chapter2.cpp:87
@ POINT_ID_6
Definition chapter2.cpp:77
@ NPC_ACOLYTE
Definition chapter2.cpp:89
@ NPC_KOLTIRA
Definition chapter2.cpp:90
@ POINT_ID_2
Definition chapter2.cpp:76
@ SUMMON_ACOLYTES_1
Definition chapter2.cpp:81
@ SUMMON_VALROTH
Definition chapter2.cpp:83
@ NPC_VALROTH
Definition chapter2.cpp:88
@ POINT_ID_1
Definition chapter2.cpp:75
@ POINT_ID_10
Definition chapter2.cpp:78
@ NPC_KOLTIRA_MOUNT
Definition chapter2.cpp:91
@ QUEST_BLOODY_BREAKOUT
Definition chapter2.cpp:85
BloodyBreakoutEvents
Definition chapter2.cpp:50
@ EVENT_INTRO_4
Definition chapter2.cpp:55
@ EVENT_SPAWN_WAVE_2
Definition chapter2.cpp:60
@ EVENT_OUTRO_2
Definition chapter2.cpp:66
@ EVENT_INTRO_1
Definition chapter2.cpp:52
@ EVENT_OUTRO_3
Definition chapter2.cpp:67
@ EVENT_INTRO_2
Definition chapter2.cpp:53
@ EVENT_INTRO_5
Definition chapter2.cpp:56
@ EVENT_CHECK_PLAYER
Definition chapter2.cpp:70
@ EVENT_SPAWN_WAVE_3
Definition chapter2.cpp:61
@ EVENT_KOLTIRA_ADVICE
Definition chapter2.cpp:64
@ EVENT_INTRO_6
Definition chapter2.cpp:57
@ EVENT_SPAWN_WAVE_1
Definition chapter2.cpp:59
@ EVENT_INTRO_0
Definition chapter2.cpp:51
@ EVENT_OUTRO_1
Definition chapter2.cpp:65
@ EVENT_INTRO_3
Definition chapter2.cpp:54
@ EVENT_OUTRO_4
Definition chapter2.cpp:68
@ EVENT_SPAWN_VALROTH
Definition chapter2.cpp:62
bool UpdateVictim()
Creature *const me
Definition CreatureAI.h:82
void setDeathState(DeathState s) override
void SetImmuneToPC(bool apply) override
Definition Creature.h:129
void LoadEquipment(int8 id=1, bool force=false)
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
void Update(uint32 time)
Definition EventMap.h:67
EventId ExecuteEvent()
Definition EventMap.cpp:73
void CancelEvent(EventId eventId)
Definition EventMap.cpp:151
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:36
void Reset()
Definition EventMap.cpp:21
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=EVENT_JUMP, bool hasOrientation=false)
void MovePoint(uint32 id, Position const &pos, bool generatePath=true, Optional< float > finalOrient={})
void MovePath(uint32 pathId, bool repeatable)
bool IsEmpty() const
Definition ObjectGuid.h:172
void Clear()
Definition ObjectGuid.h:150
TypeID GetTypeId() const
Definition Object.h:93
uint32 GetEntry() const
Definition Object.h:81
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
static Player * ToPlayer(Object *o)
Definition Object.h:180
void PrepareQuestMenu(ObjectGuid guid)
Definition Player.cpp:14270
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition Player.cpp:15642
uint32 GetQuestId() const
Definition QuestDef.h:229
Unit * GetCaster() const
Unit * GetHitUnit() const
int32 GetEffectValue() const
HookList< EffectHandler > OnEffectHitTarget
bool HasEntry(uint32 entry) const
void Despawn(Creature const *summon)
void Summon(Creature const *summon)
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:54
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:241
Definition Unit.h:769
MotionMaster * GetMotionMaster()
Definition Unit.h:1667
void Dismount()
Definition Unit.cpp:8234
bool IsAlive() const
Definition Unit.h:1234
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:1098
void SetHealth(uint32 val)
Definition Unit.cpp:9361
bool IsQuestGiver() const
Definition Unit.h:1103
void Mount(uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
Definition Unit.cpp:8184
void SetNpcFlag(NPCFlags flags)
Definition Unit.h:1097
bool SetWalk(bool enable)
Definition Unit.cpp:13268
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3784
Unit * GetVictim() const
Definition Unit.h:859
void SetStandState(UnitStandStateType state)
Definition Unit.cpp:10363
void RemoveAllAuras()
Definition Unit.cpp:4157
void SetUnitFlag(UnitFlags flags)
Definition Unit.h:954
bool IsInCombat() const
Definition Unit.h:1144
void RemoveUnitFlag(UnitFlags flags)
Definition Unit.h:955
GameObject * FindNearestGameObject(uint32 entry, float range, bool spawnedOnly=true) const
Definition Object.cpp:2121
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2832
Unit * GetOwner() const
Definition Object.cpp:2180
Creature * FindNearestCreature(uint32 entry, float range, bool alive=true) const
Definition Object.cpp:2099
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true) const
Definition Object.cpp:1187
void SummonCreatureGroup(uint8 group, std::list< TempSummon * > *list=nullptr)
Definition Object.cpp:2082
CreatureAI * GetAI(Creature *creature) const override
Definition chapter2.cpp:452
CreatureAI * GetAI(Creature *creature) const override
Definition chapter2.cpp:345
void HandleScriptEffect(SpellEffIndex)
Definition chapter2.cpp:619
PrepareSpellScript(spell_death_knight_devour_humanoid)
TC_GAME_API Player * GetPlayer(Map const *, ObjectGuid const &guid)
void AttackStart(Unit *) override
bool OnGossipHello(Player *player) override
Definition chapter2.cpp:112
void UpdateAI(uint32 diff) override
Definition chapter2.cpp:158
npc_koltira_deathweaver(Creature *creature)
Definition chapter2.cpp:107
void Reset() override
Definition chapter2.cpp:139
void JustSummoned(Creature *summon) override
Definition chapter2.cpp:309
void OnQuestAccept(Player *, Quest const *quest) override
Definition chapter2.cpp:130
void SummonedCreatureDespawn(Creature *summon) override
Definition chapter2.cpp:314
void MovementInform(uint32 type, uint32 pointId) override
Definition chapter2.cpp:287
void FakeValrothTalk(uint32 id)
Definition chapter2.cpp:152
void UpdateAI(uint32 diff) override
Definition chapter2.cpp:388
void MovementInform(uint32 type, uint32 id) override
Definition chapter2.cpp:379