Add disable_settings to game.conf to get rid of "Enable Damage"/"Creative Mode"/"Host Server" checkboxes (#11524)

This adds support for disable_settings to game.conf. In this you can specify a list of settings that should not be visible in the "local game" (or however it is called nowadays) tab. Enable Damage, Creative Mode and Host Server are supported.

Co-authored-by: Wuzzy <Wuzzy2@mail.ru>
Co-authored-by: Aaron Suen <warr1024@gmail.com>
Co-authored-by: rubenwardy <rw@rubenwardy.com>
This commit is contained in:
Hugues Ross 2021-08-12 14:08:12 -04:00 committed by GitHub
parent 442e48b84f
commit 47c146120a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 89 additions and 13 deletions

@ -18,8 +18,14 @@
local enable_gamebar = PLATFORM ~= "Android" local enable_gamebar = PLATFORM ~= "Android"
local current_game, singleplayer_refresh_gamebar local current_game, singleplayer_refresh_gamebar
local valid_disabled_settings = {
["enable_damage"]=true,
["creative_mode"]=true,
["enable_server"]=true,
}
if enable_gamebar then if enable_gamebar then
-- Currently chosen game in gamebar for theming and filtering
function current_game() function current_game()
local last_game_id = core.settings:get("menu_last_game") local last_game_id = core.settings:get("menu_last_game")
local game = pkgmgr.find_by_gameid(last_game_id) local game = pkgmgr.find_by_gameid(last_game_id)
@ -102,37 +108,87 @@ if enable_gamebar then
btnbar:add_button("game_open_cdb", "", plus_image, fgettext("Install games from ContentDB")) btnbar:add_button("game_open_cdb", "", plus_image, fgettext("Install games from ContentDB"))
end end
else else
-- Currently chosen game in gamebar: no gamebar -> no "current" game
function current_game() function current_game()
return nil return nil
end end
end end
local function get_disabled_settings(game)
if not game then
return {}
end
local gameconfig = Settings(game.path .. "/game.conf")
local disabled_settings = {}
if gameconfig then
local disabled_settings_str = (gameconfig:get("disabled_settings") or ""):split()
for _, value in pairs(disabled_settings_str) do
local state = false
value = value:trim()
if string.sub(value, 1, 1) == "!" then
state = true
value = string.sub(value, 2)
end
if valid_disabled_settings[value] then
disabled_settings[value] = state
else
core.log("error", "Invalid disabled setting in game.conf: "..tostring(value))
end
end
end
return disabled_settings
end
local function get_formspec(tabview, name, tabdata) local function get_formspec(tabview, name, tabdata)
local retval = "" local retval = ""
local index = filterlist.get_current_index(menudata.worldlist, local index = filterlist.get_current_index(menudata.worldlist,
tonumber(core.settings:get("mainmenu_last_selected_world")) tonumber(core.settings:get("mainmenu_last_selected_world")))
) local list = menudata.worldlist:get_list()
local world = list and index and list[index]
local gameid = world and world.gameid
local game = gameid and pkgmgr.find_by_gameid(gameid)
local disabled_settings = get_disabled_settings(game)
local creative, damage, host = "", "", ""
-- Y offsets for game settings checkboxes
local y = -0.2
local yo = 0.45
if disabled_settings["creative_mode"] == nil then
creative = "checkbox[0,"..y..";cb_creative_mode;".. fgettext("Creative Mode") .. ";" ..
dump(core.settings:get_bool("creative_mode")) .. "]"
y = y + yo
end
if disabled_settings["enable_damage"] == nil then
damage = "checkbox[0,"..y..";cb_enable_damage;".. fgettext("Enable Damage") .. ";" ..
dump(core.settings:get_bool("enable_damage")) .. "]"
y = y + yo
end
if disabled_settings["enable_server"] == nil then
host = "checkbox[0,"..y..";cb_server;".. fgettext("Host Server") ..";" ..
dump(core.settings:get_bool("enable_server")) .. "]"
y = y + yo
end
retval = retval .. retval = retval ..
"button[3.9,3.8;2.8,1;world_delete;".. fgettext("Delete") .. "]" .. "button[3.9,3.8;2.8,1;world_delete;".. fgettext("Delete") .. "]" ..
"button[6.55,3.8;2.8,1;world_configure;".. fgettext("Select Mods") .. "]" .. "button[6.55,3.8;2.8,1;world_configure;".. fgettext("Select Mods") .. "]" ..
"button[9.2,3.8;2.8,1;world_create;".. fgettext("New") .. "]" .. "button[9.2,3.8;2.8,1;world_create;".. fgettext("New") .. "]" ..
"label[3.9,-0.05;".. fgettext("Select World:") .. "]".. "label[3.9,-0.05;".. fgettext("Select World:") .. "]"..
"checkbox[0,-0.20;cb_creative_mode;".. fgettext("Creative Mode") .. ";" .. creative ..
dump(core.settings:get_bool("creative_mode")) .. "]".. damage ..
"checkbox[0,0.25;cb_enable_damage;".. fgettext("Enable Damage") .. ";" .. host ..
dump(core.settings:get_bool("enable_damage")) .. "]"..
"checkbox[0,0.7;cb_server;".. fgettext("Host Server") ..";" ..
dump(core.settings:get_bool("enable_server")) .. "]" ..
"textlist[3.9,0.4;7.9,3.45;sp_worlds;" .. "textlist[3.9,0.4;7.9,3.45;sp_worlds;" ..
menu_render_worldlist() .. menu_render_worldlist() ..
";" .. index .. "]" ";" .. index .. "]"
if core.settings:get_bool("enable_server") then if core.settings:get_bool("enable_server") and disabled_settings["enable_server"] == nil then
retval = retval .. retval = retval ..
"button[7.9,4.75;4.1,1;play;".. fgettext("Host Game") .. "]" .. "button[7.9,4.75;4.1,1;play;".. fgettext("Host Game") .. "]" ..
"checkbox[0,1.15;cb_server_announce;" .. fgettext("Announce Server") .. ";" .. "checkbox[0,"..y..";cb_server_announce;" .. fgettext("Announce Server") .. ";" ..
dump(core.settings:get_bool("server_announce")) .. "]" .. dump(core.settings:get_bool("server_announce")) .. "]" ..
"field[0.3,2.85;3.8,0.5;te_playername;" .. fgettext("Name") .. ";" .. "field[0.3,2.85;3.8,0.5;te_playername;" .. fgettext("Name") .. ";" ..
core.formspec_escape(core.settings:get("name")) .. "]" .. core.formspec_escape(core.settings:get("name")) .. "]" ..
@ -227,9 +283,21 @@ local function main_button_handler(this, fields, name, tabdata)
-- Update last game -- Update last game
local world = menudata.worldlist:get_raw_element(gamedata.selected_world) local world = menudata.worldlist:get_raw_element(gamedata.selected_world)
local game_obj
if world then if world then
local game = pkgmgr.find_by_gameid(world.gameid) game_obj = pkgmgr.find_by_gameid(world.gameid)
core.settings:set("menu_last_game", game.id) core.settings:set("menu_last_game", game_obj.id)
end
local disabled_settings = get_disabled_settings(game_obj)
for k, _ in pairs(valid_disabled_settings) do
local v = disabled_settings[k]
if v ~= nil then
if k == "enable_server" and v == true then
error("Setting 'enable_server' cannot be force-enabled! The game.conf needs to be fixed.")
end
core.settings:set_bool(k, disabled_settings[k])
end
end end
if core.settings:get_bool("enable_server") then if core.settings:get_bool("enable_server") then

@ -77,8 +77,16 @@ The game directory can contain the following files:
`disallowed_mapgens`. `disallowed_mapgens`.
* `disallowed_mapgen_settings= <comma-separated mapgen settings>` * `disallowed_mapgen_settings= <comma-separated mapgen settings>`
e.g. `disallowed_mapgen_settings = mgv5_spflags` e.g. `disallowed_mapgen_settings = mgv5_spflags`
These settings are hidden for this game in the world creation These mapgen settings are hidden for this game in the world creation
dialog and game start menu. dialog and game start menu.
* `disabled_settings = <comma-separated settings>`
e.g. `disabled_settings = enable_damage, creative_mode`
These settings are hidden for this game in the "Start game" tab
and will be initialized as `false` when the game is started.
Prepend a setting name with an exclamation mark to initialize it to `true`
(this does not work for `enable_server`).
Only these settings are supported:
`enable_damage`, `creative_mode`, `enable_server`.
* `author`: The author of the game. It only appears when downloaded from * `author`: The author of the game. It only appears when downloaded from
ContentDB. ContentDB.
* `release`: Ignore this: Should only ever be set by ContentDB, as it is * `release`: Ignore this: Should only ever be set by ContentDB, as it is