Fix media overriding regression (#12602)

This commit is contained in:
Lars Müller 2022-07-29 10:19:36 +02:00 committed by GitHub
parent 6611d7e1ee
commit 99c8295e71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 1 deletions

@ -94,7 +94,11 @@ void ServerModManager::getModNames(std::vector<std::string> &modlist) const
void ServerModManager::getModsMediaPaths(std::vector<std::string> &paths) const void ServerModManager::getModsMediaPaths(std::vector<std::string> &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 + "textures");
fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "sounds"); fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "sounds");
fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "media"); fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "media");

@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "server/mods.h" #include "server/mods.h"
#include "settings.h" #include "settings.h"
#include "test_config.h" #include "test_config.h"
#include "util/string.h"
class TestServerModManager : public TestBase class TestServerModManager : public TestBase
{ {
@ -190,4 +191,11 @@ void TestServerModManager::testGetModMediaPaths()
std::vector<std::string> result; std::vector<std::string> result;
sm.getModsMediaPaths(result); sm.getModsMediaPaths(result);
UASSERTEQ(bool, result.empty(), false); 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());
} }