diff --git a/CMakeLists.txt b/CMakeLists.txt index a78b9ff8d..f3ea38b5e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -721,9 +721,9 @@ FetchContent_Declare (storm FetchContent_GetProperties (storm) if (NOT storm_POPULATED) message (STATUS "Installing StormLib...") - FetchContent_Populate (storm) + FetchContent_MakeAvailable (storm) endif() -add_subdirectory (${storm_SOURCE_DIR} ${storm_BINARY_DIR} EXCLUDE_FROM_ALL) + set (storm_warning_disable_flags "") add_local_compiler_flag_if_supported (-Wno-implicit-function-declaration storm_warning_disable_flags) target_compile_options (storm PRIVATE ${storm_warning_disable_flags}) @@ -738,9 +738,8 @@ if (NOGGIT_WITH_SCRIPTING) FetchContent_GetProperties (json) if (NOT json_POPULATED) message (STATUS "Installing json.hpp...") - FetchContent_Populate (json) + FetchContent_MakeAvailable (json) endif() - add_subdirectory (${json_SOURCE_DIR} ${json_BINARY_DIR} EXCLUDE_FROM_ALL) # Dependency: lodepng FetchContent_Declare (lodepng @@ -750,7 +749,7 @@ if (NOGGIT_WITH_SCRIPTING) FetchContent_GetProperties (lodepng) if (NOT lodepng_POPULATED) message (STATUS "Installing lodepng...") - FetchContent_Populate (lodepng) + FetchContent_MakeAvailable (lodepng) endif() add_library (lodepng "${lodepng_SOURCE_DIR}/lodepng.cpp") target_include_directories (lodepng SYSTEM PUBLIC ${lodepng_SOURCE_DIR}) @@ -767,13 +766,7 @@ if (NOGGIT_WITH_SCRIPTING) FetchContent_GetProperties (fastnoise2) if (NOT fastnoise2_POPULATED) message (STATUS "Installing FastNoise2... (big repo, large download)") - FetchContent_Populate (fastnoise2) - endif() - - if (FASTNOISE2_NOISETOOL) - add_subdirectory (${fastnoise2_SOURCE_DIR} ${fastnoise2_BINARY_DIR}) - else() - add_subdirectory (${fastnoise2_SOURCE_DIR} ${fastnoise2_BINARY_DIR} EXCLUDE_FROM_ALL) + FetchContent_MakeAvailable (fastnoise2) endif() # Dependency: Lua diff --git a/src/noggit/MPQ.cpp b/src/noggit/MPQ.cpp index 140949c30..d566cc743 100644 --- a/src/noggit/MPQ.cpp +++ b/src/noggit/MPQ.cpp @@ -180,7 +180,7 @@ MPQFile::MPQFile(std::string const& filename) : eof(true) , pointer(0) , External(false) - , _filename(noggit::mpq::normalized_filename(filename)) + , _filename(filename) , _disk_path (getDiskPath (_filename)) { if (filename.empty()) @@ -358,5 +358,26 @@ namespace noggit ); return filename; } + std::string uni_path (std::string filename) + { + try + { + // Check without normalization + std::filesystem::path local_path(getDiskPath(filename)); + + if (std::filesystem::exists(local_path) || existsInMPQ (filename)) + { + return filename; + } + else + { + return normalized_filename(filename); + } + } + catch (const std::exception& e) + { + throw std::runtime_error ("Error! File " + filename + " does not exists"); + } + } } } diff --git a/src/noggit/MPQ.h b/src/noggit/MPQ.h index fbabe2f5f..325226410 100644 --- a/src/noggit/MPQ.h +++ b/src/noggit/MPQ.h @@ -107,5 +107,6 @@ namespace noggit { std::string normalized_filename (std::string filename); std::string normalized_filename_insane (std::string filename); + std::string uni_path (std::string filename); } } diff --git a/src/noggit/World.cpp b/src/noggit/World.cpp index d15f62cc2..ac9b6cd0c 100644 --- a/src/noggit/World.cpp +++ b/src/noggit/World.cpp @@ -58,7 +58,7 @@ bool World::IsEditableWorld(int pMapId) } std::stringstream ssfilename; - ssfilename << "World\\Maps\\" << lMapName << "\\" << lMapName << ".wdt"; + ssfilename << noggit::mpq::uni_path("World/Maps/" + lMapName + "/" + lMapName + ".wdt"); if (!MPQFile::exists(ssfilename.str())) { diff --git a/src/noggit/map_horizon.cpp b/src/noggit/map_horizon.cpp index 2063d88e0..7ddddee0a 100644 --- a/src/noggit/map_horizon.cpp +++ b/src/noggit/map_horizon.cpp @@ -92,7 +92,7 @@ namespace noggit map_horizon::map_horizon(const std::string& basename, const MapIndex * const index) { std::stringstream filename; - filename << "World\\Maps\\" << basename << "\\" << basename << ".wdl"; + filename << noggit::mpq::uni_path("World/Maps/" + basename + "/" + basename + ".wdl"); _filename = filename.str(); if (!MPQFile::exists(_filename)) diff --git a/src/noggit/map_index.cpp b/src/noggit/map_index.cpp index 85d64cccd..12946efd5 100644 --- a/src/noggit/map_index.cpp +++ b/src/noggit/map_index.cpp @@ -32,7 +32,7 @@ MapIndex::MapIndex (const std::string &pBasename, int map_id, World* world) _loading_radius = NoggitSettings.value("loading_radius", 1).toInt(); std::stringstream filename; - filename << "World\\Maps\\" << basename << "\\" << basename << ".wdt"; + filename << noggit::mpq::uni_path("World/Maps/" + basename + "/" + basename + ".wdt"); MPQFile theFile(filename.str()); @@ -87,7 +87,7 @@ MapIndex::MapIndex (const std::string &pBasename, int map_id, World* world) theFile.seekRelative(4); std::stringstream adt_filename; - adt_filename << "World\\Maps\\" << basename << "\\" << basename << "_" << i << "_" << j << ".adt"; + adt_filename << noggit::mpq::uni_path("World/Maps/" + basename + "/" + basename + "_" + std::to_string(i) + "_" + std::to_string(j) + ".adt"); mTiles[j][i].tile = nullptr; mTiles[j][i].onDisc = MPQFile::existsOnDisk(adt_filename.str()); @@ -149,7 +149,7 @@ void MapIndex::saveall (World* world) void MapIndex::save() { std::stringstream filename; - filename << "World\\Maps\\" << basename << "\\" << basename << ".wdt"; + filename << noggit::mpq::uni_path("World/Maps/" + basename + "/" + basename + ".wdt"); //NOGGIT_LOG << "Saving WDT \"" << filename << "\"." << std::endl; @@ -317,7 +317,7 @@ MapTile* MapIndex::loadTile(const tile_index& tile, bool reloading) } std::stringstream filename; - filename << "World\\Maps\\" << basename << "\\" << basename << "_" << tile.x << "_" << tile.z << ".adt"; + filename << noggit::mpq::uni_path("World/Maps/" + basename + "/" + basename + "_" + std::to_string(tile.x) + "_" + std::to_string(tile.z) + ".adt"); if (!MPQFile::exists(filename.str())) { @@ -610,7 +610,7 @@ uid_fix_status MapIndex::fixUIDs (World* world, bool cancel_on_model_loading_err } std::stringstream filename; - filename << "World\\Maps\\" << basename << "\\" << basename << "_" << x << "_" << z << ".adt"; + filename << noggit::mpq::uni_path("World/Maps/" + basename + "/" + basename + "_" + std::to_string(x) + "_" + std::to_string(z) + ".adt"); if (!MPQFile::exists(filename.str())) { @@ -860,7 +860,7 @@ uid_fix_status MapIndex::fixUIDs (World* world, bool cancel_on_model_loading_err // that shouldn't be there to avoid creating new duplicates std::stringstream filename; - filename << "World\\Maps\\" << basename << "\\" << basename << "_" << x << "_" << z << ".adt"; + filename << noggit::mpq::uni_path("World/Maps/" + basename + "/" + basename + "_" + std::to_string(x) + "_" + std::to_string(z) + ".adt"); // load the tile without the models MapTile tile(x, z, filename.str(), mBigAlpha, false, use_mclq_green_lava(), false, world, tile_mode::uid_fix_all); @@ -900,7 +900,7 @@ void MapIndex::searchMaxUID() } std::stringstream filename; - filename << "World\\Maps\\" << basename << "\\" << basename << "_" << x << "_" << z << ".adt"; + filename << noggit::mpq::uni_path("World/Maps/" + basename + "/" + basename + "_" + std::to_string(x) + "_" + std::to_string(z) + ".adt"); highestGUID = std::max(highestGUID, getHighestGUIDFromFile(filename.str())); } }