aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Quests
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Quests')
-rw-r--r--src/server/game/Quests/QuestDef.cpp94
-rw-r--r--src/server/game/Quests/QuestDef.h29
2 files changed, 122 insertions, 1 deletions
diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp
index f04d4dd2255..e402dc6c214 100644
--- a/src/server/game/Quests/QuestDef.cpp
+++ b/src/server/game/Quests/QuestDef.cpp
@@ -275,6 +275,86 @@ void Quest::LoadQuestObjectiveVisualEffect(Field* fields)
}
}
+void Quest::LoadConditionalConditionalQuestDescription(Field* fields)
+{
+ LocaleConstant locale = GetLocaleByName(fields[4].GetStringView());
+ if (locale >= TOTAL_LOCALES)
+ {
+ TC_LOG_ERROR("sql.sql", "Table `quest_description_conditional` has invalid locale %s set for quest %u. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
+ return;
+ }
+
+ auto itr = std::find_if(_conditionalQuestDescription.begin(), _conditionalQuestDescription.end(), [fields](QuestConditionalText const& text)
+ {
+ return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
+ });
+
+ QuestConditionalText& text = itr != _conditionalQuestDescription.end() ? *itr : _conditionalQuestDescription.emplace_back();
+ text.PlayerConditionId = fields[1].GetInt32();
+ text.QuestgiverCreatureId = fields[2].GetInt32();
+ ObjectMgr::AddLocaleString(fields[3].GetString(), locale, text.Text);
+}
+
+void Quest::LoadConditionalConditionalRequestItemsText(Field* fields)
+{
+ LocaleConstant locale = GetLocaleByName(fields[4].GetStringView());
+ if (locale >= TOTAL_LOCALES)
+ {
+ TC_LOG_ERROR("sql.sql", "Table `quest_request_items_conditional` has invalid locale %s set for quest %u. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
+ return;
+ }
+
+ auto itr = std::find_if(_conditionalRequestItemsText.begin(), _conditionalRequestItemsText.end(), [fields](QuestConditionalText const& text)
+ {
+ return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
+ });
+
+ QuestConditionalText& text = itr != _conditionalRequestItemsText.end() ? *itr : _conditionalRequestItemsText.emplace_back();
+ text.PlayerConditionId = fields[1].GetInt32();
+ text.QuestgiverCreatureId = fields[2].GetInt32();
+ ObjectMgr::AddLocaleString(fields[3].GetString(), locale, text.Text);
+}
+
+void Quest::LoadConditionalConditionalOfferRewardText(Field* fields)
+{
+ LocaleConstant locale = GetLocaleByName(fields[4].GetStringView());
+ if (locale >= TOTAL_LOCALES)
+ {
+ TC_LOG_ERROR("sql.sql", "Table `quest_offer_reward_conditional` has invalid locale %s set for quest %u. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
+ return;
+ }
+
+ auto itr = std::find_if(_conditionalOfferRewardText.begin(), _conditionalOfferRewardText.end(), [fields](QuestConditionalText const& text)
+ {
+ return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
+ });
+
+ QuestConditionalText& text = itr != _conditionalOfferRewardText.end() ? *itr : _conditionalOfferRewardText.emplace_back();
+ text.PlayerConditionId = fields[1].GetInt32();
+ text.QuestgiverCreatureId = fields[2].GetInt32();
+ ObjectMgr::AddLocaleString(fields[3].GetString(), locale, text.Text);
+}
+
+void Quest::LoadConditionalConditionalQuestCompletionLog(Field* fields)
+{
+ LocaleConstant locale = GetLocaleByName(fields[4].GetStringView());
+ if (locale >= TOTAL_LOCALES)
+ {
+ TC_LOG_ERROR("sql.sql", "Table `quest_completion_log_conditional` has invalid locale %s set for quest %u. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
+ return;
+ }
+
+ auto itr = std::find_if(_conditionalQuestCompletionLog.begin(), _conditionalQuestCompletionLog.end(), [fields](QuestConditionalText const& text)
+ {
+ return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
+ });
+
+ QuestConditionalText& text = itr != _conditionalQuestCompletionLog.end() ? *itr : _conditionalQuestCompletionLog.emplace_back();
+ text.PlayerConditionId = fields[1].GetInt32();
+ text.QuestgiverCreatureId = fields[2].GetInt32();
+ ObjectMgr::AddLocaleString(fields[3].GetString(), locale, text.Text);
+}
+
uint32 Quest::XPValue(Player const* player) const
{
if (player)
@@ -496,6 +576,19 @@ WorldPacket Quest::BuildQueryData(LocaleConstant loc, Player* player) const
response.Info.PortraitGiverName = GetPortraitGiverName();
response.Info.PortraitTurnInText = GetPortraitTurnInText();
response.Info.PortraitTurnInName = GetPortraitTurnInName();
+ std::transform(GetConditionalQuestDescription().begin(), GetConditionalQuestDescription().end(), std::back_inserter(response.Info.ConditionalQuestDescription), [loc](QuestConditionalText const& text)
+ {
+ std::string_view content = text.Text[LOCALE_enUS];
+ ObjectMgr::GetLocaleString(text.Text, loc, content);
+ return WorldPackets::Quest::ConditionalQuestText { text.PlayerConditionId, text.QuestgiverCreatureId, content };
+ });
+
+ std::transform(GetConditionalQuestCompletionLog().begin(), GetConditionalQuestCompletionLog().end(), std::back_inserter(response.Info.ConditionalQuestCompletionLog), [loc](QuestConditionalText const& text)
+ {
+ std::string_view content = text.Text[LOCALE_enUS];
+ ObjectMgr::GetLocaleString(text.Text, loc, content);
+ return WorldPackets::Quest::ConditionalQuestText { text.PlayerConditionId, text.QuestgiverCreatureId, content };
+ });
if (loc != LOCALE_enUS)
{
@@ -594,6 +687,7 @@ WorldPacket Quest::BuildQueryData(LocaleConstant loc, Player* player) const
response.Info.Expansion = GetExpansion();
response.Info.ManagedWorldStateID = GetManagedWorldStateId();
response.Info.QuestSessionBonus = 0; //GetQuestSessionBonus(); // this is only sent while quest session is active
+ response.Info.QuestGiverCreatureID = 0; // only sent during npc interaction
for (QuestObjective const& questObjective : GetObjectives())
{
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index ec3d3333119..e0bbc363226 100644
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -40,7 +40,7 @@ namespace WorldPackets
}
}
-#define MAX_QUEST_LOG_SIZE 25
+#define MAX_QUEST_LOG_SIZE 35
#define QUEST_ITEM_DROP_COUNT 4
#define QUEST_REWARD_CHOICES_COUNT 6
@@ -472,6 +472,13 @@ struct QuestRewardDisplaySpell
uint32 PlayerConditionId;
};
+struct QuestConditionalText
+{
+ int32 PlayerConditionId = 0;
+ int32 QuestgiverCreatureId = 0;
+ std::vector<std::string> Text;
+};
+
// This Quest class provides a convenient way to access a few pretotaled (cached) quest details,
// all base quest information, and any utility functions such as generating the amount of
// xp to give
@@ -492,6 +499,10 @@ class TC_GAME_API Quest
void LoadQuestMailSender(Field* fields);
void LoadQuestObjective(Field* fields);
void LoadQuestObjectiveVisualEffect(Field* fields);
+ void LoadConditionalConditionalQuestDescription(Field* fields);
+ void LoadConditionalConditionalRequestItemsText(Field* fields);
+ void LoadConditionalConditionalOfferRewardText(Field* fields);
+ void LoadConditionalConditionalQuestCompletionLog(Field* fields);
uint32 XPValue(Player const* player) const;
uint32 MoneyValue(Player const* player) const;
@@ -549,10 +560,14 @@ class TC_GAME_API Quest
std::string const& GetLogTitle() const { return _logTitle; }
std::string const& GetLogDescription() const { return _logDescription; }
std::string const& GetQuestDescription() const { return _questDescription; }
+ std::vector<QuestConditionalText> const& GetConditionalQuestDescription() const { return _conditionalQuestDescription; }
std::string const& GetAreaDescription() const { return _areaDescription; }
std::string const& GetOfferRewardText() const { return _offerRewardText; }
+ std::vector<QuestConditionalText> const& GetConditionalOfferRewardText() const { return _conditionalOfferRewardText; }
std::string const& GetRequestItemsText() const { return _requestItemsText; }
+ std::vector<QuestConditionalText> const& GetConditionalRequestItemsText() const { return _conditionalRequestItemsText; }
std::string const& GetQuestCompletionLog() const { return _questCompletionLog; }
+ std::vector<QuestConditionalText> const& GetConditionalQuestCompletionLog() const { return _conditionalQuestCompletionLog; }
std::string const& GetPortraitGiverText() const { return _portraitGiverText; }
std::string const& GetPortraitGiverName() const { return _portraitGiverName; }
std::string const& GetPortraitTurnInText() const { return _portraitTurnInText; }
@@ -714,6 +729,12 @@ class TC_GAME_API Quest
std::string _portraitTurnInName;
std::string _questCompletionLog;
+ // quest_description_conditional
+ std::vector<QuestConditionalText> _conditionalQuestDescription;
+
+ // quest_completion_log_conditional
+ std::vector<QuestConditionalText> _conditionalQuestCompletionLog;
+
// quest_request_items table
uint32 _emoteOnComplete = 0;
uint32 _emoteOnIncomplete = 0;
@@ -721,9 +742,15 @@ class TC_GAME_API Quest
uint32 _emoteOnIncompleteDelay = 0;
std::string _requestItemsText;
+ // quest_request_items_conditional
+ std::vector<QuestConditionalText> _conditionalRequestItemsText;
+
// quest_offer_reward table
std::string _offerRewardText;
+ // quest_offer_reward_conditional
+ std::vector<QuestConditionalText> _conditionalOfferRewardText;
+
// quest_template_addon table (custom data)
uint32 _maxLevel = 0;
uint32 _allowableClasses = 0;