diff options
-rw-r--r-- | sql/scripts/world_scripts_full.sql | 4 | ||||
-rw-r--r-- | sql/updates/2011_01_20_0_world_scriptname.sql | 5 | ||||
-rwxr-xr-x | src/server/game/Scripting/ScriptLoader.cpp | 2 | ||||
-rw-r--r-- | src/server/scripts/Northrend/Nexus/Oculus/boss_varos.cpp | 241 | ||||
-rw-r--r-- | src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp | 131 | ||||
-rw-r--r-- | src/server/scripts/Northrend/Nexus/Oculus/oculus.h | 22 |
6 files changed, 317 insertions, 88 deletions
diff --git a/sql/scripts/world_scripts_full.sql b/sql/scripts/world_scripts_full.sql index 4c7b081d67e..35f168b97f3 100644 --- a/sql/scripts/world_scripts_full.sql +++ b/sql/scripts/world_scripts_full.sql @@ -1046,6 +1046,8 @@ UPDATE `creature_template` SET `ScriptName`='boss_drakos' WHERE `entry`=27654; UPDATE `creature_template` SET `ScriptName`='npc_unstable_sphere' WHERE `entry`=28166; UPDATE `creature_template` SET `ScriptName`='npc_oculus_drake' WHERE `entry` IN (27657,27658,27659); UPDATE `creature_template` SET `ScriptName`='boss_urom' WHERE `entry`=27655; +UPDATE `creature_template` SET `ScriptName`='boss_varos' WHERE `entry`=27447; +UPDATE `creature_template` SET `ScriptName`='npc_azure_ring_captain' WHERE `entry`=27638; /* OBSIDIAN SANCTUM */ UPDATE `instance_template` SET `script`='instance_obsidian_sanctum' WHERE `map`=615; @@ -1958,6 +1960,8 @@ INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES ( 66630, 'spell_gen_gunship_portal'), ( 66637, 'spell_gen_gunship_portal'), ( 66656, 'spell_gen_parachute_ic'), +-- Oculus +( 50053, 'spell_varos_centrifuge_shield'), -- Trial of Crusader ( 66118, 'spell_gen_leeching_swarm'), ( 67630, 'spell_gen_leeching_swarm'), diff --git a/sql/updates/2011_01_20_0_world_scriptname.sql b/sql/updates/2011_01_20_0_world_scriptname.sql new file mode 100644 index 00000000000..14e187a2a63 --- /dev/null +++ b/sql/updates/2011_01_20_0_world_scriptname.sql @@ -0,0 +1,5 @@ +UPDATE `creature_template` SET `ScriptName`='boss_varos' WHERE `entry`=27447; +UPDATE `creature_template` SET `ScriptName`='npc_azure_ring_captain' WHERE `entry`=27638; + +DELETE FROM `spell_script_names` WHERE `spell_id`=50053; +INSERT INTO `spell_script_names` (spell_id,ScriptName) VALUES (50053,'spell_varos_centrifuge_shield'); 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 |