item_names.lua 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. -- Based on 4itemnames mod by 4aiman
  2. local item_names = {} -- [player_name] = { hud, dtime, itemname }
  3. local dlimit = 3 -- HUD element will be hidden after this many seconds
  4. local hudbars_mod = minetest.get_modpath("hudbars")
  5. local function set_hud(player)
  6. local player_name = player:get_player_name()
  7. local off = {x=0, y=-65}
  8. if hudbars_mod then
  9. -- Assume no alignment (2 per line)
  10. off.y = off.y - math.ceil(hb.hudbars_count / 2) * 25
  11. else
  12. off.y = off.y - 25
  13. end
  14. item_names[player_name] = {
  15. hud = player:hud_add({
  16. hud_elem_type = "text",
  17. position = {x=0.5, y=1},
  18. offset = off,
  19. alignment = {x=0, y=-1},
  20. number = 0xFFFFFF,
  21. text = "",
  22. }),
  23. dtime = dlimit,
  24. index = 1,
  25. itemname = ""
  26. }
  27. end
  28. minetest.register_on_joinplayer(function(player)
  29. minetest.after(0, set_hud, player)
  30. end)
  31. minetest.register_on_leaveplayer(function(player)
  32. item_names[player:get_player_name()] = nil
  33. end)
  34. minetest.register_globalstep(function(dtime)
  35. for _, player in pairs(minetest.get_connected_players()) do
  36. local data = item_names[player:get_player_name()]
  37. if not data or not data.hud then
  38. data = {} -- Update on next step
  39. set_hud(player)
  40. end
  41. local index = player:get_wield_index()
  42. local stack = player:get_wielded_item()
  43. local itemname = stack:get_name()
  44. if data.hud and data.dtime < dlimit then
  45. data.dtime = data.dtime + dtime
  46. if data.dtime > dlimit then
  47. player:hud_change(data.hud, 'text', "")
  48. end
  49. end
  50. if data.hud and (itemname ~= data.itemname or index ~= data.index) then
  51. data.itemname = itemname
  52. data.index = index
  53. data.dtime = 0
  54. local desc = stack.get_meta
  55. and stack:get_meta():get_string("description")
  56. if not desc or desc == "" then
  57. -- Try to use default description when none is set in the meta
  58. local def = minetest.registered_items[itemname]
  59. desc = def and def.description or ""
  60. end
  61. player:hud_change(data.hud, 'text', desc)
  62. end
  63. end
  64. end)