diff options
-rw-r--r-- | sql/updates/world/2015_07_01_03_world_335.sql | 48 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 63 | ||||
-rw-r--r-- | src/server/game/Quests/QuestDef.cpp | 156 | ||||
-rw-r--r-- | src/server/game/Quests/QuestDef.h | 35 |
4 files changed, 191 insertions, 111 deletions
diff --git a/sql/updates/world/2015_07_01_03_world_335.sql b/sql/updates/world/2015_07_01_03_world_335.sql new file mode 100644 index 00000000000..4fde11a51aa --- /dev/null +++ b/sql/updates/world/2015_07_01_03_world_335.sql @@ -0,0 +1,48 @@ +-- creating `quest_template_addon` table +DROP TABLE IF EXISTS `quest_template_addon`; +CREATE TABLE IF NOT EXISTS `quest_template_addon` ( -- old names: + `ID` mediumint(8) unsigned NOT NULL DEFAULT '0', -- ID + `MaxLevel` tinyint(3) unsigned NOT NULL DEFAULT '0', -- MaxLevel + `AllowableClasses` int(10) unsigned NOT NULL DEFAULT '0', -- RequiredClasses + `SourceSpellID` mediumint(8) unsigned NOT NULL DEFAULT '0', -- SourceSpellId + `PrevQuestID` mediumint(8) NOT NULL DEFAULT '0', -- PrevQuestId + `NextQuestID` mediumint(8) NOT NULL DEFAULT '0', -- NextQuestId + `ExclusiveGroup` mediumint(8) NOT NULL DEFAULT '0', -- ExclusiveGroup + `RewardMailTemplateID` mediumint(8) unsigned NOT NULL DEFAULT '0', -- RewardMailTemplateId + `RewardMailDelay` int(10) unsigned NOT NULL DEFAULT '0', -- RewardMailDelay + `RequiredSkillID` smallint(5) unsigned NOT NULL DEFAULT '0', -- RequiredSkillId + `RequiredSkillPoints` smallint(5) unsigned NOT NULL DEFAULT '0', -- RequiredSkillPoints + `RequiredMinRepFaction` smallint(5) unsigned NOT NULL DEFAULT '0', -- RequiredMinRepFaction + `RequiredMaxRepFaction` smallint(5) unsigned NOT NULL DEFAULT '0', -- RequiredMaxRepFaction + `RequiredMinRepValue` mediumint(8) NOT NULL DEFAULT '0', -- RequiredMinRepValue + `RequiredMaxRepValue` mediumint(8) NOT NULL DEFAULT '0', -- RequiredMaxRepValue + `ProvidedItemCount` tinyint(3) unsigned NOT NULL DEFAULT '0', -- SourceItemCount + `SpecialFlags` tinyint(3) unsigned NOT NULL DEFAULT '0', -- SpecialFlags + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + + +-- moving data from `quest_template` to `quest_template_addon` +INSERT INTO `quest_template_addon` +(`ID`, `MaxLevel`, `AllowableClasses`, `SourceSpellID`, `PrevQuestID`, `NextQuestID`, `ExclusiveGroup`, `RewardMailTemplateID`, `RewardMailDelay`, `RequiredSkillID`, `RequiredSkillPoints`, `RequiredMinRepFaction`, `RequiredMaxRepFaction`, `RequiredMinRepValue`, `RequiredMaxRepValue`, `ProvidedItemCount`, `SpecialFlags`) +(SELECT `ID`, `MaxLevel`, `RequiredClasses`, `SourceSpellId`, `PrevQuestId`, `NextQuestId`, `ExclusiveGroup`, `RewardMailTemplateId`, `RewardMailDelay`, `RequiredSkillId`, `RequiredSkillPoints`, `RequiredMinRepFaction`, `RequiredMaxRepFaction`, `RequiredMinRepValue`, `RequiredMaxRepValue`, `SourceItemCount`, `SpecialFlags` FROM `quest_template`); + + +-- drop `quest_template` fields +ALTER TABLE `quest_template` +DROP `MaxLevel`, +DROP `RequiredClasses`, +DROP `SourceSpellId`, +DROP `PrevQuestId`, +DROP `NextQuestId`, +DROP `ExclusiveGroup`, +DROP `RewardMailTemplateId`, +DROP `RewardMailDelay`, +DROP `RequiredSkillId`, +DROP `RequiredSkillPoints`, +DROP `RequiredMinRepFaction`, +DROP `RequiredMaxRepFaction`, +DROP `RequiredMinRepValue`, +DROP `RequiredMaxRepValue`, +DROP `SourceItemCount`, +DROP `SpecialFlags`; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 5509bd39039..491a61f6f35 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3962,35 +3962,35 @@ void ObjectMgr::LoadQuests() mExclusiveQuestGroups.clear(); QueryResult result = WorldDatabase.Query("SELECT " - //0 1 2 3 4 5 6 7 8 9 10 11 12 - "ID, Method, QuestLevel, MinLevel, MaxLevel, QuestSortID, QuestType, SuggestedGroupNum, LimitTime, RequiredClasses, RequiredRaces, RequiredSkillId, RequiredSkillPoints, " - // 13 14 15 16 17 18 19 20 - "RequiredFactionId1, RequiredFactionId2, RequiredFactionValue1, RequiredFactionValue2, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, " - // 21 22 23 24 25 26 27 28 29 30 31 - "PrevQuestId, NextQuestId, ExclusiveGroup, NextQuestIdChain, RewardXPId, RewardOrRequiredMoney, RewardMoneyMaxLevel, RewardSpell, RewardSpellCast, RewardHonor, RewardHonorMultiplier, " - // 32 33 34 35 36 37 38 39 40 41 42 - "RewardMailTemplateId, RewardMailDelay, SourceItemId, SourceItemCount, SourceSpellId, Flags, SpecialFlags, RewardTitle, RequiredPlayerKills, RewardTalents, RewardArenaPoints, " - // 43 44 45 46 47 48 49 50 + //0 1 2 3 4 5 6 7 8 + "ID, Method, QuestLevel, MinLevel, QuestSortID, QuestType, SuggestedGroupNum, LimitTime, RequiredRaces," + // 9 10 11 12 + "RequiredFactionId1, RequiredFactionId2, RequiredFactionValue1, RequiredFactionValue2, " + // 13 14 15 16 17 18 19 20 + "NextQuestIdChain, RewardXPId, RewardOrRequiredMoney, RewardMoneyMaxLevel, RewardSpell, RewardSpellCast, RewardHonor, RewardHonorMultiplier, " + // 21 22 23 24 25 26 + "SourceItemId, Flags, RewardTitle, RequiredPlayerKills, RewardTalents, RewardArenaPoints, " + // 27 28 29 30 31 32 33 34 "RewardItem1, RewardItem2, RewardItem3, RewardItem4, RewardAmount1, RewardAmount2, RewardAmount3, RewardAmount4, " - // 51 52 53 54 55 56 57 58 59 60 61 62 + // 35 36 37 38 39 40 41 42 43 44 45 46 "RewardChoiceItemID1, RewardChoiceItemID2, RewardChoiceItemID3, RewardChoiceItemID4, RewardChoiceItemID5, RewardChoiceItemID6, RewardChoiceItemQuantity1, RewardChoiceItemQuantity2, RewardChoiceItemQuantity3, RewardChoiceItemQuantity4, RewardChoiceItemQuantity5, RewardChoiceItemQuantity6, " - // 63 64 65 66 67 68 69 70 71 72 + // 47 48 49 50 51 52 53 54 55 56 "RewardFactionID1, RewardFactionID2, RewardFactionID3, RewardFactionID4, RewardFactionID5, RewardFactionValue1, RewardFactionValue2, RewardFactionValue3, RewardFactionValue4, RewardFactionValue5, " - // 73 74 75 76 77 + // 57 58 59 60 61 "RewardFactionOverride1, RewardFactionOverride2, RewardFactionOverride3, RewardFactionOverride4, RewardFactionOverride5, " - // 78 79 80 81 + // 62 63 64 65 "PointMapId, PointX, PointY, PointOption, " - // 82 83 84 85 86 87 88 + // 66 67 68 69 70 71 72 "LogTitle, LogDescription, QuestDescription, EndText, OfferRewardText, RequestItemsText, QuestCompletionLog, " - // 89 90 91 92 93 94 95 96 + // 73 74 75 76 77 78 79 80 "RequiredNpcOrGo1, RequiredNpcOrGo2, RequiredNpcOrGo3, RequiredNpcOrGo4, RequiredNpcOrGoCount1, RequiredNpcOrGoCount2, RequiredNpcOrGoCount3, RequiredNpcOrGoCount4, " - // 97 98 99 100 101 102 103 104 + // 81 82 83 84 85 86 87 88 "RequiredSourceItemId1, RequiredSourceItemId2, RequiredSourceItemId3, RequiredSourceItemId4, RequiredSourceItemCount1, RequiredSourceItemCount2, RequiredSourceItemCount3, RequiredSourceItemCount4, " - // 105 106 107 108 109 110 111 112 113 114 115 116 + // 89 90 91 92 93 94 95 96 97 98 99 100 "RequiredItemId1, RequiredItemId2, RequiredItemId3, RequiredItemId4, RequiredItemId5, RequiredItemId6, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredItemCount6, " - // 117 118 119 120 121 122 123 124 125 126 127 128 129 + // 101 102 103 104 105 106 107 108 109 110 111 112 113 "Unknown0, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4, DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4, DetailsEmoteDelay1, DetailsEmoteDelay2, DetailsEmoteDelay3, DetailsEmoteDelay4, " - // 130 131 132 133 134 135 136 137 138 139 + // 114 115 116 117 118 119 120 121 122 123 "EmoteOnIncomplete, EmoteOnComplete, OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4, OfferRewardEmoteDelay1, OfferRewardEmoteDelay2, OfferRewardEmoteDelay3, OfferRewardEmoteDelay4" " FROM quest_template"); if (!result) @@ -4012,6 +4012,31 @@ void ObjectMgr::LoadQuests() std::map<uint32, uint32> usedMailTemplates; + // Load `quest_template_addon` + // 0 1 2 3 4 5 6 7 8 + result = WorldDatabase.Query("SELECT ID, MaxLevel, AllowableClasses, SourceSpellID, PrevQuestID, NextQuestID, ExclusiveGroup, RewardMailTemplateID, RewardMailDelay, " + //9 10 11 12 13 14 15 16 + "RequiredSkillID, RequiredSkillPoints, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, ProvidedItemCount, SpecialFlags FROM quest_template_addon"); + + if (!result) + { + TC_LOG_ERROR("server.loading", ">> Loaded 0 quest template addons. DB table `quest_template_addon` is empty."); + } + else + { + do + { + Field* fields = result->Fetch(); + uint32 questId = fields[0].GetUInt32(); + + auto itr = _questTemplates.find(questId); + if (itr != _questTemplates.end()) + itr->second->LoadQuestTemplateAddon(fields); + else + TC_LOG_ERROR("server.loading", "Table `quest_template_addon` has data for quest %u but such quest does not exist", questId); + } while (result->NextRow()); + } + // Post processing for (QuestMap::iterator iter = _questTemplates.begin(); iter != _questTemplates.end(); ++iter) { diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 6a6e0f45eb7..d1dcfd0f693 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -26,121 +26,102 @@ Quest::Quest(Field* questRecord) Method = questRecord[1].GetUInt8(); Level = questRecord[2].GetInt16(); MinLevel = questRecord[3].GetUInt8(); - MaxLevel = questRecord[4].GetUInt8(); - ZoneOrSort = questRecord[5].GetInt16(); - Type = questRecord[6].GetUInt16(); - SuggestedPlayers = questRecord[7].GetUInt8(); - LimitTime = questRecord[8].GetUInt32(); - RequiredClasses = questRecord[9].GetUInt16(); - RequiredRaces = questRecord[10].GetUInt16(); - RequiredSkillId = questRecord[11].GetUInt16(); - RequiredSkillPoints = questRecord[12].GetUInt16(); - RequiredFactionId1 = questRecord[13].GetUInt16(); - RequiredFactionId2 = questRecord[14].GetUInt16(); - RequiredFactionValue1 = questRecord[15].GetInt32(); - RequiredFactionValue2 = questRecord[16].GetInt32(); - RequiredMinRepFaction = questRecord[17].GetUInt16(); - RequiredMaxRepFaction = questRecord[18].GetUInt16(); - RequiredMinRepValue = questRecord[19].GetInt32(); - RequiredMaxRepValue = questRecord[20].GetInt32(); - PrevQuestId = questRecord[21].GetInt32(); - NextQuestId = questRecord[22].GetInt32(); - ExclusiveGroup = questRecord[23].GetInt32(); - NextQuestIdChain = questRecord[24].GetUInt32(); - RewardXPId = questRecord[25].GetUInt8(); - RewardOrRequiredMoney = questRecord[26].GetInt32(); - RewardMoneyMaxLevel = questRecord[27].GetUInt32(); - RewardSpell = questRecord[28].GetUInt32(); - RewardSpellCast = questRecord[29].GetInt32(); - RewardHonor = questRecord[30].GetUInt32(); - RewardHonorMultiplier = questRecord[31].GetFloat(); - RewardMailTemplateId = questRecord[32].GetUInt32(); - RewardMailDelay = questRecord[33].GetUInt32(); - SourceItemId = questRecord[34].GetUInt32(); - SourceItemIdCount = questRecord[35].GetUInt8(); - SourceSpellid = questRecord[36].GetUInt32(); - Flags = questRecord[37].GetUInt32(); - SpecialFlags = questRecord[38].GetUInt8(); - RewardTitleId = questRecord[39].GetUInt8(); - RequiredPlayerKills = questRecord[40].GetUInt8(); - RewardTalents = questRecord[41].GetUInt8(); - RewardArenaPoints = questRecord[42].GetUInt16(); + ZoneOrSort = questRecord[4].GetInt16(); + Type = questRecord[5].GetUInt16(); + SuggestedPlayers = questRecord[6].GetUInt8(); + LimitTime = questRecord[7].GetUInt32(); + RequiredRaces = questRecord[8].GetUInt16(); + RequiredFactionId1 = questRecord[9].GetUInt16(); + RequiredFactionId2 = questRecord[10].GetUInt16(); + RequiredFactionValue1 = questRecord[11].GetInt32(); + RequiredFactionValue2 = questRecord[12].GetInt32(); + NextQuestIdChain = questRecord[13].GetUInt32(); + RewardXPId = questRecord[14].GetUInt8(); + RewardOrRequiredMoney = questRecord[15].GetInt32(); + RewardMoneyMaxLevel = questRecord[16].GetUInt32(); + RewardSpell = questRecord[17].GetUInt32(); + RewardSpellCast = questRecord[18].GetInt32(); + RewardHonor = questRecord[19].GetUInt32(); + RewardHonorMultiplier = questRecord[20].GetFloat(); + SourceItemId = questRecord[21].GetUInt32(); + Flags = questRecord[22].GetUInt32(); + RewardTitleId = questRecord[23].GetUInt8(); + RequiredPlayerKills = questRecord[24].GetUInt8(); + RewardTalents = questRecord[25].GetUInt8(); + RewardArenaPoints = questRecord[26].GetUInt16(); for (int i = 0; i < QUEST_REWARDS_COUNT; ++i) - RewardItemId[i] = questRecord[43+i].GetUInt32(); + RewardItemId[i] = questRecord[27+i].GetUInt32(); for (int i = 0; i < QUEST_REWARDS_COUNT; ++i) - RewardItemIdCount[i] = questRecord[47+i].GetUInt16(); + RewardItemIdCount[i] = questRecord[31+i].GetUInt16(); for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) - RewardChoiceItemId[i] = questRecord[51+i].GetUInt32(); + RewardChoiceItemId[i] = questRecord[35+i].GetUInt32(); for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) - RewardChoiceItemCount[i] = questRecord[57+i].GetUInt16(); + RewardChoiceItemCount[i] = questRecord[41+i].GetUInt16(); for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) - RewardFactionId[i] = questRecord[63+i].GetUInt16(); + RewardFactionId[i] = questRecord[47+i].GetUInt16(); for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) - RewardFactionValueId[i] = questRecord[68+i].GetInt32(); + RewardFactionValueId[i] = questRecord[52+i].GetInt32(); for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) - RewardFactionValueIdOverride[i] = questRecord[73+i].GetInt32(); - - PointMapId = questRecord[78].GetUInt16(); - PointX = questRecord[79].GetFloat(); - PointY = questRecord[80].GetFloat(); - PointOption = questRecord[81].GetUInt32(); - Title = questRecord[82].GetString(); - Objectives = questRecord[83].GetString(); - Details = questRecord[84].GetString(); - EndText = questRecord[85].GetString(); - OfferRewardText = questRecord[86].GetString(); - RequestItemsText = questRecord[87].GetString(); - CompletedText = questRecord[88].GetString(); + RewardFactionValueIdOverride[i] = questRecord[57+i].GetInt32(); + + PointMapId = questRecord[62].GetUInt16(); + PointX = questRecord[63].GetFloat(); + PointY = questRecord[64].GetFloat(); + PointOption = questRecord[65].GetUInt32(); + Title = questRecord[66].GetString(); + Objectives = questRecord[67].GetString(); + Details = questRecord[68].GetString(); + EndText = questRecord[69].GetString(); + OfferRewardText = questRecord[70].GetString(); + RequestItemsText = questRecord[71].GetString(); + CompletedText = questRecord[72].GetString(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - RequiredNpcOrGo[i] = questRecord[89+i].GetInt32(); + RequiredNpcOrGo[i] = questRecord[73+i].GetInt32(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - RequiredNpcOrGoCount[i] = questRecord[93+i].GetUInt16(); + RequiredNpcOrGoCount[i] = questRecord[77+i].GetUInt16(); for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) - RequiredSourceItemId[i] = questRecord[97+i].GetUInt32(); + RequiredSourceItemId[i] = questRecord[81+i].GetUInt32(); for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) - RequiredSourceItemCount[i] = questRecord[101+i].GetUInt16(); + RequiredSourceItemCount[i] = questRecord[85+i].GetUInt16(); for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) - RequiredItemId[i] = questRecord[105+i].GetUInt32(); + RequiredItemId[i] = questRecord[89+i].GetUInt32(); for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) - RequiredItemCount[i] = questRecord[111+i].GetUInt16(); + RequiredItemCount[i] = questRecord[95+i].GetUInt16(); - // int8 Unknown0 = questRecord[117].GetUInt8(); + // int8 Unknown0 = questRecord[101].GetUInt8(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - ObjectiveText[i] = questRecord[118+i].GetString(); + ObjectiveText[i] = questRecord[102+i].GetString(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - DetailsEmote[i] = questRecord[122+i].GetUInt16(); + DetailsEmote[i] = questRecord[106+i].GetUInt16(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - DetailsEmoteDelay[i] = questRecord[126+i].GetUInt32(); + DetailsEmoteDelay[i] = questRecord[110+i].GetUInt32(); - EmoteOnIncomplete = questRecord[130].GetUInt16(); - EmoteOnComplete = questRecord[131].GetUInt16(); + EmoteOnIncomplete = questRecord[114].GetUInt16(); + EmoteOnComplete = questRecord[115].GetUInt16(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - OfferRewardEmote[i] = questRecord[132+i].GetInt16(); + OfferRewardEmote[i] = questRecord[116+i].GetInt16(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - OfferRewardEmoteDelay[i] = questRecord[136+i].GetInt32(); + OfferRewardEmoteDelay[i] = questRecord[120+i].GetInt32(); - //int32 VerifiedBuild = questRecord[140].GetInt32(); - - if (SpecialFlags & QUEST_SPECIAL_FLAGS_AUTO_ACCEPT) - Flags |= QUEST_FLAGS_AUTO_ACCEPT; + //int32 VerifiedBuild = questRecord[124].GetInt32(); _reqItemsCount = 0; _reqCreatureOrGOcount = 0; @@ -164,6 +145,29 @@ Quest::Quest(Field* questRecord) ++_rewChoiceItemsCount; } +void Quest::LoadQuestTemplateAddon(Field* fields) +{ + MaxLevel = fields[1].GetUInt8(); + RequiredClasses = fields[2].GetUInt32(); + SourceSpellid = fields[3].GetUInt32(); + PrevQuestId = fields[4].GetInt32(); + NextQuestId = fields[5].GetInt32(); + ExclusiveGroup = fields[6].GetInt32(); + RewardMailTemplateId = fields[7].GetUInt32(); + RewardMailDelay = fields[8].GetUInt32(); + RequiredSkillId = fields[9].GetUInt16(); + RequiredSkillPoints = fields[10].GetUInt16(); + RequiredMinRepFaction = fields[11].GetUInt16(); + RequiredMaxRepFaction = fields[12].GetUInt16(); + RequiredMinRepValue = fields[13].GetInt32(); + RequiredMaxRepValue = fields[14].GetInt32(); + SourceItemIdCount = fields[15].GetUInt8(); + SpecialFlags = fields[16].GetUInt8(); + + if (SpecialFlags & QUEST_SPECIAL_FLAGS_AUTO_ACCEPT) + Flags |= QUEST_FLAGS_AUTO_ACCEPT; +} + uint32 Quest::XPValue(Player* player) const { if (player) diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index 8485fab7f63..fdfb2a8e8b9 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -195,6 +195,8 @@ class Quest friend class ObjectMgr; public: Quest(Field* questRecord); + void LoadQuestTemplateAddon(Field* fields); + uint32 XPValue(Player* player) const; bool HasFlag(uint32 flag) const { return (Flags & flag) != 0; } @@ -315,21 +317,13 @@ class Quest uint32 Method; int32 ZoneOrSort; uint32 MinLevel; - uint32 MaxLevel; int32 Level; uint32 Type; - uint32 RequiredClasses; uint32 RequiredRaces; - uint32 RequiredSkillId; - uint32 RequiredSkillPoints; uint32 RequiredFactionId1; int32 RequiredFactionValue1; uint32 RequiredFactionId2; int32 RequiredFactionValue2; - uint32 RequiredMinRepFaction; - int32 RequiredMinRepValue; - uint32 RequiredMaxRepFaction; - int32 RequiredMaxRepValue; uint32 SuggestedPlayers; uint32 LimitTime; uint32 Flags; @@ -337,14 +331,9 @@ class Quest uint32 RequiredPlayerKills; uint32 RewardTalents; int32 RewardArenaPoints; - int32 PrevQuestId; - int32 NextQuestId; - int32 ExclusiveGroup; uint32 NextQuestIdChain; uint32 RewardXPId; uint32 SourceItemId; - uint32 SourceItemIdCount; - uint32 SourceSpellid; std::string Title; std::string Details; std::string Objectives; @@ -358,8 +347,6 @@ class Quest uint32 RewardMoneyMaxLevel; uint32 RewardSpell; int32 RewardSpellCast; - uint32 RewardMailTemplateId; - uint32 RewardMailDelay; uint32 PointMapId; float PointX; float PointY; @@ -367,7 +354,23 @@ class Quest uint32 EmoteOnIncomplete; uint32 EmoteOnComplete; - uint32 SpecialFlags; // custom flags, not sniffed/WDB + // quest_template_addon table (custom data) + uint32 MaxLevel = 0; + uint32 RequiredClasses = 0; + uint32 SourceSpellid = 0; + int32 PrevQuestId = 0; + int32 NextQuestId = 0; + int32 ExclusiveGroup = 0; + uint32 RewardMailTemplateId = 0; + uint32 RewardMailDelay = 0; + uint32 RequiredSkillId = 0; + uint32 RequiredSkillPoints = 0; + uint32 RequiredMinRepFaction = 0; + int32 RequiredMinRepValue = 0; + uint32 RequiredMaxRepFaction = 0; + int32 RequiredMaxRepValue = 0; + uint32 SourceItemIdCount = 0; + uint32 SpecialFlags = 0; // custom flags, not sniffed/WDB }; struct QuestStatusData |