283 lines
6.5 KiB
C++
283 lines
6.5 KiB
C++
#pragma once
|
|
#include <stdint.h>
|
|
#include <stddef.h>
|
|
|
|
namespace iw5mp_structs
|
|
{
|
|
static_assert(sizeof(uint32_t) == 4, "uint32_t is not 4?");
|
|
static_assert(sizeof(uint16_t) == 2, "uint16_t is not 2?");
|
|
static_assert(sizeof(uint8_t) == 1, "uint8_t is not 1?");
|
|
#pragma pack(push, 1)
|
|
|
|
struct NetDataStructure
|
|
{
|
|
uint32_t netaddresstype;
|
|
uint32_t dw_ip;
|
|
uint16_t w_port;
|
|
uint16_t field_A;
|
|
uint32_t field_C;
|
|
uint32_t field_10;
|
|
uint32_t index;
|
|
};
|
|
static_assert(sizeof(NetDataStructure) == 0x18, "NetDataStructure struct is not 0x18");
|
|
|
|
struct ipNport
|
|
{
|
|
uint8_t ip[4];
|
|
uint16_t port;
|
|
ipNport& operator=(const ipNport& data)
|
|
{
|
|
this->ip[0] = data.ip[0];
|
|
this->ip[1] = data.ip[1];
|
|
this->ip[2] = data.ip[2];
|
|
this->ip[3] = data.ip[3];
|
|
this->port = data.port;
|
|
return *this;
|
|
}
|
|
};
|
|
static_assert(sizeof(ipNport) == 6, "ipNport struct is not 6");
|
|
|
|
|
|
struct playerNetData
|
|
{
|
|
ipNport local;
|
|
ipNport route1;
|
|
ipNport route2;
|
|
ipNport external;
|
|
uint8_t isValid;
|
|
playerNetData& operator=(const playerNetData& data)
|
|
{
|
|
this->local = data.local;
|
|
this->route1 = data.route1;
|
|
this->route2 = data.route2;
|
|
this->external = data.external;
|
|
this->isValid = data.isValid;
|
|
return *this;
|
|
}
|
|
void SetData(const playerNetData* nd)
|
|
{
|
|
this->local = nd->local;
|
|
this->route1 = nd->route1;
|
|
this->route2 = nd->route2;
|
|
this->external = nd->external;
|
|
this->isValid = nd->isValid;
|
|
}
|
|
};
|
|
static_assert(sizeof(playerNetData) == 0x19, "playerNetData struct is not 0x19");
|
|
|
|
struct bdSecurityKeyMap_bdSecurityID
|
|
{
|
|
uint8_t id[8];
|
|
bdSecurityKeyMap_bdSecurityID& operator=(const bdSecurityKeyMap_bdSecurityID& data)
|
|
{
|
|
::memcpy(id, data.id, sizeof(id));
|
|
return *this;
|
|
}
|
|
void Init(uint8_t v)
|
|
{
|
|
::memset(this->id, v, sizeof(id));
|
|
}
|
|
void Set(bdSecurityKeyMap_bdSecurityID* res)
|
|
{
|
|
::memcpy(id, res->id, sizeof(id));
|
|
}
|
|
};
|
|
struct bdSecurityKeyMap_bdSecurityKey
|
|
{
|
|
uint8_t key[16];
|
|
};
|
|
|
|
struct hostInfo
|
|
{
|
|
uint8_t isValid;
|
|
bdSecurityKeyMap_bdSecurityID bdID;
|
|
playerNetData ND;
|
|
bdSecurityKeyMap_bdSecurityKey bdKey;
|
|
|
|
}; static_assert(sizeof(hostInfo) == 0x32, "hostInfo struct is not 0x32");
|
|
|
|
struct gamesession_unkstruct64b
|
|
{
|
|
uint8_t isValid;
|
|
uint8_t b1;
|
|
uint8_t b2;
|
|
uint8_t b3;
|
|
uint32_t x4;
|
|
uint64_t xuid;
|
|
uint8_t bi1;
|
|
uint8_t bi2;
|
|
uint8_t bi3;
|
|
uint8_t bi4;
|
|
NetDataStructure netdata;
|
|
uint32_t i5;
|
|
uint32_t i6;
|
|
uint8_t x34;
|
|
uint8_t x35;
|
|
uint8_t x36;
|
|
uint8_t x37;
|
|
uint32_t i7;
|
|
uint32_t i8;
|
|
};
|
|
static_assert(sizeof(gamesession_unkstruct64b) == 64, "gamesession_unkstruct64b struct is not 64");
|
|
|
|
struct gamesession_unkstruct24b
|
|
{
|
|
uint8_t isValid;
|
|
uint8_t b1;
|
|
uint8_t b2;
|
|
uint8_t b3;
|
|
uint32_t x4;
|
|
uint64_t xuid;
|
|
uint32_t x10;
|
|
uint32_t x14;
|
|
|
|
};
|
|
static_assert(sizeof(gamesession_unkstruct24b) == 0x18, "gamesession_unkstruct24b struct is not 24");
|
|
|
|
struct gameSession
|
|
{
|
|
uint32_t off_STRgameSession;
|
|
uint8_t b1;
|
|
uint8_t b2;
|
|
uint8_t b3;
|
|
uint8_t b4;
|
|
hostInfo serverinfo;
|
|
uint8_t x3A;
|
|
uint8_t x3B;
|
|
uint32_t x3C;
|
|
uint64_t fakexuid;
|
|
uint32_t privClients;
|
|
uint32_t totalNumSlots;
|
|
uint32_t mask;
|
|
uint32_t x54;
|
|
gamesession_unkstruct64b x18_64b[18];
|
|
uint32_t x4D8;
|
|
uint32_t IndexND;
|
|
uint32_t x4E0;
|
|
uint32_t x4E4;
|
|
gamesession_unkstruct24b x18_24b[18];
|
|
}; static_assert(sizeof(gameSession) == 0x698, "session struct is not 0x698");
|
|
struct snapshot_unkstruct13068
|
|
{
|
|
uint32_t f0;
|
|
uint32_t type;
|
|
uint32_t f8;
|
|
uint32_t fC;
|
|
uint32_t bytemask;
|
|
uint32_t f14;
|
|
uint32_t f18[78];
|
|
uint32_t index;
|
|
uint32_t arr[3181];
|
|
uint32_t end;
|
|
};
|
|
struct unkstruct256
|
|
{
|
|
uint8_t idk[256];
|
|
};
|
|
struct PlayerInfo_1
|
|
{
|
|
uint32_t id; // 4
|
|
uint32_t team; //0 - ffa, 1 - team1, 2 - team2, 3 - spectator // 8
|
|
uint8_t bytes[60]; // 68
|
|
uint8_t name[16]; // last byte should be null // 84
|
|
uint8_t abytes[4]; // 88
|
|
uint32_t level; // value - 1 = level // 92
|
|
uint32_t prestige; // 96
|
|
uint8_t cbytes[16]; //112
|
|
uint32_t emblem; //116
|
|
uint32_t _0x0000000B; //120
|
|
uint8_t bytez[4]; //124
|
|
uint32_t ec_usingTag; // bool value //128
|
|
uint32_t ec_usingTitle; // bool value //132
|
|
uint8_t ec_Title[24]; //156
|
|
uint32_t ec_TitleBg; //160
|
|
uint8_t ec_ClanTag[8]; // last byte should be null //168
|
|
};
|
|
|
|
struct cgameGlobstruct_snapshotEntry
|
|
{
|
|
snapshot_unkstruct13068 snapshot;
|
|
uint32_t f330C;
|
|
uint32_t f3310;
|
|
uint32_t f3314;
|
|
uint32_t number_structs256b;
|
|
uint32_t number_structs168b;
|
|
unkstruct256 x768_256b[768];
|
|
PlayerInfo_1 x18_PlayerInfo[18];
|
|
uint32_t end;
|
|
}; static_assert(sizeof(cgameGlobstruct_snapshotEntry) == 0x33EF4, "cgameGlobstruct_snapshotEntry struct is not 0x33EF4");
|
|
|
|
struct cgameGlob
|
|
{
|
|
uint32_t f0;
|
|
uint32_t field_4;
|
|
uint32_t field_8;
|
|
uint32_t field_C;
|
|
uint32_t field_10;
|
|
uint32_t field_14;
|
|
uint32_t field_18;
|
|
uint32_t field_1C;
|
|
uint32_t field_20;
|
|
uint32_t field_24;
|
|
uint32_t field_28;
|
|
uint32_t field_2C;
|
|
uint32_t field_30;
|
|
uint32_t field_34[3629];
|
|
uint32_t field_38E8;
|
|
uint32_t field_38EC;
|
|
uint32_t field_38F0[52827];
|
|
uint32_t field_3725C;
|
|
cgameGlobstruct_snapshotEntry snapshotEntry;
|
|
};
|
|
static_assert(offsetof(cgameGlob, snapshotEntry) == 0x3725C + 4, "cgameGlob has wrong offset for cgameGlobstruct_snapshotEntry");
|
|
|
|
|
|
namespace DTLS
|
|
{
|
|
struct InitPacket
|
|
{
|
|
uint8_t header_high;
|
|
uint8_t header_low;
|
|
uint32_t unknown;
|
|
uint16_t m_initTag;
|
|
iw5mp_structs::bdSecurityKeyMap_bdSecurityID bdSecurityID;
|
|
}; static_assert(sizeof(InitPacket) == 16, "InitPacket struct is not 16");
|
|
struct CookieAck
|
|
{
|
|
uint16_t m_localTag;
|
|
uint16_t localTag;
|
|
};
|
|
struct InitAck
|
|
{
|
|
uint8_t header_high;
|
|
uint8_t header_low;
|
|
uint32_t m_initTag;
|
|
uint32_t d_0;
|
|
uint32_t d_1;
|
|
CookieAck cookie;
|
|
uint32_t m_peerTag;
|
|
uint16_t _idk;
|
|
uint32_t client_ip;
|
|
uint16_t client_port;
|
|
iw5mp_structs::bdSecurityKeyMap_bdSecurityID bdSecurityID;
|
|
};
|
|
static_assert(sizeof(InitAck) == 38, "InitAck struct is not 38");
|
|
static_assert(offsetof(InitAck, cookie) == 14, "cookie offset is not 14");
|
|
struct CookieAckPacket
|
|
{
|
|
uint8_t header_high;
|
|
uint8_t header_low;
|
|
CookieAck cookie;
|
|
InitAck initack;
|
|
playerNetData pND;
|
|
iw5mp_structs::bdSecurityKeyMap_bdSecurityID bdSecurityID;
|
|
uint8_t ECCkey_exportkey[100];
|
|
};
|
|
static_assert(sizeof(CookieAckPacket) == 177, "CookieAckPacket struct is not 177");
|
|
static_assert(offsetof(CookieAckPacket, ECCkey_exportkey) == 77, "ECCkey_exportkey offset is not 77");
|
|
};
|
|
|
|
|
|
#pragma pack(pop)
|
|
};
|