convert Magtheridons Lair and Shattered Halls to new format

--HG--
branch : trunk
This commit is contained in:
Supabad
2010-08-08 00:49:40 +02:00
parent d3712984c1
commit c260b3f778
6 changed files with 1721 additions and 1549 deletions
File diff suppressed because it is too large Load Diff
@@ -26,8 +26,11 @@ EndScriptData */
#include "ScriptPCH.h" #include "ScriptPCH.h"
#include "magtheridons_lair.h" #include "magtheridons_lair.h"
#define SPELL_SOUL_TRANSFER 30531 // core bug, does not support target 7 enum eSpells
#define SPELL_BLAZE_TARGET 30541 // core bug, does not support target 7 {
SPELL_SOUL_TRANSFER = 30531, // core bug, does not support target 7
SPELL_BLAZE_TARGET = 30541, // core bug, does not support target 7
};
#define CHAMBER_CENTER_X -15.14 #define CHAMBER_CENTER_X -15.14
#define CHAMBER_CENTER_Y 1.8 #define CHAMBER_CENTER_Y 1.8
@@ -37,220 +40,226 @@ EndScriptData */
#define EMOTE_BONDS_WEAKEN "'s bonds begin to weaken!" #define EMOTE_BONDS_WEAKEN "'s bonds begin to weaken!"
struct instance_magtheridons_lair : public ScriptedInstance class instance_magtheridons_lair : public InstanceMapScript
{ {
instance_magtheridons_lair(Map* pMap) : ScriptedInstance(pMap) public:
{ instance_magtheridons_lair()
Initialize(); : InstanceMapScript("instance_magtheridons_lair")
}
uint32 m_auiEncounter[MAX_ENCOUNTER];
uint64 MagtheridonGUID;
std::set<uint64> ChannelerGUID;
uint64 DoorGUID;
std::set<uint64> ColumnGUID;
uint32 CageTimer;
uint32 RespawnTimer;
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
MagtheridonGUID = 0;
ChannelerGUID.clear();
DoorGUID = 0;
ColumnGUID.clear();
CageTimer = 0;
RespawnTimer = 0;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true;
return false;
}
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
switch(pCreature->GetEntry())
{ {
case 17257:
MagtheridonGUID = pCreature->GetGUID();
break;
case 17256:
ChannelerGUID.insert(pCreature->GetGUID());
break;
} }
}
void OnGameObjectCreate(GameObject* pGo, bool /*add*/) struct instance_magtheridons_lair_InstanceMapScript : public ScriptedInstance
{
switch(pGo->GetEntry())
{ {
case 181713: instance_magtheridons_lair_InstanceMapScript(Map* pMap) : ScriptedInstance(pMap)
pGo->SetUInt32Value(GAMEOBJECT_FLAGS, 0);
break;
case 183847:
DoorGUID = pGo->GetGUID();
break;
case 184653: // hall
case 184634: // six columns
case 184635:
case 184636:
case 184637:
case 184638:
case 184639:
ColumnGUID.insert(pGo->GetGUID());
break;
}
}
uint64 GetData64(uint32 type)
{
switch(type)
{
case DATA_MAGTHERIDON:
return MagtheridonGUID;
}
return 0;
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_MAGTHERIDON_EVENT:
m_auiEncounter[0] = data;
if (data == NOT_STARTED)
RespawnTimer = 10000;
if (data != IN_PROGRESS)
HandleGameObject(DoorGUID, true);
break;
case DATA_CHANNELER_EVENT:
switch(data)
{ {
case NOT_STARTED: // Reset all channelers once one is reset. Initialize();
if (m_auiEncounter[1] != NOT_STARTED) }
uint32 m_auiEncounter[MAX_ENCOUNTER];
uint64 MagtheridonGUID;
std::set<uint64> ChannelerGUID;
uint64 DoorGUID;
std::set<uint64> ColumnGUID;
uint32 CageTimer;
uint32 RespawnTimer;
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
MagtheridonGUID = 0;
ChannelerGUID.clear();
DoorGUID = 0;
ColumnGUID.clear();
CageTimer = 0;
RespawnTimer = 0;
}
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true;
return false;
}
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
switch(pCreature->GetEntry())
{ {
m_auiEncounter[1] = NOT_STARTED; case 17257:
for (std::set<uint64>::const_iterator i = ChannelerGUID.begin(); i != ChannelerGUID.end(); ++i) MagtheridonGUID = pCreature->GetGUID();
break;
case 17256:
ChannelerGUID.insert(pCreature->GetGUID());
break;
}
}
void OnGameObjectCreate(GameObject* pGo, bool /*add*/)
{
switch(pGo->GetEntry())
{
case 181713:
pGo->SetUInt32Value(GAMEOBJECT_FLAGS, 0);
break;
case 183847:
DoorGUID = pGo->GetGUID();
break;
case 184653: // hall
case 184634: // six columns
case 184635:
case 184636:
case 184637:
case 184638:
case 184639:
ColumnGUID.insert(pGo->GetGUID());
break;
}
}
uint64 GetData64(uint32 type)
{
switch(type)
{
case DATA_MAGTHERIDON:
return MagtheridonGUID;
}
return 0;
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case DATA_MAGTHERIDON_EVENT:
m_auiEncounter[0] = data;
if (data == NOT_STARTED)
RespawnTimer = 10000;
if (data != IN_PROGRESS)
HandleGameObject(DoorGUID, true);
break;
case DATA_CHANNELER_EVENT:
switch(data)
{ {
if (Creature *Channeler = instance->GetCreature(*i)) case NOT_STARTED: // Reset all channelers once one is reset.
if (m_auiEncounter[1] != NOT_STARTED)
{ {
if (Channeler->isAlive()) m_auiEncounter[1] = NOT_STARTED;
Channeler->AI()->EnterEvadeMode(); for (std::set<uint64>::const_iterator i = ChannelerGUID.begin(); i != ChannelerGUID.end(); ++i)
else {
Channeler->Respawn(); if (Creature *Channeler = instance->GetCreature(*i))
{
if (Channeler->isAlive())
Channeler->AI()->EnterEvadeMode();
else
Channeler->Respawn();
}
}
CageTimer = 0;
HandleGameObject(DoorGUID, true);
}
break;
case IN_PROGRESS: // Event start.
if (m_auiEncounter[1] != IN_PROGRESS)
{
m_auiEncounter[1] = IN_PROGRESS;
// Let all five channelers aggro.
for (std::set<uint64>::const_iterator i = ChannelerGUID.begin(); i != ChannelerGUID.end(); ++i)
{
Creature *Channeler = instance->GetCreature(*i);
if (Channeler && Channeler->isAlive())
Channeler->AI()->AttackStart(Channeler->SelectNearestTarget(999));
}
// Release Magtheridon after two minutes.
Creature *Magtheridon = instance->GetCreature(MagtheridonGUID);
if (Magtheridon && Magtheridon->isAlive())
{
Magtheridon->MonsterTextEmote(EMOTE_BONDS_WEAKEN, 0);
CageTimer = 120000;
}
HandleGameObject(DoorGUID, false);
}
break;
case DONE: // Add buff and check if all channelers are dead.
for (std::set<uint64>::const_iterator i = ChannelerGUID.begin(); i != ChannelerGUID.end(); ++i)
{
Creature *Channeler = instance->GetCreature(*i);
if (Channeler && Channeler->isAlive())
{
//Channeler->CastSpell(Channeler, SPELL_SOUL_TRANSFER, true);
data = IN_PROGRESS;
break;
}
} }
}
CageTimer = 0;
HandleGameObject(DoorGUID, true);
}
break;
case IN_PROGRESS: // Event start.
if (m_auiEncounter[1] != IN_PROGRESS)
{
m_auiEncounter[1] = IN_PROGRESS;
// Let all five channelers aggro.
for (std::set<uint64>::const_iterator i = ChannelerGUID.begin(); i != ChannelerGUID.end(); ++i)
{
Creature *Channeler = instance->GetCreature(*i);
if (Channeler && Channeler->isAlive())
Channeler->AI()->AttackStart(Channeler->SelectNearestTarget(999));
}
// Release Magtheridon after two minutes.
Creature *Magtheridon = instance->GetCreature(MagtheridonGUID);
if (Magtheridon && Magtheridon->isAlive())
{
Magtheridon->MonsterTextEmote(EMOTE_BONDS_WEAKEN, 0);
CageTimer = 120000;
}
HandleGameObject(DoorGUID, false);
}
break;
case DONE: // Add buff and check if all channelers are dead.
for (std::set<uint64>::const_iterator i = ChannelerGUID.begin(); i != ChannelerGUID.end(); ++i)
{
Creature *Channeler = instance->GetCreature(*i);
if (Channeler && Channeler->isAlive())
{
//Channeler->CastSpell(Channeler, SPELL_SOUL_TRANSFER, true);
data = IN_PROGRESS;
break; break;
} }
m_auiEncounter[1] = data;
break;
case DATA_COLLAPSE:
// true - collapse / false - reset
for (std::set<uint64>::const_iterator i = ColumnGUID.begin(); i != ColumnGUID.end(); ++i)
DoUseDoorOrButton(*i);
break;
default:
break;
} }
break;
} }
m_auiEncounter[1] = data;
break;
case DATA_COLLAPSE:
// true - collapse / false - reset
for (std::set<uint64>::const_iterator i = ColumnGUID.begin(); i != ColumnGUID.end(); ++i)
DoUseDoorOrButton(*i);
break;
default:
break;
}
}
uint32 GetData(uint32 type) uint32 GetData(uint32 type)
{
if (type == DATA_MAGTHERIDON_EVENT)
return m_auiEncounter[0];
return 0;
}
void Update(uint32 diff)
{
if (CageTimer)
{
if (CageTimer <= diff)
{ {
Creature *Magtheridon = instance->GetCreature(MagtheridonGUID); if (type == DATA_MAGTHERIDON_EVENT)
if (Magtheridon && Magtheridon->isAlive()) return m_auiEncounter[0];
{ return 0;
Magtheridon->clearUnitState(UNIT_STAT_STUNNED); }
Magtheridon->AI()->AttackStart(Magtheridon->SelectNearestTarget(999));
}
CageTimer = 0;
} else CageTimer -= diff;
}
if (RespawnTimer) void Update(uint32 diff)
{
if (RespawnTimer <= diff)
{ {
for (std::set<uint64>::const_iterator i = ChannelerGUID.begin(); i != ChannelerGUID.end(); ++i) if (CageTimer)
{ {
if (Creature *Channeler = instance->GetCreature(*i)) if (CageTimer <= diff)
{ {
if (Channeler->isAlive()) Creature *Magtheridon = instance->GetCreature(MagtheridonGUID);
Channeler->AI()->EnterEvadeMode(); if (Magtheridon && Magtheridon->isAlive())
else {
Channeler->Respawn(); Magtheridon->clearUnitState(UNIT_STAT_STUNNED);
} Magtheridon->AI()->AttackStart(Magtheridon->SelectNearestTarget(999));
}
CageTimer = 0;
} else CageTimer -= diff;
} }
RespawnTimer = 0;
} else RespawnTimer -= diff; if (RespawnTimer)
{
if (RespawnTimer <= diff)
{
for (std::set<uint64>::const_iterator i = ChannelerGUID.begin(); i != ChannelerGUID.end(); ++i)
{
if (Creature *Channeler = instance->GetCreature(*i))
{
if (Channeler->isAlive())
Channeler->AI()->EnterEvadeMode();
else
Channeler->Respawn();
}
}
RespawnTimer = 0;
} else RespawnTimer -= diff;
}
}
};
InstanceData* GetInstanceData(Map* pMap) const
{
return new instance_magtheridons_lair_InstanceMapScript(pMap);
} }
}
}; };
InstanceData* GetInstanceData_instance_magtheridons_lair(Map* pMap)
{
return new instance_magtheridons_lair(pMap);
}
void AddSC_instance_magtheridons_lair() void AddSC_instance_magtheridons_lair()
{ {
Script *newscript; new instance_magtheridons_lair();
newscript = new Script;
newscript->Name = "instance_magtheridons_lair";
newscript->GetInstanceData = &GetInstanceData_instance_magtheridons_lair;
newscript->RegisterSelf();
} }
@@ -52,347 +52,374 @@ static Say PeonDies[]=
{-1540008}, {-1540008},
}; };
#define SAY_INTRO -1540000 enum eSays
#define SAY_TAUNT_1 -1540009 {
#define SAY_TAUNT_2 -1540010 SAY_INTRO = -1540000,
#define SAY_TAUNT_3 -1540011 SAY_TAUNT_1 = -1540009,
#define SAY_AGGRO_1 -1540012 SAY_TAUNT_2 = -1540010,
#define SAY_AGGRO_2 -1540013 SAY_TAUNT_3 = -1540011,
#define SAY_AGGRO_3 -1540014 SAY_AGGRO_1 = -1540012,
#define SAY_SLAY_1 -1540015 SAY_AGGRO_2 = -1540013,
#define SAY_SLAY_2 -1540016 SAY_AGGRO_3 = -1540014,
#define SAY_DIE -1540017 SAY_SLAY_1 = -1540015,
SAY_SLAY_2 = -1540016,
#define SPELL_DEATH_COIL 30500 SAY_DIE = -1540017,
#define SPELL_DARK_SPIN 30502 // core bug spell attack caster :D
#define SPELL_SHADOW_FISSURE 30496 // Summon the ShadowFissure NPC
#define SPELL_SHADOW_CLEAVE 30495
#define H_SPELL_SHADOW_SLAM 35953
#define SPELL_HEMORRHAGE 30478
#define SPELL_CONSUMPTION 30497
#define SPELL_TEMPORARY_VISUAL 39312 // this is wrong, a temporary solution. spell consumption already has the purple visual, but doesn't display as it should
struct boss_grand_warlock_nethekurseAI : public ScriptedAI
{
boss_grand_warlock_nethekurseAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance;
bool IntroOnce;
bool IsIntroEvent;
bool IsMainEvent;
bool SpinOnce;
//bool HasTaunted;
bool Phase;
uint32 PeonEngagedCount;
uint32 PeonKilledCount;
uint32 IntroEvent_Timer;
uint32 DeathCoil_Timer;
uint32 ShadowFissure_Timer;
uint32 Cleave_Timer;
void Reset()
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
IsIntroEvent = false;
IntroOnce = false;
IsMainEvent = false;
//HasTaunted = false;
SpinOnce = false;
Phase = false;
PeonEngagedCount = 0;
PeonKilledCount = 0;
IntroEvent_Timer = 90000; //how long before getting bored and kills his minions?
DeathCoil_Timer = 20000;
ShadowFissure_Timer = 8000;
Cleave_Timer = 5000;
}
void DoYellForPeonAggro()
{
if (PeonEngagedCount >= 4)
return;
DoScriptText(PeonAttacked[PeonEngagedCount].id, me);
++PeonEngagedCount;
}
void DoYellForPeonDeath()
{
if (PeonKilledCount >= 4)
return;
DoScriptText(PeonDies[PeonKilledCount].id, me);
++PeonKilledCount;
if (PeonKilledCount == 4)
{
IsIntroEvent = false;
IsMainEvent = true;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
}
void DoTauntPeons()
{
DoScriptText(RAND(SAY_TAUNT_1,SAY_TAUNT_2,SAY_TAUNT_3), me);
//TODO: kill the peons first
IsIntroEvent = false;
PeonEngagedCount = 4;
PeonKilledCount = 4;
IsMainEvent = true;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
void AttackStart(Unit* who)
{
if (IsIntroEvent || !IsMainEvent)
return;
if (me->Attack(who, true))
{
if (Phase)
DoStartNoMovement(who);
else
DoStartMovement(who);
}
}
void MoveInLineOfSight(Unit *who)
{
if (!IntroOnce && me->IsWithinDistInMap(who, 50.0f))
{
if (who->GetTypeId() != TYPEID_PLAYER)
return;
DoScriptText(SAY_INTRO, me);
IntroOnce = true;
IsIntroEvent = true;
if (pInstance)
pInstance->SetData(TYPE_NETHEKURSE,IN_PROGRESS);
}
if (IsIntroEvent || !IsMainEvent)
return;
ScriptedAI::MoveInLineOfSight(who);
}
void EnterCombat(Unit * /*who*/)
{
DoScriptText(RAND(SAY_AGGRO_1,SAY_AGGRO_2,SAY_AGGRO_3), me);
}
void JustSummoned(Creature *summoned)
{
summoned->setFaction(16);
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
//triggered spell of consumption does not properly show it's SpellVisual, wrong spellid?
summoned->CastSpell(summoned,SPELL_TEMPORARY_VISUAL,true);
summoned->CastSpell(summoned,SPELL_CONSUMPTION,false,0,0,me->GetGUID());
}
void KilledUnit(Unit* /*victim*/)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
}
void JustDied(Unit* /*Killer*/)
{
DoScriptText(SAY_DIE, me);
if (!pInstance)
return;
pInstance->SetData(TYPE_NETHEKURSE,DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_NETHEKURSE_DOOR), true);
}
void UpdateAI(const uint32 diff)
{
if (IsIntroEvent)
{
if (!pInstance)
return;
if (pInstance->GetData(TYPE_NETHEKURSE) == IN_PROGRESS)
{
if (IntroEvent_Timer <= diff)
DoTauntPeons();
else
IntroEvent_Timer -= diff;
}
}
if (!UpdateVictim())
return;
if (!IsMainEvent)
return;
if (Phase)
{
if (!SpinOnce)
{
DoCast(me->getVictim(), SPELL_DARK_SPIN);
SpinOnce = true;
}
if (Cleave_Timer <= diff)
{
DoCast(me->getVictim(), SPELL_SHADOW_CLEAVE);
Cleave_Timer = 6000+rand()%2500;
} else Cleave_Timer -= diff;
}
else
{
if (ShadowFissure_Timer <= diff)
{
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(pTarget, SPELL_SHADOW_FISSURE);
ShadowFissure_Timer = urand(7500,15000);
} else ShadowFissure_Timer -= diff;
if (DeathCoil_Timer <= diff)
{
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(pTarget, SPELL_DEATH_COIL);
DeathCoil_Timer = urand(15000,20000);
} else DeathCoil_Timer -= diff;
if ((me->GetHealth()*100) / me->GetMaxHealth() <= 20)
Phase = true;
DoMeleeAttackIfReady();
}
}
}; };
struct mob_fel_orc_convertAI : public ScriptedAI enum eSpells
{
SPELL_DEATH_COIL = 30500,
SPELL_DARK_SPIN = 30502, // core bug spell attack caster :D
SPELL_SHADOW_FISSURE = 30496, // Summon the ShadowFissure NPC
SPELL_SHADOW_CLEAVE = 30495,
H_SPELL_SHADOW_SLAM = 35953,
SPELL_HEMORRHAGE = 30478,
SPELL_CONSUMPTION = 30497,
SPELL_TEMPORARY_VISUAL = 39312, // this is wrong, a temporary solution. spell consumption already has the purple visual, but doesn't display as it should
};
class boss_grand_warlock_nethekurse : public CreatureScript
{ {
mob_fel_orc_convertAI(Creature *c) : ScriptedAI(c) public:
{
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance; boss_grand_warlock_nethekurse()
uint32 Hemorrhage_Timer; : CreatureScript("boss_grand_warlock_nethekurse")
void Reset()
{
me->SetNoCallAssistance(true); //we don't want any assistance (WE R HEROZ!)
Hemorrhage_Timer = 3000;
}
void MoveInLineOfSight(Unit * /*who*/)
{
}
void EnterCombat(Unit* /*who*/)
{
if (pInstance)
{ {
if (pInstance->GetData64(DATA_NETHEKURSE)) }
{
Creature *pKurse = Unit::GetCreature(*me,pInstance->GetData64(DATA_NETHEKURSE));
if (pKurse && me->IsWithinDist(pKurse, 45.0f))
{
CAST_AI(boss_grand_warlock_nethekurseAI, pKurse->AI())->DoYellForPeonAggro();
if (pInstance->GetData(TYPE_NETHEKURSE) == IN_PROGRESS) struct boss_grand_warlock_nethekurseAI : public ScriptedAI
return; {
else boss_grand_warlock_nethekurseAI(Creature* pCreature) : ScriptedAI(pCreature)
pInstance->SetData(TYPE_NETHEKURSE,IN_PROGRESS); {
pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* pInstance;
bool IntroOnce;
bool IsIntroEvent;
bool IsMainEvent;
bool SpinOnce;
//bool HasTaunted;
bool Phase;
uint32 PeonEngagedCount;
uint32 PeonKilledCount;
uint32 IntroEvent_Timer;
uint32 DeathCoil_Timer;
uint32 ShadowFissure_Timer;
uint32 Cleave_Timer;
void Reset()
{
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
IsIntroEvent = false;
IntroOnce = false;
IsMainEvent = false;
//HasTaunted = false;
SpinOnce = false;
Phase = false;
PeonEngagedCount = 0;
PeonKilledCount = 0;
IntroEvent_Timer = 90000; //how long before getting bored and kills his minions?
DeathCoil_Timer = 20000;
ShadowFissure_Timer = 8000;
Cleave_Timer = 5000;
}
void DoYellForPeonAggro()
{
if (PeonEngagedCount >= 4)
return;
DoScriptText(PeonAttacked[PeonEngagedCount].id, me);
++PeonEngagedCount;
}
void DoYellForPeonDeath()
{
if (PeonKilledCount >= 4)
return;
DoScriptText(PeonDies[PeonKilledCount].id, me);
++PeonKilledCount;
if (PeonKilledCount == 4)
{
IsIntroEvent = false;
IsMainEvent = true;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
} }
} }
}
}
void JustDied(Unit* /*Killer*/) void DoTauntPeons()
{ {
if (pInstance) DoScriptText(RAND(SAY_TAUNT_1,SAY_TAUNT_2,SAY_TAUNT_3), me);
//TODO: kill the peons first
IsIntroEvent = false;
PeonEngagedCount = 4;
PeonKilledCount = 4;
IsMainEvent = true;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
}
void AttackStart(Unit* who)
{
if (IsIntroEvent || !IsMainEvent)
return;
if (me->Attack(who, true))
{
if (Phase)
DoStartNoMovement(who);
else
DoStartMovement(who);
}
}
void MoveInLineOfSight(Unit *who)
{
if (!IntroOnce && me->IsWithinDistInMap(who, 50.0f))
{
if (who->GetTypeId() != TYPEID_PLAYER)
return;
DoScriptText(SAY_INTRO, me);
IntroOnce = true;
IsIntroEvent = true;
if (pInstance)
pInstance->SetData(TYPE_NETHEKURSE,IN_PROGRESS);
}
if (IsIntroEvent || !IsMainEvent)
return;
ScriptedAI::MoveInLineOfSight(who);
}
void EnterCombat(Unit * /*who*/)
{
DoScriptText(RAND(SAY_AGGRO_1,SAY_AGGRO_2,SAY_AGGRO_3), me);
}
void JustSummoned(Creature *summoned)
{
summoned->setFaction(16);
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
//triggered spell of consumption does not properly show it's SpellVisual, wrong spellid?
summoned->CastSpell(summoned,SPELL_TEMPORARY_VISUAL,true);
summoned->CastSpell(summoned,SPELL_CONSUMPTION,false,0,0,me->GetGUID());
}
void KilledUnit(Unit* /*victim*/)
{
DoScriptText(RAND(SAY_SLAY_1,SAY_SLAY_2), me);
}
void JustDied(Unit* /*Killer*/)
{
DoScriptText(SAY_DIE, me);
if (!pInstance)
return;
pInstance->SetData(TYPE_NETHEKURSE,DONE);
pInstance->HandleGameObject(pInstance->GetData64(DATA_NETHEKURSE_DOOR), true);
}
void UpdateAI(const uint32 diff)
{
if (IsIntroEvent)
{
if (!pInstance)
return;
if (pInstance->GetData(TYPE_NETHEKURSE) == IN_PROGRESS)
{
if (IntroEvent_Timer <= diff)
DoTauntPeons();
else
IntroEvent_Timer -= diff;
}
}
if (!UpdateVictim())
return;
if (!IsMainEvent)
return;
if (Phase)
{
if (!SpinOnce)
{
DoCast(me->getVictim(), SPELL_DARK_SPIN);
SpinOnce = true;
}
if (Cleave_Timer <= diff)
{
DoCast(me->getVictim(), SPELL_SHADOW_CLEAVE);
Cleave_Timer = 6000+rand()%2500;
}
else
Cleave_Timer -= diff;
}
else
{
if (ShadowFissure_Timer <= diff)
{
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(pTarget, SPELL_SHADOW_FISSURE);
ShadowFissure_Timer = urand(7500,15000);
}
else
ShadowFissure_Timer -= diff;
if (DeathCoil_Timer <= diff)
{
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
DoCast(pTarget, SPELL_DEATH_COIL);
DeathCoil_Timer = urand(15000,20000);
}
else
DeathCoil_Timer -= diff;
if ((me->GetHealth()*100) / me->GetMaxHealth() <= 20)
Phase = true;
DoMeleeAttackIfReady();
}
}
};
CreatureAI* GetAI(Creature* Creature) const
{ {
if (pInstance->GetData(TYPE_NETHEKURSE) != IN_PROGRESS) return new boss_grand_warlock_nethekurseAI (Creature);
return;
if (pInstance->GetData64(DATA_NETHEKURSE))
if (Creature *pKurse = Unit::GetCreature(*me,pInstance->GetData64(DATA_NETHEKURSE)))
CAST_AI(boss_grand_warlock_nethekurseAI, pKurse->AI())->DoYellForPeonDeath();
} }
} };
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (Hemorrhage_Timer <= diff) class mob_fel_orc_convert : public CreatureScript
{
public:
mob_fel_orc_convert()
: CreatureScript("mob_fel_orc_convert")
{ {
DoCast(me->getVictim(), SPELL_HEMORRHAGE); }
Hemorrhage_Timer = 15000;
} else Hemorrhage_Timer -= diff;
DoMeleeAttackIfReady(); struct mob_fel_orc_convertAI : public ScriptedAI
} {
mob_fel_orc_convertAI(Creature* pCreature) : ScriptedAI(pCreature)
{
pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* pInstance;
uint32 Hemorrhage_Timer;
void Reset()
{
me->SetNoCallAssistance(true); //we don't want any assistance (WE R HEROZ!)
Hemorrhage_Timer = 3000;
}
void MoveInLineOfSight(Unit * /*who*/)
{
}
void EnterCombat(Unit* /*who*/)
{
if (pInstance)
{
if (pInstance->GetData64(DATA_NETHEKURSE))
{
Creature *pKurse = Unit::GetCreature(*me,pInstance->GetData64(DATA_NETHEKURSE));
if (pKurse && me->IsWithinDist(pKurse, 45.0f))
{
CAST_AI(boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurseAI, pKurse->AI())->DoYellForPeonAggro();
if (pInstance->GetData(TYPE_NETHEKURSE) == IN_PROGRESS)
return;
else
pInstance->SetData(TYPE_NETHEKURSE,IN_PROGRESS);
}
}
}
}
void JustDied(Unit* /*Killer*/)
{
if (pInstance)
{
if (pInstance->GetData(TYPE_NETHEKURSE) != IN_PROGRESS)
return;
if (pInstance->GetData64(DATA_NETHEKURSE))
if (Creature *pKurse = Unit::GetCreature(*me,pInstance->GetData64(DATA_NETHEKURSE)))
CAST_AI(boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurseAI, pKurse->AI())->DoYellForPeonDeath();
}
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (Hemorrhage_Timer <= diff)
{
DoCast(me->getVictim(), SPELL_HEMORRHAGE);
Hemorrhage_Timer = 15000;
} else Hemorrhage_Timer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* Creature) const
{
return new mob_fel_orc_convertAI (Creature);
}
}; };
//NOTE: this Creature are also summoned by other spells, for different creatures //NOTE: this Creature are also summoned by other spells, for different creatures
struct mob_lesser_shadow_fissureAI : public ScriptedAI class mob_lesser_shadow_fissure : public CreatureScript
{ {
mob_lesser_shadow_fissureAI(Creature *c) : ScriptedAI(c) {} public:
void Reset() { } mob_lesser_shadow_fissure()
void MoveInLineOfSight(Unit * /*who*/) {} : CreatureScript("mob_lesser_shadow_fissure")
void AttackStart(Unit* /*who*/) {} {
void EnterCombat(Unit* /*who*/) {} }
struct mob_lesser_shadow_fissureAI : public ScriptedAI
{
mob_lesser_shadow_fissureAI(Creature* pCreature) : ScriptedAI(pCreature) {}
void Reset() { }
void MoveInLineOfSight(Unit * /*who*/) {}
void AttackStart(Unit* /*who*/) {}
void EnterCombat(Unit* /*who*/) {}
};
CreatureAI* GetAI_mob_lesser_shadow_fissure(Creature* pCreature)
{
return new mob_lesser_shadow_fissureAI (pCreature);
}
}; };
CreatureAI* GetAI_boss_grand_warlock_nethekurse(Creature* pCreature)
{
return new boss_grand_warlock_nethekurseAI (pCreature);
}
CreatureAI* GetAI_mob_fel_orc_convert(Creature* pCreature)
{
return new mob_fel_orc_convertAI (pCreature);
}
CreatureAI* GetAI_mob_lesser_shadow_fissure(Creature* pCreature)
{
return new mob_lesser_shadow_fissureAI (pCreature);
}
void AddSC_boss_grand_warlock_nethekurse() void AddSC_boss_grand_warlock_nethekurse()
{ {
Script *newscript; new boss_grand_warlock_nethekurse();
new mob_fel_orc_convert();
newscript = new Script; new mob_lesser_shadow_fissure();
newscript->Name = "boss_grand_warlock_nethekurse";
newscript->GetAI = &GetAI_boss_grand_warlock_nethekurse;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_fel_orc_convert";
newscript->GetAI = &GetAI_mob_fel_orc_convert;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_lesser_shadow_fissure";
newscript->GetAI = &GetAI_mob_lesser_shadow_fissure;
newscript->RegisterSelf();
} }
@@ -94,313 +94,334 @@ static Yell Killing[]=
{-1540036, NPC_LEFT_HEAD}, {-1540036, NPC_LEFT_HEAD},
{-1540037, NPC_RIGHT_HEAD}, {-1540037, NPC_RIGHT_HEAD},
}; };
static Yell KillingDelay[]= static Yell KillingDelay[]=
{ {
{-1540038, NPC_RIGHT_HEAD}, {-1540038, NPC_RIGHT_HEAD},
{-1000000, NPC_LEFT_HEAD}, {-1000000, NPC_LEFT_HEAD},
}; };
struct mob_omrogg_headsAI : public ScriptedAI class mob_omrogg_heads : public CreatureScript
{ {
mob_omrogg_headsAI(Creature *c) : ScriptedAI(c) {} public:
bool DeathYell; mob_omrogg_heads()
uint32 Death_Timer; : CreatureScript("mob_omrogg_heads")
void Reset()
{
Death_Timer = 4000;
DeathYell = false;
}
void EnterCombat(Unit* /*who*/) {}
void DoDeathYell()
{
DeathYell = true;
}
void UpdateAI(const uint32 diff)
{
if (!DeathYell)
return;
if (Death_Timer <= diff)
{ {
DoScriptText(YELL_DIE_R, me); }
Death_Timer = false;
me->setDeathState(JUST_DIED); struct mob_omrogg_headsAI : public ScriptedAI
} else Death_Timer -= diff; {
} mob_omrogg_headsAI(Creature* pCreature) : ScriptedAI(pCreature) {}
bool DeathYell;
uint32 Death_Timer;
void Reset()
{
Death_Timer = 4000;
DeathYell = false;
}
void EnterCombat(Unit* /*who*/) {}
void DoDeathYell()
{
DeathYell = true;
}
void UpdateAI(const uint32 diff)
{
if (!DeathYell)
return;
if (Death_Timer <= diff)
{
DoScriptText(YELL_DIE_R, me);
Death_Timer = false;
me->setDeathState(JUST_DIED);
} else Death_Timer -= diff;
}
};
CreatureAI* GetAI(Creature* Creature) const
{
return new mob_omrogg_headsAI (Creature);
}
}; };
struct boss_warbringer_omroggAI : public ScriptedAI class boss_warbringer_omrogg : public CreatureScript
{ {
boss_warbringer_omroggAI(Creature *c) : ScriptedAI(c) public:
{
LeftHeadGUID = 0;
RightHeadGUID = 0;
pInstance = c->GetInstanceData();
}
ScriptedInstance* pInstance; boss_warbringer_omrogg()
: CreatureScript("boss_warbringer_omrogg")
uint64 LeftHeadGUID;
uint64 RightHeadGUID;
int iaggro;
int ithreat;
int ikilling;
bool AggroYell;
bool ThreatYell;
bool ThreatYell2;
bool KillingYell;
uint32 Delay_Timer;
uint32 BlastWave_Timer;
uint32 BlastCount;
uint32 Fear_Timer;
uint32 BurningMaul_Timer;
uint32 ThunderClap_Timer;
uint32 ResetThreat_Timer;
void Reset()
{
if (Unit* pLeftHead = Unit::GetUnit(*me,LeftHeadGUID))
{ {
pLeftHead->setDeathState(JUST_DIED);
LeftHeadGUID = 0;
} }
if (Unit* pRightHead = Unit::GetUnit(*me,RightHeadGUID)) struct boss_warbringer_omroggAI : public ScriptedAI
{ {
pRightHead->setDeathState(JUST_DIED); boss_warbringer_omroggAI(Creature* pCreature) : ScriptedAI(pCreature)
RightHeadGUID = 0;
}
AggroYell = false;
ThreatYell = false;
ThreatYell2 = false;
KillingYell = false;
Delay_Timer = 4000;
BlastWave_Timer = 0;
BlastCount = 0;
Fear_Timer = 8000;
BurningMaul_Timer = 25000;
ThunderClap_Timer = 15000;
ResetThreat_Timer = 30000;
if (pInstance)
pInstance->SetData(TYPE_OMROGG, NOT_STARTED); //End boss can use this later. O'mrogg must be defeated(DONE) or he will come to aid.
}
void DoYellForThreat()
{
Unit *pLeftHead = Unit::GetUnit(*me,LeftHeadGUID);
Unit *pRightHead = Unit::GetUnit(*me,RightHeadGUID);
if (!pLeftHead || !pRightHead)
return;
ithreat = rand()%4;
Unit *source = (pLeftHead->GetEntry() == Threat[ithreat].creature ? pLeftHead : pRightHead);
DoScriptText(Threat[ithreat].id, source);
Delay_Timer = 3500;
ThreatYell = true;
}
void EnterCombat(Unit * /*who*/)
{
me->SummonCreature(NPC_LEFT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0);
me->SummonCreature(NPC_RIGHT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0);
if (Unit *pLeftHead = Unit::GetUnit(*me,LeftHeadGUID))
{
iaggro = rand()%3;
DoScriptText(GoCombat[iaggro].id, pLeftHead);
Delay_Timer = 3500;
AggroYell = true;
}
if (pInstance)
pInstance->SetData(TYPE_OMROGG, IN_PROGRESS);
}
void JustSummoned(Creature *summoned)
{
if (summoned->GetEntry() == NPC_LEFT_HEAD)
LeftHeadGUID = summoned->GetGUID();
if (summoned->GetEntry() == NPC_RIGHT_HEAD)
RightHeadGUID = summoned->GetGUID();
//summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
//summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
summoned->SetVisibility(VISIBILITY_OFF);
}
void KilledUnit(Unit* /*victim*/)
{
Unit* pLeftHead = Unit::GetUnit(*me,LeftHeadGUID);
Unit* pRightHead = Unit::GetUnit(*me,RightHeadGUID);
if (!pLeftHead || !pRightHead)
return;
ikilling = rand()%2;
Unit *source = (pLeftHead->GetEntry() == Killing[ikilling].creature ? pLeftHead : pRightHead);
switch(ikilling)
{
case 0:
DoScriptText(Killing[ikilling].id, source);
Delay_Timer = 3500;
KillingYell = true;
break;
case 1:
DoScriptText(Killing[ikilling].id, source);
KillingYell = false;
break;
}
}
void JustDied(Unit* /*Killer*/)
{
Unit* pLeftHead = Unit::GetUnit(*me,LeftHeadGUID);
Unit* pRightHead = Unit::GetUnit(*me,RightHeadGUID);
if (!pLeftHead || !pRightHead)
return;
DoScriptText(YELL_DIE_L, pLeftHead);
CAST_AI(mob_omrogg_headsAI, CAST_CRE(pRightHead)->AI())->DoDeathYell();
if (pInstance)
pInstance->SetData(TYPE_OMROGG, DONE);
}
void UpdateAI(const uint32 diff)
{
if (Delay_Timer <= diff)
{
Delay_Timer = 3500;
Unit* pLeftHead = Unit::GetUnit(*me,LeftHeadGUID);
Unit* pRightHead = Unit::GetUnit(*me,RightHeadGUID);
if (!pLeftHead || !pRightHead)
return;
if (AggroYell)
{ {
DoScriptText(GoCombatDelay[iaggro].id, pRightHead); LeftHeadGUID = 0;
RightHeadGUID = 0;
pInstance = pCreature->GetInstanceData();
}
ScriptedInstance* pInstance;
uint64 LeftHeadGUID;
uint64 RightHeadGUID;
int iaggro;
int ithreat;
int ikilling;
bool AggroYell;
bool ThreatYell;
bool ThreatYell2;
bool KillingYell;
uint32 Delay_Timer;
uint32 BlastWave_Timer;
uint32 BlastCount;
uint32 Fear_Timer;
uint32 BurningMaul_Timer;
uint32 ThunderClap_Timer;
uint32 ResetThreat_Timer;
void Reset()
{
if (Unit* pLeftHead = Unit::GetUnit(*me,LeftHeadGUID))
{
pLeftHead->setDeathState(JUST_DIED);
LeftHeadGUID = 0;
}
if (Unit* pRightHead = Unit::GetUnit(*me,RightHeadGUID))
{
pRightHead->setDeathState(JUST_DIED);
RightHeadGUID = 0;
}
AggroYell = false; AggroYell = false;
}
if (ThreatYell2)
{
Unit *source = (pLeftHead->GetEntry() == ThreatDelay2[ithreat].creature ? pLeftHead : pRightHead);
DoScriptText(ThreatDelay2[ithreat].id, source);
ThreatYell2 = false;
}
if (ThreatYell)
{
Unit *source = (pLeftHead->GetEntry() == ThreatDelay1[ithreat].creature ? pLeftHead : pRightHead);
DoScriptText(ThreatDelay1[ithreat].id, source);
ThreatYell = false; ThreatYell = false;
ThreatYell2 = true; ThreatYell2 = false;
}
if (KillingYell)
{
Unit *source = (pLeftHead->GetEntry() == KillingDelay[ikilling].creature ? pLeftHead : pRightHead);
DoScriptText(KillingDelay[ikilling].id, source);
KillingYell = false; KillingYell = false;
}
} else Delay_Timer -= diff;
if (!UpdateVictim()) Delay_Timer = 4000;
return; BlastWave_Timer = 0;
if (BlastCount && BlastWave_Timer <= diff)
{
DoCast(me, SPELL_BLAST_WAVE);
BlastWave_Timer = 5000;
++BlastCount;
if (BlastCount == 3)
BlastCount = 0; BlastCount = 0;
} else BlastWave_Timer -= diff; Fear_Timer = 8000;
BurningMaul_Timer = 25000;
ThunderClap_Timer = 15000;
ResetThreat_Timer = 30000;
if (BurningMaul_Timer <= diff) if (pInstance)
{ pInstance->SetData(TYPE_OMROGG, NOT_STARTED); //End boss can use this later. O'mrogg must be defeated(DONE) or he will come to aid.
DoScriptText(EMOTE_ENRAGE, me);
DoCast(me, SPELL_BURNING_MAUL);
BurningMaul_Timer = 40000;
BlastWave_Timer = 16000;
BlastCount = 1;
} else BurningMaul_Timer -= diff;
if (ResetThreat_Timer <= diff)
{
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
{
DoYellForThreat();
DoResetThreat();
me->AddThreat(pTarget, 0.0f);
} }
ResetThreat_Timer = 25000+rand()%15000;
} else ResetThreat_Timer -= diff;
if (Fear_Timer <= diff) void DoYellForThreat()
{
Unit *pLeftHead = Unit::GetUnit(*me,LeftHeadGUID);
Unit *pRightHead = Unit::GetUnit(*me,RightHeadGUID);
if (!pLeftHead || !pRightHead)
return;
ithreat = rand()%4;
Unit *source = (pLeftHead->GetEntry() == Threat[ithreat].creature ? pLeftHead : pRightHead);
DoScriptText(Threat[ithreat].id, source);
Delay_Timer = 3500;
ThreatYell = true;
}
void EnterCombat(Unit * /*who*/)
{
me->SummonCreature(NPC_LEFT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0);
me->SummonCreature(NPC_RIGHT_HEAD, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_DEAD_DESPAWN, 0);
if (Unit *pLeftHead = Unit::GetUnit(*me,LeftHeadGUID))
{
iaggro = rand()%3;
DoScriptText(GoCombat[iaggro].id, pLeftHead);
Delay_Timer = 3500;
AggroYell = true;
}
if (pInstance)
pInstance->SetData(TYPE_OMROGG, IN_PROGRESS);
}
void JustSummoned(Creature *summoned)
{
if (summoned->GetEntry() == NPC_LEFT_HEAD)
LeftHeadGUID = summoned->GetGUID();
if (summoned->GetEntry() == NPC_RIGHT_HEAD)
RightHeadGUID = summoned->GetGUID();
//summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
//summoned->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
summoned->SetVisibility(VISIBILITY_OFF);
}
void KilledUnit(Unit* /*victim*/)
{
Unit* pLeftHead = Unit::GetUnit(*me,LeftHeadGUID);
Unit* pRightHead = Unit::GetUnit(*me,RightHeadGUID);
if (!pLeftHead || !pRightHead)
return;
ikilling = rand()%2;
Unit *source = (pLeftHead->GetEntry() == Killing[ikilling].creature ? pLeftHead : pRightHead);
switch(ikilling)
{
case 0:
DoScriptText(Killing[ikilling].id, source);
Delay_Timer = 3500;
KillingYell = true;
break;
case 1:
DoScriptText(Killing[ikilling].id, source);
KillingYell = false;
break;
}
}
void JustDied(Unit* /*Killer*/)
{
Unit* pLeftHead = Unit::GetUnit(*me,LeftHeadGUID);
Unit* pRightHead = Unit::GetUnit(*me,RightHeadGUID);
if (!pLeftHead || !pRightHead)
return;
DoScriptText(YELL_DIE_L, pLeftHead);
CAST_AI(mob_omrogg_heads::mob_omrogg_headsAI, CAST_CRE(pRightHead)->AI())->DoDeathYell();
if (pInstance)
pInstance->SetData(TYPE_OMROGG, DONE);
}
void UpdateAI(const uint32 diff)
{
if (Delay_Timer <= diff)
{
Delay_Timer = 3500;
Unit* pLeftHead = Unit::GetUnit(*me,LeftHeadGUID);
Unit* pRightHead = Unit::GetUnit(*me,RightHeadGUID);
if (!pLeftHead || !pRightHead)
return;
if (AggroYell)
{
DoScriptText(GoCombatDelay[iaggro].id, pRightHead);
AggroYell = false;
}
if (ThreatYell2)
{
Unit *source = (pLeftHead->GetEntry() == ThreatDelay2[ithreat].creature ? pLeftHead : pRightHead);
DoScriptText(ThreatDelay2[ithreat].id, source);
ThreatYell2 = false;
}
if (ThreatYell)
{
Unit *source = (pLeftHead->GetEntry() == ThreatDelay1[ithreat].creature ? pLeftHead : pRightHead);
DoScriptText(ThreatDelay1[ithreat].id, source);
ThreatYell = false;
ThreatYell2 = true;
}
if (KillingYell)
{
Unit *source = (pLeftHead->GetEntry() == KillingDelay[ikilling].creature ? pLeftHead : pRightHead);
DoScriptText(KillingDelay[ikilling].id, source);
KillingYell = false;
}
} else Delay_Timer -= diff;
if (!UpdateVictim())
return;
if (BlastCount && BlastWave_Timer <= diff)
{
DoCast(me, SPELL_BLAST_WAVE);
BlastWave_Timer = 5000;
++BlastCount;
if (BlastCount == 3)
BlastCount = 0;
}
else
BlastWave_Timer -= diff;
if (BurningMaul_Timer <= diff)
{
DoScriptText(EMOTE_ENRAGE, me);
DoCast(me, SPELL_BURNING_MAUL);
BurningMaul_Timer = 40000;
BlastWave_Timer = 16000;
BlastCount = 1;
}
else
BurningMaul_Timer -= diff;
if (ResetThreat_Timer <= diff)
{
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
{
DoYellForThreat();
DoResetThreat();
me->AddThreat(pTarget, 0.0f);
}
ResetThreat_Timer = 25000+rand()%15000;
}
else
ResetThreat_Timer -= diff;
if (Fear_Timer <= diff)
{
DoCast(me, SPELL_FEAR);
Fear_Timer = 15000+rand()%20000;
}
else
Fear_Timer -= diff;
if (ThunderClap_Timer <= diff)
{
DoCast(me, SPELL_THUNDERCLAP);
ThunderClap_Timer = 15000+rand()%15000;
}
else
ThunderClap_Timer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_warbringer_omrogg(Creature* pCreature)
{ {
DoCast(me, SPELL_FEAR); return new boss_warbringer_omroggAI (pCreature);
Fear_Timer = 15000+rand()%20000; }
} else Fear_Timer -= diff;
if (ThunderClap_Timer <= diff)
{
DoCast(me, SPELL_THUNDERCLAP);
ThunderClap_Timer = 15000+rand()%15000;
} else ThunderClap_Timer -= diff;
DoMeleeAttackIfReady();
}
}; };
CreatureAI* GetAI_boss_warbringer_omrogg(Creature* pCreature)
{
return new boss_warbringer_omroggAI (pCreature);
}
CreatureAI* GetAI_mob_omrogg_heads(Creature* pCreature)
{
return new mob_omrogg_headsAI (pCreature);
}
void AddSC_boss_warbringer_omrogg() void AddSC_boss_warbringer_omrogg()
{ {
Script *newscript; new boss_warbringer_omrogg();
new mob_omrogg_heads();
newscript = new Script;
newscript->Name = "boss_warbringer_omrogg";
newscript->GetAI = &GetAI_boss_warbringer_omrogg;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name = "mob_omrogg_heads";
newscript->GetAI = &GetAI_mob_omrogg_heads;
newscript->RegisterSelf();
} }
@@ -29,262 +29,295 @@ EndContentData */
#include "ScriptPCH.h" #include "ScriptPCH.h"
#define SAY_AGGRO1 -1540042 enum eSays
#define SAY_AGGRO2 -1540043 {
#define SAY_AGGRO3 -1540044 SAY_AGGRO1 = -1540042,
#define SAY_SLAY1 -1540045 SAY_AGGRO2 = -1540043,
#define SAY_SLAY2 -1540046 SAY_AGGRO3 = -1540044,
#define SAY_DEATH -1540047 SAY_SLAY1 = -1540045,
SAY_SLAY2 = -1540046,
SAY_DEATH = -1540047,
};
#define SPELL_BLADE_DANCE 30739 enum eSpells
#define H_SPELL_CHARGE 25821 {
SPELL_BLADE_DANCE = 30739,
H_SPELL_CHARGE = 25821,
};
enum eCreatures
{
MOB_SHATTERED_ASSASSIN = 17695,
MOB_HEARTHEN_GUARD = 17621,
MOB_SHARPSHOOTER_GUARD = 17622,
MOB_REAVER_GUARD = 17623,
};
#define TARGET_NUM 5 #define TARGET_NUM 5
#define MOB_SHATTERED_ASSASSIN 17695
#define MOB_HEARTHEN_GUARD 17621
#define MOB_SHARPSHOOTER_GUARD 17622
#define MOB_REAVER_GUARD 17623
float AssassEntrance[3] = {275.136,-84.29,2.3}; // y -8 float AssassEntrance[3] = {275.136,-84.29,2.3}; // y -8
float AssassExit[3] = {184.233,-84.29,2.3}; // y -8 float AssassExit[3] = {184.233,-84.29,2.3}; // y -8
float AddsEntrance[3] = {306.036,-84.29,1.93}; float AddsEntrance[3] = {306.036,-84.29,1.93};
struct boss_warchief_kargath_bladefistAI : public ScriptedAI class boss_warchief_kargath_bladefist : public CreatureScript
{ {
boss_warchief_kargath_bladefistAI(Creature *c) : ScriptedAI(c) public:
{
}
std::vector<uint64> adds; boss_warchief_kargath_bladefist()
std::vector<uint64> assassins; : CreatureScript("boss_warchief_kargath_bladefist")
uint32 Charge_timer;
uint32 Blade_Dance_Timer;
uint32 Summon_Assistant_Timer;
uint32 resetcheck_timer;
uint32 Wait_Timer;
uint32 Assassins_Timer;
uint32 summoned;
bool InBlade;
uint32 target_num;
void Reset()
{
removeAdds();
me->SetSpeed(MOVE_RUN,2);
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
summoned = 2;
InBlade = false;
Wait_Timer = 0;
Charge_timer = 0;
Blade_Dance_Timer = 45000;
Summon_Assistant_Timer = 30000;
Assassins_Timer = 5000;
resetcheck_timer = 5000;
}
void EnterCombat(Unit * /*who*/)
{
DoScriptText(RAND(SAY_AGGRO1,SAY_AGGRO2,SAY_AGGRO3), me);
}
void JustSummoned(Creature *summoned)
{
switch(summoned->GetEntry())
{ {
case MOB_HEARTHEN_GUARD:
case MOB_SHARPSHOOTER_GUARD:
case MOB_REAVER_GUARD:
summoned->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM,0));
adds.push_back(summoned->GetGUID());
break;
case MOB_SHATTERED_ASSASSIN:
assassins.push_back(summoned->GetGUID());
break;
} }
}
void KilledUnit(Unit* victim) struct boss_warchief_kargath_bladefistAI : public ScriptedAI
{
if (victim->GetTypeId() == TYPEID_PLAYER)
{ {
DoScriptText(RAND(SAY_SLAY1,SAY_SLAY2), me); boss_warchief_kargath_bladefistAI(Creature* pCreature) : ScriptedAI(pCreature)
}
}
void JustDied(Unit* /*Killer*/)
{
DoScriptText(SAY_DEATH, me);
removeAdds();
}
void MovementInform(uint32 type, uint32 id)
{
if (InBlade)
{
if (type != POINT_MOTION_TYPE)
return;
if (id != 1)
return;
if (target_num > 0) // to prevent loops
{ {
Wait_Timer = 1;
DoCast(me, SPELL_BLADE_DANCE, true);
target_num--;
} }
}
}
void removeAdds() std::vector<uint64> adds;
{ std::vector<uint64> assassins;
for (std::vector<uint64>::const_iterator itr = adds.begin(); itr!= adds.end(); ++itr)
{ uint32 Charge_timer;
Unit* temp = Unit::GetUnit((*me),*itr); uint32 Blade_Dance_Timer;
if (temp && temp->isAlive()) uint32 Summon_Assistant_Timer;
uint32 resetcheck_timer;
uint32 Wait_Timer;
uint32 Assassins_Timer;
uint32 summoned;
bool InBlade;
uint32 target_num;
void Reset()
{ {
(*temp).GetMotionMaster()->Clear(true); removeAdds();
me->DealDamage(temp,temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
CAST_CRE(temp)->RemoveCorpse(); me->SetSpeed(MOVE_RUN,2);
me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
summoned = 2;
InBlade = false;
Wait_Timer = 0;
Charge_timer = 0;
Blade_Dance_Timer = 45000;
Summon_Assistant_Timer = 30000;
Assassins_Timer = 5000;
resetcheck_timer = 5000;
} }
}
adds.clear();
for (std::vector<uint64>::const_iterator itr = assassins.begin(); itr!= assassins.end(); ++itr) void EnterCombat(Unit * /*who*/)
{
Unit* temp = Unit::GetUnit((*me),*itr);
if (temp && temp->isAlive())
{ {
(*temp).GetMotionMaster()->Clear(true); DoScriptText(RAND(SAY_AGGRO1,SAY_AGGRO2,SAY_AGGRO3), me);
me->DealDamage(temp,temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
CAST_CRE(temp)->RemoveCorpse();
} }
}
assassins.clear();
}
void SpawnAssassin()
{
me->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassEntrance[0],AssassEntrance[1]+8, AssassEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
me->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassEntrance[0],AssassEntrance[1]-8, AssassEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
me->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassExit[0],AssassExit[1]+8, AssassExit[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
me->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassExit[0],AssassExit[1]-8, AssassExit[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
}
void UpdateAI(const uint32 diff) void JustSummoned(Creature *summoned)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (Assassins_Timer)
if (Assassins_Timer <= diff)
{ {
SpawnAssassin(); switch(summoned->GetEntry())
Assassins_Timer = 0;
} else Assassins_Timer -= diff;
if (InBlade)
{
if (Wait_Timer)
if (Wait_Timer <= diff)
{ {
if (target_num <= 0) case MOB_HEARTHEN_GUARD:
{ case MOB_SHARPSHOOTER_GUARD:
// stop bladedance case MOB_REAVER_GUARD:
InBlade = false; summoned->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM,0));
me->SetSpeed(MOVE_RUN,2); adds.push_back(summoned->GetGUID());
me->GetMotionMaster()->MoveChase(me->getVictim()); break;
Blade_Dance_Timer = 30000; case MOB_SHATTERED_ASSASSIN:
Wait_Timer = 0; assassins.push_back(summoned->GetGUID());
if (IsHeroic()) break;
Charge_timer = 5000; }
} }
else
{
//move in bladedance
float x,y,randx,randy;
randx = (rand()%40);
randy = (rand()%40);
x = 210+ randx ;
y = -60- randy ;
me->GetMotionMaster()->MovePoint(1,x,y,me->GetPositionZ());
Wait_Timer = 0;
}
} else Wait_Timer -= diff;
}
else
{
if (Blade_Dance_Timer)
if (Blade_Dance_Timer <= diff)
{
target_num = TARGET_NUM;
Wait_Timer = 1;
InBlade = true;
Blade_Dance_Timer = 0;
me->SetSpeed(MOVE_RUN,4);
return;
} else Blade_Dance_Timer -= diff;
if (Charge_timer) void KilledUnit(Unit* victim)
if (Charge_timer <= diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), H_SPELL_CHARGE);
Charge_timer = 0;
} else Charge_timer -= diff;
if (Summon_Assistant_Timer <= diff)
{ {
for (uint8 i = 0; i < summoned; ++i) if (victim->GetTypeId() == TYPEID_PLAYER)
{ {
switch (urand(0,2)) DoScriptText(RAND(SAY_SLAY1,SAY_SLAY2), me);
}
}
void JustDied(Unit* /*Killer*/)
{
DoScriptText(SAY_DEATH, me);
removeAdds();
}
void MovementInform(uint32 type, uint32 id)
{
if (InBlade)
{
if (type != POINT_MOTION_TYPE)
return;
if (id != 1)
return;
if (target_num > 0) // to prevent loops
{ {
case 0: me->SummonCreature(MOB_HEARTHEN_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000); break; Wait_Timer = 1;
case 1: me->SummonCreature(MOB_SHARPSHOOTER_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000); break; DoCast(me, SPELL_BLADE_DANCE, true);
case 2: me->SummonCreature(MOB_REAVER_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000); break; target_num--;
} }
} }
if (urand(0,9) < 2)
++summoned;
Summon_Assistant_Timer = urand(25000,35000);
} else Summon_Assistant_Timer -= diff;
DoMeleeAttackIfReady();
}
if (resetcheck_timer <= diff)
{
uint32 tempx,tempy;
tempx = uint32(me->GetPositionX());
tempy = uint32(me->GetPositionY());
if (tempx > 255 || tempx < 205)
{
EnterEvadeMode();
return;
} }
resetcheck_timer = 5000;
} else resetcheck_timer -= diff;
}
};
CreatureAI* GetAI_boss_warchief_kargath_bladefist(Creature* pCreature) void removeAdds()
{ {
return new boss_warchief_kargath_bladefistAI (pCreature); for (std::vector<uint64>::const_iterator itr = adds.begin(); itr!= adds.end(); ++itr)
} {
Unit* temp = Unit::GetUnit((*me),*itr);
if (temp && temp->isAlive())
{
(*temp).GetMotionMaster()->Clear(true);
me->DealDamage(temp,temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
CAST_CRE(temp)->RemoveCorpse();
}
}
adds.clear();
for (std::vector<uint64>::const_iterator itr = assassins.begin(); itr!= assassins.end(); ++itr)
{
Unit* temp = Unit::GetUnit((*me),*itr);
if (temp && temp->isAlive())
{
(*temp).GetMotionMaster()->Clear(true);
me->DealDamage(temp,temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
CAST_CRE(temp)->RemoveCorpse();
}
}
assassins.clear();
}
void SpawnAssassin()
{
me->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassEntrance[0],AssassEntrance[1]+8, AssassEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
me->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassEntrance[0],AssassEntrance[1]-8, AssassEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
me->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassExit[0],AssassExit[1]+8, AssassExit[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
me->SummonCreature(MOB_SHATTERED_ASSASSIN,AssassExit[0],AssassExit[1]-8, AssassExit[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
}
void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
if (Assassins_Timer)
if (Assassins_Timer <= diff)
{
SpawnAssassin();
Assassins_Timer = 0;
}
else
Assassins_Timer -= diff;
if (InBlade)
{
if (Wait_Timer)
if (Wait_Timer <= diff)
{
if (target_num <= 0)
{
// stop bladedance
InBlade = false;
me->SetSpeed(MOVE_RUN,2);
me->GetMotionMaster()->MoveChase(me->getVictim());
Blade_Dance_Timer = 30000;
Wait_Timer = 0;
if (IsHeroic())
Charge_timer = 5000;
}
else
{
//move in bladedance
float x,y,randx,randy;
randx = (rand()%40);
randy = (rand()%40);
x = 210+ randx ;
y = -60- randy ;
me->GetMotionMaster()->MovePoint(1,x,y,me->GetPositionZ());
Wait_Timer = 0;
}
}
else
Wait_Timer -= diff;
}
else
{
if (Blade_Dance_Timer)
if (Blade_Dance_Timer <= diff)
{
target_num = TARGET_NUM;
Wait_Timer = 1;
InBlade = true;
Blade_Dance_Timer = 0;
me->SetSpeed(MOVE_RUN,4);
return;
}
else
Blade_Dance_Timer -= diff;
if (Charge_timer)
if (Charge_timer <= diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), H_SPELL_CHARGE);
Charge_timer = 0;
}
else
Charge_timer -= diff;
if (Summon_Assistant_Timer <= diff)
{
for (uint8 i = 0; i < summoned; ++i)
{
switch (urand(0,2))
{
case 0:
me->SummonCreature(MOB_HEARTHEN_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
break;
case 1:
me->SummonCreature(MOB_SHARPSHOOTER_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
break;
case 2:
me->SummonCreature(MOB_REAVER_GUARD,AddsEntrance[0],AddsEntrance[1], AddsEntrance[2], 0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,30000);
break;
}
}
if (urand(0,9) < 2)
++summoned;
Summon_Assistant_Timer = urand(25000,35000);
}
else
Summon_Assistant_Timer -= diff;
DoMeleeAttackIfReady();
}
if (resetcheck_timer <= diff)
{
uint32 tempx,tempy;
tempx = uint32(me->GetPositionX());
tempy = uint32(me->GetPositionY());
if (tempx > 255 || tempx < 205)
{
EnterEvadeMode();
return;
}
resetcheck_timer = 5000;
}
else
resetcheck_timer -= diff;
}
};
CreatureAI* GetAI(Creature* Creature) const
{
return new boss_warchief_kargath_bladefistAI (Creature);
}
};
void AddSC_boss_warchief_kargath_bladefist() void AddSC_boss_warchief_kargath_bladefist()
{ {
Script *newscript; new boss_warchief_kargath_bladefist();
newscript = new Script;
newscript->Name = "boss_warchief_kargath_bladefist";
newscript->GetAI = &GetAI_boss_warchief_kargath_bladefist;
newscript->RegisterSelf();
} }
@@ -30,87 +30,95 @@ EndScriptData */
#define DOOR_NETHEKURSE 1 #define DOOR_NETHEKURSE 1
struct instance_shattered_halls : public ScriptedInstance class instance_shattered_halls : public InstanceMapScript
{ {
instance_shattered_halls(Map* pMap) : ScriptedInstance(pMap) {Initialize();}; public:
instance_shattered_halls()
uint32 m_auiEncounter[MAX_ENCOUNTER]; : InstanceMapScript("instance_shattered_halls")
uint64 nethekurseGUID;
uint64 nethekurseDoorGUID;
void Initialize()
{
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
nethekurseGUID = 0;
nethekurseDoorGUID = 0;
}
void OnGameObjectCreate(GameObject* pGo, bool /*add*/)
{
switch(pGo->GetEntry())
{ {
case DOOR_NETHEKURSE: nethekurseDoorGUID = pGo->GetGUID(); break;
} }
} struct instance_shattered_halls_InstanceMapScript : public ScriptedInstance
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
switch(pCreature->GetEntry())
{ {
case 16807: nethekurseGUID = pCreature->GetGUID(); break; instance_shattered_halls_InstanceMapScript(Map* pMap) : ScriptedInstance(pMap) {Initialize();};
}
}
void SetData(uint32 type, uint32 data) uint32 m_auiEncounter[MAX_ENCOUNTER];
{ uint64 nethekurseGUID;
switch(type) uint64 nethekurseDoorGUID;
{
case TYPE_NETHEKURSE:
m_auiEncounter[0] = data;
break;
case TYPE_OMROGG:
m_auiEncounter[1] = data;
break;
}
}
uint32 GetData(uint32 type) void Initialize()
{ {
switch(type) memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
{
case TYPE_NETHEKURSE:
return m_auiEncounter[0];
case TYPE_OMROGG:
return m_auiEncounter[1];
}
return 0;
}
uint64 GetData64(uint32 data) nethekurseGUID = 0;
{ nethekurseDoorGUID = 0;
switch(data) }
void OnGameObjectCreate(GameObject* pGo, bool /*add*/)
{
switch(pGo->GetEntry())
{
case DOOR_NETHEKURSE:
nethekurseDoorGUID = pGo->GetGUID();
break;
}
}
void OnCreatureCreate(Creature* pCreature, bool /*add*/)
{
switch(pCreature->GetEntry())
{
case 16807:
nethekurseGUID = pCreature->GetGUID();
break;
}
}
void SetData(uint32 type, uint32 data)
{
switch(type)
{
case TYPE_NETHEKURSE:
m_auiEncounter[0] = data;
break;
case TYPE_OMROGG:
m_auiEncounter[1] = data;
break;
}
}
uint32 GetData(uint32 type)
{
switch(type)
{
case TYPE_NETHEKURSE:
return m_auiEncounter[0];
case TYPE_OMROGG:
return m_auiEncounter[1];
}
return 0;
}
uint64 GetData64(uint32 data)
{
switch(data)
{
case DATA_NETHEKURSE:
return nethekurseGUID;
case DATA_NETHEKURSE_DOOR:
return nethekurseDoorGUID;
}
return 0;
}
};
InstanceData* GetInstanceData(Map* pMap) const
{ {
case DATA_NETHEKURSE: return new instance_shattered_halls_InstanceMapScript(pMap);
return nethekurseGUID;
case DATA_NETHEKURSE_DOOR:
return nethekurseDoorGUID;
} }
return 0;
}
}; };
InstanceData* GetInstanceData_instance_shattered_halls(Map* pMap)
{
return new instance_shattered_halls(pMap);
}
void AddSC_instance_shattered_halls() void AddSC_instance_shattered_halls()
{ {
Script *newscript; new instance_shattered_halls();
newscript = new Script;
newscript->Name = "instance_shattered_halls";
newscript->GetInstanceData = &GetInstanceData_instance_shattered_halls;
newscript->RegisterSelf();
} }