diff options
author | Aqua Deus <95978183+aquadeus@users.noreply.github.com> | 2024-09-02 00:50:22 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-02 00:50:22 +0200 |
commit | 8f580b0581ac16fc1adfdfeb0f2abbeb98c4d2f1 (patch) | |
tree | 0a5dfd64568dc17f03723ce5a4461a1d865455db /src | |
parent | 314e155a0c4b9f904d6b36898941cc1966d8a719 (diff) |
Scripts/WaycrestManor: Implement Lord and Lady Waycrest outro (#30109)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 10 | ||||
-rw-r--r-- | src/server/scripts/KulTiras/WaycrestManor/waycrest_manor.cpp | 171 |
2 files changed, 178 insertions, 3 deletions
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 3527310f4ec..e93fc7b6a27 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4782,6 +4782,16 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->AttributesEx2 |= SPELL_ATTR2_IGNORE_LINE_OF_SIGHT; }); + // Waycrest Manor - Waycrests Defeated (Horde) + // Waycrest Manor - Waycrests Defeated (Alliance) + ApplySpellFix({ 267595, 267597, 267609 }, [](SpellInfo* spellInfo) + { + ApplySpellEffectFix(spellInfo, EFFECT_0, [](SpellEffectInfo* spellEffectInfo) + { + spellEffectInfo->Effect = SPELL_EFFECT_CREATE_CONVERSATION; + }); + }); + // ENDOF WAYCREST MANOR SPELLS // diff --git a/src/server/scripts/KulTiras/WaycrestManor/waycrest_manor.cpp b/src/server/scripts/KulTiras/WaycrestManor/waycrest_manor.cpp index d220f0d25c5..d8973eb29e7 100644 --- a/src/server/scripts/KulTiras/WaycrestManor/waycrest_manor.cpp +++ b/src/server/scripts/KulTiras/WaycrestManor/waycrest_manor.cpp @@ -17,14 +17,18 @@ #include "AreaTrigger.h" #include "AreaTriggerAI.h" +#include "Conversation.h" #include "Creature.h" #include "InstanceScript.h" +#include "Map.h" +#include "MotionMaster.h" #include "ObjectAccessor.h" #include "Player.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "SpellAuraEffects.h" #include "SpellScript.h" +#include "TaskScheduler.h" #include "waycrest_manor.h" enum WaycrestManorSpells @@ -39,14 +43,33 @@ enum WaycrestManorSpells SPELL_THORNED_BARRAGE = 265760, SPELL_WILDFIRE_MISSILE = 260566, SPELL_WILDFIRE_DAMAGE = 260569, - SPELL_WILDFIRE_DAMAGE_NPC = 273294 + SPELL_WILDFIRE_DAMAGE_NPC = 273294, + + // Lord and Lady Waycrest outro + SPELL_ORGAN_MISSILES = 267646, + SPELL_DEATH_REALM_PHASE = 263332, + SPELL_WAYCRESTS_DEFEATED_ALLIANCE = 267597, + SPELL_WAYCRESTS_DEFEATED_HORDE = 267595, + SPELL_COSMETIC_MISSILE_TRANSFORM = 267669 +}; + +enum WaycrestManorMisc +{ + // Conversations after Waycrests are defeated + CONVERSATION_LINE_LUCILLE_WAYCREST = 16957, + CONVERSATION_LINE_GORAK_TUL_HORDE = 16850, + CONVO_ACTOR_IDX_GORAK_TUL = 0, + + PATH_GORAK_TUL = 13616100 }; enum WaycrestManorEvents { // Matron Bryndle EVENT_SPLINTER_SPIKE = 1, - EVENT_THORNED_BARRAGE + EVENT_THORNED_BARRAGE, + EVENT_GORAK_TUL_TRANSFORM, + EVENT_GORAK_TUL_MOVE }; // 135329 - Matron Bryndle @@ -267,6 +290,144 @@ struct at_waycrest_manor_wildfire : AreaTriggerAI } }; +// 267643 - Organ Missiles +struct at_waycrest_manor_organ_missiles : AreaTriggerAI +{ + at_waycrest_manor_organ_missiles(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { } + + void OnCreate(Spell const* /*creatingSpell*/) override + { + _scheduler.Schedule(100ms, 300ms, [this](TaskContext task) + { + if (Unit* caster = at->GetCaster()) + caster->CastSpell(at->GetPosition(), SPELL_ORGAN_MISSILES, TRIGGERED_IGNORE_CAST_IN_PROGRESS); + + task.Repeat(100ms, 300ms); + }); + } + + void OnRemove() override + { + if (Unit* caster = at->GetCaster()) + { + Creature* casterCreature = caster->ToCreature(); + if (!casterCreature) + return; + + InstanceScript* instance = casterCreature->GetInstanceScript(); + if (!instance) + return; + + casterCreature->RemoveAurasDueToSpell(SPELL_DEATH_REALM_PHASE); + casterCreature->SetUninteractible(false); + casterCreature->CastSpell(casterCreature, instance->instance->GetTeamInInstance() == HORDE ? SPELL_WAYCRESTS_DEFEATED_HORDE : SPELL_WAYCRESTS_DEFEATED_ALLIANCE); + } + } + + void OnUpdate(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; +}; + +// 267646 - Organ Missiles +class spell_waycrest_manor_organ_missiles : public SpellScript +{ + void SetDest(SpellDestination& dest) + { + dest.RelocateOffset({ frand(-26.0f, -15.0f), frand(-26.0f, 21.0f), 0.0f, 0.0f }); + } + + void Register() override + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_waycrest_manor_organ_missiles::SetDest, EFFECT_0, TARGET_DEST_DEST); + } +}; + +// 267595 - Waycrest Manor - Waycrests Defeated (Horde) +// 267597 - Waycrest Manor - Waycrests Defeated (Alliance) +// 7351 - Conversation +// 7352 - Conversation +class conversation_waycrest_manor_waycrests_defeated : public ConversationScript +{ +public: + conversation_waycrest_manor_waycrests_defeated() : ConversationScript("conversation_waycrest_manor_waycrests_defeated") { } + + void OnConversationStart(Conversation* conversation) override + { + if (Milliseconds const* gorakTulMoveStartTimeAlliance = conversation->GetLineStartTime(DEFAULT_LOCALE, CONVERSATION_LINE_LUCILLE_WAYCREST)) + _events.ScheduleEvent(EVENT_GORAK_TUL_TRANSFORM, *gorakTulMoveStartTimeAlliance); + else if (Milliseconds const* gorakTulMoveStartTimeHorde = conversation->GetLineStartTime(DEFAULT_LOCALE, CONVERSATION_LINE_GORAK_TUL_HORDE)) + _events.ScheduleEvent(EVENT_GORAK_TUL_TRANSFORM, *gorakTulMoveStartTimeHorde + 3s); + } + + void OnConversationUpdate(Conversation* conversation, uint32 diff) override + { + _events.Update(diff); + + switch (_events.ExecuteEvent()) + { + case EVENT_GORAK_TUL_TRANSFORM: + { + Creature* gorakTul = conversation->GetActorCreature(CONVO_ACTOR_IDX_GORAK_TUL); + if (!gorakTul) + break; + + gorakTul->CastSpell(gorakTul, SPELL_COSMETIC_MISSILE_TRANSFORM); + _events.ScheduleEvent(EVENT_GORAK_TUL_MOVE, 1s); + break; + } + case EVENT_GORAK_TUL_MOVE: + { + Creature* gorakTul = conversation->GetActorCreature(CONVO_ACTOR_IDX_GORAK_TUL); + if (!gorakTul) + break; + + // @TODO: SplineFilter nyi + /* + ServerToClient: SMSG_ON_MONSTER_MOVE (0x2DD4) Length: 191 ConnIdx: 1 Time: 07/19/2024 09:17:19.888 Number: 8254 + MoverGUID: Full: 0x204128E8C084F840001FF700001A1123 Creature/0 R4170/S8183 Map: 1862 (Waycrest Manor) Entry: 136161 (Gorak Tul) Low: 1708323 + Position: X: -524.88715 Y: -260.56772 Z: 182.55463 + (MovementMonsterSpline) (MovementSpline) Flags: 2438990336 (Flying, Catmullrom, CanSwim, UncompressedPath, Unknown5, Steering, Unknown10) + (MovementMonsterSpline) (MovementSpline) HasSplineFilter: True + (MovementMonsterSpline) (MovementSpline) (MonsterSplineFilter) MonsterSplineFilterKey: 2 + (MovementMonsterSpline) (MovementSpline) (MonsterSplineFilter) BaseSpeed: 5 + (MovementMonsterSpline) (MovementSpline) (MonsterSplineFilter) StartOffset: 0 + (MovementMonsterSpline) (MovementSpline) (MonsterSplineFilter) DistToPrevFilterKey: 0 + (MovementMonsterSpline) (MovementSpline) (MonsterSplineFilter) AddedToStart: 1 + (MovementMonsterSpline) (MovementSpline) (MonsterSplineFilter) [0] IDx: 0 + (MovementMonsterSpline) (MovementSpline) (MonsterSplineFilter) [0] Speed: 500 + (MovementMonsterSpline) (MovementSpline) (MonsterSplineFilter) [1] IDx: 1 + (MovementMonsterSpline) (MovementSpline) (MonsterSplineFilter) [1] Speed: 1500 + (MovementMonsterSpline) (MovementSpline) (MonsterSplineFilter) FilterFlags: 2 + (MovementMonsterSpline) (MovementSpline) [0] Points: X: -525.816 Y: -261.41666 Z: 188.96046 + (MovementMonsterSpline) (MovementSpline) [1] Points: X: -532.49304 Y: -279.55383 Z: 186.57698 + (MovementMonsterSpline) (MovementSpline) [2] Points: X: -526.13367 Y: -292.1389 Z: 185.22873 + (MovementMonsterSpline) (MovementSpline) [3] Points: X: -501.00696 Y: -316.64932 Z: 171.55269 + (MovementMonsterSpline) (MovementSpline) [4] Points: X: -488.12326 Y: -329.7795 Z: 161.65425 + (MovementMonsterSpline) (MovementSpline) [5] Points: X: -470.80383 Y: -326.80557 Z: 159.51692 + (MovementMonsterSpline) (MovementSpline) [6] Points: X: -460.06772 Y: -335.67188 Z: 158.33897 + (MovementMonsterSpline) (MovementSpline) [7] Points: X: -446.75 Y: -343.94272 Z: 155.77182 + (MovementMonsterSpline) (MovementSpline) [8] Points: X: -441.15625 Y: -344.0955 Z: 157.48708 + (MovementMonsterSpline) (MovementSpline) CalculatedSpeedXY: 46.351273 + */ + + gorakTul->SetFloating(true); + gorakTul->GetMotionMaster()->MovePath(PATH_GORAK_TUL, false); + break; + } + default: + break; + } + } + +private: + EventMap _events; +}; + void AddSC_waycrest_manor() { // Matron Bryndle @@ -276,6 +437,10 @@ void AddSC_waycrest_manor() RegisterSpellScript(spell_waycrest_manor_drain_goliath_essence); RegisterSpellScript(spell_waycrest_manor_splinter_spike_selector); RegisterSpellScript(spell_waycrest_manor_wildfire); - RegisterAreaTriggerAI(at_waycrest_manor_wildfire); + + // Lord and Lady Waycrest outro + RegisterAreaTriggerAI(at_waycrest_manor_organ_missiles); + RegisterSpellScript(spell_waycrest_manor_organ_missiles); + new conversation_waycrest_manor_waycrests_defeated(); } |