diff --git a/init.lua b/init.lua index 3a2fe46..e2b00a0 100644 --- a/init.lua +++ b/init.lua @@ -1,32 +1,62 @@ select_item = {} -local get_items = function() - local it = {} - for itemstring, itemdef in pairs(minetest.registered_items) do - table.insert(it, {itemstring=itemstring, itemdef=itemdef}) - end - return it -end -local check_item = function(itemstring, filter) +select_item.predef_filters = {} + +-- Creative Inventory items +select_item.predef_filters.creative = function(itemstring) local itemdef = minetest.registered_items[itemstring] - if itemstring == "air" or itemstring == "ignore" or itemstring == "unknown" then + if itemstring == "air" then return false end if itemdef.description == nil or itemdef.description == "" then return false end - if itemdef.groups ~= nil and itemdef.groups.not_in_creative_inventory ~= nil then + if minetest.get_item_group(itemstring, "not_in_creative_inventory") == 1 then return false end return true end -local xsize = 18 +-- No filtering +select_item.predef_filters.all = function() + return true +end + +local check_item = function(itemstring, filter) + local itemdef = minetest.registered_items[itemstring] + if itemstring == "" or itemstring == "unknown" or itemstring == "ignore" or itemdef == nil then + return + end + if type(filter) == "function" then + if filter(itemstring) == false then + return false + end + end + + return true +end + +local get_items = function(filter) + local it = {} + for itemstring, itemdef in pairs(minetest.registered_items) do + if check_item(itemstring, filter) then + table.insert(it, {itemstring=itemstring, itemdef=itemdef}) + end + end + -- Sort alphabetically by itemstring + local compare = function(t1, t2) + return t1.itemstring < t2.itemstring + end + table.sort(it, compare) + return it +end + +local xsize = 12 local ysize = 9 select_item.select_item = function(playername, filter, page) local form = "size["..xsize..","..(ysize+1).."]" - local items = get_items() + local items = get_items(filter) local x = 0 local y = 0.5 if page == nil then page = 1 end @@ -35,23 +65,25 @@ select_item.select_item = function(playername, filter, page) for i=start, #items do local itemstring = items[i].itemstring local itemdef = items[i].itemdef - if check_item(itemstring, filter) then - local name = "item_"..itemstring - form = form .. "item_image_button["..x..","..y..";1,1;"..itemstring..";"..name..";]" + local name = "item_"..itemstring + form = form .. "item_image_button["..x..","..y..";1,1;"..itemstring..";"..name..";]" + if itemdef.description == nil or itemdef.description == "" then + form = form .. "tooltip["..name..";"..itemstring.."]" + end - x = x + 1 - if x >= xsize then - x = 0 - y = y + 1 - if y >= ysize then - break - end + x = x + 1 + if x >= xsize then + x = 0 + y = y + 1 + if y >= ysize then + break end end end local ynav = (ysize + 0.5) form = form .. "button[0,"..ynav..";1,1;previous;<]" form = form .. "button[1,"..ynav..";1,1;next;>]" + form = form .. "label[2,"..ynav..";"..minetest.formspec_escape(string.format("Page %d", page)).."]" form = form .. "button_exit["..(xsize-2)..","..ynav..";2,1;cancel;Cancel]" minetest.show_formspec(playername, "select_item:page"..page, form) end @@ -82,7 +114,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) select_item.select_item(player:get_player_name(), nil, page - 1) elseif fields.next then local items = get_items() - local maxpage = (#items / (xsize*ysize)) + local maxpage = (#items / (xsize*ysize)) + 1 if page + 1 < maxpage then select_item.select_item(playername, nil, page + 1) end @@ -90,3 +122,4 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end end) +