]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - builtin/mainmenu/pkgmgr.lua
Merge branch 'master' of https://github.com/minetest/minetest
[dragonfireclient.git] / builtin / mainmenu / pkgmgr.lua
index 8907aecfc18aabd1490fa5e0199776c84d01100e..072c41f0cd17ad27a6744a0d06cd5c42343e51f7 100644 (file)
@@ -80,11 +80,11 @@ local function load_texture_packs(txtpath, retval)
                if item ~= "base" then
                        local path = txtpath .. DIR_DELIM .. item .. DIR_DELIM
                        local conf = Settings(path .. "texture_pack.conf")
-                       local enabled = conf == current_texture_path
+                       local enabled = path == current_texture_path
 
-                       local title = conf:get("title")
-                       -- list_* is only used if non-nil, else the regular versions are used.
+                       local title = conf:get("title") or item
 
+                       -- list_* is only used if non-nil, else the regular versions are used.
                        retval[#retval + 1] = {
                                name = item,
                                title = title,
@@ -454,9 +454,8 @@ function pkgmgr.enable_mod(this, toset)
        local toggled_mods = {}
        local enabled_mods = {}
        toggle_mod_or_modpack(list, toggled_mods, enabled_mods, toset, mod)
-       toset = mod.enabled -- Update if toggled
 
-       if not toset then
+       if next(enabled_mods) == nil then
                -- Mod(s) were disabled, so no dependencies need to be enabled
                table.sort(toggled_mods)
                core.log("info", "Following mods were disabled: " ..
@@ -466,11 +465,16 @@ function pkgmgr.enable_mod(this, toset)
 
        -- Enable mods' depends after activation
 
-       -- Make a list of mod ids indexed by their names
+       -- Make a list of mod ids indexed by their names. Among mods with the
+       -- same name, enabled mods take precedence, after which game mods take
+       -- precedence, being last in the mod list.
        local mod_ids = {}
        for id, mod2 in pairs(list) do
                if mod2.type == "mod" and not mod2.is_modpack then
-                       mod_ids[mod2.name] = id
+                       local prev_id = mod_ids[mod2.name]
+                       if not prev_id or not list[prev_id].enabled then
+                               mod_ids[mod2.name] = id
+                       end
                end
        end
 
@@ -507,7 +511,7 @@ function pkgmgr.enable_mod(this, toset)
                                -- Push the dependencies of the dependency onto the stack
                                local depends = pkgmgr.get_dependencies(mod_to_enable.path)
                                for i = 1, #depends do
-                                       if not enabled_mods[name] then
+                                       if not enabled_mods[depends[i]] then
                                                sp = sp+1
                                                to_enable[sp] = depends[i]
                                        end
@@ -600,7 +604,7 @@ function pkgmgr.install_dir(type, path, basename, targetpath)
                                clean_path = get_last_folder(cleanup_path(basefolder.path))
                        end
                        if clean_path then
-                               targetpath = core.get_modpath() .. DIR_DELIM .. clean_path
+                               targetpath = core.get_clientmodpath() .. DIR_DELIM .. clean_path
                        else
                                return nil,
                                        fgettext("Install Mod: Unable to find suitable folder name for modpack $1",
@@ -626,7 +630,7 @@ function pkgmgr.install_dir(type, path, basename, targetpath)
                        end
 
                        if targetfolder ~= nil and pkgmgr.isValidModname(targetfolder) then
-                               targetpath = core.get_modpath() .. DIR_DELIM .. targetfolder
+                               targetpath = core.get_clientmodpath() .. DIR_DELIM .. targetfolder
                        else
                                return nil, fgettext("Install Mod: Unable to find real mod name for: $1", path)
                        end
@@ -660,6 +664,53 @@ function pkgmgr.install_dir(type, path, basename, targetpath)
 end
 
 --------------------------------------------------------------------------------
+function pkgmgr.prepareclientmodlist(data)
+       local retval = {}
+
+       local clientmods = {}
+
+       --read clientmods
+       local modpath = core.get_clientmodpath()
+
+       if modpath ~= nil and modpath ~= "" then
+               get_mods(modpath, "clientmods", clientmods)
+       end
+
+       for i=1,#clientmods,1 do
+               clientmods[i].type = "mod"
+               clientmods[i].loc = "global"
+               clientmods[i].is_clientside = true
+               retval[#retval + 1] = clientmods[i]
+       end
+
+       --read mods configuration
+       local filename = modpath ..
+                               DIR_DELIM .. "mods.conf"
+
+       local conffile = Settings(filename)
+
+       for key,value in pairs(conffile:to_table()) do
+               if key:sub(1, 9) == "load_mod_" then
+                       key = key:sub(10)
+                       local element = nil
+                       for i=1,#retval,1 do
+                               if retval[i].name == key and
+                                       not retval[i].is_modpack then
+                                       element = retval[i]
+                                       break
+                               end
+                       end
+                       if element ~= nil then
+                               element.enabled = value ~= "false" and value ~= "nil" and value
+                       else
+                               core.log("info", "Clientmod: " .. key .. " " .. dump(value) .. " but not found")
+                       end
+               end
+       end
+
+       return retval
+end
+
 function pkgmgr.preparemodlist(data)
        local retval = {}
 
@@ -816,6 +867,10 @@ function pkgmgr.refresh_globals()
                        pkgmgr.comparemod, is_equal, nil, {})
        pkgmgr.global_mods:add_sort_mechanism("alphabetic", sort_mod_list)
        pkgmgr.global_mods:set_sortmode("alphabetic")
+       pkgmgr.clientmods = filterlist.create(pkgmgr.prepareclientmodlist,
+                       pkgmgr.comparemod, is_equal, nil, {})
+       pkgmgr.clientmods:add_sort_mechanism("alphabetic", sort_mod_list)
+       pkgmgr.clientmods:set_sortmode("alphabetic")
 end
 
 --------------------------------------------------------------------------------