diff options
| author | Nicolas James <Eele1Ephe7uZahRie@tutanota.com> | 2025-02-12 18:05:18 +1100 |
|---|---|---|
| committer | Nicolas James <Eele1Ephe7uZahRie@tutanota.com> | 2025-02-12 18:05:18 +1100 |
| commit | 1cc08c51eb4b0f95c30c0a98ad1fc5ad3459b2df (patch) | |
| tree | 222dfcd07a1e40716127a347bbfd7119ce3d0984 /src/server/world.cc | |
initial commit
Diffstat (limited to 'src/server/world.cc')
| -rw-r--r-- | src/server/world.cc | 53 |
1 files changed, 53 insertions, 0 deletions
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<std::uint8_t>(this->blocks[i * 4 + j].type); + packed_blocks |= static_cast<unsigned>(block << j * 8); + } + + chunk_packet->add_blocks(packed_blocks); + } + + return ret_packet; +} + +static std::optional<shared::world::chunk::block_array> +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 |
