diff options
author | Malcrom <malcromdev@gmail.com> | 2013-01-12 19:35:14 -0330 |
---|---|---|
committer | Malcrom <malcromdev@gmail.com> | 2013-01-12 19:35:14 -0330 |
commit | df2e54f587ce350bdd3e349a82b694649edd2dc3 (patch) | |
tree | 0134bd5354fe4097494a60e1abb5990af1239765 | |
parent | 26aeed3744acace54b404754e7b9c902c9ef4572 (diff) |
Core/Scripting: More cleanup to Mechanar scripts. Added missing doors and handling to instance.
8 files changed, 151 insertions, 90 deletions
diff --git a/sql/updates/world/2013_01_12_03_world_gameobject.sql b/sql/updates/world/2013_01_12_03_world_gameobject.sql new file mode 100644 index 00000000000..a7a914fceec --- /dev/null +++ b/sql/updates/world/2013_01_12_03_world_gameobject.sql @@ -0,0 +1,7 @@ +-- Add missing doors to mechanar +SET @GUID := 6032; +DELETE FROM `gameobject` WHERE `guid` BETWEEN @GUID AND @GUID+2; +INSERT INTO `gameobject` (`guid`,`id`,`map`,`spawnMask`,`phaseMask`,`position_x`,`position_y`,`position_z`,`orientation`,`rotation0`,`rotation1`,`rotation2`,`rotation3`,`spawntimesecs`,`animprogress`,`state`) VALUES +(@GUID,184632,554,3,1,236.4597,52.36356,1.653544,3.141593,0,0,-1,0,120,0,1), +(@GUID+1,184322,554,3,1,242.874,52.314810,1.596334,3.141593,0,0,-1,0,120,0,1), +(@GUID+2,184449,554,3,1,267.9281,52.31481,27.04254,3.141593,0,0,-1,0,120,0,1); diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 479979f177f..3e30e95639f 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -590,6 +590,7 @@ void AddSC_boss_high_astromancer_solarian(); void AddSC_instance_the_eye(); void AddSC_the_eye(); void AddSC_boss_gatewatcher_iron_hand(); //TK The Mechanar +void AddSC_boss_gatewatcher_gyrokill(); void AddSC_boss_nethermancer_sepethrea(); void AddSC_boss_pathaleon_the_calculator(); void AddSC_boss_mechano_lord_capacitus(); @@ -1073,6 +1074,7 @@ void AddOutlandScripts() AddSC_instance_the_eye(); AddSC_the_eye(); AddSC_boss_gatewatcher_iron_hand(); //TK The Mechanar + AddSC_boss_gatewatcher_gyrokill(); AddSC_boss_nethermancer_sepethrea(); AddSC_boss_pathaleon_the_calculator(); AddSC_boss_mechano_lord_capacitus(); diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp index 00cce1ecebc..22aff78f441 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_gyrokill.cpp @@ -52,7 +52,7 @@ enum Events class boss_gatewatcher_gyrokill : public CreatureScript { - public: boss_gatewatcher_gyrokill() : CreatureScript("boss_gatewatcher_gyrokill") { } + public: boss_gatewatcher_gyrokill() : CreatureScript("boss_gatewatcher_gyrokill") {} struct boss_gatewatcher_gyrokillAI : public BossAI { @@ -62,6 +62,8 @@ class boss_gatewatcher_gyrokill : public CreatureScript { _JustDied(); Talk(SAY_DEATH); + if (GameObject* door = me->GetMap()->GetGameObject(instance->GetData64(GO_DOOR_MOARG_2))) + door->SetGoState(GO_STATE_ACTIVE); } void EnterCombat(Unit* /*who*/) diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp index 09ff6cf8e49..c613b3a67bb 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_gatewatcher_ironhand.cpp @@ -25,8 +25,9 @@ EndScriptData */ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "mechanar.h" -enum eSays +enum Says { SAY_AGGRO = 0, SAY_HAMMER = 1, @@ -35,106 +36,91 @@ enum eSays EMOTE_HAMMER = 4 }; -enum eSpells +enum Spells { - // Spells to be casted SPELL_SHADOW_POWER = 35322, H_SPELL_SHADOW_POWER = 39193, SPELL_HAMMER_PUNCH = 35326, SPELL_JACKHAMMER = 35327, H_SPELL_JACKHAMMER = 39194, - SPELL_STREAM_OF_MACHINE_FLUID = 35311, + SPELL_STREAM_OF_MACHINE_FLUID = 35311 +}; + +enum Events +{ + EVENT_STREAM_OF_MACHINE_FLUID = 0, + EVENT_JACKHAMMER = 1, + EVENT_SHADOW_POWER = 2 }; class boss_gatewatcher_iron_hand : public CreatureScript { - public: + public: boss_gatewatcher_iron_hand(): CreatureScript("boss_gatewatcher_iron_hand") {} - boss_gatewatcher_iron_hand() - : CreatureScript("boss_gatewatcher_iron_hand") + struct boss_gatewatcher_iron_handAI : public BossAI { - } - // Gatewatcher Iron-Hand AI - struct boss_gatewatcher_iron_handAI : public ScriptedAI - { - boss_gatewatcher_iron_handAI(Creature* creature) : ScriptedAI(creature) - { - } - - uint32 Shadow_Power_Timer; - uint32 Jackhammer_Timer; - uint32 Stream_of_Machine_Fluid_Timer; - - void Reset() - { - Shadow_Power_Timer = 25000; - Jackhammer_Timer = 45000; - Stream_of_Machine_Fluid_Timer = 55000; + boss_gatewatcher_iron_handAI(Creature* creature) : BossAI(creature, DATA_GATEWATCHER_IRON_HAND) {} - } - void EnterCombat(Unit* /*who*/) - { - Talk(SAY_AGGRO); - } - - void KilledUnit(Unit* /*victim*/) - { - if (rand()%2) - return; + void EnterCombat(Unit* /*who*/) + { + _EnterCombat(); + events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, 55000); + events.ScheduleEvent(EVENT_JACKHAMMER, 45000); + events.ScheduleEvent(EVENT_SHADOW_POWER, 25000); + Talk(SAY_AGGRO); + } + void KilledUnit(Unit* /*victim*/) + { + if (roll_chance_i(50)) Talk(SAY_SLAY); - } - - void JustDied(Unit* /*killer*/) - { - Talk(SAY_DEATH); - //TODO: Add door check/open code - } - - void UpdateAI(const uint32 diff) - { - //Return since we have no target - if (!UpdateVictim()) - return; - - //Shadow Power - if (Shadow_Power_Timer <= diff) - { - DoCast(me, SPELL_SHADOW_POWER); - Shadow_Power_Timer = urand(20000, 28000); - } - else - Shadow_Power_Timer -= diff; + } - //Jack Hammer - if (Jackhammer_Timer <= diff) - { - //TODO: expect cast this about 5 times in a row (?), announce it by emote only once - Talk(EMOTE_HAMMER); - DoCast(me->getVictim(), SPELL_JACKHAMMER); + void JustDied(Unit* /*killer*/) + { + _JustDied(); + Talk(SAY_DEATH); + if (GameObject* door = me->GetMap()->GetGameObject(instance->GetData64(GO_DOOR_MOARG_1))) + door->SetGoState(GO_STATE_ACTIVE); + } - //chance to yell, but not same time as emote (after spell in fact casted) - if (rand()%2) - return; + void UpdateAI(uint32 const diff) + { + if (!UpdateVictim()) + return; - Talk(SAY_HAMMER); - Jackhammer_Timer = 30000; - } - else - Jackhammer_Timer -= diff; + events.Update(diff); - //Stream of Machine Fluid - if (Stream_of_Machine_Fluid_Timer <= diff) + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) { - DoCast(me->getVictim(), SPELL_STREAM_OF_MACHINE_FLUID); - Stream_of_Machine_Fluid_Timer = urand(35000, 50000); + case EVENT_STREAM_OF_MACHINE_FLUID: + DoCastVictim(SPELL_STREAM_OF_MACHINE_FLUID, true); + events.ScheduleEvent(EVENT_STREAM_OF_MACHINE_FLUID, urand(35000, 50000)); + break; + case EVENT_JACKHAMMER: + Talk(EMOTE_HAMMER); + //TODO: expect cast this about 5 times in a row (?), announce it by emote only once + DoCastVictim(SPELL_JACKHAMMER, true); + if (roll_chance_i(50)) + Talk(SAY_HAMMER); + events.ScheduleEvent(EVENT_JACKHAMMER, 30000); + break; + case EVENT_SHADOW_POWER: + DoCast(me, SPELL_SHADOW_POWER); + events.ScheduleEvent(EVENT_SHADOW_POWER, urand(20000, 28000)); + break; + default: + break; } - else - Stream_of_Machine_Fluid_Timer -= diff; - - DoMeleeAttackIfReady(); } - }; + + DoMeleeAttackIfReady(); + } + }; CreatureAI* GetAI(Creature* creature) const { diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp index f8c44471b30..e71be639999 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_mechano_lord_capacitus.cpp @@ -29,13 +29,12 @@ enum Spells SPELL_POSITIVE_CHARGE = 39090, SPELL_NEGATIVE_POLARITY = 39091, SPELL_NEGATIVE_CHARGE_STACK = 39092, - SPELL_NEGATIVE_CHARGE = 39093, + SPELL_NEGATIVE_CHARGE = 39093 }; class spell_capacitus_polarity_charge : public SpellScriptLoader { - public: - spell_capacitus_polarity_charge() : SpellScriptLoader("spell_capacitus_polarity_charge") { } + public: spell_capacitus_polarity_charge() : SpellScriptLoader("spell_capacitus_polarity_charge") { } class spell_capacitus_polarity_charge_SpellScript : public SpellScript { diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp index 0b2370e1b17..fcf32e5c341 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/boss_nethermancer_sepethrea.cpp @@ -89,6 +89,8 @@ class boss_nethermancer_sepethrea : public CreatureScript { _JustDied(); Talk(SAY_DEATH); + if (GameObject* door = me->GetMap()->GetGameObject(instance->GetData64(GO_DOOR_NETHERMANCER))) + door->SetGoState(GO_STATE_ACTIVE); } void UpdateAI(uint32 const diff) diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp index 250959a1468..66424fb9e10 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/instance_mechanar.cpp @@ -31,11 +31,67 @@ class instance_mechanar : public InstanceMapScript { public: instance_mechanar(): InstanceMapScript("instance_mechanar", 554) { } + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_mechanar_InstanceMapScript(map); + } + struct instance_mechanar_InstanceMapScript : public InstanceScript { instance_mechanar_InstanceMapScript(Map* map) : InstanceScript(map) { SetBossNumber(EncounterCount); + DoorMoArg1GUID = 0; + DoorMoArg2GUID = 0; + DoorNethermancerGUID = 0; + } + + void OnGameObjectCreate(GameObject* go) + { + switch (go->GetEntry()) + { + case GO_DOOR_MOARG_1: + DoorMoArg1GUID = go->GetGUID(); + break; + case GO_DOOR_MOARG_2: + DoorMoArg2GUID = go->GetGUID(); + break; + case GO_DOOR_NETHERMANCER: + DoorNethermancerGUID = go->GetGUID(); + break; + default: + break; + } + CheckInstanceStatus(); + } + + void CheckInstanceStatus() + { + if (GetBossState(DATA_GATEWATCHER_IRON_HAND) == DONE) + HandleGameObject(DoorMoArg1GUID, true); + + if (GetBossState(DATA_GATEWATCHER_GYROKILL) == DONE) + HandleGameObject(DoorMoArg2GUID, true); + + if (GetBossState(DATA_NETHERMANCER_SEPRETHREA) == DONE) + HandleGameObject(DoorNethermancerGUID, true); + } + + uint64 GetData64(uint32 type) const + { + switch (type) + { + case GO_DOOR_MOARG_1: + return DoorMoArg1GUID; + case GO_DOOR_MOARG_2: + return DoorMoArg2GUID; + case GO_DOOR_NETHERMANCER: + return DoorNethermancerGUID; + default: + break; + } + + return 0; } bool SetBossState(uint32 type, EncounterState state) @@ -46,7 +102,7 @@ class instance_mechanar : public InstanceMapScript switch (type) { case DATA_GATEWATCHER_GYROKILL: - case DATA_IRON_HAND: + case DATA_GATEWATCHER_IRON_HAND: case DATA_MECHANOLORD_CAPACITUS: case DATA_NETHERMANCER_SEPRETHREA: case DATA_PATHALEON_THE_CALCULATOR: @@ -100,12 +156,12 @@ class instance_mechanar : public InstanceMapScript OUT_LOAD_INST_DATA_COMPLETE; } - }; - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_mechanar_InstanceMapScript(map); - } + protected: + uint64 DoorMoArg1GUID; + uint64 DoorMoArg2GUID; + uint64 DoorNethermancerGUID; + }; }; void AddSC_instance_mechanar() diff --git a/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h b/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h index b1c7cf8e25c..0d3a4ea241d 100644 --- a/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h +++ b/src/server/scripts/Outland/TempestKeep/Mechanar/mechanar.h @@ -23,10 +23,17 @@ uint32 const EncounterCount = 5; enum DataTypes { DATA_GATEWATCHER_GYROKILL = 0, - DATA_IRON_HAND = 1, + DATA_GATEWATCHER_IRON_HAND = 1, DATA_MECHANOLORD_CAPACITUS = 2, DATA_NETHERMANCER_SEPRETHREA = 3, DATA_PATHALEON_THE_CALCULATOR = 4 }; +enum GameobjectIds +{ + GO_DOOR_MOARG_1 = 184632, + GO_DOOR_MOARG_2 = 184322, + GO_DOOR_NETHERMANCER = 184449 +}; + #endif |