diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 15 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 30 | ||||
-rw-r--r-- | src/server/game/Handlers/HotfixHandler.cpp | 39 | ||||
-rw-r--r-- | src/server/game/Server/Packets/HotfixPackets.cpp | 63 | ||||
-rw-r--r-- | src/server/game/Server/Packets/HotfixPackets.h | 11 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Server/WorldSocket.h | 2 |
7 files changed, 88 insertions, 77 deletions
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 4cdd36fbefa..54231bead60 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -1414,7 +1414,11 @@ void DB2Manager::LoadHotfixData() } _maxHotfixId = std::max(_maxHotfixId, id); - _hotfixData[id].emplace_back(tableHash, recordId); + HotfixRecord hotfixRecord; + hotfixRecord.TableHash = tableHash; + hotfixRecord.RecordID = recordId; + hotfixRecord.HotfixID = id; + _hotfixData.insert(hotfixRecord); ++_hotfixCount; deletedRecords[std::make_pair(tableHash, recordId)] = deleted; ++count; @@ -1463,7 +1467,7 @@ void DB2Manager::LoadHotfixBlob() uint32 DB2Manager::GetHotfixCount() const { - return _hotfixCount; + return _hotfixData.size(); } DB2Manager::HotfixContainer const& DB2Manager::GetHotfixData() const @@ -1485,8 +1489,11 @@ uint32 DB2Manager::GetEmptyAnimStateID() const void DB2Manager::InsertNewHotfix(uint32 tableHash, uint32 recordId) { - _hotfixData[++_maxHotfixId].emplace_back(tableHash, recordId); - ++_hotfixCount; + HotfixRecord hotfixRecord; + hotfixRecord.TableHash = tableHash; + hotfixRecord.RecordID = recordId; + hotfixRecord.HotfixID = ++_maxHotfixId; + _hotfixData.insert(hotfixRecord); } std::vector<uint32> DB2Manager::GetAreasForGroup(uint32 areaGroupId) const diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index a578fedbffc..cc508a8883f 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -227,11 +227,11 @@ struct TaxiPathBySourceAndDestination uint32 price; }; -typedef std::map<uint32, TaxiPathBySourceAndDestination> TaxiPathSetForSource; -typedef std::map<uint32, TaxiPathSetForSource> TaxiPathSetBySource; +using TaxiPathSetForSource = std::map<uint32, TaxiPathBySourceAndDestination>; +using TaxiPathSetBySource = std::map<uint32, TaxiPathSetForSource>; -typedef std::vector<TaxiPathNodeEntry const*> TaxiPathNodeList; -typedef std::vector<TaxiPathNodeList> TaxiPathNodesByPath; +using TaxiPathNodeList = std::vector<TaxiPathNodeEntry const*>; +using TaxiPathNodesByPath = std::vector<TaxiPathNodeList>; TC_GAME_API extern TaxiMask sTaxiNodesMask; TC_GAME_API extern TaxiMask sOldContinentsNodesMask; @@ -252,12 +252,24 @@ class TC_GAME_API DB2Manager public: DEFINE_DB2_SET_COMPARATOR(MountTypeXCapabilityEntry) - typedef std::map<int32 /*hotfixId*/, std::vector<std::pair<uint32 /*tableHash*/, int32 /*recordId*/>>> HotfixContainer; + struct HotfixRecord + { + uint32 TableHash = 0; + int32 RecordID = 0; + int32 HotfixID = 0; - typedef std::vector<ItemBonusEntry const*> ItemBonusList; - typedef std::unordered_map<uint32, std::unordered_map<uint32, MapDifficultyEntry const*>> MapDifficultyContainer; - typedef std::set<MountTypeXCapabilityEntry const*, MountTypeXCapabilityEntryComparator> MountTypeXCapabilitySet; - typedef std::vector<MountXDisplayEntry const*> MountXDisplayContainer; + friend bool operator<(HotfixRecord const& left, HotfixRecord const& right) + { + return std::tie(left.HotfixID, left.TableHash, left.RecordID) < std::tie(right.HotfixID, right.TableHash, right.RecordID); + } + }; + + using HotfixContainer = std::set<HotfixRecord>; + + using ItemBonusList = std::vector<ItemBonusEntry const*>; + using MapDifficultyContainer = std::unordered_map<uint32, std::unordered_map<uint32, MapDifficultyEntry const*>>; + using MountTypeXCapabilitySet = std::set<MountTypeXCapabilityEntry const*, MountTypeXCapabilityEntryComparator>; + using MountXDisplayContainer = std::vector<MountXDisplayEntry const*>; static DB2Manager& Instance(); diff --git a/src/server/game/Handlers/HotfixHandler.cpp b/src/server/game/Handlers/HotfixHandler.cpp index 2d6eda261b0..7230bb3e8ec 100644 --- a/src/server/game/Handlers/HotfixHandler.cpp +++ b/src/server/game/Handlers/HotfixHandler.cpp @@ -65,32 +65,27 @@ void WorldSession::HandleHotfixRequest(WorldPackets::Hotfix::HotfixRequest& hotf DB2Manager::HotfixContainer const& hotfixes = sDB2Manager.GetHotfixData(); WorldPackets::Hotfix::HotfixResponse hotfixQueryResponse; hotfixQueryResponse.Hotfixes.reserve(hotfixQuery.Hotfixes.size()); - for (WorldPackets::Hotfix::HotfixRecord const& hotfixRecord : hotfixQuery.Hotfixes) + for (DB2Manager::HotfixRecord const& hotfixRecord : hotfixQuery.Hotfixes) { - if (auto const* hotfixedRecords = Trinity::Containers::MapGetValuePtr(hotfixes, hotfixRecord.HotfixID)) + if (hotfixes.find(hotfixRecord) != hotfixes.end()) { - for (auto const& tableRecord : *hotfixedRecords) - { - uint32 hotfixTableHash = tableRecord.first; - int32 hotfixRecordId = tableRecord.second;; - DB2StorageBase const* storage = sDB2Manager.GetStorage(hotfixTableHash); - - WorldPackets::Hotfix::HotfixResponse::HotfixData hotfixData; - hotfixData.Record = hotfixRecord; - if (storage && storage->HasRecord(hotfixRecordId)) - { - std::size_t pos = hotfixQueryResponse.HotfixContent.size(); - storage->WriteRecord(hotfixRecordId, GetSessionDbcLocale(), hotfixQueryResponse.HotfixContent); - hotfixData.Size = hotfixQueryResponse.HotfixContent.size() - pos; - } - else if (std::vector<uint8> const* blobData = sDB2Manager.GetHotfixBlobData(hotfixTableHash, hotfixRecordId)) - { - hotfixData.Size = blobData->size(); - hotfixQueryResponse.HotfixContent.append(blobData->data(), blobData->size()); - } + DB2StorageBase const* storage = sDB2Manager.GetStorage(hotfixRecord.TableHash); - hotfixQueryResponse.Hotfixes.emplace_back(std::move(hotfixData)); + WorldPackets::Hotfix::HotfixResponse::HotfixData hotfixData; + hotfixData.Record = hotfixRecord; + if (storage && storage->HasRecord(uint32(hotfixRecord.RecordID))) + { + std::size_t pos = hotfixQueryResponse.HotfixContent.size(); + storage->WriteRecord(uint32(hotfixRecord.RecordID), GetSessionDbcLocale(), hotfixQueryResponse.HotfixContent); + hotfixData.Size = hotfixQueryResponse.HotfixContent.size() - pos; } + else if (std::vector<uint8> const* blobData = sDB2Manager.GetHotfixBlobData(hotfixRecord.TableHash, hotfixRecord.RecordID)) + { + hotfixData.Size = blobData->size(); + hotfixQueryResponse.HotfixContent.append(blobData->data(), blobData->size()); + } + + hotfixQueryResponse.Hotfixes.emplace_back(std::move(hotfixData)); } } diff --git a/src/server/game/Server/Packets/HotfixPackets.cpp b/src/server/game/Server/Packets/HotfixPackets.cpp index 79565cd7fa3..4f77cff5721 100644 --- a/src/server/game/Server/Packets/HotfixPackets.cpp +++ b/src/server/game/Server/Packets/HotfixPackets.cpp @@ -18,7 +18,27 @@ #include "HotfixPackets.h" #include "PacketUtilities.h" -void WorldPackets::Hotfix::DBQueryBulk::Read() +namespace WorldPackets +{ +namespace Hotfix +{ +ByteBuffer& operator>>(ByteBuffer& data, DB2Manager::HotfixRecord& hotfixRecord) +{ + data >> hotfixRecord.TableHash; + data >> hotfixRecord.RecordID; + data >> hotfixRecord.HotfixID; + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, DB2Manager::HotfixRecord const& hotfixRecord) +{ + data << uint32(hotfixRecord.TableHash); + data << int32(hotfixRecord.RecordID); + data << int32(hotfixRecord.HotfixID); + return data; +} + +void DBQueryBulk::Read() { _worldPacket >> TableHash; @@ -29,7 +49,7 @@ void WorldPackets::Hotfix::DBQueryBulk::Read() _worldPacket >> Queries[i].RecordID; } -WorldPacket const* WorldPackets::Hotfix::DBReply::Write() +WorldPacket const* DBReply::Write() { _worldPacket << uint32(TableHash); _worldPacket << uint32(RecordID); @@ -41,40 +61,17 @@ WorldPacket const* WorldPackets::Hotfix::DBReply::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Hotfix::AvailableHotfixes::Write() +WorldPacket const* AvailableHotfixes::Write() { _worldPacket << int32(HotfixCacheVersion); _worldPacket << uint32(HotfixCount); - for (auto const& hotfixEntry : Hotfixes) - { - for (auto const& tableRecord : hotfixEntry.second) - { - _worldPacket << uint32(tableRecord.first); - _worldPacket << int32(tableRecord.second); - _worldPacket << int32(hotfixEntry.first); - } - } + for (DB2Manager::HotfixRecord const& hotfixRecord : Hotfixes) + _worldPacket << hotfixRecord; return &_worldPacket; } -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Hotfix::HotfixRecord& hotfixRecord) -{ - data >> hotfixRecord.TableHash; - data >> hotfixRecord.RecordID; - data >> hotfixRecord.HotfixID; - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Hotfix::HotfixRecord const& hotfixRecord) -{ - data << uint32(hotfixRecord.TableHash); - data << int32(hotfixRecord.RecordID); - data << int32(hotfixRecord.HotfixID); - return data; -} - -void WorldPackets::Hotfix::HotfixRequest::Read() +void HotfixRequest::Read() { _worldPacket >> ClientBuild; _worldPacket >> DataBuild; @@ -84,11 +81,11 @@ void WorldPackets::Hotfix::HotfixRequest::Read() throw PacketArrayMaxCapacityException(hotfixCount, sDB2Manager.GetHotfixCount()); Hotfixes.resize(hotfixCount); - for (HotfixRecord& hotfixRecord : Hotfixes) + for (DB2Manager::HotfixRecord& hotfixRecord : Hotfixes) _worldPacket >> hotfixRecord; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Hotfix::HotfixResponse::HotfixData const& hotfixData) +ByteBuffer& operator<<(ByteBuffer& data, HotfixResponse::HotfixData const& hotfixData) { data << hotfixData.Record; if (hotfixData.Size) @@ -106,7 +103,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Hotfix::HotfixResponse::H return data; } -WorldPacket const* WorldPackets::Hotfix::HotfixResponse::Write() +WorldPacket const* HotfixResponse::Write() { _worldPacket << uint32(Hotfixes.size()); for (HotfixData const& hotfix : Hotfixes) @@ -117,3 +114,5 @@ WorldPacket const* WorldPackets::Hotfix::HotfixResponse::Write() return &_worldPacket; } +} +} diff --git a/src/server/game/Server/Packets/HotfixPackets.h b/src/server/game/Server/Packets/HotfixPackets.h index f83926367f6..497a85d55d9 100644 --- a/src/server/game/Server/Packets/HotfixPackets.h +++ b/src/server/game/Server/Packets/HotfixPackets.h @@ -71,13 +71,6 @@ namespace WorldPackets DB2Manager::HotfixContainer const& Hotfixes; }; - struct HotfixRecord - { - uint32 TableHash = 0; - int32 RecordID = 0; - int32 HotfixID = 0; - }; - class HotfixRequest final : public ClientPacket { public: @@ -87,7 +80,7 @@ namespace WorldPackets uint32 ClientBuild = 0; uint32 DataBuild = 0; - std::vector<HotfixRecord> Hotfixes; + std::vector<DB2Manager::HotfixRecord> Hotfixes; }; class HotfixResponse final : public ServerPacket @@ -95,7 +88,7 @@ namespace WorldPackets public: struct HotfixData { - HotfixRecord Record; + DB2Manager::HotfixRecord Record; Optional<uint32> Size; }; diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 1618267d420..1c9f49df88b 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -1391,6 +1391,11 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co maxPacketCounterAllowed = PLAYER_SLOTS_COUNT; break; } + case CMSG_HOTFIX_REQUEST: // not profiled + { + maxPacketCounterAllowed = 1; + break; + } default: { maxPacketCounterAllowed = 100; diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index 572df283d8a..057c5bd1250 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -56,7 +56,7 @@ struct PacketHeader uint32 Size; uint8 Tag[12]; - bool IsValidSize() { return Size < 0x10000; } + bool IsValidSize() { return Size < 0x40000; } }; #pragma pack(pop) |