From 143cce9fe220254ac52272291327c8e9eb55ab61 Mon Sep 17 00:00:00 2001 From: afaure42 Date: Fri, 15 Nov 2024 12:05:28 +0100 Subject: [PATCH] little bit of cleaning --- src/app/world/Save/Save.cpp | 8 ++--- src/app/world/Save/Save.hpp | 22 ++++++++++++-- src/app/world/Save/SaveRegion.cpp | 50 ++++++++++++++++++------------- 3 files changed, 52 insertions(+), 28 deletions(-) diff --git a/src/app/world/Save/Save.cpp b/src/app/world/Save/Save.cpp index ae76c2b1..89ada30a 100644 --- a/src/app/world/Save/Save.cpp +++ b/src/app/world/Save/Save.cpp @@ -10,15 +10,15 @@ Save::Save() if (std::filesystem::exists(m_save_dir)) initRegions(); else - ret = std::filesystem::create_directories(m_save_dir); - if (ret == false) - throw std::runtime_error("Save: Save: error creating save directory: " + m_save_dir.string()); + { + if(!std::filesystem::create_directories(m_save_dir)) + throw std::runtime_error("Save: Save: error creating save directory: " + m_save_dir.string()); + } } Save::Save(const std::filesystem::path & path) :m_save_dir(path) { - bool ret = false; initRegions(); } diff --git a/src/app/world/Save/Save.hpp b/src/app/world/Save/Save.hpp index 9f20bd1f..59698284 100644 --- a/src/app/world/Save/Save.hpp +++ b/src/app/world/Save/Save.hpp @@ -93,6 +93,22 @@ class Save */ static size_t getOffsetIndex(const glm::ivec2 & position); + /** + * @brief converts a region pos to a filname with the format r.x.z.ftmc + * + * @param position + * @return std::string + */ + static std::string toFilename(const glm::ivec2 & position); + + /** + * @brief extracts the region position from a filename + * + * @param path + * @return glm::ivec2 + */ + static glm::ivec2 nameToRegionPos(const std::filesystem::path & path); + Region( const std::filesystem::path & region_dir, const glm::ivec2 & position); @@ -163,9 +179,9 @@ class Save }; std::unordered_map m_offsets; - void parseOffsets(); - void clearOffsets(); - void writeOffsets(); + void parseOffsetsTable(); + void clearOffsetsTable(); + void writeOffsetsTable(); void writeChunks(); void load(); void readChunk(const glm::ivec2 & relative_position); diff --git a/src/app/world/Save/SaveRegion.cpp b/src/app/world/Save/SaveRegion.cpp index f4560853..1469e682 100644 --- a/src/app/world/Save/SaveRegion.cpp +++ b/src/app/world/Save/SaveRegion.cpp @@ -23,6 +23,26 @@ static inline size_t byteSize(size_t size) return size * 4096; } +std::string Save::Region::toFilename(const glm::ivec2 & position) +{ + return "r." + std::to_string(position.x) + "." + std::to_string(position.y) + ".ftmc"; +} + +glm::ivec2 Save::Region::nameToRegionPos(const std::filesystem::path & path) +{ + std::string name = path.filename().string(); + //name format is r.x.z.ftmc + //todo check format + name = name.substr(2); //remove r + name = name.substr(0, name.find_last_of('.')); //remove extension + + //now we have x.z + std::string x = name.substr(0, name.find('.')); + std::string z = name.substr(name.find('.') + 1); + + return {std::stoi(x), std::stoi(z)}; +} + glm::ivec2 Save::toRegionPos( glm::ivec3 chunkPos3D) { glm::ivec2 ret; @@ -53,9 +73,7 @@ Save::Region::Region( { //create filename - std::string filename = "r." - + std::to_string(m_position.x) + "." - + std::to_string(m_position.y) + ".ftmc"; + std::string filename = toFilename(position); m_path = region_dir / filename; @@ -73,22 +91,12 @@ Save::Region::Region(std::filesystem::path file_path) : m_path(file_path) { //parse position - std::string name = file_path.filename().string(); - //name format is r.x.z.ftmc - //todo check format - name = name.substr(2); //remove r - name = name.substr(0, name.find_last_of('.')); //remove extension - - //now we have x.z - std::string x = name.substr(0, name.find('.')); - std::string z = name.substr(name.find('.') + 1); - - m_position = glm::ivec2(std::stoi(x), std::stoi(z)); + m_position = nameToRegionPos(m_path); if (std::filesystem::file_size(m_path) < 8192) throw CorruptedFileException("Save: Region: file too small"); openFile(); - parseOffsets(); + parseOffsetsTable(); file.close(); } @@ -122,22 +130,22 @@ Save::Region::~Region() void Save::Region::save() { openFile(); - clearOffsets(); + clearOffsetsTable(); writeChunks(); - writeOffsets(); + writeOffsetsTable(); m_chunks.clear(); m_loaded = false; file.close(); } -void Save::Region::clearOffsets() +void Save::Region::clearOffsetsTable() { file.seekp(0); file.write(std::string(8192, '\0').c_str(), 8192); } -void Save::Region::writeOffsets() +void Save::Region::writeOffsetsTable() { std::array table_buffer = {}; char buffer[8]; @@ -159,7 +167,7 @@ void Save::Region::writeOffsets() throw std::runtime_error("Save: Region: WriteOffsets: error writing"); } -void Save::Region::parseOffsets() +void Save::Region::parseOffsetsTable() { // read all 1024 offsets ( 32 * 32 ) char buffer[8]; @@ -259,7 +267,7 @@ void Save::Region::addChunk(const std::shared_ptr & chunk) void Save::Region::load() { openFile(); - parseOffsets(); + parseOffsetsTable(); for(auto & [pos, offset] : m_offsets) readChunk(pos); m_loaded = true;