Allow multiple classes for quest requirements - patch by Shauren
(This should make Malcrom happy) Fixes issue 1476. Fixes issues 1972. Fixes issue 430. --HG-- branch : trunk
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE `quest_template` CHANGE COLUMN `SkillOrClass` `SkillOrClassMask` mediumint(8) NOT NULL DEFAULT '0';
|
||||
UPDATE `quest_template` SET `SkillOrClassMask`=-(1<<(-`SkillOrClassMask`-1)) WHERE `SkillOrClassMask`<0;
|
||||
+1
-1
@@ -4371,7 +4371,7 @@ 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',
|
||||
`SkillOrClassMask` mediumint(8) 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',
|
||||
|
||||
+18
-18
@@ -3562,8 +3562,8 @@ void ObjectMgr::LoadQuests()
|
||||
|
||||
mExclusiveQuestGroups.clear();
|
||||
|
||||
// 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,"
|
||||
// 0 1 2 3 4 5 6 7 8 9
|
||||
QueryResult_AutoPtr result = WorldDatabase.Query("SELECT entry, Method, ZoneOrSort, SkillOrClassMask, 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,"
|
||||
// 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
||||
@@ -3706,41 +3706,41 @@ void ObjectMgr::LoadQuests()
|
||||
if (ClassByQuestSort(-int32(qinfo->ZoneOrSort)))
|
||||
{
|
||||
// SkillOrClass should not have class case when class case already set in ZoneOrSort.
|
||||
if (qinfo->SkillOrClass < 0)
|
||||
if (qinfo->SkillOrClassMask < 0)
|
||||
{
|
||||
sLog.outErrorDb("Quest %u has `ZoneOrSort` = %i (class sort case) and `SkillOrClass` = %i (class case), redundant.",
|
||||
qinfo->GetQuestId(),qinfo->ZoneOrSort,qinfo->SkillOrClass);
|
||||
sLog.outErrorDb("Quest %u has `ZoneOrSort` = %i (class sort case) and `SkillOrClassMask` = %i (class case), redundant.",
|
||||
qinfo->GetQuestId(),qinfo->ZoneOrSort,qinfo->SkillOrClassMask);
|
||||
}
|
||||
}
|
||||
//check for proper SkillOrClass value (skill case)
|
||||
if (int32 skill_id = SkillByQuestSort(-int32(qinfo->ZoneOrSort)))
|
||||
{
|
||||
// skill is positive value in SkillOrClass
|
||||
if (qinfo->SkillOrClass != skill_id)
|
||||
if (qinfo->SkillOrClassMask != 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 (skill sort case) but `SkillOrClassMask` 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)
|
||||
// SkillOrClassMask (class case)
|
||||
if (qinfo->SkillOrClassMask < 0)
|
||||
{
|
||||
if (!sChrClassesStore.LookupEntry(-int32(qinfo->SkillOrClass)))
|
||||
if (!(-int32(qinfo->SkillOrClassMask) & 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 has `SkillOrClassMask` = %i (class case) but classmask does not have valid class",
|
||||
qinfo->GetQuestId(),qinfo->SkillOrClassMask);
|
||||
}
|
||||
}
|
||||
// SkillOrClass (skill case)
|
||||
if (qinfo->SkillOrClass > 0)
|
||||
// SkillOrClassMask (skill case)
|
||||
if (qinfo->SkillOrClassMask > 0)
|
||||
{
|
||||
if (!sSkillLineStore.LookupEntry(qinfo->SkillOrClass))
|
||||
if (!sSkillLineStore.LookupEntry(qinfo->SkillOrClassMask))
|
||||
{
|
||||
sLog.outErrorDb("Quest %u has `SkillOrClass` = %u (skill case) but skill (%i) does not exist",
|
||||
qinfo->GetQuestId(),qinfo->SkillOrClass,qinfo->SkillOrClass);
|
||||
qinfo->GetQuestId(),qinfo->SkillOrClassMask,qinfo->SkillOrClassMask);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3753,10 +3753,10 @@ void ObjectMgr::LoadQuests()
|
||||
// no changes, quest can't be done for this requirement
|
||||
}
|
||||
|
||||
if (qinfo->SkillOrClass <= 0)
|
||||
if (qinfo->SkillOrClassMask <= 0)
|
||||
{
|
||||
sLog.outErrorDb("Quest %u has `RequiredSkillValue` = %u but `SkillOrClass` = %i (class case), value ignored.",
|
||||
qinfo->GetQuestId(),qinfo->RequiredSkillValue,qinfo->SkillOrClass);
|
||||
qinfo->GetQuestId(),qinfo->RequiredSkillValue,qinfo->SkillOrClassMask);
|
||||
// no changes, quest can't be done for this requirement (fail at wrong skill id)
|
||||
}
|
||||
}
|
||||
|
||||
+8
-8
@@ -14338,11 +14338,11 @@ void Player::FailQuest(uint32 questId)
|
||||
|
||||
bool Player::SatisfyQuestSkillOrClass(Quest const* qInfo, bool msg)
|
||||
{
|
||||
int32 zoneOrSort = qInfo->GetZoneOrSort();
|
||||
int32 skillOrClass = qInfo->GetSkillOrClass();
|
||||
int32 zoneOrSort = qInfo->GetZoneOrSort();
|
||||
int32 skillOrClassMask = qInfo->GetSkillOrClassMask();
|
||||
|
||||
// skip zone zoneOrSort and 0 case skillOrClass
|
||||
if (zoneOrSort >= 0 && skillOrClass == 0)
|
||||
if (zoneOrSort >= 0 && skillOrClassMask == 0)
|
||||
return true;
|
||||
|
||||
int32 questSort = -zoneOrSort;
|
||||
@@ -14357,10 +14357,10 @@ bool Player::SatisfyQuestSkillOrClass(Quest const* qInfo, bool msg)
|
||||
}
|
||||
|
||||
// check class
|
||||
if (skillOrClass < 0)
|
||||
if (skillOrClassMask < 0)
|
||||
{
|
||||
uint8 reqClass = -int32(skillOrClass);
|
||||
if (getClass() != reqClass)
|
||||
uint8 reqClassMask = -int32(skillOrClassMask);
|
||||
if (!(reqClassMask & getClassMask()))
|
||||
{
|
||||
if (msg)
|
||||
SendCanTakeQuestResponse(INVALIDREASON_DONT_HAVE_REQ);
|
||||
@@ -14368,9 +14368,9 @@ bool Player::SatisfyQuestSkillOrClass(Quest const* qInfo, bool msg)
|
||||
}
|
||||
}
|
||||
// check skill
|
||||
else if (skillOrClass > 0)
|
||||
else if (skillOrClassMask > 0)
|
||||
{
|
||||
uint32 reqSkill = skillOrClass;
|
||||
uint32 reqSkill = skillOrClassMask;
|
||||
if (GetSkillValue(reqSkill) < qInfo->GetRequiredSkillValue())
|
||||
{
|
||||
if (msg)
|
||||
|
||||
@@ -27,7 +27,7 @@ Quest::Quest(Field * questRecord)
|
||||
QuestId = questRecord[0].GetUInt32();
|
||||
QuestMethod = questRecord[1].GetUInt32();
|
||||
ZoneOrSort = questRecord[2].GetInt32();
|
||||
SkillOrClass = questRecord[3].GetInt32();
|
||||
SkillOrClassMask = questRecord[3].GetInt32();
|
||||
MinLevel = questRecord[4].GetUInt32();
|
||||
MaxLevel = questRecord[5].GetUInt32();
|
||||
QuestLevel = questRecord[6].GetInt32();
|
||||
|
||||
+2
-2
@@ -185,7 +185,7 @@ class Quest
|
||||
uint32 GetQuestId() const { return QuestId; }
|
||||
uint32 GetQuestMethod() const { return QuestMethod; }
|
||||
int32 GetZoneOrSort() const { return ZoneOrSort; }
|
||||
int32 GetSkillOrClass() const { return SkillOrClass; }
|
||||
int32 GetSkillOrClassMask() const { return SkillOrClassMask; }
|
||||
uint32 GetMinLevel() const { return MinLevel; }
|
||||
uint32 GetMaxLevel() const { return MaxLevel; }
|
||||
uint32 GetQuestLevel() const { return QuestLevel; }
|
||||
@@ -287,7 +287,7 @@ class Quest
|
||||
uint32 QuestId;
|
||||
uint32 QuestMethod;
|
||||
int32 ZoneOrSort;
|
||||
int32 SkillOrClass;
|
||||
int32 SkillOrClassMask;
|
||||
uint32 MinLevel;
|
||||
uint32 MaxLevel;
|
||||
int32 QuestLevel;
|
||||
|
||||
Reference in New Issue
Block a user