diff options
| author | Intel <chemicstry@gmail.com> | 2014-12-29 20:48:40 +0200 |
|---|---|---|
| committer | Intel <chemicstry@gmail.com> | 2014-12-29 20:58:49 +0200 |
| commit | 0a7caf5a6df0f6d1fbb753943c4a88ecb4d92b2e (patch) | |
| tree | f096bd3422d19b6d04b60f1ee07fa65bec6ed8d2 /src/server/game/Globals/ObjectMgr.cpp | |
| parent | 419db6c82fff996f368cb6e87472b3a5da0d4f89 (diff) | |
Core/Quests: Do not rely on StorageIndex for quest objectives
Also fixed unsigned columns in quest_template
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
| -rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 102 |
1 files changed, 45 insertions, 57 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 1a5c7ad64c5..8240b0c3482 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3629,8 +3629,8 @@ void ObjectMgr::LoadQuests() } // Load `quest_visual_effect` join table with quest_objectives because visual effects are based on objective ID (core stores objectives by their index in quest) - // 0 1 2 3 4 5 - result = WorldDatabase.Query("SELECT v.ID, o.ID, o.QuestID, o.StorageIndex, v.Index, v.VisualEffect FROM quest_visual_effect AS v LEFT JOIN quest_objectives AS o ON v.ID = o.ID ORDER BY v.Index DESC"); + // 0 1 2 3 4 + result = WorldDatabase.Query("SELECT v.ID, o.ID, o.QuestID, v.Index, v.VisualEffect FROM quest_visual_effect AS v LEFT JOIN quest_objectives AS o ON v.ID = o.ID ORDER BY v.Index DESC"); if (!result) { @@ -3679,8 +3679,8 @@ void ObjectMgr::LoadQuests() // additional quest integrity checks (GO, creature_template and item_template must be loaded already) - if (qinfo->GetQuestMethod() >= 3) - TC_LOG_ERROR("sql.sql", "Quest %u has `Method` = %u, expected values are 0, 1 or 2.", qinfo->GetQuestId(), qinfo->GetQuestMethod()); + if (qinfo->GetQuestType() >= MAX_QUEST_TYPES) + TC_LOG_ERROR("sql.sql", "Quest %u has `Method` = %u, expected values are 0, 1 or 2.", qinfo->GetQuestId(), qinfo->GetQuestType()); if (qinfo->SpecialFlags & ~QUEST_SPECIAL_FLAGS_DB_ALLOWED) { @@ -3743,32 +3743,32 @@ void ObjectMgr::LoadQuests() } // client quest log visual (area case) - if (qinfo->ZoneOrSort > 0) + if (qinfo->QuestSortID > 0) { - if (!GetAreaEntryByAreaID(qinfo->ZoneOrSort)) + if (!GetAreaEntryByAreaID(qinfo->QuestSortID)) { - TC_LOG_ERROR("sql.sql", "Quest %u has `ZoneOrSort` = %u (zone case) but zone with this id does not exist.", - qinfo->GetQuestId(), qinfo->ZoneOrSort); + TC_LOG_ERROR("sql.sql", "Quest %u has `QuestSortID` = %u (zone case) but zone with this id does not exist.", + qinfo->GetQuestId(), qinfo->QuestSortID); // no changes, quest not dependent from this value but can have problems at client } } // client quest log visual (sort case) - if (qinfo->ZoneOrSort < 0) + if (qinfo->QuestSortID < 0) { - QuestSortEntry const* qSort = sQuestSortStore.LookupEntry(-int32(qinfo->ZoneOrSort)); + QuestSortEntry const* qSort = sQuestSortStore.LookupEntry(-int32(qinfo->QuestSortID)); if (!qSort) { - TC_LOG_ERROR("sql.sql", "Quest %u has `ZoneOrSort` = %i (sort case) but quest sort with this id does not exist.", - qinfo->GetQuestId(), qinfo->ZoneOrSort); + TC_LOG_ERROR("sql.sql", "Quest %u has `QuestSortID` = %i (sort case) but quest sort with this id does not exist.", + qinfo->GetQuestId(), qinfo->QuestSortID); // 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 for proper RequiredSkillId value (skill case) - if (uint32 skill_id = SkillByQuestSort(-int32(qinfo->ZoneOrSort))) + if (uint32 skill_id = SkillByQuestSort(-int32(qinfo->QuestSortID))) { if (qinfo->RequiredSkillId != skill_id) { - TC_LOG_ERROR("sql.sql", "Quest %u has `ZoneOrSort` = %i but `RequiredSkillId` does not have a corresponding value (%d).", - qinfo->GetQuestId(), qinfo->ZoneOrSort, skill_id); + TC_LOG_ERROR("sql.sql", "Quest %u has `QuestSortID` = %i but `RequiredSkillId` does not have a corresponding value (%d).", + qinfo->GetQuestId(), qinfo->QuestSortID, skill_id); //override, and force proper value here? } } @@ -3902,31 +3902,24 @@ void ObjectMgr::LoadQuests() } } - for (uint32 j = 0; j < qinfo->Objectives.size(); ++j) + for (QuestObjective const& obj : qinfo->GetObjectives()) { - QuestObjective& obj = qinfo->Objectives[j]; - - // Might be intended in blizz so it is debug output - if (!obj.ID) - { - TC_LOG_DEBUG("sql.sql", "Quest %u is missing objective %u", qinfo->GetQuestId(), j); - // Prevent objective to be parsed as QUEST_OBJECTIVE_MONSTER - obj.Type = QUEST_OBJECTIVE_NONE; - continue; - } - - if (!obj.ObjectID) - { - TC_LOG_ERROR("sql.sql", "Quest %u objective %u has `ObjectID` = 0, quest can't be done.", qinfo->GetQuestId(), j); - // no changes, quest can't be done for this requirement - continue; - } - - if (!obj.Amount) + // Check storage index for objectives which store data + if (obj.StorageIndex < 0) { - TC_LOG_ERROR("sql.sql", "Quest %u objective %u has `Amount` = 0, quest can't be done.", qinfo->GetQuestId(), j); - // no changes, quest can't be done for this requirement - continue; + switch (obj.Type) + { + case QUEST_OBJECTIVE_MONSTER: + case QUEST_OBJECTIVE_ITEM: + case QUEST_OBJECTIVE_GAMEOBJECT: + case QUEST_OBJECTIVE_TALKTO: + case QUEST_OBJECTIVE_PLAYERKILLS: + case QUEST_OBJECTIVE_AREATRIGGER: + TC_LOG_ERROR("sql.sql", "Quest %u objective %u has invalid StorageIndex = %d for objective type %u", qinfo->GetQuestId(), obj.ID, obj.StorageIndex, obj.Type); + break; + default: + break; + } } switch (obj.Type) @@ -3934,48 +3927,43 @@ void ObjectMgr::LoadQuests() case QUEST_OBJECTIVE_ITEM: qinfo->SetSpecialFlag(QUEST_SPECIAL_FLAGS_DELIVER); if (!sObjectMgr->GetItemTemplate(obj.ObjectID)) - { TC_LOG_ERROR("sql.sql", "Quest %u objective %u has non existing item entry %u, quest can't be done.", - qinfo->GetQuestId(), j, obj.ObjectID); - obj.Amount = 0; // prevent incorrect work of quest - } + qinfo->GetQuestId(), obj.ID, obj.ObjectID); break; case QUEST_OBJECTIVE_MONSTER: - qinfo->SetSpecialFlag(QUEST_SPECIAL_FLAGS_KILL | QUEST_SPECIAL_FLAGS_CAST | QUEST_SPECIAL_FLAGS_SPEAKTO); + qinfo->SetSpecialFlag(QUEST_SPECIAL_FLAGS_KILL | QUEST_SPECIAL_FLAGS_CAST); if (!sObjectMgr->GetCreatureTemplate(obj.ObjectID)) - { TC_LOG_ERROR("sql.sql", "Quest %u objective %u has non existing creature entry %u, quest can't be done.", - qinfo->GetQuestId(), j, uint32(obj.ObjectID)); - obj.Amount = 0; // quest can't be done for this requirement - } + qinfo->GetQuestId(), obj.ID, uint32(obj.ObjectID)); break; case QUEST_OBJECTIVE_GAMEOBJECT: - qinfo->SetSpecialFlag(QUEST_SPECIAL_FLAGS_KILL | QUEST_SPECIAL_FLAGS_CAST | QUEST_SPECIAL_FLAGS_SPEAKTO); + qinfo->SetSpecialFlag(QUEST_SPECIAL_FLAGS_KILL | QUEST_SPECIAL_FLAGS_CAST); if (!sObjectMgr->GetGameObjectTemplate(obj.ObjectID)) - { TC_LOG_ERROR("sql.sql", "Quest %u objective %u has non existing gameobject entry %u, quest can't be done.", - qinfo->GetQuestId(), j, uint32(obj.ObjectID)); - obj.Amount = 0; // quest can't be done for this requirement - } + qinfo->GetQuestId(), obj.ID, uint32(obj.ObjectID)); + break; + case QUEST_OBJECTIVE_TALKTO: + // Need checks (is it creature only?) + qinfo->SetSpecialFlag(QUEST_SPECIAL_FLAGS_CAST | QUEST_SPECIAL_FLAGS_SPEAKTO); break; case QUEST_OBJECTIVE_MIN_REPUTATION: case QUEST_OBJECTIVE_MAX_REPUTATION: if (!sFactionStore.LookupEntry(obj.ObjectID)) - TC_LOG_ERROR("sql.sql", "Quest %u objective %u has non existing faction id %u", qinfo->GetQuestId(), j, obj.ObjectID); + TC_LOG_ERROR("sql.sql", "Quest %u objective %u has non existing faction id %u", qinfo->GetQuestId(), obj.ID, obj.ObjectID); break; case QUEST_OBJECTIVE_PLAYERKILLS: qinfo->SetSpecialFlag(QUEST_SPECIAL_FLAGS_PLAYER_KILL); if (obj.Amount <= 0) - TC_LOG_ERROR("sql.sql", "Quest %u objective %u has invalid player kills count %d", qinfo->GetQuestId(), j, obj.Amount); + TC_LOG_ERROR("sql.sql", "Quest %u objective %u has invalid player kills count %d", qinfo->GetQuestId(), obj.ID, obj.Amount); break; case QUEST_OBJECTIVE_CURRENCY: if (!sCurrencyTypesStore.LookupEntry(obj.ObjectID)) - TC_LOG_ERROR("sql.sql", "Quest %u objective %u has non existing currency %u", qinfo->GetQuestId(), j, obj.ObjectID); + TC_LOG_ERROR("sql.sql", "Quest %u objective %u has non existing currency %u", qinfo->GetQuestId(), obj.ID, obj.ObjectID); if (obj.Amount <= 0) - TC_LOG_ERROR("sql.sql", "Quest %u objective %u has invalid currency amount %d", qinfo->GetQuestId(), j, obj.Amount); + TC_LOG_ERROR("sql.sql", "Quest %u objective %u has invalid currency amount %d", qinfo->GetQuestId(), obj.ID, obj.Amount); break; default: - TC_LOG_ERROR("sql.sql", "Quest %u objective %u has unknown type %u", qinfo->GetQuestId(), j, obj.Type); + TC_LOG_ERROR("sql.sql", "Quest %u objective %u has unhandled type %u", qinfo->GetQuestId(), obj.ID, obj.Type); } } |
