]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - builtin/mainmenu/dlg_config_world.lua
Don't ignore server disconnects in client code
[dragonfireclient.git] / builtin / mainmenu / dlg_config_world.lua
index 1a1107c24a4d1d06ef57c8bd0996a455e9d05995..f73256612068e70ed6ff9e1cbbe5c10187873b5d 100644 (file)
@@ -23,7 +23,49 @@ local function modname_valid(name)
        return not name:find("[^a-z0-9_]")
 end
 
+local function init_data(data)
+       data.list = filterlist.create(
+               pkgmgr.preparemodlist,
+               pkgmgr.comparemod,
+               function(element, uid)
+                       if element.name == uid then
+                               return true
+                       end
+               end,
+               function(element, criteria)
+                       if criteria.hide_game and
+                                       element.is_game_content then
+                               return false
+                       end
+
+                       if criteria.hide_modpackcontents and
+                                       element.modpack ~= nil then
+                               return false
+                       end
+                       return true
+               end,
+               {
+                       worldpath = data.worldspec.path,
+                       gameid = data.worldspec.gameid
+               })
+
+       if data.selected_mod > data.list:size() then
+               data.selected_mod = 0
+       end
+
+       data.list:set_filtercriteria({
+               hide_game = data.hide_gamemods,
+               hide_modpackcontents = data.hide_modpackcontents
+       })
+       data.list:add_sort_mechanism("alphabetic", sort_mod_list)
+       data.list:set_sortmode("alphabetic")
+end
+
 local function get_formspec(data)
+       if not data.list then
+               init_data(data)
+       end
+
        local mod = data.list:get_list()[data.selected_mod] or {name = ""}
 
        local retval =
@@ -31,10 +73,8 @@ local function get_formspec(data)
                "label[0.5,0;" .. fgettext("World:") .. "]" ..
                "label[1.75,0;" .. data.worldspec.name .. "]"
 
-       local hard_deps, soft_deps = pkgmgr.get_dependencies(mod.path)
-
        if mod.is_modpack or mod.type == "game" then
-               local info = minetest.formspec_escape(
+               local info = core.formspec_escape(
                        core.get_content_info(mod.path).description)
                if info == "" then
                        if mod.is_modpack then
@@ -46,21 +86,55 @@ local function get_formspec(data)
                retval = retval ..
                        "textarea[0.25,0.7;5.75,7.2;;" .. info .. ";]"
        else
+               local hard_deps, soft_deps = pkgmgr.get_dependencies(mod.path)
+               local hard_deps_str = table.concat(hard_deps, ",")
+               local soft_deps_str = table.concat(soft_deps, ",")
+
                retval = retval ..
                        "label[0,0.7;" .. fgettext("Mod:") .. "]" ..
-                       "label[0.75,0.7;" .. mod.name .. "]" ..
-                       "label[0,1.25;" .. fgettext("Dependencies:") .. "]" ..
-                       "textlist[0,1.75;5,2.125;world_config_depends;" .. hard_deps ..
-                       ";0]" ..
-                       "label[0,3.875;" .. fgettext("Optional dependencies:") .. "]" ..
-                       "textlist[0,4.375;5,1.8;world_config_optdepends;" ..
-                       soft_deps .. ";0]"
+                       "label[0.75,0.7;" .. mod.name .. "]"
+
+               if hard_deps_str == "" then
+                       if soft_deps_str == "" then
+                               retval = retval ..
+                                       "label[0,1.25;" ..
+                                       fgettext("No (optional) dependencies") .. "]"
+                       else
+                               retval = retval ..
+                                       "label[0,1.25;" .. fgettext("No hard dependencies") ..
+                                       "]" ..
+                                       "label[0,1.75;" .. fgettext("Optional dependencies:") ..
+                                       "]" ..
+                                       "textlist[0,2.25;5,4;world_config_optdepends;" ..
+                                       soft_deps_str .. ";0]"
+                       end
+               else
+                       if soft_deps_str == "" then
+                               retval = retval ..
+                                       "label[0,1.25;" .. fgettext("Dependencies:") .. "]" ..
+                                       "textlist[0,1.75;5,4;world_config_depends;" ..
+                                       hard_deps_str .. ";0]" ..
+                                       "label[0,6;" .. fgettext("No optional dependencies") .. "]"
+                       else
+                               retval = retval ..
+                                       "label[0,1.25;" .. fgettext("Dependencies:") .. "]" ..
+                                       "textlist[0,1.75;5,2.125;world_config_depends;" ..
+                                       hard_deps_str .. ";0]" ..
+                                       "label[0,3.9;" .. fgettext("Optional dependencies:") ..
+                                       "]" ..
+                                       "textlist[0,4.375;5,1.8;world_config_optdepends;" ..
+                                       soft_deps_str .. ";0]"
+                       end
+               end
        end
+
        retval = retval ..
                "button[3.25,7;2.5,0.5;btn_config_world_save;" ..
                fgettext("Save") .. "]" ..
                "button[5.75,7;2.5,0.5;btn_config_world_cancel;" ..
-               fgettext("Cancel") .. "]"
+               fgettext("Cancel") .. "]" ..
+               "button[9,7;2.5,0.5;btn_config_world_cdb;" ..
+               fgettext("Find More Mods") .. "]"
 
        if mod.name ~= "" and not mod.is_game_content then
                if mod.is_modpack then
@@ -89,10 +163,13 @@ local function get_formspec(data)
                        "button[8.95,0.125;2.5,0.5;btn_enable_all_mods;" ..
                        fgettext("Enable all") .. "]"
        end
+
+       local use_technical_names = core.settings:get_bool("show_technical_names")
+
        return retval ..
                "tablecolumns[color;tree;text]" ..
                "table[5.5,0.75;5.75,6;world_config_modlist;" ..
-               pkgmgr.render_packagelist(data.list) .. ";" .. data.selected_mod .."]"
+               pkgmgr.render_packagelist(data.list, use_technical_names) .. ";" .. data.selected_mod .."]"
 end
 
 local function handle_buttons(this, fields)
@@ -131,18 +208,23 @@ local function handle_buttons(this, fields)
                local mods = worldfile:to_table()
 
                local rawlist = this.data.list:get_raw_list()
+               local was_set = {}
 
                for i = 1, #rawlist do
                        local mod = rawlist[i]
                        if not mod.is_modpack and
                                        not mod.is_game_content then
                                if modname_valid(mod.name) then
-                                       worldfile:set("load_mod_" .. mod.name,
-                                                       tostring(mod.enabled))
+                                       if mod.enabled then
+                                               worldfile:set("load_mod_" .. mod.name, mod.virtual_path)
+                                               was_set[mod.name] = true
+                                       elseif not was_set[mod.name] then
+                                               worldfile:set("load_mod_" .. mod.name, "false")
+                                       end
                                elseif mod.enabled then
                                        gamedata.errormessage = fgettext_ne("Failed to enable mo" ..
                                                        "d \"$1\" as it contains disallowed characters. " ..
-                                                       "Only chararacters [a-z0-9_] are allowed.",
+                                                       "Only characters [a-z0-9_] are allowed.",
                                                        mod.name)
                                end
                                mods["load_mod_" .. mod.name] = nil
@@ -169,15 +251,39 @@ local function handle_buttons(this, fields)
                return true
        end
 
+       if fields.btn_config_world_cdb then
+               this.data.list = nil
+
+               local dlg = create_store_dlg("mod")
+               dlg:set_parent(this)
+               this:hide()
+               dlg:show()
+               return true
+       end
+
        if fields.btn_enable_all_mods then
                local list = this.data.list:get_raw_list()
 
+               -- When multiple copies of a mod are installed, we need to avoid enabling multiple of them
+               -- at a time. So lets first collect all the enabled mods, and then use this to exclude
+               -- multiple enables.
+
+               local was_enabled = {}
                for i = 1, #list do
                        if not list[i].is_game_content
-                                       and not list[i].is_modpack then
+                                       and not list[i].is_modpack and list[i].enabled then
+                               was_enabled[list[i].name] = true
+                       end
+               end
+
+               for i = 1, #list do
+                       if not list[i].is_game_content and not list[i].is_modpack and
+                                       not was_enabled[list[i].name] then
                                list[i].enabled = true
+                               was_enabled[list[i].name] = true
                        end
                end
+
                enabled_all = true
                return true
        end
@@ -218,43 +324,5 @@ function create_configure_world_dlg(worldidx)
                return
        end
 
-       dlg.data.list = filterlist.create(
-               pkgmgr.preparemodlist,
-               pkgmgr.comparemod,
-               function(element, uid)
-                       if element.name == uid then
-                               return true
-                       end
-               end,
-               function(element, criteria)
-                       if criteria.hide_game and
-                                       element.is_game_content then
-                               return false
-                       end
-
-                       if criteria.hide_modpackcontents and
-                                       element.modpack ~= nil then
-                               return false
-                       end
-                       return true
-               end,
-               {
-                       worldpath = dlg.data.worldspec.path,
-                       gameid = dlg.data.worldspec.gameid
-               }
-       )
-
-
-       if dlg.data.selected_mod > dlg.data.list:size() then
-               dlg.data.selected_mod = 0
-       end
-
-       dlg.data.list:set_filtercriteria({
-               hide_game = dlg.data.hide_gamemods,
-               hide_modpackcontents = dlg.data.hide_modpackcontents
-       })
-       dlg.data.list:add_sort_mechanism("alphabetic", sort_mod_list)
-       dlg.data.list:set_sortmode("alphabetic")
-
        return dlg
 end