]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Load media from subfolders (#9065)
authorDS <vorunbekannt75@web.de>
Thu, 20 Aug 2020 20:25:29 +0000 (22:25 +0200)
committerGitHub <noreply@github.com>
Thu, 20 Aug 2020 20:25:29 +0000 (22:25 +0200)
doc/lua_api.txt
games/devtest/mods/basenodes/textures/default_grass_side.png [deleted file]
games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass.png [new file with mode: 0644]
games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass_side.png [new file with mode: 0644]
games/devtest/mods/basenodes/textures/dirt_with_grass/info.txt [new file with mode: 0644]
src/server.cpp
src/server/mods.cpp
src/unittest/test_servermodmanager.cpp

index 49fbe0d94de9e4537c27dbd3ba58a50c105fcb52..9770ae4a9d58385bd27a34398584f34f78eb2f56 100644 (file)
@@ -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/default_grass_side.png b/games/devtest/mods/basenodes/textures/default_grass_side.png
deleted file mode 100644 (file)
index 04770b6..0000000
Binary files a/games/devtest/mods/basenodes/textures/default_grass_side.png and /dev/null differ
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 (file)
index 0000000..29fde6b
Binary files /dev/null and b/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass.png differ
diff --git a/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass_side.png b/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass_side.png
new file mode 100644 (file)
index 0000000..04770b6
Binary files /dev/null and b/games/devtest/mods/basenodes/textures/dirt_with_grass/default_grass_side.png 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 (file)
index 0000000..8db21ed
--- /dev/null
@@ -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.
index 53ee8c444612b991311af3920b39a4465a64c990..ef36aedcaf58f820d3487686fff2917acae6ce6d 100644 (file)
@@ -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);
                }
        }
 
index 6ac530739bde5f109b6b8f58c16ba3ba3c3ccd45..cf14676480472ee49654b1823c11594104b94179 100644 (file)
@@ -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");
        }
 }
index 79993675780e808aebfdcf683bbf36906785e240..e3edb0c32f6fadc6e32d5c209f33156f26c39b71 100644 (file)
@@ -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);
 }