*Add Vazruden the Herald script - by Iskander

--HG--
branch : trunk
This commit is contained in:
Blaymoira
2009-01-23 20:34:30 +01:00
parent 577edf5d49
commit c3ce24c30f
8 changed files with 542 additions and 0 deletions
+1
View File
@@ -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
+2
View File
@@ -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();
@@ -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"
@@ -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"
@@ -1633,6 +1633,10 @@
RelativePath="..\scripts\zone\hellfire_citadel\hellfire_ramparts\boss_omor_the_unscarred.cpp"
>
</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"
>
@@ -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();
}