From 1127231ca9333497d70debc07c9ae0293c42be6f Mon Sep 17 00:00:00 2001 From: cora Date: Fri, 27 May 2022 15:06:25 +0200 Subject: [PATCH 1/2] Fix crash on non existent xp-hud due to gamemode --- mods/HUD/mcl_experience/init.lua | 60 ++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index aea805fa2..6ead36687 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -156,33 +156,7 @@ function mcl_experience.throw_xp(pos, total_xp) end end -function mcl_experience.update(player) - local xp = mcl_experience.get_xp(player) - local cache = caches[player] - - cache.level = xp_to_level(xp) - - if not minetest.is_creative_enabled(player:get_player_name()) then - player:hud_change(hud_bars[player], "text", "mcl_experience_bar_background.png^[lowpart:" - .. math.floor(math.floor(xp_to_bar(xp, cache.level) * 18) / 18 * 100) - .. ":mcl_experience_bar.png^[transformR270" - ) - - if cache.level == 0 then - player:hud_change(hud_levels[player], "text", "") - else - player:hud_change(hud_levels[player], "text", tostring(cache.level)) - end - end -end - -function mcl_experience.register_on_add_xp(func, priority) - table.insert(mcl_experience.on_add_xp, {func = func, priority = priority or 0}) -end - --- callbacks - -minetest.register_on_joinplayer(function(player) +local function setup_hud(player) caches[player] = { last_time = get_time(), } @@ -205,7 +179,39 @@ minetest.register_on_joinplayer(function(player) z_index = 12, }) end +end +function mcl_experience.update(player) + local xp = mcl_experience.get_xp(player) + local cache = caches[player] + + cache.level = xp_to_level(xp) + + if not minetest.is_creative_enabled(player:get_player_name()) then + if not hud_bars[player] then + setup_hud(player) + end + player:hud_change(hud_bars[player], "text", "mcl_experience_bar_background.png^[lowpart:" + .. math.floor(math.floor(xp_to_bar(xp, cache.level) * 18) / 18 * 100) + .. ":mcl_experience_bar.png^[transformR270" + ) + + if cache.level == 0 then + player:hud_change(hud_levels[player], "text", "") + else + player:hud_change(hud_levels[player], "text", tostring(cache.level)) + end + end +end + +function mcl_experience.register_on_add_xp(func, priority) + table.insert(mcl_experience.on_add_xp, {func = func, priority = priority or 0}) +end + +-- callbacks + +minetest.register_on_joinplayer(function(player) + setup_hud(player) mcl_experience.update(player) end) From ae2860d017e9c962384528c971c07d96eb0f9dfd Mon Sep 17 00:00:00 2001 From: cora Date: Fri, 27 May 2022 19:56:47 +0200 Subject: [PATCH 2/2] Show/Hide XP-hud immediately after gamemode switch --- mods/HUD/mcl_experience/init.lua | 19 ++++++++++++++++--- mods/HUD/mcl_inventory/init.lua | 6 ++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index 6ead36687..37250ee2f 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -156,7 +156,20 @@ function mcl_experience.throw_xp(pos, total_xp) end end -local function setup_hud(player) +function mcl_experience.remove_hud(player) + if hud_bars[player] then + player:hud_remove(hud_bars[player]) + hud_bars[player] = nil + end + if hud_levels[player] then + player:hud_remove(hud_levels[player]) + hud_levels[player] = nil + end +end + +function mcl_experience.setup_hud(player) + if hud_bars[player] and hud_levels[player] then return end + mcl_experience.remove_hud(player) caches[player] = { last_time = get_time(), } @@ -189,7 +202,7 @@ function mcl_experience.update(player) if not minetest.is_creative_enabled(player:get_player_name()) then if not hud_bars[player] then - setup_hud(player) + mcl_experience.setup_hud(player) end player:hud_change(hud_bars[player], "text", "mcl_experience_bar_background.png^[lowpart:" .. math.floor(math.floor(xp_to_bar(xp, cache.level) * 18) / 18 * 100) @@ -211,7 +224,7 @@ end -- callbacks minetest.register_on_joinplayer(function(player) - setup_hud(player) + mcl_experience.setup_hud(player) mcl_experience.update(player) end) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index eb6b4c7b1..1a73e59df 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -206,6 +206,12 @@ local gamemodes = { function mcl_inventory.player_set_gamemode(p,g) local m = p:get_meta() m:set_string("gamemode",g) + if g == "survival" then + mcl_experience.setup_hud(p) + mcl_experience.update(p) + elseif g == "creative" then + mcl_experience.remove_hud(p) + end set_inventory(p) end