New modsystem

Mods are placed in $path_<user/share>/mods
They can be enabled per world in world.mt or the configure world window
This commit is contained in:
PilzAdam 2013-05-18 17:00:47 +02:00
parent 6074163bf3
commit 45fcc9de29
6 changed files with 19 additions and 56 deletions

@ -60,9 +60,9 @@ Mod load path
------------- -------------
Generic: Generic:
$path_share/games/gameid/mods/ $path_share/games/gameid/mods/
$path_share/mods/gameid/ $path_share/mods/
$path_user/games/gameid/mods/ $path_user/games/gameid/mods/
$path_user/mods/gameid/ <-- User-installed mods $path_user/mods/ <-- User-installed mods
$worldpath/worldmods/ $worldpath/worldmods/
In a run-in-place version (eg. the distributed windows version): In a run-in-place version (eg. the distributed windows version):

@ -1 +0,0 @@
You can install Minetest mods by copying (and extracting) them into this folder.

4
mods/mods_here.txt Normal file

@ -0,0 +1,4 @@
You can install Minetest mods by copying (and extracting) them into this folder.
To enable them, go to the configure world window in the main menu or write
load_mod_<modname> = true
in world.mt in the world directory.

@ -116,40 +116,18 @@ GUIConfigureWorld::GUIConfigureWorld(gui::IGUIEnvironment* env,
// mod_names // mod_names
if(!mod.is_modpack && if(!mod.is_modpack &&
mod_names.count(modname) == 0) mod_names.count(modname) == 0)
m_new_mod_names.insert(modname); m_settings.setBool("load_mod_"+modname, false);
} }
if(!m_new_mod_names.empty())
{
wchar_t* text = wgettext("Warning: Some mods are not configured yet.\n"
"They will be enabled by default when you save the configuration. ");
GUIMessageMenu *menu =
new GUIMessageMenu(Environment, Parent, -1, m_menumgr, text);
menu->drop();
delete[] text;
}
// find missing mods (mentioned in world.mt, but not installed) // find missing mods (mentioned in world.mt, but not installed)
std::set<std::string> missing_mods;
for(std::set<std::string>::iterator it = mod_names.begin(); for(std::set<std::string>::iterator it = mod_names.begin();
it != mod_names.end(); ++it) it != mod_names.end(); ++it)
{ {
std::string modname = *it; std::string modname = *it;
if(m_addonmods.count(modname) == 0) if(m_addonmods.count(modname) == 0)
missing_mods.insert(modname); m_settings.remove("load_mod_"+modname);
} }
if(!missing_mods.empty()) std::string worldmtfile = m_wspec.path+DIR_DELIM+"world.mt";
{ m_settings.updateConfigFile(worldmtfile.c_str());
wchar_t* text = wgettext("Warning: Some configured mods are missing.\n"
"Their setting will be removed when you save the configuration. ");
GUIMessageMenu *menu =
new GUIMessageMenu(Environment, Parent, -1, m_menumgr, text);
delete[] text;
for(std::set<std::string>::iterator it = missing_mods.begin();
it != missing_mods.end(); ++it)
m_settings.remove("load_mod_"+(*it));
menu->drop();
}
} }
void GUIConfigureWorld::drawMenu() void GUIConfigureWorld::drawMenu()
@ -388,11 +366,6 @@ bool GUIConfigureWorld::OnEvent(const SEvent& event)
return true; return true;
} }
case GUI_ID_SAVE: { case GUI_ID_SAVE: {
for(std::set<std::string>::iterator it = m_new_mod_names.begin();
it!= m_new_mod_names.end(); ++it)
{
m_settings.setBool("load_mod_"+(*it),true);
}
std::string worldmtfile = m_wspec.path+DIR_DELIM+"world.mt"; std::string worldmtfile = m_wspec.path+DIR_DELIM+"world.mt";
m_settings.updateConfigFile(worldmtfile.c_str()); m_settings.updateConfigFile(worldmtfile.c_str());
@ -558,22 +531,14 @@ void GUIConfigureWorld::buildTreeView(std::map<std::string, ModSpec> mods,
buildTreeView(mod.modpack_content, new_node); buildTreeView(mod.modpack_content, new_node);
else else
{ {
// set icon for node: ? for new mods, x for disabled mods, // set icon for node: x for disabled mods, checkmark for enabled mods
// checkmark for enabled mods bool mod_enabled = false;
if(m_new_mod_names.count(modname) > 0) if(m_settings.exists("load_mod_"+modname))
{ mod_enabled = m_settings.getBool("load_mod_"+modname);
new_node->setIcon(QUESTIONMARK_STR); if(mod_enabled)
} new_node->setIcon(CHECKMARK_STR);
else else
{ new_node->setIcon(CROSS_STR);
bool mod_enabled = true;
if(m_settings.exists("load_mod_"+modname))
mod_enabled = m_settings.getBool("load_mod_"+modname);
if(mod_enabled)
new_node->setIcon(CHECKMARK_STR);
else
new_node->setIcon(CROSS_STR);
}
} }
} }
} }
@ -690,7 +655,6 @@ void GUIConfigureWorld::enableMod(std::string modname)
m_nodes.find(modname); m_nodes.find(modname);
if(it != m_nodes.end()) if(it != m_nodes.end())
(*it).second->setIcon(CHECKMARK_STR); (*it).second->setIcon(CHECKMARK_STR);
m_new_mod_names.erase(modname);
//also enable all dependencies //also enable all dependencies
for(std::set<std::string>::iterator it=mspec.depends.begin(); for(std::set<std::string>::iterator it=mspec.depends.begin();
it != mspec.depends.end(); ++it) it != mspec.depends.end(); ++it)
@ -715,7 +679,6 @@ void GUIConfigureWorld::disableMod(std::string modname)
m_nodes.find(modname); m_nodes.find(modname);
if(it != m_nodes.end()) if(it != m_nodes.end())
(*it).second->setIcon(CROSS_STR); (*it).second->setIcon(CROSS_STR);
m_new_mod_names.erase(modname);
//also disable all mods that depend on this one //also disable all mods that depend on this one
std::pair<std::multimap<std::string, std::string>::iterator, std::pair<std::multimap<std::string, std::string>::iterator,
std::multimap<std::string, std::string>::iterator > rdep = std::multimap<std::string, std::string>::iterator > rdep =

@ -69,9 +69,6 @@ private:
// the settings in the world.mt file // the settings in the world.mt file
Settings m_settings; Settings m_settings;
// mods that are installed but not mentioned in world.mt file
std::set<std::string> m_new_mod_names;
// maps modnames to nodes in m_treeview // maps modnames to nodes in m_treeview
std::map<std::string,gui::IGUITreeViewNode*> m_nodes; std::map<std::string,gui::IGUITreeViewNode*> m_nodes;

@ -91,9 +91,9 @@ SubgameSpec findSubgame(const std::string &id)
// Find mod directories // Find mod directories
std::set<std::string> mods_paths; std::set<std::string> mods_paths;
if(!user_game) if(!user_game)
mods_paths.insert(share + DIR_DELIM + "mods" + DIR_DELIM + id); mods_paths.insert(share + DIR_DELIM + "mods");
if(user != share || user_game) if(user != share || user_game)
mods_paths.insert(user + DIR_DELIM + "mods" + DIR_DELIM + id); mods_paths.insert(user + DIR_DELIM + "mods");
std::string game_name = getGameName(game_path); std::string game_name = getGameName(game_path);
if(game_name == "") if(game_name == "")
game_name = id; game_name = id;