123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- local hb = {}
- local scale = tonumber(core.setting_get("hud_scaling")) or 1
- local function update_wheel(player)
- local name = player:get_player_name()
- if not player or not name then
- return
- end
- local i = player:get_wield_index()
- local i1 = i - 1
- local i3 = i + 1
- -- it's a wheel
- if i1 < 1 then
- i1 = HUD_IW_MAX
- end
- if i3 > HUD_IW_MAX then
- i3 = 1
- end
- -- get the displayed items
- local inv = player:get_inventory()
- local item = hb[name].item
- local index = hb[name].index
- local item2 = player:get_wielded_item():get_name()
- -- update all items when wielded has changed
- if item and item2 and item ~= item2 or item == "wheel_init" or (index and index ~= i) then
- local items = {}
- items[1] = inv:get_stack("main", i1):get_name() or nil
- items[2] = item2
- items[3] = inv:get_stack("main", i3):get_name() or nil
- local num = player:get_wielded_item():get_count()
- local wear = player:get_wielded_item():get_wear()
- if num < 2 then
- num = ""
- else
- num = tostring(num)
- end
- if wear > 0 then
- num = tostring(100 - math.floor((wear/65535)*100)) .. "%"
- end
- for n, m in pairs(items) do
- -- some default values
- local image = "hud_wielded.png"
- local need_scale = false
- local s1 = {x = 1*scale, y = 1*scale}
- local s2 = {x = 3*scale, y = 3*scale}
- if n ~= 2 then
- s1 = {x = 0.6*scale, y = 0.6*scale}
- s2 = {x = 2*scale, y = 2*scale}
- end
- -- get the images
- local def = minetest.registered_items[m]
- if def then
- if def.tiles and (def.tiles[1] and not def.tiles[1].name) then
- image = minetest.inventorycube(def.tiles[1], def.tiles[6] or def.tiles[3] or def.tiles[1], def.tiles[3] or def.tiles[1])
- need_scale = true
- end
- if def.inventory_image and def.inventory_image ~= "" then
- image = def.inventory_image
- need_scale = false
- end
- if def.wielded_image and def.wielded_image ~= "" then
- image = def.wielded_image
- need_scale = false
- end
- -- needed for nodes with inventory cube inv imges, e.g. glass
- if string.find(image, 'inventorycube') then
- need_scale = true
- end
- end
- -- get the id and update hud elements
- local id = hb[name].id[n]
- if id and image then
- if need_scale then
- player:hud_change(id, "scale", s1)
- else
- player:hud_change(id, "scale", s2)
- end
- -- make previous and next item darker
- --if n ~= 2 then
- --image = image .. "^[colorize:#0005"
- --end
- player:hud_change(id, "text", image)
- end
- end
- if hb[name].id[4] then
- player:hud_change(hb[name].id[4], "text", num)
- end
- end
- -- update wielded buffer
- if hb[name].id[2] ~= nil then
- hb[name].item = item2
- hb[name].index = i
- end
- end
- minetest.register_on_joinplayer(function(player)
- local name = player:get_player_name()
- hb[name]= {}
- hb[name].id = {}
- hb[name].item = "wheel_init"
- hb[name].index = 1
- minetest.after(0.1, function()
- -- hide builtin hotbar
- local hud_flags = player:hud_get_flags()
- hud_flags.hotbar = false
- player:hud_set_flags(hud_flags)
- player:hud_add({
- hud_elem_type = "image",
- text = "hud_new.png",
- position = {x = 0.5, y = 1},
- scale = {x = 1*scale, y = 1*scale},
- alignment = {x = 0, y = -1},
- offset = {x = 0, y = 0}
- })
- hb[name].id[1] = player:hud_add({
- hud_elem_type = "image",
- text = "hud_wielded.png",
- position = {x = 0.5, y = 1},
- scale = {x = 1*scale, y = 1*scale},
- alignment = {x = 0, y = -1},
- offset = {x = -75*scale, y = -8*scale}
- })
- hb[name].id[2] = player:hud_add({
- hud_elem_type = "image",
- text = "hud_wielded.png",
- position = {x = 0.5, y = 1},
- scale = {x = 3*scale, y = 3*scale},
- alignment = {x = 0, y = -1},
- offset = {x = 0, y = -12*scale}
- })
- hb[name].id[3] = player:hud_add({
- hud_elem_type = "image",
- text = "hud_wielded.png",
- position = {x = 0.5, y = 1},
- scale = {x = 1*scale, y = 1*scale},
- alignment = {x = 0, y = -1},
- offset = {x = 75*scale, y = -8*scale}
- })
- hb[name].id[4] = player:hud_add({
- hud_elem_type = "text",
- position = {x = 0.5, y = 1},
- offset = {x = 35*scale, y = -55*scale},
- alignment = {x = 0, y = -1},
- number = 0xffffff,
- text = "",
- })
- -- init item wheel
- minetest.after(0, function()
- hb[name].item = "wheel_init"
- update_wheel(player)
- end)
- end)
- end)
- local function update_wrapper(a, b, player)
- local name = player:get_player_name()
- if not name then
- return
- end
- minetest.after(0, function()
- hb[name].item = "wheel_init"
- update_wheel(player)
- end)
- end
- minetest.register_on_placenode(update_wrapper)
- minetest.register_on_dignode(update_wrapper)
- local timer = 0
- minetest.register_globalstep(function(dtime)
- timer = timer + dtime
- if timer >= HUD_IW_TICK then
- timer = 0
- for _, player in ipairs(minetest.get_connected_players()) do
- update_wheel(player)
- end
- end--timer
- end)
|