aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNaddley <64811442+Naddley@users.noreply.github.com>2025-07-21 21:25:10 +0200
committerGitHub <noreply@github.com>2025-07-21 21:25:10 +0200
commit03714bb68416d97c94e155def5c67f3e2eb30542 (patch)
tree4142c21a247f85b63ddd9877819ee4b38f58b72c /src
parent45a9f0684c1451f6bb08d55e43b0f8fd05101c40 (diff)
Scripts/Drustvar: Implement Quest: "The Burden of Proof" (#31151)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/KulTiras/Drustvar/drustvar_chapter_2_the_burden_of_proof.cpp356
1 files changed, 356 insertions, 0 deletions
diff --git a/src/server/scripts/KulTiras/Drustvar/drustvar_chapter_2_the_burden_of_proof.cpp b/src/server/scripts/KulTiras/Drustvar/drustvar_chapter_2_the_burden_of_proof.cpp
index 60a9c5d3a76..862a3b627c5 100644
--- a/src/server/scripts/KulTiras/Drustvar/drustvar_chapter_2_the_burden_of_proof.cpp
+++ b/src/server/scripts/KulTiras/Drustvar/drustvar_chapter_2_the_burden_of_proof.cpp
@@ -18,10 +18,14 @@
#include "Conversation.h"
#include "ConversationAI.h"
#include "CreatureAIImpl.h"
+#include "Locales.h"
#include "MotionMaster.h"
+#include "ObjectAccessor.h"
#include "PhasingHandler.h"
+#include "Player.h"
#include "ScriptMgr.h"
#include "ScriptedCreature.h"
+#include "SpellScript.h"
#include "TemporarySummon.h"
enum StandingAccusedData
@@ -102,8 +106,360 @@ public:
}
};
+enum TheBurdenOfProofData
+{
+ QUEST_THE_BURDEN_OF_PROOF = 48198,
+
+ NPC_CONSTABLE_HENRY_FRAMER = 125394,
+ NPC_LUCILLE_WAYCREST = 128529,
+
+ CONVO_ACTOR_CONSTABLE = 59853,
+ CONVO_ACTOR_LUCILLE = 60052,
+
+ CONVO_LINE_WITCH_TEST_INTRO = 12722,
+ CONVO_LINE_FIRST_TEST_GIVEN = 12739,
+ CONVO_LINE_SECOND_TEST_GIVEN = 12743,
+ CONVO_LINE_THIRD_TEST_GIVEN = 12752,
+
+ CREDIT_TALK_TO_CONSTABLE = 125394,
+ CREDIT_FIRST_TEST_GIVEN = 125509,
+ CREDIT_SECOND_TEST_GIVEN = 125510,
+ CREDIT_THIRD_TEST_GIVEN = 125511,
+
+ OBJECTIVE_TALK_TO_CONSTABLE = 291661,
+ OBJECITVE_FIRST_TEST_GIVEN = 291664,
+ OBJECTIVE_SECOND_TEST_GIVEN = 291665,
+ OBJECTIVE_THIRD_TEST_GIVEN = 291971,
+
+ SPELL_CUT_ONIONS = 250130,
+ SPELL_CUT_ONIONS_FORCE_CAST = 248808,
+ SPELL_EVENT_ONIONS_CUT = 250231,
+ SPELL_EVENT_LUCILLE_CRYING = 248944,
+ SPELL_RELEASE_BLOODFLIES = 250131,
+ SPELL_EVENT_FLIES_RELEASED = 250232,
+ SPELL_LUCILLE_BITING_INSECTS = 248961,
+ SPELL_ADMINISTERING_VENOM = 250132,
+ SPELL_EVENT_TOXIN_GIVEN = 250233,
+ SPELL_LUCILLE_VOMIT = 248934,
+
+ PATH_CONSTABLE_START_TRIAL = 12539400,
+ PATH_CONSTABLE_FIRST_TEST = 12539401,
+ PATH_CONSTABLE_SECOND_TEST = 12539402,
+ PATH_CONSTABLE_THIRD_TEST = 12539403,
+};
+
+// 5685 - Conversation
+class conversation_burden_of_proof_speak_with_constable : public ConversationAI
+{
+public:
+ using ConversationAI::ConversationAI;
+
+ void OnCreate(Unit* creator) override
+ {
+ Creature* constableObject = creator->FindNearestCreatureWithOptions(20.0f, { .CreatureId = NPC_CONSTABLE_HENRY_FRAMER, .IgnorePhases = true });
+ if (!constableObject)
+ return;
+
+ TempSummon* constableClone = constableObject->SummonPersonalClone(constableObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer());
+ if (!constableClone)
+ return;
+
+ constableClone->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
+
+ conversation->AddActor(CONVO_ACTOR_CONSTABLE, 0, constableClone->GetGUID());
+ conversation->Start();
+ }
+
+ void OnStart() override
+ {
+ LocaleConstant privateOwnerLocale = conversation->GetPrivateObjectOwnerLocale();
+
+ conversation->m_Events.AddEvent([conversation = conversation]()
+ {
+ if (Creature* constableClone = conversation->GetActorCreature(0))
+ constableClone->GetMotionMaster()->MovePath(PATH_CONSTABLE_START_TRIAL, false);
+
+ }, conversation->GetLineEndTime(privateOwnerLocale, CONVO_LINE_WITCH_TEST_INTRO));
+
+ conversation->m_Events.AddEvent([conversation = conversation]()
+ {
+ Player* player = ObjectAccessor::GetPlayer(*conversation, conversation->GetPrivateObjectOwner());
+ if (!player)
+ return;
+
+ Creature* constableClone = conversation->GetActorCreature(0);
+ if (!constableClone)
+ return;
+
+ player->KilledMonsterCredit(CREDIT_TALK_TO_CONSTABLE);
+ constableClone->DespawnOrUnsummon();
+
+ }, conversation->GetLastLineEndTime(privateOwnerLocale));
+ }
+};
+
+// 250118 - Ping Lucille
+class spell_drustvar_ping_lucille_burden_of_proof : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_CUT_ONIONS, SPELL_RELEASE_BLOODFLIES, SPELL_ADMINISTERING_VENOM });
+ }
+
+ void HandleHit(SpellEffIndex /*effIndex*/) const
+ {
+ Player* player = Object::ToPlayer(GetCaster());
+ if (!player)
+ return;
+
+ if (player->GetQuestObjectiveData(QUEST_THE_BURDEN_OF_PROOF, OBJECTIVE_TALK_TO_CONSTABLE) && !player->GetQuestObjectiveData(QUEST_THE_BURDEN_OF_PROOF, OBJECITVE_FIRST_TEST_GIVEN))
+ player->CastSpell(player, SPELL_CUT_ONIONS, CastSpellExtraArgsInit{ .TriggerFlags = TRIGGERED_FULL_MASK });
+ else if (player->GetQuestObjectiveData(QUEST_THE_BURDEN_OF_PROOF, OBJECITVE_FIRST_TEST_GIVEN) && !player->GetQuestObjectiveData(QUEST_THE_BURDEN_OF_PROOF, OBJECTIVE_SECOND_TEST_GIVEN))
+ player->CastSpell(player, SPELL_RELEASE_BLOODFLIES, CastSpellExtraArgsInit{ .TriggerFlags = TRIGGERED_FULL_MASK });
+ else if (player->GetQuestObjectiveData(QUEST_THE_BURDEN_OF_PROOF, OBJECTIVE_SECOND_TEST_GIVEN) && !player->GetQuestObjectiveData(QUEST_THE_BURDEN_OF_PROOF, OBJECTIVE_THIRD_TEST_GIVEN))
+ player->CastSpell(player, SPELL_ADMINISTERING_VENOM, CastSpellExtraArgsInit{ .TriggerFlags = TRIGGERED_FULL_MASK });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_drustvar_ping_lucille_burden_of_proof::HandleHit, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 248808 - Cut Onions
+class spell_drustvar_cut_onions_burden_of_proof : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_EVENT_ONIONS_CUT });
+ }
+
+ void HandleHitTarget(SpellEffIndex /*effIndex*/) const
+ {
+ GetCaster()->CastSpell(GetCaster(), SPELL_EVENT_ONIONS_CUT, CastSpellExtraArgsInit{ .TriggerFlags = TRIGGERED_FULL_MASK });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_drustvar_cut_onions_burden_of_proof::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 5694 - Conversation
+// 5695 - Conversation
+// 5696 - Conversation
+class conversation_burden_of_proof_base : public ConversationAI
+{
+public:
+ using ConversationAI::ConversationAI;
+
+ void SummonClones(Unit* creator)
+ {
+ if (Creature* constableObject = creator->FindNearestCreatureWithOptions(20.0f, { .CreatureId = NPC_CONSTABLE_HENRY_FRAMER, .IgnorePhases = true }))
+ {
+ if (TempSummon* constableClone = constableObject->SummonPersonalClone(constableObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer()))
+ {
+ _constableCloneGUID = constableClone->GetGUID();
+ constableClone->RemoveNpcFlag(UNIT_NPC_FLAG_GOSSIP);
+ }
+ }
+
+ if (Creature* lucilleObject = creator->FindNearestCreatureWithOptions(20.0f, { .CreatureId = NPC_LUCILLE_WAYCREST, .IgnorePhases = true }))
+ {
+ if (TempSummon* lucilleClone = lucilleObject->SummonPersonalClone(lucilleObject->GetPosition(), TEMPSUMMON_MANUAL_DESPAWN, 0s, 0, 0, creator->ToPlayer()))
+ {
+ _lucilleCloneGUID = lucilleClone->GetGUID();
+ lucilleClone->RemoveNpcFlag(UNIT_NPC_FLAG_SPELLCLICK);
+ }
+ }
+ }
+
+ void ScheduleEvents(uint32 pathId, int32 lineId, uint32 creditEntry) const
+ {
+ LocaleConstant privateOwnerLocale = conversation->GetPrivateObjectOwnerLocale();
+
+ conversation->m_Events.AddEvent([this, pathId]()
+ {
+ if (Creature* constableClone = GetConstableClone())
+ constableClone->GetMotionMaster()->MovePath(pathId, false);
+
+ }, conversation->GetLineEndTime(privateOwnerLocale, lineId));
+
+ conversation->m_Events.AddEvent([this, creditEntry, conversation = conversation]()
+ {
+ Player* player = ObjectAccessor::GetPlayer(*conversation, conversation->GetPrivateObjectOwner());
+ if (!player)
+ return;
+
+ player->KilledMonsterCredit(creditEntry);
+
+ if (Creature* constableClone = GetConstableClone())
+ constableClone->DespawnOrUnsummon();
+
+ if (Creature* lucilleClone = GetLucilleClone())
+ lucilleClone->DespawnOrUnsummon();
+
+ }, conversation->GetLastLineEndTime(privateOwnerLocale));
+ }
+
+ Creature* GetConstableClone() const
+ {
+ return ObjectAccessor::GetCreature(*conversation, _constableCloneGUID);
+ }
+
+ Creature* GetLucilleClone() const
+ {
+ return ObjectAccessor::GetCreature(*conversation, _lucilleCloneGUID);
+ }
+
+protected:
+ ObjectGuid _constableCloneGUID;
+ ObjectGuid _lucilleCloneGUID;
+};
+
+// 5694 - Conversation
+class conversation_burden_of_proof_first_test_given : public conversation_burden_of_proof_base
+{
+public:
+ using conversation_burden_of_proof_base::conversation_burden_of_proof_base;
+
+ void OnCreate(Unit* creator) override
+ {
+ SummonClones(creator);
+
+ Creature* constableClone = GetConstableClone();
+ if (!constableClone)
+ return;
+
+ Creature* lucilleClone = GetLucilleClone();
+ if (!lucilleClone)
+ return;
+
+ lucilleClone->CastSpell(nullptr, SPELL_EVENT_LUCILLE_CRYING, CastSpellExtraArgsInit{ .TriggerFlags = TRIGGERED_FULL_MASK });
+
+ conversation->AddActor(CONVO_ACTOR_CONSTABLE, 1, constableClone->GetGUID());
+ conversation->AddActor(CONVO_ACTOR_LUCILLE, 2, lucilleClone->GetGUID());
+ conversation->Start();
+ }
+
+ void OnStart() override
+ {
+ ScheduleEvents(PATH_CONSTABLE_FIRST_TEST, CONVO_LINE_FIRST_TEST_GIVEN, CREDIT_FIRST_TEST_GIVEN);
+ }
+};
+
+// 249108 - Release Bloodflies
+class spell_drustvar_release_bloodflies_burden_of_proof : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_EVENT_FLIES_RELEASED });
+ }
+
+ void HandleHitTarget(SpellEffIndex /*effIndex*/) const
+ {
+ GetCaster()->CastSpell(GetCaster(), SPELL_EVENT_FLIES_RELEASED, CastSpellExtraArgsInit{ .TriggerFlags = TRIGGERED_FULL_MASK });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_drustvar_release_bloodflies_burden_of_proof::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 5695 - Conversation
+class conversation_burden_of_proof_second_test_given : public conversation_burden_of_proof_base
+{
+public:
+ using conversation_burden_of_proof_base::conversation_burden_of_proof_base;
+
+ void OnCreate(Unit* creator) override
+ {
+ SummonClones(creator);
+
+ Creature* constableClone = GetConstableClone();
+ if (!constableClone)
+ return;
+
+ Creature* lucilleClone = GetLucilleClone();
+ if (!lucilleClone)
+ return;
+
+ lucilleClone->CastSpell(nullptr, SPELL_LUCILLE_BITING_INSECTS, CastSpellExtraArgsInit{ .TriggerFlags = TRIGGERED_FULL_MASK });
+
+ conversation->AddActor(CONVO_ACTOR_CONSTABLE, 2, constableClone->GetGUID());
+ conversation->AddActor(CONVO_ACTOR_LUCILLE, 0, lucilleClone->GetGUID());
+ conversation->Start();
+ }
+
+ void OnStart() override
+ {
+ ScheduleEvents(PATH_CONSTABLE_SECOND_TEST, CONVO_LINE_SECOND_TEST_GIVEN, CREDIT_SECOND_TEST_GIVEN);
+ }
+};
+
+// 249110 - Administering Venom
+class spell_drustvar_administering_venom_burden_of_proof : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_EVENT_TOXIN_GIVEN });
+ }
+
+ void HandleHitTarget(SpellEffIndex /*effIndex*/) const
+ {
+ GetCaster()->CastSpell(GetCaster(), SPELL_EVENT_TOXIN_GIVEN, CastSpellExtraArgsInit{ .TriggerFlags = TRIGGERED_FULL_MASK });
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_drustvar_administering_venom_burden_of_proof::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY);
+ }
+};
+
+// 5696 - Conversation
+class conversation_burden_of_proof_third_test_given : public conversation_burden_of_proof_base
+{
+public:
+ using conversation_burden_of_proof_base::conversation_burden_of_proof_base;
+
+ void OnCreate(Unit* creator) override
+ {
+ SummonClones(creator);
+
+ Creature* constableClone = GetConstableClone();
+ if (!constableClone)
+ return;
+
+ Creature* lucilleClone = GetLucilleClone();
+ if (!lucilleClone)
+ return;
+
+ lucilleClone->CastSpell(nullptr, SPELL_LUCILLE_VOMIT, CastSpellExtraArgsInit{ .TriggerFlags = TRIGGERED_FULL_MASK });
+
+ conversation->AddActor(CONVO_ACTOR_CONSTABLE, 3, constableClone->GetGUID());
+ conversation->AddActor(CONVO_ACTOR_LUCILLE, 0, lucilleClone->GetGUID());
+ conversation->Start();
+ }
+
+ void OnStart() override
+ {
+ ScheduleEvents(PATH_CONSTABLE_THIRD_TEST, CONVO_LINE_THIRD_TEST_GIVEN, CREDIT_THIRD_TEST_GIVEN);
+ }
+};
+
void AddSC_drustvar_chapter_2_the_burden_of_proof()
{
// Conversation
RegisterConversationAI(conversation_guards_intro_standing_accused);
+ RegisterConversationAI(conversation_burden_of_proof_speak_with_constable);
+ RegisterConversationAI(conversation_burden_of_proof_first_test_given);
+ RegisterConversationAI(conversation_burden_of_proof_second_test_given);
+ RegisterConversationAI(conversation_burden_of_proof_third_test_given);
+
+ // Spell
+ RegisterSpellScript(spell_drustvar_ping_lucille_burden_of_proof);
+ RegisterSpellScript(spell_drustvar_cut_onions_burden_of_proof);
+ RegisterSpellScript(spell_drustvar_release_bloodflies_burden_of_proof);
+ RegisterSpellScript(spell_drustvar_administering_venom_burden_of_proof);
}