mirror of
				https://github.com/minetest-mods/unified_inventory.git
				synced 2025-10-31 15:45:29 +01:00 
			
		
		
		
	Compare commits
	
		
			49 Commits
		
	
	
		
			match_copy
			...
			6f132186ab
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 6f132186ab | |||
|  | e071a01372 | ||
|  | 1547ebcdd4 | ||
|  | 16265dca2d | ||
|  | 235fa841dd | ||
|  | 2c9449b6e7 | ||
|  | b5de18b196 | ||
|  | 921a6d76ee | ||
|  | 004a39aaf7 | ||
|  | eb3bb03ebf | ||
|  | e7d03626b4 | ||
| cb6e602497 | |||
|  | 693ca112b8 | ||
|  | 380b77d0fb | ||
|  | 43c9b50800 | ||
|  | 5d233a0f0a | ||
|  | 2426b6c912 | ||
|  | d6d4bea819 | ||
| aa04d4539f | |||
|  | 15d729c351 | ||
|  | b2cc3d1532 | ||
|  | 37969b2a1b | ||
|  | 1b074828a6 | ||
|  | de0063835c | ||
|  | bda9f2598f | ||
|  | b590764026 | ||
| 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", | ||||
|  | ||||
|   | ||||
							
								
								
									
										16
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								README.md
									
									
									
									
									
								
							| @@ -71,6 +71,9 @@ From http://www.clker.com (Public Domain, CC-BY-4.0): | ||||
|   * [`ui_pencil_icon.pnc`](http://www.clker.com/clipart-2256.html) | ||||
|   * [`ui_waypoint_set_icon.png`](http://www.clker.com/clipart-larger-flag.html) | ||||
|  | ||||
| From https://www.svgrepo.com (CC-BY) | ||||
|   * [`ui_teleport.png`](https://www.svgrepo.com/svg/321565/teleport) | ||||
|  | ||||
| Everaldo Coelho (YellowIcon) (LGPL v2.1+): | ||||
|  | ||||
|   * [`ui_craftguide_icon.png` / `ui_craft_icon.png`](http://commons.wikimedia.org/wiki/File:Advancedsettings.png) | ||||
| @@ -102,3 +105,16 @@ Other files from Wikimedia Commons: | ||||
| RealBadAngel: (CC-BY-4.0) | ||||
|  | ||||
|   * Everything else. | ||||
|  | ||||
|  | ||||
| ## Sounds | ||||
|  | ||||
|  * [`bell.ogg`](https://freesound.org/people/bennstir/sounds/81072/) by bennstir, CC 4.0 | ||||
|  * [`electricity.ogg`](https://freesound.org/people/Halleck/sounds/19486/) by Halleck, CC 4.0 (cut) | ||||
|  * [`pageflip1.ogg`](https://freesound.org/people/themfish/sounds/45823/) by themfish, CC 4.0 (cut, slowed down) | ||||
|  * `pageflip2.ogg` (derived from `pageflip1.ogg`) | ||||
|  * [`trash.ogg`](https://freesound.org/people/OwlStorm/sounds/151231/) by OwlStorm, CC 0 (speed up) | ||||
|  * [`trash_all.ogg`](https://freesound.org/people/abel_K/sounds/68280/) by abel_K, Sampling Plus 1.0 (speed up) | ||||
|  * [`ui_click.ogg`](https://freesound.org/people/lartti/sounds/527569/) by lartti, CC 0 (cut) | ||||
|  * [`ui_morning.ogg`](https://freesound.org/people/InspectorJ/sounds/439472/) by InspectorJ, CC 4.0 | ||||
|  * [`ui_owl.ogg`](https://freesound.org/people/manda_g/sounds/54987/) by manda_g, Sampling Plus 1.0 (cut) | ||||
|   | ||||
							
								
								
									
										37
									
								
								api.lua
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								api.lua
									
									
									
									
									
								
							| @@ -12,8 +12,9 @@ local function is_recipe_craftable(recipe) | ||||
| 			end | ||||
| 		else | ||||
| 			-- Possibly an item | ||||
| 			if not minetest.registered_items[itemname] | ||||
| 					or minetest.get_item_group(itemname, "not_in_craft_guide") ~= 0 then | ||||
| 			local itemname_cleaned = ItemStack(itemname):get_name() | ||||
| 			if not minetest.registered_items[itemname_cleaned] | ||||
| 					or minetest.get_item_group(itemname_cleaned, "not_in_craft_guide") ~= 0 then | ||||
| 				return false | ||||
| 			end | ||||
| 		end | ||||
| @@ -50,6 +51,7 @@ minetest.after(0.01, function() | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	table.sort(ui.items_list) | ||||
| 	ui.items_list_size = #ui.items_list | ||||
| 	print("Unified Inventory. Inventory size: "..ui.items_list_size) | ||||
| @@ -182,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 | ||||
|   | ||||
							
								
								
									
										72
									
								
								bags.lua
									
									
									
									
									
								
							
							
						
						
									
										72
									
								
								bags.lua
									
									
									
									
									
								
							| @@ -10,25 +10,26 @@ local F = minetest.formspec_escape | ||||
| local ui = unified_inventory | ||||
|  | ||||
| ui.register_page("bags", { | ||||
| 	get_formspec = function(player) | ||||
| 	get_formspec = function(player, perplayer_formspec) | ||||
| 		local player_name = player:get_player_name() | ||||
| 		return { formspec = table.concat({ | ||||
| 			ui.style_full.standard_inv_bg, | ||||
| 			ui.single_slot(0.925, 1.5), | ||||
| 			ui.single_slot(3.425, 1.5), | ||||
| 			ui.single_slot(5.925, 1.5), | ||||
| 			ui.single_slot(8.425, 1.5), | ||||
| 			"label["..ui.style_full.form_header_x..","..ui.style_full.form_header_y..";" .. F(S("Bags")) .. "]", | ||||
| 			"button[0.6125,2.75;1.875,0.75;bag1;" .. F(S("Bag @1", 1)) .. "]", | ||||
| 			"button[3.1125,2.75;1.875,0.75;bag2;" .. F(S("Bag @1", 2)) .. "]", | ||||
| 			"button[5.6125,2.75;1.875,0.75;bag3;" .. F(S("Bag @1", 3)) .. "]", | ||||
| 			"button[8.1125,2.75;1.875,0.75;bag4;" .. F(S("Bag @1", 4)) .. "]", | ||||
| 		local std_inv_x = perplayer_formspec.std_inv_x | ||||
| 		local formspec = { | ||||
| 			perplayer_formspec.standard_inv_bg, | ||||
| 			"label[", perplayer_formspec.form_header_x, ",", | ||||
| 				perplayer_formspec.form_header_y, ";", F(S("Bags")), "]", | ||||
| 			"listcolors[#00000000;#00000000]", | ||||
| 			"list[detached:" .. F(player_name) .. "_bags;bag1;1.075,1.65;1,1;]", | ||||
| 			"list[detached:" .. F(player_name) .. "_bags;bag2;3.575,1.65;1,1;]", | ||||
| 			"list[detached:" .. F(player_name) .. "_bags;bag3;6.075,1.65;1,1;]", | ||||
| 			"list[detached:" .. F(player_name) .. "_bags;bag4;8.575,1.65;1,1;]" | ||||
| 		}) } | ||||
| 		} | ||||
|  | ||||
| 		for i = 1, 4 do | ||||
| 			local x = std_inv_x + i * 2.5 | ||||
| 			formspec[#formspec + 1] = ui.single_slot(x - 1.875, 1.5) | ||||
| 			formspec[#formspec + 1] = string.format("list[detached:%s_bags;bag%i;%.3f,1.65;1,1;]", | ||||
| 				F(player_name), i, x - 1.725) | ||||
| 			formspec[#formspec + 1] = string.format("button[%.4f,2.75;1.875,0.75;bag%i;%s]", | ||||
| 				x - 2.1875, i, F(S("Bag @1", i))) | ||||
| 		end | ||||
|  | ||||
| 		return { formspec = table.concat(formspec) } | ||||
| 	end, | ||||
| }) | ||||
|  | ||||
| @@ -36,7 +37,6 @@ ui.register_button("bags", { | ||||
| 	type = "image", | ||||
| 	image = "ui_bags_icon.png", | ||||
| 	tooltip = S("Bags"), | ||||
| 	hide_lite=true | ||||
| }) | ||||
|  | ||||
| local function get_player_bag_stack(player, i) | ||||
| @@ -48,23 +48,38 @@ end | ||||
|  | ||||
| for bag_i = 1, 4 do | ||||
| 	ui.register_page("bag" .. bag_i, { | ||||
| 		get_formspec = function(player) | ||||
| 		get_formspec = function(player, perplayer_formspec) | ||||
| 			local stack = get_player_bag_stack(player, bag_i) | ||||
| 			local image = stack:get_definition().inventory_image | ||||
| 			local slots = stack:get_definition().groups.bagslots | ||||
| 			local std_inv_x = perplayer_formspec.std_inv_x | ||||
| 			local lite_mode = perplayer_formspec.is_lite_mode | ||||
|  | ||||
| 			local bag_inv_y, header_x, header_y = 1.5, 0.3, 0.65 | ||||
| 			if lite_mode then | ||||
| 				bag_inv_y = 0.5 | ||||
| 				header_x = perplayer_formspec.form_header_x | ||||
| 				header_y = perplayer_formspec.form_header_y | ||||
| 			end | ||||
|  | ||||
| 			local formspec = { | ||||
| 				ui.style_full.standard_inv_bg, | ||||
| 				ui.make_inv_img_grid(0.3, 1.5, 8, slots/8), | ||||
| 				"image[9.2,0.4;1,1;" .. image .. "]", | ||||
| 				"label[0.3,0.65;" .. F(S("Bag @1", bag_i)) .. "]", | ||||
| 				perplayer_formspec.standard_inv_bg, | ||||
| 				ui.make_inv_img_grid(std_inv_x, bag_inv_y, 8, slots/8), | ||||
| 				"label[", header_x, ",", header_y, ";", F(S("Bag @1", bag_i)), "]", | ||||
| 				"listcolors[#00000000;#00000000]", | ||||
| 				"listring[current_player;main]", | ||||
| 				string.format("list[current_player;bag%icontents;%f,%f;8,3;]", | ||||
| 				    bag_i, 0.3 + ui.list_img_offset, 1.5 + ui.list_img_offset), | ||||
| 				"listring[current_name;bag" .. bag_i .. "contents]", | ||||
| 				    bag_i, std_inv_x + ui.list_img_offset, bag_inv_y + ui.list_img_offset), | ||||
| 				"listring[current_name;bag", bag_i, "contents]", | ||||
| 			} | ||||
|  | ||||
| 			if lite_mode then | ||||
| 				return { formspec = table.concat(formspec) } | ||||
| 			end | ||||
|  | ||||
| 			local n = #formspec + 1 | ||||
| 			formspec[n] = "image[" .. std_inv_x + 8.9 .. ",0.4;1,1;" .. image .. "]" | ||||
| 			n = n + 1 | ||||
|  | ||||
| 			local player_name = player:get_player_name() -- For if statement. | ||||
| 			if ui.trash_enabled | ||||
| @@ -129,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)) | ||||
| @@ -206,6 +221,11 @@ minetest.register_on_joinplayer(function(player) | ||||
| 		on_take = function(inv, listname, index, stack, player) | ||||
| 			player:get_inventory():set_size(listname .. "contents", 0) | ||||
| 			save_bags_metadata(player, inv) | ||||
| 			if listname == ui.current_page[player:get_player_name()] then | ||||
| 				-- Bag is currently open: avoid follow-up issues by navigating back | ||||
| 				-- Trick: the list name is the same as the registered page name | ||||
| 				ui.set_inventory_formspec(player, "bags") | ||||
| 			end | ||||
| 		end, | ||||
| 		allow_move = function() | ||||
| 			return 0 | ||||
|   | ||||
| @@ -57,30 +57,47 @@ end) | ||||
| local function apply_new_filter(player, search_text, new_dir) | ||||
| 	local player_name = player:get_player_name() | ||||
|  | ||||
| 	minetest.sound_play("click", {to_player=player_name, gain = 0.1}) | ||||
| 	minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1}) | ||||
| 	ui.apply_filter(player, search_text, new_dir) | ||||
| 	ui.current_searchbox[player_name] = search_text | ||||
| 	ui.set_inventory_formspec(player, ui.current_page[player_name]) | ||||
| end | ||||
|  | ||||
| minetest.register_on_player_receive_fields(function(player, formname, fields) | ||||
| -- Search box handling | ||||
| local function receive_fields_searchbox(player, formname, fields) | ||||
| 	local player_name = player:get_player_name() | ||||
|  | ||||
| 	local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name) | ||||
| 	-- always take new search text, even if not searching on it yet | ||||
| 	if fields.searchbox and fields.searchbox ~= ui.current_searchbox[player_name] then | ||||
| 		ui.current_searchbox[player_name] = fields.searchbox | ||||
| 	end | ||||
|  | ||||
| 	if fields.searchbutton | ||||
| 			or fields.key_enter_field == "searchbox" then | ||||
|  | ||||
| 		if ui.current_searchbox[player_name] ~= ui.activefilter[player_name] then | ||||
| 			ui.apply_filter(player, ui.current_searchbox[player_name], "nochange") | ||||
| 			ui.set_inventory_formspec(player, ui.current_page[player_name]) | ||||
| 			minetest.sound_play("paperflip2", | ||||
| 					{to_player=player_name, gain = 1.0}) | ||||
| 		end | ||||
| 	elseif fields.searchresetbutton then | ||||
| 		if ui.activefilter[player_name] ~= "" then | ||||
| 			apply_new_filter(player, "", "nochange") | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| minetest.register_on_player_receive_fields(function(player, formname, fields) | ||||
| 	if formname ~= "" then | ||||
| 		return | ||||
| 	end | ||||
|  | ||||
| 	-- always take new search text, even if not searching on it yet | ||||
| 	local dirty_search_filter = false | ||||
| 	receive_fields_searchbox(player, formname, fields) | ||||
|  | ||||
| 	if fields.searchbox | ||||
| 	and fields.searchbox ~= unified_inventory.current_searchbox[player_name] then | ||||
| 		unified_inventory.current_searchbox[player_name] = fields.searchbox | ||||
| 		dirty_search_filter = true | ||||
| 	end | ||||
| 	local player_name = player:get_player_name() | ||||
|  | ||||
| 	local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name) | ||||
|  | ||||
| 	local clicked_category | ||||
| 	for name, value in pairs(fields) do | ||||
| @@ -114,7 +131,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) | ||||
| 	for i, def in pairs(unified_inventory.buttons) do | ||||
| 		if fields[def.name] then | ||||
| 			def.action(player) | ||||
| 			minetest.sound_play("click", | ||||
| 			minetest.sound_play("ui_click", | ||||
| 					{to_player=player_name, gain = 0.1}) | ||||
| 			return | ||||
| 		end | ||||
| @@ -179,7 +196,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) | ||||
| 		end | ||||
| 	end | ||||
| 	if clicked_item then | ||||
| 		minetest.sound_play("click", | ||||
| 		minetest.sound_play("ui_click", | ||||
| 				{to_player=player_name, gain = 0.1}) | ||||
| 		local page = unified_inventory.current_page[player_name] | ||||
| 		local player_creative = unified_inventory.is_creative(player_name) | ||||
| @@ -201,25 +218,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	if fields.searchbutton | ||||
| 			or fields.key_enter_field == "searchbox" then | ||||
| 		if dirty_search_filter then | ||||
| 			ui.apply_filter(player, ui.current_searchbox[player_name], "nochange") | ||||
| 			ui.set_inventory_formspec(player, ui.current_page[player_name]) | ||||
| 			minetest.sound_play("paperflip2", | ||||
| 					{to_player=player_name, gain = 1.0}) | ||||
| 		end | ||||
| 	elseif fields.searchresetbutton then | ||||
| 		if ui.activefilter[player_name] ~= "" then | ||||
| 			apply_new_filter(player, "", "nochange") | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	-- alternate buttons | ||||
| 	if not (fields.alternate or fields.alternate_prev) then | ||||
| 		return | ||||
| 	end | ||||
| 	minetest.sound_play("click", | ||||
| 	minetest.sound_play("ui_click", | ||||
| 			{to_player=player_name, gain = 0.1}) | ||||
| 	local item_name = unified_inventory.current_item[player_name] | ||||
| 	if not item_name then | ||||
|   | ||||
| @@ -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', { | ||||
|   | ||||
							
								
								
									
										14
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								init.lua
									
									
									
									
									
								
							| @@ -53,8 +53,9 @@ unified_inventory = { | ||||
| 	standard_background = "bgcolor[#0000]background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", | ||||
|  | ||||
| 	hide_disabled_buttons = minetest.settings:get_bool("unified_inventory_hide_disabled_buttons", false), | ||||
| 	hide_uncraftable_items = minetest.settings:get_bool("unified_inventory_hide_uncraftable_items", false), | ||||
|  | ||||
| 	version = 4 | ||||
| 	version = 5 | ||||
| } | ||||
|  | ||||
| local ui = unified_inventory | ||||
| @@ -191,7 +192,12 @@ dofile(modpath.."/register.lua") | ||||
| if minetest.settings:get_bool("unified_inventory_bags") ~= false then | ||||
| 	dofile(modpath.."/bags.lua") | ||||
| end | ||||
|  | ||||
| dofile(modpath.."/item_names.lua") | ||||
| dofile(modpath.."/waypoints.lua") | ||||
| if minetest.settings:get_bool("unified_inventory_item_names") ~= false then | ||||
| 	dofile(modpath.."/item_names.lua") | ||||
| end | ||||
| 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.") | ||||
|   | ||||
							
								
								
									
										57
									
								
								internal.lua
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								internal.lua
									
									
									
									
									
								
							| @@ -270,13 +270,15 @@ local function formspec_add_item_browser(player, formspec, ui_peruser) | ||||
| 					button_name, minetest.formspec_escape(tooltip) | ||||
| 				) | ||||
| 				n = n + 2 | ||||
| 				list_index = list_index + 1 | ||||
| 			end | ||||
| 			list_index = list_index + 1 | ||||
| 		end | ||||
| 	end | ||||
| 	formspec[n] = string.format("label[%f,%f;%s: %s]", | ||||
| 		ui_peruser.page_buttons_x + ui_peruser.btn_spc * (ui_peruser.is_lite_mode and 1 or 2), | ||||
| 		ui_peruser.page_buttons_y + 0.1 + ui_peruser.btn_spc * 2, | ||||
| 	formspec[n] = "style[page_number;content_offset=0]" | ||||
| 	formspec[n + 1] = string.format("image_button[%f,%f;%f,0.4;;page_number;%s: %s;false;false;]", | ||||
| 		ui_peruser.page_buttons_x, | ||||
| 		ui_peruser.page_buttons_y + ui_peruser.btn_spc * 2 - 0.1, | ||||
| 		ui_peruser.btn_spc * (bn - 1) + ui_peruser.btn_size, | ||||
| 		F(S("Page")), S("@1 of @2",page2,pagemax)) | ||||
| end | ||||
|  | ||||
| @@ -347,12 +349,29 @@ function ui.apply_filter(player, filter, search_dir) | ||||
| 	end | ||||
| 	local player_name = player:get_player_name() | ||||
|  | ||||
| 	-- Whether to show uncraftable items | ||||
| 	local fprefilter = function(_) | ||||
| 		return true | ||||
| 	end | ||||
| 	if ui.hide_uncraftable_items and not ui.is_creative(player_name) then | ||||
| 		fprefilter = function(name) | ||||
| 			return ui.get_recipe_list(name) | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	local registered_items = minetest.registered_items | ||||
| 	local lfilter = string.lower(filter) | ||||
| 	local ffilter | ||||
|  | ||||
| 	if lfilter:sub(1, 6) == "group:" then | ||||
| 		-- Group filter: all groups of the item must match | ||||
| 		local groups = lfilter:sub(7):split(",") | ||||
| 		ffilter = function(name, def) | ||||
| 		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 | ||||
| @@ -366,7 +385,12 @@ function ui.apply_filter(player, filter, search_dir) | ||||
| 		local player_info = minetest.get_player_information(player_name) | ||||
| 		local lang = player_info and player_info.lang_code or "" | ||||
|  | ||||
| 		ffilter = function(name, def) | ||||
| 		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 | ||||
| @@ -376,32 +400,29 @@ function ui.apply_filter(player, filter, search_dir) | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	local is_itemdef_listable = ui.is_itemdef_listable | ||||
| 	local filtered_items = {} | ||||
|  | ||||
| 	local category = ui.current_category[player_name] or 'all' | ||||
| 	if category == 'all' then | ||||
| 		for name, def in pairs(minetest.registered_items) do | ||||
| 			if is_itemdef_listable(def) | ||||
| 			and ffilter(name, def) then | ||||
| 		for _, name in ipairs(ui.items_list) do | ||||
| 			if fprefilter(name) and ffilter(name) then | ||||
| 				table.insert(filtered_items, name) | ||||
| 			end | ||||
| 		end | ||||
| 	elseif category == 'uncategorized' then | ||||
| 		for name, def in pairs(minetest.registered_items) do | ||||
| 			if is_itemdef_listable(def) | ||||
| 			and not ui.find_category(name) | ||||
| 			and ffilter(name, def) then | ||||
| 		for _, name in ipairs(ui.items_list) do | ||||
| 			if not ui.find_category(name) | ||||
| 					and fprefilter(name) | ||||
| 					and ffilter(name) then | ||||
| 				table.insert(filtered_items, name) | ||||
| 			end | ||||
| 		end | ||||
| 	else | ||||
| 		-- Any other category is selected | ||||
| 		for name, exists in pairs(ui.registered_category_items[category]) do | ||||
| 			local def = minetest.registered_items[name] | ||||
| 			if exists and def | ||||
| 			and is_itemdef_listable(def) | ||||
| 			and ffilter(name, def) then | ||||
| 			if exists | ||||
| 					and fprefilter(name) | ||||
| 					and ffilter(name) then | ||||
| 				table.insert(filtered_items, name) | ||||
| 			end | ||||
| 		end | ||||
|   | ||||
| @@ -3,6 +3,8 @@ | ||||
| local item_names = {} -- [player_name] = { hud, dtime, itemname } | ||||
| local dlimit = 3  -- HUD element will be hidden after this many seconds | ||||
| local hudbars_mod = minetest.get_modpath("hudbars") | ||||
| local only_names = minetest.settings:get_bool("unified_inventory_only_names", true) | ||||
| local max_length = tonumber(minetest.settings:get("unified_inventory_max_item_name_length")) or 80 | ||||
|  | ||||
| local function set_hud(player) | ||||
| 	local player_name = player:get_player_name() | ||||
| @@ -16,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}, | ||||
| @@ -60,6 +63,7 @@ minetest.register_globalstep(function(dtime) | ||||
| 			data.itemname = itemname | ||||
| 			data.index = index | ||||
| 			data.dtime = 0 | ||||
| 			local lang_code = minetest.get_player_information(player:get_player_name()).lang_code | ||||
|  | ||||
| 			local desc = stack.get_meta | ||||
| 				and stack:get_meta():get_string("description") | ||||
| @@ -69,6 +73,14 @@ minetest.register_globalstep(function(dtime) | ||||
| 				local def = minetest.registered_items[itemname] | ||||
| 				desc = def and def.description or "" | ||||
| 			end | ||||
| 			if only_names and desc and string.find(desc, "\n") then | ||||
| 				desc = string.match(desc, "([^\n]*)") | ||||
| 			end | ||||
| 			desc = minetest.get_translated_string(lang_code, desc) | ||||
| 			desc = minetest.strip_colors(desc) | ||||
| 			if string.len(desc) > max_length and max_length > 0 then | ||||
| 				desc = string.sub(desc, 1, max_length) .. " [...]" | ||||
| 			end | ||||
| 			player:hud_change(data.hud, 'text', desc) | ||||
| 		end | ||||
| 	end | ||||
|   | ||||
| @@ -1,98 +1,91 @@ | ||||
| # textdomain: unified_inventory | ||||
| Mixing= | ||||
| Cooking= | ||||
| Digging= | ||||
| Category:=Kategorie: | ||||
| Mixing=Miksowanie | ||||
| Cooking=Gotowanie | ||||
| Digging=Kopanie | ||||
| Bags=Plecaki | ||||
| Bag @1=Plecak @1 | ||||
| Small Bag=Maly plecak | ||||
| Medium Bag=Sredni plecak | ||||
| Large Bag=Duzy plecak | ||||
| All Items= | ||||
| Misc. Items= | ||||
| Plant Life= | ||||
| Building Materials= | ||||
| Tools= | ||||
| Minerals and Metals= | ||||
| Environment and Worldgen= | ||||
| Lighting= | ||||
| Small Bag=Mały plecak | ||||
| Medium Bag=Średni plecak | ||||
| Large Bag=Duży plecak | ||||
| All Items=Wszystkie przedmioty | ||||
| Misc. Items=Różne przedmioty | ||||
| Plant Life=Życie roślin | ||||
| Building Materials=Materiały budowlane | ||||
| Tools=Narzędzia | ||||
| Minerals and Metals=Minerały i metale | ||||
| Environment and Worldgen=Otoczenie i generowanie świata | ||||
| Lighting=Oświetlenie | ||||
|  and = i  | ||||
| Scroll categories left= | ||||
| Scroll categories right= | ||||
| Scroll categories left=Przewiń kategorię w lewo | ||||
| Scroll categories right=Przewiń kategorię w prawo | ||||
| Search=Szukaj | ||||
| Reset search and display everything= | ||||
| Reset search and display everything=Zresetuj wyszukiwanie i pokaż wszystko | ||||
| First page=Pierwsza strona | ||||
| Back three pages=3 strony w tyl | ||||
| Back one page=1 strona w tyl | ||||
| Forward one page=1 strona do przodu | ||||
| Forward three pages=3 strony do przodu | ||||
| Back three pages=Trzy strony do tyłu | ||||
| Back one page=Stronę do tyłu | ||||
| Forward one page=Stronę do przodu | ||||
| Forward three pages=Trzy strony do przodu | ||||
| Last page=Ostatnia strona | ||||
| No matching items=Brak pasujacych przedmiotow | ||||
| No matching items=Brak pasujących przedmiotów | ||||
| No matches.=Brak wyników | ||||
| Page=Strona | ||||
| @1 of @2=@1 z @2 | ||||
| Filter=Filtr | ||||
| Can use the creative inventory= | ||||
| Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally= | ||||
| Crafting Grid= | ||||
| Crafting Guide= | ||||
| Set home position=Ustaw pozycję wyjściową | ||||
| Home position set to: @1=Pozycja domowa ustawiona na: @1 | ||||
| You don't have the "home" privilege!=Nie masz uprawnien do zmiany czasu "home"! | ||||
| Can use the creative inventory=Może używać kreatywnego ekwipunku | ||||
| Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Wymusza wyświetlanie Unified Inventory w trybie Full jeżeli tryb Lite jest skonfigurowany globalnie | ||||
| Crafting Grid=Siatka craftingu | ||||
| Crafting Guide=Przewodnik craftingu | ||||
| Set home position=Ustaw pozycję domu | ||||
| Home position set to: @1=Pozycja domu ustawiona na: @1 | ||||
| You don't have the "home" privilege!=Brak uprawnień "home"! | ||||
| Go home=Idź do domu | ||||
| Set time to day=Ustaw czas na dzień | ||||
| Time of day set to 6am=Czas ustawiony na 6:00 | ||||
| You don't have the settime privilege!=Nie masz uprawnien do zmiany czasu "settime"! | ||||
| You don't have the settime privilege!=Brak uprawnień "settime"! | ||||
| Set time to night=Ustaw czas na noc | ||||
| Time of day set to 9pm=Czas ustawiony na 21:00 | ||||
| Clear inventory=Wyczyść zapasy | ||||
| This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.= | ||||
| Inventory cleared!=Zapasy zostały wyczyszczone! | ||||
| Trash:=Smietnik: | ||||
| Refill:=Uzupelnianie: | ||||
| Any item belonging to the @1 group= | ||||
| Any item belonging to the groups @1= | ||||
| Clear inventory=Wyczyść ekwipunek | ||||
| This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=Aby zapobiec przypadkowemu skasowaniu ekwipunku, ten przycisk został wyłączony poza trybem kreatywnym.@nUżyj zamiast tego ikony śmietnika. | ||||
| Inventory cleared!=Ekwipunek został wyczyszczony! | ||||
| Trash:=Śmietnik: | ||||
| Refill:=Uzupełnianie: | ||||
| Any item belonging to the @1 group=Każdy przedmiot należący do @1 grupy | ||||
| Any item belonging to the groups @1=Każdy przedmiot należacy do grup @1 | ||||
| Recipe @1 of @2=Recepta @1 z @2 | ||||
| Usage @1 of @2=Użycie @1 z @2 | ||||
| No recipes=Brak recepty | ||||
| No usages=Bez użycia | ||||
| Result=Wynik | ||||
| Ingredient=Składnik | ||||
| Show next recipe= | ||||
| Show next usage= | ||||
| Show previous recipe= | ||||
| Show previous usage= | ||||
| @1 (@2)= | ||||
| Show next recipe=Pokaż nastepną recepturę | ||||
| Show next usage=Pokaż następne użycie | ||||
| Show previous recipe=Pokaż poprzednią recepturę | ||||
| Show previous usage=Pokaż poprzednie użycie | ||||
| @1 (@2)=@1 (@2) | ||||
| Give me:=Daj mi: | ||||
| This recipe is too@@large to be displayed.= | ||||
| To craft grid:= | ||||
| This recipe is too@@large to be displayed.=Receptura jest zbyt@@duża aby ją wyświetlić. | ||||
| To craft grid:=Do siatki craftingu. | ||||
| All=Wszystko | ||||
| Crafting= | ||||
| White=Bialy | ||||
| Yellow=Zolty | ||||
| Crafting=Crafting | ||||
| White=Biały | ||||
| Yellow=Zółty | ||||
| Red=Czerwony | ||||
| Green=Zielony | ||||
| Blue=Niebieski | ||||
| Waypoints=Punkty orientacyjne | ||||
| Select Waypoint #@1=Wybierz punkt #@1 | ||||
| Waypoint @1=Punkty orientacyjne @1 | ||||
| Set waypoint to current location=Ustaw punkt orientacyjny na biezacej pozycji | ||||
| Hide waypoint= | ||||
| Show waypoint= | ||||
| Hide coordinates= | ||||
| Show coordinates= | ||||
| Change color of waypoint display=Zmien kolor punktu | ||||
| Edit waypoint name=Edytuj nazwe punktu | ||||
| Waypoint active=Punkt wlaczony | ||||
| Waypoint inactive=Punkt wylaczony | ||||
| Finish editing=Zakoncz edycje | ||||
| Set waypoint to current location=Ustaw punkt orientacyjny na bieżacej pozycji | ||||
| Hide waypoint=Ukryj punkt orientacyjny | ||||
| Show waypoint=Pokaż punkt orientacyjny | ||||
| Hide coordinates=Ukryj koordynaty | ||||
| Show coordinates=Pokaż koordynaty | ||||
| Change color of waypoint display=Zmień kolor punktu | ||||
| Edit waypoint name=Edytuj nazwę punktu | ||||
| Waypoint active=Punkt włączony | ||||
| Waypoint inactive=Punkt wyłączony | ||||
| Finish editing=Zakończ edycję | ||||
| World position=Pozycja | ||||
| Name=Nazwa | ||||
| HUD text color=Kolor tekstu HUD | ||||
|  | ||||
|  | ||||
| ##### not used anymore ##### | ||||
|  | ||||
| invisible=niewidzialny | ||||
| visible=widomy | ||||
| Make waypoint @1=Robić punkt @1 | ||||
| @1 display of waypoint coordinates=@1 koordynatow punktu | ||||
| HUD text color=Kolor tekstu HUD | ||||
							
								
								
									
										80
									
								
								register.lua
									
									
									
									
									
								
							
							
						
						
									
										80
									
								
								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", | ||||
| @@ -98,7 +49,7 @@ ui.register_button("misc_set_day", { | ||||
| 	action = function(player) | ||||
| 		local player_name = player:get_player_name() | ||||
| 		if minetest.check_player_privs(player_name, {settime=true}) then | ||||
| 			minetest.sound_play("birds", | ||||
| 			minetest.sound_play("ui_morning", | ||||
| 					{to_player=player_name, gain = 1.0}) | ||||
| 			minetest.set_timeofday((6000 % 24000) / 24000) | ||||
| 			minetest.chat_send_player(player_name, | ||||
| @@ -122,7 +73,7 @@ ui.register_button("misc_set_night", { | ||||
| 	action = function(player) | ||||
| 		local player_name = player:get_player_name() | ||||
| 		if minetest.check_player_privs(player_name, {settime=true}) then | ||||
| 			minetest.sound_play("owl", | ||||
| 			minetest.sound_play("ui_owl", | ||||
| 					{to_player=player_name, gain = 1.0}) | ||||
| 			minetest.set_timeofday((21000 % 24000) / 24000) | ||||
| 			minetest.chat_send_player(player_name, | ||||
| @@ -183,14 +134,14 @@ ui.register_page("craft", { | ||||
| 		local n=#formspec+1 | ||||
|  | ||||
| 		if ui.trash_enabled or ui.is_creative(player_name) or minetest.get_player_privs(player_name).give then | ||||
| 			formspec[n] = string.format("label[%f,%f;%s]", craftx + 6.45, crafty + 2.4, F(S("Trash:"))) | ||||
| 			formspec[n] = string.format("label[%f,%f;%s]", craftx + 6.35, crafty + 2.3, F(S("Trash:"))) | ||||
| 			formspec[n+1] = ui.make_trash_slot(craftx + 6.25, crafty + 2.5) | ||||
| 			n=n + 2 | ||||
| 		end | ||||
|  | ||||
| 		if ui.is_creative(player_name) then | ||||
| 			formspec[n] = ui.single_slot(craftx - 2.5, crafty + 2.5) | ||||
| 			formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.3, crafty + 2.4,F(S("Refill:"))) | ||||
| 			formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.4, crafty + 2.3, F(S("Refill:"))) | ||||
| 			formspec[n+2] = string.format("list[detached:%srefill;main;%f,%f;1,1;]", | ||||
| 				F(player_name), craftx - 2.5 + ui.list_img_offset, crafty + 2.5 + ui.list_img_offset) | ||||
| 		end | ||||
| @@ -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. | ||||
|   | ||||
| @@ -1,17 +1,36 @@ | ||||
| #Enabling lite mode enables a smaller and simpler version of the Unified | ||||
| #Inventory, optimized for small displays. | ||||
| # Reduced formspec layout, optimized for smaller displays. | ||||
| # Note: This may also disable some features to free up visual space. | ||||
| unified_inventory_lite (Lite mode) bool false | ||||
|  | ||||
| #If enabled, bags will be made available which can be used to extend | ||||
| #inventory storage size. | ||||
| # Provides craftable bag items to extend the inventory space. | ||||
| unified_inventory_bags (Enable bags) bool true | ||||
|  | ||||
| #If enabled, the trash slot can be used by those without both creative | ||||
| #and the give privilege. | ||||
| # Shows the trash slot to everyone. | ||||
| # When disabled, only players with the privilege "creative" or "give" will | ||||
| # have this slot shown in their inventory. | ||||
| unified_inventory_trash (Enable trash) bool true | ||||
|  | ||||
| #If enabled, disabled buttons will be hidden instead of grayed out. | ||||
| # Provides waypoints on a per-player basis to remember positions on the map. | ||||
| unified_inventory_waypoints (Enable waypoints) bool true | ||||
|  | ||||
| # If enabled, disabled buttons will be hidden instead of grayed out. | ||||
| unified_inventory_hide_disabled_buttons (Hide disabled buttons) bool false | ||||
|  | ||||
| # Hides items with no known craft recipe from the category "all" (default). | ||||
| # This setting has no effect on players in creative mode. | ||||
| unified_inventory_hide_uncraftable_items (Hide uncraftable items) bool false | ||||
|  | ||||
| unified_inventory_automatic_categorization (Items automatically added to categories) bool true | ||||
| # Automatically categorizes registered items based on their | ||||
| # groups. This is based on a fuzzy match, thus is not 100% accurate. | ||||
| unified_inventory_automatic_categorization (Categories: add items automatically) bool true | ||||
|  | ||||
| # Shows the selected wielded item description in the HUD for a few seconds. | ||||
| unified_inventory_item_names (Enable HUD item names) bool true | ||||
|  | ||||
| # Trims the shown wielded item description to the first line. | ||||
| unified_inventory_only_names (HUD item name: first line only) bool true | ||||
|  | ||||
| # Hard character limit of the wielded item description. | ||||
| # Crops the shown description to the specified length. | ||||
| # 0 disables this functionality. | ||||
| unified_inventory_max_item_name_length (HUD item names: character limit) int 80 | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								sounds/birds.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								sounds/birds.ogg
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								sounds/owl.ogg
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								sounds/owl.ogg
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								sounds/ui_click.ogg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								sounds/ui_click.ogg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								sounds/ui_morning.ogg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								sounds/ui_morning.ogg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								sounds/ui_owl.ogg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								sounds/ui_owl.ogg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								textures/ui_teleport.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								textures/ui_teleport.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 2.2 KiB | 
| @@ -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 | ||||
| @@ -140,36 +144,49 @@ ui.register_page("waypoints", { | ||||
|  | ||||
| 		-- Main buttons: | ||||
| 		local btnlist = { | ||||
| 			set_waypoint = { | ||||
| 				"ui_waypoint_set_icon.png", | ||||
| 				S("Set waypoint to current location") | ||||
| 			}, | ||||
| 			toggle_waypoint = { | ||||
| 			-- 1. formspec name | ||||
| 			-- 2. button image | ||||
| 			-- 3. translation text | ||||
| 			{ | ||||
| 				"toggle_waypoint", | ||||
| 				waypoint.active and "ui_on_icon.png" or "ui_off_icon.png", | ||||
| 				waypoint.active and S("Hide waypoint") or S("Show waypoint") | ||||
| 			}, | ||||
| 			toggle_display_pos = { | ||||
| 			{ | ||||
| 				"rename_waypoint", | ||||
| 				"ui_pencil_icon.png", | ||||
| 				S("Edit waypoint name") | ||||
| 			}, | ||||
| 			{ | ||||
| 				"set_waypoint", | ||||
| 				"ui_waypoint_set_icon.png", | ||||
| 				S("Set waypoint to current location") | ||||
| 			}, | ||||
| 			{ | ||||
| 				"toggle_display_pos", | ||||
| 				waypoint.display_pos and "ui_green_icon_background.png^ui_xyz_icon.png" or "ui_red_icon_background.png^ui_xyz_icon.png^(ui_no.png^[transformR90)", | ||||
| 				waypoint.display_pos and S("Hide coordinates") or S("Show coordinates") | ||||
| 			}, | ||||
| 			toggle_color = { | ||||
| 			{ | ||||
| 				"toggle_color", | ||||
| 				"ui_circular_arrows_icon.png", | ||||
| 				S("Change color of waypoint display") | ||||
| 			}, | ||||
| 			rename_waypoint = { | ||||
| 				"ui_pencil_icon.png", | ||||
| 				S("Edit waypoint name") | ||||
| 			} | ||||
| 		} | ||||
| 		if minetest.get_player_privs(player_name).teleport then | ||||
| 			table.insert(btnlist, { | ||||
| 				"teleport_waypoint", | ||||
| 				"ui_teleport.png", | ||||
| 				S("Teleport to waypoint") | ||||
| 			}) | ||||
| 		end | ||||
|  | ||||
| 		local x = 4 | ||||
| 		for name, def in pairs(btnlist) do | ||||
| 		for i, def in pairs(btnlist) do | ||||
| 			formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s%i;]", | ||||
| 				wp_buttons_rj - ui.style_full.btn_spc * x, wp_bottom_row, | ||||
| 				wp_buttons_rj + ui.style_full.btn_spc * (i - #btnlist), wp_bottom_row, | ||||
| 				ui.style_full.btn_size, ui.style_full.btn_size, | ||||
| 				def[1], name, sel) | ||||
| 			formspec[n+1] = "tooltip["..name..sel..";"..F(def[2]).."]" | ||||
| 			x = x - 1 | ||||
| 				def[2], def[1], sel) | ||||
| 			formspec[n+1] = "tooltip["..def[1]..sel..";"..F(def[3]).."]" | ||||
| 			n = n + 2 | ||||
| 		end | ||||
|  | ||||
| @@ -199,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, | ||||
| }) | ||||
|  | ||||
| @@ -207,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) | ||||
| @@ -313,6 +332,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) | ||||
| 			update_formspec = true | ||||
| 		end | ||||
|  | ||||
| 		if fields["teleport_waypoint" .. i] and waypoint.world_pos then | ||||
| 			if minetest.get_player_privs(player_name).teleport then | ||||
| 				minetest.sound_play("teleport", {to_player = player_name}) | ||||
| 				player:set_pos(waypoint.world_pos) | ||||
| 			end | ||||
| 		end | ||||
|  | ||||
| 		if hit then | ||||
| 			-- Save first | ||||
| 			waypoints.data[i] = waypoint | ||||
| @@ -323,6 +349,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) | ||||
| 			update_hud(player, waypoints, temp, i) | ||||
| 		end | ||||
| 		if update_formspec then | ||||
| 			minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1}) | ||||
| 			ui.set_inventory_formspec(player, "waypoints") | ||||
| 		end | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user