diff options
author | Shauren <shauren.trinity@gmail.com> | 2017-03-19 17:25:00 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2017-03-19 17:25:00 +0100 |
commit | d4176eb2f1a1860ee0691111d62cb8b231ac2fff (patch) | |
tree | 568323c74c82c4af94a6fc12081fc05303bcfb9e /src | |
parent | 27bf4010b8d12c27d3d8f6df40bff3d9b1a425b1 (diff) |
Core/Quests: Fixed loading areatriggers linked to quest by objective and expose ObjectMgr::GetQuestObjective to lookup quest objectives by id (for conditions)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 18 |
2 files changed, 25 insertions, 8 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index ef19db50d51..b063d786aa5 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3863,6 +3863,7 @@ void ObjectMgr::LoadQuests() for (QuestMap::const_iterator itr=_questTemplates.begin(); itr != _questTemplates.end(); ++itr) delete itr->second; _questTemplates.clear(); + _questObjectives.clear(); mExclusiveQuestGroups.clear(); @@ -4308,6 +4309,9 @@ void ObjectMgr::LoadQuests() for (QuestObjective const& obj : qinfo->GetObjectives()) { + // Store objective for lookup by id + _questObjectives[obj.ID] = std::make_pair(&obj, qinfo->GetQuestId()); + // Check storage index for objectives which store data if (obj.StorageIndex < 0) { @@ -4388,9 +4392,7 @@ void ObjectMgr::LoadQuests() TC_LOG_ERROR("sql.sql", "Quest %u objective %u has non existing criteria tree id %d", qinfo->GetQuestId(), obj.ID, obj.ObjectID); break; case QUEST_OBJECTIVE_AREATRIGGER: - if (sAreaTriggerStore.LookupEntry(uint32(obj.ObjectID))) - _questAreaTriggerStore[obj.ObjectID].insert(qinfo->ID); - else if (obj.ObjectID != -1) + if (!sAreaTriggerStore.LookupEntry(uint32(obj.ObjectID)) && obj.ObjectID != -1) TC_LOG_ERROR("sql.sql", "Quest %u objective %u has non existing areatrigger id %d", qinfo->GetQuestId(), obj.ID, obj.ObjectID); break; case QUEST_OBJECTIVE_MONEY: @@ -5859,6 +5861,13 @@ void ObjectMgr::LoadQuestAreaTriggers() } while (result->NextRow()); + for (auto const& pair : _questObjectives) + { + QuestObjective const* objective = pair.second.first; + if (objective->Type == QUEST_OBJECTIVE_AREATRIGGER) + _questAreaTriggerStore[objective->ObjectID].insert(pair.second.second); + } + TC_LOG_INFO("server.loading", ">> Loaded %u quest trigger points in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 8125551f55f..21569d3e579 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -455,7 +455,7 @@ typedef std::pair<QuestRelationsReverse::const_iterator, QuestRelationsReverse:: struct PetLevelInfo { - PetLevelInfo() : health(0), mana(0), armor(0) { for (uint8 i=0; i < MAX_STATS; ++i) stats[i] = 0; } + PetLevelInfo() : health(0), mana(0), armor(0) { memset(stats, 0, sizeof(stats)); } uint16 stats[MAX_STATS]; uint16 health; @@ -720,6 +720,7 @@ class TC_GAME_API ObjectMgr typedef std::unordered_map<uint32, Item*> ItemMap; typedef std::unordered_map<uint32, Quest*> QuestMap; + typedef std::unordered_map<uint32 /*questObjectiveId*/, std::pair<QuestObjective const*, uint32 /*questId*/>> QuestObjectivesByIdContainer; typedef std::unordered_map<uint32, AreaTriggerStruct> AreaTriggerContainer; @@ -822,6 +823,12 @@ class TC_GAME_API ObjectMgr QuestMap const& GetQuestTemplates() const { return _questTemplates; } + QuestObjective const* GetQuestObjective(uint32 questObjectiveId) const + { + auto itr = _questObjectives.find(questObjectiveId); + return itr != _questObjectives.end() ? itr->second.first : nullptr; + } + std::unordered_set<uint32> const* GetQuestsForAreaTrigger(uint32 Trigger_ID) const { auto itr = _questAreaTriggerStore.find(Trigger_ID); @@ -1119,9 +1126,9 @@ class TC_GAME_API ObjectMgr if (map_itr == _mailLevelRewardStore.end()) return nullptr; - for (MailLevelRewardList::const_iterator set_itr = map_itr->second.begin(); set_itr != map_itr->second.end(); ++set_itr) - if (set_itr->raceMask & raceMask) - return &*set_itr; + for (auto const& mailLevelReward : map_itr->second) + if (mailLevelReward.raceMask & raceMask) + return &mailLevelReward; return nullptr; } @@ -1289,7 +1296,7 @@ class TC_GAME_API ObjectMgr void AddVendorItem(uint32 entry, uint32 item, int32 maxcount, uint32 incrtime, uint32 extendedCost, uint8 type, bool persist = true); // for event bool RemoveVendorItem(uint32 entry, uint32 item, uint8 type, bool persist = true); // for event - bool IsVendorItemValid(uint32 vendor_entry, uint32 id, int32 maxcount, uint32 ptime, uint32 ExtendedCost, uint8 type, Player* player = NULL, std::set<uint32>* skip_vendors = NULL, uint32 ORnpcflag = 0) const; + bool IsVendorItemValid(uint32 vendor_entry, uint32 id, int32 maxcount, uint32 ptime, uint32 ExtendedCost, uint8 type, Player* player = nullptr, std::set<uint32>* skip_vendors = nullptr, uint32 ORnpcflag = 0) const; void LoadScriptNames(); ScriptNameContainer const& GetAllScriptNames() const; @@ -1434,6 +1441,7 @@ class TC_GAME_API ObjectMgr std::map<HighGuid, std::unique_ptr<ObjectGuidGeneratorBase>> _guidGenerators; QuestMap _questTemplates; + QuestObjectivesByIdContainer _questObjectives; typedef std::unordered_map<uint32, NpcText> NpcTextContainer; typedef std::unordered_map<uint32, std::unordered_set<uint32>> QuestAreaTriggerContainer; |