Jump to content

[patch][6728] Implement New Field In Quest_template. Method


Guest NoFantasy

Recommended Posts

Implement use of "Method" for quest: quest_template.Method a more clear way to determine IsAutoComplete()

Revision: 6670+ (patch made for 6670)

Who made it: NoFantasy

Info: The field "Method" is data in client wdb. This has three (known) values. 0, 1 or 2. It is clear that Method=0 is used for quests where it's expected the client should "skip" Objectives and go directly to RequestItemsText or in case empty only show OfferRewardText. Current way of determine this is not fully correct. Examples of this is quest id 349 and 11442. Both have text like [PH] and temp, but should never show to player. Ofc, it can be simple to remove such text to achieve the IsAutoComplete() function, however by implementing Method, the two remaining values may be implemented and handeled later. It is not know what 1 and 2 stands for (2 are used for the vaste majority of quests).

Have in mind if proper data are not present, all quests will act as if they was all AutoComplete. Data are posted at other forum (db-project udb) for those interested and can help review patch for correctness.

Side note 1: patch also removes comments from sLog.outDebug(). We have outDebug for a reason so i suggest use them :)

Side note 2: a small re-definition of QuestFlags|2 Name this QUEST_FLAGS_PARTY_ACCEPT (part of patch are in progress). See note about this redefinition in patch comments.

Patch:

Index: sql/updates/xxxx_mangos_quest_template.sql
===================================================================
--- sql/updates/xxxx_mangos_quest_template.sql        (revision 0)
+++ sql/updates/xxxx_mangos_quest_template.sql        (revision 0)
@@ -0,0 +1 @@
+ALTER TABLE `quest_template` ADD COLUMN `Method` tinyint unsigned NOT NULL default '2' AFTER `entry`;

Property changes on: sql\\updates\\xxxx_mangos_quest_template.sql
___________________________________________________________________
Name: svn:eol-style
    + native

Index: src/game/GossipDef.cpp
===================================================================
--- src/game/GossipDef.cpp        (revision 6670)
+++ src/game/GossipDef.cpp        (working copy)
@@ -382,7 +382,7 @@
        data << uint8(questStatus);

        pSession->SendPacket( &data );
-        //sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_STATUS NPC Guid=%u, status=%u",GUID_LOPART(npcGUID),questStatus);
+        sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_STATUS NPC Guid=%u, status=%u",GUID_LOPART(npcGUID),questStatus);
}

void PlayerMenu::SendQuestGiverQuestDetails( Quest const *pQuest, uint64 npcGUID, bool ActivateAccept )
@@ -468,7 +468,7 @@
        }
        pSession->SendPacket( &data );

-        //sLog.outDebug("WORLD: Sent SMSG_QUESTGIVER_QUEST_DETAILS NPCGuid=%u, questid=%u",GUID_LOPART(npcGUID),pQuest->GetQuestId());
+        sLog.outDebug("WORLD: Sent SMSG_QUESTGIVER_QUEST_DETAILS NPCGuid=%u, questid=%u",GUID_LOPART(npcGUID),pQuest->GetQuestId());
}

void PlayerMenu::SendQuestQueryResponse( Quest const *pQuest )
@@ -506,7 +506,7 @@
        WorldPacket data( SMSG_QUEST_QUERY_RESPONSE, 100 );         // guess size

        data << uint32(pQuest->GetQuestId());
-        data << uint32(pQuest->GetMinLevel());                                    // not MinLevel. Accepted values: 0, 1 or 2 Possible theory for future dev: 0==cannot in quest log, 1==can in quest log session only(removed on log out), 2==can in quest log always (save to db)
+        data << uint32(pQuest->GetQuestMethod());                             // Accepted values: 0, 1 or 2. 0==IsAutoComplete() (skip objectives/details)
        data << uint32(pQuest->GetQuestLevel());                                // may be 0
        data << uint32(pQuest->GetZoneOrSort());                                // zone or sort to display in quest log

@@ -588,7 +588,7 @@
                data << ObjectiveText[iI];

        pSession->SendPacket( &data );
-        //sLog.outDebug( "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid=%u",pQuest->GetQuestId() );
+        sLog.outDebug( "WORLD: Sent SMSG_QUEST_QUERY_RESPONSE questid=%u",pQuest->GetQuestId() );
}

void PlayerMenu::SendQuestGiverOfferReward( Quest const* pQuest, uint64 npcGUID, bool EnbleNext )
@@ -670,7 +670,7 @@
        data << uint32(pQuest->GetRewSpellCast());                            // casted spell
        data << uint32(0);                                                                            // Honor points reward, not implemented
        pSession->SendPacket( &data );
-        //sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPCGuid=%u, questid=%u",GUID_LOPART(npcGUID),pQuest->GetQuestId() );
+        sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_OFFER_REWARD NPCGuid=%u, questid=%u",GUID_LOPART(npcGUID),pQuest->GetQuestId() );
}

void PlayerMenu::SendQuestGiverRequestItems( Quest const *pQuest, uint64 npcGUID, bool Completable, bool CloseOnCancel )
@@ -749,5 +749,5 @@
        data << uint32(0x04) << uint32(0x08) << uint32(0x10);

        pSession->SendPacket( &data );
-        //sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS NPCGuid=%u, questid=%u",GUID_LOPART(npcGUID),pQuest->GetQuestId() );
+        sLog.outDebug( "WORLD: Sent SMSG_QUESTGIVER_REQUEST_ITEMS NPCGuid=%u, questid=%u",GUID_LOPART(npcGUID),pQuest->GetQuestId() );
}
Index: src/game/ObjectMgr.cpp
===================================================================
--- src/game/ObjectMgr.cpp        (revision 6670)
+++ src/game/ObjectMgr.cpp        (working copy)
@@ -2690,35 +2690,35 @@

        mExclusiveQuestGroups.clear();

-        //                                                                                                0            1                     2                         3                 4                     5         6                            7
-        QueryResult *result = WorldDatabase.Query("SELECT entry, ZoneOrSort, SkillOrClass, MinLevel, QuestLevel, Type, RequiredRaces, RequiredSkillValue,"
-        //     8                                        9                                    10                                         11                                     12                                         13                                     14                                15
+        //                                                                                                0            1             2                     3                         4                 5                     6         7                            8
+        QueryResult *result = WorldDatabase.Query("SELECT entry, Method, ZoneOrSort, SkillOrClass, MinLevel, QuestLevel, Type, RequiredRaces, RequiredSkillValue,"
+        //     9                                        10                                 11                                         12                                     13                                         14                                     15                                16
                "RepObjectiveFaction, RepObjectiveValue, RequiredMinRepFaction, RequiredMinRepValue, RequiredMaxRepFaction, RequiredMaxRepValue, SuggestedPlayers, LimitTime,"
-        //     16                    17                        18                     19                     20                     21                            22                                23                 24                        25
+        //     17                    18                        19                     20                     21                     22                            23                                24                 25                        26
                "QuestFlags, SpecialFlags, CharTitleId, PrevQuestId, NextQuestId, ExclusiveGroup, NextQuestInChain, SrcItemId, SrcItemCount, SrcSpell,"
-        //     26         27             28                    29                             30                                31             32                            33                            34                            35
+        //     27         28             29                    30                             31                                32             33                            34                            35                            36
                "Title, Details, Objectives, OfferRewardText, RequestItemsText, EndText, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4,"
-        //     36                    37                    38                    39                    40                         41                         42                         43
+        //     37                    38                    39                    40                    41                         42                         43                         44
                "ReqItemId1, ReqItemId2, ReqItemId3, ReqItemId4, ReqItemCount1, ReqItemCount2, ReqItemCount3, ReqItemCount4,"
-        //     44                        45                        46                        47                        48                             49                             50                             51                             52                         53                         54                         55
+        //     45                        46                        47                        48                        49                             50                             51                             52                             53                         54                         54                         55
                "ReqSourceId1, ReqSourceId2, ReqSourceId3, ReqSourceId4, ReqSourceCount1, ReqSourceCount2, ReqSourceCount3, ReqSourceCount4, ReqSourceRef1, ReqSourceRef2, ReqSourceRef3, ReqSourceRef4,"
-        //     56                                    57                                    58                                    59                                    60                                         61                                         62                                         63
+        //     57                                    58                                    59                                    60                                    61                                         62                                         63                                         64
                "ReqCreatureOrGOId1, ReqCreatureOrGOId2, ReqCreatureOrGOId3, ReqCreatureOrGOId4, ReqCreatureOrGOCount1, ReqCreatureOrGOCount2, ReqCreatureOrGOCount3, ReqCreatureOrGOCount4,"
-        //     64                         65                         66                         67
+        //     65                         66                         67                         68
                "ReqSpellCast1, ReqSpellCast2, ReqSpellCast3, ReqSpellCast4,"
-        //     68                                69                                70                                71                                72                                73
+        //     69                                70                                71                                72                                73                                74
                "RewChoiceItemId1, RewChoiceItemId2, RewChoiceItemId3, RewChoiceItemId4, RewChoiceItemId5, RewChoiceItemId6,"
-        //     74                                     75                                     76                                     77                                     78                                     79
+        //     75                                     76                                     77                                     78                                     79                                     80
                "RewChoiceItemCount1, RewChoiceItemCount2, RewChoiceItemCount3, RewChoiceItemCount4, RewChoiceItemCount5, RewChoiceItemCount6,"
-        //     80                    81                    82                    83                    84                         85                         86                         87
+        //     81                    82                    83                    84                    85                         86                         87                         88
                "RewItemId1, RewItemId2, RewItemId3, RewItemId4, RewItemCount1, RewItemCount2, RewItemCount3, RewItemCount4,"
-        //     88                            89                            90                            91                            92                            93                        94                        95                        96                        97
+        //     89                            90                            91                            92                            93                            94                        95                        96                        97                        98
                "RewRepFaction1, RewRepFaction2, RewRepFaction3, RewRepFaction4, RewRepFaction5, RewRepValue1, RewRepValue2, RewRepValue3, RewRepValue4, RewRepValue5,"
-        //     98                         99                                100             101                     102                                103                             104                 105         106         107
+        //     99                         100                             101             102                     103                                104                             105                 106         107         108
                "RewOrReqMoney, RewMoneyMaxLevel, RewSpell, RewSpellCast, RewMailTemplateId, RewMailDelaySecs, PointMapId, PointX, PointY, PointOpt,"
-        //     108                        109                        110                        111                     112                            113                        114                                115                                116                                117
+        //     109                        110                        111                        112                     113                            114                        115                                116                                117                                118
                "DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4,IncompleteEmote, CompleteEmote, OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4,"
-        //     118                    119
+        //     119                    120
                "StartScript, CompleteScript"
                " FROM quest_template");
        if(result == NULL)
@@ -2754,6 +2754,11 @@

                // additional quest integrity checks (GO, creature_template and item_template must be loaded already)

+                if( qinfo->GetQuestMethod() >= 3 )
+                {
+                        sLog.outErrorDb("Quest %u has `Method` = %u, expected values are 0, 1 or 2.",qinfo->GetQuestId(),qinfo->GetQuestMethod());
+                }
+
                if (qinfo->QuestFlags & ~QUEST_MANGOS_FLAGS_DB_ALLOWED)
                {
                        sLog.outErrorDb("Quest %u has `SpecialFlags` = %u > max allowed value. Correct `SpecialFlags` to value <= %u",
Index: src/game/QuestDef.cpp
===================================================================
--- src/game/QuestDef.cpp        (revision 6670)
+++ src/game/QuestDef.cpp        (working copy)
@@ -23,105 +23,106 @@
Quest::Quest(Field * questRecord)
{
        QuestId = questRecord[0].GetUInt32();
-        ZoneOrSort = questRecord[1].GetInt32();
-        SkillOrClass = questRecord[2].GetInt32();
-        MinLevel = questRecord[3].GetUInt32();
-        QuestLevel = questRecord[4].GetUInt32();
-        Type = questRecord[5].GetUInt32();
-        RequiredRaces = questRecord[6].GetUInt32();
-        RequiredSkillValue = questRecord[7].GetUInt32();
-        RepObjectiveFaction = questRecord[8].GetUInt32();
-        RepObjectiveValue = questRecord[9].GetInt32();
-        RequiredMinRepFaction = questRecord[10].GetUInt32();
-        RequiredMinRepValue = questRecord[11].GetInt32();
-        RequiredMaxRepFaction = questRecord[12].GetUInt32();
-        RequiredMaxRepValue = questRecord[13].GetInt32();
-        SuggestedPlayers = questRecord[14].GetUInt32();
-        LimitTime = questRecord[15].GetUInt32();
-        QuestFlags = questRecord[16].GetUInt16();
-        uint32 SpecialFlags = questRecord[17].GetUInt16();
-        CharTitleId = questRecord[18].GetUInt32();
-        PrevQuestId = questRecord[19].GetInt32();
-        NextQuestId = questRecord[20].GetInt32();
-        ExclusiveGroup = questRecord[21].GetInt32();
-        NextQuestInChain = questRecord[22].GetUInt32();
-        SrcItemId = questRecord[23].GetUInt32();
-        SrcItemCount = questRecord[24].GetUInt32();
-        SrcSpell = questRecord[25].GetUInt32();
-        Title = questRecord[26].GetCppString();
-        Details = questRecord[27].GetCppString();
-        Objectives = questRecord[28].GetCppString();
-        OfferRewardText = questRecord[29].GetCppString();
-        RequestItemsText = questRecord[30].GetCppString();
-        EndText = questRecord[31].GetCppString();
+        QuestMethod = questRecord[1].GetUInt32();
+        ZoneOrSort = questRecord[2].GetInt32();
+        SkillOrClass = questRecord[3].GetInt32();
+        MinLevel = questRecord[4].GetUInt32();
+        QuestLevel = questRecord[5].GetUInt32();
+        Type = questRecord[6].GetUInt32();
+        RequiredRaces = questRecord[7].GetUInt32();
+        RequiredSkillValue = questRecord[8].GetUInt32();
+        RepObjectiveFaction = questRecord[9].GetUInt32();
+        RepObjectiveValue = questRecord[10].GetInt32();
+        RequiredMinRepFaction = questRecord[11].GetUInt32();
+        RequiredMinRepValue = questRecord[12].GetInt32();
+        RequiredMaxRepFaction = questRecord[13].GetUInt32();
+        RequiredMaxRepValue = questRecord[14].GetInt32();
+        SuggestedPlayers = questRecord[15].GetUInt32();
+        LimitTime = questRecord[16].GetUInt32();
+        QuestFlags = questRecord[17].GetUInt16();
+        uint32 SpecialFlags = questRecord[18].GetUInt16();
+        CharTitleId = questRecord[19].GetUInt32();
+        PrevQuestId = questRecord[20].GetInt32();
+        NextQuestId = questRecord[21].GetInt32();
+        ExclusiveGroup = questRecord[22].GetInt32();
+        NextQuestInChain = questRecord[23].GetUInt32();
+        SrcItemId = questRecord[24].GetUInt32();
+        SrcItemCount = questRecord[25].GetUInt32();
+        SrcSpell = questRecord[26].GetUInt32();
+        Title = questRecord[27].GetCppString();
+        Details = questRecord[28].GetCppString();
+        Objectives = questRecord[29].GetCppString();
+        OfferRewardText = questRecord[30].GetCppString();
+        RequestItemsText = questRecord[31].GetCppString();
+        EndText = questRecord[32].GetCppString();

        for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
-                ObjectiveText[i] = questRecord[32+i].GetCppString();
+                ObjectiveText[i] = questRecord[33+i].GetCppString();

        for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
-                ReqItemId[i] = questRecord[36+i].GetUInt32();
+                ReqItemId[i] = questRecord[37+i].GetUInt32();

        for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
-                ReqItemCount[i] = questRecord[40+i].GetUInt32();
+                ReqItemCount[i] = questRecord[41+i].GetUInt32();

        for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
-                ReqSourceId[i] = questRecord[44+i].GetUInt32();
+                ReqSourceId[i] = questRecord[45+i].GetUInt32();

        for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
-                ReqSourceCount[i] = questRecord[48+i].GetUInt32();
+                ReqSourceCount[i] = questRecord[49+i].GetUInt32();

        for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
-                ReqSourceRef[i] = questRecord[52+i].GetUInt32();
+                ReqSourceRef[i] = questRecord[53+i].GetUInt32();

        for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
-                ReqCreatureOrGOId[i] = questRecord[56+i].GetInt32();
+                ReqCreatureOrGOId[i] = questRecord[57+i].GetInt32();

        for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
-                ReqCreatureOrGOCount[i] = questRecord[60+i].GetUInt32();
+                ReqCreatureOrGOCount[i] = questRecord[61+i].GetUInt32();

        for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
-                ReqSpell[i] = questRecord[64+i].GetUInt32();
+                ReqSpell[i] = questRecord[65+i].GetUInt32();

        for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
-                RewChoiceItemId[i] = questRecord[68+i].GetUInt32();
+                RewChoiceItemId[i] = questRecord[69+i].GetUInt32();

        for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
-                RewChoiceItemCount[i] = questRecord[74+i].GetUInt32();
+                RewChoiceItemCount[i] = questRecord[75+i].GetUInt32();

        for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
-                RewItemId[i] = questRecord[80+i].GetUInt32();
+                RewItemId[i] = questRecord[81+i].GetUInt32();

        for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
-                RewItemCount[i] = questRecord[84+i].GetUInt32();
+                RewItemCount[i] = questRecord[85+i].GetUInt32();

        for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
-                RewRepFaction[i] = questRecord[88+i].GetUInt32();
+                RewRepFaction[i] = questRecord[89+i].GetUInt32();

        for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
-                RewRepValue[i] = questRecord[93+i].GetInt32();
+                RewRepValue[i] = questRecord[94+i].GetInt32();

-        RewOrReqMoney = questRecord[98].GetInt32();
-        RewMoneyMaxLevel = questRecord[99].GetUInt32();
-        RewSpell = questRecord[100].GetUInt32();
-        RewSpellCast = questRecord[101].GetUInt32();
-        RewMailTemplateId = questRecord[102].GetUInt32();
-        RewMailDelaySecs = questRecord[103].GetUInt32();
-        PointMapId = questRecord[104].GetUInt32();
-        PointX = questRecord[105].GetFloat();
-        PointY = questRecord[106].GetFloat();
-        PointOpt = questRecord[107].GetUInt32();
+        RewOrReqMoney = questRecord[99].GetInt32();
+        RewMoneyMaxLevel = questRecord[100].GetUInt32();
+        RewSpell = questRecord[101].GetUInt32();
+        RewSpellCast = questRecord[102].GetUInt32();
+        RewMailTemplateId = questRecord[103].GetUInt32();
+        RewMailDelaySecs = questRecord[104].GetUInt32();
+        PointMapId = questRecord[105].GetUInt32();
+        PointX = questRecord[106].GetFloat();
+        PointY = questRecord[107].GetFloat();
+        PointOpt = questRecord[108].GetUInt32();

        for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
-                DetailsEmote[i] = questRecord[108+i].GetUInt32();
+                DetailsEmote[i] = questRecord[109+i].GetUInt32();

-        IncompleteEmote = questRecord[112].GetUInt32();
-        CompleteEmote = questRecord[113].GetUInt32();
+        IncompleteEmote = questRecord[113].GetUInt32();
+        CompleteEmote = questRecord[114].GetUInt32();

        for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
-                OfferRewardEmote[i] = questRecord[114+i].GetInt32();
+                OfferRewardEmote[i] = questRecord[115+i].GetInt32();

-        QuestStartScript = questRecord[118].GetUInt32();
-        QuestCompleteScript = questRecord[119].GetUInt32();
+        QuestStartScript = questRecord[119].GetUInt32();
+        QuestCompleteScript = questRecord[120].GetUInt32();

        QuestFlags |= SpecialFlags << 16;

Index: src/game/QuestDef.h
===================================================================
--- src/game/QuestDef.h        (revision 6670)
+++ src/game/QuestDef.h        (working copy)
@@ -114,7 +114,7 @@
{
        // Flags used at server and sended to client
        QUEST_FLAGS_STAY_ALIVE         = 1,                                                 // Not used currently
-        QUEST_FLAGS_EVENT                    = 2,                                                 // Not used currently
+        QUEST_FLAGS_PARTY_ACCEPT     = 2,                                                 // Not used currently. If player in party, all players that can accept this quest will receive confirmation box to accept quest CMSG_QUEST_CONFIRM_ACCEPT/SMSG_QUEST_CONFIRM_ACCEPT
        QUEST_FLAGS_EXPLORATION        = 4,                                                 // Not used currently
        QUEST_FLAGS_SHARABLE             = 8,                                                 // Can be shared: Player::CanShareQuest()
        //QUEST_FLAGS_NONE2                = 16,                                                // Not used currently
@@ -167,6 +167,7 @@

                // table data accessors:
                uint32 GetQuestId() const { return QuestId; }
+                uint32 GetQuestMethod() const { return QuestMethod; }
                int32    GetZoneOrSort() const { return ZoneOrSort; }
                int32    GetSkillOrClass() const { return SkillOrClass; }
                uint32 GetMinLevel() const { return MinLevel; }
@@ -212,7 +213,7 @@
                uint32 GetQuestStartScript() const { return QuestStartScript; }
                uint32 GetQuestCompleteScript() const { return QuestCompleteScript; }
                bool     IsRepeatable() const { return QuestFlags & QUEST_MANGOS_FLAGS_REPEATABLE; }
-                bool     IsAutoComplete() const { return Objectives.empty(); }
+                bool     IsAutoComplete() const { return QuestMethod ? false : true; }
                uint32 GetFlags() const { return QuestFlags; }
                bool     IsDaily() const { return QuestFlags & QUEST_FLAGS_DAILY; }

@@ -255,6 +256,7 @@
                // table data
        protected:
                uint32 QuestId;
+                uint32 QuestMethod;
                int32    ZoneOrSort;
                int32    SkillOrClass;
                uint32 MinLevel;

Link to comment
Share on other sites

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. Privacy Policy Terms of Use