From 93c7f975b12641f2b36230c6c1eb711c1661b861 Mon Sep 17 00:00:00 2001 From: Northstrider Date: Mon, 21 Jan 2013 23:47:17 +0100 Subject: Scripts: implement Alizabal the misstress of hate Todo: use the rest of the texts and add the missing ones --- src/server/game/Scripting/ScriptLoader.cpp | 4 + .../EasternKingdoms/BaradinHold/baradin_hold.h | 47 ++++ .../EasternKingdoms/BaradinHold/boss_alizabal.cpp | 268 +++++++++++++++++++++ .../BaradinHold/instance_baradin_hold.cpp | 169 +++++++++++++ src/server/scripts/EasternKingdoms/CMakeLists.txt | 2 + 5 files changed, 490 insertions(+) create mode 100644 src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h create mode 100644 src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp create mode 100644 src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp (limited to 'src/server') diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 633e17ff014..8cbc4b62424 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -97,6 +97,8 @@ void AddSC_boss_balinda(); void AddSC_boss_drekthar(); void AddSC_boss_galvangar(); void AddSC_boss_vanndar(); +void AddSC_boss_alizabal(); //Baradin Hold +void AddSC_instance_baradin_hold(); void AddSC_blackrock_depths(); //Blackrock Depths void AddSC_boss_ambassador_flamelash(); void AddSC_boss_anubshiah(); @@ -731,6 +733,8 @@ void AddEasternKingdomsScripts() AddSC_boss_drekthar(); AddSC_boss_galvangar(); AddSC_boss_vanndar(); + AddSC_boss_alizabal(); //Baradin Hold + AddSC_instance_baradin_hold(); AddSC_blackrock_depths(); //Blackrock Depths AddSC_boss_ambassador_flamelash(); AddSC_boss_anubshiah(); diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h b/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h new file mode 100644 index 00000000000..77554d29d15 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/BaradinHold/baradin_hold.h @@ -0,0 +1,47 @@ +/* +* Copyright (C) 2008-2013 TrinityCore +* +* 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 3 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 . +*/ + +#ifndef DEF_BARADIN_HOLD_H_ +#define DEF_BARADIN_HOLD_H_ + +#define MAX_ENCOUNTERS 3 + +enum Creatures +{ + BOSS_ARGALOTH = 47120, + BOSS_OCCUTHAR = 52363, + BOSS_ALIZABAL = 55869, + + NPC_EYE_OF_OCCUTHAR = 52389, + NPC_FOCUS_FIRE_DUMMY = 52369, + NPC_OCCUTHAR_EYE = 52368, +}; + +enum Objects +{ + GO_ARGALOTH_DOOR = 207619, + GO_OCCUTHAR_DOOR = 208953, +}; + +enum Data +{ + DATA_ARGALOTH = 1, + DATA_OCCUTHAR = 2, + DATA_ALIZABAL = 3, +}; + +#endif diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp new file mode 100644 index 00000000000..ae1c5c03bd6 --- /dev/null +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp @@ -0,0 +1,268 @@ +/* +* Copyright (C) 2008-2013 TrinityCore + * + * 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 . + */ + +#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, +}; + +enum Spells +{ + SPELL_BLADE_DANCE = 105784, + SPELL_BLADE_DANCE_DUMMY = 105828, + SPELL_SEETHING_HATE = 105067, + SPELL_SKEWER = 104936, + SPELL_BERSERK = 47008, +}; + +enum Actions +{ + ACTION_INTRO = 1, +}; + +enum Points +{ + POINT_STORM = 1, +}; + +enum Events +{ + EVENT_RANDOM_CAST = 1, + EVENT_STOP_STORM = 2, + EVENT_MOVE_STORM = 3, + EVENT_CAST_STORM = 4, +}; + +class at_alizabal_intro : public AreaTriggerScript +{ + public: + at_alizabal_intro() : AreaTriggerScript("at_alizabal_intro") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) + { + if (InstanceScript* instance = player->GetInstanceScript()) + if (Creature* Alizabal = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_ALIZABAL))) + Alizabal->AI()->DoAction(ACTION_INTRO); + return true; + } +}; + +class boss_alizabal : public CreatureScript +{ + public: + boss_alizabal() : CreatureScript("boss_alizabal") { } + + struct boss_alizabalAI : public BossAI + { + boss_alizabalAI(Creature* creature) : BossAI(creature, DATA_ALIZABAL) + { + instance = creature->GetInstanceScript(); + Intro = false; + Hate = false; + Skewer = false; + } + + InstanceScript* instance; + bool Intro; + bool Hate; + bool Skewer; + + void Reset() + { + _Reset(); + Hate = false; + Skewer = false; + } + + void EnterCombat(Unit* who) + { + _EnterCombat(); + Talk(SAY_AGGRO); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me); + events.ScheduleEvent(EVENT_RANDOM_CAST, 10000); + } + + void JustDied(Unit* killer) + { + _JustDied(); + Talk(SAY_DEATH); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + } + + void KilledUnit(Unit * who) + { + if (who->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void EnterEvadeMode() + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + me->GetMotionMaster()->MoveTargetedHome(); + _DespawnAtEvade(); + } + + void DoAction(int32 const action) + { + switch (action) + { + case ACTION_INTRO: + if (!Intro) + { + Talk(SAY_INTRO); + Intro = true; + } + break; + } + } + + void MovementInform(uint32 type, uint32 pointId) + { + switch (pointId) + { + case POINT_STORM: + events.ScheduleEvent(EVENT_CAST_STORM, 1); + break; + } + } + + void UpdateAI(uint32 const diff) + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_RANDOM_CAST: + switch (urand(0, 1)) + { + case 0: + if (!Skewer) + { + if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0)) + { + DoCast(target, SPELL_SKEWER, true); + Talk(SAY_SKEWER); + Talk(SAY_SKEWER_ANNOUNCE, target->GetGUID()); + } + Skewer = true; + events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); + } + else if (!Hate) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) + { + DoCast(target, SPELL_SEETHING_HATE, true); + Talk(SAY_HATE); + } + Hate = true; + events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); + } + else if (Hate && Skewer) + { + Talk(SAY_BLADE_STORM); + DoCastAOE(SPELL_BLADE_DANCE_DUMMY); + DoCastAOE(SPELL_BLADE_DANCE); + events.ScheduleEvent(EVENT_RANDOM_CAST, 21000); + events.ScheduleEvent(EVENT_MOVE_STORM, 4050); + events.ScheduleEvent(EVENT_STOP_STORM, 13000); + } + break; + case 1: + if (!Hate) + { + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) + { + DoCast(target, SPELL_SEETHING_HATE, true); + Talk(SAY_HATE); + } + Hate = true; + events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); + } + else if (!Skewer) + { + if (Unit* target = SelectTarget(SELECT_TARGET_TOPAGGRO, 0)) + { + DoCast(target, SPELL_SKEWER, true); + Talk(SAY_SKEWER); + Talk(SAY_SKEWER_ANNOUNCE, target->GetGUID()); + } + Skewer = true; + events.ScheduleEvent(EVENT_RANDOM_CAST, urand(7000, 10000)); + } + else if (Hate && Skewer) + { + Talk(SAY_BLADE_STORM); + DoCastAOE(SPELL_BLADE_DANCE_DUMMY); + DoCastAOE(SPELL_BLADE_DANCE); + events.ScheduleEvent(EVENT_RANDOM_CAST, 21000); + events.ScheduleEvent(EVENT_MOVE_STORM, 4050); + events.ScheduleEvent(EVENT_STOP_STORM, 13000); + } + break; + } + break; + case EVENT_MOVE_STORM: + me->SetSpeed(MOVE_RUN, 4.0f); + me->SetSpeed(MOVE_WALK, 4.0f); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, NonTankTargetSelector(me))) + me->GetMotionMaster()->MovePoint(POINT_STORM, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); + events.ScheduleEvent(EVENT_MOVE_STORM, 4050); + break; + case EVENT_STOP_STORM: + me->RemoveAura(SPELL_BLADE_DANCE); + me->RemoveAura(SPELL_BLADE_DANCE_DUMMY); + me->SetSpeed(MOVE_WALK, 1.0f); + me->SetSpeed(MOVE_RUN, 1.14f); + me->GetMotionMaster()->MoveChase(me->getVictim()); + Hate = false; + Skewer = false; + break; + case EVENT_CAST_STORM: + DoCastAOE(SPELL_BLADE_DANCE); + break; + } + } + + DoMeleeAttackIfReady(); + } + }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_alizabalAI(creature); + } +}; + +void AddSC_boss_alizabal() +{ + new boss_alizabal(); + new at_alizabal_intro(); +} diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp new file mode 100644 index 00000000000..6cc11504f2f --- /dev/null +++ b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp @@ -0,0 +1,169 @@ +/* +* Copyright (C) 2008-2013 TrinityCore +* +* 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 3 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 . +*/ + +#include"ScriptPCH.h" +#include"baradin_hold.h" + +DoorData const doorData[] = +{ + {GO_ARGALOTH_DOOR, DATA_ARGALOTH, DOOR_TYPE_ROOM, BOUNDARY_NONE}, + {GO_OCCUTHAR_DOOR, DATA_OCCUTHAR, DOOR_TYPE_ROOM, BOUNDARY_NONE}, +}; + +class instance_baradin_hold: public InstanceMapScript +{ +public: + instance_baradin_hold() : InstanceMapScript("instance_baradin_hold", 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) + { + switch(creature->GetEntry()) + { + case BOSS_ARGALOTH: + ArgalothGUID = creature->GetGUID(); + break; + case BOSS_OCCUTHAR: + OccutharGUID = creature->GetGUID(); + break; + case BOSS_ALIZABAL: + AlizabalGUID = creature->GetGUID(); + break; + } + } + + void OnGameObjectCreate(GameObject* go) + { + 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; + } + } + + uint64 GetData64(uint32 data) const + { + switch (data) + { + case DATA_ARGALOTH: + return ArgalothGUID; + case DATA_OCCUTHAR: + return OccutharGUID; + case DATA_ALIZABAL: + return AlizabalGUID; + default: + break; + } + return NULL; + } + + void OnGameObjectRemove(GameObject* go) + { + 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::ostringstream saveStream; + saveStream << "B H " << GetBossSaveData(); + + OUT_SAVE_INST_DATA_COMPLETE; + return saveStream.str(); + } + + void Load(const char* in) + { + if (!in) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + + OUT_LOAD_INST_DATA(in); + + char dataHead1, dataHead2; + + std::istringstream loadStream(in); + loadStream >> dataHead1 >> dataHead2; + + if (dataHead1 == 'B' && dataHead2 == 'H') + { + for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i) + { + uint32 tmpState; + loadStream >> tmpState; + if (tmpState == IN_PROGRESS || tmpState > SPECIAL) + tmpState = NOT_STARTED; + + SetBossState(i, EncounterState(tmpState)); + } + + } else OUT_LOAD_INST_DATA_FAIL; + + OUT_LOAD_INST_DATA_COMPLETE; + } + + private: + uint64 ArgalothGUID; + uint64 OccutharGUID; + uint64 AlizabalGUID; + uint64 ArgalothDoor; + uint64 OccutharDoor; + }; +}; + +void AddSC_instance_baradin_hold() +{ + new instance_baradin_hold(); +} diff --git a/src/server/scripts/EasternKingdoms/CMakeLists.txt b/src/server/scripts/EasternKingdoms/CMakeLists.txt index 15ead9b00f8..e782711bde2 100644 --- a/src/server/scripts/EasternKingdoms/CMakeLists.txt +++ b/src/server/scripts/EasternKingdoms/CMakeLists.txt @@ -17,6 +17,8 @@ set(scripts_STAT_SRCS EasternKingdoms/AlteracValley/boss_drekthar.cpp EasternKingdoms/AlteracValley/boss_vanndar.cpp EasternKingdoms/AlteracValley/alterac_valley.cpp + EasternKingdoms/BaradinHold/boss_alizabal.cpp + EasternKingdoms/BaradinHold/instance_baradin_hold.cpp EasternKingdoms/Scholomance/boss_the_ravenian.cpp EasternKingdoms/Scholomance/boss_instructor_malicia.cpp EasternKingdoms/Scholomance/boss_death_knight_darkreaver.cpp -- cgit v1.2.3 From 8c64ceda796565bac68a433385de531e2f14dd66 Mon Sep 17 00:00:00 2001 From: Northstrider Date: Mon, 21 Jan 2013 23:49:23 +0100 Subject: Scripts: removed a unneeded header --- src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src/server') diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp index 6cc11504f2f..0e4907a3f82 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp @@ -15,7 +15,6 @@ * with this program. If not, see . */ -#include"ScriptPCH.h" #include"baradin_hold.h" DoorData const doorData[] = -- cgit v1.2.3 From 3bf7fcef55f1ce5d89798197c2e30b9a0ef929f2 Mon Sep 17 00:00:00 2001 From: Northstrider Date: Tue, 22 Jan 2013 00:02:08 +0100 Subject: Scripts: apply some TC codestyle to instance script --- .../BaradinHold/instance_baradin_hold.cpp | 36 +++++++++++----------- 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'src/server') diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp index 0e4907a3f82..9bbfebecf2c 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/instance_baradin_hold.cpp @@ -39,11 +39,11 @@ public: { SetBossNumber(MAX_ENCOUNTERS); LoadDoorData(doorData); - ArgalothGUID = 0; - OccutharGUID = 0; - AlizabalGUID = 0; - ArgalothDoor = 0; - OccutharDoor = 0; + _argalothGUID = 0; + _occutharGUID = 0; + _alizabalGUID = 0; + _argalothDoor = 0; + _occutharDoor = 0; } void Initialize() @@ -55,13 +55,13 @@ public: switch(creature->GetEntry()) { case BOSS_ARGALOTH: - ArgalothGUID = creature->GetGUID(); + _argalothGUID = creature->GetGUID(); break; case BOSS_OCCUTHAR: - OccutharGUID = creature->GetGUID(); + _occutharGUID = creature->GetGUID(); break; case BOSS_ALIZABAL: - AlizabalGUID = creature->GetGUID(); + _alizabalGUID = creature->GetGUID(); break; } } @@ -71,11 +71,11 @@ public: switch(go->GetEntry()) { case GO_ARGALOTH_DOOR: - ArgalothDoor = go->GetGUID(); + _argalothDoor = go->GetGUID(); AddDoor(go, true); break; case GO_OCCUTHAR_DOOR: - OccutharDoor = go->GetGUID(); + _occutharDoor = go->GetGUID(); AddDoor(go, true); break; } @@ -86,11 +86,11 @@ public: switch (data) { case DATA_ARGALOTH: - return ArgalothGUID; + return _argalothGUID; case DATA_OCCUTHAR: - return OccutharGUID; + return _occutharGUID; case DATA_ALIZABAL: - return AlizabalGUID; + return _alizabalGUID; default: break; } @@ -154,11 +154,11 @@ public: } private: - uint64 ArgalothGUID; - uint64 OccutharGUID; - uint64 AlizabalGUID; - uint64 ArgalothDoor; - uint64 OccutharDoor; + uint64 _argalothGUID; + uint64 _occutharGUID; + uint64 _alizabalGUID; + uint64 _argalothDoor; + uint64 _occutharDoor; }; }; -- cgit v1.2.3 From da060b194895655370a44be6ce80406d19339eac Mon Sep 17 00:00:00 2001 From: Northstrider Date: Tue, 22 Jan 2013 00:07:36 +0100 Subject: Scripts: apply more TC codestyle --- .../scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'src/server') diff --git a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp index ae1c5c03bd6..d7441d6311b 100644 --- a/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp +++ b/src/server/scripts/EasternKingdoms/BaradinHold/boss_alizabal.cpp @@ -64,8 +64,8 @@ class at_alizabal_intro : public AreaTriggerScript bool OnTrigger(Player* player, AreaTriggerEntry const* /*areaTrigger*/) { if (InstanceScript* instance = player->GetInstanceScript()) - if (Creature* Alizabal = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_ALIZABAL))) - Alizabal->AI()->DoAction(ACTION_INTRO); + if (Creature* alizabal = ObjectAccessor::GetCreature(*player, instance->GetData64(DATA_ALIZABAL))) + alizabal->AI()->DoAction(ACTION_INTRO); return true; } }; @@ -79,13 +79,11 @@ class boss_alizabal : public CreatureScript { boss_alizabalAI(Creature* creature) : BossAI(creature, DATA_ALIZABAL) { - instance = creature->GetInstanceScript(); Intro = false; Hate = false; Skewer = false; } - InstanceScript* instance; bool Intro; bool Hate; bool Skewer; @@ -97,7 +95,7 @@ class boss_alizabal : public CreatureScript Skewer = false; } - void EnterCombat(Unit* who) + void EnterCombat(Unit* /*who*/) { _EnterCombat(); Talk(SAY_AGGRO); @@ -105,14 +103,14 @@ class boss_alizabal : public CreatureScript events.ScheduleEvent(EVENT_RANDOM_CAST, 10000); } - void JustDied(Unit* killer) + void JustDied(Unit* /*killer*/) { _JustDied(); Talk(SAY_DEATH); instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); } - void KilledUnit(Unit * who) + void KilledUnit(Unit* who) { if (who->GetTypeId() == TYPEID_PLAYER) Talk(SAY_SLAY); -- cgit v1.2.3