itemwheel.lua 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. local hb = {}
  2. local scale = tonumber(core.setting_get("hud_scaling")) or 1
  3. local function update_wheel(player)
  4. local name = player:get_player_name()
  5. if not player or not name then
  6. return
  7. end
  8. local i = player:get_wield_index()
  9. local i1 = i - 1
  10. local i3 = i + 1
  11. -- it's a wheel
  12. if i1 < 1 then
  13. i1 = HUD_IW_MAX
  14. end
  15. if i3 > HUD_IW_MAX then
  16. i3 = 1
  17. end
  18. -- get the displayed items
  19. local inv = player:get_inventory()
  20. local item = hb[name].item
  21. local index = hb[name].index
  22. local item2 = player:get_wielded_item():get_name()
  23. -- update all items when wielded has changed
  24. if item and item2 and item ~= item2 or item == "wheel_init" or (index and index ~= i) then
  25. local items = {}
  26. items[1] = inv:get_stack("main", i1):get_name() or nil
  27. items[2] = item2
  28. items[3] = inv:get_stack("main", i3):get_name() or nil
  29. local num = player:get_wielded_item():get_count()
  30. local wear = player:get_wielded_item():get_wear()
  31. if num < 2 then
  32. num = ""
  33. else
  34. num = tostring(num)
  35. end
  36. if wear > 0 then
  37. num = tostring(100 - math.floor((wear/65535)*100)) .. "%"
  38. end
  39. for n, m in pairs(items) do
  40. -- some default values
  41. local image = "hud_wielded.png"
  42. local need_scale = false
  43. local s1 = {x = 1*scale, y = 1*scale}
  44. local s2 = {x = 3*scale, y = 3*scale}
  45. if n ~= 2 then
  46. s1 = {x = 0.6*scale, y = 0.6*scale}
  47. s2 = {x = 2*scale, y = 2*scale}
  48. end
  49. -- get the images
  50. local def = minetest.registered_items[m]
  51. if def then
  52. if def.tiles and (def.tiles[1] and not def.tiles[1].name) then
  53. image = minetest.inventorycube(def.tiles[1], def.tiles[6] or def.tiles[3] or def.tiles[1], def.tiles[3] or def.tiles[1])
  54. need_scale = true
  55. end
  56. if def.inventory_image and def.inventory_image ~= "" then
  57. image = def.inventory_image
  58. need_scale = false
  59. end
  60. if def.wielded_image and def.wielded_image ~= "" then
  61. image = def.wielded_image
  62. need_scale = false
  63. end
  64. -- needed for nodes with inventory cube inv imges, e.g. glass
  65. if string.find(image, 'inventorycube') then
  66. need_scale = true
  67. end
  68. end
  69. -- get the id and update hud elements
  70. local id = hb[name].id[n]
  71. if id and image then
  72. if need_scale then
  73. player:hud_change(id, "scale", s1)
  74. else
  75. player:hud_change(id, "scale", s2)
  76. end
  77. -- make previous and next item darker
  78. --if n ~= 2 then
  79. --image = image .. "^[colorize:#0005"
  80. --end
  81. player:hud_change(id, "text", image)
  82. end
  83. end
  84. if hb[name].id[4] then
  85. player:hud_change(hb[name].id[4], "text", num)
  86. end
  87. end
  88. -- update wielded buffer
  89. if hb[name].id[2] ~= nil then
  90. hb[name].item = item2
  91. hb[name].index = i
  92. end
  93. end
  94. minetest.register_on_joinplayer(function(player)
  95. local name = player:get_player_name()
  96. hb[name]= {}
  97. hb[name].id = {}
  98. hb[name].item = "wheel_init"
  99. hb[name].index = 1
  100. minetest.after(0.1, function()
  101. -- hide builtin hotbar
  102. local hud_flags = player:hud_get_flags()
  103. hud_flags.hotbar = false
  104. player:hud_set_flags(hud_flags)
  105. player:hud_add({
  106. hud_elem_type = "image",
  107. text = "hud_new.png",
  108. position = {x = 0.5, y = 1},
  109. scale = {x = 1*scale, y = 1*scale},
  110. alignment = {x = 0, y = -1},
  111. offset = {x = 0, y = 0}
  112. })
  113. hb[name].id[1] = player:hud_add({
  114. hud_elem_type = "image",
  115. text = "hud_wielded.png",
  116. position = {x = 0.5, y = 1},
  117. scale = {x = 1*scale, y = 1*scale},
  118. alignment = {x = 0, y = -1},
  119. offset = {x = -75*scale, y = -8*scale}
  120. })
  121. hb[name].id[2] = player:hud_add({
  122. hud_elem_type = "image",
  123. text = "hud_wielded.png",
  124. position = {x = 0.5, y = 1},
  125. scale = {x = 3*scale, y = 3*scale},
  126. alignment = {x = 0, y = -1},
  127. offset = {x = 0, y = -12*scale}
  128. })
  129. hb[name].id[3] = player:hud_add({
  130. hud_elem_type = "image",
  131. text = "hud_wielded.png",
  132. position = {x = 0.5, y = 1},
  133. scale = {x = 1*scale, y = 1*scale},
  134. alignment = {x = 0, y = -1},
  135. offset = {x = 75*scale, y = -8*scale}
  136. })
  137. hb[name].id[4] = player:hud_add({
  138. hud_elem_type = "text",
  139. position = {x = 0.5, y = 1},
  140. offset = {x = 35*scale, y = -55*scale},
  141. alignment = {x = 0, y = -1},
  142. number = 0xffffff,
  143. text = "",
  144. })
  145. -- init item wheel
  146. minetest.after(0, function()
  147. hb[name].item = "wheel_init"
  148. update_wheel(player)
  149. end)
  150. end)
  151. end)
  152. local function update_wrapper(a, b, player)
  153. local name = player:get_player_name()
  154. if not name then
  155. return
  156. end
  157. minetest.after(0, function()
  158. hb[name].item = "wheel_init"
  159. update_wheel(player)
  160. end)
  161. end
  162. minetest.register_on_placenode(update_wrapper)
  163. minetest.register_on_dignode(update_wrapper)
  164. local timer = 0
  165. minetest.register_globalstep(function(dtime)
  166. timer = timer + dtime
  167. if timer >= HUD_IW_TICK then
  168. timer = 0
  169. for _, player in ipairs(minetest.get_connected_players()) do
  170. update_wheel(player)
  171. end
  172. end--timer
  173. end)