R-Type
Distributed multiplayer game engine in C++
Loading...
Searching...
No Matches
RoomState.hpp
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2025
3** RoomState.hpp - Room state with player list
4*/
5
6#pragma once
7
8#include <capnp/message.h>
9#include <capnp/serialize.h>
10#include <string>
11#include <vector>
12#include "schemas/s2c_messages.capnp.h"
13
14namespace RType::Messages::S2C {
15
16 struct PlayerData {
17 uint32_t playerId;
18 std::string playerName;
19 bool isHost;
21
22 PlayerData() = default;
23 PlayerData(uint32_t id, const std::string &name, bool host, bool spectator)
24 : playerId(id), playerName(name), isHost(host), isSpectator(spectator) {}
25 };
26
27 class RoomState {
28 public:
29 std::string roomId;
30 std::string roomName;
32 uint32_t maxPlayers;
33 std::vector<PlayerData> players;
34 uint8_t state;
35
36 RoomState() = default;
37
38 std::vector<uint8_t> serialize() const {
39 ::capnp::MallocMessageBuilder message;
40 auto builder = message.initRoot<::RoomState>();
41
42 builder.setRoomId(roomId);
43 builder.setRoomName(roomName);
44 builder.setCurrentPlayers(currentPlayers);
45 builder.setMaxPlayers(maxPlayers);
46 builder.setState(state);
47
48 auto playersList = builder.initPlayers(players.size());
49 for (size_t i = 0; i < players.size(); ++i) {
50 auto playerBuilder = playersList[i];
51 playerBuilder.setPlayerId(players[i].playerId);
52 playerBuilder.setPlayerName(players[i].playerName);
53 playerBuilder.setIsHost(players[i].isHost);
54 playerBuilder.setIsSpectator(players[i].isSpectator);
55 }
56
57 kj::VectorOutputStream output;
58 ::capnp::writeMessage(output, message);
59 auto data = output.getArray();
60 return std::vector<uint8_t>(data.begin(), data.end());
61 }
62
63 static RoomState deserialize(const std::vector<uint8_t> &data) {
64 if (data.empty()) {
65 throw std::runtime_error("Cannot deserialize RoomState from empty data");
66 }
67
68 kj::ArrayPtr<const ::capnp::word> words(reinterpret_cast<const ::capnp::word *>(data.data()),
69 data.size() / sizeof(::capnp::word));
70
71 ::capnp::FlatArrayMessageReader reader(words);
72 auto msg = reader.getRoot<::RoomState>();
73
74 RoomState result;
75 result.roomId = msg.getRoomId().cStr();
76 result.roomName = msg.getRoomName().cStr();
77 result.currentPlayers = msg.getCurrentPlayers();
78 result.maxPlayers = msg.getMaxPlayers();
79 result.state = msg.getState();
80
81 auto playersList = msg.getPlayers();
82 result.players.reserve(playersList.size());
83 for (auto playerMsg : playersList) {
84 PlayerData player;
85 player.playerId = playerMsg.getPlayerId();
86 player.playerName = playerMsg.getPlayerName().cStr();
87 player.isHost = playerMsg.getIsHost();
88 player.isSpectator = playerMsg.getIsSpectator();
89 result.players.push_back(player);
90 }
91
92 return result;
93 }
94 };
95
96} // namespace RType::Messages::S2C
std::vector< uint8_t > serialize() const
Definition RoomState.hpp:38
std::vector< PlayerData > players
Definition RoomState.hpp:33
static RoomState deserialize(const std::vector< uint8_t > &data)
Definition RoomState.hpp:63
Server-to-Client messages.
Definition Server.hpp:34
PlayerData(uint32_t id, const std::string &name, bool host, bool spectator)
Definition RoomState.hpp:23