From 4abe4b87b5902bff229505b83b9bddb9a8f759cd Mon Sep 17 00:00:00 2001 From: DS Date: Tue, 23 Feb 2021 19:39:15 +0100 Subject: [PATCH] Allow overwriting media files of dependencies (#10752) --- doc/lua_api.txt | 3 +++ .../mods/basenodes/textures/default_dirt.png | Bin 790 -> 7303 bytes .../textures/dirt_with_grass/info.txt | 3 --- games/devtest/mods/basenodes/textures/info.txt | 7 +++++++ games/devtest/mods/unittests/mod.conf | 1 + .../mods/unittests/textures/default_dirt.png | Bin 0 -> 790 bytes src/server/mods.cpp | 3 ++- src/server/mods.h | 8 ++++++++ 8 files changed, 21 insertions(+), 4 deletions(-) delete mode 100644 games/devtest/mods/basenodes/textures/dirt_with_grass/info.txt create mode 100644 games/devtest/mods/basenodes/textures/info.txt create mode 100644 games/devtest/mods/unittests/textures/default_dirt.png diff --git a/doc/lua_api.txt b/doc/lua_api.txt index a9c3bcdd9..d3165b9fd 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -256,6 +256,9 @@ Subfolders with names starting with `_` or `.` are ignored. If a subfolder contains a media file with the same name as a media file in one of its parents, the parent's file is used. +Although it is discouraged, a mod can overwrite a media file of any mod that it +depends on by supplying a file with an equal name. + Naming conventions ------------------ diff --git a/games/devtest/mods/basenodes/textures/default_dirt.png b/games/devtest/mods/basenodes/textures/default_dirt.png index 58670305d007716c3fee12b45e8acf301cbd4c5a..aa75bffb6459d1415a2f146f0da636fbcc94c253 100644 GIT binary patch literal 7303 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 UYvInCO8@`>07*qoM6N<$f@__Gg8%>k literal 0 HcmV?d00001 diff --git a/src/server/mods.cpp b/src/server/mods.cpp index cf1467648..83fa12da9 100644 --- a/src/server/mods.cpp +++ b/src/server/mods.cpp @@ -98,7 +98,8 @@ void ServerModManager::getModNames(std::vector &modlist) const void ServerModManager::getModsMediaPaths(std::vector &paths) const { - for (const ModSpec &spec : m_sorted_mods) { + for (auto it = m_sorted_mods.crbegin(); it != m_sorted_mods.crend(); it++) { + const ModSpec &spec = *it; fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "textures"); fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "sounds"); fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "media"); diff --git a/src/server/mods.h b/src/server/mods.h index 54774bd86..8954bbf72 100644 --- a/src/server/mods.h +++ b/src/server/mods.h @@ -42,5 +42,13 @@ class ServerModManager : public ModConfiguration void loadMods(ServerScripting *script); const ModSpec *getModSpec(const std::string &modname) const; void getModNames(std::vector &modlist) const; + /** + * Recursively gets all paths of mod folders that can contain media files. + * + * Result is ordered in descending priority, ie. files from an earlier path + * should not be replaced by files from a latter one. + * + * @param paths result vector + */ void getModsMediaPaths(std::vector &paths) const; }; -- 2.44.0