aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp15
-rw-r--r--src/server/game/Globals/ObjectMgr.h18
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;