diff options
author | Naddley <64811442+Naddley@users.noreply.github.com> | 2024-08-02 22:58:12 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-02 22:58:12 +0200 |
commit | 05046536edebed2a6a74e72dfa3dca774da74bb5 (patch) | |
tree | 488e3f945c3a6cc00aa453e8437d255501a2f856 | |
parent | 51872d50ff250df0bad130ab7843b69ea921a1f1 (diff) |
Scripts/KingsRest: Implement The Golden Serpent encounter (#30100)
6 files changed, 513 insertions, 4 deletions
diff --git a/sql/updates/world/master/2024_08_02_02_world.sql b/sql/updates/world/master/2024_08_02_02_world.sql new file mode 100644 index 00000000000..8d6f42e26fd --- /dev/null +++ b/sql/updates/world/master/2024_08_02_02_world.sql @@ -0,0 +1,108 @@ +SET @CGUID := 7001517; +SET @SPAWNGROUPID := 1256; + +-- Creature +DELETE FROM `creature` WHERE `guid` = @CGUID+0; +INSERT INTO `creature` (`guid`, `id`, `map`, `zoneId`, `areaId`, `spawnDifficulties`, `PhaseId`, `PhaseGroup`, `modelid`, `equipment_id`, `position_x`, `position_y`, `position_z`, `orientation`, `spawntimesecs`, `wander_distance`, `currentwaypoint`, `curHealthPct`, `MovementType`, `npcflag`, `unit_flags`, `unit_flags2`, `unit_flags3`, `VerifiedBuild`) VALUES +(@CGUID+0, 135322, 1762, 9526, 9526, '23,8,2', 0, 0, 0, 0, -1065.96875, 2641.5087890625, 796.115234375, 5.113396167755126953, 86400, 0, 0, 100, 0, NULL, NULL, NULL, NULL, 55261); -- The Golden Serpent (Area: Kings' Rest - Difficulty: Heroic) CreateObject2) + +-- Template +UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'boss_the_golden_serpent' WHERE `entry` = 135322; +UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'npc_animated_gold' WHERE `entry`= 135406; + +UPDATE `creature` SET `StringId` = 'TempleEvent' WHERE `guid` IN (7001366, 7001357, 7001364, 7001359, 7001360, 7001358, 7001362, 7001353, 7001363, 7001352, 7001350); + +-- Template Addon +DELETE FROM `creature_template_addon` WHERE `entry` IN (135322 /*135322 (The Golden Serpent) - Golden Serpent Emerge State*/, 135406 /*135406 (Animated Gold) - Molten Gold*/); +INSERT INTO `creature_template_addon` (`entry`, `PathId`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES +(135322, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, ''), -- 135322 (The Golden Serpent) +(135406, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, '265915'); -- 135406 (Animated Gold) - Molten Gold + +DELETE FROM `spell_script_names` WHERE `spell_id` IN (265773, 265915); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(265773, 'spell_kings_rest_spit_gold'), +(265915, 'spell_kings_rest_molten_gold'); + +-- Spawngroup +DELETE FROM `spawn_group_template` WHERE `groupId` = @SPAWNGROUPID; +INSERT INTO `spawn_group_template` (`groupId`, `groupName`, `groupFlags`) VALUES +(@SPAWNGROUPID, 'Kings Rest - Boss Golden Serpent', 0x04); + +DELETE FROM `spawn_group` WHERE `groupId` = @SPAWNGROUPID AND `spawnType`= 0; +INSERT INTO `spawn_group` (`groupId`, `spawnType`, `spawnId`) VALUES +(@SPAWNGROUPID, 0, @CGUID+0); + +-- Areatrigger +DELETE FROM `areatrigger_template` WHERE (`Id`=17570 AND `IsCustom`=0); +INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `Flags`, `VerifiedBuild`) VALUES +(17570, 0, 0, 55261); + +DELETE FROM `areatrigger_create_properties` WHERE (`Id`=12928 AND `IsCustom`=0); +INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `TimeToTarget`, `TimeToTargetScale`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `VerifiedBuild`) VALUES +(12928, 0, 17570, 0, 4, 0, 0, 0, 0, -1, 0, 336, 0, 0, 0, 5, 5, 0, 0, 0, 0, 0, 0, 55261); -- Spell: 265915 (Molten Gold) + +UPDATE `areatrigger_create_properties` SET `ScriptName` = 'at_kings_rest_molten_gold' WHERE (`Id`=12928 AND `IsCustom`=0); + +-- Creature Text +DELETE FROM `creature_text` WHERE `CreatureID` = 135322; +INSERT INTO `creature_text` (`CreatureID`, `GroupID`, `ID`, `Text`, `Type`, `Language`, `Probability`, `Emote`, `Duration`, `Sound`, `BroadcastTextId`, `TextRange`, `comment`) VALUES +(135322, 0, 0, '|TInterface\\ICONS\\INV_Misc_Gem_Pearl_04.blp:20|t The Golden Serpent absorbs an Animated Gold, gaining |cFFFF0000|Hspell:265991|h[Luster]|h|r!', 16, 0, 100, 0, 0, 0, 156383, 0, 'The Golden Serpent to Animated Gold'); + +-- Spelltarget condition +DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId` = 13) AND (`SourceEntry` IN (265991)); +INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `Comment`) VALUES +(13, 3, 265991, 0, 0, 51, 0, 5, 135322, 0, '', 0, 'Potential target of the spell is creature, entry is The Golden Serpent (135322)'); + +-- Difficulty +DELETE FROM `creature_template_difficulty` WHERE (`Entry`=135406 AND `DifficultyID`=23); +INSERT INTO `creature_template_difficulty` (`Entry`, `DifficultyID`, `HealthScalingExpansion`, `HealthModifier`, `ManaModifier`, `CreatureDifficultyID`, `TypeFlags`, `TypeFlags2`) VALUES +(135406, 23, 7, 0.200000002980232238, 1, 147450, 2097224, 128); -- Animated Gold + +UPDATE `creature_template_difficulty` SET `LevelScalingDeltaMin`=1, `LevelScalingDeltaMax`=1, `ContentTuningID`=502, `StaticFlags1`=268435456, `VerifiedBuild`=55261 WHERE (`Entry`=135406 AND `DifficultyID`=23); -- 135406 (Animated Gold) - CanSwim + +-- Path for Golden Serpent +SET @ENTRY := 135322; +SET @PATHOFFSET := 0; +SET @PATH := @ENTRY * 100 + @PATHOFFSET; +DELETE FROM `waypoint_path` WHERE `PathId`= @PATH; +INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Comment`) VALUES +(@PATH, 2, 0, 'The Golden Serpent - Intro Submerge Path'); + +DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH; +INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES +(@PATH, 0, -1065.9688, 2641.5088, 776.11523, NULL, 0), +(@PATH, 1, -1065.9688, 2641.5088, 796.11523, NULL, 0), +(@PATH, 2, -1065.9688, 2641.5088, 816.11523, NULL, 0), +(@PATH, 3, -1065.9688, 2641.5088, 816.11523, NULL, 0); + +SET @ENTRY := 135322; +SET @PATHOFFSET := 1; +SET @PATH := @ENTRY * 100 + @PATHOFFSET; +DELETE FROM `waypoint_path` WHERE `PathId`= @PATH; +INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Comment`) VALUES +(@PATH, 2, 0x02, 'The Golden Serpent - Intro Flying Path'); + +DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH; +INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES +(@PATH, 0, -1064.7257, 2633.5278, 819.26984, NULL, 0), +(@PATH, 1, -1057.2899, 2629.4766, 820.6274, NULL, 0), +(@PATH, 2, -1052.3473, 2632.2317, 821.54755, NULL, 0), +(@PATH, 3, -1050.8108, 2639.5227, 821.841, NULL, 0), +(@PATH, 4, -1051.2969, 2645.2969, 822.05347, NULL, 0), +(@PATH, 5, -1053.8577, 2657.0027, 821.2045, NULL, 0), +(@PATH, 6, -1072.1163, 2661.9514, 820.30493, NULL, 0), +(@PATH, 7, -1084.0192, 2651.1016, 820.091, NULL, 0), +(@PATH, 8, -1089.3334, 2635.2275, 819.84454, NULL, 0), +(@PATH, 9, -1082.0764, 2621.9514, 819.26984, NULL, 0), +(@PATH, 10, -1058.8403, 2615.1667, 815.8778, NULL, 0); + +SET @ENTRY := 135322; +SET @PATHOFFSET := 2; +SET @PATH := @ENTRY * 100 + @PATHOFFSET; +DELETE FROM `waypoint_path` WHERE `PathId`= @PATH; +INSERT INTO `waypoint_path` (`PathId`, `MoveType`, `Flags`, `Comment`) VALUES +(@PATH, 3, 0x02, 'The Golden Serpent - Intro Landing Path'); + +DELETE FROM `waypoint_path_node` WHERE `PathId`= @PATH; +INSERT INTO `waypoint_path_node` (`PathId`, `NodeId`, `PositionX`, `PositionY`, `PositionZ`, `Orientation`, `Delay`) VALUES +(@PATH, 0, -1058.8403, 2615.1667, 810.1519, NULL, 0); diff --git a/src/server/scripts/Zandalar/KingsRest/boss_golden_serpent.cpp b/src/server/scripts/Zandalar/KingsRest/boss_golden_serpent.cpp new file mode 100644 index 00000000000..ed7f8433e33 --- /dev/null +++ b/src/server/scripts/Zandalar/KingsRest/boss_golden_serpent.cpp @@ -0,0 +1,365 @@ +/* + * 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 "CreatureAI.h" +#include "CreatureAIImpl.h" +#include "InstanceScript.h" +#include "Map.h" +#include "MotionMaster.h" +#include "ObjectAccessor.h" +#include "ScriptMgr.h" +#include "ScriptedCreature.h" +#include "SpellAuraEffects.h" +#include "SpellScript.h" +#include "SpellAuras.h" +#include "SharedDefines.h" +#include "TemporarySummon.h" +#include "kings_rest.h" + +enum GoldenSerpentSpells +{ + SPELL_SPIT_GOLD = 265773, + SPELL_SERPENTINE_GUST = 265781, + SPELL_TAIL_TRASH = 265910, + SPELL_LUCRES_CALL = 265923, + SPELL_MOLTEN_GOLD_DAMAGE = 265914, + SPELL_MOLTEN_GOLD_AURA = 265915, + SPELL_LUSTER = 265991, + SPELL_BREAK_PLAYER_TARGETTING = 140562, + SPELL_GOLDEN_SERPENT_EMERGE_STATE = 271598 +}; + +enum GoldenSerpentEvents +{ + EVENT_SPIT_GOLD = 1, + EVENT_SERPENTINE_GUST, + EVENT_TAIL_TRASH, + EVENT_LUCRES_CALL +}; + +enum GoldenSerpentTexts +{ + SAY_ANNOUNCE_ABSORB_ANIMATED_GOLD = 0 +}; + +enum GoldenSerpentActions +{ + ACTION_ANNOUNCE_ABSORB_ANIMATED_GOLD = 1 +}; + +enum GoldenSerpentNPCs +{ + NPC_ANIMATED_GOLD = 135406 +}; + +enum GoldenSerpentMisc +{ + DISPLAY_INVISIBLE = 11686 +}; + +enum GoldenSerpentPaths +{ + PATH_GOLDEN_SERPENT_SUBMERGE = 13532200, + PATH_GOLDEN_SERPENT_FLYING = 13532201, + PATH_GOLDEN_SERPENT_LANDING = 13532202, +}; + +constexpr Position GoldenSerpentRespawnPos = { -1058.8403f, 2615.1667f, 810.1519f, 5.113396f }; + +// 135322 - The Golden Serpent +struct boss_the_golden_serpent : public BossAI +{ + boss_the_golden_serpent(Creature* creature) : BossAI(creature, DATA_GOLDEN_SERPENT), _announcedLuster(false) { } + + void JustAppeared() override + { + if (instance->GetBossState(DATA_GOLDEN_SERPENT) == NOT_STARTED) + { + me->SetDisableGravity(true, true); + me->SetAnimTier(AnimTier::Fly, true); + me->SetPlayHoverAnim(true); + me->SetFaction(FACTION_FRIENDLY); + me->SetUnitFlag(UnitFlags(UNIT_FLAG_UNINTERACTIBLE)); + DoCast(SPELL_GOLDEN_SERPENT_EMERGE_STATE); + me->GetMotionMaster()->MovePath(PATH_GOLDEN_SERPENT_SUBMERGE, false); + } + } + + void InitializeAI() override + { + if (instance->GetBossState(DATA_GOLDEN_SERPENT) != NOT_STARTED) + me->Relocate(GoldenSerpentRespawnPos); + } + + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + } + + void EnterEvadeMode(EvadeReason /*why*/) override + { + instance->SendEncounterUnit(ENCOUNTER_FRAME_DISENGAGE, me); + + summons.DespawnAll(); + _EnterEvadeMode(); + _DespawnAtEvade(); + } + + void Reset() override + { + _announcedLuster = false; + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + instance->SendEncounterUnit(ENCOUNTER_FRAME_ENGAGE, me, 1); + events.ScheduleEvent(EVENT_SPIT_GOLD, 9s); + events.ScheduleEvent(EVENT_SERPENTINE_GUST, 12s + 500ms); + events.ScheduleEvent(EVENT_TAIL_TRASH, 15s + 500ms); + events.ScheduleEvent(EVENT_LUCRES_CALL, 40s); + } + + void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override + { + if (pathId == PATH_GOLDEN_SERPENT_SUBMERGE) + { + me->RemoveAurasDueToSpell(SPELL_GOLDEN_SERPENT_EMERGE_STATE); + me->GetMotionMaster()->MovePath(PATH_GOLDEN_SERPENT_FLYING, false); + } + else if (pathId == PATH_GOLDEN_SERPENT_FLYING) + me->GetMotionMaster()->MovePath(PATH_GOLDEN_SERPENT_LANDING, false); + else if (pathId == PATH_GOLDEN_SERPENT_LANDING) + { + me->SetAnimTier(AnimTier::Ground, true); + me->SetPlayHoverAnim(false); + me->SetFaction(FACTION_MONSTER_2); + me->RemoveUnitFlag(UnitFlags(UNIT_FLAG_UNINTERACTIBLE)); + me->SetDisableGravity(false); + } + } + + void DoAction(int32 action) override + { + if (action == ACTION_ANNOUNCE_ABSORB_ANIMATED_GOLD) + { + if (!_announcedLuster) + { + Talk(SAY_ANNOUNCE_ABSORB_ANIMATED_GOLD); + _announcedLuster = true; + } + } + } + + 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_SPIT_GOLD: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 300.0f, true)) + DoCast(target, SPELL_SPIT_GOLD); + events.ScheduleEvent(EVENT_SPIT_GOLD, 11s); + break; + case EVENT_SERPENTINE_GUST: + DoCastSelf(SPELL_SERPENTINE_GUST); + events.ScheduleEvent(EVENT_SERPENTINE_GUST, 21s + 500ms); + break; + case EVENT_TAIL_TRASH: + DoCastVictim(SPELL_TAIL_TRASH); + events.ScheduleEvent(EVENT_TAIL_TRASH, 17s); + break; + case EVENT_LUCRES_CALL: + DoCastSelf(SPELL_LUCRES_CALL); + _announcedLuster = false; + events.ScheduleEvent(EVENT_LUCRES_CALL, 41s + 500ms); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } + } +private: + bool _announcedLuster; +}; + +// 135406 - Animated Gold +struct npc_animated_gold : public ScriptedAI +{ + npc_animated_gold(Creature* creature) : ScriptedAI(creature), _isMoltenGoldCast(false) { } + + void JustAppeared() override + { + DoCastSelf(SPELL_BREAK_PLAYER_TARGETTING); + me->SetReactState(REACT_PASSIVE); + } + + void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_LUCRES_CALL) + { + _scheduler.Schedule(3s, [this](TaskContext) + { + if (!me->HasAura(SPELL_MOLTEN_GOLD_AURA)) + { + Creature* goldenSerpent = me->GetInstanceScript()->GetCreature(DATA_GOLDEN_SERPENT); + if (!goldenSerpent) + return; + + me->GetMotionMaster()->Clear(); + me->SetWalk(true); + me->GetMotionMaster()->MoveFollow(goldenSerpent, 2.0f, {}, {}, true); + _isMoltenGoldCast = false; + } + }); + } + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override + { + if (me->GetHealth() <= damage) + { + damage = me->GetHealth() - 1; + + if (!_isMoltenGoldCast) + { + me->CastSpell(nullptr, SPELL_MOLTEN_GOLD_AURA, false); + me->GetMotionMaster()->Clear(); + me->StopMoving(); + _isMoltenGoldCast = true; + } + } + } + + void MovementInform(uint32 type, uint32 /*pointId*/) override + { + if (type == FOLLOW_MOTION_TYPE) + { + Creature* goldenSerpent = me->GetInstanceScript()->GetCreature(DATA_GOLDEN_SERPENT); + if (!goldenSerpent) + return; + + if (!goldenSerpent->IsAIEnabled()) + return; + + me->DespawnOrUnsummon(4s); + me->GetMotionMaster()->Clear(); + me->StopMoving(); + me->CastSpell(nullptr, SPELL_LUSTER, true); + goldenSerpent->AI()->DoAction(ACTION_ANNOUNCE_ABSORB_ANIMATED_GOLD); + me->SetDisplayId(DISPLAY_INVISIBLE); + me->SetUnitFlag(UnitFlags(UNIT_FLAG_UNINTERACTIBLE)); + } + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; + bool _isMoltenGoldCast; +}; + +// 17570 - Molten Gold - Areatrigger +struct at_kings_rest_molten_gold : AreaTriggerAI +{ + at_kings_rest_molten_gold(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { } + + void OnUnitEnter(Unit* unit) override + { + if (!unit->IsPlayer()) + return; + + unit->CastSpell(nullptr, SPELL_MOLTEN_GOLD_DAMAGE , false); + } + + void OnUnitExit(Unit* unit) override + { + unit->RemoveAurasDueToSpell(SPELL_MOLTEN_GOLD_DAMAGE); + } +}; + +// 265773 - Spit Gold +class spell_kings_rest_spit_gold : public AuraScript +{ + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; + + if (Unit* caster = GetCaster()) + caster->SummonCreature(NPC_ANIMATED_GOLD, GetTarget()->GetPosition()); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_kings_rest_spit_gold::OnRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } +}; + +// 265915 - Molten Gold +class spell_kings_rest_molten_gold : public AuraScript +{ + void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->SetUnitFlag(UnitFlags(UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_UNINTERACTIBLE)); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->RemoveUnitFlag(UnitFlags(UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_UNINTERACTIBLE)); + } + + void Register() override + { + AfterEffectApply += AuraEffectRemoveFn(spell_kings_rest_molten_gold::OnApply, EFFECT_1, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); + AfterEffectRemove += AuraEffectRemoveFn(spell_kings_rest_molten_gold::OnRemove, EFFECT_1, SPELL_AURA_TRANSFORM, AURA_EFFECT_HANDLE_REAL); + } +}; + +void AddSC_boss_golden_serpent() +{ + // Creature + RegisterKingsRestCreatureAI(boss_the_golden_serpent); + RegisterKingsRestCreatureAI(npc_animated_gold); + + // Areatrigger + RegisterAreaTriggerAI(at_kings_rest_molten_gold); + + // Spells + RegisterSpellScript(spell_kings_rest_spit_gold); + RegisterSpellScript(spell_kings_rest_molten_gold); +} diff --git a/src/server/scripts/Zandalar/KingsRest/instance_kings_rest.cpp b/src/server/scripts/Zandalar/KingsRest/instance_kings_rest.cpp index 3b9e119505d..7e3d942edfd 100644 --- a/src/server/scripts/Zandalar/KingsRest/instance_kings_rest.cpp +++ b/src/server/scripts/Zandalar/KingsRest/instance_kings_rest.cpp @@ -15,7 +15,9 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "Creature.h" #include "InstanceScript.h" +#include "Map.h" #include "ScriptMgr.h" #include "kings_rest.h" @@ -65,7 +67,36 @@ public: LoadObjectData(creatureData, objectData); LoadDoorData(doorData); LoadDungeonEncounterData(encounters); + + _serpentTempleSpawns = 0; + } + + void OnCreatureCreate(Creature* creature) override + { + InstanceScript::OnCreatureCreate(creature); + + if (creature->HasStringId("TempleEvent")) + _serpentTempleSpawns++; } + + void OnUnitDeath(Unit* unit) override + { + Creature* creature = unit->ToCreature(); + if (!creature) + return; + + if (creature->HasStringId("TempleEvent")) + { + _serpentTempleSpawns--; + if (_serpentTempleSpawns > 0) + return; + + instance->SpawnGroupSpawn(SPAWN_GROUP_SERPENT_BOSS); + } + } + + private: + uint8 _serpentTempleSpawns; }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Zandalar/KingsRest/kings_rest.cpp b/src/server/scripts/Zandalar/KingsRest/kings_rest.cpp index dcd18da9c40..00d545b3d3f 100644 --- a/src/server/scripts/Zandalar/KingsRest/kings_rest.cpp +++ b/src/server/scripts/Zandalar/KingsRest/kings_rest.cpp @@ -48,9 +48,6 @@ enum KingsRestData // Conversation CONV_ZUL_KINGS_REST_INTRO = 7690, - // Spawngroups - SPAWN_GROUP_PRE_FIRST_BOSS = 1255, - // Spells SPELL_ZUL_SHADOWFORM = 269058, SPELL_ZUL_TRASH_EVENT_STATE = 269905, diff --git a/src/server/scripts/Zandalar/KingsRest/kings_rest.h b/src/server/scripts/Zandalar/KingsRest/kings_rest.h index 6f6c69bd620..3a3b6e3dee2 100644 --- a/src/server/scripts/Zandalar/KingsRest/kings_rest.h +++ b/src/server/scripts/Zandalar/KingsRest/kings_rest.h @@ -28,7 +28,7 @@ uint32 const EncounterCount = 4; enum KingsRestDataTypes { // Encounters - DATA_GOLDEN_SERPENT = 0, + DATA_GOLDEN_SERPENT = 0, DATA_MCHIMBA_THE_EMBALMER, DATA_COUNCIL_OF_TRIBES, DATA_KING_DAZAR, @@ -61,6 +61,12 @@ enum KingsRestGameObjectIds GO_KINGS_REST_LIQUID_GOLD_POOL = 289347 }; +enum KingsRestSpawnGroups +{ + SPAWN_GROUP_PRE_FIRST_BOSS = 1255, + SPAWN_GROUP_SERPENT_BOSS = 1256 +}; + template <class AI, class T> inline AI* GetKingsRestAI(T* obj) { diff --git a/src/server/scripts/Zandalar/zandalar_script_loader.cpp b/src/server/scripts/Zandalar/zandalar_script_loader.cpp index bc16599fbb8..8145d99f20e 100644 --- a/src/server/scripts/Zandalar/zandalar_script_loader.cpp +++ b/src/server/scripts/Zandalar/zandalar_script_loader.cpp @@ -25,6 +25,7 @@ void AddSC_boss_cragmaw_the_infested(); // KingsRest void AddSC_instance_kings_rest(); void AddSC_kings_rest(); +void AddSC_boss_golden_serpent(); // The name of this function should match: // void Add${NameOfDirectory}Scripts() @@ -38,4 +39,5 @@ void AddZandalarScripts() //KingsRest AddSC_instance_kings_rest(); AddSC_kings_rest(); + AddSC_boss_golden_serpent(); } |