#pragma once #include "BlockPos.h" #include "ZlibDecompressor.h" #include #include #include class MapBlock { public: MapBlock() = default; ~MapBlock() = default; MapBlock(const BlockPos &pos, const std::vector &data) { setPos(pos); setData(data); } MapBlock(const BlockPos &pos, const unsigned char *data, std::size_t size) { setPos(pos); setData(data,size); } MapBlock(const BlockPos &pos, const void *data, std::size_t size) { setPos(pos); setData(data, size); } void reset() { nodeId2NodeName.clear(); //mapData.clear(); empty = true; version = 0; } const std::unordered_map &getMappings() const { return nodeId2NodeName; } const BlockPos &getPos() const { return pos; } //const std::vector &getMapData() const { return mapData; } int getVersion() const { return version; } bool isEmpty() const { return empty; } void setData(const std::vector &data); void setData(const unsigned char * data, size_t size); inline void setData(const void * data, size_t size) { setData(static_cast(data), size); } void setPos(const BlockPos &p) { pos = p; } int readBlockContent(int datapos) const; bool onlyAir() const { return nodeId2NodeName.size() == 1 && nodeId2NodeName.at(0) == "air"; } // not shure if this will be true a single time. Why should minetest generate a mapblock and fill it with ignore only? bool onlyIgnore() const { return nodeId2NodeName.size() == 1 && nodeId2NodeName.at(0) == "ignore"; } private: std::unordered_map nodeId2NodeName; //std::vector mapData; std::array mapData; BlockPos pos; int version = 0; bool empty = true; void deserialize(const unsigned char * data, size_t length); void deserialize(const std::vector &vdata); void checkBlockNodeDataLimit(); };