#ifndef VOXELS_CHUNK_HPP_ #define VOXELS_CHUNK_HPP_ #include #include #include #include "voxel.hpp" #include "../constants.hpp" #include "../lighting/Lightmap.hpp" inline constexpr int CHUNK_DATA_LEN = CHUNK_VOL*4; class Lightmap; class ContentLUT; class Inventory; namespace dynamic { class Map; } using chunk_inventories_map = std::unordered_map>; class Chunk { public: int x, z; int bottom, top; voxel voxels[CHUNK_VOL] {}; Lightmap lightmap; struct { bool modified: 1; bool ready: 1; bool loaded: 1; bool lighted: 1; bool unsaved: 1; bool loadedLights: 1; bool entities: 1; } flags {}; /// @brief Block inventories map where key is index of block in voxels array chunk_inventories_map inventories; Chunk(int x, int z); bool isEmpty(); void updateHeights(); // unused std::unique_ptr clone() const; /// @brief Creates new block inventory given size /// @return inventory id or 0 if block does not exists void addBlockInventory( std::shared_ptr inventory, uint x, uint y, uint z ); void removeBlockInventory(uint x, uint y, uint z); void setBlockInventories(chunk_inventories_map map); /// @return inventory bound to the given block or nullptr std::shared_ptr getBlockInventory(uint x, uint y, uint z) const; inline void setModifiedAndUnsaved() { flags.modified = true; flags.unsaved = true; } std::unique_ptr encode() const; /// @return true if all is fine bool decode(const ubyte* data); static void convert(ubyte* data, const ContentLUT* lut); }; #endif /* VOXELS_CHUNK_HPP_ */