api.lua 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. -- global values
  2. hud.registered_items = {}
  3. hud.damage_events = {}
  4. hud.breath_events = {}
  5. -- keep id handling internal
  6. local hud_id = {} -- hud item ids
  7. local sb_bg = {} -- statbar background ids
  8. -- localize often used table
  9. local items = hud.registered_items
  10. local function throw_error(msg)
  11. minetest.log("error", "Better HUD[error]: " .. msg)
  12. end
  13. --------------------------------------------------------------------------------
  14. -- API
  15. --------------------------------------------------------------------------------
  16. function hud.register(name, def)
  17. if not name or not def then
  18. throw_error("Not enough parameters given")
  19. return false
  20. end
  21. --TODO: allow other elements
  22. if def.hud_elem_type ~= "statbar" then
  23. throw_error("The given HUD element is not a statbar")
  24. return false
  25. end
  26. if items[name] ~= nil then
  27. throw_error("A statbar with that name already exists")
  28. return false
  29. end
  30. -- Actually register
  31. -- Add background first since draworder is based on id.
  32. if def.hud_elem_type == "statbar" and def.background ~= nil then
  33. sb_bg[name] = table.copy(def)
  34. sb_bg[name].text = def.background
  35. sb_bg[name].number = 20
  36. end
  37. -- add item itself
  38. items[name] = def
  39. -- register events
  40. if def.events then
  41. for _, v in pairs(def.events) do
  42. if v and v.type and v.func then
  43. if v.type == "damage" then
  44. table.insert(hud.damage_events, v)
  45. end
  46. if v.type == "breath" then
  47. table.insert(hud.breath_events, v)
  48. end
  49. end
  50. end
  51. end
  52. -- no error so far, return sucess
  53. return true
  54. end
  55. function hud.change_item(player, name, def)
  56. if not player or not player:is_player() or not name or not def then
  57. throw_error("Not enough parameters given to change HUD item")
  58. return false
  59. end
  60. local i_name = player:get_player_name().."_"..name
  61. local elem = hud_id[i_name]
  62. if not elem then
  63. --throw_error("Given HUD element " .. dump(name) .. " does not exist")
  64. return false
  65. end
  66. -- Update supported values (currently number and text only)
  67. if def.number and elem.number then
  68. elem.number = math.floor((def.number / def.max) * 20)
  69. player:hud_change(elem.id, "number", elem.number)
  70. end
  71. if def.text and elem.text then
  72. player:hud_change(elem.id, "text", def.text)
  73. elem.text = def.text
  74. end
  75. if def.offset and elem.offset then
  76. player:hud_change(elem.id, "offset", def.offset)
  77. elem.offset = def.offset
  78. end
  79. return true
  80. end
  81. function hud.remove_item(player, name)
  82. if not player or not name then
  83. throw_error("Not enough parameters given")
  84. return false
  85. end
  86. local i_name = player:get_player_name() .. "_" .. name
  87. if hud_id[i_name] == nil then
  88. --throw_error("Given HUD element " .. dump(name) .. " does not exist")
  89. return false
  90. end
  91. player:hud_remove(hud_id[i_name].id)
  92. hud_id[i_name] = nil
  93. return true
  94. end
  95. --------------------------------------------------------------------------------
  96. -- Add registered HUD items to joining players
  97. --------------------------------------------------------------------------------
  98. -- Following code is placed here to keep HUD ids internal.
  99. local function add_hud_item(player, name, def)
  100. if not player or not name or not def then
  101. throw_error("not enough parameters given")
  102. return false
  103. end
  104. local i_name = player:get_player_name() .. "_" .. name
  105. hud_id[i_name] = def
  106. hud_id[i_name].id = player:hud_add(def)
  107. end
  108. minetest.register_on_joinplayer(function(player)
  109. -- First: hide the default statbars.
  110. local hud_flags = player:hud_get_flags()
  111. hud_flags.healthbar = false
  112. hud_flags.breathbar = false
  113. player:hud_set_flags(hud_flags)
  114. -- Now add the backgrounds for statbars.
  115. for _, item in pairs(sb_bg) do
  116. add_hud_item(player, _ .. "_bg", item)
  117. end
  118. -- And finally the actual HUD items.
  119. for _, item in pairs(items) do
  120. add_hud_item(player, _, item)
  121. end
  122. end)