diff --git a/sql/mangos.sql b/sql/mangos.sql index 453925a06..01abee3f5 100644 --- a/sql/mangos.sql +++ b/sql/mangos.sql @@ -24,7 +24,7 @@ CREATE TABLE `db_version` ( `version` varchar(120) default NULL, `creature_ai_version` varchar(120) default NULL, `cache_id` int(10) default '0', - `required_10604_01_mangos_spell_proc_event` bit(1) default NULL + `required_10621_01_mangos_quest_template` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Used DB version notes'; -- @@ -13894,11 +13894,12 @@ CREATE TABLE `quest_template` ( `entry` mediumint(8) unsigned NOT NULL default '0', `Method` tinyint(3) unsigned NOT NULL default '2', `ZoneOrSort` smallint(6) NOT NULL default '0', - `SkillOrClass` smallint(6) NOT NULL default '0', `MinLevel` tinyint(3) unsigned NOT NULL default '0', `QuestLevel` smallint(6) NOT NULL default '0', `Type` smallint(5) unsigned NOT NULL default '0', + `RequiredClasses` smallint(5) unsigned NOT NULL default '0', `RequiredRaces` smallint(5) unsigned NOT NULL default '0', + `RequiredSkill` smallint(5) unsigned NOT NULL default '0', `RequiredSkillValue` smallint(5) unsigned NOT NULL default '0', `RepObjectiveFaction` smallint(5) unsigned NOT NULL default '0', `RepObjectiveValue` mediumint(9) NOT NULL default '0', diff --git a/sql/updates/10621_01_mangos_quest_template.sql b/sql/updates/10621_01_mangos_quest_template.sql new file mode 100644 index 000000000..b5edd3566 --- /dev/null +++ b/sql/updates/10621_01_mangos_quest_template.sql @@ -0,0 +1,40 @@ +ALTER TABLE db_version CHANGE COLUMN required_10604_01_mangos_spell_proc_event required_10621_01_mangos_quest_template bit; + +ALTER TABLE quest_template ADD COLUMN RequiredClasses smallint(5) unsigned NOT NULL default '0' AFTER Type; + +UPDATE quest_template + SET RequiredClasses = RequiredClasses| + CASE SkillOrClass + WHEN -1 THEN 1 -- warrior + WHEN -2 THEN 2 -- paladin + WHEN -3 THEN 4 -- hunter + WHEN -4 THEN 8 -- rogue + WHEN -5 THEN 16 -- priest + WHEN -6 THEN 32 -- dk + WHEN -7 THEN 64 -- shaman + WHEN -8 THEN 128 -- mage + WHEN -9 THEN 256 -- warlock + WHEN -11 THEN 1024 -- druid + ELSE 0 + END + WHERE SkillOrClass < 0; + +UPDATE quest_template + SET RequiredClasses = RequiredClasses| + CASE ZoneOrSort + WHEN -81 THEN 1 -- warrior + WHEN -141 THEN 2 -- paladin + WHEN -261 THEN 4 -- hunter + WHEN -162 THEN 8 -- rogue + WHEN -262 THEN 16 -- priest + WHEN -372 THEN 32 -- dk + WHEN -82 THEN 64 -- shaman + WHEN -161 THEN 128 -- mage + WHEN -61 THEN 256 -- warlock + WHEN -263 THEN 1024 -- druid + ELSE 0 + END + WHERE ZoneOrSort < 0; + +UPDATE quest_template SET SkillOrClass=0 WHERE SkillOrClass<0; +ALTER TABLE quest_template CHANGE COLUMN SkillOrClass RequiredSkill smallint(5) unsigned NOT NULL default '0' AFTER RequiredRaces; diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index 6f0ad97ac..6f5aa3667 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -106,6 +106,7 @@ pkgdata_DATA = \ 10568_01_characters_character_tutorial.sql \ 10582_01_mangos_spell_proc_event.sql \ 10604_01_mangos_spell_proc_event.sql \ + 10621_01_mangos_quest_template.sql \ README ## Additional files to include when running 'make dist' @@ -192,4 +193,5 @@ EXTRA_DIST = \ 10568_01_characters_character_tutorial.sql \ 10582_01_mangos_spell_proc_event.sql \ 10604_01_mangos_spell_proc_event.sql \ + 10621_01_mangos_quest_template.sql \ README diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 6c1ea457a..a49314f22 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -3558,47 +3558,47 @@ void ObjectMgr::LoadQuests() m_ExclusiveQuestGroups.clear(); - // 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 + // 0 1 2 3 4 5 6 7 8 9 + QueryResult *result = WorldDatabase.Query("SELECT entry, Method, ZoneOrSort, MinLevel, QuestLevel, Type, RequiredClasses, RequiredRaces, RequiredSkill, RequiredSkillValue," + // 10 11 12 13 14 15 16 17 "RepObjectiveFaction, RepObjectiveValue, RequiredMinRepFaction, RequiredMinRepValue, RequiredMaxRepFaction, RequiredMaxRepValue, SuggestedPlayers, LimitTime," - // 17 18 19 20 21 22 23 24 25 + // 18 19 20 21 22 23 24 25 26 "QuestFlags, SpecialFlags, CharTitleId, PlayersSlain, BonusTalents, PrevQuestId, NextQuestId, ExclusiveGroup, NextQuestInChain," - // 26 27 28 29 + // 27 28 29 30 "RewXPId, SrcItemId, SrcItemCount, SrcSpell," - // 30 31 32 33 34 35 36 37 38 39 40 + // 31 32 33 34 35 36 37 38 39 40 41 "Title, Details, Objectives, OfferRewardText, RequestItemsText, EndText, CompletedText, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4," - // 41 42 43 44 45 46 47 48 49 50 51 52 + // 42 43 44 45 46 47 48 49 50 51 52 53 "ReqItemId1, ReqItemId2, ReqItemId3, ReqItemId4, ReqItemId5, ReqItemId6, ReqItemCount1, ReqItemCount2, ReqItemCount3, ReqItemCount4, ReqItemCount5, ReqItemCount6," - // 53 54 55 56 57 58 59 60 + // 54 55 56 57 58 59 60 61 "ReqSourceId1, ReqSourceId2, ReqSourceId3, ReqSourceId4, ReqSourceCount1, ReqSourceCount2, ReqSourceCount3, ReqSourceCount4," - // 61 62 63 64 65 66 67 68 + // 62 63 64 65 66 67 68 69 "ReqCreatureOrGOId1, ReqCreatureOrGOId2, ReqCreatureOrGOId3, ReqCreatureOrGOId4, ReqCreatureOrGOCount1, ReqCreatureOrGOCount2, ReqCreatureOrGOCount3, ReqCreatureOrGOCount4," - // 69 70 71 72 + // 70 71 72 73 "ReqSpellCast1, ReqSpellCast2, ReqSpellCast3, ReqSpellCast4," - // 73 74 75 76 77 78 + // 74 75 76 77 78 79 "RewChoiceItemId1, RewChoiceItemId2, RewChoiceItemId3, RewChoiceItemId4, RewChoiceItemId5, RewChoiceItemId6," - // 79 80 81 82 83 84 + // 80 81 82 83 84 85 "RewChoiceItemCount1, RewChoiceItemCount2, RewChoiceItemCount3, RewChoiceItemCount4, RewChoiceItemCount5, RewChoiceItemCount6," - // 85 86 87 88 89 90 91 92 + // 86 87 88 89 90 91 92 93 "RewItemId1, RewItemId2, RewItemId3, RewItemId4, RewItemCount1, RewItemCount2, RewItemCount3, RewItemCount4," - // 93 94 95 96 97 + // 94 95 96 97 98 "RewRepFaction1, RewRepFaction2, RewRepFaction3, RewRepFaction4, RewRepFaction5," - // 98 99 100 101 102 + // 99 100 101 102 103 "RewRepValueId1, RewRepValueId2, RewRepValueId3, RewRepValueId4, RewRepValueId5," - // 103 104 105 106 107 + // 104 105 106 107 108 "RewRepValue1, RewRepValue2, RewRepValue3, RewRepValue4, RewRepValue5," - // 108 109 110 111 112 113 + // 109 110 111 112 113 114 "RewHonorAddition, RewHonorMultiplier, RewOrReqMoney, RewMoneyMaxLevel, RewSpell, RewSpellCast," - // 114 115 116 117 118 119 + // 115 116 117 118 119 120 "RewMailTemplateId, RewMailDelaySecs, PointMapId, PointX, PointY, PointOpt," - // 120 121 122 123 124 125 126 127 + // 121 122 123 124 125 126 127 128 "DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4, DetailsEmoteDelay1, DetailsEmoteDelay2, DetailsEmoteDelay3, DetailsEmoteDelay4," - // 128 129 130 131 132 133 + // 129 130 131 132 133 134 "IncompleteEmote, CompleteEmote, OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4," - // 134 135 136 137 + // 135 136 137 138 "OfferRewardEmoteDelay1, OfferRewardEmoteDelay2, OfferRewardEmoteDelay3, OfferRewardEmoteDelay4," - // 138 139 + // 139 140 "StartScript, CompleteScript" " FROM quest_template"); if (result == NULL) @@ -3707,45 +3707,46 @@ void ObjectMgr::LoadQuests() qinfo->GetQuestId(),qinfo->ZoneOrSort); // no changes, quest not dependent from this value but can have problems at client (note some may be 0, we must allow this so no check) } - //check SkillOrClass value (class case). - if (ClassByQuestSort(-int32(qinfo->ZoneOrSort))) - { - // SkillOrClass should not have class case when class case already set in ZoneOrSort. - if (qinfo->SkillOrClass < 0) - { - sLog.outErrorDb("Quest %u has `ZoneOrSort` = %i (class sort case) and `SkillOrClass` = %i (class case), redundant.", - qinfo->GetQuestId(),qinfo->ZoneOrSort,qinfo->SkillOrClass); - } - } - //check for proper SkillOrClass value (skill case) + + //check for proper RequiredSkill value (skill case) if (int32 skill_id = SkillByQuestSort(-int32(qinfo->ZoneOrSort))) { - // skill is positive value in SkillOrClass - if (qinfo->SkillOrClass != skill_id ) + if (qinfo->RequiredSkill != skill_id) { - sLog.outErrorDb("Quest %u has `ZoneOrSort` = %i (skill sort case) but `SkillOrClass` does not have a corresponding value (%i).", + sLog.outErrorDb("Quest %u has `ZoneOrSort` = %i but `RequiredSkill` does not have a corresponding value (%i).", qinfo->GetQuestId(),qinfo->ZoneOrSort,skill_id); //override, and force proper value here? } } } - // SkillOrClass (class case) - if (qinfo->SkillOrClass < 0) + // RequiredClasses, can be 0/CLASSMASK_ALL_PLAYABLE to allow any class + if (qinfo->RequiredClasses) { - if (!sChrClassesStore.LookupEntry(-int32(qinfo->SkillOrClass))) + if (!(qinfo->RequiredClasses & CLASSMASK_ALL_PLAYABLE)) { - sLog.outErrorDb("Quest %u has `SkillOrClass` = %i (class case) but class (%i) does not exist", - qinfo->GetQuestId(),qinfo->SkillOrClass,-qinfo->SkillOrClass); + sLog.outErrorDb("Quest %u does not contain any playable classes in `RequiredClasses` (%u), value set to 0 (all classes).", qinfo->GetQuestId(), qinfo->RequiredClasses); + qinfo->RequiredClasses = 0; } } - // SkillOrClass (skill case) - if (qinfo->SkillOrClass > 0) + + // RequiredRaces, can be 0/RACEMASK_ALL_PLAYABLE to allow any race + if (qinfo->RequiredRaces) { - if (!sSkillLineStore.LookupEntry(qinfo->SkillOrClass)) + if (!(qinfo->RequiredRaces & RACEMASK_ALL_PLAYABLE)) { - sLog.outErrorDb("Quest %u has `SkillOrClass` = %u (skill case) but skill (%i) does not exist", - qinfo->GetQuestId(),qinfo->SkillOrClass,qinfo->SkillOrClass); + sLog.outErrorDb("Quest %u does not contain any playable races in `RequiredRaces` (%u), value set to 0 (all races).", qinfo->GetQuestId(), qinfo->RequiredRaces); + qinfo->RequiredRaces = 0; + } + } + + // RequiredSkill, can be 0 + if (qinfo->RequiredSkill) + { + if (!sSkillLineStore.LookupEntry(qinfo->RequiredSkill)) + { + sLog.outErrorDb("Quest %u has `RequiredSkill` = %u but this skill does not exist", + qinfo->GetQuestId(), qinfo->RequiredSkill); } } @@ -3757,13 +3758,6 @@ void ObjectMgr::LoadQuests() qinfo->GetQuestId(),qinfo->RequiredSkillValue,sWorld.GetConfigMaxSkillValue()); // no changes, quest can't be done for this requirement } - - if (qinfo->SkillOrClass <= 0) - { - sLog.outErrorDb("Quest %u has `RequiredSkillValue` = %u but `SkillOrClass` = %i (class case), value ignored.", - qinfo->GetQuestId(),qinfo->RequiredSkillValue,qinfo->SkillOrClass); - // no changes, quest can't be done for this requirement (fail at wrong skill id) - } } // else Skill quests can have 0 skill level, this is ok diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 3289235b6..d9e6e9315 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -13274,7 +13274,7 @@ Quest const* Player::GetNextQuest(uint64 guid, Quest const *pQuest) bool Player::CanSeeStartQuest( Quest const *pQuest ) const { - if (SatisfyQuestRace( pQuest, false ) && SatisfyQuestSkillOrClass( pQuest, false ) && + if (SatisfyQuestClass(pQuest, false) && SatisfyQuestRace(pQuest, false) && SatisfyQuestSkill(pQuest, false) && SatisfyQuestExclusiveGroup( pQuest, false ) && SatisfyQuestReputation( pQuest, false ) && SatisfyQuestPreviousQuest( pQuest, false ) && SatisfyQuestNextChain( pQuest, false ) && SatisfyQuestPrevChain( pQuest, false ) && SatisfyQuestDay( pQuest, false ) && SatisfyQuestWeek( pQuest, false )) @@ -13288,8 +13288,8 @@ bool Player::CanSeeStartQuest( Quest const *pQuest ) const bool Player::CanTakeQuest( Quest const *pQuest, bool msg ) const { return SatisfyQuestStatus( pQuest, msg ) && SatisfyQuestExclusiveGroup( pQuest, msg ) - && SatisfyQuestRace( pQuest, msg ) && SatisfyQuestLevel( pQuest, msg ) - && SatisfyQuestSkillOrClass( pQuest, msg ) && SatisfyQuestReputation( pQuest, msg ) + && SatisfyQuestClass(pQuest, msg) && SatisfyQuestRace(pQuest, msg) && SatisfyQuestLevel(pQuest, msg) + && SatisfyQuestSkill(pQuest, msg) && SatisfyQuestReputation(pQuest, msg) && SatisfyQuestPreviousQuest( pQuest, msg ) && SatisfyQuestTimed( pQuest, msg ) && SatisfyQuestNextChain( pQuest, msg ) && SatisfyQuestPrevChain( pQuest, msg ) && SatisfyQuestDay( pQuest, msg ) && SatisfyQuestWeek( pQuest, msg ); @@ -13766,47 +13766,21 @@ void Player::FailQuest(uint32 questId) } } -bool Player::SatisfyQuestSkillOrClass( Quest const* qInfo, bool msg ) const +bool Player::SatisfyQuestSkill(Quest const* qInfo, bool msg) const { - int32 zoneOrSort = qInfo->GetZoneOrSort(); - int32 skillOrClass = qInfo->GetSkillOrClass(); + uint32 skill = qInfo->GetRequiredSkill(); - // skip zone zoneOrSort and 0 case skillOrClass - if (zoneOrSort >= 0 && skillOrClass == 0) + // skip 0 case RequiredSkill + if (skill == 0) return true; - int32 questSort = -zoneOrSort; - uint8 reqSortClass = ClassByQuestSort(questSort); - - // check class sort cases in zoneOrSort - if (reqSortClass != 0 && getClass() != reqSortClass) + // check skill value + if (GetSkillValue(skill) < qInfo->GetRequiredSkillValue()) { if (msg) - SendCanTakeQuestResponse( INVALIDREASON_DONT_HAVE_REQ ); - return false; - } + SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); - // check class - if( skillOrClass < 0 ) - { - uint8 reqClass = -int32(skillOrClass); - if(getClass() != reqClass) - { - if( msg ) - SendCanTakeQuestResponse( INVALIDREASON_DONT_HAVE_REQ ); - return false; - } - } - // check skill - else if( skillOrClass > 0 ) - { - uint32 reqSkill = skillOrClass; - if( GetSkillValue( reqSkill ) < qInfo->GetRequiredSkillValue() ) - { - if( msg ) - SendCanTakeQuestResponse( INVALIDREASON_DONT_HAVE_REQ ); - return false; - } + return false; } return true; @@ -13928,6 +13902,24 @@ bool Player::SatisfyQuestPreviousQuest( Quest const* qInfo, bool msg ) const return false; } +bool Player::SatisfyQuestClass(Quest const* qInfo, bool msg) const +{ + uint32 reqClass = qInfo->GetRequiredClasses(); + + if (reqClass == 0) + return true; + + if ((reqClass & getClassMask()) == 0) + { + if (msg) + SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); + + return false; + } + + return true; +} + bool Player::SatisfyQuestRace( Quest const* qInfo, bool msg ) const { uint32 reqraces = qInfo->GetRequiredRaces(); diff --git a/src/game/Player.h b/src/game/Player.h index 2915d5b23..3347ea0a9 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1421,10 +1421,11 @@ class MANGOS_DLL_SPEC Player : public Unit void RewardQuest( Quest const *pQuest, uint32 reward, Object* questGiver, bool announce = true ); void FailQuest( uint32 quest_id ); - bool SatisfyQuestSkillOrClass( Quest const* qInfo, bool msg ) const; + bool SatisfyQuestSkill(Quest const* qInfo, bool msg) const; bool SatisfyQuestLevel( Quest const* qInfo, bool msg ) const; bool SatisfyQuestLog( bool msg ) const; bool SatisfyQuestPreviousQuest( Quest const* qInfo, bool msg ) const; + bool SatisfyQuestClass(Quest const* qInfo, bool msg) const; bool SatisfyQuestRace( Quest const* qInfo, bool msg ) const; bool SatisfyQuestReputation( Quest const* qInfo, bool msg ) const; bool SatisfyQuestStatus( Quest const* qInfo, bool msg ) const; diff --git a/src/game/QuestDef.cpp b/src/game/QuestDef.cpp index e2d86ca86..793465bf6 100644 --- a/src/game/QuestDef.cpp +++ b/src/game/QuestDef.cpp @@ -25,116 +25,117 @@ Quest::Quest(Field * questRecord) QuestId = questRecord[0].GetUInt32(); QuestMethod = questRecord[1].GetUInt32(); ZoneOrSort = questRecord[2].GetInt32(); - SkillOrClass = questRecord[3].GetInt32(); - MinLevel = questRecord[4].GetUInt32(); - QuestLevel = questRecord[5].GetInt32(); - Type = questRecord[6].GetUInt32(); + MinLevel = questRecord[3].GetUInt32(); + QuestLevel = questRecord[4].GetInt32(); + Type = questRecord[5].GetUInt32(); + RequiredClasses = 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(); - PlayersSlain = questRecord[20].GetUInt32(); - BonusTalents = questRecord[21].GetUInt32(); - PrevQuestId = questRecord[22].GetInt32(); - NextQuestId = questRecord[23].GetInt32(); - ExclusiveGroup = questRecord[24].GetInt32(); - NextQuestInChain = questRecord[25].GetUInt32(); - RewXPId = questRecord[26].GetUInt32(); - SrcItemId = questRecord[27].GetUInt32(); - SrcItemCount = questRecord[28].GetUInt32(); - SrcSpell = questRecord[29].GetUInt32(); - Title = questRecord[30].GetCppString(); - Details = questRecord[31].GetCppString(); - Objectives = questRecord[32].GetCppString(); - OfferRewardText = questRecord[33].GetCppString(); - RequestItemsText = questRecord[34].GetCppString(); - EndText = questRecord[35].GetCppString(); - CompletedText = questRecord[36].GetCppString(); + RequiredSkill = questRecord[8].GetUInt32(); + RequiredSkillValue = questRecord[9].GetUInt32(); + RepObjectiveFaction = questRecord[10].GetUInt32(); + RepObjectiveValue = questRecord[11].GetInt32(); + RequiredMinRepFaction = questRecord[12].GetUInt32(); + RequiredMinRepValue = questRecord[13].GetInt32(); + RequiredMaxRepFaction = questRecord[14].GetUInt32(); + RequiredMaxRepValue = questRecord[15].GetInt32(); + SuggestedPlayers = questRecord[16].GetUInt32(); + LimitTime = questRecord[17].GetUInt32(); + QuestFlags = questRecord[18].GetUInt16(); + uint32 SpecialFlags = questRecord[19].GetUInt16(); + CharTitleId = questRecord[20].GetUInt32(); + PlayersSlain = questRecord[21].GetUInt32(); + BonusTalents = questRecord[22].GetUInt32(); + PrevQuestId = questRecord[23].GetInt32(); + NextQuestId = questRecord[24].GetInt32(); + ExclusiveGroup = questRecord[25].GetInt32(); + NextQuestInChain = questRecord[26].GetUInt32(); + RewXPId = questRecord[27].GetUInt32(); + SrcItemId = questRecord[28].GetUInt32(); + SrcItemCount = questRecord[29].GetUInt32(); + SrcSpell = questRecord[30].GetUInt32(); + Title = questRecord[31].GetCppString(); + Details = questRecord[32].GetCppString(); + Objectives = questRecord[33].GetCppString(); + OfferRewardText = questRecord[34].GetCppString(); + RequestItemsText = questRecord[35].GetCppString(); + EndText = questRecord[36].GetCppString(); + CompletedText = questRecord[37].GetCppString(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - ObjectiveText[i] = questRecord[37+i].GetCppString(); + ObjectiveText[i] = questRecord[38+i].GetCppString(); for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) - ReqItemId[i] = questRecord[41+i].GetUInt32(); + ReqItemId[i] = questRecord[42+i].GetUInt32(); for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i) - ReqItemCount[i] = questRecord[47+i].GetUInt32(); + ReqItemCount[i] = questRecord[48+i].GetUInt32(); for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) - ReqSourceId[i] = questRecord[53+i].GetUInt32(); + ReqSourceId[i] = questRecord[54+i].GetUInt32(); for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i) - ReqSourceCount[i] = questRecord[57+i].GetUInt32(); + ReqSourceCount[i] = questRecord[58+i].GetUInt32(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - ReqCreatureOrGOId[i] = questRecord[61+i].GetInt32(); + ReqCreatureOrGOId[i] = questRecord[62+i].GetInt32(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - ReqCreatureOrGOCount[i] = questRecord[65+i].GetUInt32(); + ReqCreatureOrGOCount[i] = questRecord[66+i].GetUInt32(); for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i) - ReqSpell[i] = questRecord[69+i].GetUInt32(); + ReqSpell[i] = questRecord[70+i].GetUInt32(); for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) - RewChoiceItemId[i] = questRecord[73+i].GetUInt32(); + RewChoiceItemId[i] = questRecord[74+i].GetUInt32(); for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) - RewChoiceItemCount[i] = questRecord[79+i].GetUInt32(); + RewChoiceItemCount[i] = questRecord[80+i].GetUInt32(); for (int i = 0; i < QUEST_REWARDS_COUNT; ++i) - RewItemId[i] = questRecord[85+i].GetUInt32(); + RewItemId[i] = questRecord[86+i].GetUInt32(); for (int i = 0; i < QUEST_REWARDS_COUNT; ++i) - RewItemCount[i] = questRecord[89+i].GetUInt32(); + RewItemCount[i] = questRecord[90+i].GetUInt32(); for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) - RewRepFaction[i] = questRecord[93+i].GetUInt32(); + RewRepFaction[i] = questRecord[94+i].GetUInt32(); for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) - RewRepValueId[i] = questRecord[98+i].GetInt32(); + RewRepValueId[i] = questRecord[99+i].GetInt32(); for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) - RewRepValue[i] = questRecord[103+i].GetInt32(); + RewRepValue[i] = questRecord[104+i].GetInt32(); - RewHonorAddition = questRecord[108].GetUInt32(); - RewHonorMultiplier = questRecord[109].GetFloat(); - RewOrReqMoney = questRecord[110].GetInt32(); - RewMoneyMaxLevel = questRecord[111].GetUInt32(); - RewSpell = questRecord[112].GetUInt32(); - RewSpellCast = questRecord[113].GetUInt32(); - RewMailTemplateId = questRecord[114].GetUInt32(); - RewMailDelaySecs = questRecord[115].GetUInt32(); - PointMapId = questRecord[116].GetUInt32(); - PointX = questRecord[117].GetFloat(); - PointY = questRecord[118].GetFloat(); - PointOpt = questRecord[119].GetUInt32(); + RewHonorAddition = questRecord[109].GetUInt32(); + RewHonorMultiplier = questRecord[110].GetFloat(); + RewOrReqMoney = questRecord[111].GetInt32(); + RewMoneyMaxLevel = questRecord[112].GetUInt32(); + RewSpell = questRecord[113].GetUInt32(); + RewSpellCast = questRecord[114].GetUInt32(); + RewMailTemplateId = questRecord[115].GetUInt32(); + RewMailDelaySecs = questRecord[116].GetUInt32(); + PointMapId = questRecord[117].GetUInt32(); + PointX = questRecord[118].GetFloat(); + PointY = questRecord[119].GetFloat(); + PointOpt = questRecord[120].GetUInt32(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - DetailsEmote[i] = questRecord[120+i].GetUInt32(); + DetailsEmote[i] = questRecord[121+i].GetUInt32(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - DetailsEmoteDelay[i] = questRecord[124+i].GetUInt32(); + DetailsEmoteDelay[i] = questRecord[125+i].GetUInt32(); - IncompleteEmote = questRecord[128].GetUInt32(); - CompleteEmote = questRecord[129].GetUInt32(); + IncompleteEmote = questRecord[129].GetUInt32(); + CompleteEmote = questRecord[130].GetUInt32(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - OfferRewardEmote[i] = questRecord[130+i].GetInt32(); + OfferRewardEmote[i] = questRecord[131+i].GetInt32(); for (int i = 0; i < QUEST_EMOTE_COUNT; ++i) - OfferRewardEmoteDelay[i] = questRecord[134+i].GetInt32(); + OfferRewardEmoteDelay[i] = questRecord[135+i].GetInt32(); - QuestStartScript = questRecord[138].GetUInt32(); - QuestCompleteScript = questRecord[139].GetUInt32(); + QuestStartScript = questRecord[139].GetUInt32(); + QuestCompleteScript = questRecord[140].GetUInt32(); QuestFlags |= SpecialFlags << 24; diff --git a/src/game/QuestDef.h b/src/game/QuestDef.h index 6e62e378a..f00b7f736 100644 --- a/src/game/QuestDef.h +++ b/src/game/QuestDef.h @@ -202,11 +202,12 @@ class Quest 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; } int32 GetQuestLevel() const { return QuestLevel; } uint32 GetType() const { return Type; } + uint32 GetRequiredClasses() const { return RequiredClasses; } uint32 GetRequiredRaces() const { return RequiredRaces; } + uint32 GetRequiredSkill() const { return RequiredSkill; } uint32 GetRequiredSkillValue() const { return RequiredSkillValue; } uint32 GetRepObjectiveFaction() const { return RepObjectiveFaction; } int32 GetRepObjectiveValue() const { return RepObjectiveValue; } @@ -303,11 +304,12 @@ class Quest uint32 QuestId; uint32 QuestMethod; int32 ZoneOrSort; - int32 SkillOrClass; uint32 MinLevel; int32 QuestLevel; uint32 Type; + uint32 RequiredClasses; uint32 RequiredRaces; + uint32 RequiredSkill; uint32 RequiredSkillValue; uint32 RepObjectiveFaction; int32 RepObjectiveValue; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 29817d8b9..93f000880 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "10620" + #define REVISION_NR "10621" #endif // __REVISION_NR_H__ diff --git a/src/shared/revision_sql.h b/src/shared/revision_sql.h index 3598aa2d0..7a40e5a5d 100644 --- a/src/shared/revision_sql.h +++ b/src/shared/revision_sql.h @@ -1,6 +1,6 @@ #ifndef __REVISION_SQL_H__ #define __REVISION_SQL_H__ #define REVISION_DB_CHARACTERS "required_10568_01_characters_character_tutorial" - #define REVISION_DB_MANGOS "required_10604_01_mangos_spell_proc_event" + #define REVISION_DB_MANGOS "required_10621_01_mangos_quest_template" #define REVISION_DB_REALMD "required_10008_01_realmd_realmd_db_version" #endif // __REVISION_SQL_H__