summaryrefslogtreecommitdiff
path: root/src/mods.cpp
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2013-03-21 18:48:21 +0200
committerPerttu Ahola <celeron55@gmail.com>2013-03-21 18:56:42 +0200
commit306d1ab866a3ce820e95f4faf805684cd4122ae4 (patch)
tree0cc350601b241216e9a05f4460d6f6c4009fc3d1 /src/mods.cpp
parent9b5bb5c7559953db40b52dead3c85e1a1245b4f1 (diff)
downloadminetest-306d1ab866a3ce820e95f4faf805684cd4122ae4.tar.gz
minetest-306d1ab866a3ce820e95f4faf805684cd4122ae4.tar.bz2
minetest-306d1ab866a3ce820e95f4faf805684cd4122ae4.zip
Common mods support
Implement "common mods", includeable from {$user,$share}/games/common/$modname by using the game.conf setting common_mods = $modname,$modname2,...
Diffstat (limited to 'src/mods.cpp')
-rw-r--r--src/mods.cpp52
1 files changed, 50 insertions, 2 deletions
diff --git a/src/mods.cpp b/src/mods.cpp
index ac2d9b17d..6a7ab79aa 100644
--- a/src/mods.cpp
+++ b/src/mods.cpp
@@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "log.h"
#include "subgame.h"
#include "settings.h"
+#include "strfnd.h"
std::map<std::string, ModSpec> getModsInPath(std::string path)
{
@@ -188,11 +189,58 @@ void ModConfiguration::addMods(std::vector<ModSpec> new_mods)
}
}
+// If failed, returned modspec has name==""
+static ModSpec findCommonMod(const std::string &modname)
+{
+ // Try to find in {$user,$share}/games/common/$modname
+ std::vector<std::string> find_paths;
+ find_paths.push_back(porting::path_user + DIR_DELIM + "games" +
+ DIR_DELIM + "common" + DIR_DELIM + "mods" + DIR_DELIM + modname);
+ find_paths.push_back(porting::path_share + DIR_DELIM + "games" +
+ DIR_DELIM + "common" + DIR_DELIM + "mods" + DIR_DELIM + modname);
+ for(u32 i=0; i<find_paths.size(); i++){
+ const std::string &try_path = find_paths[i];
+ if(fs::PathExists(try_path))
+ return ModSpec(modname, try_path);
+ }
+ // Failed to find mod
+ return ModSpec();
+}
+
ModConfiguration::ModConfiguration(std::string worldpath)
{
+ SubgameSpec gamespec = findWorldSubgame(worldpath);
+
+ // Add common mods without dependency handling
+ std::vector<std::string> inexistent_common_mods;
+ Settings gameconf;
+ if(getGameConfig(gamespec.path, gameconf)){
+ if(gameconf.exists("common_mods")){
+ Strfnd f(gameconf.get("common_mods"));
+ while(!f.atend()){
+ std::string modname = trim(f.next(","));
+ if(modname.empty())
+ continue;
+ ModSpec spec = findCommonMod(modname);
+ if(spec.name.empty())
+ inexistent_common_mods.push_back(modname);
+ else
+ m_sorted_mods.push_back(spec);
+ }
+ }
+ }
+ if(!inexistent_common_mods.empty()){
+ std::string s = "Required common mods ";
+ for(u32 i=0; i<inexistent_common_mods.size(); i++){
+ if(i != 0) s += ", ";
+ s += std::string("\"") + inexistent_common_mods[i] + "\"";
+ }
+ s += " could not be found.";
+ throw ModError(s);
+ }
+
// Add all world mods and all game mods
addModsInPath(worldpath + DIR_DELIM + "worldmods");
- SubgameSpec gamespec = findWorldSubgame(worldpath);
addModsInPath(gamespec.gamemods_path);
// check world.mt file for mods explicitely declared to be
@@ -217,6 +265,6 @@ ModConfiguration::ModConfiguration(std::string worldpath)
}
for(std::set<std::string>::const_iterator i = gamespec.addon_mods_paths.begin();
- i != gamespec.addon_mods_paths.end(); ++i)
+ i != gamespec.addon_mods_paths.end(); ++i)
addModsInPathFiltered((*i),exclude_mod_names);
}