diff options
author | Aqua Deus <95978183+aquadeus@users.noreply.github.com> | 2023-12-12 08:22:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-12 08:22:52 +0100 |
commit | 66e178722a11f7ea382e0d0a2e109330f08f38c3 (patch) | |
tree | d43206bf31c59d1708c366e6f91772b54bd2b983 /src/server/scripts/Draenor | |
parent | 9dd8647125a020ca2dccdf26d6839f4665ff9870 (diff) |
Scripts/Draenor: Implement Altar Altercation quest 34423 (#29440)
Co-authored-by: ModoX <moardox@gmail.com>
Diffstat (limited to 'src/server/scripts/Draenor')
-rw-r--r-- | src/server/scripts/Draenor/zone_assault_on_the_dark_portal.cpp | 336 |
1 files changed, 334 insertions, 2 deletions
diff --git a/src/server/scripts/Draenor/zone_assault_on_the_dark_portal.cpp b/src/server/scripts/Draenor/zone_assault_on_the_dark_portal.cpp index 4ac8dea6db0..60a92fbd20b 100644 --- a/src/server/scripts/Draenor/zone_assault_on_the_dark_portal.cpp +++ b/src/server/scripts/Draenor/zone_assault_on_the_dark_portal.cpp @@ -15,27 +15,82 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "AreaTrigger.h" +#include "AreaTriggerAI.h" #include "PhasingHandler.h" #include "Player.h" #include "QuestDef.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "ScriptedFollowerAI.h" #include "SpellScript.h" +#include "TemporarySummon.h" enum AssaultOnTheDarkPortalSpells { + SPELL_ALTAR_ALTERCATION_CANCEL_AURAS = 167547, // Serverside Spell SPELL_BLEEDING_HOLLOW_HOLDOUT = 164609, + SPELL_BLEEDING_HOLLOW_KILROGG_REVEAL = 161771, SPELL_BLEEDING_HOLLOW_TRAIL_OF_FLAME = 164611, + SPELL_BLEEDING_HOLLOW_SNEAKY_ARMY = 165061, + SPELL_BLOOD_RITUAL_ORB_BEAM = 170044, + SPELL_CANCEL_PHASE_AURA = 165053, SPELL_CANCEL_TRAIL_OF_FLAME_VISUAL = 165993, SPELL_DARK_PORTAL_RUN_AWAY = 158985, SPELL_HUT_CREDIT = 164613, // Serverside Spell + SPELL_ON_ALTAR = 161637, SPELL_PUSH_ARMY = 165072, - SPELL_TRAIL_OF_FLAME_LARGE = 165991 + SPELL_TRAIL_OF_FLAME_LARGE = 165991, + SPELL_UPDATE_PHASE_SHIFT_PLAYER = 82238 }; enum AssaultOnTheDarkPortalQuests { - QUEST_FLAG_ARMY_PUSHED = 35297 + QUEST_FLAG_ARMY_PUSHED = 35297, + QUEST_ALTAR_ALTERCATION = 34423, +}; + +enum AssaultOnTheDarkPortalQuestObjectives +{ + OBJECTIVE_ALTAR_ALTERCATION_SPEAK_WITH_ARIOK = 273075, + OBJECTIVE_ALTAR_ALTERCATION_ESCORT_ARIOK = 273677, +}; + +enum AssaultOnTheDarkPortalNPCs +{ + NPC_ALTAR_ALTERCATION_ARIOK = 80087, + NPC_ALTAR_ALTERCATION_KILROGG = 81926, + NPC_BLEEDING_HOLLOW_BLOODCHOSEN = 81895 +}; + +enum AssaultOnTheDarkPortalTexts +{ + // Ariok + SAY_ARIOK_INTRO_1 = 0, + SAY_ARIOK_INTRO_2 = 1, + SAY_ARIOK_INTRO_3 = 2, + SAY_ARIOK_ON_ALTAR_1 = 3, + SAY_ARIOK_ON_ALTAR_2 = 4, + SAY_ARIOK_MIDDLE_ORB_INTERACT = 5, + SAY_ARIOK_ALTAR_KILROGG_REVEAL = 6, + + // Kilrogg + SAY_KILROGG_WEST_ORB_INTERACT = 0, + SAY_KILROGG_ENTER_ALTAR_AT = 1 +}; + +enum AssaultOnTheDarkPortalActions +{ + ACTION_INTRO = 1, + ACTION_ON_ALTAR = 2 +}; + +enum AssaultOnTheDarkPortalEvents +{ + EVENT_TALK_1 = 1, + EVENT_TALK_2, + EVENT_TALK_3, + EVENT_ALTAR }; // 621 - Dark Portal: Run away @@ -131,6 +186,273 @@ class scene_bleeding_hollow_trail_of_flame : public SceneScript } }; +// 34423 - Altar Altercation +class quest_altar_altercation : public QuestScript +{ +public: + quest_altar_altercation() : QuestScript("quest_altar_altercation") { } + + void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override + { + if (newStatus == QUEST_STATUS_NONE) + player->CastSpell(player, SPELL_ALTAR_ALTERCATION_CANCEL_AURAS, TRIGGERED_FULL_MASK); + } +}; + +// 161618 - Summon Ariok +class spell_altar_altercation_summon_ariok : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_UPDATE_PHASE_SHIFT_PLAYER }); + } + + void HandleOnCast() + { + GetCaster()->CastSpell(GetCaster(), SPELL_UPDATE_PHASE_SHIFT_PLAYER, TRIGGERED_FULL_MASK); + } + + void Register() override + { + BeforeCast += SpellCastFn(spell_altar_altercation_summon_ariok::HandleOnCast); + } +}; + +// 694 - Bleeding Hollow: Kilrogg Reveal +class scene_bleeding_hollow_kilrogg_reveal : public SceneScript +{ +public: + scene_bleeding_hollow_kilrogg_reveal() : SceneScript("scene_bleeding_hollow_kilrogg_reveal") { } + + void OnSceneCancel(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/) override + { + player->CastSpell(player, SPELL_CANCEL_PHASE_AURA, false); + } + + void OnSceneTriggerEvent(Player* player, uint32 /*sceneInstanceID*/, SceneTemplate const* /*sceneTemplate*/, std::string const& triggerName) override + { + if (triggerName == "FreeCamera") + player->CastSpell(player, SPELL_CANCEL_PHASE_AURA, false); + } +}; + +// 167955 - Destroying +class spell_altar_altercation_destroying : public SpellScript +{ + void HandleOnHit(SpellEffIndex /*effIndex*/) + { + Creature* creature = GetHitUnit()->ToCreature(); + if (!creature) + return; + + creature->DespawnOrUnsummon(); // @TODO: Spawntracking should cause despawn for casting player only and respawn on abandon quest + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_altar_altercation_destroying::HandleOnHit, EFFECT_1, SPELL_EFFECT_DUMMY); + } +}; + +// 80087 - Ariok +struct npc_altar_altercation_ariok : public FollowerAI +{ + npc_altar_altercation_ariok(Creature* creature) : FollowerAI(creature) { } + + void JustAppeared() override + { + DoAction(ACTION_INTRO); + + if (TempSummon const* tempSummon = me->ToTempSummon()) + { + if (Player* summoner = tempSummon->GetSummoner()->ToPlayer()) + { + if (!summoner) + return; + + StartFollow(summoner); + } + } + } + + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_INTRO: + { + events.ScheduleEvent(EVENT_TALK_1, 1s); + break; + } + case ACTION_ON_ALTAR: + { + Talk(SAY_ARIOK_ON_ALTAR_1); + me->AddUnitState(UNIT_STATE_ROOT); + events.ScheduleEvent(EVENT_ALTAR, 5s + 400ms); + break; + } + default: + break; + } + } + + void UpdateAI(uint32 diff) override + { + events.Update(diff); + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_TALK_1: + Talk(SAY_ARIOK_INTRO_1); + events.ScheduleEvent(EVENT_TALK_2, 5s + 700ms); + break; + case EVENT_TALK_2: + Talk(SAY_ARIOK_INTRO_2); + events.ScheduleEvent(EVENT_TALK_3, 7s + 400ms); + break; + case EVENT_TALK_3: + Talk(SAY_ARIOK_INTRO_3); + break; + case EVENT_ALTAR: + me->ClearUnitState(UNIT_STATE_ROOT); + Talk(SAY_ARIOK_ON_ALTAR_2); + break; + default: + break; + } + } + } +private: + EventMap events; +}; + +// 164979 - (Serverside/Non-DB2) Trigger Ariok +class spell_trigger_ariok_altar_altercation : public SpellScript +{ + void HandleOnHit(SpellEffIndex /*effIndex*/) + { + Creature* creature = GetHitUnit()->ToCreature(); + + if (!creature) + return; + + if (GetCaster()->HasAura(SPELL_BLEEDING_HOLLOW_KILROGG_REVEAL)) + { + creature->AI()->Talk(SAY_ARIOK_ALTAR_KILROGG_REVEAL); + creature->DespawnOrUnsummon(); + } + else if (GetCaster()->HasAura(SPELL_ON_ALTAR)) + creature->AI()->DoAction(ACTION_ON_ALTAR); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_trigger_ariok_altar_altercation::HandleOnHit, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 83670 - Blood Ritual Orb +struct npc_altar_altercation_blood_ritual_orb : public ScriptedAI +{ + npc_altar_altercation_blood_ritual_orb(Creature* creature) : ScriptedAI(creature) { } + + void JustAppeared() override + { + if (Creature* bloodChosen = me->FindNearestCreature(NPC_BLEEDING_HOLLOW_BLOODCHOSEN, 50.0f)) + me->CastSpell(bloodChosen, SPELL_BLOOD_RITUAL_ORB_BEAM, true); + } + + void OnSpellClick(Unit* clicker, bool /*spellClickHandled*/) override + { + if (me->HasStringId("west_orb")) + { + Creature* kilrogg = clicker->FindNearestCreatureWithOptions(50.0f, { .CreatureId = NPC_ALTAR_ALTERCATION_KILROGG, .IgnorePhases = true }); + if (!kilrogg) + return; + + kilrogg->AI()->Talk(SAY_KILROGG_WEST_ORB_INTERACT, clicker); + } + else if (me->HasStringId("middle_orb")) + { + Creature* ariok = clicker->FindNearestCreatureWithOptions(50.0f, { .CreatureId = NPC_ALTAR_ALTERCATION_ARIOK, .IsSummon = true, .IgnorePhases = true, .OwnerGuid = clicker->GetGUID() }); + if (!ariok) + return; + + clicker->CastSpell(clicker, SPELL_BLEEDING_HOLLOW_SNEAKY_ARMY, true); + ariok->AI()->Talk(SAY_ARIOK_MIDDLE_ORB_INTERACT); + } + } + + void UpdateAI(uint32 /*diff*/) override + { + UpdateVictim(); + } +}; + +// Id - 52 +struct at_altar_altercation_kilrogg_talk : AreaTriggerAI +{ + at_altar_altercation_kilrogg_talk(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { } + + void OnUnitEnter(Unit* unit) override + { + Player* player = unit->ToPlayer(); + if (!player) + return; + + Creature* kilrogg = unit->FindNearestCreature(NPC_ALTAR_ALTERCATION_KILROGG, 100.0f); + if (!kilrogg) + return; + + kilrogg->AI()->Talk(SAY_KILROGG_ENTER_ALTAR_AT, player); + } +}; + +// Id - 50 +struct at_altar_altercation_reach_altar : AreaTriggerAI +{ + at_altar_altercation_reach_altar(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { } + + bool IsQuestObjectiveComplete(Player* player, uint32 questId, uint32 objectiveId) + { + Quest const* quest = sObjectMgr->GetQuestTemplate(QUEST_ALTAR_ALTERCATION); + if (!quest) + return false; + + uint16 slot = player->FindQuestSlot(QUEST_ALTAR_ALTERCATION); + if (slot >= MAX_QUEST_LOG_SIZE) + return false; + + QuestObjective const* obj = sObjectMgr->GetQuestObjective(objectiveId); + if (!obj) + return false; + + return player->IsQuestObjectiveComplete(slot, quest, *obj); + } + + void OnUnitEnter(Unit* unit) override + { + Player* player = unit->ToPlayer(); + if (!player) + return; + + if (!player->IsQuestObjectiveComplete(QUEST_ALTAR_ALTERCATION, OBJECTIVE_ALTAR_ALTERCATION_SPEAK_WITH_ARIOK)) + return; + + if (player->IsQuestObjectiveComplete(QUEST_ALTAR_ALTERCATION, OBJECTIVE_ALTAR_ALTERCATION_ESCORT_ARIOK)) + return; + + player->CastSpell(nullptr, SPELL_ON_ALTAR); + } + + void OnUnitExit(Unit* unit) override + { + unit->RemoveAurasDueToSpell(SPELL_ON_ALTAR); + } +}; + void AddSC_assault_on_the_dark_portal() { new scene_dark_portal_run_away(); @@ -138,4 +460,14 @@ void AddSC_assault_on_the_dark_portal() new quest_blaze_of_glory(); new scene_bleeding_hollow_holdout(); new scene_bleeding_hollow_trail_of_flame(); + + new quest_altar_altercation(); + RegisterSpellScript(spell_altar_altercation_summon_ariok); + new scene_bleeding_hollow_kilrogg_reveal(); + RegisterSpellScript(spell_altar_altercation_destroying); + RegisterCreatureAI(npc_altar_altercation_ariok); + RegisterSpellScript(spell_trigger_ariok_altar_altercation); + RegisterCreatureAI(npc_altar_altercation_blood_ritual_orb); + RegisterAreaTriggerAI(at_altar_altercation_kilrogg_talk); + RegisterAreaTriggerAI(at_altar_altercation_reach_altar); }; |