diff --git a/res/layouts/pages/content.xml.lua b/res/layouts/pages/content.xml.lua index 3f1903f3..50288d17 100644 --- a/res/layouts/pages/content.xml.lua +++ b/res/layouts/pages/content.xml.lua @@ -181,8 +181,9 @@ function check_dependencies(packinfo) return end for i,dep in ipairs(packinfo.dependencies) do - local depid = dep:sub(2,-1) - if dep:sub(1,1) == '!' then + local depid, depver = unpack(string.split(dep:sub(2,-1), "@")) + + if dep:sub(1,1) == '!' then if not table.has(packs_all, depid) then return string.format( "%s (%s)", gui.str("error.dependency-not-found"), depid @@ -192,6 +193,14 @@ function check_dependencies(packinfo) table.insert(required, depid) end end + + local dep_pack = pack.get_info(depid); + + if depver ~= "*" or depver ~= dep_pack.version then + return string.format("%s (%s@%s != %s)", gui.str("error.dependency-version-not-met"), depid, dep_pack.version, depver); + end + + debug.print(packinfo); end return end diff --git a/res/texts/en_US.txt b/res/texts/en_US.txt index 57a6cb6b..267566cd 100644 --- a/res/texts/en_US.txt +++ b/res/texts/en_US.txt @@ -7,6 +7,7 @@ world.convert-block-layouts=Blocks fields have changes! Convert world files? pack.remove-confirm=Do you want to erase all pack(s) content from the world forever? error.pack-not-found=Could not to find pack error.dependency-not-found=Dependency pack is not found +error.dependency-version-not-met=Dependency pack version is not met. world.delete-confirm=Do you want to delete world forever? world.generators.default=Default world.generators.flat=Flat diff --git a/res/texts/ru_RU.txt b/res/texts/ru_RU.txt index d2d7c63e..f7f11a36 100644 --- a/res/texts/ru_RU.txt +++ b/res/texts/ru_RU.txt @@ -32,6 +32,7 @@ devtools.output=Вывод error.pack-not-found=Не удалось найти пакет error.dependency-not-found=Используемая зависимость не найдена +error.dependency-version-not-met=Версия зависимости не соответствует необходимой pack.remove-confirm=Удалить весь поставляемый паком/паками контент из мира (безвозвратно)? # Подсказки diff --git a/src/content/ContentPack.cpp b/src/content/ContentPack.cpp index ac8c8d59..8c3ea541 100644 --- a/src/content/ContentPack.cpp +++ b/src/content/ContentPack.cpp @@ -132,7 +132,15 @@ ContentPack ContentPack::read(const io::path& folder) { level = DependencyLevel::weak; break; } - pack.dependencies.push_back({level, depName}); + + std::string depVersion = "*"; + size_t version_pos = depName.rfind("@"); + if (version_pos != std::string::npos){ + depVersion = depName.substr(version_pos + 1); + depName = depName.substr(0, version_pos); + } + + pack.dependencies.push_back({level, depName, depVersion}); } } diff --git a/src/content/ContentPack.hpp b/src/content/ContentPack.hpp index f4e44801..f8bc760c 100644 --- a/src/content/ContentPack.hpp +++ b/src/content/ContentPack.hpp @@ -35,6 +35,7 @@ enum class DependencyLevel { struct DependencyPack { DependencyLevel level; std::string id; + std::string verison; }; struct ContentPackStats { diff --git a/src/content/PacksManager.cpp b/src/content/PacksManager.cpp index 0e9925c8..76cc54d7 100644 --- a/src/content/PacksManager.cpp +++ b/src/content/PacksManager.cpp @@ -105,6 +105,14 @@ static bool resolve_dependencies( // added continue; } + if (dep.verison == "*" || dep.verison == found->second.version){ + // dependency pack version mets the required one + continue; + } else { + throw contentpack_error( + dep.id, io::path(), "does not meet required version '" + dep.verison +"' of '" + pack->id + "'" + ); + } if (!util::contains(allNames, dep.id) && dep.level != DependencyLevel::weak) { diff --git a/src/logic/scripting/lua/libs/libpack.cpp b/src/logic/scripting/lua/libs/libpack.cpp index adc45096..be38fcb2 100644 --- a/src/logic/scripting/lua/libs/libpack.cpp +++ b/src/logic/scripting/lua/libs/libpack.cpp @@ -114,7 +114,8 @@ static int l_pack_get_info( default: throw std::runtime_error(""); } - lua::pushfstring(L, "%s%s", prefix.c_str(), dpack.id.c_str()); + + lua::pushfstring(L, "%s%s@%s", prefix.c_str(), dpack.id.c_str(), dpack.verison.c_str()); lua::rawseti(L, i + 1); } lua::setfield(L, "dependencies");