diff options
author | Shauren <shauren.trinity@gmail.com> | 2023-06-02 00:50:30 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2023-06-02 00:50:30 +0200 |
commit | a2be8d202823706ad4b29c2dc988c0fe978ae652 (patch) | |
tree | 20e5ca072346f43b15b4ec5b5fb4e62d19324ebc /src/server/game/Quests | |
parent | f2041701dad41f8216804d17b0fd44cca3bd26ce (diff) |
Core/Quests: Implemented new db table quest_objectives_completion_effect
* Turn off automatic phase updates on quest objective completion
* Allow more convenient conversation and spell casts on quest objective completion
Diffstat (limited to 'src/server/game/Quests')
-rw-r--r-- | src/server/game/Quests/QuestDef.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Quests/QuestDef.h | 11 |
2 files changed, 34 insertions, 2 deletions
diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index b4e18f2ed97..e3d39cef7a9 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -131,6 +131,12 @@ Quest::Quest(Field* questRecord) _questCompletionLog = questRecord[115].GetString(); } +Quest::~Quest() +{ + for (QuestObjective& objective : Objectives) + delete objective.CompletionEffect; +} + void Quest::LoadRewardDisplaySpell(Field* fields) { uint32 spellId = fields[1].GetUInt32(); @@ -248,7 +254,7 @@ void Quest::LoadQuestMailSender(Field* fields) void Quest::LoadQuestObjective(Field* fields) { - QuestObjective obj; + QuestObjective& obj = Objectives.emplace_back(); obj.QuestID = fields[0].GetUInt32(); obj.ID = fields[1].GetUInt32(); obj.Type = fields[2].GetUInt8(); @@ -260,7 +266,22 @@ void Quest::LoadQuestObjective(Field* fields) obj.ProgressBarWeight = fields[8].GetFloat(); obj.Description = fields[9].GetString(); - Objectives.push_back(obj); + bool hasCompletionEffect = std::any_of(fields + 10, fields + 15, [](Field const& f) { return !f.IsNull(); }); + if (hasCompletionEffect) + { + obj.CompletionEffect = new QuestObjectiveAction(); + if (!fields[10].IsNull()) + obj.CompletionEffect->GameEventId = fields[10].GetUInt32(); + if (!fields[11].IsNull()) + obj.CompletionEffect->SpellId = fields[11].GetUInt32(); + if (!fields[12].IsNull()) + obj.CompletionEffect->ConversationId = fields[12].GetUInt32(); + if (!fields[13].IsNull()) + obj.CompletionEffect->UpdatePhaseShift = fields[13].GetBool(); + if (!fields[14].IsNull()) + obj.CompletionEffect->UpdateZoneAuras = fields[14].GetBool(); + } + _usedQuestObjectiveTypes[obj.Type] = true; } diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index 3660d2da57f..016ec2dc958 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -403,6 +403,15 @@ struct QuestOfferRewardLocale std::vector<std::string> RewardText; }; +struct QuestObjectiveAction +{ + Optional<uint32> GameEventId; + Optional<uint32> SpellId; + Optional<uint32> ConversationId; + bool UpdatePhaseShift = false; + bool UpdateZoneAuras = false; +}; + struct QuestObjective { uint32 ID = 0; @@ -416,6 +425,7 @@ struct QuestObjective float ProgressBarWeight = 0.0f; std::string Description; std::vector<int32> VisualEffects; + QuestObjectiveAction* CompletionEffect = nullptr; bool IsStoringValue() const { @@ -504,6 +514,7 @@ class TC_GAME_API Quest public: // Loading data. All queries are in ObjectMgr::LoadQuests() explicit Quest(Field* questRecord); + ~Quest(); void LoadRewardDisplaySpell(Field* fields); void LoadRewardChoiceItems(Field* fields); void LoadQuestDetails(Field* fields); |