boss_magtheridonAI(Creature *c) : ScriptedAI(c) { pInstance =me->GetInstanceData(); me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10); me->SetFloatValue(UNIT_FIELD_COMBATREACH, 10); // target 7, random target with certain entry spell, need core fix SpellEntry *TempSpell; TempSpell = GET_SPELL(SPELL_BLAZE_TARGET); if (TempSpell && TempSpell->EffectImplicitTargetA[0] != 6) { TempSpell->EffectImplicitTargetA[0] = 6; TempSpell->EffectImplicitTargetB[0] = 0; } TempSpell = GET_SPELL(SPELL_QUAKE_TRIGGER); if (TempSpell && TempSpell->EffectTriggerSpell[0] != SPELL_QUAKE_KNOCKBACK) { TempSpell->EffectTriggerSpell[0] = SPELL_QUAKE_KNOCKBACK; } }
boss_kalecgosAI(Creature *c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); SathGUID = 0; DoorGUID = 0; bJustReset = false; me->setActive(true); SpellEntry *TempSpell = GET_SPELL(SPELL_SPECTRAL_BLAST); if (TempSpell) TempSpell->EffectImplicitTargetB[0] = TARGET_UNIT_TARGET_ENEMY; }
boss_kazrogalAI(Creature *c) : hyjal_trashAI(c) { pInstance = c->GetInstanceScript(); pGo = false; pos = 0; SpellEntry *TempSpell = GET_SPELL(SPELL_MARK); if (TempSpell && TempSpell->EffectImplicitTargetA[0] != 1) { TempSpell->EffectImplicitTargetA[0] = 1; TempSpell->EffectImplicitTargetB[0] = 0; } }
boss_drakkari_elementalAI(Creature* pCreature) : ScriptedAI(pCreature) { pInstance = pCreature->GetInstanceScript(); SpellEntry* TempSpell; TempSpell = GET_SPELL(DUNGEON_MODE(SPELL_MOJO_VOLLEY_TRIGGERED,H_SPELL_MOJO_VOLLEY_TRIGGERED)); if (TempSpell) { TempSpell->Effect[1] = NULL; TempSpell->MaxAffectedTargets = 1; } }
boss_anetheronAI(Creature* c) : hyjal_trashAI(c) { pInstance = c->GetInstanceData(); pGo = false; pos = 0; SpellEntry *TempSpell = GET_SPELL(SPELL_SLEEP); if (TempSpell && TempSpell->EffectImplicitTargetA[0] != 1) { TempSpell->EffectImplicitTargetA[0] = 1; TempSpell->EffectImplicitTargetB[0] = 0; } }
boss_general_vezaxAI(Creature* c) : ScriptedAI(c) { m_pInstance = c->GetInstanceScript(); VarporList = std::list<uint64>(); SetImmuneToPushPullEffects(true); // add interrupt flag SpellEntry* tempSpell; tempSpell = GET_SPELL(SPELL_SEARING_FLAMES); if (tempSpell) tempSpell->InterruptFlags |= SPELL_INTERRUPT_FLAG_INTERRUPT; }
boss_krystallusAI(Creature *c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); //temporary to let ground slam effect not be interrupted SpellEntry *TempSpell; TempSpell = GET_SPELL(SPELL_GROUND_SLAM_TRIGGERED); if (TempSpell) { TempSpell->InterruptFlags = 0; } }
boss_kazrogalAI(Creature *c) : hyjal_trashAI(c) { pInstance = c->GetInstanceScript(); pGo = false; pos = 0; SpellEntry *TempSpell = GET_SPELL(SPELL_MARK); SpellEffectEntry const* spellEffect = TempSpell->GetSpellEffect(EFFECT_0); if (spellEffect && spellEffect->EffectImplicitTargetA != 1) { //spellEffect->EffectImplicitTargetA = 1; //spellEffect->EffectImplicitTargetB = 0; } }
boss_nalorakkAI(Creature* c) : ScriptedAI(c) { MoveEvent = true; MovePhase = 0; pInstance = c->GetInstanceData(); // hack mangle as it affects Nalorakk instead of victim SpellEntry *TempSpell1 = GET_SPELL(42389); if (TempSpell1) { TempSpell1->EffectImplicitTargetA[1] = TARGET_UNIT_TARGET_ENEMY; TempSpell1->EffectImplicitTargetB[1] = 0; } }
void Reset() { m_uiColdFlameTimer = 900; SpellEntry* spell = GET_SPELL(SPELL_COLD_FLAME); if (spell) spell->EffectRadiusIndex[0] = 16; //prevent stack damage DoCast(me, SPELL_COLD_FLAME); me->SetVisible(false); DoStartNoMovement(me->getVictim()); m_uiStage = 1; m_uiRadius = 2; m_uiOwnerEntry = 0; }
npc_barnesAI(Creature* c) : npc_escortAI(c) { RaidWiped = false; m_uiEventId = 0; pInstance = c->GetInstanceData(); SpellEntry *TempSpell = GET_SPELL(29683); TempSpell->Effect[2] = 27; TempSpell->EffectBaseDice[2] = 1; TempSpell->EffectDieSides[2] = 1; TempSpell->EffectBasePoints[2] = 49; TempSpell->EffectImplicitTargetA[2] = 18; TempSpell->EffectImplicitTargetB[2] = 16; TempSpell->EffectRadiusIndex[2] = 7; TempSpell->EffectApplyAuraName[2] = 79; TempSpell->EffectMiscValue[2] = 127; }
boss_netherspiteAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceData(); for (int i=0; i<3; ++i) { PortalGUID[i] = 0; BeamTarget[i] = 0; BeamerGUID[i] = 0; } // need core fix for (int i=0; i<3; ++i) { if (SpellEntry *spell = GET_SPELL(PlayerBuff[i])) spell->AttributesEx |= SPELL_ATTR_EX_NEGATIVE; } }
boss_kologarnAI(Creature* creature) : BossAI(creature, TYPE_KOLOGARN), vehicle(creature->GetVehicleKit()), left(false), right(false) { ASSERT(vehicle); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); DoCast(SPELL_KOLOGARN_REDUCE_PARRY); SetCombatMovement(false); Reset(); // should be triggered on caster? SpellEntry* tempSpell; tempSpell = GET_SPELL(SPELL_STONE_SHOUT); if (tempSpell) tempSpell->EffectImplicitTargetA[0] = 1; }
void AdjustCastSpeed() { // bad workaround for mojo frenzy aura SpellEntry *TempSpell; TempSpell = GET_SPELL(SPELL_TRANSFORMATION); uint32 value = 15; //spell 55098 default if (HealthBelowPct(80)) value = 28; if (HealthBelowPct(65)) value = 21; if (HealthBelowPct(50)) value = 5; if (HealthBelowPct(40)) value = 130; if (HealthBelowPct(30)) value = 206; if (HealthBelowPct(20)) value = 110; if (HealthBelowPct(15)) value = 3; if (HealthBelowPct(10)) value = 2; if (TempSpell && value) TempSpell->CastingTimeIndex = value; }
boss_magus_telestraAI(Creature* c) : ScriptedAI(c) { pInstance = c->GetInstanceScript(); //temporary, needs different target selection SpellEntry *TempSpell; TempSpell = GET_SPELL(SPELL_CRITTER); if (TempSpell) { TempSpell->EffectImplicitTargetA[0] = 6; TempSpell->EffectImplicitTargetA[1] = 6; TempSpell->EffectImplicitTargetA[2] = 6; TempSpell->EffectImplicitTargetB[0] = 0; TempSpell->EffectImplicitTargetB[1] = 0; TempSpell->EffectImplicitTargetB[2] = 0; TempSpell->EffectRadiusIndex[0] = 0; TempSpell->EffectRadiusIndex[1] = 0; TempSpell->EffectRadiusIndex[2] = 0; } }
void UpdateAI(const uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; if (!bGoToColossus && HealthBelowPct(50)) { if (Creature *pColossus = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0)) { if (!CAST_AI(boss_drakkari_colossus::boss_drakkari_colossusAI,pColossus->AI())->HealthBelowPct(6)) { me->InterruptNonMeleeSpells(true); DoCast(pColossus, SPELL_MERGE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); bGoToColossus = true; } } } if (bGoToColossus) { if (uiDisappearTimer <= diff) { if (Creature *pColossus = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0)) { CAST_AI(boss_drakkari_colossus::boss_drakkari_colossusAI, pColossus->AI())->CreatureState(pColossus, true); CAST_AI(boss_drakkari_colossus::boss_drakkari_colossusAI, pColossus->AI())->bHealth1 = false; } me->DisappearAndDie(); } else uiDisappearTimer -= diff; } if (uiSurgeTimer <= diff) { DoCast(me->getVictim(), SPELL_SURGE); uiSurgeTimer = urand(15000, 25000); } else uiSurgeTimer -= diff; if (uiMojoWaveTimer <= diff) { if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) { DoCast(pTarget, DUNGEON_MODE(SPELL_MOJO_WAVE, H_SPELL_MOJO_WAVE)); uiMojoWaveTimer = urand(10000, 20000); } } else uiMojoWaveTimer -= diff; // switch mojo volley max targets 1<->2 if (uiSwitchTimer <= diff) { uint32 maxtargets = urand(1,2); SpellEntry* TempSpell; TempSpell = GET_SPELL(DUNGEON_MODE(SPELL_MOJO_VOLLEY_TRIGGERED,H_SPELL_MOJO_VOLLEY_TRIGGERED)); if (TempSpell) TempSpell->MaxAffectedTargets = maxtargets; uiSwitchTimer = 2*IN_MILLISECONDS; } else uiSwitchTimer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) { if (check_Timer <= diff) { if (!me->IsNonMeleeSpellCasted(false)) DoCast(me,SPELL_EVOCATION); check_Timer = 5000; } else check_Timer -= diff; return; } if (Firenova) { if (Firenova_Timer <= diff) { DoCast(me,HeroicMode ? H_SPELL_FIRE_NOVA : SPELL_FIRE_NOVA,true); Firenova = false; ShadowVolley_Timer = 2000; } else Firenova_Timer -=diff; return; } if (ShadowVolley_Timer <= diff) { DoCast(me,HeroicMode ? H_SPELL_SHADOW_BOLT_VOLLEY : SPELL_SHADOW_BOLT_VOLLEY); ShadowVolley_Timer = 5000+rand()%8000; } else ShadowVolley_Timer -=diff; if (Corruption_Timer <= diff) { DoCast(me,SPELL_CORRUPTION); Corruption_Timer = 30000+rand()%20000; } else Corruption_Timer -=diff; if (BurningNova_Timer <= diff) { if (me->IsNonMeleeSpellCasted(false)) me->InterruptNonMeleeSpells(true); DoScriptText(SAY_NOVA, me); if (SpellEntry *nova = GET_SPELL(SPELL_BURNING_NOVA)) { for (uint32 i = 0; i < 3; ++i) if (nova->Effect[i] == SPELL_EFFECT_APPLY_AURA) { Aura *Aur = new BurningNovaAura(nova, i, me, me); me->AddAura(Aur); } } if (HeroicMode) DoTeleportAll(me->GetPositionX(),me->GetPositionY(),me->GetPositionZ(),me->GetOrientation()); BurningNova_Timer = 20000+rand()%8000; Firenova_Timer= 5000; Firenova = true; } else BurningNova_Timer -=diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) { if (check_Timer <= diff) { if (!me->IsNonMeleeSpellCasted(false)) DoCast(me, SPELL_EVOCATION); check_Timer = 5000; } else check_Timer -= diff; return; } if (Firenova) { if (Firenova_Timer <= diff) { DoCast(me, SPELL_FIRE_NOVA, true); Firenova = false; ShadowVolley_Timer = 2000; } else Firenova_Timer -=diff; return; } if (ShadowVolley_Timer <= diff) { DoCast(me, SPELL_SHADOW_BOLT_VOLLEY); ShadowVolley_Timer = 5000+rand()%8000; } else ShadowVolley_Timer -=diff; if (Corruption_Timer <= diff) { DoCast(me, SPELL_CORRUPTION); Corruption_Timer = 30000+rand()%20000; } else Corruption_Timer -=diff; if (BurningNova_Timer <= diff) { if (me->IsNonMeleeSpellCasted(false)) me->InterruptNonMeleeSpells(true); DoScriptText(SAY_NOVA, me); if (SpellEntry *nova = GET_SPELL(SPELL_BURNING_NOVA)) { if (Aura * aura = Aura::TryCreate(nova, me, me)) aura->ApplyForTargets(); } if (IsHeroic()) DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); BurningNova_Timer = 20000+rand()%8000; Firenova_Timer= 5000; Firenova = true; } else BurningNova_Timer -=diff; DoMeleeAttackIfReady(); }
mob_coilfang_ambusherAI(Creature *c) : Scripted_NoMovementAI(c) { SpellEntry *TempSpell = GET_SPELL(SPELL_SHOOT); if (TempSpell) TempSpell->Effect[0] = 2;//change spell effect from weapon % dmg to simple phisical dmg }
void UpdateAI(const uint32 diff) { //Return since we have no target if (m_creature->HasAura(AURA_BANISH) || !UpdateVictim()) { if (BanishTimer<= diff) { CheckBanish();//no need to check every update tick BanishTimer = 1000; } else BanishTimer -= diff; return; } if (m_creature->HasAura(SPELL_WHIRLWIND)) if (Whirlwind_Timer <= diff) { Unit *newTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); if (newTarget) { DoResetThreat(); m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->MovePoint(0,newTarget->GetPositionX(),newTarget->GetPositionY(),newTarget->GetPositionZ()); } Whirlwind_Timer = 2000; } else Whirlwind_Timer -= diff; // reseting after changing forms and after ending whirlwind if (NeedThreatReset && !m_creature->HasAura(SPELL_WHIRLWIND)) { // when changing forms seting timers (or when ending whirlwind - to avoid adding new variable i use Whirlwind_Timer to countdown 2s while whirlwinding) if (DemonForm) InnerDemons_Timer = 30000; else Whirlwind_Timer = 15000; NeedThreatReset = false; DoResetThreat(); m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); } //Enrage_Timer (10 min) if (Berserk_Timer < diff && !EnrageUsed) { m_creature->InterruptNonMeleeSpells(false); DoCast(m_creature, SPELL_BERSERK); EnrageUsed = true; } else Berserk_Timer -= diff; if (!DemonForm) { //Whirldind Timer if (!m_creature->HasAura(SPELL_WHIRLWIND)) { if (Whirlwind_Timer <= diff) { DoCast(m_creature, SPELL_WHIRLWIND); // while whirlwinding this variable is used to countdown target's change Whirlwind_Timer = 2000; NeedThreatReset = true; } else Whirlwind_Timer -= diff; } //Switch_Timer if (!IsFinalForm) if (SwitchToDemon_Timer <= diff) { //switch to demon form m_creature->RemoveAurasDueToSpell(SPELL_WHIRLWIND,0); m_creature->SetDisplayId(MODEL_DEMON); DoScriptText(SAY_SWITCH_TO_DEMON, m_creature); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID , 0); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0); DemonForm = true; NeedThreatReset = true; SwitchToDemon_Timer = 45000; } else SwitchToDemon_Timer -= diff; DoMeleeAttackIfReady(); } else { //ChaosBlast_Timer if (!m_creature->getVictim()) return; if (m_creature->IsWithinDist(m_creature->getVictim(), 30)) m_creature->StopMoving(); if (ChaosBlast_Timer <= diff) { // will cast only when in range of spell if (m_creature->IsWithinDist(m_creature->getVictim(), 30)) { //DoCast(m_creature->getVictim(), SPELL_CHAOS_BLAST, true); int damage = 100; m_creature->CastCustomSpell(m_creature->getVictim(), SPELL_CHAOS_BLAST, &damage, NULL, NULL, false, NULL, NULL, m_creature->GetGUID()); } ChaosBlast_Timer = 3000; } else ChaosBlast_Timer -= diff; //Summon Inner Demon if (InnerDemons_Timer <= diff) { std::list<HostilReference *>& ThreatList = m_creature->getThreatManager().getThreatList(); std::vector<Unit *> TargetList; for (std::list<HostilReference *>::iterator itr = ThreatList.begin(); itr != ThreatList.end(); ++itr) { Unit *tempTarget = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid()); if (tempTarget && tempTarget->GetTypeId() == TYPEID_PLAYER && tempTarget->GetGUID() != m_creature->getVictim()->GetGUID() && TargetList.size()<5) TargetList.push_back(tempTarget); } SpellEntry *spell = GET_SPELL(SPELL_INSIDIOUS_WHISPER); for (std::vector<Unit *>::iterator itr = TargetList.begin(); itr != TargetList.end(); ++itr) { if ((*itr) && (*itr)->isAlive()) { Creature * demon = m_creature->SummonCreature(INNER_DEMON_ID, (*itr)->GetPositionX()+10, (*itr)->GetPositionY()+10, (*itr)->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000); if (demon) { demon->AI()->AttackStart((*itr)); CAST_AI(mob_inner_demonAI, demon->AI())->victimGUID = (*itr)->GetGUID(); (*itr)->AddAura(SPELL_INSIDIOUS_WHISPER, *itr); if (InnerDemon_Count > 4) InnerDemon_Count = 0; //Safe storing of creatures InnderDemon[InnerDemon_Count] = demon->GetGUID(); //Update demon count ++InnerDemon_Count; } } } DoScriptText(SAY_INNER_DEMONS, m_creature); InnerDemons_Timer = 999999; } else InnerDemons_Timer -= diff; //Switch_Timer if (SwitchToHuman_Timer <= diff) { //switch to nightelf form m_creature->SetDisplayId(MODEL_NIGHTELF); m_creature->LoadEquipment(m_creature->GetEquipmentId()); CastConsumingMadness(); DespawnDemon(); DemonForm = false; NeedThreatReset = true; SwitchToHuman_Timer = 60000; } else SwitchToHuman_Timer -= diff; } if (!IsFinalForm && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 15) { //at this point he divides himself in two parts CastConsumingMadness(); DespawnDemon(); Creature *Copy = NULL; Copy = DoSpawnCreature(DEMON_FORM, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 6000); if (Copy) { Demon = Copy->GetGUID(); if (m_creature->getVictim()) Copy->AI()->AttackStart(m_creature->getVictim()); } //set nightelf final form IsFinalForm = true; DemonForm = false; DoScriptText(SAY_FINAL_FORM, m_creature); m_creature->SetDisplayId(MODEL_NIGHTELF); m_creature->LoadEquipment(m_creature->GetEquipmentId()); } }