void UpdateAI(const uint32 diff) { if (!PlayerGUID || !EventStarted) return; if (WaveCount < 4) { if (!Announced && AnnounceTimer <= diff) { DoScriptText(WavesInfo[WaveCount].WaveTextId, me); Announced = true; } else AnnounceTimer -= diff; if (WaveTimer <= diff) SummonNextWave(); else WaveTimer -= diff; } CheckEventFail(); if (WaveCount == 4 || Failed) EnterEvadeMode(); };
void hyjalAI::UpdateAI(const uint32 uiDiff) { if (!m_bIsEventInProgress) return; if (m_bIsSummoningWaves && m_pInstance) { if (m_uiWaveMoveTimer < uiDiff) { // Skip the master timer, and start next wave in 5. Clear the list, it should not be any here now. if (!m_pInstance->GetData(DATA_TRASH)) { lWaveMobGUIDList.clear(); m_uiNextWaveTimer = 5000; } if (!lWaveMobGUIDList.empty()) { for(std::list<uint64>::iterator itr = lWaveMobGUIDList.begin(); itr != lWaveMobGUIDList.end(); ++itr) { if (Creature* pTemp = m_pInstance->instance->GetCreature(*itr)) { if (!pTemp->isAlive() || pTemp->getVictim()) continue; pTemp->RemoveSplineFlag(SPLINEFLAG_WALKMODE); pTemp->GetMotionMaster()->MovePoint(1, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ()); } } } m_uiWaveMoveTimer = 10000; } else m_uiWaveMoveTimer -= uiDiff; if (m_uiNextWaveTimer < uiDiff) SummonNextWave(); else m_uiNextWaveTimer -= uiDiff; } if (m_uiCheckTimer < uiDiff) { for(uint8 i = 0; i < 2; ++i) { if (m_uiBossGUID[i]) { Creature* pBoss = m_creature->GetMap()->GetCreature(m_uiBossGUID[i]); if (pBoss && !pBoss->isAlive()) { if (m_uiBossGUID[i] == m_uiBossGUID[0]) { DoTalk(INCOMING); m_bIsFirstBossDead = true; } else if (m_uiBossGUID[i] == m_uiBossGUID[1]) { DoTalk(SUCCESS); m_bIsSecondBossDead = true; } m_bIsEventInProgress = false; m_uiCheckTimer = 0; m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); m_uiBossGUID[i] = 0; // Reset world state for enemies to disable it m_pInstance->DoUpdateWorldState(WORLD_STATE_ENEMY, 0); } } } m_uiCheckTimer = 5000; } else m_uiCheckTimer -= uiDiff; if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; for(uint8 i = 0; i < MAX_SPELL; ++i) { if (m_aSpells[i].m_uiSpellId) { if (m_uiSpellTimer[i] < uiDiff) { if (m_creature->IsNonMeleeSpellCasted(false)) m_creature->InterruptNonMeleeSpells(false); Unit* pTarget = NULL; switch(m_aSpells[i].m_pType) { case TARGETTYPE_SELF: pTarget = m_creature; break; case TARGETTYPE_RANDOM: pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); break; case TARGETTYPE_VICTIM: pTarget = m_creature->getVictim(); break; } if (pTarget) { DoCastSpellIfCan(pTarget, m_aSpells[i].m_uiSpellId); m_uiSpellTimer[i] = m_aSpells[i].m_uiCooldown; } } else m_uiSpellTimer[i] -= uiDiff; } } DoMeleeAttackIfReady(); }
void hyjalAI::UpdateAI(uint32 diff) { if (IsDummy) { if (MassTeleportTimer < diff && DoMassTeleport) { DoCast(me, SPELL_MASS_TELEPORT, false); DoMassTeleport = false; } else MassTeleportTimer -= diff; return; } if (DoHide) { DoHide = false; switch (me->GetEntry()) { case JAINA: if (instance && instance->GetData(DATA_ALLIANCE_RETREAT)) { me->SetVisible(false); HideNearPos(me->GetPositionX(), me->GetPositionY()); HideNearPos(5037.76f, -1889.71f); for (uint8 i = 0; i < 92; ++i)//summon fires me->SummonGameObject(FLAMEOBJECT, AllianceFirePos[i][0], AllianceFirePos[i][1], AllianceFirePos[i][2], AllianceFirePos[i][3], AllianceFirePos[i][4], AllianceFirePos[i][5], AllianceFirePos[i][6], AllianceFirePos[i][7], 0); } else me->SetVisible(true); break; case THRALL: //thrall if (instance && instance->GetData(DATA_HORDE_RETREAT)) { me->SetVisible(false); HideNearPos(me->GetPositionX(), me->GetPositionY()); HideNearPos(5563, -2763.19f); HideNearPos(5542.2f, -2629.36f); for (uint8 i = 0; i < 65; ++i)//summon fires me->SummonGameObject(FLAMEOBJECT, HordeFirePos[i][0], HordeFirePos[i][1], HordeFirePos[i][2], HordeFirePos[i][3], HordeFirePos[i][4], HordeFirePos[i][5], HordeFirePos[i][6], HordeFirePos[i][7], 0); } else me->SetVisible(true); break; } } if (DoRespawn) { if (RespawnTimer <= diff) { DoRespawn = false; RespawnNearPos(me->GetPositionX(), me->GetPositionY()); if (Faction == 0) { RespawnNearPos(5037.76f, -1889.71f); } else if (Faction == 1) { RespawnNearPos(5563, -2763.19f); RespawnNearPos(5542.2f, -2629.36f); } me->SetVisible(true); }else{ RespawnTimer -= diff; me->SetVisible(false); } return; } if (Overrun) DoOverrun(Faction, diff); if (bRetreat) { if (RetreatTimer <= diff) { IsDummy = true; bRetreat = false; HideNearPos(me->GetPositionX(), me->GetPositionY()); switch (me->GetEntry()) { case JAINA://jaina HideNearPos(5037.76f, -1889.71f); break; case THRALL://thrall HideNearPos(5563, -2763.19f); HideNearPos(5542.2f, -2629.36f); HideNearPos(5603.75f, -2853.12f); break; } me->SetVisible(false); } else RetreatTimer -= diff; } if (!EventBegun) return; if (Summon) { if (instance && EnemyCount) { EnemyCount = instance->GetData(DATA_TRASH); if (!EnemyCount) NextWaveTimer = 5000; } if (NextWaveTimer <= diff) { if (Faction == 0) SummonNextWave(AllianceWaves, WaveCount, AllianceBase); else if (Faction == 1) SummonNextWave(HordeWaves, WaveCount, HordeBase); ++WaveCount; } else NextWaveTimer -= diff; } if (CheckTimer <= diff) { for (uint8 i = 0; i < 2; ++i) { if (BossGUID[i]) { Unit* unit = Unit::GetUnit(*me, BossGUID[i]); if (unit && (!unit->isAlive())) { if (BossGUID[i] == BossGUID[0]) { Talk(INCOMING); FirstBossDead = true; } else if (BossGUID[i] == BossGUID[1]) { Talk(SUCCESS); SecondBossDead = true; } EventBegun = false; CheckTimer = 0; me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); BossGUID[i] = 0; if (instance) instance->DoUpdateWorldState(WORLD_STATE_ENEMY, 0); // Reset world state for enemies to disable it } } } CheckTimer = 5000; } else CheckTimer -= diff; if (!UpdateVictim()) return; for (uint8 i = 0; i < HYJAL_AI_MAX_SPELLS; ++i) { if (Spells[i].SpellId) { if (SpellTimer[i] <= diff) { if (me->IsNonMeleeSpellCasted(false)) me->InterruptNonMeleeSpells(false); Unit* target = NULL; switch (Spells[i].TargetType) { case TARGETTYPE_SELF: target = me; break; case TARGETTYPE_RANDOM: target = SelectTarget(SELECT_TARGET_RANDOM, 0); break; case TARGETTYPE_VICTIM: target = me->getVictim(); break; } if (target && target->isAlive()) { DoCast(target, Spells[i].SpellId); SpellTimer[i] = Spells[i].Cooldown; } } else SpellTimer[i] -= diff; } } DoMeleeAttackIfReady(); }
void hyjalAI::UpdateAI(const uint32 uiDiff) { if (!m_bIsEventInProgress) return; if (m_bIsSummoningWaves && m_pInstance) { if (m_uiWaveMoveTimer < uiDiff) { // Skip the master timer, and start next wave in 5. Clear the list, it should not be any here now. if (!m_pInstance->GetData(TYPE_TRASH_COUNT)) { lWaveMobGUIDList.clear(); m_uiNextWaveTimer = std::min(m_uiNextWaveTimer, (uint32)5000); } for (GuidList::const_iterator itr = lWaveMobGUIDList.begin(); itr != lWaveMobGUIDList.end(); ++itr) { if (Creature* pTemp = m_pInstance->instance->GetCreature(*itr)) { if (!pTemp->isAlive() || pTemp->getVictim()) continue; pTemp->SetWalk(false); pTemp->GetMotionMaster()->MovePoint(1, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ()); } } m_uiWaveMoveTimer = 10000; } else m_uiWaveMoveTimer -= uiDiff; if (m_uiNextWaveTimer < uiDiff) SummonNextWave(); else m_uiNextWaveTimer -= uiDiff; } if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; for (uint8 i = 0; i < MAX_SPELL; ++i) { if (m_aSpells[i].m_uiSpellId) { if (m_uiSpellTimer[i] < uiDiff) { if (m_creature->IsNonMeleeSpellCasted(false)) m_creature->InterruptNonMeleeSpells(false); Unit* pTarget = NULL; switch (m_aSpells[i].m_pType) { case TARGETTYPE_SELF: pTarget = m_creature; break; case TARGETTYPE_RANDOM: pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0); break; case TARGETTYPE_VICTIM: pTarget = m_creature->getVictim(); break; } if (pTarget) { DoCastSpellIfCan(pTarget, m_aSpells[i].m_uiSpellId); m_uiSpellTimer[i] = m_aSpells[i].m_uiCooldown; } } else m_uiSpellTimer[i] -= uiDiff; } } DoMeleeAttackIfReady(); }
void hyjalAI::UpdateAI(const uint32 diff) { if(!EventBegun) return; if(Summon) { if(NextWaveTimer < diff) { if(Faction == 0) SummonNextWave(AllianceWaves, WaveCount, AllianceBase); else if(Faction == 1) SummonNextWave(HordeWaves, WaveCount, HordeBase); WaveCount++; }else NextWaveTimer -= diff; } if(CheckBossTimer < diff) { for(uint8 i = 0; i < 2; i++) { if(BossGUID[i]) { Unit* pUnit = Unit::GetUnit((*m_creature), BossGUID[i]); if(pUnit && (!pUnit->isAlive())) { if(BossGUID[i] == BossGUID[0]) { Talk(INCOMING); FirstBossDead = true; } else if(BossGUID[i] == BossGUID[1]) { Talk(SUCCESS); SecondBossDead = true; } EventBegun = false; CheckBossTimer = 0; m_creature->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP); BossGUID[i] = 0; UpdateWorldState(WORLDSTATE_ENEMY, 0);// Reset world state for enemies to disable it } } } CheckBossTimer = 5000; }else CheckBossTimer -= diff; if(!m_creature->SelectHostilTarget() || !m_creature->getVictim()) return; for(uint8 i = 0; i < 3; ++i) { if(Spell[i].SpellId) { if(SpellTimer[i] < diff) { if(m_creature->IsNonMeleeSpellCasted(false)) m_creature->InterruptNonMeleeSpells(false); Unit* target = NULL; switch(Spell[i].TargetType) { case TARGETTYPE_SELF: target = m_creature; break; case TARGETTYPE_RANDOM: target = SelectUnit(SELECT_TARGET_RANDOM, 0); break; case TARGETTYPE_VICTIM: target = m_creature->getVictim(); break; } if(target && target->isAlive()) { DoCast(target, Spell[i].SpellId); SpellTimer[i] = Spell[i].Cooldown; } }else SpellTimer[i] -= diff; } } DoMeleeAttackIfReady(); }