diff options
5 files changed, 593 insertions, 0 deletions
diff --git a/sql/updates/world/master/2023_04_17_00_world.sql b/sql/updates/world/master/2023_04_17_00_world.sql new file mode 100644 index 00000000000..0bf3b51382c --- /dev/null +++ b/sql/updates/world/master/2023_04_17_00_world.sql @@ -0,0 +1,57 @@ +-- Elder Leaxa +DELETE FROM `instance_template` WHERE `map` = 1841; +INSERT INTO `instance_template` (`map`, `parent`, `script`) VALUES +(1841, 0, 'instance_underrot'); + +DELETE FROM `instance_encounters` WHERE `entry` IN (2111, 2112, 2118, 2123); +INSERT INTO `instance_encounters` (`entry`, `creditType`, `creditEntry`, `lastEncounterDungeon`, `comment`) VALUES +(2111, 0, 131318, 0, 'Elder Leaxa'), +(2112, 0, 131817, 0, 'Cragmaw the Infested'), +(2118, 0, 131383, 0, 'Sporecaller Zancha'), +(2123, 0, 133007, 0, 'Unbound Abomination'); + +UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'boss_elder_leaxa' WHERE `entry` = 131318; +UPDATE `creature_template` SET `faction` = 14, `BaseAttackTime`=2000, `unit_flags`=33555200, `unit_flags2`=2099200, `unit_flags3`=17301505, `flags_extra` = 0x00000080 | 0x20000000 , `AIName` = '', `ScriptName` = 'npc_blood_wave_stalker' WHERE `entry`=132398; -- Blood Wave Stalker +UPDATE `creature_template` SET `faction`= 16, `BaseAttackTime`=2000, `unit_flags`=32832, `unit_flags2`=2099200, `unit_flags3`=524288, `AIName` = '', `ScriptName` = 'npc_blood_effigy' WHERE `entry`=134701; -- Blood Effigy + +DELETE FROM `creature_template_addon` WHERE `entry` IN (134701, 132398); +INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES +(134701, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, '272385'), -- 134701 (Blood Effigy) - Blood Mirror +(132398, 0, 0, 0, 0, 0, 1, 0, 0, 12224, 0, 0, 3, ''); -- 132398 (Blood Wave Stalker) - Creeping Rot + +DELETE FROM `creature_template_movement` WHERE `CreatureID` = 132398; +INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES +(132398, 1, 0, 1, 0, 0, 0, NULL); + +-- AreaTrigger +DELETE FROM `areatrigger_template` WHERE `IsServerSide`=0 AND `Id` = 17135; +INSERT INTO `areatrigger_template` (`Id`, `IsServerSide`, `Type`, `Flags`, `Data0`, `Data1`, `Data2`, `Data3`, `Data4`, `Data5`, `Data6`, `Data7`, `VerifiedBuild`) VALUES +(17135, 0, 4, 4, 2.5, 2.5, 20, 20, 0.300000011920928955, 0.300000011920928955, 0, 0, 28153); + +DELETE FROM `areatrigger_create_properties` WHERE `Id` = 12454; +INSERT INTO `areatrigger_create_properties` (`Id`, `AreaTriggerId`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `TimeToTarget`, `TimeToTargetScale`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `VerifiedBuild`) VALUES +(12454, 17135, 0, 0, 0, 0, 0, 0, 0, 0, 10000, 4, 2.5, 2.5, 20, 20, 0.300000011920928955, 0.300000011920928955, 0, 0, 28153); -- SpellId : 261496 + +DELETE FROM `areatrigger_template_actions` WHERE `AreaTriggerId` = 17135 AND `IsServerSide` = 0; +INSERT INTO `areatrigger_template_actions` (`AreaTriggerId`, `IsServerSide`, `ActionType`, `ActionParam`, `TargetType`) VALUES +(17135, 0, 1, 261498, 2); + +DELETE FROM `creature_text` WHERE `CreatureID` = 131318; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(131318, 0, 0, 'For de glory of G\'huun!', 14, 0, 100, 0, 0, 101028, 148173, 0, 'Elder Leaxa to Player'), +(131318, 1, 0, 'G\'huun\'s power take you!', 14, 0, 100, 0, 0, 101027, 148180, 0, 'Elder Leaxa'), +(131318, 2, 0, 'Rot and wither!', 14, 0, 100, 0, 0, 101026, 148211, 0, 'Elder Leaxa to Player'), +(131318, 3, 0, 'G\'huun be everywhere!', 14, 0, 100, 0, 0, 101025, 148212, 0, 'Elder Leaxa'), +(131318, 4, 0, '|TINTERFACE\\ICONS\\INV_TikiMan2_Bloodtroll.blp:20|t Elder Leaxa begins to cast |cFFF00000|Hspell:264603|h[Blood Mirror]|h|r!', 41, 0, 100, 0, 0, 101025, 157334, 0, 'Elder Leaxa'), +(131318, 5, 0, 'My power grows!', 14, 0, 100, 0, 0, 101031, 95739, 0, 'Elder Leaxa to Player'); + +-- SpellScripts +DELETE FROM `spell_script_names` WHERE `spell_id` IN (260879, 264747, 264757, 260889, 261496, 261498, 264603); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(260879, 'spell_taint_of_ghuun'), +(264747, 'spell_sanguine_feast_selector'), +(264757, 'spell_taint_of_ghuun'), +(260889, 'spell_creeping_rot_selector'), +(261496, 'spell_creeping_rot_aura'), +(261498, 'spell_taint_of_ghuun'), +(264603, 'spell_blood_mirror_selector'); diff --git a/src/server/scripts/Zandalar/Underrot/boss_elder_leaxa.cpp b/src/server/scripts/Zandalar/Underrot/boss_elder_leaxa.cpp new file mode 100644 index 00000000000..c78e77d1471 --- /dev/null +++ b/src/server/scripts/Zandalar/Underrot/boss_elder_leaxa.cpp @@ -0,0 +1,367 @@ +/* + * 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 "CreatureAI.h" +#include "CreatureAIImpl.h" +#include "Containers.h" +#include "InstanceScript.h" +#include "MotionMaster.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuras.h" +#include "underrot.h" + +enum LeaxaSpells +{ + SPELL_TAINT_OF_GHUUN = 260685, + SPELL_BLOOD_BOLT = 260879, + SPELL_SANGUINE_FEAST = 264747, + SPELL_CREEPING_ROT_SELECTOR = 260889, + SPELL_CREEPING_ROT_SUMMON = 260894, + SPELL_CREEPING_ROT_SPAWN_VISUAL = 260891, + SPELL_CREEPING_ROT_AURA = 261496, + SPELL_CREEPING_ROT_PERIODIC_DMG = 261498, + SPELL_BLOOD_MIRROR_SELECTOR = 264603, + SPELL_BLOOD_MIRROR_MISSILE = 264609 +}; + +enum LeaxaEvents +{ + EVENT_BLOOD_BOLT = 1, + EVENT_CREEPING_ROT, + EVENT_SANGUINE_FEAST, + EVENT_BLOOD_MIRROR +}; + +enum LeaxaTexts +{ + SAY_AGGRO = 0, + SAY_SANGUINE_FEAST = 1, + SAY_ROT_AND_WITHER = 2, + SAY_BLOOD_MIRROR = 3, + SAY_ANNOUNCE_BLOOD_MIRROR = 4, + SAY_DEATH = 5 +}; + +enum LeaxaAnimKits +{ + ANIMKIT_BLOOD_EFFIGY_DEATH = 9798 +}; + +// 131318 - Elder Leaxa +struct boss_elder_leaxa : public BossAI +{ + boss_elder_leaxa(Creature* creature) : BossAI(creature, DATA_ELDER_LEAXA) { } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + + Talk(SAY_DEATH); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + summons.DespawnAll(); + _EnterEvadeMode(); + _DespawnAtEvade(); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); + + Talk(SAY_AGGRO); + me->SetAIAnimKitId(0); + events.ScheduleEvent(EVENT_BLOOD_BOLT, 1s); + events.ScheduleEvent(EVENT_SANGUINE_FEAST, 8s); + events.ScheduleEvent(EVENT_CREEPING_ROT, 12s); + events.ScheduleEvent(EVENT_BLOOD_MIRROR, 17s); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (events.ExecuteEvent()) + { + case EVENT_BLOOD_BOLT: + DoCastVictim(SPELL_BLOOD_BOLT); + events.ScheduleEvent(EVENT_BLOOD_BOLT, 6s); + break; + case EVENT_SANGUINE_FEAST: + Talk(SAY_SANGUINE_FEAST); + DoCastAOE(SPELL_SANGUINE_FEAST); + events.ScheduleEvent(EVENT_SANGUINE_FEAST, 30s); + break; + case EVENT_CREEPING_ROT: + Talk(SAY_ROT_AND_WITHER); + DoCastAOE(SPELL_CREEPING_ROT_SELECTOR); + events.ScheduleEvent(EVENT_CREEPING_ROT, 16s); + break; + case EVENT_BLOOD_MIRROR: + Talk(SAY_BLOOD_MIRROR); + Talk(SAY_ANNOUNCE_BLOOD_MIRROR); + DoCastSelf(SPELL_BLOOD_MIRROR_SELECTOR); + events.ScheduleEvent(EVENT_BLOOD_MIRROR, 47s); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } +}; + +// 134701 - Blood Effigy +struct npc_blood_effigy : public ScriptedAI +{ + npc_blood_effigy(Creature* creature) : ScriptedAI(creature) { } + + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_BLOOD_BOLT, 1s); + _events.ScheduleEvent(EVENT_SANGUINE_FEAST, 8s); + _events.ScheduleEvent(EVENT_CREEPING_ROT, 12s); + } + + void JustDied(Unit* /*killer*/) override + { + me->SetAIAnimKitId(ANIMKIT_BLOOD_EFFIGY_DEATH); + me->DespawnOrUnsummon(3s); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (_events.ExecuteEvent()) + { + case EVENT_BLOOD_BOLT: + DoCastVictim(SPELL_BLOOD_BOLT); + _events.ScheduleEvent(EVENT_BLOOD_BOLT, 2s); + break; + case EVENT_SANGUINE_FEAST: + DoCastAOE(SPELL_SANGUINE_FEAST); + _events.ScheduleEvent(EVENT_SANGUINE_FEAST, 30s); + break; + case EVENT_CREEPING_ROT: + DoCastAOE(SPELL_CREEPING_ROT_SELECTOR); + _events.ScheduleEvent(EVENT_CREEPING_ROT, 16s); + break; + default: + break; + } + + DoMeleeAttackIfReady(); + } +private: + EventMap _events; +}; + +// 132398 - Blood Wave Stalker +struct npc_blood_wave_stalker : public ScriptedAI +{ + npc_blood_wave_stalker(Creature* creature) : ScriptedAI(creature) { } + + static constexpr float WALK_DISTANCE = 58.0f; + + void JustAppeared() override + { + DoCast(SPELL_CREEPING_ROT_AURA); + + float angle = me->GetOrientation(); + float destX = me->GetPositionX() + WALK_DISTANCE * std::cos(angle); + float destY = me->GetPositionY() + WALK_DISTANCE * std::sin(angle); + float destZ = me->GetPositionZ(); + Position walkDest(destX, destY, destZ); + + me->GetMotionMaster()->MovePoint(0, walkDest); + } +}; + +// 264747 - Sanguine Feast +class spell_sanguine_feast_selector : public SpellScript +{ + PrepareSpellScript(spell_sanguine_feast_selector); + + bool Validate(SpellInfo const* spellInfo) override + { + return !spellInfo->GetEffects().empty() && ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_0).CalcValue()) }); + } + + void HandleHit(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->CastSpell(GetHitUnit(), uint32(GetEffectInfo().CalcValue(caster))); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_sanguine_feast_selector::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 260889 - Creeping Rot +class spell_creeping_rot_selector : public SpellScript +{ + PrepareSpellScript(spell_creeping_rot_selector); + + static constexpr float SPAWN_DISTANCE = 5.0f; + + void HandleHit(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + Unit* target = GetHitUnit(); + + // make sure spell is cast towards target and caster looks towards target + caster->SetInFront(target); + caster->SetFacingToObject(target); + + caster->CastSpell(target, SPELL_CREEPING_ROT_SUMMON); + + float angle = caster->GetOrientation(); + float destX = caster->GetPositionX() + SPAWN_DISTANCE * std::cos(angle); + float destY = caster->GetPositionY() + SPAWN_DISTANCE * std::sin(angle); + float destZ = caster->GetPositionZ(); + Position spawnVisualDest(destX, destY, destZ); + caster->CastSpell(spawnVisualDest, SPELL_CREEPING_ROT_SPAWN_VISUAL, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_creeping_rot_selector::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 261496 - Creeping Rot (Aura) +class spell_creeping_rot_aura : public AuraScript +{ + PrepareAuraScript(spell_creeping_rot_aura); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + + Creature* creature = GetTarget()->ToCreature(); + if (!creature) + return; + + creature->DespawnOrUnsummon(); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_creeping_rot_aura::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL); + } +}; + +static Position const MirrorSpawnPositions[] = +{ + { 879.79865f, 1222.6233f, 56.47815f }, + { 856.184f, 1232.5435f, 56.52007f }, + { 859.34204f, 1238.0243f, 56.520065f }, + { 857.8333f, 1220.6545f, 56.468567f }, + { 876.17365f, 1240.2848f, 56.409615f }, + { 864.25867f, 1240.5903f, 56.520065f }, + { 863.1042f, 1218.0591f, 56.468765f } +}; + +// 264603 - Blood Mirror +class spell_blood_mirror_selector : public SpellScript +{ + PrepareSpellScript(spell_blood_mirror_selector); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_BLOOD_MIRROR_MISSILE }); + } + + void HandleHit(SpellEffIndex /*effIndex*/) + { + Position spawnPos = Trinity::Containers::SelectRandomContainerElement(MirrorSpawnPositions); + GetCaster()->CastSpell(spawnPos, SPELL_BLOOD_MIRROR_MISSILE, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_blood_mirror_selector::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 260879 - Blood Bolt +// 264757 - Sanguine Feast +// 261498 - Creeping Rot +class spell_taint_of_ghuun : public SpellScript +{ + PrepareSpellScript(spell_taint_of_ghuun); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_TAINT_OF_GHUUN }); + } + + void HandleHit() + { + InstanceScript* instance = GetHitUnit()->GetInstanceScript(); + if (!instance) + return; + + Creature* leaxa = instance->GetCreature(DATA_ELDER_LEAXA); + if (!leaxa) + return; + + leaxa->CastSpell(GetHitUnit(), SPELL_TAINT_OF_GHUUN, true); + } + + void Register() override + { + AfterHit += SpellHitFn(spell_taint_of_ghuun::HandleHit); + } +}; + +void AddSC_boss_elder_leaxa() +{ + // Creature + RegisterUnderrotCreatureAI(boss_elder_leaxa); + RegisterUnderrotCreatureAI(npc_blood_wave_stalker); + RegisterUnderrotCreatureAI(npc_blood_effigy); + + // Spells + RegisterSpellScript(spell_sanguine_feast_selector); + RegisterSpellScript(spell_creeping_rot_selector); + RegisterSpellScript(spell_creeping_rot_aura); + RegisterSpellScript(spell_blood_mirror_selector); + RegisterSpellScript(spell_taint_of_ghuun); +} diff --git a/src/server/scripts/Zandalar/Underrot/instance_underrot.cpp b/src/server/scripts/Zandalar/Underrot/instance_underrot.cpp new file mode 100644 index 00000000000..7ae5a1ab8ae --- /dev/null +++ b/src/server/scripts/Zandalar/Underrot/instance_underrot.cpp @@ -0,0 +1,78 @@ +/* + * 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 "AreaBoundary.h" +#include "InstanceScript.h" +#include "ScriptMgr.h" +#include "underrot.h" + +BossBoundaryData const boundaries = +{ + { DATA_ELDER_LEAXA, new CircleBoundary(Position(869.502014f, 1230.199951f), 58.0f) } +}; + +ObjectData const creatureData[] = +{ + { BOSS_ELDER_LEAXA, DATA_ELDER_LEAXA }, + { BOSS_SPORECALLER_ZANCHA, DATA_SPORECALLER_ZANCHA }, + { BOSS_CRAGMAW_THE_INFESTED, DATA_CRAGMAW_THE_INFESTED }, + { BOSS_UNBOUND_ABOMINATION, DATA_UNBOUND_ABOMINATION }, + { 0, 0 } // END +}; + +DoorData const doorData[] = +{ + { GO_WALL_DOOR_SHORTCUT_ENTRANCE, DATA_SPORECALLER_ZANCHA, DOOR_TYPE_PASSAGE }, + { 0, 0, DOOR_TYPE_ROOM } // END +}; + +DungeonEncounterData const encounters[] = +{ + { DATA_ELDER_LEAXA, {{ 2111 }} }, + { DATA_CRAGMAW_THE_INFESTED, {{ 2112 }} }, + { DATA_SPORECALLER_ZANCHA, {{ 2118 }} }, + { DATA_UNBOUND_ABOMINATION, {{ 2123 }} }, +}; + +class instance_underrot : public InstanceMapScript +{ +public: + instance_underrot() : InstanceMapScript(UnderrotScriptName, 1841) { } + + struct instance_underrot_InstanceMapScript : public InstanceScript + { + instance_underrot_InstanceMapScript(InstanceMap* map) : InstanceScript(map) + { + SetHeaders(DataHeader); + SetBossNumber(EncounterCount); + LoadObjectData(creatureData, nullptr); + LoadDoorData(doorData); + LoadBossBoundaries(boundaries); + LoadDungeonEncounterData(encounters); + } + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const override + { + return new instance_underrot_InstanceMapScript(map); + } +}; + +void AddSC_instance_underrot() +{ + new instance_underrot(); +} diff --git a/src/server/scripts/Zandalar/Underrot/underrot.h b/src/server/scripts/Zandalar/Underrot/underrot.h new file mode 100644 index 00000000000..315071c906d --- /dev/null +++ b/src/server/scripts/Zandalar/Underrot/underrot.h @@ -0,0 +1,60 @@ +/* + * 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_UNDERROT_H_ +#define DEF_UNDERROT_H_ + +#include "CreatureAIImpl.h" + +#define DataHeader "Underrot" +#define UnderrotScriptName "instance_underrot" + +uint32 const EncounterCount = 4; + +enum UnderrotDataTypes +{ + // Encounters + DATA_ELDER_LEAXA = 0, + DATA_SPORECALLER_ZANCHA, + DATA_CRAGMAW_THE_INFESTED, + DATA_UNBOUND_ABOMINATION +}; + +enum UnderrotCreatureIds +{ + // Bosses + BOSS_ELDER_LEAXA = 131318, + BOSS_SPORECALLER_ZANCHA = 131383, + BOSS_CRAGMAW_THE_INFESTED = 131817, + BOSS_UNBOUND_ABOMINATION = 133007 +}; + +enum UnderrotGameObjectIds +{ + GO_PYRAMID_DOOR_UNBOUND_ABOMINATION_ENTRANCE = 296385, + GO_WALL_DOOR_SHORTCUT_ENTRANCE = 295356 +}; + +template <class AI, class T> +inline AI* GetUnderrotAI(T* obj) +{ + return GetInstanceAI<AI>(obj, UnderrotScriptName); +} + +#define RegisterUnderrotCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetUnderrotAI) + +#endif diff --git a/src/server/scripts/Zandalar/zandalar_script_loader.cpp b/src/server/scripts/Zandalar/zandalar_script_loader.cpp new file mode 100644 index 00000000000..2c0559e0ad8 --- /dev/null +++ b/src/server/scripts/Zandalar/zandalar_script_loader.cpp @@ -0,0 +1,31 @@ +/* + * 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/>. + */ + +// This is where scripts' loading functions should be declared: + +// Underrot +void AddSC_instance_underrot(); +void AddSC_boss_elder_leaxa(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddZandalarScripts() +{ + // Underrot + AddSC_instance_underrot(); + AddSC_boss_elder_leaxa(); +} |