convert Magtheridons Lair and Shattered Halls to new format
--HG-- branch : trunk
This commit is contained in:
+547
-473
File diff suppressed because it is too large
Load Diff
+199
-190
@@ -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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+299
-278
@@ -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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+254
-221
@@ -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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+77
-69
@@ -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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user