#pragma once #include "core/world/EdittableChunk.hpp" #include #include "core/world/generator/Abstract.hpp" namespace world::server { using fill_edits = robin_hood::unordered_map>; /// Server side chunk class Chunk: public world::EdittableChunk { public: Chunk(owner); Chunk(owner, const chunk_pos &pos, const std::unique_ptr &rnd); Chunk(owner, std::istream& str); virtual ~Chunk(); /// Set voxel from index void set(chunk_voxel_idx idx, const Voxel& val); /// Set voxel from position void setAt(const chunk_voxel_pos& pos, const Voxel& val); /// Break voxel virtual std::optional replace(chunk_voxel_idx idx, const Voxel &val, float delay = 0); /// Is player modified inline bool isModified() const { return modified; } /// Write to file and return average (majorant material) /// Voxel swap bit indicate perfect majority Voxel write(std::ostream& str) const; private: /// Modified by player bool modified = false; }; struct ChunkFactory { /// Dynamic chunk using rnd virtual std::shared_ptr create(const chunk_pos &pos, const std::unique_ptr &rnd) const = 0; /// Dynamic chunk from stream virtual std::shared_ptr create(std::istream &str) const = 0; /// Light void chunk virtual std::shared_ptr create() const = 0; }; /// Build for server only chunk /// Not really edittable (get/set)Edits will fail struct StandaloneChunkFactory final: public ChunkFactory { std::shared_ptr create(const chunk_pos &pos, const std::unique_ptr &rnd) const override { return std::make_shared(nullptr, pos, rnd); } std::shared_ptr create(std::istream &str) const override { return std::make_shared(nullptr, str); } std::shared_ptr create() const override { return std::make_shared(nullptr); } }; }