summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/lua_api.txt24
-rw-r--r--games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass.pngbin0 -> 829 bytes
-rw-r--r--games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass_side.png (renamed from games/devtest/mods/basenodes/textures/default_grass_side.png)bin796 -> 796 bytes
-rw-r--r--games/devtest/mods/basenodes/textures/dirt_with_grass/info.txt3
-rw-r--r--src/server.cpp16
-rw-r--r--src/server/mods.cpp10
-rw-r--r--src/unittest/test_servermodmanager.cpp2
7 files changed, 34 insertions, 21 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 49fbe0d94..9770ae4a9 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -152,7 +152,11 @@ Mod directory structure
│   ├── models
│   ├── textures
│   │   ├── modname_stuff.png
- │   │   └── modname_something_else.png
+ │   │   ├── modname_something_else.png
+ │   │   ├── subfolder_foo
+ │   │   │ ├── modname_more_stuff.png
+ │   │   │ └── another_subfolder
+ │   │   └── bar_subfolder
│   ├── sounds
│   ├── media
│   ├── locale
@@ -221,18 +225,20 @@ registered callbacks.
`minetest.settings` can be used to read custom or existing settings at load
time, if necessary. (See [`Settings`])
-### `models`
-
-Models for entities or meshnodes.
-
-### `textures`, `sounds`, `media`
+### `textures`, `sounds`, `media`, `models`, `locale`
Media files (textures, sounds, whatever) that will be transferred to the
-client and will be available for use by the mod.
+client and will be available for use by the mod and translation files for
+the clients (see [Translations]).
-### `locale`
+It is suggested to use the folders for the purpous they are thought for,
+eg. put textures into `textures`, translation files into `locale`,
+models for entities or meshnodes into `models` et cetera.
-Translation files for the clients. (See [Translations])
+These folders and subfolders can contain subfolders.
+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.
Naming conventions
------------------
diff --git a/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass.png b/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass.png
new file mode 100644
index 000000000..29fde6b26
--- /dev/null
+++ b/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass.png
Binary files differ
diff --git a/games/devtest/mods/basenodes/textures/default_grass_side.png b/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass_side.png
index 04770b6f6..04770b6f6 100644
--- a/games/devtest/mods/basenodes/textures/default_grass_side.png
+++ b/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass_side.png
Binary files differ
diff --git a/games/devtest/mods/basenodes/textures/dirt_with_grass/info.txt b/games/devtest/mods/basenodes/textures/dirt_with_grass/info.txt
new file mode 100644
index 000000000..8db21ed9c
--- /dev/null
+++ b/games/devtest/mods/basenodes/textures/dirt_with_grass/info.txt
@@ -0,0 +1,3 @@
+This is for testing loading textures from subfolders.
+If it works correctly, the default_grass_side.png file in this folder is used but
+default_grass.png is not overwritten by the file in this folder.
diff --git a/src/server.cpp b/src/server.cpp
index 53ee8c444..ef36aedca 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -2494,19 +2494,25 @@ void Server::fillMediaCache()
// Collect all media file paths
std::vector<std::string> paths;
- m_modmgr->getModsMediaPaths(paths);
- fs::GetRecursiveDirs(paths, m_gamespec.path + DIR_DELIM + "textures");
+ // The paths are ordered in descending priority
fs::GetRecursiveDirs(paths, porting::path_user + DIR_DELIM + "textures" + DIR_DELIM + "server");
+ fs::GetRecursiveDirs(paths, m_gamespec.path + DIR_DELIM + "textures");
+ m_modmgr->getModsMediaPaths(paths);
// Collect media file information from paths into cache
for (const std::string &mediapath : paths) {
std::vector<fs::DirListNode> dirlist = fs::GetDirListing(mediapath);
for (const fs::DirListNode &dln : dirlist) {
- if (dln.dir) // Ignore dirs
+ if (dln.dir) // Ignore dirs (already in paths)
continue;
+
+ const std::string &filename = dln.name;
+ if (m_media.find(filename) != m_media.end()) // Do not override
+ continue;
+
std::string filepath = mediapath;
- filepath.append(DIR_DELIM).append(dln.name);
- addMediaFile(dln.name, filepath);
+ filepath.append(DIR_DELIM).append(filename);
+ addMediaFile(filename, filepath);
}
}
diff --git a/src/server/mods.cpp b/src/server/mods.cpp
index 6ac530739..cf1467648 100644
--- a/src/server/mods.cpp
+++ b/src/server/mods.cpp
@@ -99,10 +99,10 @@ void ServerModManager::getModNames(std::vector<std::string> &modlist) const
void ServerModManager::getModsMediaPaths(std::vector<std::string> &paths) const
{
for (const ModSpec &spec : m_sorted_mods) {
- paths.push_back(spec.path + DIR_DELIM + "textures");
- paths.push_back(spec.path + DIR_DELIM + "sounds");
- paths.push_back(spec.path + DIR_DELIM + "media");
- paths.push_back(spec.path + DIR_DELIM + "models");
- paths.push_back(spec.path + DIR_DELIM + "locale");
+ fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "textures");
+ fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "sounds");
+ fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "media");
+ fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "models");
+ fs::GetRecursiveDirs(paths, spec.path + DIR_DELIM + "locale");
}
}
diff --git a/src/unittest/test_servermodmanager.cpp b/src/unittest/test_servermodmanager.cpp
index 799936757..e3edb0c32 100644
--- a/src/unittest/test_servermodmanager.cpp
+++ b/src/unittest/test_servermodmanager.cpp
@@ -169,6 +169,4 @@ void TestServerModManager::testGetModMediaPaths()
std::vector<std::string> result;
sm.getModsMediaPaths(result);
UASSERTEQ(bool, result.empty(), false);
- // We should have 5 folders for each mod (textures, media, locale, model, sounds)
- UASSERTEQ(unsigned long, result.size() % 5, 0);
}