From 1cc08c51eb4b0f95c30c0a98ad1fc5ad3459b2df Mon Sep 17 00:00:00 2001 From: Nicolas James Date: Wed, 12 Feb 2025 18:05:18 +1100 Subject: initial commit --- src/server/world.cc | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/server/world.cc (limited to 'src/server/world.cc') diff --git a/src/server/world.cc b/src/server/world.cc new file mode 100644 index 0000000..6527d6c --- /dev/null +++ b/src/server/world.cc @@ -0,0 +1,53 @@ +#include "server/world.hh" + +namespace server { +namespace world { + +proto::packet chunk::make_chunk_packet() const noexcept { + + proto::packet ret_packet; + + auto chunk_packet = ret_packet.mutable_chunk_packet(); + + auto chunk_pos = chunk_packet->mutable_chunk_pos(); + const shared::math::coords this_chunk_pos = this->get_pos(); + chunk_pos->set_x(this_chunk_pos.x); + chunk_pos->set_z(this_chunk_pos.z); + + // Since protobuf can store at minimum uint32, we mash four of our + // uint_8 chunk blocks into a single uint32. + static_assert(shared::world::chunk::VOLUME % 4 == 0); + for (unsigned i = 0u; i < shared::world::chunk::VOLUME / 4u; ++i) { + std::uint32_t packed_blocks = 0u; + + for (unsigned j = 0; j < 4; ++j) { + const auto block = + static_cast(this->blocks[i * 4 + j].type); + packed_blocks |= static_cast(block << j * 8); + } + + chunk_packet->add_blocks(packed_blocks); + } + + return ret_packet; +} + +static std::optional +maybe_get_blocks(const shared::math::coords& coords) { + const auto chunk = database::maybe_read_chunk(coords); + if (!chunk.has_value()) { + return std::nullopt; + } + return shared::world::chunk::make_blocks_from_chunk(chunk.value()); +} + +chunk::chunk(const std::uint64_t& seed, + const shared::math::coords& coords) noexcept + : shared::world::chunk(seed, coords, maybe_get_blocks(coords)) { + this->update(); +} + +chunk::~chunk() noexcept { this->write(); } + +} // namespace world +} // namespace server -- cgit v1.2.3