From 4431bc9ac037551b4bb3ce2b3bd6c69c507460ec Mon Sep 17 00:00:00 2001 From: James David Clarke Date: Mon, 15 Jan 2024 16:21:28 +0000 Subject: [PATCH] Fix Survival Tab API, closes #3902 --- mods/HUD/mcl_inventory/init.lua | 18 +++++++++++++++++- mods/HUD/mcl_inventory/survival.lua | 22 +++++----------------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index c2555581c..354d365ac 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -3,6 +3,19 @@ mcl_inventory = {} dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/creative.lua") dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/survival.lua") +local old_is_creative_enabled = minetest.is_creative_enabled + +function minetest.is_creative_enabled(name) + if old_is_creative_enabled(name) then return true end + if not name then return false end + assert(type(name) == "string", "minetest.is_creative_enabled requires a string (the playername) argument. This is likely an error in a non-mineclonia mod.") + local p = minetest.get_player_by_name(name) + if p then + return p:get_meta():get_string("gamemode") == "creative" + end + return false +end + ---@param player mt.PlayerObjectRef ---@param armor_change_only? boolean local function set_inventory(player, armor_change_only) @@ -73,12 +86,15 @@ end) ---@param player mt.PlayerObjectRef function mcl_inventory.update_inventory(player) - local player_gamemode = mcl_gamemode.get_gamemode(player) + local player_gamemode = player:get_meta():get_string("gamemode") + if player_gamemode == "" then player_gamemode = "survival" end + if player_gamemode == "creative" then mcl_inventory.set_creative_formspec(player) elseif player_gamemode == "survival" then player:set_inventory_formspec(mcl_inventory.build_survival_formspec(player)) end + mcl_meshhand.update_player(player) end mcl_gamemode.register_on_gamemode_change(function(player, old_gamemode, new_gamemode) diff --git a/mods/HUD/mcl_inventory/survival.lua b/mods/HUD/mcl_inventory/survival.lua index 5b5c6032c..c1bd1ee7c 100644 --- a/mods/HUD/mcl_inventory/survival.lua +++ b/mods/HUD/mcl_inventory/survival.lua @@ -1,18 +1,11 @@ ----@diagnostic disable need-check-nil - -local table = table -local ipairs = ipairs - local S = minetest.get_translator("mcl_inventory") local F = minetest.formspec_escape ----@type {id: string, description: string, item_icon: string, build: (fun(player: ObjectRef): string), handle: fun(player: ObjectRef, fields: table), access: (fun(player): boolean), show_inventory: boolean}[] mcl_inventory.registered_survival_inventory_tabs = {} ----@param def {id: string, description: string, item_icon: string, build: (fun(player: ObjectRef): string), handle: fun(player: ObjectRef, fields: table), access: (fun(player): boolean), show_inventory: boolean} function mcl_inventory.register_survival_inventory_tab(def) if #mcl_inventory.registered_survival_inventory_tabs == 7 then - error("Too much tabs registered!") + error("Too many tabs registered!") end assert(def.id) @@ -48,10 +41,6 @@ minetest.register_on_leaveplayer(function(player, timed_out) player_current_tab[player] = nil end) ----@param player ObjectRef ----@param content string ----@param inventory boolean ----@param tabname string local function build_page(player, content, inventory, tabname) local tab_buttons = "style_type[image;noclip=true]" @@ -134,10 +123,10 @@ local main_page_static = table.concat({ --Listring "listring[current_player;main]", - "listring[current_player;armor]", - "listring[current_player;main]", "listring[current_player;craft]", "listring[current_player;main]", + "listring[current_player;armor]", + "listring[current_player;main]", }) mcl_inventory.register_survival_inventory_tab({ @@ -180,7 +169,6 @@ mcl_inventory.register_survival_inventory_tab({ end, })]] ----@param player ObjectRef function mcl_inventory.build_survival_formspec(player) local inv = player:get_inventory() @@ -205,12 +193,12 @@ end minetest.register_on_player_receive_fields(function(player, formname, fields) if formname == "" and #mcl_inventory.registered_survival_inventory_tabs ~= 1 and - mcl_gamemode.get_gamemode(player) == "survival" then + player:get_meta():get_string("gamemode") ~= "creative" then for _, d in ipairs(mcl_inventory.registered_survival_inventory_tabs) do if fields["tab_" .. d.id] and d.access(player) then player_current_tab[player] = d.id mcl_inventory.update_inventory(player) - return + break end end