Scripts/Molten Core: Huge cleanup in instance script, converted all bosses to use BossAI, cleaned code style
Scripts/Molten Core: Implemented saving boss states to database, now it is possible to continue the instance after core restart
This commit is contained in:
1 parent
0a5d8711e5
commit
7ea8bad07f
12 files changed
+1421
-1655
No files matched your search
@@ -23,98 +23,97 @@ SDComment:
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "molten_core.h"
|
||||
|
||||
#define EMOTE_SERVICE -1409000
|
||||
#define EMOTE_SERVICE -1409000
|
||||
|
||||
#define SPELL_INFERNO 19695
|
||||
#define SPELL_IGNITEMANA 19659
|
||||
#define SPELL_LIVINGBOMB 20475
|
||||
#define SPELL_ARMAGEDDOM 20479
|
||||
enum Spells
|
||||
{
|
||||
SPELL_INFERNO = 19695,
|
||||
SPELL_IGNITE_MANA = 19659,
|
||||
SPELL_LIVING_BOMB = 20475,
|
||||
SPELL_ARMAGEDDON = 20479,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_INFERNO = 1,
|
||||
EVENT_IGNITE_MANA = 2,
|
||||
EVENT_LIVING_BOMB = 3,
|
||||
};
|
||||
|
||||
class boss_baron_geddon : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_baron_geddon() : CreatureScript("boss_baron_geddon") { }
|
||||
public:
|
||||
boss_baron_geddon() : CreatureScript("boss_baron_geddon") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_baron_geddonAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_baron_geddonAI : public ScriptedAI
|
||||
{
|
||||
boss_baron_geddonAI(Creature *pCreature) : ScriptedAI(pCreature)
|
||||
struct boss_baron_geddonAI : public BossAI
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
InstanceScript* m_pInstance;
|
||||
|
||||
uint32 Inferno_Timer;
|
||||
uint32 IgniteMana_Timer;
|
||||
uint32 LivingBomb_Timer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Inferno_Timer = 45000; //These times are probably wrong
|
||||
IgniteMana_Timer = 30000;
|
||||
LivingBomb_Timer = 35000;
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*pKiller*/)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(DATA_GEDDON, 0);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//If we are <2% hp cast Armageddom
|
||||
if (!HealthAbovePct(2))
|
||||
boss_baron_geddonAI(Creature *pCreature) : BossAI(pCreature, BOSS_BARON_GEDDON)
|
||||
{
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
DoCast(me, SPELL_ARMAGEDDOM);
|
||||
DoScriptText(EMOTE_SERVICE, me);
|
||||
return;
|
||||
}
|
||||
|
||||
//Inferno_Timer
|
||||
if (Inferno_Timer <= diff)
|
||||
void EnterCombat(Unit* victim)
|
||||
{
|
||||
DoCast(me, SPELL_INFERNO);
|
||||
Inferno_Timer = 45000;
|
||||
} else Inferno_Timer -= diff;
|
||||
BossAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_INFERNO, 45000);
|
||||
events.ScheduleEvent(EVENT_IGNITE_MANA, 30000);
|
||||
events.ScheduleEvent(EVENT_LIVING_BOMB, 35000);
|
||||
}
|
||||
|
||||
//IgniteMana_Timer
|
||||
if (IgniteMana_Timer <= diff)
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
|
||||
DoCast(pTarget, SPELL_IGNITEMANA);
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
IgniteMana_Timer = 30000;
|
||||
} else IgniteMana_Timer -= diff;
|
||||
events.Update(diff);
|
||||
|
||||
//LivingBomb_Timer
|
||||
if (LivingBomb_Timer <= diff)
|
||||
{
|
||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
|
||||
DoCast(pTarget, SPELL_LIVINGBOMB);
|
||||
// If we are <2% hp cast Armageddon
|
||||
if (!HealthAbovePct(2))
|
||||
{
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
DoCast(me, SPELL_ARMAGEDDON);
|
||||
DoScriptText(EMOTE_SERVICE, me);
|
||||
return;
|
||||
}
|
||||
|
||||
LivingBomb_Timer = 35000;
|
||||
} else LivingBomb_Timer -= diff;
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_INFERNO:
|
||||
DoCast(me, SPELL_INFERNO);
|
||||
events.ScheduleEvent(EVENT_INFERNO, 45000);
|
||||
break;
|
||||
case EVENT_IGNITE_MANA:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_IGNITE_MANA))
|
||||
DoCast(target, SPELL_IGNITE_MANA);
|
||||
events.ScheduleEvent(EVENT_IGNITE_MANA, 30000);
|
||||
break;
|
||||
case EVENT_LIVING_BOMB:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
|
||||
DoCast(target, SPELL_LIVING_BOMB);
|
||||
events.ScheduleEvent(EVENT_LIVING_BOMB, 35000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_baron_geddonAI (pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
void AddSC_boss_baron_geddon()
|
||||
|
||||
@@ -23,135 +23,134 @@ SDComment: Adds NYI
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "molten_core.h"
|
||||
|
||||
// Garr spells
|
||||
#define SPELL_ANTIMAGICPULSE 19492
|
||||
#define SPELL_MAGMASHACKLES 19496
|
||||
#define SPELL_ENRAGE 19516 //Stacking enrage (stacks to 10 times)
|
||||
enum Spells
|
||||
{
|
||||
// Garr
|
||||
SPELL_ANTIMAGIC_PULSE = 19492,
|
||||
SPELL_MAGMA_SHACKLES = 19496,
|
||||
SPELL_ENRAGE = 19516,
|
||||
|
||||
//Add spells
|
||||
#define SPELL_ERUPTION 19497
|
||||
#define SPELL_IMMOLATE 20294
|
||||
// Adds
|
||||
SPELL_ERUPTION = 19497,
|
||||
SPELL_IMMOLATE = 20294,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_ANTIMAGIC_PULSE = 1,
|
||||
EVENT_MAGMA_SHACKLES = 2,
|
||||
};
|
||||
|
||||
class boss_garr : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_garr() : CreatureScript("boss_garr") { }
|
||||
public:
|
||||
boss_garr() : CreatureScript("boss_garr") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_garrAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_garrAI : public ScriptedAI
|
||||
{
|
||||
boss_garrAI(Creature *pCreature) : ScriptedAI(pCreature)
|
||||
struct boss_garrAI : public BossAI
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
InstanceScript* m_pInstance;
|
||||
|
||||
uint32 AntiMagicPulse_Timer;
|
||||
uint32 MagmaShackles_Timer;
|
||||
uint32 CheckAdds_Timer;
|
||||
uint64 Add[8];
|
||||
bool Enraged[8];
|
||||
|
||||
void Reset()
|
||||
{
|
||||
AntiMagicPulse_Timer = 25000; //These times are probably wrong
|
||||
MagmaShackles_Timer = 15000;
|
||||
CheckAdds_Timer = 2000;
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*pKiller*/)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(DATA_GARR, 0);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//AntiMagicPulse_Timer
|
||||
if (AntiMagicPulse_Timer <= diff)
|
||||
boss_garrAI(Creature* creature) : BossAI(creature, BOSS_GARR)
|
||||
{
|
||||
DoCast(me, SPELL_ANTIMAGICPULSE);
|
||||
AntiMagicPulse_Timer = 10000 + rand()%5000;
|
||||
} else AntiMagicPulse_Timer -= diff;
|
||||
}
|
||||
|
||||
//MagmaShackles_Timer
|
||||
if (MagmaShackles_Timer <= diff)
|
||||
void EnterCombat(Unit* victim)
|
||||
{
|
||||
DoCast(me, SPELL_MAGMASHACKLES);
|
||||
MagmaShackles_Timer = 8000 + rand()%4000;
|
||||
} else MagmaShackles_Timer -= diff;
|
||||
BossAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, 25000);
|
||||
events.ScheduleEvent(EVENT_MAGMA_SHACKLES, 15000);
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_ANTIMAGIC_PULSE:
|
||||
DoCast(me, SPELL_ANTIMAGIC_PULSE);
|
||||
events.ScheduleEvent(EVENT_ANTIMAGIC_PULSE, urand(10000, 15000));
|
||||
break;
|
||||
case EVENT_MAGMA_SHACKLES:
|
||||
DoCast(me, SPELL_MAGMA_SHACKLES);
|
||||
events.ScheduleEvent(EVENT_MAGMA_SHACKLES, urand(8000, 12000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_garrAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
class mob_firesworn : public CreatureScript
|
||||
{
|
||||
public:
|
||||
mob_firesworn() : CreatureScript("mob_firesworn") { }
|
||||
public:
|
||||
mob_firesworn() : CreatureScript("mob_firesworn") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new mob_fireswornAI (pCreature);
|
||||
}
|
||||
|
||||
struct mob_fireswornAI : public ScriptedAI
|
||||
{
|
||||
mob_fireswornAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
uint32 Immolate_Timer;
|
||||
|
||||
void Reset()
|
||||
struct mob_fireswornAI : public ScriptedAI
|
||||
{
|
||||
Immolate_Timer = 4000; //These times are probably wrong
|
||||
}
|
||||
mob_fireswornAI(Creature* creature) : ScriptedAI(creature) {}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
}
|
||||
uint32 immolateTimer;
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//Immolate_Timer
|
||||
if (Immolate_Timer <= diff)
|
||||
void Reset()
|
||||
{
|
||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
|
||||
DoCast(pTarget, SPELL_IMMOLATE);
|
||||
|
||||
Immolate_Timer = urand(5000,10000);
|
||||
} else Immolate_Timer -= diff;
|
||||
|
||||
//Cast Erruption and let them die
|
||||
if (!HealthAbovePct(10))
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_ERUPTION);
|
||||
me->setDeathState(JUST_DIED);
|
||||
me->RemoveCorpse();
|
||||
immolateTimer = 4000; //These times are probably wrong
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage)
|
||||
{
|
||||
uint32 const health10pct = me->CountPctFromMaxHealth(10);
|
||||
uint32 health = me->GetHealth();
|
||||
if (int32(health) - int32(damage) < int32(health10pct))
|
||||
{
|
||||
damage = 0;
|
||||
DoCastVictim(SPELL_ERUPTION);
|
||||
me->DespawnOrUnsummon();
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
if (immolateTimer <= diff)
|
||||
{
|
||||
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(target, SPELL_IMMOLATE);
|
||||
immolateTimer = urand(5000, 10000);
|
||||
}
|
||||
else
|
||||
immolateTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new mob_fireswornAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -23,84 +23,85 @@ SDComment: Adds MC NYI
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "molten_core.h"
|
||||
|
||||
#define SPELL_SHADOWBOLT 19728
|
||||
#define SPELL_RAINOFFIRE 19717
|
||||
#define SPELL_GEHENNASCURSE 19716
|
||||
enum Spells
|
||||
{
|
||||
SPELL_GEHENNAS_CURSE = 19716,
|
||||
SPELL_RAIN_OF_FIRE = 19717,
|
||||
SPELL_SHADOW_BOLT = 19728,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_GEHENNAS_CURSE = 1,
|
||||
EVENT_RAIN_OF_FIRE = 2,
|
||||
EVENT_SHADOW_BOLT = 3,
|
||||
};
|
||||
|
||||
class boss_gehennas : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_gehennas() : CreatureScript("boss_gehennas") { }
|
||||
public:
|
||||
boss_gehennas() : CreatureScript("boss_gehennas") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_gehennasAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_gehennasAI : public ScriptedAI
|
||||
{
|
||||
boss_gehennasAI(Creature *pCreature) : ScriptedAI(pCreature)
|
||||
struct boss_gehennasAI : public BossAI
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
InstanceScript* m_pInstance;
|
||||
|
||||
uint32 ShadowBolt_Timer;
|
||||
uint32 RainOfFire_Timer;
|
||||
uint32 GehennasCurse_Timer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
ShadowBolt_Timer = 6000;
|
||||
RainOfFire_Timer = 10000;
|
||||
GehennasCurse_Timer = 12000;
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*pKiller*/)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(DATA_GEHENNAS, 0);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/) {}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//ShadowBolt_Timer
|
||||
if (ShadowBolt_Timer <= diff)
|
||||
boss_gehennasAI(Creature* creature) : BossAI(creature, BOSS_GEHENNAS)
|
||||
{
|
||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1))
|
||||
DoCast(pTarget, SPELL_SHADOWBOLT);
|
||||
}
|
||||
|
||||
ShadowBolt_Timer = 7000;
|
||||
} else ShadowBolt_Timer -= diff;
|
||||
|
||||
//RainOfFire_Timer
|
||||
if (RainOfFire_Timer <= diff)
|
||||
void EnterCombat(Unit* victim)
|
||||
{
|
||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(pTarget, SPELL_RAINOFFIRE);
|
||||
BossAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_GEHENNAS_CURSE, 12000);
|
||||
events.ScheduleEvent(EVENT_RAIN_OF_FIRE, 10000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, 6000);
|
||||
}
|
||||
|
||||
RainOfFire_Timer = urand(4000,12000);
|
||||
} else RainOfFire_Timer -= diff;
|
||||
|
||||
//GehennasCurse_Timer
|
||||
if (GehennasCurse_Timer <= diff)
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_GEHENNASCURSE);
|
||||
GehennasCurse_Timer = urand(22000,30000);
|
||||
} else GehennasCurse_Timer -= diff;
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_GEHENNAS_CURSE:
|
||||
DoCastVictim(SPELL_GEHENNAS_CURSE);
|
||||
events.ScheduleEvent(EVENT_GEHENNAS_CURSE, urand(22000, 30000));
|
||||
break;
|
||||
case EVENT_RAIN_OF_FIRE:
|
||||
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(target, SPELL_RAIN_OF_FIRE);
|
||||
events.ScheduleEvent(EVENT_RAIN_OF_FIRE, urand(4000, 12000));
|
||||
break;
|
||||
case EVENT_SHADOW_BOLT:
|
||||
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1))
|
||||
DoCast(target, SPELL_SHADOW_BOLT);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BOLT, 7000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_gehennasAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
void AddSC_boss_gehennas()
|
||||
|
||||
@@ -23,11 +23,19 @@ SDComment: Timers need to be confirmed, Golemagg's Trust need to be checked
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "molten_core.h"
|
||||
|
||||
enum eEnums
|
||||
enum Texts
|
||||
{
|
||||
EMOTE_LOWHP = -1409002,
|
||||
};
|
||||
|
||||
enum Spells
|
||||
{
|
||||
// Golemagg
|
||||
SPELL_MAGMASPLASH = 13879,
|
||||
SPELL_PYROBLAST = 20228,
|
||||
SPELL_EARTHQUAKE = 19798,
|
||||
@@ -35,170 +43,146 @@ enum eEnums
|
||||
SPELL_GOLEMAGG_TRUST = 20553,
|
||||
|
||||
// Core Rager
|
||||
EMOTE_LOWHP = -1409002,
|
||||
SPELL_MANGLE = 19820
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_PYROBLAST = 1,
|
||||
EVENT_EARTHQUAKE = 2,
|
||||
};
|
||||
|
||||
class boss_golemagg : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_golemagg() : CreatureScript("boss_golemagg") { }
|
||||
public:
|
||||
boss_golemagg() : CreatureScript("boss_golemagg") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_golemaggAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_golemaggAI : public ScriptedAI
|
||||
{
|
||||
boss_golemaggAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
struct boss_golemaggAI : public BossAI
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* m_pInstance;
|
||||
|
||||
uint32 m_uiPyroblastTimer;
|
||||
uint32 m_uiEarthquakeTimer;
|
||||
uint32 m_uiBuffTimer;
|
||||
bool m_bEnraged;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
m_uiPyroblastTimer = 7*IN_MILLISECONDS; // These timers are probably wrong
|
||||
m_uiEarthquakeTimer = 3*IN_MILLISECONDS;
|
||||
m_uiBuffTimer = 2500;
|
||||
m_bEnraged = false;
|
||||
|
||||
DoCast(me, SPELL_MAGMASPLASH, true);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*pKiller*/)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(DATA_GOLEMAGG, 0);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 uiDiff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//Pyroblast
|
||||
if (m_uiPyroblastTimer <= uiDiff)
|
||||
boss_golemaggAI(Creature* creature) : BossAI(creature, BOSS_GOLEMAGG_THE_INCINERATOR)
|
||||
{
|
||||
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(pTarget, SPELL_PYROBLAST);
|
||||
|
||||
m_uiPyroblastTimer = 7*IN_MILLISECONDS;
|
||||
}
|
||||
else
|
||||
m_uiPyroblastTimer -= uiDiff;
|
||||
|
||||
// Enrage
|
||||
if (!m_bEnraged && HealthBelowPct(10))
|
||||
{
|
||||
DoCast(me, SPELL_ENRAGE);
|
||||
m_bEnraged = true;
|
||||
}
|
||||
|
||||
// Earthquake
|
||||
if (m_bEnraged)
|
||||
void Reset()
|
||||
{
|
||||
if (m_uiEarthquakeTimer <= uiDiff)
|
||||
BossAI::Reset();
|
||||
DoCast(me, SPELL_MAGMASPLASH, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* victim)
|
||||
{
|
||||
BossAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_PYROBLAST, 7000);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/)
|
||||
{
|
||||
if (HealthBelowPct(10) || me->HasAura(SPELL_ENRAGE))
|
||||
return;
|
||||
|
||||
DoCast(me, SPELL_ENRAGE, true);
|
||||
events.ScheduleEvent(EVENT_EARTHQUAKE, 3000);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_EARTHQUAKE);
|
||||
m_uiEarthquakeTimer = 3*IN_MILLISECONDS;
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_PYROBLAST:
|
||||
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(pTarget, SPELL_PYROBLAST);
|
||||
events.ScheduleEvent(EVENT_PYROBLAST, 7000);
|
||||
break;
|
||||
case EVENT_EARTHQUAKE:
|
||||
DoCastVictim(SPELL_EARTHQUAKE);
|
||||
events.ScheduleEvent(EVENT_EARTHQUAKE, 3000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
m_uiEarthquakeTimer -= uiDiff;
|
||||
}
|
||||
|
||||
/*
|
||||
// Golemagg's Trust
|
||||
if (m_uiBuffTimer <= uidiff)
|
||||
{
|
||||
DoCast(me, SPELL_GOLEMAGG_TRUST);
|
||||
m_uiBuffTimer = 2.5*IN_MILLISECONDS;
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
else
|
||||
m_uiBuffTimer -= uiDiff;
|
||||
*/
|
||||
};
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_golemaggAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
class mob_core_rager : public CreatureScript
|
||||
{
|
||||
public:
|
||||
mob_core_rager() : CreatureScript("mob_core_rager") { }
|
||||
public:
|
||||
mob_core_rager() : CreatureScript("mob_core_rager") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new mob_core_ragerAI (pCreature);
|
||||
}
|
||||
|
||||
struct mob_core_ragerAI : public ScriptedAI
|
||||
{
|
||||
mob_core_ragerAI(Creature *c) : ScriptedAI(c)
|
||||
struct mob_core_ragerAI : public ScriptedAI
|
||||
{
|
||||
m_pInstance = c->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* m_pInstance;
|
||||
|
||||
uint32 m_uiMangleTimer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
m_uiMangleTimer = 7*IN_MILLISECONDS; // These times are probably wrong
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*pDoneBy*/, uint32& uiDamage)
|
||||
{
|
||||
if (HealthBelowPct(50))
|
||||
mob_core_ragerAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
if (m_pInstance)
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
mangleTimer = 7*IN_MILLISECONDS; // These times are probably wrong
|
||||
}
|
||||
|
||||
void DamageTaken(Unit* /*attacker*/, uint32& damage)
|
||||
{
|
||||
if (HealthAbovePct(50) || !instance)
|
||||
return;
|
||||
|
||||
if (Creature* pGolemagg = instance->instance->GetCreature(instance->GetData64(BOSS_GOLEMAGG_THE_INCINERATOR)))
|
||||
{
|
||||
if (Creature* pGolemagg = m_pInstance->instance->GetCreature(m_pInstance->GetData64(DATA_GOLEMAGG)))
|
||||
if (pGolemagg->isAlive())
|
||||
{
|
||||
if (pGolemagg->isAlive())
|
||||
{
|
||||
DoScriptText(EMOTE_LOWHP, me);
|
||||
me->SetFullHealth();
|
||||
}
|
||||
else
|
||||
uiDamage = me->GetHealth();
|
||||
me->AddAura(SPELL_GOLEMAGG_TRUST, me);
|
||||
DoScriptText(EMOTE_LOWHP, me);
|
||||
me->SetFullHealth();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 uiDiff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
// Mangle
|
||||
if (m_uiMangleTimer <= uiDiff)
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_MANGLE);
|
||||
m_uiMangleTimer = 10*IN_MILLISECONDS;
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
// Mangle
|
||||
if (mangleTimer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_MANGLE);
|
||||
mangleTimer = 10*IN_MILLISECONDS;
|
||||
}
|
||||
else
|
||||
mangleTimer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
else
|
||||
m_uiMangleTimer -= uiDiff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
private:
|
||||
InstanceScript* instance;
|
||||
uint32 mangleTimer;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new mob_core_ragerAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
void AddSC_boss_golemagg()
|
||||
{
|
||||
new boss_golemagg();
|
||||
|
||||
@@ -23,82 +23,83 @@ SDComment:
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "molten_core.h"
|
||||
|
||||
#define SPELL_IMPENDINGDOOM 19702
|
||||
#define SPELL_LUCIFRONCURSE 19703
|
||||
#define SPELL_SHADOWSHOCK 20603
|
||||
enum Spells
|
||||
{
|
||||
SPELL_IMPENDING_DOOM = 19702,
|
||||
SPELL_LUCIFRON_CURSE = 19703,
|
||||
SPELL_SHADOW_SHOCK = 20603,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_IMPENDING_DOOM = 1,
|
||||
EVENT_LUCIFRON_CURSE = 2,
|
||||
EVENT_SHADOW_SHOCK = 3,
|
||||
};
|
||||
|
||||
class boss_lucifron : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_lucifron() : CreatureScript("boss_lucifron") { }
|
||||
public:
|
||||
boss_lucifron() : CreatureScript("boss_lucifron") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_lucifronAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_lucifronAI : public ScriptedAI
|
||||
{
|
||||
boss_lucifronAI(Creature *pCreature) : ScriptedAI(pCreature)
|
||||
struct boss_lucifronAI : public BossAI
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
InstanceScript* m_pInstance;
|
||||
|
||||
uint32 ImpendingDoom_Timer;
|
||||
uint32 LucifronCurse_Timer;
|
||||
uint32 ShadowShock_Timer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
ImpendingDoom_Timer = 10000; //Initial cast after 10 seconds so the debuffs alternate
|
||||
LucifronCurse_Timer = 20000; //Initial cast after 20 seconds
|
||||
ShadowShock_Timer = 6000; //6 seconds
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*pKiller*/)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(DATA_LUCIFRON, 0);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//Impending doom timer
|
||||
if (ImpendingDoom_Timer <= diff)
|
||||
boss_lucifronAI(Creature* creature) : BossAI(creature, BOSS_LUCIFRON)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_IMPENDINGDOOM);
|
||||
ImpendingDoom_Timer = 20000;
|
||||
} else ImpendingDoom_Timer -= diff;
|
||||
}
|
||||
|
||||
//Lucifron's curse timer
|
||||
if (LucifronCurse_Timer <= diff)
|
||||
void EnterCombat(Unit* victim)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_LUCIFRONCURSE);
|
||||
LucifronCurse_Timer = 15000;
|
||||
} else LucifronCurse_Timer -= diff;
|
||||
BossAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_IMPENDING_DOOM, 10000);
|
||||
events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 20000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6000);
|
||||
}
|
||||
|
||||
//Shadowshock
|
||||
if (ShadowShock_Timer <= diff)
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_SHADOWSHOCK);
|
||||
ShadowShock_Timer = 6000;
|
||||
} else ShadowShock_Timer -= diff;
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_IMPENDING_DOOM:
|
||||
DoCastVictim(SPELL_IMPENDING_DOOM);
|
||||
events.ScheduleEvent(EVENT_IMPENDING_DOOM, 20000);
|
||||
break;
|
||||
case EVENT_LUCIFRON_CURSE:
|
||||
DoCastVictim(SPELL_LUCIFRON_CURSE);
|
||||
events.ScheduleEvent(EVENT_LUCIFRON_CURSE, 15000);
|
||||
break;
|
||||
case EVENT_SHADOW_SHOCK:
|
||||
DoCastVictim(SPELL_SHADOW_SHOCK);
|
||||
events.ScheduleEvent(EVENT_SHADOW_SHOCK, 6000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_lucifronAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
void AddSC_boss_lucifron()
|
||||
|
||||
@@ -19,95 +19,101 @@
|
||||
/* ScriptData
|
||||
SDName: Boss_Magmadar
|
||||
SD%Complete: 75
|
||||
SDComment: Conflag on ground nyi, fear causes issues without VMAPs
|
||||
SDComment: Conflag on ground nyi
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "molten_core.h"
|
||||
|
||||
#define EMOTE_FRENZY -1409001
|
||||
enum Texts
|
||||
{
|
||||
EMOTE_FRENZY = -1409001,
|
||||
};
|
||||
|
||||
#define SPELL_FRENZY 19451
|
||||
#define SPELL_MAGMASPIT 19449 //This is actually a buff he gives himself
|
||||
#define SPELL_PANIC 19408
|
||||
#define SPELL_LAVABOMB 19411 //This calls a dummy server side effect that isn't implemented yet
|
||||
#define SPELL_LAVABOMB_ALT 19428 //This is the spell that the lava bomb casts
|
||||
enum Spells
|
||||
{
|
||||
SPELL_FRENZY = 19451,
|
||||
SPELL_MAGMA_SPIT = 19449,
|
||||
SPELL_PANIC = 19408,
|
||||
SPELL_LAVA_BOMB = 19428,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_FRENZY = 1,
|
||||
EVENT_PANIC = 2,
|
||||
EVENT_LAVA_BOMB = 3,
|
||||
};
|
||||
|
||||
class boss_magmadar : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_magmadar() : CreatureScript("boss_magmadar") { }
|
||||
public:
|
||||
boss_magmadar() : CreatureScript("boss_magmadar") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_magmadarAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_magmadarAI : public ScriptedAI
|
||||
{
|
||||
boss_magmadarAI(Creature *pCreature) : ScriptedAI(pCreature)
|
||||
struct boss_magmadarAI : public BossAI
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
InstanceScript* m_pInstance;
|
||||
|
||||
uint32 Frenzy_Timer;
|
||||
uint32 Panic_Timer;
|
||||
uint32 Lavabomb_Timer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Frenzy_Timer = 30000;
|
||||
Panic_Timer = 20000;
|
||||
Lavabomb_Timer = 12000;
|
||||
|
||||
DoCast(me, SPELL_MAGMASPIT, true);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*pKiller*/)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(DATA_MAGMADAR, 0);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//Frenzy_Timer
|
||||
if (Frenzy_Timer <= diff)
|
||||
boss_magmadarAI(Creature *pCreature) : BossAI(pCreature, BOSS_MAGMADAR)
|
||||
{
|
||||
DoScriptText(EMOTE_FRENZY, me);
|
||||
DoCast(me, SPELL_FRENZY);
|
||||
Frenzy_Timer = 15000;
|
||||
} else Frenzy_Timer -= diff;
|
||||
}
|
||||
|
||||
//Panic_Timer
|
||||
if (Panic_Timer <= diff)
|
||||
void Reset()
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_PANIC);
|
||||
Panic_Timer = 35000;
|
||||
} else Panic_Timer -= diff;
|
||||
BossAI::Reset();
|
||||
DoCast(me, SPELL_MAGMA_SPIT, true);
|
||||
}
|
||||
|
||||
//Lavabomb_Timer
|
||||
if (Lavabomb_Timer <= diff)
|
||||
void EnterCombat(Unit* victim)
|
||||
{
|
||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
|
||||
DoCast(pTarget, SPELL_LAVABOMB_ALT);
|
||||
BossAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 30000);
|
||||
events.ScheduleEvent(EVENT_PANIC, 20000);
|
||||
events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
|
||||
}
|
||||
|
||||
Lavabomb_Timer = 12000;
|
||||
} else Lavabomb_Timer -= diff;
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_FRENZY:
|
||||
DoScriptText(EMOTE_FRENZY, me);
|
||||
DoCast(me, SPELL_FRENZY);
|
||||
events.ScheduleEvent(EVENT_FRENZY, 15000);
|
||||
break;
|
||||
case EVENT_PANIC:
|
||||
DoCastVictim(SPELL_PANIC);
|
||||
events.ScheduleEvent(EVENT_PANIC, 35000);
|
||||
break;
|
||||
case EVENT_LAVA_BOMB:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_LAVA_BOMB))
|
||||
DoCast(target, SPELL_LAVA_BOMB);
|
||||
events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_magmadarAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
void AddSC_boss_magmadar()
|
||||
|
||||
@@ -23,205 +23,194 @@ SDComment: Correct spawning and Event NYI
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "ScriptedGossip.h"
|
||||
#include "molten_core.h"
|
||||
|
||||
#define SAY_AGGRO -1409003
|
||||
#define SAY_SPAWN -1409004
|
||||
#define SAY_SLAY -1409005
|
||||
#define SAY_SPECIAL -1409006
|
||||
#define SAY_DEFEAT -1409007
|
||||
enum Texts
|
||||
{
|
||||
SAY_AGGRO = -1409003,
|
||||
SAY_SPAWN = -1409004,
|
||||
SAY_SLAY = -1409005,
|
||||
SAY_SPECIAL = -1409006,
|
||||
SAY_DEFEAT = -1409007,
|
||||
|
||||
#define SAY_SUMMON_MAJ -1409008
|
||||
#define SAY_ARRIVAL1_RAG -1409009
|
||||
#define SAY_ARRIVAL2_MAJ -1409010
|
||||
#define SAY_ARRIVAL3_RAG -1409011
|
||||
#define SAY_ARRIVAL5_RAG -1409012
|
||||
SAY_SUMMON_MAJ = -1409008,
|
||||
SAY_ARRIVAL1_RAG = -1409009,
|
||||
SAY_ARRIVAL2_MAJ = -1409010,
|
||||
SAY_ARRIVAL3_RAG = -1409011,
|
||||
SAY_ARRIVAL5_RAG = -1409012,
|
||||
};
|
||||
|
||||
#define ENTRY_RAGNAROS 11502
|
||||
|
||||
#define EMOTE_EMERGE 449
|
||||
|
||||
#define TELE_TO_RAG_X 829.159f
|
||||
#define TELE_TO_RAG_Y -815.773f
|
||||
#define TELE_TO_RAG_Z -228.972f
|
||||
#define TELE_TO_RAG_O 5.305f
|
||||
|
||||
#define SPELL_MAGIC_REFLECTION 20619
|
||||
#define SPELL_DAMAGE_REFLECTION 21075
|
||||
|
||||
#define SPELL_BLASTWAVE 20229
|
||||
#define SPELL_AEGIS 20620 //This is self casted whenever we are below 50%
|
||||
#define SPELL_TELEPORT 20618
|
||||
#define SPELL_SUMMON_RAGNAROS 19774
|
||||
|
||||
#define ENTRY_FLAMEWALKER_HEALER 11663
|
||||
#define ENTRY_FLAMEWALKER_ELITE 11664
|
||||
enum Spells
|
||||
{
|
||||
SPELL_MAGIC_REFLECTION = 20619,
|
||||
SPELL_DAMAGE_REFLECTION = 21075,
|
||||
SPELL_BLAST_WAVE = 20229,
|
||||
SPELL_AEGIS_OF_RAGNAROS = 20620,
|
||||
SPELL_TELEPORT = 20618,
|
||||
SPELL_SUMMON_RAGNAROS = 19774,
|
||||
};
|
||||
|
||||
#define GOSSIP_HELLO 4995
|
||||
#define GOSSIP_SELLECT "Tell me more."
|
||||
#define GOSSIP_SELECT "Tell me more."
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_MAGIC_REFLECTION = 1,
|
||||
EVENT_DAMAGE_REFLECTION = 2,
|
||||
EVENT_BLAST_WAVE = 3,
|
||||
EVENT_TELEPORT = 4,
|
||||
|
||||
EVENT_OUTRO_1 = 5,
|
||||
EVENT_OUTRO_2 = 6,
|
||||
EVENT_OUTRO_3 = 7,
|
||||
};
|
||||
|
||||
class boss_majordomo : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_majordomo() : CreatureScript("boss_majordomo") { }
|
||||
public:
|
||||
boss_majordomo() : CreatureScript("boss_majordomo") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_majordomoAI (pCreature);
|
||||
}
|
||||
|
||||
bool OnGossipHello(Player* pPlayer, Creature* pCreature)
|
||||
{
|
||||
pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELLECT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
|
||||
pPlayer->SEND_GOSSIP_MENU(GOSSIP_HELLO, pCreature->GetGUID());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool OnGossipSelect(Player* pPlayer, Creature* pCreature, uint32 /*uiSender*/, uint32 /*uiAction*/)
|
||||
{
|
||||
//ScriptedInstance* pInstance = pCreature->GetInstanceData();
|
||||
|
||||
BossAI* pBossAI = CAST_AI(boss_majordomoAI, pCreature->AI());
|
||||
|
||||
if (/*pInstance && */pBossAI)
|
||||
struct boss_majordomoAI : public BossAI
|
||||
{
|
||||
pPlayer->CLOSE_GOSSIP_MENU();
|
||||
CAST_AI(boss_majordomoAI, pCreature->AI())->StartRagsEvent();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
struct boss_majordomoAI : public BossAI
|
||||
{
|
||||
boss_majordomoAI(Creature *pCreature) : BossAI(pCreature, BOSS_MAJORDOMO)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
InstanceScript* m_pInstance;
|
||||
|
||||
uint32 MagicReflection_Timer;
|
||||
uint32 DamageReflection_Timer;
|
||||
uint32 Blastwave_Timer;
|
||||
uint32 Teleport_Timer;
|
||||
uint32 Phase_Timer; //for teleport and ragnaros's intro
|
||||
uint8 Phase;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
MagicReflection_Timer = 30000; //Damage reflection first so we alternate
|
||||
DamageReflection_Timer = 15000;
|
||||
Blastwave_Timer = 10000;
|
||||
Teleport_Timer = 20000;
|
||||
Phase = 0;
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (rand()%5)
|
||||
return;
|
||||
|
||||
DoScriptText(SAY_SLAY, me);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
DoScriptText(SAY_AGGRO, me);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (Phase == 0)
|
||||
boss_majordomoAI(Creature *pCreature) : BossAI(pCreature, BOSS_MAJORDOMO_EXECUTUS)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
}
|
||||
|
||||
if (((!me->FindNearestCreature(ENTRY_FLAMEWALKER_HEALER,100.0f)) && (!me->FindNearestCreature(ENTRY_FLAMEWALKER_ELITE,100.0f))) && (!m_pInstance->GetData(DATA_MAJORDOMOISDEAD)))
|
||||
{
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (urand(0, 99) < 25)
|
||||
DoScriptText(SAY_SLAY, me);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* who)
|
||||
{
|
||||
BossAI::EnterCombat(who);
|
||||
DoScriptText(SAY_AGGRO, me);
|
||||
events.ScheduleEvent(EVENT_MAGIC_REFLECTION, 30000);
|
||||
events.ScheduleEvent(EVENT_DAMAGE_REFLECTION, 15000);
|
||||
events.ScheduleEvent(EVENT_BLAST_WAVE, 10000);
|
||||
events.ScheduleEvent(EVENT_TELEPORT, 20000);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (instance && instance->GetBossState(BOSS_MAJORDOMO_EXECUTUS) != DONE)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (!me->FindNearestCreature(NPC_FLAMEWAKER_HEALER, 100.0f) && !me->FindNearestCreature(NPC_FLAMEWAKER_ELITE, 100.0f))
|
||||
{
|
||||
//instance->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, me->GetEntry());
|
||||
me->setFaction(35);
|
||||
me->AI()->EnterEvadeMode();
|
||||
DoScriptText(SAY_DEFEAT, me);
|
||||
_JustDied();
|
||||
events.ScheduleEvent(EVENT_OUTRO_1, 32000);
|
||||
return;
|
||||
}
|
||||
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
if (HealthBelowPct(50))
|
||||
DoCast(me, SPELL_AEGIS_OF_RAGNAROS, true);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_MAGIC_REFLECTION:
|
||||
DoCast(me, SPELL_MAGIC_REFLECTION);
|
||||
events.ScheduleEvent(EVENT_MAGIC_REFLECTION, 30000);
|
||||
break;
|
||||
case EVENT_DAMAGE_REFLECTION:
|
||||
DoCast(me, SPELL_DAMAGE_REFLECTION);
|
||||
events.ScheduleEvent(EVENT_DAMAGE_REFLECTION, 30000);
|
||||
break;
|
||||
case EVENT_BLAST_WAVE:
|
||||
DoCastVictim(SPELL_BLAST_WAVE);
|
||||
events.ScheduleEvent(EVENT_BLAST_WAVE, 10000);
|
||||
break;
|
||||
case EVENT_TELEPORT:
|
||||
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 1))
|
||||
DoCast(target, SPELL_TELEPORT);
|
||||
events.ScheduleEvent(EVENT_TELEPORT, 20000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
else
|
||||
{
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_OUTRO_1:
|
||||
me->NearTeleportTo(RagnarosTelePos.GetPositionX(), RagnarosTelePos.GetPositionY(), RagnarosTelePos.GetPositionZ(), RagnarosTelePos.GetOrientation());
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
break;
|
||||
case EVENT_OUTRO_2:
|
||||
if (instance)
|
||||
instance->instance->SummonCreature(NPC_RAGNAROS, RagnarosSummonPos);
|
||||
break;
|
||||
case EVENT_OUTRO_3:
|
||||
DoScriptText(SAY_ARRIVAL2_MAJ, me);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(const int32 action)
|
||||
{
|
||||
if (action == ACTION_START_RAGNAROS)
|
||||
{
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
DoScriptText(SAY_SUMMON_MAJ, me);
|
||||
events.ScheduleEvent(EVENT_OUTRO_2, 8000);
|
||||
events.ScheduleEvent(EVENT_OUTRO_3, 24000);
|
||||
}
|
||||
else if (action == ACTION_START_RAGNAROS_ALT)
|
||||
{
|
||||
me->setFaction(35);
|
||||
me->AI()->EnterEvadeMode();
|
||||
DoScriptText(SAY_DEFEAT, me);
|
||||
//DoCast(SPELL_SUMMON_RAGNAROS); Not working atm ,doing workaround
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(DATA_MAJORDOMO, DONE);
|
||||
//m_pInstance->SetBossState(DATA_MAJORDOMO, DONE);
|
||||
Phase_Timer = 32000;
|
||||
Phase = 1;
|
||||
}
|
||||
|
||||
//Cast Ageis if less than 50% hp
|
||||
if (HealthBelowPct(50))
|
||||
DoCast(me, SPELL_AEGIS);
|
||||
|
||||
if (MagicReflection_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_MAGIC_REFLECTION);
|
||||
MagicReflection_Timer = 30000;
|
||||
} else MagicReflection_Timer -= diff;
|
||||
|
||||
if (DamageReflection_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_DAMAGE_REFLECTION);
|
||||
DamageReflection_Timer = 30000;
|
||||
} else DamageReflection_Timer -= diff;
|
||||
|
||||
//Blastwave_Timer
|
||||
if (Blastwave_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_BLASTWAVE);
|
||||
Blastwave_Timer = 10000;
|
||||
} else Blastwave_Timer -= diff;
|
||||
|
||||
if (Teleport_Timer <= diff)
|
||||
{
|
||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 1))
|
||||
DoCast(pTarget, SPELL_TELEPORT);
|
||||
Teleport_Timer = 20000;
|
||||
} else Teleport_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Phase == 1)
|
||||
{
|
||||
if (Phase_Timer <= diff)
|
||||
{
|
||||
me->NearTeleportTo(TELE_TO_RAG_X, TELE_TO_RAG_Y, TELE_TO_RAG_Z, TELE_TO_RAG_O);
|
||||
Phase = 2;
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
} else Phase_Timer -= diff;
|
||||
}
|
||||
if (Phase == 3)
|
||||
{
|
||||
if (Phase_Timer <= diff)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(DATA_RAGNAROS, true);
|
||||
Phase = 4;
|
||||
Phase_Timer = 16000;
|
||||
} else Phase_Timer -= diff;
|
||||
}
|
||||
if (Phase == 4)
|
||||
{
|
||||
if (Phase_Timer <= diff)
|
||||
{
|
||||
DoScriptText(SAY_ARRIVAL2_MAJ, me);
|
||||
Phase = 5;
|
||||
} else Phase_Timer -= diff;
|
||||
me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
void StartRagsEvent()
|
||||
bool OnGossipHello(Player* player, Creature* creature)
|
||||
{
|
||||
me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
|
||||
Phase = 3;
|
||||
DoScriptText(SAY_SUMMON_MAJ, me);
|
||||
Phase_Timer = 8000;
|
||||
player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SELECT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
|
||||
player->SEND_GOSSIP_MENU(GOSSIP_HELLO, creature->GetGUID());
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 /*uiAction*/)
|
||||
{
|
||||
player->CLOSE_GOSSIP_MENU();
|
||||
creature->AI()->DoAction(ACTION_START_RAGNAROS);
|
||||
return true;
|
||||
}
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_majordomoAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_majordomo()
|
||||
|
||||
@@ -19,414 +19,335 @@
|
||||
/* ScriptData
|
||||
SDName: Boss_Ragnaros
|
||||
SD%Complete: 95
|
||||
SDComment: missing effects in intro (summon, majordomos tele) annd some spells doesnt work correctly
|
||||
SDComment: some spells doesnt work correctly
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "molten_core.h"
|
||||
|
||||
#define SAY_REINFORCEMENTS1 -1409013
|
||||
#define SAY_REINFORCEMENTS2 -1409014
|
||||
#define SAY_HAND -1409015
|
||||
#define SAY_WRATH -1409016
|
||||
#define SAY_KILL -1409017
|
||||
#define SAY_MAGMABURST -1409018
|
||||
enum Texts
|
||||
{
|
||||
SAY_REINFORCEMENTS1 = -1409013,
|
||||
SAY_REINFORCEMENTS2 = -1409014,
|
||||
SAY_HAND = -1409015,
|
||||
SAY_WRATH = -1409016,
|
||||
SAY_KILL = -1409017,
|
||||
SAY_MAGMABURST = -1409018,
|
||||
SAY_SUMMON_MAJ = -1409008,
|
||||
SAY_ARRIVAL1_RAG = -1409009,
|
||||
SAY_ARRIVAL2_MAJ = -1409010,
|
||||
SAY_ARRIVAL3_RAG = -1409011,
|
||||
SAY_ARRIVAL5_RAG = -1409012,
|
||||
};
|
||||
|
||||
#define SPELL_HANDOFRAGNAROS 19780
|
||||
#define SPELL_WRATHOFRAGNAROS 20566
|
||||
#define SPELL_LAVABURST 21158
|
||||
enum Spells
|
||||
{
|
||||
SPELL_HAND_OF_RAGNAROS = 19780,
|
||||
SPELL_WRATH_OF_RAGNAROS = 20566,
|
||||
SPELL_LAVA_BURST = 21158,
|
||||
SPELL_MAGMA_BLAST = 20565, // Ranged attack
|
||||
SPELL_SONS_OF_FLAME_DUMMY = 21108, // Server side effect
|
||||
SPELL_RAGSUBMERGE = 21107, // Stealth aura
|
||||
SPELL_RAGEMERGE = 20568,
|
||||
SPELL_MELT_WEAPON = 21388,
|
||||
SPELL_ELEMENTAL_FIRE = 20564,
|
||||
SPELL_ERRUPTION = 17731,
|
||||
};
|
||||
|
||||
#define SPELL_MAGMABURST 20565 //Ranged attack
|
||||
enum Events
|
||||
{
|
||||
EVENT_ERUPTION = 1,
|
||||
EVENT_WRATH_OF_RAGNAROS = 2,
|
||||
EVENT_HAND_OF_RAGNAROS = 3,
|
||||
EVENT_LAVA_BURST = 4,
|
||||
EVENT_ELEMENTAL_FIRE = 5,
|
||||
EVENT_MAGMA_BLAST = 6,
|
||||
EVENT_SUBMERGE = 7,
|
||||
|
||||
#define SPELL_SONSOFFLAME_DUMMY 21108 //Server side effect
|
||||
#define SPELL_RAGSUBMERGE 21107 //Stealth aura
|
||||
#define SPELL_RAGEMERGE 20568
|
||||
#define SPELL_MELTWEAPON 21388
|
||||
#define SPELL_ELEMENTALFIRE 20564
|
||||
#define SPELL_ERRUPTION 17731
|
||||
|
||||
#define SAY_SUMMON_MAJ -1409008 //intro
|
||||
#define SAY_ARRIVAL1_RAG -1409009
|
||||
#define SAY_ARRIVAL2_MAJ -1409010
|
||||
#define SAY_ARRIVAL3_RAG -1409011
|
||||
#define SAY_ARRIVAL5_RAG -1409012
|
||||
|
||||
#define UNIT_DYNFLAG_ROOTED 8
|
||||
|
||||
#define ADD_1X 848.740356
|
||||
#define ADD_1Y -816.103455
|
||||
#define ADD_1Z -229.74327
|
||||
#define ADD_1O 2.615287
|
||||
|
||||
#define ADD_2X 852.560791
|
||||
#define ADD_2Y -849.861511
|
||||
#define ADD_2Z -228.560974
|
||||
#define ADD_2O 2.836073
|
||||
|
||||
#define ADD_3X 808.710632
|
||||
#define ADD_3Y -852.845764
|
||||
#define ADD_3Z -227.914963
|
||||
#define ADD_3O 0.964207
|
||||
|
||||
#define ADD_4X 786.597107
|
||||
#define ADD_4Y -821.132874
|
||||
#define ADD_4Z -226.350128
|
||||
#define ADD_4O 0.949377
|
||||
|
||||
#define ADD_5X 796.219116
|
||||
#define ADD_5Y -800.948059
|
||||
#define ADD_5Z -226.010361
|
||||
#define ADD_5O 0.560603
|
||||
|
||||
#define ADD_6X 821.602539
|
||||
#define ADD_6Y -782.744109
|
||||
#define ADD_6Z -226.023575
|
||||
#define ADD_6O 6.157440
|
||||
|
||||
#define ADD_7X 844.924744
|
||||
#define ADD_7Y -769.453735
|
||||
#define ADD_7Z -225.521698
|
||||
#define ADD_7O 4.4539958
|
||||
|
||||
#define ADD_8X 839.823364
|
||||
#define ADD_8Y -810.869385
|
||||
#define ADD_8Z -229.683182
|
||||
#define ADD_8O 4.693108
|
||||
EVENT_INTRO_1 = 8,
|
||||
EVENT_INTRO_2 = 9,
|
||||
EVENT_INTRO_3 = 10,
|
||||
EVENT_INTRO_4 = 11,
|
||||
EVENT_INTRO_5 = 12,
|
||||
};
|
||||
|
||||
class boss_ragnaros : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_ragnaros() : CreatureScript("boss_ragnaros") { }
|
||||
public:
|
||||
boss_ragnaros() : CreatureScript("boss_ragnaros") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_ragnarosAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_ragnarosAI : public BossAI
|
||||
{
|
||||
boss_ragnarosAI(Creature *pCreature) : BossAI(pCreature, BOSS_RAGNAROS)
|
||||
struct boss_ragnarosAI : public BossAI
|
||||
{
|
||||
Intro_Timer = 0;
|
||||
Intro = 0;
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
SetCombatMovement(false);
|
||||
}
|
||||
|
||||
uint32 WrathOfRagnaros_Timer;
|
||||
uint32 HandOfRagnaros_Timer;
|
||||
uint32 LavaBurst_Timer;
|
||||
uint32 MagmaBurst_Timer;
|
||||
uint32 ElementalFire_Timer;
|
||||
uint32 Erruption_Timer;
|
||||
uint32 Submerge_Timer;
|
||||
uint32 Attack_Timer;
|
||||
uint32 Intro_Timer;
|
||||
uint8 Intro;
|
||||
|
||||
bool HasYelledMagmaBurst;
|
||||
bool HasSubmergedOnce;
|
||||
bool WasBanished;
|
||||
bool HasAura;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
WrathOfRagnaros_Timer = 30000;
|
||||
HandOfRagnaros_Timer = 25000;
|
||||
LavaBurst_Timer = 10000;
|
||||
MagmaBurst_Timer = 2000;
|
||||
Erruption_Timer = 15000;
|
||||
ElementalFire_Timer = 3000;
|
||||
Submerge_Timer = 180000;
|
||||
Attack_Timer = 90000;
|
||||
HasYelledMagmaBurst = false;
|
||||
HasSubmergedOnce = false;
|
||||
WasBanished = false;
|
||||
|
||||
DoCast(me, SPELL_MELTWEAPON, true);
|
||||
HasAura = true;
|
||||
|
||||
me->RemoveFlag(UNIT_NPC_EMOTESTATE,EMOTE_STATE_SUBMERGED);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (rand()%5)
|
||||
return;
|
||||
|
||||
DoScriptText(SAY_KILL, me);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (Intro == 1)
|
||||
{
|
||||
if (Intro_Timer <= diff)
|
||||
{
|
||||
DoScriptText(SAY_ARRIVAL1_RAG, me);
|
||||
Intro_Timer = 18000;
|
||||
Intro = 2;
|
||||
} else Intro_Timer -= diff;
|
||||
}
|
||||
else if (Intro == 2)
|
||||
{
|
||||
if (Intro_Timer <= diff)
|
||||
{
|
||||
DoScriptText(SAY_ARRIVAL3_RAG, me);
|
||||
Intro_Timer = 19000;
|
||||
Intro = 3;
|
||||
} else Intro_Timer -= diff;
|
||||
}
|
||||
else if (Intro == 3)
|
||||
{
|
||||
if (Intro_Timer <= diff)
|
||||
{
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK1H);
|
||||
Intro_Timer = 1000;
|
||||
Intro = 4;
|
||||
} else Intro_Timer -= diff;
|
||||
}
|
||||
else if (Intro == 4)
|
||||
{
|
||||
if (Intro_Timer <= diff)
|
||||
{
|
||||
DoScriptText(SAY_ARRIVAL5_RAG, me);
|
||||
if (instance)
|
||||
if (Creature *pMajordomo = me->GetCreature(*me, instance->GetData64(DATA_MAJORDOMO_GUID)))
|
||||
me->Kill(pMajordomo);
|
||||
Intro_Timer = 10000;
|
||||
Intro = 5;
|
||||
} else Intro_Timer -= diff;
|
||||
}
|
||||
else if (Intro == 5)
|
||||
{
|
||||
if (Intro_Timer <= diff)
|
||||
{
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
Intro = 6;
|
||||
} else Intro_Timer -= diff;
|
||||
}
|
||||
else if (Intro == 6)
|
||||
boss_ragnarosAI(Creature *pCreature) : BossAI(pCreature, BOSS_RAGNAROS)
|
||||
{
|
||||
if (instance)
|
||||
_introState = 0;
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
BossAI::Reset();
|
||||
_emergeTimer = 90000;
|
||||
_hasYelledMagmaBurst = false;
|
||||
_hasSubmergedOnce = false;
|
||||
_isBanished = false;
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* victim)
|
||||
{
|
||||
BossAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_ERUPTION, 15000);
|
||||
events.ScheduleEvent(EVENT_WRATH_OF_RAGNAROS, 30000);
|
||||
events.ScheduleEvent(EVENT_HAND_OF_RAGNAROS, 25000);
|
||||
events.ScheduleEvent(EVENT_LAVA_BURST, 10000);
|
||||
events.ScheduleEvent(EVENT_ELEMENTAL_FIRE, 3000);
|
||||
events.ScheduleEvent(EVENT_MAGMA_BLAST, 2000);
|
||||
events.ScheduleEvent(EVENT_SUBMERGE, 180000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/)
|
||||
{
|
||||
if (urand(0, 99 < 25))
|
||||
DoScriptText(SAY_KILL, me);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (_introState != 2)
|
||||
{
|
||||
if (WasBanished && ((Attack_Timer <= diff) || (instance->GetData(DATA_RAG_ELE_COUNTER)) > 8))
|
||||
if (!_introState)
|
||||
{
|
||||
//Become unbanished again
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->setFaction(14);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->RemoveFlag(UNIT_NPC_EMOTESTATE,EMOTE_STATE_SUBMERGED);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE);
|
||||
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
|
||||
AttackStart(pTarget);
|
||||
instance->SetData(DATA_RAG_ELE_COUNTER, 0);
|
||||
|
||||
//DoCast(me, SPELL_RAGEMERGE); //"phase spells" didnt worked correctly so Ive commented them and wrote solution witch doesnt need core support
|
||||
WasBanished = false;
|
||||
events.ScheduleEvent(EVENT_INTRO_1, 4000);
|
||||
events.ScheduleEvent(EVENT_INTRO_2, 23000);
|
||||
events.ScheduleEvent(EVENT_INTRO_3, 42000);
|
||||
events.ScheduleEvent(EVENT_INTRO_4, 43000);
|
||||
events.ScheduleEvent(EVENT_INTRO_5, 53000);
|
||||
_introState = 1;
|
||||
}
|
||||
else if (WasBanished)
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
Attack_Timer -= diff;
|
||||
//Do nothing while banished
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//Erruption_Timer
|
||||
if (LavaBurst_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_ERRUPTION);
|
||||
Erruption_Timer = urand(20000,45000);
|
||||
} else Erruption_Timer -= diff;
|
||||
|
||||
//WrathOfRagnaros_Timer
|
||||
if (WrathOfRagnaros_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_WRATHOFRAGNAROS);
|
||||
|
||||
if (urand(0,1))
|
||||
DoScriptText(SAY_WRATH, me);
|
||||
|
||||
WrathOfRagnaros_Timer = 25000;
|
||||
} else WrathOfRagnaros_Timer -= diff;
|
||||
|
||||
//HandOfRagnaros_Timer
|
||||
if (HandOfRagnaros_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_HANDOFRAGNAROS);
|
||||
|
||||
if (urand(0,1))
|
||||
DoScriptText(SAY_HAND, me);
|
||||
|
||||
HandOfRagnaros_Timer = 20000;
|
||||
} else HandOfRagnaros_Timer -= diff;
|
||||
|
||||
//LavaBurst_Timer
|
||||
if (LavaBurst_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_LAVABURST);
|
||||
LavaBurst_Timer = 10000;
|
||||
} else LavaBurst_Timer -= diff;
|
||||
|
||||
//ElementalFire_Timer
|
||||
if (ElementalFire_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_ELEMENTALFIRE);
|
||||
ElementalFire_Timer = urand(10000,14000);
|
||||
} else ElementalFire_Timer -= diff;
|
||||
|
||||
//Submerge_Timer
|
||||
if (!WasBanished && Submerge_Timer <= diff && instance)
|
||||
{
|
||||
//Creature spawning and ragnaros becomming unattackable
|
||||
//is not very well supported in the core //no it really isnt
|
||||
//so added normaly spawning and banish workaround and attack again after 90 secs.
|
||||
|
||||
me->AttackStop();
|
||||
DoResetThreat();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
//Root self
|
||||
//DoCast(me, 23973);
|
||||
me->setFaction(35);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetFlag(UNIT_NPC_EMOTESTATE,EMOTE_STATE_SUBMERGED);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_SUBMERGE);
|
||||
instance->SetData(DATA_RAG_ELE_COUNTER, 0);
|
||||
|
||||
if (!HasSubmergedOnce)
|
||||
{
|
||||
DoScriptText(SAY_REINFORCEMENTS1, me);
|
||||
|
||||
// summon 10 elementals
|
||||
for (uint8 i = 0; i < 9; ++i)
|
||||
switch (eventId)
|
||||
{
|
||||
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
|
||||
{
|
||||
if (Creature* pSummoned = me->SummonCreature(12143,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0.0f,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,900000))
|
||||
pSummoned->AI()->AttackStart(pTarget);
|
||||
}
|
||||
case EVENT_INTRO_1:
|
||||
DoScriptText(SAY_ARRIVAL1_RAG, me);
|
||||
break;
|
||||
case EVENT_INTRO_2:
|
||||
DoScriptText(SAY_ARRIVAL3_RAG, me);
|
||||
break;
|
||||
case EVENT_INTRO_3:
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_ATTACK1H);
|
||||
break;
|
||||
case EVENT_INTRO_4:
|
||||
DoScriptText(SAY_ARRIVAL5_RAG, me);
|
||||
if (instance)
|
||||
if (Creature* executus = Unit::GetCreature(*me, instance->GetData64(BOSS_MAJORDOMO_EXECUTUS)))
|
||||
me->Kill(executus);
|
||||
break;
|
||||
case EVENT_INTRO_5:
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
_introState = 2;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
HasSubmergedOnce = true;
|
||||
WasBanished = true;
|
||||
//DoCast(me, SPELL_RAGSUBMERGE);
|
||||
Attack_Timer = 90000;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
DoScriptText(SAY_REINFORCEMENTS2, me);
|
||||
|
||||
for (uint8 i = 0; i < 9; ++i)
|
||||
{
|
||||
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
|
||||
{
|
||||
if (Creature* pSummoned = me->SummonCreature(12143,pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(),0.0f,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,900000))
|
||||
pSummoned->AI()->AttackStart(pTarget);
|
||||
}
|
||||
}
|
||||
|
||||
WasBanished = true;
|
||||
//DoCast(me, SPELL_RAGSUBMERGE);
|
||||
Attack_Timer = 90000;
|
||||
}
|
||||
|
||||
Submerge_Timer = 180000;
|
||||
} else Submerge_Timer -= diff;
|
||||
|
||||
//If we are within range melee the target
|
||||
if (me->IsWithinMeleeRange(me->getVictim()))
|
||||
{
|
||||
//Make sure our attack is ready and we arn't currently casting
|
||||
if (me->isAttackReady() && !me->IsNonMeleeSpellCasted(false))
|
||||
{
|
||||
me->AttackerStateUpdate(me->getVictim());
|
||||
me->resetAttackTimer();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//MagmaBurst_Timer
|
||||
if (MagmaBurst_Timer <= diff)
|
||||
if (instance)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_MAGMABURST);
|
||||
|
||||
if (!HasYelledMagmaBurst)
|
||||
if (_isBanished && ((_emergeTimer <= diff) || (instance->GetData(DATA_RAGNAROS_ADDS)) > 8))
|
||||
{
|
||||
//Say our dialog
|
||||
DoScriptText(SAY_MAGMABURST, me);
|
||||
HasYelledMagmaBurst = true;
|
||||
}
|
||||
//Become unbanished again
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
me->setFaction(14);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE);
|
||||
if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||
AttackStart(target);
|
||||
instance->SetData(DATA_RAGNAROS_ADDS, 0);
|
||||
|
||||
MagmaBurst_Timer = 2500;
|
||||
} else MagmaBurst_Timer -= diff;
|
||||
//DoCast(me, SPELL_RAGEMERGE); //"phase spells" didnt worked correctly so Ive commented them and wrote solution witch doesnt need core support
|
||||
_isBanished = false;
|
||||
}
|
||||
else if (_isBanished)
|
||||
{
|
||||
_emergeTimer -= diff;
|
||||
//Do nothing while banished
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//Return since we have no target
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_ERUPTION:
|
||||
DoCastVictim(SPELL_ERRUPTION);
|
||||
events.ScheduleEvent(EVENT_ERUPTION, urand(20000, 45000));
|
||||
break;
|
||||
case EVENT_WRATH_OF_RAGNAROS:
|
||||
DoCastVictim(SPELL_WRATH_OF_RAGNAROS);
|
||||
if (urand(0, 1))
|
||||
DoScriptText(SAY_WRATH, me);
|
||||
events.ScheduleEvent(EVENT_WRATH_OF_RAGNAROS, 25000);
|
||||
break;
|
||||
case EVENT_HAND_OF_RAGNAROS:
|
||||
DoCast(me, SPELL_HAND_OF_RAGNAROS);
|
||||
if (urand(0,1))
|
||||
DoScriptText(SAY_HAND, me);
|
||||
events.ScheduleEvent(EVENT_HAND_OF_RAGNAROS, 20000);
|
||||
break;
|
||||
case EVENT_LAVA_BURST:
|
||||
DoCastVictim(SPELL_LAVA_BURST);
|
||||
events.ScheduleEvent(EVENT_LAVA_BURST, 10000);
|
||||
break;
|
||||
case EVENT_ELEMENTAL_FIRE:
|
||||
DoCastVictim(SPELL_ELEMENTAL_FIRE);
|
||||
events.ScheduleEvent(EVENT_ELEMENTAL_FIRE, urand(10000, 14000));
|
||||
break;
|
||||
case EVENT_MAGMA_BLAST:
|
||||
if (me->IsWithinMeleeRange(me->getVictim()))
|
||||
{
|
||||
DoCastVictim(SPELL_MAGMA_BLAST);
|
||||
if (!_hasYelledMagmaBurst)
|
||||
{
|
||||
//Say our dialog
|
||||
DoScriptText(SAY_MAGMABURST, me);
|
||||
_hasYelledMagmaBurst = true;
|
||||
}
|
||||
}
|
||||
events.ScheduleEvent(EVENT_MAGMA_BLAST, 2500);
|
||||
break;
|
||||
case EVENT_SUBMERGE:
|
||||
{
|
||||
if (instance && !_isBanished)
|
||||
{
|
||||
//Creature spawning and ragnaros becomming unattackable
|
||||
//is not very well supported in the core //no it really isnt
|
||||
//so added normaly spawning and banish workaround and attack again after 90 secs.
|
||||
me->AttackStop();
|
||||
DoResetThreat();
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
me->InterruptNonMeleeSpells(false);
|
||||
//Root self
|
||||
//DoCast(me, 23973);
|
||||
me->setFaction(35);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_SUBMERGED);
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_SUBMERGE);
|
||||
instance->SetData(DATA_RAGNAROS_ADDS, 0);
|
||||
|
||||
if (!_hasSubmergedOnce)
|
||||
{
|
||||
DoScriptText(SAY_REINFORCEMENTS1, me);
|
||||
|
||||
// summon 8 elementals
|
||||
for (uint8 i = 0; i < 8; ++i)
|
||||
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||
if (Creature* pSummoned = me->SummonCreature(12143, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0.0f,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,900000))
|
||||
pSummoned->AI()->AttackStart(pTarget);
|
||||
|
||||
_hasSubmergedOnce = true;
|
||||
_isBanished = true;
|
||||
//DoCast(me, SPELL_RAGSUBMERGE);
|
||||
_emergeTimer = 90000;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
DoScriptText(SAY_REINFORCEMENTS2, me);
|
||||
|
||||
for (uint8 i = 0; i < 8; ++i)
|
||||
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
|
||||
if (Creature* pSummoned = me->SummonCreature(12143, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0.0f,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,900000))
|
||||
pSummoned->AI()->AttackStart(pTarget);
|
||||
|
||||
_isBanished = true;
|
||||
//DoCast(me, SPELL_RAGSUBMERGE);
|
||||
_emergeTimer = 90000;
|
||||
}
|
||||
}
|
||||
events.ScheduleEvent(EVENT_SUBMERGE, 180000);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
private:
|
||||
uint32 _emergeTimer;
|
||||
uint8 _introState;
|
||||
bool _hasYelledMagmaBurst;
|
||||
bool _hasSubmergedOnce;
|
||||
bool _isBanished;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_ragnarosAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
class mob_son_of_flame : public CreatureScript
|
||||
{
|
||||
public:
|
||||
mob_son_of_flame() : CreatureScript("mob_SonOfFlame") { }
|
||||
|
||||
struct mob_son_of_flameAI : public ScriptedAI //didnt work correctly in EAI for me...
|
||||
{
|
||||
mob_son_of_flameAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
me->HandleEmoteCommand(EMOTE_ONESHOT_EMERGE);
|
||||
Intro_Timer = 4000;
|
||||
Intro = 1;
|
||||
instance = me->GetInstanceScript();
|
||||
}
|
||||
|
||||
void JustDied(Unit * /*victim*/)
|
||||
{
|
||||
if (instance)
|
||||
instance->SetData(DATA_RAGNAROS_ADDS, 1);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 /*diff*/)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
InstanceScript* instance;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new mob_son_of_flameAI(pCreature);
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
class mob_SonOfFlame : public CreatureScript
|
||||
{
|
||||
public:
|
||||
mob_SonOfFlame() : CreatureScript("mob_SonOfFlame") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new mob_SonOfFlameAI(pCreature);
|
||||
}
|
||||
|
||||
struct mob_SonOfFlameAI : public ScriptedAI //didnt work correctly in EAI for me...
|
||||
{
|
||||
mob_SonOfFlameAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
pInstance = me->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
|
||||
void JustDied(Unit * /*victim*/)
|
||||
{
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_RAG_ELE_COUNTER, 1);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 /*diff*/)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
void AddSC_boss_ragnaros()
|
||||
{
|
||||
new boss_ragnaros();
|
||||
new mob_SonOfFlame();
|
||||
new mob_son_of_flame();
|
||||
}
|
||||
@@ -23,113 +23,104 @@ SDComment: Teleport NYI
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "molten_core.h"
|
||||
|
||||
#define SPELL_ARCANEEXPLOSION 19712
|
||||
#define SPELL_SHAZZRAHCURSE 19713
|
||||
#define SPELL_DEADENMAGIC 19714
|
||||
#define SPELL_COUNTERSPELL 19715
|
||||
enum Spells
|
||||
{
|
||||
SPELL_ARCANE_EXPLOSION = 19712,
|
||||
SPELL_SHAZZRAH_CURSE = 19713,
|
||||
SPELL_MAGIC_GROUNDING = 19714,
|
||||
SPELL_COUNTERSPELL = 19715,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_ARCANE_EXPLOSION = 1,
|
||||
EVENT_SHAZZRAH_CURSE = 2,
|
||||
EVENT_MAGIC_GROUNDING = 3,
|
||||
EVENT_COUNTERSPELL = 4,
|
||||
EVENT_BLINK = 5,
|
||||
};
|
||||
|
||||
class boss_shazzrah : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_shazzrah() : CreatureScript("boss_shazzrah") { }
|
||||
public:
|
||||
boss_shazzrah() : CreatureScript("boss_shazzrah") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_shazzrahAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_shazzrahAI : public ScriptedAI
|
||||
{
|
||||
boss_shazzrahAI(Creature *pCreature) : ScriptedAI(pCreature)
|
||||
struct boss_shazzrahAI : public BossAI
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* m_pInstance;
|
||||
|
||||
uint32 ArcaneExplosion_Timer;
|
||||
uint32 ShazzrahCurse_Timer;
|
||||
uint32 DeadenMagic_Timer;
|
||||
uint32 Countspell_Timer;
|
||||
uint32 Blink_Timer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
ArcaneExplosion_Timer = 6000; //These times are probably wrong
|
||||
ShazzrahCurse_Timer = 10000;
|
||||
DeadenMagic_Timer = 24000;
|
||||
Countspell_Timer = 15000;
|
||||
Blink_Timer = 30000;
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*pKiller*/)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(DATA_SHAZZRAH, 0);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//ArcaneExplosion_Timer
|
||||
if (ArcaneExplosion_Timer <= diff)
|
||||
boss_shazzrahAI(Creature* creature) : BossAI(creature, BOSS_SHAZZRAH)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_ARCANEEXPLOSION);
|
||||
ArcaneExplosion_Timer = 5000 + rand()%4000;
|
||||
} else ArcaneExplosion_Timer -= diff;
|
||||
}
|
||||
|
||||
//ShazzrahCurse_Timer
|
||||
if (ShazzrahCurse_Timer <= diff)
|
||||
void EnterCombat(Unit* target)
|
||||
{
|
||||
Unit *pTarget = NULL;
|
||||
pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
|
||||
if (pTarget) DoCast(pTarget, SPELL_SHAZZRAHCURSE);
|
||||
BossAI::EnterCombat(target);
|
||||
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, 6000);
|
||||
events.ScheduleEvent(EVENT_SHAZZRAH_CURSE, 10000);
|
||||
events.ScheduleEvent(EVENT_MAGIC_GROUNDING, 24000);
|
||||
events.ScheduleEvent(EVENT_COUNTERSPELL, 15000);
|
||||
events.ScheduleEvent(EVENT_BLINK, 30000);
|
||||
}
|
||||
|
||||
ShazzrahCurse_Timer = 25000 + rand()%5000;
|
||||
} else ShazzrahCurse_Timer -= diff;
|
||||
|
||||
//DeadenMagic_Timer
|
||||
if (DeadenMagic_Timer <= diff)
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
DoCast(me, SPELL_DEADENMAGIC);
|
||||
DeadenMagic_Timer = 35000;
|
||||
} else DeadenMagic_Timer -= diff;
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//Countspell_Timer
|
||||
if (Countspell_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_COUNTERSPELL);
|
||||
Countspell_Timer = 16000 + rand()%4000;
|
||||
} else Countspell_Timer -= diff;
|
||||
events.Update(diff);
|
||||
|
||||
//Blink_Timer
|
||||
if (Blink_Timer <= diff)
|
||||
{
|
||||
// Teleporting him to a random gamer and casting Arcane Explosion after that.
|
||||
// Blink is not working cause of LoS System we need to do this hardcoded.
|
||||
if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM,0, 100, true))
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
DoTeleportTo(pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ());
|
||||
DoCast(pTarget, SPELL_ARCANEEXPLOSION);
|
||||
DoResetThreat();
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_ARCANE_EXPLOSION:
|
||||
DoCastVictim(SPELL_ARCANE_EXPLOSION);
|
||||
events.ScheduleEvent(EVENT_ARCANE_EXPLOSION, urand(5000, 9000));
|
||||
break;
|
||||
case EVENT_SHAZZRAH_CURSE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -EVENT_SHAZZRAH_CURSE))
|
||||
DoCast(target, SPELL_SHAZZRAH_CURSE);
|
||||
events.ScheduleEvent(EVENT_SHAZZRAH_CURSE, urand(25000, 30000));
|
||||
break;
|
||||
case EVENT_MAGIC_GROUNDING:
|
||||
DoCast(me, SPELL_MAGIC_GROUNDING);
|
||||
events.ScheduleEvent(EVENT_MAGIC_GROUNDING, 35000);
|
||||
break;
|
||||
case EVENT_COUNTERSPELL:
|
||||
DoCastVictim(SPELL_COUNTERSPELL);
|
||||
events.ScheduleEvent(EVENT_COUNTERSPELL, urand(16000, 20000));
|
||||
break;
|
||||
case EVENT_BLINK:
|
||||
// Teleporting him to a random player and casting Arcane Explosion after that.
|
||||
// Blink is not working cause of LoS System we need to do this hardcoded.
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true))
|
||||
{
|
||||
DoTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ());
|
||||
DoCast(target, SPELL_ARCANE_EXPLOSION);
|
||||
DoResetThreat();
|
||||
}
|
||||
events.ScheduleEvent(EVENT_BLINK, 45000);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Blink_Timer = 45000;
|
||||
} else Blink_Timer -= diff;
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_shazzrahAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
void AddSC_boss_shazzrah()
|
||||
|
||||
@@ -23,199 +23,200 @@ SDComment: Adds NYI
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "molten_core.h"
|
||||
|
||||
#define SPELL_DARKSTRIKE 19777
|
||||
#define SPELL_DEMORALIZINGSHOUT 19778
|
||||
#define SPELL_INSPIRE 19779
|
||||
#define SPELL_KNOCKDOWN 19780
|
||||
#define SPELL_FLAMESPEAR 19781
|
||||
enum Spells
|
||||
{
|
||||
// Sulfuron Harbringer
|
||||
SPELL_DARK_STRIKE = 19777,
|
||||
SPELL_DEMORALIZING_SHOUT = 19778,
|
||||
SPELL_INSPIRE = 19779,
|
||||
SPELL_KNOCKDOWN = 19780,
|
||||
SPELL_FLAMESPEAR = 19781,
|
||||
|
||||
//Adds Spells
|
||||
#define SPELL_HEAL 19775
|
||||
#define SPELL_SHADOWWORDPAIN 19776
|
||||
#define SPELL_IMMOLATE 20294
|
||||
// Adds
|
||||
SPELL_HEAL = 19775,
|
||||
SPELL_SHADOWWORDPAIN = 19776,
|
||||
SPELL_IMMOLATE = 20294,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_DARK_STRIKE = 1,
|
||||
EVENT_DEMORALIZING_SHOUT = 2,
|
||||
EVENT_INSPIRE = 3,
|
||||
EVENT_KNOCKDOWN = 4,
|
||||
EVENT_FLAMESPEAR = 5,
|
||||
|
||||
EVENT_HEAL = 6,
|
||||
EVENT_SHADOW_WORD_PAIN = 7,
|
||||
EVENT_IMMOLATE = 8,
|
||||
};
|
||||
|
||||
class boss_sulfuron : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_sulfuron() : CreatureScript("boss_sulfuron") { }
|
||||
public:
|
||||
boss_sulfuron() : CreatureScript("boss_sulfuron") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_sulfuronAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_sulfuronAI : public ScriptedAI
|
||||
{
|
||||
boss_sulfuronAI(Creature *pCreature) : ScriptedAI(pCreature)
|
||||
struct boss_sulfuronAI : public BossAI
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
InstanceScript* m_pInstance;
|
||||
|
||||
uint32 Darkstrike_Timer;
|
||||
uint32 DemoralizingShout_Timer;
|
||||
uint32 Inspire_Timer;
|
||||
uint32 Knockdown_Timer;
|
||||
uint32 Flamespear_Timer;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
Darkstrike_Timer=10000; //These times are probably wrong
|
||||
DemoralizingShout_Timer = 15000;
|
||||
Inspire_Timer = 13000;
|
||||
Knockdown_Timer = 6000;
|
||||
Flamespear_Timer = 2000;
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*pKiller*/)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(DATA_SULFURON, 0);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//DemoralizingShout_Timer
|
||||
if (DemoralizingShout_Timer <= diff)
|
||||
boss_sulfuronAI(Creature* creature) : BossAI(creature, BOSS_SULFURON_HARBINGER)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_DEMORALIZINGSHOUT);
|
||||
DemoralizingShout_Timer = 15000 + rand()%5000;
|
||||
} else DemoralizingShout_Timer -= diff;
|
||||
}
|
||||
|
||||
//Inspire_Timer
|
||||
if (Inspire_Timer <= diff)
|
||||
void EnterCombat(Unit* victim)
|
||||
{
|
||||
Creature *pTarget = NULL;
|
||||
std::list<Creature*> pList = DoFindFriendlyMissingBuff(45.0f,SPELL_INSPIRE);
|
||||
if (!pList.empty())
|
||||
BossAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_DARK_STRIKE, 10000);
|
||||
events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, 15000);
|
||||
events.ScheduleEvent(EVENT_INSPIRE, 13000);
|
||||
events.ScheduleEvent(EVENT_KNOCKDOWN, 6000);
|
||||
events.ScheduleEvent(EVENT_FLAMESPEAR, 2000);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
std::list<Creature*>::const_iterator i = pList.begin();
|
||||
advance(i, (rand()%pList.size()));
|
||||
pTarget = (*i);
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_DARK_STRIKE:
|
||||
DoCast(me, SPELL_DARK_STRIKE);
|
||||
events.ScheduleEvent(EVENT_DARK_STRIKE, urand(15000, 18000));
|
||||
break;
|
||||
case EVENT_DEMORALIZING_SHOUT:
|
||||
DoCastVictim(SPELL_DEMORALIZING_SHOUT);
|
||||
events.ScheduleEvent(EVENT_DEMORALIZING_SHOUT, urand(15000, 20000));
|
||||
break;
|
||||
case EVENT_INSPIRE:
|
||||
{
|
||||
Creature* target = NULL;
|
||||
std::list<Creature*> healers = DoFindFriendlyMissingBuff(45.0f, SPELL_INSPIRE);
|
||||
if (!healers.empty())
|
||||
{
|
||||
std::list<Creature*>::const_iterator itr = healers.begin();
|
||||
std::advance(itr, urand(0, healers.size()-1));
|
||||
target = *itr;
|
||||
}
|
||||
|
||||
if (target)
|
||||
DoCast(target, SPELL_INSPIRE);
|
||||
|
||||
DoCast(me, SPELL_INSPIRE);
|
||||
events.ScheduleEvent(EVENT_INSPIRE, urand(20000, 26000));
|
||||
break;
|
||||
}
|
||||
case EVENT_KNOCKDOWN:
|
||||
DoCastVictim(SPELL_KNOCKDOWN);
|
||||
events.ScheduleEvent(EVENT_KNOCKDOWN, urand(12000, 15000));
|
||||
break;
|
||||
case EVENT_FLAMESPEAR:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
|
||||
DoCast(target, SPELL_FLAMESPEAR);
|
||||
events.ScheduleEvent(EVENT_FLAMESPEAR, urand(12000, 16000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pTarget)
|
||||
DoCast(pTarget, SPELL_INSPIRE);
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
DoCast(me, SPELL_INSPIRE);
|
||||
|
||||
Inspire_Timer = 20000 + rand()%6000;
|
||||
} else Inspire_Timer -= diff;
|
||||
|
||||
//Knockdown_Timer
|
||||
if (Knockdown_Timer <= diff)
|
||||
{
|
||||
DoCast(me->getVictim(), SPELL_KNOCKDOWN);
|
||||
Knockdown_Timer = 12000 + rand()%3000;
|
||||
} else Knockdown_Timer -= diff;
|
||||
|
||||
//Flamespear_Timer
|
||||
if (Flamespear_Timer <= diff)
|
||||
{
|
||||
Unit *pTarget = NULL;
|
||||
pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
|
||||
if (pTarget) DoCast(pTarget, SPELL_FLAMESPEAR);
|
||||
|
||||
Flamespear_Timer = 12000 + rand()%4000;
|
||||
} else Flamespear_Timer -= diff;
|
||||
|
||||
//DarkStrike_Timer
|
||||
if (Darkstrike_Timer <= diff)
|
||||
{
|
||||
DoCast(me, SPELL_DARKSTRIKE);
|
||||
Darkstrike_Timer = 15000 + rand()%3000;
|
||||
} else Darkstrike_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_sulfuronAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
class mob_flamewaker_priest : public CreatureScript
|
||||
{
|
||||
public:
|
||||
mob_flamewaker_priest() : CreatureScript("mob_flamewaker_priest") { }
|
||||
public:
|
||||
mob_flamewaker_priest() : CreatureScript("mob_flamewaker_priest") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new mob_flamewaker_priestAI (pCreature);
|
||||
}
|
||||
|
||||
struct mob_flamewaker_priestAI : public ScriptedAI
|
||||
{
|
||||
mob_flamewaker_priestAI(Creature *c) : ScriptedAI(c) {}
|
||||
|
||||
uint32 Heal_Timer;
|
||||
uint32 ShadowWordPain_Timer;
|
||||
uint32 Immolate_Timer;
|
||||
|
||||
void Reset()
|
||||
struct mob_flamewaker_priestAI : public ScriptedAI
|
||||
{
|
||||
Heal_Timer = 15000+rand()%15000;
|
||||
ShadowWordPain_Timer = 2000;
|
||||
Immolate_Timer = 8000;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
//Casting Heal to Sulfuron or other Guards.
|
||||
if (Heal_Timer <= diff)
|
||||
mob_flamewaker_priestAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
Unit* pUnit = DoSelectLowestHpFriendly(60.0f, 1);
|
||||
if (!pUnit)
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
events.Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* victim)
|
||||
{
|
||||
ScriptedAI::EnterCombat(victim);
|
||||
events.ScheduleEvent(EVENT_HEAL, urand(15000, 30000));
|
||||
events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, 2000);
|
||||
events.ScheduleEvent(EVENT_IMMOLATE, 8000);
|
||||
}
|
||||
|
||||
void UpdateAI(const uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoCast(pUnit, SPELL_HEAL);
|
||||
events.Update(diff);
|
||||
|
||||
Heal_Timer = 15000+rand()%5000;
|
||||
} else Heal_Timer -= diff;
|
||||
if (me->HasUnitState(UNIT_STAT_CASTING))
|
||||
return;
|
||||
|
||||
//ShadowWordPain_Timer
|
||||
if (ShadowWordPain_Timer <= diff)
|
||||
{
|
||||
Unit *pTarget = NULL;
|
||||
pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
|
||||
if (pTarget) DoCast(pTarget, SPELL_SHADOWWORDPAIN);
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_HEAL:
|
||||
if (Unit* target = DoSelectLowestHpFriendly(60.0f, 1))
|
||||
DoCast(target, SPELL_HEAL);
|
||||
events.ScheduleEvent(EVENT_HEAL, urand(15000, 20000));
|
||||
break;
|
||||
case EVENT_SHADOW_WORD_PAIN:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_SHADOWWORDPAIN))
|
||||
DoCast(target, SPELL_SHADOWWORDPAIN);
|
||||
events.ScheduleEvent(EVENT_SHADOW_WORD_PAIN, urand(18000, 26000));
|
||||
break;
|
||||
case EVENT_IMMOLATE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_IMMOLATE))
|
||||
DoCast(target, SPELL_IMMOLATE);
|
||||
events.ScheduleEvent(EVENT_IMMOLATE, urand(15000, 25000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ShadowWordPain_Timer = 18000+rand()%8000;
|
||||
} else ShadowWordPain_Timer -= diff;
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
//Immolate_Timer
|
||||
if (Immolate_Timer <= diff)
|
||||
{
|
||||
Unit *pTarget = NULL;
|
||||
pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
|
||||
if (pTarget) DoCast(pTarget, SPELL_IMMOLATE);
|
||||
private:
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
Immolate_Timer = 15000+rand()%10000;
|
||||
} else Immolate_Timer -= diff;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new mob_flamewaker_priestAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
void AddSC_boss_sulfuron()
|
||||
{
|
||||
new boss_sulfuron();
|
||||
|
||||
@@ -23,351 +23,208 @@ SDComment: Place Holder
|
||||
SDCategory: Molten Core
|
||||
EndScriptData */
|
||||
|
||||
#include "ScriptPCH.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "ScriptMgr.h"
|
||||
#include "InstanceScript.h"
|
||||
#include "CreatureAI.h"
|
||||
#include "molten_core.h"
|
||||
|
||||
#define MAX_ENCOUNTER 10
|
||||
|
||||
#define ID_LUCIFRON 12118
|
||||
#define ID_MAGMADAR 11982
|
||||
#define ID_GEHENNAS 12259
|
||||
#define ID_GARR 12057
|
||||
#define ID_GEDDON 12056
|
||||
#define ID_SHAZZRAH 12264
|
||||
#define ID_GOLEMAGG 11988
|
||||
#define ID_SULFURON 12098
|
||||
#define ID_DOMO 12018
|
||||
#define ID_RAGNAROS 11502
|
||||
#define ID_FLAMEWAKERPRIEST 11662
|
||||
#define ID_FLAMEWAKERHEALER 11663
|
||||
#define ID_FLAMEWAKERELITE 11664
|
||||
|
||||
const Position Pos[10] =
|
||||
const Position SummonPositions[10] =
|
||||
{
|
||||
{737.85f,-1145.35f,-120.288f,4.71368f},
|
||||
{744.162f,-1151.63f,-119.726f,4.58204f},
|
||||
{751.247f,-1152.82f,-119.744f,4.49673f},
|
||||
{759.206f,-1155.09f,-120.051f,4.30104f},
|
||||
{755.973f,-1152.33f,-120.029f,4.25588f},
|
||||
{731.712f,-1147.56f,-120.195f,4.95955f},
|
||||
{726.499f,-1149.8f,-120.156f,5.24055f},
|
||||
{722.408f,-1152.41f,-120.029f,5.33087f},
|
||||
{718.994f,-1156.36f,-119.805f,5.75738f},
|
||||
{838.51f,-829.84f,-232.00f,2.00f},
|
||||
{737.850f, -1145.35f, -120.288f, 4.71368f},
|
||||
{744.162f, -1151.63f, -119.726f, 4.58204f},
|
||||
{751.247f, -1152.82f, -119.744f, 4.49673f},
|
||||
{759.206f, -1155.09f, -120.051f, 4.30104f},
|
||||
{755.973f, -1152.33f, -120.029f, 4.25588f},
|
||||
{731.712f, -1147.56f, -120.195f, 4.95955f},
|
||||
{726.499f, -1149.80f, -120.156f, 5.24055f},
|
||||
{722.408f, -1152.41f, -120.029f, 5.33087f},
|
||||
{718.994f, -1156.36f, -119.805f, 5.75738f},
|
||||
{838.510f, -829.840f, -232.000f, 2.00000f},
|
||||
};
|
||||
|
||||
class instance_molten_core : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_molten_core() : InstanceMapScript("instance_molten_core", 409) { }
|
||||
public:
|
||||
instance_molten_core() : InstanceMapScript("instance_molten_core", 409) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* pMap) const
|
||||
{
|
||||
return new instance_molten_core_InstanceMapScript (pMap);
|
||||
}
|
||||
|
||||
struct instance_molten_core_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_molten_core_InstanceMapScript(Map* pMap) : InstanceScript(pMap) {Initialize();};
|
||||
|
||||
uint64 Lucifron, Magmadar, Gehennas, Garr, Geddon, Shazzrah, Sulfuron, Golemagg, Domo, Ragnaros, FlamewakerPriest;
|
||||
uint64 RuneKoro, RuneZeth, RuneMazj, RuneTheri, RuneBlaz, RuneKress, RuneMohn, m_uiFirelordCacheGUID;
|
||||
uint8 rag_ele_counter;
|
||||
|
||||
//If all Bosses are dead.
|
||||
bool IsBossDied[9];
|
||||
bool summoned;
|
||||
|
||||
bool rag_summoned;
|
||||
|
||||
uint32 m_auiEncounter[MAX_ENCOUNTER];
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
|
||||
|
||||
Lucifron = 0;
|
||||
Magmadar = 0;
|
||||
Gehennas = 0;
|
||||
Garr = 0;
|
||||
Geddon = 0;
|
||||
Shazzrah = 0;
|
||||
Sulfuron = 0;
|
||||
Golemagg = 0;
|
||||
Domo = 0;
|
||||
Ragnaros = 0;
|
||||
FlamewakerPriest = 0;
|
||||
|
||||
RuneKoro = 0;
|
||||
RuneZeth = 0;
|
||||
RuneMazj = 0;
|
||||
RuneTheri = 0;
|
||||
RuneBlaz = 0;
|
||||
RuneKress = 0;
|
||||
RuneMohn = 0;
|
||||
|
||||
rag_ele_counter = 0;
|
||||
|
||||
m_uiFirelordCacheGUID = 0;
|
||||
|
||||
IsBossDied[0] = false;
|
||||
IsBossDied[1] = false;
|
||||
IsBossDied[2] = false;
|
||||
IsBossDied[3] = false;
|
||||
IsBossDied[4] = false;
|
||||
IsBossDied[5] = false;
|
||||
IsBossDied[6] = false;
|
||||
IsBossDied[7] = false;
|
||||
IsBossDied[8] = false;
|
||||
summoned = false;
|
||||
rag_summoned = false;
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const
|
||||
{
|
||||
return false;
|
||||
};
|
||||
|
||||
void OnGameObjectCreate(GameObject* pGo)
|
||||
{
|
||||
switch(pGo->GetEntry())
|
||||
struct instance_molten_core_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
case 176951: //Sulfuron
|
||||
RuneKoro = pGo->GetGUID();
|
||||
break;
|
||||
case 176952: //Geddon
|
||||
RuneZeth = pGo->GetGUID();
|
||||
break;
|
||||
case 176953: //Shazzrah
|
||||
RuneMazj = pGo->GetGUID();
|
||||
break;
|
||||
case 176954: //Golemagg
|
||||
RuneTheri = pGo->GetGUID();
|
||||
break;
|
||||
case 176955: //Garr
|
||||
RuneBlaz = pGo->GetGUID();
|
||||
break;
|
||||
case 176956: //Magmadar
|
||||
RuneKress = pGo->GetGUID();
|
||||
break;
|
||||
case 176957: //Gehennas
|
||||
RuneMohn = pGo->GetGUID();
|
||||
break;
|
||||
case 179703:
|
||||
m_uiFirelordCacheGUID = pGo->GetGUID(); //when majordomo event == DONE DoRespawnGameObject(m_uiFirelordCacheGUID,);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* pCreature)
|
||||
{
|
||||
switch (pCreature->GetEntry())
|
||||
{
|
||||
case ID_LUCIFRON:
|
||||
Lucifron = pCreature->GetGUID();
|
||||
break;
|
||||
|
||||
case ID_MAGMADAR:
|
||||
Magmadar = pCreature->GetGUID();
|
||||
break;
|
||||
|
||||
case ID_GEHENNAS:
|
||||
Gehennas = pCreature->GetGUID();
|
||||
break;
|
||||
|
||||
case ID_GARR:
|
||||
Garr = pCreature->GetGUID();
|
||||
break;
|
||||
|
||||
case ID_GEDDON:
|
||||
Geddon = pCreature->GetGUID();
|
||||
break;
|
||||
|
||||
case ID_SHAZZRAH:
|
||||
Shazzrah = pCreature->GetGUID();
|
||||
break;
|
||||
|
||||
case ID_SULFURON:
|
||||
Sulfuron = pCreature->GetGUID();
|
||||
break;
|
||||
|
||||
case ID_GOLEMAGG:
|
||||
Golemagg = pCreature->GetGUID();
|
||||
break;
|
||||
|
||||
case ID_DOMO:
|
||||
Domo = pCreature->GetGUID();
|
||||
break;
|
||||
|
||||
case ID_RAGNAROS:
|
||||
Ragnaros = pCreature->GetGUID();
|
||||
break;
|
||||
|
||||
case ID_FLAMEWAKERPRIEST:
|
||||
FlamewakerPriest = pCreature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint64 GetData64 (uint32 identifier)
|
||||
{
|
||||
switch(identifier)
|
||||
{
|
||||
case DATA_SULFURON:
|
||||
return Sulfuron;
|
||||
case DATA_GOLEMAGG:
|
||||
return Golemagg;
|
||||
case DATA_MAJORDOMO_GUID:
|
||||
return Domo;
|
||||
|
||||
case DATA_FLAMEWAKERPRIEST:
|
||||
return FlamewakerPriest;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type)
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case DATA_LUCIFRONISDEAD:
|
||||
if (IsBossDied[0])
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case DATA_MAGMADARISDEAD:
|
||||
if (IsBossDied[1])
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case DATA_GEHENNASISDEAD:
|
||||
if (IsBossDied[2])
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case DATA_GARRISDEAD:
|
||||
if (IsBossDied[3])
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case DATA_GEDDONISDEAD:
|
||||
if (IsBossDied[4])
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case DATA_SHAZZRAHISDEAD:
|
||||
if (IsBossDied[5])
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case DATA_SULFURONISDEAD:
|
||||
if (IsBossDied[6])
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case DATA_GOLEMAGGISDEAD:
|
||||
if (IsBossDied[7])
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case DATA_MAJORDOMOISDEAD:
|
||||
if (IsBossDied[8])
|
||||
return 1;
|
||||
break;
|
||||
|
||||
case DATA_RAG_ELE_COUNTER:
|
||||
return rag_ele_counter;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*bool SetBossState(uint32 id, EncounterState state)
|
||||
{
|
||||
if (!InstanceData::SetBossState(id, state))
|
||||
return false;
|
||||
|
||||
if (id == DATA_MAJORDOMO && state == DONE)
|
||||
{
|
||||
if (GameObject *pFirelordCache = instance->GetGameObject(m_uiFirelordCacheGUID)){
|
||||
pFirelordCache->SetRespawnTime(pFirelordCache->GetRespawnDelay());
|
||||
}
|
||||
instance->SummonCreature(ID_RAGNAROS, Pos[9], TEMPSUMMON_CORPSE_DESPAWN);
|
||||
}
|
||||
return true;
|
||||
} */
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
if (type == DATA_LUCIFRON)
|
||||
IsBossDied[0] = true;
|
||||
|
||||
if (type == DATA_MAGMADAR)
|
||||
IsBossDied[1] = true;
|
||||
|
||||
if (type == DATA_GEHENNAS)
|
||||
IsBossDied[2] = true;
|
||||
|
||||
if (type == DATA_GARR)
|
||||
IsBossDied[3] = true;
|
||||
|
||||
if (type == DATA_SHAZZRAH)
|
||||
IsBossDied[4] = true;
|
||||
|
||||
if (type == DATA_GEDDON)
|
||||
IsBossDied[5] = true;
|
||||
|
||||
if (type == DATA_GOLEMAGG)
|
||||
IsBossDied[6] = true;
|
||||
|
||||
if (type == DATA_SULFURON)
|
||||
IsBossDied[7] = true;
|
||||
|
||||
if (type == DATA_RAGNAROS)
|
||||
{
|
||||
rag_summoned = true;
|
||||
instance->SummonCreature(ID_RAGNAROS, Pos[9]);
|
||||
}
|
||||
|
||||
if (type == DATA_RAG_ELE_COUNTER)
|
||||
{
|
||||
if (data == 1)
|
||||
++rag_ele_counter;
|
||||
else if (data == 0)
|
||||
rag_ele_counter = 0;
|
||||
}
|
||||
|
||||
if (type == DATA_MAJORDOMO)
|
||||
{
|
||||
IsBossDied[8] = true;
|
||||
if (GameObject *pFirelordCache = instance->GetGameObject(m_uiFirelordCacheGUID))
|
||||
instance_molten_core_InstanceMapScript(Map* map) : InstanceScript(map)
|
||||
{
|
||||
pFirelordCache->SetRespawnTime(pFirelordCache->GetRespawnDelay());
|
||||
SetBossNumber(MAX_ENCOUNTER);
|
||||
_golemaggTheIncineratorGUID = 0;
|
||||
_majordomoExecutusGUID = 0;
|
||||
_cacheOfTheFirelordGUID = 0;
|
||||
_deadBossCount = 0;
|
||||
_ragnarosAddDeaths = 0;
|
||||
_summonedExecutus = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (summoned == false)
|
||||
{
|
||||
|
||||
for(int i=0;i<8;i++)
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
if (IsBossDied[i] == false)
|
||||
switch (creature->GetEntry())
|
||||
{
|
||||
case NPC_GOLEMAGG_THE_INCINERATOR:
|
||||
_golemaggTheIncineratorGUID = creature->GetGUID();
|
||||
break;
|
||||
case NPC_MAJORDOMO_EXECUTUS:
|
||||
_majordomoExecutusGUID = creature->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch (go->GetEntry())
|
||||
{
|
||||
case GO_CACHE_OF_THE_FIRELORD:
|
||||
_cacheOfTheFirelordGUID = go->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
if (type == DATA_RAGNAROS_ADDS)
|
||||
{
|
||||
if (data == 1)
|
||||
++_ragnarosAddDeaths;
|
||||
else if (data == 0)
|
||||
_ragnarosAddDeaths = 0;
|
||||
}
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case DATA_RAGNAROS_ADDS:
|
||||
return _ragnarosAddDeaths;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case BOSS_GOLEMAGG_THE_INCINERATOR:
|
||||
return _golemaggTheIncineratorGUID;
|
||||
case BOSS_MAJORDOMO_EXECUTUS:
|
||||
return _majordomoExecutusGUID;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool SetBossState(uint32 bossId, EncounterState state)
|
||||
{
|
||||
if (!InstanceScript::SetBossState(bossId, state))
|
||||
return false;
|
||||
|
||||
if (state == DONE && bossId < BOSS_MAJORDOMO_EXECUTUS)
|
||||
if (++_deadBossCount == 8)
|
||||
SummonMajordomoExecutus(false);
|
||||
|
||||
if (bossId == BOSS_MAJORDOMO_EXECUTUS && state == DONE)
|
||||
DoRespawnGameObject(_cacheOfTheFirelordGUID, 7 * DAY);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void SummonMajordomoExecutus(bool done)
|
||||
{
|
||||
if (_summonedExecutus)
|
||||
return;
|
||||
|
||||
_summonedExecutus = true;
|
||||
if (!done)
|
||||
{
|
||||
instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, SummonPositions[0]);
|
||||
instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[1]);
|
||||
instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[2]);
|
||||
instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[3]);
|
||||
instance->SummonCreature(NPC_FLAMEWAKER_HEALER, SummonPositions[4]);
|
||||
instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[5]);
|
||||
instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[6]);
|
||||
instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[7]);
|
||||
instance->SummonCreature(NPC_FLAMEWAKER_ELITE, SummonPositions[8]);
|
||||
}
|
||||
else if (TempSummon* summon = instance->SummonCreature(NPC_MAJORDOMO_EXECUTUS, RagnarosTelePos))
|
||||
summon->AI()->DoAction(ACTION_START_RAGNAROS_ALT);
|
||||
}
|
||||
|
||||
instance->SummonCreature(ID_DOMO, Pos[0]);
|
||||
instance->SummonCreature(ID_FLAMEWAKERHEALER, Pos[1]);
|
||||
instance->SummonCreature(ID_FLAMEWAKERHEALER, Pos[2]);
|
||||
instance->SummonCreature(ID_FLAMEWAKERHEALER, Pos[3]);
|
||||
instance->SummonCreature(ID_FLAMEWAKERHEALER, Pos[4]);
|
||||
instance->SummonCreature(ID_FLAMEWAKERELITE, Pos[5]);
|
||||
instance->SummonCreature(ID_FLAMEWAKERELITE, Pos[6]);
|
||||
instance->SummonCreature(ID_FLAMEWAKERELITE, Pos[7]);
|
||||
instance->SummonCreature(ID_FLAMEWAKERELITE, Pos[8]);
|
||||
summoned = true;
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "M C " << GetBossSaveData();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(char const* data)
|
||||
{
|
||||
if (!data)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(data);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
|
||||
std::istringstream loadStream(data);
|
||||
loadStream >> dataHead1 >> dataHead2;
|
||||
|
||||
if (dataHead1 == 'M' && dataHead2 == 'C')
|
||||
{
|
||||
EncounterState states[MAX_ENCOUNTER];
|
||||
uint8 executusCounter = 0;
|
||||
|
||||
// need 2 loops to check spawning executus/ragnaros
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
{
|
||||
uint32 tmpState;
|
||||
loadStream >> tmpState;
|
||||
if (tmpState == IN_PROGRESS || tmpState > TO_BE_DECIDED)
|
||||
tmpState = NOT_STARTED;
|
||||
states[i] = EncounterState(tmpState);
|
||||
|
||||
if (tmpState == DONE && i < BOSS_MAJORDOMO_EXECUTUS)
|
||||
++executusCounter;
|
||||
}
|
||||
|
||||
if (executusCounter >= 8 && states[BOSS_RAGNAROS] != DONE)
|
||||
SummonMajordomoExecutus(states[BOSS_MAJORDOMO_EXECUTUS] == DONE);
|
||||
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
SetBossState(i, states[i]);
|
||||
}
|
||||
else
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
private:
|
||||
uint64 _golemaggTheIncineratorGUID;
|
||||
uint64 _majordomoExecutusGUID;
|
||||
uint64 _cacheOfTheFirelordGUID;
|
||||
uint8 _deadBossCount;
|
||||
uint8 _ragnarosAddDeaths;
|
||||
bool _summonedExecutus;
|
||||
};
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* map) const
|
||||
{
|
||||
return new instance_molten_core_InstanceMapScript(map);
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -19,37 +19,54 @@
|
||||
#ifndef DEF_MOLTEN_CORE_H
|
||||
#define DEF_MOLTEN_CORE_H
|
||||
|
||||
enum eData
|
||||
enum Encounters
|
||||
{
|
||||
DATA_FLAMEWAKERPRIEST,
|
||||
DATA_GARRISDEAD,
|
||||
DATA_GEDDONISDEAD,
|
||||
DATA_GEHENNASISDEAD,
|
||||
DATA_GOLEMAGGISDEAD,
|
||||
DATA_GOLEMAGG_DEATH,
|
||||
DATA_LUCIFRONISDEAD,
|
||||
DATA_MAGMADARISDEAD,
|
||||
DATA_MAJORDOMOISDEAD,
|
||||
DATA_SHAZZRAHISDEAD,
|
||||
DATA_SULFURON,
|
||||
DATA_SULFURONISDEAD,
|
||||
DATA_GOLEMAGG,
|
||||
DATA_LUCIFRON,
|
||||
DATA_MAGMADAR,
|
||||
DATA_GEHENNAS,
|
||||
DATA_GARR,
|
||||
DATA_SHAZZRAH,
|
||||
DATA_GEDDON,
|
||||
DATA_MAJORDOMO,
|
||||
DATA_MAJORDOMO_GUID,
|
||||
DATA_RAGNAROS,
|
||||
DATA_RAG_ELE_COUNTER,
|
||||
BOSS_LUCIFRON = 0,
|
||||
BOSS_MAGMADAR = 1,
|
||||
BOSS_GEHENNAS = 2,
|
||||
BOSS_GARR = 3,
|
||||
BOSS_SHAZZRAH = 4,
|
||||
BOSS_BARON_GEDDON = 5,
|
||||
BOSS_SULFURON_HARBINGER = 6,
|
||||
BOSS_GOLEMAGG_THE_INCINERATOR = 7,
|
||||
BOSS_MAJORDOMO_EXECUTUS = 8,
|
||||
BOSS_RAGNAROS = 9,
|
||||
MAX_ENCOUNTER,
|
||||
};
|
||||
|
||||
enum Encounter
|
||||
enum Actions
|
||||
{
|
||||
BOSS_MAJORDOMO,
|
||||
BOSS_RAGNAROS
|
||||
ACTION_START_RAGNAROS = 0,
|
||||
ACTION_START_RAGNAROS_ALT = 1,
|
||||
};
|
||||
|
||||
Position const RagnarosTelePos = {829.159f, -815.773f, -228.972f, 5.30500f};
|
||||
Position const RagnarosSummonPos = {838.510f, -829.840f, -232.000f, 2.00000f};
|
||||
|
||||
enum Creatures
|
||||
{
|
||||
NPC_LUCIFRON = 12118,
|
||||
NPC_MAGMADAR = 11982,
|
||||
NPC_GEHENNAS = 12259,
|
||||
NPC_GARR = 12057,
|
||||
NPC_SHAZZRAH = 12264,
|
||||
NPC_BARON_GEDDON = 12056,
|
||||
NPC_SULFURON_HARBINGER = 12098,
|
||||
NPC_GOLEMAGG_THE_INCINERATOR = 11988,
|
||||
NPC_MAJORDOMO_EXECUTUS = 12018,
|
||||
NPC_RAGNAROS = 11502,
|
||||
NPC_FLAMEWAKER_HEALER = 11663,
|
||||
NPC_FLAMEWAKER_ELITE = 11664,
|
||||
};
|
||||
|
||||
enum GameObjects
|
||||
{
|
||||
GO_CACHE_OF_THE_FIRELORD = 179703,
|
||||
};
|
||||
|
||||
enum Data
|
||||
{
|
||||
DATA_RAGNAROS_ADDS = 0,
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in new issue
Block a user