26 return ((hostValue & 0xFF00) >> 8) | ((hostValue & 0x00FF) << 8);
31 return ((hostValue & 0xFF000000) >> 24) | ((hostValue & 0x00FF0000) >> 8) |
32 ((hostValue & 0x0000FF00) << 8) | ((hostValue & 0x000000FF) << 24);
37 std::uint32_t intValue;
38 std::memcpy(&intValue, &hostValue,
sizeof(
float));
41 std::memcpy(&result, &intValue,
sizeof(
float));
78 constexpr std::size_t PACKET_HEADER_SIZE = 7;
92 explicit Serializer(
const std::vector<std::uint8_t> &data)
127 constexpr std::size_t PACKET_HEADER_SIZE = 7;
130 throw std::runtime_error(
"Serializer buffer overflow");
151 writeBytes(&networkValue,
sizeof(networkValue));
161 writeBytes(&networkValue,
sizeof(networkValue));
171 writeBytes(&networkValue,
sizeof(networkValue));
181 if (str.length() > maxLength)
183 throw std::runtime_error(
"String too long for serialization");
186 writeByte(
static_cast<std::uint8_t
>(str.length()));
202 throw std::runtime_error(
"Serializer buffer underflow");
226 std::uint16_t networkValue;
227 readBytes(&networkValue,
sizeof(networkValue));
237 std::uint32_t networkValue;
238 readBytes(&networkValue,
sizeof(networkValue));
249 readBytes(&networkValue,
sizeof(networkValue));
261 if (length > maxLength)
263 throw std::runtime_error(
"String length exceeds maximum");
268 return std::string();
271 std::string result(length,
'\0');
414 for (
const auto &entity : packet.
entities)
431 for (std::uint16_t i = 0; i < packet.
entityCount; ++i)
504 if (!event.
data.empty())
523 event.data.resize(dataLength);
536 for (
const auto &event : events)
549 std::vector<EventRecord> events;
550 std::size_t bytesRead = 0;
557 events.push_back(event);
572 std::uint32_t timestamp)
590 std::uint32_t ×tamp)
610 std::uint8_t mouseButtons, std::uint32_t timestamp)
617 event.entityId = entityId;
618 event.data = inputSerializer.
getData();
634 spawnSerializer.
writeUInt16(
static_cast<std::uint16_t
>(entityType));
640 event.entityId = entityId;
641 event.data = spawnSerializer.
getData();
654 std::uint32_t sourceId = 0)
662 event.entityId = entityId;
663 event.data = damageSerializer.
getData();
681 event.entityId = entityId;
682 event.data = scoreSerializer.
getData();
696 event.entityId = entityId;
716 for (
const auto &playerName : lobbyInfo.
playerNames)
718 writeBytes(
reinterpret_cast<const std::uint8_t *
>(playerName.data()), playerName.size());
740 readBytes(
reinterpret_cast<std::uint8_t *
>(playerName.data()), playerName.size());
753 for (
const auto &lobby : packet.
lobbies)
769 for (std::uint16_t i = 0; i < packet.
lobbyCount; ++i)
This file contains the network protocol.
Utility class for endianness conversion.
static std::uint16_t hostToNetwork16(std::uint16_t hostValue)
static std::uint16_t networkToHost16(std::uint16_t networkValue)
static float networkToHostFloat(float networkValue)
static std::uint32_t hostToNetwork32(std::uint32_t hostValue)
static std::uint32_t networkToHost32(std::uint32_t networkValue)
static float hostToNetworkFloat(float hostValue)
Binary serializer for RNP protocol packets.
EventRecord createDespawnEvent(std::uint32_t entityId)
Create an EventRecord for despawn event.
std::vector< EventRecord > deserializeEntityEvents(std::size_t payloadSize)
Deserialize multiple EventRecords from ENTITY_EVENT packet.
PacketStartGameRequest deserializeStartGameRequest()
Deserialize START_GAME_REQUEST packet.
void serializePingPong(const PacketPingPong &packet)
Serialize PING/PONG packet.
void reset()
Reset the serializer for reuse.
void serializeLobbyCreateResponse(const PacketLobbyCreateResponse &packet)
Serialize LOBBY_CREATE_RESPONSE packet.
void writeBytes(const void *data, std::size_t size)
Write raw bytes.
static EventRecord createDamageEvent(std::uint32_t entityId, std::uint32_t damage, std::uint32_t sourceId=0)
Create an EventRecord for damage event.
EntityState deserializeEntityState()
Deserialize EntityState.
void serializeLobbyInfo(const LobbyInfo &lobbyInfo)
Serialize LobbyInfo structure.
PacketLobbyJoinResponse deserializeLobbyJoinResponse()
Deserialize LOBBY_JOIN_RESPONSE packet.
std::vector< std::uint8_t > buffer_
PacketHeader deserializeHeader()
Deserialize packet header.
PacketConnect deserializeConnect()
Deserialize CONNECT packet.
void serializeLobbyListResponse(const PacketLobbyListResponse &packet)
Serialize LOBBY_LIST_RESPONSE packet.
void writeByte(std::uint8_t value)
Write a single byte.
void readBytes(void *data, std::size_t size)
Read raw bytes.
void writeString(const std::string &str, std::size_t maxLength)
Write a string with length prefix.
void serializeEntityState(const EntityState &entity)
Serialize EntityState.
void serializeStartGameRequest(const PacketStartGameRequest &packet)
Serialize START_GAME_REQUEST packet.
PacketLobbyUpdate deserializeLobbyUpdate()
Deserialize LOBBY_UPDATE packet.
void serializeWorldState(const PacketWorldState &packet)
Serialize WORLD_STATE packet.
PacketError deserializeError()
Deserialize ERROR packet.
void serializeHeader(const PacketHeader &header)
Serialize packet header.
PacketLobbyJoin deserializeLobbyJoin()
Deserialize LOBBY_JOIN packet.
LobbyInfo deserializeLobbyInfo()
Deserialize LobbyInfo structure.
static EventRecord createInputEvent(std::uint32_t entityId, std::uint8_t keys, float mouseX, float mouseY, std::uint8_t mouseButtons, std::uint32_t timestamp)
Create an EventRecord for input data.
PacketConnectAccept deserializeConnectAccept()
Deserialize CONNECT_ACCEPT packet.
void serializeConnectAccept(const PacketConnectAccept &packet)
Serialize CONNECT_ACCEPT packet.
PacketLobbyCreate deserializeLobbyCreate()
Deserialize LOBBY_CREATE packet.
static EventRecord createScoreEvent(std::uint32_t entityId, std::uint32_t score)
Create an EventRecord for score event.
PacketGameStart deserializeGameStart()
Deserialize GAME_START packet.
static EventRecord createSpawnEvent(std::uint32_t entityId, EntityType entityType, float x, float y)
Create an EventRecord for spawn event.
std::uint8_t readByte()
Read a single byte.
void writeUInt16(std::uint16_t value)
Write a 16-bit integer (network byte order)
void serializeLobbyCreate(const PacketLobbyCreate &packet)
Serialize LOBBY_CREATE packet.
void serializeConnect(const PacketConnect &packet)
Serialize CONNECT packet.
void serializeGameStart(const PacketGameStart &packet)
Serialize GAME_START packet.
PacketLobbyListResponse deserializeLobbyListResponse()
Deserialize LOBBY_LIST_RESPONSE packet.
PacketPingPong deserializePingPong()
Deserialize PING/PONG packet.
void writeUInt32(std::uint32_t value)
Write a 32-bit integer (network byte order)
void serializeDisconnect(const PacketDisconnect &packet)
Serialize DISCONNECT packet.
EventRecord deserializeEventRecord()
Deserialize EventRecord from ENTITY_EVENT packets.
PacketWorldState deserializeWorldState()
Deserialize WORLD_STATE packet.
void writeFloat(float value)
Write a float (network byte order)
std::uint16_t readUInt16()
Read a 16-bit integer (network byte order)
Serializer(std::size_t capacity)
Constructor with initial capacity.
void serializeLobbyJoinResponse(const PacketLobbyJoinResponse &packet)
Serialize LOBBY_JOIN_RESPONSE packet.
void deserializeInputData(std::uint8_t &keys, float &mouseX, float &mouseY, std::uint8_t &mouseButtons, std::uint32_t ×tamp)
Deserialize input data from INPUT events.
std::uint32_t readUInt32()
Read a 32-bit integer (network byte order)
std::string readString(std::size_t maxLength)
Read a string with length prefix.
const std::vector< std::uint8_t > & getData() const
Get the serialized data.
void serializeEntityEvents(const std::vector< EventRecord > &events)
Serialize multiple EventRecords for ENTITY_EVENT packet.
float readFloat()
Read a float (network byte order)
void serializeError(const PacketError &packet)
Serialize ERROR packet.
std::size_t getSize() const
Get the current size of serialized data.
void serializeEventRecord(const EventRecord &event)
Serialize EventRecord for ENTITY_EVENT packets.
PacketDisconnect deserializeDisconnect()
Deserialize DISCONNECT packet.
void serializeLobbyJoin(const PacketLobbyJoin &packet)
Serialize LOBBY_JOIN packet.
PacketLobbyCreateResponse deserializeLobbyCreateResponse()
Deserialize LOBBY_CREATE_RESPONSE packet.
Serializer(const std::vector< std::uint8_t > &data)
Constructor from existing data.
void serializeLobbyUpdate(const PacketLobbyUpdate &packet)
Serialize LOBBY_UPDATE packet.
void serializeInputData(std::uint8_t keys, float mouseX, float mouseY, std::uint8_t mouseButtons, std::uint32_t timestamp)
Serialize input data for INPUT events.
EventType
Event types for ENTITY_EVENT packets.
EntityType
Entity types for world state.
constexpr std::size_t MAX_PAYLOAD
Entity state for WORLD_STATE packet.
std::uint8_t healthPercent
Event record for ENTITY_EVENT packets (TLV format)
std::vector< std::uint8_t > data
Lobby information structure.
std::uint32_t hostSessionId
std::array< char, 32 > lobbyName
std::array< std::array< char, 32 >, 8 > playerNames
std::uint8_t currentPlayers
CONNECT_ACCEPT packet payload.
std::uint16_t mtuPayloadBytes
std::array< char, 32 > playerName
DISCONNECT packet payload.
GAME_START packet payload.
LOBBY_CREATE_RESPONSE packet payload.
LOBBY_CREATE packet payload.
std::array< char, 32 > lobbyName
LOBBY_JOIN_RESPONSE packet payload.
LOBBY_JOIN packet payload.
LOBBY_LIST_RESPONSE packet payload.
std::vector< LobbyInfo > lobbies
LOBBY_UPDATE packet payload.
PING/PONG packet payload.
START_GAME_REQUEST packet payload (client requests to start game)
WORLD_STATE packet payload.
std::uint16_t entityCount
std::vector< EntityState > entities