From 427f2cf847c9ddf78c9809bb76ff032eacfae3b2 Mon Sep 17 00:00:00 2001 From: teknomunk Date: Wed, 1 Jan 2025 07:43:18 -0600 Subject: [PATCH] Add type annotations to vl_tuning, convert minetest->core in vl_tuning, remove last remnants of [1] value accesses, fix several issues uncoverted by type checking, rename some fields --- .luarc.json | 2 + mods/CORE/vl_tuning/gui.lua | 25 +++--- mods/CORE/vl_tuning/init.lua | 94 +++++++++++++++-------- mods/ENVIRONMENT/mcl_raids/init.lua | 2 +- mods/ENVIRONMENT/mcl_weather/skycolor.lua | 1 - mods/HUD/mcl_experience/init.lua | 3 +- mods/ITEMS/mcl_portals/portal_nether.lua | 2 +- mods/ITEMS/mcl_shields/init.lua | 3 +- mods/PLAYER/mcl_skins/edit_skin.lua | 3 +- 9 files changed, 85 insertions(+), 50 deletions(-) diff --git a/.luarc.json b/.luarc.json index 7e9e92042..1a48735b7 100644 --- a/.luarc.json +++ b/.luarc.json @@ -3,6 +3,7 @@ "diagnostics": { "disable": ["lowercase-global"] }, "diagnostics.globals": [ "minetest", + "core", "dump", "dump2", "Raycast", @@ -18,5 +19,6 @@ "AreaStore", "vector" ], + "workspace.library": ["/usr/share/luanti/luanti-lls-definitions/library", "/usr/share/luanti/builtin"], "workspace.ignoreDir": [".luacheckrc"] } diff --git a/mods/CORE/vl_tuning/gui.lua b/mods/CORE/vl_tuning/gui.lua index d515b33a0..2e5021101 100644 --- a/mods/CORE/vl_tuning/gui.lua +++ b/mods/CORE/vl_tuning/gui.lua @@ -1,8 +1,8 @@ local modname = "vl_tuning" -local modpath = minetest.get_modpath(modname) -local S = minetest.get_translator(modname) -local F = function(f) return minetest.formspec_escape(S(f)) end -local FE = minetest.formspec_escape +local modpath = core.get_modpath(modname) +local S = core.get_translator(modname) +local F = function(f) return core.formspec_escape(S(f)) end +local FE = core.formspec_escape local mod = vl_tuning local function bool_to_string(value) @@ -18,12 +18,12 @@ local function formspec_for_setting(y, name) local fs = {} table.insert(fs, "label[0,"..(y+0.15)..";"..FE(name).."]") - table.insert(fs, "hypertext[0.15,"..(y+0.25)..";14.85,0.65;;"..FE("").."]") + table.insert(fs, "hypertext[0.15,"..(y+0.25)..";14.85,0.65;;"..FE("").."]") if setting_type == "bool" then - table.insert(fs, "checkbox[17,"..(y+0.15)..";"..FE(name)..";;"..bool_to_string(setting[1]).."]") + table.insert(fs, "checkbox[17,"..(y+0.15)..";"..FE(name)..";;"..bool_to_string(setting.getter()).."]") elseif setting_type == "number" then - table.insert(fs, "field[15,"..y..";2.5,0.75;"..FE(name)..";;"..string.format("%.4g", setting[1]).."]") + table.insert(fs, "field[15,"..y..";2.5,0.75;"..FE(name)..";;"..string.format("%.4g", setting.getter()).."]") table.insert(fs, "field_close_on_enter["..FE(name)..";false]") elseif setting_type == "string" then end @@ -66,12 +66,12 @@ function vl_tuning.show_formspec(player_name, tab) "scrollbar[18.75,0.75;0.75,9.25;vertical;settings;0]", }) - minetest.show_formspec(player_name, "vl_tuning:settings", formspec) + core.show_formspec(player_name, "vl_tuning:settings", formspec) end -minetest.register_on_player_receive_fields(function(player, formname, fields) +core.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "vl_tuning:settings" then return end - minetest.log("action",dump({ + core.log("action",dump({ player = player, fields = fields, formname = formname, @@ -86,12 +86,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.quit or (not fields.tab or fields.old_tab == fields.tab) then return end - minetest.log("Seting settings formspec") mod.show_formspec(player:get_player_name(), fields.tab) end) -minetest.register_chatcommand("settings",{ - func = function(player_name, param) +core.register_chatcommand("settings",{ + func = function(player_name, _) dofile(modpath.."/gui.lua") mod.show_formspec(player_name) end diff --git a/mods/CORE/vl_tuning/init.lua b/mods/CORE/vl_tuning/init.lua index 08dfdc74c..deee4d870 100644 --- a/mods/CORE/vl_tuning/init.lua +++ b/mods/CORE/vl_tuning/init.lua @@ -1,13 +1,14 @@ -local modname = minetest.get_current_modname() -local modpath = minetest.get_modpath(modname) -local S = minetest.get_translator(modname) -local storage = minetest.get_mod_storage() +local modname = core.get_current_modname() +local modpath = core.get_modpath(modname) +local S = core.get_translator(modname) +local storage = core.get_mod_storage() local mod = {} vl_tuning = mod local DEBUG = false -- All registered tunable parameters +--- @type table local tunables = {} vl_tuning.registered_settings = tunables @@ -30,11 +31,26 @@ local tunable_types = { } -- Tunable metatable functions +---@class (exact) vl_tuning.Setting +---@field name string +---@field setting_type "string"|"number"|"bool" +---@field description string +---@field default? string|integer|boolean +---@field set fun(self : vl_tuning.Setting, value, no_hook : boolean?) +---@field setter fun(value) +---@field getter fun() : string|boolean|number +---@field from_string fun(value : string) +---@field to_string fun(value : any) +---@field on_change? fun(self : vl_tuning.Setting) +---@field getter fun() local tunable_class = {} + +---@param self vl_tuning.Setting +---@param value any +---@param no_hook? boolean function tunable_class:set(value, no_hook) - local self_type = self.type if type(value) == "string" then - local new_value = self_type.from_string(value) + local new_value = self.from_string(value) if new_value == nil then new_value = self.default end self.setter(new_value) @@ -43,7 +59,7 @@ function tunable_class:set(value, no_hook) end if DEBUG then - minetest.log("action", "[vl_tuning] Set "..self.setting.." to "..dump(self.getter())) + core.log("action", "[vl_tuning] Set "..self.name.." to "..dump(self.getter())) end -- Call on_change hook @@ -53,50 +69,66 @@ function tunable_class:set(value, no_hook) end -- Persist value - storage:set_string(self.setting,self_type.to_string(self.getter())) + storage:set_string(self.name,self.to_string(self.getter())) end function tunable_class:get_string() - return self.type.to_string(self.getter()) + return self.to_string(self.getter()) end -function mod.setting(setting, setting_type, def ) +---@class vl_tuning.SettingDef +---@field set fun(value : any) +---@field get fun(): string|boolean|number +---@field default any +---@field description? string + +---@param name string +---@param p_type? "bool"|"number"|"string" +---@param def? vl_tuning.SettingDef +---@return vl_tuning.Setting? +function mod.setting(name, p_type, def ) -- return the existing setting if it was previously registered. Don't update the definition - local tunable = tunables[setting] + local tunable = tunables[name] if tunable then return tunable end - assert(setting_type) + assert(p_type) assert(def) assert(type(def.set) == "function", "Tunable requires set method") assert(type(def.get) == "function", "Tunable required get method") -- Setup the tunable data - tunable = table.copy(def) - tunable.setting = setting - tunable.setter = def.set - tunable.getter = def.get - tunable.type = tunable_types[setting_type] - tunable.setting_type = setting_type - if tunable.default then - tunable.set(tunable.default) + ---@type vl_tuning.Setting + tunable = { + name = name, + setting_type = p_type, + description = def.description or "", + setter = def.set, + getter = def.get, + set = tunable_class.set, + get_string = tunable_class.get_string, + from_string = tunable_types[p_type].from_string, + to_string = tunable_types[p_type].to_string, + } + if def.default then + tunable:set(def.default) end setmetatable(tunable, {__index=tunable_class}) -- Load the setting value from mod storage - local setting_value = storage:get_string(setting) + local setting_value = storage:get_string(name) if setting_value and setting_value ~= "" then tunable:set(setting_value, true) if DEBUG then - minetest.log("action", "[vl_tuning] Loading "..setting.." = "..dump(setting_value).." ("..dump(tunable[1])..")") + core.log("action", "[vl_tuning] Loading "..name.." = "..dump(setting_value).." ("..dump(tunable.getter())..")") end end -- Add to the list of all available settings - tunables[setting] = tunable + tunables[name] = tunable - -- Provide it so that the current value in [1] can be accessed without having to call into this API again + -- Provide it so that the current value can be retrieved from result.getter() return tunable end -minetest.register_chatcommand("set_setting", { +core.register_chatcommand("set_setting", { description = S("Admin tool to tune settings and game rules"), params = S(" "), privs = { debug = true }, @@ -117,17 +149,17 @@ minetest.register_chatcommand("set_setting", { end if DEBUG then - minetest.log("action", "[vl_tuning] "..name.." set ".. params[1] .." to "..params[2]) + core.log("action", "[vl_tuning] "..name.." set ".. params[1] .." to "..params[2]) end tunable:set(params[2]) return true end }) -minetest.register_chatcommand("get_setting", { +core.register_chatcommand("get_setting", { description = S("Admin tool to view settings and game rules"), params = S(""), privs = { debug = true }, - func = function(name, param) + func = function(_, param) local tunable = tunables[param] if tunable then return true, tunable:get_string() @@ -137,11 +169,11 @@ minetest.register_chatcommand("get_setting", { end }) -minetest.register_chatcommand("gamerule", { +core.register_chatcommand("gamerule", { description = S("Display or set customizable options"), params = S(" []"), privs = { server = true }, - func = function(name, params_raw) + func = function(_, params_raw) -- Split apart the params local params = {} for str in string.gmatch(params_raw, "([^ ]+)") do @@ -160,7 +192,7 @@ minetest.register_chatcommand("gamerule", { local value = params[2] if value then if DEBUG then - minetest.log("action", "[vl_tuning] Setting game rule "..params[1].." to "..params[2]) + core.log("action", "[vl_tuning] Setting game rule "..params[1].." to "..params[2]) end tunable:set(params[2]) return true diff --git a/mods/ENVIRONMENT/mcl_raids/init.lua b/mods/ENVIRONMENT/mcl_raids/init.lua index 44828a6f6..381026579 100644 --- a/mods/ENVIRONMENT/mcl_raids/init.lua +++ b/mods/ENVIRONMENT/mcl_raids/init.lua @@ -297,7 +297,7 @@ mcl_events.register_event("raid",{ health_max = 1, exclusive_to_area = 128, enable_bossbar = true, - cond_start = function(self) + cond_start = function(_) if gamerule_disableRaids then return false end --minetest.log("Cond start raid") diff --git a/mods/ENVIRONMENT/mcl_weather/skycolor.lua b/mods/ENVIRONMENT/mcl_weather/skycolor.lua index 33f9970af..950823616 100644 --- a/mods/ENVIRONMENT/mcl_weather/skycolor.lua +++ b/mods/ENVIRONMENT/mcl_weather/skycolor.lua @@ -3,7 +3,6 @@ local modname = minetest.get_current_modname() local modpath = minetest.get_modpath(modname) local S = minetest.get_translator(modname) -local mods_loaded = false local NIGHT_VISION_RATIO = 0.45 local DEBUG = false diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index f31f177e0..7cf3ccd6a 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -238,8 +238,9 @@ minetest.register_on_leaveplayer(function(player) end) local keep_inventory = vl_tuning.setting("gamerule:keepInventory") +assert(keep_inventory) minetest.register_on_dieplayer(function(player) - if not keep_inventory[1] then + if not keep_inventory:getter() then mcl_experience.throw_xp(player:get_pos(), mcl_experience.get_xp(player)) mcl_experience.set_xp(player, 0) end diff --git a/mods/ITEMS/mcl_portals/portal_nether.lua b/mods/ITEMS/mcl_portals/portal_nether.lua index 3928232b4..9f2dbec4c 100644 --- a/mods/ITEMS/mcl_portals/portal_nether.lua +++ b/mods/ITEMS/mcl_portals/portal_nether.lua @@ -96,7 +96,7 @@ local nether_portal_survival_delay = 4 vl_tuning.setting("gamerule:playersNetherPortalDefaultDelay", "number", { default = 4, set = function(val) nether_portal_survival_delay = val end, - get = function() return nether_portal_survive_delay end, + get = function() return nether_portal_survival_delay end, }) -- Speeds up the search by allowing some non-air nodes to be replaced when diff --git a/mods/ITEMS/mcl_shields/init.lua b/mods/ITEMS/mcl_shields/init.lua index 42c4fa126..6ab162679 100644 --- a/mods/ITEMS/mcl_shields/init.lua +++ b/mods/ITEMS/mcl_shields/init.lua @@ -435,9 +435,10 @@ minetest.register_globalstep(function(dtime) end) local keep_inventory = vl_tuning.setting("gamerule:keepInventory") +assert(keep_inventory) minetest.register_on_dieplayer(function(player) remove_shield_hud(player) - if not keep_inventory[1] then + if not keep_inventory.getter() then remove_shield_entity(player, 1) remove_shield_entity(player, 2) end diff --git a/mods/PLAYER/mcl_skins/edit_skin.lua b/mods/PLAYER/mcl_skins/edit_skin.lua index fdaeb6baf..5935bf169 100644 --- a/mods/PLAYER/mcl_skins/edit_skin.lua +++ b/mods/PLAYER/mcl_skins/edit_skin.lua @@ -736,8 +736,9 @@ end init() local keep_inventory = vl_tuning.setting("gamerule:keepInventory") +assert(keep_inventory) minetest.register_on_respawnplayer(function(player) - if not keep_inventory[1] then + if not keep_inventory.getter() then mcl_skins.update_player_skin(player) -- ensures players have their cape again after dying with an elytra end end)