137 delete objective.CompletionEffect;
148 TC_LOG_ERROR(
"sql.sql",
"Table `quest_reward_display_spell` has non-existing Spell ({}) set for quest {}. Skipped.", spellId, fields[0].GetUInt32());
154 TC_LOG_ERROR(
"sql.sql",
"Table `quest_reward_display_spell` has non-existing PlayerCondition ({}) set for quest {} and spell {}. Set to 0.", playerConditionId, fields[0].GetUInt32(), spellId);
155 playerConditionId = 0;
160 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);
179 TC_LOG_ERROR(
"sql.sql",
"Table `quest_details` has non-existing Emote{} ({}) set for quest {}. Skipped.", 1+i, fields[1+i].GetUInt16(), fields[0].GetUInt32());
196 TC_LOG_ERROR(
"sql.sql",
"Table `quest_request_items` has non-existing EmoteOnComplete ({}) set for quest {}.",
_emoteOnComplete, fields[0].GetUInt32());
199 TC_LOG_ERROR(
"sql.sql",
"Table `quest_request_items` has non-existing EmoteOnIncomplete ({}) set for quest {}.",
_emoteOnIncomplete, fields[0].GetUInt32());
212 TC_LOG_ERROR(
"sql.sql",
"Table `quest_offer_reward` has non-existing Emote{} ({}) set for quest {}. Skipped.", 1+i, fields[1+i].GetUInt16(), fields[0].GetUInt32());
269 bool hasCompletionEffect = std::any_of(fields + 10, fields + 15, [](
Field const& f) {
return !f.
IsNull(); });
270 if (hasCompletionEffect)
273 if (!fields[10].IsNull())
275 if (!fields[11].IsNull())
277 if (!fields[12].IsNull())
279 if (!fields[13].IsNull())
281 if (!fields[14].IsNull())
297 if (effectIndex >= obj.VisualEffects.size())
298 obj.VisualEffects.resize(effectIndex + 1, 0);
300 obj.VisualEffects[effectIndex] = fields[4].
GetInt32();
311 TC_LOG_ERROR(
"sql.sql",
"Table `quest_description_conditional` has invalid locale {} set for quest {}. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
317 return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
331 TC_LOG_ERROR(
"sql.sql",
"Table `quest_request_items_conditional` has invalid locale {} set for quest {}. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
337 return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
351 TC_LOG_ERROR(
"sql.sql",
"Table `quest_offer_reward_conditional` has invalid locale {} set for quest {}. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
357 return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
371 TC_LOG_ERROR(
"sql.sql",
"Table `quest_completion_log_conditional` has invalid locale {} set for quest {}. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
377 return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
397 if (!questXp || xpDifficulty >= 10)
402 xp = xp * contentTuning->QuestXpMultiplier;
404 int32 diffFactor = 2 * (questLevel - player->
GetLevel()) + 12;
407 else if (diffFactor > 10)
410 xp = diffFactor * xp * xpMultiplier / 10;
419 xp = std::max(minScaledXP, xp);
470 return (questInfo->Modifiers & 0x400) != 0;
491 *displaySpellItr = displaySpell.SpellId;
612 response.
Allow =
true;
626 std::string_view content = text.Text[LOCALE_enUS];
627 ObjectMgr::GetLocaleString(text.Text, loc, content);
628 return WorldPackets::Quest::ConditionalQuestText { text.PlayerConditionId, text.QuestgiverCreatureId, content };
631 std::transform(GetConditionalQuestCompletionLog().begin(), GetConditionalQuestCompletionLog().end(), std::back_inserter(response.Info.ConditionalQuestCompletionLog), [loc](
QuestConditionalText const& text)
633 std::string_view content = text.Text[LOCALE_enUS];
634 ObjectMgr::GetLocaleString(text.Text, loc, content);
635 return WorldPackets::Quest::ConditionalQuestText { text.PlayerConditionId, text.QuestgiverCreatureId, content };
654 response.Info.QuestID = GetQuestId();
655 response.Info.QuestType = GetQuestType();
656 response.Info.ContentTuningID = GetContentTuningId();
657 response.Info.QuestPackageID = GetQuestPackageID();
658 response.Info.QuestSortID = GetZoneOrSort();
659 response.Info.QuestInfoID = GetQuestInfoID();
660 response.Info.SuggestedGroupNum = GetSuggestedPlayers();
661 response.Info.RewardNextQuest = GetNextQuestInChain();
662 response.Info.RewardXPDifficulty = GetXPDifficulty();
663 response.Info.RewardXPMultiplier = GetXPMultiplier();
666 response.Info.RewardMoney = player ? player->GetQuestMoneyReward(
this) : GetMaxMoneyReward();
668 response.Info.RewardMoneyDifficulty = GetRewMoneyDifficulty();
669 response.Info.RewardMoneyMultiplier = GetMoneyMultiplier();
670 response.Info.RewardBonusMoney = GetRewMoneyMaxLevel();
674 rewardDisplaySpell.
SpellID = displaySpell.SpellId;
676 rewardDisplaySpell.
Type =
int32(displaySpell.Type);
679 response.Info.RewardSpell = GetRewSpell();
681 response.Info.RewardHonor = GetRewHonor();
682 response.Info.RewardKillHonor = GetRewKillHonor();
684 response.Info.RewardArtifactXPDifficulty = GetArtifactXPDifficulty();
685 response.Info.RewardArtifactXPMultiplier = GetArtifactXPMultiplier();
686 response.Info.RewardArtifactCategoryID = GetArtifactCategoryId();
688 response.Info.StartItem = GetSrcItemId();
689 response.Info.Flags = GetFlags();
690 response.Info.FlagsEx = GetFlagsEx();
691 response.Info.FlagsEx2 = GetFlagsEx2();
692 response.Info.RewardTitle = GetRewTitle();
693 response.Info.RewardArenaPoints = GetRewArenaPoints();
694 response.Info.RewardSkillLineID = GetRewardSkillId();
695 response.Info.RewardNumSkillUps = GetRewardSkillPoints();
696 response.Info.RewardFactionFlags = GetRewardReputationMask();
697 response.Info.PortraitGiver = GetQuestGiverPortrait();
698 response.Info.PortraitGiverMount = GetQuestGiverPortraitMount();
699 response.Info.PortraitGiverModelSceneID = GetQuestGiverPortraitModelSceneId();
700 response.Info.PortraitTurnIn = GetQuestTurnInPortrait();
704 response.Info.ItemDrop[i] = ItemDrop[i];
705 response.Info.ItemDropQuantity[i] = ItemDropQuantity[i];
712 response.Info.RewardItems[i] = RewardItemId[i];
713 response.Info.RewardAmount[i] = RewardItemCount[i];
717 response.Info.UnfilteredChoiceItems[i].ItemID = RewardChoiceItemId[i];
718 response.Info.UnfilteredChoiceItems[i].Quantity = RewardChoiceItemCount[i];
724 response.Info.RewardFactionID[i] = RewardFactionId[i];
725 response.Info.RewardFactionValue[i] = RewardFactionValue[i];
726 response.Info.RewardFactionOverride[i] = RewardFactionOverride[i];
727 response.Info.RewardFactionCapIn[i] = RewardFactionCapIn[i];
730 response.Info.POIContinent = GetPOIContinent();
731 response.Info.POIx = GetPOIx();
732 response.Info.POIy = GetPOIy();
733 response.Info.POIPriority = GetPOIPriority();
735 response.Info.AllowableRaces = GetAllowableRaces();
736 response.Info.TreasurePickerID = GetTreasurePickerId();
737 response.Info.Expansion = GetExpansion();
738 response.Info.ManagedWorldStateID = GetManagedWorldStateId();
739 response.Info.QuestSessionBonus = 0;
740 response.Info.QuestGiverCreatureID = 0;
744 response.Info.Objectives.push_back(questObjective);
755 response.Info.RewardCurrencyID[i] = RewardCurrencyId[i];
756 response.Info.RewardCurrencyQty[i] = RewardCurrencyCount[i];
759 response.Info.AcceptedSoundKitID = GetSoundAccept();
760 response.Info.CompleteSoundKitID = GetSoundTurnIn();
761 response.Info.AreaGroupID = GetAreaGroupID();
762 response.Info.TimeAllowed = GetLimitTime();
765 response.ShrinkToFit();
766 return response.Move();
772 return 5 * ((xp + 2) / 5);
774 return 10 * ((xp + 5) / 10);
776 return 25 * ((xp + 12) / 25);
778 return 50 * ((xp + 25) / 50);
LocaleConstant GetLocaleByName(std::string_view name)
DB2Storage< QuestMoneyRewardEntry > sQuestMoneyRewardStore("QuestMoneyReward.db2", &QuestMoneyRewardLoadInfo::Instance)
DB2Storage< QuestInfoEntry > sQuestInfoStore("QuestInfo.db2", &QuestInfoLoadInfo::Instance)
DB2Storage< EmotesEntry > sEmotesStore("Emotes.db2", &EmotesLoadInfo::Instance)
DB2Storage< QuestXPEntry > sQuestXPStore("QuestXP.db2", &QuestXpLoadInfo::Instance)
DB2Storage< PlayerConditionEntry > sPlayerConditionStore("PlayerCondition.db2", &PlayerConditionLoadInfo::Instance)
DB2Storage< ContentTuningEntry > sContentTuningStore("ContentTuning.db2", &ContentTuningLoadInfo::Instance)
#define TC_LOG_ERROR(filterType__,...)
std::optional< T > Optional
Optional helper class to wrap optional values within.
#define QUEST_ITEM_DROP_COUNT
#define QUEST_REWARD_ITEM_COUNT
#define QUEST_REWARD_REPUTATIONS_COUNT
#define QUEST_EMOTE_COUNT
#define QUEST_REWARD_CURRENCY_COUNT
#define QUEST_REWARD_CHOICES_COUNT
@ QUEST_FLAGS_RAID_GROUP_OK
@ QUEST_FLAGS_AUTO_ACCEPT
@ QUEST_FLAGS_HIDE_REWARD
@ QUEST_FLAGS_NO_MONEY_FOR_XP
@ QUEST_SPECIAL_FLAGS_AUTO_ACCEPT
#define CURRENT_EXPANSION
constexpr uint32 GetMaxLevelForExpansion(uint32 expansion)
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
static bool IsPlayerMeetingCondition(Player const *player, PlayerConditionEntry const *condition)
Class used to access individual fields of database query result.
std::string GetString() const
static void AddLocaleString(std::string_view value, LocaleConstant localeConstant, std::vector< std::string > &data)
static std::string_view GetLocaleString(std::vector< std::string > const &data, LocaleConstant locale)
int32 GetQuestLevel(Quest const *quest) const
uint32 GetQuestXPReward(Quest const *quest)
WorldSession * GetSession() const
uint32 GetQuestMoneyReward(Quest const *quest) const
uint32 _emoteOnIncomplete
uint32 XPValue(Player const *player) const
std::string _areaDescription
std::vector< QuestConditionalText > _conditionalRequestItemsText
std::string _portraitTurnInName
uint32 GetRewSpell() const
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > RewardFactionValue
uint32 GetRewMoneyMaxLevel() const
uint32 GetMaxMoneyReward() const
uint32 _requiredSkillPoints
Optional< QuestTagType > GetQuestTag() const
uint32 GetRewTitle() const
std::array< LootItemType, QUEST_REWARD_CHOICES_COUNT > RewardChoiceItemType
std::string const & GetQuestCompletionLog() const
uint32 GetRewardSkillId() const
uint32 _questTurnInPortrait
std::string const & GetPortraitGiverName() const
std::array< uint32, QUEST_REWARD_CURRENCY_COUNT > RewardCurrencyId
int32 _breadcrumbForQuestId
void LoadQuestDetails(Field *fields)
uint32 _questGiverPortrait
std::array< uint32, QUEST_REWARD_CHOICES_COUNT > RewardChoiceItemCount
std::string const & GetPortraitTurnInName() const
uint32 _rewardArtifactCategoryID
void LoadRewardDisplaySpell(Field *fields)
uint32 _sourceItemIdCount
Trinity::RaceMask< uint64 > _allowableRaces
static bool IsTakingQuestEnabled(uint32 questId)
void LoadConditionalConditionalRequestItemsText(Field *fields)
Quest(Field *questRecord)
uint32 MoneyValue(Player const *player) const
std::array< uint32, QUEST_REWARD_CHOICES_COUNT > RewardChoiceItemId
uint32 _rewardSkillPoints
std::array< uint32, QUEST_EMOTE_COUNT > DetailsEmoteDelay
void LoadQuestRequestItems(Field *fields)
void BuildQuestRewards(WorldPackets::Quest::QuestRewards &rewards, Player *player) const
uint32 _requiredMinRepFaction
std::string _questDescription
std::array< uint32, QUEST_REWARD_ITEM_COUNT > RewardItemId
uint32 MaxMoneyValue() const
int32 _questGiverPortraitMount
uint32 GetContentTuningId() const
int32 _requiredMinRepValue
std::string _portraitGiverText
void LoadConditionalConditionalQuestDescription(Field *fields)
uint32 GetRewardReputationMask() const
uint32 _rewChoiceItemsCount
static uint32 RoundXPValue(uint32 xp)
std::array< uint32, QUEST_REWARD_ITEM_COUNT > RewardItemCount
float _rewardMoneyMultiplier
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > RewardFactionCapIn
void LoadQuestMailSender(Field *fields)
void LoadQuestObjective(Field *fields)
QuestObjectives Objectives
uint32 _rewardXPDifficulty
std::string _requestItemsText
WorldPacket BuildQueryData(LocaleConstant loc, Player *player) const
bool IsRepeatable() const
uint32 _emoteOnIncompleteDelay
int32 _managedWorldStateID
uint32 _rewardReputationMask
std::bitset< MAX_QUEST_OBJECTIVE_TYPE > _usedQuestObjectiveTypes
std::vector< QuestConditionalText > _conditionalQuestDescription
uint32 GetArtifactCategoryId() const
std::string _portraitTurnInText
void LoadConditionalConditionalOfferRewardText(Field *fields)
int32 _requiredMaxRepValue
float _rewardArtifactXPMultiplier
uint32 CalculateHonorGain(uint8 level) const
std::string const & GetLogTitle() const
void LoadQuestObjectiveVisualEffect(Field *fields)
uint32 _requiredMaxRepFaction
uint32 GetQuestId() const
std::string _logDescription
uint32 _rewardArtifactXPDifficulty
std::string _portraitGiverName
void LoadQuestOfferReward(Field *fields)
std::string const & GetPortraitGiverText() const
std::array< uint32, QUEST_ITEM_DROP_COUNT > ItemDropQuantity
bool IsAutoAccept() const
uint32 GetQuestInfoID() const
bool IsRaidQuest(Difficulty difficulty) const
std::vector< QuestConditionalText > _conditionalQuestCompletionLog
std::array< WorldPacket, TOTAL_LOCALES > QueryData
int32 _questGiverPortraitModelSceneId
std::string const & GetPortraitTurnInText() const
std::array< uint32, QUEST_REWARD_CHOICES_COUNT > RewardChoiceItemDisplayId
uint32 _emoteOnCompleteDelay
float _rewardXPMultiplier
std::string const & GetLogDescription() const
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > RewardFactionOverride
void InitializeQueryData()
std::array< uint32, QUEST_EMOTE_COUNT > DetailsEmote
std::array< uint32, QUEST_REWARD_REPUTATIONS_COUNT > RewardFactionId
uint32 GetRewItemsCount() const
std::string const & GetAreaDescription() const
float GetMoneyMultiplier() const
bool IsAllowedInRaid(Difficulty difficulty) const
uint32 GetRewChoiceItemsCount() const
std::vector< QuestConditionalText > _conditionalOfferRewardText
std::array< int32, QUEST_EMOTE_COUNT > OfferRewardEmote
int32 GetTreasurePickerId() const
std::string _questCompletionLog
uint32 GetRewMoneyDifficulty() const
std::array< uint32, QUEST_REWARD_CURRENCY_COUNT > RewardCurrencyCount
uint32 _rewardMailSenderEntry
std::string const & GetQuestDescription() const
std::array< uint32, QUEST_ITEM_DROP_COUNT > ItemDrop
void LoadConditionalConditionalQuestCompletionLog(Field *fields)
uint32 _rewardMoneyDifficulty
bool HasFlag(QuestFlags flag) const
std::string _offerRewardText
uint32 _rewardMailTemplateId
uint32 GetRewardSkillPoints() const
std::array< uint32, QUEST_EMOTE_COUNT > OfferRewardEmoteDelay
void LoadRewardChoiceItems(Field *fields)
std::vector< QuestRewardDisplaySpell > RewardDisplaySpell
std::vector< QuestConditionalText > const & GetConditionalQuestDescription() const
void LoadQuestTemplateAddon(Field *fields)
bool CanIncreaseRewardedQuestCounters() const
uint8 GetExpansion() const
@ CONFIG_MIN_QUEST_SCALED_XP_RATIO
@ CONFIG_QUEST_IGNORE_AUTO_COMPLETE
@ CONFIG_QUEST_IGNORE_RAID
@ CONFIG_QUEST_IGNORE_AUTO_ACCEPT
@ RATE_MONEY_MAX_LEVEL_QUEST
int32 QuestgiverCreatureId
std::vector< std::string > Text
Optional< uint32 > SpellId
Optional< uint32 > ConversationId
Optional< uint32 > GameEventId
QuestObjectiveAction * CompletionEffect
std::array< uint16, 10 > Difficulty
std::string PortraitTurnInName
std::string QuestDescription
std::string PortraitGiverName
std::string AreaDescription
std::string PortraitGiverText
std::string QuestCompletionLog
std::string PortraitTurnInText
std::string LogDescription
std::vector< ConditionalQuestText > ConditionalQuestDescription
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > FactionOverride
std::array< QuestChoiceItem, QUEST_REWARD_CHOICES_COUNT > ChoiceItems
std::array< int32, QUEST_REWARD_DISPLAY_SPELL_COUNT > SpellCompletionDisplayID
std::array< int32, QUEST_REWARD_CURRENCY_COUNT > CurrencyQty
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > FactionValue
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > FactionCapIn
std::array< int32, QUEST_REWARD_ITEM_COUNT > ItemQty
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > FactionID
std::array< int32, QUEST_REWARD_CURRENCY_COUNT > CurrencyID
std::array< int32, QUEST_REWARD_ITEM_COUNT > ItemID