aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/7680_world_quest_template.sql1
-rw-r--r--sql/world.sql1
-rw-r--r--src/game/ObjectMgr.cpp38
-rw-r--r--src/game/Player.cpp8
-rw-r--r--src/game/QuestDef.cpp183
-rw-r--r--src/game/QuestDef.h8
6 files changed, 125 insertions, 114 deletions
diff --git a/sql/updates/7680_world_quest_template.sql b/sql/updates/7680_world_quest_template.sql
new file mode 100644
index 00000000000..296f2d5cdba
--- /dev/null
+++ b/sql/updates/7680_world_quest_template.sql
@@ -0,0 +1 @@
+ALTER TABLE `quest_template` ADD COLUMN `MaxLevel` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' AFTER `MinLevel`;
diff --git a/sql/world.sql b/sql/world.sql
index 1ac1ee4e7e9..9db5ff08fb4 100644
--- a/sql/world.sql
+++ b/sql/world.sql
@@ -4369,6 +4369,7 @@ CREATE TABLE `quest_template` (
`ZoneOrSort` smallint(6) NOT NULL DEFAULT '0',
`SkillOrClass` smallint(6) NOT NULL DEFAULT '0',
`MinLevel` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `MaxLevel` tinyint(3) unsigned NOT NULL DEFAULT '0',
`QuestLevel` smallint(3) NOT NULL DEFAULT '1',
`Type` smallint(5) unsigned NOT NULL DEFAULT '0',
`RequiredRaces` smallint(5) unsigned NOT NULL DEFAULT '0',
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 754a0f16ef1..1532e232754 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -3581,41 +3581,41 @@ void ObjectMgr::LoadQuests()
mExclusiveQuestGroups.clear();
- // 0 1 2 3 4 5 6 7 8
- QueryResult_AutoPtr result = WorldDatabase.Query("SELECT entry, Method, ZoneOrSort, SkillOrClass, MinLevel, QuestLevel, Type, RequiredRaces, RequiredSkillValue,"
- // 9 10 11 12 13 14 15 16 17 18
+ // 0 1 2 3 4 5 6 7 8 9
+ QueryResult_AutoPtr result = WorldDatabase.Query("SELECT entry, Method, ZoneOrSort, SkillOrClass, MinLevel, MaxLevel, QuestLevel, Type, RequiredRaces, RequiredSkillValue,"
+ // 10 11 12 13 14 15 16 17 18 19
"RepObjectiveFaction, RepObjectiveValue, RepObjectiveFaction2, RepObjectiveValue2, RequiredMinRepFaction, RequiredMinRepValue, RequiredMaxRepFaction, RequiredMaxRepValue, SuggestedPlayers, LimitTime,"
- // 19 20 21 22 23 24 25 26 27 28 29 30 31
+ // 20 21 22 23 24 25 26 27 28 29 30 31 32
"QuestFlags, SpecialFlags, CharTitleId, PlayersSlain, BonusTalents, PrevQuestId, NextQuestId, ExclusiveGroup, NextQuestInChain, RewXPId, SrcItemId, SrcItemCount, SrcSpell,"
- // 32 33 34 35 36 37 38 39 40 41 42
+ // 33 34 35 36 37 38 39 40 41 42 43
"Title, Details, Objectives, OfferRewardText, RequestItemsText, EndText, CompletedText, ObjectiveText1, ObjectiveText2, ObjectiveText3, ObjectiveText4,"
- // 43 44 45 46 47 48 49 50 51 52 53 54
+ // 44 45 46 47 48 49 50 51 52 53 54 55
"ReqItemId1, ReqItemId2, ReqItemId3, ReqItemId4, ReqItemId5, ReqItemId6, ReqItemCount1, ReqItemCount2, ReqItemCount3, ReqItemCount4, ReqItemCount5, ReqItemCount6,"
- // 55 56 57 58 59 60 61 62
+ // 56 57 58 59 60 61 62 63
"ReqSourceId1, ReqSourceId2, ReqSourceId3, ReqSourceId4, ReqSourceCount1, ReqSourceCount2, ReqSourceCount3, ReqSourceCount4,"
- // 63 64 65 66 67 68 69 70
+ // 64 65 66 67 68 69 70 71
"ReqCreatureOrGOId1, ReqCreatureOrGOId2, ReqCreatureOrGOId3, ReqCreatureOrGOId4, ReqCreatureOrGOCount1, ReqCreatureOrGOCount2, ReqCreatureOrGOCount3, ReqCreatureOrGOCount4,"
- // 71 72 73 74
+ // 72 73 74 75
"ReqSpellCast1, ReqSpellCast2, ReqSpellCast3, ReqSpellCast4,"
- // 75 76 77 78 79 80
+ // 76 77 78 79 80 81
"RewChoiceItemId1, RewChoiceItemId2, RewChoiceItemId3, RewChoiceItemId4, RewChoiceItemId5, RewChoiceItemId6,"
- // 81 82 83 84 85 86
+ // 82 83 84 85 86 87
"RewChoiceItemCount1, RewChoiceItemCount2, RewChoiceItemCount3, RewChoiceItemCount4, RewChoiceItemCount5, RewChoiceItemCount6,"
- // 87 88 89 90 91 92 93 94
+ // 88 89 90 91 92 93 94 95
"RewItemId1, RewItemId2, RewItemId3, RewItemId4, RewItemCount1, RewItemCount2, RewItemCount3, RewItemCount4,"
- // 95 96 97 98 99 100 101 102 103 104
+ // 96 97 98 99 100 101 102 103 104 105
"RewRepFaction1, RewRepFaction2, RewRepFaction3, RewRepFaction4, RewRepFaction5, RewRepValueId1, RewRepValueId2, RewRepValueId3, RewRepValueId4, RewRepValueId5,"
- // 105 106 107 108 109
+ // 106 107 108 109 110
"RewRepValue1, RewRepValue2, RewRepValue3, RewRepValue4, RewRepValue5,"
- // 110 111 112 113 114 115 116 117 118 119 120 121
+ // 111 112 113 114 115 116 117 118 119 120 121 122
"RewHonorAddition, RewHonorMultiplier, RewOrReqMoney, RewMoneyMaxLevel, RewSpell, RewSpellCast, RewMailTemplateId, RewMailDelaySecs, PointMapId, PointX, PointY, PointOpt,"
- // 122 123 124 125 126 127 128 129
+ // 123 124 125 126 127 128 129 130
"DetailsEmote1, DetailsEmote2, DetailsEmote3, DetailsEmote4, DetailsEmoteDelay1, DetailsEmoteDelay2, DetailsEmoteDelay3, DetailsEmoteDelay4,"
- // 130 131 132 133 134 135
+ // 131 132 135 134 135 136
"IncompleteEmote, CompleteEmote, OfferRewardEmote1, OfferRewardEmote2, OfferRewardEmote3, OfferRewardEmote4,"
- // 136 137 138 139
+ // 137 138 139 140
"OfferRewardEmoteDelay1, OfferRewardEmoteDelay2, OfferRewardEmoteDelay3, OfferRewardEmoteDelay4,"
- // 140 141
+ // 141 142
"StartScript, CompleteScript"
" FROM quest_template");
if(result == NULL)
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index 98e3535df30..e7179ecf444 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -14226,7 +14226,13 @@ bool Player::SatisfyQuestLevel(Quest const* qInfo, bool msg)
if (getLevel() < qInfo->GetMinLevel())
{
if(msg)
- SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
+ SendCanTakeQuestResponse(INVALIDREASON_QUEST_FAILED_LOW_LEVEL);
+ return false;
+ }
+ else if (qInfo->GetMaxLevel() > 0 && getLevel() > qInfo->GetMaxLevel())
+ {
+ if(msg)
+ SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ); // There doesn't seem to be a specific response for too high player level
return false;
}
return true;
diff --git a/src/game/QuestDef.cpp b/src/game/QuestDef.cpp
index 9ec3d21f99e..363874f7783 100644
--- a/src/game/QuestDef.cpp
+++ b/src/game/QuestDef.cpp
@@ -29,116 +29,117 @@ Quest::Quest(Field * questRecord)
ZoneOrSort = questRecord[2].GetInt32();
SkillOrClass = questRecord[3].GetInt32();
MinLevel = questRecord[4].GetUInt32();
- QuestLevel = questRecord[5].GetInt32();
- Type = questRecord[6].GetUInt32();
- RequiredRaces = questRecord[7].GetUInt32();
- RequiredSkillValue = questRecord[8].GetUInt32();
- RepObjectiveFaction = questRecord[9].GetUInt32();
- RepObjectiveValue = questRecord[10].GetInt32();
- RepObjectiveFaction2 = questRecord[11].GetUInt32();
- RepObjectiveValue2 = questRecord[12].GetInt32();
- RequiredMinRepFaction = questRecord[13].GetUInt32();
- RequiredMinRepValue = questRecord[14].GetInt32();
- RequiredMaxRepFaction = questRecord[15].GetUInt32();
- RequiredMaxRepValue = questRecord[16].GetInt32();
- SuggestedPlayers = questRecord[17].GetUInt32();
- LimitTime = questRecord[18].GetUInt32();
- QuestFlags = questRecord[19].GetUInt16();
- uint32 SpecialFlags = questRecord[20].GetUInt16();
- CharTitleId = questRecord[21].GetUInt32();
- PlayersSlain = questRecord[22].GetUInt32();
- BonusTalents = questRecord[23].GetUInt32();
- PrevQuestId = questRecord[24].GetInt32();
- NextQuestId = questRecord[25].GetInt32();
- ExclusiveGroup = questRecord[26].GetInt32();
- NextQuestInChain = questRecord[27].GetUInt32();
- XPId = questRecord[28].GetUInt32();
- SrcItemId = questRecord[29].GetUInt32();
- SrcItemCount = questRecord[30].GetUInt32();
- SrcSpell = questRecord[31].GetUInt32();
- Title = questRecord[32].GetCppString();
- Details = questRecord[33].GetCppString();
- Objectives = questRecord[34].GetCppString();
- OfferRewardText = questRecord[35].GetCppString();
- RequestItemsText = questRecord[36].GetCppString();
- EndText = questRecord[37].GetCppString();
- CompletedText = questRecord[38].GetCppString();
-
+ MaxLevel = questRecord[5].GetUInt32();
+ QuestLevel = questRecord[6].GetInt32();
+ Type = questRecord[7].GetUInt32();
+ RequiredRaces = questRecord[8].GetUInt32();
+ RequiredSkillValue = questRecord[9].GetUInt32();
+ RepObjectiveFaction = questRecord[10].GetUInt32();
+ RepObjectiveValue = questRecord[11].GetInt32();
+ RepObjectiveFaction2 = questRecord[12].GetUInt32();
+ RepObjectiveValue2 = questRecord[13].GetInt32();
+ RequiredMinRepFaction = questRecord[14].GetUInt32();
+ RequiredMinRepValue = questRecord[15].GetInt32();
+ RequiredMaxRepFaction = questRecord[16].GetUInt32();
+ RequiredMaxRepValue = questRecord[17].GetInt32();
+ SuggestedPlayers = questRecord[18].GetUInt32();
+ LimitTime = questRecord[19].GetUInt32();
+ QuestFlags = questRecord[20].GetUInt16();
+ uint32 SpecialFlags = questRecord[21].GetUInt16();
+ CharTitleId = questRecord[22].GetUInt32();
+ PlayersSlain = questRecord[23].GetUInt32();
+ BonusTalents = questRecord[24].GetUInt32();
+ PrevQuestId = questRecord[25].GetInt32();
+ NextQuestId = questRecord[26].GetInt32();
+ ExclusiveGroup = questRecord[27].GetInt32();
+ NextQuestInChain = questRecord[28].GetUInt32();
+ XPId = questRecord[29].GetUInt32();
+ SrcItemId = questRecord[30].GetUInt32();
+ SrcItemCount = questRecord[31].GetUInt32();
+ SrcSpell = questRecord[32].GetUInt32();
+ Title = questRecord[33].GetCppString();
+ Details = questRecord[34].GetCppString();
+ Objectives = questRecord[35].GetCppString();
+ OfferRewardText = questRecord[36].GetCppString();
+ RequestItemsText = questRecord[37].GetCppString();
+ EndText = questRecord[38].GetCppString();
+ CompletedText = questRecord[39].GetCppString();
+
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ObjectiveText[i] = questRecord[39+i].GetCppString();
-
+ ObjectiveText[i] = questRecord[40+i].GetCppString();
+
for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
- ReqItemId[i] = questRecord[43+i].GetUInt32();
-
+ ReqItemId[i] = questRecord[44+i].GetUInt32();
+
for (int i = 0; i < QUEST_ITEM_OBJECTIVES_COUNT; ++i)
- ReqItemCount[i] = questRecord[49+i].GetUInt32();
-
+ ReqItemCount[i] = questRecord[50+i].GetUInt32();
+
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
- ReqSourceId[i] = questRecord[55+i].GetUInt32();
-
+ ReqSourceId[i] = questRecord[56+i].GetUInt32();
+
for (int i = 0; i < QUEST_SOURCE_ITEM_IDS_COUNT; ++i)
- ReqSourceCount[i] = questRecord[59+i].GetUInt32();
-
+ ReqSourceCount[i] = questRecord[60+i].GetUInt32();
+
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqCreatureOrGOId[i] = questRecord[63+i].GetInt32();
-
+ ReqCreatureOrGOId[i] = questRecord[64+i].GetInt32();
+
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqCreatureOrGOCount[i] = questRecord[67+i].GetUInt32();
-
+ ReqCreatureOrGOCount[i] = questRecord[68+i].GetUInt32();
+
for (int i = 0; i < QUEST_OBJECTIVES_COUNT; ++i)
- ReqSpell[i] = questRecord[71+i].GetUInt32();
-
+ ReqSpell[i] = questRecord[72+i].GetUInt32();
+
for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
- RewChoiceItemId[i] = questRecord[75+i].GetUInt32();
-
+ RewChoiceItemId[i] = questRecord[76+i].GetUInt32();
+
for (int i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i)
- RewChoiceItemCount[i] = questRecord[81+i].GetUInt32();
-
+ RewChoiceItemCount[i] = questRecord[82+i].GetUInt32();
+
for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
- RewItemId[i] = questRecord[87+i].GetUInt32();
-
+ RewItemId[i] = questRecord[88+i].GetUInt32();
+
for (int i = 0; i < QUEST_REWARDS_COUNT; ++i)
- RewItemCount[i] = questRecord[91+i].GetUInt32();
-
+ RewItemCount[i] = questRecord[92+i].GetUInt32();
+
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
- RewRepFaction[i] = questRecord[95+i].GetUInt32();
-
+ RewRepFaction[i] = questRecord[96+i].GetUInt32();
+
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
- RewRepValueId[i] = questRecord[100+i].GetInt32();
-
+ RewRepValueId[i] = questRecord[101+i].GetInt32();
+
for (int i = 0; i < QUEST_REPUTATIONS_COUNT; ++i)
- RewRepValue[i] = questRecord[105+i].GetInt32();
-
- RewHonorableKills = questRecord[110].GetUInt32();
- RewHonorMultiplier = questRecord[111].GetFloat();
- RewOrReqMoney = questRecord[112].GetInt32();
- RewMoneyMaxLevel = questRecord[113].GetUInt32();
- RewSpell = questRecord[114].GetUInt32();
- RewSpellCast = questRecord[115].GetInt32();
- RewMailTemplateId = questRecord[116].GetUInt32();
- RewMailDelaySecs = questRecord[117].GetUInt32();
- PointMapId = questRecord[118].GetUInt32();
- PointX = questRecord[119].GetFloat();
- PointY = questRecord[120].GetFloat();
- PointOpt = questRecord[121].GetUInt32();
-
+ RewRepValue[i] = questRecord[106+i].GetInt32();
+
+ RewHonorableKills = questRecord[111].GetUInt32();
+ RewHonorMultiplier = questRecord[112].GetFloat();
+ RewOrReqMoney = questRecord[113].GetInt32();
+ RewMoneyMaxLevel = questRecord[114].GetUInt32();
+ RewSpell = questRecord[115].GetUInt32();
+ RewSpellCast = questRecord[116].GetInt32();
+ RewMailTemplateId = questRecord[117].GetUInt32();
+ RewMailDelaySecs = questRecord[118].GetUInt32();
+ PointMapId = questRecord[119].GetUInt32();
+ PointX = questRecord[120].GetFloat();
+ PointY = questRecord[121].GetFloat();
+ PointOpt = questRecord[122].GetUInt32();
+
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
- DetailsEmote[i] = questRecord[122+i].GetUInt32();
-
+ DetailsEmote[i] = questRecord[123+i].GetUInt32();
+
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
- DetailsEmoteDelay[i] = questRecord[126+i].GetUInt32();
-
- IncompleteEmote = questRecord[130].GetUInt32();
- CompleteEmote = questRecord[131].GetUInt32();
-
+ DetailsEmoteDelay[i] = questRecord[127+i].GetUInt32();
+
+ IncompleteEmote = questRecord[131].GetUInt32();
+ CompleteEmote = questRecord[132].GetUInt32();
+
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
- OfferRewardEmote[i] = questRecord[132+i].GetInt32();
-
+ OfferRewardEmote[i] = questRecord[133+i].GetInt32();
+
for (int i = 0; i < QUEST_EMOTE_COUNT; ++i)
- OfferRewardEmoteDelay[i] = questRecord[136+i].GetInt32();
-
- QuestStartScript = questRecord[140].GetUInt32();
- QuestCompleteScript = questRecord[141].GetUInt32();
+ OfferRewardEmoteDelay[i] = questRecord[137+i].GetInt32();
+
+ QuestStartScript = questRecord[141].GetUInt32();
+ QuestCompleteScript = questRecord[142].GetUInt32();
QuestFlags |= SpecialFlags << 16;
diff --git a/src/game/QuestDef.h b/src/game/QuestDef.h
index a0aa4433ac6..13a7ffae670 100644
--- a/src/game/QuestDef.h
+++ b/src/game/QuestDef.h
@@ -187,6 +187,7 @@ class Quest
int32 GetZoneOrSort() const { return ZoneOrSort; }
int32 GetSkillOrClass() const { return SkillOrClass; }
uint32 GetMinLevel() const { return MinLevel; }
+ uint32 GetMaxLevel() const { return MaxLevel; }
uint32 GetQuestLevel() const { return QuestLevel; }
uint32 GetType() const { return Type; }
uint32 GetRequiredRaces() const { return RequiredRaces; }
@@ -253,7 +254,7 @@ class Quest
uint32 RewItemId[QUEST_REWARDS_COUNT];
uint32 RewItemCount[QUEST_REWARDS_COUNT];
uint32 RewRepFaction[QUEST_REPUTATIONS_COUNT];
- int32 RewRepValueId[QUEST_REPUTATIONS_COUNT];
+ int32 RewRepValueId[QUEST_REPUTATIONS_COUNT];
int32 RewRepValue[QUEST_REPUTATIONS_COUNT];
uint32 DetailsEmote[QUEST_EMOTE_COUNT];
uint32 DetailsEmoteDelay[QUEST_EMOTE_COUNT];
@@ -284,7 +285,8 @@ class Quest
int32 ZoneOrSort;
int32 SkillOrClass;
uint32 MinLevel;
- int32 QuestLevel;
+ uint32 MaxLevel;
+ int32 QuestLevel;
uint32 Type;
uint32 RequiredRaces;
uint32 RequiredSkillValue;
@@ -306,7 +308,7 @@ class Quest
int32 NextQuestId;
int32 ExclusiveGroup;
uint32 NextQuestInChain;
- uint32 XPId;
+ uint32 XPId;
uint32 SrcItemId;
uint32 SrcItemCount;
uint32 SrcSpell;