diff options
author | offl <11556157+offl@users.noreply.github.com> | 2021-11-01 18:10:39 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-03-21 00:20:06 +0100 |
commit | 77bb4d2619f5b9409cb7173d34ebce4ffaf0cb9c (patch) | |
tree | 029571eae8f618f35657a223ec37eb1565cf8e57 /src | |
parent | 3fbc9d796d2bb5553fd83c652d0e1539de9ec09e (diff) |
Scripts/Quest: Update 'Trail of Fire' & 'Warning: Some Assembly Required' (#27184)
(cherry picked from commit cbb13b0efbdfa86657b05710672df588701a1280)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/zone_howling_fjord.cpp | 348 |
1 files changed, 56 insertions, 292 deletions
diff --git a/src/server/scripts/Northrend/zone_howling_fjord.cpp b/src/server/scripts/Northrend/zone_howling_fjord.cpp index 8b37c2c0b33..fa721415ff0 100644 --- a/src/server/scripts/Northrend/zone_howling_fjord.cpp +++ b/src/server/scripts/Northrend/zone_howling_fjord.cpp @@ -28,226 +28,6 @@ #include "Vehicle.h" /*###### -## npc_apothecary_hanes -######*/ -enum Entries -{ - NPC_APOTHECARY_HANES = 23784, - QUEST_TRAIL_OF_FIRE = 11241, - - SPELL_HEALING_POTION = 17534, - SPELL_BURN = 42685, - - EVENT_EMOTE_BEG = 1, - EVENT_BEGIN = 2, - EVENT_START_ESCORT = 3, - EVENT_TALK_1 = 4, - EVENT_KNEEL = 5, - EVENT_TALK_2 = 6, - EVENT_BURN_CRATES = 7, - EVENT_TALK_3 = 8, - EVENT_TALK_4 = 9, - EVENT_LAUGH = 10, - EVENT_TALK_5 = 11, - EVENT_TALK_6 = 12, - EVENT_TALK_8 = 13, - - TALK_0 = 0, - TALK_1 = 1, - TALK_2 = 2, - TALK_3 = 3, - TALK_4 = 4, - TALK_5 = 5, - TALK_6 = 6, - TALK_7 = 7, - TALK_8 = 8, - - EQUIP_TORCH = 2 -}; - -class npc_apothecary_hanes : public CreatureScript -{ -public: - npc_apothecary_hanes() : CreatureScript("npc_apothecary_hanes") { } - - struct npc_Apothecary_HanesAI : public EscortAI - { - npc_Apothecary_HanesAI(Creature* creature) : EscortAI(creature) - { - Initialize(); - } - - void StartEscort(Player* player) - { - events.ScheduleEvent(EVENT_BEGIN, 2s); - events.ScheduleEvent(EVENT_START_ESCORT, 6s); - _player = player->GetGUID(); - } - - void Initialize() - { - PotTimer = 10000; //10 sec cooldown on potion - events.Reset(); - events.ScheduleEvent(EVENT_EMOTE_BEG, 2s); - me->SetStandState(UNIT_STAND_STATE_KNEEL); - _player = ObjectGuid(); - } - - uint32 PotTimer; - EventMap events; - ObjectGuid _player; - - void Reset() override - { - SetDespawnAtFar(false); - Initialize(); - } - - void JustDied(Unit* /*killer*/) override - { - if (Player* player = GetPlayerForEscort()) - player->FailQuest(QUEST_TRAIL_OF_FIRE); - } - - void UpdateAI(uint32 diff) override - { - if (HealthBelowPct(75)) - { - if (PotTimer <= diff) - { - DoCast(me, SPELL_HEALING_POTION, true); - PotTimer = 10000; - } else PotTimer -= diff; - } - - if (IsActiveAttacker() && UpdateVictim()) - DoMeleeAttackIfReady(); - - EscortAI::UpdateAI(diff); - - if (me->IsInCombat()) - return; - - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_EMOTE_BEG: - me->HandleEmoteCommand(EMOTE_ONESHOT_BEG); - events.ScheduleEvent(EVENT_EMOTE_BEG, 25s); - break; - case EVENT_BEGIN: - if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) - Talk(TALK_0, player); - break; - case EVENT_START_ESCORT: - events.Reset(); - me->SetFaction(FACTION_ESCORTEE_H_PASSIVE); - me->SetReactState(REACT_AGGRESSIVE); - ENSURE_AI(EscortAI, (me->AI()))->Start(true, true, _player); - break; - case EVENT_TALK_1: - if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) - Talk(TALK_1, player); - break; - case EVENT_KNEEL: - me->HandleEmoteCommand(EMOTE_ONESHOT_KNEEL); - break; - case EVENT_TALK_2: - if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) - Talk(TALK_2, player); - me->LoadEquipment(EQUIP_TORCH); - me->SetSheath(SHEATH_STATE_MELEE); - break; - case EVENT_BURN_CRATES: - DoCastAOE(SPELL_BURN, true); - break; - case EVENT_TALK_3: - if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) - Talk(TALK_3, player); - break; - case EVENT_TALK_4: - if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) - Talk(TALK_4, player); - break; - case EVENT_LAUGH: - me->HandleEmoteCommand(EMOTE_ONESHOT_LAUGH); - break; - case EVENT_TALK_5: - if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) - Talk(TALK_5, player); - me->HandleEmoteCommand(EMOTE_ONESHOT_RUDE); - break; - case EVENT_TALK_6: - if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) - Talk(TALK_6, player); - break; - case EVENT_TALK_8: - if (Player* player = ObjectAccessor::GetPlayer(*me, _player)) - Talk(TALK_8, player); - break; - } - } - } - - void WaypointReached(uint32 waypointId, uint32 /*pathId*/) override - { - if (!GetPlayerForEscort()) - return; - - switch (waypointId) - { - case 1: - events.ScheduleEvent(EVENT_TALK_1, Seconds(3)); - events.ScheduleEvent(EVENT_KNEEL, 5s); - events.ScheduleEvent(EVENT_TALK_2, Seconds(6)); - me->SetStandState(UNIT_STAND_STATE_STAND); - break; - case 12: - events.ScheduleEvent(EVENT_BURN_CRATES, 1s); - events.ScheduleEvent(EVENT_TALK_3, Seconds(3)); - break; - case 20: - events.ScheduleEvent(EVENT_BURN_CRATES, 0s); - break; - case 21: - events.ScheduleEvent(EVENT_BURN_CRATES, 0s); - events.ScheduleEvent(EVENT_TALK_4, Seconds(3)); - break; - case 28: - events.ScheduleEvent(EVENT_BURN_CRATES, 0s); - events.ScheduleEvent(EVENT_LAUGH, 7s); - events.ScheduleEvent(EVENT_TALK_5, Seconds(9)); - events.ScheduleEvent(EVENT_TALK_6, Seconds(17)); - break; - case 35: - if (Player* pl = ObjectAccessor::GetPlayer(*me, _player)) - Talk(TALK_7, pl); - break; - case 40: - if (Player* pl = ObjectAccessor::GetPlayer(*me, _player)) - pl->GroupEventHappens(QUEST_TRAIL_OF_FIRE, me); - events.ScheduleEvent(EVENT_TALK_8, Seconds(4)); - break; - } - } - - void OnQuestAccept(Player* player, Quest const* quest) override - { - if (quest->GetQuestId() == QUEST_TRAIL_OF_FIRE) - StartEscort(player); - } - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_Apothecary_HanesAI(creature); - } -}; - -/*###### ## npc_daegarn ######*/ @@ -421,96 +201,81 @@ private: SummonList _summons; }; -enum MindlessAbomination +/*###### +## Quest 11310: Warning: Some Assembly Required +######*/ + +enum SomeAssemblyRequired { - EVENT_CHECK_CHARMED = 1 + SPELL_PING_MASTER = 43393, // casted on owner after spawn, presumably has a spell script to force owner cast SPELL_MINDLESS_ABOMINATION_CONTROL (currently handled by linked spells) + SPELL_MINDLESS_ABOMINATION_CONTROL = 42168, + + SPELL_RANDOM_CIRCUMFERENCE_POINT_POISON = 42266, + SPELL_RANDOM_CIRCUMFERENCE_POINT_BONE = 42267, + SPELL_RANDOM_CIRCUMFERENCE_POINT_BONE_2 = 42274 }; -class npc_mindless_abomination : public CreatureScript +struct npc_mindless_abomination : public ScriptedAI { -public: - npc_mindless_abomination() : CreatureScript("npc_mindless_abomination") { } + npc_mindless_abomination(Creature* creature) : ScriptedAI(creature) { } - struct npc_mindless_abominationAI : public ScriptedAI + void JustAppeared() override { - npc_mindless_abominationAI(Creature* creature) : ScriptedAI(creature) { } - - void Reset() override - { - events.ScheduleEvent(EVENT_CHECK_CHARMED, 1s); - } + me->SetCorpseDelay(0, true); - void UpdateAI(uint32 diff) override + _scheduler.Schedule(1s, [this](TaskContext task) { - events.Update(diff); - - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_CHECK_CHARMED: - if (!me->IsCharmedOwnedByPlayerOrPlayer()) - me->DespawnOrUnsummon(); - else - events.ScheduleEvent(EVENT_CHECK_CHARMED, 1s); - break; - } - } - } - - private: - EventMap events; - }; + if (!me->IsCharmedOwnedByPlayerOrPlayer()) + me->DespawnOrUnsummon(); + else + task.Repeat(); + }); + } - CreatureAI* GetAI(Creature* creature) const override + void UpdateAI(uint32 diff) override { - return new npc_mindless_abominationAI(creature); + _scheduler.Update(diff); } + +private: + TaskScheduler _scheduler; }; // 42268 - Quest - Mindless Abomination Explosion FX Master -class spell_mindless_abomination_explosion_fx_master : public SpellScriptLoader +class spell_mindless_abomination_explosion_fx_master : public SpellScript { - enum Spells - { - SPELL_RANDOM_CIRCUMFERENCE_POINT_POISON = 42266, - SPELL_COSMETIC_BLOOD_EXPLOSION_GREEN_LARGE = 43401 - }; - - public: - spell_mindless_abomination_explosion_fx_master() : SpellScriptLoader("spell_mindless_abomination_explosion_fx_master") { } + PrepareSpellScript(spell_mindless_abomination_explosion_fx_master); - class spell_mindless_abomination_explosion_fx_master_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( { - PrepareSpellScript(spell_mindless_abomination_explosion_fx_master_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_RANDOM_CIRCUMFERENCE_POINT_POISON, SPELL_COSMETIC_BLOOD_EXPLOSION_GREEN_LARGE }); - } + SPELL_RANDOM_CIRCUMFERENCE_POINT_POISON, + SPELL_RANDOM_CIRCUMFERENCE_POINT_BONE, + SPELL_RANDOM_CIRCUMFERENCE_POINT_BONE_2 + }); + } - void HandleScript(SpellEffIndex /*eff*/) - { - Creature* caster = GetCaster()->ToCreature(); - if (!caster) - return; + void HandleScript(SpellEffIndex /*eff*/) + { + Creature* caster = GetCaster()->ToCreature(); + if (!caster) + return; - caster->CastSpell(caster, SPELL_COSMETIC_BLOOD_EXPLOSION_GREEN_LARGE); + for (uint8 i = 0; i < 11; ++i) + caster->CastSpell(caster, SPELL_RANDOM_CIRCUMFERENCE_POINT_POISON); - for (uint8 i = 0; i < 10; ++i) - caster->CastSpell(caster, SPELL_RANDOM_CIRCUMFERENCE_POINT_POISON); - } + for (uint8 i = 0; i < 6; ++i) + caster->CastSpell(caster, SPELL_RANDOM_CIRCUMFERENCE_POINT_BONE); - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_mindless_abomination_explosion_fx_master_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; + for (uint8 i = 0; i < 4; ++i) + caster->CastSpell(caster, SPELL_RANDOM_CIRCUMFERENCE_POINT_BONE_2); + } - SpellScript* GetSpellScript() const override - { - return new spell_mindless_abomination_explosion_fx_master_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_mindless_abomination_explosion_fx_master::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; /*###### @@ -533,7 +298,7 @@ enum RivenwoodCaptives SPELL_SUMMON_FREED_MIST_WHISPER_SCOUT = 43289 }; -uint32 const CocoonSummonSpells[11] = +std::array<uint32, 11> const CocoonSummonSpells = { SPELL_SUMMON_BABY_RIVEN_WIDOWS, SPELL_SUMMON_DARKCLAW_BAT, @@ -598,10 +363,9 @@ class spell_rivenwood_captives_on_quest : public SpellScript void AddSC_howling_fjord() { - new npc_apothecary_hanes(); RegisterCreatureAI(npc_daegarn); - new npc_mindless_abomination(); - new spell_mindless_abomination_explosion_fx_master(); + RegisterCreatureAI(npc_mindless_abomination); + RegisterSpellScript(spell_mindless_abomination_explosion_fx_master); RegisterSpellScript(spell_rivenwood_captives_not_on_quest); RegisterSpellScript(spell_rivenwood_captives_on_quest); } |