diff options
author | maanuel <none@none> | 2009-12-20 20:48:06 -0300 |
---|---|---|
committer | maanuel <none@none> | 2009-12-20 20:48:06 -0300 |
commit | 206f472ccf1a3e951d0985fdeb87c63c22d4c3ac (patch) | |
tree | f8471597c804a0f839fb8c910f1283869ae607cf /src | |
parent | 19574e6606801224831d942658359906b4860a49 (diff) |
Gundrak: Partial redone of Drakkari Colossus encounter, it remove of some hacks.
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/scripts/northrend/gundrak/boss_drakkari_colossus.cpp | 205 |
1 files changed, 91 insertions, 114 deletions
diff --git a/src/bindings/scripts/scripts/northrend/gundrak/boss_drakkari_colossus.cpp b/src/bindings/scripts/scripts/northrend/gundrak/boss_drakkari_colossus.cpp index d2c13c430ee..448fa9cab7c 100644 --- a/src/bindings/scripts/scripts/northrend/gundrak/boss_drakkari_colossus.cpp +++ b/src/bindings/scripts/scripts/northrend/gundrak/boss_drakkari_colossus.cpp @@ -30,7 +30,6 @@ Script Data End */ enum Spells { SPELL_EMERGE = 54850, - SPELL_EMERGE_2 = 54851, SPELL_MIGHTY_BLOW = 54719, @@ -46,39 +45,32 @@ enum Spells H_SPELL_MOJO_WAVE = 58993 }; -enum Entries -{ - DRAKKARI_COLOSSUS = 29307, -}; - struct TRINITY_DLL_DECL boss_drakkari_colossusAI : public ScriptedAI { - boss_drakkari_colossusAI(Creature *c) : ScriptedAI(c) + boss_drakkari_colossusAI(Creature* pCreature) : ScriptedAI(pCreature) { - pInstance = c->GetInstanceData(); + pInstance = pCreature->GetInstanceData(); } ScriptedInstance* pInstance; - bool Summoned; + bool bHealth; + bool bHealth1; - uint32 Summon_Timer; uint32 MightyBlowTimer; void Reset() { if (pInstance) pInstance->SetData(DATA_DRAKKARI_COLOSSUS_EVENT, NOT_STARTED); - if(!m_creature->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE)) m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - - m_creature->clearUnitState(UNIT_STAT_STUNNED); + m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + m_creature->clearUnitState(UNIT_STAT_STUNNED | UNIT_STAT_ROOT); m_creature->SetReactState(REACT_PASSIVE); - - Summoned = false; - MightyBlowTimer = 10000; + bHealth = false; + bHealth1 = false; } void EnterCombat(Unit* who) @@ -87,11 +79,24 @@ struct TRINITY_DLL_DECL boss_drakkari_colossusAI : public ScriptedAI pInstance->SetData(DATA_DRAKKARI_COLOSSUS_EVENT, IN_PROGRESS); } - void PrepareToSummonElemental() + void CreatureState(Creature* pWho, bool bRestore = false) { - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - m_creature->addUnitState(UNIT_STAT_STUNNED); - DoCast(m_creature, SPELL_EMERGE, false); + if (!pWho) + return; + + if (bRestore) + { + pWho->clearUnitState(UNIT_STAT_STUNNED | UNIT_STAT_ROOT); + pWho->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + if (pWho == m_creature) + m_creature->RemoveAura(SPELL_FREEZE_ANIM); + }else + { + pWho->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + pWho->addUnitState(UNIT_STAT_STUNNED | UNIT_STAT_ROOT); + if (pWho == m_creature) + DoCast(m_creature,SPELL_FREEZE_ANIM); + } } void UpdateAI(const uint32 diff) @@ -100,30 +105,25 @@ struct TRINITY_DLL_DECL boss_drakkari_colossusAI : public ScriptedAI if (!UpdateVictim()) return; - if (Summoned == false && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50 && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() > 6) + if (!bHealth && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50 && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() >= 6) { - PrepareToSummonElemental(); - DoCast(m_creature->getVictim(), SPELL_EMERGE_2, true); - Summoned = true; + CreatureState(m_creature, false); + DoCast(m_creature,SPELL_FREEZE_ANIM); + DoCast(m_creature,SPELL_EMERGE); + bHealth = true; } - if (Summoned == true && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 5) + if (!bHealth1 && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 5) { + DoCast(m_creature,SPELL_EMERGE); + CreatureState(m_creature, false); + bHealth1 = true; m_creature->RemoveAllAuras(); - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - m_creature->addUnitState(UNIT_STAT_STUNNED); - m_creature->RemoveAllAuras(); - - Summoned = false; } if (MightyBlowTimer <= diff) { - if (!m_creature->hasUnitState(UNIT_STAT_STUNNED)) - { - DoCast(m_creature->getVictim(), SPELL_MIGHTY_BLOW, true); - } - + DoCast(m_creature->getVictim(), SPELL_MIGHTY_BLOW, true); MightyBlowTimer = 10000; } else MightyBlowTimer -= diff; @@ -137,9 +137,11 @@ struct TRINITY_DLL_DECL boss_drakkari_colossusAI : public ScriptedAI pInstance->SetData(DATA_DRAKKARI_COLOSSUS_EVENT, DONE); } - void JustSummoned(Creature* summoned) + void JustSummoned(Creature* pSummon) { - summoned->AI()->AttackStart(m_creature->getVictim()); + if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 5) + pSummon->DealDamage(pSummon, pSummon->GetHealth() * 0.5 , NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + pSummon->AI()->AttackStart(m_creature->getVictim()); } }; @@ -148,92 +150,68 @@ struct TRINITY_DLL_DECL boss_drakkari_elementalAI : public ScriptedAI boss_drakkari_elementalAI(Creature* pCreature) : ScriptedAI(pCreature) { pInstance = pCreature->GetInstanceData(); - if (pCreature->GetMap()->IsDungeon()) - Colossus = pCreature->GetUnit(*pCreature, pInstance->GetData64(DATA_DRAKKARI_COLOSSUS)); + pColossus = CAST_CRE(pCreature->GetUnit(*pCreature, pInstance->GetData64(DATA_DRAKKARI_COLOSSUS))); } - Unit* Colossus; + Creature* pColossus; ScriptedInstance* pInstance; - uint32 SurgeTimer; + uint32 uiSurgeTimer; - bool PreparationDone; - bool GoToColossus; - bool Checked; + bool bGoToColossus; void Reset() { - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - m_creature->clearUnitState(UNIT_STAT_STUNNED); + if (pColossus) + CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->CreatureState(m_creature, true); + uiSurgeTimer = 7000; + bGoToColossus = false; + } - SurgeTimer = 7000; + void EnterEvadeMode() + { + m_creature->RemoveFromWorld(); + } - GoToColossus = false; - PreparationDone = false; - Checked = false; + void MovementInform(uint32 uiType, uint32 uiId) + { + if (uiType != POINT_MOTION_TYPE) + return; + CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->CreatureState(pColossus, true); + CAST_AI(boss_drakkari_colossusAI, pColossus->AI())->bHealth1 = false; + m_creature->RemoveFromWorld(); } void UpdateAI(const uint32 diff) { //Return since we have no target - if(!UpdateVictim() || !Colossus) + if(!UpdateVictim()) return; - if(GoToColossus == false && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50) + if(!bGoToColossus && m_creature->GetHealth()*100 / m_creature->GetMaxHealth() <= 50 && pColossus->GetHealth()*100 / pColossus->GetMaxHealth() >= 6) { - m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - DoCast(Colossus, SPELL_MERGE, true); - - GoToColossus = true; - PreparationDone = true; - } - - if(GoToColossus == true && PreparationDone == true) - { - m_creature->addUnitState(UNIT_STAT_STUNNED); - m_creature->SetVisibility(VISIBILITY_OFF); - - DoCast(Colossus, SPELL_MERGE, true); - - PreparationDone = false; - - Colossus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - Colossus->clearUnitState(UNIT_STAT_STUNNED); + m_creature->InterruptNonMeleeSpells(true); + if (pColossus) + DoCast(pColossus, SPELL_MERGE); + bGoToColossus = true; } - if (SurgeTimer <= diff) + if (uiSurgeTimer <= diff) { - if(m_creature->GetVisibility() == VISIBILITY_ON) - { - Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0); - DoCast(pTarget, SPELL_SURGE, false); - } - - SurgeTimer = 7000; - } else SurgeTimer -= diff; - - if(Checked == false && Colossus->GetHealth()*100 / Colossus->GetMaxHealth() <= 5) - { - m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); - m_creature->clearUnitState(UNIT_STAT_STUNNED); - m_creature->SetVisibility(VISIBILITY_ON); - Checked = true; - } + DoCast(m_creature->getVictim(), SPELL_SURGE); + uiSurgeTimer = 7000; + } else uiSurgeTimer -= diff; - //prevent do melee if is invisible - if(m_creature->GetVisibility() == VISIBILITY_ON) - DoMeleeAttackIfReady(); + DoMeleeAttackIfReady(); } void JustDied(Unit* killer) { - if (!Colossus) + if (!pColossus) return; - - Colossus->Kill(Colossus); - Colossus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); + pColossus->Kill(pColossus); } }; @@ -243,19 +221,18 @@ struct TRINITY_DLL_DECL npc_living_mojoAI : public ScriptedAI { HeroicMode = pCreature->GetMap()->IsHeroic(); pInstance = pCreature->GetInstanceData(); - if (pCreature->GetMap()->IsDungeon()) - Colossus = pCreature->GetUnit(*pCreature, pInstance->GetData64(DATA_DRAKKARI_COLOSSUS)); + pColossus = CAST_CRE(pCreature->GetUnit(*pCreature, pInstance->GetData64(DATA_DRAKKARI_COLOSSUS))); } - Unit* Colossus; + Creature* pColossus; ScriptedInstance* pInstance; bool HeroicMode; - uint32 MojoWaveTimer; - uint32 MojoPuddleTimer; + uint32 uiMojoWaveTimer; + uint32 uiMojoPuddleTimer; void Reset() { @@ -265,8 +242,8 @@ struct TRINITY_DLL_DECL npc_living_mojoAI : public ScriptedAI else { m_creature->SetReactState(REACT_AGGRESSIVE); - MojoWaveTimer = 2000; - MojoPuddleTimer = 7000; + uiMojoWaveTimer = 2000; + uiMojoPuddleTimer = 7000; } } @@ -274,12 +251,13 @@ struct TRINITY_DLL_DECL npc_living_mojoAI : public ScriptedAI { if (m_creature->HasReactState(REACT_PASSIVE)) { - if (Colossus) + if (pColossus && !pColossus->isInCombat()) { - Colossus->RemoveAura(SPELL_FREEZE_ANIM); - Colossus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); - CAST_CRE(Colossus)->SetReactState(REACT_AGGRESSIVE); - CAST_CRE(Colossus)->AI()->AttackStart(pDone_by); + pColossus->RemoveAura(SPELL_FREEZE_ANIM); + pColossus->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); + pColossus->SetReactState(REACT_AGGRESSIVE); + if (pDone_by && pDone_by->isAlive()) + pColossus->AI()->AttackStart(pDone_by); EnterEvadeMode(); } } @@ -291,21 +269,20 @@ struct TRINITY_DLL_DECL npc_living_mojoAI : public ScriptedAI if (!UpdateVictim()) return; - if (MojoWaveTimer <= diff) + if (uiMojoWaveTimer <= diff) { DoCast(m_creature->getVictim(), HEROIC(SPELL_MOJO_WAVE, H_SPELL_MOJO_WAVE)); - MojoWaveTimer = 15000; - } else MojoWaveTimer -= diff; + uiMojoWaveTimer = 15000; + } else uiMojoWaveTimer -= diff; - if (MojoPuddleTimer <= diff) + if (uiMojoPuddleTimer <= diff) { DoCast(m_creature->getVictim(), HEROIC(SPELL_MOJO_PUDDLE, H_SPELL_MOJO_PUDDLE)); - MojoPuddleTimer = 18000; - } else MojoPuddleTimer -= diff; + uiMojoPuddleTimer = 18000; + } else uiMojoPuddleTimer -= diff; DoMeleeAttackIfReady(); } - }; CreatureAI* GetAI_boss_drakkari_colossus(Creature* pCreature) @@ -325,7 +302,7 @@ CreatureAI* GetAI_npc_living_mojo(Creature* pCreature) void AddSC_boss_drakkari_colossus() { - Script *newscript; + Script* newscript; newscript = new Script; newscript->Name = "boss_drakkari_colossus"; |