mirror of
				https://github.com/minetest-mods/unified_inventory.git
				synced 2025-10-30 23:25:47 +01:00 
			
		
		
		
	Compare commits
	
		
			36 Commits
		
	
	
		
			hide_uncra
			...
			6f132186ab
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6f132186ab | |||
|  | e071a01372 | ||
|  | 1547ebcdd4 | ||
|  | 16265dca2d | ||
|  | 235fa841dd | ||
|  | 2c9449b6e7 | ||
|  | b5de18b196 | ||
|  | 921a6d76ee | ||
|  | 004a39aaf7 | ||
|  | eb3bb03ebf | ||
|  | e7d03626b4 | ||
| cb6e602497 | |||
| aa04d4539f | |||
| a977ec47fd | |||
| 8c56e27c94 | |||
| 6da71e1819 | |||
| 9649c0ed0e | |||
| 4633a276a2 | |||
| 1ac54a017d | |||
| 4c4fb3ba88 | |||
| 9d66a21271 | |||
| 15a84bdbf4 | |||
| 838c67ae86 | |||
| 132a362f85 | |||
| 03b077cd1b | |||
| 829b38c6fc | |||
| 70fdb8556b | |||
| 497c632b24 | |||
| 46eeb36784 | |||
| 9a31609cfd | |||
| 8e6a3740ae | |||
| 1fd87f5c51 | |||
| e5dc9ed53a | |||
|  | 4bf5f22696 | ||
|  | 4f666f93d0 | ||
|  | 264833ed41 | 
| @@ -10,6 +10,7 @@ read_globals = { | ||||
| 	string = {fields = {"split", "trim"}}, | ||||
| 	table = {fields = {"copy", "getn"}}, | ||||
|  | ||||
| 	"dump", | ||||
| 	"minetest", "vector", | ||||
| 	"ItemStack", "datastorage", | ||||
|  | ||||
|   | ||||
							
								
								
									
										31
									
								
								api.lua
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								api.lua
									
									
									
									
									
								
							| @@ -184,6 +184,37 @@ minetest.after(0.01, function() | ||||
| 		ui.crafts_for.recipe[outputitemname] = new_recipe_list | ||||
| 	end | ||||
|  | ||||
| 	-- Remove unknown items from all categories | ||||
| 	local total_removed = 0 | ||||
| 	for cat_name, cat_def in pairs(ui.registered_category_items) do | ||||
| 		for itemname, _ in pairs(cat_def) do | ||||
| 			local idef = minetest.registered_items[itemname] | ||||
| 			if not idef then | ||||
| 				total_removed = total_removed + 1 | ||||
| 				--[[ | ||||
| 				-- For analysis | ||||
| 				minetest.log("warning", "[unified_inventory] Removed item '" | ||||
| 					.. itemname .. "' from category '" .. cat_name | ||||
| 					.. "'. Reason: item not registered") | ||||
| 				]] | ||||
| 				cat_def[itemname] = nil | ||||
| 			elseif not ui.is_itemdef_listable(idef) then | ||||
| 				total_removed = total_removed + 1 | ||||
| 				--[[ | ||||
| 				-- For analysis | ||||
| 				minetest.log("warning", "[unified_inventory] Removed item '" | ||||
| 					.. itemname .. "' from category '" .. cat_name | ||||
| 					.. "'. Reason: item is in 'not_in_creative_inventory' group") | ||||
| 				]] | ||||
| 				cat_def[itemname] = nil | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| 	if total_removed > 0 then | ||||
| 		minetest.log("info", "[unified_inventory] Removed " .. total_removed .. | ||||
| 			" items from the categories.") | ||||
| 	end | ||||
|  | ||||
| 	for _, callback in ipairs(ui.initialized_callbacks) do | ||||
| 		callback() | ||||
| 	end | ||||
|   | ||||
							
								
								
									
										2
									
								
								bags.lua
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								bags.lua
									
									
									
									
									
								
							| @@ -144,7 +144,7 @@ local function save_bags_metadata(player, bags_inv) | ||||
| 	end | ||||
| 	local meta = player:get_meta() | ||||
| 	if is_empty then | ||||
| 		meta:set_string("unified_inventory:bags", nil) | ||||
| 		meta:set_string("unified_inventory:bags", "") | ||||
| 	else | ||||
| 		meta:set_string("unified_inventory:bags", | ||||
| 			minetest.serialize(bags)) | ||||
|   | ||||
| @@ -115,6 +115,11 @@ function unified_inventory.set_category_index(category_name, index) | ||||
| 	update_category_list() | ||||
| end | ||||
| function unified_inventory.add_category_item(category_name, item) | ||||
| 	if type(item) ~= "string" then | ||||
| 		minetest.log("warning", "[unified_inventory] Cannot register category item: " .. dump(item)) | ||||
| 		return | ||||
| 	end | ||||
|  | ||||
| 	ensure_category_exists(category_name) | ||||
| 	unified_inventory.registered_category_items[category_name][item] = true | ||||
| end | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| local S = minetest.get_translator("unified_inventory") | ||||
| local ui = unified_inventory | ||||
|  | ||||
| unified_inventory.register_category('plants', { | ||||
| 	symbol = "flowers:tulip", | ||||
| @@ -25,71 +26,87 @@ unified_inventory.register_category('lighting', { | ||||
| 	label = S("Lighting") | ||||
| }) | ||||
|  | ||||
|  | ||||
| if unified_inventory.automatic_categorization then | ||||
| 	minetest.register_on_mods_loaded(function() | ||||
|  | ||||
| 		-- Add biome nodes to environment category | ||||
| 		for _,def in pairs(minetest.registered_biomes) do | ||||
| 			local env_nodes = { | ||||
| 				def.node_riverbed, def.node_top, def.node_filler, def.node_dust, | ||||
| 			} | ||||
| 			for i,node in pairs(env_nodes) do | ||||
| 				if node then | ||||
| 					unified_inventory.add_category_item('environment', node) | ||||
| 				end | ||||
| local function register_automatic_categorization() | ||||
| 	-- Add biome nodes to environment category | ||||
| 	for _,def in pairs(minetest.registered_biomes) do | ||||
| 		local env_nodes = { | ||||
| 			def.node_riverbed, def.node_top, def.node_filler, def.node_dust, | ||||
| 		} | ||||
| 		for i,node in pairs(env_nodes) do | ||||
| 			if node then | ||||
| 				unified_inventory.add_category_item('environment', node) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 		-- Add minable ores to minerals and everything else (pockets of stone & sand variations) to environment | ||||
| 		for _,item in  pairs(minetest.registered_ores) do | ||||
| 			if item.ore_type == "scatter" then | ||||
| 				local drop = minetest.registered_nodes[item.ore].drop | ||||
| 				if drop and drop ~= "" then | ||||
| 					unified_inventory.add_category_item('minerals', item.ore) | ||||
| 					unified_inventory.add_category_item('minerals', drop) | ||||
| 				else | ||||
| 					unified_inventory.add_category_item('environment', item.ore) | ||||
| 	-- Preparation for ore registration: find all possible drops (digging) | ||||
| 	local possible_node_dig_drops = { | ||||
| 		-- ["default:stone_with_coal"] = { "default:coal_lump", "mymod:raregem" } | ||||
| 		-- Ores may be contained multiple times, depending on drop chances. | ||||
| 	} | ||||
| 	for itemname, recipes in pairs(ui.crafts_for.usage) do | ||||
| 		for _, recipe in ipairs(recipes) do | ||||
| 			if recipe.type == "digging" or recipe.type == "digging_chance" then | ||||
| 				if not possible_node_dig_drops[itemname] then | ||||
| 					possible_node_dig_drops[itemname] = {} | ||||
| 				end | ||||
| 			else | ||||
| 				unified_inventory.add_category_item('environment', item.ore) | ||||
| 				local stack = ItemStack(recipe.output) | ||||
| 				table.insert(possible_node_dig_drops[itemname], stack:get_name()) | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 		-- Add items by item definition | ||||
| 		for name, def in pairs(minetest.registered_items) do | ||||
| 			local group = def.groups or {} | ||||
| 			if not group.not_in_creative_inventory then | ||||
| 				if group.stair or | ||||
| 				   group.slab or | ||||
| 				   group.wall or | ||||
| 				   group.fence then | ||||
| 					unified_inventory.add_category_item('building', name) | ||||
| 				elseif group.flora or | ||||
| 					   group.flower or | ||||
| 					   group.seed or | ||||
| 					   group.leaves or | ||||
| 					   group.sapling or | ||||
| 					   group.tree then | ||||
| 					unified_inventory.add_category_item('plants', name) | ||||
| 				elseif def.type == 'tool' then | ||||
| 					unified_inventory.add_category_item('tools', name) | ||||
| 				elseif def.liquidtype == 'source' then | ||||
| 					unified_inventory.add_category_item('environment', name) | ||||
| 				elseif def.light_source and def.light_source > 0 then | ||||
| 					unified_inventory.add_category_item('lighting', name) | ||||
| 				elseif group.door or | ||||
| 					   minetest.global_exists("doors") and ( | ||||
| 					     doors.registered_doors and doors.registered_doors[name..'_a'] or | ||||
| 					     doors.registered_trapdoors and doors.registered_trapdoors[name] | ||||
| 					   ) then | ||||
| 					unified_inventory.add_category_item('building', name) | ||||
| 				end | ||||
| 	-- Add minable ores to minerals and everything else (pockets of stone & sand variations) to environment | ||||
| 	for _, odef in pairs(minetest.registered_ores) do | ||||
| 		local drops = possible_node_dig_drops[odef.ore] | ||||
| 		if drops and odef.ore_type == "scatter" then | ||||
| 			ui.add_category_item('minerals', odef.ore) | ||||
| 			-- Register all possible drops as "minerals" | ||||
| 			ui.add_category_items('minerals', drops) | ||||
| 			possible_node_dig_drops[odef.ore] = {} -- mask as handled | ||||
| 		else | ||||
| 			ui.add_category_item('environment', odef.ore) | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	-- Add items by item definition | ||||
| 	for name, def in pairs(minetest.registered_items) do | ||||
| 		local group = def.groups or {} | ||||
| 		if not group.not_in_creative_inventory then | ||||
| 			if group.stair or | ||||
| 			   group.slab or | ||||
| 			   group.wall or | ||||
| 			   group.fence then | ||||
| 				unified_inventory.add_category_item('building', name) | ||||
| 			elseif group.flora or | ||||
| 				   group.flower or | ||||
| 				   group.seed or | ||||
| 				   group.leaves or | ||||
| 				   group.sapling or | ||||
| 				   group.tree then | ||||
| 				unified_inventory.add_category_item('plants', name) | ||||
| 			elseif def.type == 'tool' then | ||||
| 				unified_inventory.add_category_item('tools', name) | ||||
| 			elseif def.liquidtype == 'source' then | ||||
| 				unified_inventory.add_category_item('environment', name) | ||||
| 			elseif def.light_source and def.light_source > 0 then | ||||
| 				unified_inventory.add_category_item('lighting', name) | ||||
| 			elseif group.door or | ||||
| 				   minetest.global_exists("doors") and ( | ||||
| 					 doors.registered_doors and doors.registered_doors[name..'_a'] or | ||||
| 					 doors.registered_trapdoors and doors.registered_trapdoors[name] | ||||
| 				   ) then | ||||
| 				unified_inventory.add_category_item('building', name) | ||||
| 			end | ||||
| 		end | ||||
| 	end) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| if ui.automatic_categorization then | ||||
| 	ui.register_on_initialized(register_automatic_categorization) | ||||
| end | ||||
|  | ||||
|  | ||||
| -- [[ | ||||
| unified_inventory.add_category_items('plants', { | ||||
| 	"default:dry_grass_5", | ||||
| @@ -256,23 +273,6 @@ unified_inventory.add_category_items('minerals', { | ||||
| 	"default:coal_lump", | ||||
| 	"default:bronzeblock", | ||||
| 	"default:goldblock", | ||||
|  | ||||
| 	"stairs:slab_bronzeblock", | ||||
| 	"stairs:slab_copperblock", | ||||
| 	"stairs:slab_steelblock", | ||||
| 	"stairs:slab_tinblock", | ||||
| 	"stairs:stair_bronzeblock", | ||||
| 	"stairs:stair_copperblock", | ||||
| 	"stairs:stair_inner_bronzeblock", | ||||
| 	"stairs:stair_inner_copperblock", | ||||
| 	"stairs:stair_inner_steelblock", | ||||
| 	"stairs:stair_inner_tinblock", | ||||
| 	"stairs:stair_outer_bronzeblock", | ||||
| 	"stairs:stair_outer_copperblock", | ||||
| 	"stairs:stair_outer_steelblock", | ||||
| 	"stairs:stair_outer_tinblock", | ||||
| 	"stairs:stair_steelblock", | ||||
| 	"stairs:stair_tinblock", | ||||
| }) | ||||
|  | ||||
| unified_inventory.add_category_items('building', { | ||||
|   | ||||
							
								
								
									
										2
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								init.lua
									
									
									
									
									
								
							| @@ -199,3 +199,5 @@ if minetest.settings:get_bool("unified_inventory_waypoints") ~= false then | ||||
| 	dofile(modpath.."/waypoints.lua") | ||||
| end | ||||
| dofile(modpath.."/legacy.lua") -- mod compatibility | ||||
|  | ||||
| minetest.log("action", "[unified_inventory] loaded.") | ||||
|   | ||||
| @@ -368,6 +368,10 @@ function ui.apply_filter(player, filter, search_dir) | ||||
| 		local groups = lfilter:sub(7):split(",") | ||||
| 		ffilter = function(name) | ||||
| 			local def = registered_items[name] | ||||
| 			if not def then | ||||
| 				return false | ||||
| 			end | ||||
|  | ||||
| 			for _, group in ipairs(groups) do | ||||
| 				if not def.groups[group] | ||||
| 				or def.groups[group] <= 0 then | ||||
| @@ -383,6 +387,10 @@ function ui.apply_filter(player, filter, search_dir) | ||||
|  | ||||
| 		ffilter = function(name) | ||||
| 			local def = registered_items[name] | ||||
| 			if not def then | ||||
| 				return false | ||||
| 			end | ||||
|  | ||||
| 			local lname = string.lower(name) | ||||
| 			local ldesc = string.lower(def.description) | ||||
| 			local llocaldesc = minetest.get_translated_string | ||||
|   | ||||
| @@ -18,7 +18,8 @@ local function set_hud(player) | ||||
|  | ||||
| 	item_names[player_name] = { | ||||
| 		hud = player:hud_add({ | ||||
| 			hud_elem_type = "text", | ||||
| 			-- TODO: remove compatibility code when 5.8.0 is no longer used | ||||
| 			[minetest.features.hud_def_type_field and "type" or "hud_elem_type"] = "text", | ||||
| 			position = {x=0.5, y=1}, | ||||
| 			offset = off, | ||||
| 			alignment = {x=0, y=-1}, | ||||
|   | ||||
							
								
								
									
										72
									
								
								register.lua
									
									
									
									
									
								
							
							
						
						
									
										72
									
								
								register.lua
									
									
									
									
									
								
							| @@ -41,55 +41,6 @@ ui.register_button("craftguide", { | ||||
| 	tooltip = S("Crafting Guide") | ||||
| }) | ||||
|  | ||||
| ui.register_button("home_gui_set", { | ||||
| 	type = "image", | ||||
| 	image = "ui_sethome_icon.png", | ||||
| 	tooltip = S("Set home position"), | ||||
| 	hide_lite=true, | ||||
| 	action = function(player) | ||||
| 		local player_name = player:get_player_name() | ||||
| 		if minetest.check_player_privs(player_name, {home=true}) then | ||||
| 			ui.set_home(player, player:get_pos()) | ||||
| 			local home = ui.home_pos[player_name] | ||||
| 			if home ~= nil then | ||||
| 				minetest.sound_play("dingdong", | ||||
| 						{to_player=player_name, gain = 1.0}) | ||||
| 				minetest.chat_send_player(player_name, | ||||
| 					S("Home position set to: @1", minetest.pos_to_string(home))) | ||||
| 			end | ||||
| 		else | ||||
| 			minetest.chat_send_player(player_name, | ||||
| 				S("You don't have the \"home\" privilege!")) | ||||
| 			ui.set_inventory_formspec(player, ui.current_page[player_name]) | ||||
| 		end | ||||
| 	end, | ||||
| 	condition = function(player) | ||||
| 		return minetest.check_player_privs(player:get_player_name(), {home=true}) | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| ui.register_button("home_gui_go", { | ||||
| 	type = "image", | ||||
| 	image = "ui_gohome_icon.png", | ||||
| 	tooltip = S("Go home"), | ||||
| 	hide_lite=true, | ||||
| 	action = function(player) | ||||
| 		local player_name = player:get_player_name() | ||||
| 		if minetest.check_player_privs(player_name, {home=true}) then | ||||
| 			if ui.go_home(player) then | ||||
| 				minetest.sound_play("teleport", {to_player = player_name}) | ||||
| 			end | ||||
| 		else | ||||
| 			minetest.chat_send_player(player_name, | ||||
| 				S("You don't have the \"home\" privilege!")) | ||||
| 			ui.set_inventory_formspec(player, ui.current_page[player_name]) | ||||
| 		end | ||||
| 	end, | ||||
| 	condition = function(player) | ||||
| 		return minetest.check_player_privs(player:get_player_name(), {home=true}) | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| ui.register_button("misc_set_day", { | ||||
| 	type = "image", | ||||
| 	image = "ui_sun_icon.png", | ||||
| @@ -215,7 +166,7 @@ local function stack_image_button(x, y, w, h, buttonname_prefix, item) | ||||
| 		local group_name = name:sub(7) | ||||
| 		local group_item = ui.get_group_item(group_name) | ||||
| 		show_is_group = not group_item.sole | ||||
| 		displayitem = group_item.item or "unknown" | ||||
| 		displayitem = group_item.item or name | ||||
| 		selectitem = group_item.sole and displayitem or name | ||||
| 	end | ||||
| 	local label = show_is_group and "G" or "" | ||||
| @@ -298,11 +249,10 @@ ui.register_page("craftguide", { | ||||
|  | ||||
| 		local n = 4 | ||||
|  | ||||
| 		local item_def = minetest.registered_items[item_name] | ||||
| 		local item_name_shown | ||||
| 		if minetest.registered_items[item_name] | ||||
| 				and minetest.registered_items[item_name].description then | ||||
| 			item_name_shown = S("@1 (@2)", | ||||
| 				minetest.registered_items[item_name].description, item_name) | ||||
| 		if item_def and item_def.description then | ||||
| 			item_name_shown = S("@1 (@2)", item_def.description, item_name) | ||||
| 		else | ||||
| 			item_name_shown = item_name | ||||
| 		end | ||||
| @@ -327,12 +277,14 @@ ui.register_page("craftguide", { | ||||
| 				F(role_text[dir]), item_name_shown) | ||||
| 		n = n + 2 | ||||
|  | ||||
| 		local giveme_form = table.concat({ | ||||
| 			"label[".. (give_x+0.1)..",".. (craftguidey + 2.7) .. ";" .. F(S("Give me:")) .. "]", | ||||
| 			"button["..(give_x)..","..     (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_1;1]", | ||||
| 			"button["..(give_x+0.8)..",".. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_10;10]", | ||||
| 			"button["..(give_x+1.6)..",".. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_99;99]" | ||||
| 		}) | ||||
| 		local giveme_form = | ||||
| 			"label[" .. (give_x + 0.1) .. "," .. (craftguidey + 2.7) .. ";" .. F(S("Give me:")) .. "]" .. | ||||
| 			"button[" .. (give_x) .. "," .. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_1;1]" | ||||
| 		if item_def.type ~= "tool" then | ||||
| 			giveme_form = giveme_form .. | ||||
| 				"button[" .. (give_x + 0.8) .. "," .. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_10;10]" .. | ||||
| 				"button[" .. (give_x + 1.6) .. "," .. (craftguidey + 2.9) .. ";0.75,0.5;craftguide_giveme_99;99]" | ||||
| 		end | ||||
|  | ||||
| 		if not craft then | ||||
| 			-- No craft recipes available for this item. | ||||
|   | ||||
| @@ -103,7 +103,7 @@ local function get_waypoint_data(player) | ||||
| end | ||||
|  | ||||
| ui.register_page("waypoints", { | ||||
| 	get_formspec = function(player) | ||||
| 	get_formspec = function(player, perplayer_formspec) | ||||
| 		local player_name = player:get_player_name() | ||||
| 		local wp_info_x = ui.style_full.form_header_x + 1.25 | ||||
| 		local wp_info_y = ui.style_full.form_header_y + 0.5 | ||||
| @@ -115,12 +115,16 @@ ui.register_page("waypoints", { | ||||
| 		local sel = waypoints.selected or 1 | ||||
|  | ||||
| 		local formspec = { | ||||
| 			ui.style_full.standard_inv_bg, | ||||
| 			string.format("label[%f,%f;%s]", | ||||
| 				ui.style_full.form_header_x, ui.style_full.form_header_y, F(S("Waypoints"))), | ||||
| 			"image["..wp_info_x..","..wp_info_y..";1,1;ui_waypoints_icon.png]" | ||||
| 		} | ||||
| 		local n=4 | ||||
| 		local n=3 | ||||
|  | ||||
| 		if not perplayer_formspec.is_lite_mode then | ||||
| 			formspec[n] = ui.style_full.standard_inv_bg | ||||
| 			n = n + 1 | ||||
| 		end | ||||
|  | ||||
| 		-- Tabs buttons: | ||||
| 		for i = 1, COUNT do | ||||
| @@ -212,7 +216,10 @@ ui.register_page("waypoints", { | ||||
| 		formspec[n+2] = string.format("label[%f,%f;%s: %s]", | ||||
| 			wp_info_x, wp_info_y+2.60, F(S("HUD text color")), hud_colors[waypoint.color or 1][3]) | ||||
|  | ||||
| 		return {formspec=table.concat(formspec)} | ||||
| 		return { | ||||
| 			formspec = table.concat(formspec), | ||||
| 			draw_inventory = not perplayer_formspec.is_lite_mode, | ||||
| 		} | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| @@ -220,7 +227,6 @@ ui.register_button("waypoints", { | ||||
| 	type = "image", | ||||
| 	image = "ui_waypoints_icon.png", | ||||
| 	tooltip = S("Waypoints"), | ||||
| 	hide_lite=true | ||||
| }) | ||||
|  | ||||
| local function update_hud(player, waypoints, temp, i) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user