aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/CMakeLists.txt1
-rw-r--r--src/bindings/scripts/ScriptMgr.cpp2
-rw-r--r--src/bindings/scripts/VC71/71ScriptDev2.vcproj4
-rw-r--r--src/bindings/scripts/VC80/80ScriptDev2.vcproj4
-rw-r--r--src/bindings/scripts/VC90/90ScriptDev2.vcproj4
-rw-r--r--src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp490
6 files changed, 505 insertions, 0 deletions
diff --git a/src/bindings/scripts/CMakeLists.txt b/src/bindings/scripts/CMakeLists.txt
index e9bb6212d5a..5193297610d 100644
--- a/src/bindings/scripts/CMakeLists.txt
+++ b/src/bindings/scripts/CMakeLists.txt
@@ -161,6 +161,7 @@ SET(trinityscript_LIB_SRCS
scripts/zone/hellfire_citadel/blood_furnace/def_blood_furnace.h
scripts/zone/hellfire_citadel/hellfire_ramparts/boss_omor_the_unscarred.cpp
scripts/zone/hellfire_citadel/hellfire_ramparts/boss_watchkeeper_gargolmar.cpp
+ scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp
scripts/zone/hellfire_citadel/magtheridons_lair/boss_magtheridon.cpp
scripts/zone/hellfire_citadel/magtheridons_lair/def_magtheridons_lair.h
scripts/zone/hellfire_citadel/magtheridons_lair/instance_magtheridons_lair.cpp
diff --git a/src/bindings/scripts/ScriptMgr.cpp b/src/bindings/scripts/ScriptMgr.cpp
index c34cb02e4bc..4bca36cbc01 100644
--- a/src/bindings/scripts/ScriptMgr.cpp
+++ b/src/bindings/scripts/ScriptMgr.cpp
@@ -314,6 +314,7 @@ extern void AddSC_instance_shattered_halls();
//--Ramparts
extern void AddSC_boss_watchkeeper_gargolmar();
extern void AddSC_boss_omor_the_unscarred();
+extern void AddSC_boss_vazruden_the_herald();
//Hellfire Peninsula
extern void AddSC_boss_doomlordkazzak();
@@ -1519,6 +1520,7 @@ void ScriptsInit()
//--Ramparts
AddSC_boss_watchkeeper_gargolmar();
AddSC_boss_omor_the_unscarred();
+ AddSC_boss_vazruden_the_herald();
//Hellfire Peninsula
AddSC_boss_doomlordkazzak();
diff --git a/src/bindings/scripts/VC71/71ScriptDev2.vcproj b/src/bindings/scripts/VC71/71ScriptDev2.vcproj
index 1fc365b2ef9..e75de4546bb 100644
--- a/src/bindings/scripts/VC71/71ScriptDev2.vcproj
+++ b/src/bindings/scripts/VC71/71ScriptDev2.vcproj
@@ -1467,6 +1467,10 @@
RelativePath="..\scripts\zone\hellfire_citadel\hellfire_ramparts\boss_watchkeeper_gargolmar.cpp"
>
</File>
+ <File
+ RelativePath="..\scripts\zone\hellfire_citadel\hellfire_ramparts\boss_vazruden_the_herald.cpp"
+ >
+ </File>
</Filter>
<Filter
Name="Shattered Halls"
diff --git a/src/bindings/scripts/VC80/80ScriptDev2.vcproj b/src/bindings/scripts/VC80/80ScriptDev2.vcproj
index cd14a38e0d7..1c84fabba2c 100644
--- a/src/bindings/scripts/VC80/80ScriptDev2.vcproj
+++ b/src/bindings/scripts/VC80/80ScriptDev2.vcproj
@@ -1644,6 +1644,10 @@
RelativePath="..\scripts\zone\hellfire_citadel\hellfire_ramparts\boss_watchkeeper_gargolmar.cpp"
>
</File>
+ <File
+ RelativePath="..\scripts\zone\hellfire_citadel\hellfire_ramparts\boss_vazruden_the_herald.cpp"
+ >
+ </File>
</Filter>
<Filter
Name="Shattered Halls"
diff --git a/src/bindings/scripts/VC90/90ScriptDev2.vcproj b/src/bindings/scripts/VC90/90ScriptDev2.vcproj
index e9ee048714e..d903219407e 100644
--- a/src/bindings/scripts/VC90/90ScriptDev2.vcproj
+++ b/src/bindings/scripts/VC90/90ScriptDev2.vcproj
@@ -1634,6 +1634,10 @@
>
</File>
<File
+ RelativePath="..\scripts\zone\hellfire_citadel\hellfire_ramparts\boss_vazruden_the_herald.cpp"
+ >
+ </File>
+ <File
RelativePath="..\scripts\zone\hellfire_citadel\hellfire_ramparts\boss_watchkeeper_gargolmar.cpp"
>
</File>
diff --git a/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp b/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp
new file mode 100644
index 00000000000..a62c4e06217
--- /dev/null
+++ b/src/bindings/scripts/scripts/zone/hellfire_citadel/hellfire_ramparts/boss_vazruden_the_herald.cpp
@@ -0,0 +1,490 @@
+/* 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
+ */
+
+/* ScriptData
+Name: Boss_Vazruden_the_Herald
+%Complete: 90
+Comment:
+Category: Hellfire Citadel, Hellfire Ramparts
+EndScriptData */
+
+#include "precompiled.h"
+
+#define SPELL_FIREBALL (HeroicMode?36920:34653)
+#define SPELL_CONE_OF_FIRE (HeroicMode?36921:30926)
+#define SPELL_SUMMON_LIQUID_FIRE (HeroicMode?30928:23971)
+#define SPELL_BELLOWING_ROAR 39427
+#define SPELL_REVENGE (HeroicMode?40392:19130)
+#define SPELL_KIDNEY_SHOT 30621
+#define SPELL_FIRE_NOVA_VISUAL 19823
+
+#define ENTRY_HELLFIRE_SENTRY 17517
+#define ENTRY_VAZRUDEN_HERALD 17307
+#define ENTRY_VAZRUDEN 17537
+#define ENTRY_NAZAN 17536
+#define ENTRY_LIQUID_FIRE 22515
+#define ENTRY_REINFORCED_FEL_IRON_CHEST (HeroicMode?185169:185168)
+
+#define SAY_INTRO -1543017
+#define SAY_WIPE -1543018
+#define SAY_AGGRO_1 -1543019
+#define SAY_AGGRO_2 -1543020
+#define SAY_AGGRO_3 -1543021
+#define SAY_KILL_1 -1543022
+#define SAY_KILL_2 -1543023
+#define SAY_DIE -1543024
+#define EMOTE -1543025
+
+#define PATH_ENTRY 2081
+
+const float VazrudenMiddle[3] = {-1406.5, 1746.5, 81.2};
+const float VazrudenRing[2][3] =
+{
+ {-1430, 1705, 112},
+ {-1377, 1760, 112}
+};
+
+struct TRINITY_DLL_DECL boss_nazanAI : public ScriptedAI
+{
+ boss_nazanAI(Creature *c) : ScriptedAI(c)
+ {
+ HeroicMode = m_creature->GetMap()->IsHeroic();
+ VazrudenGUID = 0;
+ flight = true;
+ Reset();
+ }
+
+ uint32 Fireball_Timer;
+ uint32 ConeOfFire_Timer;
+ uint32 BellowingRoar_Timer;
+ uint32 Fly_Timer;
+ uint32 Turn_Timer;
+ uint32 UnsummonCheck;
+ bool flight;
+ uint64 VazrudenGUID;
+ bool HeroicMode;
+ SpellEntry *liquid_fire;
+
+ void Reset()
+ {
+ Fireball_Timer = 4000;
+ Fly_Timer = 45000;
+ Turn_Timer = 0;
+ UnsummonCheck = 5000;
+ }
+
+ void Aggro(Unit* who) {}
+
+ void JustSummoned(Creature *summoned)
+ {
+ if(summoned && summoned->GetEntry() == ENTRY_LIQUID_FIRE)
+ {
+ summoned->SetLevel(m_creature->getLevel());
+ summoned->setFaction(m_creature->getFaction());
+ summoned->CastSpell(summoned,SPELL_SUMMON_LIQUID_FIRE,true);
+ summoned->CastSpell(summoned,SPELL_FIRE_NOVA_VISUAL,true);
+ }
+ }
+
+ void SpellHitTarget(Unit* target, const SpellEntry* entry)
+ {
+ if(target && entry->Id == SPELL_FIREBALL)
+ m_creature->SummonCreature(ENTRY_LIQUID_FIRE,target->GetPositionX(),target->GetPositionY(),target->GetPositionZ(),target->GetOrientation(),TEMPSUMMON_TIMED_DESPAWN,30000);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
+ {
+ if(UnsummonCheck < diff && m_creature->isAlive())
+ {
+ m_creature->SetLootRecipient(NULL);
+ m_creature->SetVisibility(VISIBILITY_OFF);
+ m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ m_creature->RemoveCorpse();
+ }else UnsummonCheck -= diff;
+ return;
+ }
+
+ if(Fireball_Timer < diff)
+ {
+ if(Unit *victim = SelectUnit(SELECT_TARGET_RANDOM,0))
+ DoCast(victim, SPELL_FIREBALL,true);
+ Fireball_Timer = 4000+rand()%3000;
+ }else Fireball_Timer -= diff;
+
+ if(flight) // phase 1 - the flight
+ {
+ Creature *Vazruden = (Creature*)Unit::GetUnit(*m_creature,VazrudenGUID);
+ if(Fly_Timer < diff || !(Vazruden && Vazruden->isAlive() && (Vazruden->GetHealth()*5 > Vazruden->GetMaxHealth())))
+ {
+ flight = false;
+ BellowingRoar_Timer = 6000;
+ ConeOfFire_Timer = 12000;
+ m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
+ m_creature->AddUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
+ m_creature->GetMotionMaster()->Clear();
+ if(Unit *victim = SelectUnit(SELECT_TARGET_NEAREST,0))
+ m_creature->AI()->AttackStart(victim);
+ DoStartMovement(m_creature->getVictim());
+ DoScriptText(EMOTE, m_creature);
+ return;
+ }else Fly_Timer -= diff;
+
+ if(Turn_Timer < diff)
+ {
+ uint32 waypoint = (Fly_Timer/10000)%2;
+ if(m_creature->GetDistance(VazrudenRing[waypoint][0],VazrudenRing[waypoint][1],VazrudenRing[waypoint][2]) > 5)
+ m_creature->GetMotionMaster()->MovePoint(0,VazrudenRing[waypoint][0],VazrudenRing[waypoint][1],VazrudenRing[waypoint][2]);
+ Turn_Timer = 10000;
+ }else Turn_Timer -= diff;
+ }
+ else // phase 2 - land fight
+ {
+ if(ConeOfFire_Timer < diff)
+ {
+ DoCast(m_creature, SPELL_CONE_OF_FIRE);
+ ConeOfFire_Timer = 12000;
+ Fireball_Timer = 4000;
+ }else ConeOfFire_Timer -= diff;
+
+ if(HeroicMode && BellowingRoar_Timer < diff)
+ {
+ DoCast(m_creature, SPELL_BELLOWING_ROAR);
+ BellowingRoar_Timer = 45000;
+ }else BellowingRoar_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+ }
+};
+
+struct TRINITY_DLL_DECL boss_vazrudenAI : public ScriptedAI
+{
+ boss_vazrudenAI(Creature *c) : ScriptedAI(c)
+ {
+ HeroicMode = m_creature->GetMap()->IsHeroic();
+ Reset();
+ }
+
+ uint32 Revenge_Timer;
+ bool HeroicMode;
+ bool WipeSaid;
+ uint32 UnsummonCheck;
+
+ void Reset()
+ {
+ Revenge_Timer = 4000;
+ UnsummonCheck = 2000;
+ WipeSaid = false;
+ }
+
+ void Aggro(Unit *who)
+ {
+ switch(rand()%3)
+ {
+ case 0: DoScriptText(SAY_AGGRO_1, m_creature); break;
+ case 1: DoScriptText(SAY_AGGRO_2, m_creature); break;
+ default: DoScriptText(SAY_AGGRO_3, m_creature); break;
+ }
+ }
+
+ void KilledUnit(Unit* who)
+ {
+ if(who && who->GetEntry()!=ENTRY_VAZRUDEN)
+ switch(rand()%2)
+ {
+ case 0: DoScriptText(SAY_KILL_1, m_creature); break;
+ default: DoScriptText(SAY_KILL_2, m_creature); break;
+ }
+ }
+
+ void JustDied(Unit* who)
+ {
+ if(who && who != m_creature)
+ DoScriptText(SAY_DIE, m_creature);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
+ {
+ if(UnsummonCheck < diff && m_creature->isAlive())
+ {
+ if(!WipeSaid)
+ {
+ DoScriptText(SAY_WIPE, m_creature);
+ WipeSaid = true;
+ }
+ m_creature->SetLootRecipient(NULL);
+ m_creature->SetVisibility(VISIBILITY_OFF);
+ m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ m_creature->RemoveCorpse();
+ }else UnsummonCheck -= diff;
+ return;
+ }
+
+ if(Revenge_Timer < diff)
+ {
+ if(Unit *victim = m_creature->getVictim())
+ DoCast(victim, SPELL_REVENGE);
+ Revenge_Timer = 5000;
+ }else Revenge_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+struct TRINITY_DLL_DECL boss_vazruden_the_heraldAI : public ScriptedAI
+{
+ boss_vazruden_the_heraldAI(Creature *c) : ScriptedAI(c)
+ {
+ summoned = false;
+ sentryDown = false;
+ NazanGUID = 0;
+ VazrudenGUID = 0;
+ HeroicMode = m_creature->GetMap()->IsHeroic();
+ Reset();
+ }
+
+ uint32 phase;
+ uint32 waypoint;
+ uint32 check;
+ bool sentryDown;
+ uint64 NazanGUID;
+ uint64 VazrudenGUID;
+ bool summoned;
+ bool HeroicMode;
+
+ void Reset()
+ {
+ phase = 0;
+ waypoint = 0;
+ check = 0;
+ UnsummonAdds();
+ m_creature->GetMotionMaster()->MovePath(PATH_ENTRY, true);
+ }
+
+ void UnsummonAdds()
+ {
+ if(summoned)
+ {
+ Creature *Nazan = (Creature*)Unit::GetUnit(*m_creature, NazanGUID);
+ Creature *Vazruden = (Creature*)Unit::GetUnit(*m_creature, VazrudenGUID);
+ if(Nazan || (Nazan = (Creature *)FindCreature(ENTRY_NAZAN, 5000)))
+ {
+ Nazan->SetLootRecipient(NULL);
+ Nazan->SetVisibility(VISIBILITY_OFF);
+ Nazan->DealDamage(Nazan, Nazan->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ Nazan->RemoveCorpse();
+ NazanGUID = 0;
+ }
+ if(Vazruden || (Vazruden = (Creature *)FindCreature(ENTRY_VAZRUDEN, 5000)))
+ {
+ Vazruden->SetLootRecipient(NULL);
+ Vazruden->SetVisibility(VISIBILITY_OFF);
+ Vazruden->DealDamage(Vazruden, Vazruden->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ Vazruden->RemoveCorpse();
+ VazrudenGUID = 0;
+ }
+ summoned = false;
+ m_creature->clearUnitState(UNIT_STAT_ROOT);
+ m_creature->SetVisibility(VISIBILITY_ON);
+ }
+ }
+
+ void SummonAdds()
+ {
+ if(!summoned)
+ {
+ Creature* Vazruden = m_creature->SummonCreature(ENTRY_VAZRUDEN,VazrudenMiddle[0],VazrudenMiddle[1],VazrudenMiddle[2],0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,6000000);
+ VazrudenGUID = Vazruden->GetGUID();
+ Creature* Nazan = m_creature->SummonCreature(ENTRY_NAZAN,VazrudenMiddle[0],VazrudenMiddle[1],VazrudenMiddle[2],0,TEMPSUMMON_CORPSE_TIMED_DESPAWN,6000000);
+ NazanGUID = Nazan->GetGUID();
+ summoned = true;
+ m_creature->SetVisibility(VISIBILITY_OFF);
+ m_creature->addUnitState(UNIT_STAT_ROOT);
+ }
+ }
+
+ void Aggro(Unit *who)
+ {
+ if(phase==0)
+ {
+ phase = 1;
+ check = 0;
+ DoScriptText(SAY_INTRO, m_creature);
+ }
+ }
+
+ void JustSummoned(Creature *summoned)
+ {
+ if(!summoned) return;
+ Unit *victim = m_creature->getVictim();
+ if(summoned->GetEntry() == ENTRY_NAZAN)
+ {
+ ((boss_nazanAI *)summoned->AI())->VazrudenGUID = VazrudenGUID;
+ summoned->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
+ summoned->SetSpeed(MOVE_FLIGHT, 2.5);
+ if(victim)
+ ((ScriptedAI*)summoned->AI())->AttackStart(victim,false);
+ }
+ else if(victim)
+ summoned->AI()->AttackStart(victim);
+ }
+
+ void SentryDownBy(Unit* killer)
+ {
+ if(sentryDown)
+ {
+ AttackStart(killer, false);
+ sentryDown = false;
+ }
+ else
+ sentryDown = true;
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ switch(phase)
+ {
+ case 0: // circle around the platform
+ return;
+ break;
+ case 1: // go to the middle and begin the fight
+ if(check < diff)
+ {
+ if(m_creature->GetDistance(VazrudenMiddle[0],VazrudenMiddle[1],VazrudenMiddle[2])>5)
+ {
+ m_creature->GetMotionMaster()->Clear();
+ m_creature->GetMotionMaster()->MovePoint(0,VazrudenMiddle[0],VazrudenMiddle[1],VazrudenMiddle[2]);
+ check = 1000;
+ }
+ else
+ {
+ SummonAdds();
+ phase = 2;
+ return;
+ }
+ }else check -= diff;
+ break;
+ default: // adds do the job now
+ if(check < diff)
+ {
+ Creature *Nazan = (Creature*)Unit::GetUnit(*m_creature, NazanGUID);
+ Creature *Vazruden = (Creature*)Unit::GetUnit(*m_creature, VazrudenGUID);
+ if(Nazan && Nazan->isAlive() || Vazruden && Vazruden->isAlive())
+ {
+ if(Nazan && Nazan->getVictim() || Vazruden && Vazruden->getVictim())
+ return;
+ else
+ {
+ UnsummonAdds();
+ EnterEvadeMode();
+ }
+ }else
+ {
+ m_creature->SummonGameObject(ENTRY_REINFORCED_FEL_IRON_CHEST,VazrudenMiddle[0],VazrudenMiddle[1],VazrudenMiddle[2],0,0,0,0,0,0);
+ m_creature->SetLootRecipient(NULL);
+ m_creature->DealDamage(m_creature, m_creature->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
+ }
+ check = 2000;
+ }else check -= diff;
+ break;
+ }
+ }
+};
+
+struct TRINITY_DLL_DECL mob_hellfire_sentryAI : public ScriptedAI
+{
+ mob_hellfire_sentryAI(Creature *c) : ScriptedAI(c)
+ { Reset();}
+
+ uint32 KidneyShot_Timer;
+
+ void Reset()
+ {
+ KidneyShot_Timer = 3000+rand()%4000;
+ }
+
+ void Aggro(Unit* who) {}
+
+ void JustDied(Unit* who)
+ {
+ if(Creature *herald = (Creature *)FindCreature(ENTRY_VAZRUDEN_HERALD,150))
+ ((boss_vazruden_the_heraldAI *)herald->AI())->SentryDownBy(who);
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!m_creature->SelectHostilTarget() || !m_creature->getVictim())
+ return;
+
+ if(KidneyShot_Timer < diff)
+ {
+ if(Unit *victim = m_creature->getVictim())
+ DoCast(victim, SPELL_KIDNEY_SHOT);
+ KidneyShot_Timer = 20000;
+ }else KidneyShot_Timer -= diff;
+
+ DoMeleeAttackIfReady();
+ }
+};
+
+CreatureAI* GetAI_boss_vazruden_the_herald(Creature *_Creature)
+{
+ return new boss_vazruden_the_heraldAI (_Creature);
+}
+
+CreatureAI* GetAI_boss_vazruden(Creature *_Creature)
+{
+ return new boss_vazrudenAI (_Creature);
+}
+
+
+CreatureAI* GetAI_boss_nazan(Creature *_Creature)
+{
+ return new boss_nazanAI (_Creature);
+}
+
+CreatureAI* GetAI_mob_hellfire_sentry(Creature *_Creature)
+{
+ return new mob_hellfire_sentryAI (_Creature);
+}
+
+void AddSC_boss_vazruden_the_herald()
+{
+ Script *newscript;
+ newscript = new Script;
+ newscript->Name="boss_vazruden_the_herald";
+ newscript->GetAI = &GetAI_boss_vazruden_the_herald;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name="boss_vazruden";
+ newscript->GetAI = &GetAI_boss_vazruden;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name="boss_nazan";
+ newscript->GetAI = &GetAI_boss_nazan;
+ newscript->RegisterSelf();
+
+ newscript = new Script;
+ newscript->Name="mob_hellfire_sentry";
+ newscript->GetAI = &GetAI_mob_hellfire_sentry;
+ newscript->RegisterSelf();
+} \ No newline at end of file