mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Scripts/KingsRest: Implement The Golden Serpent encounter (#30100)
This commit is contained in:
108
sql/updates/world/master/2024_08_02_02_world.sql
Normal file
108
sql/updates/world/master/2024_08_02_02_world.sql
Normal file
@@ -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);
|
||||
365
src/server/scripts/Zandalar/KingsRest/boss_golden_serpent.cpp
Normal file
365
src/server/scripts/Zandalar/KingsRest/boss_golden_serpent.cpp
Normal file
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user