aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp15
-rw-r--r--src/server/game/DataStores/DB2Stores.h30
-rw-r--r--src/server/game/Handlers/HotfixHandler.cpp39
-rw-r--r--src/server/game/Server/Packets/HotfixPackets.cpp63
-rw-r--r--src/server/game/Server/Packets/HotfixPackets.h11
-rw-r--r--src/server/game/Server/WorldSession.cpp5
-rw-r--r--src/server/game/Server/WorldSocket.h2
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)