void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (TreeForm_Timer <= diff) { DoScriptText(RAND(SAY_TREE_1,SAY_TREE_2), me); if (me->IsNonMeleeSpellCasted(false)) me->InterruptNonMeleeSpells(true); me->RemoveAllAuras(); DoCast(me, SPELL_SUMMON_FRAYER, true); DoCast(me, SPELL_TRANQUILITY, true); DoCast(me, SPELL_TREE_FORM, true); me->GetMotionMaster()->MoveIdle(); MoveFree = false; TreeForm_Timer = 75000; } else TreeForm_Timer -= diff; if (!MoveFree) { if (MoveCheck_Timer <= diff) { if (!Adds_List.empty()) { for (std::list<uint64>::iterator itr = Adds_List.begin(); itr != Adds_List.end(); ++itr) { if (Unit *temp = Unit::GetUnit(*me,*itr)) { if (!temp->isAlive()) { Adds_List.erase(itr); ++DeadAddsCount; break; } } } } if (DeadAddsCount < 3 && TreeForm_Timer-30000 <= diff) DeadAddsCount = 3; if (DeadAddsCount >= 3) { Adds_List.clear(); DeadAddsCount = 0; me->InterruptNonMeleeSpells(true); me->RemoveAllAuras(); me->GetMotionMaster()->MoveChase(me->getVictim()); MoveFree = true; } MoveCheck_Timer = 500; } else MoveCheck_Timer -= diff; return; } /*if (me->HasAura(SPELL_TREE_FORM,0) || me->HasAura(SPELL_TRANQUILITY,0)) return;*/ //one random seedling every 5 secs, but not in tree form if (SummonSeedling_Timer <= diff) { DoSummonSeedling(); SummonSeedling_Timer = 6000; } else SummonSeedling_Timer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) override { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) { return; } if (m_uiTreeFormTimer < uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_TRANQUILITY) == CAST_OK) { // Note: This should remove only negative auras m_creature->RemoveAllAuras(); DoCastSpellIfCan(m_creature, SPELL_TREE_FORM, CAST_TRIGGERED); DoScriptText(urand(0, 1) ? SAY_TREE_1 : SAY_TREE_2, m_creature); m_creature->GetMotionMaster()->MoveIdle(); m_bCanMoveFree = false; m_uiFrayerTimer = 1000; m_uiTreeFormEndTimer = 45000; m_uiTreeFormTimer = 75000; } } else { m_uiTreeFormTimer -= uiDiff; } // The Frayer is summoned after one second in the tree phase if (m_uiFrayerTimer) { if (m_uiFrayerTimer <= uiDiff) { if (DoCastSpellIfCan(m_creature, SPELL_SUMMON_FRAYER, CAST_TRIGGERED) == CAST_OK) { m_uiFrayerTimer = 0; } } else { m_uiFrayerTimer -= uiDiff; } } // Tree phase will be removed when the timer expires; if (m_uiTreeFormEndTimer) { if (m_uiTreeFormEndTimer <= uiDiff) { if (m_creature->getVictim()) { m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); } m_bCanMoveFree = true; m_uiTreeFormEndTimer = 0; } else { m_uiTreeFormEndTimer -= uiDiff; } } // Don't do any other actions during tree form if (!m_bCanMoveFree) { return; } // one random seedling every 5 secs, but not in tree form if (m_uiSummonSeedlingTimer < uiDiff) { DoSummonSeedling(); m_uiSummonSeedlingTimer = 6000; } else { m_uiSummonSeedlingTimer -= uiDiff; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; if (TreeForm_Timer <= diff) { Talk(SAY_TREE); if (me->IsNonMeleeSpellCast(false)) me->InterruptNonMeleeSpells(true); me->RemoveAllAuras(); DoCast(me, SPELL_SUMMON_FRAYER, true); DoCast(me, SPELL_TRANQUILITY, true); DoCast(me, SPELL_TREE_FORM, true); me->GetMotionMaster()->MoveIdle(); MoveFree = false; TreeForm_Timer = 75000; } else TreeForm_Timer -= diff; if (!MoveFree) { if (MoveCheck_Timer <= diff) { for (SummonList::iterator itr = summons.begin(); itr != summons.end(); ++itr) { if (Unit* temp = ObjectAccessor::GetUnit(*me, *itr)) { if (!temp->IsAlive()) { summons.erase(itr); ++DeadAddsCount; break; } } } if (DeadAddsCount < 3 && TreeForm_Timer-30000 <= diff) DeadAddsCount = 3; if (DeadAddsCount >= 3) { summons.DespawnAll(); DeadAddsCount = 0; me->InterruptNonMeleeSpells(true); me->RemoveAllAuras(); me->GetMotionMaster()->MoveChase(me->GetVictim()); MoveFree = true; } MoveCheck_Timer = 500; } else MoveCheck_Timer -= diff; return; } /*if (me->HasAura(SPELL_TREE_FORM, 0) || me->HasAura(SPELL_TRANQUILITY, 0)) return;*/ //one random seedling every 5 secs, but not in tree form if (SummonSeedling_Timer <= diff) { DoSummonSeedling(); SummonSeedling_Timer = 6000; } else SummonSeedling_Timer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (TreeForm_Timer < diff) { DoScriptText(urand(0, 1) ? SAY_TREE_1 : SAY_TREE_2, m_creature); if (m_creature->IsNonMeleeSpellCasted(false)) m_creature->InterruptNonMeleeSpells(true); m_creature->RemoveAllAuras(); DoCastSpellIfCan(m_creature, SPELL_SUMMON_FRAYER, CAST_TRIGGERED); DoCastSpellIfCan(m_creature, SPELL_TRANQUILITY, CAST_TRIGGERED); DoCastSpellIfCan(m_creature, SPELL_TREE_FORM, CAST_TRIGGERED); m_creature->GetMotionMaster()->MoveIdle(); MoveFree = false; TreeForm_Timer = 75000; }else TreeForm_Timer -= diff; if (!MoveFree) { if (MoveCheck_Timer < diff) { for(GUIDList::iterator itr = Adds_List.begin(); itr != Adds_List.end(); ++itr) { if (Creature* pTemp = m_creature->GetMap()->GetCreature(*itr)) { if (!pTemp->isAlive()) { Adds_List.erase(itr); ++DeadAddsCount; break; } } } if (DeadAddsCount < 3 && TreeForm_Timer-30000 < diff) DeadAddsCount = 3; if (DeadAddsCount >= 3) { Adds_List.clear(); DeadAddsCount = 0; m_creature->InterruptNonMeleeSpells(true); m_creature->RemoveAllAuras(); m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); MoveFree = true; } MoveCheck_Timer = 500; } else MoveCheck_Timer -= diff; return; } /*if (m_creature->HasAura(SPELL_TREE_FORM, EFFECT_INDEX_0) || m_creature->HasAura(SPELL_TRANQUILITY, EFFECT_INDEX_0)) return;*/ //one random seedling every 5 secs, but not in tree form if (SummonSeedling_Timer < diff) { DoSummonSeedling(); SummonSeedling_Timer = 6000; }else SummonSeedling_Timer -= diff; DoMeleeAttackIfReady(); }