aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2023_12_27_00_world.sql55
-rw-r--r--src/server/scripts/ExilesReach/zone_exiles_reach.cpp316
2 files changed, 371 insertions, 0 deletions
diff --git a/sql/updates/world/master/2023_12_27_00_world.sql b/sql/updates/world/master/2023_12_27_00_world.sql
new file mode 100644
index 00000000000..3f0937b5697
--- /dev/null
+++ b/sql/updates/world/master/2023_12_27_00_world.sql
@@ -0,0 +1,55 @@
+-- Taming the Wilds Quest data
+
+-- Creature data
+UPDATE `creature` SET `StringId`="garrick_briarpatch" WHERE `guid`=1051268;
+UPDATE `creature` SET `StringId`="grimaxe_briarpatch" WHERE `guid`=1051271;
+
+UPDATE `creature_template` SET `ScriptName`="npc_huxsworth_briarpatch" WHERE `entry`=154327;
+UPDATE `creature_template` SET `ScriptName`="npc_dawntracker_briarpatch" WHERE `entry`=166996;
+
+DELETE FROM `creature_text` WHERE `CreatureID` IN (154327,166996) AND `GroupID` IN (0,1);
+INSERT INTO `creature_text` (`CreatureID`,`GroupID`,`ID`,`Text`,`Type`,`Language`,`Probability`,`Emote`,`Duration`,`Sound`,`BroadcastTextId`,`TextRange`,`comment`) VALUES
+(154327, 0, 0, 'We don''t have much time. You''ll have to learn fast.', 12, 0, 100, 0, 0, 152920, 190162, 0, 'Austin Huxworth'),
+(154327, 1, 0, 'I''ve taught you the basics. Now find a beast and tame it.', 12, 0, 100, 0, 0, 152921, 190163, 0, 'Austin Huxworth'),
+(166996, 0, 0, 'That shall have to do for now. Find a beast and tame it.', 12, 0, 100, 0, 0, 156740, 196683, 0, 'Mithdran Dawntracker');
+
+-- Quest data
+DELETE FROM `creature_queststarter` WHERE `id`=154327 AND `quest` IN (59342);
+DELETE FROM `creature_queststarter` WHERE `id`=166996 AND `quest` IN (59937);
+INSERT INTO `creature_queststarter` (`id`, `quest`, `VerifiedBuild`) VALUES
+(154327, 59342, 45745), -- Taming the Wilds accept from Austin Huxworth "Hunter only"
+(166996, 59937, 45745); -- Taming the Wilds accept from Mithdran Dawntracker "Hunter only"
+
+DELETE FROM `creature_questender` WHERE `id`=154327 AND `quest`=59342;
+DELETE FROM `creature_questender` WHERE `id`=166996 AND `quest`=59937;
+INSERT INTO `creature_questender` (`id`, `quest`, `VerifiedBuild`) VALUES
+(154327, 59342, 45745), -- Taming the Wilds turn in to Austin Huxworth
+(166996, 59937, 45745); -- Taming the Wilds turn in to Mithdran Dawntracker
+
+DELETE FROM `quest_template_addon` WHERE `ID` IN (59342,59937);
+INSERT INTO `quest_template_addon` (`ID`,`AllowableClasses`,`PrevQuestID`,`NextQuestID`,`ScriptName`) VALUES
+(59342,4,55173,0,'quest_taming_the_wilds_alliance'), -- Alliance "Hunter only"
+(59937,4,59935,0,'quest_taming_the_wilds_horde'); -- Horde "Hunter only"
+
+-- Spell data
+DELETE FROM `spell_script_names` WHERE `spell_id` IN (316840, 316841);
+INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES
+(316840, 'spell_tutorial_health_dnt_proc_aura'),
+(316841, 'spell_tutorial_health_dnt');
+
+-- Conversation data
+DELETE FROM `conversation_actors` WHERE `ConversationId` IN (14613);
+INSERT INTO `conversation_actors` (`ConversationId`,`ConversationActorId`,`ConversationActorGuid`,`Idx`,`CreatureId`,`CreatureDisplayInfoId`,`NoActorObject`,`ActivePlayerObject`,`VerifiedBuild`) VALUES
+(14613,76440,0,0,0,0,0,0,45745); -- Mithdran Dawntracker
+
+DELETE FROM `conversation_line_template` WHERE `Id` IN (36602);
+INSERT INTO `conversation_line_template` (`Id`,`UiCameraID`,`ActorIdx`,`Flags`,`VerifiedBuild`) VALUES
+(36602,0,0,0,45745); -- Mithdran Dawntracker
+
+DELETE FROM `conversation_template` WHERE `Id` IN (14613);
+INSERT INTO `conversation_template` (`Id`,`FirstLineId`,`TextureKitId`,`ScriptName`,`VerifiedBuild`) VALUES
+(14613,36602,0,'',45745);
+
+DELETE FROM `quest_template` WHERE `ID`=55607;
+INSERT INTO `quest_template` (`ID`,`QuestType`,`RewardXPMultiplier`,`RewardMoneyMultiplier`,`RewardArtifactXPMultiplier`,`Flags`,`LogTitle`) VALUES
+(55607,2,1,1,1,1024, '[Hidden Tracker] Quest Taming The Wilds Complete');
diff --git a/src/server/scripts/ExilesReach/zone_exiles_reach.cpp b/src/server/scripts/ExilesReach/zone_exiles_reach.cpp
index 26bb9c5c3fe..82a31b64415 100644
--- a/src/server/scripts/ExilesReach/zone_exiles_reach.cpp
+++ b/src/server/scripts/ExilesReach/zone_exiles_reach.cpp
@@ -3805,6 +3805,315 @@ class spell_scene_linger_northbound: public SpellScript
}
};
+// ***********************************************************************
+// * Scripting in this section occurs after reaching Quilboar Briarpatch *
+// ***********************************************************************
+
+// Taming the Wild Quest
+enum TamingTheWilds
+{
+ QUEST_TAMING_THE_WILDS_ALLIANCE = 59342,
+ QUEST_TAMING_THE_WILDS_HORDE = 59937,
+ QUEST_TRACKER_TAMING_THE_WILDS_COMPLETE = 55607,
+
+ QUEST_OBJECTIVE_TRAINED_ALLIANCE = 84761,
+ QUEST_OBJECTIVE_TRAINED_HORDE = 85021,
+ QUEST_OBJECTIVE_BEAST_TAMED_ALLIANCE = 84759,
+ QUEST_OBJECTIVE_BEAST_TAMED_HORDE = 85023,
+
+ SPELL_TAME_BEAST = 1515
+};
+
+// 59342 - Taming the Wilds
+// 59937 - Taming the Wilds
+class quest_taming_the_wilds : public QuestScript
+{
+public:
+ quest_taming_the_wilds(char const* script) : QuestScript(script) { }
+
+ void HandleQuestStatusChange(Player* player, QuestStatus newStatus, std::string_view creatureString, uint32 questObjective1, uint32 questObjective2)
+ {
+ switch (newStatus)
+ {
+ case QUEST_STATUS_INCOMPLETE:
+ if (Creature* survivor = FindCreatureIgnorePhase(player, creatureString, 5.0f))
+ survivor->SummonPersonalClone(survivor->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, player);
+
+ // Hacks QUEST_OBJECTIVE_CRITERIA_TREE needs research
+ if (player->HasSpell(SPELL_TAME_BEAST))
+ player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_CRITERIA_TREE, questObjective1, 1);
+
+ if (player->GetQuestStatus(QUEST_TRACKER_TAMING_THE_WILDS_COMPLETE) == QUEST_STATUS_REWARDED)
+ player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_CRITERIA_TREE, questObjective2, 1);
+ break;
+ default:
+ break;
+ }
+ }
+};
+
+// 59342 - Taming The Wild
+class quest_taming_the_wilds_alliance : public quest_taming_the_wilds
+{
+public:
+ quest_taming_the_wilds_alliance() : quest_taming_the_wilds("quest_taming_the_wilds_alliance") { }
+
+ void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
+ {
+ HandleQuestStatusChange(player, newStatus, "huxworth_briarpatch", QUEST_OBJECTIVE_TRAINED_ALLIANCE, QUEST_OBJECTIVE_BEAST_TAMED_ALLIANCE);
+ }
+};
+
+// 59937 - Taming The Wild
+class quest_taming_the_wilds_horde : public quest_taming_the_wilds
+{
+public:
+ quest_taming_the_wilds_horde() : quest_taming_the_wilds("quest_taming_the_wilds_horde") { }
+
+ void OnQuestStatusChange(Player* player, Quest const* /*quest*/, QuestStatus /*oldStatus*/, QuestStatus newStatus) override
+ {
+ HandleQuestStatusChange(player, newStatus, "dawntracker_briarpatch", QUEST_OBJECTIVE_TRAINED_HORDE, QUEST_OBJECTIVE_BEAST_TAMED_HORDE);
+ }
+};
+
+enum TamingTheWildsData
+{
+ CONVERSATION_HORDE_TRAINER = 14613,
+ CONVERSATION_HORDE_ACTOR = 76440,
+
+ EVENT_ME_TURN_TO_PLAYER = 1,
+ EVENT_ME_END_OF_CAST = 2,
+
+ SPELL_TUTORIAL_HEALTH_DNT = 316840,
+ SPELL_LEARNING_TAME_BEAST = 320852,
+ SPELL_LEARN_TAME_BEAST = 320840,
+ SPELL_LEARN_CALL_PET = 320842,
+ SPELL_TAME_BEAST_EFFECT = 13481,
+
+ SAY_PET_TRAINING_ALLIANCE = 0,
+ SAY_FIND_A_BEAST_ALLIANCE = 1,
+ SAY_FIND_A_BEAST_HORDE = 0
+};
+
+// 154327 - Austin Huxsworth
+struct npc_huxsworth_hunter_quest_private : public ScriptedAI
+{
+ npc_huxsworth_hunter_quest_private(Creature* creature) : ScriptedAI(creature) { }
+
+ void InitializeAI() override
+ {
+ me->RemoveNpcFlag(UNIT_NPC_FLAG_QUESTGIVER | UNIT_NPC_FLAG_GOSSIP);
+ }
+
+ void JustAppeared() override
+ {
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ _events.ScheduleEvent(EVENT_ME_TURN_TO_PLAYER, 1s);
+ }
+
+ void IsSummonedBy(WorldObject* summoner) override
+ {
+ Player* player = summoner->ToPlayer();
+ if (!player)
+ return;
+
+ _playerGUID = player->GetGUID();
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ME_TURN_TO_PLAYER:
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ {
+ me->SetFacingToObject(player);
+ me->SetEmoteState(EMOTE_STATE_TALK);
+ Talk(SAY_PET_TRAINING_ALLIANCE);
+ player->CastSpell(player, SPELL_LEARNING_TAME_BEAST);
+ _events.ScheduleEvent(EVENT_ME_END_OF_CAST, 8s);
+ }
+ break;
+ case EVENT_ME_END_OF_CAST:
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ {
+ if (player->GetQuestStatus(QUEST_TRACKER_TAMING_THE_WILDS_COMPLETE) != QUEST_STATUS_REWARDED)
+ player->CastSpell(player, SPELL_TUTORIAL_HEALTH_DNT);
+
+ if (!player->HasSpell(SPELL_TAME_BEAST))
+ {
+ player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_CRITERIA_TREE, QUEST_OBJECTIVE_TRAINED_ALLIANCE, 1);
+ player->CastSpell(player, SPELL_LEARN_TAME_BEAST);
+ player->CastSpell(player, SPELL_LEARN_CALL_PET);
+ }
+
+ me->SetEmoteState(EMOTE_STATE_NONE);
+ Talk(SAY_FIND_A_BEAST_ALLIANCE);
+ }
+ me->DespawnOrUnsummon(4s);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+private:
+ EventMap _events;
+ ObjectGuid _playerGUID;
+};
+
+// 166996 - Mithdran Dawntracker
+struct npc_dawntracker_hunter_quest_private : public ScriptedAI
+{
+ npc_dawntracker_hunter_quest_private(Creature* creature) : ScriptedAI(creature) { }
+
+ void InitializeAI() override
+ {
+ me->RemoveNpcFlag(UNIT_NPC_FLAG_QUESTGIVER | UNIT_NPC_FLAG_GOSSIP);
+ }
+
+ void JustAppeared() override
+ {
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ _events.ScheduleEvent(EVENT_ME_TURN_TO_PLAYER, 1s);
+ }
+
+ void IsSummonedBy(WorldObject* summoner) override
+ {
+ Player* player = summoner->ToPlayer();
+ if (!player)
+ return;
+
+ _playerGUID = player->GetGUID();
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_ME_TURN_TO_PLAYER:
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ {
+ me->SetFacingToObject(player);
+ me->SetEmoteState(EMOTE_STATE_TALK);
+ Conversation* conversation = Conversation::CreateConversation(CONVERSATION_HORDE_TRAINER, player, *player, player->GetGUID(), nullptr, false);
+ if (conversation)
+ {
+ conversation->AddActor(CONVERSATION_HORDE_ACTOR, 0, me->GetGUID());
+ conversation->Start();
+ }
+ player->CastSpell(player, SPELL_LEARNING_TAME_BEAST);
+ _events.ScheduleEvent(EVENT_ME_END_OF_CAST, 8s);
+ }
+ break;
+ case EVENT_ME_END_OF_CAST:
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ {
+ if (player->GetQuestStatus(QUEST_TRACKER_TAMING_THE_WILDS_COMPLETE) != QUEST_STATUS_REWARDED)
+ player->CastSpell(player, SPELL_TUTORIAL_HEALTH_DNT);
+
+ if (!player->HasSpell(SPELL_TAME_BEAST))
+ {
+ player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_CRITERIA_TREE, QUEST_OBJECTIVE_TRAINED_HORDE, 1);
+ player->CastSpell(player, SPELL_LEARN_TAME_BEAST);
+ player->CastSpell(player, SPELL_LEARN_CALL_PET);
+ }
+
+ me->SetEmoteState(EMOTE_STATE_NONE);
+ Talk(SAY_FIND_A_BEAST_HORDE);
+ }
+ me->DespawnOrUnsummon(4s);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+private:
+ EventMap _events;
+ ObjectGuid _playerGUID;
+};
+
+CreatureAI* HuxsworthBriarpatchSelector(Creature* creature)
+{
+ if (creature->IsPrivateObject())
+ {
+ if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
+ {
+ if ((privateObjectOwner->GetQuestStatus(QUEST_TAMING_THE_WILDS_ALLIANCE) == QUEST_STATUS_INCOMPLETE))
+ return new npc_huxsworth_hunter_quest_private(creature);
+ }
+ }
+
+ return new NullCreatureAI(creature);
+};
+
+CreatureAI* DawntrackerBriarpatchSelector(Creature* creature)
+{
+ if (creature->IsPrivateObject())
+ {
+ if (Player* privateObjectOwner = ObjectAccessor::GetPlayer(*creature, creature->GetPrivateObjectOwner()))
+ {
+ if ((privateObjectOwner->GetQuestStatus(QUEST_TAMING_THE_WILDS_HORDE) == QUEST_STATUS_INCOMPLETE))
+ return new npc_dawntracker_hunter_quest_private(creature);
+ }
+ }
+
+ return new NullCreatureAI(creature);
+};
+
+// 316840 - Tutorial - Health (DNT)
+class spell_tutorial_health_dnt_proc_aura : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_TAME_BEAST_EFFECT });
+ }
+
+ bool CheckProc(ProcEventInfo& eventInfo)
+ {
+ if (eventInfo.GetSpellInfo() && eventInfo.GetSpellInfo()->Id == SPELL_TAME_BEAST_EFFECT)
+ return true;
+ return false;
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_tutorial_health_dnt_proc_aura::CheckProc);
+ }
+};
+
+// 316841 - Tutorial - Health (DNT)
+class spell_tutorial_health_dnt : public SpellScript
+{
+ void HandleScript(SpellEffIndex /*effIndex*/)
+ {
+ // This shouldn't happen until tame beast spell completes
+ if (Player* player = GetCaster()->ToPlayer())
+ {
+ if (player->GetTeam() == ALLIANCE)
+ player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_CRITERIA_TREE, QUEST_OBJECTIVE_BEAST_TAMED_ALLIANCE, 1);
+ else
+ player->UpdateQuestObjectiveProgress(QUEST_OBJECTIVE_CRITERIA_TREE, QUEST_OBJECTIVE_BEAST_TAMED_HORDE, 1);
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectHit += SpellEffectFn(spell_tutorial_health_dnt::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+};
+
void AddSC_zone_exiles_reach()
{
// Ship
@@ -3873,4 +4182,11 @@ void AddSC_zone_exiles_reach()
RegisterSpellScript(spell_summon_leader_northbound);
RegisterAreaTriggerAI(at_northbound_linger);
RegisterSpellScript(spell_scene_linger_northbound);
+ // Quest Taming The Wilds
+ new quest_taming_the_wilds_alliance();
+ new quest_taming_the_wilds_horde();
+ new FactoryCreatureScript<CreatureAI, &HuxsworthBriarpatchSelector>("npc_huxsworth_briarpatch");
+ new FactoryCreatureScript<CreatureAI, &DawntrackerBriarpatchSelector>("npc_dawntracker_briarpatch");
+ RegisterSpellScript(spell_tutorial_health_dnt_proc_aura);
+ RegisterSpellScript(spell_tutorial_health_dnt);
};