void JustDied(Unit* /*pKiller*/) { Player* pPlayer = GetPlayerForEscort(); if (pPlayer) pPlayer->FailQuest(QUEST_RETURN_TO_VAHLARRIEL); return; }
void JustDied(Unit* /*killer*/) { if (Player* player = GetPlayerForEscort()) player->FailQuest(QUEST_TRAIL_OF_FIRE); }
void JustDied(Unit* /*killer*/) { if (Player* player = GetPlayerForEscort()) player->FailQuest(QUEST_MARK_V_IS_ALIVE); }
void UpdateAI(uint32 uiDiff) { if (uiPhase) { if (uiTimer <= uiDiff) { switch (uiPhase) { case 1: if (Creature* pGuard = me->FindNearestCreature(NPC_STORMWIND_ROYAL, 8.0f, true)) pGuard->AI()->Talk(SAY_GUARD_2); uiTimer = 3000; uiPhase = 2; break; case 2: DoGuardsDisappearAndDie(); uiTimer = 2000; uiPhase = 3; break; case 3: SetEscortPaused(false); uiTimer = 0; uiPhase = 0; break; case 4: Talk(SAY_LESCOVAR_3); uiTimer = 0; uiPhase = 0; break; case 5: if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID)) pMarzon->AI()->Talk(SAY_MARZON_1); uiTimer = 3000; uiPhase = 6; break; case 6: Talk(SAY_LESCOVAR_4); if (Player* player = GetPlayerForEscort()) player->AreaExploredOrEventHappens(QUEST_THE_ATTACK); uiTimer = 2000; uiPhase = 7; break; case 7: if (Creature* pTyrion = me->FindNearestCreature(NPC_TYRION, 20.0f, true)) pTyrion->AI()->Talk(SAY_TYRION_2); if (Creature* pMarzon = Unit::GetCreature(*me, MarzonGUID)) pMarzon->setFaction(14); me->setFaction(14); uiTimer = 0; uiPhase = 0; break; } } else uiTimer -= uiDiff; } npc_escortAI::UpdateAI(uiDiff); if (!UpdateVictim()) return; DoMeleeAttackIfReady(); }
void WaypointReached(uint32 i) { Player* pPlayer = GetPlayerForEscort(); if (!pPlayer) return; switch (i) { case 9: if (Creature *Mrfloppy = GetClosestCreatureWithEntry(me, NPC_MRFLOPPY, 100.0f)) MrfloppyGUID = Mrfloppy->GetGUID(); break; case 10: if (Unit::GetCreature(*me, MrfloppyGUID)) { DoScriptText(SAY_WORGHAGGRO1, me); me->SummonCreature(NPC_HUNGRY_WORG,me->GetPositionX()+5,me->GetPositionY()+2,me->GetPositionZ()+1,3.229f,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,120000); } break; case 11: if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID)) Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); break; case 17: if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID)) Mrfloppy->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); DoScriptText(SAY_WORGRAGGRO3, me); if (Creature *RWORG = me->SummonCreature(NPC_RAVENOUS_WORG,me->GetPositionX()+10,me->GetPositionY()+8,me->GetPositionZ()+2,3.229f,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,120000)) { RWORG->setFaction(35); RWORGGUID = RWORG->GetGUID(); } break; case 18: if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID)) { if (Creature *RWORG = Unit::GetCreature(*me, RWORGGUID)) RWORG->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); DoCast(Mrfloppy,SPELL_MRFLOPPY); } break; case 19: if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID)) { if (Mrfloppy->HasAura(SPELL_MRFLOPPY, 0)) { if (Creature *RWORG = Unit::GetCreature(*me, RWORGGUID)) Mrfloppy->EnterVehicle(RWORG); } } break; case 20: if (Creature *RWORG = Unit::GetCreature(*me, RWORGGUID)) RWORG->HandleEmoteCommand(34); break; case 21: if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID)) { if (Creature *RWORG = Unit::GetCreature(*me, RWORGGUID)) { RWORG->Kill(Mrfloppy); Mrfloppy->ExitVehicle(); RWORG->setFaction(14); RWORG->GetMotionMaster()->MovePoint(0, RWORG->GetPositionX()+10,RWORG->GetPositionY()+80,RWORG->GetPositionZ()); DoScriptText(SAY_VICTORY2, me); } } break; case 22: if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID)) { if (Mrfloppy->isDead()) { if (Creature *RWORG = Unit::GetCreature(*me, RWORGGUID)) RWORG->DisappearAndDie(); me->GetMotionMaster()->MovePoint(0, Mrfloppy->GetPositionX(), Mrfloppy->GetPositionY(), Mrfloppy->GetPositionZ()); Mrfloppy->setDeathState(ALIVE); Mrfloppy->GetMotionMaster()->MoveFollow(me, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE); DoScriptText(SAY_VICTORY3, me); } } break; case 24: if (pPlayer) { Completed = true; pPlayer->GroupEventHappens(QUEST_PERILOUS_ADVENTURE, me); DoScriptText(SAY_QUEST_COMPLETE, me, pPlayer); } me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); break; case 25: DoScriptText(SAY_VICTORY4, me); break; case 27: me->DisappearAndDie(); if (Creature *Mrfloppy = Unit::GetCreature(*me, MrfloppyGUID)) Mrfloppy->DisappearAndDie(); break; } }
void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override { Player* player = GetPlayerForEscort(); if (!player) return; switch (waypointId) { case WP_START: SetEscortPaused(true); me->SetFacingToObject(player); Talk(SAY_LEGOSO_1); _moveTimer = 2.5 * IN_MILLISECONDS; _phase = PHASE_CONTINUE; break; case WP_EXPLOSIVES_FIRST_POINT: SetEscortPaused(true); Talk(SAY_LEGOSO_2); _moveTimer = 8 * IN_MILLISECONDS; _phase = PHASE_WP_22; break; case WP_EXPLOSIVES_FIRST_PLANT: me->SetFacingTo(1.46f); break; case WP_EXPLOSIVES_FIRST_DETONATE: SetEscortPaused(true); me->SetFacingTo(1.05f); _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_PLANT_FIRST_TIMER_1; break; case WP_DEBUG_1: SetEscortPaused(true); _moveTimer = 0.5 * IN_MILLISECONDS; _phase = PHASE_WP_26; break; case WP_SIRONAS_HILL: { SetEscortPaused(true); //Find Sironas and make it respawn if needed Creature* sironas = nullptr; Trinity::AllCreaturesOfEntryInRange check(me, NPC_SIRONAS, SIZE_OF_GRIDS); Trinity::CreatureSearcher<Trinity::AllCreaturesOfEntryInRange> searcher(me, sironas, check); Cell::VisitAllObjects(me, searcher, SIZE_OF_GRIDS); if (sironas) { if (!sironas->IsAlive()) sironas->Respawn(true); sironas->AI()->DoAction(ACTION_SIRONAS_CHANNEL_START); me->SetFacingToObject(sironas); } _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_FEEL_SIRONAS_1; break; } case WP_EXPLOSIVES_SECOND_BATTLEROAR: SetEscortPaused(true); _moveTimer = 0.2 * IN_MILLISECONDS; _phase = PHASE_MEET_SIRONAS_ROAR; break; case WP_EXPLOSIVES_SECOND_PLANT: SetEscortPaused(true); _moveTimer = 0.5 * IN_MILLISECONDS; _phase = PHASE_PLANT_SECOND_KNEEL; break; case WP_EXPLOSIVES_SECOND_DETONATE: SetEscortPaused(true); me->SetFacingTo(5.7f); _moveTimer = 2 * IN_MILLISECONDS; _phase = PHASE_PLANT_SECOND_TIMER_1; break; default: break; } }
void JustDied(Unit* /*killer*/) { Player* player = GetPlayerForEscort(); if (player) player->FailQuest(QUEST_TOMB_LIGHTBRINGER); }
void JustDied(Unit* /*killer*/) { if (Player* player = GetPlayerForEscort()) player->FailQuest(QUEST_CHASING_AME); }
void UpdateEscortAI(const uint32 uiDiff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) { if (!HasEscortState(STATE_ESCORT_ESCORTING)) return; if (HasEscortState(STATE_ESCORT_PAUSED)) { if (m_uiExplodeTimer < uiDiff) { if (m_bFirstBarrel) { switch(m_uiExplodePhase) { case 0: DoCastSpellIfCan(m_creature, SPELL_DETONATE_EXPLOSIVES_1); if (Player* pPlayer = GetPlayerForEscort()) DoScriptText(SAY_HELICE_EXPLODE_1, m_creature, pPlayer); m_uiExplodeTimer = 2500; ++m_uiExplodePhase; break; case 1: if (Player* pPlayer = GetPlayerForEscort()) DoScriptText(SAY_HELICE_MOVE_ON, m_creature, pPlayer); m_uiExplodeTimer = 2500; ++m_uiExplodePhase; break; case 2: SetEscortPaused(false); m_uiExplodePhase = 0; m_uiExplodeTimer = 5000; m_bFirstBarrel = false; break; } } else { switch(m_uiExplodePhase) { case 0: DoCastSpellIfCan(m_creature, SPELL_DETONATE_EXPLOSIVES_2); if (Player* pPlayer = GetPlayerForEscort()) DoScriptText(SAY_HELICE_EXPLODE_2, m_creature, pPlayer); m_uiExplodeTimer = 2500; ++m_uiExplodePhase; break; case 1: SetEscortPaused(false); m_uiExplodePhase = 0; m_uiExplodeTimer = 5000; m_bFirstBarrel = true; break; } } } else m_uiExplodeTimer -= uiDiff; } return; } DoMeleeAttackIfReady(); }
void JustDied(Unit* /*killer*/) { if (Player* player = GetPlayerForEscort()) CAST_PLR(player)->FailQuest(QUEST_WILLIX_THE_IMPORTER); }
void JustSummoned(Creature* pSummoned) override { // Note: may not work on guardian pets if (Player* pPlayer = GetPlayerForEscort()) pSummoned->AI()->AttackStart(pPlayer); }
void WaypointReached(uint32 i) { Player *pPlayer = GetPlayerForEscort(); if (!pPlayer) return; switch (i) { case 0: DoScriptText(WHISPER_CUSTODIAN_1, me, pPlayer); break; case 1: DoScriptText(WHISPER_CUSTODIAN_2, me, pPlayer); break; case 2: DoScriptText(WHISPER_CUSTODIAN_3, me, pPlayer); break; case 3: DoScriptText(WHISPER_CUSTODIAN_4, me, pPlayer); break; case 5: DoScriptText(WHISPER_CUSTODIAN_5, me, pPlayer); break; case 6: DoScriptText(WHISPER_CUSTODIAN_6, me, pPlayer); break; case 7: DoScriptText(WHISPER_CUSTODIAN_7, me, pPlayer); break; case 8: DoScriptText(WHISPER_CUSTODIAN_8, me, pPlayer); break; case 9: DoScriptText(WHISPER_CUSTODIAN_9, me, pPlayer); break; case 10: DoScriptText(WHISPER_CUSTODIAN_4, me, pPlayer); break; case 13: DoScriptText(WHISPER_CUSTODIAN_10, me, pPlayer); break; case 14: DoScriptText(WHISPER_CUSTODIAN_4, me, pPlayer); break; case 16: DoScriptText(WHISPER_CUSTODIAN_11, me, pPlayer); break; case 17: DoScriptText(WHISPER_CUSTODIAN_12, me, pPlayer); break; case 18: DoScriptText(WHISPER_CUSTODIAN_4, me, pPlayer); break; case 22: DoScriptText(WHISPER_CUSTODIAN_13, me, pPlayer); break; case 23: DoScriptText(WHISPER_CUSTODIAN_4, me, pPlayer); break; case 24: DoScriptText(WHISPER_CUSTODIAN_14, me, pPlayer); DoCast(pPlayer, 34883); // below here is temporary workaround, to be removed when spell works properly pPlayer->AreaExploredOrEventHappens(10277); break; } }
void JustDidDialogueStep(int32 entry) { switch (entry) { case NPC_RANSHALLA: // Start the altar channeling DoChannelTorchSpell(true); break; case SAY_RANSHALLA_ALTAR_6: SetEscortPaused(false); break; case SAY_PRIESTESS_ALTAR_8: // make the gem respawn if (GameObject* gem = GetClosestGameObjectWithEntry(me, GO_ELUNE_GEM, 10.0f)) { if (gem->isSpawned()) break; gem->SetRespawnTime(90); gem->Refresh(); } break; case SAY_PRIESTESS_ALTAR_9: // move near the escort npc if (Creature* priestess = me->GetMap()->GetCreature(_firstPriestessGUID)) priestess->GetMotionMaster()->MovePoint(0, wingThicketLocations[6].m_positionX, wingThicketLocations[6].m_positionY, wingThicketLocations[6].m_positionZ); break; case SAY_PRIESTESS_ALTAR_13: // summon the Guardian of Elune if (Creature* guard = me->SummonCreature(NPC_GUARDIAN_ELUNE, wingThicketLocations[2].m_positionX, wingThicketLocations[2].m_positionY, wingThicketLocations[2].m_positionZ, wingThicketLocations[2].m_orientation, TEMPSUMMON_CORPSE_DESPAWN, 0)) { guard->GetMotionMaster()->MovePoint(0, wingThicketLocations[5].m_positionX, wingThicketLocations[5].m_positionY, wingThicketLocations[5].m_positionZ); _guardEluneGUID = guard->GetGUID(); } // summon the Voice of Elune if (GameObject* altar = me->GetMap()->GetGameObject(_altarGUID)) { if (Creature* voice = me->SummonCreature(NPC_VOICE_ELUNE, altar->GetPositionX(), altar->GetPositionY(), altar->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 30000)) _voiceEluneGUID = voice->GetGUID(); } break; case SAY_VOICE_ALTAR_15: // move near the escort npc and continue dialogue if (Creature* priestess = me->GetMap()->GetCreature(_secondPriestessGUID)) { priestess->AI()->Talk(SAY_PRIESTESS_ALTAR_14); priestess->GetMotionMaster()->MovePoint(0, wingThicketLocations[7].m_positionX, wingThicketLocations[7].m_positionY, wingThicketLocations[7].m_positionZ); } break; case SAY_PRIESTESS_ALTAR_19: // make the voice of elune leave if (Creature* guard = me->GetMap()->GetCreature(_guardEluneGUID)) { guard->GetMotionMaster()->MovePoint(0, wingThicketLocations[2].m_positionX, wingThicketLocations[2].m_positionY, wingThicketLocations[2].m_positionZ); guard->DespawnOrUnsummon(4000); } break; case SAY_PRIESTESS_ALTAR_20: // make the first priestess leave if (Creature* priestess = me->GetMap()->GetCreature(_firstPriestessGUID)) { priestess->GetMotionMaster()->MovePoint(0, wingThicketLocations[0].m_positionX, wingThicketLocations[0].m_positionY, wingThicketLocations[0].m_positionZ); priestess->DespawnOrUnsummon(4000); } break; case SAY_PRIESTESS_ALTAR_21: // make the second priestess leave if (Creature* priestess = me->GetMap()->GetCreature(_secondPriestessGUID)) { priestess->GetMotionMaster()->MovePoint(0, wingThicketLocations[1].m_positionX, wingThicketLocations[1].m_positionY, wingThicketLocations[1].m_positionZ); priestess->DespawnOrUnsummon(4000); } break; case DATA_EVENT_END: // Turn towards the player if (Player* player = GetPlayerForEscort()) { me->SetFacingToObject(player); Talk(SAY_RANSHALLA_END_1, player->GetGUID()); } break; case SAY_RANSHALLA_END_2: // Turn towards the altar and kneel - quest complete if (GameObject* altar = me->GetMap()->GetGameObject(_altarGUID)) { me->SetFacingToObject(altar); altar->ResetDoorOrButton(); } me->SetStandState(UNIT_STAND_STATE_KNEEL); if (Player* player = GetPlayerForEscort()) { player->GroupEventHappens(QUEST_GUARDIANS_ALTAR, me); Talk(SAY_RANSHALLA_END_2, player->GetGUID()); } me->DespawnOrUnsummon(4000); break; } }
void WaypointReached(uint32 i) { Player* pPlayer = GetPlayerForEscort(); if (!pPlayer) return; Creature* Godfrey = me->FindNearestCreature(NPC_GODFREY, 50, true); if (!Godfrey) return; switch (i) { case 1: DoScriptText(SAY_WP_1, me, Godfrey); me->SetUInt64Value(UNIT_FIELD_TARGET, Godfrey->GetGUID()); me->HandleEmoteCommand(5); me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); break; case 2: Godfrey->HandleEmoteCommand(434); DoScriptText(SAY_WP_2, me, Godfrey); me->HandleEmoteCommand(15); break; case 3: DoScriptText(SAY_WP_3, me, Godfrey); me->HandleEmoteCommand(1); break; case 4: DoScriptText(SAY_WP_4, Godfrey); break; case 5: DoScriptText(SAY_WP_5, Godfrey); break; case 6: DoScriptText(SAY_WP_6, Godfrey); break; case 7: DoScriptText(SAY_WP_7, me, Godfrey); me->HandleEmoteCommand(1); break; case 8: DoScriptText(SAY_WP_8, me, Godfrey); me->HandleEmoteCommand(16); break; case 9: DoScriptText(SAY_WP_9, me, Godfrey); me->HandleEmoteCommand(5); break; case 10: DoScriptText(SAY_WP_10, me, Godfrey); DoCast(Godfrey, SPELL_HOLY_FIRE); break; case 11: Godfrey->HandleEmoteCommand(434); DoScriptText(SAY_WP_11, Godfrey); break; case 12: DoScriptText(SAY_WP_12, me, Godfrey); DoCast(Godfrey, SPELL_HOLY_FIRE); break; case 13: DoScriptText(SAY_WP_13, me, Godfrey); DoCast(Godfrey, SPELL_HOLY_FIRE); break; case 14: Godfrey->HandleEmoteCommand(434); DoScriptText(SAY_WP_14, Godfrey); break; case 15: DoScriptText(SAY_WP_15, me, Godfrey); DoCast(Godfrey, SPELL_HOLY_FIRE); break; case 16: DoScriptText(SAY_WP_16, me, Godfrey); break; case 17: DoScriptText(SAY_WP_17, me, Godfrey); break; case 18: DoScriptText(SAY_WP_18, Godfrey); break; case 19: DoScriptText(SAY_WP_19, me, Godfrey); break; case 20: DoScriptText(SAY_WP_20, Godfrey); break; case 21: DoScriptText(SAY_WP_21, Godfrey); break; case 22: DoScriptText(SAY_WP_22, me, Godfrey); break; case 23: DoScriptText(SAY_WP_23, Godfrey); break; case 24: DoScriptText(SAY_WP_24, Godfrey); break; case 25: DoScriptText(SAY_WP_25, me, Godfrey); break; case 26: DoScriptText(SAY_WP_26, me); me->SetUInt64Value(UNIT_FIELD_TARGET, pPlayer->GetGUID()); break; case 27: DoScriptText(SAY_WP_27, me, Godfrey); me->SetUInt64Value(UNIT_FIELD_TARGET, Godfrey->GetGUID()); Completed = true; if (pPlayer) pPlayer->GroupEventHappens(QUEST_A_RIGHTEOUS_SERMON, me); break; } }
void JustDied(Unit* /*killer*/) { Player* player = GetPlayerForEscort(); if (HasEscortState(STATE_ESCORT_ESCORTING) && player) player->FailQuest(QUEST_BITTER_DEPARTURE); }
void UpdateEscortAI(const uint32 uiDiff) override { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) { if (HasEscortState(STATE_ESCORT_PAUSED)) { if (m_uiEventTimer < uiDiff) { m_uiEventTimer = 7000; switch (m_uiEventCount) { case 0: DoScriptText(SAY_LE_ALMOST, m_creature); break; case 1: DoScriptText(SAY_LE_DRUM, m_creature); break; case 2: if (Creature* pResearcher = GetAvailableResearcher(0)) DoScriptText(SAY_LE_DRUM_REPLY, pResearcher); break; case 3: DoScriptText(SAY_LE_DISCOVERY, m_creature); break; case 4: if (Creature* pResearcher = GetAvailableResearcher(0)) DoScriptText(SAY_LE_DISCOVERY_REPLY, pResearcher); break; case 5: DoScriptText(SAY_LE_NO_LEAVE, m_creature); break; case 6: if (Creature* pResearcher = GetAvailableResearcher(1)) DoScriptText(SAY_LE_NO_LEAVE_REPLY1, pResearcher); break; case 7: if (Creature* pResearcher = GetAvailableResearcher(2)) DoScriptText(SAY_LE_NO_LEAVE_REPLY2, pResearcher); break; case 8: if (Creature* pResearcher = GetAvailableResearcher(3)) DoScriptText(SAY_LE_NO_LEAVE_REPLY3, pResearcher); break; case 9: if (Creature* pResearcher = GetAvailableResearcher(4)) DoScriptText(SAY_LE_NO_LEAVE_REPLY4, pResearcher); break; case 10: DoScriptText(SAY_LE_SHUT, m_creature); break; case 11: if (Creature* pResearcher = GetAvailableResearcher(0)) DoScriptText(SAY_LE_REPLY_HEAR, pResearcher); break; case 12: DoScriptText(SAY_LE_IN_YOUR_FACE, m_creature); m_creature->SummonCreature(NPC_BONE_SIFTER, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_OOC_DESPAWN, 30000); break; case 13: DoScriptText(EMOTE_LE_PICK_UP, m_creature); if (Player* pPlayer = GetPlayerForEscort()) { DoScriptText(SAY_LE_THANKS, m_creature, pPlayer); pPlayer->GroupEventHappens(QUEST_DIGGING_BONES, m_creature); } SetEscortPaused(false); break; } ++m_uiEventCount; } else m_uiEventTimer -= uiDiff; } return; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { _events.Update(diff); if (UpdateVictim()) { while (uint32 eventId = _events.ExecuteEvent()) { switch (eventId) { case EVENT_FROST_SHOCK: DoCastVictim(SPELL_FROST_SHOCK); _events.DelayEvents(1 * IN_MILLISECONDS); _events.ScheduleEvent(EVENT_FROST_SHOCK, 10s, 15s); break; case EVENT_SEARING_TOTEM: DoCast(me, SPELL_SEARING_TOTEM); _events.DelayEvents(1 * IN_MILLISECONDS); _events.ScheduleEvent(EVENT_SEARING_TOTEM, urand(110, 130) * IN_MILLISECONDS); break; case EVENT_STRENGTH_OF_EARTH_TOTEM: DoCast(me, SPELL_STRENGTH_OF_EARTH_TOTEM); _events.DelayEvents(1 * IN_MILLISECONDS); _events.ScheduleEvent(EVENT_STRENGTH_OF_EARTH_TOTEM, urand(110, 130) * IN_MILLISECONDS); break; case EVENT_HEALING_SURGE: { Unit* target = nullptr; if (me->GetHealthPct() < 85) target = me; else if (Player* player = GetPlayerForEscort()) if (player->GetHealthPct() < 85) target = player; if (target) { DoCast(target, SPELL_HEALING_SURGE); _events.ScheduleEvent(EVENT_HEALING_SURGE, 10s); } else _events.ScheduleEvent(EVENT_HEALING_SURGE, 2s); break; } default: break; } } DoMeleeAttackIfReady(); } if (HasEscortState(STATE_ESCORT_NONE)) return; EscortAI::UpdateAI(diff); if (_phase) { if (_moveTimer <= diff) { switch (_phase) { case PHASE_WP_26: //debug skip path to point 26, buggy path calculation me->GetMotionMaster()->MovePoint(WP_DEBUG_2, -2021.77f, -10648.8f, 129.903f, false); _moveTimer = 2 * IN_MILLISECONDS; _phase = PHASE_CONTINUE; break; case PHASE_CONTINUE: // continue escort SetEscortPaused(false); _moveTimer = 0 * IN_MILLISECONDS; _phase = PHASE_NONE; break; case PHASE_WP_22: //debug skip path to point 22, buggy path calculation me->GetMotionMaster()->MovePoint(WP_EXPLOSIVES_FIRST_PLANT, -1958.026f, -10660.465f, 111.547f, false); Talk(SAY_LEGOSO_3); _moveTimer = 2 * IN_MILLISECONDS; _phase = PHASE_PLANT_FIRST_KNEEL; break; case PHASE_PLANT_FIRST_KNEEL: // plant first explosives stage 1 kneel me->SetStandState(UNIT_STAND_STATE_KNEEL); _moveTimer = 10 * IN_MILLISECONDS; _phase = PHASE_PLANT_FIRST_STAND; break; case PHASE_PLANT_FIRST_STAND: // plant first explosives stage 1 stand me->SetStandState(UNIT_STAND_STATE_STAND); _moveTimer = 0.5* IN_MILLISECONDS; _phase = PHASE_PLANT_FIRST_WORK; break; case PHASE_PLANT_FIRST_WORK: // plant first explosives stage 2 work Talk(SAY_LEGOSO_4); _moveTimer = 17.5 * IN_MILLISECONDS; _phase = PHASE_PLANT_FIRST_FINISH; break; case PHASE_PLANT_FIRST_FINISH: // plant first explosives finish _explosivesGuids.clear(); for (uint8 i = 0; i != MAX_EXPLOSIVES; ++i) { if (GameObject* explosive = me->SummonGameObject(GO_DRAENEI_EXPLOSIVES_1, ExplosivesPos[0][i], QuaternionData(), 0)) _explosivesGuids.push_back(explosive->GetGUID()); } me->HandleEmoteCommand(EMOTE_ONESHOT_NONE); // reset anim state // force runoff movement so he will not screw up next waypoint me->GetMotionMaster()->MovePoint(WP_EXPLOSIVES_FIRST_RUNOFF, -1955.6f, -10669.8f, 110.65f, false); Talk(SAY_LEGOSO_5); _moveTimer = 1.5 * IN_MILLISECONDS; _phase = PHASE_CONTINUE; break; case PHASE_PLANT_FIRST_TIMER_1: // first explosives detonate timer 1 Talk(SAY_LEGOSO_6); _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_PLANT_FIRST_TIMER_2; break; case PHASE_PLANT_FIRST_TIMER_2: // first explosives detonate timer 2 Talk(SAY_LEGOSO_7); _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_PLANT_FIRST_TIMER_3; break; case PHASE_PLANT_FIRST_TIMER_3: // first explosives detonate timer 3 Talk(SAY_LEGOSO_8); _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_PLANT_FIRST_DETONATE; break; case PHASE_PLANT_FIRST_DETONATE: // first explosives detonate finish for (GuidList::iterator itr = _explosivesGuids.begin(); itr != _explosivesGuids.end(); ++itr) { if (GameObject* explosive = ObjectAccessor::GetGameObject(*me, *itr)) me->RemoveGameObject(explosive, true); } _explosivesGuids.clear(); me->HandleEmoteCommand(EMOTE_ONESHOT_CHEER); _moveTimer = 2 * IN_MILLISECONDS; _phase = PHASE_PLANT_FIRST_SPEECH; break; case PHASE_PLANT_FIRST_SPEECH: // after detonation 1 speech Talk(SAY_LEGOSO_9); _moveTimer = 4 * IN_MILLISECONDS; _phase = PHASE_PLANT_FIRST_ROTATE; break; case PHASE_PLANT_FIRST_ROTATE: // after detonation 1 rotate to next point me->SetFacingTo(2.272f); _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_PLANT_FIRST_POINT; break; case PHASE_PLANT_FIRST_POINT: // after detonation 1 send point anim and go on to next point me->HandleEmoteCommand(EMOTE_ONESHOT_POINT); _moveTimer = 2 * IN_MILLISECONDS; _phase = PHASE_CONTINUE; break; case PHASE_FEEL_SIRONAS_1: // legoso exclamation before sironas 1.1 Talk(SAY_LEGOSO_10); _moveTimer = 4 * IN_MILLISECONDS; _phase = PHASE_FEEL_SIRONAS_2; break; case PHASE_FEEL_SIRONAS_2: // legoso exclamation before sironas 1.2 Talk(SAY_LEGOSO_11); _moveTimer = 4 * IN_MILLISECONDS; _phase = PHASE_CONTINUE; break; case PHASE_MEET_SIRONAS_ROAR: // legoso exclamation before sironas 2.1 Talk(SAY_LEGOSO_12); _moveTimer = 4 * IN_MILLISECONDS; _phase = PHASE_MEET_SIRONAS_TURN; break; case PHASE_MEET_SIRONAS_TURN: // legoso exclamation before sironas 2.2 if (Player* player = GetPlayerForEscort()) me->SetFacingToObject(player); _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_MEET_SIRONAS_SPEECH; break; case PHASE_MEET_SIRONAS_SPEECH: // legoso exclamation before sironas 2.3 Talk(SAY_LEGOSO_13); _moveTimer = 7 * IN_MILLISECONDS; _phase = PHASE_CONTINUE; break; case PHASE_PLANT_SECOND_KNEEL: // plant second explosives stage 1 kneel me->SetStandState(UNIT_STAND_STATE_KNEEL); _moveTimer = 11 * IN_MILLISECONDS; _phase = PHASE_PLANT_SECOND_SPEECH; break; case PHASE_PLANT_SECOND_SPEECH: // plant second explosives stage 2 kneel Talk(SAY_LEGOSO_14); _moveTimer = 13 * IN_MILLISECONDS; _phase = PHASE_PLANT_SECOND_STAND; break; case PHASE_PLANT_SECOND_STAND: // plant second explosives finish me->SetStandState(UNIT_STAND_STATE_STAND); _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_PLANT_SECOND_FINISH; break; case PHASE_PLANT_SECOND_FINISH: // plant second explosives finish - create explosives _explosivesGuids.clear(); for (uint8 i = 0; i != MAX_EXPLOSIVES; ++i) { if (GameObject* explosive = me->SummonGameObject(GO_DRAENEI_EXPLOSIVES_2, ExplosivesPos[1][i], QuaternionData(), 0)) _explosivesGuids.push_back(explosive->GetGUID()); } Talk(SAY_LEGOSO_15); _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_PLANT_SECOND_WAIT; break; case PHASE_PLANT_SECOND_WAIT: // plant second explosives finish - proceed to next point _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_CONTINUE; break; case PHASE_PLANT_SECOND_TIMER_1: // second explosives detonate timer 1 Talk(SAY_LEGOSO_16); _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_PLANT_SECOND_TIMER_2; break; case PHASE_PLANT_SECOND_TIMER_2: // second explosives detonate timer 2 Talk(SAY_LEGOSO_17); _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_PLANT_SECOND_TIMER_3; break; case PHASE_PLANT_SECOND_TIMER_3: // second explosives detonate timer 3 Talk(SAY_LEGOSO_18); _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_PLANT_SECOND_DETONATE; break; case PHASE_PLANT_SECOND_DETONATE: // second explosives detonate finish for (GuidList::iterator itr = _explosivesGuids.begin(); itr != _explosivesGuids.end(); ++itr) { if (GameObject* explosive = ObjectAccessor::GetGameObject(*me, *itr)) me->RemoveGameObject(explosive, true); } _explosivesGuids.clear(); if (Creature* sironas = me->FindNearestCreature(NPC_SIRONAS, SIZE_OF_GRIDS)) { sironas->SetImmuneToAll(false); me->SetFacingToObject(sironas); } _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_FIGHT_SIRONAS_STOP; break; case PHASE_FIGHT_SIRONAS_STOP: // sironas channel stop if (Creature* sironas = me->FindNearestCreature(NPC_SIRONAS, SIZE_OF_GRIDS)) sironas->AI()->DoAction(ACTION_SIRONAS_CHANNEL_STOP); _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_FIGHT_SIRONAS_SPEECH_1; break; case PHASE_FIGHT_SIRONAS_SPEECH_1: // sironas exclamation before aggro if (Creature* sironas = me->FindNearestCreature(NPC_SIRONAS, SIZE_OF_GRIDS)) sironas->AI()->Talk(SAY_SIRONAS_1); _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_FIGHT_SIRONAS_SPEECH_2; break; case PHASE_FIGHT_SIRONAS_SPEECH_2: // legoso exclamation before aggro if (Creature* sironas = me->FindNearestCreature(NPC_SIRONAS, SIZE_OF_GRIDS)) sironas->SetObjectScale(3.0f); Talk(SAY_LEGOSO_19); _moveTimer = 1 * IN_MILLISECONDS; _phase = PHASE_FIGHT_SIRONAS_START; break; case PHASE_FIGHT_SIRONAS_START: // legoso exclamation at aggro if (Creature* sironas = me->FindNearestCreature(NPC_SIRONAS, SIZE_OF_GRIDS)) { Unit* target = GetPlayerForEscort(); if (!target) target = me; AddThreat(sironas, 0.001f, target); sironas->Attack(target, true); sironas->GetMotionMaster()->MoveChase(target); } _moveTimer = 10 * IN_MILLISECONDS; _phase = PHASE_CONTINUE; break; case PHASE_SIRONAS_SLAIN_SPEECH_1: // legoso exclamation after battle - stage 1.1 Talk(SAY_LEGOSO_20); _moveTimer = 2 * IN_MILLISECONDS; _phase = PHASE_SIRONAS_SLAIN_EMOTE_1; break; case PHASE_SIRONAS_SLAIN_EMOTE_1: // legoso exclamation after battle - stage 1.2 me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); _moveTimer = 2 * IN_MILLISECONDS; _phase = PHASE_SIRONAS_SLAIN_EMOTE_2; break; case PHASE_SIRONAS_SLAIN_EMOTE_2: // legoso exclamation after battle - stage 1.3 if (Player* player = GetPlayerForEscort()) player->GroupEventHappens(QUEST_ENDING_THEIR_WORLD, me); me->HandleEmoteCommand(EMOTE_ONESHOT_CHEER); _moveTimer = 5 * IN_MILLISECONDS; _phase = PHASE_SIRONAS_SLAIN_SPEECH_2; break; case PHASE_SIRONAS_SLAIN_SPEECH_2: // legoso exclamation after battle - stage 2 Talk(SAY_LEGOSO_21); _moveTimer = 30 * IN_MILLISECONDS; _phase = PHASE_CONTINUE; break; default: break; } } else if (!me->IsInCombat()) _moveTimer -= diff; } }
void UpdateEscortAI(const uint32 uiDiff) { if (uiPhaseTimer <= uiDiff) { switch (uiStep) { case 1: if (instance) { if (instance->GetData(DATA_BRANN_EVENT) != NOT_STARTED) return; instance->SetData(DATA_BRANN_EVENT, IN_PROGRESS); } bIsBattle = false; Talk(SAY_ESCORT_START); SetRun(true); JumpToNextStep(0); break; case 3: SetEscortPaused(false); JumpToNextStep(0); break; case 5: if (instance) if (Creature* temp = (Unit::GetCreature(*me, instance->GetData64(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 (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_KADDRAK))) temp->AI()->Talk(SAY_EVENT_A_2_KADD); JumpToNextStep(12500); break; case 8: Talk(SAY_EVENT_A_3); if (instance) instance->HandleGameObject(instance->GetData64(DATA_GO_KADDRAK), true); if (Creature* temp = Unit::GetCreature(*me, uiControllerGUID)) CAST_AI(mob_tribuna_controller::mob_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 (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_MARNAK))) temp->AI()->Talk(SAY_EVENT_B_2_MARN); SpawnDwarf(1); JumpToNextStep(20000); break; case 12: Talk(SAY_EVENT_B_3); if (instance) instance->HandleGameObject(instance->GetData64(DATA_GO_MARNAK), true); if (Creature* temp = Unit::GetCreature(*me, uiControllerGUID)) CAST_AI(mob_tribuna_controller::mob_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 (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_C_2_ABED); SpawnDwarf(1); JumpToNextStep(20000); break; case 18: Talk(SAY_EVENT_C_3); if (instance) instance->HandleGameObject(instance->GetData64(DATA_GO_ABEDNEUM), true); if (Creature* temp = Unit::GetCreature(*me, uiControllerGUID)) CAST_AI(mob_tribuna_controller::mob_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 (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(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 (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(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); if (instance) instance->HandleGameObject(instance->GetData64(DATA_GO_SKY_FLOOR), true); if (Creature* temp = Unit::GetCreature(*me, uiControllerGUID)) temp->DealDamage(temp, temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); bIsBattle = true; SetEscortPaused(false); JumpToNextStep(6500); break; case 29: Talk(SAY_EVENT_END_02); if (instance) instance->SetData(DATA_BRANN_EVENT, DONE); me->CastSpell(me, SPELL_REWARD_ACHIEVEMENT, true); JumpToNextStep(5500); break; case 30: if (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(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 (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(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 (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(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 (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(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 (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(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 (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(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 (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(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 (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(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 (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(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 (instance) if (Creature* temp = Unit::GetCreature(*me, instance->GetData64(DATA_ABEDNEUM))) temp->AI()->Talk(SAY_EVENT_END_21_ABED); JumpToNextStep(5500); break; case 49: { if (instance) { instance->HandleGameObject(instance->GetData64(DATA_GO_KADDRAK), false); instance->HandleGameObject(instance->GetData64(DATA_GO_MARNAK), false); instance->HandleGameObject(instance->GetData64(DATA_GO_ABEDNEUM), false); instance->HandleGameObject(instance->GetData64(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; DoMeleeAttackIfReady(); }
void WaypointReached(uint32 waypointId) { Player* player = GetPlayerForEscort(); if (!player) return; switch (waypointId) { case 0: Talk(SAY1, player->GetGUID()); break; case 4: Talk(WHISP1, player->GetGUID()); break; case 6: Talk(WHISP2, player->GetGUID()); break; case 7: Talk(WHISP3, player->GetGUID()); break; case 8: Talk(WHISP4, player->GetGUID()); break; case 17: Talk(WHISP5, player->GetGUID()); break; case 18: Talk(WHISP6, player->GetGUID()); break; case 19: Talk(WHISP7, player->GetGUID()); break; case 33: Talk(WHISP8, player->GetGUID()); break; case 34: Talk(WHISP9, player->GetGUID()); break; case 35: Talk(WHISP10, player->GetGUID()); break; case 36: Talk(WHISP11, player->GetGUID()); break; case 43: Talk(WHISP12, player->GetGUID()); break; case 44: Talk(WHISP13, player->GetGUID()); break; case 49: Talk(WHISP14, player->GetGUID()); break; case 50: Talk(WHISP15, player->GetGUID()); break; case 51: Talk(WHISP16, player->GetGUID()); break; case 52: Talk(WHISP17, player->GetGUID()); break; case 53: Talk(WHISP18, player->GetGUID()); break; case 54: Talk(WHISP19, player->GetGUID()); break; case 55: Talk(WHISP20, player->GetGUID()); break; case 56: Talk(WHISP21, player->GetGUID()); player->GroupEventHappens(10211, me); break; } }
void JustDied(Unit* pKiller) { if (Player* pPlayer = GetPlayerForEscort()) pPlayer->FailQuest(QUEST_MISSING_IN_ACTION); }
void WaypointReached(uint32 i) { Player* player = GetPlayerForEscort(); if (!player) return; switch (i) { case 0: // DoScriptText(SAY_REM_START, me, player); break; case 5: // DoScriptText(SAY_REM_RAMP1_1, me, player); break; case 6: DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); break; case 9: // DoScriptText(SAY_REM_RAMP1_2, me, player); break; case 14: // DoScriptText(SAY_REM_BOOK, me, player); break; case 15: // DoScriptText(SAY_REM_TENT1_1, me, player); break; case 16: DoSpawnCreature(NPC_GRAVEL_SCOUT, -10.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); DoSpawnCreature(NPC_GRAVEL_BONE, -10.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); break; case 17: // DoScriptText(SAY_REM_TENT1_2, me, player); break; case 26: // DoScriptText(SAY_REM_MOSS, me, player); break; case 27: // DoScriptText(EMOTE_REM_MOSS, me, player); break; case 28: // DoScriptText(SAY_REM_MOSS_PROGRESS, me, player); break; case 29: DoSpawnCreature(NPC_GRAVEL_SCOUT, -15.0f, 3.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); DoSpawnCreature(NPC_GRAVEL_BONE, -15.0f, 5.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); DoSpawnCreature(NPC_GRAVEL_GEO, -15.0f, 7.0f, 0.0f, 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); break; case 31: // DoScriptText(SAY_REM_PROGRESS, me, player); break; case 41: // DoScriptText(SAY_REM_REMEMBER, me, player); break; case 42: // DoScriptText(EMOTE_REM_END, me, player); player->GroupEventHappens(QUEST_ABSENT_MINDED_PT2, me); break; } }
void UpdateEscortAI(const uint32 uiDiff) override { if (m_uiPhaseTimer && m_uiPhaseTimer <= uiDiff) { switch (m_uiStep) { // Begin Event case 0: // TODO, this is wrong, must be "using or similar" m_creature->SetStandState(UNIT_STAND_STATE_KNEEL); m_uiPhaseTimer = 1500; break; case 1: DoScriptText(SAY_EVENT_INTRO_2, m_creature); m_uiPhaseTimer = 2500; break; case 2: if (m_pInstance) m_pInstance->DoUseDoorOrButton(GO_TRIBUNAL_CONSOLE); m_uiPhaseTimer = 6500; break; case 3: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_ABEDNEUM, SAY_EVENT_INTRO_3_ABED); m_uiPhaseTimer = 8500; break; // Activate Kaddrak case 4: DoScriptText(SAY_EVENT_A_1, m_creature); m_uiPhaseTimer = 6500; break; case 5: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_KADDRAK, SAY_EVENT_A_2_KADD); m_uiPhaseTimer = 12500; break; case 6: DoScriptText(SAY_EVENT_A_3, m_creature); m_uiPhaseTimer = 6000; break; case 7: if (m_pInstance) m_pInstance->ActivateFace(FACE_KADDRAK, false); m_uiPhaseTimer = 5000; break; case 8: SpawnDwarf(NPC_DARK_RUNE_PROTECTOR); m_uiPhaseTimer = 20000; break; // Activate Marnak case 9: DoScriptText(SAY_EVENT_B_1, m_creature); m_uiPhaseTimer = 6000; break; case 10: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_MARNAK, SAY_EVENT_B_2_MARN); SpawnDwarf(NPC_DARK_RUNE_PROTECTOR); m_uiPhaseTimer = 20000; break; case 11: DoScriptText(SAY_EVENT_B_3, m_creature); m_uiPhaseTimer = 5000; break; case 12: if (m_pInstance) m_pInstance->ActivateFace(FACE_MARNAK, false); m_uiPhaseTimer = 10000; break; case 13: SpawnDwarf(NPC_DARK_RUNE_PROTECTOR); m_uiPhaseTimer = 10000; break; case 14: SpawnDwarf(NPC_DARK_RUNE_STORMCALLER); m_uiPhaseTimer = (20000); break; case 15: DoScriptText(SAY_EVENT_C_1, m_creature); SpawnDwarf(NPC_DARK_RUNE_PROTECTOR); m_uiPhaseTimer = 10000; break; case 16: SpawnDwarf(NPC_DARK_RUNE_STORMCALLER); m_uiPhaseTimer = 20000; break; // Activate Abedneum case 17: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_ABEDNEUM, SAY_EVENT_C_2_ABED); SpawnDwarf(NPC_DARK_RUNE_PROTECTOR); m_uiPhaseTimer = 20000; break; case 18: DoScriptText(SAY_EVENT_C_3, m_creature); m_uiPhaseTimer = 5000; break; case 19: if (m_pInstance) m_pInstance->ActivateFace(FACE_ABEDNEUM, false); m_uiPhaseTimer = 5000; break; case 20: SpawnDwarf(NPC_DARK_RUNE_STORMCALLER); m_uiPhaseTimer = 10000; break; case 21: SpawnDwarf(NPC_DARK_RUNE_PROTECTOR); m_uiPhaseTimer = 15000; break; case 22: DoScriptText(SAY_EVENT_D_1, m_creature); SpawnDwarf(NPC_IRON_GOLEM_CUSTODIAN); m_uiPhaseTimer = 20000; break; case 23: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_ABEDNEUM, SAY_EVENT_D_2_ABED); SpawnDwarf(NPC_DARK_RUNE_PROTECTOR); m_uiPhaseTimer = 5000; break; case 24: SpawnDwarf(NPC_DARK_RUNE_STORMCALLER); m_uiPhaseTimer = 15000; break; case 25: DoScriptText(SAY_EVENT_D_3, m_creature); SpawnDwarf(NPC_IRON_GOLEM_CUSTODIAN); m_uiPhaseTimer = 5000; break; case 26: SpawnDwarf(NPC_DARK_RUNE_PROTECTOR); m_uiPhaseTimer = 5000; break; case 27: SpawnDwarf(NPC_DARK_RUNE_STORMCALLER); m_uiPhaseTimer = 10000; break; case 28: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_ABEDNEUM, SAY_EVENT_D_4_ABED); SpawnDwarf(NPC_DARK_RUNE_PROTECTOR); m_uiPhaseTimer = 10000; break; // End Event case 29: DoScriptText(SAY_EVENT_END_01, m_creature); m_creature->SetStandState(UNIT_STAND_STATE_STAND);// TODO TODO if (m_pInstance) m_pInstance->SetData(TYPE_TRIBUNAL, SPECIAL); // Kill remaining npcs // ToDo: the loot and the achiev should be triggered at this point // Brann should get the gossip option "There will be plenty of time for this later Brann, we need to get moving!" // This will allow Brann to continue the escort to the last encounter // When reaching the last door he has the gossip "We're with you Brann! Open it!" SetEscortPaused(false); m_uiPhaseTimer = 3000; // break; // case 30: if (m_pInstance) m_pInstance->ActivateFace(FACE_ABEDNEUM, true); m_uiPhaseTimer = 0; break; case 30: DoScriptText(SAY_EVENT_END_02, m_creature); m_uiPhaseTimer = 5500; break; case 31: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_ABEDNEUM, SAY_EVENT_END_03_ABED); m_uiPhaseTimer = 8500; break; case 32: DoScriptText(SAY_EVENT_END_04, m_creature); m_uiPhaseTimer = 11500; break; case 33: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_ABEDNEUM, SAY_EVENT_END_05_ABED); m_uiPhaseTimer = 11500; break; case 34: DoScriptText(SAY_EVENT_END_06, m_creature); m_uiPhaseTimer = 4500; break; case 35: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_ABEDNEUM, SAY_EVENT_END_07_ABED); m_uiPhaseTimer = 22500; break; case 36: DoScriptText(SAY_EVENT_END_08, m_creature); m_uiPhaseTimer = 7500; break; case 37: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_KADDRAK, SAY_EVENT_END_09_KADD); m_uiPhaseTimer = 18500; break; case 38: DoScriptText(SAY_EVENT_END_10, m_creature); m_uiPhaseTimer = 5500; break; case 39: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_KADDRAK, SAY_EVENT_END_11_KADD); m_uiPhaseTimer = 20500; break; case 40: DoScriptText(SAY_EVENT_END_12, m_creature); m_uiPhaseTimer = 2500; break; case 41: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_KADDRAK, SAY_EVENT_END_13_KADD); m_uiPhaseTimer = 19500; break; case 42: DoScriptText(SAY_EVENT_END_14, m_creature); m_uiPhaseTimer = 10500; break; case 43: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_MARNAK, SAY_EVENT_END_15_MARN); m_uiPhaseTimer = 6500; break; case 44: DoScriptText(SAY_EVENT_END_16, m_creature); m_uiPhaseTimer = 6500; break; case 45: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_MARNAK, SAY_EVENT_END_17_MARN); m_uiPhaseTimer = 25500; break; case 46: DoScriptText(SAY_EVENT_END_18, m_creature); m_uiPhaseTimer = 23500; break; case 47: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_MARNAK, SAY_EVENT_END_19_MARN); m_uiPhaseTimer = 3500; break; case 48: DoScriptText(SAY_EVENT_END_20, m_creature); m_uiPhaseTimer = 8500; break; case 49: if (m_pInstance) m_pInstance->DoFaceSpeak(FACE_ABEDNEUM, SAY_EVENT_END_21_ABED); m_uiPhaseTimer = 5500; break; case 50: { if (m_pInstance) { m_pInstance->DoUseDoorOrButton(GO_TRIBUNAL_FLOOR); m_pInstance->SetData(TYPE_TRIBUNAL, DONE); } Player* pPlayer = GetPlayerForEscort(); if (pPlayer) pPlayer->GroupEventHappens(QUEST_HALLS_OF_STONE, m_creature); m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER); m_uiPhaseTimer = 180000; break; } case 51: SetEscortPaused(false); break; } ++m_uiStep; } else if (m_uiPhaseTimer) m_uiPhaseTimer -= uiDiff; if (!m_bIsLowHP && m_creature->GetHealthPercent() < 30) { DoScriptText(SAY_LOW_HEALTH, m_creature); m_bIsLowHP = true; } else if (m_bIsLowHP && m_creature->GetHealthPercent() > 30) m_bIsLowHP = false; // No Combat abilities needed here if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; }
void UpdateAI(uint32 uiDiff) { if (uiPhase) { if (uiTimer <= uiDiff) { switch (uiPhase) { case 1: Talk(SAY_QUEST_ACCEPT_ATTACK); uiTimer = 3000; uiPhase = 2; break; case 2: if (Creature* pTyrion = me->FindNearestCreature(NPC_TYRION, 10.0f)) pTyrion->AI()->Talk(SAY_TYRION_1); uiTimer = 3000; uiPhase = 3; break; case 3: me->UpdateEntry(NPC_PRIESTESS_TYRIONA, ALLIANCE); uiTimer = 2000; uiPhase = 4; break; case 4: SetEscortPaused(false); uiPhase = 0; uiTimer = 0; break; case 5: if (Creature* pGuard = me->FindNearestCreature(NPC_STORMWIND_ROYAL, 10.0f, true)) pGuard->AI()->Talk(SAY_GUARD_1); uiTimer = 3000; uiPhase = 6; break; case 6: Talk(SAY_SPYBOT_2); uiTimer = 3000; uiPhase = 7; break; case 7: SetEscortPaused(false); uiTimer = 0; uiPhase = 0; break; case 8: if (Creature* pLescovar = me->FindNearestCreature(NPC_LORD_GREGOR_LESCOVAR, 10.0f)) pLescovar->AI()->Talk(SAY_LESCOVAR_1); uiTimer = 3000; uiPhase = 9; break; case 9: Talk(SAY_SPYBOT_4); uiTimer = 3000; uiPhase = 10; break; case 10: if (Creature* pLescovar = me->FindNearestCreature(NPC_LORD_GREGOR_LESCOVAR, 10.0f)) { if (Player* player = GetPlayerForEscort()) { CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->Start(false, false, player->GetGUID()); CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, pLescovar->AI())->SetMaxPlayerDistance(200.0f); } } me->DisappearAndDie(); uiTimer = 0; uiPhase = 0; break; } } else uiTimer -= uiDiff; } npc_escortAI::UpdateAI(uiDiff); if (!UpdateVictim()) return; DoMeleeAttackIfReady(); }
void WaypointReached(uint32 waypointId) override { if (Player* player = GetPlayerForEscort()) { switch (waypointId) { case 0: Talk(WHISPER_CUSTODIAN_1, player); break; case 1: Talk(WHISPER_CUSTODIAN_2, player); break; case 2: Talk(WHISPER_CUSTODIAN_3, player); break; case 3: Talk(WHISPER_CUSTODIAN_4, player); break; case 5: Talk(WHISPER_CUSTODIAN_5, player); break; case 6: Talk(WHISPER_CUSTODIAN_6, player); break; case 7: Talk(WHISPER_CUSTODIAN_7, player); break; case 8: Talk(WHISPER_CUSTODIAN_8, player); break; case 9: Talk(WHISPER_CUSTODIAN_9, player); break; case 10: Talk(WHISPER_CUSTODIAN_4, player); break; case 13: Talk(WHISPER_CUSTODIAN_10, player); break; case 14: Talk(WHISPER_CUSTODIAN_4, player); break; case 16: Talk(WHISPER_CUSTODIAN_11, player); break; case 17: Talk(WHISPER_CUSTODIAN_12, player); break; case 18: Talk(WHISPER_CUSTODIAN_4, player); break; case 22: Talk(WHISPER_CUSTODIAN_13, player); break; case 23: Talk(WHISPER_CUSTODIAN_4, player); break; case 24: Talk(WHISPER_CUSTODIAN_14, player); DoCast(player, SPELL_QID_10277); // below here is temporary workaround, to be removed when spell works properly player->AreaExploredOrEventHappens(QUEST_CAVERNS_OF_TIME); break; } } }
void JustSummoned(Creature* summoned) { if (Player* player = GetPlayerForEscort()) summoned->AI()->AttackStart(player); }
void WaypointReached(uint32 waypointId) override { switch (waypointId) { case 8: SetRun(false); me->SummonCreature(18764, 2181.87f, 112.46f, 89.45f, 0.26f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); break; case 9: Talk(SAY_TH_ARMORY); me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, THRALL_WEAPON_ITEM); //me->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, THRALL_WEAPON_INFO); //me->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+1, 781); me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, THRALL_SHIELD_ITEM); //me->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, THRALL_SHIELD_INFO); //me->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+3, 1038); break; case 10: me->SetDisplayId(THRALL_MODEL_EQUIPPED); break; case 11: SetRun(); break; case 15: me->SummonCreature(NPC_RIFLE, 2200.28f, 137.37f, 87.93f, 5.07f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_WARDEN, 2197.44f, 131.83f, 87.93f, 0.78f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_VETERAN, 2203.62f, 135.40f, 87.93f, 3.70f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_VETERAN, 2200.75f, 130.13f, 87.93f, 1.48f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); break; case 21: me->SummonCreature(NPC_RIFLE, 2135.80f, 154.01f, 67.45f, 4.98f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_WARDEN, 2144.36f, 151.87f, 67.74f, 4.46f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_VETERAN, 2142.12f, 154.41f, 67.12f, 4.56f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_VETERAN, 2138.08f, 155.38f, 67.24f, 4.60f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); break; case 25: me->SummonCreature(NPC_RIFLE, 2102.98f, 192.17f, 65.24f, 6.02f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_WARDEN, 2108.48f, 198.75f, 65.18f, 5.15f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_VETERAN, 2106.11f, 197.29f, 65.18f, 5.63f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_VETERAN, 2104.18f, 194.82f, 65.18f, 5.75f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); break; case 29: Talk(SAY_TH_SKARLOC_MEET); me->SummonCreature(ENTRY_SCARLOC, 2036.48f, 271.22f, 63.43f, 5.27f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000); //temporary, skarloc should rather be triggered to walk up to thrall break; case 30: SetEscortPaused(true); me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); SetRun(false); break; case 31: Talk(SAY_TH_MOUNTS_UP); DoMount(); SetRun(); break; case 37: //possibly regular patrollers? If so, remove this and let database handle them me->SummonCreature(NPC_WATCHMAN, 2124.26f, 522.16f, 56.87f, 3.99f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_WATCHMAN, 2121.69f, 525.37f, 57.11f, 4.01f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_SENTRY, 2124.65f, 524.55f, 56.63f, 3.98f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); break; case 59: me->SummonCreature(SKARLOC_MOUNT, 2488.64f, 625.77f, 58.26f, 4.71f, TEMPSUMMON_TIMED_DESPAWN, 10000); DoUnmount(); HadMount = false; SetRun(false); break; case 60: me->HandleEmoteCommand(EMOTE_ONESHOT_EXCLAMATION); //make horsie run off SetEscortPaused(true); me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); instance->SetData(TYPE_THRALL_PART2, DONE); SetRun(); break; case 64: SetRun(false); break; case 68: me->SummonCreature(NPC_BARN_PROTECTOR, 2500.22f, 692.60f, 55.50f, 2.84f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_BARN_LOOKOUT, 2500.13f, 696.55f, 55.51f, 3.38f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_BARN_GUARDSMAN, 2500.55f, 693.64f, 55.50f, 3.14f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_BARN_GUARDSMAN, 2500.94f, 695.81f, 55.50f, 3.14f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); break; case 71: SetRun(); break; case 81: SetRun(false); break; case 83: me->SummonCreature(NPC_CHURCH_PROTECTOR, 2627.33f, 646.82f, 56.03f, 4.28f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 5000); me->SummonCreature(NPC_CHURCH_LOOKOUT, 2624.14f, 648.03f, 56.03f, 4.50f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 5000); me->SummonCreature(NPC_CHURCH_GUARDSMAN, 2625.32f, 649.60f, 56.03f, 4.38f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 5000); me->SummonCreature(NPC_CHURCH_GUARDSMAN, 2627.22f, 649.00f, 56.03f, 4.34f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 5000); break; case 84: Talk(SAY_TH_CHURCH_END); SetRun(); break; case 91: me->SetWalk(true); SetRun(false); break; case 93: me->SummonCreature(NPC_INN_PROTECTOR, 2652.71f, 660.31f, 61.93f, 1.67f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_INN_LOOKOUT, 2648.96f, 662.59f, 61.93f, 0.79f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_INN_GUARDSMAN, 2657.36f, 662.34f, 61.93f, 2.68f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); me->SummonCreature(NPC_INN_GUARDSMAN, 2656.39f, 659.77f, 61.93f, 2.61f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); break; case 94: if (uint64 TarethaGUID = instance->GetData64(DATA_TARETHA)) { if (Creature* Taretha = Creature::GetCreature(*me, TarethaGUID)) Taretha->AI()->Talk(SAY_TA_ESCAPED, me); } break; case 95: Talk(SAY_TH_MEET_TARETHA); instance->SetData(TYPE_THRALL_PART3, DONE); SetEscortPaused(true); break; case 96: Talk(SAY_TH_EPOCH_WONDER); break; case 97: Talk(SAY_TH_EPOCH_KILL_TARETHA); SetRun(); break; case 98: //trigger epoch Yell("Thrall! Come outside and face your fate! ....") //from here, thrall should not never be allowed to move to point 106 which he currently does. break; case 106: { //trigger taretha to run down outside if (Creature* Taretha = instance->instance->GetCreature(instance->GetData64(DATA_TARETHA))) { if (Player* player = GetPlayerForEscort()) CAST_AI(npc_escortAI, (Taretha->AI()))->Start(false, true, player->GetGUID()); } //kill credit Creature for quest Map* map = me->GetMap(); Map::PlayerList const& players = map->GetPlayers(); if (!players.isEmpty() && map->IsDungeon()) { for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { if (Player* player = itr->GetSource()) player->KilledMonsterCredit(20156, 0); } } //alot will happen here, thrall and taretha talk, erozion appear at spot to explain me->SummonCreature(EROZION_ENTRY, 2646.47f, 680.416f, 55.38f, 4.16f, TEMPSUMMON_TIMED_DESPAWN, 120000); } break; case 108: //last waypoint, just set Thrall invisible, respawn is turned off me->SetVisible(false); break; } }
void JustDied(Unit* /*killer*/) { if (Player* player = GetPlayerForEscort()) player->FailQuest(Q_ALMABTRIEB); }
void Aggro(Unit*) { if (HasEscortState(STATE_ESCORT_ESCORTING)) me->Say(SAY_AGGRO1, LANG_UNIVERSAL, GetPlayerForEscort()->GetGUID()); else me->Say(SAY_AGGRO2, LANG_UNIVERSAL, 0); }
void JustDied(Unit* /*pKiller*/) { Player* pPlayer = GetPlayerForEscort(); if (pPlayer) pPlayer->FailQuest(QUEST_MARK_V_IS_ALIVE); }
void UpdateEscortAI(const uint32 uiDiff) { if (m_uiRandomTalkCooldown) { if (m_uiRandomTalkCooldown <= uiDiff) m_uiRandomTalkCooldown = 0; else m_uiRandomTalkCooldown -= uiDiff; } if (HasEscortState(STATE_ESCORT_PAUSED)) { if (m_uiTalkTimer <= uiDiff) { ++m_uiTalkCount; m_uiTalkTimer = 7500; Player* pPlayer = GetPlayerForEscort(); if (!pPlayer) return; switch(m_uiPointId) { case 5: //to lower city { switch(m_uiTalkCount) { case 1: DoScriptText(SAY_KHAD_SERV_1, m_creature, pPlayer); break; case 2: DoScriptText(SAY_KHAD_SERV_2, m_creature, pPlayer); break; case 3: DoScriptText(SAY_KHAD_SERV_3, m_creature, pPlayer); break; case 4: DoScriptText(SAY_KHAD_SERV_4, m_creature, pPlayer); SetEscortPaused(false); break; } break; } case 24: //in lower city { switch(m_uiTalkCount) { case 5: if (Creature* pShanir = GetClosestCreatureWithEntry(m_creature, NPC_SHANIR, 15.0f)) DoScriptText(SAY_KHAD_INJURED, pShanir, pPlayer); DoScriptText(SAY_KHAD_SERV_5, m_creature, pPlayer); break; case 6: DoScriptText(SAY_KHAD_SERV_6, m_creature, pPlayer); break; case 7: DoScriptText(SAY_KHAD_SERV_7, m_creature, pPlayer); SetEscortPaused(false); break; } break; } case 50: //outside { switch(m_uiTalkCount) { case 8: DoScriptText(SAY_KHAD_SERV_8, m_creature, pPlayer); break; case 9: DoScriptText(SAY_KHAD_SERV_9, m_creature, pPlayer); break; case 10: DoScriptText(SAY_KHAD_SERV_10, m_creature, pPlayer); break; case 11: DoScriptText(SAY_KHAD_SERV_11, m_creature, pPlayer); SetEscortPaused(false); break; } break; } case 63: //scryer { switch(m_uiTalkCount) { case 12: DoScriptText(SAY_KHAD_SERV_12, m_creature, pPlayer); break; case 13: DoScriptText(SAY_KHAD_SERV_13, m_creature, pPlayer); SetEscortPaused(false); break; } break; } case 74: //aldor { switch(m_uiTalkCount) { case 14: DoScriptText(SAY_KHAD_SERV_14, m_creature, pPlayer); break; case 15: DoScriptText(SAY_KHAD_SERV_15, m_creature, pPlayer); break; case 16: DoScriptText(SAY_KHAD_SERV_16, m_creature, pPlayer); break; case 17: DoScriptText(SAY_KHAD_SERV_17, m_creature, pPlayer); SetEscortPaused(false); break; } break; } case 75: //a'dal { switch(m_uiTalkCount) { case 18: DoScriptText(SAY_KHAD_SERV_18, m_creature, pPlayer); break; case 19: DoScriptText(SAY_KHAD_SERV_19, m_creature, pPlayer); break; case 20: DoScriptText(SAY_KHAD_SERV_20, m_creature, pPlayer); break; case 21: DoScriptText(SAY_KHAD_SERV_21, m_creature, pPlayer); pPlayer->AreaExploredOrEventHappens(QUEST_CITY_LIGHT); SetEscortPaused(false); break; } break; } } } else m_uiTalkTimer -= uiDiff; } }