From 4db0631133f32a7d46fe1604037dfaa2aa2b8a4c Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 29 Jun 2023 08:39:58 +0200 Subject: [PATCH] `mcl_inventory` creative fixes - Add many comments (I had a really hard time understanding the code) - Add some more type annotations (https://github.com/minetest-toolkit/minetest-lsp-api) - Rename non english variable --- mods/HUD/mcl_inventory/creative.lua | 121 ++++++++++++++++++++-------- mods/PLAYER/mcl_player/init.lua | 2 +- 2 files changed, 90 insertions(+), 33 deletions(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index c7567189d..a896fa0de 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -3,20 +3,35 @@ local F = minetest.formspec_escape local C = minetest.colorize -- Prepare player info table +---@type table local players = {} -- Containing all the items for each Creative Mode tab +---@type table local inventory_lists = {} ---local mod_player = minetest.get_modpath("mcl_player") - -- Create tables -local builtin_filter_ids = { "blocks", "deco", "redstone", "rail", "food", "tools", "combat", "mobs", "brew", "matr", - "misc", "all" } +---@type string[] +local builtin_filter_ids = { + "blocks", + "deco", + "redstone", + "rail", + "food", + "tools", + "combat", + "mobs", + "brew", + "matr", + "misc", + "all" +} + for _, f in pairs(builtin_filter_ids) do inventory_lists[f] = {} end +---@param tbl string[] local function replace_enchanted_books(tbl) for k, item in ipairs(tbl) do if item:find("mcl_enchanting:book_enchanted") == 1 then @@ -29,21 +44,24 @@ local function replace_enchanted_books(tbl) end end ---[[ Populate all the item tables. We only do this once. Note this code must be -executed after loading all the other mods in order to work. ]] +-- Populate all the item tables. We only do this once. +-- Note this code must be executed after loading all the other mods in order to work. minetest.register_on_mods_loaded(function() for name, def in pairs(minetest.registered_items) do if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then + ---@param def mt.ItemDef|mt.NodeDef local function is_redstone(def) return def.mesecons or def.groups.mesecon or def.groups.mesecon_conductor_craftable or def.groups.mesecon_effecor_off end + ---@param def mt.ItemDef|mt.NodeDef local function is_tool(def) return def.groups.tool or (def.tool_capabilities and def.tool_capabilities.damage_groups == nil) end + ---@param def mt.ItemDef|mt.NodeDef local function is_weapon_or_armor(def) return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or def.groups.combat_item or ( @@ -120,6 +138,11 @@ minetest.register_on_mods_loaded(function() end end) +---@param name string +---@param description string +---@param lang mt.LangCode +---@param filter string +---@return integer local function filter_item(name, description, lang, filter) local desc if not lang then @@ -130,6 +153,8 @@ local function filter_item(name, description, lang, filter) return string.find(name, filter, nil, true) or string.find(desc, filter, nil, true) end +---@param filter string +---@param player mt.PlayerObjectRef local function set_inv_search(filter, player) local playername = player:get_player_name() local inv = minetest.get_inventory({ type = "detached", name = "creative_" .. playername }) @@ -158,6 +183,8 @@ local function set_inv_search(filter, player) inv:set_list("main", creative_list) end +---@param page string +---@param player mt.PlayerObjectRef local function set_inv_page(page, player) local playername = player:get_player_name() local inv = minetest.get_inventory({ type = "detached", name = "creative_" .. playername }) @@ -171,6 +198,8 @@ local function set_inv_page(page, player) inv:set_list("main", creative_list) end + +---@param player mt.PlayerObjectRef local function init(player) local playername = player:get_player_name() minetest.create_detached_inventory("creative_" .. playername, { @@ -208,18 +237,39 @@ local trash = minetest.create_detached_inventory("trash", { inv:set_stack(listname, index, "") end, }) + trash:set_size("main", 1) -local noffset = {} -- numeric tab offset -local offset = {} -- string offset: -local boffset = {} -- -local hoch = {} +------------------------------ +-- Formspec Precalculations -- +------------------------------ + +-- Numeric position of tab background image, indexed by tab name +---@type table +local noffset = {} + +-- String position of tab button background image, indexed by tab name +---@type table +local offset = {} + +-- String position of tab button, indexed by tab name +---@type table +local boffset = {} + +-- Used to determine the tab button background image +---@type table +local button_bg_postfix = {} + +-- Tab caption/tooltip translated string, indexed by tab name +---@type table local filtername = {} ---local bg = {} local noffset_x_start = 0.2 local noffset_x = noffset_x_start local noffset_y = -1.34 + +---@param id string +---@param right? boolean local function next_noffset(id, right) if right then noffset[id] = { 11.3, noffset_y } @@ -254,20 +304,20 @@ for k, v in pairs(noffset) do boffset[k] = tostring(v[1] + 0.24) .. "," .. tostring(v[2] + 0.25) end -hoch["blocks"] = "" -hoch["deco"] = "" -hoch["redstone"] = "" -hoch["rail"] = "" -hoch["brew"] = "" -hoch["misc"] = "" -hoch["nix"] = "" -hoch["default"] = "" -hoch["food"] = "_down" -hoch["tools"] = "_down" -hoch["combat"] = "_down" -hoch["mobs"] = "_down" -hoch["matr"] = "_down" -hoch["inv"] = "_down" +button_bg_postfix["blocks"] = "" +button_bg_postfix["deco"] = "" +button_bg_postfix["redstone"] = "" +button_bg_postfix["rail"] = "" +button_bg_postfix["brew"] = "" +button_bg_postfix["misc"] = "" +button_bg_postfix["nix"] = "" +button_bg_postfix["default"] = "" +button_bg_postfix["food"] = "_down" +button_bg_postfix["tools"] = "_down" +button_bg_postfix["combat"] = "_down" +button_bg_postfix["mobs"] = "_down" +button_bg_postfix["matr"] = "_down" +button_bg_postfix["inv"] = "_down" filtername["blocks"] = S("Building Blocks") filtername["deco"] = S("Decoration Blocks") @@ -302,6 +352,8 @@ filtername["inv"] = S("Survival Inventory") bg["default"] = dark_bg end]] +-- Item name representing a tab, indexed by tab name +---@type table local tab_icon = { blocks = "mcl_core:brick_block", deco = "mcl_flowers:peony", @@ -318,13 +370,15 @@ local tab_icon = { inv = "mcl_chests:chest", } ----@param player ObjectRef +-- Get the player configured stack size when taking items from creative inventory +---@param player mt.PlayerObjectRef ---@return integer local function get_stack_size(player) return player:get_meta():get_int("mcl_inventory:switch_stack") end ----@param player ObjectRef +-- Set the player configured stack size when taking items from creative inventory +---@param player mt.PlayerObjectRef ---@param n integer local function set_stack_size(player, n) player:get_meta():set_int("mcl_inventory:switch_stack", n) @@ -336,6 +390,7 @@ minetest.register_on_joinplayer(function(player) end end) +---@param player mt.PlayerObjectRef function mcl_inventory.set_creative_formspec(player) local playername = player:get_player_name() if not players[playername] then return end @@ -459,12 +514,15 @@ function mcl_inventory.set_creative_formspec(player) }) end + ---@param current_tab string + ---@param this_tab string + ---@return string local function tab(current_tab, this_tab) local bg_img if current_tab == this_tab then - bg_img = "crafting_creative_active" .. hoch[this_tab] .. ".png" + bg_img = "crafting_creative_active" .. button_bg_postfix[this_tab] .. ".png" else - bg_img = "crafting_creative_inactive" .. hoch[this_tab] .. ".png" + bg_img = "crafting_creative_inactive" .. button_bg_postfix[this_tab] .. ".png" end return table.concat({ "style[" .. this_tab .. ";border=false;bgimg=;bgimg_pressed=;noclip=true]", @@ -476,7 +534,7 @@ function mcl_inventory.set_creative_formspec(player) local caption = "" if name ~= "inv" and filtername[name] then - caption = "label[0.375,0.375;" .. F(minetest.colorize("#313131", filtername[name])) .. "]" + caption = "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, filtername[name])) .. "]" end local formspec = table.concat({ @@ -490,8 +548,7 @@ function mcl_inventory.set_creative_formspec(player) "list[current_player;main;0.375,7.375;9,1;]", -- Trash - mcl_formspec.get_itemslot_bg_v4(11.625, 7.375, 1, 1, mcl_formspec.itemslot_border_size, - "crafting_creative_trash.png"), + mcl_formspec.get_itemslot_bg_v4(11.625, 7.375, 1, 1, nil, "crafting_creative_trash.png"), "list[detached:trash;main;11.625,7.375;1,1;]", main_list, diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 757d33c0a..288b697e1 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -135,7 +135,7 @@ function mcl_player.player_set_armor(player, texture) update_player_textures(player) end ----@param player ObjectRef +---@param player mt.PlayerObjectRef ---@param x number ---@param y number ---@param w number