Load media from subfolders (#9065)

master
DS 2020-08-20 22:25:29 +02:00 committed by GitHub
parent 9c7340104a
commit 98faeac5a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 34 additions and 21 deletions

View 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
------------------

Binary file not shown.

After

Width:  |  Height:  |  Size: 829 B

View File

@ -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.

View 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);
}
}

View 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");
}
}

View 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);
}