1
0
Fork 0
Univerxel/src/server/world/Chunk.hpp

57 lines
2.2 KiB
C++

#pragma once
#include "core/world/EdittableChunk.hpp"
#include <memory>
#include "core/world/generator/Abstract.hpp"
namespace world::server {
using fill_edits = robin_hood::unordered_map<chunk_pos, std::vector<world::ChunkEdits::Edit>>;
/// Server side chunk
class Chunk: public world::EdittableChunk {
public:
Chunk(owner<world::ChunkEdits*>);
Chunk(owner<world::ChunkEdits*>, const chunk_pos &pos, const std::unique_ptr<generator::Abstract> &rnd);
Chunk(owner<world::ChunkEdits*>, 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<Item> 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<Chunk> create(const chunk_pos &pos, const std::unique_ptr<generator::Abstract> &rnd) const = 0;
/// Dynamic chunk from stream
virtual std::shared_ptr<Chunk> create(std::istream &str) const = 0;
/// Light void chunk
virtual std::shared_ptr<Chunk> create() const = 0;
};
/// Build for server only chunk
/// Not really edittable (get/set)Edits will fail
struct StandaloneChunkFactory final: public ChunkFactory {
std::shared_ptr<Chunk> create(const chunk_pos &pos, const std::unique_ptr<generator::Abstract> &rnd) const override {
return std::make_shared<Chunk>(nullptr, pos, rnd);
}
std::shared_ptr<Chunk> create(std::istream &str) const override { return std::make_shared<Chunk>(nullptr, str); }
std::shared_ptr<Chunk> create() const override { return std::make_shared<Chunk>(nullptr); }
};
}