From: PilzAdam Date: Sat, 18 May 2013 15:00:47 +0000 (+0200) Subject: New modsystem X-Git-Url: http://81.2.79.47:8989/gitweb/?a=commitdiff_plain;h=45fcc9de29de762e8dde20a50db4a3184c830e42;p=zefram%2Fminetest%2Fminetest_engine.git New modsystem Mods are placed in $path_/mods They can be enabled per world in world.mt or the configure world window --- diff --git a/doc/lua_api.txt b/doc/lua_api.txt index cd90b5aa..b7be5020 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -60,9 +60,9 @@ Mod load path ------------- Generic: $path_share/games/gameid/mods/ - $path_share/mods/gameid/ + $path_share/mods/ $path_user/games/gameid/mods/ - $path_user/mods/gameid/ <-- User-installed mods + $path_user/mods/ <-- User-installed mods $worldpath/worldmods/ In a run-in-place version (eg. the distributed windows version): diff --git a/mods/minetest/mods_here.txt b/mods/minetest/mods_here.txt deleted file mode 100644 index 5135cb94..00000000 --- a/mods/minetest/mods_here.txt +++ /dev/null @@ -1 +0,0 @@ -You can install Minetest mods by copying (and extracting) them into this folder. diff --git a/mods/mods_here.txt b/mods/mods_here.txt new file mode 100644 index 00000000..e105fbd1 --- /dev/null +++ b/mods/mods_here.txt @@ -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_ = true +in world.mt in the world directory. diff --git a/src/guiConfigureWorld.cpp b/src/guiConfigureWorld.cpp index f94ed7d1..e33e87ef 100644 --- a/src/guiConfigureWorld.cpp +++ b/src/guiConfigureWorld.cpp @@ -116,40 +116,18 @@ GUIConfigureWorld::GUIConfigureWorld(gui::IGUIEnvironment* env, // mod_names if(!mod.is_modpack && 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) - std::set missing_mods; for(std::set::iterator it = mod_names.begin(); it != mod_names.end(); ++it) { std::string modname = *it; 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::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() @@ -388,11 +366,6 @@ bool GUIConfigureWorld::OnEvent(const SEvent& event) return true; } case GUI_ID_SAVE: { - for(std::set::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"; m_settings.updateConfigFile(worldmtfile.c_str()); @@ -558,22 +531,14 @@ void GUIConfigureWorld::buildTreeView(std::map mods, buildTreeView(mod.modpack_content, new_node); else { - // set icon for node: ? for new mods, x for disabled mods, - // checkmark for enabled mods - if(m_new_mod_names.count(modname) > 0) - { - new_node->setIcon(QUESTIONMARK_STR); - } + // set icon for node: x for disabled mods, checkmark for enabled mods + bool mod_enabled = false; + if(m_settings.exists("load_mod_"+modname)) + mod_enabled = m_settings.getBool("load_mod_"+modname); + if(mod_enabled) + new_node->setIcon(CHECKMARK_STR); else - { - 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); - } + new_node->setIcon(CROSS_STR); } } } @@ -690,7 +655,6 @@ void GUIConfigureWorld::enableMod(std::string modname) m_nodes.find(modname); if(it != m_nodes.end()) (*it).second->setIcon(CHECKMARK_STR); - m_new_mod_names.erase(modname); //also enable all dependencies for(std::set::iterator it=mspec.depends.begin(); it != mspec.depends.end(); ++it) @@ -715,7 +679,6 @@ void GUIConfigureWorld::disableMod(std::string modname) m_nodes.find(modname); if(it != m_nodes.end()) (*it).second->setIcon(CROSS_STR); - m_new_mod_names.erase(modname); //also disable all mods that depend on this one std::pair::iterator, std::multimap::iterator > rdep = diff --git a/src/guiConfigureWorld.h b/src/guiConfigureWorld.h index 8a77c5f8..23ebac66 100644 --- a/src/guiConfigureWorld.h +++ b/src/guiConfigureWorld.h @@ -69,9 +69,6 @@ private: // the settings in the world.mt file Settings m_settings; - // mods that are installed but not mentioned in world.mt file - std::set m_new_mod_names; - // maps modnames to nodes in m_treeview std::map m_nodes; diff --git a/src/subgame.cpp b/src/subgame.cpp index cdb54661..7fee3899 100644 --- a/src/subgame.cpp +++ b/src/subgame.cpp @@ -91,9 +91,9 @@ SubgameSpec findSubgame(const std::string &id) // Find mod directories std::set mods_paths; 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) - mods_paths.insert(user + DIR_DELIM + "mods" + DIR_DELIM + id); + mods_paths.insert(user + DIR_DELIM + "mods"); std::string game_name = getGameName(game_path); if(game_name == "") game_name = id;