diff options
-rw-r--r-- | sql/updates/world/master/2023_05_05_01_world.sql | 1 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Quests/QuestDef.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Quests/QuestDef.h | 18 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QuestPackets.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QuestPackets.h | 1 |
6 files changed, 35 insertions, 6 deletions
diff --git a/sql/updates/world/master/2023_05_05_01_world.sql b/sql/updates/world/master/2023_05_05_01_world.sql new file mode 100644 index 00000000000..4da800faf03 --- /dev/null +++ b/sql/updates/world/master/2023_05_05_01_world.sql @@ -0,0 +1 @@ +ALTER TABLE `quest_reward_display_spell` ADD `Type` int unsigned NOT NULL DEFAULT '0' AFTER `PlayerConditionID`; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 7d0893a05d7..a3627c1658d 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -4717,8 +4717,8 @@ void ObjectMgr::LoadQuests() // 0 1 2 3 4 5 6 { "QuestID, Type1, Type2, Type3, Type4, Type5, Type6", "quest_reward_choice_items", "", "reward choice items", &Quest::LoadRewardChoiceItems }, - // 0 1 2 - { "QuestID, SpellID, PlayerConditionID", "quest_reward_display_spell", "ORDER BY QuestID ASC, Idx ASC", "reward display spells", &Quest::LoadRewardDisplaySpell }, + // 0 1 2 3 + { "QuestID, SpellID, PlayerConditionID, Type", "quest_reward_display_spell", "ORDER BY QuestID ASC, Idx ASC", "reward display spells", &Quest::LoadRewardDisplaySpell }, // 0 1 2 3 4 5 6 7 8 { "ID, Emote1, Emote2, Emote3, Emote4, EmoteDelay1, EmoteDelay2, EmoteDelay3, EmoteDelay4", "quest_details", "", "details", &Quest::LoadQuestDetails }, diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 542bce38d3a..b4e18f2ed97 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -135,6 +135,7 @@ void Quest::LoadRewardDisplaySpell(Field* fields) { uint32 spellId = fields[1].GetUInt32(); uint32 playerConditionId = fields[2].GetUInt32(); + uint32 type = fields[3].GetUInt32(); if (!sSpellMgr->GetSpellInfo(spellId, DIFFICULTY_NONE)) { @@ -148,7 +149,13 @@ void Quest::LoadRewardDisplaySpell(Field* fields) playerConditionId = 0; } - RewardDisplaySpell.emplace_back(spellId, playerConditionId); + if (type >= AsUnderlyingType(QuestCompleteSpellType::Max)) + { + TC_LOG_ERROR("sql.sql", "Table `quest_reward_display_spell` invalid type value ({}) set for quest {} and spell {}. Set to 0.", type, fields[0].GetUInt32(), spellId); + type = AsUnderlyingType(QuestCompleteSpellType::LegacyBehavior); + } + + RewardDisplaySpell.emplace_back(spellId, playerConditionId, QuestCompleteSpellType(type)); } void Quest::LoadRewardChoiceItems(Field* fields) @@ -633,7 +640,12 @@ WorldPacket Quest::BuildQueryData(LocaleConstant loc, Player* player) const response.Info.RewardMoneyMultiplier = GetMoneyMultiplier(); response.Info.RewardBonusMoney = GetRewMoneyMaxLevel(); for (QuestRewardDisplaySpell displaySpell : RewardDisplaySpell) - response.Info.RewardDisplaySpell.push_back({ int32(displaySpell.SpellId), int32(displaySpell.PlayerConditionId) }); + { + WorldPackets::Quest::QuestCompleteDisplaySpell& rewardDisplaySpell = response.Info.RewardDisplaySpell.emplace_back(); + rewardDisplaySpell.SpellID = displaySpell.SpellId; + rewardDisplaySpell.PlayerConditionID = displaySpell.PlayerConditionId; + rewardDisplaySpell.Type = int32(displaySpell.Type); + } response.Info.RewardSpell = GetRewSpell(); diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index 7f04ef0eb25..3660d2da57f 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -346,6 +346,19 @@ enum QuestObjectiveFlags QUEST_OBJECTIVE_FLAG_KILL_PLAYERS_SAME_FACTION = 0x80 }; +enum class QuestCompleteSpellType : uint32 +{ + LegacyBehavior = 0, + Follower = 1, + Tradeskill = 2, + Ability = 3, + Aura = 4, + Spell = 5, + Unlock = 6, + Companion = 7, + Max +}; + struct QuestGreeting { uint16 EmoteType; @@ -465,11 +478,12 @@ using QuestObjectives = std::vector<QuestObjective>; struct QuestRewardDisplaySpell { - QuestRewardDisplaySpell() : SpellId(0), PlayerConditionId(0) { } - QuestRewardDisplaySpell(uint32 spellId, uint32 playerConditionId) : SpellId(spellId), PlayerConditionId(playerConditionId) { } + QuestRewardDisplaySpell() : SpellId(0), PlayerConditionId(0), Type(QuestCompleteSpellType::LegacyBehavior) { } + QuestRewardDisplaySpell(uint32 spellId, uint32 playerConditionId, QuestCompleteSpellType type) : SpellId(spellId), PlayerConditionId(playerConditionId), Type(type) { } uint32 SpellId; uint32 PlayerConditionId; + QuestCompleteSpellType Type; }; struct QuestConditionalText diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index 4ac0d00c1f5..c05112afce3 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -24,6 +24,7 @@ ByteBuffer& operator<<(ByteBuffer& data, QuestCompleteDisplaySpell const& questD { data << int32(questDisplaySpell.SpellID); data << int32(questDisplaySpell.PlayerConditionID); + data << int32(questDisplaySpell.Type); return data; } diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index 42cdff0f3eb..0ff6a0485b2 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -121,6 +121,7 @@ namespace WorldPackets { int32 SpellID = 0; int32 PlayerConditionID = 0; + int32 Type = 0; }; struct ConditionalQuestText |