aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/EasternKingdoms
diff options
context:
space:
mode:
authorNaddley <64811442+Naddley@users.noreply.github.com>2023-12-31 00:12:41 +0100
committerGitHub <noreply@github.com>2023-12-31 00:12:41 +0100
commit3dbd17139995902420aac9da09cbeae6b3de0bc0 (patch)
treeb7541417ea420176a8b9c09d137a601b96210e8b /src/server/scripts/EasternKingdoms
parent7e061adffa20323a26c0a489ba70dd098689f6d7 (diff)
Scripts/Stormwind: Implement Quest "Battle for Azeroth: Tides of War" (#29493)
Diffstat (limited to 'src/server/scripts/EasternKingdoms')
-rw-r--r--src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp217
1 files changed, 217 insertions, 0 deletions
diff --git a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
index bd514c13afb..8e0500a6e9a 100644
--- a/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_stormwind_city.cpp
@@ -15,6 +15,223 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "AreaTrigger.h"
+#include "AreaTriggerAI.h"
+#include "Containers.h"
+#include "Conversation.h"
+#include "CreatureAIImpl.h"
+#include "MotionMaster.h"
+#include "ObjectAccessor.h"
+#include "PhasingHandler.h"
+#include "Player.h"
+#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "ScriptedGossip.h"
+#include "SpellScript.h"
+#include "TemporarySummon.h"
+
+enum TidesOfWarData
+{
+ QUEST_TIDES_OF_WAR = 46727,
+
+ QUEST_OBJECTIVE_ATTEND_COUNCIL = 337817,
+
+ MOVIE_POST_TIDES_OF_WAR = 858,
+
+ NPC_JAINA_TIDES_OF_WAR = 120590,
+ NPC_ANDUIN_TIDES_OF_WAR = 120756,
+ NPC_VISION_OF_SAILORS_MEMORY = 139645,
+
+ SPELL_JAINA_ARCANE_CHANNEL = 54219,
+ SPELL_CONVO_POST_MOVIE_TIDES_OF_WAR = 281343,
+
+ CONVERSATION_START_COUNCIL_TIDES_OF_WAR = 4857,
+
+ PATH_JAINA_VISION_START = 12059000,
+ PATH_JAINA_VISION_FINISH = 12059001
+};
+
+// 55 - Stormwind Keep - Tides of War
+struct at_stormwind_keep_tides_of_war : AreaTriggerAI
+{
+ at_stormwind_keep_tides_of_war(AreaTrigger* areatrigger) : AreaTriggerAI(areatrigger) { }
+
+ void OnUnitEnter(Unit* unit) override
+ {
+ Player* player = unit->ToPlayer();
+ if (!player || player->GetQuestStatus(QUEST_TIDES_OF_WAR) != QUEST_STATUS_INCOMPLETE)
+ return;
+
+ // @TODO: cooldown after generic impl
+
+ Conversation::CreateConversation(CONVERSATION_START_COUNCIL_TIDES_OF_WAR, unit, unit->GetPosition(), unit->GetGUID(), nullptr, false);
+ }
+};
+
+Position const VisionOfSailorsMemoryPosition = { -8384.131f, 324.383f, 148.443f, 1.559973f };
+
+// 4857 - Conversation
+class conversation_start_council_tides_of_war : public ConversationScript
+{
+public:
+ conversation_start_council_tides_of_war() : ConversationScript("conversation_start_council_tides_of_war") { }
+
+ enum Events
+ {
+ EVENT_JAINA_WALK = 1,
+ EVENT_KILL_CREDIT
+ };
+
+ enum ConversatonData
+ {
+ CONVO_ACTOR_JAINA = 467,
+
+ CONVO_LINE_JAINA_WALK = 19485,
+ CONVO_LINE_JAINA_CREDIT = 19486,
+ };
+
+ void OnConversationCreate(Conversation* conversation, Unit* creator) override
+ {
+ Creature* jainaObject = GetClosestCreatureWithOptions(creator, 30.0f, { .CreatureId = NPC_JAINA_TIDES_OF_WAR, .IgnorePhases = true });
+ if (!jainaObject)
+ return;
+
+ TempSummon* jainaClone = jainaObject->SummonPersonalClone(jainaObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
+ if (!jainaClone)
+ return;
+
+ conversation->AddActor(CONVO_ACTOR_JAINA, 3, jainaClone->GetGUID());
+ conversation->Start();
+ }
+
+ void OnConversationStart(Conversation* conversation) override
+ {
+ LocaleConstant privateOwnerLocale = conversation->GetPrivateObjectOwnerLocale();
+
+ if (Milliseconds const* jainaWalkStartTime = conversation->GetLineStartTime(privateOwnerLocale, CONVO_LINE_JAINA_WALK))
+ _events.ScheduleEvent(EVENT_JAINA_WALK, *jainaWalkStartTime);
+
+ _events.ScheduleEvent(EVENT_KILL_CREDIT, conversation->GetLineEndTime(privateOwnerLocale, CONVO_LINE_JAINA_CREDIT));
+ }
+
+ void OnConversationUpdate(Conversation* conversation, uint32 diff) override
+ {
+ _events.Update(diff);
+
+ switch (_events.ExecuteEvent())
+ {
+ case EVENT_JAINA_WALK:
+ {
+ Creature* jainaClone = conversation->GetActorCreature(3);
+ if (!jainaClone)
+ break;
+
+ jainaClone->GetMotionMaster()->MovePath(PATH_JAINA_VISION_START, false);
+ break;
+ }
+ case EVENT_KILL_CREDIT:
+ {
+ Unit* privateObjectOwner = ObjectAccessor::GetUnit(*conversation, conversation->GetPrivateObjectOwner());
+ if (!privateObjectOwner)
+ break;
+
+ Player* player = privateObjectOwner->ToPlayer();
+ if (!player)
+ break;
+
+ player->KilledMonsterCredit(NPC_ANDUIN_TIDES_OF_WAR);
+ privateObjectOwner->SummonCreature(NPC_VISION_OF_SAILORS_MEMORY, VisionOfSailorsMemoryPosition, TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, privateObjectOwner->GetGUID());
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+private:
+ EventMap _events;
+};
+
+// 120590 - Jaina Proudmoore
+struct npc_jaina_proudmoore_tides_of_war : public ScriptedAI
+{
+ npc_jaina_proudmoore_tides_of_war(Creature* creature) : ScriptedAI(creature) { }
+
+ void WaypointPathEnded(uint32 /*nodeId*/, uint32 pathId) override
+ {
+ if (pathId == PATH_JAINA_VISION_START)
+ {
+ me->SetFacingTo(5.1164f);
+ DoCastAOE(SPELL_JAINA_ARCANE_CHANNEL);
+
+ _scheduler.Schedule(14s, [this](TaskContext /*context*/)
+ {
+ me->InterruptSpell(CURRENT_CHANNELED_SPELL);
+ me->GetMotionMaster()->MovePath(PATH_JAINA_VISION_FINISH, false);
+ });
+ }
+ else if (pathId == PATH_JAINA_VISION_FINISH)
+ me->DespawnOrUnsummon();
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+ }
+
+private:
+ TaskScheduler _scheduler;
+};
+
+// 858 - Movie
+class player_conv_after_movie_tides_of_war : public PlayerScript
+{
+public:
+ player_conv_after_movie_tides_of_war() : PlayerScript("player_conv_after_movie_tides_of_war") { }
+
+ void OnMovieComplete(Player* player, uint32 movieId) override
+ {
+ if (movieId == MOVIE_POST_TIDES_OF_WAR)
+ {
+ Creature* jainaClone = GetClosestCreatureWithOptions(player, 30.0f, { .CreatureId = NPC_JAINA_TIDES_OF_WAR, .IgnorePhases = true, .PrivateObjectOwnerGuid = player->GetGUID() });
+ if (!jainaClone)
+ return;
+
+ jainaClone->DespawnOrUnsummon();
+ player->CastSpell(player, SPELL_CONVO_POST_MOVIE_TIDES_OF_WAR, true);
+ }
+ }
+};
+
+// 284807 - Despawn
+class spell_despawn_sailor_memory : public SpellScript
+{
+ void HandleHitTarget(SpellEffIndex /*effIndex*/)
+ {
+ if (Creature* creature = GetHitUnit()->ToCreature())
+ creature->DespawnOrUnsummon();
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_despawn_sailor_memory::HandleHitTarget, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+};
+
void AddSC_stormwind_city()
{
+ // Creature
+ RegisterCreatureAI(npc_jaina_proudmoore_tides_of_war);
+
+ // Conversation
+ new conversation_start_council_tides_of_war();
+
+ // PlayerScript
+ new player_conv_after_movie_tides_of_war();
+
+ // AreaTrigger
+ RegisterAreaTriggerAI(at_stormwind_keep_tides_of_war);
+
+ // Spells
+ RegisterSpellScript(spell_despawn_sailor_memory);
}