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;
    }