void UpdateAI(const uint32 diff) { if (!Phase) return; if (me->getThreatManager().getThreatList().empty()) // Reset if event is begun and we don't have a threatlist { EnterEvadeMode(); return; } Creature* Essence = NULL; if (EssenceGUID) { Essence = Unit::GetCreature(*me, EssenceGUID); if (!Essence) { EnterEvadeMode(); return; } } if (Timer <= diff) { switch (Counter) { case 0: me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_READY2H); // I R ANNNGRRRY! DoStartNoMovement(me); Timer = 3000; break; case 1: Timer = 2800; me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_SUBMERGE); // Release the cube DoCast(me, SPELL_SUBMERGE); DoStartNoMovement(me); break; case 2: Timer = 5000; if (Creature* Summon = DoSpawnCreature(23417+Phase, 0, 0, 0, 0, TEMPSUMMON_DEAD_DESPAWN, 0)) { me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_SUBMERGED); // Ribs: open Summon->AI()->AttackStart(SelectTarget(SELECT_TARGET_TOPAGGRO, 0)); EssenceGUID = Summon->GetGUID(); DoStartNoMovement(me); } else EnterEvadeMode(); break; case 3: Timer = 1000; if (Phase == 3) { if (!Essence->isAlive()) DoCast(me, 7, true); else return; } else { if (Essence->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) { MergeThreatList(Essence); Essence->RemoveAllAuras(); Essence->DeleteThreatList(); Essence->GetMotionMaster()->MoveFollow(me, 0.0f, 0.0f); } else return; } break; case 4: Timer = 1500; if (Essence->IsWithinDistInMap(me, 10)) { Essence->SetUInt32Value(UNIT_NPC_EMOTESTATE, 374); //rotate and disappear Timer = 2000; me->RemoveAurasDueToSpell(SPELL_SUBMERGE); } else { MergeThreatList(Essence); Essence->RemoveAllAuras(); Essence->DeleteThreatList(); Essence->GetMotionMaster()->MoveFollow(me, 0, 0); return; } break; case 5: if (Phase == 1) { DoScriptText(SUFF_SAY_AFTER, Essence); } else { DoScriptText(DESI_SAY_AFTER, Essence); } Essence->DespawnOrUnsummon(); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); EssenceGUID = 0; SoulCount = 0; SoulDeathCount = 0; Timer = 3000; break; case 6: if (SoulCount < NUMBER_ENSLAVED_SOUL) { if (SummonSoul()) ++SoulCount; Timer = 500; return; } break; case 7: if (SoulDeathCount >= SoulCount) { Counter = 1; ++Phase; Timer = 5000; } return; default: break; } ++Counter; } else Timer -= diff; }
void UpdateAI(const uint32 diff) { if (!Phase) return; // Reset if event is begun and we don't have a threatlist if (Phase && m_creature->getThreatManager().getThreatList().empty()) EnterEvadeMode(); if (Phase == 1) { if (AnimationTimer < diff) { // Release the cube m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,374); AnimationTimer = 8300; }else AnimationTimer -= diff; if (SummonEssenceTimer < diff) { // Ribs: open m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,373); Creature* EssenceSuffering = NULL; EssenceSuffering = m_creature->SummonCreature(23418, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 1.57f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); if (EssenceSuffering) { DoScriptText(SUFF_SAY_FREED, EssenceSuffering); if (Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0)) { EssenceSuffering->AddThreat(target); EssenceSuffering->AI()->AttackStart(target); } SufferingGUID = EssenceSuffering->GetGUID(); } EndingPhase = false; Phase = 2; }else SummonEssenceTimer -= diff; } if (Phase == 2) { if (SufferingGUID) { Creature* EssenceSuffering = NULL; EssenceSuffering = ((Creature*)Unit::GetUnit((*m_creature), SufferingGUID)); if (!EssenceSuffering || (!EssenceSuffering->isAlive())) EnterEvadeMode(); if (!EndingPhase) { if (EssenceSuffering) { if (EssenceSuffering->GetHealthPercent() < 10.0f) { DoScriptText(SUFF_SAY_RECAP, EssenceSuffering); MergeThreatList(EssenceSuffering); EssenceSuffering->RemoveAllAuras(); EssenceSuffering->DeleteThreatList(); EssenceSuffering->GetMotionMaster()->MoveFollow(m_creature,0.0f,0.0f); EssenceSuffering->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DespawnEssenceTimer = 4000; AnimationTimer = 2200; EndingPhase = true; } } } if ((EndingPhase) && (EssenceSuffering) && (EssenceSuffering->isAlive())) { if (AnimationTimer < diff) { // Return EssenceSuffering->SetUInt32Value(UNIT_NPC_EMOTESTATE,374); AnimationTimer = 10000; }else AnimationTimer -= diff; if (DespawnEssenceTimer < diff) { DoScriptText(SUFF_SAY_AFTER, EssenceSuffering); EssenceSuffering->DeleteThreatList(); EssenceSuffering->SetDisplayId(11686); EssenceSuffering->setFaction(35); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,0); SummonEssenceTimer = 20000; //60000; AnimationTimer = 18200; //58100; SoulDeathCount = 0; SoulCount = 0; SummonSoulTimer = 1000; EndingPhase = false; Phase = 3; SufferingGUID = 0; }else DespawnEssenceTimer -= diff; } } } if (Phase == 3) { if (SoulCount < 36) { if (SummonSoulTimer < diff) { SummonSoul(); SummonSoulTimer = 500; }else SummonSoulTimer -= diff; } if (SoulDeathCount >= SoulCount) { if (AnimationTimer < diff) { // Release the cube m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,374); AnimationTimer = 10000; }else AnimationTimer -= diff; if (SummonEssenceTimer < diff) { // Ribs: open m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,373); Creature* EssenceDesire = NULL; EssenceDesire = m_creature->SummonCreature(23419, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 1.57f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 10000); if (EssenceDesire) { DoScriptText(DESI_SAY_FREED, EssenceDesire); if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0)) { EssenceDesire->AddThreat(target); EssenceDesire->AI()->AttackStart(target); } DesireGUID = EssenceDesire->GetGUID(); SoulDeathCount = 0; } Phase = 4; }else SummonEssenceTimer -= diff; } } if (Phase == 4) { if (DesireGUID) { Creature* EssenceDesire = NULL; EssenceDesire = ((Creature*)Unit::GetUnit((*m_creature), DesireGUID)); if (!EssenceDesire || !EssenceDesire->isAlive()) EnterEvadeMode(); if (!EndingPhase && EssenceDesire) { if (EssenceDesire->GetHealthPercent() < 10.0f) { MergeThreatList(EssenceDesire); EssenceDesire->GetMotionMaster()->MoveFollow(m_creature,0.0f,0.0f); EssenceDesire->RemoveAllAuras(); EssenceDesire->DeleteThreatList(); DoScriptText(DESI_SAY_RECAP, EssenceDesire); EssenceDesire->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DespawnEssenceTimer = 4000; AnimationTimer = 2200; EndingPhase = true; } } if (EndingPhase && EssenceDesire) { if (EssenceDesire->isAlive()) { if (AnimationTimer < diff) { // Return EssenceDesire->SetUInt32Value(UNIT_NPC_EMOTESTATE,374); AnimationTimer = 10000; }else AnimationTimer -= diff; if (DespawnEssenceTimer < diff) { EssenceDesire->DeleteThreatList(); EssenceDesire->setFaction(35); DoScriptText(DESI_SAY_AFTER, EssenceDesire); EssenceDesire->SetDisplayId(11686); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,0); SummonEssenceTimer = 20000; AnimationTimer = 18200; SoulDeathCount = 0; SoulCount = 0; SummonSoulTimer = 1000; EndingPhase = false; Phase = 5; DesireGUID = 0; }else DespawnEssenceTimer -= diff; } } } } if (Phase == 5) { if (SoulCount < 36) { if (SummonSoulTimer < diff) { SummonSoul(); SummonSoulTimer = 500; }else SummonSoulTimer -= diff; } if (SoulDeathCount >= SoulCount) { if (AnimationTimer < diff) { // Release the cube m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,374); AnimationTimer = 10000; }else AnimationTimer -= diff; if (SummonEssenceTimer < diff) { // Ribs: open m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,373); Creature* EssenceAnger = NULL; EssenceAnger = m_creature->SummonCreature(23420, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 1.57f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 45000); if (EssenceAnger) { if (Unit* target = SelectUnit(SELECT_TARGET_TOPAGGRO, 0)) { EssenceAnger->AddThreat(target); EssenceAnger->AI()->AttackStart(target); } AngerGUID = EssenceAnger->GetGUID(); DoScriptText(ANGER_SAY_FREED, EssenceAnger); SoulDeathCount = 0; } Phase = 6; }else SummonEssenceTimer -= diff; } } if (Phase == 6) { if (AngerGUID) { Creature* EssenceAnger = NULL; EssenceAnger = ((Creature*)Unit::GetUnit((*m_creature), AngerGUID)); if (!EssenceAnger) EnterEvadeMode(); if (m_creature->isAlive() && EssenceAnger) { if (!EssenceAnger->isAlive()) { AngerGUID = 0; m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } } } } }