diff --git a/sql/updates/world/master/2026_04_11_00_world.sql b/sql/updates/world/master/2026_04_11_00_world.sql new file mode 100644 index 0000000000..9352f23ead --- /dev/null +++ b/sql/updates/world/master/2026_04_11_00_world.sql @@ -0,0 +1,103 @@ +SET @ATSPAWNID := 286; +SET @ATPROP := 176; +SET @ATID := 185; + +-- Creature +UPDATE `creature_template` SET `faction`=16, `BaseAttackTime`=2000, `unit_flags2`=0x800, `unit_flags3`=0x80000, `AIName`='SmartAI' WHERE `entry`=236190; -- Frenzied Mite +UPDATE `creature_template` SET `faction`=16, `BaseAttackTime`=2000, `unit_flags`=33555264, `unit_flags3`=1073741824, `ScriptName`='boss_azhiccar' WHERE `entry`=234893; +UPDATE `creature_template` SET `AIName`='SmartAI' WHERE `entry`=237454; +UPDATE `creature_template` SET `ScriptName`='npc_azhiccar_intro_creature' WHERE `entry` IN (245411, 245412); + +DELETE FROM `creature_template_addon` WHERE `entry`=234893; +INSERT INTO `creature_template_addon` (`entry`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES +(234893, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '422356'); + +DELETE FROM `creature_addon` WHERE `guid`=10006776; +INSERT INTO `creature_addon` (`guid`, `PathId`, `mount`, `MountCreatureID`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvPFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES +(10006776, 0, 0, 0, 0, 0, 0, 1, 0, 0, 19254, 0, 0, 0, ''); + +DELETE FROM `creature_template_difficulty` WHERE (`DifficultyID`=23 AND `Entry` =236190); +INSERT INTO `creature_template_difficulty` (`Entry`, `DifficultyID`, `HealthScalingExpansion`, `HealthModifier`, `ManaModifier`, `CreatureDifficultyID`, `TypeFlags`, `TypeFlags2`, `TypeFlags3`) VALUES +(236190, 23, 10, 0.5, 1, 315019, 0x200048, 128, 0); -- Frenzied Mite + +UPDATE `creature_template_difficulty` SET `ContentTuningID`=1279, `StaticFlags1`=0x10000000 WHERE (`Entry`=236190 AND `DifficultyID`=23); -- 236190 (Frenzied Mite) - CanSwim + +-- SAI +DELETE FROM `smart_scripts` WHERE `entryorguid`=237454 AND `source_type`=0; +INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `event_param_string`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `action_param7`, `action_param_string`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_param_string`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES +(237454, 0, 0, 0, '', 63, 0, 100, 0, 0, 0, 0, 0, 0, '', 85, 1217720, 0, 0, 0, 0, 0, 0, NULL, 1, 0, 0, 0, 0, NULL, 0, 0, 0, 0, '[DNT] Stalker - On Just Summoned - Cast self [DNT] Spawn'); + +UPDATE `creature_template` SET `AIName`='', `ScriptName`='npc_azhiccar_frenzied_mite' WHERE `entry`=236190; + +-- Instance +DELETE FROM `instance_template` WHERE `map`=2830; +INSERT INTO `instance_template` (`map`, `parent`, `script`) VALUES +(2830, 0, 'instance_ecodome_aldani'); + +-- Conditions +DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=13 AND `SourceEntry` IN (1217255, 1233147, 1233116); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES +(13, 1, 1217255, 0, 0, 51, 0, 5, 236190, 0, '', 0, 0, 0, '', 'Spell \'Devour\' can only hit \'Frenzied Mite\''), +(13, 2, 1217255, 0, 0, 51, 0, 5, 236190, 0, '', 0, 0, 0, '', 'Spell \'Devour\' can only hit \'Frenzied Mite\''), +(13, 2, 1233147, 0, 0, 51, 0, 5, 234893, 0, '', 0, 0, 0, '', 'Spell \'Devour\' can only hit \'Azhiccar\''), +(13, 4, 1233147, 0, 0, 51, 0, 5, 234893, 0, '', 0, 0, 0, '', 'Spell \'Devour\' can only hit \'Azhiccar\''), +(13, 1, 1233116, 0, 1, 51, 0, 5, 245411, 0, '', 0, 0, 0, '', 'Spell \'Devour\' can only hit \'Ravaging Scavenger\''), +(13, 1, 1233116, 0, 0, 51, 0, 5, 245412, 0, '', 0, 0, 0, '', 'Spell \'Devour\' can only hit \'Voracious Gorger\''); + +-- Areatrigger +DELETE FROM `areatrigger` WHERE `SpawnId`=@ATSPAWNID; +INSERT INTO `areatrigger` (`SpawnId`, `AreaTriggerCreatePropertiesId`, `IsCustom`, `MapId`, `SpawnDifficulties`, `PosX`, `PosY`, `PosZ`, `Orientation`, `PhaseUseFlags`, `PhaseId`, `PhaseGroup`, `ScriptName`, `Comment`, `VerifiedBuild`) VALUES +(@ATSPAWNID, @ATPROP, 1, 2830, '1,2,23,8,205', 526.473, -747.901, 999.682, 6.1991, 0, 0, 0, 'at_azhiccar_intro', 'Eco-Dome Aldani - Azhiccar intro', 0); + +DELETE FROM `areatrigger_create_properties` WHERE `Id`=@ATPROP AND `IsCustom`=1; +INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`, `TimeToTargetScale`, `Speed`, `SpeedIsTime`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `VerifiedBuild`) VALUES +(@ATPROP, 1, @ATID, 1, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 0, 0, 0, 1, 20, 10, 5, 20, 10, 5, 0, 0, '', 0); + +DELETE FROM `areatrigger_template` WHERE `Id`=@ATID AND `IsCustom`=1; +INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `Flags`, `ActionSetId`, `ActionSetFlags`, `VerifiedBuild`) VALUES +(@ATID, 1, 1, 0, 0, 0); + +DELETE FROM `areatrigger_create_properties` WHERE (`IsCustom`=0 AND `Id` IN (36165, 36166, 38667, 36181, 38379)); +INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`, `TimeToTargetScale`, `Speed`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `VerifiedBuild`) VALUES +(36165, 0, 38189, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1217240, 18000, 0, 0, 12, 12, 0, 0, 0, 0, 0, 0, 'at_azhiccar_devour', 63305), -- SpellForVisuals: 1217240 (Devour) +(36166, 0, 38188, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1217240, 18000, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, 'at_azhiccar_devour_force', 63305), -- SpellForVisuals: 1217240 (Devour) +(38667, 0, 34184, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1217240, 18000, 0, 0, 20, 20, 0, 0, 0, 0, 0, 0, '', 63305), -- SpellForVisuals: 1217240 (Devour) +(36181, 0, 38204, 0, 4, 0, 81441, 0, 0, -1, 0, 690, NULL, 180000, 0, 0, 10, 10, 0, 0, 0, 0, 0, 0, 'at_azhiccar_digestive_spittle', 63305), -- Spell: 1217441 (Digestive Spittle) +(38379, 0, 6197, 0, 2, 0, 0, 0, 0, -1, 0, 0, NULL, 6000, 0, 0, 108, 108, 0, 0, 0, 0, 0, 0, '', 63305); + +DELETE FROM `areatrigger_template` WHERE (`IsCustom`=0 AND `Id` IN (38189, 38188, 34184, 38204)); +INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `VerifiedBuild`) VALUES +(38189, 0, 63305), +(38188, 0, 63305), +(34184, 0, 63305), +(38204, 0, 63305); + +UPDATE `areatrigger_template` SET `VerifiedBuild`=63305 WHERE (`Id`=6197 AND `IsCustom`=0); + +-- Texts +DELETE FROM `creature_text` WHERE `CreatureID` = 234893; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(234893, 0, 0, '|TInterface\\ICONS\\Spell_Shadow_DevouringPlague..blp:20|t %s prepares to |cFFFF0000|Hspell:1217232|h[Devour]|h|r!', 41, 0, 100, 0, 0, 283865, 285972, 0, 'Azhiccar'); + +-- Spells +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_azhiccar_energy_controller', 'spell_azhiccar_feast', 'spell_azhiccar_devour_selector', 'spell_azhiccar_devour', 'spell_azhiccar_player_detection', 'spell_azhiccar_invading_shriek_dummy', 'spell_azhiccar_toxic_regurgitation_cast', 'spell_azhiccar_toxic_regurgitation_selector', 'spell_azhiccar_devour_intro_selector', 'spell_azhiccar_invading_shriek'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(1217202, 'spell_azhiccar_energy_controller'), +(1217436, 'spell_azhiccar_toxic_regurgitation_selector'), +(1227745, 'spell_azhiccar_toxic_regurgitation_cast'), +(1233116, 'spell_azhiccar_devour_intro_selector'), +(1217330, 'spell_azhiccar_invading_shriek_dummy'), +(1217758, 'spell_azhiccar_player_detection'), +(1217232, 'spell_azhiccar_devour'), +(1217255, 'spell_azhiccar_devour_selector'), +(1217241, 'spell_azhiccar_feast'), +(1217252, 'spell_azhiccar_feast'), +(1217327, 'spell_azhiccar_invading_shriek'); + +DELETE FROM `serverside_spell` WHERE `Id`=1217758 AND `DifficultyID`=0; +INSERT INTO `serverside_spell` (`Id`, `DifficultyID`, `CategoryId`, `Dispel`, `Mechanic`, `Attributes`, `AttributesEx`, `AttributesEx2`, `AttributesEx3`, `AttributesEx4`, `AttributesEx5`, `AttributesEx6`, `AttributesEx7`, `AttributesEx8`, `AttributesEx9`, `AttributesEx10`, `AttributesEx11`, `AttributesEx12`, `AttributesEx13`, `AttributesEx14`, `AttributesEx15`, `Stances`, `StancesNot`, `Targets`, `TargetCreatureType`, `RequiresSpellFocus`, `FacingCasterFlags`, `CasterAuraState`, `TargetAuraState`, `ExcludeCasterAuraState`, `ExcludeTargetAuraState`, `CasterAuraSpell`, `TargetAuraSpell`, `ExcludeCasterAuraSpell`, `ExcludeTargetAuraSpell`, `CasterAuraType`, `TargetAuraType`, `ExcludeCasterAuraType`, `ExcludeTargetAuraType`, `CastingTimeIndex`, `RecoveryTime`, `CategoryRecoveryTime`, `StartRecoveryCategory`, `StartRecoveryTime`, `InterruptFlags`, `AuraInterruptFlags1`, `AuraInterruptFlags2`, `ChannelInterruptFlags1`, `ChannelInterruptFlags2`, `ProcFlags`, `ProcFlags2`, `ProcChance`, `ProcCharges`, `ProcCooldown`, `ProcBasePPM`, `MaxLevel`, `BaseLevel`, `SpellLevel`, `DurationIndex`, `RangeIndex`, `Speed`, `LaunchDelay`, `StackAmount`, `EquippedItemClass`, `EquippedItemSubClassMask`, `EquippedItemInventoryTypeMask`, `ContentTuningId`, `SpellName`, `ConeAngle`, `ConeWidth`, `MaxTargetLevel`, `MaxAffectedTargets`, `SpellFamilyName`, `SpellFamilyFlags1`, `SpellFamilyFlags2`, `SpellFamilyFlags3`, `SpellFamilyFlags4`, `DmgClass`, `PreventionType`, `AreaGroupId`, `SchoolMask`, `ChargeCategoryId`) VALUES +(1217758, 0, 0, 0, 0, 0x20000180, 0x00000400, 0x10400004, 0x00070300, 0x00800000, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 'Player Detection', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0); + +DELETE FROM `serverside_spell_effect` WHERE `SpellID`=1217758 AND `EffectIndex`=0 AND `DifficultyID`=0; +INSERT INTO `serverside_spell_effect` (`SpellID`, `EffectIndex`, `DifficultyID`, `Effect`, `EffectAura`, `EffectAmplitude`, `EffectAttributes`, `EffectAuraPeriod`, `EffectBonusCoefficient`, `EffectChainAmplitude`, `EffectChainTargets`, `EffectItemType`, `EffectMechanic`, `EffectPointsPerResource`, `EffectPosFacing`, `EffectRealPointsPerLevel`, `EffectTriggerSpell`, `BonusCoefficientFromAP`, `PvpMultiplier`, `Coefficient`, `Variance`, `ResourceCoefficient`, `GroupSizeBasePointsCoefficient`, `EffectBasePoints`, `EffectMiscValue1`, `EffectMiscValue2`, `EffectRadiusIndex1`, `EffectRadiusIndex2`, `EffectSpellClassMask1`, `EffectSpellClassMask2`, `EffectSpellClassMask3`, `EffectSpellClassMask4`, `ImplicitTarget1`, `ImplicitTarget2`) VALUES +(1217758, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 22, 15); diff --git a/src/server/scripts/Karesh/EcoDomeAldani/boss_azhiccar.cpp b/src/server/scripts/Karesh/EcoDomeAldani/boss_azhiccar.cpp new file mode 100644 index 0000000000..c25504fe8e --- /dev/null +++ b/src/server/scripts/Karesh/EcoDomeAldani/boss_azhiccar.cpp @@ -0,0 +1,770 @@ +/* + * 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 . + */ + +#include "AreaTriggerAI.h" +#include "CellImpl.h" +#include "Containers.h" +#include "GameObject.h" +#include "GridNotifiersImpl.h" +#include "InstanceScript.h" +#include "MotionMaster.h" +#include "MoveSplineInit.h" +#include "ObjectAccessor.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellAuras.h" +#include "SpellAuraEffects.h" +#include "SpellScript.h" +#include "ecodome_aldani.h" + +enum AzhiccarSpells +{ + // Intro + SPELL_DEVOUR_INTRO = 1233112, + SPELL_DEVOUR_INTRO_SELECTOR = 1233116, + SPELL_DEVOUR_INSTAKILL = 1233147, + SPELL_KNOCKBACK = 1222792, + + // Combat + SPELL_DEVOUR = 1217232, + SPELL_DEVOUR_AREATRIGGER = 1217240, + SPELL_DEVOUR_SELECTOR = 1217255, + SPELL_DEVOURER_VORTEX = 1227068, + SPELL_DIGESTIVE_SPITTLE = 1217446, + SPELL_DIGESTIVE_SPITTLE_NPC_SLOW = 1217526, + SPELL_ENERGY_CONTROLLER = 1217202, + SPELL_FEAST = 1217241, + SPELL_FEAST_HEAL = 1217247, + SPELL_FEAST_INSTAKILL = 1217252, + SPELL_INVADING_SHRIEK_DAMAGE = 1231850, + SPELL_INVADING_SHRIEK_DUMMY = 1217330, + SPELL_INVADING_SHRIEK_PERIODIC = 1217327, + SPELL_INVADING_SHRIEK_SUMMON = 1217331, + SPELL_PLAYER_DETECTION = 1217757, + SPELL_THRASH = 1217664, + SPELL_TOXIC_REGURGITATION_CAST = 1227745, + SPELL_TOXIC_REGURGITATION_MARKER = 1227748, + SPELL_TOXIC_REGURGITATION_MISSILE = 1217438, + SPELL_TOXIC_REGURGITATION_SELECTOR = 1217436, + + // Mites + SPELL_UNCONTROLLED = 1231811, + SPELL_STUNNED = 1235707, +}; + +enum AzhiccarEvents +{ + EVENT_INVADING_SHRIEK = 1, + EVENT_TOXIC_REGURGITATION, + EVENT_CHECK_ENERGY +}; + +enum AzhiccarActions +{ + ACTION_START_INTRO = 1 +}; + +enum AzhiccarTexts +{ + SAY_DEVOUR = 0 +}; + +enum AzhiccarMisc +{ + ANIMKIT_NONE = 0, + ANIMKIT_EMERGE = 21290, + ANIMKIT_MITE_DEVOUR_BIRTH = 11428, + + SPELL_VISUALKIT_ALARM = 222521, + + POINT_AZHICCAR = 0, + + SPELL_VISUAL_DEVOURED = 155836, + + NPC_PORTAL_STALKER = 237454, + NPC_FRENZIED_MITE = 236190, +}; + +static constexpr Position AzhiccarPosition = { 436.8889f, -746.0f, 1002.0926f }; +static constexpr Position OrphanSpellVisualPosition = { 436.8889f, -746.0f, 1018.0926f }; + +// 234893 - Azhiccar +struct boss_azhiccar : public BossAI +{ + boss_azhiccar(Creature* creature) : BossAI(creature, DATA_AZHICCAR), _invadingShriekCount(1), _toxicRegurgitationCount(1) { } + + void JustAppeared() override + { + if (instance->GetData(DATA_AZHICCAR_INTRO) == DONE) + { + me->SetUninteractible(false); + me->SetImmuneToAll(false); + me->SetAIAnimKitId(ANIMKIT_NONE); + me->PlayOneShotAnimKitId(ANIMKIT_EMERGE); + } + + me->SetPowerType(POWER_ENERGY); + me->SetPower(POWER_ENERGY, 0); + + DoCastSelf(SPELL_DEVOURER_VORTEX); + } + + void Reset() override + { + BossAI::Reset(); + + _invadingShriekCount = 1; + _toxicRegurgitationCount = 1; + + _lastPortalPositions.clear(); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); + + DoCastSelf(SPELL_PLAYER_DETECTION); + DoCastSelf(SPELL_ENERGY_CONTROLLER); + + events.ScheduleEvent(EVENT_TOXIC_REGURGITATION, 15400ms); + events.ScheduleEvent(EVENT_INVADING_SHRIEK, 5200ms); + + if (IsHeroicOrHigher()) + events.ScheduleEvent(EVENT_CHECK_ENERGY, 500ms); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + + summons.DespawnAll(); + me->RemoveAllAreaTriggers(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + + summons.DespawnAll(); + me->RemoveAllAreaTriggers(); + _EnterEvadeMode(); + _DespawnAtEvade(); + } + + void OnSpellStart(SpellInfo const* spellInfo) override + { + switch (spellInfo->Id) + { + case SPELL_DEVOUR: + { + Talk(SAY_DEVOUR); + break; + } + default: + break; + } + } + + void DoAction(int32 actionId) override + { + switch (actionId) + { + case ACTION_START_INTRO: + { + me->SetAIAnimKitId(ANIMKIT_NONE); + me->PlayOneShotAnimKitId(ANIMKIT_EMERGE); + + scheduler.Schedule(2s + 170ms, [this](TaskContext context) + { + DoCastSelf(SPELL_KNOCKBACK); + DoCastSelf(SPELL_DEVOUR_INTRO); + + context.Schedule(7s, [this](TaskContext) + { + me->SetUninteractible(false); + me->SetImmuneToAll(false); + instance->SetData(DATA_AZHICCAR_INTRO, DONE); + }); + }); + break; + } + default: + break; + } + } + + void UpdateAI(uint32 diff) override + { + scheduler.Update(diff); + + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_INVADING_SHRIEK: + { + std::vector portalAngles = + { + float(M_PI / 4.0f), + -float(M_PI / 4.0f), + -(3.0f * float(M_PI / 4.0f)), + (3.0f * float(M_PI / 4.0f)) + }; + + Trinity::Containers::RandomResize(portalAngles, 3); + + static constexpr float PORTAL_STALKER_DIST = 30.0f; + + _lastPortalPositions.clear(); + for (float angle : portalAngles) + { + angle += me->GetOrientation(); + Position pos = me->GetPosition(); + me->MovePosition(pos, PORTAL_STALKER_DIST, angle); + me->SummonCreature(NPC_PORTAL_STALKER, pos, TEMPSUMMON_TIMED_DESPAWN, 4100ms); + + _lastPortalPositions.push_back(pos); + } + + DoCastSelf(SPELL_INVADING_SHRIEK_PERIODIC); + + _invadingShriekCount++; + if (_invadingShriekCount % 2 == 0) + events.Repeat(37200ms); + else + events.Repeat(48500ms); + break; + } + case EVENT_TOXIC_REGURGITATION: + { + DoCastSelf(SPELL_TOXIC_REGURGITATION_SELECTOR); + _toxicRegurgitationCount++; + if (_toxicRegurgitationCount % 2 == 0) + events.Repeat(18200ms); + else + events.Repeat(67500ms); + break; + } + case EVENT_CHECK_ENERGY: + { + if (me->GetPower(POWER_ENERGY) >= 100) + { + DoCastSelf(SPELL_DEVOUR); + + if (IsMythic()) + { + for (Position const& lastPos : _lastPortalPositions) + { + me->SummonCreature(NPC_PORTAL_STALKER, lastPos, TEMPSUMMON_TIMED_DESPAWN, 2s); + for (uint8 i = 0; i < 3; i++) + { + Position pos(lastPos); + me->MovePosition(pos, 3.0f, frand(0, 2 * float(M_PI))); + + me->m_Events.AddEventAtOffset([caster = me, pos]() + { + caster->CastSpell(pos, SPELL_INVADING_SHRIEK_SUMMON, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR + }); + }, 2100ms); + } + } + } + events.Repeat(25s); + } + else + events.Repeat(500ms); + break; + } + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } + } + +private: + uint32 _invadingShriekCount; + uint32 _toxicRegurgitationCount; + std::vector _lastPortalPositions; +}; + +// 236190 - Frenzied Mite +struct npc_azhiccar_frenzied_mite : public ScriptedAI +{ + npc_azhiccar_frenzied_mite(Creature* creature) : ScriptedAI(creature) {} + + void JustAppeared() override + { + Creature* azhiccar = me->GetInstanceScript()->GetCreature(DATA_AZHICCAR); + if (!azhiccar) + return; + + if (azhiccar->GetPower(POWER_ENERGY) >= 100) + { + me->SetReactState(REACT_PASSIVE); + DoCastSelf(SPELL_STUNNED); + me->PlayOneShotAnimKitId(ANIMKIT_MITE_DEVOUR_BIRTH); + } + else + DoCastSelf(SPELL_UNCONTROLLED); + } +}; + +// 1217202 - Energy Controller +class spell_azhiccar_energy_controller : public AuraScript +{ + static constexpr std::array AzhiccarEnergizeCycle = { 1, 2, 2 }; + + void PeriodicTick(AuraEffect const* aurEff) const + { + if (GetTarget()->HasAura(SPELL_DEVOUR)) + return; + + uint8 cycleIdx = aurEff->GetTickNumber() % AzhiccarEnergizeCycle.size(); + GetTarget()->ModifyPower(POWER_ENERGY, AzhiccarEnergizeCycle[cycleIdx]); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_azhiccar_energy_controller::PeriodicTick, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +// 1217436 - Toxic Regurgitation +class spell_azhiccar_toxic_regurgitation_selector : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_TOXIC_REGURGITATION_MARKER, SPELL_TOXIC_REGURGITATION_CAST }); + } + + void HandleHitTarget(SpellEffIndex /*effIndex*/) const + { + Unit* caster = GetCaster(); + + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR; + args.TriggeringSpell = GetSpell(); + + caster->CastSpell(caster, SPELL_TOXIC_REGURGITATION_CAST, args); + caster->CastSpell(GetHitUnit(), SPELL_TOXIC_REGURGITATION_MARKER, args); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_azhiccar_toxic_regurgitation_selector::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 1227745 - Toxic Regurgitation +class spell_azhiccar_toxic_regurgitation_cast : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_TOXIC_REGURGITATION_MARKER, SPELL_TOXIC_REGURGITATION_MISSILE }); + } + + void HandleOnHit() const + { + Unit* caster = GetCaster(); + + std::list players; + Trinity::UnitAuraCheck check(true, SPELL_TOXIC_REGURGITATION_MARKER); + Trinity::PlayerListSearcher searcher(caster, players, check); + Cell::VisitWorldObjects(caster, searcher, 200.0f); + + for (Player* player : players) + { + caster->CastSpell(player, SPELL_TOXIC_REGURGITATION_MISSILE, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringSpell = GetSpell() + }); + } + } + + void Register() override + { + OnHit += SpellHitFn(spell_azhiccar_toxic_regurgitation_cast::HandleOnHit); + } +}; + +// 1217327 - Invading Shriek +class spell_azhiccar_invading_shriek : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo ({ SPELL_INVADING_SHRIEK_DAMAGE }); + } + + void HandleAfterCast() const + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, SPELL_INVADING_SHRIEK_DAMAGE, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringSpell = GetSpell() + }); + } + + void Register() override + { + AfterCast += SpellCastFn(spell_azhiccar_invading_shriek::HandleAfterCast); + } +}; + +// 1217327 - Invading Shriek +class spell_azhiccar_invading_shriek_aura : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo ({ SPELL_INVADING_SHRIEK_DAMAGE }); + } + + void OnApply(AuraEffect const* /*auraEffect*/, AuraEffectHandleModes /*mode*/) + { + std::vector stalkers; + GetCaster()->GetCreatureListWithEntryInGrid(stalkers, NPC_PORTAL_STALKER, 150.0f); + Trinity::Containers::RandomShuffle(stalkers); + + for (Creature* creature : stalkers) + _stalkerList.push(creature->GetGUID()); + } + + void OnPeriodic(AuraEffect const* aurEff) + { + if (aurEff->GetTickNumber() <= 1) + return; + + Unit* caster = GetCaster(); + ObjectGuid guid = _stalkerList.front(); + _stalkerList.pop(); + + if (Creature* stalker = ObjectAccessor::GetCreature(*caster, guid)) + { + caster->CastSpell(stalker->GetPosition(), SPELL_INVADING_SHRIEK_DUMMY, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringAura = aurEff + }); + } + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_azhiccar_invading_shriek_aura::OnApply, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + OnEffectPeriodic += AuraEffectPeriodicFn(spell_azhiccar_invading_shriek_aura::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + +private: + std::queue _stalkerList; +}; + +// 1217330 - Invading Shriek +class spell_azhiccar_invading_shriek_dummy : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_INVADING_SHRIEK_SUMMON }); + } + + void HandleHit(SpellEffIndex /*effIndex*/) const + { + GetCaster()->CastSpell(GetHitDest()->GetPosition(), SPELL_INVADING_SHRIEK_SUMMON, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringSpell = GetSpell() + }); + } + + void Register() override + { + OnEffectHit += SpellEffectFn(spell_azhiccar_invading_shriek_dummy::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 1217758 - Player Detection (SERVERSIDE) +class spell_azhiccar_player_detection : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DEVOUR, SPELL_THRASH }); + } + + void HandlePlayerDetection() const + { + Unit* caster = GetCaster(); + int64 const targetsHit = GetUnitTargetCountForEffect(EFFECT_0); + if (targetsHit > 0) + return; + + Spell* currentChanneledSpell = caster->GetCurrentSpell(CURRENT_CHANNELED_SPELL); + if (currentChanneledSpell && (currentChanneledSpell->GetSpellInfo()->Id == SPELL_DEVOUR)) + return; + + if (caster->HasAura(SPELL_DEVOUR)) + return; + + caster->CastSpell(caster, SPELL_THRASH, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + } + + void Register() override + { + AfterCast += SpellCastFn(spell_azhiccar_player_detection::HandlePlayerDetection); + } +}; + +// 1217232 - Devour +class spell_azhiccar_devour : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DEVOUR_AREATRIGGER, SPELL_DEVOUR_SELECTOR }); + } + + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, SPELL_DEVOUR_AREATRIGGER, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + caster->CastSpell(caster, SPELL_DEVOUR_SELECTOR, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + } + + void Register() override + { + AfterEffectApply += AuraEffectRemoveFn(spell_azhiccar_devour::OnApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 1217255 - Devour +class spell_azhiccar_devour_selector : public SpellScript +{ + void FilterTargets(std::list& targets) + { + targets.remove_if([](WorldObject* target) { + return !target->IsPlayer() && target->GetEntry() != NPC_FRENZIED_MITE; + }); + } + + void HandleHitTarget(SpellEffIndex /*effIndex*/) const + { + Unit* target = GetHitUnit(); + std::function initializer = [](Movement::MoveSplineInit& init) + { + init.SetBackward(); + init.MoveTo(AzhiccarPosition.GetPositionX(), AzhiccarPosition.GetPositionY(), AzhiccarPosition.GetPositionZ(), false); + }; + target->SendPlaySpellVisualKit(SPELL_VISUALKIT_ALARM, 4, 9000); + target->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), POINT_AZHICCAR, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); + target->SetSpeed(MOVE_RUN_BACK, 12.0f); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_azhiccar_devour_selector::FilterTargets, EFFECT_ALL, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_azhiccar_devour_selector::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 1217241 - Feast +// 1217252 - Feast +class spell_azhiccar_feast : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_FEAST_HEAL }); + } + + void HandleHit(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->CastSpell(caster, SPELL_FEAST_HEAL, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringSpell = GetSpell() + }); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_azhiccar_feast::HandleHit, EFFECT_0, SPELL_EFFECT_ANY); + } +}; + +// 1217441 - Digestive Spittle +// Id - 36181 +struct at_azhiccar_digestive_spittle : AreaTriggerAI +{ + using AreaTriggerAI::AreaTriggerAI; + + void OnUnitEnter(Unit* unit) override + { + Unit* caster = at->GetCaster(); + if (!caster) + return; + + caster->CastSpell(unit, (unit->IsPlayer() ? SPELL_DIGESTIVE_SPITTLE : SPELL_DIGESTIVE_SPITTLE_NPC_SLOW), TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + } + + void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override + { + unit->RemoveAurasDueToSpell(SPELL_DIGESTIVE_SPITTLE); + unit->RemoveAurasDueToSpell(SPELL_DIGESTIVE_SPITTLE_NPC_SLOW); + } +}; + +// 1217240 - Devour +// Id - 38188 +struct at_azhiccar_devour_force : AreaTriggerAI +{ + using AreaTriggerAI::AreaTriggerAI; + + void OnUnitEnter(Unit* unit) override + { + if (!unit->IsPlayer() || unit->GetEntry() == NPC_PORTAL_STALKER) + return; + + unit->ApplyMovementForce(at->GetGUID(), at->GetPosition(), 3.0f, MovementForceType::Gravity); + } + + void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override + { + unit->RemoveMovementForce(at->GetGUID()); + } +}; + +// 1217240 - Devour +// Id - 38189 +struct at_azhiccar_devour : AreaTriggerAI +{ + using AreaTriggerAI::AreaTriggerAI; + + void OnUnitEnter(Unit* unit) override + { + Unit* caster = at->GetCaster(); + if (!caster) + return; + + if (unit->IsPlayer()) + caster->CastSpell(unit, SPELL_FEAST, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + else if (unit->HasAura(SPELL_DEVOUR_SELECTOR)) + caster->CastSpell(unit, SPELL_FEAST_INSTAKILL, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + } +}; + +// Id - 176 +struct at_azhiccar_intro : AreaTriggerAI +{ + at_azhiccar_intro(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { } + + void OnUnitEnter(Unit* unit) override + { + InstanceScript* instance = at->GetInstanceScript(); + if (!instance) + return; + + Player* player = unit->ToPlayer(); + if (!player || player->IsGameMaster()) + return; + + if (Creature* azhiccar = instance->GetCreature(DATA_AZHICCAR)) + azhiccar->AI()->DoAction(ACTION_START_INTRO); + + at->Remove(); + } +}; + +// 245411 - Ravaging Scavenger +// 245412 - Voracious Gorger +struct npc_azhiccar_intro_creature : public ScriptedAI +{ + npc_azhiccar_intro_creature(Creature* creature) : ScriptedAI(creature) { } + + void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_DEVOUR_INTRO_SELECTOR) + { + _scheduler.Schedule(2000ms, 4500ms, [this](TaskContext) + { + me->SendPlayOrphanSpellVisual(OrphanSpellVisualPosition, me->GetPosition(), SPELL_VISUAL_DEVOURED, 45.0f, false); + DoCastSelf(SPELL_DEVOUR_INSTAKILL); + me->DespawnOrUnsummon(5s); + }); + } + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; +}; + +// 1233116 - Devour +class spell_azhiccar_devour_intro_selector : public SpellScript +{ + void HandleHitTarget(SpellEffIndex /*effIndex*/) const + { + Unit* target = GetHitUnit(); + std::function initializer = [](Movement::MoveSplineInit& init) + { + init.SetBackward(); + init.MoveTo(AzhiccarPosition.GetPositionX(), AzhiccarPosition.GetPositionY(), AzhiccarPosition.GetPositionZ(), false); + }; + target->SendPlaySpellVisualKit(SPELL_VISUALKIT_ALARM, 4, 9000); + target->GetMotionMaster()->LaunchMoveSpline(std::move(initializer), POINT_AZHICCAR, MOTION_PRIORITY_NORMAL, POINT_MOTION_TYPE); + target->SetSpeed(MOVE_RUN_BACK, 16.0f); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_azhiccar_devour_intro_selector::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +void AddSC_boss_azhiccar() +{ + RegisterEcodomeAldaniCreatureAI(boss_azhiccar); + + RegisterEcodomeAldaniCreatureAI(npc_azhiccar_frenzied_mite); + RegisterSpellScript(spell_azhiccar_energy_controller); + RegisterSpellScript(spell_azhiccar_toxic_regurgitation_selector); + RegisterSpellScript(spell_azhiccar_toxic_regurgitation_cast); + RegisterSpellAndAuraScriptPair(spell_azhiccar_invading_shriek, spell_azhiccar_invading_shriek_aura); + RegisterSpellScript(spell_azhiccar_invading_shriek_dummy); + RegisterSpellScript(spell_azhiccar_player_detection); + RegisterSpellScript(spell_azhiccar_devour); + RegisterSpellScript(spell_azhiccar_devour_selector); + RegisterSpellScript(spell_azhiccar_feast); + RegisterAreaTriggerAI(at_azhiccar_digestive_spittle); + RegisterAreaTriggerAI(at_azhiccar_devour_force); + RegisterAreaTriggerAI(at_azhiccar_devour); + + // Intro + RegisterAreaTriggerAI(at_azhiccar_intro); + RegisterEcodomeAldaniCreatureAI(npc_azhiccar_intro_creature); + RegisterSpellScript(spell_azhiccar_devour_intro_selector); +} diff --git a/src/server/scripts/Karesh/EcoDomeAldani/ecodome_aldani.h b/src/server/scripts/Karesh/EcoDomeAldani/ecodome_aldani.h new file mode 100644 index 0000000000..a372c78992 --- /dev/null +++ b/src/server/scripts/Karesh/EcoDomeAldani/ecodome_aldani.h @@ -0,0 +1,58 @@ +/* + * 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 . + */ + +#ifndef DEF_ECODOME_ALDANI_H_ +#define DEF_ECODOME_ALDANI_H_ + +#include "CreatureAIImpl.h" + +#define EAScriptName "instance_ecodome_aldani" +#define DataHeader "EcodomeAldani" + +uint32 const EncounterCount = 3; + +enum EcodomeAldaniDataTypes +{ + // Encounters + DATA_AZHICCAR = 0, + DATA_TAAHBAT_AND_AWAZJ = 1, + DATA_SOUL_SCRIBE = 2, + + DATA_TAAHBAT, + DATA_AWAZJ, + + DATA_AZHICCAR_INTRO +}; + +enum EcodomeAldaniCreatureIds +{ + // Bosses + BOSS_AZHICCAR = 234893, + BOSS_TAAHBAT = 234933, + BOSS_AWAZJ = 241375, + BOSS_SOUL_SCRIBE = 247283 +}; + +template +inline AI* GetEcodomeAldaniAI(T* obj) +{ + return GetInstanceAI(obj, EAScriptName); +} + +#define RegisterEcodomeAldaniCreatureAI(ai_name) RegisterCreatureAIWithFactory(ai_name, GetEcodomeAldaniAI) + +#endif diff --git a/src/server/scripts/Karesh/EcoDomeAldani/instance_ecodome_aldani.cpp b/src/server/scripts/Karesh/EcoDomeAldani/instance_ecodome_aldani.cpp new file mode 100644 index 0000000000..b24925bbd8 --- /dev/null +++ b/src/server/scripts/Karesh/EcoDomeAldani/instance_ecodome_aldani.cpp @@ -0,0 +1,93 @@ +/* + * 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 . + */ + +#include "Creature.h" +#include "InstanceScript.h" +#include "ScriptMgr.h" +#include "ecodome_aldani.h" + +static constexpr ObjectData creatureData[] = +{ + { BOSS_AZHICCAR, DATA_AZHICCAR }, + { BOSS_TAAHBAT, DATA_TAAHBAT }, + { BOSS_AWAZJ, DATA_AWAZJ }, + { BOSS_SOUL_SCRIBE, DATA_SOUL_SCRIBE }, + { 0, 0 } // END +}; + +static constexpr DungeonEncounterData encounters[] = +{ + { DATA_AZHICCAR, {{ 3107 }} }, + { DATA_TAAHBAT_AND_AWAZJ, {{ 3108 }} }, + { DATA_SOUL_SCRIBE, {{ 3109 }} } +}; + +class instance_ecodome_aldani : public InstanceMapScript +{ +public: + instance_ecodome_aldani() : InstanceMapScript(EAScriptName, 2830) { } + + struct instance_ecodome_aldani_InstanceMapScript: public InstanceScript + { + instance_ecodome_aldani_InstanceMapScript(InstanceMap* map) : InstanceScript(map) + { + SetHeaders(DataHeader); + SetBossNumber(EncounterCount); + LoadObjectData(creatureData, {}); + LoadDungeonEncounterData(encounters); + + _azhiccarIntroState = NOT_STARTED; + } + + uint32 GetData(uint32 dataId) const override + { + switch (dataId) + { + case DATA_AZHICCAR_INTRO: + return _azhiccarIntroState; + default: + break; + } + return 0; + } + + void SetData(uint32 dataId, uint32 value) override + { + switch (dataId) + { + case DATA_AZHICCAR_INTRO: + _azhiccarIntroState = value; + break; + default: + break; + } + } + + private: + uint8 _azhiccarIntroState; + }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const override + { + return new instance_ecodome_aldani_InstanceMapScript(map); + } +}; + +void AddSC_instance_ecodome_aldani() +{ + new instance_ecodome_aldani(); +} diff --git a/src/server/scripts/Karesh/karesh_script_loader.cpp b/src/server/scripts/Karesh/karesh_script_loader.cpp new file mode 100644 index 0000000000..c7a1a7a05b --- /dev/null +++ b/src/server/scripts/Karesh/karesh_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 . + */ + +// This is where scripts' loading functions should be declared: + +// Eco-Dome Aldani +void AddSC_boss_azhiccar(); +void AddSC_instance_ecodome_aldani(); + +// The name of this function should match: +// void Add${NameOfDirectory}Scripts() +void AddKareshScripts() +{ + // Eco-Dome Aldani + AddSC_boss_azhiccar(); + AddSC_instance_ecodome_aldani(); +}