diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-04-20 17:35:06 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-20 17:35:06 +0300 |
commit | 6298af57d958bcebf1d0b13c4607bb13b02dd61d (patch) | |
tree | 3740919a8bde282379b1717b684c75ee417a56a2 /src | |
parent | 5d3bafdbab095c3b58e2f41eed7f9f4c7bf6ba91 (diff) |
Scripts/HoS: Update instance scripts to new model (#26434)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp | 994 |
1 files changed, 486 insertions, 508 deletions
diff --git a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp index 0d2a0bf9e76..58ad1f8c074 100644 --- a/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp +++ b/src/server/scripts/Northrend/Ulduar/HallsOfStone/halls_of_stone.cpp @@ -131,588 +131,566 @@ static Position SpawnLocations[]= {960.748f, 382.944f, 208.374f, 0.0f}, }; -class npc_tribuna_controller : public CreatureScript +struct npc_tribuna_controller : public ScriptedAI { -public: - npc_tribuna_controller() : CreatureScript("npc_tribuna_controller") { } - - struct npc_tribuna_controllerAI : public ScriptedAI + npc_tribuna_controller(Creature* creature) : ScriptedAI(creature) { - npc_tribuna_controllerAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - instance = creature->GetInstanceScript(); - SetCombatMovement(false); - } + Initialize(); + instance = creature->GetInstanceScript(); + SetCombatMovement(false); + } - void Initialize() - { - uiKaddrakEncounterTimer = 1500; - uiMarnakEncounterTimer = 10000; - uiAbedneumEncounterTimer = 10000; + void Initialize() + { + uiKaddrakEncounterTimer = 1500; + uiMarnakEncounterTimer = 10000; + uiAbedneumEncounterTimer = 10000; - bKaddrakActivated = false; - bMarnakActivated = false; - bAbedneumActivated = false; - } + bKaddrakActivated = false; + bMarnakActivated = false; + bAbedneumActivated = false; + } - InstanceScript* instance; + InstanceScript* instance; - uint32 uiKaddrakEncounterTimer; - uint32 uiMarnakEncounterTimer; - uint32 uiAbedneumEncounterTimer; + uint32 uiKaddrakEncounterTimer; + uint32 uiMarnakEncounterTimer; + uint32 uiAbedneumEncounterTimer; - bool bKaddrakActivated; - bool bMarnakActivated; - bool bAbedneumActivated; + bool bKaddrakActivated; + bool bMarnakActivated; + bool bAbedneumActivated; - GuidList KaddrakGUIDList; + GuidList KaddrakGUIDList; - void Reset() override - { - Initialize(); + void Reset() override + { + Initialize(); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_KADDRAK), false); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_MARNAK), false); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_ABEDNEUM), false); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_SKY_FLOOR), false); + instance->HandleGameObject(instance->GetGuidData(DATA_GO_KADDRAK), false); + instance->HandleGameObject(instance->GetGuidData(DATA_GO_MARNAK), false); + instance->HandleGameObject(instance->GetGuidData(DATA_GO_ABEDNEUM), false); + instance->HandleGameObject(instance->GetGuidData(DATA_GO_SKY_FLOOR), false); - KaddrakGUIDList.clear(); - } + KaddrakGUIDList.clear(); + } - void UpdateFacesList() + void UpdateFacesList() + { + /*GetCreatureListWithEntryInGrid(lKaddrakGUIDList, me, CREATURE_KADDRAK, 50.0f); + if (!lKaddrakGUIDList.empty()) { - /*GetCreatureListWithEntryInGrid(lKaddrakGUIDList, me, CREATURE_KADDRAK, 50.0f); - if (!lKaddrakGUIDList.empty()) + uint32 uiPositionCounter = 0; + for (std::list<Creature*>::const_iterator itr = lKaddrakGUIDList.begin(); itr != lKaddrakGUIDList.end(); ++itr) { - uint32 uiPositionCounter = 0; - for (std::list<Creature*>::const_iterator itr = lKaddrakGUIDList.begin(); itr != lKaddrakGUIDList.end(); ++itr) + if ((*itr)->IsAlive()) { - if ((*itr)->IsAlive()) + if (uiPositionCounter == 0) { - if (uiPositionCounter == 0) - { - (*itr)->GetMap()->CreatureRelocation((*itr), 927.265f, 333.200f, 218.780f, (*itr)->GetOrientation()); - (*itr)->SendMonsterMove(927.265f, 333.200f, 218.780f, 0, (*itr)->GetMovementFlags(), 1); - } - else - { - (*itr)->GetMap()->CreatureRelocation((*itr), 921.745f, 328.076f, 218.780f, (*itr)->GetOrientation()); - (*itr)->SendMonsterMove(921.745f, 328.076f, 218.780f, 0, (*itr)->GetMovementFlags(), 1); - } + (*itr)->GetMap()->CreatureRelocation((*itr), 927.265f, 333.200f, 218.780f, (*itr)->GetOrientation()); + (*itr)->SendMonsterMove(927.265f, 333.200f, 218.780f, 0, (*itr)->GetMovementFlags(), 1); + } + else + { + (*itr)->GetMap()->CreatureRelocation((*itr), 921.745f, 328.076f, 218.780f, (*itr)->GetOrientation()); + (*itr)->SendMonsterMove(921.745f, 328.076f, 218.780f, 0, (*itr)->GetMovementFlags(), 1); } - ++uiPositionCounter; } - }*/ - } + ++uiPositionCounter; + } + }*/ + } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 diff) override + { + if (bKaddrakActivated) { - if (bKaddrakActivated) + if (uiKaddrakEncounterTimer <= diff) { - if (uiKaddrakEncounterTimer <= diff) - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) - if (!KaddrakGUIDList.empty()) - for (GuidList::const_iterator itr = KaddrakGUIDList.begin(); itr != KaddrakGUIDList.end(); ++itr) + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) + if (!KaddrakGUIDList.empty()) + for (GuidList::const_iterator itr = KaddrakGUIDList.begin(); itr != KaddrakGUIDList.end(); ++itr) + { + if (Creature* pKaddrak = ObjectAccessor::GetCreature(*me, *itr)) { - if (Creature* pKaddrak = ObjectAccessor::GetCreature(*me, *itr)) - { - if (pKaddrak->IsAlive()) - pKaddrak->CastSpell(target, SPELL_GLARE_OF_THE_TRIBUNAL, true); - } + if (pKaddrak->IsAlive()) + pKaddrak->CastSpell(target, SPELL_GLARE_OF_THE_TRIBUNAL, true); } - uiKaddrakEncounterTimer = 1500; - } else uiKaddrakEncounterTimer -= diff; - } - if (bMarnakActivated) + } + uiKaddrakEncounterTimer = 1500; + } else uiKaddrakEncounterTimer -= diff; + } + if (bMarnakActivated) + { + if (uiMarnakEncounterTimer <= diff) { - if (uiMarnakEncounterTimer <= diff) + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) + if (Creature* summon = me->SummonCreature(NPC_DARK_MATTER_TARGET, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1s)) { - if (Creature* summon = me->SummonCreature(NPC_DARK_MATTER_TARGET, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1s)) - { - summon->SetDisplayId(11686); - summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - summon->CastSpell(target, SPELL_DARK_MATTER, true); - } + summon->SetDisplayId(11686); + summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + summon->CastSpell(target, SPELL_DARK_MATTER, true); } - uiMarnakEncounterTimer = urand(30000, 31000); - } else uiMarnakEncounterTimer -= diff; - } - if (bAbedneumActivated) + } + uiMarnakEncounterTimer = urand(30000, 31000); + } else uiMarnakEncounterTimer -= diff; + } + if (bAbedneumActivated) + { + if (uiAbedneumEncounterTimer <= diff) { - if (uiAbedneumEncounterTimer <= diff) + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) + if (Creature* summon = me->SummonCreature(NPC_SEARING_GAZE_TARGET, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1s)) { - if (Creature* summon = me->SummonCreature(NPC_SEARING_GAZE_TARGET, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 1s)) - { - summon->SetDisplayId(11686); - summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - summon->CastSpell(target, SPELL_SEARING_GAZE, true); - } + summon->SetDisplayId(11686); + summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + summon->CastSpell(target, SPELL_SEARING_GAZE, true); } - uiAbedneumEncounterTimer = urand(30000, 31000); - } else uiAbedneumEncounterTimer -= diff; - } + } + uiAbedneumEncounterTimer = urand(30000, 31000); + } else uiAbedneumEncounterTimer -= diff; } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetHallsOfStoneAI<npc_tribuna_controllerAI>(creature); } }; -class npc_brann_hos : public CreatureScript +struct npc_brann_hos : public EscortAI { -public: - npc_brann_hos() : CreatureScript("npc_brann_hos") { } + npc_brann_hos(Creature* creature) : EscortAI(creature) + { + Initialize(); + instance = creature->GetInstanceScript(); + } - struct npc_brann_hosAI : public EscortAI + void Initialize() { - npc_brann_hosAI(Creature* creature) : EscortAI(creature) + bIsLowHP = false; + bIsBattle = false; + uiStep = 0; + uiPhaseTimer = 0; + uiControllerGUID.Clear(); + brannSparklinNews = true; + } + + uint32 uiStep; + uint32 uiPhaseTimer; + + ObjectGuid uiControllerGUID; + GuidList lDwarfGUIDList; + + InstanceScript* instance; + + bool bIsBattle; + bool bIsLowHP; + bool brannSparklinNews; + + void Reset() override + { + if (!HasEscortState(STATE_ESCORT_ESCORTING)) { Initialize(); - instance = creature->GetInstanceScript(); + + DespawnDwarf(); + + instance->SetBossState(DATA_TRIBUNAL_OF_AGES, NOT_STARTED); } + } - void Initialize() + void DespawnDwarf() + { + if (lDwarfGUIDList.empty()) + return; + for (GuidList::const_iterator itr = lDwarfGUIDList.begin(); itr != lDwarfGUIDList.end(); ++itr) { - bIsLowHP = false; - bIsBattle = false; - uiStep = 0; - uiPhaseTimer = 0; - uiControllerGUID.Clear(); - brannSparklinNews = true; + Creature* temp = ObjectAccessor::GetCreature(*me, instance ? (*itr) : ObjectGuid::Empty); + if (temp && temp->IsAlive()) + temp->DespawnOrUnsummon(); } + lDwarfGUIDList.clear(); + } - uint32 uiStep; - uint32 uiPhaseTimer; - - ObjectGuid uiControllerGUID; - GuidList lDwarfGUIDList; + void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override + { + switch (waypointId) + { + case 7: + if (Creature* creature = GetClosestCreatureWithEntry(me, NPC_TRIBUNAL_OF_THE_AGES, 100.0f)) + { + if (!creature->IsAlive()) + creature->Respawn(); + ENSURE_AI(npc_tribuna_controller, creature->AI())->UpdateFacesList(); + uiControllerGUID = creature->GetGUID(); + } + break; + case 13: + Talk(SAY_EVENT_INTRO_1); + instance->SetBossState(DATA_TRIBUNAL_OF_AGES, IN_PROGRESS); + SetEscortPaused(true); + JumpToNextStep(20000); + // @todo: There should be a pause here and a gossip should start the next step. + break; + case 17: + Talk(SAY_EVENT_INTRO_2); + instance->HandleGameObject(instance->GetGuidData(DATA_GO_TRIBUNAL_CONSOLE), true); + me->SetStandState(UNIT_STAND_STATE_KNEEL); + SetEscortPaused(true); + JumpToNextStep(8500); + break; + case 18: + SetEscortPaused(true); + break; + } + } - InstanceScript* instance; + void SpawnDwarf(uint32 uiType) + { + switch (uiType) + { + case 1: + { + uint32 uiSpawnNumber = DUNGEON_MODE(2, 3); + for (uint8 i = 0; i < uiSpawnNumber; ++i) + me->SummonCreature(NPC_DARK_RUNE_PROTECTOR, SpawnLocations[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s); + me->SummonCreature(NPC_DARK_RUNE_STORMCALLER, SpawnLocations[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s); + break; + } + case 2: + for (uint8 i = 0; i < 2; ++i) + me->SummonCreature(NPC_DARK_RUNE_STORMCALLER, SpawnLocations[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s); + break; + case 3: + me->SummonCreature(NPC_IRON_GOLEM_CUSTODIAN, SpawnLocations[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s); + break; + } + } + + void JustSummoned(Creature* summoned) override + { + lDwarfGUIDList.push_back(summoned->GetGUID()); + AddThreat(me, 0.0f, summoned); + summoned->AI()->AttackStart(me); + } - bool bIsBattle; - bool bIsLowHP; - bool brannSparklinNews; + void JumpToNextStep(uint32 uiTimer) + { + uiPhaseTimer = uiTimer; + ++uiStep; + } - void Reset() override - { - if (!HasEscortState(STATE_ESCORT_ESCORTING)) - { - Initialize(); + void StartWP() + { + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + SetEscortPaused(false); + uiStep = 1; + Start(); + } - DespawnDwarf(); + void DamageTaken(Unit* /*done_by*/, uint32& /*damage*/) override + { + if (instance->GetBossState(DATA_TRIBUNAL_OF_AGES) == IN_PROGRESS) + brannSparklinNews = false; + } - instance->SetBossState(DATA_TRIBUNAL_OF_AGES, NOT_STARTED); - } - } + uint32 GetData(uint32 type) const override + { + if (type == DATA_BRANN_SPARKLIN_NEWS) + return brannSparklinNews ? 1 : 0; - void DespawnDwarf() - { - if (lDwarfGUIDList.empty()) - return; - for (GuidList::const_iterator itr = lDwarfGUIDList.begin(); itr != lDwarfGUIDList.end(); ++itr) - { - Creature* temp = ObjectAccessor::GetCreature(*me, instance ? (*itr) : ObjectGuid::Empty); - if (temp && temp->IsAlive()) - temp->DespawnOrUnsummon(); - } - lDwarfGUIDList.clear(); - } + return 0; + } - void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override + void UpdateEscortAI(uint32 uiDiff) override + { + if (uiPhaseTimer <= uiDiff) { - switch (waypointId) + switch (uiStep) { + case 1: + if (instance->GetBossState(DATA_TRIBUNAL_OF_AGES) != NOT_STARTED) + return; + bIsBattle = false; + Talk(SAY_ESCORT_START); + SetRun(true); + JumpToNextStep(0); + break; + case 3: + SetEscortPaused(false); + JumpToNextStep(0); + break; + case 5: + if (Creature* temp = (ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM)))) + temp->AI()->Talk(SAY_EVENT_INTRO_3_ABED); + JumpToNextStep(8500); + break; + case 6: + Talk(SAY_EVENT_A_1); + JumpToNextStep(6500); + break; case 7: - if (Creature* creature = GetClosestCreatureWithEntry(me, NPC_TRIBUNAL_OF_THE_AGES, 100.0f)) - { - if (!creature->IsAlive()) - creature->Respawn(); - ENSURE_AI(npc_tribuna_controller::npc_tribuna_controllerAI, creature->AI())->UpdateFacesList(); - uiControllerGUID = creature->GetGUID(); - } + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK))) + temp->AI()->Talk(SAY_EVENT_A_2_KADD); + JumpToNextStep(12500); + break; + case 8: + Talk(SAY_EVENT_A_3); + instance->HandleGameObject(instance->GetGuidData(DATA_GO_KADDRAK), true); + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) + ENSURE_AI(npc_tribuna_controller, temp->AI())->bKaddrakActivated = true; + JumpToNextStep(5000); + break; + case 9: + me->SetReactState(REACT_PASSIVE); + SpawnDwarf(1); + JumpToNextStep(20000); + break; + case 10: + Talk(SAY_EVENT_B_1); + JumpToNextStep(6000); + break; + case 11: + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK))) + temp->AI()->Talk(SAY_EVENT_B_2_MARN); + SpawnDwarf(1); + JumpToNextStep(20000); + break; + case 12: + Talk(SAY_EVENT_B_3); + instance->HandleGameObject(instance->GetGuidData(DATA_GO_MARNAK), true); + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) + ENSURE_AI(npc_tribuna_controller, temp->AI())->bMarnakActivated = true; + JumpToNextStep(10000); break; case 13: - Talk(SAY_EVENT_INTRO_1); - instance->SetBossState(DATA_TRIBUNAL_OF_AGES, IN_PROGRESS); - SetEscortPaused(true); + SpawnDwarf(1); + JumpToNextStep(10000); + break; + case 14: + SpawnDwarf(2); + JumpToNextStep(20000); + break; + case 15: + Talk(SAY_EVENT_C_1); + SpawnDwarf(1); + JumpToNextStep(10000); + break; + case 16: + SpawnDwarf(2); JumpToNextStep(20000); - // @todo: There should be a pause here and a gossip should start the next step. break; case 17: - Talk(SAY_EVENT_INTRO_2); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_TRIBUNAL_CONSOLE), true); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - SetEscortPaused(true); - JumpToNextStep(8500); + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) + temp->AI()->Talk(SAY_EVENT_C_2_ABED); + SpawnDwarf(1); + JumpToNextStep(20000); break; case 18: - SetEscortPaused(true); + Talk(SAY_EVENT_C_3); + instance->HandleGameObject(instance->GetGuidData(DATA_GO_ABEDNEUM), true); + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) + ENSURE_AI(npc_tribuna_controller, temp->AI())->bAbedneumActivated = true; + JumpToNextStep(5000); + break; + case 19: + SpawnDwarf(2); + JumpToNextStep(10000); + break; + case 20: + SpawnDwarf(1); + JumpToNextStep(15000); + break; + case 21: + Talk(SAY_EVENT_D_1); + SpawnDwarf(3); + JumpToNextStep(20000); + break; + case 22: + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) + temp->AI()->Talk(SAY_EVENT_D_2_ABED); + SpawnDwarf(1); + JumpToNextStep(5000); + break; + case 23: + SpawnDwarf(2); + JumpToNextStep(15000); + break; + case 24: + Talk(SAY_EVENT_D_3); + SpawnDwarf(3); + JumpToNextStep(5000); + break; + case 25: + SpawnDwarf(1); + JumpToNextStep(5000); + break; + case 26: + SpawnDwarf(2); + JumpToNextStep(10000); + break; + case 27: + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) + temp->AI()->Talk(SAY_EVENT_D_4_ABED); + SpawnDwarf(1); + JumpToNextStep(10000); + break; + case 28: + me->SetReactState(REACT_DEFENSIVE); + Talk(SAY_EVENT_END_01); + me->SetStandState(UNIT_STAND_STATE_STAND); + instance->HandleGameObject(instance->GetGuidData(DATA_GO_SKY_FLOOR), true); + if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) + temp->KillSelf(); + bIsBattle = true; + SetEscortPaused(false); + JumpToNextStep(6500); + break; + case 29: + Talk(SAY_EVENT_END_02); + instance->SetBossState(DATA_TRIBUNAL_OF_AGES, DONE); + me->CastSpell(me, SPELL_REWARD_ACHIEVEMENT, true); + JumpToNextStep(5500); + break; + case 30: + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) + temp->AI()->Talk(SAY_EVENT_END_03_ABED); + JumpToNextStep(8500); + break; + case 31: + Talk(SAY_EVENT_END_04); + JumpToNextStep(11500); + break; + case 32: + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) + temp->AI()->Talk(SAY_EVENT_END_05_ABED); + JumpToNextStep(11500); + break; + case 33: + Talk(SAY_EVENT_END_06); + JumpToNextStep(4500); + break; + case 34: + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) + temp->AI()->Talk(SAY_EVENT_END_07_ABED); + JumpToNextStep(22500); + break; + case 35: + Talk(SAY_EVENT_END_08); + JumpToNextStep(7500); + break; + case 36: + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK))) + temp->AI()->Talk(SAY_EVENT_END_09_KADD); + JumpToNextStep(18500); + break; + case 37: + Talk(SAY_EVENT_END_10); + JumpToNextStep(5500); + break; + case 38: + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK))) + temp->AI()->Talk(SAY_EVENT_END_11_KADD); + JumpToNextStep(20500); + break; + case 39: + Talk(SAY_EVENT_END_12); + JumpToNextStep(2500); + break; + case 40: + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK))) + temp->AI()->Talk(SAY_EVENT_END_13_KADD); + JumpToNextStep(19500); + break; + case 41: + Talk(SAY_EVENT_END_14); + JumpToNextStep(10500); + break; + case 42: + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK))) + temp->AI()->Talk(SAY_EVENT_END_15_MARN); + JumpToNextStep(6500); + break; + case 43: + Talk(SAY_EVENT_END_16); + JumpToNextStep(6500); + break; + case 44: + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK))) + temp->AI()->Talk(SAY_EVENT_END_17_MARN); + JumpToNextStep(25500); + break; + case 45: + Talk(SAY_EVENT_END_18); + JumpToNextStep(23500); + break; + case 46: + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK))) + temp->AI()->Talk(SAY_EVENT_END_19_MARN); + JumpToNextStep(3500); + break; + case 47: + Talk(SAY_EVENT_END_20); + JumpToNextStep(8500); + break; + case 48: + if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) + temp->AI()->Talk(SAY_EVENT_END_21_ABED); + JumpToNextStep(5500); + break; + case 49: + { + instance->HandleGameObject(instance->GetGuidData(DATA_GO_KADDRAK), false); + instance->HandleGameObject(instance->GetGuidData(DATA_GO_MARNAK), false); + instance->HandleGameObject(instance->GetGuidData(DATA_GO_ABEDNEUM), false); + instance->HandleGameObject(instance->GetGuidData(DATA_GO_SKY_FLOOR), false); + Player* player = GetPlayerForEscort(); + if (player) + player->GroupEventHappens(QUEST_HALLS_OF_STONE, me); + me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); + JumpToNextStep(180000); + break; + } + case 50: + SetEscortPaused(false); break; } - } + } else uiPhaseTimer -= uiDiff; - void SpawnDwarf(uint32 uiType) - { - switch (uiType) - { - case 1: - { - uint32 uiSpawnNumber = DUNGEON_MODE(2, 3); - for (uint8 i = 0; i < uiSpawnNumber; ++i) - me->SummonCreature(NPC_DARK_RUNE_PROTECTOR, SpawnLocations[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s); - me->SummonCreature(NPC_DARK_RUNE_STORMCALLER, SpawnLocations[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s); - break; - } - case 2: - for (uint8 i = 0; i < 2; ++i) - me->SummonCreature(NPC_DARK_RUNE_STORMCALLER, SpawnLocations[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s); - break; - case 3: - me->SummonCreature(NPC_IRON_GOLEM_CUSTODIAN, SpawnLocations[0], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 30s); - break; - } - } - - void JustSummoned(Creature* summoned) override + if (!bIsLowHP && HealthBelowPct(30)) { - lDwarfGUIDList.push_back(summoned->GetGUID()); - AddThreat(me, 0.0f, summoned); - summoned->AI()->AttackStart(me); - } - - void JumpToNextStep(uint32 uiTimer) - { - uiPhaseTimer = uiTimer; - ++uiStep; - } - - void StartWP() - { - me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - SetEscortPaused(false); - uiStep = 1; - Start(); - } - - void DamageTaken(Unit* /*done_by*/, uint32& /*damage*/) override - { - if (instance->GetBossState(DATA_TRIBUNAL_OF_AGES) == IN_PROGRESS) - brannSparklinNews = false; - } - - uint32 GetData(uint32 type) const override - { - if (type == DATA_BRANN_SPARKLIN_NEWS) - return brannSparklinNews ? 1 : 0; - - return 0; + Talk(SAY_LOW_HEALTH); + bIsLowHP = true; } + else if (bIsLowHP && !HealthBelowPct(30)) + bIsLowHP = false; - void UpdateEscortAI(uint32 uiDiff) override - { - if (uiPhaseTimer <= uiDiff) - { - switch (uiStep) - { - case 1: - if (instance->GetBossState(DATA_TRIBUNAL_OF_AGES) != NOT_STARTED) - return; - bIsBattle = false; - Talk(SAY_ESCORT_START); - SetRun(true); - JumpToNextStep(0); - break; - case 3: - SetEscortPaused(false); - JumpToNextStep(0); - break; - case 5: - if (Creature* temp = (ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM)))) - temp->AI()->Talk(SAY_EVENT_INTRO_3_ABED); - JumpToNextStep(8500); - break; - case 6: - Talk(SAY_EVENT_A_1); - JumpToNextStep(6500); - break; - case 7: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK))) - temp->AI()->Talk(SAY_EVENT_A_2_KADD); - JumpToNextStep(12500); - break; - case 8: - Talk(SAY_EVENT_A_3); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_KADDRAK), true); - if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) - ENSURE_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bKaddrakActivated = true; - JumpToNextStep(5000); - break; - case 9: - me->SetReactState(REACT_PASSIVE); - SpawnDwarf(1); - JumpToNextStep(20000); - break; - case 10: - Talk(SAY_EVENT_B_1); - JumpToNextStep(6000); - break; - case 11: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK))) - temp->AI()->Talk(SAY_EVENT_B_2_MARN); - SpawnDwarf(1); - JumpToNextStep(20000); - break; - case 12: - Talk(SAY_EVENT_B_3); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_MARNAK), true); - if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) - ENSURE_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bMarnakActivated = true; - JumpToNextStep(10000); - break; - case 13: - SpawnDwarf(1); - JumpToNextStep(10000); - break; - case 14: - SpawnDwarf(2); - JumpToNextStep(20000); - break; - case 15: - Talk(SAY_EVENT_C_1); - SpawnDwarf(1); - JumpToNextStep(10000); - break; - case 16: - SpawnDwarf(2); - JumpToNextStep(20000); - break; - case 17: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) - temp->AI()->Talk(SAY_EVENT_C_2_ABED); - SpawnDwarf(1); - JumpToNextStep(20000); - break; - case 18: - Talk(SAY_EVENT_C_3); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_ABEDNEUM), true); - if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) - ENSURE_AI(npc_tribuna_controller::npc_tribuna_controllerAI, temp->AI())->bAbedneumActivated = true; - JumpToNextStep(5000); - break; - case 19: - SpawnDwarf(2); - JumpToNextStep(10000); - break; - case 20: - SpawnDwarf(1); - JumpToNextStep(15000); - break; - case 21: - Talk(SAY_EVENT_D_1); - SpawnDwarf(3); - JumpToNextStep(20000); - break; - case 22: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) - temp->AI()->Talk(SAY_EVENT_D_2_ABED); - SpawnDwarf(1); - JumpToNextStep(5000); - break; - case 23: - SpawnDwarf(2); - JumpToNextStep(15000); - break; - case 24: - Talk(SAY_EVENT_D_3); - SpawnDwarf(3); - JumpToNextStep(5000); - break; - case 25: - SpawnDwarf(1); - JumpToNextStep(5000); - break; - case 26: - SpawnDwarf(2); - JumpToNextStep(10000); - break; - case 27: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) - temp->AI()->Talk(SAY_EVENT_D_4_ABED); - SpawnDwarf(1); - JumpToNextStep(10000); - break; - case 28: - me->SetReactState(REACT_DEFENSIVE); - Talk(SAY_EVENT_END_01); - me->SetStandState(UNIT_STAND_STATE_STAND); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_SKY_FLOOR), true); - if (Creature* temp = ObjectAccessor::GetCreature(*me, uiControllerGUID)) - temp->KillSelf(); - bIsBattle = true; - SetEscortPaused(false); - JumpToNextStep(6500); - break; - case 29: - Talk(SAY_EVENT_END_02); - instance->SetBossState(DATA_TRIBUNAL_OF_AGES, DONE); - me->CastSpell(me, SPELL_REWARD_ACHIEVEMENT, true); - JumpToNextStep(5500); - break; - case 30: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) - temp->AI()->Talk(SAY_EVENT_END_03_ABED); - JumpToNextStep(8500); - break; - case 31: - Talk(SAY_EVENT_END_04); - JumpToNextStep(11500); - break; - case 32: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) - temp->AI()->Talk(SAY_EVENT_END_05_ABED); - JumpToNextStep(11500); - break; - case 33: - Talk(SAY_EVENT_END_06); - JumpToNextStep(4500); - break; - case 34: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) - temp->AI()->Talk(SAY_EVENT_END_07_ABED); - JumpToNextStep(22500); - break; - case 35: - Talk(SAY_EVENT_END_08); - JumpToNextStep(7500); - break; - case 36: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK))) - temp->AI()->Talk(SAY_EVENT_END_09_KADD); - JumpToNextStep(18500); - break; - case 37: - Talk(SAY_EVENT_END_10); - JumpToNextStep(5500); - break; - case 38: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK))) - temp->AI()->Talk(SAY_EVENT_END_11_KADD); - JumpToNextStep(20500); - break; - case 39: - Talk(SAY_EVENT_END_12); - JumpToNextStep(2500); - break; - case 40: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_KADDRAK))) - temp->AI()->Talk(SAY_EVENT_END_13_KADD); - JumpToNextStep(19500); - break; - case 41: - Talk(SAY_EVENT_END_14); - JumpToNextStep(10500); - break; - case 42: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK))) - temp->AI()->Talk(SAY_EVENT_END_15_MARN); - JumpToNextStep(6500); - break; - case 43: - Talk(SAY_EVENT_END_16); - JumpToNextStep(6500); - break; - case 44: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK))) - temp->AI()->Talk(SAY_EVENT_END_17_MARN); - JumpToNextStep(25500); - break; - case 45: - Talk(SAY_EVENT_END_18); - JumpToNextStep(23500); - break; - case 46: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MARNAK))) - temp->AI()->Talk(SAY_EVENT_END_19_MARN); - JumpToNextStep(3500); - break; - case 47: - Talk(SAY_EVENT_END_20); - JumpToNextStep(8500); - break; - case 48: - if (Creature* temp = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ABEDNEUM))) - temp->AI()->Talk(SAY_EVENT_END_21_ABED); - JumpToNextStep(5500); - break; - case 49: - { - instance->HandleGameObject(instance->GetGuidData(DATA_GO_KADDRAK), false); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_MARNAK), false); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_ABEDNEUM), false); - instance->HandleGameObject(instance->GetGuidData(DATA_GO_SKY_FLOOR), false); - Player* player = GetPlayerForEscort(); - if (player) - player->GroupEventHappens(QUEST_HALLS_OF_STONE, me); - me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); - JumpToNextStep(180000); - break; - } - case 50: - SetEscortPaused(false); - break; - } - } else uiPhaseTimer -= uiDiff; - - if (!bIsLowHP && HealthBelowPct(30)) - { - Talk(SAY_LOW_HEALTH); - bIsLowHP = true; - } - else if (bIsLowHP && !HealthBelowPct(30)) - bIsLowHP = false; - - if (!UpdateVictim()) - return; + if (!UpdateVictim()) + return; - DoMeleeAttackIfReady(); - } + DoMeleeAttackIfReady(); + } - bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + bool OnGossipSelect(Player* player, uint32 /*menuId*/, uint32 gossipListId) override + { + uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); + ClearGossipMenuFor(player); + if (action == GOSSIP_ACTION_INFO_DEF + 1 || action == GOSSIP_ACTION_INFO_DEF + 2) { - uint32 const action = player->PlayerTalkClass->GetGossipOptionAction(gossipListId); - ClearGossipMenuFor(player); - if (action == GOSSIP_ACTION_INFO_DEF + 1 || action == GOSSIP_ACTION_INFO_DEF + 2) - { - CloseGossipMenuFor(player); - StartWP(); - } - - return true; + CloseGossipMenuFor(player); + StartWP(); } - bool OnGossipHello(Player* player) override - { - if (me->IsQuestGiver()) - player->PrepareQuestMenu(me->GetGUID()); + return true; + } - AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_START, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); - SendGossipMenuFor(player, TEXT_ID_START, me->GetGUID()); + bool OnGossipHello(Player* player) override + { + if (me->IsQuestGiver()) + player->PrepareQuestMenu(me->GetGUID()); - return true; - } - }; + AddGossipItemFor(player, GOSSIP_ICON_CHAT, GOSSIP_ITEM_START, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + SendGossipMenuFor(player, TEXT_ID_START, me->GetGUID()); - CreatureAI* GetAI(Creature* creature) const override - { - return GetHallsOfStoneAI<npc_brann_hosAI>(creature); + return true; } }; @@ -736,7 +714,7 @@ class achievement_brann_spankin_new : public AchievementCriteriaScript void AddSC_halls_of_stone() { - new npc_brann_hos(); - new npc_tribuna_controller(); + RegisterHallsOfStoneCreatureAI(npc_brann_hos); + RegisterHallsOfStoneCreatureAI(npc_tribuna_controller); new achievement_brann_spankin_new(); } |