]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - builtin/mainmenu/tab_content.lua
Merge branch 'master' of https://github.com/minetest/minetest
[dragonfireclient.git] / builtin / mainmenu / tab_content.lua
index 5e14d1902efcc506bed6ea9d3ad6638012f76102..a366d4ab4a11e3907c928ebab755903408e384cf 100644 (file)
 local packages_raw
 local packages
 
+local function modname_valid(name)
+       return not name:find("[^a-z0-9_]")
+end
+
 --------------------------------------------------------------------------------
 local function get_formspec(tabview, name, tabdata)
        if pkgmgr.global_mods == nil then
@@ -33,6 +37,7 @@ local function get_formspec(tabview, name, tabdata)
                table.insert_all(packages_raw, pkgmgr.games)
                table.insert_all(packages_raw, pkgmgr.get_texture_packs())
                table.insert_all(packages_raw, pkgmgr.global_mods:get_list())
+               table.insert_all(packages_raw, pkgmgr.clientmods:get_list())
 
                local function get_data()
                        return packages_raw
@@ -45,6 +50,38 @@ local function get_formspec(tabview, name, tabdata)
 
                packages = filterlist.create(get_data, pkgmgr.compare_package,
                                is_equal, nil, {})
+
+               local filename = core.get_clientmodpath() .. DIR_DELIM .. "mods.conf"
+
+               local conffile = Settings(filename)
+               local mods = conffile:to_table()
+
+               for i = 1, #packages_raw do
+                       local mod = packages_raw[i]
+                       if mod.is_clientside and not mod.is_modpack then
+                               if modname_valid(mod.name) then
+                                       conffile:set("load_mod_" .. mod.name,
+                                               mod.enabled and "true" or "false")
+                               elseif mod.enabled then
+                                       gamedata.errormessage = fgettext_ne("Failed to enable clientmo" ..
+                                               "d \"$1\" as it contains disallowed characters. " ..
+                                               "Only characters [a-z0-9_] are allowed.",
+                                               mod.name)
+                               end
+                               mods["load_mod_" .. mod.name] = nil
+                       end
+               end
+
+               -- Remove mods that are not present anymore
+               for key in pairs(mods) do
+                       if key:sub(1, 9) == "load_mod_" then
+                               conffile:remove(key)
+                       end
+               end
+
+               if not conffile:write() then
+                       core.log("error", "Failed to write clientmod config file")
+               end
        end
 
        if tabdata.selected_pkg == nil then
@@ -104,9 +141,21 @@ local function get_formspec(tabview, name, tabdata)
 
                if selected_pkg.type == "mod" then
                        if selected_pkg.is_modpack then
-                               retval = retval ..
-                                       "button[8.65,4.65;3.25,1;btn_mod_mgr_rename_modpack;" ..
-                                       fgettext("Rename") .. "]"
+                               if selected_pkg.is_clientside then
+                                       if pkgmgr.is_modpack_entirely_enabled({list = packages}, selected_pkg.name) then
+                                               retval = retval ..
+                                                       "button[8.65,4.65;3.25,1;btn_mod_mgr_mp_disable;" ..
+                                                       fgettext("Disable modpack") .. "]"
+                                       else
+                                               retval = retval ..
+                                                       "button[8.65,4.65;3.25,1;btn_mod_mgr_mp_enable;" ..
+                                                       fgettext("Enable modpack") .. "]"
+                                       end
+                               else
+                                       retval = retval ..
+                                               "button[8.65,4.65;3.25,1;btn_mod_mgr_rename_modpack;" ..
+                                               fgettext("Rename") .. "]"
+                               end
                        else
                                --show dependencies
                                desc = desc .. "\n\n"
@@ -127,6 +176,17 @@ local function get_formspec(tabview, name, tabdata)
                                                        "\n" .. toadd_soft
                                        end
                                end
+                               if selected_pkg.is_clientside then
+                                       if selected_pkg.enabled then
+                                               retval = retval ..
+                                                       "button[8.65,4.65;3.25,1;btn_mod_mgr_disable_mod;" ..
+                                                       fgettext("Disable") .. "]"
+                                       else
+                                               retval = retval ..
+                                                       "button[8.65,4.65;3.25,1;btn_mod_mgr_enable_mod;" ..
+                                                       fgettext("Enable") .. "]"
+                                       end
+                               end
                        end
 
                else
@@ -156,7 +216,7 @@ local function get_formspec(tabview, name, tabdata)
 end
 
 --------------------------------------------------------------------------------
-local function handle_doubleclick(pkg)
+local function handle_doubleclick(pkg, pkg_name)
        if pkg.type == "txp" then
                if core.settings:get("texture_path") == pkg.path then
                        core.settings:set("texture_path", "")
@@ -167,6 +227,9 @@ local function handle_doubleclick(pkg)
 
                mm_game_theme.init()
                mm_game_theme.reset()
+       elseif pkg.is_clientside then
+               pkgmgr.enable_mod({data = {list = packages, selected_mod = pkg_name}})
+               packages = nil
        end
 end
 
@@ -176,11 +239,27 @@ local function handle_buttons(tabview, fields, tabname, tabdata)
                local event = core.explode_table_event(fields["pkglist"])
                tabdata.selected_pkg = event.row
                if event.type == "DCL" then
-                       handle_doubleclick(packages:get_list()[tabdata.selected_pkg])
+                       handle_doubleclick(packages:get_list()[tabdata.selected_pkg], tabdata.selected_pkg)
                end
                return true
        end
 
+       if fields.btn_mod_mgr_mp_enable ~= nil or
+                       fields.btn_mod_mgr_mp_disable ~= nil then
+               pkgmgr.enable_mod({data = {list = packages, selected_mod = tabdata.selected_pkg}},
+                       fields.btn_mod_mgr_mp_enable ~= nil)
+               packages = nil
+               return true
+       end
+
+       if fields.btn_mod_mgr_enable_mod ~= nil or
+                       fields.btn_mod_mgr_disable_mod ~= nil then
+               pkgmgr.enable_mod({data = {list = packages, selected_mod = tabdata.selected_pkg}},
+                       fields.btn_mod_mgr_enable_mod ~= nil)
+               packages = nil
+               return true
+       end
+
        if fields["btn_contentdb"] ~= nil then
                local dlg = create_store_dlg()
                dlg:set_parent(tabview)