void ExecuteEvent(uint32 eventId) override { if (eventId == EVENT_SPECIAL_ABILITY) { if (CurrentStage == MAX_STAGES) GenerateStageSequence(); switch (Stage[CurrentStage]) { case STAGE_DARK_VORTEX: if (Creature* sister = GetSister()) sister->AI()->DoAction(ACTION_VORTEX); break; case STAGE_DARK_PACT: if (Creature* sister = GetSister()) sister->AI()->DoAction(ACTION_PACT); break; case STAGE_LIGHT_VORTEX: DoAction(ACTION_VORTEX); break; case STAGE_LIGHT_PACT: DoAction(ACTION_PACT); break; default: break; } ++CurrentStage; events.ScheduleEvent(EVENT_SPECIAL_ABILITY, 45 * IN_MILLISECONDS); } else boss_twin_baseAI::ExecuteEvent(eventId); }
void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); HandleAuraOnRaidTwinValkyr(me, SPELL_POWER_UP, true, false, 0); HandleAuraOnRaidTwinValkyr(me, SPELL_LIGHT_ESSENCE, true, false, 0); HandleAuraOnRaidTwinValkyr(me, SPELL_DARK_ESSENCE, true, false, 0); if (m_instance) { m_instance->SetData(DATA_HEALTH_TWIN_SHARED, 0); if (Creature* pSister = GetSister()) { if (!pSister->isAlive()) { m_instance->SetData(TYPE_VALKIRIES, DONE); } else m_instance->SetData(TYPE_VALKIRIES, SPECIAL); } else m_instance->SetData(TYPE_VALKIRIES, DONE); // In case we cannot find sister, set done by default } Summons.DespawnAll(); }
void DamageTaken(Unit* pDoneBy, uint32 &uiDamage) { if (!me || !me->isAlive()) return; if (pDoneBy->GetGUID() == me->GetGUID()) return; if (pDoneBy->ToPlayer()) { if (pDoneBy->HasAura(m_uiOtherEssenceSpellId)) uiDamage += uiDamage/2; if (pDoneBy->HasAura(m_uiEmpoweredWeaknessSpellId)) uiDamage += uiDamage; else if (pDoneBy->HasAura(m_uiMyEssenceSpellId)) uiDamage /= 2; } if (m_pInstance) { if (Creature* pSister = GetSister()) { pSister->DealDamage(pSister, uiDamage); pSister->LowerPlayerDamageReq(uiDamage); } } }
void JustDied(Unit* /*pKiller*/) { DoScriptText(SAY_DEATH, me); if(pInstance) { pInstance->SetData(DATA_HEALTH_TWIN_SHARED, 0); if(Creature* pSister = GetSister()) { if(!pSister->isAlive()) { me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); pSister->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); pInstance->SetData(TYPE_VALKIRIES, DONE); Summons.DespawnAll(); } else { pInstance->SetData(TYPE_VALKIRIES, SPECIAL); me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); } } } Summons.DespawnAll(); if(fight_Timer <= 180000) //3 min pInstance->DoCompleteAchievement(RAID_MODE(3799, 3815, 3799, 3815)); //Salt and Pepper }
void SpellHit(Unit* caster, const SpellEntry* spell) { if (caster->GetGUID() == me->GetGUID()) if (spell->Effect[0] == 136) // Effect Heal if (m_pInstance) { if (Creature* pSister = GetSister()) pSister->DealHeal(pSister, spell->EffectBasePoints[0]); } }
void EnterCombat(Unit* /*who*/) override { me->SetInCombatWithZone(); if (Creature* pSister = GetSister()) { me->AddAura(MyEmphatySpellId, pSister); pSister->SetInCombatWithZone(); } instance->SetBossState(BOSS_VALKIRIES, IN_PROGRESS); Talk(SAY_AGGRO); DoCast(me, SurgeSpellId); }
void JustDied(Unit* /*pKiller*/) { DoScriptText(SAY_DEATH, me); if (m_pInstance) { m_pInstance->SetData(DATA_HEALTH_TWIN_SHARED, 0); if (Creature* pSister = GetSister()) { if (!pSister->isAlive()) { m_pInstance->SetData(TYPE_VALKIRIES, DONE); Summons.DespawnAll(); } else m_pInstance->SetData(TYPE_VALKIRIES, SPECIAL); } } Summons.DespawnAll(); }
void JustReachedHome() { if (m_instance) { m_instance->SetData(TYPE_VALKIRIES, FAIL); m_instance->SetData(DATA_HEALTH_TWIN_SHARED, me->GetMaxHealth()); } me->DespawnOrUnsummon(); if (Creature* Sister = GetSister()) { Sister->DespawnOrUnsummon(); } }
void EnterCombat(Unit* /*who*/) { me->SetInCombatWithZone(); if (m_pInstance) { if (Creature* pSister = GetSister()) { me->AddAura(m_uiMyEmphatySpellId, pSister); pSister->SetInCombatWithZone(); } m_pInstance->SetData(TYPE_VALKIRIES, IN_PROGRESS); } DoScriptText(SAY_AGGRO, me); DoCast(me, m_uiSurgeSpellId); }
void EnterCombat(Unit* /*who*/) { if (m_instance) { m_instance->SetData(TYPE_VALKIRIES, IN_PROGRESS); m_instance->SetData(DATA_HEALTH_TWIN_SHARED, me->GetMaxHealth()); } DoZoneInCombat(); if (Creature* Sister = GetSister()) { DoZoneInCombat(Sister); } DoScriptText(SAY_AGGRO, me); DoCast(me, m_uiSurgeSpellId); }
void EnterCombat(Unit* /*who*/) { me->SetInCombatWithZone(); if (m_pInstance) { if (Creature* pSister = GetSister()) me->AddAura(m_uiMyEmphatySpellId, pSister); m_pInstance->SetData(TYPE_VALKIRIES, IN_PROGRESS); } if (me->isAlive()) { me->SummonCreature(m_uiEssenceNpcId, EssenceLocation[0].GetPositionX(), EssenceLocation[0].GetPositionY(), EssenceLocation[0].GetPositionZ()); me->SummonCreature(m_uiEssenceNpcId, EssenceLocation[1].GetPositionX(), EssenceLocation[1].GetPositionY(), EssenceLocation[1].GetPositionZ()); } DoScriptText(SAY_AGGRO, me); DoCast(me, m_uiSurgeSpellId); }
void EnterCombat(Unit* /*who*/) override { me->SetInCombatWithZone(); if (Creature* pSister = GetSister()) { me->AddAura(MyEmphatySpellId, pSister); pSister->SetInCombatWithZone(); } instance->SetBossState(BOSS_VALKIRIES, IN_PROGRESS); Talk(SAY_AGGRO); DoCast(me, SurgeSpellId); events.ScheduleEvent(EVENT_TWIN_SPIKE, 20 * IN_MILLISECONDS); events.ScheduleEvent(EVENT_BERSERK, IsHeroic() ? 6 * MINUTE*IN_MILLISECONDS : 10 * MINUTE*IN_MILLISECONDS); if (IsHeroic()) events.ScheduleEvent(EVENT_TOUCH, urand(10 * IN_MILLISECONDS, 15 * IN_MILLISECONDS)); }
void JustDied(Unit* /*killer*/) override { Talk(SAY_DEATH); if (Creature* pSister = GetSister()) { if (!pSister->IsAlive()) { me->SetFlag(OBJECT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); pSister->SetFlag(OBJECT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); _JustDied(); } else { me->RemoveFlag(OBJECT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); instance->SetBossState(BOSS_VALKIRIES, SPECIAL); } } summons.DespawnAll(); }
void DoAction(int32 action) override { switch (action) { case ACTION_VORTEX: Talk(EMOTE_VORTEX); DoCastAOE(VortexSpellId); break; case ACTION_PACT: Talk(EMOTE_TWIN_PACT); Talk(SAY_TWIN_PACT); if (Creature* sister = GetSister()) sister->CastSpell(sister, SPELL_POWER_TWINS, false); DoCast(me, ShieldSpellId); DoCast(me, TwinPactSpellId); break; default: break; } }
void JustEngagedWith(Unit* /*who*/) override { DoZoneInCombat(); if (Creature* pSister = GetSister()) { me->AddAura(MyEmphatySpellId, pSister); DoZoneInCombat(pSister); } instance->SetBossState(DATA_TWIN_VALKIRIES, IN_PROGRESS); Talk(SAY_AGGRO); DoCast(me, SurgeSpellId); me->SetCombatPulseDelay(5); me->setActive(true); events.ScheduleEvent(EVENT_TWIN_SPIKE, 20s); events.ScheduleEvent(EVENT_BERSERK, IsHeroic() ? 6min : 8min); if (IsHeroic()) events.ScheduleEvent(EVENT_TOUCH, 10s, 15s); }
void JustDied(Unit* /*killer*/) override { Talk(SAY_DEATH); if (Creature* pSister = GetSister()) { if (!pSister->IsAlive()) { me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); pSister->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); events.Reset(); summons.DespawnAll(); HandleRemoveAuras(); instance->SetBossState(DATA_TWIN_VALKIRIES, DONE); } else { me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); instance->SetBossState(DATA_TWIN_VALKIRIES, SPECIAL); } } summons.DespawnAll(); }
void JustDied(Unit* /*killer*/) { DoScriptText(SAY_DEATH, me); if (m_pInstance) { if (Creature* pSister = GetSister()) { if (!pSister->isAlive()) { me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); pSister->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); m_pInstance->SetData(TYPE_VALKIRIES, DONE); Summons.DespawnAll(); } else { me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); m_pInstance->SetData(TYPE_VALKIRIES, SPECIAL); } } } Summons.DespawnAll(); }
void UpdateAI(const uint32 uiDiff) { if (!m_pInstance || !UpdateVictim()) return; switch (m_uiStage) { case 0: break; case 1: // Vortex if (m_uiSpecialAbilityTimer <= uiDiff) { if (Creature* pSister = GetSister()) pSister->AI()->DoAction(ACTION_VORTEX); DoScriptText(m_uiVortexEmote, me); DoScriptText(m_uiVortexSay, me); DoCastAOE(m_uiVortexSpellId); m_uiStage = 0; m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS; } else m_uiSpecialAbilityTimer -= uiDiff; break; case 2: // Shield+Pact if (m_uiSpecialAbilityTimer <= uiDiff) { DoScriptText(EMOTE_SHIELD, me); DoScriptText(SAY_SHIELD, me); if (Creature* pSister = GetSister()) { pSister->AI()->DoAction(ACTION_PACT); pSister->CastSpell(pSister, SPELL_POWER_TWINS, false); } DoCast(me, m_uiShieldSpellId); DoCast(me, m_uiTwinPactSpellId); m_uiStage = 0; m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS; } else m_uiSpecialAbilityTimer -= uiDiff; break; default: break; } if (m_uiSpikeTimer <= uiDiff) { DoCastVictim(m_uiSpikeSpellId); m_uiSpikeTimer = 20*IN_MILLISECONDS; } else m_uiSpikeTimer -= uiDiff; if (IsHeroic() && m_uiTouchTimer <= uiDiff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true, m_uiOtherEssenceSpellId)) me->CastCustomSpell(m_uiTouchSpellId, SPELLVALUE_MAX_TARGETS, 1, target, false); m_uiTouchTimer = urand(10, 15)*IN_MILLISECONDS; } else m_uiTouchTimer -= uiDiff; if (!m_bIsBerserk && m_uiBerserkTimer <= uiDiff) { DoCast(me, SPELL_BERSERK); DoScriptText(SAY_BERSERK, me); m_bIsBerserk = true; } else m_uiBerserkTimer -= uiDiff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if(me->isInCombat()) fight_Timer += diff; if(!pInstance || !UpdateVictim()) return; if(pInstance->GetData(DATA_HEALTH_TWIN_SHARED) != 0) me->SetHealth(pInstance->GetData(DATA_HEALTH_TWIN_SHARED)); else me->SetHealth(1); switch(m_uiStage) { case 0: break; case 1: // Vortex if(m_uiSpecialAbilityTimer <= diff) { if(Creature* pSister = GetSister()) pSister->AI()->DoAction(ACTION_VORTEX); DoScriptText(m_uiVortexEmote, me); DoScriptText(m_uiVortexSay, me); DoCastAOE(m_uiVortexSpellId); m_uiStage = 0; m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS; } else m_uiSpecialAbilityTimer -= diff; break; case 2: // Shield+Pact if(m_uiSpecialAbilityTimer <= diff) { if(Creature* pSister = GetSister()) pSister->AI()->DoAction(ACTION_PACT); DoScriptText(EMOTE_SHIELD, me); DoScriptText(SAY_SHIELD, me); DoCast(me, m_uiShieldSpellId); DoCast(me, m_uiTwinPactSpellId); m_uiStage = 0; m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS; } else m_uiSpecialAbilityTimer -= diff; break; default: break; } if(m_uiSpikeTimer <= diff) { DoCastVictim(m_uiSpikeSpellId); m_uiSpikeTimer = 20*IN_MILLISECONDS; } else m_uiSpikeTimer -= diff; if(IsHeroic() && m_uiTouchTimer <= diff) { if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true, m_uiOtherEssenceSpellId)) me->CastCustomSpell(m_uiTouchSpellId, SPELLVALUE_MAX_TARGETS, 1, target, false); m_uiTouchTimer = urand(10, 15)*IN_MILLISECONDS; } else m_uiTouchTimer -= diff; if(m_uiColorballsTimer <= diff) { if(m_uiWaveCount >= 2) { SummonColorballs(12); m_uiWaveCount = 0; } else { SummonColorballs(2); m_uiWaveCount++; } m_uiColorballsTimer = 15*IN_MILLISECONDS; } else m_uiColorballsTimer -= diff; if(!m_bIsBerserk && m_uiBerserkTimer <= diff) { DoCast(me, SPELL_BERSERK); DoScriptText(SAY_BERSERK, me); m_bIsBerserk = true; } else m_uiBerserkTimer -= diff; if(me->HasUnitState(UNIT_STAT_CASTING)) return; DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!instance || !UpdateVictim()) return; if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (Stage) { case 0: break; case 1: // Vortex if (SpecialAbilityTimer <= diff) { if (Creature* pSister = GetSister()) pSister->AI()->DoAction(ACTION_VORTEX); Talk(VortexEmote); DoCastAOE(VortexSpellId); Stage = 0; SpecialAbilityTimer = 1*MINUTE*IN_MILLISECONDS; } else SpecialAbilityTimer -= diff; break; case 2: // Shield + Pact if (SpecialAbilityTimer <= diff) { Talk(EMOTE_TWINK_PACT); Talk(SAY_TWINK_PACT); if (Creature* pSister = GetSister()) { pSister->AI()->DoAction(ACTION_PACT); pSister->CastSpell(pSister, SPELL_POWER_TWINS, false); } DoCast(me, ShieldSpellId); DoCast(me, TwinPactSpellId); Stage = 0; SpecialAbilityTimer = 1*MINUTE*IN_MILLISECONDS; } else SpecialAbilityTimer -= diff; break; default: break; } if (SpikeTimer <= diff) { DoCastVictim(SpikeSpellId); SpikeTimer = 20*IN_MILLISECONDS; } else SpikeTimer -= diff; if (IsHeroic() && TouchTimer <= diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true, OtherEssenceSpellId)) me->CastCustomSpell(TouchSpellId, SPELLVALUE_MAX_TARGETS, 1, target, false); TouchTimer = urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS); } else TouchTimer -= diff; if (!IsBerserk && BerserkTimer <= diff) { DoCast(me, SPELL_BERSERK); Talk(SAY_BERSERK); IsBerserk = true; } else BerserkTimer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) { if (!m_instance || !UpdateVictim()) return; if (m_instance->GetData(DATA_HEALTH_TWIN_SHARED) != 0) me->SetHealth(m_instance->GetData(DATA_HEALTH_TWIN_SHARED)); else if (me->getVictim()) { me->LowerPlayerDamageReq(me->GetMaxHealth()); me->getVictim()->Kill(me); return; } else me->SetHealth(1); if (m_uiSpecialAbilityTimer <= uiDiff) { me->InterruptNonMeleeSpells(false); if (urand(0, 1)) { DoScriptText(m_uiVortexEmote, me); DoScriptText(m_uiVortexSay, me); DoCastAOE(m_uiVortexSpellId); std::list<Unit*> targetList; SelectTargetList(targetList, 100, SELECT_TARGET_NEAREST, 150.0f, true, m_uiMyEssenceSpellId); if (!targetList.empty()) { for (std::list<Unit* >::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr) { Unit* pUnit = (*itr); if (pUnit && pUnit->isAlive()) { if (!pUnit->HasAura(SPELL_POWER_UP)) pUnit->AddAura(SPELL_POWER_UP, pUnit); if (Aura* aur = pUnit->GetAura(SPELL_POWER_UP)) { if (aur->GetStackAmount() + 30 > 100) { pUnit->RemoveAurasDueToSpell(SPELL_POWER_UP); pUnit->CastSpell(pUnit, me->GetEntry() == NPC_LIGHTBANE ? SPELL_EMPOWERED_LIGHT : SPELL_EMPOWERED_DARK, true); } else { if (urand(0, 100) <= 15) pUnit->CastSpell(pUnit, SPELL_SPEED, true); aur->SetStackAmount(aur->GetStackAmount() + 30); } } } } } } else { DoScriptText(EMOTE_SHIELD, me); DoScriptText(SAY_SHIELD, me); if (Creature* Sister = GetSister()) Sister->CastSpell(Sister, SPELL_TWIN_POWER, true); DoCast(me, m_uiShieldSpellId); me->CastCustomSpell(me, m_uiTwinPactSpellId, 0, 0, 0, false); } m_uiSpecialAbilityTimer = 80000; } else m_uiSpecialAbilityTimer -= uiDiff; if (m_uiSpikeTimer <= uiDiff) { DoCastVictim(m_uiSpikeSpellId); m_uiSpikeTimer = 20*1000; } else m_uiSpikeTimer -= uiDiff; if (IsHeroic()) { if (m_uiTouchTimer <= uiDiff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true, m_uiOtherEssenceSpellId)) { if (!target->HasAura(m_uiTouchSpellId)) { target->AddAura(m_uiTouchSpellId, target); } } m_uiTouchTimer = urand(10, 15)*1000; } else m_uiTouchTimer -= uiDiff; } if (m_uiColorballsTimer <= uiDiff) { if (m_uiWaveCount >= 2) { SummonColorballs(15); m_uiWaveCount = 0; } else { SummonColorballs(2); m_uiWaveCount++; } m_uiColorballsTimer = 15*1000; } else m_uiColorballsTimer -= uiDiff; if (m_uiBerserkTimer <= uiDiff) { if (!m_bIsBerserk) { DoCast(me, SPELL_BERSERK); DoScriptText(SAY_BERSERK, me); m_bIsBerserk = true; } } else m_uiBerserkTimer -= uiDiff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 uiDiff) { if (!m_pInstance || !UpdateVictim()) return; if (m_pInstance->GetData(DATA_HEALTH_TWIN_SHARED) != 0) me->SetHealth(m_pInstance->GetData(DATA_HEALTH_TWIN_SHARED)); else me->SetHealth(1); switch (m_uiStage) { case 0: break; case 1: // Vortex if (m_uiSpecialAbilityTimer <= uiDiff) { if (Creature* pSister = GetSister()) pSister->AI()->DoAction(ACTION_VORTEX); DoScriptText(m_uiVortexEmote, me); DoScriptText(m_uiVortexSay, me); DoCastAOE(m_uiVortexSpellId); m_uiStage = 0; m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS; } else m_uiSpecialAbilityTimer -= uiDiff; break; case 2: // Shield+Pact if (m_uiSpecialAbilityTimer <= uiDiff) { if (Creature* pSister = GetSister()) pSister->AI()->DoAction(ACTION_PACT); DoScriptText(EMOTE_SHIELD, me); DoScriptText(SAY_SHIELD, me); DoCast(me, m_uiShieldSpellId); DoCast(me, m_uiTwinPactSpellId); m_uiStage = 0; m_uiSpecialAbilityTimer = MINUTE*IN_MILLISECONDS; } else m_uiSpecialAbilityTimer -= uiDiff; break; default: break; } if (m_uiSpikeTimer <= uiDiff) { DoCastVictim(m_uiSpikeSpellId); m_uiSpikeTimer = 20*IN_MILLISECONDS; } else m_uiSpikeTimer -= uiDiff; if (IsHeroic() && m_uiTouchTimer <= uiDiff) { if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true, m_uiOtherEssenceSpellId)) if (pTarget->isAlive()) { me->AddAura(m_uiTouchSpellId,pTarget); m_uiTouchTimer = 20*IN_MILLISECONDS; } else m_uiTouchTimer = 0; else if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM,0,200,true)) if (pTarget->isAlive() && !pTarget->HasAura(m_uiMyEssenceSpellId)) { me->AddAura(m_uiTouchSpellId,pTarget); m_uiTouchTimer = 20*IN_MILLISECONDS; } else m_uiTouchTimer = 0; } else m_uiTouchTimer -= uiDiff; if (m_uiColorballsTimer <= uiDiff) { if (m_uiWaveCount >= 2) { SummonColorballs(12); m_uiWaveCount = 0; } else { SummonColorballs(2); m_uiWaveCount++; } m_uiColorballsTimer = 15*IN_MILLISECONDS; } else m_uiColorballsTimer -= uiDiff; if (!m_bIsBerserk && m_uiBerserkTimer <= uiDiff) { DoCast(me, SPELL_BERSERK); DoScriptText(SAY_BERSERK, me); m_bIsBerserk = true; } else m_uiBerserkTimer -= uiDiff; DoMeleeAttackIfReady(); }