mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
[10621] Add new field RequiredClasses for quest_template
* SkillOrClass is converted to RequiredSkill (and then field can contain skill id only) * Field ZoneOrSort has no longer a function in quest requirement, and RequiredClasses must be used instead where class limits are expected. To restrict a quest to one class or more, use bitmask of class in RequiredClasses. RequiredSkill works like before. Signed-off-by: NoFantasy <nofantasy@nf.no>
This commit is contained in:
parent
3c6d5e985f
commit
77b064e19a
10 changed files with 198 additions and 165 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue