* Add basic script for Assembly of Iron in Ulduar

* Add instance script for Ulduar

--HG--
branch : trunk
This commit is contained in:
Machiavelli
2009-08-20 22:37:46 +02:00
parent f7bc620f4f
commit 06b9e69b79
5 changed files with 669 additions and 4 deletions

View File

@@ -1050,7 +1050,7 @@ UPDATE `gameobject_template` SET `ScriptName`='go_altar_of_the_keepers' WHERE `e
UPDATE `gameobject_template` SET `ScriptName`='go_altar_of_archaedas' WHERE `entry`=133234;
/* ULDUAR */
/* UPDATE `instance_template` SET `script`='instance_ulduar' WHERE `map`=603; */
UPDATE `instance_template` SET `script`='instance_ulduar' WHERE `map`=603;
UPDATE `creature_template` SET `ScriptName` = 'boss_auriaya' WHERE `entry` = 33515;
UPDATE `creature_template` SET `ScriptName` = 'boss_flame_leviathan' WHERE `entry` = 33113;
UPDATE `creature_template` SET `ScriptName` = 'boss_flame_leviathan_turret' WHERE entry=33139;
@@ -1060,6 +1060,12 @@ UPDATE `creature_template` SET `ScriptName` = 'boss_flame_leviathan_overload_dev
UPDATE `creature_template` SET `ScriptName` = 'boss_ignis' WHERE `entry` = 33118;
UPDATE `creature_template` SET `ScriptName` = 'boss_razorscale' WHERE `entry` = 33186;
UPDATE `creature_template` SET `ScriptName` = 'boss_xt002' WHERE `entry` = 33293;
UPDATE `creature_template` SET `ScriptName` = 'boss_steelbreaker' WHERE `entry` = 32867;
UPDATE `creature_template` SET `ScriptName` = 'boss_runemaster_molgeim' WHERE `entry` = 32927;
UPDATE `creature_template` SET `ScriptName` = 'boss_stormcaller_brundir' WHERE `entry` = 32857;
UPDATE `creature_template` SET `ScriptName` = 'mob_lightning_elemental' WHERE `entry` = 32958;
UPDATE `creature_template` SET `ScriptName` = 'mob_rune_of_summoning' WHERE `entry` = 33051;
/* UN'GORO CRATER */
UPDATE `creature_template` SET `ScriptName`='npc_ame' WHERE `entry`=9623;

View File

@@ -16,5 +16,558 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
SDName: Assembly of Iron encounter
SD%Complete: 60%
SDComment: Runes need DB support, chain lightning won't cast, supercharge won't cast (target error?) - it worked before during debugging.
SDCategory: Ulduar - Ulduar
EndScriptData */
#include "precompiled.h"
#include "def_ulduar.h"
// Any boss
#define SPELL_SUPERCHARGE 61920
#define SPELL_BERSERK 47008 // Hard enrage, don't know the correct ID.
// Steelbreaker
#define SPELL_HIGH_VOLTAGE 61890
#define SPELL_HIGH_VOLTAGE_H 63498
#define SPELL_FUSION_PUNCH 61903
#define SPELL_FUSION_PUNCH_H 63493
#define SPELL_STATIC_DISRUPTION 44008
#define SPELL_STATIC_DISRUPTION_H 63494
#define SPELL_OVERWHELMING_POWER_H 61888
#define SPELL_OVERWHELMING_POWER 64637
#define SPELL_ELECTRICAL_CHARGE 61902
// Runemaster Molgeim
#define SPELL_SHIELD_OF_RUNES 62274
#define SPELL_SHIELD_OF_RUNES_H 63489
#define SPELL_RUNE_OF_POWER 64320
#define SPELL_RUNE_OF_DEATH 62269
#define SPELL_RUNE_OF_SUMMONING 62273
#define SPELL_LIGHTNING_BLAST 62054
#define SPELL_LIGHTNING_BLAST_H 63491
#define CREATURE_RUNE_OF_SUMMONING 33051
// Stormcaller Brundir
#define SPELL_CHAIN_LIGHTNING_N 61879
#define SPELL_CHAIN_LIGHTNING_H 63479
#define SPELL_OVERLOAD 61869
#define SPELL_OVERLOAD_H 63481
#define SPELL_LIGHTNING_WHIRL 61915
#define SPELL_LIGHTNING_WHIRL_H 63483
#define SPELL_LIGHTNING_TENDRILS 61887
#define SPELL_LIGHTNING_TENDRILS_H 63486
#define SPELL_STORMSHIELD 64187
enum
{
EVENT_ENRAGE,
// Steelbreaker
EVENT_FUSION_PUNCH,
EVENT_STATIC_DISRUPTION,
EVENT_OVERWHELMING_POWER,
// Molgeim
EVENT_RUNE_OF_POWER,
EVENT_SHIELD_OF_RUNES,
EVENT_RUNE_OF_DEATH,
EVENT_RUNE_OF_SUMMONING,
EVENT_LIGHTNING_BLAST,
// Brundir
EVENT_CHAIN_LIGHTNING,
EVENT_OVERLOAD,
EVENT_LIGHTNING_WHIRL,
EVENT_LIGHTNING_TENDRILS,
EVENT_STORMSHIELD,
MAX_EVENT
};
bool IsEncounterComplete(ScriptedInstance* pInstance, Creature* m_creature)
{
if (!pInstance || !m_creature)
return false;
for(uint8 i = 0; i < 3; ++i)
{
uint64 guid = pInstance->GetData64(DATA_STEELBREAKER+i);
if(!guid)
return false;
if(Creature *boss = (Unit::GetCreature((*m_creature), guid)))
{
if(boss->isAlive())
return false;
continue;
}
else
return false;
}
return true;
}
struct TRINITY_DLL_DECL boss_steelbreakerAI : public ScriptedAI
{
boss_steelbreakerAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
if(!pInstance)
return;
Reset();
}
void Reset()
{
events.Reset();
phase = 0;
m_creature->RemoveAllAuras();
pInstance->SetData(DATA_ASSEMBLY, NOT_STARTED);
}
EventMap events;
ScriptedInstance* pInstance;
uint32 phase;
void EnterCombat(Unit *who)
{
DoZoneInCombat();
DoCast(m_creature, (HeroicMode) ? SPELL_HIGH_VOLTAGE_H : SPELL_HIGH_VOLTAGE);
events.ScheduleEvent(EVENT_ENRAGE, 900000);
UpdatePhase();
}
void UpdatePhase()
{
++phase;
events.SetPhase(phase);
events.RescheduleEvent(EVENT_FUSION_PUNCH, 15000);
if(phase >= 2)
events.RescheduleEvent(EVENT_STATIC_DISRUPTION, 30000);
if(phase >= 3)
events.RescheduleEvent(EVENT_OVERWHELMING_POWER, rand()%5000);
}
void DamageTaken(Unit* pKiller, uint32 &damage)
{
if(damage >= m_creature->GetHealth())
{
if(Creature* Brundir = Unit::GetCreature((*m_creature), pInstance->GetData64(DATA_STORMCALLER_BRUNDIR)))
if(Brundir->isAlive())
{
Brundir->SetHealth(Brundir->GetMaxHealth());
}
if(Creature* Molgeim = Unit::GetCreature((*m_creature), pInstance->GetData64(DATA_RUNEMASTER_MOLGEIM)))
if(Molgeim->isAlive())
{
Molgeim->SetHealth(Molgeim->GetMaxHealth());
}
DoCast(SPELL_SUPERCHARGE);
}
}
void JustDied(Unit* Killer)
{
if(IsEncounterComplete(pInstance, m_creature))
pInstance->SetData(DATA_ASSEMBLY, DONE);
}
void KilledUnit(Unit *who)
{
if(phase == 3)
DoCast(m_creature, SPELL_ELECTRICAL_CHARGE);
}
void SpellHit(Unit *from, const SpellEntry *spell)
{
if(spell->Id == SPELL_SUPERCHARGE)
UpdatePhase();
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
while(uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_ENRAGE:
DoCast(SPELL_BERSERK);
break;
case EVENT_FUSION_PUNCH:
DoCast(me->getVictim(), (HeroicMode) ? SPELL_FUSION_PUNCH : SPELL_FUSION_PUNCH_H);
events.ScheduleEvent(EVENT_FUSION_PUNCH, 13000 + (rand()%9)*1000);
break;
case EVENT_STATIC_DISRUPTION:
{
Unit *target = SelectTarget(SELECT_TARGET_RANDOM);
DoCast(target, (HeroicMode) ? SPELL_STATIC_DISRUPTION : SPELL_STATIC_DISRUPTION_H);
events.ScheduleEvent(EVENT_STATIC_DISRUPTION, 20000 + (rand()%20)*1000);
}
break;
case EVENT_OVERWHELMING_POWER:
DoCast(me->getVictim(), (HeroicMode) ? SPELL_OVERWHELMING_POWER_H : SPELL_OVERWHELMING_POWER);
events.ScheduleEvent(EVENT_OVERWHELMING_POWER, (HeroicMode) ? 35000 : 60000);
break;
}
}
DoMeleeAttackIfReady();
}
};
struct TRINITY_DLL_DECL boss_runemaster_molgeimAI : public ScriptedAI
{
boss_runemaster_molgeimAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
if(!pInstance)
return;
Reset();
}
void Reset()
{
pInstance->SetData(DATA_ASSEMBLY, NOT_STARTED);
events.Reset();
m_creature->RemoveAllAuras();
phase = 0;
}
ScriptedInstance* pInstance;
EventMap events;
uint32 phase;
void EnterCombat(Unit* who)
{
DoZoneInCombat();
events.ScheduleEvent(EVENT_ENRAGE, 900000);
UpdatePhase();
}
void UpdatePhase()
{
++phase;
events.SetPhase(phase);
events.RescheduleEvent(EVENT_SHIELD_OF_RUNES, 27000);
events.RescheduleEvent(EVENT_RUNE_OF_POWER, 60000);
if(phase >= 2)
events.RescheduleEvent(EVENT_RUNE_OF_DEATH, 30000);
if(phase >= 3)
events.RescheduleEvent(EVENT_RUNE_OF_SUMMONING, 20000+(rand()%10)*1000);
}
void DamageTaken(Unit* pKiller, uint32 &damage)
{
if(damage >= m_creature->GetHealth())
{
if(Creature* Steelbreaker = Unit::GetCreature((*m_creature), pInstance->GetData64(DATA_STEELBREAKER)))
if(Steelbreaker->isAlive())
{
Steelbreaker->SetHealth(Steelbreaker->GetMaxHealth());
}
if(Creature* Brundir = Unit::GetCreature((*m_creature), pInstance->GetData64(DATA_STORMCALLER_BRUNDIR)))
if(Brundir->isAlive())
{
Brundir->SetHealth(Brundir->GetMaxHealth());
}
DoCast(m_creature, SPELL_SUPERCHARGE);
}
}
void JustDied(Unit* Killer)
{
if(IsEncounterComplete(pInstance, m_creature))
pInstance->SetData(DATA_ASSEMBLY, DONE);
}
void SpellHit(Unit *from, const SpellEntry *spell)
{
if(spell->Id == SPELL_SUPERCHARGE)
UpdatePhase();
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
while(uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_ENRAGE:
DoCast(SPELL_BERSERK);
break;
case EVENT_RUNE_OF_POWER: // Improve target selection; random alive friendly
{
Unit *Target = DoSelectLowestHpFriendly(60);
if(!Target || (Target && !Target->isAlive()))
Target = m_creature;
DoCast(Target, SPELL_RUNE_OF_POWER);
events.ScheduleEvent(EVENT_RUNE_OF_POWER, 60000);
}
break;
case EVENT_SHIELD_OF_RUNES:
DoCast( m_creature, (HeroicMode) ? SPELL_SHIELD_OF_RUNES_H : SPELL_SHIELD_OF_RUNES);
events.ScheduleEvent(EVENT_SHIELD_OF_RUNES, 27000+ (rand()%7)*1000);
break;
case EVENT_RUNE_OF_DEATH:
{
Unit *target = SelectTarget(SELECT_TARGET_RANDOM);
DoCast(target, SPELL_RUNE_OF_DEATH);
events.ScheduleEvent(EVENT_RUNE_OF_DEATH, 30000+ (rand()%10)*1000);
}
break;
case EVENT_RUNE_OF_SUMMONING:
{
Unit *target = SelectTarget(SELECT_TARGET_RANDOM);
DoCast(target, SPELL_RUNE_OF_SUMMONING);
events.ScheduleEvent(EVENT_RUNE_OF_SUMMONING, 20000+(rand()%10)*1000);
}
break;
}
}
DoMeleeAttackIfReady();
}
};
struct TRINITY_DLL_DECL mob_lightning_elementalAI : public ScriptedAI
{
mob_lightning_elementalAI(Creature *c) : ScriptedAI(c)
{
Charge();
}
Unit* Target;
void Charge()
{
Target = m_creature->SelectNearestTarget();
m_creature->AddThreat(Target, 5000000.0f);
AttackStart(Target);
}
void UpdateAI(const uint32 diff)
{
if(!m_creature->isInCombat())
return;
if(m_creature->IsWithinMeleeRange(Target))
{
DoCast(Target, (HeroicMode) ? SPELL_LIGHTNING_BLAST_H : SPELL_LIGHTNING_BLAST);
m_creature->DealDamage(m_creature, m_creature->GetMaxHealth()); // hack untill spell works
}
m_creature->GetMotionMaster()->MoveChase(Target); // needed at every update?
}
};
struct TRINITY_DLL_DECL mob_rune_of_summoningAI : public ScriptedAI
{
mob_rune_of_summoningAI(Creature *c) : ScriptedAI(c)
{
SummonLightningElemental();
}
void SummonLightningElemental()
{
m_creature->SummonCreature(CREATURE_RUNE_OF_SUMMONING, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 0, TEMPSUMMON_CORPSE_DESPAWN );
m_creature->DealDamage(m_creature, m_creature->GetHealth());
}
};
struct TRINITY_DLL_DECL boss_stormcaller_brundirAI : public ScriptedAI
{
boss_stormcaller_brundirAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
if(!pInstance)
return;
Reset();
}
void Reset()
{
pInstance->SetData(DATA_ASSEMBLY, NOT_STARTED);
m_creature->RemoveAllAuras();
events.Reset();
phase = 0;
}
EventMap events;
ScriptedInstance* pInstance;
uint32 phase;
void EnterCombat(Unit* who)
{
DoZoneInCombat();
events.ScheduleEvent(EVENT_ENRAGE, 900000);
UpdatePhase();
}
void UpdatePhase()
{
++phase;
events.SetPhase(phase);
events.RescheduleEvent(EVENT_CHAIN_LIGHTNING, 9000+ (rand()%8)*1000);
events.RescheduleEvent(EVENT_OVERLOAD, 60000+ (rand()%65)*1000);
if(phase >= 2)
events.RescheduleEvent(EVENT_LIGHTNING_WHIRL, 20000+ (rand()%20)*1000);
if(phase >= 3)
{
DoCast(m_creature, SPELL_STORMSHIELD);
events.RescheduleEvent(EVENT_LIGHTNING_TENDRILS, 40000+ (rand()%40)*1000);
}
}
void DamageTaken(Unit* pKiller, uint32 &damage)
{
if(damage >= m_creature->GetHealth())
{
if(Creature* Steelbreaker = Unit::GetCreature((*m_creature), pInstance->GetData64(DATA_STEELBREAKER)))
if(Steelbreaker->isAlive())
{
Steelbreaker->SetHealth(Steelbreaker->GetMaxHealth());
}
if(Creature* Molgeim = Unit::GetCreature((*m_creature), pInstance->GetData64(DATA_RUNEMASTER_MOLGEIM)))
if(Molgeim->isAlive())
{
Molgeim->SetHealth(Molgeim->GetMaxHealth());
}
DoCast(SPELL_SUPERCHARGE);
}
}
void JustDied(Unit* Killer)
{
if(IsEncounterComplete(pInstance, m_creature))
pInstance->SetData(DATA_ASSEMBLY, DONE);
}
void SpellHit(Unit *from, const SpellEntry *spell)
{
if(spell->Id == SPELL_SUPERCHARGE)
{
UpdatePhase();
}
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
while(uint32 eventId = events.ExecuteEvent())
{
switch(eventId)
{
case EVENT_ENRAGE:
DoCast(SPELL_BERSERK);
break;
case EVENT_CHAIN_LIGHTNING:
{
Unit* Target = SelectUnit(SELECT_TARGET_RANDOM,0);
DoCast(Target, (HeroicMode) ? SPELL_CHAIN_LIGHTNING_H : SPELL_CHAIN_LIGHTNING_N );
events.ScheduleEvent(EVENT_CHAIN_LIGHTNING, 9000+ (rand()%8)*1000);
}
break;
case EVENT_OVERLOAD:
DoCast( (HeroicMode) ? SPELL_OVERLOAD_H : SPELL_OVERLOAD );
events.ScheduleEvent(EVENT_OVERLOAD, 60000+ (rand()%65)*1000);
break;
case EVENT_LIGHTNING_WHIRL:
DoCast( (HeroicMode) ? SPELL_LIGHTNING_WHIRL_H : SPELL_LIGHTNING_WHIRL );
events.ScheduleEvent(EVENT_LIGHTNING_WHIRL, 20000+ (rand()%20)*1000);
break;
case EVENT_LIGHTNING_TENDRILS:
DoCast( (HeroicMode) ? SPELL_LIGHTNING_TENDRILS_H : SPELL_LIGHTNING_TENDRILS );
events.DelayEvents(15000, 5000);
DoResetThreat();
break;
}
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_steelbreaker(Creature* pCreature)
{
return new boss_steelbreakerAI (pCreature);
}
CreatureAI* GetAI_boss_runemaster_molgeim(Creature* pCreature)
{
return new boss_runemaster_molgeimAI (pCreature);
}
CreatureAI* GetAI_boss_stormcaller_brundir(Creature* pCreature)
{
return new boss_stormcaller_brundirAI (pCreature);
}
CreatureAI* GetAI_mob_lightning_elemental(Creature* pCreature)
{
return new mob_lightning_elementalAI (pCreature);
}
CreatureAI* GetAI_mob_rune_of_summoning(Creature* pCreature)
{
return new mob_rune_of_summoningAI (pCreature);
}
void AddSC_boss_assembly_of_iron()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_steelbreaker";
newscript->GetAI = &GetAI_boss_steelbreaker;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="boss_runemaster_molgeim";
newscript->GetAI = &GetAI_boss_runemaster_molgeim;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="boss_stormcaller_brundir";
newscript->GetAI = &GetAI_boss_stormcaller_brundir;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_lightning_elemental";
newscript->GetAI = &GetAI_mob_lightning_elemental;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="mob_rune_of_summoning";
newscript->GetAI = &GetAI_mob_rune_of_summoning;
newscript->RegisterSelf();
}

View File

@@ -35,7 +35,15 @@ enum Encounter
BOSS_VEZAX,
BOSS_YOGGSARON,
BOSS_ALGALON,
MAX_BOSS_NUMBER
MAX_ENCOUNTER
};
enum
{
DATA_ASSEMBLY,
DATA_STEELBREAKER,
DATA_RUNEMASTER_MOLGEIM,
DATA_STORMCALLER_BRUNDIR
};
#endif

View File

@@ -18,3 +18,99 @@
#include "precompiled.h"
#include "def_ulduar.h"
struct TRINITY_DLL_DECL instance_ulduar : public ScriptedInstance
{
instance_ulduar(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
uint32 m_auiEncounter[MAX_ENCOUNTER];
uint64 boss_assembly[3];
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
for(uint8 i = 0; i < 3; ++i)
boss_assembly[i] = 0;
}
bool IsEncounterInProgress() const
{
for(uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true;
return false;
}
void OnCreatureCreate(Creature* pCreature, bool add)
{
switch(pCreature->GetEntry())
{
case 32867: boss_assembly[0] = pCreature->GetGUID(); break;
case 32927: boss_assembly[1] = pCreature->GetGUID(); break;
case 32857: boss_assembly[2] = pCreature->GetGUID(); break;
}
}
uint64 GetData64(uint32 identifier)
{
switch(identifier)
{
case DATA_STEELBREAKER: return boss_assembly[0]; // Keep these three in current order
case DATA_RUNEMASTER_MOLGEIM: return boss_assembly[1];
case DATA_STORMCALLER_BRUNDIR: return boss_assembly[2];
default: return 0;
}
}
uint32 GetData(uint32 type)
{
switch(type)
{
case BOSS_LEVIATHAN:
case BOSS_IGNIS:
case BOSS_RAZORSCALE:
case BOSS_XT002:
case BOSS_ASSEMBLY:
case BOSS_KOLOGARN:
case BOSS_AURIAYA:
case BOSS_MIMIRON:
case BOSS_HODIR:
case BOSS_THORIM:
case BOSS_FREYA:
case BOSS_VEZAX:
case BOSS_YOGGSARON:
case BOSS_ALGALON:
return m_auiEncounter[type];
}
return 0;
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_ASSEMBLY:
m_auiEncounter[BOSS_ASSEMBLY] = data;
break;
}
}
};
InstanceData* GetInstanceData_instance_ulduar(Map* pMap)
{
return new instance_ulduar(pMap);
}
void AddSC_instance_ulduar()
{
Script *newscript;
newscript = new Script;
newscript->Name = "instance_ulduar";
newscript->GetInstanceData = &GetInstanceData_instance_ulduar;
newscript->RegisterSelf();
}

View File

@@ -291,7 +291,8 @@ extern void AddSC_boss_flame_leviathan();
extern void AddSC_boss_ignis();
extern void AddSC_boss_razorscale();
extern void AddSC_boss_xt002();
//extern void AddSC_instance_ulduar();
extern void AddSC_boss_assembly_of_iron();
extern void AddSC_instance_ulduar();
extern void AddSC_boss_keleseth(); //Utgarde Keep
extern void AddSC_boss_skarvald_dalronn();
extern void AddSC_boss_ingvar_the_plunderer();
@@ -681,7 +682,8 @@ void AddScripts()
AddSC_boss_ignis();
AddSC_boss_razorscale();
AddSC_boss_xt002();
//AddSC_instance_ulduar();
AddSC_boss_assembly_of_iron();
AddSC_instance_ulduar();
AddSC_boss_keleseth(); //Utgarde Keep
AddSC_boss_skarvald_dalronn();
AddSC_boss_ingvar_the_plunderer();