Escape " in generated settings_translation_file.cpp
[oweals/minetest.git] / builtin / mainmenu / common.lua
index d2994e19b4c18b3ae74bf864414c236ace4857da..f4020aaaf00c5adc46f079aff4d1a424fe8234ca 100644 (file)
 --51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 --------------------------------------------------------------------------------
 -- Global menu data
----------------------------------------------------------------------------------
+--------------------------------------------------------------------------------
 menudata = {}
 
+--------------------------------------------------------------------------------
+-- Local cached values
+--------------------------------------------------------------------------------
+local min_supp_proto = core.get_min_supp_proto()
+local max_supp_proto = core.get_max_supp_proto()
+
 --------------------------------------------------------------------------------
 -- Menu helper functions
 --------------------------------------------------------------------------------
@@ -34,6 +40,45 @@ local function render_client_count(n)
        end
 end
 
+local function configure_selected_world_params(idx)
+       local worldconfig = modmgr.get_worldconfig(
+               menudata.worldlist:get_list()[idx].path)
+
+       if worldconfig.creative_mode ~= nil then
+               core.setting_set("creative_mode", worldconfig.creative_mode)
+       end
+       if worldconfig.enable_damage ~= nil then
+               core.setting_set("enable_damage", worldconfig.enable_damage)
+       end
+end
+
+--------------------------------------------------------------------------------
+function image_column(tooltip, flagname)
+       return "image," ..
+               "tooltip=" .. core.formspec_escape(tooltip) .. "," ..
+               "0=" .. core.formspec_escape(defaulttexturedir .. "blank.png") .. "," ..
+               "1=" .. core.formspec_escape(defaulttexturedir .. "server_flags_" .. flagname .. ".png")
+end
+
+--------------------------------------------------------------------------------
+function order_favorite_list(list)
+       local res = {}
+       --orders the favorite list after support
+       for i=1,#list,1 do
+               local fav = list[i]
+               if is_server_protocol_compat(fav.proto_min, fav.proto_max) then
+                       table.insert(res, fav)
+               end
+       end
+       for i=1,#list,1 do
+               local fav = list[i]
+               if not is_server_protocol_compat(fav.proto_min, fav.proto_max) then
+                       table.insert(res, fav)
+               end
+       end
+       return res
+end
+
 --------------------------------------------------------------------------------
 function render_favorite(spec,render_details)
        local text = ""
@@ -60,6 +105,7 @@ function render_favorite(spec,render_details)
        end
 
        local details = ""
+       local grey_out = not is_server_protocol_compat(spec.proto_max, spec.proto_min)
 
        if spec.clients ~= nil and spec.clients_max ~= nil then
                local clients_color = ''
@@ -79,11 +125,17 @@ function render_favorite(spec,render_details)
                        clients_color = '#ffba97' -- 90-100%: orange
                end
 
+               if grey_out then
+                       clients_color = '#aaaaaa'
+               end
+
                details = details ..
                                clients_color .. ',' ..
                                render_client_count(spec.clients) .. ',' ..
                                '/,' ..
                                render_client_count(spec.clients_max) .. ','
+       elseif grey_out then
+               details = details .. '#aaaaaa,?,/,?,'
        else
                details = details .. ',?,/,?,'
        end
@@ -106,7 +158,7 @@ function render_favorite(spec,render_details)
                details = details .. "0,"
        end
 
-       return details .. text
+       return details .. (grey_out and '#aaaaaa,' or ',') .. text
 end
 
 --------------------------------------------------------------------------------
@@ -149,7 +201,6 @@ end
 
 --------------------------------------------------------------------------------
 function menu_handle_key_up_down(fields,textlist,settingname)
-
        if fields["key_up"] then
                local oldidx = core.get_textlist_index(textlist)
 
@@ -157,6 +208,8 @@ function menu_handle_key_up_down(fields,textlist,settingname)
                        local newidx = oldidx -1
                        core.setting_set(settingname,
                                menudata.worldlist:get_raw_index(newidx))
+
+                       configure_selected_world_params(newidx)
                end
                return true
        end
@@ -168,50 +221,127 @@ function menu_handle_key_up_down(fields,textlist,settingname)
                        local newidx = oldidx + 1
                        core.setting_set(settingname,
                                menudata.worldlist:get_raw_index(newidx))
+
+                       configure_selected_world_params(newidx)
                end
-               
+
                return true
        end
-       
+
        return false
 end
 
 --------------------------------------------------------------------------------
 function asyncOnlineFavourites()
 
-       menudata.favorites = {}
+       if not menudata.public_known then
+               menudata.public_known = {{
+                       name = fgettext("Loading..."),
+                       description = fgettext_ne("Try reenabling public serverlist and check your internet connection.")
+               }}
+       end
+       menudata.favorites = menudata.public_known
        core.handle_async(
                function(param)
                        return core.get_favorites("online")
                end,
                nil,
                function(result)
-                       menudata.favorites = result
-                       core.event_handler("Refresh")
+                       if core.setting_getbool("public_serverlist") then
+                               local favs = order_favorite_list(result)
+                               if favs[1] then
+                                       menudata.public_known = favs
+                                       menudata.favorites = menudata.public_known
+                               end
+                               core.event_handler("Refresh")
+                       end
                end
-               )
+       )
 end
 
 --------------------------------------------------------------------------------
 function text2textlist(xpos,ypos,width,height,tl_name,textlen,text,transparency)
        local textlines = core.splittext(text,textlen)
-       
+
        local retval = "textlist[" .. xpos .. "," .. ypos .. ";"
                                                                .. width .. "," .. height .. ";"
                                                                .. tl_name .. ";"
-       
+
        for i=1, #textlines, 1 do
                textlines[i] = textlines[i]:gsub("\r","")
                retval = retval .. core.formspec_escape(textlines[i]) .. ","
        end
-       
+
        retval = retval .. ";0;"
-       
+
        if transparency then
                retval = retval .. "true"
        end
-       
+
        retval = retval .. "]"
 
        return retval
 end
+
+--------------------------------------------------------------------------------
+function is_server_protocol_compat(server_proto_min, server_proto_max)
+       return not ((min_supp_proto > (server_proto_max or 24)) or (max_supp_proto < (server_proto_min or 13)))
+end
+--------------------------------------------------------------------------------
+function is_server_protocol_compat_or_error(server_proto_min, server_proto_max)
+       if not is_server_protocol_compat(server_proto_min, server_proto_max) then
+               local server_prot_ver_info
+               local client_prot_ver_info
+               if server_proto_min ~= server_proto_max then
+                       server_prot_ver_info = fgettext_ne("Server supports protocol versions between $1 and $2. ",
+                               server_proto_min or 13, server_proto_max or 24)
+               else
+                       server_prot_ver_info = fgettext_ne("Server enforces protocol version $1. ",
+                               server_proto_min or 13)
+               end
+               if min_supp_proto ~= max_supp_proto then
+                       client_prot_ver_info= fgettext_ne("We support protocol versions between version $1 and $2.",
+                               min_supp_proto, max_supp_proto)
+               else
+                       client_prot_ver_info = fgettext_ne("We only support protocol version $1.", min_supp_proto)
+               end
+               gamedata.errormessage = fgettext_ne("Protocol version mismatch. ")
+                       .. server_prot_ver_info
+                       .. client_prot_ver_info
+               return false
+       end
+
+       return true
+end
+--------------------------------------------------------------------------------
+function menu_worldmt(selected, setting, value)
+       local world = menudata.worldlist:get_list()[selected]
+       if world then
+               local filename = world.path .. DIR_DELIM .. "world.mt"
+               local world_conf = Settings(filename)
+
+               if value ~= nil then
+                       if not world_conf:write() then
+                               core.log("error", "Failed to write world config file")
+                       end
+                       world_conf:set(setting, value)
+                       world_conf:write()
+               else
+                       return world_conf:get(setting)
+               end
+       else
+               return nil
+       end
+end
+
+function menu_worldmt_legacy(selected)
+       local modes_names = {"creative_mode", "enable_damage", "server_announce"}
+       for _, mode_name in pairs(modes_names) do
+               local mode_val = menu_worldmt(selected, mode_name)
+               if mode_val ~= nil then
+                       core.setting_set(mode_name, mode_val)
+               else
+                       menu_worldmt(selected, mode_name, core.setting_get(mode_name))
+               end
+       end
+end