void UpdateAI(const uint32 uiDiff) override { m_councilDialogue.DialogueUpdate(uiDiff); if (m_uiAggroYellTimer) { if (m_uiAggroYellTimer <= uiDiff) { // Start yells m_councilDialogue.StartNextDialogueText(SAY_GATH_AGGRO); m_uiAggroYellTimer = 0; } else m_uiAggroYellTimer -= uiDiff; } if (m_uiEnrageTimer) { if (m_uiEnrageTimer <= uiDiff) { // Cast berserk on all members for (unsigned int i : aCouncilMember) { if (Creature* pMember = m_pInstance->GetSingleCreatureFromStorage(i)) pMember->CastSpell(pMember, SPELL_BERSERK, TRIGGERED_OLD_TRIGGERED); } // Start yells m_councilDialogue.StartNextDialogueText(SAY_GATH_BERSERK); m_uiEnrageTimer = 0; } else m_uiEnrageTimer -= uiDiff; } }
void ReceiveAIEvent(AIEventType eventType, Creature* /*pSender*/, Unit* pInvoker, uint32 uiMiscValue) override { if (!m_bHasDoneIntro && eventType == AI_EVENT_START_EVENT) { m_introDialogue.StartNextDialogueText(SAY_GREET1); m_bHasDoneIntro = true; } }
void MoveInLineOfSight(Unit* pWho) override { if (!m_bHasTaunted && pWho->GetTypeId() == TYPEID_PLAYER && m_creature->IsWithinDistInMap(pWho, 110.0f) && m_creature->IsWithinLOSInMap(pWho)) { m_introDialogue.StartNextDialogueText(SAY_GREET); m_bHasTaunted = true; } ScriptedAI::MoveInLineOfSight(pWho); }
void UpdateAI(const uint32 uiDiff) override { m_introDialogue.DialogueUpdate(uiDiff); if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; // Impale if (m_uiImpaleTimer < uiDiff) { // Cast Impale on a random target // Do NOT cast it when we are afflicted by locust swarm if (!m_creature->HasAura(SPELL_LOCUSTSWARM) && !m_creature->HasAura(SPELL_LOCUSTSWARM_H)) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0)) DoCastSpellIfCan(pTarget, m_bIsRegularMode ? SPELL_IMPALE : SPELL_IMPALE_H); } m_uiImpaleTimer = 15000; } else m_uiImpaleTimer -= uiDiff; // Locust Swarm if (m_uiLocustSwarmTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, m_bIsRegularMode ? SPELL_LOCUSTSWARM : SPELL_LOCUSTSWARM_H) == CAST_OK) { DoScriptText(EMOTE_INSECT_SWARM, m_creature); // Summon a crypt guard m_uiSummonTimer = 3000; m_uiLocustSwarmTimer = 100000; } } else m_uiLocustSwarmTimer -= uiDiff; // Summon if (m_uiSummonTimer) { if (m_uiSummonTimer <= uiDiff) { // Workaround for the not existing spell m_creature->SummonCreature(NPC_CRYPT_GUARD, aCryptGuardLoc[0], aCryptGuardLoc[1], aCryptGuardLoc[2], aCryptGuardLoc[3], TEMPSUMMON_TIMED_OOC_OR_DEAD_DESPAWN, 30000); m_uiSummonTimer = 0; } else m_uiSummonTimer -= uiDiff; } DoMeleeAttackIfReady(); }
void GameMap::triggerPlot(int triggerPlotId, const char *dialogueFileName){ if (triggerPlotId != 0) { DialogueHelper* dialogueHelper = DialogueHelper::parseWithFile(dialogueFileName); auto dialogue = dialogueHelper->getDialogueById(triggerPlotId); if (!dialogue.empty()){ auto parentNode = this->getParent(); dialogueManager->showDialogue(parentNode); isShowDialogue = true; auto type = dialogue.at(0).type; if (type == DialogueType::string){ //文本类型 DialogueHelper::updateDialogueText(dialogue.at(0).content.c_str()); } else if (type == DialogueType::option){ //选项类型 DialogueHelper::updateDialogueOptions(dialogue.at(0).options); } GameMap::dialogueIndex = 1; addDialogueTouchEvent(dialogue); } } }
void UpdateAI(const uint32 uiDiff) override { if (m_pInstance && m_pInstance->GetData(TYPE_EREDAR_TWINS) == SPECIAL) { if (!m_bDidIntro) { m_introDialogue.StartNextDialogueText(SAY_INTRO_1); m_bDidIntro = true; } m_introDialogue.DialogueUpdate(uiDiff); } if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (m_uiEnrageTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_TWINS_ENRAGE) == CAST_OK) { DoScriptText(SAY_ALYTHESS_BERSERK, m_creature); m_uiEnrageTimer = 6 * MINUTE * IN_MILLISECONDS; } } else m_uiEnrageTimer -= uiDiff; if (m_uiPyrogenicsTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_PYROGENICS) == CAST_OK) m_uiPyrogenicsTimer = urand(25000, 30000); } else m_uiPyrogenicsTimer -= uiDiff; if (m_uiConflagrationTimer < uiDiff) { Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_TOPAGGRO, 3); if (!pTarget) pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); // If sister is dead cast shadownova instead of conflagration bool bSwitchSpell = m_creature->HasAura(SPELL_EMPOWER); if (DoCastSpellIfCan(pTarget, bSwitchSpell ? SPELL_SHADOW_NOVA : SPELL_CONFLAGRATION) == CAST_OK) { if (!bSwitchSpell) DoScriptText(SAY_ALYTHESS_CANFLAGRATION, m_creature); m_uiConflagrationTimer = urand(20000, 25000); } } else m_uiConflagrationTimer -= uiDiff; if (m_uiFlameSearTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_FLAME_SEAR) == CAST_OK) m_uiFlameSearTimer = 10000; } else m_uiFlameSearTimer -= uiDiff; if (m_uiBlazeTimer < uiDiff) { if (DoCastSpellIfCan(m_creature->getVictim(), SPELL_BLAZE) == CAST_OK) m_uiBlazeTimer = 3000; } else m_uiBlazeTimer -= uiDiff; }