#pragma once #include "./Chunk.hpp" #include "core/world/EdittableChunk.hpp" namespace world::server { // Server and Client merged chunk class SharedChunk final: public Chunk { public: SharedChunk(): Chunk(new world::ChunkEdits(this)) { } SharedChunk(const chunk_pos &pos, const std::unique_ptr &rnd): Chunk(new world::ChunkEdits(this), pos, rnd) { } SharedChunk(std::istream &str): Chunk(new world::ChunkEdits(this), str) { } /// Break voxel std::optional replace(chunk_voxel_idx idx, const Voxel &val, float delay = 0) override { const auto res = get(idx); set(idx, val); if (res.value != get(idx).value) { setEdits()->add(world::ChunkEdits::Edit{res, delay, idx}); } return {Item{res.density(), res.material()}}; } }; /// Build really EdittableChunk for internal client struct SharedChunkFactory final: public ChunkFactory { std::shared_ptr create(const chunk_pos &pos, const std::unique_ptr &rnd) const override { return std::make_shared(pos, rnd); } std::shared_ptr create(std::istream &str) const override { return std::make_shared(str); } std::shared_ptr create() const override { return std::make_shared(); } }; }