From 6c0c617b393c6d461316f5e70fedcb0b359ebe29 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Tue, 22 Nov 2016 14:59:40 +0100 Subject: [PATCH] Fix possible crash after player left --- API.md | 17 +++++++++-------- init.lua | 23 +++++++++++++++++++++-- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/API.md b/API.md index c4eb87b..03e93ea 100644 --- a/API.md +++ b/API.md @@ -95,8 +95,7 @@ the HUD bar will be initially be shown to the player. * `start_hidden`: Whether the HUD bar is initially hidden. This is optional, `default_start_hidden` of the registration function will be used as default #### Return value -Always `nil`. - +`true` on success, `false` otherwise. ## Modifying a HUD bar @@ -135,7 +134,7 @@ such network optimization for the “styling” parameters, so keep this in mind * `new_text_color`: A 3-octet number defining the new color of the text. #### Return value -Always `nil`. +`true` on success, `false` otherwise. ## Hiding and unhiding a HUD bar @@ -156,7 +155,7 @@ Hides the specified HUD bar from the screen of the specified player. * `identifier`: The identifier of the HUD bar type to hide, as specified in `hb.register_hudbar`. #### Return value -Always `nil`. +`true` on success, `false` otherwise. ### `hb.unhide_hudbar(player, identifier)` @@ -167,7 +166,7 @@ Makes a previously hidden HUD bar visible again to a player. * `identifier`: The identifier of the HUD bar type to unhide, as specified in `hb.register_hudbar`. #### Return value -Always `nil`. +`true` on success, `false` otherwise. ## Reading HUD bar information @@ -181,12 +180,14 @@ Returns the current state of the active player's HUD bar. * `identifier`: The identifier of the HUD bar type to hide, as specified in `hb.register_hudbar`. #### Return value -A table which holds information on the current state of the HUD bar. Note the table is a deep -copy of the internal HUD bar state, it is *not* a reference; the information hold by the table is -only true for the moment you called this function. The fields of this table are: +On success, returns a table which holds information on the current state of the HUD bar. Note +the table is a deep copy of the internal HUD bar state, it is *not* a reference; the information +hold by the table is only true for the moment you called this function. The fields of this table are: * `value`: Current value of HUD bar. * `max`: Current maximum value of HUD bar. * `hidden`: Boolean denoting whether the HUD bar is hidden. * `barlength`: The length of the HUD bar in pixels. This field is meaningless if the HUD bar is currently hidden. * `text`: The text shown on the HUD bar. This fiels is meaningless if the HUD bar is currently hidden. + +If the player does not exist, returns `nil` instead. diff --git a/init.lua b/init.lua index ff95214..651a22d 100644 --- a/init.lua +++ b/init.lua @@ -90,6 +90,10 @@ else hb.settings.sorting_reverse = { [0] = "health", [1] = "breath" } end +local function player_exists(player) + return player ~= nil and player:is_player() +end + -- Table which contains all players with active default HUD bars (only for internal use) hb.players = {} @@ -285,13 +289,18 @@ function hb.register_hudbar(identifier, text_color, label, textures, default_sta end function hb.init_hudbar(player, identifier, start_value, start_max, start_hidden) + if not player_exists(player) then return false end local hudtable = hb.get_hudtable(identifier) hb.hudtables[identifier].add_all(player, hudtable, start_value, start_max, start_hidden) + return true end function hb.change_hudbar(player, identifier, new_value, new_max_value, new_icon, new_bgicon, new_bar, new_label, new_text_color) if new_value == nil and new_max_value == nil and new_icon == nil and new_bgicon == nil and new_bar == nil and new_label == nil and new_text_color == nil then - return + return true + end + if not player_exists(player) then + return false end local name = player:get_player_name() @@ -379,11 +388,14 @@ function hb.change_hudbar(player, identifier, new_value, new_max_value, new_icon end end end + return true end function hb.hide_hudbar(player, identifier) + if not player_exists(player) then return false end local name = player:get_player_name() local hudtable = hb.get_hudtable(identifier) + if hudtable == nil then return false end if(hudtable.hudstate[name].hidden == false) then if hb.settings.bar_type == "progress_bar" then if hudtable.hudids[name].icon ~= nil then @@ -397,11 +409,14 @@ function hb.hide_hudbar(player, identifier) player:hud_change(hudtable.hudids[name].bar, "number", 0) hudtable.hudstate[name].hidden = true end + return true end function hb.unhide_hudbar(player, identifier) + if not player_exists(player) then return false end local name = player:get_player_name() local hudtable = hb.get_hudtable(identifier) + if hudtable == nil then return false end if(hudtable.hudstate[name].hidden) then local value = hudtable.hudstate[name].value local max = hudtable.hudstate[name].max @@ -419,9 +434,11 @@ function hb.unhide_hudbar(player, identifier) player:hud_change(hudtable.hudids[name].bar, "number", hb.value_to_barlength(value, max)) hudtable.hudstate[name].hidden = false end + return true end function hb.get_hudbar_state(player, identifier) + if not player_exists(player) then return nil end local ref = hb.get_hudtable(identifier).hudstate[player:get_player_name()] -- Do not forget to update this chunk of code in case the state changes local copy = { @@ -467,6 +484,7 @@ end -- update built-in HUD bars local function update_hud(player) + if not player_exists() then return end if minetest.setting_getbool("enable_damage") then if hb.settings.forceload_default_hudbars then hb.unhide_hudbar(player, "health") @@ -510,7 +528,8 @@ minetest.register_globalstep(function(dtime) if minetest.setting_getbool("enable_damage") or hb.settings.forceload_default_hudbars then for _, player in pairs(hb.players) do -- update all hud elements - update_hud(player) +minetest.after(1,function(player) update_hud(player) end, player) +-- update_hud(player) end end end