Use bag icons directly from UI
[minetest_inventory_icon.git] / init.lua
blob68dcead40d3b501c0403d31ddc1904d96695d792
1 local inventory_icon = {}
2 inventory_icon.hudids = {}
4 inventory_icon.COLORIZE_STRING = "[colorize:#A00000:192"
6 function inventory_icon.get_inventory_state(inv, listname)
7 local size = inv:get_size(listname)
8 local occupied = 0
9 for i=1,size do
10 local stack = inv:get_stack(listname, i)
11 if not stack:is_empty() then
12 occupied = occupied + 1
13 end
14 end
15 return occupied, size
16 end
18 function inventory_icon.replace_icon(name)
19 return name.."^[resize:32x32"
20 end
22 minetest.register_on_joinplayer(function(player)
23 local name = player:get_player_name()
24 inventory_icon.hudids[name] = {}
25 local occupied, size = inventory_icon.get_inventory_state(player:get_inventory(), "main")
26 local icon
27 if occupied >= size then
28 icon = "inventory_icon_backpack_full.png"
29 else
30 icon = "inventory_icon_backpack_free.png"
31 end
32 inventory_icon.hudids[name].main = {}
33 inventory_icon.hudids[name].main.icon = player:hud_add({
34 hud_elem_type = "image",
35 position = {x=1,y=1},
36 scale = {x=1,y=1},
37 offset = {x=-32,y=-32},
38 text = icon,
40 inventory_icon.hudids[name].main.text = player:hud_add({
41 hud_elem_type = "text",
42 position = {x=1,y=1},
43 scale = {x=1,y=1},
44 offset = {x=-36,y=-20},
45 alignment = {x=0,y=0},
46 number = 0xFFFFFF,
47 text = string.format("%d/%d", occupied, size)
49 if minetest.get_modpath("unified_inventory") ~= nil then
50 inventory_icon.hudids[name].bags = {}
51 local bags_inv = minetest.get_inventory({type = "detached", name = name.."_bags"})
52 for i=1,4 do
53 local bag = bags_inv:get_stack("bag"..i, 1)
54 local scale, text, icon
55 if bag:is_empty() then
56 scale = { x = 0, y = 0 }
57 text = ""
58 icon = "bags_small.png^[resize:32x32"
59 else
60 scale = { x = 1, y = 1 }
61 local occupied, size = inventory_icon.get_inventory_state(player:get_inventory(), "bag"..i.."contents")
62 text = string.format("%d/%d", occupied, size)
63 icon = inventory_icon.replace_icon(minetest.registered_items[bag:get_name()].inventory_image)
64 if occupied >= size then
65 icon = icon .. "^" .. inventory_icon.COLORIZE_STRING
66 end
67 end
68 inventory_icon.hudids[name].bags[i] = {}
69 inventory_icon.hudids[name].bags[i].icon = player:hud_add({
70 hud_elem_type = "image",
71 position = {x=1,y=1},
72 scale = scale,
73 size = { x=32, y=32 },
74 offset = {x=-36,y=-32 -40*i},
75 text = icon,
77 inventory_icon.hudids[name].bags[i].text = player:hud_add({
78 hud_elem_type = "text",
79 position = {x=1,y=1},
80 scale = scale,
81 offset = {x=-36,y=-20 -40*i},
82 alignment = {x=0,y=0},
83 number = 0xFFFFFF,
84 text = text,
86 end
87 end
88 end)
90 minetest.register_on_leaveplayer(function(player)
91 inventory_icon.hudids[player:get_player_name()] = nil
92 end)
94 inventory_icon.timer = 0
95 minetest.register_globalstep(function(dtime)
96 inventory_icon.timer = inventory_icon.timer + dtime
97 if inventory_icon.timer > 1 then
98 for playername,hudids in pairs(inventory_icon.hudids) do
99 local player = minetest.get_player_by_name(playername)
100 local occupied, size = inventory_icon.get_inventory_state(player:get_inventory(), "main")
101 local icon, color
102 if occupied >= size then
103 icon = "inventory_icon_backpack_full.png"
104 else
105 icon = "inventory_icon_backpack_free.png"
107 player:hud_change(hudids.main.icon, "text", icon)
108 player:hud_change(hudids.main.text, "text", string.format("%d/%d", occupied, size))
110 if minetest.get_modpath("unified_inventory") ~= nil then
111 local bags_inv = minetest.get_inventory({type = "detached", name = playername.."_bags"})
112 for i=1,4 do
113 local bag = bags_inv:get_stack("bag"..i, 1)
114 local scale, text, icon
115 if bag:is_empty() then
116 scale = { x = 0, y = 0 }
117 text = ""
118 icon = "bags_small.png^[resize:32x32"
119 else
120 scale = { x = 1, y = 1 }
121 local occupied, size = inventory_icon.get_inventory_state(player:get_inventory(), "bag"..i.."contents")
122 text = string.format("%d/%d", occupied, size)
123 icon = inventory_icon.replace_icon(minetest.registered_items[bag:get_name()].inventory_image)
124 if occupied >= size then
125 icon = icon .. "^" .. inventory_icon.COLORIZE_STRING
128 player:hud_change(inventory_icon.hudids[playername].bags[i].icon, "text", icon)
129 player:hud_change(inventory_icon.hudids[playername].bags[i].icon, "scale", scale)
131 player:hud_change(inventory_icon.hudids[playername].bags[i].text, "text", text)
132 player:hud_change(inventory_icon.hudids[playername].bags[i].text, "scale", scale)
136 inventory_icon.timer = 0
138 end)