Untitled diff
661 lines
#include "ScriptPCH.h"
#include "ScriptPCH.h"
#include "blackwing_descent.h"
#include "blackwing_descent.h"
#define SAY_AGGRO "Hmm... the Omnotron Defense System. Centuries ago these constructs were considered the Dwarves greatest technical achievements. With so many counters to each construct's attacks. I''ll have to rectify these designs for them to provide me any entertainement."
#define SAY_AGGRO "Hmm... the Omnotron Defense System. Centuries ago these constructs were considered the Dwarves greatest technical achievements. With so many counters to each construct's attacks. I''ll have to rectify these designs for them to provide me any entertainement."
#define SAY_STORY "Stupid Dwarnes and you fascination with runes! Why would you create something that would help your enemy?"
#define SAY_STORY "Stupid Dwarnes and you fascination with runes! Why would you create something that would help your enemy?"
#define SAY_LIGHTNING "Lightning conductor works much better in a crowd,yes?"
#define SAY_LIGHTNING "Lightning conductor works much better in a crowd,yes?"
#define SAY_TOXITRON_CHEMICAL "Were you planning on using Toxitron's chemical to damage the other construcs?Clever plan, let me ruin that for you."
#define SAY_TOXITRON_CHEMICAL "Were you planning on using Toxitron's chemical to damage the other construcs?Clever plan, let me ruin that for you."
#define SAY_TOO_BAD "You would like to move away from that, wouldn't you?Too bad."
#define SAY_TOO_BAD "You would like to move away from that, wouldn't you?Too bad."
#define SAY_DEATH "Defense systems obliterated. Powering down...."
#define SAY_DEATH "Defense systems obliterated. Powering down...."
#define SAY_SHIELD_POISON "Toxitron unit shield system onlines."
#define SAY_SHIELD_POISON "Toxitron unit shield system onlines."
#define SAY_SHIELD_FLAMME "Magmatron unit shield system onlines."
#define SAY_SHIELD_FLAMME "Magmatron unit shield system onlines."
#define SAY_SHIELD_ELECTRON "Electron unit shield system onlines."
#define SAY_SHIELD_ELECTRON "Electron unit shield system onlines."
#define SAY_SHIELD_ARCANOTRON "Arcanotron unit shield system onlines."
#define SAY_SHIELD_ARCANOTRON "Arcanotron unit shield system onlines."
#define SAY_ACTIVATION_TOXITRON "Toxitron unit activated."
#define SAY_ACTIVATION_TOXITRON "Toxitron unit activated."
#define SAY_ACTIVATION_MAGMATRON "Magmatron unit activated."
#define SAY_ACTIVATION_MAGMATRON "Magmatron unit activated."
#define SAY_ACTIVATION_ELECTRON "Electron unit activated."
#define SAY_ACTIVATION_ELECTRON "Electron unit activated."
#define SAY_ACTIVATION_ARCANOTRON "Arcanotron unit activated."
#define SAY_ACTIVATION_ARCANOTRON "Arcanotron unit activated."
#define SAY_REROUTING_ENERGY "Defense systems obliterated. P owering down...."
#define SAY_REROUTING_ENERGY "Defense systems obliterated. P owering down...."
enum Spells
enum Spells
{
{
// Omnitron
// Omnitron
SPELL_INACTIVE=78726,
SPELL_INACTIVE=78726,
SPELL_SHUTTING_DOWN = 78746,
SPELL_SHUTTING_DOWN = 78746,
SPELL_ACTIVATED = 78740,
SPELL_ACTIVATED = 78740,
// Electron
// Electron
SPELL_LIGHTNING_CONDUCTOR = 79888,
SPELL_LIGHTNING_CONDUCTOR = 79888,
SPELL_ELECTRICAL_DISCHARGE = 91465,
SPELL_ELECTRICAL_DISCHARGE = 79879,
SPELL_UNSTABLE_SHIELD = 91447,
SPELL_UNSTABLE_SHIELD = 79900,
// Toxitron
// Toxitron
SPELL_CHEMICAL_BOMB = 80157,
SPELL_CHEMICAL_BOMB = 80157,
SPELL_POISON_SOAKED_SHELL = 91501,
SPELL_POISON_SOAKED_SHELL = 79835,
SPELL_POISON_PROTOCOL = 91513,
SPELL_POISON_PROTOCOL = 80053,
// Magmatron
// Magmatron
SPELL_BARRIER = 79582,
SPELL_BARRIER = 79582,
SPELL_ACQUIRING_TARGET = 79501,
SPELL_ACQUIRING_TARGET = 79501,
SPELL_FLAMETHROWER = 79504,
SPELL_FLAMETHROWER = 79504,
SPELL_INCINERATION_SECURITY_MEASURE = 79023,
SPELL_INCINERATION_SECURITY_MEASURE = 79023,
// Arcanotron
// Arcanotron
SPELL_POWER_GENERATOR = 79626, // little bit hacky but it works :-)
SPELL_POWER_GENERATOR = 79626,
SPELL_ARCANE_ANNIHILATOR = 79710,
SPELL_ARCANE_ANNIHILATOR = 79710,
SPELL_POWER_CONVERSION = 79729,
SPELL_POWER_CONVERSION = 79729,
// Bombe de Poison
// Bombe de Poison
SPELL_FIXER = 80094,
SPELL_FIXER = 80094,
SPELL_BOMBE = 80092,
SPELL_BOMBE = 80086,
};
};
enum Summons
enum Summons
{
{
MOB_POISON_BOMB = 42897,
MOB_POISON_BOMB = 42897,
};
};
enum Events
enum Events
{
{
// General
// General
EVENT_SHUT_DOWN = 1,
EVENT_SHUT_DOWN = 1,
// Omnotron
// Omnotron
EVENT_ACTIVATE_NEXT_CONSTRUCT,
EVENT_ACTIVATE_NEXT_CONSTRUCT,
EVENT_UPDATE_HEALTH,
EVENT_UPDATE_HEALTH,
// Magmatron
// Magmatron
EVENT_ACQUIRING_TARGET,
EVENT_ACQUIRING_TARGET,
EVENT_INCINERATION_SECURITY_MEASURE,
EVENT_INCINERATION_SECURITY_MEASURE,
EVENT_BARRIER,
EVENT_BARRIER,
// Toxitron
// Toxitron
EVENT_CHEMICAL_BOMB,
EVENT_CHEMICAL_BOMB,
EVENT_POISON_PROTOCOL,
EVENT_POISON_PROTOCOL,
EVENT_POISON_SOAKED_SHELL,
EVENT_POISON_SOAKED_SHELL,
// Electron
// Electron
EVENT_LIGHTNING_CONDUCTOR,
EVENT_LIGHTNING_CONDUCTOR,
EVENT_ELECTRICAL_DISCHARGE,
EVENT_ELECTRICAL_DISCHARGE,
EVENT_UNSTABLE_SHIELD,
EVENT_UNSTABLE_SHIELD,
// Arcanotron
// Arcanotron
EVENT_POWER_CONVERSION,
EVENT_POWER_CONVERSION,
EVENT_POWER_GENERATOR,
EVENT_POWER_GENERATOR,
EVENT_ARCANE_ANNIHILATOR,
EVENT_ARCANE_ANNIHILATOR,
};
};
enum Actions
enum Actions
{
{
ACTION_OMNOTRON_START_EVENT,
ACTION_OMNOTRON_START_EVENT,
ACTION_OMNOTRON_RESET,
ACTION_OMNOTRON_RESET,
ACTION_OMNNOTRON_EVENT_FINISHED,
ACTION_OMNNOTRON_EVENT_FINISHED,
ACTION_TRON_ACTIVATE,
ACTION_TRON_ACTIVATE,
ACTION_EVENT_FAILED,
ACTION_EVENT_FAILED,
ACTION_DEACTIVATE,
ACTION_DEACTIVATE,
};
};
enum Misc
enum Misc
{
{
DATA_IS_FIRST_TRON,
DATA_IS_FIRST_TRON,
};
};
Position const wayPos[2] =
Position const wayPos[2] =
{
{
{-315.853f, -400.56f, 213.974f,0},
{-315.853f, -400.56f, 213.974f,0},
{-334.152f, -400.321f, 214.005f,0},
{-334.152f, -400.321f, 214.005f,0},
};
};
class boss_omnotron : public CreatureScript
class boss_omnotron : public CreatureScript
{
{
public:
public:
boss_omnotron() : CreatureScript("boss_omnotron") { }
boss_omnotron() : CreatureScript("boss_omnotron") { }
CreatureAI* GetAI(Creature* creature) const
CreatureAI* GetAI(Creature* creature) const
{
{
return new boss_omnotronAI (creature);
return new boss_omnotronAI (creature);
}
}
struct boss_omnotronAI : public ScriptedAI
struct boss_omnotronAI : public ScriptedAI
{
{
boss_omnotronAI(Creature* creature) : ScriptedAI(creature), eventActive(false), intialized(false)
boss_omnotronAI(Creature* creature) : ScriptedAI(creature), eventActive(false), intialized(false)
{
{
instance = creature->GetInstanceScript();
instance = creature->GetInstanceScript();
}
}
InstanceScript* instance;
InstanceScript* instance;
EventMap events;
EventMap events;
bool intialized;
bool intialized;
bool isEncounterDone;
bool isEncounterDone;
Creature* trons[4];
Creature* trons[4];
uint8 activateTron;
uint8 activateTron;
bool eventActive;
bool eventActive;
void UpdateAI(const uint32 diff)
void UpdateAI(const uint32 diff)
{
{
if(!intialized)
if(!intialized)
{
{
trons[0] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_MAGMATRON));
trons[0] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_MAGMATRON));
trons[1] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_ELECTRON));
trons[1] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_ELECTRON));
trons[2] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_ARCANOTRON));
trons[2] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_ARCANOTRON));
trons[3] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_TOXITRON));
trons[3] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_TOXITRON));
for(uint8 i = 0; i<=3; i++)
for(uint8 i = 0; i<=3; i++)
if(trons[i] == NULL)
if(trons[i] == NULL)
return;
return;
me->SetMaxHealth(trons[0]->GetMaxHealth());
me->SetMaxHealth(trons[0]->GetMaxHealth());
eventActive = true;
eventActive = true;
intialized = true;
intialized = true;
DoAction(ACTION_OMNOTRON_RESET);
DoAction(ACTION_OMNOTRON_RESET);
}else
}else
{
{
events.Update(diff);
events.Update(diff);
while (uint32 eventId = events.ExecuteEvent())
while (uint32 eventId = events.ExecuteEvent())
{
{
switch (eventId)
switch (eventId)
{
{
case EVENT_ACTIVATE_NEXT_CONSTRUCT:
case EVENT_ACTIVATE_NEXT_CONSTRUCT:
ActivateNextTron();
ActivateNextTron();
events.ScheduleEvent(EVENT_ACTIVATE_NEXT_CONSTRUCT, 45000);
events.ScheduleEvent(EVENT_ACTIVATE_NEXT_CONSTRUCT, 45000);
break;
break;
case EVENT_UPDATE_HEALTH:
case EVENT_UPDATE_HEALTH:
for(uint8 i = 0; i<=3; i++)
for(uint8 i = 0; i<=3; i++)
trons[i]->SetHealth(me->GetHealth());
trons[i]->SetHealth(me->GetHealth());
events.ScheduleEvent(EVENT_UPDATE_HEALTH, 1000);
events.ScheduleEvent(EVENT_UPDATE_HEALTH, 1000);
break;
break;
default:
default:
break;
break;
}
}
}
}
}
}
}
}
void DoAction(const int32 action)
void DoAction(const int32 action)
{
{
switch(action)
switch(action)
{
{
case ACTION_OMNOTRON_START_EVENT:
case ACTION_OMNOTRON_START_EVENT:
// Start Encounter
// Start Encounter
if (instance)
if (instance)
instance->SetBossState(DATA_OMNOTRON_DEFENSE_SYSTEM, IN_PROGRESS);
instance->SetBossState(DATA_OMNOTRON_DEFENSE_SYSTEM, IN_PROGRESS);
eventActive = true;
eventActive = true;
if(me->GetMap()->IsHeroic())
if(me->GetMap()->IsHeroic())
me->SummonCreature(NPC_NEFARIAN_HELPER_HEROIC,-302.121f, -349.35f, 220.48f, 4.682203f,TEMPSUMMON_MANUAL_DESPAWN);
me->SummonCreature(NPC_NEFARIAN_HELPER_HEROIC,-302.121f, -349.35f, 220.48f, 4.682203f,TEMPSUMMON_MANUAL_DESPAWN);
events.ScheduleEvent(EVENT_ACTIVATE_NEXT_CONSTRUCT, 45000);
events.ScheduleEvent(EVENT_ACTIVATE_NEXT_CONSTRUCT, 45000);
events.ScheduleEvent(EVENT_UPDATE_HEALTH, 1000);
events.ScheduleEvent(EVENT_UPDATE_HEALTH, 1000);
break;
break;
case ACTION_OMNOTRON_RESET:
case ACTION_OMNOTRON_RESET:
// Resets Encounter
// Resets Encounter
if(eventActive)
if(eventActive)
{
{
me->SetFullHealth();
me->SetFullHealth();
eventActive = false;
eventActive = false;
DespawnMinions();
DespawnMinions();
events.Reset();
events.Reset();
ResetTrons();
ResetTrons();
if (instance)
if (instance)
instance->SetBossState(DATA_OMNOTRON_DEFENSE_SYSTEM, FAIL);
instance->SetBossState(DATA_OMNOTRON_DEFENSE_SYSTEM, FAIL);
}
}
break;
break;
case ACTION_OMNNOTRON_EVENT_FINISHED:
case ACTION_OMNNOTRON_EVENT_FINISHED:
DespawnMinions();
DespawnMinions();
if (instance)
if (instance)
instance->SetBossState(DATA_OMNOTRON_DEFENSE_SYSTEM, DONE);
instance->SetBossState(DATA_OMNOTRON_DEFENSE_SYSTEM, DONE);
instance->SetBossState(DATA_MAGMAW, DONE);
instance->SetBossState(DATA_MAGMAW, DONE);
events.Reset();
events.Reset();
eventActive = false;
eventActive = false;
break;
break;
default:
default:
break;
break;
}
}
}
}
void ResetTrons()
void ResetTrons()
{
{
for(uint8 i = 0; i<=3; i++)
for(uint8 i = 0; i<=3; i++)
if(trons[i] == NULL)
if(trons[i] == NULL)
return;
return;
for(uint8 i = 0; i<=3; i++)
for(uint8 i = 0; i<=3; i++)
trons[i]->AI()->SetData(DATA_IS_FIRST_TRON, 0);
trons[i]->AI()->SetData(DATA_IS_FIRST_TRON, 0);
uint8 a = urand(15,25);
uint8 a = urand(15,25);
Creature* tronCache;
Creature* tronCache;
for(uint8 i = 0; i<=a; i++)
for(uint8 i = 0; i<=a; i++)
{
{
uint8 moveDest = urand(0,3);
uint8 moveDest = urand(0,3);
uint8 moveTarget = urand(0,3);
uint8 moveTarget = urand(0,3);
tronCache = trons[moveTarget];
tronCache = trons[moveTarget];
trons[moveTarget] = trons[moveDest];
trons[moveTarget] = trons[moveDest];
trons[moveDest] = tronCache;
trons[moveDest] = tronCache;
}
}
trons[0]->AI()->SetData(DATA_IS_FIRST_TRON, 1);
trons[0]->AI()->SetData(DATA_IS_FIRST_TRON, 1);
for(uint8 i = 0; i<=3; i++)
for(uint8 i = 0; i<=3; i++)
trons[i]->AI()->DoAction(ACTION_EVENT_FAILED);
trons[i]->AI()->DoAction(ACTION_EVENT_FAILED);
};
};
void ActivateNextTron()
void ActivateNextTron()
{
{
for(uint8 i = 0; i<=3; i++)
for(uint8 i = 0; i<=3; i++)
if(trons[i] == NULL)
if(trons[i] == NULL)
return;
return;
// Select next Tron
// Select next Tron
Creature* tronCache = trons[0];
Creature* tronCache = trons[0];
// Push tron list one step to first place
// Push tron list one step to first place
for(uint8 i = 1; i<=3; i++)
for(uint8 i = 1; i<=3; i++)
trons[i-1] = trons[i];
trons[i-1] = trons[i];
trons[3] = tronCache;
trons[3] = tronCache;
// Activate first Tron
// Activate first Tron
trons[0]->AI()->DoAction(ACTION_TRON_ACTIVATE);
trons[0]->AI()->DoAction(ACTION_TRON_ACTIVATE);
return;
return;
}
}
private:
private:
inline void DespawnMinions()
inline void DespawnMinions()
{
{
DespawnCreatures(NPC_POISON_BOMB);
DespawnCreatures(NPC_POISON_BOMB);
DespawnCreatures(NPC_POISON_CLOUD);
DespawnCreatures(NPC_POISON_CLOUD);
DespawnCreatures(NPC_NEFARIAN_HELPER_HEROIC);
DespawnCreatures(NPC_NEFARIAN_HELPER_HEROIC);
DespawnCreatures(NPC_POWER_GENERATOR);
DespawnCreatures(NPC_POWER_GENERATOR);
}
}
void DespawnCreatures(uint32 entry)
void DespawnCreatures(uint32 entry)
{
{
std::list<Creature*> creatures;
std::list<Creature*> creatures;
GetCreatureListWithEntryInGrid(creatures, me, entry, 100.0f);
GetCreatureListWithEntryInGrid(creatures, me, entry, 100.0f);
if (creatures.empty())
if (creatures.empty())
return;
return;
for (std::list<Creature*>::iterator iter = creatures.begin(); iter != creatures.end(); ++iter)
for (std::list<Creature*>::iterator iter = creatures.begin(); iter != creatures.end(); ++iter)
(*iter)->DespawnOrUnsummon();
(*iter)->DespawnOrUnsummon();
}
}
};
};
};
};
class boss_trons : public CreatureScript
class boss_trons : public CreatureScript
{
{
public:
public:
boss_trons() : CreatureScript("boss_trons") { }
boss_trons() : CreatureScript("boss_trons") { }
CreatureAI* GetAI(Creature* creature) const
CreatureAI* GetAI(Creature* creature) const
{
{
return new boss_tronsAI (creature);
return new boss_tronsAI (creature);
}
}
struct boss_tronsAI : public ScriptedAI
struct boss_tronsAI : public ScriptedAI
{
{
boss_tronsAI(Creature* creature) : ScriptedAI(creature), activated(false), isFirstTron(false)
boss_tronsAI(Creature* creature) : ScriptedAI(creature), activated(false), isFirstTron(false)
{
{
instance = creature->GetInstanceScript();
instance = creature->GetInstanceScript();
creature->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
creature->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_KNOCK_BACK, true);
creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_GRIP, true);
creature->ApplySpellImmune(0, IMMUNITY_MECHANIC, MECHANIC_GRIP, true);
creature->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
creature->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
homePosition = creature->GetHomePosition();
homePosition = creature->GetHomePosition();
}
}
InstanceScript* instance;
InstanceScript* instance;
EventMap events;
EventMap events;
bool activated;
bool activated;
bool isFirstTron;
bool isFirstTron;
bool isMovingHome;
bool isMovingHome;
Position homePosition;
Position homePosition;
Creature* omnotron;
Creature* omnotron;
void EnterCombat(Unit * who)
void EnterCombat(Unit * who)
{
{
if(isFirstTron)
if(isFirstTron)
{
{
if (Creature* omnotron = ObjectAccessor::GetCreature(*me,instance->GetData64(BOSS_OMNOTRON)))
if (Creature* omnotron = ObjectAccessor::GetCreature(*me,instance->GetData64(BOSS_OMNOTRON)))
omnotron->AI()->DoAction(ACTION_OMNOTRON_START_EVENT);
omnotron->AI()->DoAction(ACTION_OMNOTRON_START_EVENT);
DoAction(ACTION_TRON_ACTIVATE);
DoAction(ACTION_TRON_ACTIVATE);
}
}
}
}
void JustDied(Unit* /*Killer*/)
void JustDied(Unit* /*Killer*/)
{
{
me->MonsterYell(SAY_DEATH, 0, 0);
me->MonsterYell(SAY_DEATH, 0, 0);
}
}
void MovementInform(uint32 type, uint32 id)
void MovementInform(uint32 type, uint32 id)
{
{
if (type != POINT_MOTION_TYPE || id > 2)
if (type != POINT_MOTION_TYPE || id > 2)
return;
return;
me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
switch(id)
switch(id)
{
{
case 0:
case 0:
if(!isFirstTron && isMovingHome)
if(!isFirstTron && isMovingHome)
{
{
isMovingHome = false;
isMovingHome = false;
me->NearTeleportTo(homePosition.GetPositionX(),homePosition.GetPositionY(),homePosition.GetPositionZ(),homePosition.GetOrientation());
me->NearTeleportTo(homePosition.GetPositionX(),homePosition.GetPositionY(),homePosition.GetPositionZ(),homePosition.GetOrientation());
me->SetOrientation(homePosition.GetOrientation());
me->SetOrientation(homePosition.GetOrientation());
me->AddAura(SPELL_INACTIVE, me);
me->AddAura(SPELL_INACTIVE, me);
WorldPacket data;
WorldPacket data;
me->BuildHeartBeatMsg(&data);
me->BuildHeartBeatMsg(&data);
me->SendMessageToSet(&data, false);
me->SendMessageToSet(&data, false);
}
}
break;
break;
case 1:
case 1:
me->GetMotionMaster()->MovePoint(2, wayPos[1]);
me->GetMotionMaster()->MovePoint(2, wayPos[1]);
break;
break;
case 2:
case 2:
me->GetMotionMaster()->MovePoint(1, wayPos[0]);
me->GetMotionMaster()->MovePoint(1, wayPos[0]);
break;
break;
}
}
}
}
void Reset()
void Reset()
{
{
if (Creature* omnotron = ObjectAccessor::GetCreature(*me,instance->GetData64(BOSS_OMNOTRON)))
if (Creature* omnotron = ObjectAccessor::GetCreature(*me,instance->GetData64(BOSS_OMNOTRON)))
omnotron->AI()->DoAction(ACTION_OMNOTRON_RESET);
omnotron->AI()->DoAction(ACTION_OMNOTRON_RESET);
};
};
void DoAction(const int32 action)
void DoAction(const int32 action)
{
{
events.Reset();
events.Reset();
switch(action)
switch(action)
{
{
case ACTION_TRON_ACTIVATE:
case ACTION_TRON_ACTIVATE:
me->RemoveAllAuras();
me->RemoveAllAuras();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->SetReactState(REACT_AGGRESSIVE);
me->SetReactState(REACT_AGGRESSIVE);
DoZoneInCombat(me);
DoZoneInCombat(me);
me->AddAura(SPELL_ACTIVATED, me);
me->AddAura(SPELL_ACTIVATED, me);
activated = true;
activated = true;
isMovingHome = false;
isMovingHome = false;
omnotron = ObjectAccessor::GetCreature(*me,instance->GetData64(BOSS_OMNOTRON));
omnotron = ObjectAccessor::GetCreature(*me,instance->GetData64(BOSS_OMNOTRON));
// Intialize Events
// Intialize Events
switch(me->GetEntry())
switch(me->GetEntry())
{
{
case NPC_MAGMATRON:
case NPC_MAGMATRON:
events.ScheduleEvent(EVENT_ACQUIRING_TARGET, 15000);
events.ScheduleEvent(EVENT_ACQUIRING_TARGET, 15000);
events.ScheduleEvent(EVENT_INCINERATION_SECURITY_MEASURE, 27000);
events.ScheduleEvent(EVENT_INCINERATION_SECURITY_MEASURE, 27000);
events.ScheduleEvent(EVENT_BARRIER, 30000);
events.ScheduleEvent(EVENT_BARRIER, 30000);
break;
break;
case NPC_TOXITRON:
case NPC_TOXITRON:
events.ScheduleEvent(EVENT_CHEMICAL_BOMB, 25000);
events.ScheduleEvent(EVENT_CHEMICAL_BOMB, 25000);
events.ScheduleEvent(EVENT_POISON_PROTOCOL, 3800);
events.ScheduleEvent(EVENT_POISON_PROTOCOL, 3800);
events.ScheduleEvent(EVENT_POISON_SOAKED_SHELL, 65000);
events.ScheduleEvent(EVENT_POISON_SOAKED_SHELL, 65000);
break;
break;
case NPC_ELECTRON:
case NPC_ELECTRON:
events.ScheduleEvent(EVENT_LIGHTNING_CONDUCTOR, 10000);
events.ScheduleEvent(EVENT_LIGHTNING_CONDUCTOR, 10000);
events.ScheduleEvent(EVENT_ELECTRICAL_DISCHARGE, 25000);
events.ScheduleEvent(EVENT_ELECTRICAL_DISCHARGE, 25000);
events.ScheduleEvent(EVENT_UNSTABLE_SHIELD, 11500);
events.ScheduleEvent(EVENT_UNSTABLE_SHIELD, 11500);
break;
break;
case NPC_ARCANOTRON:
case NPC_ARCANOTRON:
events.ScheduleEvent(EVENT_POWER_CONVERSION, 10000);
events.ScheduleEvent(EVENT_POWER_CONVERSION, 10000);
events.ScheduleEvent(EVENT_POWER_GENERATOR, 30000);
events.ScheduleEvent(EVENT_POWER_GENERATOR, 30000);
events.ScheduleEvent(EVENT_ARCANE_ANNIHILATOR, 8000);
events.ScheduleEvent(EVENT_ARCANE_ANNIHILATOR, 8000);
break;
break;
}
}
return;
return;
break;
break;
case ACTION_EVENT_FAILED:
case ACTION_EVENT_FAILED:
if(!isFirstTron)
if(!isFirstTron)
{ // is not First Tron
{ // is not First Tron
DoAction(ACTION_DEACTIVATE);
DoAction(ACTION_DEACTIVATE);
}else
}else
{ // is First Tron
{ // is First Tron
me->SetReactState(REACT_AGGRESSIVE);
me->SetReactState(REACT_AGGRESSIVE);
me->RemoveAllAuras();
me->RemoveAllAuras();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->GetMotionMaster()->MovePoint(1, wayPos[0]);
me->GetMotionMaster()->MovePoint(1, wayPos[0]);
activated = true;
activated = true;
isMovingHome = false;
isMovingHome = false;
}
}
break;
break;
case ACTION_DEACTIVATE:
case ACTION_DEACTIVATE:
me->SetReactState(REACT_PASSIVE);
me->SetReactState(REACT_PASSIVE);
me->AttackStop();
me->AttackStop();
me->RemoveAllAuras();
me->RemoveAllAuras();
me->GetMotionMaster()->MovePoint(0, homePosition);
me->GetMotionMaster()->MovePoint(0, homePosition);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
activated = false;
activated = false;
isMovingHome = true;
isMovingHome = true;
break;
break;
}
}
}
}
void UpdateAI(const uint32 diff)
void UpdateAI(const uint32 diff)
{
{
if (!UpdateVictim() || !activated)
if (!UpdateVictim() || !activated)
return;
return;
if(!me->HasAura(SPELL_ACTIVATED) && !isMovingHome)
if(!me->HasAura(SPELL_ACTIVATED) && !isMovingHome)
{
{
DoAction(ACTION_DEACTIVATE);
DoAction(ACTION_DEACTIVATE);
return;
return;
}
}
events.Update(diff);
events.Update(diff);
while (uint32 eventId = events.ExecuteEvent())
while (uint32 eventId = events.ExecuteEvent())
{
{
switch(eventId)
switch(eventId)
{
{
// Magmatron
// Magmatron
case EVENT_ACQUIRING_TARGET:
case EVENT_ACQUIRING_TARGET:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_ACQUIRING_TARGET);
DoCast(pTarget, SPELL_ACQUIRING_TARGET);
me->MonsterYell(SAY_REROUTING_ENERGY, 0, 0);
me->MonsterYell(SAY_REROUTING_ENERGY, 0, 0);
events.ScheduleEvent(EVENT_ACQUIRING_TARGET, 15000);
events.ScheduleEvent(EVENT_ACQUIRING_TARGET, 15000);
return;
return;
case EVENT_INCINERATION_SECURITY_MEASURE:
case EVENT_INCINERATION_SECURITY_MEASURE:
DoCastAOE(SPELL_INCINERATION_SECURITY_MEASURE);
DoCastAOE(SPELL_INCINERATION_SECURITY_MEASURE);
events.ScheduleEvent(EVENT_INCINERATION_SECURITY_MEASURE, 27000);
events.ScheduleEvent(EVENT_INCINERATION_SECURITY_MEASURE, 27000);
return;
return;
case EVENT_BARRIER:
case EVENT_BARRIER:
DoCast(me, SPELL_BARRIER);
DoCast(me, SPELL_BARRIER);
me->MonsterYell(SAY_SHIELD_FLAMME, 0, 0);
me->MonsterYell(SAY_SHIELD_FLAMME, 0, 0);
events.ScheduleEvent(EVENT_BARRIER, 60000);
events.ScheduleEvent(EVENT_BARRIER, 60000);
return;
return;
// Toxitron
// Toxitron
case EVENT_CHEMICAL_BOMB:
case EVENT_CHEMICAL_BOMB:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_CHEMICAL_BOMB);
DoCast(pTarget, SPELL_CHEMICAL_BOMB);
events.ScheduleEvent(EVENT_CHEMICAL_BOMB, 30000);
events.ScheduleEvent(EVENT_CHEMICAL_BOMB, 30000);
return;
return;
case EVENT_POISON_PROTOCOL:
case EVENT_POISON_PROTOCOL:
for (uint32 i10 = 0; i10 < 8; ++i10)
for (uint32 i10 = 0; i10 < 8; ++i10)
DoCast(me, SPELL_POISON_PROTOCOL+i10);
DoCast(me, SPELL_POISON_PROTOCOL+i10);
if (Is25ManRaid())
if (Is25ManRaid())
for (uint32 i25 = 0; i25 < 15; ++i25)
for (uint32 i25 = 0; i25 < 15; ++i25)
DoCast(me, SPELL_POISON_PROTOCOL+i25);
DoCast(me, SPELL_POISON_PROTOCOL+i25);
events.ScheduleEvent(EVENT_POISON_PROTOCOL, 38000);
events.ScheduleEvent(EVENT_POISON_PROTOCOL, 38000);
return;
return;
case EVENT_POISON_SOAKED_SHELL:
case EVENT_POISON_SOAKED_SHELL:
DoCast(me, SPELL_POISON_SOAKED_SHELL);
DoCast(me, SPELL_POISON_SOAKED_SHELL);
me->MonsterYell(SAY_SHIELD_POISON, 0, 0);
me->MonsterYell(SAY_SHIELD_POISON, 0, 0);
events.ScheduleEvent(EVENT_POISON_SOAKED_SHELL, 60000);
events.ScheduleEvent(EVENT_POISON_SOAKED_SHELL, 60000);
return;
return;
// Electron
// Electron
case EVENT_LIGHTNING_CONDUCTOR:
case EVENT_LIGHTNING_CONDUCTOR:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_LIGHTNING_CONDUCTOR);
DoCast(pTarget, SPELL_LIGHTNING_CONDUCTOR);
me->MonsterYell(SAY_LIGHTNING, 0, 0);
me->MonsterYell(SAY_LIGHTNING, 0, 0);
events.ScheduleEvent(EVENT_LIGHTNING_CONDUCTOR,10000);
events.ScheduleEvent(EVENT_LIGHTNING_CONDUCTOR,10000);
return;
return;
case EVENT_ELECTRICAL_DISCHARGE:
case EVENT_ELECTRICAL_DISCHARGE:
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
DoCast(pTarget, SPELL_ELECTRICAL_DISCHARGE);
DoCast(pTarget, SPELL_ELECTRICAL_DISCHARGE);
events.ScheduleEvent(EVENT_ELECTRICAL_DISCHARGE, 25000);
events.ScheduleEvent(EVENT_ELECTRICAL_DISCHARGE, 25000);
return;
return;
case EVENT_UNSTABLE_SHIELD:
case EVENT_UNSTABLE_SHIELD:
DoCast(me, SPELL_UNSTABLE_SHIELD);
DoCast(me, SPELL_UNSTABLE_SHIELD);
me->MonsterYell(SAY_SHIELD_ELECTRON, 0, 0);
me->MonsterYell(SAY_SHIELD_ELECTRON, 0, 0);
events.ScheduleEvent(EVENT_UNSTABLE_SHIELD, 60000);
events.ScheduleEvent(EVENT_UNSTABLE_SHIELD, 60000);
return;
return;
// Arcanotron
// Arcanotron
case EVENT_POWER_CONVERSION:
case EVENT_POWER_CONVERSION:
DoCast(me, SPELL_POWER_CONVERSION);
DoCast(me, SPELL_POWER_CONVERSION);
me->MonsterYell(SAY_SHIELD_ARCANOTRON, 0, 0);
me->MonsterYell(SAY_SHIELD_ARCANOTRON, 0, 0);
events.ScheduleEvent(EVENT_POWER_CONVERSION, 60000);
events.ScheduleEvent(EVENT_POWER_CONVERSION, 60000);
return;
return;
case EVENT_POWER_GENERATOR:
case EVENT_POWER_GENERATOR:
DoCast(me, SPELL_POWER_GENERATOR, true);
DoCast(me, SPELL_POWER_GENERATOR, true);
events.ScheduleEvent(EVENT_POWER_GENERATOR, 30000);
events.ScheduleEvent(EVENT_POWER_GENERATOR, 30000);
return;
return;
case EVENT_ARCANE_ANNIHILATOR:
case EVENT_ARCANE_ANNIHILATOR:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, true))
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, true))
DoCast(target, SPELL_ARCANE_ANNIHILATOR);
DoCast(target, SPELL_ARCANE_ANNIHILATOR);
events.ScheduleEvent(EVENT_ARCANE_ANNIHILATOR, 8000);
events.ScheduleEvent(EVENT_ARCANE_ANNIHILATOR, 8000);
return;
return;
}
}
}
}
DoMeleeAttackIfReady();
DoMeleeAttackIfReady();
}
}
void SetData(uint32 Type, uint32 Data)
void SetData(uint32 Type, uint32 Data)
{
{
if(Type != DATA_IS_FIRST_TRON)
if(Type != DATA_IS_FIRST_TRON)
return;
return;
me->SetFullHealth();
me->SetFullHealth();
isFirstTron = (Data == 0) ? false : true;
isFirstTron = (Data == 0) ? false : true;
}
}
void DamageTaken(Unit* /*who*/, uint32& damage)
void DamageTaken(Unit* /*who*/, uint32& damage)
{
{
if(omnotron)
if(omnotron)
if(damage >= omnotron->GetHealth())
if(damage >= omnotron->GetHealth())
{
{
omnotron->AI()->DoAction(ACTION_OMNNOTRON_EVENT_FINISHED);
omnotron->AI()->DoAction(ACTION_OMNNOTRON_EVENT_FINISHED);
Creature* trons[4];
Creature* trons[4];
trons[0] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_MAGMATRON));
trons[0] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_MAGMATRON));
trons[1] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_ELECTRON));
trons[1] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_ELECTRON));
trons[2] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_ARCANOTRON));
trons[2] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_ARCANOTRON));
trons[3] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_TOXITRON));
trons[3] = ObjectAccessor::GetCreature(*me,instance->GetData64(NPC_TOXITRON));
for(uint8 i = 0; i<=3; i++)
for(uint8 i = 0; i<=3; i++)
if(trons[i] != me)
if(trons[i] != me)
trons[i]->ForcedDespawn();
trons[i]->ForcedDespawn();
}
}
else
else
omnotron->SetHealth(omnotron->GetHealth()-damage);
omnotron->SetHealth(omnotron->GetHealth()-damage);
}
}
void JustSummoned(Creature* summon)
void JustSummoned(Creature* summon)
{
{
summon->setFaction(me->getFaction());
summon->setFaction(me->getFaction());
summon->SetInCombatWithZone();
summon->SetInCombatWithZone();
switch(summon->GetEntry())
switch(summon->GetEntry())
{
{
case NPC_POWER_GENERATOR:
case NPC_POWER_GENERATOR:
summon->SetReactState(REACT_PASSIVE);
summon->SetReactState(REACT_PASSIVE);
summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
summon->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
summon->ForcedDespawn(30000);
summon->ForcedDespawn(30000);
break;
break;
}
}
}
}
};
};
};
};
class npc_poison_bomb : public CreatureScript
class npc_poison_bomb : public CreatureScript
{
{
public:
public:
npc_poison_bomb() : CreatureScript("npc_poison_bomb") { }
npc_poison_bomb() : CreatureScript("npc_poison_bomb") { }
struct npc_poison_bombAI : public ScriptedAI
struct npc_poison_bombAI : public ScriptedAI
{
{
npc_poison_bombAI(Creature * pCreature) : ScriptedAI(pCreature) {}
npc_poison_bombAI(Creature * pCreature) : ScriptedAI(pCreature) {}
uint32 uiFixe;
uint32 uiFixe;
uint32 uiBombeFixe;
uint32 uiBombeFixe;
void Reset()
void Reset()
{
{
uiFixe = 2000;
uiFixe = 2000;
uiBombeFixe = 20000;
uiBombeFixe = 20000;
}
}
void UpdateAI(const uint32 uiDiff)
void UpdateAI(const uint32 uiDiff)
{
{
if (!UpdateVictim())
if (!UpdateVictim())
return;
return;
if(uiFixe <= uiDiff)
if(uiFixe <= uiDiff)
{
{
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
DoCast(target, SPELL_FIXER);
DoCast(target, SPELL_FIXER);
uiFixe = 2000;
uiFixe = 2000;
} else uiFixe -= uiDiff;
} else uiFixe -= uiDiff;
if(uiBombeFixe <= uiDiff)
if(uiBombeFixe <= uiDiff)
{
{
DoCastAOE(SPELL_BOMBE);
DoCastAOE(SPELL_BOMBE);
uiBombeFixe = 20000;
uiBombeFixe = 20000;
} else uiBombeFixe -= uiDiff;
} else uiBombeFixe -= uiDiff;
DoMeleeAttackIfReady();
DoMeleeAttackIfReady();
}
}
};
};
CreatureAI* GetAI(Creature* creature) const
CreatureAI* GetAI(Creature* creature) const
{
{
return new npc_poison_bombAI(creature);
return new npc_poison_bombAI(creature);
}
}
};
};
void AddSC_boss_omnotron_defense_system()
void AddSC_boss_omnotron_defense_system()
{
{
new boss_omnotron();
new boss_omnotron();
new boss_trons();
new boss_trons();
new npc_poison_bomb();
new npc_poison_bomb();
}
}