aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp4
-rw-r--r--src/server/game/Quests/QuestDef.cpp16
-rw-r--r--src/server/game/Quests/QuestDef.h18
-rw-r--r--src/server/game/Server/Packets/QuestPackets.cpp1
-rw-r--r--src/server/game/Server/Packets/QuestPackets.h1
5 files changed, 34 insertions, 6 deletions
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