From 70bf3439ab9f3cb826d76111552dcc38678fcf3d Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Sun, 6 Jan 2019 09:23:35 +0000 Subject: [PATCH] Deprecate modpack.txt and use modpack.conf instead (#7892) * Deprecate modpack.txt and use modpack.conf instead --- builtin/mainmenu/dlg_contentstore.lua | 9 ++++- builtin/mainmenu/pkgmgr.lua | 51 ++++++++++++++++++++------- doc/client_lua_api.txt | 8 +++-- doc/lua_api.txt | 10 ++++-- src/content/content.cpp | 8 ++++- src/content/mods.cpp | 12 ++++--- 6 files changed, 75 insertions(+), 23 deletions(-) diff --git a/builtin/mainmenu/dlg_contentstore.lua b/builtin/mainmenu/dlg_contentstore.lua index bab2c73f3..414c26853 100644 --- a/builtin/mainmenu/dlg_contentstore.lua +++ b/builtin/mainmenu/dlg_contentstore.lua @@ -76,10 +76,17 @@ local function start_install(calling_dialog, package) if not path then gamedata.errormessage = msg else + core.log("action", "Installed package to " .. path) + local conf_path local name_is_title = false if result.package.type == "mod" then - conf_path = path .. DIR_DELIM .. "mod.conf" + local actual_type = pkgmgr.get_folder_type(path) + if actual_type.type == "modpack" then + conf_path = path .. DIR_DELIM .. "modpack.conf" + else + conf_path = path .. DIR_DELIM .. "mod.conf" + end elseif result.package.type == "game" then conf_path = path .. DIR_DELIM .. "game.conf" name_is_title = true diff --git a/builtin/mainmenu/pkgmgr.lua b/builtin/mainmenu/pkgmgr.lua index ebd8ece6b..f6015ef72 100644 --- a/builtin/mainmenu/pkgmgr.lua +++ b/builtin/mainmenu/pkgmgr.lua @@ -25,27 +25,46 @@ function get_mods(path,retval,modpack) local toadd = {} retval[#retval + 1] = toadd - local mod_conf = Settings(prefix .. DIR_DELIM .. "mod.conf"):to_table() - if mod_conf.name then - name = mod_conf.name + -- Get config file + local mod_conf + local modpack_conf = io.open(prefix .. DIR_DELIM .. "modpack.conf") + if modpack_conf then + toadd.is_modpack = true + modpack_conf:close() + + mod_conf = Settings(prefix .. DIR_DELIM .. "modpack.conf"):to_table() + if mod_conf.name then + name = mod_conf.name + end + else + mod_conf = Settings(prefix .. DIR_DELIM .. "mod.conf"):to_table() + if mod_conf.name then + name = mod_conf.name + end end + -- Read from config toadd.name = name toadd.author = mod_conf.author toadd.release = tonumber(mod_conf.release or "0") toadd.path = prefix toadd.type = "mod" - if modpack ~= nil and modpack ~= "" then + -- Check modpack.txt + -- Note: modpack.conf is already checked above + local modpackfile = io.open(prefix .. DIR_DELIM .. "modpack.txt") + if modpackfile then + modpackfile:close() + toadd.is_modpack = true + end + + -- Deal with modpack contents + if modpack and modpack ~= "" then toadd.modpack = modpack - else - local modpackfile = io.open(prefix .. DIR_DELIM .. "modpack.txt") - if modpackfile then - modpackfile:close() - toadd.type = "modpack" - toadd.is_modpack = true - get_mods(prefix, retval, name) - end + elseif toadd.is_modpack then + toadd.type = "modpack" + toadd.is_modpack = true + get_mods(prefix, retval, name) end end end @@ -114,6 +133,12 @@ function pkgmgr.get_folder_type(path) return { type = "mod", path = path } end + testfile = io.open(path .. DIR_DELIM .. "modpack.conf","r") + if testfile ~= nil then + testfile:close() + return { type = "modpack", path = path } + end + testfile = io.open(path .. DIR_DELIM .. "modpack.txt","r") if testfile ~= nil then testfile:close() @@ -422,7 +447,7 @@ function pkgmgr.install_dir(type, path, basename, targetpath) else local clean_path = nil if basename ~= nil then - clean_path = "mp_" .. basename + clean_path = basename end if not clean_path then clean_path = get_last_folder(cleanup_path(basefolder.path)) diff --git a/doc/client_lua_api.txt b/doc/client_lua_api.txt index 41560b983..f0e585355 100644 --- a/doc/client_lua_api.txt +++ b/doc/client_lua_api.txt @@ -68,8 +68,12 @@ Modpack support **NOTE: Not implemented yet.** Mods can be put in a subdirectory, if the parent directory, which otherwise -should be a mod, contains a file named `modpack.txt`. This file shall be -empty, except for lines starting with `#`, which are comments. +should be a mod, contains a file named `modpack.conf`. +The file is a key-value store of modpack details. + +* `name`: The modpack name. +* `description`: Description of mod to be shown in the Mods tab of the main + menu. Mod directory structure ------------------------ diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 0b08282a0..a8380e1cc 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -119,8 +119,14 @@ Modpacks -------- Mods can be put in a subdirectory, if the parent directory, which otherwise -should be a mod, contains a file named `modpack.txt`. This file shall be -empty, except for lines starting with `#`, which are comments. +should be a mod, contains a file named `modpack.conf`. +The file is a key-value store of modpack details. + +* `name`: The modpack name. +* `description`: Description of mod to be shown in the Mods tab of the main + menu. + +Note: to support 0.4.x, please also create an empty modpack.txt file. Mod directory structure ----------------------- diff --git a/src/content/content.cpp b/src/content/content.cpp index d7a2c9652..66ef83d42 100644 --- a/src/content/content.cpp +++ b/src/content/content.cpp @@ -41,6 +41,12 @@ ContentType getContentType(const ContentSpec &spec) return ECT_MODPACK; } + std::ifstream modpack2_is((spec.path + DIR_DELIM + "modpack.conf").c_str()); + if (modpack2_is.good()) { + modpack2_is.close(); + return ECT_MODPACK; + } + std::ifstream init_is((spec.path + DIR_DELIM + "init.lua").c_str()); if (init_is.good()) { init_is.close(); @@ -73,7 +79,7 @@ void parseContentInfo(ContentSpec &spec) break; case ECT_MODPACK: spec.type = "modpack"; - conf_path = spec.path + DIR_DELIM + "mod.conf"; + conf_path = spec.path + DIR_DELIM + "modpack.conf"; break; case ECT_GAME: spec.type = "game"; diff --git a/src/content/mods.cpp b/src/content/mods.cpp index a3e706760..3cb168e19 100644 --- a/src/content/mods.cpp +++ b/src/content/mods.cpp @@ -66,12 +66,16 @@ void parseModContents(ModSpec &spec) // Handle modpacks (defined by containing modpack.txt) std::ifstream modpack_is((spec.path + DIR_DELIM + "modpack.txt").c_str()); - if (modpack_is.good()) { // a modpack, recursively get the mods in it - modpack_is.close(); // We don't actually need the file + std::ifstream modpack2_is((spec.path + DIR_DELIM + "modpack.conf").c_str()); + if (modpack_is.good() || modpack2_is.good()) { + if (modpack_is.good()) + modpack_is.close(); + + if (modpack2_is.good()) + modpack2_is.close(); + spec.is_modpack = true; spec.modpack_content = getModsInPath(spec.path, true); - // modpacks have no dependencies; they are defined and - // tracked separately for each mod in the modpack } else { // Attempt to load dependencies from mod.conf