aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorManuel <manue.l@live.com.ar>2011-01-20 12:37:41 -0300
committerManuel <manue.l@live.com.ar>2011-01-20 12:37:41 -0300
commit76e4b6dda48c7ac20b2b6bfc874fd89deea9398b (patch)
tree64d37c70c52d72c12b75da2a284550656e2bacb9 /src
parent9c7e0702a6822750b200e790fbd2c3f1f01fa4e4 (diff)
Core/Scripts/Oculus: Implemented AI for boss Varos Cloudstrider <Azure-Lord of the Blue Dragonflight>.
Signed-off-by: Manuel <manue.l@live.com.ar>
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Scripting/ScriptLoader.cpp2
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp241
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp131
-rw-r--r--src/server/scripts/Northrend/Nexus/Oculus/oculus.h22
4 files changed, 308 insertions, 88 deletions
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp
index 794bb106083..e4cb3753563 100755
--- a/src/server/game/Scripting/ScriptLoader.cpp
+++ b/src/server/game/Scripting/ScriptLoader.cpp
@@ -397,6 +397,7 @@ void AddSC_boss_keristrasza();
void AddSC_instance_nexus();
void AddSC_boss_drakos(); //The Nexus The Oculus
void AddSC_boss_urom();
+void AddSC_boss_varos();
void AddSC_instance_oculus();
void AddSC_oculus();
void AddSC_boss_sartharion(); //Obsidian Sanctum
@@ -1084,6 +1085,7 @@ void AddNorthrendScripts()
AddSC_instance_nexus();
AddSC_boss_drakos(); //The Nexus The Oculus
AddSC_boss_urom();
+ AddSC_boss_varos();
AddSC_instance_oculus();
AddSC_oculus();
AddSC_boss_sartharion(); //Obsidian Sanctum
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
index 799039bbaa5..38db5bdd30e 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp
@@ -18,30 +18,33 @@
#include "ScriptPCH.h"
#include "oculus.h"
+enum Says
+{
+ SAY_AGGRO = 0,
+ SAY_AZURE = 1,
+ SAY_AZURE_EMOTE = 2,
+ SAY_DEATH = 3
+};
+
enum Spells
{
SPELL_ENERGIZE_CORES = 50785, //Damage 5938 to 6562, effec2 Triggers 54069, effect3 Triggers 56251
- SPELL_ENERGIZE_CORES_TRIGGER_1 = 54069,
- SPELL_ENERGIZE_CORES_TRIGGER_2 = 56251,
- SPELL_ENERGIZE_CORES_2 = 59372, //Damage 9025 to 9975, effect2 Triggers 54069, effect 56251
SPELL_CALL_AZURE_RING_CAPTAIN = 51002, //Effect Send Event (12229)
- SPELL_CALL_AZURE_RING_CAPTAIN_2 = 51006, //Effect Send Event (10665)
+ /*SPELL_CALL_AZURE_RING_CAPTAIN_2 = 51006, //Effect Send Event (10665)
SPELL_CALL_AZURE_RING_CAPTAIN_3 = 51007, //Effect Send Event (18454)
- SPELL_CALL_AZURE_RING_CAPTAIN_4 = 51008, //Effect Send Event (18455)
+ SPELL_CALL_AZURE_RING_CAPTAIN_4 = 51008, //Effect Send Event (18455)*/
SPELL_CALL_AMPLIFY_MAGIC = 51054,
- SPELL_CALL_AMPLIFY_MAGIC_2 = 59371
+
+ SPELL_CENTRIFUGE_SHIELD = 50053,
+
+ SPELL_ICE_BEAM = 49549
};
-//not in db
-enum Yells
+
+enum Events
{
- SAY_AGGRO = -1578022,
- SAY_KILL_1 = -1578023,
- SAY_KILL_2 = -1578024,
- SAY_DEATH = -1578025,
- SAY_STRIKE_1 = -1578026,
- SAY_STRIKE_2 = -1578027,
- SAY_STRIKE_3 = -1578028,
- SAY_SPAWN = -1578029
+ EVENT_ENERGIZE_CORES = 1,
+ EVENT_CALL_AZURE,
+ EVENT_AMPLIFY_MAGIC
};
class boss_varos : public CreatureScript
@@ -49,61 +52,219 @@ class boss_varos : public CreatureScript
public:
boss_varos() : CreatureScript("boss_varos") { }
- CreatureAI* GetAI(Creature* pCreature) const
+ CreatureAI* GetAI(Creature* creature) const
{
- return new boss_varosAI (pCreature);
+ return new boss_varosAI (creature);
}
- struct boss_varosAI : public ScriptedAI
+ struct boss_varosAI : public BossAI
{
- boss_varosAI(Creature *c) : ScriptedAI(c)
+ boss_varosAI(Creature* creature) : BossAI(creature, DATA_VAROS_EVENT)
{
- pInstance = c->GetInstanceScript();
+ DoCast(me,SPELL_CENTRIFUGE_SHIELD);
}
- InstanceScript* pInstance;
-
void Reset()
{
- if (pInstance)
- pInstance->SetData(DATA_VAROS_EVENT, NOT_STARTED);
+ _Reset();
+
+ events.ScheduleEvent(EVENT_AMPLIFY_MAGIC, urand(20,25) * IN_MILLISECONDS);
+ events.ScheduleEvent(EVENT_ENERGIZE_CORES, urand(0,15) * IN_MILLISECONDS);
+ // not sure if this is handled by a timer or hp percentage
+ events.ScheduleEvent(EVENT_CALL_AZURE, urand(15,30) * IN_MILLISECONDS);
+
+ instance->SetData(DATA_VAROS_EVENT, NOT_STARTED);
+ }
+
+ void AttackStart(Unit* attacker)
+ {
+ if (me->HasFlag(UNIT_FIELD_FLAGS,UNIT_FLAG_UNK_9))
+ return;
+
+ BossAI::AttackStart(attacker);
}
+
void EnterCombat(Unit* /*who*/)
{
- DoScriptText(SAY_AGGRO, me);
+ _EnterCombat();
+
+ Talk(SAY_AGGRO);
- if (pInstance)
- pInstance->SetData(DATA_VAROS_EVENT, IN_PROGRESS);
+ instance->SetData(DATA_VAROS_EVENT, IN_PROGRESS);
}
- void AttackStart(Unit* /*who*/) {}
- void MoveInLineOfSight(Unit* /*who*/) {}
- void UpdateAI(const uint32 /*diff*/)
+
+ void UpdateAI(const uint32 diff)
{
//Return since we have no target
if (!UpdateVictim())
return;
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STAT_CASTING))
+ return;
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ENERGIZE_CORES:
+ DoCast(me,SPELL_ENERGIZE_CORES);
+ events.ScheduleEvent(EVENT_ENERGIZE_CORES, urand(12,14) * IN_MILLISECONDS);
+ break;
+ case EVENT_CALL_AZURE:
+ // not sure how blizz handles this, i cant see any pattern between the differnt spells
+ DoCast(me,SPELL_CALL_AZURE_RING_CAPTAIN);
+ Talk(SAY_AZURE);
+ Talk(SAY_AZURE_EMOTE);
+ events.ScheduleEvent(EVENT_CALL_AZURE, urand(20,25) * IN_MILLISECONDS);
+ break;
+ case EVENT_AMPLIFY_MAGIC:
+ DoCast(me->getVictim(),SPELL_CALL_AMPLIFY_MAGIC);
+ events.ScheduleEvent(EVENT_AMPLIFY_MAGIC, urand(17,20) * IN_MILLISECONDS);
+ break;
+ }
+ }
+
DoMeleeAttackIfReady();
}
+
void JustDied(Unit* /*killer*/)
{
- DoScriptText(SAY_DEATH, me);
+ _JustDied();
- if (pInstance)
- pInstance->SetData(DATA_VAROS_EVENT, DONE);
- }
- void KilledUnit(Unit * victim)
- {
- if (victim == me)
- return;
- DoScriptText(RAND(SAY_KILL_1,SAY_KILL_2), me);
+ Talk(SAY_DEATH);
+ instance->SetData(DATA_VAROS_EVENT, DONE);
}
};
+};
+class npc_azure_ring_captain : public CreatureScript
+{
+ public:
+ npc_azure_ring_captain() : CreatureScript("npc_azure_ring_captain") { }
+
+ struct npc_azure_ring_captainAI : public ScriptedAI
+ {
+ npc_azure_ring_captainAI(Creature* creature) : ScriptedAI(creature)
+ {
+ instance = creature->GetInstanceScript();
+ }
+
+ void Reset()
+ {
+ targetGUID = 0;
+
+ me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
+ me->SetReactState(REACT_AGGRESSIVE);
+ }
+
+ void SpellHitTarget(Unit* target, SpellEntry const* spell)
+ {
+ if (spell->Id == SPELL_ICE_BEAM)
+ EnterEvadeMode();
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ DoMeleeAttackIfReady();
+ }
+
+ void MovementInform(uint32 type, uint32 id)
+ {
+ if (type != POINT_MOTION_TYPE ||
+ id != ACTION_CALL_DRAGON_EVENT)
+ return;
+
+ me->GetMotionMaster()->MoveIdle();
+
+ if (Unit* target = ObjectAccessor::GetUnit(*me,targetGUID))
+ DoCast(target,SPELL_ICE_BEAM);
+ }
+
+ void DoAction(const int32 action)
+ {
+ switch (action)
+ {
+ case ACTION_CALL_DRAGON_EVENT:
+ if (instance)
+ {
+ if (Creature* varos = ObjectAccessor::GetCreature(*me,instance->GetData64(DATA_VAROS)))
+ {
+ if (Unit* victim = varos->AI()->SelectTarget(SELECT_TARGET_RANDOM,0))
+ {
+ me->SetReactState(REACT_PASSIVE);
+ me->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING);
+ me->GetMotionMaster()->MovePoint(ACTION_CALL_DRAGON_EVENT,victim->GetPositionX(),victim->GetPositionY(),victim->GetPositionZ() + 20.0f);
+ targetGUID = victim->GetGUID();
+ }
+ }
+ }
+ break;
+ }
+ }
+ private:
+ uint64 targetGUID;
+ InstanceScript* instance;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_azure_ring_captainAI(creature);
+ }
};
+class spell_varos_centrifuge_shield : public SpellScriptLoader
+{
+ public:
+ spell_varos_centrifuge_shield() : SpellScriptLoader("spell_varos_centrifuge_shield") { }
+
+ class spell_varos_centrifuge_shield_AuraScript : public AuraScript
+ {
+ PrepareAuraScript(spell_varos_centrifuge_shield_AuraScript);
+
+ void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (!GetCaster()->ToCreature())
+ return;
+
+ // flags taken from sniffs
+ // UNIT_FLAG_UNK_9 -> means passive but it is not yet implemented in core
+ if (GetCaster()->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_15|UNIT_FLAG_UNK_9|UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_UNK_6))
+ {
+ GetCaster()->ToCreature()->SetReactState(REACT_PASSIVE);
+ GetCaster()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_15|UNIT_FLAG_UNK_9|UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_UNK_6);
+ }
+ }
+
+ void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
+ {
+ if (!GetCaster()->ToCreature())
+ return;
+
+ GetCaster()->ToCreature()->SetReactState(REACT_AGGRESSIVE);
+ GetCaster()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_15|UNIT_FLAG_UNK_9|UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_UNK_6);
+ }
+
+ void Register()
+ {
+ OnEffectRemove += AuraEffectRemoveFn(spell_varos_centrifuge_shield_AuraScript::OnRemove, EFFECT_0,SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ OnEffectApply += AuraEffectApplyFn(spell_varos_centrifuge_shield_AuraScript::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
+ }
+ };
+
+ AuraScript* GetAuraScript() const
+ {
+ return new spell_varos_centrifuge_shield_AuraScript();
+ }
+};
void AddSC_boss_varos()
{
new boss_varos();
+ new npc_azure_ring_captain();
+ new spell_varos_centrifuge_shield();
}
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
index 6e505e5575b..32119d16d01 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
+++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp
@@ -40,38 +40,70 @@ public:
{
instance_oculus_InstanceMapScript(Map* pMap) : InstanceScript(pMap) {Initialize();};
- uint64 uiDrakos;
- uint64 uiVaros;
- uint64 uiUrom;
- uint64 uiEregos;
-
- uint8 uiPlataformUrom;
+ void Initialize()
+ {
+ drakosGUID = 0;
+ varosGUID = 0;
+ uromGUID = 0;
+ eregosGUIDs = 0;
- uint16 m_auiEncounter[MAX_ENCOUNTER];
- std::string str_data;
+ platformUrom = 0;
- std::list<uint64> GameObjectList;
+ azureDragonsList.clear();
+ gameObjectList.clear();
+ }
- void Initialize()
+ void ProcessEvent(Unit* /*unit*/, uint32 eventId)
{
- uiPlataformUrom = 0;
+ if (eventId != EVENT_CALL_DRAGON)
+ return;
+
+ if (azureDragonsList.empty())
+ return;
+
+ Creature* nearestDragon = NULL;
+ Creature* varos = instance->GetCreature(varosGUID);
+
+ for (std::list<uint64>::const_iterator itr = azureDragonsList.begin(); itr != azureDragonsList.end(); ++itr)
+ {
+ if (Creature* dragon = instance->GetCreature(*itr))
+ {
+ if (!dragon->isAlive() && dragon->isInCombat())
+ continue;
+
+ if (!nearestDragon)
+ nearestDragon = dragon;
+ else if (varos)
+ {
+ if (nearestDragon->GetExactDist(varos) > dragon->GetExactDist(varos))
+ nearestDragon = dragon;
+ }
+ }
+ }
+
+ if (nearestDragon)
+ nearestDragon->AI()->DoAction(ACTION_CALL_DRAGON_EVENT);
+
}
void OnCreatureCreate(Creature* creature)
{
switch(creature->GetEntry())
{
- case CREATURE_DRAKOS:
- uiDrakos = creature->GetGUID();
+ case NPC_DRAKOS:
+ drakosGUID = creature->GetGUID();
break;
- case CREATURE_VAROS:
- uiVaros = creature->GetGUID();
+ case NPC_VAROS:
+ varosGUID = creature->GetGUID();
break;
- case CREATURE_UROM:
- uiUrom = creature->GetGUID();
+ case NPC_UROM:
+ uromGUID = creature->GetGUID();
break;
- case CREATURE_EREGOS:
- uiEregos = creature->GetGUID();
+ case NPC_EREGOS:
+ eregosGUIDs = creature->GetGUID();
+ break;
+ case NPC_AZURE_RING_GUARDIAN:
+ azureDragonsList.push_back(creature->GetGUID());
break;
}
}
@@ -85,7 +117,7 @@ public:
else
go->SetGoState(GO_STATE_READY);
- GameObjectList.push_back(go->GetGUID());
+ gameObjectList.push_back(go->GetGUID());
}
}
@@ -94,21 +126,21 @@ public:
switch(type)
{
case DATA_DRAKOS_EVENT:
- m_auiEncounter[0] = data;
+ encounter[0] = data;
if (data == DONE)
OpenCageDoors();
break;
case DATA_VAROS_EVENT:
- m_auiEncounter[1] = data;
+ encounter[1] = data;
break;
case DATA_UROM_EVENT:
- m_auiEncounter[2] = data;
+ encounter[2] = data;
break;
case DATA_EREGOS_EVENT:
- m_auiEncounter[3] = data;
+ encounter[3] = data;
break;
case DATA_UROM_PLATAFORM:
- uiPlataformUrom = data;
+ platformUrom = data;
break;
}
@@ -120,11 +152,11 @@ public:
{
switch(type)
{
- case DATA_DRAKOS_EVENT: return m_auiEncounter[0];
- case DATA_VAROS_EVENT: return m_auiEncounter[1];
- case DATA_UROM_EVENT: return m_auiEncounter[2];
- case DATA_EREGOS_EVENT: return m_auiEncounter[3];
- case DATA_UROM_PLATAFORM: return uiPlataformUrom;
+ case DATA_DRAKOS_EVENT: return encounter[0];
+ case DATA_VAROS_EVENT: return encounter[1];
+ case DATA_UROM_EVENT: return encounter[2];
+ case DATA_EREGOS_EVENT: return encounter[3];
+ case DATA_UROM_PLATAFORM: return platformUrom;
}
return 0;
@@ -134,10 +166,10 @@ public:
{
switch(identifier)
{
- case DATA_DRAKOS: return uiDrakos;
- case DATA_VAROS: return uiVaros;
- case DATA_UROM: return uiUrom;
- case DATA_EREGOS: return uiEregos;
+ case DATA_DRAKOS: return drakosGUID;
+ case DATA_VAROS: return varosGUID;
+ case DATA_UROM: return uromGUID;
+ case DATA_EREGOS: return eregosGUIDs;
}
return 0;
@@ -145,10 +177,10 @@ public:
void OpenCageDoors()
{
- if (GameObjectList.empty())
+ if (gameObjectList.empty())
return;
- for (std::list<uint64>::const_iterator itr = GameObjectList.begin(); itr != GameObjectList.end(); ++itr)
+ for (std::list<uint64>::const_iterator itr = gameObjectList.begin(); itr != gameObjectList.end(); ++itr)
{
if (GameObject* go = instance->GetGameObject(*itr))
go->SetGoState(GO_STATE_ACTIVE);
@@ -160,7 +192,7 @@ public:
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
- saveStream << "T O " << m_auiEncounter[0] << " " << m_auiEncounter[1] << " " << m_auiEncounter[2] << " " << m_auiEncounter[3];
+ saveStream << "T O " << encounter[0] << " " << encounter[1] << " " << encounter[2] << " " << encounter[3];
str_data = saveStream.str();
@@ -186,19 +218,32 @@ public:
if (dataHead1 == 'T' && dataHead2 == 'O')
{
- m_auiEncounter[0] = data0;
- m_auiEncounter[1] = data1;
- m_auiEncounter[2] = data2;
- m_auiEncounter[3] = data3;
+ encounter[0] = data0;
+ encounter[1] = data1;
+ encounter[2] = data2;
+ encounter[3] = data3;
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
- if (m_auiEncounter[i] == IN_PROGRESS)
- m_auiEncounter[i] = NOT_STARTED;
+ if (encounter[i] == IN_PROGRESS)
+ encounter[i] = NOT_STARTED;
} else OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
+ private:
+ uint64 drakosGUID;
+ uint64 varosGUID;
+ uint64 uromGUID;
+ uint64 eregosGUIDs;
+
+ uint8 platformUrom;
+
+ uint16 encounter[MAX_ENCOUNTER];
+ std::string str_data;
+
+ std::list<uint64> gameObjectList;
+ std::list<uint64> azureDragonsList;
};
};
diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
index f78aab898d5..be942292c45 100644
--- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
+++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h
@@ -37,15 +37,27 @@ enum Data64
enum Bosses
{
- CREATURE_DRAKOS = 27654,
- CREATURE_VAROS = 27447,
- CREATURE_UROM = 27655,
- CREATURE_EREGOS = 27656
-};
+ NPC_DRAKOS = 27654,
+ NPC_VAROS = 27447,
+ NPC_UROM = 27655,
+ NPC_EREGOS = 27656,
+ NPC_AZURE_RING_GUARDIAN = 27638
+};
+
enum GameObjects
{
GO_DRAGON_CAGE_DOOR = 193995
};
+enum SpellEvents
+{
+ EVENT_CALL_DRAGON = 12229
+};
+
+enum CreatureActions
+{
+ ACTION_CALL_DRAGON_EVENT = 1
+};
+
#endif