From 99c8295e71eb86333ae21b1083b6f55fb9479565 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20M=C3=BCller?= <34514239+appgurueu@users.noreply.github.com> Date: Fri, 29 Jul 2022 10:19:36 +0200 Subject: [PATCH] Fix media overriding regression (#12602) --- src/server/mods.cpp | 6 +++++- src/unittest/test_servermodmanager.cpp | 8 ++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/server/mods.cpp b/src/server/mods.cpp index ac4181e4d..0e9bf4911 100644 --- a/src/server/mods.cpp +++ b/src/server/mods.cpp @@ -94,7 +94,11 @@ void ServerModManager::getModNames(std::vector &modlist) const void ServerModManager::getModsMediaPaths(std::vector &paths) const { - for (const auto &spec : configuration.getMods()) { + // Iterate mods in reverse load order: Media loading expects higher priority media files first + // and mods loading later should be able to override media of already loaded mods + const auto mods = configuration.getMods(); + for (auto it = mods.crbegin(); it != 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/unittest/test_servermodmanager.cpp b/src/unittest/test_servermodmanager.cpp index 4c473d8b5..91bf5d3a4 100644 --- a/src/unittest/test_servermodmanager.cpp +++ b/src/unittest/test_servermodmanager.cpp @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "server/mods.h" #include "settings.h" #include "test_config.h" +#include "util/string.h" class TestServerModManager : public TestBase { @@ -190,4 +191,11 @@ void TestServerModManager::testGetModMediaPaths() std::vector result; sm.getModsMediaPaths(result); UASSERTEQ(bool, result.empty(), false); + + // Test media overriding: + // unittests depends on basenodes to override default_dirt.png, + // thus the unittests texture path must come first in the returned media paths to take priority + auto it = std::find(result.begin(), result.end(), sm.getModSpec("unittests")->path + DIR_DELIM + "textures"); + UASSERT(it != result.end()); + UASSERT(std::find(++it, result.end(), sm.getModSpec("basenodes")->path + DIR_DELIM + "textures") != result.end()); }