aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorclick <none@none>2010-05-14 23:43:42 +0200
committerclick <none@none>2010-05-14 23:43:42 +0200
commit85ec98ff9f431347de41bf8c18aa9ec609abebf4 (patch)
tree35d93836af9d3144e4e5b4cc7aedeeea97f8137c
parent1a49477a1765c1ec58be8cf62f4fef92f506a908 (diff)
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
-rw-r--r--sql/updates/8198_world_quest_template.sql2
-rw-r--r--sql/world.sql2
-rw-r--r--src/game/ObjectMgr.cpp36
-rw-r--r--src/game/Player.cpp16
-rw-r--r--src/game/QuestDef.cpp2
-rw-r--r--src/game/QuestDef.h4
6 files changed, 32 insertions, 30 deletions
diff --git a/sql/updates/8198_world_quest_template.sql b/sql/updates/8198_world_quest_template.sql
new file mode 100644
index 00000000000..73ab5c2b0c7
--- /dev/null
+++ b/sql/updates/8198_world_quest_template.sql
@@ -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;
diff --git a/sql/world.sql b/sql/world.sql
index 1c454804d81..4a6d1b6a6bf 100644
--- a/sql/world.sql
+++ b/sql/world.sql
@@ -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',
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index bfb939df191..44515128c9b 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -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)
}
}
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index b0b49b4f3a4..4370953a7be 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -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)
diff --git a/src/game/QuestDef.cpp b/src/game/QuestDef.cpp
index e41dbfed425..c308f498ff0 100644
--- a/src/game/QuestDef.cpp
+++ b/src/game/QuestDef.cpp
@@ -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();
diff --git a/src/game/QuestDef.h b/src/game/QuestDef.h
index c694c65abb9..5872b2622b8 100644
--- a/src/game/QuestDef.h
+++ b/src/game/QuestDef.h
@@ -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;