10#include <capnp/message.h>
11#include <capnp/serialize.h>
14#include <unordered_map>
16#include "schemas/s2c_messages.capnp.h"
87 [[nodiscard]]
bool hasGamerule(
const std::string &key)
const {
97 [[nodiscard]]
float getGamerule(
const std::string &key,
float defaultValue = 0.0f)
const {
99 return (it !=
gamerules.end()) ? it->second : defaultValue;
118 capnp::MallocMessageBuilder message;
122 auto gamerulesBuilder = builder.initGamerules(
static_cast<unsigned int>(
gamerules.size()));
124 for (
const auto &[key, value] :
gamerules) {
125 auto gameruleBuilder = gamerulesBuilder[i];
126 gameruleBuilder.setKey(key);
127 gameruleBuilder.setValue(value);
131 auto bytes = capnp::messageToFlatArray(message);
132 auto byteArray = bytes.asBytes();
133 return std::vector(byteArray.begin(), byteArray.end());
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));
150 capnp::FlatArrayMessageReader message(words);
157 for (
auto gameruleReader : gamerarulesReader) {
158 std::string key = gameruleReader.getKey().cStr();
159 float value = gameruleReader.getValue();
160 result.addGamerule(key, value);
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.
A single gamerule key-value pair.
Gamerule(const std::string &k, float v)