From f336172dfbbb16046856562b70f8e9699596f2e1 Mon Sep 17 00:00:00 2001 From: Jaidyn Ann <10477760+JadedCtrl@users.noreply.github.com> Date: Mon, 5 Aug 2024 23:01:04 -0500 Subject: [PATCH] Add /themes and /set_theme commands Allowing the user to set their preferred theme! --- init.lua | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 69 insertions(+), 7 deletions(-) diff --git a/init.lua b/init.lua index 0871e76..7b82581 100644 --- a/init.lua +++ b/init.lua @@ -15,17 +15,22 @@ fs_themes = {} fs_themes.themes = {} -fs_themes.modpath = minetest.get_modpath(minetest.get_current_modname()) +local storage = minetest.get_mod_storage() +local modpath = minetest.get_modpath(minetest.get_current_modname()) -- Set a player’s theme by a registered theme’s name. -function fs_themes.set_theme(player, theme_name) +-- If dont_save is provided, the player’s default theme won’t change. +function fs_themes.set_theme(player, theme_name, dont_save) if not fs_themes.themes[theme_name] then minetest.log("warning", string.format("Theme “%s” was not found.", theme_name)) - return + return false + elseif not dont_save then + storage:set_string(player:get_player_name(), theme_name) end player:set_formspec_prepend(fs_themes.themes[theme_name]) + return true end @@ -34,25 +39,82 @@ function fs_themes.register_theme(name, formspecs_file_path) local fs_file, open_err = io.open(formspecs_file_path, "r") if fs_file == nil then minetest.log("warning", string.format("Theme “%s” could not be opened: %s", name, open_err)) - return + return false end local fs_file_contents = fs_file:read("*all") fs_themes.themes[name] = fs_file_contents + return true end --- Whenever a play joins, set their formspecs theme. +minetest.register_chatcommand( + "themes", + { + description = "Lists available GUI (Formspecs) themes.", + func = function(name, param) + local ret = nil + for name,fs in pairs(fs_themes.themes) do + if ret == nil then + ret = name + else + ret = ret .. ", " .. name + end + end + + if ret == nil then + ret = "No themes are installed!" + end + + return true, ret + end + } +) + + +minetest.register_chatcommand( + "set_theme", + { + params = "", + description = "Sets your theme for GUI (Formspecs) windows.", + func = function(name, param) + if fs_themes.set_theme(minetest.get_player_by_name(name), param) then + return true, "Theme set!" + elseif param ~= "" then + return false, string.format("No such theme “%s”.", param) + else + return false + end + end + } +) + + +-- Whenever a player joins, set their formspecs theme. minetest.register_on_joinplayer( function(player) + local player_name = player:get_player_name() local default_theme = minetest.settings:get("fs_default_theme") or "restaurant" - fs_themes.set_theme(player, default_theme) + local player_theme = storage:get_string(player_name) + + -- If a player has a preferred theme we cannot use, complain & use default. + if player_theme ~= "" and not fs_themes.set_theme(player, player_theme) then + minetest.chat_send_player( + player_name, + string.format("The theme “%s” no longer exists! Resetting preference.", player_theme)) + player_theme = "" + storage:set_string(player_name, "") + end + + if player_theme == "" then + fs_themes.set_theme(player, default_theme) + end end ) -- Register all themes in the ./themes/ directory, one by one. -local theme_dir_path = fs_themes.modpath .. "/themes/" +local theme_dir_path = modpath .. "/themes/" local theme_file_paths = minetest.get_dir_list(theme_dir_path, false) for _, file_name in pairs(theme_file_paths) do fs_themes.register_theme(file_name, theme_dir_path .. file_name)