/* During the AIUpdate() Selin will spam FelExplosion until hes out of mana He will then attempt to gain mana from a FelCrystal thats in the room by running to them */ void AIUpdate() { // 10% of his mana according to wowhead is 3231 which is whats needed to cast FelExplosion if(GetManaPercent() < 10 || FelExplosion->mEnabled == false) Mana(); else if(!IsCasting())// Mana is greater than 10% CastFelExplosion(); ParentClass::AIUpdate(); }
void Mana() { /* Attempt to get a Fel Crystal and move to it if not in range. Once in range we get the FelCrystal to cast Mana Rage on Selin */ Unit *FelCrystal = NULL; PreventActions(false); FelCrystal = FindFelCrystal(); if(!FelCrystal || !FelCrystal->isAlive()) { PreventActions(true); FelCrystal = NULL; return; } // Not in range if(_unit->GetDistance2dSq(FelCrystal) > 50) { MoveTo(FelCrystal->GetPositionX(), FelCrystal->GetPositionY(), FelCrystal->GetPositionZ()); FelCrystal = NULL; return; } _unit->GetAIInterface()->StopMovement(0); if(!FelCrystal->GetCurrentSpell()) FelCrystal->CastSpell(_unit, ManaRage, false); //nastavim attackable FelCrystal->SetUInt32Value(UNIT_FIELD_FLAGS, 0); // Mana Rage giving of mana doesnt work so we give 10%(3231) / AIUpdate() Event. CastSpellNowNoScheduling(ManaRageTrigger); uint32 mana = _unit->GetUInt32Value(UNIT_FIELD_POWER1)+3231; if(mana >= _unit->GetUInt32Value(UNIT_FIELD_MAXPOWER1)) mana = _unit->GetUInt32Value(UNIT_FIELD_MAXPOWER1); _unit->SetUInt32Value(UNIT_FIELD_POWER1, mana); // Re-Enable FelExplosion if(GetManaPercent() >= 100) PreventActions(true); FelCrystal = NULL; }
void UpdateAI(const uint32 uiDiff) override { if (m_bEventMode) { if (!m_uiSpeechStep) return; if (m_uiSpeechTimer < uiDiff) { switch (m_uiSpeechStep) { case 1: DoScriptText(YELL_FENRUS, m_creature); m_creature->SetVisibility(VISIBILITY_ON); m_uiSpeechTimer = 2000; break; case 2: DoCastSpellIfCan(m_creature, SPELL_FIRE); m_uiSpeechTimer = 5000; break; case 3: if (m_pInstance) if (GameObject* pLightning = m_pInstance->GetSingleGameObjectFromStorage(GO_ARUGAL_FOCUS)) pLightning->Use(m_creature); m_uiSpeechTimer = 5000; break; case 4: m_creature->SetVisibility(VISIBILITY_OFF); m_uiSpeechTimer = 500; break; case 5: { Creature* pVoidwalker = NULL; Creature* pLeader = NULL; for (uint8 i = 0; i < 4; ++i) { pVoidwalker = m_creature->SummonCreature(NPC_VOIDWALKER, VWSpawns[i].fX, VWSpawns[i].fY, VWSpawns[i].fZ, VWSpawns[i].fO, TEMPSPAWN_DEAD_DESPAWN, 1); if (!pVoidwalker) continue; if (!i) pLeader = pVoidwalker; if (mob_arugal_voidwalkerAI* pVoidwalkerAI = dynamic_cast<mob_arugal_voidwalkerAI*>(pVoidwalker->AI())) pVoidwalkerAI->SetPosition(i, pLeader); pVoidwalker = NULL; } m_uiSpeechStep = 0; return; } default: m_uiSpeechStep = 0; return; } ++m_uiSpeechStep; } else m_uiSpeechTimer -= uiDiff; return; } // Check if we have a current target if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (GetManaPercent() < 6.0f && !m_bAttacking) { if (m_posPosition != POSITION_UPPER_LEDGE) StartAttacking(); else if (m_uiTeleportTimer > 2000) m_uiTeleportTimer = 2000; m_bAttacking = true; } else if (GetManaPercent() > 12.0f && m_bAttacking) { StopAttacking(); m_bAttacking = false; } if (m_uiYellTimer < uiDiff) { DoScriptText(YELL_COMBAT, m_creature); m_uiYellTimer = urand(34000, 68000); } else m_uiYellTimer -= uiDiff; if (m_uiCurseTimer < uiDiff) { if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 1)) DoCastSpellIfCan(pTarget, SPELL_ARUGALS_CURSE); m_uiCurseTimer = urand(20000, 35000); } else m_uiCurseTimer -= uiDiff; if (m_uiThundershockTimer < uiDiff) { if (GetVictimDistance() < 5.0f) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_THUNDERSHOCK); m_uiThundershockTimer = urand(30200, 38500); } } else m_uiThundershockTimer -= uiDiff; if (m_uiVoidboltTimer < uiDiff) { if (!m_bAttacking) { DoCastSpellIfCan(m_creature->getVictim(), SPELL_VOID_BOLT); m_uiVoidboltTimer = urand(2900, 4800); } } else m_uiVoidboltTimer -= uiDiff; if (m_uiTeleportTimer < uiDiff) { ArugalPosition posNewPosition; if (m_posPosition == POSITION_SPAWN_LEDGE) posNewPosition = (ArugalPosition)urand(1, 2); else { posNewPosition = (ArugalPosition)urand(0, 1); if (m_posPosition == posNewPosition) posNewPosition = POSITION_STAIRS; } if (m_creature->IsNonMeleeSpellCasted(false)) m_creature->InterruptNonMeleeSpells(false); switch (posNewPosition) { case POSITION_SPAWN_LEDGE: DoCastSpellIfCan(m_creature, SPELL_SHADOW_PORT_SPAWN_LEDGE, true); break; case POSITION_UPPER_LEDGE: DoCastSpellIfCan(m_creature, SPELL_SHADOW_PORT_UPPER_LEDGE, true); break; case POSITION_STAIRS: DoCastSpellIfCan(m_creature, SPELL_SHADOW_PORT_STAIRS, true); break; } if (GetManaPercent() < 6.0f) { if (posNewPosition == POSITION_UPPER_LEDGE) { StopAttacking(); m_uiTeleportTimer = urand(2000, 2200); } else { StartAttacking(); m_uiTeleportTimer = urand(48000, 55000); } } else m_uiTeleportTimer = urand(48000, 55000); m_posPosition = posNewPosition; } else m_uiTeleportTimer -= uiDiff; if (m_bAttacking) DoMeleeAttackIfReady(); }