Scripts/Stormwind: Implement Quest "Battle for Azeroth: Tides of War" (#29493)

This commit is contained in:
Naddley
2023-12-31 00:12:41 +01:00
committed by GitHub
parent 7e061adffa
commit 3dbd171399
2 changed files with 353 additions and 0 deletions
@@ -0,0 +1,136 @@
SET @ATID := 55;
SEt @ATCP := 44;
SET @ATIDSPAWN := 55;
-- Update Template
UPDATE `creature_template` SET `unit_flags3`=16777216 WHERE `entry`=139645; -- Vision of Sailor's Memory
UPDATE `creature_template` SET `AIName` = '', `ScriptName` = 'npc_jaina_proudmoore_tides_of_war' WHERE `entry` = 120590; -- Jaina Proudmoore
UPDATE `creature_template` SET `npcflag`=0 WHERE `entry`=120788; -- Genn Greymane
-- Serverside AT
DELETE FROM `areatrigger_template` WHERE `Id` = @ATID+0 AND `IsCustom` = 1;
INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `Flags`, `VerifiedBuild`) VALUES
(@ATID+0, 1, 1, 0);
DELETE FROM `areatrigger_create_properties` WHERE `Id`=@ATCP+0 AND `IsCustom`=1;
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`, `ScriptName`, `VerifiedBuild`) VALUES
(@ATCP+0, 1, @ATID+0, 1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 20, 20, 12, 20, 20, 12, 0, 0, 'at_stormwind_keep_tides_of_war', 0);
DELETE FROM `areatrigger` WHERE `SpawnId` = @ATIDSPAWN+0;
INSERT INTO `areatrigger` (`SpawnId`, `AreaTriggerCreatePropertiesId`, `IsCustom`, `MapId`, `SpawnDifficulties`, `PosX`, `PosY`, `PosZ`, `Orientation`, `PhaseUseFlags`, `PhaseId`, `PhaseGroup`, `SpellForVisuals`, `ScriptName`, `Comment`, `VerifiedBuild`) VALUES
(@ATIDSPAWN+0, @ATCP+0, 1, 0, '0', -8390.378, 319.124, 147.014, 0.653896, 0, 8480, 0, NULL, '', 'Stormwind Keep Tides of War', 0);
-- Template Addon
DELETE FROM `creature_template_addon` WHERE `entry` = 120590;
INSERT INTO `creature_template_addon` (`entry`, `path_id`, `mount`, `StandState`, `AnimTier`, `VisFlags`, `SheathState`, `PvpFlags`, `emote`, `aiAnimKit`, `movementAnimKit`, `meleeAnimKit`, `visibilityDistanceType`, `auras`) VALUES
(120590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ''); -- 120590 (Lady Jaina Proudmoore)
-- ScriptNames
DELETE FROM `spell_script_names` WHERE `spell_id` = 284807;
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(284807, 'spell_despawn_sailor_memory');
-- Creature Movement
DELETE FROM `creature_template_movement` WHERE `CreatureId` = 139645;
INSERT INTO `creature_template_movement` (`CreatureId`, `Ground`, `Swim`, `Flight`, `Rooted`, `Chase`, `Random`, `InteractionPauseTimer`) VALUES
(139645, 0, 0, 1, 1, 0, 0, NULL);
-- NPC spellclick
DELETE FROM `npc_spellclick_spells` WHERE `npc_entry` = 139645;
INSERT INTO `npc_spellclick_spells` (`npc_entry`, `spell_id`, `cast_flags`, `user_type`) VALUES
(139645, 274244, 3, 0);
-- Creature Difficulty
DELETE FROM `creature_template_difficulty` WHERE (`DifficultyID`=0 AND `Entry` IN (139645,139636,120597,120756,139642,209790));
INSERT INTO `creature_template_difficulty` (`Entry`, `DifficultyID`, `LevelScalingDeltaMin`, `LevelScalingDeltaMax`, `ContentTuningID`, `HealthScalingExpansion`, `HealthModifier`, `ManaModifier`, `CreatureDifficultyID`, `TypeFlags`, `TypeFlags2`, `VerifiedBuild`) VALUES
(139645, 0, 0, 0, 186, 7, 1, 1, 146480, 1610612752, 6, 52393), -- Vision of Sailor's Memory
(139636, 0, 0, 0, 186, 7, 20, 1, 146471, 0, 0, 52393), -- Master Mathias Shaw
(120597, 0, 0, 0, 494, 7, 15, 1, 124911, 0, 0, 52393), -- Commander Lorna Crowley
(120756, 0, 0, 0, 794, 7, 1200, 1, 125102, 76, 32768, 52393), -- Anduin Wrynn
(139642, 0, 0, 0, 189, 7, 1, 1, 146477, 0, 0, 52393), -- 7th Legion Sailor
(209790, 0, 0, 0, 2715, 9, 5, 10, 240103, 0, 50331648, 52393); -- Virtos
-- Model data
DELETE FROM `creature_model_info` WHERE `DisplayID`=107886;
INSERT INTO `creature_model_info` (`DisplayID`, `BoundingRadius`, `CombatReach`, `DisplayID_Other_Gender`, `VerifiedBuild`) VALUES
(107886, 0.305999994277954101, 1.5, 0, 52393);
-- Conversation
DELETE FROM `conversation_template` WHERE `Id` IN (8709, 4857, 4818);
INSERT INTO `conversation_template` (`Id`, `FirstLineID`, `TextureKitId`, `VerifiedBuild`) VALUES
(8709, 19487, 0, 52393),
(4857, 19476, 0, 52393),
(4818, 10748, 0, 52393);
UPDATE `conversation_template` SET `ScriptName` = 'conversation_start_council_tides_of_war' WHERE `Id` = 4857;
DELETE FROM `conversation_actors` WHERE (`ConversationId`=4818 AND `Idx`=0) OR (`ConversationId`=8709 AND `Idx` IN (0,1,2)) OR (`ConversationId`=4857 AND `Idx` IN (3,1,2,0));
INSERT INTO `conversation_actors` (`ConversationId`, `ConversationActorId`, `ConversationActorGuid`, `Idx`, `CreatureId`, `CreatureDisplayInfoId`, `NoActorObject`, `ActivePlayerObject`, `VerifiedBuild`) VALUES
(4818, 53220, 0, 0, 107574, 82047, 0, 0, 52393),
(8709, 53220, 850679, 0, 0, 0, 0, 0, 52393), -- Full: 0x203ADC000075ED000033AF0000742AB5 Creature/0 R3767/S13231 Map: 0 (Eastern Kingdoms) Entry: 120756 (Anduin Wrynn) Low: 7613109
(8709, 467, 850678, 1, 0, 0, 0, 0, 52393), -- Full: 0x203ADC000075C3800033AF0000742AB5 Creature/0 R3767/S13231 Map: 0 (Eastern Kingdoms) Entry: 120590 (Lady Jaina Proudmoore) Low: 7613109
(8709, 64275, 850675, 2, 0, 0, 0, 0, 52393), -- Full: 0x203ADC000075F5000033AF0000742AB5 Creature/0 R3767/S13231 Map: 0 (Eastern Kingdoms) Entry: 120788 (Genn Greymane) Low: 7613109
(4857, 467, 0, 3, 0, 0, 0, 0, 52393), -- Full: 0x203ADC000075C3800033AF00007494D0 Creature/0 R3767/S13231 Map: 0 (Eastern Kingdoms) Entry: 120590 (Lady Jaina Proudmoore) Low: 7640272
(4857, 64989, 850677, 1, 0, 0, 0, 0, 52393), -- Full: 0x203ADC0000885D000033AF0000742AB5 Creature/0 R3767/S13231 Map: 0 (Eastern Kingdoms) Entry: 139636 (Master Mathias Shaw) Low: 7613109
(4857, 64275, 850675, 2, 0, 0, 0, 0, 52393), -- Full: 0x203ADC000075F5000033AF0000742AB5 Creature/0 R3767/S13231 Map: 0 (Eastern Kingdoms) Entry: 120788 (Genn Greymane) Low: 7613109
(4857, 53220, 850679, 0, 0, 0, 0, 0, 52393); -- Full: 0x203ADC000075ED000033AF0000742AB5 Creature/0 R3767/S13231 Map: 0 (Eastern Kingdoms) Entry: 120756 (Anduin Wrynn) Low: 7613109
DELETE FROM `conversation_line_template` WHERE `Id` IN (10748, 19496, 19495, 19494, 19493, 19492, 19491, 19490, 19489, 19488, 19487, 19486, 19485, 19484, 19483, 19482, 19481, 19480, 19479, 19478, 19477, 19476);
INSERT INTO `conversation_line_template` (`Id`, `UiCameraID`, `ActorIdx`, `Flags`, `ChatType`, `VerifiedBuild`) VALUES
(10748, 82, 0, 0, 0, 52393),
(19496, 0, 0, 0, 0, 52393),
(19495, 0, 1, 0, 0, 52393),
(19494, 0, 0, 0, 0, 52393),
(19493, 0, 0, 0, 0, 52393),
(19492, 0, 1, 0, 0, 52393),
(19491, 0, 2, 0, 0, 52393),
(19490, 0, 1, 0, 0, 52393),
(19489, 0, 1, 0, 0, 52393),
(19488, 0, 1, 0, 0, 52393),
(19487, 0, 0, 0, 0, 52393),
(19486, 0, 3, 0, 0, 52393),
(19485, 0, 3, 0, 0, 52393),
(19484, 0, 1, 0, 0, 52393),
(19483, 0, 2, 0, 0, 52393),
(19482, 0, 1, 0, 0, 52393),
(19481, 0, 1, 0, 0, 52393),
(19480, 0, 1, 0, 0, 52393),
(19479, 0, 0, 0, 0, 52393),
(19478, 0, 1, 0, 0, 52393),
(19477, 0, 1, 0, 0, 52393),
(19476, 0, 0, 0, 0, 52393);
-- Conditions
DELETE FROM `conditions` WHERE (`SourceTypeOrReferenceId`=13 AND `SourceGroup` = 1 AND `SourceEntry` = 284807);
INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
(13, 1, 284807, 0, 0, 31, 0, 3, 139645, 0, 0, 0, 0, '', 'Spell: Despawn - can only hit "Vision of Sailors Memory"');
-- Creature 49748 smart ai
SET @ENTRY := 49748;
UPDATE `creature_template` SET `AIName` = 'SmartAI', `ScriptName` = '' WHERE `entry` = @ENTRY;
DELETE FROM `smart_scripts` WHERE `source_type` = 0 AND `entryOrGuid` = @ENTRY;
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `Difficulties`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
(@ENTRY, 0, 0, 0, '', 19, 0, 100, 0, 46727, 0, 0, 0, 143, 4818, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 'On player accepted quest 46727 - Player who accepted quest: Start conversation 4818');
-- Path for Jaina
SET @ENTRY := 120590;
SET @PATHOFFSET := 0;
SET @PATH := @ENTRY * 100 + @PATHOFFSET;
DELETE FROM `waypoint_data` WHERE `id`= @PATH;
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`) VALUES
(@PATH, 0, -8383.272, 329.5139, 147.0765, NULL, 0),
(@PATH, 1, -8383.877, 328.8299, 147.0882, NULL, 0),
(@PATH, 2, -8384.636, 325.9323, 147.1476, NULL, 0);
SET @ENTRY := 120590;
SET @PATHOFFSET := 1;
SET @PATH := @ENTRY * 100 + @PATHOFFSET;
DELETE FROM `waypoint_data` WHERE `id`= @PATH;
INSERT INTO `waypoint_data` (`id`, `point`, `position_x`, `position_y`, `position_z`, `orientation`, `delay`) VALUES
(@PATH, 0, -8384.636, 325.9323, 147.1476, NULL, 0),
(@PATH, 1, -8383.877, 328.8299, 147.0882, NULL, 0),
(@PATH, 2, -8383.272, 329.5139, 147.0765, NULL, 0);
DELETE FROM `creature_questender` WHERE (`id`=120756 AND `quest`=46727);
INSERT INTO `creature_questender` (`id`, `quest`, `VerifiedBuild`) VALUES
(120756, 46727, 52649); -- Battle for Azeroth: Tides of War ended by Anduin Wrynn
@@ -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);
}