diff options
author | maanuel <none@none> | 2009-12-07 03:32:41 -0300 |
---|---|---|
committer | maanuel <none@none> | 2009-12-07 03:32:41 -0300 |
commit | ba0f7c74bea1ba75e7987ca169e8e4be13b2265a (patch) | |
tree | 67f8c62f556a2668253d443e45583f21cd50543e /src | |
parent | f803854b8589bfef162f2a2418d428dd3826e78c (diff) |
Script for Boss Ichoron from Violet Hold, original author ckegg.
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/scripts/northrend/violet_hold/boss_ichoron.cpp | 255 |
1 files changed, 230 insertions, 25 deletions
diff --git a/src/bindings/scripts/scripts/northrend/violet_hold/boss_ichoron.cpp b/src/bindings/scripts/scripts/northrend/violet_hold/boss_ichoron.cpp index 6ea9cbfe530..27ff6a00a14 100644 --- a/src/bindings/scripts/scripts/northrend/violet_hold/boss_ichoron.cpp +++ b/src/bindings/scripts/scripts/northrend/violet_hold/boss_ichoron.cpp @@ -1,27 +1,46 @@ +/* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + /* Script Data Start SDName: Boss ichoron -SDAuthor: LordVanMartin +SDAuthor: ckegg SD%Complete: SDComment: SDCategory: Script Data End */ -/*** SQL START *** -update creature_template set scriptname = '' where entry = ''; -*** SQL END ***/ #include "precompiled.h" #include "violet_hold.h" enum Spells { - SPELL_DRAINED = 59820, - SPELL_FRENZY = 54312, - H_SPELL_FRENZY = 59522, - SPELL_PROTECTIVE_BUBBLE = 54306, - SPELL_WATER_BLAST = 54237, - H_SPELL_WATER_BLAST = 59520, - SPELL_WATER_BOLT_VOLLEY = 54241, - H_SPELL_WATER_BOLT_VOLLEY = 59521 + SPELL_DRAINED = 59820, + SPELL_FRENZY = 54312, + SPELL_FRENZY_H = 59522, + SPELL_PROTECTIVE_BUBBLE = 54306, + SPELL_WATER_BLAST = 54237, + SPELL_WATER_BLAST_H = 59520, + SPELL_WATER_BOLT_VOLLEY = 54241, + SPELL_WATER_BOLT_VOLLEY_H = 59521, + SPELL_SPLASH = 59516, +}; + +enum Creatures +{ + NPC_ICHOR_GLOBULE = 29321, }; //not in db @@ -38,27 +57,52 @@ enum Yells SAY_BUBBLE = -1608026 }; -enum CombatPhase +struct Locations +{ + float x, y, z; + uint32 id; +}; + +static Locations PortalLoc[]= { - BUBBLED, - SUMMONS, - DPS + {1857.125, 763.295, 38.654}, + {1925.480, 849.981, 47.174}, + {1892.737, 744.589, 47.666}, + {1878.198, 850.005, 43.333}, + {1909.381, 806.796, 38.645}, + {1936.101, 802.950, 52.417}, }; struct TRINITY_DLL_DECL boss_ichoronAI : public ScriptedAI { - boss_ichoronAI(Creature *c) : ScriptedAI(c) + boss_ichoronAI(Creature* pCreature) : ScriptedAI(pCreature) { - pInstance = c->GetInstanceData(); + pInstance = pCreature->GetInstanceData(); + HeroicMode = pCreature->GetMap()->IsHeroic(); } - CombatPhase Phase; + bool HeroicMode; + bool bIsExploded; + bool bIsFrenzy; + + uint32 uiBuubleChecker_Timer; + uint32 uiWaterBoltVolley_Timer; + uint32 uiShowup_Counter; ScriptedInstance* pInstance; + std::list<uint64> m_lWaterElementsGUIDList; + void Reset() { - Phase = BUBBLED; + bIsExploded = false; + bIsFrenzy = false; + uiBuubleChecker_Timer = 1000; + uiWaterBoltVolley_Timer = urand(10000, 15000); + uiShowup_Counter = 0; + + m_creature->SetVisibility(VISIBILITY_ON); + DespawnWaterElements(); if (pInstance) { @@ -68,10 +112,11 @@ struct TRINITY_DLL_DECL boss_ichoronAI : public ScriptedAI pInstance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); } } - void EnterCombat(Unit* who) + + void EnterCombat(Unit* pWho) { DoScriptText(SAY_AGGRO, m_creature); - + DoCast(m_creature, SPELL_PROTECTIVE_BUBBLE); if (pInstance) @@ -82,22 +127,116 @@ struct TRINITY_DLL_DECL boss_ichoronAI : public ScriptedAI pInstance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); } } - - void MoveInLineOfSight(Unit* who) {} - void UpdateAI(const uint32 diff) + void WaterElementHit() + { + m_creature->SetHealth(m_creature->GetHealth() + m_creature->GetMaxHealth() * 0.01); + if (bIsExploded) + { + DoCast(m_creature, SPELL_PROTECTIVE_BUBBLE); + bIsExploded = false; + m_creature->SetVisibility(VISIBILITY_ON); + m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); + } + } + + void DespawnWaterElements() + { + if (m_lWaterElementsGUIDList.empty()) + return; + + for(std::list<uint64>::iterator itr = m_lWaterElementsGUIDList.begin(); itr != m_lWaterElementsGUIDList.end(); ++itr) + { + if (Creature* pTemp = (Creature*)Unit::GetUnit(*m_creature, *itr)) + { + if (pTemp->isAlive()) + pTemp->Kill(pTemp, false); + } + } + m_lWaterElementsGUIDList.clear(); + } + + void MoveInLineOfSight(Unit* pWho) {} + + void UpdateAI(const uint32 uiDiff) { //Return since we have no target if (!UpdateVictim()) return; + if (!bIsFrenzy) + { + if (uiBuubleChecker_Timer < uiDiff) + { + if (!bIsExploded) + { + if (!m_creature->HasAura(SPELL_PROTECTIVE_BUBBLE, 0)) + { + DoCast(m_creature, HEROIC(SPELL_WATER_BLAST, SPELL_WATER_BLAST_H)); + //DoCast(m_creature, SPELL_DRAINED); + bIsExploded = true; + uiShowup_Counter = 0; + m_creature->AttackStop(); + m_creature->SetVisibility(VISIBILITY_OFF); + for(uint8 i = 0; i < 10; i++) + { + //int tmp = urand(0, 5); + //m_creature->SummonCreature(NPC_ICHOR_GLOBULE, PortalLoc[tmp].x, PortalLoc[tmp].y, PortalLoc[tmp].z, 0, TEMPSUMMON_CORPSE_DESPAWN, 0); + m_creature->SummonCreature(NPC_ICHOR_GLOBULE, m_creature->GetPositionX()-10+rand()%20, m_creature->GetPositionY()-10+rand()%20, m_creature->GetPositionZ(), 0, TEMPSUMMON_CORPSE_DESPAWN, 0); + } + } + uiBuubleChecker_Timer = 3000; + } + else + { + bool bIsWaterElementsAlive = false; + ++uiShowup_Counter; + if (!m_lWaterElementsGUIDList.empty()) + { + for(std::list<uint64>::iterator itr = m_lWaterElementsGUIDList.begin(); itr != m_lWaterElementsGUIDList.end(); ++itr) + if (Creature* pTemp = (Creature*)Unit::GetUnit(*m_creature, *itr)) + if (pTemp->isAlive()) + bIsWaterElementsAlive = true; + } + if (!bIsWaterElementsAlive || uiShowup_Counter > 20) + { + DoCast(m_creature, SPELL_PROTECTIVE_BUBBLE); + bIsExploded = false; + uiShowup_Counter = 0; + m_creature->SetVisibility(VISIBILITY_ON); + m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); + } + uiBuubleChecker_Timer = 1000; + } + } + else uiBuubleChecker_Timer -= uiDiff; + } + + if (!bIsExploded) + { + if (uiWaterBoltVolley_Timer < uiDiff) + { + DoCast(m_creature, HEROIC(SPELL_WATER_BOLT_VOLLEY, SPELL_WATER_BOLT_VOLLEY_H)); + uiWaterBoltVolley_Timer = urand(10000, 15000); + } + else uiWaterBoltVolley_Timer -= uiDiff; + + if (!bIsFrenzy && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 25) + { + DoCast(m_creature, HEROIC(SPELL_FRENZY, SPELL_FRENZY_H)); + bIsFrenzy = true; + } + DoMeleeAttackIfReady(); + } } void JustDied(Unit* killer) { DoScriptText(SAY_DEATH, m_creature); + DespawnWaterElements(); + if (pInstance) { if (pInstance->GetData(DATA_WAVE_COUNT) == 6) @@ -113,6 +252,13 @@ struct TRINITY_DLL_DECL boss_ichoronAI : public ScriptedAI } } + void JustSummoned(Creature* pSummoned) + { + pSummoned->SetSpeed(MOVE_RUN, 0.2f); + pSummoned->GetMotionMaster()->MoveFollow(m_creature, 0, 0); + m_lWaterElementsGUIDList.push_back(pSummoned->GetGUID()); + } + void KilledUnit(Unit *victim) { if (victim == m_creature) @@ -126,6 +272,60 @@ CreatureAI* GetAI_boss_ichoron(Creature* pCreature) return new boss_ichoronAI (pCreature); } +struct TRINITY_DLL_DECL mob_ichor_globuleAI : public ScriptedAI +{ + mob_ichor_globuleAI(Creature* pCreature) : ScriptedAI(pCreature) + { + pInstance = pCreature->GetInstanceData(); + } + + ScriptedInstance* pInstance; + + uint32 uiRangeCheck_Timer; + + void Reset() + { + uiRangeCheck_Timer = 1000; + } + + void AttackStart(Unit* pWho) + { + return; + } + + void UpdateAI(const uint32 uiDiff) + { + if (uiRangeCheck_Timer < uiDiff) + { + if (pInstance) + { + if (Creature* pIchoron = ((Creature*)Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_ICHORON)))) + { + //maybe 12.0f is not offlike, maybe 2.00f ? + float fDistance = m_creature->GetDistance(pIchoron); + if (m_creature->IsWithinDist(pIchoron, fDistance <= 12.0f , false)) + { + ((boss_ichoronAI*)pIchoron->AI())->WaterElementHit(); + m_creature->Kill(m_creature, false); + } + } + } + uiRangeCheck_Timer = 1000; + } + else uiRangeCheck_Timer -= uiDiff; + } + + void JustDied(Unit* pKiller) + { + DoCast(m_creature, SPELL_SPLASH); + } +}; + +CreatureAI* GetAI_mob_ichor_globule(Creature* pCreature) +{ + return new mob_ichor_globuleAI (pCreature); +} + void AddSC_boss_ichoron() { Script *newscript; @@ -134,4 +334,9 @@ void AddSC_boss_ichoron() newscript->Name = "boss_ichoron"; newscript->GetAI = &GetAI_boss_ichoron; newscript->RegisterSelf(); + + newscript = new Script; + newscript->Name = "mob_ichor_globule"; + newscript->GetAI = &GetAI_mob_ichor_globule; + newscript->RegisterSelf(); } |