R-Type
Distributed multiplayer game engine in C++
Loading...
Searching...
No Matches
GamerulePacket.hpp
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2025
3** Created on 07/01/2026.
4** File description:
5** GamerulePacket.hpp
6*/
7
8#pragma once
9
10#include <capnp/message.h>
11#include <capnp/serialize.h>
12#include <cstdint>
13#include <string>
14#include <unordered_map>
15#include <vector>
16#include "schemas/s2c_messages.capnp.h"
17
18namespace RType::Messages::S2C {
19
27 struct Gamerule {
28 std::string key;
29 float value;
30
31 Gamerule() : value(0.0f) {}
32 Gamerule(const std::string &k, float v) : key(k), value(v) {}
33 };
34
60 public:
61 GamerulePacket() = default;
62
68 void addGamerule(const std::string &key, float value) { gamerules[key] = value; }
69
74 void addGamerule(const Gamerule &gamerule) { gamerules[gamerule.key] = gamerule.value; }
75
80 [[nodiscard]] const std::unordered_map<std::string, float> &getGamerules() const { return gamerules; }
81
87 [[nodiscard]] bool hasGamerule(const std::string &key) const {
88 return gamerules.find(key) != gamerules.end();
89 }
90
97 [[nodiscard]] float getGamerule(const std::string &key, float defaultValue = 0.0f) const {
98 auto it = gamerules.find(key);
99 return (it != gamerules.end()) ? it->second : defaultValue;
100 }
101
105 void clear() { gamerules.clear(); }
106
111 [[nodiscard]] size_t size() const { return gamerules.size(); }
112
117 [[nodiscard]] std::vector<uint8_t> serialize() const {
118 capnp::MallocMessageBuilder message;
119 auto builder = message.initRoot<::GamerulePacket>();
120
121 // Build gamerules list
122 auto gamerulesBuilder = builder.initGamerules(static_cast<unsigned int>(gamerules.size()));
123 unsigned int i = 0;
124 for (const auto &[key, value] : gamerules) {
125 auto gameruleBuilder = gamerulesBuilder[i];
126 gameruleBuilder.setKey(key);
127 gameruleBuilder.setValue(value);
128 ++i;
129 }
130
131 auto bytes = capnp::messageToFlatArray(message);
132 auto byteArray = bytes.asBytes();
133 return std::vector(byteArray.begin(), byteArray.end());
134 }
135
141 static GamerulePacket deserialize(const std::vector<uint8_t> &data) {
142 // Ensure buffer is word-aligned for Cap'n Proto (undefined behavior if not)
143 KJ_REQUIRE(data.size() % sizeof(capnp::word) == 0,
144 "Serialized data size must be a multiple of capnp::word");
145 auto aligned = kj::heapArray<uint8_t>(data.size());
146 memcpy(aligned.begin(), data.data(), data.size());
147 kj::ArrayPtr words(reinterpret_cast<const capnp::word *>(aligned.begin()),
148 data.size() / sizeof(capnp::word));
149
150 capnp::FlatArrayMessageReader message(words);
151 auto reader = message.getRoot<::GamerulePacket>();
152
153 GamerulePacket result;
154
155 // Deserialize gamerules list
156 auto gamerarulesReader = reader.getGamerules();
157 for (auto gameruleReader : gamerarulesReader) {
158 std::string key = gameruleReader.getKey().cStr();
159 float value = gameruleReader.getValue();
160 result.addGamerule(key, value);
161 }
162
163 return result;
164 }
165
166 private:
167 std::unordered_map<std::string, float> gamerules;
168 };
169
170} // namespace RType::Messages::S2C
Packet containing gamerule updates from server to client.
const std::unordered_map< std::string, float > & getGamerules() const
Get all gamerules.
bool hasGamerule(const std::string &key) const
Check if packet contains a specific gamerule.
void addGamerule(const std::string &key, float value)
Add a gamerule to the packet.
std::vector< uint8_t > serialize() const
Serialize the packet to bytes using Cap'n Proto.
void clear()
Clear all gamerules from the packet.
static GamerulePacket deserialize(const std::vector< uint8_t > &data)
Deserialize a packet from bytes using Cap'n Proto.
size_t size() const
Get the number of gamerules in the packet.
float getGamerule(const std::string &key, float defaultValue=0.0f) const
Get a specific gamerule value.
void addGamerule(const Gamerule &gamerule)
Add a gamerule struct to the packet.
std::unordered_map< std::string, float > gamerules
Server-to-Client messages.
Definition Server.hpp:34
A single gamerule key-value pair.
Gamerule(const std::string &k, float v)