aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/ExilesReach/DarkmaulCitadel/boss_tunk.cpp206
-rw-r--r--src/server/scripts/ExilesReach/DarkmaulCitadel/darkmaul_citadel.h59
-rw-r--r--src/server/scripts/ExilesReach/DarkmaulCitadel/instance_darkmaul_citadel.cpp70
-rw-r--r--src/server/scripts/ExilesReach/exiles_reach_script_loader.cpp8
4 files changed, 343 insertions, 0 deletions
diff --git a/src/server/scripts/ExilesReach/DarkmaulCitadel/boss_tunk.cpp b/src/server/scripts/ExilesReach/DarkmaulCitadel/boss_tunk.cpp
new file mode 100644
index 00000000000..1a0b989b2ef
--- /dev/null
+++ b/src/server/scripts/ExilesReach/DarkmaulCitadel/boss_tunk.cpp
@@ -0,0 +1,206 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * 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 "AreaTrigger.h"
+#include "AreaTriggerAI.h"
+#include "InstanceScript.h"
+#include "PathGenerator.h"
+#include "Player.h"
+#include "ScriptedCreature.h"
+#include "ScriptMgr.h"
+#include "SpellInfo.h"
+#include "SpellMgr.h"
+#include "SpellScript.h"
+#include "darkmaul_citadel.h"
+
+enum TunkSpells
+{
+ SPELL_INTERRUPTING_SHOUT = 321240,
+ SPELL_SEISMIC_SLAM_SELECTOR = 308454,
+ SPELL_SEISMIC_SLAM_AT = 308455,
+ SPELL_SEISMIC_SLAM_DAMAGE = 308463
+};
+
+enum TunkEvents
+{
+ EVENT_INTERRUPTING_SHOUT = 1,
+ EVENT_SEISMIC_SLAM
+};
+
+enum TunkTexts
+{
+ SAY_WARNING_SEISMIC_SLAM = 0,
+ SAY_WARNING_INTERRUPT = 1
+};
+
+// 157300 - Tunk
+struct boss_tunk : public BossAI
+{
+ boss_tunk(Creature* creature) : BossAI(creature, DATA_TUNK) { }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ _JustDied();
+ }
+
+ void EnterEvadeMode(EvadeReason /*why*/) override
+ {
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me);
+ _EnterEvadeMode();
+ _DespawnAtEvade();
+ }
+
+ void JustEngagedWith(Unit* who) override
+ {
+ BossAI::JustEngagedWith(who);
+ instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1);
+
+ events.ScheduleEvent(EVENT_INTERRUPTING_SHOUT, 7s);
+ events.ScheduleEvent(EVENT_SEISMIC_SLAM, 14s);
+ }
+
+ void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
+ {
+ if (!target->IsPlayer())
+ return;
+
+ if (spellInfo->Id == SPELL_SEISMIC_SLAM_DAMAGE)
+ Talk(SAY_WARNING_SEISMIC_SLAM, target);
+ }
+
+ 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_INTERRUPTING_SHOUT:
+ {
+ DoCastSelf(SPELL_INTERRUPTING_SHOUT);
+ events.Repeat(20s);
+ break;
+ }
+ case EVENT_SEISMIC_SLAM:
+ {
+ DoCast(SPELL_SEISMIC_SLAM_SELECTOR);
+ events.Repeat(30s);
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+ }
+ }
+};
+
+// 308454 - Seismic Slam
+class spell_tunk_seismic_slam_selector : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_SEISMIC_SLAM_AT });
+ }
+
+ void HandleHitTarget(SpellEffIndex /*effIndex*/) const
+ {
+ GetCaster()->CastSpell(GetHitUnit()->GetPosition(), SPELL_SEISMIC_SLAM_AT, CastSpellExtraArgsInit{
+ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
+ .TriggeringSpell = GetSpell()
+ });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_tunk_seismic_slam_selector::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 308455 - Seismic Slam
+struct at_tunk_seismic_slam : AreaTriggerAI
+{
+ using AreaTriggerAI::AreaTriggerAI;
+
+ void OnInitialize() override
+ {
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(at->GetSpellId(), DIFFICULTY_NONE);
+ if (!spellInfo)
+ return;
+
+ Unit* caster = at->GetCaster();
+ if (!caster)
+ return;
+
+ Position destPos = at->GetFirstCollisionPosition(spellInfo->GetMaxRange(false, caster), 0.0f);
+ PathGenerator path(at);
+
+ path.CalculatePath(destPos.GetPositionX(), destPos.GetPositionY(), destPos.GetPositionZ(), false);
+
+ at->InitSplines(path.GetPath());
+ }
+
+ void OnUnitEnter(Unit* unit) override
+ {
+ if (Unit* caster = at->GetCaster())
+ if (caster->IsValidAttackTarget(unit))
+ caster->CastSpell(unit, SPELL_SEISMIC_SLAM_DAMAGE, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ }
+};
+
+// 321240 - Interrupting Shout
+class spell_tunk_interrupting_shout : public SpellScript
+{
+ void HandleLaunchTarget(SpellEffIndex /*effIndex*/) const
+ {
+ Creature* caster = GetCaster()->ToCreature();
+ if (!caster)
+ return;
+
+ Player* hitPlayer = GetHitUnit()->ToPlayer();
+ if (!hitPlayer)
+ return;
+
+ if (hitPlayer->GetCurrentSpell(CurrentSpellTypes::CURRENT_GENERIC_SPELL) != nullptr)
+ caster->AI()->Talk(SAY_WARNING_INTERRUPT, hitPlayer);
+ }
+
+ void Register() override
+ {
+ OnEffectLaunchTarget += SpellEffectFn(spell_tunk_interrupting_shout::HandleLaunchTarget, EFFECT_1, SPELL_EFFECT_INTERRUPT_CAST);
+ }
+};
+
+void AddSC_boss_tunk()
+{
+ RegisterDarkmaulCitadelCreatureAI(boss_tunk);
+
+ RegisterSpellScript(spell_tunk_seismic_slam_selector);
+ RegisterSpellScript(spell_tunk_interrupting_shout);
+
+ RegisterAreaTriggerAI(at_tunk_seismic_slam);
+}
diff --git a/src/server/scripts/ExilesReach/DarkmaulCitadel/darkmaul_citadel.h b/src/server/scripts/ExilesReach/DarkmaulCitadel/darkmaul_citadel.h
new file mode 100644
index 00000000000..9aed3b6c53a
--- /dev/null
+++ b/src/server/scripts/ExilesReach/DarkmaulCitadel/darkmaul_citadel.h
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * 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/>.
+ */
+
+#ifndef DEF_DARKMAUL_CITADEL_H_
+#define DEF_DARKMAUL_CITADEL_H_
+
+#include "CreatureAIImpl.h"
+
+#define DCScriptName "instance_darkmaul_citadel"
+#define DataHeader "DarkmaulCitadel"
+
+constexpr uint32 EncounterCount = 2;
+
+enum DarkmaulCitadelDataTypes
+{
+ // Encounters
+ DATA_TUNK = 0,
+ DATA_RAVNYR = 1,
+
+ DATA_GORGROTH
+};
+
+enum DarkmaulCitadelCreatureIds
+{
+ // Bosses
+ BOSS_TUNK = 157300,
+ BOSS_GORGROTH = 156814,
+ BOSS_RAVNYR = 156501
+};
+
+enum DarkmaulCitadelGameObjectIds
+{
+ GO_SHADOWY_DOOR = 334578,
+ GO_TEMP_DOOR = 334502
+};
+
+template <class AI, class T>
+inline AI* GetDarkmaulCitadelAI(T* obj)
+{
+ return GetInstanceAI<AI>(obj, DCScriptName);
+}
+
+#define RegisterDarkmaulCitadelCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetDarkmaulCitadelAI)
+
+#endif
diff --git a/src/server/scripts/ExilesReach/DarkmaulCitadel/instance_darkmaul_citadel.cpp b/src/server/scripts/ExilesReach/DarkmaulCitadel/instance_darkmaul_citadel.cpp
new file mode 100644
index 00000000000..a4c3a3bb134
--- /dev/null
+++ b/src/server/scripts/ExilesReach/DarkmaulCitadel/instance_darkmaul_citadel.cpp
@@ -0,0 +1,70 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * 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 "Creature.h"
+#include "CreatureAI.h"
+#include "InstanceScript.h"
+#include "ScriptMgr.h"
+#include "darkmaul_citadel.h"
+
+ObjectData const creatureData[] =
+{
+ { BOSS_TUNK, DATA_TUNK },
+ { BOSS_GORGROTH, DATA_GORGROTH },
+ { BOSS_RAVNYR, DATA_RAVNYR },
+ { 0, 0 } // END
+};
+
+static DoorData const doorData[] =
+{
+ { GO_TEMP_DOOR, DATA_TUNK, EncounterDoorBehavior::OpenWhenDone },
+ { 0, 0, EncounterDoorBehavior::OpenWhenNotInProgress }
+};
+
+DungeonEncounterData const encounters[] =
+{
+ { DATA_TUNK, {{ 2325 }} },
+ { DATA_RAVNYR, {{ 2326 }} }
+};
+
+class instance_darkmaul_citadel : public InstanceMapScript
+{
+public:
+ instance_darkmaul_citadel() : InstanceMapScript(DCScriptName, 2236) { }
+
+ struct instance_darkmaul_citadel_InstanceMapScript: public InstanceScript
+ {
+ instance_darkmaul_citadel_InstanceMapScript(InstanceMap* map) : InstanceScript(map)
+ {
+ SetHeaders(DataHeader);
+ SetBossNumber(EncounterCount);
+ LoadObjectData(creatureData, nullptr);
+ LoadDoorData(doorData);
+ LoadDungeonEncounterData(encounters);
+ }
+ };
+
+ InstanceScript* GetInstanceScript(InstanceMap* map) const override
+ {
+ return new instance_darkmaul_citadel_InstanceMapScript(map);
+ }
+};
+
+void AddSC_instance_darkmaul_citadel()
+{
+ new instance_darkmaul_citadel();
+}
diff --git a/src/server/scripts/ExilesReach/exiles_reach_script_loader.cpp b/src/server/scripts/ExilesReach/exiles_reach_script_loader.cpp
index 9aba87f489e..56ec40677b8 100644
--- a/src/server/scripts/ExilesReach/exiles_reach_script_loader.cpp
+++ b/src/server/scripts/ExilesReach/exiles_reach_script_loader.cpp
@@ -18,9 +18,17 @@
// This is where scripts' loading functions should be declared:
void AddSC_zone_exiles_reach();
+// Darkmaul Citacel
+void AddSC_instance_darkmaul_citadel();
+void AddSC_boss_tunk();
+
// The name of this function should match:
// void Add${NameOfDirectory}Scripts()
void AddExilesReachScripts()
{
AddSC_zone_exiles_reach();
+
+ // Darkmaul Citacel
+ AddSC_instance_darkmaul_citadel();
+ AddSC_boss_tunk();
}