123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- -- 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.log("error", "Better HUD[error]: " .. 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
- -- swaps stabar positions
- function hud.swap_statbar(player, item1, item2)
- if not player or not item1 or not item2 then
- throw_error("Not enough parameters given to swap statbars")
- return false
- end
- local def1 = items[item1] or nil
- local def2 = items[item2] or nil
- if not def1 or not def2 then
- throw_error("Can't swap statbars. Given statbars are not correct")
- return false
- end
- local pos_swap = false
- local p_name = player:get_player_name()
- local elem1 = hud_id[p_name.."_"..item1]
- local elem2 = hud_id[p_name.."_"..item2]
- player:hud_change(elem2.id, "offset", def1.offset)
- player:hud_change(elem1.id, "offset", def2.offset)
- if def1.position.x ~= def2.position.x or def1.position.y ~= def2.position.y then
- player:hud_change(elem2.id, "position", def1.position)
- player:hud_change(elem1.id, "position", def2.position)
- pos_swap = true
- end
- -- do the items have backgrounds? if so, swap them aswell
- local bg1 = hud_id[p_name.."_"..item1.."_bg"] or nil
- local bg2 = hud_id[p_name.."_"..item2.."_bg"] or nil
- if bg1 ~= nil and bg1.id then
- player:hud_change(bg1.id, "offset", def2.offset)
- if pos_swap == true then
- player:hud_change(bg1.id, "position", def2.position)
- end
- end
- if bg2 ~= nil and bg2.id then
- player:hud_change(bg2.id, "offset", def1.offset)
- if pos_swap == true then
- player:hud_change(bg2.id, "position", def1.position)
- end
- end
- return true
- end
- function hud.change_item(player, name, def)
- if not player or not player:is_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
- bg.number = 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
- -- for legacy reasons
- if def.item_name then
- hud.swap_statbar(player, name, def.item_name)
- 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
- local hud_flags = player:hud_get_flags()
- hud_flags.healthbar = false
- hud_flags.breathbar = false
- player:hud_set_flags(hud_flags)
- -- now add the backgrounds 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)
|