summaryrefslogtreecommitdiff
path: root/api.lua
diff options
context:
space:
mode:
authorBlockMen <nmuelll@web.de>2015-04-02 16:08:02 +0200
committerBlockMen <nmuelll@web.de>2015-04-03 12:33:53 +0200
commit1071c7f13e491b2f3bc09bbbcb1bd6aaed6071c5 (patch)
treefbc4937b87c213cea5822d8b86eff2cafee36965 /api.lua
parent69a993861ef19f17626c72f6b0f9c03e137c5051 (diff)
Rewrite mod, push to 2.0
- Seperated hunger -> https://github.com/BlockMen/hunger - Added API
Diffstat (limited to 'api.lua')
-rw-r--r--api.lua206
1 files changed, 206 insertions, 0 deletions
diff --git a/api.lua b/api.lua
new file mode 100644
index 0000000..cdd9632
--- /dev/null
+++ b/api.lua
@@ -0,0 +1,206 @@
+-- global values
+hud.registered_items = {}
+hud.damage_events = {}
+hud.breath_events = {}
+
+-- keep id handling internal
+local hud_id = {} -- hud item ids
+local sb_bg = {} -- statbar background ids
+
+-- localize often used table
+local items = hud.registered_items
+
+local function throw_error(msg)
+ minetest.chat_send_all(msg)
+end
+
+
+--
+-- API
+--
+
+function hud.register(name, def)
+ if not name or not def then
+ throw_error("not enough parameters given")
+ return false
+ end
+
+ --TODO: allow other elements
+ if def.hud_elem_type ~= "statbar" then
+ throw_error("The given HUD element is no statbar")
+ return false
+ end
+ if items[name] ~= nil then
+ throw_error("A statbar with that name already exists")
+ return false
+ end
+
+ -- actually register
+ -- add background first since draworder is based on id :\
+ if def.hud_elem_type == "statbar" and def.background ~= nil then
+ sb_bg[name] = table.copy(def)
+ sb_bg[name].text = def.background
+ if not def.autohide_bg and def.max then
+ sb_bg[name].number = def.max
+ end
+ end
+ -- add item itself
+ items[name] = def
+
+ -- register events
+ if def.events then
+ for _,v in pairs(def.events) do
+ if v and v.type and v.func then
+ if v.type == "damage" then
+ table.insert(hud.damage_events, v)
+ end
+
+ if v.type == "breath" then
+ table.insert(hud.breath_events, v)
+ end
+ end
+ end
+ end
+
+ -- no error so far, return sucess
+ return true
+end
+
+function hud.change_item(player, name, def)
+ if not player or not name or not def then
+ throw_error("Not enough parameters given to change HUD item")
+ return false
+ end
+ local i_name = player:get_player_name().."_"..name
+ local elem = hud_id[i_name]
+ if not elem then
+ throw_error("Given HUD element " .. dump(name) .. " does not exist".." hääää")
+ return false
+ end
+
+ -- Only update if values supported and value actually changed
+ -- update supported values (currently number and text only)
+ if def.number and elem.number then
+ if def.number ~= elem.number then
+ if elem.max and def.number > elem.max and not def.max then
+ def.number = elem.max
+ end
+ if def.max then
+ elem.max = def.max
+ end
+ player:hud_change(elem.id, "number", def.number)
+ elem.number = def.number
+ -- hide background when set
+ local bg = hud_id[i_name.."_bg"]
+ if elem.autohide_bg then
+ if def.number < 1 then
+ player:hud_change(bg.id, "number", 0)
+ else
+ local num = bg.number
+ if bg.max then
+ num = bg.max
+ end
+ player:hud_change(bg.id, "number", num)
+ end
+ else
+ if bg and bg.max and bg.max < 1 and def.max and def.max > bg.max then
+ player:hud_change(bg.id, "number", def.max)
+ bg.max = def.max
+ end
+ end
+ end
+ end
+ if def.text and elem.text then
+ if def.text ~= elem.text then
+ player:hud_change(elem.id, "text", def.text)
+ elem.text = def.text
+ end
+ end
+
+ if def.offset and elem.offset then
+ if def.item_name and def.offset == "item" then
+ local i_name2 = player:get_player_name().."_"..def.item_name
+ local elem2 = hud_id[i_name2]
+ if elem2 then
+ local p2 = elem2.offset
+ local p1 = elem.offset
+ player:hud_change(elem2.id, "offset", p1)
+ player:hud_change(elem.id, "offset", p2)
+ elem2.offset = p1
+ elem.offset = p2
+ if elem.background then
+ local elem3 = hud_id[i_name.."_bg"]
+ if elem3 and elem3.offset then
+ player:hud_change(elem3.id, "offset", p2)
+ elem3.offset = p2
+ local elem4 = hud_id[i_name2.."_bg"]
+ if elem4 and elem4.offset then
+ player:hud_change(elem4.id, "offset", p1)
+ elem4.offset = p1
+ end
+ end
+ end
+ end
+ else
+ player:hud_change(elem.id, "offset", def.offset)
+ elem.offset = def.offset
+ end
+ end
+
+ return true
+end
+
+function hud.remove_item(player, name)
+ if not player or not name then
+ throw_error("Not enough parameters given")
+ return false
+ end
+ local i_name = player:get_player_name().."_"..name
+ if hud_id[i_name] == nil then
+ throw_error("Given HUD element " .. dump(name) .. " does not exist")
+ return false
+ end
+ player:hud_remove(hud_id[i_name].id)
+ hud_id[i_name] = nil
+
+ return true
+end
+
+
+--
+-- Add registered HUD items to joining players
+--
+
+-- Following code is placed here to keep HUD ids internal
+local function add_hud_item(player, name, def)
+ if not player or not name or not def then
+ throw_error("not enough parameters given")
+ return false
+ end
+ local i_name = player:get_player_name().."_"..name
+ hud_id[i_name] = def
+ hud_id[i_name].id = player:hud_add(def)
+end
+
+minetest.register_on_joinplayer(function(player)
+
+ -- first: hide the default statbars
+ player:hud_set_flags({healthbar = false, breathbar = false})
+
+ -- now add the backgrounds (e.g. for statbars)
+ for _,item in pairs(sb_bg) do
+ add_hud_item(player, _.."_bg", item)
+ end
+ -- and finally the actual HUD items
+ for _,item in pairs(items) do
+ add_hud_item(player, _, item)
+ end
+
+ -- fancy hotbar (only when no crafting mod present)
+ if minetest.get_modpath("crafting") == nil then
+ minetest.after(0.5, function()
+ player:hud_set_hotbar_image("hud_hotbar.png")
+ player:hud_set_hotbar_selected_image("hud_hotbar_selected.png")
+ end)
+ end
+end)