diff options
Diffstat (limited to 'src/server/game/Globals/ObjectMgr.cpp')
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 70 |
1 files changed, 69 insertions, 1 deletions
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 62df5d7e63d..1c2ae545ef3 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -7387,7 +7387,11 @@ void ObjectMgr::LoadQuestPOI() if (questId < POIs.size() && id < POIs[questId].size()) { POI.points = POIs[questId][id]; - _questPOIStore[questId].push_back(POI); + QuestPOIContainer::iterator itr = _questPOIStore.find(questId); + if (itr == _questPOIStore.end()) + _questPOIStore[questId] = QuestPOIWrapper(); + + _questPOIStore[questId].DataVector.push_back(POI); } else TC_LOG_ERROR("server.loading", "Table quest_poi references unknown quest points for quest %u POI id %u", questId, id); @@ -9325,3 +9329,67 @@ void ObjectMgr::LoadCreatureQuestItems() TC_LOG_INFO("server.loading", ">> Loaded %u creature quest items in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } + +void ObjectMgr::InitializeQueriesData(QueryDataGroup mask) +{ + // cache disabled + if (!sWorld->getBoolConfig(CONFIG_CACHE_DATA_QUERIES)) + return; + + // Initialize Query data for creatures + if (mask & QUERY_DATA_CREATURES) + for (auto& creaturePair : _creatureTemplateStore) + creaturePair.second.InitializeQueryData(); + + // Initialize Query Data for gameobjects + if (mask & QUERY_DATA_GAMEOBJECTS) + for (auto& gameobjectPair : _gameObjectTemplateStore) + gameobjectPair.second.InitializeQueryData(); + + // Initialize Query Data for items + if (mask & QUERY_DATA_ITEMS) + for (auto& itemPair : _itemTemplateStore) + itemPair.second.InitializeQueryData(); + + // Initialize Query Data for quests + if (mask & QUERY_DATA_QUESTS) + for (auto& questPair : _questTemplates) + questPair.second->InitializeQueryData(); + + // Initialize Quest POI data + if (mask & QUERY_DATA_POIS) + for (auto& poiPair : _questPOIStore) + poiPair.second.InitializeQueryData(poiPair.first); +} + +void QuestPOIWrapper::InitializeQueryData(uint32 questId) +{ + QueryDataBuffer = BuildQueryData(questId); +} + +ByteBuffer QuestPOIWrapper::BuildQueryData(uint32 questId) const +{ + ByteBuffer tempBuffer; + tempBuffer << uint32(questId); // quest ID + tempBuffer << uint32(DataVector.size()); // POI count + + for (QuestPOIVector::const_iterator itr = DataVector.begin(); itr != DataVector.end(); ++itr) + { + tempBuffer << uint32(itr->Id); // POI index + tempBuffer << int32(itr->ObjectiveIndex); // objective index + tempBuffer << uint32(itr->MapId); // mapid + tempBuffer << uint32(itr->AreaId); // areaid + tempBuffer << uint32(itr->FloorId); // floorid + tempBuffer << uint32(itr->Unk3); // unknown + tempBuffer << uint32(itr->Unk4); // unknown + tempBuffer << uint32(itr->points.size()); // POI points count + + for (std::vector<QuestPOIPoint>::const_iterator itr2 = itr->points.begin(); itr2 != itr->points.end(); ++itr2) + { + tempBuffer << int32(itr2->x); // POI point x + tempBuffer << int32(itr2->y); // POI point y + } + } + + return tempBuffer; +} |