|
|
|
|
@ -8,8 +8,8 @@
|
|
|
|
|
#include <cstdint> |
|
|
|
|
#include <list> |
|
|
|
|
#include <memory> |
|
|
|
|
#include <unordered_map> |
|
|
|
|
|
|
|
|
|
#include <ankerl/unordered_dense.h> |
|
|
|
|
#include <fmt/format.h> |
|
|
|
|
|
|
|
|
|
#if !defined(UNPACKED_MPQS) || !defined(UNPACKED_SAVES) || !defined(NONET) |
|
|
|
|
@ -218,8 +218,8 @@ struct DSpawnedMonster {
|
|
|
|
|
|
|
|
|
|
struct DLevel { |
|
|
|
|
TCmdPItem item[MAXITEMS]; |
|
|
|
|
std::unordered_map<WorldTilePosition, DObjectStr> object; |
|
|
|
|
std::unordered_map<size_t, DSpawnedMonster> spawnedMonsters; |
|
|
|
|
ankerl::unordered_dense::map<WorldTilePosition, DObjectStr> object; |
|
|
|
|
ankerl::unordered_dense::map<size_t, DSpawnedMonster> spawnedMonsters; |
|
|
|
|
DMonsterStr monster[MaxMonsters]; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
@ -260,14 +260,14 @@ constexpr size_t MAX_CHUNKS = MAX_MULTIPLAYERLEVELS + 4;
|
|
|
|
|
uint32_t sgdwOwnerWait; |
|
|
|
|
uint32_t sgdwRecvOffset; |
|
|
|
|
int sgnCurrMegaPlayer; |
|
|
|
|
std::unordered_map<uint8_t, DLevel> DeltaLevels; |
|
|
|
|
ankerl::unordered_dense::map<uint8_t, DLevel> DeltaLevels; |
|
|
|
|
uint8_t sbLastCmd; |
|
|
|
|
/**
|
|
|
|
|
* @brief buffer used to receive level deltas, size is the worst expected case assuming every object on a level was touched |
|
|
|
|
*/ |
|
|
|
|
std::byte sgRecvBuf[1U + sizeof(DLevel::item) + sizeof(uint8_t) + (sizeof(WorldTilePosition) + sizeof(_cmd_id)) * MAXOBJECTS + sizeof(DLevel::monster)]; |
|
|
|
|
_cmd_id sgbRecvCmd; |
|
|
|
|
std::unordered_map<uint8_t, LocalLevel> LocalLevels; |
|
|
|
|
ankerl::unordered_dense::map<uint8_t, LocalLevel> LocalLevels; |
|
|
|
|
DJunk sgJunk; |
|
|
|
|
uint8_t sgbDeltaChunks; |
|
|
|
|
std::list<TMegaPkt> MegaPktList; |
|
|
|
|
@ -504,7 +504,7 @@ size_t DeltaImportItem(const std::byte *src, TCmdPItem *dst)
|
|
|
|
|
return size; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::byte *DeltaExportObject(std::byte *dst, const std::unordered_map<WorldTilePosition, DObjectStr> &src) |
|
|
|
|
std::byte *DeltaExportObject(std::byte *dst, const ankerl::unordered_dense::map<WorldTilePosition, DObjectStr> &src) |
|
|
|
|
{ |
|
|
|
|
*dst++ = static_cast<std::byte>(src.size()); |
|
|
|
|
for (const auto &[position, obj] : src) { |
|
|
|
|
@ -516,7 +516,7 @@ std::byte *DeltaExportObject(std::byte *dst, const std::unordered_map<WorldTileP
|
|
|
|
|
return dst; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const std::byte *DeltaImportObjects(const std::byte *src, std::unordered_map<WorldTilePosition, DObjectStr> &dst) |
|
|
|
|
const std::byte *DeltaImportObjects(const std::byte *src, ankerl::unordered_dense::map<WorldTilePosition, DObjectStr> &dst) |
|
|
|
|
{ |
|
|
|
|
dst.clear(); |
|
|
|
|
|
|
|
|
|
@ -562,7 +562,7 @@ size_t DeltaImportMonster(const std::byte *src, DMonsterStr *dst)
|
|
|
|
|
return size; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::byte *DeltaExportSpawnedMonsters(std::byte *dst, const std::unordered_map<size_t, DSpawnedMonster> &spawnedMonsters) |
|
|
|
|
std::byte *DeltaExportSpawnedMonsters(std::byte *dst, const ankerl::unordered_dense::map<size_t, DSpawnedMonster> &spawnedMonsters) |
|
|
|
|
{ |
|
|
|
|
auto &size = *reinterpret_cast<uint16_t *>(dst); |
|
|
|
|
size = static_cast<uint16_t>(spawnedMonsters.size()); |
|
|
|
|
@ -580,7 +580,7 @@ std::byte *DeltaExportSpawnedMonsters(std::byte *dst, const std::unordered_map<s
|
|
|
|
|
return dst; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const std::byte *DeltaImportSpawnedMonsters(const std::byte *src, std::unordered_map<size_t, DSpawnedMonster> &spawnedMonsters) |
|
|
|
|
const std::byte *DeltaImportSpawnedMonsters(const std::byte *src, ankerl::unordered_dense::map<size_t, DSpawnedMonster> &spawnedMonsters) |
|
|
|
|
{ |
|
|
|
|
uint16_t size = *reinterpret_cast<const uint16_t *>(src); |
|
|
|
|
src += sizeof(uint16_t); |
|
|
|
|
|