forked from Mirrorlandia_minetest/minetest
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:
parent
6074163bf3
commit
45fcc9de29
@ -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
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())
|
|
||||||
{
|
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
|
std::string worldmtfile = m_wspec.path+DIR_DELIM+"world.mt";
|
||||||
|
m_settings.updateConfigFile(worldmtfile.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
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,15 +531,8 @@ 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)
|
|
||||||
{
|
|
||||||
new_node->setIcon(QUESTIONMARK_STR);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bool mod_enabled = true;
|
|
||||||
if(m_settings.exists("load_mod_"+modname))
|
if(m_settings.exists("load_mod_"+modname))
|
||||||
mod_enabled = m_settings.getBool("load_mod_"+modname);
|
mod_enabled = m_settings.getBool("load_mod_"+modname);
|
||||||
if(mod_enabled)
|
if(mod_enabled)
|
||||||
@ -576,7 +542,6 @@ void GUIConfigureWorld::buildTreeView(std::map<std::string, ModSpec> mods,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void GUIConfigureWorld::adjustSidebar()
|
void GUIConfigureWorld::adjustSidebar()
|
||||||
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user