QuestCache.wdb

From wowdev
Revision as of 00:51, 28 April 2020 by Simca (talk | contribs) (→‎Version 9.0.1.33978)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

The QuestCache.wdb holds most of the information for quest you have seen in game.

  • Signature: WQST

Structure

Version 9.0.1.33978

Blizzard removed all three fields related to level (QuestLevel, QuestMaxScalingLevel, and QuestMinLevel) in 9.0.1. Presumably, this is replaced with a lookup to ContentTuning in order to acquire that information. However, I don't know where that lookup happens (maybe in a separate packet that isn't cached?). Regardless, quest levels aren't a thing we have easy access to anymore. Additionally, Blizzard added two new fields to the end of the structure (B30993_Int_1 and B31984_Int_1). The purpose of both is unknown. They were added in the build for which they were named after.

typedef struct {
    int ID;
    int Length;
    if (Length > 0)
    {
        int QuestID;
        int QuestType;
        int Quest_UNK_27075;                // Unknown, but seems to frequently mirror SuggestedGroupNum. Theory: Maximum party size number for LFG Tool to create a group
        int QuestPackageID;                 // FK to QuestPackageItem.db2
        int QuestSortID;                    // When QuestSortID is greater than 0, FK to AreaTable.db2; otherwise, FK to QuestSort.db2
        int QuestInfoID;                    // FK to QuestInfo.db2
        int SuggestedGroupNum;
        int RewardNextQuest;                // Next QuestID in the chain; sometimes blank when it shouldn't be because chains are often not linear and require multiple quests to continue at certain points
        int RewardXPDifficulty;             // The column of QuestXp to use
        float RewardXPMultiplier;           // Multiplier applied to the value retrieved from the field above
        int RewardMoney;                    // Precomputed final money value based on player level at the time of caching; not very useful unless you can ensure consistent player levels
        int RewardMoneyDifficulty;          // The column of QuestMoneyReward to use
        float RewardMoneyMultiplier;        // Multiplier applied to the value retrieved from the field above
        int RewardBonusMoney;               // Bonus money rewarded if completed at max level
        int RewardDisplaySpell[3];
        int RewardSpell;
        int RewardHonor;                    // Amount of honor rewarded by the quest
        float RewardHonorKill;              // Multiplier applied to honor rewarded by the quest (or to kills during it? unknown exactly)
        int RewardArtifactXPDifficulty;     // The column of ArtifactQuestXp to use
        float RewardArtifactXPMultiplier;   // Multiplier applied to the value retrieved from the field above
        int RewardArtifactCategoryID;
        int ProvidedItem;                   // Item linked to the quest, usually destroying it will force the quest to abandon
        uint Flags;
        uint Flags2;
        uint Flags3;
        struct {
            int ItemID;
            int Quantity;
        } RewardFixedItems[4];              // Rewards always given
        struct {
            int ItemID;
            int Quantity;
        } ItemDrop[4];                      // Rewards forced on the player outside the quest dialog(?); rarely used now
        struct {
            int ItemID;
            int Quantity;
            int DisplayID;
        } RewardChoiceItems[6];             // Reward choices - player can pick one
        int POIContinent;                   // Very rarely used these days as POIs are provided by a different system usually
        float POIx;                         // Very rarely used these days as POIs are provided by a different system usually
        float POIy;                         // Very rarely used these days as POIs are provided by a different system usually
        int POIPriority;                    // Very rarely used these days as POIs are provided by a different system usually
        int RewardTitle;                    // Very rarely used (mainly for TBC Isle of Quel'Danas money title); Blizzard prefers to reward titles from quests via RewardSpell these days instead
        int RewardArenaPoints;              // Not used since TBC
        int RewardSkillLineID;
        int RewardNumSkillUps;
        int PortraitGiverDisplayID;
        int BFA_UnkDisplayID;               // Purpose of the field is unknown and it is used significantly less often than the fields around it, but it appears to also be a CreatureDisplayInfoID
        int PortraitTurnInDisplayID;
        struct {
            int FactionID;
            int FactionValue;               // The column of QuestFactionReward to use
            int FactionOverride;            // An override used when Blizzard wants to reward a non-standard amount of reputation, like '1500' or '3000'
            int FactionGainMaxRank;         // The reputation threshold where you stop being able to apply the reputation reward. For example, '7' means that the rep counts all the way through Exalted.
        } RewardFaction[5];
        int RewardFactionFlags;
        struct {
            int CurrencyID;
            int Quantity;
        } RewardCurrency[4];
        int AcceptedSoundKitID;
        int CompleteSoundKitID;
        int AreaGroupID;
        int TimeAllowed;
        int NumObjectives;
        uint64 RaceFlags;
        uint QuestRewardID;
        uint ExpansionID;
        uint B30993_Int_1;                  // Unknown - only set on Warfront-related quests; has values of 12, 113, 114, and 115
        uint B31984_Int_1;                  // Unknown - always 0 so far

        BitfieldDisablePadding();
        BitfieldLeftToRight();
        uint LogTitleLength : 9;
        uint LogDescriptionLength : 12;
        uint QuestDescriptionLength : 12;
        uint AreaDescriptionLength : 9;
        uint PortraitGiverTextLength : 10;
        uint PortraitGiverNameLength : 8;
        uint PortraitTurnInTextLength : 10;
        uint PortraitTurnInNameLength : 8;
        uint QuestCompletionLogLength : 11;
        BitfieldEnablePadding();

        struct
        {
            int ID;
            ubyte Type;
            byte StorageIndex;
            int ObjectID;
            int Amount;
            int Flags;
            int Flags2;
            float PercentAmount;
            int NumVisualEffects;
            int VisualEffects[NumVisualEffects];
            ubyte DescriptionLength;
            char Description[DescriptionLength];
        } Objectives[NumObjectives] <optimize=false>;

        char LogTitle[LogTitleLength];
        char LogDescription[LogDescriptionLength];
        char QuestDescription[QuestDescriptionLength];
        char AreaDescription[AreaDescriptionLength];
        char PortraitGiverText[PortraitGiverTextLength];
        char PortraitGiverName[PortraitGiverNameLength];
        char PortraitTurnInText[PortraitTurnInTextLength];
        char PortraitTurnInName[PortraitTurnInNameLength];
        char QuestCompletionLog[QuestCompletionLogLength];
    }
} QuestCacheRow;

Version 8.0.1.27075

typedef struct {
    int ID;
    int Length;
    if (Length > 0)
    {
        int QuestID;
        int QuestType;
        int QuestLevel;                     // Recommended level to complete the quest
        int Quest_UNK_27075;                // Unknown. Almost always 0 but sometimes 3 or 5.
        int QuestMaxScalingLevel;           // Maximum level that the quest reward and difficulty will scale to
        int QuestPackageID;                 // FK to QuestPackageItem.db2
        int QuestMinLevel;                  // Required level to pick up the quest
        int QuestSortID;                    // When QuestSortID is greater than 0, FK to AreaTable.db2; otherwise, FK to QuestSort.db2
        int QuestInfoID;                    // FK to QuestInfo.db2
        int SuggestedGroupNum;
        int RewardNextQuest;                // Next QuestID in the chain; sometimes blank when it shouldn't be because chains are often not linear and require multiple quests to continue at certain points
        int RewardXPDifficulty;             // The column of QuestXp to use. Use Player Level as the ID if it is within the range of QuestMinLevel to QuestMaxScalingLevel, otherwise QuestLevel.
        float RewardXPMultiplier;           // Multiplier applied to the value retrieved from the field above
        int RewardMoney;                    // Precomputed final money value based on player level at the time of caching; not very useful unless you can ensure consistent player levels
        int RewardMoneyDifficulty;          // The column of QuestMoneyReward to use. Use Player Level as the ID if it is within the range of QuestMinLevel to QuestMaxScalingLevel, otherwise QuestLevel.
        float RewardMoneyMultiplier;        // Multiplier applied to the value retrieved from the field above
        int RewardBonusMoney;               // Bonus money rewarded if completed at max level
        int RewardDisplaySpell[3];
        int RewardSpell;
        int RewardHonor;                    // Amount of honor rewarded by the quest
        float RewardHonorKill;              // Multiplier applied to honor rewarded by the quest (or to kills during it? unknown exactly)
        int RewardArtifactXPDifficulty;     // The column of ArtifactQuestXp to use. Use Player Level as the ID if it is within the range of QuestMinLevel to QuestMaxScalingLevel, otherwise QuestLevel.
        float RewardArtifactXPMultiplier;   // Multiplier applied to the value retrieved from the field above
        int RewardArtifactCategoryID;
        int ProvidedItem;                   // Item linked to the quest, usually destroying it will force the quest to abandon
        uint Flags;
        uint Flags2;
        uint Flags3;
        struct {
            int ItemID;
            int Quantity;
        } RewardFixedItems[4];              // Rewards always given
        struct {
            int ItemID;
            int Quantity;
        } ItemDrop[4];                      // Rewards forced on the player outside the quest dialog(?); rarely used now
        struct {
            int ItemID;
            int Quantity;
            int DisplayID;
        } RewardChoiceItems[6];             // Reward choices - player can pick one
        int POIContinent;                   // Very rarely used these days as POIs are provided by a different system usually
        float POIx;                         // Very rarely used these days as POIs are provided by a different system usually
        float POIy;                         // Very rarely used these days as POIs are provided by a different system usually
        int POIPriority;                    // Very rarely used these days as POIs are provided by a different system usually
        int RewardTitle;                    // Very rarely used (mainly for TBC Isle of Quel'Danas money title); Blizzard prefers to reward titles from quests via RewardSpell these days instead
        int RewardArenaPoints;              // Not used since TBC
        int RewardSkillLineID;
        int RewardNumSkillUps;
        int PortraitGiverDisplayID;
        int BFA_UnkDisplayID;               // Purpose of the field is unknown and it is used significantly less often than the fields around it, but it appears to also be a CreatureDisplayInfoID
        int PortraitTurnInDisplayID;
        struct {
            int FactionID;
            int FactionValue;               // The column of QuestFactionReward to use
            int FactionOverride;            // An override used when Blizzard wants to reward a non-standard amount of reputation, like '1500' or '3000'
            int FactionGainMaxRank;         // The reputation threshold where you stop being able to apply the reputation reward. For example, '7' means that the rep counts all the way through Exalted.
        } RewardFaction[5];
        int RewardFactionFlags;
        struct {
            int CurrencyID;
            int Quantity;
        } RewardCurrency[4];
        int AcceptedSoundKitID;
        int CompleteSoundKitID;
        int AreaGroupID;
        int TimeAllowed;
        int NumObjectives;
        uint64 RaceFlags;
        uint QuestRewardID;
        uint ExpansionID;

        BitfieldDisablePadding();
        BitfieldLeftToRight();
        uint LogTitleLength : 9;
        uint LogDescriptionLength : 12;
        uint QuestDescriptionLength : 12;
        uint AreaDescriptionLength : 9;
        uint PortraitGiverTextLength : 10;
        uint PortraitGiverNameLength : 8;
        uint PortraitTurnInTextLength : 10;
        uint PortraitTurnInNameLength : 8;
        uint QuestCompletionLogLength : 11;
        BitfieldEnablePadding();

        struct
        {
            int ID;
            ubyte Type;
            byte StorageIndex;
            int ObjectID;
            int Amount;
            int Flags;
            int Flags2;
            float PercentAmount;
            int NumVisualEffects;
            int VisualEffects[NumVisualEffects];
            ubyte DescriptionLength;
            char Description[DescriptionLength];
        } Objectives[NumObjectives] <optimize=false>;

        char LogTitle[LogTitleLength];
        char LogDescription[LogDescriptionLength];
        char QuestDescription[QuestDescriptionLength];
        char AreaDescription[AreaDescriptionLength];
        char PortraitGiverText[PortraitGiverTextLength];
        char PortraitGiverName[PortraitGiverNameLength];
        char PortraitTurnInText[PortraitTurnInTextLength];
        char PortraitTurnInName[PortraitTurnInNameLength];
        char QuestCompletionLog[QuestCompletionLogLength];
    }
} QuestCacheRow;

Version 3.3.5?

Column 	Field 			Type 		Notes 
1 	questID 		Integer 	
2 	entryLength 		Integer 	WDB Files 
3 	DuplicatedQuestID 	Integer 	This is a duplicate of the quest ID 
4 	QuestType 		Integer 	2 or 0, 0 appears to be when it's a quick click-through quest like repeatable quests (but not exclusively) 
5 	QuestLevel 		Integer 	The level of the quest. This is not the level at which the quest is atainable at. 
6 	areaID/sortID 		Integer 	AreaTable.dbc if negative the value points to: QuestSort.dbc 
7 	infoID 			Integer 	QuestInfo.dbc 
8	SuggestedPlayers 	Integer 	
9 	FactionID 		Integer 	Faction.dbc 
10 	FactionAmount 		Integer 	e.g. 3000 
11 	Unknown 		Integer 	Always 0? 
12 	Unknown 		Integer 	Always 0? 
13 	nextQuestID 		Integer 	The quest that follows this quest 
14 	coins 			Integer 	Value is in Copper - Coins rewarded on completion 
15 	SubExp70 		Integer 	Value is in Copper - Coins rewarded on lvl 70 instead of experience (guess) 
16 	RewardSpellID 		Integer 	Spell.dbc: Spell or ability that is added to players spellbook upon completion. This is probably an argument passed into EffectOnPlayer somehow, as this is sometimes a duplicated value as the EffectOnPlayer field, and it's not a spell that the player learns. (Such as the Razorhide quest turnin). 
17 	EffectOnPlayer 		Integer 	Spell.dbc: Spell/effect cast on player when completing. 
18 	startingItemID 		Integer 	ItemCache.wdb The item that you are given when you start the quest, such as a package to deliver. 
19 	QuestFlags 		BitMask
20 	givenItem1 		Integer 	ItemCache.wdb 
21 	givenItem1Amount 	Integer 	
22 	givenItem2 		Integer 	ItemCache.wdb
23 	givenItem2Amount 	Integer 	
24 	givenItem3 		Integer 	ItemCache.wdb
25 	givenItem3Amount 	Integer 	
26 	givenItem4 		Integer 	ItemCache.wdb 
27 	givenItem4Amount 	Integer 	
28 	choiceItem1 		Integer 	ItemCache.wdb  
29 	choiceItem1Amount 	Integer 	
30 	choiceItem2 		Integer 	ItemCache.wdb  
31 	choiceItem2Amount 	Integer 	
32 	choiceItem3 		Integer 	ItemCache.wdb  
33 	choiceItem3Amount 	Integer 	
34 	choiceItem4 		Integer 	ItemCache.wdb 
35 	choiceItem4Amount 	Integer 	
36 	choiceItem5 		Integer 	ItemCache.wdb 
37 	choiceItem5Amount 	Integer 	
38 	choiceItem6 		Integer 	ItemCache.wdb 
39 	choiceItem6Amount 	Integer 	
40 	Unknown 		Integer 	
41 	Unknown 		Integer 	
42 	Unknown 		Integer 	
43 	Unknown 		Integer 	
44 	name 			String 	
45 	description 		String 	
46 	details 		String 	
47 	subdescription 		String 	
48 	killCreature1 		Integer 	CreatureCache.wdb 
49 	killCreature1Amount 	Integer 	
50 	collectItem1 		Integer 	ItemCache.wdb 
51 	collectItem1Amount 	Integer 	
52 	killCreature2 		Integer 	CreatureCache.wdb 
53 	killCreature2Amount 	Integer 	
54 	collectItem2 		Integer 	ItemCache.wdb 
55 	collectItem2Amount 	Integer 	
56 	killCreature3 		Integer 	CreatureCache.wdb
57 	killCreature3Amount 	Integer 	
58 	collectItem3 		Integer 	ItemCache.wdb 
59 	collectItem3Amount 	Integer 	
60 	killCreature4 		Integer 	CreatureCache.wdb 
61 	killCreature4Amount 	Integer 	
62 	collectItem4 		Integer 	ItemCache.wdb 
63 	collectItem4Amount 	Integer 	
64 	Objective1 		String 		If not killCreature1 or collectItem1 this is the objective if set 
65 	Objective2 		String 		If not killCreature2 or collectItem2 this is the objective if set 
66 	Objective3 		String 		If not killCreature3 or collectItem3 this is the objective if set 
67 	Objective4 		String 		If not killCreature4 or collectItem4 this is the objective if set  

Version 0.5.3.3368

For PreVanilla (0.5.3.3368) client version

Column 	Field 			Type 
1	QuestId					Integer
2	QuestType				Integer
3	QuestLevel				Integer
4	QuestSortID				Integer
5	QuestInfoID				Integer
6	RewardNextQuest				Integer
7	RewardMoney				Integer
8	StartItem				Integer
9	RewardItems				Integer[4]
10	RewardAmount				Integer[4]
11	RewardChoiceItems			Integer[6]
12	RewardChoiceAmount			Integer[6]
13	POIContinent				Integer
14	POIx					Float
15	POIy					Float
16	POIPriority				Integer
17	LogTitle				Char[128]
18	LogDescription				Char[1024]
19	QuestDescription			Char[1024]
20	AreaDescription				Char[128]
21	MonsterToKill				Integer[4]
22	MonsterToKillQuantity			Integer[4]
23	ItemToGet				Integer[4]
24	ItemToGetQuantity			Integer[4]
25	GetDescription				Char[4][64]

Quest Flags

1 (1)	Deliver	
2 (2)	Kill	
3 (4)	Speak To	
4 (8)	Repeatable?	Q:Shareable?
5 (16)	Exploration	
6 (32)	Timed Quest	
7 (64)	Raid Quest	Tagged as "(Raid)" (to verify)
8 (128)	Reputation	
9 (256)	Unknown	
10 (512)	Unknown	
11 (1024)	Unknown	
12 (2048)	Unknown	
13 (4096)	Daily	This bit is set if it's a Daily Quest