diff options
author | click <none@none> | 2010-05-14 23:43:42 +0200 |
---|---|---|
committer | click <none@none> | 2010-05-14 23:43:42 +0200 |
commit | 85ec98ff9f431347de41bf8c18aa9ec609abebf4 (patch) | |
tree | 35d93836af9d3144e4e5b4cc7aedeeea97f8137c | |
parent | 1a49477a1765c1ec58be8cf62f4fef92f506a908 (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.sql | 2 | ||||
-rw-r--r-- | sql/world.sql | 2 | ||||
-rw-r--r-- | src/game/ObjectMgr.cpp | 36 | ||||
-rw-r--r-- | src/game/Player.cpp | 16 | ||||
-rw-r--r-- | src/game/QuestDef.cpp | 2 | ||||
-rw-r--r-- | src/game/QuestDef.h | 4 |
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; |