diff options
author | Vincent-Michael <Vincent_Michael@gmx.de> | 2013-08-10 16:35:06 +0200 |
---|---|---|
committer | Vincent-Michael <Vincent_Michael@gmx.de> | 2013-08-10 16:35:06 +0200 |
commit | ba6e62fd6ec00dcd03ae1fa5332a8499ec139ca0 (patch) | |
tree | 47458f66ee00c0524e3fa8351109410aaa0d0d46 /src | |
parent | 0e7585770232b91e54837e775705264edd9d222e (diff) |
Scripted/BaradinHold: Implemented Pit Lord Argaloth
Note: Need some update with sniff
Diffstat (limited to 'src')
6 files changed, 374 insertions, 161 deletions
diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index d55ada7d090..b11ece9307d 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -102,6 +102,7 @@ void AddSC_boss_drekthar(); void AddSC_boss_galvangar(); void AddSC_boss_vanndar(); void AddSC_boss_alizabal(); //Baradin Hold +void AddSC_boss_pit_lord_argaloth(); void AddSC_instance_baradin_hold(); void AddSC_blackrock_depths(); //Blackrock Depths void AddSC_boss_ambassador_flamelash(); @@ -760,6 +761,7 @@ void AddEasternKingdomsScripts() AddSC_boss_galvangar(); AddSC_boss_vanndar(); AddSC_boss_alizabal(); //Baradin Hold + AddSC_boss_pit_lord_argaloth(); AddSC_instance_baradin_hold(); AddSC_blackrock_depths(); //Blackrock Depths AddSC_boss_ambassador_flamelash(); diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h b/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h index 77554d29d15..bbd26b91d70 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h +++ b/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h @@ -18,9 +18,18 @@ #ifndef DEF_BARADIN_HOLD_H_ #define DEF_BARADIN_HOLD_H_ -#define MAX_ENCOUNTERS 3 +#define BHScriptName "instance_baradin_hold" -enum Creatures +uint32 const EncounterCount = 3; + +enum DataTypes +{ + DATA_ARGALOTH = 0, + DATA_OCCUTHAR = 1, + DATA_ALIZABAL = 2 +}; + +enum CreatureIds { BOSS_ARGALOTH = 47120, BOSS_OCCUTHAR = 52363, @@ -28,20 +37,23 @@ enum Creatures NPC_EYE_OF_OCCUTHAR = 52389, NPC_FOCUS_FIRE_DUMMY = 52369, - NPC_OCCUTHAR_EYE = 52368, + NPC_OCCUTHAR_EYE = 52368 }; -enum Objects +enum GameObjectIds { - GO_ARGALOTH_DOOR = 207619, - GO_OCCUTHAR_DOOR = 208953, + GO_ARGALOTH_DOOR = 207619, + GO_OCCUTHAR_DOOR = 208953 }; -enum Data +template<class AI> +CreatureAI* GetBaradinHoldAI(Creature* creature) { - DATA_ARGALOTH = 1, - DATA_OCCUTHAR = 2, - DATA_ALIZABAL = 3, -}; + if (InstanceMap* instance = creature->GetMap()->ToInstanceMap()) + if (instance->GetInstanceScript()) + if (instance->GetScriptId() == sObjectMgr->GetScriptId(BHScriptName)) + return new AI(creature); + return NULL; +} #endif diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp index 01104a47f30..c2b78b4827e 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp @@ -15,23 +15,22 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "baradin_hold.h" -#include "InstanceScript.h" #include "ScriptMgr.h" +#include "ScriptedCreature.h" #include "Player.h" #include "ObjectAccessor.h" -#include "ScriptedCreature.h" +#include "baradin_hold.h" enum Texts { - SAY_INTRO = 1, - SAY_AGGRO = 2, - SAY_HATE = 3, - SAY_SKEWER = 4, - SAY_SKEWER_ANNOUNCE = 5, - SAY_BLADE_STORM = 6, - SAY_SLAY = 10, - SAY_DEATH = 12, + SAY_INTRO = 1, + SAY_AGGRO = 2, + SAY_HATE = 3, + SAY_SKEWER = 4, + SAY_SKEWER_ANNOUNCE = 5, + SAY_BLADE_STORM = 6, + SAY_SLAY = 10, + SAY_DEATH = 12 }; enum Spells @@ -40,25 +39,25 @@ enum Spells SPELL_BLADE_DANCE_DUMMY = 105828, SPELL_SEETHING_HATE = 105067, SPELL_SKEWER = 104936, - SPELL_BERSERK = 47008, + SPELL_BERSERK = 47008 }; enum Actions { - ACTION_INTRO = 1, + ACTION_INTRO = 1 }; -enum Points + enum Points { - POINT_STORM = 1, + POINT_STORM = 1 }; enum Events { - EVENT_RANDOM_CAST = 1, - EVENT_STOP_STORM = 2, - EVENT_MOVE_STORM = 3, - EVENT_CAST_STORM = 4, + EVENT_RANDOM_CAST = 1, + EVENT_STOP_STORM = 2, + EVENT_MOVE_STORM = 3, + EVENT_CAST_STORM = 4 }; class at_alizabal_intro : public AreaTriggerScript @@ -84,20 +83,14 @@ class boss_alizabal : public CreatureScript { boss_alizabalAI(Creature* creature) : BossAI(creature, DATA_ALIZABAL) { - Intro = false; - Hate = false; - Skewer = false; + _intro = false; } - bool Intro; - bool Hate; - bool Skewer; - void Reset() OVERRIDE { _Reset(); - Hate = false; - Skewer = false; + _hate = false; + _skewer = false; } void EnterCombat(Unit* /*who*/) OVERRIDE @@ -133,10 +126,10 @@ class boss_alizabal : public CreatureScript switch (action) { case ACTION_INTRO: - if (!Intro) + if (!_intro) { Talk(SAY_INTRO); - Intro = true; + _intro = true; } break; } @@ -167,7 +160,7 @@ class boss_alizabal : public CreatureScript switch (urand(0, 1)) { case 0: - if (!Skewer) + if (!_skewer) { if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0)) { @@ -175,20 +168,20 @@ class boss_alizabal : public CreatureScript Talk(SAY_SKEWER); Talk(SAY_SKEWER_ANNOUNCE, target->GetGUID()); } - Skewer = true; + _skewer = true; events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); } - else if (!Hate) + else if (!_hate) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) { DoCast(target, SPELL_SEETHING_HATE, true); Talk(SAY_HATE); } - Hate = true; + _hate = true; events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); } - else if (Hate && Skewer) + else if (_hate && _skewer) { Talk(SAY_BLADE_STORM); DoCastAOE(SPELL_BLADE_DANCE_DUMMY); @@ -199,17 +192,17 @@ class boss_alizabal : public CreatureScript } break; case 1: - if (!Hate) + if (!_hate) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) { DoCast(target, SPELL_SEETHING_HATE, true); Talk(SAY_HATE); } - Hate = true; + _hate = true; events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); } - else if (!Skewer) + else if (!_skewer) { if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0)) { @@ -217,10 +210,10 @@ class boss_alizabal : public CreatureScript Talk(SAY_SKEWER); Talk(SAY_SKEWER_ANNOUNCE, target->GetGUID()); } - Skewer = true; + _skewer = true; events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); } - else if (Hate && Skewer) + else if (_hate && _skewer) { Talk(SAY_BLADE_STORM); DoCastAOE(SPELL_BLADE_DANCE_DUMMY); @@ -245,8 +238,8 @@ class boss_alizabal : public CreatureScript me->SetSpeed(MOVE_WALK, 1.0f); me->SetSpeed(MOVE_RUN, 1.14f); me->GetMotionMaster()->MoveChase(me->GetVictim()); - Hate = false; - Skewer = false; + _hate = false; + _skewer = false; break; case EVENT_CAST_STORM: DoCastAOE(SPELL_BLADE_DANCE); @@ -256,11 +249,17 @@ class boss_alizabal : public CreatureScript DoMeleeAttackIfReady(); } + + private: + bool _intro; + bool _hate; + bool _skewer; + }; CreatureAI* GetAI(Creature* creature) const OVERRIDE { - return new boss_alizabalAI(creature); + return GetBaradinHoldAI<boss_alizabalAI>(creature); } }; diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp new file mode 100644 index 00000000000..743d7715bf1 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp @@ -0,0 +1,200 @@ +/* +* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "baradin_hold.h" + +/* TODO: +- Fel Firestorm need completion +- Need Correct timer +*/ + +enum Spells +{ + SPELL_METEOR_SLASH = 88942, + SPELL_CONSUMING_DARKNESS = 88954, + SPELL_FEL_FIRESTORM = 88972, + SPELL_BERSEKER = 47008 +}; + +enum Events +{ + EVENT_METEOR_SLASH = 1, + EVENT_CONSUMING_DARKNESS = 2, + EVENT_BERSEKER = 3 +}; + +class boss_pit_lord_argaloth : public CreatureScript +{ + public: + boss_pit_lord_argaloth() : CreatureScript("boss_pit_lord_argaloth") { } + + struct boss_pit_lord_argalothAI : public BossAI + { + boss_pit_lord_argalothAI(Creature* creature) : BossAI(creature, DATA_ARGALOTH) { } + + void EnterCombat(Unit* /*who*/) OVERRIDE + { + _EnterCombat(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + events.ScheduleEvent(EVENT_METEOR_SLASH, urand(10 * IN_MILLISECONDS, 20 * IN_MILLISECONDS)); + events.ScheduleEvent(EVENT_CONSUMING_DARKNESS, urand(20 * IN_MILLISECONDS, 25 * IN_MILLISECONDS)); + events.ScheduleEvent(SPELL_BERSEKER, 5 * MINUTE * IN_MILLISECONDS); + } + + void EnterEvadeMode() OVERRIDE + { + me->GetMotionMaster()->MoveTargetedHome(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + _DespawnAtEvade(); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) OVERRIDE + { + if (me->HealthBelowPctDamaged(33, damage) || + me->HealthBelowPctDamaged(66, damage)) + { + DoCastAOE(SPELL_FEL_FIRESTORM); + } + } + + void JustDied(Unit* /*killer*/) OVERRIDE + { + _JustDied(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + } + + void UpdateAI(uint32 diff) OVERRIDE + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_METEOR_SLASH: + DoCastAOE(SPELL_METEOR_SLASH); + events.ScheduleEvent(EVENT_METEOR_SLASH, urand(15 * IN_MILLISECONDS, 20 * IN_MILLISECONDS)); + break; + case EVENT_CONSUMING_DARKNESS: + DoCastAOE(SPELL_CONSUMING_DARKNESS, true); + events.ScheduleEvent(EVENT_CONSUMING_DARKNESS, urand(20 * IN_MILLISECONDS, 25 * IN_MILLISECONDS)); + break; + case SPELL_BERSEKER: + DoCast(me, EVENT_BERSEKER, true); + break; + default: + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const OVERRIDE + { + return GetBaradinHoldAI<boss_pit_lord_argalothAI>(creature); + } +}; + +// 88954 / 95173 - Consuming Darkness +class spell_argaloth_consuming_darkness : public SpellScriptLoader +{ + public: + spell_argaloth_consuming_darkness() : SpellScriptLoader("spell_argaloth_consuming_darkness") { } + + class spell_argaloth_consuming_darkness_SpellScript : public SpellScript + { + PrepareSpellScript(spell_argaloth_consuming_darkness_SpellScript); + + void FilterTargets(std::list<WorldObject*>& targets) + { + Trinity::Containers::RandomResizeList(targets, GetCaster()->GetMap()->Is25ManRaid() ? 8 : 3); + } + + void Register() OVERRIDE + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_argaloth_consuming_darkness_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + } + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_argaloth_consuming_darkness_SpellScript(); + } +}; + +// 88942 / 95172 - Meteor Slash +class spell_argaloth_meteor_slash : public SpellScriptLoader +{ + public: + spell_argaloth_meteor_slash() : SpellScriptLoader("spell_argaloth_meteor_slash") { } + + class spell_argaloth_meteor_slash_SpellScript : public SpellScript + { + PrepareSpellScript(spell_argaloth_meteor_slash_SpellScript); + + bool Load() OVERRIDE + { + _targetCount = 0; + return true; + } + + void CountTargets(std::list<WorldObject*>& targets) + { + _targetCount = targets.size(); + } + + void SplitDamage() + { + if (!_targetCount) + return; + + SetHitDamage(GetHitDamage() / _targetCount); + } + + void Register() OVERRIDE + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_argaloth_meteor_slash_SpellScript::CountTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + OnHit += SpellHitFn(spell_argaloth_meteor_slash_SpellScript::SplitDamage); + } + + private: + uint32 _targetCount; + }; + + SpellScript* GetSpellScript() const OVERRIDE + { + return new spell_argaloth_meteor_slash_SpellScript(); + } +}; + +void AddSC_boss_pit_lord_argaloth() +{ + new boss_pit_lord_argaloth(); + new spell_argaloth_consuming_darkness(); + new spell_argaloth_meteor_slash(); +} diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp index 0e2b7107548..0a8ca897459 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp @@ -27,142 +27,141 @@ DoorData const doorData[] = class instance_baradin_hold: public InstanceMapScript { -public: - instance_baradin_hold() : InstanceMapScript("instance_baradin_hold", 757) { } + public: + instance_baradin_hold() : InstanceMapScript(BHScriptName, 757) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const - { - return new instance_baradin_hold_InstanceMapScript(map); - } - - struct instance_baradin_hold_InstanceMapScript: public InstanceScript - { - instance_baradin_hold_InstanceMapScript(InstanceMap* map) : InstanceScript(map) - { - SetBossNumber(MAX_ENCOUNTERS); - LoadDoorData(doorData); - _argalothGUID = 0; - _occutharGUID = 0; - _alizabalGUID = 0; - _argalothDoor = 0; - _occutharDoor = 0; - } - - void Initialize() - { - } - - void OnCreatureCreate(Creature* creature) + struct instance_baradin_hold_InstanceMapScript: public InstanceScript { - switch(creature->GetEntry()) + instance_baradin_hold_InstanceMapScript(InstanceMap* map) : InstanceScript(map) { - case BOSS_ARGALOTH: - _argalothGUID = creature->GetGUID(); - break; - case BOSS_OCCUTHAR: - _occutharGUID = creature->GetGUID(); - break; - case BOSS_ALIZABAL: - _alizabalGUID = creature->GetGUID(); - break; + SetBossNumber(EncounterCount); + LoadDoorData(doorData); + + ArgalothGUID = 0; + OccutharGUID = 0; + AlizabalGUID = 0; + ArgalothDoor = 0; + OccutharDoor = 0; } - } - void OnGameObjectCreate(GameObject* go) - { - switch(go->GetEntry()) + void OnCreatureCreate(Creature* creature) { - case GO_ARGALOTH_DOOR: - _argalothDoor = go->GetGUID(); - AddDoor(go, true); - break; - case GO_OCCUTHAR_DOOR: - _occutharDoor = go->GetGUID(); - AddDoor(go, true); - break; + switch(creature->GetEntry()) + { + case BOSS_ARGALOTH: + ArgalothGUID = creature->GetGUID(); + break; + case BOSS_OCCUTHAR: + OccutharGUID = creature->GetGUID(); + break; + case BOSS_ALIZABAL: + AlizabalGUID = creature->GetGUID(); + break; + } } - } - uint64 GetData64(uint32 data) const - { - switch (data) + void OnGameObjectCreate(GameObject* go) { - case DATA_ARGALOTH: - return _argalothGUID; - case DATA_OCCUTHAR: - return _occutharGUID; - case DATA_ALIZABAL: - return _alizabalGUID; - default: - break; + switch(go->GetEntry()) + { + case GO_ARGALOTH_DOOR: + ArgalothDoor = go->GetGUID(); + AddDoor(go, true); + break; + case GO_OCCUTHAR_DOOR: + OccutharDoor = go->GetGUID(); + AddDoor(go, true); + break; + } } - return 0; - } + uint64 GetData64(uint32 data) const + { + switch (data) + { + case DATA_ARGALOTH: + return ArgalothGUID; + case DATA_OCCUTHAR: + return OccutharGUID; + case DATA_ALIZABAL: + return AlizabalGUID; + default: + break; + } - void OnGameObjectRemove(GameObject* go) - { - switch(go->GetEntry()) + return 0; + } + + void OnGameObjectRemove(GameObject* go) { - case GO_ARGALOTH_DOOR: - AddDoor(go, false); - break; - case GO_OCCUTHAR_DOOR: - AddDoor(go, false); - break; + switch(go->GetEntry()) + { + case GO_ARGALOTH_DOOR: + AddDoor(go, false); + break; + case GO_OCCUTHAR_DOOR: + AddDoor(go, false); + break; + } } - } - std::string GetSaveData() - { - OUT_SAVE_INST_DATA; + std::string GetSaveData() + { + OUT_SAVE_INST_DATA; - std::ostringstream saveStream; - saveStream << "B H " << GetBossSaveData(); + std::ostringstream saveStream; + saveStream << "B H " << GetBossSaveData(); - OUT_SAVE_INST_DATA_COMPLETE; - return saveStream.str(); - } + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } - void Load(const char* in) - { - if (!in) + void Load(const char* in) { - OUT_LOAD_INST_DATA_FAIL; - return; - } + if (!in) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } - OUT_LOAD_INST_DATA(in); + OUT_LOAD_INST_DATA(in); - char dataHead1, dataHead2; + char dataHead1, dataHead2; - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2; + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; - if (dataHead1 == 'B' && dataHead2 == 'H') - { - for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + if (dataHead1 == 'B' && dataHead2 == 'H') { - uint32 tmpState; - loadStream >> tmpState; - if (tmpState == IN_PROGRESS || tmpState > SPECIAL) - tmpState = NOT_STARTED; + for (uint8 i = 0; i < EncounterCount; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + + SetBossState(i, EncounterState(tmpState)); + } - SetBossState(i, EncounterState(tmpState)); } + else + OUT_LOAD_INST_DATA_FAIL; - } else OUT_LOAD_INST_DATA_FAIL; + OUT_LOAD_INST_DATA_COMPLETE; + } - OUT_LOAD_INST_DATA_COMPLETE; - } + protected: + uint64 ArgalothGUID; + uint64 OccutharGUID; + uint64 AlizabalGUID; + uint64 ArgalothDoor; + uint64 OccutharDoor; + }; - private: - uint64 _argalothGUID; - uint64 _occutharGUID; - uint64 _alizabalGUID; - uint64 _argalothDoor; - uint64 _occutharDoor; - }; + InstanceScript* GetInstanceScript(InstanceMap* map) const + { + return new instance_baradin_hold_InstanceMapScript(map); + } }; void AddSC_instance_baradin_hold() diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt index 540bbfb4deb..bf650f7c64d 100644 --- a/src/server/scripts/EasternKingdoms/CMakeLists.txt +++ b/src/server/scripts/EasternKingdoms/CMakeLists.txt @@ -18,6 +18,7 @@ set(scripts_STAT_SRCS EasternKingdoms/AlteracValley/boss_vanndar.cpp EasternKingdoms/AlteracValley/alterac_valley.cpp EasternKingdoms/BaradinHold/boss_alizabal.cpp + EasternKingdoms/BaradinHold/boss_pit_lord_argaloth.cpp EasternKingdoms/BaradinHold/instance_baradin_hold.cpp EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_high_interrogator_gerstahn.cpp EasternKingdoms/BlackrockMountain/BlackrockDepths/boss_gorosh_the_dervish.cpp |