Compare commits
	
		
			71 Commits
		
	
	
		
			nalc-1.2.0
			...
			4c4fb3ba88
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 4c4fb3ba88 | |||
| 
						 | 
					8c84751ff8 | ||
| 9d66a21271 | |||
| 
						 | 
					b1c85a2cb8 | ||
| 
						 | 
					3fffa41eaf | ||
| 
						 | 
					077bed90eb | ||
| 15a84bdbf4 | |||
| 
						 | 
					6d123da61c | ||
| 
						 | 
					d39dd78cb5 | ||
| 838c67ae86 | |||
| 
						 | 
					aeb9841e3a | ||
| 132a362f85 | |||
| 
						 | 
					afd38e0c73 | ||
| 
						 | 
					4d4355a741 | ||
| 03b077cd1b | |||
| 
						 | 
					6e6383f082 | ||
| 829b38c6fc | |||
| 
						 | 
					860371ecf8 | ||
| 70fdb8556b | |||
| 
						 | 
					c044f5e3b0 | ||
| 
						 | 
					608cdfb887 | ||
| 
						 | 
					afb295ec22 | ||
| 
						 | 
					a84ce24067 | ||
| 
						 | 
					a7556c5044 | ||
| 
						 | 
					3d58befe03 | ||
| 
						 | 
					d0deba10c8 | ||
| 
						 | 
					97b882ad23 | ||
| 
						 | 
					44e32df00a | ||
| 
						 | 
					40d862298b | ||
| 
						 | 
					0ebc9402ed | ||
| 
						 | 
					2c16805ef9 | ||
| 
						 | 
					dc61d2980a | ||
| 
						 | 
					21f122336f | ||
| 
						 | 
					8ee0eb9fce | ||
| 
						 | 
					1210dbfe22 | ||
| 
						 | 
					b8a568d7eb | ||
| 
						 | 
					9ddea6eced | ||
| 
						 | 
					76c9bb9517 | ||
| 
						 | 
					60d7a6d213 | ||
| 
						 | 
					8e94d86420 | ||
| 
						 | 
					6d892dda5b | ||
| 
						 | 
					37546289bc | ||
| 
						 | 
					3e7f005366 | ||
| 
						 | 
					382219c466 | ||
| 
						 | 
					5ea0208ffe | ||
| 
						 | 
					694553e68b | ||
| 
						 | 
					2d200eb9ae | ||
| 
						 | 
					b3077898a7 | ||
| 
						 | 
					5a8a75f43b | ||
| 
						 | 
					0c05f06fa8 | ||
| 
						 | 
					c3679eaf7b | ||
| 
						 | 
					23a089f174 | ||
| 
						 | 
					82bc2d3f95 | ||
| 
						 | 
					603b5d1d4e | ||
| 
						 | 
					eb4cf5bf47 | ||
| 
						 | 
					97960c552b | ||
| 
						 | 
					81d6a1e796 | ||
| 
						 | 
					de575a6513 | ||
| 
						 | 
					7a0a44037a | ||
| 
						 | 
					cc93288a6b | ||
| 
						 | 
					167dddaa84 | ||
| 
						 | 
					d1a4396fbe | ||
| 
						 | 
					fbbf786caf | ||
| 
						 | 
					ae124b02c2 | ||
| 
						 | 
					ebd1d1f245 | ||
| 497c632b24 | |||
| 
						 | 
					0f756a5d33 | ||
| 46eeb36784 | |||
| 
						 | 
					341a438267 | ||
| 
						 | 
					d86592841e | ||
| 
						 | 
					f25426911d | 
@@ -14,6 +14,7 @@ read_globals = {
 | 
				
			|||||||
	"ItemStack", "datastorage",
 | 
						"ItemStack", "datastorage",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"hb",
 | 
						"hb",
 | 
				
			||||||
 | 
						"doors",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
files["callbacks.lua"].ignore = { "player", "draw_lite_mode" }
 | 
					files["callbacks.lua"].ignore = { "player", "draw_lite_mode" }
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								README.md
									
									
									
									
									
								
							
							
						
						@@ -15,7 +15,8 @@ Unified Inventory replaces the default survival and creative inventory.
 | 
				
			|||||||
    * Recipe search function by ingredients
 | 
					    * Recipe search function by ingredients
 | 
				
			||||||
 * Up to four bags with up to 24 slots each
 | 
					 * Up to four bags with up to 24 slots each
 | 
				
			||||||
 * Home function to teleport
 | 
					 * Home function to teleport
 | 
				
			||||||
 * Trash slot
 | 
					 * Trash slot and refill slot for creative
 | 
				
			||||||
 | 
					 * Waypoints to keep track of important locations
 | 
				
			||||||
 * Lite mode: reduces the item browser width
 | 
					 * Lite mode: reduces the item browser width
 | 
				
			||||||
    * `minetest.conf` setting `unified_inventory_lite = true`
 | 
					    * `minetest.conf` setting `unified_inventory_lite = true`
 | 
				
			||||||
 * Mod API for modders: see [mod_api.txt](doc/mod_api.txt)
 | 
					 * Mod API for modders: see [mod_api.txt](doc/mod_api.txt)
 | 
				
			||||||
@@ -24,7 +25,11 @@ Unified Inventory replaces the default survival and creative inventory.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## Requirements
 | 
					## Requirements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 * Minetest 5.0.0+
 | 
					 * Minetest 5.4.0+
 | 
				
			||||||
 | 
					 * Mod `default` for category filters (contained in Minetest Game)
 | 
				
			||||||
 | 
					 * Mod `farming` for craftable bags (contained in Minetest Game)
 | 
				
			||||||
 | 
					 * For waypoint migration: `datastorage`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Licenses
 | 
					# Licenses
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -96,4 +101,4 @@ Other files from Wikimedia Commons:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
RealBadAngel: (CC-BY-4.0)
 | 
					RealBadAngel: (CC-BY-4.0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  * Everything else.
 | 
					  * Everything else.
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										157
									
								
								api.lua
									
									
									
									
									
								
							
							
						
						@@ -1,5 +1,6 @@
 | 
				
			|||||||
local S = minetest.get_translator("unified_inventory")
 | 
					local S = minetest.get_translator("unified_inventory")
 | 
				
			||||||
local F = minetest.formspec_escape
 | 
					local F = minetest.formspec_escape
 | 
				
			||||||
 | 
					local ui = unified_inventory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- Create detached creative inventory after loading all mods
 | 
					-- Create detached creative inventory after loading all mods
 | 
				
			||||||
minetest.after(0.01, function()
 | 
					minetest.after(0.01, function()
 | 
				
			||||||
@@ -8,12 +9,12 @@ minetest.after(0.01, function()
 | 
				
			|||||||
		if not rev_aliases[target] then rev_aliases[target] = {} end
 | 
							if not rev_aliases[target] then rev_aliases[target] = {} end
 | 
				
			||||||
		table.insert(rev_aliases[target], source)
 | 
							table.insert(rev_aliases[target], source)
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	unified_inventory.items_list = {}
 | 
						ui.items_list = {}
 | 
				
			||||||
	for name, def in pairs(minetest.registered_items) do
 | 
						for name, def in pairs(minetest.registered_items) do
 | 
				
			||||||
		if (not def.groups.not_in_creative_inventory or
 | 
							if (not def.groups.not_in_creative_inventory or
 | 
				
			||||||
		   def.groups.not_in_creative_inventory == 0) and
 | 
							   def.groups.not_in_creative_inventory == 0) and
 | 
				
			||||||
		   def.description and def.description ~= "" then
 | 
							   def.description and def.description ~= "" then
 | 
				
			||||||
			table.insert(unified_inventory.items_list, name)
 | 
								table.insert(ui.items_list, name)
 | 
				
			||||||
			local all_names = rev_aliases[name] or {}
 | 
								local all_names = rev_aliases[name] or {}
 | 
				
			||||||
			table.insert(all_names, name)
 | 
								table.insert(all_names, name)
 | 
				
			||||||
			for _, player_name in ipairs(all_names) do
 | 
								for _, player_name in ipairs(all_names) do
 | 
				
			||||||
@@ -26,30 +27,30 @@ minetest.after(0.01, function()
 | 
				
			|||||||
						for _,chk in pairs(recipe.items) do
 | 
											for _,chk in pairs(recipe.items) do
 | 
				
			||||||
							local groupchk = string.find(chk, "group:")
 | 
												local groupchk = string.find(chk, "group:")
 | 
				
			||||||
							if (not groupchk and not minetest.registered_items[chk])
 | 
												if (not groupchk and not minetest.registered_items[chk])
 | 
				
			||||||
							  or (groupchk and not unified_inventory.get_group_item(string.gsub(chk, "group:", "")).item)
 | 
												  or (groupchk and not ui.get_group_item(string.gsub(chk, "group:", "")).item)
 | 
				
			||||||
							  or minetest.get_item_group(chk, "not_in_craft_guide") ~= 0 then
 | 
												  or minetest.get_item_group(chk, "not_in_craft_guide") ~= 0 then
 | 
				
			||||||
								unknowns = true
 | 
													unknowns = true
 | 
				
			||||||
							end
 | 
												end
 | 
				
			||||||
						end
 | 
											end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
						if not unknowns then
 | 
											if not unknowns then
 | 
				
			||||||
							unified_inventory.register_craft(recipe)
 | 
												ui.register_craft(recipe)
 | 
				
			||||||
						end
 | 
											end
 | 
				
			||||||
					end
 | 
										end
 | 
				
			||||||
				end
 | 
									end
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	table.sort(unified_inventory.items_list)
 | 
						table.sort(ui.items_list)
 | 
				
			||||||
	unified_inventory.items_list_size = #unified_inventory.items_list
 | 
						ui.items_list_size = #ui.items_list
 | 
				
			||||||
	print("Unified Inventory. inventory size: "..unified_inventory.items_list_size)
 | 
						print("Unified Inventory. inventory size: "..ui.items_list_size)
 | 
				
			||||||
	for _, name in ipairs(unified_inventory.items_list) do
 | 
						for _, name in ipairs(ui.items_list) do
 | 
				
			||||||
		local def = minetest.registered_items[name]
 | 
							local def = minetest.registered_items[name]
 | 
				
			||||||
		-- Simple drops
 | 
							-- Simple drops
 | 
				
			||||||
		if type(def.drop) == "string" then
 | 
							if type(def.drop) == "string" then
 | 
				
			||||||
			local dstack = ItemStack(def.drop)
 | 
								local dstack = ItemStack(def.drop)
 | 
				
			||||||
			if not dstack:is_empty() and dstack:get_name() ~= name then
 | 
								if not dstack:is_empty() and dstack:get_name() ~= name then
 | 
				
			||||||
				unified_inventory.register_craft({
 | 
									ui.register_craft({
 | 
				
			||||||
					type = "digging",
 | 
										type = "digging",
 | 
				
			||||||
					items = {name},
 | 
										items = {name},
 | 
				
			||||||
					output = def.drop,
 | 
										output = def.drop,
 | 
				
			||||||
@@ -115,7 +116,7 @@ minetest.after(0.01, function()
 | 
				
			|||||||
				end
 | 
									end
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
			for itemstring, count in pairs(drop_guaranteed) do
 | 
								for itemstring, count in pairs(drop_guaranteed) do
 | 
				
			||||||
				unified_inventory.register_craft({
 | 
									ui.register_craft({
 | 
				
			||||||
					type = "digging",
 | 
										type = "digging",
 | 
				
			||||||
					items = {name},
 | 
										items = {name},
 | 
				
			||||||
					output = itemstring .. " " .. count,
 | 
										output = itemstring .. " " .. count,
 | 
				
			||||||
@@ -123,7 +124,7 @@ minetest.after(0.01, function()
 | 
				
			|||||||
				})
 | 
									})
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
			for itemstring, count in pairs(drop_maybe) do
 | 
								for itemstring, count in pairs(drop_maybe) do
 | 
				
			||||||
				unified_inventory.register_craft({
 | 
									ui.register_craft({
 | 
				
			||||||
					type = "digging_chance",
 | 
										type = "digging_chance",
 | 
				
			||||||
					items = {name},
 | 
										items = {name},
 | 
				
			||||||
					output = itemstring .. " " .. count,
 | 
										output = itemstring .. " " .. count,
 | 
				
			||||||
@@ -132,33 +133,37 @@ minetest.after(0.01, function()
 | 
				
			|||||||
			end
 | 
								end
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	for _, recipes in pairs(unified_inventory.crafts_for.recipe) do
 | 
						for _, recipes in pairs(ui.crafts_for.recipe) do
 | 
				
			||||||
		for _, recipe in ipairs(recipes) do
 | 
							for _, recipe in ipairs(recipes) do
 | 
				
			||||||
			local ingredient_items = {}
 | 
								local ingredient_items = {}
 | 
				
			||||||
			for _, spec in pairs(recipe.items) do
 | 
								for _, spec in pairs(recipe.items) do
 | 
				
			||||||
				local matches_spec = unified_inventory.canonical_item_spec_matcher(spec)
 | 
									local matches_spec = ui.canonical_item_spec_matcher(spec)
 | 
				
			||||||
				for _, name in ipairs(unified_inventory.items_list) do
 | 
									for _, name in ipairs(ui.items_list) do
 | 
				
			||||||
					if matches_spec(name) then
 | 
										if matches_spec(name) then
 | 
				
			||||||
						ingredient_items[name] = true
 | 
											ingredient_items[name] = true
 | 
				
			||||||
					end
 | 
										end
 | 
				
			||||||
				end
 | 
									end
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
			for name, _ in pairs(ingredient_items) do
 | 
								for name, _ in pairs(ingredient_items) do
 | 
				
			||||||
				if unified_inventory.crafts_for.usage[name] == nil then
 | 
									if ui.crafts_for.usage[name] == nil then
 | 
				
			||||||
					unified_inventory.crafts_for.usage[name] = {}
 | 
										ui.crafts_for.usage[name] = {}
 | 
				
			||||||
				end
 | 
									end
 | 
				
			||||||
				table.insert(unified_inventory.crafts_for.usage[name], recipe)
 | 
									table.insert(ui.crafts_for.usage[name], recipe)
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, callback in ipairs(ui.initialized_callbacks) do
 | 
				
			||||||
 | 
							callback()
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
end)
 | 
					end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- load_home
 | 
					-- load_home
 | 
				
			||||||
local function load_home()
 | 
					local function load_home()
 | 
				
			||||||
	local input = io.open(unified_inventory.home_filename, "r")
 | 
						local input = io.open(ui.home_filename, "r")
 | 
				
			||||||
	if not input then
 | 
						if not input then
 | 
				
			||||||
		unified_inventory.home_pos = {}
 | 
							ui.home_pos = {}
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	while true do
 | 
						while true do
 | 
				
			||||||
@@ -167,32 +172,40 @@ local function load_home()
 | 
				
			|||||||
		local y = input:read("*n")
 | 
							local y = input:read("*n")
 | 
				
			||||||
		local z = input:read("*n")
 | 
							local z = input:read("*n")
 | 
				
			||||||
		local name = input:read("*l")
 | 
							local name = input:read("*l")
 | 
				
			||||||
		unified_inventory.home_pos[name:sub(2)] = {x = x, y = y, z = z}
 | 
							ui.home_pos[name:sub(2)] = {x = x, y = y, z = z}
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	io.close(input)
 | 
						io.close(input)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
load_home()
 | 
					load_home()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function unified_inventory.set_home(player, pos)
 | 
					function ui.set_home(player, pos)
 | 
				
			||||||
	local player_name = player:get_player_name()
 | 
						local player_name = player:get_player_name()
 | 
				
			||||||
	unified_inventory.home_pos[player_name] = vector.round(pos)
 | 
						ui.home_pos[player_name] = vector.round(pos)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-- save the home data from the table to the file
 | 
						-- save the home data from the table to the file
 | 
				
			||||||
	local output = io.open(unified_inventory.home_filename, "w")
 | 
						local output = io.open(ui.home_filename, "w")
 | 
				
			||||||
	for k, v in pairs(unified_inventory.home_pos) do
 | 
						if not output then
 | 
				
			||||||
 | 
							minetest.log("warning", "[unified_inventory] Failed to save file: "
 | 
				
			||||||
 | 
								.. ui.home_filename)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						for k, v in pairs(ui.home_pos) do
 | 
				
			||||||
		output:write(v.x.." "..v.y.." "..v.z.." "..k.."\n")
 | 
							output:write(v.x.." "..v.y.." "..v.z.." "..k.."\n")
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	io.close(output)
 | 
						io.close(output)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function unified_inventory.go_home(player)
 | 
					function ui.go_home(player)
 | 
				
			||||||
	local pos = unified_inventory.home_pos[player:get_player_name()]
 | 
						local pos = ui.home_pos[player:get_player_name()]
 | 
				
			||||||
	if pos then
 | 
						if pos then
 | 
				
			||||||
		player:set_pos(pos)
 | 
							player:set_pos(pos)
 | 
				
			||||||
 | 
							return true
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- register_craft
 | 
					-- register_craft
 | 
				
			||||||
function unified_inventory.register_craft(options)
 | 
					function ui.register_craft(options)
 | 
				
			||||||
	if not options.output then
 | 
						if not options.output then
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
@@ -203,10 +216,15 @@ function unified_inventory.register_craft(options)
 | 
				
			|||||||
	if options.type == "normal" and options.width == 0 then
 | 
						if options.type == "normal" and options.width == 0 then
 | 
				
			||||||
		options = { type = "shapeless", items = options.items, output = options.output, width = 0 }
 | 
							options = { type = "shapeless", items = options.items, output = options.output, width = 0 }
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	if not unified_inventory.crafts_for.recipe[itemstack:get_name()] then
 | 
						local item_name = itemstack:get_name()
 | 
				
			||||||
		unified_inventory.crafts_for.recipe[itemstack:get_name()] = {}
 | 
						if not ui.crafts_for.recipe[item_name] then
 | 
				
			||||||
 | 
							ui.crafts_for.recipe[item_name] = {}
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						table.insert(ui.crafts_for.recipe[item_name],options)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, callback in ipairs(ui.craft_registered_callbacks) do
 | 
				
			||||||
 | 
							callback(item_name, options)
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	table.insert(unified_inventory.crafts_for.recipe[itemstack:get_name()],options)
 | 
					 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -217,7 +235,7 @@ local craft_type_defaults = {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function unified_inventory.craft_type_defaults(name, options)
 | 
					function ui.craft_type_defaults(name, options)
 | 
				
			||||||
	if not options.description then
 | 
						if not options.description then
 | 
				
			||||||
		options.description = name
 | 
							options.description = name
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
@@ -226,13 +244,13 @@ function unified_inventory.craft_type_defaults(name, options)
 | 
				
			|||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function unified_inventory.register_craft_type(name, options)
 | 
					function ui.register_craft_type(name, options)
 | 
				
			||||||
	unified_inventory.registered_craft_types[name] =
 | 
						ui.registered_craft_types[name] =
 | 
				
			||||||
			unified_inventory.craft_type_defaults(name, options)
 | 
								ui.craft_type_defaults(name, options)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_craft_type("normal", {
 | 
					ui.register_craft_type("normal", {
 | 
				
			||||||
	description = F(S("Crafting")),
 | 
						description = F(S("Crafting")),
 | 
				
			||||||
	icon = "ui_craftgrid_icon.png",
 | 
						icon = "ui_craftgrid_icon.png",
 | 
				
			||||||
	width = 3,
 | 
						width = 3,
 | 
				
			||||||
@@ -248,7 +266,7 @@ unified_inventory.register_craft_type("normal", {
 | 
				
			|||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_craft_type("shapeless", {
 | 
					ui.register_craft_type("shapeless", {
 | 
				
			||||||
	description = F(S("Mixing")),
 | 
						description = F(S("Mixing")),
 | 
				
			||||||
	icon = "ui_craftgrid_icon.png",
 | 
						icon = "ui_craftgrid_icon.png",
 | 
				
			||||||
	width = 3,
 | 
						width = 3,
 | 
				
			||||||
@@ -263,7 +281,7 @@ unified_inventory.register_craft_type("shapeless", {
 | 
				
			|||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_craft_type("cooking", {
 | 
					ui.register_craft_type("cooking", {
 | 
				
			||||||
	description = F(S("Cooking")),
 | 
						description = F(S("Cooking")),
 | 
				
			||||||
	icon = "default_furnace_front.png",
 | 
						icon = "default_furnace_front.png",
 | 
				
			||||||
	width = 1,
 | 
						width = 1,
 | 
				
			||||||
@@ -271,37 +289,86 @@ unified_inventory.register_craft_type("cooking", {
 | 
				
			|||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_craft_type("digging", {
 | 
					ui.register_craft_type("digging", {
 | 
				
			||||||
	description = F(S("Digging")),
 | 
						description = F(S("Digging")),
 | 
				
			||||||
	icon = "default_tool_steelpick.png",
 | 
						icon = "default_tool_steelpick.png",
 | 
				
			||||||
	width = 1,
 | 
						width = 1,
 | 
				
			||||||
	height = 1,
 | 
						height = 1,
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_craft_type("digging_chance", {
 | 
					ui.register_craft_type("digging_chance", {
 | 
				
			||||||
	description = "Digging (by chance)",
 | 
						description = "Digging (by chance)",
 | 
				
			||||||
	icon = "default_tool_steelpick.png^[transformFY.png",
 | 
						icon = "default_tool_steelpick.png^[transformFY.png",
 | 
				
			||||||
	width = 1,
 | 
						width = 1,
 | 
				
			||||||
	height = 1,
 | 
						height = 1,
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function unified_inventory.register_page(name, def)
 | 
					function ui.register_page(name, def)
 | 
				
			||||||
	unified_inventory.pages[name] = def
 | 
						ui.pages[name] = def
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function unified_inventory.register_button(name, def)
 | 
					function ui.register_button(name, def)
 | 
				
			||||||
	if not def.action then
 | 
						if not def.action then
 | 
				
			||||||
		def.action = function(player)
 | 
							def.action = function(player)
 | 
				
			||||||
			unified_inventory.set_inventory_formspec(player, name)
 | 
								ui.set_inventory_formspec(player, name)
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	def.name = name
 | 
						def.name = name
 | 
				
			||||||
	table.insert(unified_inventory.buttons, def)
 | 
						table.insert(ui.buttons, def)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function ui.register_on_initialized(callback)
 | 
				
			||||||
 | 
						if type(callback) ~= "function" then
 | 
				
			||||||
 | 
							error(("Initialized callback must be a function, %s given."):format(type(callback)))
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						table.insert(ui.initialized_callbacks, callback)
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function unified_inventory.is_creative(playername)
 | 
					function ui.register_on_craft_registered(callback)
 | 
				
			||||||
 | 
						if type(callback) ~= "function" then
 | 
				
			||||||
 | 
							error(("Craft registered callback must be a function, %s given."):format(type(callback)))
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						table.insert(ui.craft_registered_callbacks, callback)
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function ui.get_recipe_list(output)
 | 
				
			||||||
 | 
						return ui.crafts_for.recipe[output]
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function ui.get_registered_outputs()
 | 
				
			||||||
 | 
						local outputs = {}
 | 
				
			||||||
 | 
						for item_name, _ in pairs(ui.crafts_for.recipe) do
 | 
				
			||||||
 | 
							table.insert(outputs, item_name)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						return outputs
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function ui.is_creative(playername)
 | 
				
			||||||
	return minetest.check_player_privs(playername, {creative=true})
 | 
						return minetest.check_player_privs(playername, {creative=true})
 | 
				
			||||||
		or minetest.settings:get_bool("creative_mode")
 | 
							or minetest.settings:get_bool("creative_mode")
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function ui.single_slot(xpos, ypos, bright)
 | 
				
			||||||
 | 
						return string.format("background9[%f,%f;%f,%f;ui_single_slot%s.png;false;16]",
 | 
				
			||||||
 | 
						xpos, ypos, ui.imgscale, ui.imgscale, (bright and "_bright" or "") )
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function ui.make_trash_slot(xpos, ypos)
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
							ui.single_slot(xpos, ypos)..
 | 
				
			||||||
 | 
							"image["..xpos..","..ypos..";1.25,1.25;ui_trash_slot_icon.png]"..
 | 
				
			||||||
 | 
							"list[detached:trash;main;"..(xpos + ui.list_img_offset)..","..(ypos + ui.list_img_offset)..";1,1;]"
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function ui.make_inv_img_grid(xpos, ypos, width, height, bright)
 | 
				
			||||||
 | 
						local tiled = {}
 | 
				
			||||||
 | 
						local n=1
 | 
				
			||||||
 | 
						for y = 0, (height - 1) do
 | 
				
			||||||
 | 
							for x = 0, (width -1) do
 | 
				
			||||||
 | 
								tiled[n] = ui.single_slot(xpos + (ui.imgscale * x), ypos + (ui.imgscale * y), bright)
 | 
				
			||||||
 | 
								n = n + 1
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						return table.concat(tiled)
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										81
									
								
								bags.lua
									
									
									
									
									
								
							
							
						
						@@ -7,27 +7,32 @@ License: GPLv3
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
local S = minetest.get_translator("unified_inventory")
 | 
					local S = minetest.get_translator("unified_inventory")
 | 
				
			||||||
local F = minetest.formspec_escape
 | 
					local F = minetest.formspec_escape
 | 
				
			||||||
 | 
					local ui = unified_inventory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_page("bags", {
 | 
					ui.register_page("bags", {
 | 
				
			||||||
	get_formspec = function(player)
 | 
						get_formspec = function(player)
 | 
				
			||||||
		local player_name = player:get_player_name()
 | 
							local player_name = player:get_player_name()
 | 
				
			||||||
		return { formspec = table.concat({
 | 
							return { formspec = table.concat({
 | 
				
			||||||
			"background[0.06,0.99;7.92,7.52;ui_bags_main_form.png]",
 | 
								ui.style_full.standard_inv_bg,
 | 
				
			||||||
			"label[0,0;" .. F(S("Bags")) .. "]",
 | 
								ui.single_slot(0.925, 1.5),
 | 
				
			||||||
			"button[0,2;2,0.5;bag1;" .. F(S("Bag @1", 1)) .. "]",
 | 
								ui.single_slot(3.425, 1.5),
 | 
				
			||||||
			"button[2,2;2,0.5;bag2;" .. F(S("Bag @1", 2)) .. "]",
 | 
								ui.single_slot(5.925, 1.5),
 | 
				
			||||||
			"button[4,2;2,0.5;bag3;" .. F(S("Bag @1", 3)) .. "]",
 | 
								ui.single_slot(8.425, 1.5),
 | 
				
			||||||
			"button[6,2;2,0.5;bag4;" .. F(S("Bag @1", 4)) .. "]",
 | 
								"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)) .. "]",
 | 
				
			||||||
			"listcolors[#00000000;#00000000]",
 | 
								"listcolors[#00000000;#00000000]",
 | 
				
			||||||
			"list[detached:" .. F(player_name) .. "_bags;bag1;0.5,1;1,1;]",
 | 
								"list[detached:" .. F(player_name) .. "_bags;bag1;1.075,1.65;1,1;]",
 | 
				
			||||||
			"list[detached:" .. F(player_name) .. "_bags;bag2;2.5,1;1,1;]",
 | 
								"list[detached:" .. F(player_name) .. "_bags;bag2;3.575,1.65;1,1;]",
 | 
				
			||||||
			"list[detached:" .. F(player_name) .. "_bags;bag3;4.5,1;1,1;]",
 | 
								"list[detached:" .. F(player_name) .. "_bags;bag3;6.075,1.65;1,1;]",
 | 
				
			||||||
			"list[detached:" .. F(player_name) .. "_bags;bag4;6.5,1;1,1;]"
 | 
								"list[detached:" .. F(player_name) .. "_bags;bag4;8.575,1.65;1,1;]"
 | 
				
			||||||
		}) }
 | 
							}) }
 | 
				
			||||||
	end,
 | 
						end,
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_button("bags", {
 | 
					ui.register_button("bags", {
 | 
				
			||||||
	type = "image",
 | 
						type = "image",
 | 
				
			||||||
	image = "ui_bags_icon.png",
 | 
						image = "ui_bags_icon.png",
 | 
				
			||||||
	tooltip = S("Bags"),
 | 
						tooltip = S("Bags"),
 | 
				
			||||||
@@ -42,32 +47,31 @@ local function get_player_bag_stack(player, i)
 | 
				
			|||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
for bag_i = 1, 4 do
 | 
					for bag_i = 1, 4 do
 | 
				
			||||||
	unified_inventory.register_page("bag" .. bag_i, {
 | 
						ui.register_page("bag" .. bag_i, {
 | 
				
			||||||
		get_formspec = function(player)
 | 
							get_formspec = function(player)
 | 
				
			||||||
			local stack = get_player_bag_stack(player, bag_i)
 | 
								local stack = get_player_bag_stack(player, bag_i)
 | 
				
			||||||
			local image = stack:get_definition().inventory_image
 | 
								local image = stack:get_definition().inventory_image
 | 
				
			||||||
			local fs = {
 | 
					 | 
				
			||||||
				"image[7,0;1,1;" .. image .. "]",
 | 
					 | 
				
			||||||
				"label[0,0;" .. F(S("Bag @1", bag_i)) .. "]",
 | 
					 | 
				
			||||||
				"listcolors[#00000000;#00000000]",
 | 
					 | 
				
			||||||
				"list[current_player;bag" .. bag_i .. "contents;0,1;8,3;]",
 | 
					 | 
				
			||||||
				"listring[current_name;bag" .. bag_i .. "contents]",
 | 
					 | 
				
			||||||
				"listring[current_player;main]"
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			local slots = stack:get_definition().groups.bagslots
 | 
								local slots = stack:get_definition().groups.bagslots
 | 
				
			||||||
			if slots == 8 then
 | 
					
 | 
				
			||||||
					fs[#fs + 1] = "background[0.06,0.99;7.92,7.52;ui_bags_sm_form.png]"
 | 
								local formspec = {
 | 
				
			||||||
			elseif slots == 16 then
 | 
									ui.style_full.standard_inv_bg,
 | 
				
			||||||
					fs[#fs + 1] = "background[0.06,0.99;7.92,7.52;ui_bags_med_form.png]"
 | 
									ui.make_inv_img_grid(0.3, 1.5, 8, slots/8),
 | 
				
			||||||
			elseif slots == 24 then
 | 
									"image[9.2,0.4;1,1;" .. image .. "]",
 | 
				
			||||||
					fs[#fs + 1] = "background[0.06,0.99;7.92,7.52;ui_bags_lg_form.png]"
 | 
									"label[0.3,0.65;" .. F(S("Bag @1", bag_i)) .. "]",
 | 
				
			||||||
			end
 | 
									"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]",
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								local n = #formspec + 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			local player_name = player:get_player_name() -- For if statement.
 | 
								local player_name = player:get_player_name() -- For if statement.
 | 
				
			||||||
			if unified_inventory.trash_enabled
 | 
								if ui.trash_enabled
 | 
				
			||||||
					or unified_inventory.is_creative(player_name)
 | 
									or ui.is_creative(player_name)
 | 
				
			||||||
					or minetest.get_player_privs(player_name).give then
 | 
									or minetest.get_player_privs(player_name).give then
 | 
				
			||||||
				fs[#fs + 1] = "background[6.06,0;0.92,0.92;ui_bags_trash.png]"
 | 
										formspec[n] = ui.make_trash_slot(7.8, 0.25)
 | 
				
			||||||
						.. "list[detached:trash;main;6,0.1;1,1;]"
 | 
										n = n + 1
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
			local inv = player:get_inventory()
 | 
								local inv = player:get_inventory()
 | 
				
			||||||
			for i = 1, 4 do
 | 
								for i = 1, 4 do
 | 
				
			||||||
@@ -84,11 +88,12 @@ for bag_i = 1, 4 do
 | 
				
			|||||||
					end
 | 
										end
 | 
				
			||||||
					local img = def.inventory_image
 | 
										local img = def.inventory_image
 | 
				
			||||||
					local label = F(S("Bag @1", i)) .. "\n" .. used .. "/" .. size
 | 
										local label = F(S("Bag @1", i)) .. "\n" .. used .. "/" .. size
 | 
				
			||||||
					fs[#fs + 1] = string.format("image_button[%i,0;1,1;%s;bag%i;%s]",
 | 
										formspec[n] = string.format("image_button[%f,0.4;1,1;%s;bag%i;%s]",
 | 
				
			||||||
							i + 1, img, i, label)
 | 
												(i + 1.35)*1.25, img, i, label)
 | 
				
			||||||
 | 
										n = n + 1
 | 
				
			||||||
				end
 | 
									end
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
			return { formspec = table.concat(fs) }
 | 
								return { formspec = table.concat(formspec) }
 | 
				
			||||||
		end,
 | 
							end,
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
@@ -103,7 +108,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
				
			|||||||
			if not stack:get_definition().groups.bagslots then
 | 
								if not stack:get_definition().groups.bagslots then
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
			unified_inventory.set_inventory_formspec(player, "bag" .. i)
 | 
								ui.set_inventory_formspec(player, "bag" .. i)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
@@ -132,7 +137,7 @@ end
 | 
				
			|||||||
local function load_bags_metadata(player, bags_inv)
 | 
					local function load_bags_metadata(player, bags_inv)
 | 
				
			||||||
	local player_inv = player:get_inventory()
 | 
						local player_inv = player:get_inventory()
 | 
				
			||||||
	local meta = player:get_meta()
 | 
						local meta = player:get_meta()
 | 
				
			||||||
	local bags_meta = meta:get_string("unified_inventory:bags")
 | 
						local bags_meta = meta:get("unified_inventory:bags")
 | 
				
			||||||
	local bags = bags_meta and minetest.deserialize(bags_meta) or {}
 | 
						local bags = bags_meta and minetest.deserialize(bags_meta) or {}
 | 
				
			||||||
	local dirty_meta = false
 | 
						local dirty_meta = false
 | 
				
			||||||
	if not bags_meta then
 | 
						if not bags_meta then
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,11 +19,12 @@ minetest.register_on_joinplayer(function(player)
 | 
				
			|||||||
	unified_inventory.active_search_direction[player_name] = "nochange"
 | 
						unified_inventory.active_search_direction[player_name] = "nochange"
 | 
				
			||||||
	unified_inventory.apply_filter(player, "", "nochange")
 | 
						unified_inventory.apply_filter(player, "", "nochange")
 | 
				
			||||||
	unified_inventory.current_searchbox[player_name] = ""
 | 
						unified_inventory.current_searchbox[player_name] = ""
 | 
				
			||||||
 | 
						unified_inventory.current_category[player_name] = "all"
 | 
				
			||||||
 | 
						unified_inventory.current_category_scroll[player_name] = 0
 | 
				
			||||||
	unified_inventory.alternate[player_name] = 1
 | 
						unified_inventory.alternate[player_name] = 1
 | 
				
			||||||
	unified_inventory.current_item[player_name] = nil
 | 
						unified_inventory.current_item[player_name] = nil
 | 
				
			||||||
	unified_inventory.current_craft_direction[player_name] = "recipe"
 | 
						unified_inventory.current_craft_direction[player_name] = "recipe"
 | 
				
			||||||
	unified_inventory.set_inventory_formspec(player,
 | 
						unified_inventory.set_inventory_formspec(player, unified_inventory.default)
 | 
				
			||||||
	unified_inventory.default)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-- Refill slot
 | 
						-- Refill slot
 | 
				
			||||||
	local refill = minetest.create_detached_inventory(player_name.."refill", {
 | 
						local refill = minetest.create_detached_inventory(player_name.."refill", {
 | 
				
			||||||
@@ -69,6 +70,41 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
				
			|||||||
		unified_inventory.current_searchbox[player_name] = fields.searchbox
 | 
							unified_inventory.current_searchbox[player_name] = fields.searchbox
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local clicked_category
 | 
				
			||||||
 | 
						for name, value in pairs(fields) do
 | 
				
			||||||
 | 
							local category_name = string.match(name, "^category_(.+)$")
 | 
				
			||||||
 | 
							if category_name then
 | 
				
			||||||
 | 
								clicked_category = category_name
 | 
				
			||||||
 | 
								break
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if clicked_category
 | 
				
			||||||
 | 
						and clicked_category ~= unified_inventory.current_category[player_name] then
 | 
				
			||||||
 | 
							unified_inventory.current_category[player_name] = clicked_category
 | 
				
			||||||
 | 
							unified_inventory.apply_filter(player, unified_inventory.current_searchbox[player_name], "nochange")
 | 
				
			||||||
 | 
							unified_inventory.set_inventory_formspec(player,
 | 
				
			||||||
 | 
									unified_inventory.current_page[player_name])
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if fields.next_category then
 | 
				
			||||||
 | 
							local scroll = math.min(#unified_inventory.category_list-ui_peruser.pagecols, unified_inventory.current_category_scroll[player_name] + 1)
 | 
				
			||||||
 | 
							if scroll ~= unified_inventory.current_category_scroll[player_name] then
 | 
				
			||||||
 | 
								unified_inventory.current_category_scroll[player_name] = scroll
 | 
				
			||||||
 | 
								unified_inventory.set_inventory_formspec(player,
 | 
				
			||||||
 | 
										unified_inventory.current_page[player_name])
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						if fields.prev_category then
 | 
				
			||||||
 | 
							local scroll = math.max(0, unified_inventory.current_category_scroll[player_name] - 1)
 | 
				
			||||||
 | 
							if scroll ~= unified_inventory.current_category_scroll[player_name] then
 | 
				
			||||||
 | 
								unified_inventory.current_category_scroll[player_name] = scroll
 | 
				
			||||||
 | 
								unified_inventory.set_inventory_formspec(player,
 | 
				
			||||||
 | 
										unified_inventory.current_page[player_name])
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for i, def in pairs(unified_inventory.buttons) do
 | 
						for i, def in pairs(unified_inventory.buttons) do
 | 
				
			||||||
		if fields[def.name] then
 | 
							if fields[def.name] then
 | 
				
			||||||
			def.action(player)
 | 
								def.action(player)
 | 
				
			||||||
@@ -126,6 +162,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
				
			|||||||
			clicked_item = unified_inventory.demangle_for_formspec(mangled_item)
 | 
								clicked_item = unified_inventory.demangle_for_formspec(mangled_item)
 | 
				
			||||||
			if string.sub(clicked_item, 1, 6) == "group:" then
 | 
								if string.sub(clicked_item, 1, 6) == "group:" then
 | 
				
			||||||
				-- Change search filter to this group
 | 
									-- Change search filter to this group
 | 
				
			||||||
 | 
									unified_inventory.current_category[player_name] = "all"
 | 
				
			||||||
				apply_new_filter(player, clicked_item, new_dir)
 | 
									apply_new_filter(player, clicked_item, new_dir)
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										150
									
								
								category.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,150 @@
 | 
				
			|||||||
 | 
					local S = minetest.get_translator("unified_inventory")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unified_inventory.registered_categories = {}
 | 
				
			||||||
 | 
					unified_inventory.registered_category_items = {}
 | 
				
			||||||
 | 
					unified_inventory.category_list = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local function char_to_sort_index(char_code)
 | 
				
			||||||
 | 
						if char_code <= 32 then
 | 
				
			||||||
 | 
							-- Command codes, no thanks
 | 
				
			||||||
 | 
							return 0
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						if char_code <= 64 then
 | 
				
			||||||
 | 
							-- Sorts numbers, and some punctuation, after letters
 | 
				
			||||||
 | 
							return char_code
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						if char_code >= 158 then
 | 
				
			||||||
 | 
							-- Out of sortable range
 | 
				
			||||||
 | 
							return 0
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						if char_code > 122 then
 | 
				
			||||||
 | 
							-- Avoids overlap with {, |, } and ~
 | 
				
			||||||
 | 
							return char_code - 58
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						if char_code > 96 then
 | 
				
			||||||
 | 
							-- Normalises lowercase with uppercase
 | 
				
			||||||
 | 
							return char_code - 96
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						return char_code - 64
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local function string_to_sort_index(str)
 | 
				
			||||||
 | 
						local max_chars = 5
 | 
				
			||||||
 | 
						local power = 100
 | 
				
			||||||
 | 
						local index = 0
 | 
				
			||||||
 | 
						for i=1,math.min(#str, max_chars) do
 | 
				
			||||||
 | 
							index = index + (char_to_sort_index(string.byte(str, i))/(power^i))
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						return index
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function update_category_list()
 | 
				
			||||||
 | 
						local category_list = {}
 | 
				
			||||||
 | 
						table.insert(category_list, {
 | 
				
			||||||
 | 
							name = "all",
 | 
				
			||||||
 | 
							label = S("All Items"),
 | 
				
			||||||
 | 
							symbol = "ui_category_all.png",
 | 
				
			||||||
 | 
							index = -2,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						table.insert(category_list, {
 | 
				
			||||||
 | 
							name = "uncategorized",
 | 
				
			||||||
 | 
							label = S("Misc. Items"),
 | 
				
			||||||
 | 
							symbol = "ui_category_none.png",
 | 
				
			||||||
 | 
							index = -1,
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						for category, def in pairs(unified_inventory.registered_categories) do
 | 
				
			||||||
 | 
							table.insert(category_list, {
 | 
				
			||||||
 | 
								name = category,
 | 
				
			||||||
 | 
								label = def.label or category,
 | 
				
			||||||
 | 
								symbol = def.symbol,
 | 
				
			||||||
 | 
								index = def.index or                    -- sortby defined order
 | 
				
			||||||
 | 
										string_to_sort_index(category)  -- or do a rudimentary alphabetical sort
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						table.sort(category_list, function (a,b)
 | 
				
			||||||
 | 
							return a.index < b.index
 | 
				
			||||||
 | 
						end)
 | 
				
			||||||
 | 
						unified_inventory.category_list = category_list
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local function ensure_category_exists(category_name)
 | 
				
			||||||
 | 
						if not unified_inventory.registered_categories[category_name] then
 | 
				
			||||||
 | 
							unified_inventory.registered_categories[category_name] = {
 | 
				
			||||||
 | 
								symbol = "unknown_item.png",
 | 
				
			||||||
 | 
								label = category_name
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						if not unified_inventory.registered_category_items[category_name] then
 | 
				
			||||||
 | 
							unified_inventory.registered_category_items[category_name] = {}
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function unified_inventory.register_category(category_name, config)
 | 
				
			||||||
 | 
						ensure_category_exists(category_name)
 | 
				
			||||||
 | 
						config = config or {}
 | 
				
			||||||
 | 
						if config.symbol then
 | 
				
			||||||
 | 
							unified_inventory.set_category_symbol(category_name, config.symbol)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						if config.label then
 | 
				
			||||||
 | 
							unified_inventory.set_category_label(category_name, config.label)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						if config.index then
 | 
				
			||||||
 | 
							unified_inventory.set_category_index(category_name, config.index)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						if config.items then
 | 
				
			||||||
 | 
							unified_inventory.add_category_items(category_name, config.items)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						update_category_list()
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					function unified_inventory.set_category_symbol(category_name, symbol)
 | 
				
			||||||
 | 
						ensure_category_exists(category_name)
 | 
				
			||||||
 | 
						unified_inventory.registered_categories[category_name].symbol = symbol
 | 
				
			||||||
 | 
						update_category_list()
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					function unified_inventory.set_category_label(category_name, label)
 | 
				
			||||||
 | 
						ensure_category_exists(category_name)
 | 
				
			||||||
 | 
						unified_inventory.registered_categories[category_name].label = label
 | 
				
			||||||
 | 
						update_category_list()
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					function unified_inventory.set_category_index(category_name, index)
 | 
				
			||||||
 | 
						ensure_category_exists(category_name)
 | 
				
			||||||
 | 
						unified_inventory.registered_categories[category_name].index = index
 | 
				
			||||||
 | 
						update_category_list()
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					function unified_inventory.add_category_item(category_name, item)
 | 
				
			||||||
 | 
						ensure_category_exists(category_name)
 | 
				
			||||||
 | 
						unified_inventory.registered_category_items[category_name][item] = true
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					function unified_inventory.add_category_items(category_name, items)
 | 
				
			||||||
 | 
						for _,item in ipairs(items) do
 | 
				
			||||||
 | 
							unified_inventory.add_category_item(category_name, item)
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function unified_inventory.remove_category_item(category_name, item)
 | 
				
			||||||
 | 
						unified_inventory.registered_category_items[category_name][item] = nil
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					function unified_inventory.remove_category(category_name)
 | 
				
			||||||
 | 
						unified_inventory.registered_categories[category_name] = nil
 | 
				
			||||||
 | 
						unified_inventory.registered_category_items[category_name] = nil
 | 
				
			||||||
 | 
						update_category_list()
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function unified_inventory.find_category(item)
 | 
				
			||||||
 | 
						-- Returns the first category the item exists in
 | 
				
			||||||
 | 
						-- Best for checking if an item has any category at all
 | 
				
			||||||
 | 
						for category, items in pairs(unified_inventory.registered_category_items) do
 | 
				
			||||||
 | 
							if items[item] then return category end
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					function unified_inventory.find_categories(item)
 | 
				
			||||||
 | 
						-- Returns all the categories the item exists in
 | 
				
			||||||
 | 
						-- Best for listing all categories
 | 
				
			||||||
 | 
						local categories = {}
 | 
				
			||||||
 | 
						for category, items in pairs(unified_inventory.registered_category_items) do
 | 
				
			||||||
 | 
							if items[item] then
 | 
				
			||||||
 | 
								table.insert(categories, category)
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						return categories
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
							
								
								
									
										704
									
								
								default-categories.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,704 @@
 | 
				
			|||||||
 | 
					local S = minetest.get_translator("unified_inventory")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unified_inventory.register_category('plants', {
 | 
				
			||||||
 | 
						symbol = "flowers:tulip",
 | 
				
			||||||
 | 
						label = S("Plant Life")
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					unified_inventory.register_category('building', {
 | 
				
			||||||
 | 
						symbol = "default:brick",
 | 
				
			||||||
 | 
						label = S("Building Materials")
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					unified_inventory.register_category('tools', {
 | 
				
			||||||
 | 
						symbol = "default:pick_diamond",
 | 
				
			||||||
 | 
						label = S("Tools")
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					unified_inventory.register_category('minerals', {
 | 
				
			||||||
 | 
						symbol = "default:iron_lump",
 | 
				
			||||||
 | 
						label = S("Minerals and Metals")
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					unified_inventory.register_category('environment', {
 | 
				
			||||||
 | 
						symbol = "default:dirt_with_grass",
 | 
				
			||||||
 | 
						label = S("Environment and Worldgen")
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					unified_inventory.register_category('lighting', {
 | 
				
			||||||
 | 
						symbol = "default:torch",
 | 
				
			||||||
 | 
						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
 | 
				
			||||||
 | 
								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)
 | 
				
			||||||
 | 
									end
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									unified_inventory.add_category_item('environment', item.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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- [[
 | 
				
			||||||
 | 
					unified_inventory.add_category_items('plants', {
 | 
				
			||||||
 | 
						"default:dry_grass_5",
 | 
				
			||||||
 | 
						"default:acacia_sapling",
 | 
				
			||||||
 | 
						"default:blueberry_bush_sapling",
 | 
				
			||||||
 | 
						"default:grass_2",
 | 
				
			||||||
 | 
						"default:pine_bush_stem",
 | 
				
			||||||
 | 
						"default:leaves",
 | 
				
			||||||
 | 
						"default:pine_needles",
 | 
				
			||||||
 | 
						"default:cactus",
 | 
				
			||||||
 | 
						"default:junglegrass",
 | 
				
			||||||
 | 
						"default:pine_sapling",
 | 
				
			||||||
 | 
						"default:sapling",
 | 
				
			||||||
 | 
						"default:bush_stem",
 | 
				
			||||||
 | 
						"default:dry_grass_2",
 | 
				
			||||||
 | 
						"default:fern_1",
 | 
				
			||||||
 | 
						"default:grass_3",
 | 
				
			||||||
 | 
						"default:marram_grass_1",
 | 
				
			||||||
 | 
						"default:pine_tree",
 | 
				
			||||||
 | 
						"default:dry_grass_3",
 | 
				
			||||||
 | 
						"default:dry_shrub",
 | 
				
			||||||
 | 
						"default:grass_4",
 | 
				
			||||||
 | 
						"default:marram_grass_2",
 | 
				
			||||||
 | 
						"default:jungleleaves",
 | 
				
			||||||
 | 
						"default:apple",
 | 
				
			||||||
 | 
						"default:tree",
 | 
				
			||||||
 | 
						"default:aspen_tree",
 | 
				
			||||||
 | 
						"default:bush_sapling",
 | 
				
			||||||
 | 
						"default:grass_5",
 | 
				
			||||||
 | 
						"default:blueberry_bush_leaves_with_berries",
 | 
				
			||||||
 | 
						"default:acacia_bush_sapling",
 | 
				
			||||||
 | 
						"default:grass_1",
 | 
				
			||||||
 | 
						"default:aspen_leaves",
 | 
				
			||||||
 | 
						"default:marram_grass_3",
 | 
				
			||||||
 | 
						"default:large_cactus_seedling",
 | 
				
			||||||
 | 
						"default:junglesapling",
 | 
				
			||||||
 | 
						"default:dry_grass_4",
 | 
				
			||||||
 | 
						"default:acacia_bush_stem",
 | 
				
			||||||
 | 
						"default:papyrus",
 | 
				
			||||||
 | 
						"default:pine_bush_needles",
 | 
				
			||||||
 | 
						"default:bush_leaves",
 | 
				
			||||||
 | 
						"default:fern_3",
 | 
				
			||||||
 | 
						"default:aspen_sapling",
 | 
				
			||||||
 | 
						"default:acacia_tree",
 | 
				
			||||||
 | 
						"default:apple_mark",
 | 
				
			||||||
 | 
						"default:acacia_leaves",
 | 
				
			||||||
 | 
						"default:jungletree",
 | 
				
			||||||
 | 
						"default:dry_grass_1",
 | 
				
			||||||
 | 
						"default:acacia_bush_leaves",
 | 
				
			||||||
 | 
						"default:emergent_jungle_sapling",
 | 
				
			||||||
 | 
						"default:fern_2",
 | 
				
			||||||
 | 
						"default:blueberries",
 | 
				
			||||||
 | 
						"default:sand_with_kelp",
 | 
				
			||||||
 | 
						"default:blueberry_bush_leaves",
 | 
				
			||||||
 | 
						"default:pine_bush_sapling",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"farming:cotton",
 | 
				
			||||||
 | 
						"farming:cotton_1",
 | 
				
			||||||
 | 
						"farming:cotton_2",
 | 
				
			||||||
 | 
						"farming:cotton_3",
 | 
				
			||||||
 | 
						"farming:cotton_4",
 | 
				
			||||||
 | 
						"farming:cotton_5",
 | 
				
			||||||
 | 
						"farming:cotton_6",
 | 
				
			||||||
 | 
						"farming:cotton_7",
 | 
				
			||||||
 | 
						"farming:cotton_8",
 | 
				
			||||||
 | 
						"farming:cotton_wild",
 | 
				
			||||||
 | 
						"farming:seed_cotton",
 | 
				
			||||||
 | 
						"farming:seed_wheat",
 | 
				
			||||||
 | 
						"farming:straw",
 | 
				
			||||||
 | 
						"farming:wheat",
 | 
				
			||||||
 | 
						"farming:wheat_1",
 | 
				
			||||||
 | 
						"farming:wheat_2",
 | 
				
			||||||
 | 
						"farming:wheat_3",
 | 
				
			||||||
 | 
						"farming:wheat_4",
 | 
				
			||||||
 | 
						"farming:wheat_5",
 | 
				
			||||||
 | 
						"farming:wheat_6",
 | 
				
			||||||
 | 
						"farming:wheat_7",
 | 
				
			||||||
 | 
						"farming:wheat_8",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"flowers:chrysanthemum_green",
 | 
				
			||||||
 | 
						"flowers:dandelion_white",
 | 
				
			||||||
 | 
						"flowers:dandelion_yellow",
 | 
				
			||||||
 | 
						"flowers:geranium",
 | 
				
			||||||
 | 
						"flowers:mushroom_brown",
 | 
				
			||||||
 | 
						"flowers:mushroom_red",
 | 
				
			||||||
 | 
						"flowers:rose",
 | 
				
			||||||
 | 
						"flowers:tulip",
 | 
				
			||||||
 | 
						"flowers:tulip_black",
 | 
				
			||||||
 | 
						"flowers:viola",
 | 
				
			||||||
 | 
						"flowers:waterlily",
 | 
				
			||||||
 | 
						"flowers:waterlily_waving",
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unified_inventory.add_category_items('tools', {
 | 
				
			||||||
 | 
						"default:sword_diamond",
 | 
				
			||||||
 | 
						"default:axe_diamond",
 | 
				
			||||||
 | 
						"default:shovel_diamond",
 | 
				
			||||||
 | 
						"default:axe_steel",
 | 
				
			||||||
 | 
						"default:shovel_mese",
 | 
				
			||||||
 | 
						"default:sword_wood",
 | 
				
			||||||
 | 
						"default:pick_bronze",
 | 
				
			||||||
 | 
						"default:axe_stone",
 | 
				
			||||||
 | 
						"default:sword_stone",
 | 
				
			||||||
 | 
						"default:pick_stone",
 | 
				
			||||||
 | 
						"default:shovel_stone",
 | 
				
			||||||
 | 
						"default:sword_mese",
 | 
				
			||||||
 | 
						"default:shovel_bronze",
 | 
				
			||||||
 | 
						"default:sword_bronze",
 | 
				
			||||||
 | 
						"default:axe_bronze",
 | 
				
			||||||
 | 
						"default:shovel_steel",
 | 
				
			||||||
 | 
						"default:sword_steel",
 | 
				
			||||||
 | 
						"default:axe_mese",
 | 
				
			||||||
 | 
						"default:shovel_wood",
 | 
				
			||||||
 | 
						"default:pick_mese",
 | 
				
			||||||
 | 
						"default:axe_wood",
 | 
				
			||||||
 | 
						"default:pick_diamond",
 | 
				
			||||||
 | 
						"default:pick_wood",
 | 
				
			||||||
 | 
						"default:pick_steel",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"farming:hoe_bronze",
 | 
				
			||||||
 | 
						"farming:hoe_diamond",
 | 
				
			||||||
 | 
						"farming:hoe_mese",
 | 
				
			||||||
 | 
						"farming:hoe_steel",
 | 
				
			||||||
 | 
						"farming:hoe_stone",
 | 
				
			||||||
 | 
						"farming:hoe_wood",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"fire:flint_and_steel",
 | 
				
			||||||
 | 
						"map:mapping_kit",
 | 
				
			||||||
 | 
						"screwdriver:screwdriver",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"fireflies:bug_net",
 | 
				
			||||||
 | 
						"bucket:bucket_empty",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"binoculars:binoculars",
 | 
				
			||||||
 | 
						"default:skeleton_key",
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unified_inventory.add_category_items('minerals', {
 | 
				
			||||||
 | 
						"default:stone_with_copper",
 | 
				
			||||||
 | 
						"default:stone_with_gold",
 | 
				
			||||||
 | 
						"default:stone_with_iron",
 | 
				
			||||||
 | 
						"default:copper_ingot",
 | 
				
			||||||
 | 
						"default:copper_lump",
 | 
				
			||||||
 | 
						"default:gold_lump",
 | 
				
			||||||
 | 
						"default:diamondblock",
 | 
				
			||||||
 | 
						"default:stone_with_diamond",
 | 
				
			||||||
 | 
						"default:stone_with_mese",
 | 
				
			||||||
 | 
						"default:steel_ingot",
 | 
				
			||||||
 | 
						"default:gold_ingot",
 | 
				
			||||||
 | 
						"default:iron_lump",
 | 
				
			||||||
 | 
						"default:tinblock",
 | 
				
			||||||
 | 
						"default:tin_lump",
 | 
				
			||||||
 | 
						"default:stone_with_tin",
 | 
				
			||||||
 | 
						"default:mese_crystal",
 | 
				
			||||||
 | 
						"default:diamond",
 | 
				
			||||||
 | 
						"default:bronze_ingot",
 | 
				
			||||||
 | 
						"default:mese",
 | 
				
			||||||
 | 
						"default:mese_crystal_fragment",
 | 
				
			||||||
 | 
						"default:copperblock",
 | 
				
			||||||
 | 
						"default:stone_with_coal",
 | 
				
			||||||
 | 
						"default:steelblock",
 | 
				
			||||||
 | 
						"default:tin_ingot",
 | 
				
			||||||
 | 
						"default:coalblock",
 | 
				
			||||||
 | 
						"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', {
 | 
				
			||||||
 | 
						"default:fence_rail_aspen_wood",
 | 
				
			||||||
 | 
						"default:fence_rail_acacia_wood",
 | 
				
			||||||
 | 
						"default:fence_junglewood",
 | 
				
			||||||
 | 
						"default:fence_rail_junglewood",
 | 
				
			||||||
 | 
						"default:fence_aspen_wood",
 | 
				
			||||||
 | 
						"default:fence_pine_wood",
 | 
				
			||||||
 | 
						"default:fence_rail_wood",
 | 
				
			||||||
 | 
						"default:fence_rail_pine_wood",
 | 
				
			||||||
 | 
						"default:fence_acacia_wood",
 | 
				
			||||||
 | 
						"default:junglewood",
 | 
				
			||||||
 | 
						"default:acacia_wood",
 | 
				
			||||||
 | 
						"default:aspen_wood",
 | 
				
			||||||
 | 
						"default:fence_wood",
 | 
				
			||||||
 | 
						"default:pine_wood",
 | 
				
			||||||
 | 
						"default:silver_sandstone",
 | 
				
			||||||
 | 
						"default:desert_sandstone",
 | 
				
			||||||
 | 
						"default:sandstone_block",
 | 
				
			||||||
 | 
						"default:desert_sandstone_brick",
 | 
				
			||||||
 | 
						"default:stone_block",
 | 
				
			||||||
 | 
						"default:stonebrick",
 | 
				
			||||||
 | 
						"default:obsidian_glass",
 | 
				
			||||||
 | 
						"default:desert_sandstone_block",
 | 
				
			||||||
 | 
						"default:silver_sandstone_brick",
 | 
				
			||||||
 | 
						"default:brick",
 | 
				
			||||||
 | 
						"default:obsidianbrick",
 | 
				
			||||||
 | 
						"default:sandstonebrick",
 | 
				
			||||||
 | 
						"default:sandstone",
 | 
				
			||||||
 | 
						"default:desert_stone_block",
 | 
				
			||||||
 | 
						"default:silver_sandstone_block",
 | 
				
			||||||
 | 
						"default:wood",
 | 
				
			||||||
 | 
						"default:obsidian_block",
 | 
				
			||||||
 | 
						"default:glass",
 | 
				
			||||||
 | 
						"default:clay_brick",
 | 
				
			||||||
 | 
						"default:desert_stonebrick",
 | 
				
			||||||
 | 
						"default:desert_cobble",
 | 
				
			||||||
 | 
						"default:cobble",
 | 
				
			||||||
 | 
						"default:mossycobble",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"doors:door_glass",
 | 
				
			||||||
 | 
						"doors:door_glass_a",
 | 
				
			||||||
 | 
						"doors:door_glass_b",
 | 
				
			||||||
 | 
						"doors:door_glass_c",
 | 
				
			||||||
 | 
						"doors:door_glass_d",
 | 
				
			||||||
 | 
						"doors:door_obsidian_glass",
 | 
				
			||||||
 | 
						"doors:door_obsidian_glass_a",
 | 
				
			||||||
 | 
						"doors:door_obsidian_glass_b",
 | 
				
			||||||
 | 
						"doors:door_obsidian_glass_c",
 | 
				
			||||||
 | 
						"doors:door_obsidian_glass_d",
 | 
				
			||||||
 | 
						"doors:door_steel",
 | 
				
			||||||
 | 
						"doors:door_steel_a",
 | 
				
			||||||
 | 
						"doors:door_steel_b",
 | 
				
			||||||
 | 
						"doors:door_steel_c",
 | 
				
			||||||
 | 
						"doors:door_steel_d",
 | 
				
			||||||
 | 
						"doors:door_wood",
 | 
				
			||||||
 | 
						"doors:door_wood_a",
 | 
				
			||||||
 | 
						"doors:door_wood_b",
 | 
				
			||||||
 | 
						"doors:door_wood_c",
 | 
				
			||||||
 | 
						"doors:door_wood_d",
 | 
				
			||||||
 | 
						"doors:gate_acacia_wood_closed",
 | 
				
			||||||
 | 
						"doors:gate_acacia_wood_open",
 | 
				
			||||||
 | 
						"doors:gate_aspen_wood_closed",
 | 
				
			||||||
 | 
						"doors:gate_aspen_wood_open",
 | 
				
			||||||
 | 
						"doors:gate_junglewood_closed",
 | 
				
			||||||
 | 
						"doors:gate_junglewood_open",
 | 
				
			||||||
 | 
						"doors:gate_pine_wood_closed",
 | 
				
			||||||
 | 
						"doors:gate_pine_wood_open",
 | 
				
			||||||
 | 
						"doors:gate_wood_closed",
 | 
				
			||||||
 | 
						"doors:gate_wood_open",
 | 
				
			||||||
 | 
						"doors:hidden",
 | 
				
			||||||
 | 
						"doors:trapdoor",
 | 
				
			||||||
 | 
						"doors:trapdoor_open",
 | 
				
			||||||
 | 
						"doors:trapdoor_steel",
 | 
				
			||||||
 | 
						"doors:trapdoor_steel_open",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"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",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"stairs:slab_acacia_wood",
 | 
				
			||||||
 | 
						"stairs:slab_aspen_wood",
 | 
				
			||||||
 | 
						"stairs:slab_brick",
 | 
				
			||||||
 | 
						"stairs:slab_cobble",
 | 
				
			||||||
 | 
						"stairs:slab_desert_cobble",
 | 
				
			||||||
 | 
						"stairs:slab_desert_sandstone",
 | 
				
			||||||
 | 
						"stairs:slab_desert_sandstone_block",
 | 
				
			||||||
 | 
						"stairs:slab_desert_sandstone_brick",
 | 
				
			||||||
 | 
						"stairs:slab_desert_stone",
 | 
				
			||||||
 | 
						"stairs:slab_desert_stone_block",
 | 
				
			||||||
 | 
						"stairs:slab_desert_stonebrick",
 | 
				
			||||||
 | 
						"stairs:slab_glass",
 | 
				
			||||||
 | 
						"stairs:slab_goldblock",
 | 
				
			||||||
 | 
						"stairs:slab_ice",
 | 
				
			||||||
 | 
						"stairs:slab_junglewood",
 | 
				
			||||||
 | 
						"stairs:slab_mossycobble",
 | 
				
			||||||
 | 
						"stairs:slab_obsidian",
 | 
				
			||||||
 | 
						"stairs:slab_obsidian_block",
 | 
				
			||||||
 | 
						"stairs:slab_obsidian_glass",
 | 
				
			||||||
 | 
						"stairs:slab_obsidianbrick",
 | 
				
			||||||
 | 
						"stairs:slab_pine_wood",
 | 
				
			||||||
 | 
						"stairs:slab_sandstone",
 | 
				
			||||||
 | 
						"stairs:slab_sandstone_block",
 | 
				
			||||||
 | 
						"stairs:slab_sandstonebrick",
 | 
				
			||||||
 | 
						"stairs:slab_silver_sandstone",
 | 
				
			||||||
 | 
						"stairs:slab_silver_sandstone_block",
 | 
				
			||||||
 | 
						"stairs:slab_silver_sandstone_brick",
 | 
				
			||||||
 | 
						"stairs:slab_snowblock",
 | 
				
			||||||
 | 
						"stairs:slab_stone",
 | 
				
			||||||
 | 
						"stairs:slab_stone_block",
 | 
				
			||||||
 | 
						"stairs:slab_stonebrick",
 | 
				
			||||||
 | 
						"stairs:slab_straw",
 | 
				
			||||||
 | 
						"stairs:slab_wood",
 | 
				
			||||||
 | 
						"stairs:stair_acacia_wood",
 | 
				
			||||||
 | 
						"stairs:stair_aspen_wood",
 | 
				
			||||||
 | 
						"stairs:stair_brick",
 | 
				
			||||||
 | 
						"stairs:stair_cobble",
 | 
				
			||||||
 | 
						"stairs:stair_desert_cobble",
 | 
				
			||||||
 | 
						"stairs:stair_desert_sandstone",
 | 
				
			||||||
 | 
						"stairs:stair_desert_sandstone_block",
 | 
				
			||||||
 | 
						"stairs:stair_desert_sandstone_brick",
 | 
				
			||||||
 | 
						"stairs:stair_desert_stone",
 | 
				
			||||||
 | 
						"stairs:stair_desert_stone_block",
 | 
				
			||||||
 | 
						"stairs:stair_desert_stonebrick",
 | 
				
			||||||
 | 
						"stairs:stair_glass",
 | 
				
			||||||
 | 
						"stairs:stair_goldblock",
 | 
				
			||||||
 | 
						"stairs:stair_ice",
 | 
				
			||||||
 | 
						"stairs:stair_inner_acacia_wood",
 | 
				
			||||||
 | 
						"stairs:stair_inner_aspen_wood",
 | 
				
			||||||
 | 
						"stairs:stair_inner_brick",
 | 
				
			||||||
 | 
						"stairs:stair_inner_cobble",
 | 
				
			||||||
 | 
						"stairs:stair_inner_desert_cobble",
 | 
				
			||||||
 | 
						"stairs:stair_inner_desert_sandstone",
 | 
				
			||||||
 | 
						"stairs:stair_inner_desert_sandstone_block",
 | 
				
			||||||
 | 
						"stairs:stair_inner_desert_sandstone_brick",
 | 
				
			||||||
 | 
						"stairs:stair_inner_desert_stone",
 | 
				
			||||||
 | 
						"stairs:stair_inner_desert_stone_block",
 | 
				
			||||||
 | 
						"stairs:stair_inner_desert_stonebrick",
 | 
				
			||||||
 | 
						"stairs:stair_inner_glass",
 | 
				
			||||||
 | 
						"stairs:stair_inner_goldblock",
 | 
				
			||||||
 | 
						"stairs:stair_inner_ice",
 | 
				
			||||||
 | 
						"stairs:stair_inner_junglewood",
 | 
				
			||||||
 | 
						"stairs:stair_inner_mossycobble",
 | 
				
			||||||
 | 
						"stairs:stair_inner_obsidian",
 | 
				
			||||||
 | 
						"stairs:stair_inner_obsidian_block",
 | 
				
			||||||
 | 
						"stairs:stair_inner_obsidian_glass",
 | 
				
			||||||
 | 
						"stairs:stair_inner_obsidianbrick",
 | 
				
			||||||
 | 
						"stairs:stair_inner_pine_wood",
 | 
				
			||||||
 | 
						"stairs:stair_inner_sandstone",
 | 
				
			||||||
 | 
						"stairs:stair_inner_sandstone_block",
 | 
				
			||||||
 | 
						"stairs:stair_inner_sandstonebrick",
 | 
				
			||||||
 | 
						"stairs:stair_inner_silver_sandstone",
 | 
				
			||||||
 | 
						"stairs:stair_inner_silver_sandstone_block",
 | 
				
			||||||
 | 
						"stairs:stair_inner_silver_sandstone_brick",
 | 
				
			||||||
 | 
						"stairs:stair_inner_snowblock",
 | 
				
			||||||
 | 
						"stairs:stair_inner_stone",
 | 
				
			||||||
 | 
						"stairs:stair_inner_stone_block",
 | 
				
			||||||
 | 
						"stairs:stair_inner_stonebrick",
 | 
				
			||||||
 | 
						"stairs:stair_inner_straw",
 | 
				
			||||||
 | 
						"stairs:stair_inner_wood",
 | 
				
			||||||
 | 
						"stairs:stair_junglewood",
 | 
				
			||||||
 | 
						"stairs:stair_mossycobble",
 | 
				
			||||||
 | 
						"stairs:stair_obsidian",
 | 
				
			||||||
 | 
						"stairs:stair_obsidian_block",
 | 
				
			||||||
 | 
						"stairs:stair_obsidian_glass",
 | 
				
			||||||
 | 
						"stairs:stair_obsidianbrick",
 | 
				
			||||||
 | 
						"stairs:stair_outer_acacia_wood",
 | 
				
			||||||
 | 
						"stairs:stair_outer_aspen_wood",
 | 
				
			||||||
 | 
						"stairs:stair_outer_brick",
 | 
				
			||||||
 | 
						"stairs:stair_outer_cobble",
 | 
				
			||||||
 | 
						"stairs:stair_outer_desert_cobble",
 | 
				
			||||||
 | 
						"stairs:stair_outer_desert_sandstone",
 | 
				
			||||||
 | 
						"stairs:stair_outer_desert_sandstone_block",
 | 
				
			||||||
 | 
						"stairs:stair_outer_desert_sandstone_brick",
 | 
				
			||||||
 | 
						"stairs:stair_outer_desert_stone",
 | 
				
			||||||
 | 
						"stairs:stair_outer_desert_stone_block",
 | 
				
			||||||
 | 
						"stairs:stair_outer_desert_stonebrick",
 | 
				
			||||||
 | 
						"stairs:stair_outer_glass",
 | 
				
			||||||
 | 
						"stairs:stair_outer_goldblock",
 | 
				
			||||||
 | 
						"stairs:stair_outer_ice",
 | 
				
			||||||
 | 
						"stairs:stair_outer_junglewood",
 | 
				
			||||||
 | 
						"stairs:stair_outer_mossycobble",
 | 
				
			||||||
 | 
						"stairs:stair_outer_obsidian",
 | 
				
			||||||
 | 
						"stairs:stair_outer_obsidian_block",
 | 
				
			||||||
 | 
						"stairs:stair_outer_obsidian_glass",
 | 
				
			||||||
 | 
						"stairs:stair_outer_obsidianbrick",
 | 
				
			||||||
 | 
						"stairs:stair_outer_pine_wood",
 | 
				
			||||||
 | 
						"stairs:stair_outer_sandstone",
 | 
				
			||||||
 | 
						"stairs:stair_outer_sandstone_block",
 | 
				
			||||||
 | 
						"stairs:stair_outer_sandstonebrick",
 | 
				
			||||||
 | 
						"stairs:stair_outer_silver_sandstone",
 | 
				
			||||||
 | 
						"stairs:stair_outer_silver_sandstone_block",
 | 
				
			||||||
 | 
						"stairs:stair_outer_silver_sandstone_brick",
 | 
				
			||||||
 | 
						"stairs:stair_outer_snowblock",
 | 
				
			||||||
 | 
						"stairs:stair_outer_stone",
 | 
				
			||||||
 | 
						"stairs:stair_outer_stone_block",
 | 
				
			||||||
 | 
						"stairs:stair_outer_stonebrick",
 | 
				
			||||||
 | 
						"stairs:stair_outer_straw",
 | 
				
			||||||
 | 
						"stairs:stair_outer_wood",
 | 
				
			||||||
 | 
						"stairs:stair_pine_wood",
 | 
				
			||||||
 | 
						"stairs:stair_sandstone",
 | 
				
			||||||
 | 
						"stairs:stair_sandstone_block",
 | 
				
			||||||
 | 
						"stairs:stair_sandstonebrick",
 | 
				
			||||||
 | 
						"stairs:stair_silver_sandstone",
 | 
				
			||||||
 | 
						"stairs:stair_silver_sandstone_block",
 | 
				
			||||||
 | 
						"stairs:stair_silver_sandstone_brick",
 | 
				
			||||||
 | 
						"stairs:stair_snowblock",
 | 
				
			||||||
 | 
						"stairs:stair_stone",
 | 
				
			||||||
 | 
						"stairs:stair_stone_block",
 | 
				
			||||||
 | 
						"stairs:stair_stonebrick",
 | 
				
			||||||
 | 
						"stairs:stair_straw",
 | 
				
			||||||
 | 
						"stairs:stair_wood",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"xpanes:bar",
 | 
				
			||||||
 | 
						"xpanes:bar_flat",
 | 
				
			||||||
 | 
						"xpanes:door_steel_bar",
 | 
				
			||||||
 | 
						"xpanes:door_steel_bar_a",
 | 
				
			||||||
 | 
						"xpanes:door_steel_bar_b",
 | 
				
			||||||
 | 
						"xpanes:door_steel_bar_c",
 | 
				
			||||||
 | 
						"xpanes:door_steel_bar_d",
 | 
				
			||||||
 | 
						"xpanes:obsidian_pane",
 | 
				
			||||||
 | 
						"xpanes:obsidian_pane_flat",
 | 
				
			||||||
 | 
						"xpanes:pane",
 | 
				
			||||||
 | 
						"xpanes:pane_flat",
 | 
				
			||||||
 | 
						"xpanes:trapdoor_steel_bar",
 | 
				
			||||||
 | 
						"xpanes:trapdoor_steel_bar_open",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"walls:cobble",
 | 
				
			||||||
 | 
						"walls:desertcobble",
 | 
				
			||||||
 | 
						"walls:mossycobble",
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unified_inventory.add_category_items('environment', {
 | 
				
			||||||
 | 
						"air",
 | 
				
			||||||
 | 
						"default:cave_ice",
 | 
				
			||||||
 | 
						"default:dirt_with_rainforest_litter",
 | 
				
			||||||
 | 
						"default:gravel",
 | 
				
			||||||
 | 
						"default:dry_dirt_with_dry_grass",
 | 
				
			||||||
 | 
						"default:permafrost",
 | 
				
			||||||
 | 
						"default:desert_stone",
 | 
				
			||||||
 | 
						"default:ice",
 | 
				
			||||||
 | 
						"default:dry_dirt",
 | 
				
			||||||
 | 
						"default:obsidian",
 | 
				
			||||||
 | 
						"default:sand",
 | 
				
			||||||
 | 
						"default:river_water_source",
 | 
				
			||||||
 | 
						"default:dirt_with_snow",
 | 
				
			||||||
 | 
						"default:dirt_with_grass",
 | 
				
			||||||
 | 
						"default:water_flowing",
 | 
				
			||||||
 | 
						"default:dirt",
 | 
				
			||||||
 | 
						"default:desert_sand",
 | 
				
			||||||
 | 
						"default:permafrost_with_moss",
 | 
				
			||||||
 | 
						"default:dirt_with_coniferous_litter",
 | 
				
			||||||
 | 
						"default:water_source",
 | 
				
			||||||
 | 
						"default:dirt_with_dry_grass",
 | 
				
			||||||
 | 
						"default:river_water_flowing",
 | 
				
			||||||
 | 
						"default:stone",
 | 
				
			||||||
 | 
						"default:snow",
 | 
				
			||||||
 | 
						"default:lava_flowing",
 | 
				
			||||||
 | 
						"default:lava_source",
 | 
				
			||||||
 | 
						"default:permafrost_with_stones",
 | 
				
			||||||
 | 
						"default:dirt_with_grass_footsteps",
 | 
				
			||||||
 | 
						"default:silver_sand",
 | 
				
			||||||
 | 
						"default:snowblock",
 | 
				
			||||||
 | 
						"default:clay",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"farming:desert_sand_soil",
 | 
				
			||||||
 | 
						"farming:desert_sand_soil_wet",
 | 
				
			||||||
 | 
						"farming:dry_soil",
 | 
				
			||||||
 | 
						"farming:dry_soil_wet",
 | 
				
			||||||
 | 
						"farming:soil",
 | 
				
			||||||
 | 
						"farming:soil_wet",
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unified_inventory.add_category_items('lighting', {
 | 
				
			||||||
 | 
						"default:mese_post_light_junglewood",
 | 
				
			||||||
 | 
						"default:torch_ceiling",
 | 
				
			||||||
 | 
						"default:meselamp",
 | 
				
			||||||
 | 
						"default:torch",
 | 
				
			||||||
 | 
						"default:mese_post_light_acacia_wood",
 | 
				
			||||||
 | 
						"default:mese_post_light",
 | 
				
			||||||
 | 
						"default:torch_wall",
 | 
				
			||||||
 | 
						"default:mese_post_light_pine_wood",
 | 
				
			||||||
 | 
						"default:mese_post_light_aspen_wood"
 | 
				
			||||||
 | 
					})
 | 
				
			||||||
 | 
					--]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--[[ UNCATEGORISED
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"farming:string",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"beds:bed_bottom",
 | 
				
			||||||
 | 
						"beds:bed_top",
 | 
				
			||||||
 | 
						"beds:fancy_bed_bottom",
 | 
				
			||||||
 | 
						"beds:fancy_bed_top",
 | 
				
			||||||
 | 
						"boats:boat",
 | 
				
			||||||
 | 
						"bones:bones",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"bucket:bucket_lava",
 | 
				
			||||||
 | 
						"bucket:bucket_river_water",
 | 
				
			||||||
 | 
						"bucket:bucket_water",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"butterflies:butterfly_red",
 | 
				
			||||||
 | 
						"butterflies:butterfly_violet",
 | 
				
			||||||
 | 
						"butterflies:butterfly_white",
 | 
				
			||||||
 | 
						"butterflies:hidden_butterfly_red",
 | 
				
			||||||
 | 
						"butterflies:hidden_butterfly_violet",
 | 
				
			||||||
 | 
						"butterflies:hidden_butterfly_white",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"carts:brakerail",
 | 
				
			||||||
 | 
						"carts:cart",
 | 
				
			||||||
 | 
						"carts:powerrail",
 | 
				
			||||||
 | 
						"carts:rail",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"default:book",
 | 
				
			||||||
 | 
						"default:book_written",
 | 
				
			||||||
 | 
						"default:bookshelf",
 | 
				
			||||||
 | 
						"default:chest",
 | 
				
			||||||
 | 
						"default:chest_locked",
 | 
				
			||||||
 | 
						"default:chest_locked_open",
 | 
				
			||||||
 | 
						"default:chest_open",
 | 
				
			||||||
 | 
						"default:clay_lump",
 | 
				
			||||||
 | 
						"default:cloud",
 | 
				
			||||||
 | 
						"default:coral_brown",
 | 
				
			||||||
 | 
						"default:coral_cyan",
 | 
				
			||||||
 | 
						"default:coral_green",
 | 
				
			||||||
 | 
						"default:coral_orange",
 | 
				
			||||||
 | 
						"default:coral_pink",
 | 
				
			||||||
 | 
						"default:coral_skeleton",
 | 
				
			||||||
 | 
						"default:flint",
 | 
				
			||||||
 | 
						"default:furnace",
 | 
				
			||||||
 | 
						"default:furnace_active",
 | 
				
			||||||
 | 
						"default:key",
 | 
				
			||||||
 | 
						"default:ladder_steel",
 | 
				
			||||||
 | 
						"default:ladder_wood",
 | 
				
			||||||
 | 
						"default:obsidian_shard",
 | 
				
			||||||
 | 
						"default:paper",
 | 
				
			||||||
 | 
						"default:sign_wall_steel",
 | 
				
			||||||
 | 
						"default:sign_wall_wood",
 | 
				
			||||||
 | 
						"default:stick",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"fire:basic_flame",
 | 
				
			||||||
 | 
						"fire:permanent_flame",
 | 
				
			||||||
 | 
						"fireflies:firefly",
 | 
				
			||||||
 | 
						"fireflies:firefly_bottle",
 | 
				
			||||||
 | 
						"fireflies:hidden_firefly",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"ignore",
 | 
				
			||||||
 | 
						"unknown",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"tnt:boom",
 | 
				
			||||||
 | 
						"tnt:gunpowder",
 | 
				
			||||||
 | 
						"tnt:gunpowder_burning",
 | 
				
			||||||
 | 
						"tnt:tnt",
 | 
				
			||||||
 | 
						"tnt:tnt_burning",
 | 
				
			||||||
 | 
						"tnt:tnt_stick",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"vessels:drinking_glass",
 | 
				
			||||||
 | 
						"vessels:glass_bottle",
 | 
				
			||||||
 | 
						"vessels:glass_fragments",
 | 
				
			||||||
 | 
						"vessels:shelf",
 | 
				
			||||||
 | 
						"vessels:steel_bottle",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"dye:black",
 | 
				
			||||||
 | 
						"dye:blue",
 | 
				
			||||||
 | 
						"dye:brown",
 | 
				
			||||||
 | 
						"dye:cyan",
 | 
				
			||||||
 | 
						"dye:dark_green",
 | 
				
			||||||
 | 
						"dye:dark_grey",
 | 
				
			||||||
 | 
						"dye:green",
 | 
				
			||||||
 | 
						"dye:grey",
 | 
				
			||||||
 | 
						"dye:magenta",
 | 
				
			||||||
 | 
						"dye:orange",
 | 
				
			||||||
 | 
						"dye:pink",
 | 
				
			||||||
 | 
						"dye:red",
 | 
				
			||||||
 | 
						"dye:violet",
 | 
				
			||||||
 | 
						"dye:white",
 | 
				
			||||||
 | 
						"dye:yellow",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"wool:black",
 | 
				
			||||||
 | 
						"wool:blue",
 | 
				
			||||||
 | 
						"wool:brown",
 | 
				
			||||||
 | 
						"wool:cyan",
 | 
				
			||||||
 | 
						"wool:dark_green",
 | 
				
			||||||
 | 
						"wool:dark_grey",
 | 
				
			||||||
 | 
						"wool:green",
 | 
				
			||||||
 | 
						"wool:grey",
 | 
				
			||||||
 | 
						"wool:magenta",
 | 
				
			||||||
 | 
						"wool:orange",
 | 
				
			||||||
 | 
						"wool:pink",
 | 
				
			||||||
 | 
						"wool:red",
 | 
				
			||||||
 | 
						"wool:violet",
 | 
				
			||||||
 | 
						"wool:white",
 | 
				
			||||||
 | 
						"wool:yellow",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"unified_inventory:bag_large",
 | 
				
			||||||
 | 
						"unified_inventory:bag_medium",
 | 
				
			||||||
 | 
						"unified_inventory:bag_small",
 | 
				
			||||||
 | 
					--]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					--[[ LIST UNCATEGORIZED AFTER LOAD
 | 
				
			||||||
 | 
					minetest.register_on_mods_loaded(function()
 | 
				
			||||||
 | 
						minetest.after(1, function ( )
 | 
				
			||||||
 | 
							local l = {}
 | 
				
			||||||
 | 
							for name,_ in pairs(minetest.registered_items) do
 | 
				
			||||||
 | 
								if not unified_inventory.find_category(name) then
 | 
				
			||||||
 | 
									-- minetest.log("error", minetest.serialize(minetest.registered_items[name]))
 | 
				
			||||||
 | 
									table.insert(l, name)
 | 
				
			||||||
 | 
								end
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
							table.sort(l)
 | 
				
			||||||
 | 
							minetest.log(table.concat(l, '",'.."\n"..'"'))
 | 
				
			||||||
 | 
						end)
 | 
				
			||||||
 | 
					end)
 | 
				
			||||||
 | 
					--]]
 | 
				
			||||||
@@ -1,5 +0,0 @@
 | 
				
			|||||||
default
 | 
					 | 
				
			||||||
creative?
 | 
					 | 
				
			||||||
sfinv?
 | 
					 | 
				
			||||||
datastorage?
 | 
					 | 
				
			||||||
farming?
 | 
					 | 
				
			||||||
@@ -1 +0,0 @@
 | 
				
			|||||||
Unified Inventory replaces the default survival and creative inventory. It adds a nicer interface and a number of features, such as a crafting guide.
 | 
					 | 
				
			||||||
							
								
								
									
										135
									
								
								doc/mod_api.txt
									
									
									
									
									
								
							
							
						
						@@ -3,6 +3,14 @@ unified_inventory API
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
This file provides information about the API of unified_inventory.
 | 
					This file provides information about the API of unified_inventory.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					API revisions within unified_inventory can be checked using:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						(unified_inventory.version or 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					**Revision history**
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Version `1`: Classic formspec layout (no real_coordinates)
 | 
				
			||||||
 | 
					* Version `2`: Force formspec version 4 (includes real_coordinates)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Misc functions
 | 
					Misc functions
 | 
				
			||||||
--------------
 | 
					--------------
 | 
				
			||||||
@@ -12,6 +20,64 @@ Grouped by use-case, afterwards sorted alphabetically.
 | 
				
			|||||||
	* Checks whether creative is enabled or the player has `creative`
 | 
						* Checks whether creative is enabled or the player has `creative`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Callbacks
 | 
				
			||||||
 | 
					---------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Register a callback that will be run whenever a craft is registered via unified_inventory.register_craft:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unified_inventory.register_on_craft_registered(
 | 
				
			||||||
 | 
							function (item_name, options)
 | 
				
			||||||
 | 
								-- item_name (string): name of the output item, equivalent to `ItemStack:get_name()`
 | 
				
			||||||
 | 
								-- options (table): definition table of crafts registered by `unified_inventory.register_craft`
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Register a callback that will be run after all mods have loaded and after the unified_inventory mod has initialised all its internal structures:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unified_inventory.register_on_initialized(callback)
 | 
				
			||||||
 | 
							-- The callback is passed no arguments
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Accessing Data
 | 
				
			||||||
 | 
					--------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					These methods should be used instead of accessing the unified_inventory data structures directly - this will ensure your code survives any potential restructuring of the mod.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Get a list of recipes for a particular output item:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unified_inventory.get_recipe_list(output_item)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Returns a list of tables, each holding a recipe definition, like:
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								type = "normal",
 | 
				
			||||||
 | 
								items = { "default:stick", "default:stick", "default:stick", "default:stick" },
 | 
				
			||||||
 | 
								output = "default:wood",
 | 
				
			||||||
 | 
								width = 2
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								type = "shapeless",
 | 
				
			||||||
 | 
								items = { "default:tree" },
 | 
				
			||||||
 | 
								output = "default:wood 4",
 | 
				
			||||||
 | 
								width = 0
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							...
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Get a list of all the output items crafts have been registered for:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unified_inventory.get_registered_outputs()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Returns a list of item names, like:
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							"default:stone",
 | 
				
			||||||
 | 
							"default:chest",
 | 
				
			||||||
 | 
							"default:brick",
 | 
				
			||||||
 | 
							"doors:door_wood",
 | 
				
			||||||
 | 
							...
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Pages
 | 
					Pages
 | 
				
			||||||
-----
 | 
					-----
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -93,3 +159,72 @@ Register a non-standard craft recipe:
 | 
				
			|||||||
		-- ^ Same as `minetest.register_recipe`
 | 
							-- ^ Same as `minetest.register_recipe`
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Categories
 | 
				
			||||||
 | 
					----------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Register a new category:
 | 
				
			||||||
 | 
						The config table (second argument) is optional, and all its members are optional
 | 
				
			||||||
 | 
						See the unified_inventory.set_category_* functions for more details on the members of the config table
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unified_inventory.register_category("category_name", {
 | 
				
			||||||
 | 
							symbol = "mod_name:item_name" or "texture.png",
 | 
				
			||||||
 | 
							label = "Human Readable Label",
 | 
				
			||||||
 | 
							index = 5,
 | 
				
			||||||
 | 
							items = {
 | 
				
			||||||
 | 
								"mod_name:item_name",
 | 
				
			||||||
 | 
								"another_mod:different_item"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Add / override the symbol for a category:
 | 
				
			||||||
 | 
						The category does not need to exist first
 | 
				
			||||||
 | 
						The symbol can be an item name or a texture image
 | 
				
			||||||
 | 
						If unset this will default to "default:stick"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unified_inventory.set_category_symbol("category_name", "mod_name:item_name" or "texture.png")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Add / override the human readable label for a category:
 | 
				
			||||||
 | 
						If unset this will default to the category name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unified_inventory.set_category_label("category_name", "Human Readable Label")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Add / override the sorting index of the category:
 | 
				
			||||||
 | 
						Must be a number, can also be negative (-5) or fractional (2.345)
 | 
				
			||||||
 | 
						This determines the position the category appears in the list of categories
 | 
				
			||||||
 | 
						The "all" meta-category has index -2, the "misc"/"uncategorized" meta-category has index -1, use a negative number smaller than these to make a category appear before these in the list
 | 
				
			||||||
 | 
						By default categories are sorted alphabetically with an index between 0.0101(AA) and 0.2626(ZZ)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unified_inventory.set_category_index("category_name", 5)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Add a single item to a category:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unified_inventory.add_category_item("category_name", "mod_name:item_name")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Add multiple items to a category:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unified_inventory.add_category_items("category_name", {
 | 
				
			||||||
 | 
							"mod_name:item_name",
 | 
				
			||||||
 | 
							"another_mod:different_item"
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Remove an item from a category:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unified_inventory.remove_category_item("category_name", "mod_name:item_name")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Remove a category entirely:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unified_inventory.remove_category("category_name")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Finding existing items in categories:
 | 
				
			||||||
 | 
						This will find the first category an item exists in
 | 
				
			||||||
 | 
						It should be used for checking if an item is catgorised
 | 
				
			||||||
 | 
						Returns "category_name" or nil
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unified_inventory.find_category("mod_name:item_name")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						This will find all the categories an item exists in
 | 
				
			||||||
 | 
						Returns a number indexed table (list) of category names
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						unified_inventory.find_categories("mod_name:item_name")
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										124
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						@@ -1,4 +1,4 @@
 | 
				
			|||||||
-- Unified Inventory for Minetest >= 0.4.16
 | 
					-- Unified Inventory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
 | 
					local modpath = minetest.get_modpath(minetest.get_current_modname())
 | 
				
			||||||
local worldpath = minetest.get_worldpath()
 | 
					local worldpath = minetest.get_worldpath()
 | 
				
			||||||
@@ -10,6 +10,8 @@ unified_inventory = {
 | 
				
			|||||||
	alternate = {},
 | 
						alternate = {},
 | 
				
			||||||
	current_page = {},
 | 
						current_page = {},
 | 
				
			||||||
	current_searchbox = {},
 | 
						current_searchbox = {},
 | 
				
			||||||
 | 
						current_category = {},
 | 
				
			||||||
 | 
						current_category_scroll = {},
 | 
				
			||||||
	current_index = {},
 | 
						current_index = {},
 | 
				
			||||||
	current_item = {},
 | 
						current_item = {},
 | 
				
			||||||
	current_craft_direction = {},
 | 
						current_craft_direction = {},
 | 
				
			||||||
@@ -22,6 +24,8 @@ unified_inventory = {
 | 
				
			|||||||
	filtered_items_list = {},
 | 
						filtered_items_list = {},
 | 
				
			||||||
	pages = {},
 | 
						pages = {},
 | 
				
			||||||
	buttons = {},
 | 
						buttons = {},
 | 
				
			||||||
 | 
						initialized_callbacks = {},
 | 
				
			||||||
 | 
						craft_registered_callbacks = {},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-- Homepos stuff
 | 
						-- Homepos stuff
 | 
				
			||||||
	home_pos = {},
 | 
						home_pos = {},
 | 
				
			||||||
@@ -33,20 +37,111 @@ unified_inventory = {
 | 
				
			|||||||
	-- "Lite" mode
 | 
						-- "Lite" mode
 | 
				
			||||||
	lite_mode = minetest.settings:get_bool("unified_inventory_lite"),
 | 
						lite_mode = minetest.settings:get_bool("unified_inventory_lite"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						-- Items automatically added to categories based on item definitions
 | 
				
			||||||
 | 
						automatic_categorization = (minetest.settings:get_bool("unified_inventory_automatic_categorization") ~= false),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-- Trash enabled
 | 
						-- Trash enabled
 | 
				
			||||||
	trash_enabled = (minetest.settings:get_bool("unified_inventory_trash") ~= false),
 | 
						trash_enabled = (minetest.settings:get_bool("unified_inventory_trash") ~= false),
 | 
				
			||||||
 | 
						imgscale = 1.25,
 | 
				
			||||||
 | 
						list_img_offset = 0.13,
 | 
				
			||||||
 | 
						standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]",
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pagecols = 8,
 | 
						version = 3
 | 
				
			||||||
	pagerows = 10,
 | 
					 | 
				
			||||||
	page_y = 0,
 | 
					 | 
				
			||||||
	formspec_y = 1,
 | 
					 | 
				
			||||||
	main_button_x = 0,
 | 
					 | 
				
			||||||
	main_button_y = 9,
 | 
					 | 
				
			||||||
	craft_result_x = 0.3,
 | 
					 | 
				
			||||||
	craft_result_y = 0.5,
 | 
					 | 
				
			||||||
	form_header_y = 0
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local ui = unified_inventory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- These tables establish position and layout for the two UI styles.
 | 
				
			||||||
 | 
					-- UI doesn't use formspec_[xy] anymore, but other mods may need them.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ui.style_full = {
 | 
				
			||||||
 | 
						formspec_x = 1,
 | 
				
			||||||
 | 
						formspec_y = 1,
 | 
				
			||||||
 | 
						formw = 17.75,
 | 
				
			||||||
 | 
						formh = 12.25,
 | 
				
			||||||
 | 
						pagecols = 8,
 | 
				
			||||||
 | 
						pagerows = 9,
 | 
				
			||||||
 | 
						page_x = 10.75,
 | 
				
			||||||
 | 
						page_y = 2.30,
 | 
				
			||||||
 | 
						craft_x = 2.8,
 | 
				
			||||||
 | 
						craft_y = 1.15,
 | 
				
			||||||
 | 
						craftresult_x = 7.8,
 | 
				
			||||||
 | 
						craft_arrow_x = 6.55,
 | 
				
			||||||
 | 
						craft_guide_x = 3.3,
 | 
				
			||||||
 | 
						craft_guide_y = 1.15,
 | 
				
			||||||
 | 
						craft_guide_arrow_x = 7.05,
 | 
				
			||||||
 | 
						craft_guide_result_x = 8.3,
 | 
				
			||||||
 | 
						craft_guide_resultstr_x = 0.3,
 | 
				
			||||||
 | 
						craft_guide_resultstr_y = 0.6,
 | 
				
			||||||
 | 
						give_btn_x = 0.25,
 | 
				
			||||||
 | 
						main_button_x = 0.4,
 | 
				
			||||||
 | 
						main_button_y = 11.0,
 | 
				
			||||||
 | 
						page_buttons_x = 11.60,
 | 
				
			||||||
 | 
						page_buttons_y = 10.15,
 | 
				
			||||||
 | 
						searchwidth = 3.4,
 | 
				
			||||||
 | 
						form_header_x = 0.4,
 | 
				
			||||||
 | 
						form_header_y = 0.4,
 | 
				
			||||||
 | 
						btn_spc = 0.85,
 | 
				
			||||||
 | 
						btn_size = 0.75,
 | 
				
			||||||
 | 
						std_inv_x = 0.3,
 | 
				
			||||||
 | 
						std_inv_y = 5.75,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ui.style_lite = {
 | 
				
			||||||
 | 
						formspec_x =  0.6,
 | 
				
			||||||
 | 
						formspec_y =  0.6,
 | 
				
			||||||
 | 
						formw = 14,
 | 
				
			||||||
 | 
						formh = 9.75,
 | 
				
			||||||
 | 
						pagecols = 4,
 | 
				
			||||||
 | 
						pagerows = 5,
 | 
				
			||||||
 | 
						page_x = 10.5,
 | 
				
			||||||
 | 
						page_y = 2.15,
 | 
				
			||||||
 | 
						craft_x = 2.6,
 | 
				
			||||||
 | 
						craft_y = 0.75,
 | 
				
			||||||
 | 
						craftresult_x = 5.75,
 | 
				
			||||||
 | 
						craft_arrow_x = 6.35,
 | 
				
			||||||
 | 
						craft_guide_x = 3.1,
 | 
				
			||||||
 | 
						craft_guide_y = 0.75,
 | 
				
			||||||
 | 
						craft_guide_arrow_x = 7.05,
 | 
				
			||||||
 | 
						craft_guide_result_x = 8.3,
 | 
				
			||||||
 | 
						craft_guide_resultstr_x = 0.15,
 | 
				
			||||||
 | 
						craft_guide_resultstr_y = 0.35,
 | 
				
			||||||
 | 
						give_btn_x = 0.15,
 | 
				
			||||||
 | 
						main_button_x = 10.5,
 | 
				
			||||||
 | 
						main_button_y = 8.15,
 | 
				
			||||||
 | 
						page_buttons_x = 10.5,
 | 
				
			||||||
 | 
						page_buttons_y = 6.15,
 | 
				
			||||||
 | 
						searchwidth = 1.6,
 | 
				
			||||||
 | 
						form_header_x =  0.2,
 | 
				
			||||||
 | 
						form_header_y =  0.2,
 | 
				
			||||||
 | 
						btn_spc = 0.8,
 | 
				
			||||||
 | 
						btn_size = 0.7,
 | 
				
			||||||
 | 
						std_inv_x = 0.1,
 | 
				
			||||||
 | 
						std_inv_y = 4.6,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dofile(modpath.."/api.lua")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					for _, style in ipairs({ui.style_full, ui.style_lite}) do
 | 
				
			||||||
 | 
						style.items_per_page =  style.pagecols * style.pagerows
 | 
				
			||||||
 | 
						style.standard_inv = string.format("list[current_player;main;%f,%f;8,4;]",
 | 
				
			||||||
 | 
												style.std_inv_x + ui.list_img_offset, style.std_inv_y + ui.list_img_offset)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						style.standard_inv_bg = ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y, 8, 1, true)..
 | 
				
			||||||
 | 
												ui.make_inv_img_grid(style.std_inv_x, style.std_inv_y + ui.imgscale, 8, 3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						style.craft_grid =	table.concat({
 | 
				
			||||||
 | 
												ui.make_inv_img_grid(style.craft_x, style.craft_y, 3, 3),
 | 
				
			||||||
 | 
												ui.single_slot(style.craft_x + ui.imgscale*4, style.craft_y), -- the craft result slot
 | 
				
			||||||
 | 
												string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]",
 | 
				
			||||||
 | 
												style.craft_arrow_x, style.craft_y, ui.imgscale, ui.imgscale),
 | 
				
			||||||
 | 
												string.format("list[current_player;craft;%f,%f;3,3;]",
 | 
				
			||||||
 | 
													style.craft_x + ui.list_img_offset, style.craft_y + ui.list_img_offset),
 | 
				
			||||||
 | 
												string.format("list[current_player;craftpreview;%f,%f;1,1;]",
 | 
				
			||||||
 | 
													style.craftresult_x + ui.list_img_offset, style.craft_y + ui.list_img_offset)
 | 
				
			||||||
 | 
											})
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- Disable default creative inventory
 | 
					-- Disable default creative inventory
 | 
				
			||||||
local creative = rawget(_G, "creative") or rawget(_G, "creative_inventory")
 | 
					local creative = rawget(_G, "creative") or rawget(_G, "creative_inventory")
 | 
				
			||||||
if creative then
 | 
					if creative then
 | 
				
			||||||
@@ -62,7 +157,8 @@ if sfinv then
 | 
				
			|||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dofile(modpath.."/group.lua")
 | 
					dofile(modpath.."/group.lua")
 | 
				
			||||||
dofile(modpath.."/api.lua")
 | 
					dofile(modpath.."/category.lua")
 | 
				
			||||||
 | 
					dofile(modpath.."/default-categories.lua")
 | 
				
			||||||
dofile(modpath.."/internal.lua")
 | 
					dofile(modpath.."/internal.lua")
 | 
				
			||||||
dofile(modpath.."/callbacks.lua")
 | 
					dofile(modpath.."/callbacks.lua")
 | 
				
			||||||
dofile(modpath.."/match_craft.lua")
 | 
					dofile(modpath.."/match_craft.lua")
 | 
				
			||||||
@@ -73,9 +169,5 @@ if minetest.settings:get_bool("unified_inventory_bags") ~= false then
 | 
				
			|||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
dofile(modpath.."/item_names.lua")
 | 
					dofile(modpath.."/item_names.lua")
 | 
				
			||||||
 | 
					dofile(modpath.."/waypoints.lua")
 | 
				
			||||||
if minetest.get_modpath("datastorage") then
 | 
					 | 
				
			||||||
	dofile(modpath.."/waypoints.lua")
 | 
					 | 
				
			||||||
end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
minetest.log("action", "[unified_inventory] loaded.")
 | 
					minetest.log("action", "[unified_inventory] loaded.")
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										558
									
								
								internal.lua
									
									
									
									
									
								
							
							
						
						@@ -1,5 +1,6 @@
 | 
				
			|||||||
local S = minetest.get_translator("unified_inventory")
 | 
					local S = minetest.get_translator("unified_inventory")
 | 
				
			||||||
local F = minetest.formspec_escape
 | 
					local F = minetest.formspec_escape
 | 
				
			||||||
 | 
					local ui = unified_inventory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- This pair of encoding functions is used where variable text must go in
 | 
					-- This pair of encoding functions is used where variable text must go in
 | 
				
			||||||
-- button names, where the text might contain formspec metacharacters.
 | 
					-- button names, where the text might contain formspec metacharacters.
 | 
				
			||||||
@@ -9,100 +10,57 @@ local F = minetest.formspec_escape
 | 
				
			|||||||
-- This is a game engine bug, and in the anticipation that it might be
 | 
					-- This is a game engine bug, and in the anticipation that it might be
 | 
				
			||||||
-- fixed some day we don't want to rely on it.  So for safety we apply
 | 
					-- fixed some day we don't want to rely on it.  So for safety we apply
 | 
				
			||||||
-- an encoding that avoids all formspec metacharacters.
 | 
					-- an encoding that avoids all formspec metacharacters.
 | 
				
			||||||
function unified_inventory.mangle_for_formspec(str)
 | 
					
 | 
				
			||||||
 | 
					function ui.mangle_for_formspec(str)
 | 
				
			||||||
	return string.gsub(str, "([^A-Za-z0-9])", function (c) return string.format("_%d_", string.byte(c)) end)
 | 
						return string.gsub(str, "([^A-Za-z0-9])", function (c) return string.format("_%d_", string.byte(c)) end)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
function unified_inventory.demangle_for_formspec(str)
 | 
					function ui.demangle_for_formspec(str)
 | 
				
			||||||
	return string.gsub(str, "_([0-9]+)_", function (v) return string.char(v) end)
 | 
						return string.gsub(str, "_([0-9]+)_", function (v) return string.char(v) end)
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function unified_inventory.get_per_player_formspec(player_name)
 | 
					 | 
				
			||||||
	local lite = unified_inventory.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true})
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local ui = {}
 | 
					function ui.get_per_player_formspec(player_name)
 | 
				
			||||||
	ui.pagecols = unified_inventory.pagecols
 | 
						local draw_lite_mode = ui.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true})
 | 
				
			||||||
	ui.pagerows = unified_inventory.pagerows
 | 
					 | 
				
			||||||
	ui.page_y = unified_inventory.page_y
 | 
					 | 
				
			||||||
	ui.formspec_y = unified_inventory.formspec_y
 | 
					 | 
				
			||||||
	ui.main_button_x = unified_inventory.main_button_x
 | 
					 | 
				
			||||||
	ui.main_button_y = unified_inventory.main_button_y
 | 
					 | 
				
			||||||
	ui.craft_result_x = unified_inventory.craft_result_x
 | 
					 | 
				
			||||||
	ui.craft_result_y = unified_inventory.craft_result_y
 | 
					 | 
				
			||||||
	ui.form_header_y = unified_inventory.form_header_y
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if lite then
 | 
						local style = table.copy(draw_lite_mode and ui.style_lite or ui.style_full)
 | 
				
			||||||
		ui.pagecols = 4
 | 
						style.is_lite_mode = draw_lite_mode
 | 
				
			||||||
		ui.pagerows = 6
 | 
						return style
 | 
				
			||||||
		ui.page_y = 0.25
 | 
					 | 
				
			||||||
		ui.formspec_y = 0.47
 | 
					 | 
				
			||||||
		ui.main_button_x = 8.2
 | 
					 | 
				
			||||||
		ui.main_button_y = 6.5
 | 
					 | 
				
			||||||
		ui.craft_result_x = 2.8
 | 
					 | 
				
			||||||
		ui.craft_result_y = 3.4
 | 
					 | 
				
			||||||
		ui.form_header_y = -0.1
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ui.items_per_page = ui.pagecols * ui.pagerows
 | 
					 | 
				
			||||||
	return ui, lite
 | 
					 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function unified_inventory.get_formspec(player, page)
 | 
					local function formspec_button(ui_peruser, name, image, offset, pos, scale, label)
 | 
				
			||||||
 | 
						local element = 'image_button'
 | 
				
			||||||
	if not player then
 | 
						if minetest.registered_items[image] then
 | 
				
			||||||
		return ""
 | 
							element = 'item_image_button'
 | 
				
			||||||
 | 
						elseif image:find(":", 1, true) then
 | 
				
			||||||
 | 
							image = "unknown_item.png"
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
						local spc = (1-scale)*ui_peruser.btn_size/2
 | 
				
			||||||
 | 
						local size = ui_peruser.btn_size*scale
 | 
				
			||||||
 | 
						return string.format("%s[%f,%f;%f,%f;%s;%s;]", element,
 | 
				
			||||||
 | 
							(offset.x or offset[1]) + ( ui_peruser.btn_spc * (pos.x or pos[1]) ) + spc,
 | 
				
			||||||
 | 
							(offset.y or offset[2]) + ( ui_peruser.btn_spc * (pos.y or pos[2]) ) + spc,
 | 
				
			||||||
 | 
							size, size, image, name) ..
 | 
				
			||||||
 | 
							string.format("tooltip[%s;%s]", name, F(label or name))
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local player_name = player:get_player_name()
 | 
					local function formspec_add_filters(player, formspec, style)
 | 
				
			||||||
	local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	unified_inventory.current_page[player_name] = page
 | 
					 | 
				
			||||||
	local pagedef = unified_inventory.pages[page]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if not pagedef then
 | 
					 | 
				
			||||||
		return "" -- Invalid page name
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local formspec = {
 | 
					 | 
				
			||||||
		"size[14,10]",
 | 
					 | 
				
			||||||
		pagedef.formspec_prepend and "" or "no_prepend[]",
 | 
					 | 
				
			||||||
		"background[-0.19,-0.25;14.4,10.75;ui_form_bg.png]" -- Background
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	local n = 4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if draw_lite_mode then
 | 
					 | 
				
			||||||
		formspec[1] = "size[11,7.7]"
 | 
					 | 
				
			||||||
		formspec[3] = "background[-0.19,-0.2;11.4,8.4;ui_form_bg.png]"
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if unified_inventory.is_creative(player_name)
 | 
					 | 
				
			||||||
	and page == "craft" then
 | 
					 | 
				
			||||||
		formspec[n] = "background[0,"..(ui_peruser.formspec_y + 2)..";1,1;ui_single_slot.png]"
 | 
					 | 
				
			||||||
		n = n+1
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local perplayer_formspec = unified_inventory.get_per_player_formspec(player_name)
 | 
					 | 
				
			||||||
	local fsdata = pagedef.get_formspec(player, perplayer_formspec)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	formspec[n] = fsdata.formspec
 | 
					 | 
				
			||||||
	n = n+1
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local button_row = 0
 | 
						local button_row = 0
 | 
				
			||||||
	local button_col = 0
 | 
						local button_col = 0
 | 
				
			||||||
 | 
						local n = #formspec + 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-- Main buttons
 | 
						-- Main buttons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local filtered_inv_buttons = {}
 | 
						local filtered_inv_buttons = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for i, def in pairs(unified_inventory.buttons) do
 | 
						for i, def in pairs(ui.buttons) do
 | 
				
			||||||
		if not (draw_lite_mode and def.hide_lite) then
 | 
							if not (style.is_lite_mode and def.hide_lite) then
 | 
				
			||||||
			table.insert(filtered_inv_buttons, def)
 | 
								table.insert(filtered_inv_buttons, def)
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local j = 1 --Modif NALC (sys4 20/11/2018) 12 buttons max by row
 | 
						local j = 1 --Modif NALC (sys4 20/11/2018) 12 buttons max by row
 | 
				
			||||||
	for i, def in pairs(filtered_inv_buttons) do
 | 
						for i, def in pairs(filtered_inv_buttons) do
 | 
				
			||||||
 | 
							if style.is_lite_mode and i > 4 then
 | 
				
			||||||
		if draw_lite_mode and i > 4 then
 | 
					 | 
				
			||||||
			button_row = 1
 | 
								button_row = 1
 | 
				
			||||||
			button_col = 1
 | 
								button_col = 1
 | 
				
			||||||
		elseif not draw_lite_mode and j > 12 then
 | 
							elseif not draw_lite_mode and j > 12 then
 | 
				
			||||||
@@ -111,172 +69,257 @@ function unified_inventory.get_formspec(player, page)
 | 
				
			|||||||
		end
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if def.type == "image" then
 | 
							if def.type == "image" then
 | 
				
			||||||
 | 
								local pos_x = style.main_button_x + style.btn_spc * (j - 1) - button_col * style.btn_spc * 4
 | 
				
			||||||
 | 
								local pos_y = style.main_button_y + button_row * style.btn_spc
 | 
				
			||||||
			if (def.condition == nil or def.condition(player) == true) then
 | 
								if (def.condition == nil or def.condition(player) == true) then
 | 
				
			||||||
				formspec[n] = "image_button["
 | 
									formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s;]",
 | 
				
			||||||
				formspec[n+1] = ( ui_peruser.main_button_x + 0.65 * (j - 1) - button_col * 0.65 * 4) -- Modif NALC
 | 
										pos_x, pos_y, style.btn_size, style.btn_size,
 | 
				
			||||||
				formspec[n+2] = ","..(ui_peruser.main_button_y + button_row * 0.7)..";0.8,0.8;"
 | 
										F(def.image),
 | 
				
			||||||
				formspec[n+3] = F(def.image)..";"
 | 
										F(def.name))
 | 
				
			||||||
				formspec[n+4] = F(def.name)..";]"
 | 
									formspec[n+1] = "tooltip["..F(def.name)..";"..(def.tooltip or "").."]"
 | 
				
			||||||
				formspec[n+5] = "tooltip["..F(def.name)
 | 
									n = n+2
 | 
				
			||||||
				formspec[n+6] = ";"..(def.tooltip or "").."]"
 | 
					 | 
				
			||||||
				n = n+7
 | 
					 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				formspec[n] = "image["
 | 
									formspec[n] = string.format("image[%f,%f;%f,%f;%s^[colorize:#808080:alpha]",
 | 
				
			||||||
				formspec[n+1] = ( ui_peruser.main_button_x + 0.65 * (j - 1) - button_col * 0.65 * 4) -- Modif NALC
 | 
										pos_x, pos_y, style.btn_size, style.btn_size,
 | 
				
			||||||
				formspec[n+2] = ","..(ui_peruser.main_button_y + button_row * 0.7)..";0.8,0.8;"
 | 
										def.image)
 | 
				
			||||||
				formspec[n+3] = F(def.image).."^[colorize:#808080:alpha]"
 | 
									n = n+1
 | 
				
			||||||
				n = n+4
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		j = j + 1 -- Modif NALC
 | 
							j = j + 1 -- Modif NALC
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if fsdata.draw_inventory ~= false then
 | 
					local function formspec_add_categories(player, formspec, ui_peruser)
 | 
				
			||||||
		-- Player inventory
 | 
						local player_name = player:get_player_name()
 | 
				
			||||||
		formspec[n] = "listcolors[#00000000;#00000000]"
 | 
						local n = #formspec + 1
 | 
				
			||||||
		formspec[n+1] = "list[current_player;main;0,"..(ui_peruser.formspec_y + 3.5)..";8,4;]"
 | 
					
 | 
				
			||||||
		n = n+2
 | 
						local categories_pos = {
 | 
				
			||||||
 | 
							ui_peruser.page_x,
 | 
				
			||||||
 | 
							ui_peruser.page_y-ui_peruser.btn_spc-0.5
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						local categories_scroll_pos = {
 | 
				
			||||||
 | 
							ui_peruser.page_x,
 | 
				
			||||||
 | 
							ui_peruser.form_header_y - (ui_peruser.is_lite_mode and 0 or 0.2)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						formspec[n] = string.format("background9[%f,%f;%f,%f;%s;false;3]",
 | 
				
			||||||
 | 
							ui_peruser.page_x-0.1, categories_scroll_pos[2],
 | 
				
			||||||
 | 
							(ui_peruser.btn_spc * ui_peruser.pagecols) + 0.13, 1.4 + (ui_peruser.is_lite_mode and 0 or 0.2),
 | 
				
			||||||
 | 
							"ui_smallbg_9_sliced.png")
 | 
				
			||||||
 | 
						n = n + 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						formspec[n] = string.format("label[%f,%f;%s]",
 | 
				
			||||||
 | 
							ui_peruser.page_x,
 | 
				
			||||||
 | 
							ui_peruser.form_header_y + (ui_peruser.is_lite_mode and 0.3 or 0.2), F(S("Category:")))
 | 
				
			||||||
 | 
						n = n + 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local scroll_offset = 0
 | 
				
			||||||
 | 
						local category_count = #ui.category_list
 | 
				
			||||||
 | 
						if category_count > ui_peruser.pagecols then
 | 
				
			||||||
 | 
							scroll_offset = ui.current_category_scroll[player_name]
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if fsdata.draw_item_list == false then
 | 
						for index, category in ipairs(ui.category_list) do
 | 
				
			||||||
		return table.concat(formspec, "")
 | 
							local column = index - scroll_offset
 | 
				
			||||||
 | 
							if column > 0 and column <= ui_peruser.pagecols then
 | 
				
			||||||
 | 
								local scale = 0.8
 | 
				
			||||||
 | 
								if ui.current_category[player_name] == category.name then
 | 
				
			||||||
 | 
									scale = 1
 | 
				
			||||||
 | 
								end
 | 
				
			||||||
 | 
								formspec[n] = formspec_button(ui_peruser, "category_"..category.name, category.symbol, categories_pos, {column-1, 0}, scale, category.label)
 | 
				
			||||||
 | 
								n = n + 1
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
						if category_count > ui_peruser.pagecols and scroll_offset > 0 then
 | 
				
			||||||
 | 
							-- prev
 | 
				
			||||||
 | 
							formspec[n] = formspec_button(ui_peruser, "prev_category", "ui_left_icon.png", categories_scroll_pos, {ui_peruser.pagecols - 2, 0}, 0.8, S("Scroll categories left"))
 | 
				
			||||||
 | 
							n = n + 1
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						if category_count > ui_peruser.pagecols and category_count - scroll_offset > ui_peruser.pagecols then
 | 
				
			||||||
 | 
							-- next
 | 
				
			||||||
 | 
							formspec[n] = formspec_button(ui_peruser, "next_category", "ui_right_icon.png", categories_scroll_pos, {ui_peruser.pagecols - 1, 0}, 0.8, S("Scroll categories right"))
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local function formspec_add_search_box(player, formspec, ui_peruser)
 | 
				
			||||||
 | 
						local player_name = player:get_player_name()
 | 
				
			||||||
 | 
						local n = #formspec + 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						formspec[n] = "field_close_on_enter[searchbox;false]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						formspec[n+1] = string.format("field[%f,%f;%f,%f;searchbox;;%s]",
 | 
				
			||||||
 | 
							ui_peruser.page_buttons_x, ui_peruser.page_buttons_y,
 | 
				
			||||||
 | 
							ui_peruser.searchwidth - 0.1, ui_peruser.btn_size,
 | 
				
			||||||
 | 
							F(ui.current_searchbox[player_name]))
 | 
				
			||||||
 | 
						formspec[n+2] = string.format("image_button[%f,%f;%f,%f;ui_search_icon.png;searchbutton;]",
 | 
				
			||||||
 | 
							ui_peruser.page_buttons_x + ui_peruser.searchwidth, ui_peruser.page_buttons_y,
 | 
				
			||||||
 | 
							ui_peruser.btn_size,ui_peruser.btn_size)
 | 
				
			||||||
 | 
						formspec[n+3] = "tooltip[searchbutton;" ..F(S("Search")) .. "]"
 | 
				
			||||||
 | 
						formspec[n+4] = string.format("image_button[%f,%f;%f,%f;ui_reset_icon.png;searchresetbutton;]",
 | 
				
			||||||
 | 
							ui_peruser.page_buttons_x + ui_peruser.searchwidth + ui_peruser.btn_spc,
 | 
				
			||||||
 | 
							ui_peruser.page_buttons_y,
 | 
				
			||||||
 | 
							ui_peruser.btn_size, ui_peruser.btn_size)
 | 
				
			||||||
 | 
						formspec[n+5] = "tooltip[searchresetbutton;"..F(S("Reset search and display everything")).."]"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if ui.activefilter[player_name] ~= "" then
 | 
				
			||||||
 | 
							formspec[n+6] = string.format("label[%f,%f;%s: %s]",
 | 
				
			||||||
 | 
								ui_peruser.page_x, ui_peruser.page_y - 0.25,
 | 
				
			||||||
 | 
								F(S("Filter")), F(ui.activefilter[player_name]))
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local function formspec_add_item_browser(player, formspec, ui_peruser)
 | 
				
			||||||
 | 
						local player_name = player:get_player_name()
 | 
				
			||||||
 | 
						local n = #formspec + 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-- Controls to flip items pages
 | 
						-- Controls to flip items pages
 | 
				
			||||||
	local start_x = 9.2
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if not draw_lite_mode then
 | 
						local btnlist = {
 | 
				
			||||||
		formspec[n] =
 | 
							{ "ui_skip_backward_icon.png", "start_list", S("First page") },
 | 
				
			||||||
			"image_button[" .. (start_x + 0.6 * 0)
 | 
							{ "ui_doubleleft_icon.png",    "rewind3",    S("Back three pages") },
 | 
				
			||||||
				.. ",9;.8,.8;ui_skip_backward_icon.png;start_list;]"
 | 
							{ "ui_left_icon.png",          "rewind1",    S("Back one page") },
 | 
				
			||||||
			.. "tooltip[start_list;" .. F(S("First page")) .. "]"
 | 
							{ "ui_right_icon.png",         "forward1",   S("Forward one page") },
 | 
				
			||||||
 | 
							{ "ui_doubleright_icon.png",   "forward3",   S("Forward three pages") },
 | 
				
			||||||
 | 
							{ "ui_skip_forward_icon.png",  "end_list",   S("Last page") },
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			.. "image_button[" .. (start_x + 0.6 * 1)
 | 
						if ui_peruser.is_lite_mode then
 | 
				
			||||||
				.. ",9;.8,.8;ui_doubleleft_icon.png;rewind3;]"
 | 
							btnlist[2] = nil
 | 
				
			||||||
			.. "tooltip[rewind3;" .. F(S("Back three pages")) .. "]"
 | 
							btnlist[5] = nil
 | 
				
			||||||
			.. "image_button[" .. (start_x + 0.6 * 2)
 | 
					 | 
				
			||||||
				.. ",9;.8,.8;ui_left_icon.png;rewind1;]"
 | 
					 | 
				
			||||||
			.. "tooltip[rewind1;" .. F(S("Back one page")) .. "]"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			.. "image_button[" .. (start_x + 0.6 * 3)
 | 
					 | 
				
			||||||
				.. ",9;.8,.8;ui_right_icon.png;forward1;]"
 | 
					 | 
				
			||||||
			.. "tooltip[forward1;" .. F(S("Forward one page")) .. "]"
 | 
					 | 
				
			||||||
			.. "image_button[" .. (start_x + 0.6 * 4)
 | 
					 | 
				
			||||||
				.. ",9;.8,.8;ui_doubleright_icon.png;forward3;]"
 | 
					 | 
				
			||||||
			.. "tooltip[forward3;" .. F(S("Forward three pages")) .. "]"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			.. "image_button[" .. (start_x + 0.6 * 5)
 | 
					 | 
				
			||||||
				.. ",9;.8,.8;ui_skip_forward_icon.png;end_list;]"
 | 
					 | 
				
			||||||
			.. "tooltip[end_list;" .. F(S("Last page")) .. "]"
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		formspec[n] =
 | 
					 | 
				
			||||||
			"image_button[" .. (8.2 + 0.65 * 0)
 | 
					 | 
				
			||||||
				.. ",5.8;.8,.8;ui_skip_backward_icon.png;start_list;]"
 | 
					 | 
				
			||||||
			.. "tooltip[start_list;" .. F(S("First page")) .. "]"
 | 
					 | 
				
			||||||
			.. "image_button[" .. (8.2 + 0.65 * 1)
 | 
					 | 
				
			||||||
				.. ",5.8;.8,.8;ui_left_icon.png;rewind1;]"
 | 
					 | 
				
			||||||
			.. "tooltip[rewind1;" .. F(S("Back one page")) .. "]"
 | 
					 | 
				
			||||||
			.. "image_button[" .. (8.2 + 0.65 * 2)
 | 
					 | 
				
			||||||
				.. ",5.8;.8,.8;ui_right_icon.png;forward1;]"
 | 
					 | 
				
			||||||
			.. "tooltip[forward1;" .. F(S("Forward one page")) .. "]"
 | 
					 | 
				
			||||||
			.. "image_button[" .. (8.2 + 0.65 * 3)
 | 
					 | 
				
			||||||
				.. ",5.8;.8,.8;ui_skip_forward_icon.png;end_list;]"
 | 
					 | 
				
			||||||
			.. "tooltip[end_list;" .. F(S("Last page")) .. "]"
 | 
					 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	n = n+1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-- Search box
 | 
						local bn = 0
 | 
				
			||||||
	formspec[n] = "field_close_on_enter[searchbox;false]"
 | 
						for _, b in pairs(btnlist) do
 | 
				
			||||||
	n = n+1
 | 
							formspec[n] =  string.format("image_button[%f,%f;%f,%f;%s;%s;]",
 | 
				
			||||||
 | 
								ui_peruser.page_buttons_x + ui_peruser.btn_spc*bn,
 | 
				
			||||||
	if not draw_lite_mode then
 | 
								ui_peruser.page_buttons_y + ui_peruser.btn_spc,
 | 
				
			||||||
		formspec[n] = "field[9.5,8.325;3,1;searchbox;;"
 | 
								ui_peruser.btn_size, ui_peruser.btn_size,
 | 
				
			||||||
			.. F(unified_inventory.current_searchbox[player_name]) .. "]"
 | 
								b[1],b[2])
 | 
				
			||||||
		formspec[n+1] = "image_button[12.2,8.1;.8,.8;ui_search_icon.png;searchbutton;]"
 | 
							formspec[n+1] = "tooltip["..b[2]..";"..F(b[3]).."]"
 | 
				
			||||||
			.. "tooltip[searchbutton;" ..F(S("Search")) .. "]"
 | 
							bn = bn + 1
 | 
				
			||||||
		formspec[n+2] = "image_button[12.9,8.1;.8,.8;ui_reset_icon.png;searchresetbutton;]"
 | 
							n = n + 2
 | 
				
			||||||
			.. "tooltip[searchbutton;" ..F(S("Search")) .. "]"
 | 
					 | 
				
			||||||
			.. "tooltip[searchresetbutton;" ..F(S("Reset search and display everything")) .. "]"
 | 
					 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		formspec[n] = "field[8.5,5.225;2.2,1;searchbox;;"
 | 
					 | 
				
			||||||
			.. F(unified_inventory.current_searchbox[player_name]) .. "]"
 | 
					 | 
				
			||||||
		formspec[n+1] = "image_button[10.3,5;.8,.8;ui_search_icon.png;searchbutton;]"
 | 
					 | 
				
			||||||
			.. "tooltip[searchbutton;" ..F(S("Search")) .. "]"
 | 
					 | 
				
			||||||
		formspec[n+2] = "image_button[11,5;.8,.8;ui_reset_icon.png;searchresetbutton;]"
 | 
					 | 
				
			||||||
			.. "tooltip[searchbutton;" ..F(S("Search")) .. "]"
 | 
					 | 
				
			||||||
			.. "tooltip[searchresetbutton;" ..F(S("Reset search and display everything")) .. "]"
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
	n = n+3
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	local no_matches = S("No matching items")
 | 
					 | 
				
			||||||
	if draw_lite_mode then
 | 
					 | 
				
			||||||
		no_matches = S("No matches.")
 | 
					 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	-- Items list
 | 
						-- Items list
 | 
				
			||||||
	if #unified_inventory.filtered_items_list[player_name] == 0 then
 | 
						if #ui.filtered_items_list[player_name] == 0 then
 | 
				
			||||||
		formspec[n] = "label[8.2,"..ui_peruser.form_header_y..";" .. F(no_matches) .. "]"
 | 
							local no_matches = S("No matching items")
 | 
				
			||||||
	else
 | 
							if ui_peruser.is_lite_mode then
 | 
				
			||||||
		local dir = unified_inventory.active_search_direction[player_name]
 | 
								no_matches = S("No matches.")
 | 
				
			||||||
		local list_index = unified_inventory.current_index[player_name]
 | 
							end
 | 
				
			||||||
		local page2 = math.floor(list_index / (ui_peruser.items_per_page) + 1)
 | 
					 | 
				
			||||||
		local pagemax = math.floor(
 | 
					 | 
				
			||||||
			(#unified_inventory.filtered_items_list[player_name] - 1)
 | 
					 | 
				
			||||||
				/ (ui_peruser.items_per_page) + 1)
 | 
					 | 
				
			||||||
		for y = 0, ui_peruser.pagerows - 1 do
 | 
					 | 
				
			||||||
			for x = 0, ui_peruser.pagecols - 1 do
 | 
					 | 
				
			||||||
				local name = unified_inventory.filtered_items_list[player_name][list_index]
 | 
					 | 
				
			||||||
				local item = minetest.registered_items[name]
 | 
					 | 
				
			||||||
				if item then
 | 
					 | 
				
			||||||
					-- Clicked on current item: Flip crafting direction
 | 
					 | 
				
			||||||
					if name == unified_inventory.current_item[player_name] then
 | 
					 | 
				
			||||||
						local cdir = unified_inventory.current_craft_direction[player_name]
 | 
					 | 
				
			||||||
						if cdir == "recipe" then
 | 
					 | 
				
			||||||
							dir = "usage"
 | 
					 | 
				
			||||||
						elseif cdir == "usage" then
 | 
					 | 
				
			||||||
							dir = "recipe"
 | 
					 | 
				
			||||||
						end
 | 
					 | 
				
			||||||
					else
 | 
					 | 
				
			||||||
					-- Default: use active search direction by default
 | 
					 | 
				
			||||||
						dir = unified_inventory.active_search_direction[player_name]
 | 
					 | 
				
			||||||
					end
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
					local button_name = "item_button_" .. dir .. "_"
 | 
							formspec[n] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y+0.15)..";" .. F(no_matches) .. "]"
 | 
				
			||||||
						.. unified_inventory.mangle_for_formspec(name)
 | 
							return
 | 
				
			||||||
					formspec[n] = ("item_image_button[%f,%f;.81,.81;%s;%s;]"):format(
 | 
						end
 | 
				
			||||||
						8.2 + x * 0.7, ui_peruser.formspec_y + ui_peruser.page_y + y * 0.7,
 | 
					
 | 
				
			||||||
						name, button_name
 | 
						local dir = ui.active_search_direction[player_name]
 | 
				
			||||||
					)
 | 
						local list_index = ui.current_index[player_name]
 | 
				
			||||||
					formspec[n + 1] = ("tooltip[%s;%s \\[%s\\]]"):format(
 | 
						local page2 = math.floor(list_index / (ui_peruser.items_per_page) + 1)
 | 
				
			||||||
						button_name, minetest.formspec_escape(item.description),
 | 
						local pagemax = math.floor(
 | 
				
			||||||
						item.mod_origin or "??"
 | 
							(#ui.filtered_items_list[player_name] - 1)
 | 
				
			||||||
					)
 | 
								/ (ui_peruser.items_per_page) + 1)
 | 
				
			||||||
					n = n + 2
 | 
						for y = 0, ui_peruser.pagerows - 1 do
 | 
				
			||||||
					list_index = list_index + 1
 | 
							for x = 0, ui_peruser.pagecols - 1 do
 | 
				
			||||||
 | 
								local name = ui.filtered_items_list[player_name][list_index]
 | 
				
			||||||
 | 
								local item = minetest.registered_items[name]
 | 
				
			||||||
 | 
								if item then
 | 
				
			||||||
 | 
									-- Clicked on current item: Flip crafting direction
 | 
				
			||||||
 | 
									if name == ui.current_item[player_name] then
 | 
				
			||||||
 | 
										local cdir = ui.current_craft_direction[player_name]
 | 
				
			||||||
 | 
										if cdir == "recipe" then
 | 
				
			||||||
 | 
											dir = "usage"
 | 
				
			||||||
 | 
										elseif cdir == "usage" then
 | 
				
			||||||
 | 
											dir = "recipe"
 | 
				
			||||||
 | 
										end
 | 
				
			||||||
 | 
									else
 | 
				
			||||||
 | 
									-- Default: use active search direction by default
 | 
				
			||||||
 | 
										dir = ui.active_search_direction[player_name]
 | 
				
			||||||
				end
 | 
									end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									local button_name = "item_button_" .. dir .. "_"
 | 
				
			||||||
 | 
										.. ui.mangle_for_formspec(name)
 | 
				
			||||||
 | 
									formspec[n] = ("item_image_button[%f,%f;%f,%f;%s;%s;]"):format(
 | 
				
			||||||
 | 
										ui_peruser.page_x + x * ui_peruser.btn_spc,
 | 
				
			||||||
 | 
										ui_peruser.page_y + y * ui_peruser.btn_spc,
 | 
				
			||||||
 | 
										ui_peruser.btn_size, ui_peruser.btn_size,
 | 
				
			||||||
 | 
										name, button_name
 | 
				
			||||||
 | 
									)
 | 
				
			||||||
 | 
									formspec[n + 1] = ("tooltip[%s;%s \\[%s\\]]"):format(
 | 
				
			||||||
 | 
										button_name, minetest.formspec_escape(item.description),
 | 
				
			||||||
 | 
										item.mod_origin or "??"
 | 
				
			||||||
 | 
									)
 | 
				
			||||||
 | 
									n = n + 2
 | 
				
			||||||
 | 
									list_index = list_index + 1
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		formspec[n] = "label[8.2,"..ui_peruser.form_header_y..";"..F(S("Page")) .. ": "
 | 
					 | 
				
			||||||
			.. S("@1 of @2",page2,pagemax).."]"
 | 
					 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	n= n+1
 | 
						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),
 | 
				
			||||||
	if unified_inventory.activefilter[player_name] ~= "" then
 | 
							ui_peruser.page_buttons_y + 0.1 + ui_peruser.btn_spc * 2,
 | 
				
			||||||
		formspec[n] = "label[8.2,"..(ui_peruser.form_header_y + 0.4)..";" .. F(S("Filter")) .. ":]"
 | 
							F(S("Page")), S("@1 of @2",page2,pagemax))
 | 
				
			||||||
		formspec[n+1] = "label[9.1,"..(ui_peruser.form_header_y + 0.4)..";"..F(unified_inventory.activefilter[player_name]).."]"
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
	return table.concat(formspec, "")
 | 
					 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function unified_inventory.set_inventory_formspec(player, page)
 | 
					function ui.get_formspec(player, page)
 | 
				
			||||||
	if player then
 | 
					
 | 
				
			||||||
		player:set_inventory_formspec(unified_inventory.get_formspec(player, page))
 | 
						if not player then
 | 
				
			||||||
 | 
							return ""
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local player_name = player:get_player_name()
 | 
				
			||||||
 | 
						local ui_peruser = ui.get_per_player_formspec(player_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ui.current_page[player_name] = page
 | 
				
			||||||
 | 
						local pagedef = ui.pages[page]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if not pagedef then
 | 
				
			||||||
 | 
							return "" -- Invalid page name
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local fs = {
 | 
				
			||||||
 | 
							"formspec_version[4]",
 | 
				
			||||||
 | 
							"size["..ui_peruser.formw..","..ui_peruser.formh.."]",
 | 
				
			||||||
 | 
							pagedef.formspec_prepend and "" or "no_prepend[]",
 | 
				
			||||||
 | 
							ui.standard_background
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						local perplayer_formspec = ui.get_per_player_formspec(player_name)
 | 
				
			||||||
 | 
						local fsdata = pagedef.get_formspec(player, perplayer_formspec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fs[#fs + 1] = fsdata.formspec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						formspec_add_filters(player, fs, ui_peruser)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if fsdata.draw_inventory ~= false then
 | 
				
			||||||
 | 
							-- Player inventory
 | 
				
			||||||
 | 
							fs[#fs + 1] = "listcolors[#00000000;#00000000]"
 | 
				
			||||||
 | 
							fs[#fs + 1] = ui_peruser.standard_inv
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if fsdata.draw_item_list == false then
 | 
				
			||||||
 | 
							return table.concat(fs, "")
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						formspec_add_categories(player, fs, ui_peruser)
 | 
				
			||||||
 | 
						formspec_add_search_box(player, fs, ui_peruser)
 | 
				
			||||||
 | 
						formspec_add_item_browser(player, fs, ui_peruser)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return table.concat(fs)
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function ui.set_inventory_formspec(player, page)
 | 
				
			||||||
 | 
						if player then
 | 
				
			||||||
 | 
							player:set_inventory_formspec(ui.get_formspec(player, page))
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local function valid_def(def)
 | 
				
			||||||
 | 
						return (not def.groups.not_in_creative_inventory
 | 
				
			||||||
 | 
								or def.groups.not_in_creative_inventory == 0)
 | 
				
			||||||
 | 
							and def.description
 | 
				
			||||||
 | 
							and def.description ~= ""
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
--apply filter to the inventory list (create filtered copy of full one)
 | 
					--apply filter to the inventory list (create filtered copy of full one)
 | 
				
			||||||
function unified_inventory.apply_filter(player, filter, search_dir)
 | 
					function ui.apply_filter(player, filter, search_dir)
 | 
				
			||||||
	if not player then
 | 
						if not player then
 | 
				
			||||||
		return false
 | 
							return false
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
@@ -295,84 +338,47 @@ function unified_inventory.apply_filter(player, filter, search_dir)
 | 
				
			|||||||
			return true
 | 
								return true
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
 | 
							local lang = minetest.get_player_information(player_name).lang_code
 | 
				
			||||||
		ffilter = function(name, def)
 | 
							ffilter = function(name, def)
 | 
				
			||||||
			local lname = string.lower(name)
 | 
								local lname = string.lower(name)
 | 
				
			||||||
			local ldesc = string.lower(def.description)
 | 
								local ldesc = string.lower(def.description)
 | 
				
			||||||
 | 
								local llocaldesc = minetest.get_translated_string
 | 
				
			||||||
 | 
									and string.lower(minetest.get_translated_string(lang, def.description))
 | 
				
			||||||
			return string.find(lname, lfilter, 1, true) or string.find(ldesc, lfilter, 1, true)
 | 
								return string.find(lname, lfilter, 1, true) or string.find(ldesc, lfilter, 1, true)
 | 
				
			||||||
 | 
									or llocaldesc and string.find(llocaldesc, lfilter, 1, true)
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	unified_inventory.filtered_items_list[player_name]={}
 | 
						ui.filtered_items_list[player_name]={}
 | 
				
			||||||
	for name, def in pairs(minetest.registered_items) do
 | 
						local category = ui.current_category[player_name] or 'all'
 | 
				
			||||||
		if (not def.groups.not_in_creative_inventory
 | 
						if category == 'all' then
 | 
				
			||||||
			or def.groups.not_in_creative_inventory == 0)
 | 
							for name, def in pairs(minetest.registered_items) do
 | 
				
			||||||
		and def.description
 | 
								if valid_def(def)
 | 
				
			||||||
		and def.description ~= ""
 | 
								and ffilter(name, def) then
 | 
				
			||||||
		and ffilter(name, def) then
 | 
									table.insert(ui.filtered_items_list[player_name], name)
 | 
				
			||||||
			table.insert(unified_inventory.filtered_items_list[player_name], name)
 | 
								end
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	end
 | 
						elseif category == 'uncategorized' then
 | 
				
			||||||
	table.sort(unified_inventory.filtered_items_list[player_name])
 | 
							for name, def in pairs(minetest.registered_items) do
 | 
				
			||||||
	unified_inventory.filtered_items_list_size[player_name] = #unified_inventory.filtered_items_list[player_name]
 | 
								if (not ui.find_category(name))
 | 
				
			||||||
	unified_inventory.current_index[player_name] = 1
 | 
								and valid_def(def)
 | 
				
			||||||
	unified_inventory.activefilter[player_name] = filter
 | 
								and ffilter(name, def) then
 | 
				
			||||||
	unified_inventory.active_search_direction[player_name] = search_dir
 | 
									table.insert(ui.filtered_items_list[player_name], name)
 | 
				
			||||||
	unified_inventory.set_inventory_formspec(player,
 | 
								end
 | 
				
			||||||
	unified_inventory.current_page[player_name])
 | 
							end
 | 
				
			||||||
end
 | 
						else
 | 
				
			||||||
 | 
							for name,exists in pairs(ui.registered_category_items[category]) do
 | 
				
			||||||
function unified_inventory.items_in_group(groups)
 | 
								local def = minetest.registered_items[name]
 | 
				
			||||||
	local items = {}
 | 
								if exists and def
 | 
				
			||||||
	for name, item in pairs(minetest.registered_items) do
 | 
								and valid_def(def)
 | 
				
			||||||
		for _, group in pairs(groups:split(',')) do
 | 
								and ffilter(name, def) then
 | 
				
			||||||
			if item.groups[group] then
 | 
									table.insert(ui.filtered_items_list[player_name], name)
 | 
				
			||||||
				table.insert(items, name)
 | 
					 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	return items
 | 
						table.sort(ui.filtered_items_list[player_name])
 | 
				
			||||||
end
 | 
						ui.filtered_items_list_size[player_name] = #ui.filtered_items_list[player_name]
 | 
				
			||||||
 | 
						ui.current_index[player_name] = 1
 | 
				
			||||||
function unified_inventory.sort_inventory(inv)
 | 
						ui.activefilter[player_name] = filter
 | 
				
			||||||
	local inlist = inv:get_list("main")
 | 
						ui.active_search_direction[player_name] = search_dir
 | 
				
			||||||
	local typecnt = {}
 | 
						ui.set_inventory_formspec(player, ui.current_page[player_name])
 | 
				
			||||||
	local typekeys = {}
 | 
					 | 
				
			||||||
	for _, st in ipairs(inlist) do
 | 
					 | 
				
			||||||
		if not st:is_empty() then
 | 
					 | 
				
			||||||
			local n = st:get_name()
 | 
					 | 
				
			||||||
			local w = st:get_wear()
 | 
					 | 
				
			||||||
			local m = st:get_metadata()
 | 
					 | 
				
			||||||
			local k = string.format("%s %05d %s", n, w, m)
 | 
					 | 
				
			||||||
			if not typecnt[k] then
 | 
					 | 
				
			||||||
				typecnt[k] = {
 | 
					 | 
				
			||||||
					name = n,
 | 
					 | 
				
			||||||
					wear = w,
 | 
					 | 
				
			||||||
					metadata = m,
 | 
					 | 
				
			||||||
					stack_max = st:get_stack_max(),
 | 
					 | 
				
			||||||
					count = 0,
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				table.insert(typekeys, k)
 | 
					 | 
				
			||||||
			end
 | 
					 | 
				
			||||||
			typecnt[k].count = typecnt[k].count + st:get_count()
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
	table.sort(typekeys)
 | 
					 | 
				
			||||||
	local outlist = {}
 | 
					 | 
				
			||||||
	for _, k in ipairs(typekeys) do
 | 
					 | 
				
			||||||
		local tc = typecnt[k]
 | 
					 | 
				
			||||||
		while tc.count > 0 do
 | 
					 | 
				
			||||||
			local c = math.min(tc.count, tc.stack_max)
 | 
					 | 
				
			||||||
			table.insert(outlist, ItemStack({
 | 
					 | 
				
			||||||
				name = tc.name,
 | 
					 | 
				
			||||||
				wear = tc.wear,
 | 
					 | 
				
			||||||
				metadata = tc.metadata,
 | 
					 | 
				
			||||||
				count = c,
 | 
					 | 
				
			||||||
			}))
 | 
					 | 
				
			||||||
			tc.count = tc.count - c
 | 
					 | 
				
			||||||
		end
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
	if #outlist > #inlist then return end
 | 
					 | 
				
			||||||
	while #outlist < #inlist do
 | 
					 | 
				
			||||||
		table.insert(outlist, ItemStack(nil))
 | 
					 | 
				
			||||||
	end
 | 
					 | 
				
			||||||
	inv:set_list("main", outlist)
 | 
					 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,54 +1,52 @@
 | 
				
			|||||||
# textdomain: unified_inventory
 | 
					# textdomain: unified_inventory
 | 
				
			||||||
 | 
					Mixing=
 | 
				
			||||||
# waypoints.lua
 | 
					Cooking=
 | 
				
			||||||
 | 
					Digging=
 | 
				
			||||||
White=
 | 
					Bags=
 | 
				
			||||||
Yellow=
 | 
					Bag @1=
 | 
				
			||||||
Red=
 | 
					Small Bag=
 | 
				
			||||||
Green=
 | 
					Medium Bag=
 | 
				
			||||||
Blue=
 | 
					Large Bag=
 | 
				
			||||||
Waypoints=
 | 
					All Items=
 | 
				
			||||||
Select Waypoint #@1=
 | 
					Misc. Items=
 | 
				
			||||||
Waypoint @1=
 | 
					Plant Life=
 | 
				
			||||||
Set waypoint to current location=
 | 
					Building Materials=
 | 
				
			||||||
Make waypoint @1=
 | 
					Tools=
 | 
				
			||||||
invisible=
 | 
					Minerals and Metals=
 | 
				
			||||||
visible=
 | 
					Environment and Worldgen=
 | 
				
			||||||
@1 display of waypoint coordinates=
 | 
					Lighting=
 | 
				
			||||||
Disable=
 | 
					 | 
				
			||||||
Enable=
 | 
					 | 
				
			||||||
Change color of waypoint display=
 | 
					 | 
				
			||||||
Edit waypoint name=
 | 
					 | 
				
			||||||
Waypoint active=
 | 
					 | 
				
			||||||
Waypoint inactive=
 | 
					 | 
				
			||||||
Finish editing=
 | 
					 | 
				
			||||||
World position=
 | 
					 | 
				
			||||||
Name=
 | 
					 | 
				
			||||||
HUD text color=
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# group.lua
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 and =
 | 
					 and =
 | 
				
			||||||
 | 
					Scroll categories left=
 | 
				
			||||||
# register.lua
 | 
					Scroll categories right=
 | 
				
			||||||
 | 
					Search=
 | 
				
			||||||
 | 
					Reset search and display everything=
 | 
				
			||||||
 | 
					First page=
 | 
				
			||||||
 | 
					Back three pages=
 | 
				
			||||||
 | 
					Back one page=
 | 
				
			||||||
 | 
					Forward one page=
 | 
				
			||||||
 | 
					Forward three pages=
 | 
				
			||||||
 | 
					Last page=
 | 
				
			||||||
 | 
					No matching items=
 | 
				
			||||||
 | 
					No matches.=
 | 
				
			||||||
 | 
					Page=
 | 
				
			||||||
 | 
					@1 of @2=
 | 
				
			||||||
 | 
					Filter=
 | 
				
			||||||
Can use the creative inventory=
 | 
					Can use the creative inventory=
 | 
				
			||||||
Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=
 | 
					Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=
 | 
				
			||||||
Crafting Grid=
 | 
					Crafting Grid=
 | 
				
			||||||
Crafting Guide=
 | 
					Crafting Guide=
 | 
				
			||||||
Set home position=
 | 
					Set home position=
 | 
				
			||||||
Home position set to: @1=
 | 
					Home position set to: @1=
 | 
				
			||||||
You don't have the \"home\" privilege!=
 | 
					You don't have the "home" privilege!=
 | 
				
			||||||
Go home=
 | 
					Go home=
 | 
				
			||||||
Set time to day=
 | 
					Set time to day=
 | 
				
			||||||
Set time to night=
 | 
					 | 
				
			||||||
Time of day set to 6am=
 | 
					Time of day set to 6am=
 | 
				
			||||||
Time of day set to 9pm=
 | 
					 | 
				
			||||||
You don't have the settime privilege!=
 | 
					You don't have the settime privilege!=
 | 
				
			||||||
 | 
					Set time to night=
 | 
				
			||||||
 | 
					Time of day set to 9pm=
 | 
				
			||||||
Clear inventory=
 | 
					Clear inventory=
 | 
				
			||||||
 | 
					This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
				
			||||||
Inventory cleared!=
 | 
					Inventory cleared!=
 | 
				
			||||||
This button has been disabled outside=
 | 
					 | 
				
			||||||
Crafting=
 | 
					 | 
				
			||||||
Trash:=
 | 
					Trash:=
 | 
				
			||||||
Refill:=
 | 
					Refill:=
 | 
				
			||||||
Any item belonging to the @1 group=
 | 
					Any item belonging to the @1 group=
 | 
				
			||||||
@@ -65,36 +63,28 @@ Show previous recipe=
 | 
				
			|||||||
Show previous usage=
 | 
					Show previous usage=
 | 
				
			||||||
@1 (@2)=
 | 
					@1 (@2)=
 | 
				
			||||||
Give me:=
 | 
					Give me:=
 | 
				
			||||||
This recipe is too@nlarge to be displayed.=
 | 
					This recipe is too@@large to be displayed.=
 | 
				
			||||||
To craft grid:=
 | 
					To craft grid:=
 | 
				
			||||||
All=
 | 
					All=
 | 
				
			||||||
 | 
					Crafting=
 | 
				
			||||||
# api.lua
 | 
					White=
 | 
				
			||||||
 | 
					Yellow=
 | 
				
			||||||
Mixing=
 | 
					Red=
 | 
				
			||||||
Cooking=
 | 
					Green=
 | 
				
			||||||
Digging=
 | 
					Blue=
 | 
				
			||||||
 | 
					Waypoints=
 | 
				
			||||||
# internal.lua
 | 
					Select Waypoint #@1=
 | 
				
			||||||
 | 
					Waypoint @1=
 | 
				
			||||||
First page=
 | 
					Set waypoint to current location=
 | 
				
			||||||
Back three pages=
 | 
					Hide waypoint=
 | 
				
			||||||
Back one page=
 | 
					Show waypoint=
 | 
				
			||||||
Forward one page=
 | 
					Hide coordinates=
 | 
				
			||||||
Forward three pages=
 | 
					Show coordinates=
 | 
				
			||||||
Last page=
 | 
					Change color of waypoint display=
 | 
				
			||||||
Search=
 | 
					Edit waypoint name=
 | 
				
			||||||
Reset search and display everything=
 | 
					Waypoint active=
 | 
				
			||||||
No matching items=
 | 
					Waypoint inactive=
 | 
				
			||||||
No matches.=
 | 
					Finish editing=
 | 
				
			||||||
Page=
 | 
					World position=
 | 
				
			||||||
@1 of @2=
 | 
					Name=
 | 
				
			||||||
Filter=
 | 
					HUD text color=
 | 
				
			||||||
 | 
					 | 
				
			||||||
# bags.lua
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Bags=
 | 
					 | 
				
			||||||
Bag @1=
 | 
					 | 
				
			||||||
Small Bag=
 | 
					 | 
				
			||||||
Medium Bag=
 | 
					 | 
				
			||||||
Large Bag=
 | 
					 | 
				
			||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
# textdomain: unified_inventory
 | 
					# textdomain: unified_inventory
 | 
				
			||||||
Crafting=Fertigung
 | 
					 | 
				
			||||||
Mixing=Mischen
 | 
					Mixing=Mischen
 | 
				
			||||||
Cooking=Kochen
 | 
					Cooking=Kochen
 | 
				
			||||||
Digging=Graben
 | 
					Digging=Graben
 | 
				
			||||||
@@ -8,21 +7,32 @@ Bag @1=Tasche @1
 | 
				
			|||||||
Small Bag=Kleine Tasche
 | 
					Small Bag=Kleine Tasche
 | 
				
			||||||
Medium Bag=Mittelgroße Tasche
 | 
					Medium Bag=Mittelgroße Tasche
 | 
				
			||||||
Large Bag=Große Tasche
 | 
					Large Bag=Große Tasche
 | 
				
			||||||
 | 
					All Items=
 | 
				
			||||||
 | 
					Misc. Items=
 | 
				
			||||||
 | 
					Plant Life=
 | 
				
			||||||
 | 
					Building Materials=
 | 
				
			||||||
 | 
					Tools=
 | 
				
			||||||
 | 
					Minerals and Metals=
 | 
				
			||||||
 | 
					Environment and Worldgen=
 | 
				
			||||||
 | 
					Lighting=
 | 
				
			||||||
 and = und 
 | 
					 and = und 
 | 
				
			||||||
 | 
					Scroll categories left=
 | 
				
			||||||
 | 
					Scroll categories right=
 | 
				
			||||||
 | 
					Search=Suchen
 | 
				
			||||||
 | 
					Reset search and display everything=Suche zurücksetzen und alles anzeigen
 | 
				
			||||||
First page=Erste Seite
 | 
					First page=Erste Seite
 | 
				
			||||||
Back three pages=3 Seiten zurückblättern
 | 
					Back three pages=3 Seiten zurückblättern
 | 
				
			||||||
Back one page=1 Seite zurückblättern
 | 
					Back one page=1 Seite zurückblättern
 | 
				
			||||||
Forward one page=1 Seite vorblättern
 | 
					Forward one page=1 Seite vorblättern
 | 
				
			||||||
Forward three pages=3 Seiten vorblättern
 | 
					Forward three pages=3 Seiten vorblättern
 | 
				
			||||||
Last page=Letzte Seite
 | 
					Last page=Letzte Seite
 | 
				
			||||||
Search=Suchen
 | 
					 | 
				
			||||||
Reset search and display everything=Suche zurücksetzen und alles anzeigen
 | 
					 | 
				
			||||||
No matching items=Keine passenden Gegenstände
 | 
					No matching items=Keine passenden Gegenstände
 | 
				
			||||||
No matches.=Keine Treffer
 | 
					No matches.=Keine Treffer
 | 
				
			||||||
Page=Seite
 | 
					Page=Seite
 | 
				
			||||||
@1 of @2=@1 von @2
 | 
					@1 of @2=@1 von @2
 | 
				
			||||||
Filter=Filter
 | 
					Filter=Filter
 | 
				
			||||||
Can use the creative inventory=Kann das Kreativinventar nutzen
 | 
					Can use the creative inventory=Kann das Kreativinventar nutzen
 | 
				
			||||||
 | 
					Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Zwingt Unified Inventory, im Vollmodus angezeigt zu werden, wenn der Minimalmodus global eingestellt ist
 | 
				
			||||||
Crafting Grid=Fertigungsraster
 | 
					Crafting Grid=Fertigungsraster
 | 
				
			||||||
Crafting Guide=Fertigungsführer
 | 
					Crafting Guide=Fertigungsführer
 | 
				
			||||||
Set home position=Heimatposition setzen
 | 
					Set home position=Heimatposition setzen
 | 
				
			||||||
@@ -35,6 +45,7 @@ You don't have the settime privilege!=Du hast das „settime“-Privileg nicht!
 | 
				
			|||||||
Set time to night=Zur Nachtzeit wechseln
 | 
					Set time to night=Zur Nachtzeit wechseln
 | 
				
			||||||
Time of day set to 9pm=Tageszeit auf 21 Uhr gesetzt
 | 
					Time of day set to 9pm=Tageszeit auf 21 Uhr gesetzt
 | 
				
			||||||
Clear inventory=Inventar leeren
 | 
					Clear inventory=Inventar leeren
 | 
				
			||||||
 | 
					This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
				
			||||||
Inventory cleared!=Inventar geleert!
 | 
					Inventory cleared!=Inventar geleert!
 | 
				
			||||||
Trash:=Müll:
 | 
					Trash:=Müll:
 | 
				
			||||||
Refill:=Nachfüllen:
 | 
					Refill:=Nachfüllen:
 | 
				
			||||||
@@ -50,9 +61,12 @@ Show next recipe=Nächstes Rezept zeigen
 | 
				
			|||||||
Show next usage=Nächste Verwendung zeigen
 | 
					Show next usage=Nächste Verwendung zeigen
 | 
				
			||||||
Show previous recipe=Vorheriges Rezept zeigen
 | 
					Show previous recipe=Vorheriges Rezept zeigen
 | 
				
			||||||
Show previous usage=Vorherige Verwendung zeigen
 | 
					Show previous usage=Vorherige Verwendung zeigen
 | 
				
			||||||
 | 
					@1 (@2)=
 | 
				
			||||||
Give me:=Gib mir:
 | 
					Give me:=Gib mir:
 | 
				
			||||||
 | 
					This recipe is too@@large to be displayed.=
 | 
				
			||||||
To craft grid:=Ins Fertigungsraster:
 | 
					To craft grid:=Ins Fertigungsraster:
 | 
				
			||||||
All=Alles
 | 
					All=Alles
 | 
				
			||||||
 | 
					Crafting=Fertigung
 | 
				
			||||||
White=Weiß
 | 
					White=Weiß
 | 
				
			||||||
Yellow=Gelb
 | 
					Yellow=Gelb
 | 
				
			||||||
Red=Rot
 | 
					Red=Rot
 | 
				
			||||||
@@ -62,12 +76,10 @@ Waypoints=Wegpunkte
 | 
				
			|||||||
Select Waypoint #@1=Wegpunkt Nr. @1 auswählen
 | 
					Select Waypoint #@1=Wegpunkt Nr. @1 auswählen
 | 
				
			||||||
Waypoint @1=Wegpunkt Nr. @1
 | 
					Waypoint @1=Wegpunkt Nr. @1
 | 
				
			||||||
Set waypoint to current location=Setze Wegpunkt zur derzeitigen Position
 | 
					Set waypoint to current location=Setze Wegpunkt zur derzeitigen Position
 | 
				
			||||||
invisible=unsichtbar
 | 
					Hide waypoint=
 | 
				
			||||||
visible=sichtbar
 | 
					Show waypoint=
 | 
				
			||||||
Make waypoint @1=Wegpunkt @1 machen
 | 
					Hide coordinates=
 | 
				
			||||||
Disable=ausschalten
 | 
					Show coordinates=
 | 
				
			||||||
Enable=einschalten
 | 
					 | 
				
			||||||
@1 display of waypoint coordinates=Anzeige der Wegpunktkoordinaten @1
 | 
					 | 
				
			||||||
Change color of waypoint display=Farbe der Darstellung der Wegpunkte ändern
 | 
					Change color of waypoint display=Farbe der Darstellung der Wegpunkte ändern
 | 
				
			||||||
Edit waypoint name=Name des Wegpunkts ändern
 | 
					Edit waypoint name=Name des Wegpunkts ändern
 | 
				
			||||||
Waypoint active=Wegpunkt aktiv
 | 
					Waypoint active=Wegpunkt aktiv
 | 
				
			||||||
@@ -76,4 +88,13 @@ Finish editing=Bearbeitung abschließen
 | 
				
			|||||||
World position=Weltposition
 | 
					World position=Weltposition
 | 
				
			||||||
Name=Name
 | 
					Name=Name
 | 
				
			||||||
HUD text color=HUD-Textfarbe
 | 
					HUD text color=HUD-Textfarbe
 | 
				
			||||||
Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Zwingt Unified Inventory, im Vollmodus angezeigt zu werden, wenn der Minimalmodus global eingestellt ist
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### not used anymore #####
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					invisible=unsichtbar
 | 
				
			||||||
 | 
					visible=sichtbar
 | 
				
			||||||
 | 
					Make waypoint @1=Wegpunkt @1 machen
 | 
				
			||||||
 | 
					Disable=ausschalten
 | 
				
			||||||
 | 
					Enable=einschalten
 | 
				
			||||||
 | 
					@1 display of waypoint coordinates=Anzeige der Wegpunktkoordinaten @1
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,54 +1,57 @@
 | 
				
			|||||||
# textdomain: unified_inventory
 | 
					# textdomain: unified_inventory
 | 
				
			||||||
 | 
					# api.lua
 | 
				
			||||||
# waypoints.lua
 | 
					Mixing=Mezclar
 | 
				
			||||||
 | 
					Cooking=Hornear
 | 
				
			||||||
White=Blanco
 | 
					Digging=Recoger
 | 
				
			||||||
Yellow=Amarillo
 | 
					# bags.lua
 | 
				
			||||||
Red=Rojo
 | 
					Bags=Bolsos
 | 
				
			||||||
Green=Verde
 | 
					Bag @1=Bolso @1
 | 
				
			||||||
Blue=Azul
 | 
					Small Bag=Bolso Pequeño
 | 
				
			||||||
Waypoints=Puntos
 | 
					Medium Bag=Bolso Mediano
 | 
				
			||||||
Select Waypoint #@1=Seleccionar Punto #@1
 | 
					Large Bag=Bolso Grande
 | 
				
			||||||
Waypoint @1=Punto @1
 | 
					All Items=
 | 
				
			||||||
Set waypoint to current location=Establecer el punto a la ubicación actual
 | 
					Misc. Items=
 | 
				
			||||||
Make waypoint @1=Hacer punto @1
 | 
					Plant Life=
 | 
				
			||||||
invisible=invisible
 | 
					Building Materials=
 | 
				
			||||||
visible=visible
 | 
					Tools=
 | 
				
			||||||
@1 display of waypoint coordinates=Visualizar coordenadas del punto @1
 | 
					Minerals and Metals=
 | 
				
			||||||
Disable=Deshabilitado
 | 
					Environment and Worldgen=
 | 
				
			||||||
Enable=Habilitado
 | 
					Lighting=
 | 
				
			||||||
Change color of waypoint display=Cambiar el color del punto
 | 
					 | 
				
			||||||
Edit waypoint name=Editar nombre del punto
 | 
					 | 
				
			||||||
Waypoint active=Punto activo
 | 
					 | 
				
			||||||
Waypoint inactive=Punto inactivo
 | 
					 | 
				
			||||||
Finish editing=Terminar edición
 | 
					 | 
				
			||||||
World position=Posición en el mundo
 | 
					 | 
				
			||||||
Name=Nombre
 | 
					 | 
				
			||||||
HUD text color=Color del texto de la Interfaz
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# group.lua
 | 
					# group.lua
 | 
				
			||||||
 | 
					 | 
				
			||||||
 and = y
 | 
					 and = y
 | 
				
			||||||
 | 
					Scroll categories left=
 | 
				
			||||||
 | 
					Scroll categories right=
 | 
				
			||||||
 | 
					Search=Buscar
 | 
				
			||||||
 | 
					Reset search and display everything=Limpiar la busqueda y mostrar todo
 | 
				
			||||||
 | 
					# internal.lua
 | 
				
			||||||
 | 
					First page=Primera página
 | 
				
			||||||
 | 
					Back three pages=Volver tres páginas
 | 
				
			||||||
 | 
					Back one page=Volver una página
 | 
				
			||||||
 | 
					Forward one page=Avanzar una página
 | 
				
			||||||
 | 
					Forward three pages=Avanzar tres páginas
 | 
				
			||||||
 | 
					Last page=Ultima Pagina
 | 
				
			||||||
 | 
					No matching items=No se encontraron elementos
 | 
				
			||||||
 | 
					No matches.=No hay resultados.
 | 
				
			||||||
 | 
					Page=Página
 | 
				
			||||||
 | 
					@1 of @2=@1 de @2
 | 
				
			||||||
 | 
					Filter=Filtro
 | 
				
			||||||
# register.lua
 | 
					# register.lua
 | 
				
			||||||
 | 
					 | 
				
			||||||
Can use the creative inventory=Puede usar el inventario creativo
 | 
					Can use the creative inventory=Puede usar el inventario creativo
 | 
				
			||||||
Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Obliga al Inventario Unificado a mostrarse en modo Completo si el modo Simple está configurado globalmente
 | 
					Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Obliga al Inventario Unificado a mostrarse en modo Completo si el modo Simple está configurado globalmente
 | 
				
			||||||
Crafting Grid=Cuadricula de Elaboración
 | 
					Crafting Grid=Cuadricula de Elaboración
 | 
				
			||||||
Crafting Guide=Guía de Elaboración
 | 
					Crafting Guide=Guía de Elaboración
 | 
				
			||||||
Set home position=Establecer posición de la casa
 | 
					Set home position=Establecer posición de la casa
 | 
				
			||||||
Home position set to: @1=Posición de la casa cambiada a: @1
 | 
					Home position set to: @1=Posición de la casa cambiada a: @1
 | 
				
			||||||
You don't have the \"home\" privilege!=¡No tienes el privilegio \"home\"!
 | 
					You don't have the "home" privilege!=
 | 
				
			||||||
Go home=Ir a casa
 | 
					Go home=Ir a casa
 | 
				
			||||||
Set time to day=Cambiar a dia
 | 
					Set time to day=Cambiar a dia
 | 
				
			||||||
Set time to night=Cambiar a noche
 | 
					 | 
				
			||||||
Time of day set to 6am=Hora del día cambiada a 6 AM
 | 
					Time of day set to 6am=Hora del día cambiada a 6 AM
 | 
				
			||||||
Time of day set to 9pm=Hora del día cambiada a 9 PM
 | 
					 | 
				
			||||||
You don't have the settime privilege!=¡No tienes el privilegio "settime"!
 | 
					You don't have the settime privilege!=¡No tienes el privilegio "settime"!
 | 
				
			||||||
 | 
					Set time to night=Cambiar a noche
 | 
				
			||||||
 | 
					Time of day set to 9pm=Hora del día cambiada a 9 PM
 | 
				
			||||||
Clear inventory=Limpiar inventario
 | 
					Clear inventory=Limpiar inventario
 | 
				
			||||||
 | 
					This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
				
			||||||
Inventory cleared!=¡Inventario limpio!
 | 
					Inventory cleared!=¡Inventario limpio!
 | 
				
			||||||
This button has been disabled outside=Este botón ha sido deshabilitado
 | 
					 | 
				
			||||||
Crafting=Elaboración
 | 
					 | 
				
			||||||
Trash:=Basura:
 | 
					Trash:=Basura:
 | 
				
			||||||
Refill:=Rellenar:
 | 
					Refill:=Rellenar:
 | 
				
			||||||
Any item belonging to the @1 group=Cualquier elemento que pertenezca al grupo @1
 | 
					Any item belonging to the @1 group=Cualquier elemento que pertenezca al grupo @1
 | 
				
			||||||
@@ -65,36 +68,41 @@ Show previous recipe=Mostrar la receta anterior
 | 
				
			|||||||
Show previous usage=Mostrar el uso anterior
 | 
					Show previous usage=Mostrar el uso anterior
 | 
				
			||||||
@1 (@2)=@1 (@2)
 | 
					@1 (@2)=@1 (@2)
 | 
				
			||||||
Give me:=Dame:
 | 
					Give me:=Dame:
 | 
				
			||||||
This recipe is too@nlarge to be displayed.=Esta receta es demasiado@ngrande para ser mostrada.
 | 
					This recipe is too@@large to be displayed.=
 | 
				
			||||||
To craft grid:=Construir:
 | 
					To craft grid:=Construir:
 | 
				
			||||||
All=Todos
 | 
					All=Todos
 | 
				
			||||||
 | 
					Crafting=Elaboración
 | 
				
			||||||
 | 
					White=Blanco
 | 
				
			||||||
 | 
					Yellow=Amarillo
 | 
				
			||||||
 | 
					Red=Rojo
 | 
				
			||||||
 | 
					Green=Verde
 | 
				
			||||||
 | 
					Blue=Azul
 | 
				
			||||||
 | 
					Waypoints=Puntos
 | 
				
			||||||
 | 
					Select Waypoint #@1=Seleccionar Punto #@1
 | 
				
			||||||
 | 
					Waypoint @1=Punto @1
 | 
				
			||||||
 | 
					Set waypoint to current location=Establecer el punto a la ubicación actual
 | 
				
			||||||
 | 
					Hide waypoint=
 | 
				
			||||||
 | 
					Show waypoint=
 | 
				
			||||||
 | 
					Hide coordinates=
 | 
				
			||||||
 | 
					Show coordinates=
 | 
				
			||||||
 | 
					Change color of waypoint display=Cambiar el color del punto
 | 
				
			||||||
 | 
					Edit waypoint name=Editar nombre del punto
 | 
				
			||||||
 | 
					Waypoint active=Punto activo
 | 
				
			||||||
 | 
					Waypoint inactive=Punto inactivo
 | 
				
			||||||
 | 
					Finish editing=Terminar edición
 | 
				
			||||||
 | 
					World position=Posición en el mundo
 | 
				
			||||||
 | 
					Name=Nombre
 | 
				
			||||||
 | 
					HUD text color=Color del texto de la Interfaz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# api.lua
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Mixing=Mezclar
 | 
					##### not used anymore #####
 | 
				
			||||||
Cooking=Hornear
 | 
					 | 
				
			||||||
Digging=Recoger
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# internal.lua
 | 
					Make waypoint @1=Hacer punto @1
 | 
				
			||||||
 | 
					invisible=invisible
 | 
				
			||||||
First page=Primera página
 | 
					visible=visible
 | 
				
			||||||
Back three pages=Volver tres páginas
 | 
					@1 display of waypoint coordinates=Visualizar coordenadas del punto @1
 | 
				
			||||||
Back one page=Volver una página
 | 
					Disable=Deshabilitado
 | 
				
			||||||
Forward one page=Avanzar una página
 | 
					Enable=Habilitado
 | 
				
			||||||
Forward three pages=Avanzar tres páginas
 | 
					You don't have the \"home\" privilege!=¡No tienes el privilegio \"home\"!
 | 
				
			||||||
Last page=Ultima Pagina
 | 
					This button has been disabled outside=Este botón ha sido deshabilitado
 | 
				
			||||||
Search=Buscar
 | 
					This recipe is too@nlarge to be displayed.=Esta receta es demasiado@ngrande para ser mostrada.
 | 
				
			||||||
Reset search and display everything=Limpiar la busqueda y mostrar todo
 | 
					 | 
				
			||||||
No matching items=No se encontraron elementos
 | 
					 | 
				
			||||||
No matches.=No hay resultados.
 | 
					 | 
				
			||||||
Page=Página
 | 
					 | 
				
			||||||
@1 of @2=@1 de @2
 | 
					 | 
				
			||||||
Filter=Filtro
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
# bags.lua
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Bags=Bolsos
 | 
					 | 
				
			||||||
Bag @1=Bolso @1
 | 
					 | 
				
			||||||
Small Bag=Bolso Pequeño
 | 
					 | 
				
			||||||
Medium Bag=Bolso Mediano
 | 
					 | 
				
			||||||
Large Bag=Bolso Grande
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,5 @@
 | 
				
			|||||||
# textdomain: unified_inventory
 | 
					# textdomain: unified_inventory
 | 
				
			||||||
Crafting=Création
 | 
					Mixing=
 | 
				
			||||||
Cooking=Cuisson
 | 
					Cooking=Cuisson
 | 
				
			||||||
Digging=Creuser
 | 
					Digging=Creuser
 | 
				
			||||||
Bags=Sacs
 | 
					Bags=Sacs
 | 
				
			||||||
@@ -7,35 +7,66 @@ Bag @1=Sac @1
 | 
				
			|||||||
Small Bag=Petit sac
 | 
					Small Bag=Petit sac
 | 
				
			||||||
Medium Bag=Sac moyen
 | 
					Medium Bag=Sac moyen
 | 
				
			||||||
Large Bag=Grand sac
 | 
					Large Bag=Grand sac
 | 
				
			||||||
 | 
					All Items=
 | 
				
			||||||
 | 
					Misc. Items=
 | 
				
			||||||
 | 
					Plant Life=
 | 
				
			||||||
 | 
					Building Materials=
 | 
				
			||||||
 | 
					Tools=
 | 
				
			||||||
 | 
					Minerals and Metals=
 | 
				
			||||||
 | 
					Environment and Worldgen=
 | 
				
			||||||
 | 
					Lighting=
 | 
				
			||||||
 and = et 
 | 
					 and = et 
 | 
				
			||||||
 | 
					Scroll categories left=
 | 
				
			||||||
 | 
					Scroll categories right=
 | 
				
			||||||
 | 
					Search=Rechercher
 | 
				
			||||||
 | 
					Reset search and display everything=
 | 
				
			||||||
First page=1ère page
 | 
					First page=1ère page
 | 
				
			||||||
Back three pages=3 pages en arrière
 | 
					Back three pages=3 pages en arrière
 | 
				
			||||||
Back one page=Page précédente
 | 
					Back one page=Page précédente
 | 
				
			||||||
Forward one page=Page suivante
 | 
					Forward one page=Page suivante
 | 
				
			||||||
Forward three pages=3 pages en avant
 | 
					Forward three pages=3 pages en avant
 | 
				
			||||||
Last page=Dernière page
 | 
					Last page=Dernière page
 | 
				
			||||||
Search=Rechercher
 | 
					 | 
				
			||||||
No matching items=Aucun élément correspondant
 | 
					No matching items=Aucun élément correspondant
 | 
				
			||||||
No matches.=Aucun match
 | 
					No matches.=Aucun match
 | 
				
			||||||
Page=Page
 | 
					Page=Page
 | 
				
			||||||
@1 of @2=@1 de @2
 | 
					@1 of @2=@1 de @2
 | 
				
			||||||
Filter=Filtre
 | 
					Filter=Filtre
 | 
				
			||||||
Can use the creative inventory=Vous pouvez utiliser l'inventaire créatif
 | 
					Can use the creative inventory=Vous pouvez utiliser l'inventaire créatif
 | 
				
			||||||
 | 
					Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=
 | 
				
			||||||
Crafting Grid=Grille de création
 | 
					Crafting Grid=Grille de création
 | 
				
			||||||
Crafting Guide=Guide de création
 | 
					Crafting Guide=Guide de création
 | 
				
			||||||
Set home position=Position dans le monde
 | 
					Set home position=Position dans le monde
 | 
				
			||||||
Home position set to: @1=Position de votre base fixée à: @1
 | 
					Home position set to: @1=Position de votre base fixée à: @1
 | 
				
			||||||
You don't have the "home" privilege!=Vous n'avez pas le privilège "home"!
 | 
					You don't have the "home" privilege!=Vous n'avez pas le privilège "home"!
 | 
				
			||||||
 | 
					Go home=
 | 
				
			||||||
 | 
					Set time to day=
 | 
				
			||||||
Time of day set to 6am=Heure fixée à 6h
 | 
					Time of day set to 6am=Heure fixée à 6h
 | 
				
			||||||
You don't have the settime privilege!=Vous n'avez pas le privilège "settime"!
 | 
					You don't have the settime privilege!=Vous n'avez pas le privilège "settime"!
 | 
				
			||||||
 | 
					Set time to night=
 | 
				
			||||||
Time of day set to 9pm=Heure fixée à 21h
 | 
					Time of day set to 9pm=Heure fixée à 21h
 | 
				
			||||||
 | 
					Clear inventory=
 | 
				
			||||||
 | 
					This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
				
			||||||
Inventory cleared!=Inventaire vidé !
 | 
					Inventory cleared!=Inventaire vidé !
 | 
				
			||||||
Trash:=Poubelle :
 | 
					Trash:=Poubelle :
 | 
				
			||||||
Refill:=Remplir :
 | 
					Refill:=Remplir :
 | 
				
			||||||
 | 
					Any item belonging to the @1 group=
 | 
				
			||||||
 | 
					Any item belonging to the groups @1=
 | 
				
			||||||
Recipe @1 of @2=Recette @1 de @2
 | 
					Recipe @1 of @2=Recette @1 de @2
 | 
				
			||||||
 | 
					Usage @1 of @2=
 | 
				
			||||||
 | 
					No recipes=
 | 
				
			||||||
 | 
					No usages=
 | 
				
			||||||
Result=Résultat
 | 
					Result=Résultat
 | 
				
			||||||
 | 
					Ingredient=
 | 
				
			||||||
 | 
					Show next recipe=
 | 
				
			||||||
 | 
					Show next usage=
 | 
				
			||||||
 | 
					Show previous recipe=
 | 
				
			||||||
 | 
					Show previous usage=
 | 
				
			||||||
 | 
					@1 (@2)=
 | 
				
			||||||
 | 
					Give me:=
 | 
				
			||||||
 | 
					This recipe is too@@large to be displayed.=
 | 
				
			||||||
To craft grid:=Sur de création:
 | 
					To craft grid:=Sur de création:
 | 
				
			||||||
All=Tout
 | 
					All=Tout
 | 
				
			||||||
 | 
					Crafting=Création
 | 
				
			||||||
White=Blanc
 | 
					White=Blanc
 | 
				
			||||||
Yellow=Jaune
 | 
					Yellow=Jaune
 | 
				
			||||||
Red=Rouge
 | 
					Red=Rouge
 | 
				
			||||||
@@ -45,8 +76,10 @@ Waypoints=Point de passage
 | 
				
			|||||||
Select Waypoint #@1=Choisir un point de passage #@1
 | 
					Select Waypoint #@1=Choisir un point de passage #@1
 | 
				
			||||||
Waypoint @1=Point de passage @1
 | 
					Waypoint @1=Point de passage @1
 | 
				
			||||||
Set waypoint to current location=Marquer un point de passage à la position actuelle
 | 
					Set waypoint to current location=Marquer un point de passage à la position actuelle
 | 
				
			||||||
Make waypoint @1=Rendre @1 le point de passage
 | 
					Hide waypoint=
 | 
				
			||||||
@1 display of waypoint coordinates=@1 montrer les coordonnées des points de passages
 | 
					Show waypoint=
 | 
				
			||||||
 | 
					Hide coordinates=
 | 
				
			||||||
 | 
					Show coordinates=
 | 
				
			||||||
Change color of waypoint display=Changer la couleur du point de passage
 | 
					Change color of waypoint display=Changer la couleur du point de passage
 | 
				
			||||||
Edit waypoint name=Editer le nom du point de passage
 | 
					Edit waypoint name=Editer le nom du point de passage
 | 
				
			||||||
Waypoint active=Point de passage actif
 | 
					Waypoint active=Point de passage actif
 | 
				
			||||||
@@ -55,3 +88,9 @@ Finish editing=Terminer l'édition
 | 
				
			|||||||
World position=Position dans le monde
 | 
					World position=Position dans le monde
 | 
				
			||||||
Name=Nom
 | 
					Name=Nom
 | 
				
			||||||
HUD text color=Couleur de texte du HUD
 | 
					HUD text color=Couleur de texte du HUD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### not used anymore #####
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Make waypoint @1=Rendre @1 le point de passage
 | 
				
			||||||
 | 
					@1 display of waypoint coordinates=@1 montrer les coordonnées des points de passages
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
# textdomain: unified_inventory
 | 
					# textdomain: unified_inventory
 | 
				
			||||||
Crafting=Assemblaggio
 | 
					 | 
				
			||||||
Mixing=Unione
 | 
					Mixing=Unione
 | 
				
			||||||
Cooking=Cottura
 | 
					Cooking=Cottura
 | 
				
			||||||
Digging=Scavo
 | 
					Digging=Scavo
 | 
				
			||||||
@@ -8,21 +7,32 @@ Bag @1=Borsa @1
 | 
				
			|||||||
Small Bag=Borsa piccola
 | 
					Small Bag=Borsa piccola
 | 
				
			||||||
Medium Bag=Borsa media
 | 
					Medium Bag=Borsa media
 | 
				
			||||||
Large Bag=Borsa grande
 | 
					Large Bag=Borsa grande
 | 
				
			||||||
 | 
					All Items=
 | 
				
			||||||
 | 
					Misc. Items=
 | 
				
			||||||
 | 
					Plant Life=
 | 
				
			||||||
 | 
					Building Materials=
 | 
				
			||||||
 | 
					Tools=
 | 
				
			||||||
 | 
					Minerals and Metals=
 | 
				
			||||||
 | 
					Environment and Worldgen=
 | 
				
			||||||
 | 
					Lighting=
 | 
				
			||||||
 and = e 
 | 
					 and = e 
 | 
				
			||||||
 | 
					Scroll categories left=
 | 
				
			||||||
 | 
					Scroll categories right=
 | 
				
			||||||
 | 
					Search=Cerca
 | 
				
			||||||
 | 
					Reset search and display everything=Azzera la ricerca e mostra tutto
 | 
				
			||||||
First page=Prima pagina
 | 
					First page=Prima pagina
 | 
				
			||||||
Back three pages=Indietro di tre pagine
 | 
					Back three pages=Indietro di tre pagine
 | 
				
			||||||
Back one page=Indietro di una pagina
 | 
					Back one page=Indietro di una pagina
 | 
				
			||||||
Forward one page=Avanti di una pagina
 | 
					Forward one page=Avanti di una pagina
 | 
				
			||||||
Forward three pages=Avanti di tre pagine
 | 
					Forward three pages=Avanti di tre pagine
 | 
				
			||||||
Last page=Ultima pagina
 | 
					Last page=Ultima pagina
 | 
				
			||||||
Search=Cerca
 | 
					 | 
				
			||||||
Reset search and display everything=Azzera la ricerca e mostra tutto
 | 
					 | 
				
			||||||
No matching items=Nessun oggetto corrispondente
 | 
					No matching items=Nessun oggetto corrispondente
 | 
				
			||||||
No matches.=Nessuna corrispondenza.
 | 
					No matches.=Nessuna corrispondenza.
 | 
				
			||||||
Page=Pagina
 | 
					Page=Pagina
 | 
				
			||||||
@1 of @2=@1 di @2
 | 
					@1 of @2=@1 di @2
 | 
				
			||||||
Filter=Filtro
 | 
					Filter=Filtro
 | 
				
			||||||
Can use the creative inventory=Può usare l'inventario creativo
 | 
					Can use the creative inventory=Può usare l'inventario creativo
 | 
				
			||||||
 | 
					Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Forza la visualizzazione di Unified Inventory in modalità completa se è configurata globalmente la visualizzazione semplice
 | 
				
			||||||
Crafting Grid=Griglia di assemblaggio
 | 
					Crafting Grid=Griglia di assemblaggio
 | 
				
			||||||
Crafting Guide=Guida di assemblaggio
 | 
					Crafting Guide=Guida di assemblaggio
 | 
				
			||||||
Set home position=Imposta la residenza
 | 
					Set home position=Imposta la residenza
 | 
				
			||||||
@@ -35,6 +45,7 @@ You don't have the settime privilege!=Non hai il privilegio "time"!
 | 
				
			|||||||
Set time to night=Imposta l'orario sulla notte
 | 
					Set time to night=Imposta l'orario sulla notte
 | 
				
			||||||
Time of day set to 9pm=Orario impostato sulle 9am
 | 
					Time of day set to 9pm=Orario impostato sulle 9am
 | 
				
			||||||
Clear inventory=Ripulisci l'inventario
 | 
					Clear inventory=Ripulisci l'inventario
 | 
				
			||||||
 | 
					This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
				
			||||||
Inventory cleared!=Inventario ripulito!
 | 
					Inventory cleared!=Inventario ripulito!
 | 
				
			||||||
Trash:=Butta:
 | 
					Trash:=Butta:
 | 
				
			||||||
Refill:=Riempi:
 | 
					Refill:=Riempi:
 | 
				
			||||||
@@ -50,9 +61,12 @@ Show next recipe=Mostra la prossima ricetta
 | 
				
			|||||||
Show next usage=Mostra il prossimo utilizzo
 | 
					Show next usage=Mostra il prossimo utilizzo
 | 
				
			||||||
Show previous recipe=Mostra la ricetta precedente
 | 
					Show previous recipe=Mostra la ricetta precedente
 | 
				
			||||||
Show previous usage=Mostra l'utilizzo precedente
 | 
					Show previous usage=Mostra l'utilizzo precedente
 | 
				
			||||||
 | 
					@1 (@2)=
 | 
				
			||||||
Give me:=Dammi:
 | 
					Give me:=Dammi:
 | 
				
			||||||
 | 
					This recipe is too@@large to be displayed.=
 | 
				
			||||||
To craft grid:=Alla griglia di assemblaggio:
 | 
					To craft grid:=Alla griglia di assemblaggio:
 | 
				
			||||||
All=Tutto
 | 
					All=Tutto
 | 
				
			||||||
 | 
					Crafting=Assemblaggio
 | 
				
			||||||
White=Bianco
 | 
					White=Bianco
 | 
				
			||||||
Yellow=Giallo
 | 
					Yellow=Giallo
 | 
				
			||||||
Red=Rosso
 | 
					Red=Rosso
 | 
				
			||||||
@@ -62,12 +76,10 @@ Waypoints=Tappe
 | 
				
			|||||||
Select Waypoint #@1=Seleziona tappa n°@1
 | 
					Select Waypoint #@1=Seleziona tappa n°@1
 | 
				
			||||||
Waypoint @1=Tappa @1
 | 
					Waypoint @1=Tappa @1
 | 
				
			||||||
Set waypoint to current location=Imposta tappa alla posizione attuale
 | 
					Set waypoint to current location=Imposta tappa alla posizione attuale
 | 
				
			||||||
invisible=invisibile
 | 
					Hide waypoint=
 | 
				
			||||||
visible=visibile
 | 
					Show waypoint=
 | 
				
			||||||
Make waypoint @1=Crea tappa @1
 | 
					Hide coordinates=
 | 
				
			||||||
Disable=Disabilita
 | 
					Show coordinates=
 | 
				
			||||||
Enable=Abilita
 | 
					 | 
				
			||||||
@1 display of waypoint coordinates=@1 la visualizzazione delle coordinate della tappa
 | 
					 | 
				
			||||||
Change color of waypoint display=Modifica il colore della visualizzazione della tappa
 | 
					Change color of waypoint display=Modifica il colore della visualizzazione della tappa
 | 
				
			||||||
Edit waypoint name=Modifica il nome della tappa
 | 
					Edit waypoint name=Modifica il nome della tappa
 | 
				
			||||||
Waypoint active=Tappa attiva
 | 
					Waypoint active=Tappa attiva
 | 
				
			||||||
@@ -76,4 +88,13 @@ Finish editing=Termina la modifica
 | 
				
			|||||||
World position=Posizione del mondo
 | 
					World position=Posizione del mondo
 | 
				
			||||||
Name=Nome
 | 
					Name=Nome
 | 
				
			||||||
HUD text color=Colore del testo del visore
 | 
					HUD text color=Colore del testo del visore
 | 
				
			||||||
Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=Forza la visualizzazione di Unified Inventory in modalità completa se è configurata globalmente la visualizzazione semplice
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### not used anymore #####
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					invisible=invisibile
 | 
				
			||||||
 | 
					visible=visibile
 | 
				
			||||||
 | 
					Make waypoint @1=Crea tappa @1
 | 
				
			||||||
 | 
					Disable=Disabilita
 | 
				
			||||||
 | 
					Enable=Abilita
 | 
				
			||||||
 | 
					@1 display of waypoint coordinates=@1 la visualizzazione delle coordinate della tappa
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
# textdomain: unified_inventory
 | 
					# textdomain: unified_inventory
 | 
				
			||||||
Crafting=Pertukangan
 | 
					 | 
				
			||||||
Mixing=Pencampuran
 | 
					Mixing=Pencampuran
 | 
				
			||||||
Cooking=Pemasakan
 | 
					Cooking=Pemasakan
 | 
				
			||||||
Digging=Penggalian
 | 
					Digging=Penggalian
 | 
				
			||||||
@@ -8,21 +7,32 @@ Bag @1=Beg @1
 | 
				
			|||||||
Small Bag=Beg Kecil
 | 
					Small Bag=Beg Kecil
 | 
				
			||||||
Medium Bag=Beg Sederhana
 | 
					Medium Bag=Beg Sederhana
 | 
				
			||||||
Large Bag=Beg Besar
 | 
					Large Bag=Beg Besar
 | 
				
			||||||
 | 
					All Items=
 | 
				
			||||||
 | 
					Misc. Items=
 | 
				
			||||||
 | 
					Plant Life=
 | 
				
			||||||
 | 
					Building Materials=
 | 
				
			||||||
 | 
					Tools=
 | 
				
			||||||
 | 
					Minerals and Metals=
 | 
				
			||||||
 | 
					Environment and Worldgen=
 | 
				
			||||||
 | 
					Lighting=
 | 
				
			||||||
 and = dan 
 | 
					 and = dan 
 | 
				
			||||||
 | 
					Scroll categories left=
 | 
				
			||||||
 | 
					Scroll categories right=
 | 
				
			||||||
 | 
					Search=Cari
 | 
				
			||||||
 | 
					Reset search and display everything=Set semula carian dan tunjukkan semua benda
 | 
				
			||||||
First page=Halaman pertama
 | 
					First page=Halaman pertama
 | 
				
			||||||
Back three pages=Tiga halaman sebelumnya
 | 
					Back three pages=Tiga halaman sebelumnya
 | 
				
			||||||
Back one page=Halaman sebelumnya
 | 
					Back one page=Halaman sebelumnya
 | 
				
			||||||
Forward one page=Halaman seterusnya
 | 
					Forward one page=Halaman seterusnya
 | 
				
			||||||
Forward three pages=Tiga halaman seterusnya
 | 
					Forward three pages=Tiga halaman seterusnya
 | 
				
			||||||
Last page=Halaman terakhir
 | 
					Last page=Halaman terakhir
 | 
				
			||||||
Search=Cari
 | 
					 | 
				
			||||||
Reset search and display everything=Set semula carian dan tunjukkan semua benda
 | 
					 | 
				
			||||||
No matching items=Tiada item sepadan
 | 
					No matching items=Tiada item sepadan
 | 
				
			||||||
No matches.=Tiada padanan.
 | 
					No matches.=Tiada padanan.
 | 
				
			||||||
Page=Halaman
 | 
					Page=Halaman
 | 
				
			||||||
@1 of @2=@1 drpd @2
 | 
					@1 of @2=@1 drpd @2
 | 
				
			||||||
Filter=Tapis
 | 
					Filter=Tapis
 | 
				
			||||||
Can use the creative inventory=Boleh guna inventori kreatif
 | 
					Can use the creative inventory=Boleh guna inventori kreatif
 | 
				
			||||||
 | 
					Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=
 | 
				
			||||||
Crafting Grid=Grid Pertukangan
 | 
					Crafting Grid=Grid Pertukangan
 | 
				
			||||||
Crafting Guide=Panduan Pertukangan
 | 
					Crafting Guide=Panduan Pertukangan
 | 
				
			||||||
Set home position=Tetapkan kedudukan rumah
 | 
					Set home position=Tetapkan kedudukan rumah
 | 
				
			||||||
@@ -35,6 +45,7 @@ You don't have the settime privilege!=Anda tidak ada keistimewaan settime!
 | 
				
			|||||||
Set time to night=Tetapkan masa jadi malam
 | 
					Set time to night=Tetapkan masa jadi malam
 | 
				
			||||||
Time of day set to 9pm=Masa ditetapkan ke 9 malam
 | 
					Time of day set to 9pm=Masa ditetapkan ke 9 malam
 | 
				
			||||||
Clear inventory=Kosongkan inventori
 | 
					Clear inventory=Kosongkan inventori
 | 
				
			||||||
 | 
					This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
				
			||||||
Inventory cleared!=Inventori dikosongkan!
 | 
					Inventory cleared!=Inventori dikosongkan!
 | 
				
			||||||
Trash:=Buang:
 | 
					Trash:=Buang:
 | 
				
			||||||
Refill:=Isi balik:
 | 
					Refill:=Isi balik:
 | 
				
			||||||
@@ -52,7 +63,10 @@ Show previous recipe=Tunjuk resipi sebelumnya
 | 
				
			|||||||
Show previous usage=Tunjuk kegunaan sebelumnya
 | 
					Show previous usage=Tunjuk kegunaan sebelumnya
 | 
				
			||||||
@1 (@2)=@1 (@2)
 | 
					@1 (@2)=@1 (@2)
 | 
				
			||||||
Give me:=Beri saya:
 | 
					Give me:=Beri saya:
 | 
				
			||||||
 | 
					This recipe is too@@large to be displayed.=
 | 
				
			||||||
To craft grid:=Ke grid pertukangan:
 | 
					To craft grid:=Ke grid pertukangan:
 | 
				
			||||||
 | 
					All=
 | 
				
			||||||
 | 
					Crafting=Pertukangan
 | 
				
			||||||
White=Putih
 | 
					White=Putih
 | 
				
			||||||
Yellow=Kuning
 | 
					Yellow=Kuning
 | 
				
			||||||
Red=Merah
 | 
					Red=Merah
 | 
				
			||||||
@@ -62,12 +76,10 @@ Waypoints=Titik Arah
 | 
				
			|||||||
Select Waypoint #@1=Pilih Titik Arah #@1
 | 
					Select Waypoint #@1=Pilih Titik Arah #@1
 | 
				
			||||||
Waypoint @1=Titik Arah @1
 | 
					Waypoint @1=Titik Arah @1
 | 
				
			||||||
Set waypoint to current location=Tetapkan titik arah ke lokasi semasa
 | 
					Set waypoint to current location=Tetapkan titik arah ke lokasi semasa
 | 
				
			||||||
invisible=Sembunyikan
 | 
					Hide waypoint=
 | 
				
			||||||
visible=Paparkan
 | 
					Show waypoint=
 | 
				
			||||||
Make waypoint @1=@1 titik arah
 | 
					Hide coordinates=
 | 
				
			||||||
Disable=Sembunyikan
 | 
					Show coordinates=
 | 
				
			||||||
Enable=Paparkan
 | 
					 | 
				
			||||||
@1 display of waypoint coordinates=@1 koordinat untuk titik arah
 | 
					 | 
				
			||||||
Change color of waypoint display=Tukar warna paparan titik arah
 | 
					Change color of waypoint display=Tukar warna paparan titik arah
 | 
				
			||||||
Edit waypoint name=Edit nama titik arah
 | 
					Edit waypoint name=Edit nama titik arah
 | 
				
			||||||
Waypoint active=Titik arah aktif
 | 
					Waypoint active=Titik arah aktif
 | 
				
			||||||
@@ -76,3 +88,13 @@ Finish editing=Selesai edit
 | 
				
			|||||||
World position=Kedudukan dunia
 | 
					World position=Kedudukan dunia
 | 
				
			||||||
Name=Nama
 | 
					Name=Nama
 | 
				
			||||||
HUD text color=Warna tulisan HUD
 | 
					HUD text color=Warna tulisan HUD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### not used anymore #####
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					invisible=Sembunyikan
 | 
				
			||||||
 | 
					visible=Paparkan
 | 
				
			||||||
 | 
					Make waypoint @1=@1 titik arah
 | 
				
			||||||
 | 
					Disable=Sembunyikan
 | 
				
			||||||
 | 
					Enable=Paparkan
 | 
				
			||||||
 | 
					@1 display of waypoint coordinates=@1 koordinat untuk titik arah
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,22 +1,40 @@
 | 
				
			|||||||
# textdomain: unified_inventory
 | 
					# textdomain: unified_inventory
 | 
				
			||||||
 | 
					Mixing=
 | 
				
			||||||
 | 
					Cooking=
 | 
				
			||||||
 | 
					Digging=
 | 
				
			||||||
Bags=Plecaki
 | 
					Bags=Plecaki
 | 
				
			||||||
Bag @1=Plecak @1
 | 
					Bag @1=Plecak @1
 | 
				
			||||||
Small Bag=Maly plecak
 | 
					Small Bag=Maly plecak
 | 
				
			||||||
Medium Bag=Sredni plecak
 | 
					Medium Bag=Sredni plecak
 | 
				
			||||||
Large Bag=Duzy plecak
 | 
					Large Bag=Duzy plecak
 | 
				
			||||||
 | 
					All Items=
 | 
				
			||||||
 | 
					Misc. Items=
 | 
				
			||||||
 | 
					Plant Life=
 | 
				
			||||||
 | 
					Building Materials=
 | 
				
			||||||
 | 
					Tools=
 | 
				
			||||||
 | 
					Minerals and Metals=
 | 
				
			||||||
 | 
					Environment and Worldgen=
 | 
				
			||||||
 | 
					Lighting=
 | 
				
			||||||
 and = i 
 | 
					 and = i 
 | 
				
			||||||
 | 
					Scroll categories left=
 | 
				
			||||||
 | 
					Scroll categories right=
 | 
				
			||||||
 | 
					Search=Szukaj
 | 
				
			||||||
 | 
					Reset search and display everything=
 | 
				
			||||||
First page=Pierwsza strona
 | 
					First page=Pierwsza strona
 | 
				
			||||||
Back three pages=3 strony w tyl
 | 
					Back three pages=3 strony w tyl
 | 
				
			||||||
Back one page=1 strona w tyl
 | 
					Back one page=1 strona w tyl
 | 
				
			||||||
Forward one page=1 strona do przodu
 | 
					Forward one page=1 strona do przodu
 | 
				
			||||||
Forward three pages=3 strony do przodu
 | 
					Forward three pages=3 strony do przodu
 | 
				
			||||||
Last page=Ostatnia strona
 | 
					Last page=Ostatnia strona
 | 
				
			||||||
Search=Szukaj
 | 
					 | 
				
			||||||
No matching items=Brak pasujacych przedmiotow
 | 
					No matching items=Brak pasujacych przedmiotow
 | 
				
			||||||
No matches.=Brak wyników
 | 
					No matches.=Brak wyników
 | 
				
			||||||
Page=Strona
 | 
					Page=Strona
 | 
				
			||||||
@1 of @2=@1 z @2
 | 
					@1 of @2=@1 z @2
 | 
				
			||||||
Filter=Filtr
 | 
					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ą
 | 
					Set home position=Ustaw pozycję wyjściową
 | 
				
			||||||
Home position set to: @1=Pozycja domowa ustawiona na: @1
 | 
					Home position set to: @1=Pozycja domowa ustawiona na: @1
 | 
				
			||||||
You don't have the "home" privilege!=Nie masz uprawnien do zmiany czasu "home"!
 | 
					You don't have the "home" privilege!=Nie masz uprawnien do zmiany czasu "home"!
 | 
				
			||||||
@@ -27,17 +45,28 @@ You don't have the settime privilege!=Nie masz uprawnien do zmiany czasu "settim
 | 
				
			|||||||
Set time to night=Ustaw czas na noc
 | 
					Set time to night=Ustaw czas na noc
 | 
				
			||||||
Time of day set to 9pm=Czas ustawiony na 21:00
 | 
					Time of day set to 9pm=Czas ustawiony na 21:00
 | 
				
			||||||
Clear inventory=Wyczyść zapasy
 | 
					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!
 | 
					Inventory cleared!=Zapasy zostały wyczyszczone!
 | 
				
			||||||
Trash:=Smietnik:
 | 
					Trash:=Smietnik:
 | 
				
			||||||
Refill:=Uzupelnianie:
 | 
					Refill:=Uzupelnianie:
 | 
				
			||||||
 | 
					Any item belonging to the @1 group=
 | 
				
			||||||
 | 
					Any item belonging to the groups @1=
 | 
				
			||||||
Recipe @1 of @2=Recepta @1 z @2
 | 
					Recipe @1 of @2=Recepta @1 z @2
 | 
				
			||||||
Usage @1 of @2=Użycie @1 z @2
 | 
					Usage @1 of @2=Użycie @1 z @2
 | 
				
			||||||
No recipes=Brak recepty
 | 
					No recipes=Brak recepty
 | 
				
			||||||
No usages=Bez użycia
 | 
					No usages=Bez użycia
 | 
				
			||||||
Result=Wynik
 | 
					Result=Wynik
 | 
				
			||||||
Ingredient=Składnik
 | 
					Ingredient=Składnik
 | 
				
			||||||
 | 
					Show next recipe=
 | 
				
			||||||
 | 
					Show next usage=
 | 
				
			||||||
 | 
					Show previous recipe=
 | 
				
			||||||
 | 
					Show previous usage=
 | 
				
			||||||
 | 
					@1 (@2)=
 | 
				
			||||||
Give me:=Daj mi:
 | 
					Give me:=Daj mi:
 | 
				
			||||||
 | 
					This recipe is too@@large to be displayed.=
 | 
				
			||||||
 | 
					To craft grid:=
 | 
				
			||||||
All=Wszystko
 | 
					All=Wszystko
 | 
				
			||||||
 | 
					Crafting=
 | 
				
			||||||
White=Bialy
 | 
					White=Bialy
 | 
				
			||||||
Yellow=Zolty
 | 
					Yellow=Zolty
 | 
				
			||||||
Red=Czerwony
 | 
					Red=Czerwony
 | 
				
			||||||
@@ -47,10 +76,10 @@ Waypoints=Punkty orientacyjne
 | 
				
			|||||||
Select Waypoint #@1=Wybierz punkt #@1
 | 
					Select Waypoint #@1=Wybierz punkt #@1
 | 
				
			||||||
Waypoint @1=Punkty orientacyjne @1
 | 
					Waypoint @1=Punkty orientacyjne @1
 | 
				
			||||||
Set waypoint to current location=Ustaw punkt orientacyjny na biezacej pozycji
 | 
					Set waypoint to current location=Ustaw punkt orientacyjny na biezacej pozycji
 | 
				
			||||||
invisible=niewidzialny
 | 
					Hide waypoint=
 | 
				
			||||||
visible=widomy
 | 
					Show waypoint=
 | 
				
			||||||
Make waypoint @1=Robić punkt @1
 | 
					Hide coordinates=
 | 
				
			||||||
@1 display of waypoint coordinates=@1 koordynatow punktu
 | 
					Show coordinates=
 | 
				
			||||||
Change color of waypoint display=Zmien kolor punktu
 | 
					Change color of waypoint display=Zmien kolor punktu
 | 
				
			||||||
Edit waypoint name=Edytuj nazwe punktu
 | 
					Edit waypoint name=Edytuj nazwe punktu
 | 
				
			||||||
Waypoint active=Punkt wlaczony
 | 
					Waypoint active=Punkt wlaczony
 | 
				
			||||||
@@ -59,3 +88,11 @@ Finish editing=Zakoncz edycje
 | 
				
			|||||||
World position=Pozycja
 | 
					World position=Pozycja
 | 
				
			||||||
Name=Nazwa
 | 
					Name=Nazwa
 | 
				
			||||||
HUD text color=Kolor tekstu HUD
 | 
					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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
# textdomain: unified_inventory
 | 
					# textdomain: unified_inventory
 | 
				
			||||||
Crafting=Artesanato
 | 
					 | 
				
			||||||
Mixing=Muistura
 | 
					Mixing=Muistura
 | 
				
			||||||
Cooking=Cozimento
 | 
					Cooking=Cozimento
 | 
				
			||||||
Digging=Escavação
 | 
					Digging=Escavação
 | 
				
			||||||
@@ -8,21 +7,32 @@ Bag @1=Bolsa @1
 | 
				
			|||||||
Small Bag=Bolsa Pequena
 | 
					Small Bag=Bolsa Pequena
 | 
				
			||||||
Medium Bag=Bolsa Média
 | 
					Medium Bag=Bolsa Média
 | 
				
			||||||
Large Bag=Bolsa Grande
 | 
					Large Bag=Bolsa Grande
 | 
				
			||||||
 | 
					All Items=
 | 
				
			||||||
 | 
					Misc. Items=
 | 
				
			||||||
 | 
					Plant Life=
 | 
				
			||||||
 | 
					Building Materials=
 | 
				
			||||||
 | 
					Tools=
 | 
				
			||||||
 | 
					Minerals and Metals=
 | 
				
			||||||
 | 
					Environment and Worldgen=
 | 
				
			||||||
 | 
					Lighting=
 | 
				
			||||||
 and = e 
 | 
					 and = e 
 | 
				
			||||||
 | 
					Scroll categories left=
 | 
				
			||||||
 | 
					Scroll categories right=
 | 
				
			||||||
 | 
					Search=Pesquisar
 | 
				
			||||||
 | 
					Reset search and display everything=Redefinir pesquisa e exibir tudo
 | 
				
			||||||
First page=Primeira Página
 | 
					First page=Primeira Página
 | 
				
			||||||
Back three pages=Voltar 3 Páginas
 | 
					Back three pages=Voltar 3 Páginas
 | 
				
			||||||
Back one page=Voltar 1 Página
 | 
					Back one page=Voltar 1 Página
 | 
				
			||||||
Forward one page=Avançar 1 Página
 | 
					Forward one page=Avançar 1 Página
 | 
				
			||||||
Forward three pages=Avançar 3 Páginas
 | 
					Forward three pages=Avançar 3 Páginas
 | 
				
			||||||
Last page=Ultima Página
 | 
					Last page=Ultima Página
 | 
				
			||||||
Search=Pesquisar
 | 
					 | 
				
			||||||
Reset search and display everything=Redefinir pesquisa e exibir tudo
 | 
					 | 
				
			||||||
No matching items=Nenhum item correspondente
 | 
					No matching items=Nenhum item correspondente
 | 
				
			||||||
No matches.=Sem correspondências
 | 
					No matches.=Sem correspondências
 | 
				
			||||||
Page=Página
 | 
					Page=Página
 | 
				
			||||||
@1 of @2=@1 de @2
 | 
					@1 of @2=@1 de @2
 | 
				
			||||||
Filter=Filtro
 | 
					Filter=Filtro
 | 
				
			||||||
Can use the creative inventory=Pode usar o inventário do criativo
 | 
					Can use the creative inventory=Pode usar o inventário do criativo
 | 
				
			||||||
 | 
					Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=
 | 
				
			||||||
Crafting Grid=Grade de Artesanato
 | 
					Crafting Grid=Grade de Artesanato
 | 
				
			||||||
Crafting Guide=Guia de Artesanato
 | 
					Crafting Guide=Guia de Artesanato
 | 
				
			||||||
Set home position=Definir posição de casa
 | 
					Set home position=Definir posição de casa
 | 
				
			||||||
@@ -35,6 +45,7 @@ You don't have the settime privilege!=Você não tem o privilégio de "settime"!
 | 
				
			|||||||
Set time to night=Definir turno para noite
 | 
					Set time to night=Definir turno para noite
 | 
				
			||||||
Time of day set to 9pm=Hora do dia ajustada para 21h
 | 
					Time of day set to 9pm=Hora do dia ajustada para 21h
 | 
				
			||||||
Clear inventory=Limpar Inventário
 | 
					Clear inventory=Limpar Inventário
 | 
				
			||||||
 | 
					This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
				
			||||||
Inventory cleared!=Inventário Apagado!
 | 
					Inventory cleared!=Inventário Apagado!
 | 
				
			||||||
Trash:=Lixo:
 | 
					Trash:=Lixo:
 | 
				
			||||||
Refill:=Recarga:
 | 
					Refill:=Recarga:
 | 
				
			||||||
@@ -50,9 +61,12 @@ Show next recipe=Exibir Próxima Receita
 | 
				
			|||||||
Show next usage=Mostrar Próxima Utilização
 | 
					Show next usage=Mostrar Próxima Utilização
 | 
				
			||||||
Show previous recipe=Exibir Receita Anterior
 | 
					Show previous recipe=Exibir Receita Anterior
 | 
				
			||||||
Show previous usage=Exibir Utilização Anterior
 | 
					Show previous usage=Exibir Utilização Anterior
 | 
				
			||||||
 | 
					@1 (@2)=
 | 
				
			||||||
Give me:=Gerado:
 | 
					Give me:=Gerado:
 | 
				
			||||||
 | 
					This recipe is too@@large to be displayed.=
 | 
				
			||||||
To craft grid:=Para Grade de Artesanato
 | 
					To craft grid:=Para Grade de Artesanato
 | 
				
			||||||
All=MAX
 | 
					All=MAX
 | 
				
			||||||
 | 
					Crafting=Artesanato
 | 
				
			||||||
White=Branco
 | 
					White=Branco
 | 
				
			||||||
Yellow=Amarelo
 | 
					Yellow=Amarelo
 | 
				
			||||||
Red=Vermelho
 | 
					Red=Vermelho
 | 
				
			||||||
@@ -62,10 +76,10 @@ Waypoints=Apontador de Direção
 | 
				
			|||||||
Select Waypoint #@1=Seleção de Apontador de Direção #@1
 | 
					Select Waypoint #@1=Seleção de Apontador de Direção #@1
 | 
				
			||||||
Waypoint @1=Apontador de Direção @1
 | 
					Waypoint @1=Apontador de Direção @1
 | 
				
			||||||
Set waypoint to current location=Configurar localização atual do Apontador de Direção
 | 
					Set waypoint to current location=Configurar localização atual do Apontador de Direção
 | 
				
			||||||
invisible=invisível
 | 
					Hide waypoint=
 | 
				
			||||||
visible=visível
 | 
					Show waypoint=
 | 
				
			||||||
Make waypoint @1=Fazer Apontador de Direção @1
 | 
					Hide coordinates=
 | 
				
			||||||
@1 display of waypoint coordinates=@1 exibição de coordenadas de Fazer Apontador de Direção
 | 
					Show coordinates=
 | 
				
			||||||
Change color of waypoint display=Mudar cor exibida do Apontador de Direção
 | 
					Change color of waypoint display=Mudar cor exibida do Apontador de Direção
 | 
				
			||||||
Edit waypoint name=Editar Nome de Apontador de Direção
 | 
					Edit waypoint name=Editar Nome de Apontador de Direção
 | 
				
			||||||
Waypoint active=Apontador de Direção Ativo
 | 
					Waypoint active=Apontador de Direção Ativo
 | 
				
			||||||
@@ -74,3 +88,11 @@ Finish editing=Edição Finalizada
 | 
				
			|||||||
World position=Posição Mundial
 | 
					World position=Posição Mundial
 | 
				
			||||||
Name=Nome
 | 
					Name=Nome
 | 
				
			||||||
HUD text color=Cor de HUD
 | 
					HUD text color=Cor de HUD
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### not used anymore #####
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					invisible=invisível
 | 
				
			||||||
 | 
					visible=visível
 | 
				
			||||||
 | 
					Make waypoint @1=Fazer Apontador de Direção @1
 | 
				
			||||||
 | 
					@1 display of waypoint coordinates=@1 exibição de coordenadas de Fazer Apontador de Direção
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
# textdomain: unified_inventory
 | 
					# textdomain: unified_inventory
 | 
				
			||||||
Crafting=Крафт
 | 
					 | 
				
			||||||
Mixing=Мешать
 | 
					Mixing=Мешать
 | 
				
			||||||
Cooking=Варить
 | 
					Cooking=Варить
 | 
				
			||||||
Digging=Копать
 | 
					Digging=Копать
 | 
				
			||||||
@@ -8,21 +7,32 @@ Bag @1=Сумка @1
 | 
				
			|||||||
Small Bag=Малая сумка
 | 
					Small Bag=Малая сумка
 | 
				
			||||||
Medium Bag=Средняя сумка
 | 
					Medium Bag=Средняя сумка
 | 
				
			||||||
Large Bag=Большая сумка
 | 
					Large Bag=Большая сумка
 | 
				
			||||||
 | 
					All Items=
 | 
				
			||||||
 | 
					Misc. Items=
 | 
				
			||||||
 | 
					Plant Life=
 | 
				
			||||||
 | 
					Building Materials=
 | 
				
			||||||
 | 
					Tools=
 | 
				
			||||||
 | 
					Minerals and Metals=
 | 
				
			||||||
 | 
					Environment and Worldgen=
 | 
				
			||||||
 | 
					Lighting=
 | 
				
			||||||
 and = и 
 | 
					 and = и 
 | 
				
			||||||
 | 
					Scroll categories left=
 | 
				
			||||||
 | 
					Scroll categories right=
 | 
				
			||||||
 | 
					Search=Поиск
 | 
				
			||||||
 | 
					Reset search and display everything=Сброс поиска, показать всё
 | 
				
			||||||
First page=Первая страница
 | 
					First page=Первая страница
 | 
				
			||||||
Back three pages=3 страницы назад
 | 
					Back three pages=3 страницы назад
 | 
				
			||||||
Back one page=1 страницу назад
 | 
					Back one page=1 страницу назад
 | 
				
			||||||
Forward one page=1 страницу вперёд
 | 
					Forward one page=1 страницу вперёд
 | 
				
			||||||
Forward three pages=3 страницы вперёд
 | 
					Forward three pages=3 страницы вперёд
 | 
				
			||||||
Last page=Последняя страница
 | 
					Last page=Последняя страница
 | 
				
			||||||
Search=Поиск
 | 
					 | 
				
			||||||
Reset search and display everything=Сброс поиска, показать всё
 | 
					 | 
				
			||||||
No matching items=Нет подходящих элементов
 | 
					No matching items=Нет подходящих элементов
 | 
				
			||||||
No matches.=Ничего не найдено
 | 
					No matches.=Ничего не найдено
 | 
				
			||||||
Page=Страница
 | 
					Page=Страница
 | 
				
			||||||
@1 of @2=@1 из @2
 | 
					@1 of @2=@1 из @2
 | 
				
			||||||
Filter=Фильтр
 | 
					Filter=Фильтр
 | 
				
			||||||
Can use the creative inventory=Можно использовать инвентарь творческого режима
 | 
					Can use the creative inventory=Можно использовать инвентарь творческого режима
 | 
				
			||||||
 | 
					Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=
 | 
				
			||||||
Crafting Grid=Решетка крафта
 | 
					Crafting Grid=Решетка крафта
 | 
				
			||||||
Crafting Guide=Книга рецептов
 | 
					Crafting Guide=Книга рецептов
 | 
				
			||||||
Set home position=Установить позицию дома
 | 
					Set home position=Установить позицию дома
 | 
				
			||||||
@@ -35,6 +45,7 @@ You don't have the settime privilege!=Вам не разрешено устан
 | 
				
			|||||||
Set time to night=Ночь
 | 
					Set time to night=Ночь
 | 
				
			||||||
Time of day set to 9pm=Установлено время 9 вечера
 | 
					Time of day set to 9pm=Установлено время 9 вечера
 | 
				
			||||||
Clear inventory=Очистить инвентарь
 | 
					Clear inventory=Очистить инвентарь
 | 
				
			||||||
 | 
					This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
				
			||||||
Inventory cleared!=Инвентарь очищен!
 | 
					Inventory cleared!=Инвентарь очищен!
 | 
				
			||||||
Trash:=Мусор:
 | 
					Trash:=Мусор:
 | 
				
			||||||
Refill:=Наполнить:
 | 
					Refill:=Наполнить:
 | 
				
			||||||
@@ -50,9 +61,12 @@ Show next recipe=Следующий рецепт
 | 
				
			|||||||
Show next usage=Следующее использование
 | 
					Show next usage=Следующее использование
 | 
				
			||||||
Show previous recipe=Прошлый рецепт
 | 
					Show previous recipe=Прошлый рецепт
 | 
				
			||||||
Show previous usage=Прошлая страница
 | 
					Show previous usage=Прошлая страница
 | 
				
			||||||
 | 
					@1 (@2)=
 | 
				
			||||||
Give me:=Дай мне:
 | 
					Give me:=Дай мне:
 | 
				
			||||||
 | 
					This recipe is too@@large to be displayed.=
 | 
				
			||||||
To craft grid:=На решeтку крафта:
 | 
					To craft grid:=На решeтку крафта:
 | 
				
			||||||
All=Все
 | 
					All=Все
 | 
				
			||||||
 | 
					Crafting=Крафт
 | 
				
			||||||
White=Белый
 | 
					White=Белый
 | 
				
			||||||
Yellow=Желтый
 | 
					Yellow=Желтый
 | 
				
			||||||
Red=Красный
 | 
					Red=Красный
 | 
				
			||||||
@@ -62,12 +76,10 @@ Waypoints=Путевые точки
 | 
				
			|||||||
Select Waypoint #@1=Выбрать путевую точку №@1
 | 
					Select Waypoint #@1=Выбрать путевую точку №@1
 | 
				
			||||||
Waypoint @1=Путевая точка @1
 | 
					Waypoint @1=Путевая точка @1
 | 
				
			||||||
Set waypoint to current location=Установить путевую точку по текущей позиции
 | 
					Set waypoint to current location=Установить путевую точку по текущей позиции
 | 
				
			||||||
invisible=невидимой
 | 
					Hide waypoint=
 | 
				
			||||||
visible=видимой
 | 
					Show waypoint=
 | 
				
			||||||
Make waypoint @1=Сделать путевую точку @1
 | 
					Hide coordinates=
 | 
				
			||||||
Disable=Выключить
 | 
					Show coordinates=
 | 
				
			||||||
Enable=Включить
 | 
					 | 
				
			||||||
@1 display of waypoint coordinates=@1 показ координат путевых точек
 | 
					 | 
				
			||||||
Change color of waypoint display=Поменять цвет путевой точки
 | 
					Change color of waypoint display=Поменять цвет путевой точки
 | 
				
			||||||
Edit waypoint name=Переименовать путевую точку
 | 
					Edit waypoint name=Переименовать путевую точку
 | 
				
			||||||
Waypoint active=Путевая точка включена
 | 
					Waypoint active=Путевая точка включена
 | 
				
			||||||
@@ -76,3 +88,13 @@ Finish editing=Закончить редакцию
 | 
				
			|||||||
World position=Позиция мира
 | 
					World position=Позиция мира
 | 
				
			||||||
Name=Имя
 | 
					Name=Имя
 | 
				
			||||||
HUD text color=Цвет текста HUDа
 | 
					HUD text color=Цвет текста HUDа
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### not used anymore #####
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					invisible=невидимой
 | 
				
			||||||
 | 
					visible=видимой
 | 
				
			||||||
 | 
					Make waypoint @1=Сделать путевую точку @1
 | 
				
			||||||
 | 
					Disable=Выключить
 | 
				
			||||||
 | 
					Enable=Включить
 | 
				
			||||||
 | 
					@1 display of waypoint coordinates=@1 показ координат путевых точек
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
# textdomain: unified_inventory
 | 
					# textdomain: unified_inventory
 | 
				
			||||||
Crafting=Üretim
 | 
					 | 
				
			||||||
Mixing=Karıştırma
 | 
					Mixing=Karıştırma
 | 
				
			||||||
Cooking=Pişirme
 | 
					Cooking=Pişirme
 | 
				
			||||||
Digging=Kazma
 | 
					Digging=Kazma
 | 
				
			||||||
@@ -8,20 +7,32 @@ Bag @1=@1. Çanta
 | 
				
			|||||||
Small Bag=Küçük Çanta
 | 
					Small Bag=Küçük Çanta
 | 
				
			||||||
Medium Bag=Çanta
 | 
					Medium Bag=Çanta
 | 
				
			||||||
Large Bag=Büyük Çanta
 | 
					Large Bag=Büyük Çanta
 | 
				
			||||||
 | 
					All Items=
 | 
				
			||||||
 | 
					Misc. Items=
 | 
				
			||||||
 | 
					Plant Life=
 | 
				
			||||||
 | 
					Building Materials=
 | 
				
			||||||
 | 
					Tools=
 | 
				
			||||||
 | 
					Minerals and Metals=
 | 
				
			||||||
 | 
					Environment and Worldgen=
 | 
				
			||||||
 | 
					Lighting=
 | 
				
			||||||
 and = ve 
 | 
					 and = ve 
 | 
				
			||||||
 | 
					Scroll categories left=
 | 
				
			||||||
 | 
					Scroll categories right=
 | 
				
			||||||
 | 
					Search=Ara
 | 
				
			||||||
 | 
					Reset search and display everything=
 | 
				
			||||||
First page=İlk Sayfa
 | 
					First page=İlk Sayfa
 | 
				
			||||||
Back three pages=3 Sayfa Gerile
 | 
					Back three pages=3 Sayfa Gerile
 | 
				
			||||||
Back one page=Geri
 | 
					Back one page=Geri
 | 
				
			||||||
Forward one page=İleri
 | 
					Forward one page=İleri
 | 
				
			||||||
Forward three pages=3 Sayfa İlerile
 | 
					Forward three pages=3 Sayfa İlerile
 | 
				
			||||||
Last page=Son Sayfa
 | 
					Last page=Son Sayfa
 | 
				
			||||||
Search=Ara
 | 
					 | 
				
			||||||
No matching items=Eşleşme yok
 | 
					No matching items=Eşleşme yok
 | 
				
			||||||
No matches.=Eşleşme yok
 | 
					No matches.=Eşleşme yok
 | 
				
			||||||
Page=Sayfa
 | 
					Page=Sayfa
 | 
				
			||||||
@1 of @2=@1 dan @2
 | 
					@1 of @2=@1 dan @2
 | 
				
			||||||
Filter=Süzgeç
 | 
					Filter=Süzgeç
 | 
				
			||||||
Can use the creative inventory=Yaratıcı envanteri kullanabilir
 | 
					Can use the creative inventory=Yaratıcı envanteri kullanabilir
 | 
				
			||||||
 | 
					Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=
 | 
				
			||||||
Crafting Grid=Üretim tablosu
 | 
					Crafting Grid=Üretim tablosu
 | 
				
			||||||
Crafting Guide=Kılavuz
 | 
					Crafting Guide=Kılavuz
 | 
				
			||||||
Set home position=Set ev pozisyon
 | 
					Set home position=Set ev pozisyon
 | 
				
			||||||
@@ -33,19 +44,29 @@ Time of day set to 6am=Saat 06:00 olarak ayarlandı
 | 
				
			|||||||
You don't have the settime privilege!="settime" yetkiniz yok!
 | 
					You don't have the settime privilege!="settime" yetkiniz yok!
 | 
				
			||||||
Set time to night=Geceye zaman ayarla
 | 
					Set time to night=Geceye zaman ayarla
 | 
				
			||||||
Time of day set to 9pm=Saat 19:00 olarak ayarlandı
 | 
					Time of day set to 9pm=Saat 19:00 olarak ayarlandı
 | 
				
			||||||
msgid ""=Yaratıcı modu dışında iken bu tuş kullanılamaz.
 | 
					Clear inventory=
 | 
				
			||||||
 | 
					This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
				
			||||||
Inventory cleared!=Envanter temizlendi!
 | 
					Inventory cleared!=Envanter temizlendi!
 | 
				
			||||||
Trash:=Çöp
 | 
					Trash:=Çöp
 | 
				
			||||||
Refill:=Doldur
 | 
					Refill:=Doldur
 | 
				
			||||||
 | 
					Any item belonging to the @1 group=
 | 
				
			||||||
 | 
					Any item belonging to the groups @1=
 | 
				
			||||||
Recipe @1 of @2=@1 dan @2 tarifi
 | 
					Recipe @1 of @2=@1 dan @2 tarifi
 | 
				
			||||||
Usage @1 of @2=Kullanım @1/@2
 | 
					Usage @1 of @2=Kullanım @1/@2
 | 
				
			||||||
No recipes=Tarifi yok
 | 
					No recipes=Tarifi yok
 | 
				
			||||||
No usages=Kullanım yok
 | 
					No usages=Kullanım yok
 | 
				
			||||||
Result=Çıktı
 | 
					Result=Çıktı
 | 
				
			||||||
Ingredient=Bileşen
 | 
					Ingredient=Bileşen
 | 
				
			||||||
 | 
					Show next recipe=
 | 
				
			||||||
 | 
					Show next usage=
 | 
				
			||||||
 | 
					Show previous recipe=
 | 
				
			||||||
 | 
					Show previous usage=
 | 
				
			||||||
 | 
					@1 (@2)=
 | 
				
			||||||
Give me:=Ver bana:
 | 
					Give me:=Ver bana:
 | 
				
			||||||
 | 
					This recipe is too@@large to be displayed.=
 | 
				
			||||||
To craft grid:=Üretim tablosuna kopyala
 | 
					To craft grid:=Üretim tablosuna kopyala
 | 
				
			||||||
All=Tümü
 | 
					All=Tümü
 | 
				
			||||||
 | 
					Crafting=Üretim
 | 
				
			||||||
White=Beyaz
 | 
					White=Beyaz
 | 
				
			||||||
Yellow=Sarı
 | 
					Yellow=Sarı
 | 
				
			||||||
Red=Kırmızı
 | 
					Red=Kırmızı
 | 
				
			||||||
@@ -55,10 +76,10 @@ Waypoints=Konum Noktaları
 | 
				
			|||||||
Select Waypoint #@1=#@1 konum noktası seç
 | 
					Select Waypoint #@1=#@1 konum noktası seç
 | 
				
			||||||
Waypoint @1=@1 Konum Noktaları
 | 
					Waypoint @1=@1 Konum Noktaları
 | 
				
			||||||
Set waypoint to current location=Bulunduğun noktayı işaretle
 | 
					Set waypoint to current location=Bulunduğun noktayı işaretle
 | 
				
			||||||
invisible=görünmez
 | 
					Hide waypoint=
 | 
				
			||||||
visible=görünür
 | 
					Show waypoint=
 | 
				
			||||||
Make waypoint @1=Yol noktası @1
 | 
					Hide coordinates=
 | 
				
			||||||
@1 display of waypoint coordinates=Yol noktası koordinatlarının görüntülenmesini @1
 | 
					Show coordinates=
 | 
				
			||||||
Change color of waypoint display=Konum Gösterge Rengi
 | 
					Change color of waypoint display=Konum Gösterge Rengi
 | 
				
			||||||
Edit waypoint name=Konum Noktasını Düzenle
 | 
					Edit waypoint name=Konum Noktasını Düzenle
 | 
				
			||||||
Waypoint active=Konum Etkin
 | 
					Waypoint active=Konum Etkin
 | 
				
			||||||
@@ -67,3 +88,12 @@ Finish editing=Düzenleme bitti
 | 
				
			|||||||
World position=Dünya konumu
 | 
					World position=Dünya konumu
 | 
				
			||||||
Name=İsim
 | 
					Name=İsim
 | 
				
			||||||
HUD text color=Metin rengi
 | 
					HUD text color=Metin rengi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					##### not used anymore #####
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					msgid ""=Yaratıcı modu dışında iken bu tuş kullanılamaz.
 | 
				
			||||||
 | 
					invisible=görünmez
 | 
				
			||||||
 | 
					visible=görünür
 | 
				
			||||||
 | 
					Make waypoint @1=Yol noktası @1
 | 
				
			||||||
 | 
					@1 display of waypoint coordinates=Yol noktası koordinatlarının görüntülenmesini @1
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,4 @@
 | 
				
			|||||||
# textdomain: unified_inventory
 | 
					# textdomain: unified_inventory
 | 
				
			||||||
# traslation by: IFRFSX(BingFengFSX)
 | 
					 | 
				
			||||||
#Email: IFRFSX@Protonmail.com
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Crafting=合成
 | 
					 | 
				
			||||||
Mixing=混合
 | 
					Mixing=混合
 | 
				
			||||||
Cooking=烹饪
 | 
					Cooking=烹饪
 | 
				
			||||||
Digging=挖出
 | 
					Digging=挖出
 | 
				
			||||||
@@ -11,20 +7,32 @@ Bag @1=背包@1
 | 
				
			|||||||
Small Bag=小背包
 | 
					Small Bag=小背包
 | 
				
			||||||
Medium Bag=中背包
 | 
					Medium Bag=中背包
 | 
				
			||||||
Large Bag=大背包
 | 
					Large Bag=大背包
 | 
				
			||||||
 | 
					All Items=
 | 
				
			||||||
 | 
					Misc. Items=
 | 
				
			||||||
 | 
					Plant Life=
 | 
				
			||||||
 | 
					Building Materials=
 | 
				
			||||||
 | 
					Tools=
 | 
				
			||||||
 | 
					Minerals and Metals=
 | 
				
			||||||
 | 
					Environment and Worldgen=
 | 
				
			||||||
 | 
					Lighting=
 | 
				
			||||||
 and = 和 
 | 
					 and = 和 
 | 
				
			||||||
 | 
					Scroll categories left=
 | 
				
			||||||
 | 
					Scroll categories right=
 | 
				
			||||||
 | 
					Search=搜索
 | 
				
			||||||
 | 
					Reset search and display everything=重置搜索并显示所有物品
 | 
				
			||||||
First page=第一页
 | 
					First page=第一页
 | 
				
			||||||
Back three pages=后退三页
 | 
					Back three pages=后退三页
 | 
				
			||||||
Back one page=后退一页
 | 
					Back one page=后退一页
 | 
				
			||||||
Forward one page=前进一页
 | 
					Forward one page=前进一页
 | 
				
			||||||
Forward three pages=前进三页
 | 
					Forward three pages=前进三页
 | 
				
			||||||
Last page=最后一页
 | 
					Last page=最后一页
 | 
				
			||||||
Search=搜索
 | 
					 | 
				
			||||||
No matching items=没有匹配物品
 | 
					No matching items=没有匹配物品
 | 
				
			||||||
No matches.=没有匹配
 | 
					No matches.=没有匹配
 | 
				
			||||||
Page=页面
 | 
					Page=页面
 | 
				
			||||||
@1 of @2=第@1页,共@2页
 | 
					@1 of @2=第@1页,共@2页
 | 
				
			||||||
Filter=过滤器
 | 
					Filter=过滤器
 | 
				
			||||||
Can use the creative inventory=可以使用创造背包
 | 
					Can use the creative inventory=可以使用创造背包
 | 
				
			||||||
 | 
					Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=
 | 
				
			||||||
Crafting Grid=合成表
 | 
					Crafting Grid=合成表
 | 
				
			||||||
Crafting Guide=合成指南
 | 
					Crafting Guide=合成指南
 | 
				
			||||||
Set home position=设置家的位置
 | 
					Set home position=设置家的位置
 | 
				
			||||||
@@ -36,21 +44,29 @@ Time of day set to 6am=时间设置到早晨6点
 | 
				
			|||||||
You don't have the settime privilege!=你没有“settime”权限!
 | 
					You don't have the settime privilege!=你没有“settime”权限!
 | 
				
			||||||
Set time to night=设置时间到晚上
 | 
					Set time to night=设置时间到晚上
 | 
				
			||||||
Time of day set to 9pm=时间设置到晚上9点
 | 
					Time of day set to 9pm=时间设置到晚上9点
 | 
				
			||||||
 | 
					 | 
				
			||||||
Inventory cleared!=清空背包
 | 
					 | 
				
			||||||
Clear inventory=清空背包
 | 
					Clear inventory=清空背包
 | 
				
			||||||
 | 
					This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
				
			||||||
 | 
					Inventory cleared!=清空背包
 | 
				
			||||||
Trash:=丢弃:
 | 
					Trash:=丢弃:
 | 
				
			||||||
Refill:=填满:
 | 
					Refill:=填满:
 | 
				
			||||||
 | 
					Any item belonging to the @1 group=属于@1组的任何项目
 | 
				
			||||||
 | 
					Any item belonging to the groups @1=属于组@1的任何项目
 | 
				
			||||||
Recipe @1 of @2=第@1配方,共@2个
 | 
					Recipe @1 of @2=第@1配方,共@2个
 | 
				
			||||||
Usage @1 of @2=第@1用法,共@2个
 | 
					Usage @1 of @2=第@1用法,共@2个
 | 
				
			||||||
No recipes=没有配方
 | 
					No recipes=没有配方
 | 
				
			||||||
No usages=没有用法
 | 
					No usages=没有用法
 | 
				
			||||||
Result=结果
 | 
					Result=结果
 | 
				
			||||||
Ingredient=原料
 | 
					Ingredient=原料
 | 
				
			||||||
 | 
					Show next recipe=
 | 
				
			||||||
 | 
					Show next usage=
 | 
				
			||||||
 | 
					Show previous recipe=
 | 
				
			||||||
 | 
					Show previous usage=
 | 
				
			||||||
 | 
					@1 (@2)=
 | 
				
			||||||
Give me:=给予:
 | 
					Give me:=给予:
 | 
				
			||||||
 | 
					This recipe is too@@large to be displayed.=
 | 
				
			||||||
To craft grid:=填充物品到合成表
 | 
					To craft grid:=填充物品到合成表
 | 
				
			||||||
All=全部
 | 
					All=全部
 | 
				
			||||||
 | 
					Crafting=合成
 | 
				
			||||||
White=白
 | 
					White=白
 | 
				
			||||||
Yellow=黄
 | 
					Yellow=黄
 | 
				
			||||||
Red=红
 | 
					Red=红
 | 
				
			||||||
@@ -60,10 +76,10 @@ Waypoints=航路点
 | 
				
			|||||||
Select Waypoint #@1=查询航路点 #@1
 | 
					Select Waypoint #@1=查询航路点 #@1
 | 
				
			||||||
Waypoint @1=航路点 @1
 | 
					Waypoint @1=航路点 @1
 | 
				
			||||||
Set waypoint to current location=将航路点设置到当前位置
 | 
					Set waypoint to current location=将航路点设置到当前位置
 | 
				
			||||||
invisible=不可见的
 | 
					Hide waypoint=
 | 
				
			||||||
visible=可见的
 | 
					Show waypoint=
 | 
				
			||||||
Make waypoint @1=设置航路点 @1
 | 
					Hide coordinates=
 | 
				
			||||||
@1 display of waypoint coordinates=显示航路点@1坐标
 | 
					Show coordinates=
 | 
				
			||||||
Change color of waypoint display=改变航路点显示的颜色
 | 
					Change color of waypoint display=改变航路点显示的颜色
 | 
				
			||||||
Edit waypoint name=编辑航路点名称
 | 
					Edit waypoint name=编辑航路点名称
 | 
				
			||||||
Waypoint active=航路点已激活
 | 
					Waypoint active=航路点已激活
 | 
				
			||||||
@@ -73,6 +89,10 @@ World position=世界位置
 | 
				
			|||||||
Name=名称
 | 
					Name=名称
 | 
				
			||||||
HUD text color=HUD文本颜色
 | 
					HUD text color=HUD文本颜色
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#new
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Reset search and display everything=重置搜索并显示所有物品
 | 
					##### not used anymore #####
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					invisible=不可见的
 | 
				
			||||||
 | 
					visible=可见的
 | 
				
			||||||
 | 
					Make waypoint @1=设置航路点 @1
 | 
				
			||||||
 | 
					@1 display of waypoint coordinates=显示航路点@1坐标
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,4 @@
 | 
				
			|||||||
# textdomain: unified_inventory
 | 
					# textdomain: unified_inventory
 | 
				
			||||||
# traslation by: IFRFSX(BingFengFSX)
 | 
					 | 
				
			||||||
#Email: IFRFSX@Protonmail.com
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Crafting=合成
 | 
					 | 
				
			||||||
Mixing=混合
 | 
					Mixing=混合
 | 
				
			||||||
Cooking=烹飪
 | 
					Cooking=烹飪
 | 
				
			||||||
Digging=挖出
 | 
					Digging=挖出
 | 
				
			||||||
@@ -11,20 +7,32 @@ Bag @1=揹包@1
 | 
				
			|||||||
Small Bag=小揹包
 | 
					Small Bag=小揹包
 | 
				
			||||||
Medium Bag=中揹包
 | 
					Medium Bag=中揹包
 | 
				
			||||||
Large Bag=大揹包
 | 
					Large Bag=大揹包
 | 
				
			||||||
 | 
					All Items=
 | 
				
			||||||
 | 
					Misc. Items=
 | 
				
			||||||
 | 
					Plant Life=
 | 
				
			||||||
 | 
					Building Materials=
 | 
				
			||||||
 | 
					Tools=
 | 
				
			||||||
 | 
					Minerals and Metals=
 | 
				
			||||||
 | 
					Environment and Worldgen=
 | 
				
			||||||
 | 
					Lighting=
 | 
				
			||||||
 and = 和 
 | 
					 and = 和 
 | 
				
			||||||
 | 
					Scroll categories left=
 | 
				
			||||||
 | 
					Scroll categories right=
 | 
				
			||||||
 | 
					Search=搜索
 | 
				
			||||||
 | 
					Reset search and display everything=重置搜索並顯示所有物品
 | 
				
			||||||
First page=第一頁
 | 
					First page=第一頁
 | 
				
			||||||
Back three pages=後退三頁
 | 
					Back three pages=後退三頁
 | 
				
			||||||
Back one page=後退一頁
 | 
					Back one page=後退一頁
 | 
				
			||||||
Forward one page=前進一頁
 | 
					Forward one page=前進一頁
 | 
				
			||||||
Forward three pages=前進三頁
 | 
					Forward three pages=前進三頁
 | 
				
			||||||
Last page=最後一頁
 | 
					Last page=最後一頁
 | 
				
			||||||
Search=搜索
 | 
					 | 
				
			||||||
No matching items=沒有匹配物品
 | 
					No matching items=沒有匹配物品
 | 
				
			||||||
No matches.=沒有匹配
 | 
					No matches.=沒有匹配
 | 
				
			||||||
Page=頁面
 | 
					Page=頁面
 | 
				
			||||||
@1 of @2=第@1頁,共@2頁
 | 
					@1 of @2=第@1頁,共@2頁
 | 
				
			||||||
Filter=過濾器
 | 
					Filter=過濾器
 | 
				
			||||||
Can use the creative inventory=可以使用創造揹包
 | 
					Can use the creative inventory=可以使用創造揹包
 | 
				
			||||||
 | 
					Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=
 | 
				
			||||||
Crafting Grid=合成表
 | 
					Crafting Grid=合成表
 | 
				
			||||||
Crafting Guide=合成指南
 | 
					Crafting Guide=合成指南
 | 
				
			||||||
Set home position=設置家的位置
 | 
					Set home position=設置家的位置
 | 
				
			||||||
@@ -36,21 +44,29 @@ Time of day set to 6am=時間設置到早晨6點
 | 
				
			|||||||
You don't have the settime privilege!=你沒有“settime”權限!
 | 
					You don't have the settime privilege!=你沒有“settime”權限!
 | 
				
			||||||
Set time to night=設置時間到晚上
 | 
					Set time to night=設置時間到晚上
 | 
				
			||||||
Time of day set to 9pm=時間設置到晚上9點
 | 
					Time of day set to 9pm=時間設置到晚上9點
 | 
				
			||||||
 | 
					 | 
				
			||||||
Inventory cleared!=清空揹包
 | 
					 | 
				
			||||||
Clear inventory=清空揹包
 | 
					Clear inventory=清空揹包
 | 
				
			||||||
 | 
					This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
				
			||||||
 | 
					Inventory cleared!=清空揹包
 | 
				
			||||||
Trash:=丟棄:
 | 
					Trash:=丟棄:
 | 
				
			||||||
Refill:=填滿:
 | 
					Refill:=填滿:
 | 
				
			||||||
 | 
					Any item belonging to the @1 group=屬於@1組的任何項目
 | 
				
			||||||
 | 
					Any item belonging to the groups @1=屬於組@1的任何項目
 | 
				
			||||||
Recipe @1 of @2=第@1配方,共@2個
 | 
					Recipe @1 of @2=第@1配方,共@2個
 | 
				
			||||||
Usage @1 of @2=第@1用法,共@2個
 | 
					Usage @1 of @2=第@1用法,共@2個
 | 
				
			||||||
No recipes=沒有配方
 | 
					No recipes=沒有配方
 | 
				
			||||||
No usages=沒有用法
 | 
					No usages=沒有用法
 | 
				
			||||||
Result=結果
 | 
					Result=結果
 | 
				
			||||||
Ingredient=原料
 | 
					Ingredient=原料
 | 
				
			||||||
 | 
					Show next recipe=
 | 
				
			||||||
 | 
					Show next usage=
 | 
				
			||||||
 | 
					Show previous recipe=
 | 
				
			||||||
 | 
					Show previous usage=
 | 
				
			||||||
 | 
					@1 (@2)=
 | 
				
			||||||
Give me:=給予:
 | 
					Give me:=給予:
 | 
				
			||||||
 | 
					This recipe is too@@large to be displayed.=
 | 
				
			||||||
To craft grid:=填充物品到合成表
 | 
					To craft grid:=填充物品到合成表
 | 
				
			||||||
All=全部
 | 
					All=全部
 | 
				
			||||||
 | 
					Crafting=合成
 | 
				
			||||||
White=白
 | 
					White=白
 | 
				
			||||||
Yellow=黃
 | 
					Yellow=黃
 | 
				
			||||||
Red=紅
 | 
					Red=紅
 | 
				
			||||||
@@ -60,10 +76,10 @@ Waypoints=航路點
 | 
				
			|||||||
Select Waypoint #@1=查詢航路點 #@1
 | 
					Select Waypoint #@1=查詢航路點 #@1
 | 
				
			||||||
Waypoint @1=航路點 @1
 | 
					Waypoint @1=航路點 @1
 | 
				
			||||||
Set waypoint to current location=將航路點設置到當前位置
 | 
					Set waypoint to current location=將航路點設置到當前位置
 | 
				
			||||||
invisible=不可見的
 | 
					Hide waypoint=
 | 
				
			||||||
visible=可見的
 | 
					Show waypoint=
 | 
				
			||||||
Make waypoint @1=設置航路點 @1
 | 
					Hide coordinates=
 | 
				
			||||||
@1 display of waypoint coordinates=顯示航路點@1座標
 | 
					Show coordinates=
 | 
				
			||||||
Change color of waypoint display=改變航路點顯示的顏色
 | 
					Change color of waypoint display=改變航路點顯示的顏色
 | 
				
			||||||
Edit waypoint name=編輯航路點名稱
 | 
					Edit waypoint name=編輯航路點名稱
 | 
				
			||||||
Waypoint active=航路點已激活
 | 
					Waypoint active=航路點已激活
 | 
				
			||||||
@@ -73,6 +89,10 @@ World position=世界位置
 | 
				
			|||||||
Name=名稱
 | 
					Name=名稱
 | 
				
			||||||
HUD text color=HUD文本顏色
 | 
					HUD text color=HUD文本顏色
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#new
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Reset search and display everything=重置搜索並顯示所有物品
 | 
					##### not used anymore #####
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					invisible=不可見的
 | 
				
			||||||
 | 
					visible=可見的
 | 
				
			||||||
 | 
					Make waypoint @1=設置航路點 @1
 | 
				
			||||||
 | 
					@1 display of waypoint coordinates=顯示航路點@1座標
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										10
									
								
								mod.conf
									
									
									
									
									
								
							
							
						
						@@ -1,4 +1,8 @@
 | 
				
			|||||||
name = unified_inventory
 | 
					name = unified_inventory
 | 
				
			||||||
depends = default
 | 
					
 | 
				
			||||||
optional_depends = creative, sfinv, datastorage, farming
 | 
					optional_depends = default, creative, sfinv, datastorage, farming
 | 
				
			||||||
description = Unified Inventory replaces the default survival and creative inventory. It adds a nicer interface and a number of features, such as a crafting guide.
 | 
					description = """
 | 
				
			||||||
 | 
					Unified Inventory replaces the default survival and creative inventory.
 | 
				
			||||||
 | 
					It adds a nicer interface and a number of features, such as a crafting guide.
 | 
				
			||||||
 | 
					"""
 | 
				
			||||||
 | 
					min_minetest_version = 5.4.0
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										247
									
								
								register.lua
									
									
									
									
									
								
							
							
						
						@@ -1,6 +1,7 @@
 | 
				
			|||||||
local S = minetest.get_translator("unified_inventory")
 | 
					local S = minetest.get_translator("unified_inventory")
 | 
				
			||||||
local NS = function(s) return s end
 | 
					local NS = function(s) return s end
 | 
				
			||||||
local F = minetest.formspec_escape
 | 
					local F = minetest.formspec_escape
 | 
				
			||||||
 | 
					local ui = unified_inventory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
minetest.register_privilege("creative", {
 | 
					minetest.register_privilege("creative", {
 | 
				
			||||||
	description = S("Can use the creative inventory"),
 | 
						description = S("Can use the creative inventory"),
 | 
				
			||||||
@@ -12,10 +13,9 @@ minetest.register_privilege("ui_full", {
 | 
				
			|||||||
	give_to_singleplayer = false,
 | 
						give_to_singleplayer = false,
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
local trash = minetest.create_detached_inventory("trash", {
 | 
					local trash = minetest.create_detached_inventory("trash", {
 | 
				
			||||||
	--allow_put = function(inv, listname, index, stack, player)
 | 
						--allow_put = function(inv, listname, index, stack, player)
 | 
				
			||||||
	--	if unified_inventory.is_creative(player:get_player_name()) then
 | 
						--	if ui.is_creative(player:get_player_name()) then
 | 
				
			||||||
	--		return stack:get_count()
 | 
						--		return stack:get_count()
 | 
				
			||||||
	--	else
 | 
						--	else
 | 
				
			||||||
	--		return 0
 | 
						--		return 0
 | 
				
			||||||
@@ -29,19 +29,19 @@ local trash = minetest.create_detached_inventory("trash", {
 | 
				
			|||||||
})
 | 
					})
 | 
				
			||||||
trash:set_size("main", 1)
 | 
					trash:set_size("main", 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_button("craft", {
 | 
					ui.register_button("craft", {
 | 
				
			||||||
	type = "image",
 | 
						type = "image",
 | 
				
			||||||
	image = "ui_craft_icon.png",
 | 
						image = "ui_craft_icon.png",
 | 
				
			||||||
	tooltip = S("Crafting Grid")
 | 
						tooltip = S("Crafting Grid")
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_button("craftguide", {
 | 
					ui.register_button("craftguide", {
 | 
				
			||||||
	type = "image",
 | 
						type = "image",
 | 
				
			||||||
	image = "ui_craftguide_icon.png",
 | 
						image = "ui_craftguide_icon.png",
 | 
				
			||||||
	tooltip = S("Crafting Guide")
 | 
						tooltip = S("Crafting Guide")
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_button("misc_set_day", {
 | 
					ui.register_button("misc_set_day", {
 | 
				
			||||||
	type = "image",
 | 
						type = "image",
 | 
				
			||||||
	image = "ui_sun_icon.png",
 | 
						image = "ui_sun_icon.png",
 | 
				
			||||||
	tooltip = S("Set time to day"),
 | 
						tooltip = S("Set time to day"),
 | 
				
			||||||
@@ -57,7 +57,7 @@ unified_inventory.register_button("misc_set_day", {
 | 
				
			|||||||
		else
 | 
							else
 | 
				
			||||||
			minetest.chat_send_player(player_name,
 | 
								minetest.chat_send_player(player_name,
 | 
				
			||||||
				S("You don't have the settime privilege!"))
 | 
									S("You don't have the settime privilege!"))
 | 
				
			||||||
			unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name])
 | 
								ui.set_inventory_formspec(player, ui.current_page[player_name])
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	end,
 | 
						end,
 | 
				
			||||||
	condition = function(player)
 | 
						condition = function(player)
 | 
				
			||||||
@@ -65,7 +65,7 @@ unified_inventory.register_button("misc_set_day", {
 | 
				
			|||||||
	end,
 | 
						end,
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_button("misc_set_night", {
 | 
					ui.register_button("misc_set_night", {
 | 
				
			||||||
	type = "image",
 | 
						type = "image",
 | 
				
			||||||
	image = "ui_moon_icon.png",
 | 
						image = "ui_moon_icon.png",
 | 
				
			||||||
	tooltip = S("Set time to night"),
 | 
						tooltip = S("Set time to night"),
 | 
				
			||||||
@@ -81,7 +81,7 @@ unified_inventory.register_button("misc_set_night", {
 | 
				
			|||||||
		else
 | 
							else
 | 
				
			||||||
			minetest.chat_send_player(player_name,
 | 
								minetest.chat_send_player(player_name,
 | 
				
			||||||
					S("You don't have the settime privilege!"))
 | 
										S("You don't have the settime privilege!"))
 | 
				
			||||||
			unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name])
 | 
								ui.set_inventory_formspec(player, ui.current_page[player_name])
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	end,
 | 
						end,
 | 
				
			||||||
	condition = function(player)
 | 
						condition = function(player)
 | 
				
			||||||
@@ -89,19 +89,19 @@ unified_inventory.register_button("misc_set_night", {
 | 
				
			|||||||
	end,
 | 
						end,
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_button("clear_inv", {
 | 
					ui.register_button("clear_inv", {
 | 
				
			||||||
	type = "image",
 | 
						type = "image",
 | 
				
			||||||
	image = "ui_trash_icon.png",
 | 
						image = "ui_trash_icon.png",
 | 
				
			||||||
	tooltip = S("Clear inventory"),
 | 
						tooltip = S("Clear inventory"),
 | 
				
			||||||
	action = function(player)
 | 
						action = function(player)
 | 
				
			||||||
		local player_name = player:get_player_name()
 | 
							local player_name = player:get_player_name()
 | 
				
			||||||
		if not unified_inventory.is_creative(player_name) then
 | 
							if not ui.is_creative(player_name) then
 | 
				
			||||||
			minetest.chat_send_player(player_name,
 | 
								minetest.chat_send_player(player_name,
 | 
				
			||||||
					S("This button has been disabled outside"
 | 
										S("This button has been disabled outside"
 | 
				
			||||||
					.." of creative mode to prevent"
 | 
										.." of creative mode to prevent"
 | 
				
			||||||
					.." accidental inventory trashing."
 | 
										.." accidental inventory trashing."
 | 
				
			||||||
					.."\nUse the trash slot instead."))
 | 
										.."\nUse the trash slot instead."))
 | 
				
			||||||
			unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name])
 | 
								ui.set_inventory_formspec(player, ui.current_page[player_name])
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		player:get_inventory():set_list("main", {})
 | 
							player:get_inventory():set_list("main", {})
 | 
				
			||||||
@@ -110,35 +110,42 @@ unified_inventory.register_button("clear_inv", {
 | 
				
			|||||||
				{to_player=player_name, gain = 1.0})
 | 
									{to_player=player_name, gain = 1.0})
 | 
				
			||||||
	end,
 | 
						end,
 | 
				
			||||||
	condition = function(player)
 | 
						condition = function(player)
 | 
				
			||||||
		return unified_inventory.is_creative(player:get_player_name())
 | 
							return ui.is_creative(player:get_player_name())
 | 
				
			||||||
	end,
 | 
						end,
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_page("craft", {
 | 
					ui.register_page("craft", {
 | 
				
			||||||
	get_formspec = function(player, perplayer_formspec)
 | 
						get_formspec = function(player, perplayer_formspec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		local formspecy = perplayer_formspec.formspec_y
 | 
							local formheaderx = perplayer_formspec.form_header_x
 | 
				
			||||||
		local formheadery =  perplayer_formspec.form_header_y
 | 
							local formheadery = perplayer_formspec.form_header_y
 | 
				
			||||||
 | 
							local craftx = perplayer_formspec.craft_x
 | 
				
			||||||
 | 
							local crafty = perplayer_formspec.craft_y
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		local player_name = player:get_player_name()
 | 
							local player_name = player:get_player_name()
 | 
				
			||||||
		local formspec = "background[2,"..formspecy..";6,3;ui_crafting_form.png]"
 | 
							local formspec = {
 | 
				
			||||||
		formspec = formspec.."background[0,"..(formspecy + 3.5)..";8,4;ui_main_inventory.png]"
 | 
								perplayer_formspec.standard_inv_bg,
 | 
				
			||||||
		formspec = formspec.."label[0,"..formheadery..";" ..F(S("Crafting")).."]"
 | 
								perplayer_formspec.craft_grid,
 | 
				
			||||||
		formspec = formspec.."listcolors[#00000000;#00000000]"
 | 
								"label["..formheaderx..","..formheadery..";" ..F(S("Crafting")).."]",
 | 
				
			||||||
		formspec = formspec.."list[current_player;craftpreview;6,"..formspecy..";1,1;]"
 | 
								"listcolors[#00000000;#00000000]",
 | 
				
			||||||
		formspec = formspec.."list[current_player;craft;2,"..formspecy..";3,3;]"
 | 
								"listring[current_name;craft]",
 | 
				
			||||||
		if unified_inventory.trash_enabled or unified_inventory.is_creative(player_name) or minetest.get_player_privs(player_name).give then
 | 
								"listring[current_player;main]"
 | 
				
			||||||
			formspec = formspec.."label[7,"..(formspecy + 1.5)..";" .. F(S("Trash:")) .. "]"
 | 
							}
 | 
				
			||||||
			formspec = formspec.."background[7,"..(formspecy + 2)..";1,1;ui_single_slot.png]"
 | 
							local n=#formspec+1
 | 
				
			||||||
			formspec = formspec.."list[detached:trash;main;7,"..(formspecy + 2)..";1,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+1] = ui.make_trash_slot(craftx + 6.25, crafty + 2.5)
 | 
				
			||||||
 | 
								n=n + 2
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		formspec = formspec.."listring[current_name;craft]"
 | 
					
 | 
				
			||||||
		formspec = formspec.."listring[current_player;main]"
 | 
							if ui.is_creative(player_name) then
 | 
				
			||||||
		if unified_inventory.is_creative(player_name) then
 | 
								formspec[n] = ui.single_slot(craftx - 2.5, crafty + 2.5)
 | 
				
			||||||
			formspec = formspec.."label[0,"..(formspecy + 1.5)..";" .. F(S("Refill:")) .. "]"
 | 
								formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.3, crafty + 2.4,F(S("Refill:")))
 | 
				
			||||||
			formspec = formspec.."list[detached:"..F(player_name).."refill;main;0,"..(formspecy +2)..";1,1;]"
 | 
								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
 | 
							end
 | 
				
			||||||
		return {formspec=formspec}
 | 
							return {formspec=table.concat(formspec)}
 | 
				
			||||||
	end,
 | 
						end,
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -157,18 +164,18 @@ local function stack_image_button(x, y, w, h, buttonname_prefix, item)
 | 
				
			|||||||
	local selectitem = name
 | 
						local selectitem = name
 | 
				
			||||||
	if name:sub(1, 6) == "group:" then
 | 
						if name:sub(1, 6) == "group:" then
 | 
				
			||||||
		local group_name = name:sub(7)
 | 
							local group_name = name:sub(7)
 | 
				
			||||||
		local group_item = unified_inventory.get_group_item(group_name)
 | 
							local group_item = ui.get_group_item(group_name)
 | 
				
			||||||
		show_is_group = not group_item.sole
 | 
							show_is_group = not group_item.sole
 | 
				
			||||||
		displayitem = group_item.item or "unknown"
 | 
							displayitem = group_item.item or "unknown"
 | 
				
			||||||
		selectitem = group_item.sole and displayitem or name
 | 
							selectitem = group_item.sole and displayitem or name
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	local label = show_is_group and "G" or ""
 | 
						local label = show_is_group and "G" or ""
 | 
				
			||||||
	local buttonname = F(buttonname_prefix..unified_inventory.mangle_for_formspec(selectitem))
 | 
						local buttonname = F(buttonname_prefix..ui.mangle_for_formspec(selectitem))
 | 
				
			||||||
	local button = string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",
 | 
						local button = string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",
 | 
				
			||||||
			x, y, w, h,
 | 
								x, y, w, h,
 | 
				
			||||||
			F(displayitem), buttonname, label)
 | 
								F(displayitem), buttonname, label)
 | 
				
			||||||
	if show_is_group then
 | 
						if show_is_group then
 | 
				
			||||||
		local groupstring, andcount = unified_inventory.extract_groupnames(name)
 | 
							local groupstring, andcount = ui.extract_groupnames(name)
 | 
				
			||||||
		local grouptip
 | 
							local grouptip
 | 
				
			||||||
		if andcount == 1 then
 | 
							if andcount == 1 then
 | 
				
			||||||
			grouptip = S("Any item belonging to the @1 group", groupstring)
 | 
								grouptip = S("Any item belonging to the @1 group", groupstring)
 | 
				
			||||||
@@ -208,26 +215,33 @@ local other_dir = {
 | 
				
			|||||||
	usage = "recipe",
 | 
						usage = "recipe",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_page("craftguide", {
 | 
					ui.register_page("craftguide", {
 | 
				
			||||||
	get_formspec = function(player, perplayer_formspec)
 | 
						get_formspec = function(player, perplayer_formspec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		local formspecy =    perplayer_formspec.formspec_y
 | 
							local craftguidex =       perplayer_formspec.craft_guide_x
 | 
				
			||||||
		local formheadery =  perplayer_formspec.form_header_y
 | 
							local craftguidey =       perplayer_formspec.craft_guide_y
 | 
				
			||||||
		local craftresultx = perplayer_formspec.craft_result_x
 | 
							local craftguidearrowx =  perplayer_formspec.craft_guide_arrow_x
 | 
				
			||||||
		local craftresulty = perplayer_formspec.craft_result_y
 | 
							local craftguideresultx = perplayer_formspec.craft_guide_result_x
 | 
				
			||||||
 | 
							local formheaderx =       perplayer_formspec.form_header_x
 | 
				
			||||||
 | 
							local formheadery =       perplayer_formspec.form_header_y
 | 
				
			||||||
 | 
							local give_x =            perplayer_formspec.give_btn_x
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		local player_name = player:get_player_name()
 | 
							local player_name = player:get_player_name()
 | 
				
			||||||
		local player_privs = minetest.get_player_privs(player_name)
 | 
							local player_privs = minetest.get_player_privs(player_name)
 | 
				
			||||||
		local fs = {
 | 
					
 | 
				
			||||||
			"background[0,"..(formspecy + 3.5)..";8,4;ui_main_inventory.png]",
 | 
							local formspec = {
 | 
				
			||||||
			"label[0,"..formheadery..";" .. F(S("Crafting Guide")) .. "]",
 | 
								perplayer_formspec.standard_inv_bg,
 | 
				
			||||||
 | 
								"label["..formheaderx..","..formheadery..";" .. F(S("Crafting Guide")) .. "]",
 | 
				
			||||||
			"listcolors[#00000000;#00000000]"
 | 
								"listcolors[#00000000;#00000000]"
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		local item_name = unified_inventory.current_item[player_name]
 | 
					
 | 
				
			||||||
 | 
							local item_name = ui.current_item[player_name]
 | 
				
			||||||
		if not item_name then
 | 
							if not item_name then
 | 
				
			||||||
			return { formspec = table.concat(fs) }
 | 
								return { formspec = table.concat(formspec) }
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							local n = 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		local item_name_shown
 | 
							local item_name_shown
 | 
				
			||||||
		if minetest.registered_items[item_name]
 | 
							if minetest.registered_items[item_name]
 | 
				
			||||||
				and minetest.registered_items[item_name].description then
 | 
									and minetest.registered_items[item_name].description then
 | 
				
			||||||
@@ -237,51 +251,60 @@ unified_inventory.register_page("craftguide", {
 | 
				
			|||||||
			item_name_shown = item_name
 | 
								item_name_shown = item_name
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		local dir = unified_inventory.current_craft_direction[player_name]
 | 
							local dir = ui.current_craft_direction[player_name]
 | 
				
			||||||
		local rdir = dir == "recipe" and "usage" or "recipe"
 | 
							local rdir = dir == "recipe" and "usage" or "recipe"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		local crafts = unified_inventory.crafts_for[dir][item_name]
 | 
							local crafts = ui.crafts_for[dir][item_name]
 | 
				
			||||||
		local alternate = unified_inventory.alternate[player_name]
 | 
							local alternate = ui.alternate[player_name]
 | 
				
			||||||
		local alternates, craft
 | 
							local alternates, craft
 | 
				
			||||||
		if crafts and #crafts > 0 then
 | 
							if crafts and #crafts > 0 then
 | 
				
			||||||
			alternates = #crafts
 | 
								alternates = #crafts
 | 
				
			||||||
			craft = crafts[alternate]
 | 
								craft = crafts[alternate]
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		local has_give = player_privs.give or unified_inventory.is_creative(player_name)
 | 
							local has_give = player_privs.give or ui.is_creative(player_name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		fs[#fs + 1] = "background[0.5,"..(formspecy + 0.2)..";8,3;ui_craftguide_form.png]"
 | 
							formspec[n] = string.format("image[%f,%f;%f,%f;ui_crafting_arrow.png]",
 | 
				
			||||||
		fs[#fs + 1] = string.format("textarea[%f,%f;10,1;;%s: %s;]",
 | 
						                            craftguidearrowx, craftguidey, ui.imgscale, ui.imgscale)
 | 
				
			||||||
				craftresultx, craftresulty, F(role_text[dir]), item_name_shown)
 | 
					
 | 
				
			||||||
		fs[#fs + 1] = stack_image_button(0, formspecy, 1.1, 1.1,
 | 
							formspec[n+1] = string.format("textarea[%f,%f;10,1;;%s: %s;]",
 | 
				
			||||||
				"item_button_" .. rdir .. "_", ItemStack(item_name))
 | 
									perplayer_formspec.craft_guide_resultstr_x, perplayer_formspec.craft_guide_resultstr_y,
 | 
				
			||||||
 | 
									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]"
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if not craft then
 | 
							if not craft then
 | 
				
			||||||
			-- No craft recipes available for this item.
 | 
								-- No craft recipes available for this item.
 | 
				
			||||||
			fs[#fs + 1] = "label[5.5,"..(formspecy + 2.35)..";"
 | 
								formspec[n] = string.format("label[%f,%f;%s]", craftguidex+2.5, craftguidey+1.5, F(no_recipe_text[dir]))
 | 
				
			||||||
					.. F(no_recipe_text[dir]) .. "]"
 | 
								local no_pos = dir == "recipe" and (craftguidex+2.5) or craftguideresultx
 | 
				
			||||||
			local no_pos = dir == "recipe" and 4.5 or 6.5
 | 
								local item_pos = dir == "recipe" and craftguideresultx or (craftguidex+2.5)
 | 
				
			||||||
			local item_pos = dir == "recipe" and 6.5 or 4.5
 | 
								formspec[n+1] = "image["..no_pos..","..craftguidey..";1.2,1.2;ui_no.png]"
 | 
				
			||||||
			fs[#fs + 1] = "image["..no_pos..","..formspecy..";1.1,1.1;ui_no.png]"
 | 
								formspec[n+2] = stack_image_button(item_pos, craftguidey, 1.2, 1.2,
 | 
				
			||||||
			fs[#fs + 1] = stack_image_button(item_pos, formspecy, 1.1, 1.1,
 | 
					 | 
				
			||||||
				"item_button_" .. other_dir[dir] .. "_", ItemStack(item_name))
 | 
									"item_button_" .. other_dir[dir] .. "_", ItemStack(item_name))
 | 
				
			||||||
			if has_give then
 | 
								if has_give then
 | 
				
			||||||
				fs[#fs + 1] = "label[0," .. (formspecy + 2.10) .. ";" .. F(S("Give me:")) .. "]"
 | 
									formspec[n+3] = giveme_form
 | 
				
			||||||
						.. "button[0,  " .. (formspecy + 2.7) .. ";0.6,0.5;craftguide_giveme_1;1]"
 | 
					 | 
				
			||||||
						.. "button[0.6," .. (formspecy + 2.7) .. ";0.7,0.5;craftguide_giveme_10;10]"
 | 
					 | 
				
			||||||
						.. "button[1.3," .. (formspecy + 2.7) .. ";0.8,0.5;craftguide_giveme_99;99]"
 | 
					 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
			return { formspec = table.concat(fs) }
 | 
								return { formspec = table.concat(formspec) }
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								formspec[n] = stack_image_button(craftguideresultx, craftguidey, 1.2, 1.2,
 | 
				
			||||||
 | 
										"item_button_" .. rdir .. "_", ItemStack(craft.output))
 | 
				
			||||||
 | 
								n = n + 1
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		local craft_type = unified_inventory.registered_craft_types[craft.type] or
 | 
							local craft_type = ui.registered_craft_types[craft.type] or
 | 
				
			||||||
				unified_inventory.craft_type_defaults(craft.type, {})
 | 
									ui.craft_type_defaults(craft.type, {})
 | 
				
			||||||
		if craft_type.icon then
 | 
							if craft_type.icon then
 | 
				
			||||||
			fs[#fs + 1] = string.format("image[%f,%f;%f,%f;%s]",
 | 
								formspec[n] = string.format("image[%f,%f;%f,%f;%s]",
 | 
				
			||||||
					5.7, (formspecy + 0.05), 0.5, 0.5, craft_type.icon)
 | 
										craftguidearrowx+0.35, craftguidey, 0.5, 0.5, craft_type.icon)
 | 
				
			||||||
 | 
								n = n + 1
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		fs[#fs + 1] = "label[5.5,"..(formspecy + 1)..";" .. F(craft_type.description).."]"
 | 
							formspec[n] = string.format("label[%f,%f;%s]", craftguidearrowx + 0.15, craftguidey + 1.4, F(craft_type.description))
 | 
				
			||||||
		fs[#fs + 1] = stack_image_button(6.5, formspecy, 1.1, 1.1,
 | 
							n = n + 1
 | 
				
			||||||
				"item_button_usage_", ItemStack(craft.output))
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		local display_size = craft_type.dynamic_display_size
 | 
							local display_size = craft_type.dynamic_display_size
 | 
				
			||||||
				and craft_type.dynamic_display_size(craft)
 | 
									and craft_type.dynamic_display_size(craft)
 | 
				
			||||||
@@ -292,11 +315,12 @@ unified_inventory.register_page("craftguide", {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		-- This keeps recipes aligned to the right,
 | 
							-- This keeps recipes aligned to the right,
 | 
				
			||||||
		-- so that they're close to the arrow.
 | 
							-- so that they're close to the arrow.
 | 
				
			||||||
		local xoffset = 5.5
 | 
							local xoffset = craftguidex+3.75
 | 
				
			||||||
 | 
							local bspc = 1.25
 | 
				
			||||||
		-- Offset factor for crafting grids with side length > 4
 | 
							-- Offset factor for crafting grids with side length > 4
 | 
				
			||||||
		local of = (3/math.max(3, math.max(display_size.width, display_size.height)))
 | 
							local of = (3/math.max(3, math.max(display_size.width, display_size.height)))
 | 
				
			||||||
		local od = 0
 | 
							local od = 0
 | 
				
			||||||
		-- Minimum grid size at which size optimazation measures kick in
 | 
							-- Minimum grid size at which size optimization measures kick in
 | 
				
			||||||
		local mini_craft_size = 6
 | 
							local mini_craft_size = 6
 | 
				
			||||||
		if display_size.width >= mini_craft_size then
 | 
							if display_size.width >= mini_craft_size then
 | 
				
			||||||
			od = math.max(1, display_size.width - 2)
 | 
								od = math.max(1, display_size.width - 2)
 | 
				
			||||||
@@ -305,12 +329,12 @@ unified_inventory.register_page("craftguide", {
 | 
				
			|||||||
		-- Size modifier factor
 | 
							-- Size modifier factor
 | 
				
			||||||
		local sf = math.min(1, of * (1.05 + 0.05*od))
 | 
							local sf = math.min(1, of * (1.05 + 0.05*od))
 | 
				
			||||||
		-- Button size
 | 
							-- Button size
 | 
				
			||||||
		local bsize_h = 1.1 * sf
 | 
							local bsize = 1.2 * sf
 | 
				
			||||||
		local bsize_w = bsize_h
 | 
					
 | 
				
			||||||
		if display_size.width >= mini_craft_size then
 | 
							if display_size.width >= mini_craft_size then  -- it's not a normal 3x3 grid
 | 
				
			||||||
			bsize_w = 1.175 * sf
 | 
								bsize = 0.8 * sf
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		if (bsize_h > 0.35 and display_size.width) then
 | 
							if (bsize > 0.35 and display_size.width) then
 | 
				
			||||||
		for y = 1, display_size.height do
 | 
							for y = 1, display_size.height do
 | 
				
			||||||
		for x = 1, display_size.width do
 | 
							for x = 1, display_size.width do
 | 
				
			||||||
			local item
 | 
								local item
 | 
				
			||||||
@@ -320,48 +344,53 @@ unified_inventory.register_page("craftguide", {
 | 
				
			|||||||
			-- Flipped x, used to build formspec buttons from right to left
 | 
								-- Flipped x, used to build formspec buttons from right to left
 | 
				
			||||||
			local fx = display_size.width - (x-1)
 | 
								local fx = display_size.width - (x-1)
 | 
				
			||||||
			-- x offset, y offset
 | 
								-- x offset, y offset
 | 
				
			||||||
			local xof = (fx-1) * of + of
 | 
								local xof = ((fx-1) * of + of) * bspc
 | 
				
			||||||
			local yof = (y-1) * of + 1
 | 
								local yof = ((y-1) * of + 1) * bspc
 | 
				
			||||||
			if item then
 | 
								if item then
 | 
				
			||||||
				fs[#fs + 1] = stack_image_button(
 | 
									formspec[n] = stack_image_button(
 | 
				
			||||||
						xoffset - xof, formspecy - 1 + yof, bsize_w, bsize_h,
 | 
											xoffset - xof, craftguidey - 1.25 + yof, bsize, bsize,
 | 
				
			||||||
						"item_button_recipe_",
 | 
											"item_button_recipe_",
 | 
				
			||||||
						ItemStack(item))
 | 
											ItemStack(item))
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				-- Fake buttons just to make grid
 | 
									-- Fake buttons just to make grid
 | 
				
			||||||
				fs[#fs + 1] = string.format("image_button[%f,%f;%f,%f;ui_blank_image.png;;]",
 | 
									formspec[n] = string.format("image_button[%f,%f;%f,%f;ui_blank_image.png;;]",
 | 
				
			||||||
						xoffset - xof, formspecy - 1 + yof, bsize_w, bsize_h)
 | 
											xoffset - xof, craftguidey - 1.25 + yof, bsize, bsize)
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
 | 
								n = n + 1
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			-- Error
 | 
								-- Error
 | 
				
			||||||
			fs[#fs + 1] = string.format("label[2,%f;%s]",
 | 
								formspec[n] = string.format("label[2,%f;%s]",
 | 
				
			||||||
				formspecy, F(S("This recipe is too@nlarge to be displayed.")))
 | 
									craftguidey, F(S("This recipe is too@nlarge to be displayed.")))
 | 
				
			||||||
 | 
								n = n + 1
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if craft_type.uses_crafting_grid and display_size.width <= 3 then
 | 
							if craft_type.uses_crafting_grid and display_size.width <= 3 then
 | 
				
			||||||
			fs[#fs + 1] = "label[0," .. (formspecy + 0.9) .. ";" .. F(S("To craft grid:")) .. "]"
 | 
								formspec[n]   = "label["..(give_x+0.1)..","..    (craftguidey + 1.7) .. ";" .. F(S("To craft grid:")) .. "]"
 | 
				
			||||||
					.. "button[0,  " .. (formspecy + 1.5) .. ";0.6,0.5;craftguide_craft_1;1]"
 | 
								formspec[n+1] = "button["..  (give_x)..","..     (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_1;1]"
 | 
				
			||||||
					.. "button[0.6," .. (formspecy + 1.5) .. ";0.7,0.5;craftguide_craft_10;10]"
 | 
								formspec[n+2] = "button["..  (give_x+0.8)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_10;10]"
 | 
				
			||||||
					.. "button[1.3," .. (formspecy + 1.5) .. ";0.8,0.5;craftguide_craft_max;" .. F(S("All")) .. "]"
 | 
								formspec[n+3] = "button["..  (give_x+1.6)..",".. (craftguidey + 1.9) .. ";0.75,0.5;craftguide_craft_max;" .. F(S("All")) .. "]"
 | 
				
			||||||
 | 
								n = n + 4
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if has_give then
 | 
							if has_give then
 | 
				
			||||||
			fs[#fs + 1] = "label[0," .. (formspecy + 2.1) .. ";" .. F(S("Give me:")) .. "]"
 | 
								formspec[n] = giveme_form
 | 
				
			||||||
					.. "button[0,  " .. (formspecy + 2.7) .. ";0.6,0.5;craftguide_giveme_1;1]"
 | 
								n = n + 1
 | 
				
			||||||
					.. "button[0.6," .. (formspecy + 2.7) .. ";0.7,0.5;craftguide_giveme_10;10]"
 | 
					 | 
				
			||||||
					.. "button[1.3," .. (formspecy + 2.7) .. ";0.8,0.5;craftguide_giveme_99;99]"
 | 
					 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if alternates and alternates > 1 then
 | 
							if alternates and alternates > 1 then
 | 
				
			||||||
			fs[#fs + 1] = "label[5.5," .. (formspecy + 1.6) .. ";"
 | 
								formspec[n] = string.format("label[%f,%f;%s]",
 | 
				
			||||||
					.. F(S(recipe_text[dir], alternate, alternates)) .. "]"
 | 
											craftguidex+4, craftguidey + 2.3, F(S(recipe_text[dir], alternate, alternates)))
 | 
				
			||||||
					.. "image_button[5.5," .. (formspecy + 2) .. ";1,1;ui_left_icon.png;alternate_prev;]"
 | 
								formspec[n+1] = string.format("image_button[%f,%f;1.1,1.1;ui_left_icon.png;alternate_prev;]",
 | 
				
			||||||
					.. "image_button[6.5," .. (formspecy + 2) .. ";1,1;ui_right_icon.png;alternate;]"
 | 
											craftguidearrowx+0.2, craftguidey + 2.6)
 | 
				
			||||||
					.. "tooltip[alternate_prev;" .. F(prev_alt_text[dir]) .. "]"
 | 
								formspec[n+2] = string.format("image_button[%f,%f;1.1,1.1;ui_right_icon.png;alternate;]",
 | 
				
			||||||
					.. "tooltip[alternate;" .. F(next_alt_text[dir]) .. "]"
 | 
											craftguidearrowx+1.35, craftguidey + 2.6)
 | 
				
			||||||
 | 
								formspec[n+3] = "tooltip[alternate_prev;" .. F(prev_alt_text[dir]) .. "]"
 | 
				
			||||||
 | 
								formspec[n+4] = "tooltip[alternate;" .. F(next_alt_text[dir]) .. "]"
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		return { formspec = table.concat(fs) }
 | 
					
 | 
				
			||||||
 | 
							return { formspec = table.concat(formspec) }
 | 
				
			||||||
	end,
 | 
						end,
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -369,7 +398,7 @@ local function craftguide_giveme(player, formname, fields)
 | 
				
			|||||||
	local player_name = player:get_player_name()
 | 
						local player_name = player:get_player_name()
 | 
				
			||||||
	local player_privs = minetest.get_player_privs(player_name)
 | 
						local player_privs = minetest.get_player_privs(player_name)
 | 
				
			||||||
	if not player_privs.give and
 | 
						if not player_privs.give and
 | 
				
			||||||
			not unified_inventory.is_creative(player_name) then
 | 
								not ui.is_creative(player_name) then
 | 
				
			||||||
		minetest.log("action", "[unified_inventory] Denied give action to player " ..
 | 
							minetest.log("action", "[unified_inventory] Denied give action to player " ..
 | 
				
			||||||
			player_name)
 | 
								player_name)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
@@ -384,7 +413,7 @@ local function craftguide_giveme(player, formname, fields)
 | 
				
			|||||||
	amount = tonumber(amount) or 0
 | 
						amount = tonumber(amount) or 0
 | 
				
			||||||
	if amount == 0 then return end
 | 
						if amount == 0 then return end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local output = unified_inventory.current_item[player_name]
 | 
						local output = ui.current_item[player_name]
 | 
				
			||||||
	if (not output) or (output == "") then return end
 | 
						if (not output) or (output == "") then return end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local player_inv = player:get_inventory()
 | 
						local player_inv = player:get_inventory()
 | 
				
			||||||
@@ -405,21 +434,21 @@ local function craftguide_craft(player, formname, fields)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	local player_name = player:get_player_name()
 | 
						local player_name = player:get_player_name()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local output = unified_inventory.current_item[player_name] or ""
 | 
						local output = ui.current_item[player_name] or ""
 | 
				
			||||||
	if output == "" then return end
 | 
						if output == "" then return end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local crafts = unified_inventory.crafts_for[
 | 
						local crafts = ui.crafts_for[
 | 
				
			||||||
		unified_inventory.current_craft_direction[player_name]][output] or {}
 | 
							ui.current_craft_direction[player_name]][output] or {}
 | 
				
			||||||
	if #crafts == 0 then return end
 | 
						if #crafts == 0 then return end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local alternate = unified_inventory.alternate[player_name]
 | 
						local alternate = ui.alternate[player_name]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local craft = crafts[alternate]
 | 
						local craft = crafts[alternate]
 | 
				
			||||||
	if craft.width > 3 then return end
 | 
						if craft.width > 3 then return end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unified_inventory.craftguide_match_craft(player, "main", "craft", craft, amount)
 | 
						ui.craftguide_match_craft(player, "main", "craft", craft, amount)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unified_inventory.set_inventory_formspec(player, "craft")
 | 
						ui.set_inventory_formspec(player, "craft")
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
					minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,3 +9,6 @@ unified_inventory_bags (Enable bags) bool true
 | 
				
			|||||||
#If enabled, the trash slot can be used by those without both creative
 | 
					#If enabled, the trash slot can be used by those without both creative
 | 
				
			||||||
#and the give privilege.
 | 
					#and the give privilege.
 | 
				
			||||||
unified_inventory_trash (Enable trash) bool true
 | 
					unified_inventory_trash (Enable trash) bool true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unified_inventory_automatic_categorization (Items automatically added to categories) bool true
 | 
				
			||||||
| 
		 Before Width: | Height: | Size: 7.9 KiB  | 
| 
		 Before Width: | Height: | Size: 5.9 KiB  | 
| 
		 Before Width: | Height: | Size: 7.0 KiB  | 
| 
		 Before Width: | Height: | Size: 6.3 KiB  | 
| 
		 Before Width: | Height: | Size: 1.3 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								textures/ui_category_all.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								textures/ui_category_none.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.8 KiB  | 
| 
		 Before Width: | Height: | Size: 962 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/ui_crafting_arrow.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 788 B  | 
| 
		 Before Width: | Height: | Size: 2.3 KiB  | 
| 
		 Before Width: | Height: | Size: 1.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								textures/ui_formbg_9_sliced.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 240 B  | 
| 
		 Before Width: | Height: | Size: 4.0 KiB  | 
| 
		 Before Width: | Height: | Size: 5.2 KiB  | 
| 
		 Before Width: | Height: | Size: 629 B After Width: | Height: | Size: 648 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/ui_single_slot_bright.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.0 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								textures/ui_smallbg_9_sliced.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 139 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/ui_trash_slot_icon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 697 B  | 
| 
		 Before Width: | Height: | Size: 8.4 KiB  | 
| 
		 Before Width: | Height: | Size: 2.1 KiB  | 
							
								
								
									
										315
									
								
								waypoints.lua
									
									
									
									
									
								
							
							
						
						@@ -1,5 +1,7 @@
 | 
				
			|||||||
local S = minetest.get_translator("unified_inventory")
 | 
					local S = minetest.get_translator("unified_inventory")
 | 
				
			||||||
local F = minetest.formspec_escape
 | 
					local F = minetest.formspec_escape
 | 
				
			||||||
 | 
					local ui = unified_inventory
 | 
				
			||||||
 | 
					local COUNT = 5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local hud_colors = {
 | 
					local hud_colors = {
 | 
				
			||||||
	{"#FFFFFF", 0xFFFFFF, S("White")},
 | 
						{"#FFFFFF", 0xFFFFFF, S("White")},
 | 
				
			||||||
@@ -9,107 +11,199 @@ local hud_colors = {
 | 
				
			|||||||
	{"#2c4df1", 0x2c4df1, S("Blue")},
 | 
						{"#2c4df1", 0x2c4df1, S("Blue")},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local hud_colors_max = #hud_colors
 | 
					-- Storage compatibility code
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- Stores temporary player data (persists until player leaves)
 | 
					--[[
 | 
				
			||||||
 | 
					Stores temporary player data (persists until player leaves)
 | 
				
			||||||
 | 
						[player_name] = {
 | 
				
			||||||
 | 
							[<waypoint index>] = {
 | 
				
			||||||
 | 
								edit = <edit current waypoint?>,
 | 
				
			||||||
 | 
								hud = <hud ID>,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							[<waypoint index>] = { ... },
 | 
				
			||||||
 | 
							...
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					]]
 | 
				
			||||||
local waypoints_temp = {}
 | 
					local waypoints_temp = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_page("waypoints", {
 | 
					--[[
 | 
				
			||||||
 | 
					Datastorage format (per-player):
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							selected = <waypoint index>,
 | 
				
			||||||
 | 
							[<waypoint index>] = {
 | 
				
			||||||
 | 
								name = <name or nil>
 | 
				
			||||||
 | 
								world_pos = <coordinates vector>,
 | 
				
			||||||
 | 
								color = <"hud_colors" index>,
 | 
				
			||||||
 | 
								active = <hud show waypoint?>,
 | 
				
			||||||
 | 
								display_pos = <hud display coorinates?>,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							[<waypoint index>] = { ... },
 | 
				
			||||||
 | 
							...
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					Player metadata format:
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							selected = <selected number>,
 | 
				
			||||||
 | 
							-- Cannot mix integer/string keys in JSON
 | 
				
			||||||
 | 
							data = {
 | 
				
			||||||
 | 
								[<waypoint index>] = { same as above },
 | 
				
			||||||
 | 
								...
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local function set_waypoint_data(player, waypoints)
 | 
				
			||||||
 | 
						local meta = player:get_meta()
 | 
				
			||||||
 | 
						if not next(waypoints.data or {}) then
 | 
				
			||||||
 | 
							-- Empty data. Do not save anything, or delete
 | 
				
			||||||
 | 
							meta:set_string("ui_waypoints", "")
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							meta:set_string("ui_waypoints", minetest.write_json(waypoints))
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local function migrate_datastorage(player, waypoints)
 | 
				
			||||||
 | 
						-- Copy values from old table
 | 
				
			||||||
 | 
						local new_data = {
 | 
				
			||||||
 | 
							selected = waypoints.selected,
 | 
				
			||||||
 | 
							data = {}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for i = 1, COUNT do
 | 
				
			||||||
 | 
							new_data.data[i] = waypoints[i]
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						set_waypoint_data(player, new_data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						-- Delete values, but keep one entry so that it's saved by datastorage
 | 
				
			||||||
 | 
						for k, _ in pairs(waypoints) do
 | 
				
			||||||
 | 
							waypoints[k] = nil
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
						waypoints[1] = 1
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					local have_datastorage = minetest.get_modpath("datastorage") ~= nil
 | 
				
			||||||
 | 
					local function get_waypoint_data(player)
 | 
				
			||||||
 | 
						local player_name = player:get_player_name()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						-- Migration step
 | 
				
			||||||
 | 
						if have_datastorage then
 | 
				
			||||||
 | 
							local waypoints = datastorage.get(player_name, "waypoints")
 | 
				
			||||||
 | 
							if waypoints.selected then
 | 
				
			||||||
 | 
								migrate_datastorage(player, waypoints)
 | 
				
			||||||
 | 
								minetest.log("action", "[unified_inventory] " ..
 | 
				
			||||||
 | 
									"Migrated waypoints of player: " .. player_name)
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						-- Get directly from metadata
 | 
				
			||||||
 | 
						local waypoints = player:get_meta():get("ui_waypoints")
 | 
				
			||||||
 | 
						waypoints = waypoints and minetest.parse_json(waypoints) or {}
 | 
				
			||||||
 | 
						waypoints.data = waypoints.data or {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return waypoints
 | 
				
			||||||
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ui.register_page("waypoints", {
 | 
				
			||||||
	get_formspec = function(player)
 | 
						get_formspec = function(player)
 | 
				
			||||||
		local player_name = player:get_player_name()
 | 
							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
 | 
				
			||||||
 | 
							local wp_bottom_row = ui.style_full.std_inv_y - 1
 | 
				
			||||||
 | 
							local wp_buttons_rj = ui.style_full.std_inv_x + 10.1 - ui.style_full.btn_spc
 | 
				
			||||||
 | 
							local wp_edit_w = ui.style_full.btn_spc * 4 - 0.1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		-- build a "fake" temp entry if the server took too long
 | 
							local waypoints = get_waypoint_data(player)
 | 
				
			||||||
		-- during sign-on and returned an empty entry
 | 
							local sel = waypoints.selected or 1
 | 
				
			||||||
		if not waypoints_temp[player_name] then waypoints_temp[player_name] = {hud = 1} end
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		local waypoints = datastorage.get(player_name, "waypoints")
 | 
							local formspec = {
 | 
				
			||||||
		local formspec = "background[0,4.5;8,4;ui_main_inventory.png]" ..
 | 
								ui.style_full.standard_inv_bg,
 | 
				
			||||||
			"image[0,0;1,1;ui_waypoints_icon.png]" ..
 | 
								string.format("label[%f,%f;%s]",
 | 
				
			||||||
			"label[1,0;" .. F(S("Waypoints")) .. "]"
 | 
									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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		-- Tabs buttons:
 | 
							-- Tabs buttons:
 | 
				
			||||||
		for i = 1, 5, 1 do
 | 
							for i = 1, COUNT do
 | 
				
			||||||
			formspec = formspec ..
 | 
								local sw="select_waypoint"..i
 | 
				
			||||||
				"image_button[0.0," .. 0.2 + i * 0.7 .. ";.8,.8;" ..
 | 
								formspec[n] = string.format("image_button[%f,%f;%f,%f;%sui_%i_icon.png;%s;]",
 | 
				
			||||||
				(i == waypoints.selected and "ui_blue_icon_background.png^" or "") ..
 | 
									ui.style_full.main_button_x, wp_bottom_row - (5-i) * ui.style_full.btn_spc,
 | 
				
			||||||
				"ui_" .. i .. "_icon.png;" ..
 | 
									ui.style_full.btn_size, ui.style_full.btn_size,
 | 
				
			||||||
				"select_waypoint" .. i .. ";]" ..
 | 
									(i == sel) and "ui_blue_icon_background.png^" or "",
 | 
				
			||||||
				"tooltip[select_waypoint" .. i .. ";"
 | 
									i, sw)
 | 
				
			||||||
					.. S("Select Waypoint #@1", i).."]"
 | 
								formspec[n+1] = "tooltip["..sw..";"..S("Select Waypoint #@1", i).."]"
 | 
				
			||||||
 | 
								n = n + 2
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		local i = waypoints.selected or 1
 | 
							local waypoint = waypoints.data[sel] or {}
 | 
				
			||||||
		local waypoint = waypoints[i] or {}
 | 
							local temp = waypoints_temp[player_name][sel] or {}
 | 
				
			||||||
		local temp = waypoints_temp[player_name][i] or {}
 | 
							local default_name = S("Waypoint @1", sel)
 | 
				
			||||||
		local default_name = S("Waypoint @1", i)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		-- Main buttons:
 | 
							-- Main buttons:
 | 
				
			||||||
		formspec = formspec ..
 | 
							local btnlist = {
 | 
				
			||||||
			"image_button[4.5,3.7;.8,.8;"..
 | 
								set_waypoint = {
 | 
				
			||||||
			"ui_waypoint_set_icon.png;"..
 | 
									"ui_waypoint_set_icon.png",
 | 
				
			||||||
			"set_waypoint"..i..";]"..
 | 
									S("Set waypoint to current location")
 | 
				
			||||||
			"tooltip[set_waypoint" .. i .. ";"
 | 
								},
 | 
				
			||||||
				.. F(S("Set waypoint to current location")).."]"
 | 
								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 = {
 | 
				
			||||||
 | 
									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 = {
 | 
				
			||||||
 | 
									"ui_circular_arrows_icon.png",
 | 
				
			||||||
 | 
									S("Change color of waypoint display")
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								rename_waypoint = {
 | 
				
			||||||
 | 
									"ui_pencil_icon.png",
 | 
				
			||||||
 | 
									S("Edit waypoint name")
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		formspec = formspec ..
 | 
							local x = 4
 | 
				
			||||||
			"image_button[5.2,3.7;.8,.8;"..
 | 
							for name, def in pairs(btnlist) do
 | 
				
			||||||
			(waypoint.active and "ui_on_icon.png" or "ui_off_icon.png")..";"..
 | 
								formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s%i;]",
 | 
				
			||||||
			"toggle_waypoint"..i..";]"..
 | 
									wp_buttons_rj - ui.style_full.btn_spc * x, wp_bottom_row,
 | 
				
			||||||
			"tooltip[toggle_waypoint" .. i .. ";"
 | 
									ui.style_full.btn_size, ui.style_full.btn_size,
 | 
				
			||||||
				.. F(S("Make waypoint @1",
 | 
									def[1], name, sel)
 | 
				
			||||||
					waypoint.active and S("invisible") or S("visible"))).."]"
 | 
								formspec[n+1] = "tooltip["..name..sel..";"..F(def[2]).."]"
 | 
				
			||||||
 | 
								x = x - 1
 | 
				
			||||||
		formspec = formspec ..
 | 
								n = n + 2
 | 
				
			||||||
			"image_button[5.9,3.7;.8,.8;"..
 | 
							end
 | 
				
			||||||
			(waypoint.display_pos and "ui_green_icon_background.png" or "ui_red_icon_background.png").."^ui_xyz_icon.png;"..
 | 
					 | 
				
			||||||
			"toggle_display_pos" .. i .. ";]"..
 | 
					 | 
				
			||||||
			"tooltip[toggle_display_pos" .. i .. ";"
 | 
					 | 
				
			||||||
				.. F(S("@1 display of waypoint coordinates",
 | 
					 | 
				
			||||||
					waypoint.display_pos and S("Disable") or S("Enable"))) .."]"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		formspec = formspec ..
 | 
					 | 
				
			||||||
			"image_button[6.6,3.7;.8,.8;"..
 | 
					 | 
				
			||||||
			"ui_circular_arrows_icon.png;"..
 | 
					 | 
				
			||||||
			"toggle_color"..i..";]"..
 | 
					 | 
				
			||||||
			"tooltip[toggle_color" .. i .. ";"
 | 
					 | 
				
			||||||
				.. F(S("Change color of waypoint display")).."]"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		formspec = formspec ..
 | 
					 | 
				
			||||||
			"image_button[7.3,3.7;.8,.8;"..
 | 
					 | 
				
			||||||
			"ui_pencil_icon.png;"..
 | 
					 | 
				
			||||||
			"rename_waypoint"..i..";]"..
 | 
					 | 
				
			||||||
			"tooltip[rename_waypoint" .. i .. ";"
 | 
					 | 
				
			||||||
				.. F(S("Edit waypoint name")).."]"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		-- Waypoint's info:
 | 
							-- Waypoint's info:
 | 
				
			||||||
		if waypoint.active then
 | 
							formspec[n] = ("label[%f,%f;%s]"):format(
 | 
				
			||||||
			formspec = formspec .. 	"label[1,0.8;"..F(S("Waypoint active")).."]"
 | 
								wp_info_x, wp_info_y + 1.1,
 | 
				
			||||||
		else
 | 
								F(waypoint.active and S("Waypoint active") or S("Waypoint inactive"))
 | 
				
			||||||
			formspec = formspec .. 	"label[1,0.8;"..F(S("Waypoint inactive")).."]"
 | 
							)
 | 
				
			||||||
		end
 | 
							n = n + 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if temp.edit then
 | 
							if temp.edit then
 | 
				
			||||||
			formspec = formspec ..
 | 
								formspec[n] = string.format("field[%f,%f;%f,%f;rename_box%i;;%s]",
 | 
				
			||||||
				"field[1.3,3.2;6,.8;rename_box" .. i .. ";;"
 | 
									wp_buttons_rj - wp_edit_w - 0.1, wp_bottom_row - ui.style_full.btn_spc,
 | 
				
			||||||
				..(waypoint.name or default_name).."]" ..
 | 
									wp_edit_w, ui.style_full.btn_size, sel, (waypoint.name or default_name))
 | 
				
			||||||
				"image_button[7.3,2.9;.8,.8;"..
 | 
								formspec[n+1] = string.format("image_button[%f,%f;%f,%f;ui_ok_icon.png;confirm_rename%i;]",
 | 
				
			||||||
				"ui_ok_icon.png;"..
 | 
									wp_buttons_rj, wp_bottom_row - ui.style_full.btn_spc,
 | 
				
			||||||
				"confirm_rename"..i.. ";]"..
 | 
									ui.style_full.btn_size, ui.style_full.btn_size, sel)
 | 
				
			||||||
				"tooltip[confirm_rename" .. i .. ";"
 | 
								formspec[n+2] = "tooltip[confirm_rename"..sel..";"..F(S("Finish editing")).."]"
 | 
				
			||||||
					.. F(S("Finish editing")).."]"
 | 
								n = n + 3
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		formspec = formspec .. "label[1,1.3;"..F(S("World position"))..": " ..
 | 
							formspec[n] = string.format("label[%f,%f;%s: %s]",
 | 
				
			||||||
			minetest.pos_to_string(waypoint.world_pos or vector.new()) .. "]" ..
 | 
								wp_info_x, wp_info_y+1.6, F(S("World position")),
 | 
				
			||||||
			"label[1,1.8;"..F(S("Name"))..": ".. (waypoint.name or default_name) .. "]" ..
 | 
								minetest.pos_to_string(waypoint.world_pos or vector.new()))
 | 
				
			||||||
			"label[1,2.3;"..F(S("HUD text color"))..": " ..
 | 
							formspec[n+1] = string.format("label[%f,%f;%s: %s]",
 | 
				
			||||||
			hud_colors[waypoint.color or 1][3] .. "]"
 | 
								wp_info_x, wp_info_y+2.10, F(S("Name")), (waypoint.name or default_name))
 | 
				
			||||||
 | 
							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=formspec}
 | 
							return {formspec=table.concat(formspec)}
 | 
				
			||||||
	end,
 | 
						end,
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unified_inventory.register_button("waypoints", {
 | 
					ui.register_button("waypoints", {
 | 
				
			||||||
	type = "image",
 | 
						type = "image",
 | 
				
			||||||
	image = "ui_waypoints_icon.png",
 | 
						image = "ui_waypoints_icon.png",
 | 
				
			||||||
	tooltip = S("Waypoints"),
 | 
						tooltip = S("Waypoints"),
 | 
				
			||||||
@@ -117,10 +211,12 @@ unified_inventory.register_button("waypoints", {
 | 
				
			|||||||
})
 | 
					})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
local function update_hud(player, waypoints, temp, i)
 | 
					local function update_hud(player, waypoints, temp, i)
 | 
				
			||||||
	local waypoint = waypoints[i]
 | 
						local waypoint = waypoints.data[i]
 | 
				
			||||||
	if not waypoint then return end
 | 
						if not waypoint then return end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	temp[i] = temp[i] or {}
 | 
						temp[i] = temp[i] or {}
 | 
				
			||||||
	temp = temp[i]
 | 
						temp = temp[i]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local pos = waypoint.world_pos or vector.new()
 | 
						local pos = waypoint.world_pos or vector.new()
 | 
				
			||||||
	local name
 | 
						local name
 | 
				
			||||||
	if waypoint.display_pos then
 | 
						if waypoint.display_pos then
 | 
				
			||||||
@@ -129,10 +225,13 @@ local function update_hud(player, waypoints, temp, i)
 | 
				
			|||||||
			name = name..", "..waypoint.name
 | 
								name = name..", "..waypoint.name
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
	else
 | 
						else
 | 
				
			||||||
		name = waypoint.name or "Waypoint "..i
 | 
							name = waypoint.name or S("Waypoint @1", i)
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						-- Perform HUD updates
 | 
				
			||||||
	if temp.hud then
 | 
						if temp.hud then
 | 
				
			||||||
		player:hud_remove(temp.hud)
 | 
							player:hud_remove(temp.hud)
 | 
				
			||||||
 | 
							temp.hud = nil
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	if waypoint.active then
 | 
						if waypoint.active then
 | 
				
			||||||
		temp.hud = player:hud_add({
 | 
							temp.hud = player:hud_add({
 | 
				
			||||||
@@ -142,8 +241,6 @@ local function update_hud(player, waypoints, temp, i)
 | 
				
			|||||||
			text = "m",
 | 
								text = "m",
 | 
				
			||||||
			world_pos = pos
 | 
								world_pos = pos
 | 
				
			||||||
		})
 | 
							})
 | 
				
			||||||
	else
 | 
					 | 
				
			||||||
		temp.hud = nil
 | 
					 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -155,9 +252,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
				
			|||||||
	local need_update_hud = false
 | 
						local need_update_hud = false
 | 
				
			||||||
	local hit = false
 | 
						local hit = false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local waypoints = datastorage.get(player_name, "waypoints")
 | 
						local waypoints = get_waypoint_data(player)
 | 
				
			||||||
	local temp = waypoints_temp[player_name]
 | 
						local temp = waypoints_temp[player_name]
 | 
				
			||||||
	for i = 1, 5, 1 do
 | 
						for i = 1, COUNT do
 | 
				
			||||||
 | 
							local waypoint = waypoints.data[i] or {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if fields["select_waypoint"..i] then
 | 
							if fields["select_waypoint"..i] then
 | 
				
			||||||
			hit = true
 | 
								hit = true
 | 
				
			||||||
			waypoints.selected = i
 | 
								waypoints.selected = i
 | 
				
			||||||
@@ -166,20 +265,15 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		if fields["toggle_waypoint"..i] then
 | 
							if fields["toggle_waypoint"..i] then
 | 
				
			||||||
			hit = true
 | 
								hit = true
 | 
				
			||||||
			waypoints[i] = waypoints[i] or {}
 | 
								waypoint.active = not (waypoint.active)
 | 
				
			||||||
			waypoints[i].active = not (waypoints[i].active)
 | 
					 | 
				
			||||||
			need_update_hud = true
 | 
								need_update_hud = true
 | 
				
			||||||
			update_formspec = true
 | 
								update_formspec = true
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if fields["set_waypoint"..i] then
 | 
							if fields["set_waypoint"..i] then
 | 
				
			||||||
			hit = true
 | 
								hit = true
 | 
				
			||||||
			local pos = player:get_pos()
 | 
								local pos = vector.round(player:get_pos())
 | 
				
			||||||
			pos.x = math.floor(pos.x)
 | 
								waypoint.world_pos = pos
 | 
				
			||||||
			pos.y = math.floor(pos.y)
 | 
					 | 
				
			||||||
			pos.z = math.floor(pos.z)
 | 
					 | 
				
			||||||
			waypoints[i] = waypoints[i] or {}
 | 
					 | 
				
			||||||
			waypoints[i].world_pos = pos
 | 
					 | 
				
			||||||
			need_update_hud = true
 | 
								need_update_hud = true
 | 
				
			||||||
			update_formspec = true
 | 
								update_formspec = true
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
@@ -193,51 +287,58 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		if fields["toggle_display_pos"..i] then
 | 
							if fields["toggle_display_pos"..i] then
 | 
				
			||||||
			hit = true
 | 
								hit = true
 | 
				
			||||||
			waypoints[i] = waypoints[i] or {}
 | 
								waypoint.display_pos = not waypoint.display_pos
 | 
				
			||||||
			waypoints[i].display_pos = not waypoints[i].display_pos
 | 
					 | 
				
			||||||
			need_update_hud = true
 | 
								need_update_hud = true
 | 
				
			||||||
			update_formspec = true
 | 
								update_formspec = true
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if fields["toggle_color"..i] then
 | 
							if fields["toggle_color"..i] then
 | 
				
			||||||
			hit = true
 | 
								hit = true
 | 
				
			||||||
			waypoints[i] = waypoints[i] or {}
 | 
								local color = waypoint.color or 0
 | 
				
			||||||
			local color = waypoints[i].color or 1
 | 
					 | 
				
			||||||
			color = color + 1
 | 
								color = color + 1
 | 
				
			||||||
			if color > hud_colors_max then
 | 
								if color > #hud_colors then
 | 
				
			||||||
				color = 1
 | 
									color = 1
 | 
				
			||||||
			end
 | 
								end
 | 
				
			||||||
			waypoints[i].color = color
 | 
								waypoint.color = color
 | 
				
			||||||
			need_update_hud = true
 | 
								need_update_hud = true
 | 
				
			||||||
			update_formspec = true
 | 
								update_formspec = true
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if fields["confirm_rename"..i] then
 | 
							if fields["confirm_rename"..i] then
 | 
				
			||||||
			hit = true
 | 
								hit = true
 | 
				
			||||||
			waypoints[i] = waypoints[i] or {}
 | 
								temp[i] = temp[i] or {}
 | 
				
			||||||
			temp[i].edit = false
 | 
								temp[i].edit = false
 | 
				
			||||||
			waypoints[i].name = fields["rename_box"..i]
 | 
								waypoint.name = fields["rename_box"..i]
 | 
				
			||||||
			need_update_hud = true
 | 
								need_update_hud = true
 | 
				
			||||||
			update_formspec = true
 | 
								update_formspec = true
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if hit then
 | 
				
			||||||
 | 
								-- Save first
 | 
				
			||||||
 | 
								waypoints.data[i] = waypoint
 | 
				
			||||||
 | 
								set_waypoint_data(player, waypoints)
 | 
				
			||||||
 | 
							end
 | 
				
			||||||
 | 
							-- Update after
 | 
				
			||||||
		if need_update_hud then
 | 
							if need_update_hud then
 | 
				
			||||||
			update_hud(player, waypoints, temp, i)
 | 
								update_hud(player, waypoints, temp, i)
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
		if update_formspec then
 | 
							if update_formspec then
 | 
				
			||||||
			unified_inventory.set_inventory_formspec(player, "waypoints")
 | 
								ui.set_inventory_formspec(player, "waypoints")
 | 
				
			||||||
		end
 | 
							end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if hit then return end
 | 
							if hit then return end
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
end)
 | 
					end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- waypoints_temp must be initialized before the general unified_inventory
 | 
				
			||||||
minetest.register_on_joinplayer(function(player)
 | 
					-- joinplayer callback is run for updating the inventory
 | 
				
			||||||
 | 
					table.insert(minetest.registered_on_joinplayers, 1, function(player)
 | 
				
			||||||
	local player_name = player:get_player_name()
 | 
						local player_name = player:get_player_name()
 | 
				
			||||||
	local waypoints = datastorage.get(player_name, "waypoints")
 | 
						local waypoints = get_waypoint_data(player)
 | 
				
			||||||
	local temp = {}
 | 
					
 | 
				
			||||||
	waypoints_temp[player_name] = temp
 | 
						waypoints_temp[player_name] = {}
 | 
				
			||||||
	for i = 1, 5 do
 | 
						for i = 1, COUNT do
 | 
				
			||||||
		update_hud(player, waypoints, temp, i)
 | 
							update_hud(player, waypoints, waypoints_temp[player_name], i)
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
end)
 | 
					end)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||