diff options
author | xinef1 <w.szyszko2@gmail.com> | 2017-02-20 20:27:08 +0100 |
---|---|---|
committer | ariel- <ariel-@users.noreply.github.com> | 2017-02-20 16:27:08 -0300 |
commit | ae9d01a3245c59a8a8d50516a79b79250337450d (patch) | |
tree | d8cb2e521d7e15c130d21aad9d2225ba82b7998d /src/server/game/Handlers/QueryHandler.cpp | |
parent | 4eae29d421e1d7a28aaa50d401cbbf09c50bd476 (diff) |
Store cached static data queries, instead of building them in every query opcode (#18637)
- Added config option to enable / disable cache
- Reinitialize data on reload command use
- Always send WDB fields in item query
Diffstat (limited to 'src/server/game/Handlers/QueryHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/QueryHandler.cpp | 122 |
1 files changed, 20 insertions, 102 deletions
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index 3feed3daca7..707c733cc00 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -97,51 +97,14 @@ void WorldSession::HandleCreatureQueryOpcode(WorldPacket& recvData) CreatureTemplate const* ci = sObjectMgr->GetCreatureTemplate(entry); if (ci) { - std::string Name, Title; - Name = ci->Name; - Title = ci->Title; - - int loc_idx = GetSessionDbLocaleIndex(); - if (loc_idx >= 0) - { - if (CreatureLocale const* cl = sObjectMgr->GetCreatureLocale(entry)) - { - ObjectMgr::GetLocaleString(cl->Name, loc_idx, Name); - ObjectMgr::GetLocaleString(cl->Title, loc_idx, Title); - } - } TC_LOG_DEBUG("network", "WORLD: CMSG_CREATURE_QUERY '%s' - Entry: %u.", ci->Name.c_str(), entry); - // guess size - WorldPacket data(SMSG_CREATURE_QUERY_RESPONSE, 100); - data << uint32(entry); // creature entry - data << Name; - data << uint8(0) << uint8(0) << uint8(0); // name2, name3, name4, always empty - data << Title; - data << ci->IconName; // "Directions" for guard, string for Icons 2.3.0 - data << uint32(ci->type_flags); // flags - data << uint32(ci->type); // CreatureType.dbc - data << uint32(ci->family); // CreatureFamily.dbc - data << uint32(ci->rank); // Creature Rank (elite, boss, etc) - data << uint32(ci->KillCredit[0]); // new in 3.1, kill credit - data << uint32(ci->KillCredit[1]); // new in 3.1, kill credit - data << uint32(ci->Modelid1); // Modelid1 - data << uint32(ci->Modelid2); // Modelid2 - data << uint32(ci->Modelid3); // Modelid3 - data << uint32(ci->Modelid4); // Modelid4 - data << float(ci->ModHealth); // dmg/hp modifier - data << float(ci->ModMana); // dmg/mana modifier - data << uint8(ci->RacialLeader); - - CreatureQuestItemList const* items = sObjectMgr->GetCreatureQuestItemList(entry); - if (items) - for (uint32 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) - data << (i < items->size() ? uint32((*items)[i]) : uint32(0)); + if (sWorld->getBoolConfig(CONFIG_CACHE_DATA_QUERIES)) + SendPacket(&ci->QueryData[static_cast<uint32>(GetSessionDbLocaleIndex())]); else - for (uint32 i = 0; i < MAX_CREATURE_QUEST_ITEMS; ++i) - data << uint32(0); - - data << uint32(ci->movementId); // CreatureMovementInfo.dbc - SendPacket(&data); + { + WorldPacket queryPacket = ci->BuildQueryData(GetSessionDbLocaleIndex()); + SendPacket(&queryPacket); + } TC_LOG_DEBUG("network", "WORLD: Sent SMSG_CREATURE_QUERY_RESPONSE"); } else @@ -166,44 +129,13 @@ void WorldSession::HandleGameObjectQueryOpcode(WorldPacket& recvData) const GameObjectTemplate* info = sObjectMgr->GetGameObjectTemplate(entry); if (info) { - std::string Name; - std::string IconName; - std::string CastBarCaption; - - Name = info->name; - IconName = info->IconName; - CastBarCaption = info->castBarCaption; - - LocaleConstant localeConstant = GetSessionDbLocaleIndex(); - if (localeConstant >= LOCALE_enUS) - if (GameObjectLocale const* gameObjectLocale = sObjectMgr->GetGameObjectLocale(entry)) - { - ObjectMgr::GetLocaleString(gameObjectLocale->Name, localeConstant, Name); - ObjectMgr::GetLocaleString(gameObjectLocale->CastBarCaption, localeConstant, CastBarCaption); - } - - TC_LOG_DEBUG("network", "WORLD: CMSG_GAMEOBJECT_QUERY '%s' - Entry: %u. ", info->name.c_str(), entry); - WorldPacket data (SMSG_GAMEOBJECT_QUERY_RESPONSE, 150); - data << uint32(entry); - data << uint32(info->type); - data << uint32(info->displayId); - data << Name; - data << uint8(0) << uint8(0) << uint8(0); // name2, name3, name4 - data << IconName; // 2.0.3, string. Icon name to use instead of default icon for go's (ex: "Attack" makes sword) - data << CastBarCaption; // 2.0.3, string. Text will appear in Cast Bar when using GO (ex: "Collecting") - data << info->unk1; // 2.0.3, string - data.append(info->raw.data, MAX_GAMEOBJECT_DATA); - data << float(info->size); // go size - - GameObjectQuestItemList const* items = sObjectMgr->GetGameObjectQuestItemList(entry); - if (items) - for (size_t i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; ++i) - data << (i < items->size() ? uint32((*items)[i]) : uint32(0)); + if (sWorld->getBoolConfig(CONFIG_CACHE_DATA_QUERIES)) + SendPacket(&info->QueryData[static_cast<uint32>(GetSessionDbLocaleIndex())]); else - for (size_t i = 0; i < MAX_GAMEOBJECT_QUEST_ITEMS; ++i) - data << uint32(0); - - SendPacket(&data); + { + WorldPacket queryPacket = info->BuildQueryData(GetSessionDbLocaleIndex()); + SendPacket(&queryPacket); + } TC_LOG_DEBUG("network", "WORLD: Sent SMSG_GAMEOBJECT_QUERY_RESPONSE"); } else @@ -421,7 +353,7 @@ void WorldSession::HandleQuestPOIQuery(WorldPacket& recvData) for (uint32 i = 0; i < count; ++i) questIds.insert(recvData.read<uint32>()); // quest id - WorldPacket data(SMSG_QUEST_POI_QUERY_RESPONSE, 4 + (4 + 4)*questIds.size()); + WorldPacket data(SMSG_QUEST_POI_QUERY_RESPONSE, 4 + (4 + 4 + 40)*questIds.size()); data << uint32(questIds.size()); // count for (auto itr = questIds.begin(); itr != questIds.end(); ++itr) @@ -437,29 +369,15 @@ void WorldSession::HandleQuestPOIQuery(WorldPacket& recvData) if (questOk) { - QuestPOIVector const* POI = sObjectMgr->GetQuestPOIVector(questId); - - if (POI) + if (QuestPOIWrapper const* poiWrapper = sObjectMgr->GetQuestPOIWrapper(questId)) { - data << uint32(questId); // quest ID - data << uint32(POI->size()); // POI count - - for (QuestPOIVector::const_iterator itr = POI->begin(); itr != POI->end(); ++itr) + + if (sWorld->getBoolConfig(CONFIG_CACHE_DATA_QUERIES)) + data.append(poiWrapper->QueryDataBuffer); + else { - data << uint32(itr->Id); // POI index - data << int32(itr->ObjectiveIndex); // objective index - data << uint32(itr->MapId); // mapid - data << uint32(itr->AreaId); // areaid - data << uint32(itr->FloorId); // floorid - data << uint32(itr->Unk3); // unknown - data << uint32(itr->Unk4); // unknown - data << uint32(itr->points.size()); // POI points count - - for (std::vector<QuestPOIPoint>::const_iterator itr2 = itr->points.begin(); itr2 != itr->points.end(); ++itr2) - { - data << int32(itr2->x); // POI point x - data << int32(itr2->y); // POI point y - } + ByteBuffer POIByteBuffer = poiWrapper->BuildQueryData(questId); + data.append(POIByteBuffer); } } else |