mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-10-26 21:35:28 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			137 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local F = minetest.formspec_escape
 | |
| 
 | |
| -- Create a detached inventory
 | |
| local inv_everything = minetest.create_detached_inventory("everything", {
 | |
| 	allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
 | |
| 		return 0
 | |
| 	end,
 | |
| 	allow_put = function(inv, listname, index, stack, player)
 | |
| 		return 0
 | |
| 	end,
 | |
| 	allow_take = function(inv, listname, index, stack, player)
 | |
| 		return -1
 | |
| 	end,
 | |
| })
 | |
| local inv_trash = minetest.create_detached_inventory("trash", {
 | |
| 	allow_take = function(inv, listname, index, stack, player)
 | |
| 		return 0
 | |
| 	end,
 | |
| 	allow_move = function(inv, from_list, from_index, to_list, to_index, count, player)
 | |
| 		return 0
 | |
| 	end,
 | |
| 	on_put = function(inv, listname, index, stack, player)
 | |
| 		inv:set_list("main", {})
 | |
| 	end,
 | |
| })
 | |
| inv_trash:set_size("main", 1)
 | |
| 
 | |
| local max_page = 1
 | |
| 
 | |
| local function get_chest_formspec(page)
 | |
| 	local start = 0 + (page-1)*32
 | |
| 	return "size[8,9]"..
 | |
| 	"list[detached:everything;main;0,0;8,4;"..start.."]"..
 | |
| 	"list[current_player;main;0,5;8,4;]" ..
 | |
| 	"label[6,4;Trash:]" ..
 | |
| 	"list[detached:trash;main;7,4;1,1]" ..
 | |
| 	"button[0,4;1,1;chest_of_everything_prev;"..F("<").."]"..
 | |
| 	"button[1,4;1,1;chest_of_everything_next;"..F(">").."]"..
 | |
| 	"label[2,4;"..F("Page: "..page).."]"..
 | |
| 	"listring[detached:everything;main]"..
 | |
| 	"listring[current_player;main]"..
 | |
| 	"listring[detached:trash;main]"
 | |
| end
 | |
| 
 | |
| minetest.register_node("chest_of_everything:chest", {
 | |
| 	description = "Chest of Everything" .. "\n" ..
 | |
| 		"Grants access to all items",
 | |
| 	tiles ={"chest_of_everything_chest.png^[sheet:2x2:0,0", "chest_of_everything_chest.png^[sheet:2x2:0,0",
 | |
| 		"chest_of_everything_chest.png^[sheet:2x2:1,0", "chest_of_everything_chest.png^[sheet:2x2:1,0",
 | |
| 		"chest_of_everything_chest.png^[sheet:2x2:1,0", "chest_of_everything_chest.png^[sheet:2x2:0,1"},
 | |
| 	paramtype2 = "facedir",
 | |
| 	groups = {dig_immediate=2,choppy=3},
 | |
| 	is_ground_content = false,
 | |
| 	on_construct = function(pos)
 | |
| 		local meta = minetest.get_meta(pos)
 | |
| 		meta:set_string("infotext", "Chest of Everything")
 | |
| 		meta:set_int("page", 1)
 | |
| 		meta:set_string("formspec", get_chest_formspec(1))
 | |
| 	end,
 | |
| 	on_receive_fields = function(pos, formname, fields, sender)
 | |
| 		if formname == "" then
 | |
| 			local meta = minetest.get_meta(pos)
 | |
| 			local page = meta:get_int("page")
 | |
| 			if fields.chest_of_everything_prev then
 | |
| 				page = page - 1
 | |
| 			elseif fields.chest_of_everything_next then
 | |
| 				page = page + 1
 | |
| 			end
 | |
| 			if page < 1 then
 | |
| 				page = 1
 | |
| 			end
 | |
| 			if page > max_page then
 | |
| 				page = max_page
 | |
| 			end
 | |
| 			meta:set_int("page", page)
 | |
| 			meta:set_string("formspec", get_chest_formspec(page))
 | |
| 		end
 | |
| 	end,
 | |
| })
 | |
| 
 | |
| minetest.register_on_mods_loaded(function()
 | |
| 	local items = {}
 | |
| 	for itemstring,_ in pairs(minetest.registered_items) do
 | |
| 		if itemstring ~= "" and itemstring ~= "unknown" and itemstring ~= "ignore" then
 | |
| 			table.insert(items, itemstring)
 | |
| 		end
 | |
| 	end
 | |
| 	--[[ Sort items in this order:
 | |
| 	* Chest of Everything
 | |
| 	* Test tools
 | |
| 	* Other tools
 | |
| 	* Craftitems
 | |
| 	* Other items
 | |
| 	* Dummy items ]]
 | |
| 	local function compare(item1, item2)
 | |
| 		local def1 = minetest.registered_items[item1]
 | |
| 		local def2 = minetest.registered_items[item2]
 | |
| 		local tool1 = def1.type == "tool"
 | |
| 		local tool2 = def2.type == "tool"
 | |
| 		local testtool1 = minetest.get_item_group(item1, "testtool") == 1
 | |
| 		local testtool2 = minetest.get_item_group(item2, "testtool") == 1
 | |
| 		local dummy1 = minetest.get_item_group(item1, "dummy") == 1
 | |
| 		local dummy2 = minetest.get_item_group(item2, "dummy") == 1
 | |
| 		local craftitem1 = def1.type == "craft"
 | |
| 		local craftitem2 = def2.type == "craft"
 | |
| 		if item1 == "chest_of_everything:chest" then
 | |
| 			return true
 | |
| 		elseif item2 == "chest_of_everything:chest" then
 | |
| 			return false
 | |
| 		elseif dummy1 and not dummy2 then
 | |
| 			return false
 | |
| 		elseif not dummy1 and dummy2 then
 | |
| 			return true
 | |
| 		elseif testtool1 and not testtool2 then
 | |
| 			return true
 | |
| 		elseif not testtool1 and testtool2 then
 | |
| 			return false
 | |
| 		elseif tool1 and not tool2 then
 | |
| 			return true
 | |
| 		elseif not tool1 and tool2 then
 | |
| 			return false
 | |
| 		elseif craftitem1 and not craftitem2 then
 | |
| 			return true
 | |
| 		elseif not craftitem1 and craftitem2 then
 | |
| 			return false
 | |
| 		else
 | |
| 			return item1 < item2
 | |
| 		end
 | |
| 	end
 | |
| 	table.sort(items, compare)
 | |
| 	inv_everything:set_size("main", #items)
 | |
| 	max_page = math.ceil(#items / 32)
 | |
| 	for i=1, #items do
 | |
| 		inv_everything:add_item("main", items[i])
 | |
| 	end
 | |
| end)
 |