TrinityCore
QuestDef.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "QuestDef.h"
19#include "ConditionMgr.h"
20#include "DB2Stores.h"
21#include "Field.h"
22#include "GameTables.h"
23#include "Log.h"
24#include "ObjectMgr.h"
25#include "Player.h"
26#include "QuestPackets.h"
27#include "QuestPools.h"
28#include "SpellMgr.h"
29#include "World.h"
30#include "WorldSession.h"
31
32Quest::Quest(Field* questRecord)
33{
34 _id = questRecord[0].GetUInt32();
35 _type = questRecord[1].GetUInt8();
36 _packageID = questRecord[2].GetUInt32();
37 _contentTuningID = questRecord[3].GetInt32();
38 _questSortID = questRecord[4].GetInt16();
39 _questInfoID = questRecord[5].GetUInt16();
40 _suggestedPlayers = questRecord[6].GetUInt8();
41 _nextQuestInChain = questRecord[7].GetUInt32();
42 _rewardXPDifficulty = questRecord[8].GetUInt32();
43 _rewardXPMultiplier = questRecord[9].GetFloat();
44 _rewardMoneyDifficulty = questRecord[10].GetUInt32();
45 _rewardMoneyMultiplier = questRecord[11].GetFloat();
46 _rewardBonusMoney = questRecord[12].GetUInt32();
47 _rewardSpell = questRecord[13].GetUInt32();
48 _rewardHonor = questRecord[14].GetUInt32();
49 _rewardKillHonor = questRecord[15].GetUInt32();
50 _sourceItemId = questRecord[16].GetUInt32();
51 _rewardArtifactXPDifficulty = questRecord[17].GetUInt32();
52 _rewardArtifactXPMultiplier = questRecord[18].GetFloat();
53 _rewardArtifactCategoryID = questRecord[19].GetUInt32();
54 _flags = questRecord[20].GetUInt32();
55 _flagsEx = questRecord[21].GetUInt32();
56 _flagsEx2 = questRecord[22].GetUInt32();
57
58 for (uint32 i = 0; i < QUEST_ITEM_DROP_COUNT; ++i)
59 {
60 RewardItemId[i] = questRecord[23 + i * 4].GetUInt32();
61 RewardItemCount[i] = questRecord[24 + i * 4].GetUInt32();
62 ItemDrop[i] = questRecord[25 + i * 4].GetUInt32();
63 ItemDropQuantity[i] = questRecord[26 + i * 4].GetUInt32();
64
65 if (RewardItemId[i])
67 }
68
69 for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
70 {
71 RewardChoiceItemId[i] = questRecord[39 + i * 3].GetUInt32();
72 RewardChoiceItemCount[i] = questRecord[40 + i * 3].GetUInt32();
73 RewardChoiceItemDisplayId[i] = questRecord[41 + i * 3].GetUInt32();
74
75 if (RewardChoiceItemId[i])
77 }
78
79 _poiContinent = questRecord[57].GetUInt32();
80 _poix = questRecord[58].GetFloat();
81 _poiy = questRecord[59].GetFloat();
82 _poiPriority = questRecord[60].GetUInt32();
83
84 _rewardTitleId = questRecord[61].GetUInt32();
85 _rewardArenaPoints = questRecord[62].GetUInt32();
86 _rewardSkillId = questRecord[63].GetUInt32();
87 _rewardSkillPoints = questRecord[64].GetUInt32();
88
89 _questGiverPortrait = questRecord[65].GetUInt32();
90 _questGiverPortraitMount = questRecord[66].GetUInt32();
91 _questGiverPortraitModelSceneId = questRecord[67].GetInt32();
92 _questTurnInPortrait = questRecord[68].GetUInt32();
93
94 for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i)
95 {
96 RewardFactionId[i] = questRecord[69 + i * 4].GetUInt32();
97 RewardFactionValue[i] = questRecord[70 + i * 4].GetInt32();
98 RewardFactionOverride[i] = questRecord[71 + i * 4].GetInt32();
99 RewardFactionCapIn[i] = questRecord[72 + i * 4].GetInt32();
100 }
101
102 _rewardReputationMask = questRecord[89].GetUInt32();
103
104 for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
105 {
106 RewardCurrencyId[i] = questRecord[90 + i * 2].GetUInt32();
107 RewardCurrencyCount[i] = questRecord[91 + i * 2].GetUInt32();
108
109 if (RewardCurrencyId[i])
111 }
112
113 _soundAccept = questRecord[98].GetUInt32();
114 _soundTurnIn = questRecord[99].GetUInt32();
115 _areaGroupID = questRecord[100].GetUInt32();
116 _limitTime = questRecord[101].GetInt64();
117 _allowableRaces.RawValue = questRecord[102].GetUInt64();
118 _treasurePickerID = questRecord[103].GetInt32();
119 _expansion = questRecord[104].GetInt32();
120 _managedWorldStateID = questRecord[105].GetInt32();
121 _questSessionBonus = questRecord[106].GetInt32();
122
123 _logTitle = questRecord[107].GetString();
124 _logDescription = questRecord[108].GetString();
125 _questDescription = questRecord[109].GetString();
126 _areaDescription = questRecord[110].GetString();
127 _portraitGiverText = questRecord[111].GetString();
128 _portraitGiverName = questRecord[112].GetString();
129 _portraitTurnInText = questRecord[113].GetString();
130 _portraitTurnInName = questRecord[114].GetString();
131 _questCompletionLog = questRecord[115].GetString();
132}
133
135{
136 for (QuestObjective& objective : Objectives)
137 delete objective.CompletionEffect;
138}
139
141{
142 uint32 spellId = fields[1].GetUInt32();
143 uint32 playerConditionId = fields[2].GetUInt32();
144 uint32 type = fields[3].GetUInt32();
145
146 if (!sSpellMgr->GetSpellInfo(spellId, DIFFICULTY_NONE))
147 {
148 TC_LOG_ERROR("sql.sql", "Table `quest_reward_display_spell` has non-existing Spell ({}) set for quest {}. Skipped.", spellId, fields[0].GetUInt32());
149 return;
150 }
151
152 if (playerConditionId && !sPlayerConditionStore.LookupEntry(playerConditionId))
153 {
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;
156 }
157
159 {
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);
162 }
163
164 RewardDisplaySpell.emplace_back(spellId, playerConditionId, QuestCompleteSpellType(type));
165}
166
168{
169 for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
170 RewardChoiceItemType[i] = LootItemType(fields[1 + i].GetUInt8());
171}
172
174{
175 for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
176 {
177 if (!sEmotesStore.LookupEntry(fields[1 + i].GetUInt16()))
178 {
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());
180 continue;
181 }
182
183 DetailsEmote[i] = fields[1 + i].GetUInt16();
184 }
185
186 for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
187 DetailsEmoteDelay[i] = fields[5 + i].GetUInt32();
188}
189
191{
192 _emoteOnComplete = fields[1].GetUInt16();
193 _emoteOnIncomplete = fields[2].GetUInt16();
194
195 if (!sEmotesStore.LookupEntry(_emoteOnComplete))
196 TC_LOG_ERROR("sql.sql", "Table `quest_request_items` has non-existing EmoteOnComplete ({}) set for quest {}.", _emoteOnComplete, fields[0].GetUInt32());
197
198 if (!sEmotesStore.LookupEntry(_emoteOnIncomplete))
199 TC_LOG_ERROR("sql.sql", "Table `quest_request_items` has non-existing EmoteOnIncomplete ({}) set for quest {}.", _emoteOnIncomplete, fields[0].GetUInt32());
200
201 _emoteOnCompleteDelay = fields[3].GetUInt32();
203 _requestItemsText = fields[5].GetString();
204}
205
207{
208 for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
209 {
210 if (!sEmotesStore.LookupEntry(fields[1 + i].GetUInt16()))
211 {
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());
213 continue;
214 }
215
216 OfferRewardEmote[i] = fields[1 + i].GetInt16();
217 }
218
219 for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i)
220 OfferRewardEmoteDelay[i] = fields[5 + i].GetUInt32();
221
222 _offerRewardText = fields[9].GetString();
223}
224
226{
227 _maxLevel = fields[1].GetUInt8();
228 _allowableClasses = fields[2].GetUInt32();
229 _sourceSpellID = fields[3].GetUInt32();
230 _prevQuestID = fields[4].GetInt32();
231 _nextQuestID = fields[5].GetUInt32();
232 _exclusiveGroup = fields[6].GetInt32();
233 _breadcrumbForQuestId = fields[7].GetInt32();
234 _rewardMailTemplateId = fields[8].GetUInt32();
235 _rewardMailDelay = fields[9].GetUInt32();
236 _requiredSkillId = fields[10].GetUInt16();
237 _requiredSkillPoints = fields[11].GetUInt16();
238 _requiredMinRepFaction = fields[12].GetUInt16();
239 _requiredMaxRepFaction = fields[13].GetUInt16();
240 _requiredMinRepValue = fields[14].GetInt32();
241 _requiredMaxRepValue = fields[15].GetInt32();
242 _sourceItemIdCount = fields[16].GetUInt8();
243 _specialFlags = fields[17].GetUInt8();
244 _scriptId = sObjectMgr->GetScriptId(fields[18].GetString());
245
248}
249
251{
252 _rewardMailSenderEntry = fields[1].GetUInt32();
253}
254
256{
257 QuestObjective& obj = Objectives.emplace_back();
258 obj.QuestID = fields[0].GetUInt32();
259 obj.ID = fields[1].GetUInt32();
260 obj.Type = fields[2].GetUInt8();
261 obj.StorageIndex = fields[3].GetInt8();
262 obj.ObjectID = fields[4].GetInt32();
263 obj.Amount = fields[5].GetInt32();
264 obj.Flags = fields[6].GetUInt32();
265 obj.Flags2 = fields[7].GetUInt32();
266 obj.ProgressBarWeight = fields[8].GetFloat();
267 obj.Description = fields[9].GetString();
268
269 bool hasCompletionEffect = std::any_of(fields + 10, fields + 15, [](Field const& f) { return !f.IsNull(); });
270 if (hasCompletionEffect)
271 {
273 if (!fields[10].IsNull())
274 obj.CompletionEffect->GameEventId = fields[10].GetUInt32();
275 if (!fields[11].IsNull())
276 obj.CompletionEffect->SpellId = fields[11].GetUInt32();
277 if (!fields[12].IsNull())
278 obj.CompletionEffect->ConversationId = fields[12].GetUInt32();
279 if (!fields[13].IsNull())
280 obj.CompletionEffect->UpdatePhaseShift = fields[13].GetBool();
281 if (!fields[14].IsNull())
282 obj.CompletionEffect->UpdateZoneAuras = fields[14].GetBool();
283 }
284
285 _usedQuestObjectiveTypes[obj.Type] = true;
286}
287
289{
290 uint32 objID = fields[1].GetUInt32();
291
292 for (QuestObjective& obj : Objectives)
293 {
294 if (obj.ID == objID)
295 {
296 uint8 effectIndex = fields[3].GetUInt8();
297 if (effectIndex >= obj.VisualEffects.size())
298 obj.VisualEffects.resize(effectIndex + 1, 0);
299
300 obj.VisualEffects[effectIndex] = fields[4].GetInt32();
301 break;
302 }
303 }
304}
305
307{
308 LocaleConstant locale = GetLocaleByName(fields[4].GetStringView());
309 if (locale >= TOTAL_LOCALES)
310 {
311 TC_LOG_ERROR("sql.sql", "Table `quest_description_conditional` has invalid locale {} set for quest {}. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
312 return;
313 }
314
315 auto itr = std::find_if(_conditionalQuestDescription.begin(), _conditionalQuestDescription.end(), [fields](QuestConditionalText const& text)
316 {
317 return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
318 });
319
320 QuestConditionalText& text = itr != _conditionalQuestDescription.end() ? *itr : _conditionalQuestDescription.emplace_back();
321 text.PlayerConditionId = fields[1].GetInt32();
322 text.QuestgiverCreatureId = fields[2].GetInt32();
323 ObjectMgr::AddLocaleString(fields[3].GetStringView(), locale, text.Text);
324}
325
327{
328 LocaleConstant locale = GetLocaleByName(fields[4].GetStringView());
329 if (locale >= TOTAL_LOCALES)
330 {
331 TC_LOG_ERROR("sql.sql", "Table `quest_request_items_conditional` has invalid locale {} set for quest {}. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
332 return;
333 }
334
335 auto itr = std::find_if(_conditionalRequestItemsText.begin(), _conditionalRequestItemsText.end(), [fields](QuestConditionalText const& text)
336 {
337 return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
338 });
339
340 QuestConditionalText& text = itr != _conditionalRequestItemsText.end() ? *itr : _conditionalRequestItemsText.emplace_back();
341 text.PlayerConditionId = fields[1].GetInt32();
342 text.QuestgiverCreatureId = fields[2].GetInt32();
343 ObjectMgr::AddLocaleString(fields[3].GetStringView(), locale, text.Text);
344}
345
347{
348 LocaleConstant locale = GetLocaleByName(fields[4].GetStringView());
349 if (locale >= TOTAL_LOCALES)
350 {
351 TC_LOG_ERROR("sql.sql", "Table `quest_offer_reward_conditional` has invalid locale {} set for quest {}. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
352 return;
353 }
354
355 auto itr = std::find_if(_conditionalOfferRewardText.begin(), _conditionalOfferRewardText.end(), [fields](QuestConditionalText const& text)
356 {
357 return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
358 });
359
360 QuestConditionalText& text = itr != _conditionalOfferRewardText.end() ? *itr : _conditionalOfferRewardText.emplace_back();
361 text.PlayerConditionId = fields[1].GetInt32();
362 text.QuestgiverCreatureId = fields[2].GetInt32();
363 ObjectMgr::AddLocaleString(fields[3].GetStringView(), locale, text.Text);
364}
365
367{
368 LocaleConstant locale = GetLocaleByName(fields[4].GetStringView());
369 if (locale >= TOTAL_LOCALES)
370 {
371 TC_LOG_ERROR("sql.sql", "Table `quest_completion_log_conditional` has invalid locale {} set for quest {}. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
372 return;
373 }
374
375 auto itr = std::find_if(_conditionalQuestCompletionLog.begin(), _conditionalQuestCompletionLog.end(), [fields](QuestConditionalText const& text)
376 {
377 return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
378 });
379
381 text.PlayerConditionId = fields[1].GetInt32();
382 text.QuestgiverCreatureId = fields[2].GetInt32();
383 ObjectMgr::AddLocaleString(fields[3].GetStringView(), locale, text.Text);
384}
385
386uint32 Quest::XPValue(Player const* player) const
387{
389}
390
391uint32 Quest::XPValue(Player const* player, uint32 contentTuningId, uint32 xpDifficulty, float xpMultiplier /*= 1.0f*/, int32 expansion /*= -1*/)
392{
393 if (player)
394 {
395 uint32 questLevel = player->GetQuestLevel(contentTuningId);
396 QuestXPEntry const* questXp = sQuestXPStore.LookupEntry(questLevel);
397 if (!questXp || xpDifficulty >= 10)
398 return 0;
399
400 uint32 xp = questXp->Difficulty[xpDifficulty];
401 if (ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(contentTuningId))
402 xp = xp * contentTuning->QuestXpMultiplier;
403
404 int32 diffFactor = 2 * (questLevel - player->GetLevel()) + 12;
405 if (diffFactor < 1)
406 diffFactor = 1;
407 else if (diffFactor > 10)
408 diffFactor = 10;
409
410 xp = diffFactor * xp * xpMultiplier / 10;
411 if (player->GetLevel() >= GetMaxLevelForExpansion(CURRENT_EXPANSION - 1) && player->GetSession()->GetExpansion() == CURRENT_EXPANSION && expansion >= 0 && expansion < CURRENT_EXPANSION)
412 xp = uint32(xp / 9.0f);
413
414 xp = RoundXPValue(xp);
415
416 if (sWorld->getIntConfig(CONFIG_MIN_QUEST_SCALED_XP_RATIO))
417 {
418 uint32 minScaledXP = RoundXPValue(questXp->Difficulty[xpDifficulty] * xpMultiplier) * sWorld->getIntConfig(CONFIG_MIN_QUEST_SCALED_XP_RATIO) / 100;
419 xp = std::max(minScaledXP, xp);
420 }
421
422 return xp;
423 }
424
425 return 0;
426}
427
428/*static*/ bool Quest::IsTakingQuestEnabled(uint32 questId)
429{
430 if (!sQuestPoolMgr->IsQuestActive(questId))
431 return false;
432
433 return true;
434}
435
436uint32 Quest::MoneyValue(Player const* player) const
437{
438 if (QuestMoneyRewardEntry const* money = sQuestMoneyRewardStore.LookupEntry(player->GetQuestLevel(this)))
439 return money->Difficulty[GetRewMoneyDifficulty()] * GetMoneyMultiplier();
440 else
441 return 0;
442}
443
445{
446 uint32 value = 0;
447 if (Optional<ContentTuningLevels> questLevels = sDB2Manager.GetContentTuningData(GetContentTuningId(), 0))
448 if (QuestMoneyRewardEntry const* money = sQuestMoneyRewardStore.LookupEntry(questLevels->MaxLevel))
449 value = money->Difficulty[GetRewMoneyDifficulty()] * GetMoneyMultiplier();
450
451 return value;
452}
453
455{
456 return MaxMoneyValue() * sWorld->getRate(RATE_MONEY_QUEST);
457}
458
460{
461 if (QuestInfoEntry const* questInfo = sQuestInfoStore.LookupEntry(GetQuestInfoID()))
462 return static_cast<QuestTagType>(questInfo->Type);
463
464 return {};
465}
466
468{
469 if (QuestInfoEntry const* questInfo = sQuestInfoStore.LookupEntry(GetQuestInfoID()))
470 return (questInfo->Modifiers & 0x400) != 0;
471
472 return false;
473}
474
476{
478 rewards.ItemCount = GetRewItemsCount();
479 rewards.Money = player->GetQuestMoneyReward(this);
480 rewards.XP = player->GetQuestXPReward(this);
482 rewards.Title = GetRewTitle();
484 auto displaySpellItr = rewards.SpellCompletionDisplayID.begin();
486 {
487 if (PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(displaySpell.PlayerConditionId))
488 if (!ConditionMgr::IsPlayerMeetingCondition(player, playerCondition))
489 continue;
490
491 *displaySpellItr = displaySpell.SpellId;
492 if (++displaySpellItr == rewards.SpellCompletionDisplayID.end())
493 break;
494 }
495
496 rewards.SpellCompletionID = GetRewSpell();
497 rewards.SkillLineID = GetRewardSkillId();
500
501 for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
502 {
503 rewards.ChoiceItems[i].LootItemType = RewardChoiceItemType[i];
504 rewards.ChoiceItems[i].Item.ItemID = RewardChoiceItemId[i];
505 rewards.ChoiceItems[i].Quantity = RewardChoiceItemCount[i];
506 }
507
508 for (uint32 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i)
509 {
510 rewards.ItemID[i] = RewardItemId[i];
511 rewards.ItemQty[i] = RewardItemCount[i];
512 }
513
514 for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i)
515 {
516 rewards.FactionID[i] = RewardFactionId[i];
517 rewards.FactionValue[i] = RewardFactionValue[i];
519 rewards.FactionCapIn[i] = RewardFactionCapIn[i];
520 }
521
522 for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
523 {
524 rewards.CurrencyID[i] = RewardCurrencyId[i];
525 rewards.CurrencyQty[i] = RewardCurrencyCount[i];
526 }
527}
528
530{
531 // If Quest has flag to not give money on max level, it's 0
533 return 0;
534
535 // Else, return the rewarded copper sum modified by the rate
537}
538
540{
542}
543
544bool Quest::IsTurnIn() const
545{
547}
548
549bool Quest::IsRaidQuest(Difficulty difficulty) const
550{
551 switch (_questInfoID)
552 {
553 case QUEST_INFO_RAID:
554 return true;
556 return difficulty == DIFFICULTY_10_N || difficulty == DIFFICULTY_10_HC;
558 return difficulty == DIFFICULTY_25_N || difficulty == DIFFICULTY_25_HC;
559 default:
560 break;
561 }
562
564 return true;
565
566 return false;
567}
568
569bool Quest::IsAllowedInRaid(Difficulty difficulty) const
570{
571 if (IsRaidQuest(difficulty))
572 return true;
573
574 return sWorld->getBoolConfig(CONFIG_QUEST_IGNORE_RAID);
575}
576
578{
579 uint32 honor = 0;
580
581 /*if (GetRewHonorAddition() > 0 || GetRewHonorMultiplier() > 0.0f)
582 {
583 // values stored from 0.. for 1...
584 TeamContributionPointsEntry const* tc = sTeamContributionPointsStore.LookupEntry(level);
585 if (!tc)
586 return 0;
587
588 honor = uint32(tc->Data * GetRewHonorMultiplier() * 0.1f);
589 honor += GetRewHonorAddition();
590 }*/
591
592 return honor;
593}
594
596{
597 // Dungeon Finder/Daily/Repeatable (if not weekly, monthly or seasonal) quests are never considered rewarded serverside.
598 // This affects counters and client requests for completed quests.
599 return (!IsDFQuest() && !IsDaily() && (!IsRepeatable() || IsWeekly() || IsMonthly() || IsSeasonal()));
600}
601
603{
604 for (uint8 loc = LOCALE_enUS; loc < TOTAL_LOCALES; ++loc)
605 QueryData[loc] = BuildQueryData(static_cast<LocaleConstant>(loc), nullptr);
606}
607
609{
611
612 response.Allow = true;
613 response.QuestID = GetQuestId();
614
615 response.Info.LogTitle = GetLogTitle();
624 std::transform(GetConditionalQuestDescription().begin(), GetConditionalQuestDescription().end(), std::back_inserter(response.Info.ConditionalQuestDescription), [loc](QuestConditionalText const& text)
625 {
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 };
629 });
630
631 std::transform(GetConditionalQuestCompletionLog().begin(), GetConditionalQuestCompletionLog().end(), std::back_inserter(response.Info.ConditionalQuestCompletionLog), [loc](QuestConditionalText const& text)
632 {
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 };
636 });
637
638 if (loc != LOCALE_enUS)
639 {
640 if (QuestTemplateLocale const* questTemplateLocale = sObjectMgr->GetQuestLocale(GetQuestId()))
641 {
642 ObjectMgr::GetLocaleString(questTemplateLocale->LogTitle, loc, response.Info.LogTitle);
643 ObjectMgr::GetLocaleString(questTemplateLocale->LogDescription, loc, response.Info.LogDescription);
644 ObjectMgr::GetLocaleString(questTemplateLocale->QuestDescription, loc, response.Info.QuestDescription);
645 ObjectMgr::GetLocaleString(questTemplateLocale->AreaDescription, loc, response.Info.AreaDescription);
646 ObjectMgr::GetLocaleString(questTemplateLocale->QuestCompletionLog, loc, response.Info.QuestCompletionLog);
647 ObjectMgr::GetLocaleString(questTemplateLocale->PortraitGiverText, loc, response.Info.PortraitGiverText);
648 ObjectMgr::GetLocaleString(questTemplateLocale->PortraitGiverName, loc, response.Info.PortraitGiverName);
649 ObjectMgr::GetLocaleString(questTemplateLocale->PortraitTurnInText, loc, response.Info.PortraitTurnInText);
650 ObjectMgr::GetLocaleString(questTemplateLocale->PortraitTurnInName, loc, response.Info.PortraitTurnInName);
651 }
652 }
653
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();
664
665 if (!HasFlag(QUEST_FLAGS_HIDE_REWARD))
666 response.Info.RewardMoney = player ? player->GetQuestMoneyReward(this) : GetMaxMoneyReward();
667
668 response.Info.RewardMoneyDifficulty = GetRewMoneyDifficulty();
669 response.Info.RewardMoneyMultiplier = GetMoneyMultiplier();
670 response.Info.RewardBonusMoney = GetRewMoneyMaxLevel();
671 for (QuestRewardDisplaySpell displaySpell : RewardDisplaySpell)
672 {
673 WorldPackets::Quest::QuestCompleteDisplaySpell& rewardDisplaySpell = response.Info.RewardDisplaySpell.emplace_back();
674 rewardDisplaySpell.SpellID = displaySpell.SpellId;
675 rewardDisplaySpell.PlayerConditionID = displaySpell.PlayerConditionId;
676 rewardDisplaySpell.Type = int32(displaySpell.Type);
677 }
678
679 response.Info.RewardSpell = GetRewSpell();
680
681 response.Info.RewardHonor = GetRewHonor();
682 response.Info.RewardKillHonor = GetRewKillHonor();
683
684 response.Info.RewardArtifactXPDifficulty = GetArtifactXPDifficulty();
685 response.Info.RewardArtifactXPMultiplier = GetArtifactXPMultiplier();
686 response.Info.RewardArtifactCategoryID = GetArtifactCategoryId();
687
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();
701
702 for (uint8 i = 0; i < QUEST_ITEM_DROP_COUNT; ++i)
703 {
704 response.Info.ItemDrop[i] = ItemDrop[i];
705 response.Info.ItemDropQuantity[i] = ItemDropQuantity[i];
706 }
707
708 if (!HasFlag(QUEST_FLAGS_HIDE_REWARD))
709 {
710 for (uint8 i = 0; i < QUEST_REWARD_ITEM_COUNT; ++i)
711 {
712 response.Info.RewardItems[i] = RewardItemId[i];
713 response.Info.RewardAmount[i] = RewardItemCount[i];
714 }
715 for (uint8 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
716 {
717 response.Info.UnfilteredChoiceItems[i].ItemID = RewardChoiceItemId[i];
718 response.Info.UnfilteredChoiceItems[i].Quantity = RewardChoiceItemCount[i];
719 }
720 }
721
722 for (uint8 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i)
723 {
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];
728 }
729
730 response.Info.POIContinent = GetPOIContinent();
731 response.Info.POIx = GetPOIx();
732 response.Info.POIy = GetPOIy();
733 response.Info.POIPriority = GetPOIPriority();
734
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; //GetQuestSessionBonus(); // this is only sent while quest session is active
740 response.Info.QuestGiverCreatureID = 0; // only sent during npc interaction
741
742 for (QuestObjective const& questObjective : GetObjectives())
743 {
744 response.Info.Objectives.push_back(questObjective);
745
746 if (loc != LOCALE_enUS)
747 {
748 if (QuestObjectivesLocale const* questObjectivesLocale = sObjectMgr->GetQuestObjectivesLocale(questObjective.ID))
749 ObjectMgr::GetLocaleString(questObjectivesLocale->Description, loc, response.Info.Objectives.back().Description);
750 }
751 }
752
753 for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i)
754 {
755 response.Info.RewardCurrencyID[i] = RewardCurrencyId[i];
756 response.Info.RewardCurrencyQty[i] = RewardCurrencyCount[i];
757 }
758
759 response.Info.AcceptedSoundKitID = GetSoundAccept();
760 response.Info.CompleteSoundKitID = GetSoundTurnIn();
761 response.Info.AreaGroupID = GetAreaGroupID();
762 response.Info.TimeAllowed = GetLimitTime();
763
764 response.Write();
765 response.ShrinkToFit();
766 return response.Move();
767}
768
770{
771 if (xp <= 100)
772 return 5 * ((xp + 2) / 5);
773 else if (xp <= 500)
774 return 10 * ((xp + 5) / 10);
775 else if (xp <= 1000)
776 return 25 * ((xp + 12) / 25);
777 else
778 return 50 * ((xp + 25) / 50);
779}
LocaleConstant GetLocaleByName(std::string_view name)
Definition: Common.cpp:36
LocaleConstant
Definition: Common.h:48
@ TOTAL_LOCALES
Definition: Common.h:62
@ LOCALE_enUS
Definition: Common.h:49
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 sDB2Manager
Definition: DB2Stores.h:538
Difficulty
Definition: DBCEnums.h:873
@ DIFFICULTY_NONE
Definition: DBCEnums.h:874
@ DIFFICULTY_25_HC
Definition: DBCEnums.h:880
@ DIFFICULTY_10_N
Definition: DBCEnums.h:877
@ DIFFICULTY_25_N
Definition: DBCEnums.h:878
@ DIFFICULTY_10_HC
Definition: DBCEnums.h:879
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
#define TC_LOG_ERROR(filterType__,...)
Definition: Log.h:165
LootItemType
Definition: LootItemType.h:24
#define sObjectMgr
Definition: ObjectMgr.h:1946
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
QuestCompleteSpellType
Definition: QuestDef.h:378
QuestTagType
Definition: QuestDef.h:311
#define QUEST_ITEM_DROP_COUNT
Definition: QuestDef.h:46
#define QUEST_REWARD_ITEM_COUNT
Definition: QuestDef.h:48
#define QUEST_REWARD_REPUTATIONS_COUNT
Definition: QuestDef.h:50
#define QUEST_EMOTE_COUNT
Definition: QuestDef.h:51
#define QUEST_REWARD_CURRENCY_COUNT
Definition: QuestDef.h:52
#define QUEST_REWARD_CHOICES_COUNT
Definition: QuestDef.h:47
@ QUEST_FLAGS_RAID_GROUP_OK
Definition: QuestDef.h:200
@ QUEST_FLAGS_AUTO_ACCEPT
Definition: QuestDef.h:213
@ QUEST_FLAGS_HIDE_REWARD
Definition: QuestDef.h:203
@ QUEST_FLAGS_NO_MONEY_FOR_XP
Definition: QuestDef.h:202
@ QUEST_SPECIAL_FLAGS_AUTO_ACCEPT
Definition: QuestDef.h:300
#define sQuestPoolMgr
Definition: QuestPools.h:63
#define CURRENT_EXPANSION
constexpr uint32 GetMaxLevelForExpansion(uint32 expansion)
@ QUEST_INFO_RAID_10
@ QUEST_INFO_RAID_25
@ QUEST_INFO_RAID
@ QUEST_TYPE_TURNIN
#define sSpellMgr
Definition: SpellMgr.h:849
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition: Util.h:491
static bool IsPlayerMeetingCondition(Player const *player, PlayerConditionEntry const *condition)
Class used to access individual fields of database query result.
Definition: Field.h:90
uint8 GetUInt8() const
Definition: Field.cpp:30
std::string GetString() const
Definition: Field.cpp:118
bool IsNull() const
Definition: Field.h:125
int64 GetInt64() const
Definition: Field.cpp:86
int8 GetInt8() const
Definition: Field.cpp:38
uint64 GetUInt64() const
Definition: Field.cpp:78
int16 GetInt16() const
Definition: Field.cpp:54
uint16 GetUInt16() const
Definition: Field.cpp:46
float GetFloat() const
Definition: Field.cpp:94
bool GetBool() const
Definition: Field.h:98
uint32 GetUInt32() const
Definition: Field.cpp:62
int32 GetInt32() const
Definition: Field.cpp:70
static void AddLocaleString(std::string_view value, LocaleConstant localeConstant, std::vector< std::string > &data)
Definition: ObjectMgr.cpp:240
static std::string_view GetLocaleString(std::vector< std::string > const &data, LocaleConstant locale)
Definition: ObjectMgr.h:1682
int32 GetQuestLevel(Quest const *quest) const
Definition: Player.cpp:14450
uint32 GetQuestXPReward(Quest const *quest)
Definition: Player.cpp:15066
WorldSession * GetSession() const
Definition: Player.h:2101
uint32 GetQuestMoneyReward(Quest const *quest) const
Definition: Player.cpp:15061
uint32 _emoteOnIncomplete
Definition: QuestDef.h:799
uint32 XPValue(Player const *player) const
Definition: QuestDef.cpp:386
std::string _areaDescription
Definition: QuestDef.h:784
std::vector< QuestConditionalText > _conditionalRequestItemsText
Definition: QuestDef.h:805
uint32 _flagsEx2
Definition: QuestDef.h:758
uint32 _soundAccept
Definition: QuestDef.h:772
std::string _portraitTurnInName
Definition: QuestDef.h:788
bool IsTurnIn() const
Definition: QuestDef.cpp:544
int32 _prevQuestID
Definition: QuestDef.h:817
int32 _questSortID
Definition: QuestDef.h:740
uint32 GetRewSpell() const
Definition: QuestDef.h:639
uint32 _contentTuningID
Definition: QuestDef.h:739
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > RewardFactionValue
Definition: QuestDef.h:697
uint32 GetRewMoneyMaxLevel() const
Definition: QuestDef.cpp:529
uint32 GetMaxMoneyReward() const
Definition: QuestDef.cpp:454
uint32 _requiredSkillPoints
Definition: QuestDef.h:824
Optional< QuestTagType > GetQuestTag() const
Definition: QuestDef.cpp:459
uint32 GetRewTitle() const
Definition: QuestDef.h:643
std::array< LootItemType, QUEST_REWARD_CHOICES_COUNT > RewardChoiceItemType
Definition: QuestDef.h:692
float _poix
Definition: QuestDef.h:760
std::string const & GetQuestCompletionLog() const
Definition: QuestDef.h:625
uint32 _suggestedPlayers
Definition: QuestDef.h:742
uint32 GetRewardSkillId() const
Definition: QuestDef.h:663
uint32 _rewardBonusMoney
Definition: QuestDef.h:748
uint32 _questTurnInPortrait
Definition: QuestDef.h:770
std::string const & GetPortraitGiverName() const
Definition: QuestDef.h:628
std::array< uint32, QUEST_REWARD_CURRENCY_COUNT > RewardCurrencyId
Definition: QuestDef.h:700
int32 _breadcrumbForQuestId
Definition: QuestDef.h:820
float _poiy
Definition: QuestDef.h:761
bool IsImportant() const
Definition: QuestDef.cpp:467
void LoadQuestDetails(Field *fields)
Definition: QuestDef.cpp:173
uint32 _questGiverPortrait
Definition: QuestDef.h:767
std::array< uint32, QUEST_REWARD_CHOICES_COUNT > RewardChoiceItemCount
Definition: QuestDef.h:694
std::string const & GetPortraitTurnInName() const
Definition: QuestDef.h:630
uint32 _rewardArtifactCategoryID
Definition: QuestDef.h:754
void LoadRewardDisplaySpell(Field *fields)
Definition: QuestDef.cpp:140
uint32 _sourceItemIdCount
Definition: QuestDef.h:829
Trinity::RaceMask< uint64 > _allowableRaces
Definition: QuestDef.h:776
static bool IsTakingQuestEnabled(uint32 questId)
Definition: QuestDef.cpp:428
void LoadConditionalConditionalRequestItemsText(Field *fields)
Definition: QuestDef.cpp:326
Quest(Field *questRecord)
Definition: QuestDef.cpp:32
uint32 MoneyValue(Player const *player) const
Definition: QuestDef.cpp:436
std::array< uint32, QUEST_REWARD_CHOICES_COUNT > RewardChoiceItemId
Definition: QuestDef.h:693
uint32 _rewardSkillPoints
Definition: QuestDef.h:766
std::array< uint32, QUEST_EMOTE_COUNT > DetailsEmoteDelay
Definition: QuestDef.h:704
void LoadQuestRequestItems(Field *fields)
Definition: QuestDef.cpp:190
void BuildQuestRewards(WorldPackets::Quest::QuestRewards &rewards, Player *player) const
Definition: QuestDef.cpp:475
uint32 _requiredMinRepFaction
Definition: QuestDef.h:825
std::string _questDescription
Definition: QuestDef.h:783
std::array< uint32, QUEST_REWARD_ITEM_COUNT > RewardItemId
Definition: QuestDef.h:688
uint32 MaxMoneyValue() const
Definition: QuestDef.cpp:444
uint32 _requiredSkillId
Definition: QuestDef.h:823
int32 _questGiverPortraitMount
Definition: QuestDef.h:768
uint32 GetContentTuningId() const
Definition: QuestDef.h:590
int32 _requiredMinRepValue
Definition: QuestDef.h:826
uint32 _rewItemsCount
Definition: QuestDef.h:731
std::string _portraitGiverText
Definition: QuestDef.h:785
uint32 _flags
Definition: QuestDef.h:756
void LoadConditionalConditionalQuestDescription(Field *fields)
Definition: QuestDef.cpp:306
uint32 GetRewardReputationMask() const
Definition: QuestDef.h:665
uint32 _rewChoiceItemsCount
Definition: QuestDef.h:730
static uint32 RoundXPValue(uint32 xp)
Definition: QuestDef.cpp:769
std::array< uint32, QUEST_REWARD_ITEM_COUNT > RewardItemCount
Definition: QuestDef.h:689
float _rewardMoneyMultiplier
Definition: QuestDef.h:747
uint32 _areaGroupID
Definition: QuestDef.h:774
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > RewardFactionCapIn
Definition: QuestDef.h:699
int32 _rewardArenaPoints
Definition: QuestDef.h:764
bool IsDFQuest() const
Definition: QuestDef.h:681
uint32 _rewardHonor
Definition: QuestDef.h:750
void LoadQuestMailSender(Field *fields)
Definition: QuestDef.cpp:250
uint32 _nextQuestInChain
Definition: QuestDef.h:743
void LoadQuestObjective(Field *fields)
Definition: QuestDef.cpp:255
QuestObjectives Objectives
Definition: QuestDef.h:702
uint32 _rewardXPDifficulty
Definition: QuestDef.h:744
std::string _requestItemsText
Definition: QuestDef.h:802
int32 _expansion
Definition: QuestDef.h:778
WorldPacket BuildQueryData(LocaleConstant loc, Player *player) const
Definition: QuestDef.cpp:608
bool IsRepeatable() const
Definition: QuestDef.h:654
uint32 _emoteOnIncompleteDelay
Definition: QuestDef.h:801
int32 _exclusiveGroup
Definition: QuestDef.h:819
int32 _managedWorldStateID
Definition: QuestDef.h:779
uint32 _rewardReputationMask
Definition: QuestDef.h:771
std::bitset< MAX_QUEST_OBJECTIVE_TYPE > _usedQuestObjectiveTypes
Definition: QuestDef.h:832
uint32 _rewardKillHonor
Definition: QuestDef.h:751
std::vector< QuestConditionalText > _conditionalQuestDescription
Definition: QuestDef.h:792
uint32 GetArtifactCategoryId() const
Definition: QuestDef.h:637
std::string _portraitTurnInText
Definition: QuestDef.h:787
uint32 _sourceItemId
Definition: QuestDef.h:755
void LoadConditionalConditionalOfferRewardText(Field *fields)
Definition: QuestDef.cpp:346
int32 _requiredMaxRepValue
Definition: QuestDef.h:828
float _rewardArtifactXPMultiplier
Definition: QuestDef.h:753
uint32 CalculateHonorGain(uint8 level) const
Definition: QuestDef.cpp:577
std::string const & GetLogTitle() const
Definition: QuestDef.h:616
void LoadQuestObjectiveVisualEffect(Field *fields)
Definition: QuestDef.cpp:288
uint32 _requiredMaxRepFaction
Definition: QuestDef.h:827
uint32 GetQuestId() const
Definition: QuestDef.h:587
std::string _logTitle
Definition: QuestDef.h:781
std::string _logDescription
Definition: QuestDef.h:782
uint32 _rewardArtifactXPDifficulty
Definition: QuestDef.h:752
uint32 _questInfoID
Definition: QuestDef.h:741
std::string _portraitGiverName
Definition: QuestDef.h:786
void LoadQuestOfferReward(Field *fields)
Definition: QuestDef.cpp:206
uint32 _rewardMailDelay
Definition: QuestDef.h:822
std::string const & GetPortraitGiverText() const
Definition: QuestDef.h:627
uint32 _flagsEx
Definition: QuestDef.h:757
std::array< uint32, QUEST_ITEM_DROP_COUNT > ItemDropQuantity
Definition: QuestDef.h:691
uint32 _sourceSpellID
Definition: QuestDef.h:816
uint32 _rewardSkillId
Definition: QuestDef.h:765
bool IsAutoAccept() const
Definition: QuestDef.cpp:539
bool IsDaily() const
Definition: QuestDef.h:674
uint32 GetQuestInfoID() const
Definition: QuestDef.h:593
uint32 _soundTurnIn
Definition: QuestDef.h:773
uint32 _poiContinent
Definition: QuestDef.h:759
bool IsRaidQuest(Difficulty difficulty) const
Definition: QuestDef.cpp:549
std::vector< QuestConditionalText > _conditionalQuestCompletionLog
Definition: QuestDef.h:795
int32 _treasurePickerID
Definition: QuestDef.h:777
int32 _questSessionBonus
Definition: QuestDef.h:780
std::array< WorldPacket, TOTAL_LOCALES > QueryData
Definition: QuestDef.h:727
int32 _questGiverPortraitModelSceneId
Definition: QuestDef.h:769
std::string const & GetPortraitTurnInText() const
Definition: QuestDef.h:629
uint32 _type
Definition: QuestDef.h:737
std::array< uint32, QUEST_REWARD_CHOICES_COUNT > RewardChoiceItemDisplayId
Definition: QuestDef.h:695
int64 _limitTime
Definition: QuestDef.h:775
uint32 _scriptId
Definition: QuestDef.h:833
uint32 _emoteOnCompleteDelay
Definition: QuestDef.h:800
uint32 _specialFlags
Definition: QuestDef.h:831
float _rewardXPMultiplier
Definition: QuestDef.h:745
uint32 _packageID
Definition: QuestDef.h:738
std::string const & GetLogDescription() const
Definition: QuestDef.h:617
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > RewardFactionOverride
Definition: QuestDef.h:698
void InitializeQueryData()
Definition: QuestDef.cpp:602
std::array< uint32, QUEST_EMOTE_COUNT > DetailsEmote
Definition: QuestDef.h:703
std::array< uint32, QUEST_REWARD_REPUTATIONS_COUNT > RewardFactionId
Definition: QuestDef.h:696
uint32 GetRewItemsCount() const
Definition: QuestDef.h:709
std::string const & GetAreaDescription() const
Definition: QuestDef.h:620
uint32 _poiPriority
Definition: QuestDef.h:762
float GetMoneyMultiplier() const
Definition: QuestDef.h:612
bool IsAllowedInRaid(Difficulty difficulty) const
Definition: QuestDef.cpp:569
uint32 GetRewChoiceItemsCount() const
Definition: QuestDef.h:708
~Quest()
Definition: QuestDef.cpp:134
uint32 _rewardSpell
Definition: QuestDef.h:749
uint32 _allowableClasses
Definition: QuestDef.h:815
bool IsWeekly() const
Definition: QuestDef.h:675
std::vector< QuestConditionalText > _conditionalOfferRewardText
Definition: QuestDef.h:811
bool IsSeasonal() const
Definition: QuestDef.h:677
std::array< int32, QUEST_EMOTE_COUNT > OfferRewardEmote
Definition: QuestDef.h:705
int32 GetTreasurePickerId() const
Definition: QuestDef.h:666
std::string _questCompletionLog
Definition: QuestDef.h:789
uint32 _maxLevel
Definition: QuestDef.h:814
uint32 GetRewMoneyDifficulty() const
Definition: QuestDef.h:632
uint32 _rewCurrencyCount
Definition: QuestDef.h:733
std::array< uint32, QUEST_REWARD_CURRENCY_COUNT > RewardCurrencyCount
Definition: QuestDef.h:701
uint32 _id
Definition: QuestDef.h:736
uint32 _rewardMailSenderEntry
Definition: QuestDef.h:830
std::string const & GetQuestDescription() const
Definition: QuestDef.h:618
uint32 _emoteOnComplete
Definition: QuestDef.h:798
std::array< uint32, QUEST_ITEM_DROP_COUNT > ItemDrop
Definition: QuestDef.h:690
void LoadConditionalConditionalQuestCompletionLog(Field *fields)
Definition: QuestDef.cpp:366
bool IsMonthly() const
Definition: QuestDef.h:676
uint32 _rewardTitleId
Definition: QuestDef.h:763
uint32 _rewardMoneyDifficulty
Definition: QuestDef.h:746
bool HasFlag(QuestFlags flag) const
Definition: QuestDef.h:569
std::string _offerRewardText
Definition: QuestDef.h:808
uint32 _rewardMailTemplateId
Definition: QuestDef.h:821
uint32 GetRewardSkillPoints() const
Definition: QuestDef.h:664
std::array< uint32, QUEST_EMOTE_COUNT > OfferRewardEmoteDelay
Definition: QuestDef.h:706
void LoadRewardChoiceItems(Field *fields)
Definition: QuestDef.cpp:167
std::vector< QuestRewardDisplaySpell > RewardDisplaySpell
Definition: QuestDef.h:687
uint32 _nextQuestID
Definition: QuestDef.h:818
std::vector< QuestConditionalText > const & GetConditionalQuestDescription() const
Definition: QuestDef.h:619
void LoadQuestTemplateAddon(Field *fields)
Definition: QuestDef.cpp:225
bool CanIncreaseRewardedQuestCounters() const
Definition: QuestDef.cpp:595
uint8 GetLevel() const
Definition: Unit.h:746
uint8 GetExpansion() const
#define sWorld
Definition: World.h:931
@ CONFIG_MIN_QUEST_SCALED_XP_RATIO
Definition: World.h:283
@ CONFIG_QUEST_IGNORE_AUTO_COMPLETE
Definition: World.h:165
@ CONFIG_QUEST_IGNORE_RAID
Definition: World.h:125
@ CONFIG_QUEST_IGNORE_AUTO_ACCEPT
Definition: World.h:164
@ RATE_MONEY_MAX_LEVEL_QUEST
Definition: World.h:534
@ RATE_MONEY_QUEST
Definition: World.h:533
int32 QuestgiverCreatureId
Definition: QuestDef.h:531
std::vector< std::string > Text
Definition: QuestDef.h:532
Optional< uint32 > SpellId
Definition: QuestDef.h:437
Optional< uint32 > ConversationId
Definition: QuestDef.h:438
Optional< uint32 > GameEventId
Definition: QuestDef.h:436
QuestObjectiveAction * CompletionEffect
Definition: QuestDef.h:456
int32 ObjectID
Definition: QuestDef.h:449
uint32 Flags2
Definition: QuestDef.h:452
std::string Description
Definition: QuestDef.h:454
int8 StorageIndex
Definition: QuestDef.h:448
uint32 Flags
Definition: QuestDef.h:451
uint32 QuestID
Definition: QuestDef.h:446
int32 Amount
Definition: QuestDef.h:450
float ProgressBarWeight
Definition: QuestDef.h:453
std::array< uint16, 10 > Difficulty
std::vector< ConditionalQuestText > ConditionalQuestDescription
Definition: QuestPackets.h:194
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > FactionOverride
Definition: QuestPackets.h:288
std::array< QuestChoiceItem, QUEST_REWARD_CHOICES_COUNT > ChoiceItems
Definition: QuestPackets.h:283
std::array< int32, QUEST_REWARD_DISPLAY_SPELL_COUNT > SpellCompletionDisplayID
Definition: QuestPackets.h:278
std::array< int32, QUEST_REWARD_CURRENCY_COUNT > CurrencyQty
Definition: QuestPackets.h:291
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > FactionValue
Definition: QuestPackets.h:287
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > FactionCapIn
Definition: QuestPackets.h:289
std::array< int32, QUEST_REWARD_ITEM_COUNT > ItemQty
Definition: QuestPackets.h:285
std::array< int32, QUEST_REWARD_REPUTATIONS_COUNT > FactionID
Definition: QuestPackets.h:286
std::array< int32, QUEST_REWARD_CURRENCY_COUNT > CurrencyID
Definition: QuestPackets.h:290
std::array< int32, QUEST_REWARD_ITEM_COUNT > ItemID
Definition: QuestPackets.h:284