forked from minetest-mods/unified_inventory
		
	Compare commits
	
		
			34 Commits
		
	
	
		
			03b077cd1b
			...
			match_copy
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					88b3033477 | ||
| 
						 | 
					19e14aa21e | ||
| 
						 | 
					82cdf24045 | ||
| 
						 | 
					31c35dcd59 | ||
| 
						 | 
					826d5f4683 | ||
| 
						 | 
					db1c3c10b8 | ||
| 
						 | 
					9533200e25 | ||
| 
						 | 
					177debd13c | ||
| 
						 | 
					8e9ea34ae8 | ||
| 
						 | 
					574de91971 | ||
| 
						 | 
					fc562ecaa0 | ||
| 
						 | 
					182ab493c3 | ||
| 
						 | 
					14da1a3dd0 | ||
| 
						 | 
					fa079c31b6 | ||
| 
						 | 
					c1fef26c87 | ||
| 
						 | 
					477acd2f89 | ||
| 
						 | 
					19efce45ed | ||
| 
						 | 
					dbe06be68b | ||
| 
						 | 
					3074d625e2 | ||
| 
						 | 
					5ac2558da4 | ||
| 
						 | 
					25c40fea6c | ||
| 
						 | 
					23a45b8131 | ||
| 
						 | 
					d6688872c8 | ||
| 
						 | 
					64b0248c77 | ||
| 
						 | 
					28a5d4db49 | ||
| 
						 | 
					8c84751ff8 | ||
| 
						 | 
					b1c85a2cb8 | ||
| 
						 | 
					3fffa41eaf | ||
| 
						 | 
					077bed90eb | ||
| 
						 | 
					6d123da61c | ||
| 
						 | 
					d39dd78cb5 | ||
| 
						 | 
					aeb9841e3a | ||
| 
						 | 
					afd38e0c73 | ||
| 
						 | 
					4d4355a741 | 
@@ -15,7 +15,8 @@ Unified Inventory replaces the default survival and creative inventory.
 | 
			
		||||
    * Recipe search function by ingredients
 | 
			
		||||
 * Up to four bags with up to 24 slots each
 | 
			
		||||
 * 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
 | 
			
		||||
    * `minetest.conf` setting `unified_inventory_lite = true`
 | 
			
		||||
 * Mod API for modders: see [mod_api.txt](doc/mod_api.txt)
 | 
			
		||||
@@ -25,6 +26,10 @@ Unified Inventory replaces the default survival and creative inventory.
 | 
			
		||||
## Requirements
 | 
			
		||||
 | 
			
		||||
 * 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
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										163
									
								
								api.lua
									
									
									
									
									
								
							
							
						
						
									
										163
									
								
								api.lua
									
									
									
									
									
								
							@@ -2,40 +2,49 @@ local S = minetest.get_translator("unified_inventory")
 | 
			
		||||
local F = minetest.formspec_escape
 | 
			
		||||
local ui = unified_inventory
 | 
			
		||||
 | 
			
		||||
local function is_recipe_craftable(recipe)
 | 
			
		||||
	-- Ensure the ingedients exist
 | 
			
		||||
	for _, itemname in pairs(recipe.items) do
 | 
			
		||||
		local groups = string.find(itemname, "group:")
 | 
			
		||||
		if groups then
 | 
			
		||||
			if not ui.get_group_item(string.sub(groups, 8)).item then
 | 
			
		||||
				return false
 | 
			
		||||
			end
 | 
			
		||||
		else
 | 
			
		||||
			-- Possibly an item
 | 
			
		||||
			if not minetest.registered_items[itemname]
 | 
			
		||||
					or minetest.get_item_group(itemname, "not_in_craft_guide") ~= 0 then
 | 
			
		||||
				return false
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	return true
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Create detached creative inventory after loading all mods
 | 
			
		||||
minetest.after(0.01, function()
 | 
			
		||||
	local rev_aliases = {}
 | 
			
		||||
	for source, target in pairs(minetest.registered_aliases) do
 | 
			
		||||
		if not rev_aliases[target] then rev_aliases[target] = {} end
 | 
			
		||||
		table.insert(rev_aliases[target], source)
 | 
			
		||||
	for original, newname in pairs(minetest.registered_aliases) do
 | 
			
		||||
		if not rev_aliases[newname] then
 | 
			
		||||
			rev_aliases[newname] = {}
 | 
			
		||||
		end
 | 
			
		||||
		table.insert(rev_aliases[newname], original)
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- Filtered item list
 | 
			
		||||
	ui.items_list = {}
 | 
			
		||||
	for name, def in pairs(minetest.registered_items) do
 | 
			
		||||
		if (not def.groups.not_in_creative_inventory or
 | 
			
		||||
		   def.groups.not_in_creative_inventory == 0) and
 | 
			
		||||
		   def.description and def.description ~= "" then
 | 
			
		||||
		if ui.is_itemdef_listable(def) then
 | 
			
		||||
			table.insert(ui.items_list, name)
 | 
			
		||||
 | 
			
		||||
			-- Alias processing: Find recipes that belong to the current item name
 | 
			
		||||
			local all_names = rev_aliases[name] or {}
 | 
			
		||||
			table.insert(all_names, name)
 | 
			
		||||
			for _, player_name in ipairs(all_names) do
 | 
			
		||||
				local recipes = minetest.get_all_craft_recipes(player_name)
 | 
			
		||||
				if recipes then
 | 
			
		||||
					for _, recipe in ipairs(recipes) do
 | 
			
		||||
 | 
			
		||||
						local unknowns
 | 
			
		||||
 | 
			
		||||
						for _,chk in pairs(recipe.items) do
 | 
			
		||||
							local groupchk = string.find(chk, "group:")
 | 
			
		||||
							if (not groupchk and not minetest.registered_items[chk])
 | 
			
		||||
							  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
 | 
			
		||||
								unknowns = true
 | 
			
		||||
							end
 | 
			
		||||
						end
 | 
			
		||||
 | 
			
		||||
						if not unknowns then
 | 
			
		||||
							ui.register_craft(recipe)
 | 
			
		||||
						end
 | 
			
		||||
			for _, itemname in ipairs(all_names) do
 | 
			
		||||
				local recipes = minetest.get_all_craft_recipes(itemname)
 | 
			
		||||
				for _, recipe in ipairs(recipes or {}) do
 | 
			
		||||
					if is_recipe_craftable(recipe) then
 | 
			
		||||
						ui.register_craft(recipe)
 | 
			
		||||
					end
 | 
			
		||||
				end
 | 
			
		||||
			end
 | 
			
		||||
@@ -43,7 +52,9 @@ minetest.after(0.01, function()
 | 
			
		||||
	end
 | 
			
		||||
	table.sort(ui.items_list)
 | 
			
		||||
	ui.items_list_size = #ui.items_list
 | 
			
		||||
	print("Unified Inventory. inventory size: "..ui.items_list_size)
 | 
			
		||||
	print("Unified Inventory. Inventory size: "..ui.items_list_size)
 | 
			
		||||
 | 
			
		||||
	-- Analyse dropped items -> custom "digging" recipes
 | 
			
		||||
	for _, name in ipairs(ui.items_list) do
 | 
			
		||||
		local def = minetest.registered_items[name]
 | 
			
		||||
		-- Simple drops
 | 
			
		||||
@@ -133,29 +144,51 @@ minetest.after(0.01, function()
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	for _, recipes in pairs(ui.crafts_for.recipe) do
 | 
			
		||||
 | 
			
		||||
	-- Step 1: Initialize cache for looking up groups
 | 
			
		||||
	unified_inventory.init_matching_cache()
 | 
			
		||||
 | 
			
		||||
	-- Step 2: Find all matching items for the given spec (groups)
 | 
			
		||||
	local get_matching_spec_items = unified_inventory.get_matching_items
 | 
			
		||||
 | 
			
		||||
	for outputitemname, recipes in pairs(ui.crafts_for.recipe) do
 | 
			
		||||
		-- List of crafts that return this item string (variable "_")
 | 
			
		||||
 | 
			
		||||
		-- Problem: The group cache must be initialized after all mods finished loading
 | 
			
		||||
		-- thus, invalid recipes might be indexed. Hence perform filtering with `new_recipe_list`
 | 
			
		||||
		local new_recipe_list = {}
 | 
			
		||||
		for _, recipe in ipairs(recipes) do
 | 
			
		||||
			local ingredient_items = {}
 | 
			
		||||
			for _, spec in pairs(recipe.items) do
 | 
			
		||||
				local matches_spec = ui.canonical_item_spec_matcher(spec)
 | 
			
		||||
				for _, name in ipairs(ui.items_list) do
 | 
			
		||||
					if matches_spec(name) then
 | 
			
		||||
						ingredient_items[name] = true
 | 
			
		||||
					end
 | 
			
		||||
				-- Get items that fit into this spec (group or item name)
 | 
			
		||||
				local specname = ItemStack(spec):get_name()
 | 
			
		||||
				for item_name, _ in pairs(get_matching_spec_items(specname)) do
 | 
			
		||||
					ingredient_items[item_name] = true
 | 
			
		||||
				end
 | 
			
		||||
			end
 | 
			
		||||
			for name, _ in pairs(ingredient_items) do
 | 
			
		||||
				if ui.crafts_for.usage[name] == nil then
 | 
			
		||||
				if not ui.crafts_for.usage[name] then
 | 
			
		||||
					ui.crafts_for.usage[name] = {}
 | 
			
		||||
				end
 | 
			
		||||
				table.insert(ui.crafts_for.usage[name], recipe)
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			if next(ingredient_items) then
 | 
			
		||||
				-- There's at least one known ingredient: mark as good recipe
 | 
			
		||||
				-- PS: What whatll be done about partially incomplete recipes?
 | 
			
		||||
				table.insert(new_recipe_list, recipe)
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
		ui.crafts_for.recipe[outputitemname] = new_recipe_list
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	for _, callback in ipairs(ui.initialized_callbacks) do
 | 
			
		||||
		callback()
 | 
			
		||||
	end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
---------------- Home API ----------------
 | 
			
		||||
 | 
			
		||||
-- load_home
 | 
			
		||||
local function load_home()
 | 
			
		||||
	local input = io.open(ui.home_filename, "r")
 | 
			
		||||
	if not input then
 | 
			
		||||
@@ -172,13 +205,20 @@ local function load_home()
 | 
			
		||||
	end
 | 
			
		||||
	io.close(input)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
load_home()
 | 
			
		||||
 | 
			
		||||
function ui.set_home(player, pos)
 | 
			
		||||
	local player_name = player:get_player_name()
 | 
			
		||||
	ui.home_pos[player_name] = vector.round(pos)
 | 
			
		||||
 | 
			
		||||
	-- save the home data from the table to the file
 | 
			
		||||
	local output = io.open(ui.home_filename, "w")
 | 
			
		||||
	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")
 | 
			
		||||
	end
 | 
			
		||||
@@ -194,7 +234,8 @@ function ui.go_home(player)
 | 
			
		||||
	return false
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- register_craft
 | 
			
		||||
---------------- Crafting API ----------------
 | 
			
		||||
 | 
			
		||||
function ui.register_craft(options)
 | 
			
		||||
	if not options.output then
 | 
			
		||||
		return
 | 
			
		||||
@@ -206,12 +247,16 @@ function ui.register_craft(options)
 | 
			
		||||
	if options.type == "normal" and options.width == 0 then
 | 
			
		||||
		options = { type = "shapeless", items = options.items, output = options.output, width = 0 }
 | 
			
		||||
	end
 | 
			
		||||
	if not ui.crafts_for.recipe[itemstack:get_name()] then
 | 
			
		||||
		ui.crafts_for.recipe[itemstack:get_name()] = {}
 | 
			
		||||
	local item_name = 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[itemstack:get_name()],options)
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
local craft_type_defaults = {
 | 
			
		||||
	width = 3,
 | 
			
		||||
@@ -219,7 +264,6 @@ local craft_type_defaults = {
 | 
			
		||||
	uses_crafting_grid = false,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function ui.craft_type_defaults(name, options)
 | 
			
		||||
	if not options.description then
 | 
			
		||||
		options.description = name
 | 
			
		||||
@@ -230,8 +274,7 @@ end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function ui.register_craft_type(name, options)
 | 
			
		||||
	ui.registered_craft_types[name] =
 | 
			
		||||
			ui.craft_type_defaults(name, options)
 | 
			
		||||
	ui.registered_craft_types[name] = ui.craft_type_defaults(name, options)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -288,6 +331,8 @@ ui.register_craft_type("digging_chance", {
 | 
			
		||||
	height = 1,
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
---------------- GUI registrations ----------------
 | 
			
		||||
 | 
			
		||||
function ui.register_page(name, def)
 | 
			
		||||
	ui.pages[name] = def
 | 
			
		||||
end
 | 
			
		||||
@@ -303,11 +348,45 @@ function ui.register_button(name, def)
 | 
			
		||||
	table.insert(ui.buttons, def)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
---------------- Callback registrations ----------------
 | 
			
		||||
 | 
			
		||||
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 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
 | 
			
		||||
 | 
			
		||||
---------------- List getters ----------------
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
---------------- Player utilities ----------------
 | 
			
		||||
 | 
			
		||||
function ui.is_creative(playername)
 | 
			
		||||
	return minetest.check_player_privs(playername, {creative=true})
 | 
			
		||||
		or minetest.settings:get_bool("creative_mode")
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
---------------- Formspec helpers ----------------
 | 
			
		||||
 | 
			
		||||
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 "") )
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										71
									
								
								bags.lua
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								bags.lua
									
									
									
									
									
								
							@@ -114,6 +114,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
			
		||||
	end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
-- Player slots are preserved when unified_inventory is disabled. Do not allow modification.
 | 
			
		||||
-- Fix: use a detached inventory and store the data separately.
 | 
			
		||||
local function save_bags_metadata(player, bags_inv)
 | 
			
		||||
	local is_empty = true
 | 
			
		||||
	local bags = {}
 | 
			
		||||
@@ -163,7 +165,7 @@ local function load_bags_metadata(player, bags_inv)
 | 
			
		||||
		save_bags_metadata(player, bags_inv)
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- Clean up deprecated garbage after saving
 | 
			
		||||
	-- Legacy: Clean up old player lists
 | 
			
		||||
	for i = 1, 4 do
 | 
			
		||||
		local bag = "bag" .. i
 | 
			
		||||
		player_inv:set_size(bag, 0)
 | 
			
		||||
@@ -172,46 +174,29 @@ end
 | 
			
		||||
 | 
			
		||||
minetest.register_on_joinplayer(function(player)
 | 
			
		||||
	local player_name = player:get_player_name()
 | 
			
		||||
	local bags_inv = minetest.create_detached_inventory(player_name .. "_bags",{
 | 
			
		||||
	local bags_inv = minetest.create_detached_inventory(player_name .. "_bags", {
 | 
			
		||||
		allow_put = function(inv, listname, index, stack, player)
 | 
			
		||||
			local new_slots = stack:get_definition().groups.bagslots
 | 
			
		||||
			if not new_slots then
 | 
			
		||||
				return 0 -- ItemStack is not a bag.
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			-- The execution order of `allow_put`/`allow_take` is not defined.
 | 
			
		||||
			-- We do not know the replacement ItemStack if the items are swapped.
 | 
			
		||||
			-- Hence, bag slot upgrades and downgrades are not possible with the
 | 
			
		||||
			-- current API.
 | 
			
		||||
 | 
			
		||||
			if not player:get_inventory():is_empty(listname .. "contents") then
 | 
			
		||||
				-- Legacy: in case `allow_take` is not executed on old Minetest versions.
 | 
			
		||||
				return 0
 | 
			
		||||
			end
 | 
			
		||||
			return 1
 | 
			
		||||
		end,
 | 
			
		||||
		on_put = function(inv, listname, index, stack, player)
 | 
			
		||||
			player:get_inventory():set_size(listname .. "contents",
 | 
			
		||||
					stack:get_definition().groups.bagslots)
 | 
			
		||||
			save_bags_metadata(player, inv)
 | 
			
		||||
		end,
 | 
			
		||||
		allow_put = function(inv, listname, index, stack, player)
 | 
			
		||||
			local new_slots = stack:get_definition().groups.bagslots
 | 
			
		||||
			if not new_slots then
 | 
			
		||||
				return 0
 | 
			
		||||
			end
 | 
			
		||||
			local player_inv = player:get_inventory()
 | 
			
		||||
			local old_slots = player_inv:get_size(listname .. "contents")
 | 
			
		||||
 | 
			
		||||
			if new_slots >= old_slots then
 | 
			
		||||
				return 1
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			-- using a smaller bag, make sure it fits
 | 
			
		||||
			local old_list = player_inv:get_list(listname .. "contents")
 | 
			
		||||
			local new_list = {}
 | 
			
		||||
			local slots_used = 0
 | 
			
		||||
			local use_new_list = false
 | 
			
		||||
 | 
			
		||||
			for i, v in ipairs(old_list) do
 | 
			
		||||
				if v and not v:is_empty() then
 | 
			
		||||
					slots_used = slots_used + 1
 | 
			
		||||
					use_new_list = i > new_slots
 | 
			
		||||
					new_list[slots_used] = v
 | 
			
		||||
				end
 | 
			
		||||
			end
 | 
			
		||||
			if new_slots >= slots_used then
 | 
			
		||||
				if use_new_list then
 | 
			
		||||
					player_inv:set_list(listname .. "contents", new_list)
 | 
			
		||||
				end
 | 
			
		||||
				return 1
 | 
			
		||||
			end
 | 
			
		||||
			-- New bag is smaller: Disallow inserting
 | 
			
		||||
			return 0
 | 
			
		||||
		end,
 | 
			
		||||
		allow_take = function(inv, listname, index, stack, player)
 | 
			
		||||
			if player:get_inventory():is_empty(listname .. "contents") then
 | 
			
		||||
				return stack:get_count()
 | 
			
		||||
@@ -230,6 +215,20 @@ minetest.register_on_joinplayer(function(player)
 | 
			
		||||
	load_bags_metadata(player, bags_inv)
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
minetest.register_allow_player_inventory_action(function(player, action, inventory, info)
 | 
			
		||||
	-- From detached inventory -> player inventory: put & take callbacks
 | 
			
		||||
	if action ~= "put" or not info.listname:find("bag%dcontents") then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	if info.stack:get_definition().groups.bagslots then
 | 
			
		||||
		-- Problem 1: empty bags could be moved into their own slots
 | 
			
		||||
		-- Problem 2: cannot reliably keep track of ItemStack ownership due to
 | 
			
		||||
		--> Disallow all external bag movements into this list
 | 
			
		||||
		return 0
 | 
			
		||||
	end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
-- register bag tools
 | 
			
		||||
minetest.register_tool("unified_inventory:bag_small", {
 | 
			
		||||
	description = S("Small Bag"),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,5 @@
 | 
			
		||||
local ui = unified_inventory
 | 
			
		||||
 | 
			
		||||
local function default_refill(stack)
 | 
			
		||||
	stack:set_count(stack:get_stack_max())
 | 
			
		||||
	local itemdef = minetest.registered_items[stack:get_name()]
 | 
			
		||||
@@ -12,20 +14,17 @@ end
 | 
			
		||||
minetest.register_on_joinplayer(function(player)
 | 
			
		||||
	local player_name = player:get_player_name()
 | 
			
		||||
	unified_inventory.players[player_name] = {}
 | 
			
		||||
	unified_inventory.current_index[player_name] = 1
 | 
			
		||||
	unified_inventory.current_index[player_name] = 1 -- Item (~page) index
 | 
			
		||||
	unified_inventory.filtered_items_list[player_name] =
 | 
			
		||||
	unified_inventory.items_list
 | 
			
		||||
		unified_inventory.items_list
 | 
			
		||||
	unified_inventory.activefilter[player_name] = ""
 | 
			
		||||
	unified_inventory.active_search_direction[player_name] = "nochange"
 | 
			
		||||
	unified_inventory.apply_filter(player, "", "nochange")
 | 
			
		||||
	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.current_item[player_name] = nil
 | 
			
		||||
	unified_inventory.current_craft_direction[player_name] = "recipe"
 | 
			
		||||
	unified_inventory.set_inventory_formspec(player,
 | 
			
		||||
	unified_inventory.default)
 | 
			
		||||
 | 
			
		||||
	-- Refill slot
 | 
			
		||||
	local refill = minetest.create_detached_inventory(player_name.."refill", {
 | 
			
		||||
@@ -47,13 +46,21 @@ minetest.register_on_joinplayer(function(player)
 | 
			
		||||
	refill:set_size("main", 1)
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
minetest.register_on_mods_loaded(function()
 | 
			
		||||
       minetest.register_on_joinplayer(function(player)
 | 
			
		||||
               -- After everything is initialized, set up the formspec
 | 
			
		||||
               ui.apply_filter(player, "", "nochange")
 | 
			
		||||
               ui.set_inventory_formspec(player, unified_inventory.default)
 | 
			
		||||
       end)
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
local function apply_new_filter(player, search_text, new_dir)
 | 
			
		||||
	local player_name = player:get_player_name()
 | 
			
		||||
 | 
			
		||||
	minetest.sound_play("click", {to_player=player_name, gain = 0.1})
 | 
			
		||||
	unified_inventory.apply_filter(player, search_text, new_dir)
 | 
			
		||||
	unified_inventory.current_searchbox[player_name] = search_text
 | 
			
		||||
	unified_inventory.set_inventory_formspec(player,
 | 
			
		||||
			unified_inventory.current_page[player_name])
 | 
			
		||||
	ui.apply_filter(player, search_text, new_dir)
 | 
			
		||||
	ui.current_searchbox[player_name] = search_text
 | 
			
		||||
	ui.set_inventory_formspec(player, ui.current_page[player_name])
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
			
		||||
@@ -66,9 +73,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- always take new search text, even if not searching on it yet
 | 
			
		||||
	local dirty_search_filter = false
 | 
			
		||||
 | 
			
		||||
	if fields.searchbox
 | 
			
		||||
	and fields.searchbox ~= unified_inventory.current_searchbox[player_name] then
 | 
			
		||||
		unified_inventory.current_searchbox[player_name] = fields.searchbox
 | 
			
		||||
		dirty_search_filter = true
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -89,19 +99,14 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
			
		||||
				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,
 | 
			
		||||
	if fields.next_category or fields.prev_category then
 | 
			
		||||
		local step = fields.next_category and 1 or -1
 | 
			
		||||
		local scroll_old = ui.current_category_scroll[player_name]
 | 
			
		||||
		local scroll_new = math.max(0, math.min(#ui.category_list - ui_peruser.pagecols, scroll_old + step))
 | 
			
		||||
 | 
			
		||||
		if scroll_old ~= scroll_new then
 | 
			
		||||
			ui.current_category_scroll[player_name] = scroll_new
 | 
			
		||||
			ui.set_inventory_formspec(player,
 | 
			
		||||
					unified_inventory.current_page[player_name])
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
@@ -158,7 +163,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
			
		||||
	-- Check clicked item image button
 | 
			
		||||
	local clicked_item
 | 
			
		||||
	for name, value in pairs(fields) do
 | 
			
		||||
		local new_dir, mangled_item = string.match(name, "^item_button_([a-z]+)_(.*)$")
 | 
			
		||||
		local new_dir, mangled_item = string.match(name, "^[0-9]*_?item_button_([a-z]+)_(.*)$")
 | 
			
		||||
		if new_dir and mangled_item then
 | 
			
		||||
			clicked_item = unified_inventory.demangle_for_formspec(mangled_item)
 | 
			
		||||
			if string.sub(clicked_item, 1, 6) == "group:" then
 | 
			
		||||
@@ -198,13 +203,16 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
			
		||||
 | 
			
		||||
	if fields.searchbutton
 | 
			
		||||
			or fields.key_enter_field == "searchbox" then
 | 
			
		||||
		unified_inventory.apply_filter(player, unified_inventory.current_searchbox[player_name], "nochange")
 | 
			
		||||
		unified_inventory.set_inventory_formspec(player,
 | 
			
		||||
				unified_inventory.current_page[player_name])
 | 
			
		||||
		minetest.sound_play("paperflip2",
 | 
			
		||||
				{to_player=player_name, gain = 1.0})
 | 
			
		||||
		if dirty_search_filter then
 | 
			
		||||
			ui.apply_filter(player, ui.current_searchbox[player_name], "nochange")
 | 
			
		||||
			ui.set_inventory_formspec(player, ui.current_page[player_name])
 | 
			
		||||
			minetest.sound_play("paperflip2",
 | 
			
		||||
					{to_player=player_name, gain = 1.0})
 | 
			
		||||
		end
 | 
			
		||||
	elseif fields.searchresetbutton then
 | 
			
		||||
		apply_new_filter(player, "", "nochange")
 | 
			
		||||
		if ui.activefilter[player_name] ~= "" then
 | 
			
		||||
			apply_new_filter(player, "", "nochange")
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- alternate buttons
 | 
			
		||||
@@ -242,11 +250,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
			
		||||
			unified_inventory.current_page[player_name])
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
if minetest.delete_detached_inventory then
 | 
			
		||||
	minetest.register_on_leaveplayer(function(player)
 | 
			
		||||
		local player_name = player:get_player_name()
 | 
			
		||||
		minetest.delete_detached_inventory(player_name.."_bags")
 | 
			
		||||
		minetest.delete_detached_inventory(player_name.."craftrecipe")
 | 
			
		||||
		minetest.delete_detached_inventory(player_name.."refill")
 | 
			
		||||
	end)
 | 
			
		||||
end
 | 
			
		||||
minetest.register_on_leaveplayer(function(player)
 | 
			
		||||
	local player_name = player:get_player_name()
 | 
			
		||||
	minetest.remove_detached_inventory(player_name.."_bags")
 | 
			
		||||
	minetest.remove_detached_inventory(player_name.."refill")
 | 
			
		||||
end)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								category.lua
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								category.lua
									
									
									
									
									
								
							@@ -70,7 +70,7 @@ end
 | 
			
		||||
local function ensure_category_exists(category_name)
 | 
			
		||||
	if not unified_inventory.registered_categories[category_name] then
 | 
			
		||||
		unified_inventory.registered_categories[category_name] = {
 | 
			
		||||
			symbol = "default:stick",
 | 
			
		||||
			symbol = "unknown_item.png",
 | 
			
		||||
			label = category_name
 | 
			
		||||
		}
 | 
			
		||||
	end
 | 
			
		||||
@@ -81,20 +81,24 @@ end
 | 
			
		||||
 | 
			
		||||
function unified_inventory.register_category(category_name, config)
 | 
			
		||||
	ensure_category_exists(category_name)
 | 
			
		||||
	if config and config.symbol then
 | 
			
		||||
	config = config or {}
 | 
			
		||||
	if config.symbol then
 | 
			
		||||
		unified_inventory.set_category_symbol(category_name, config.symbol)
 | 
			
		||||
	end
 | 
			
		||||
	if config and config.label then
 | 
			
		||||
	if config.label then
 | 
			
		||||
		unified_inventory.set_category_label(category_name, config.label)
 | 
			
		||||
	end
 | 
			
		||||
	if config and config.index then
 | 
			
		||||
	if config.index then
 | 
			
		||||
		unified_inventory.set_category_index(category_name, config.index)
 | 
			
		||||
	end
 | 
			
		||||
	if config and config.items then
 | 
			
		||||
	if config.items then
 | 
			
		||||
		unified_inventory.add_category_items(category_name, config.items)
 | 
			
		||||
	end
 | 
			
		||||
	update_category_list()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- TODO: Mark these for removal. They are pretty much useless
 | 
			
		||||
 | 
			
		||||
function unified_inventory.set_category_symbol(category_name, symbol)
 | 
			
		||||
	ensure_category_exists(category_name)
 | 
			
		||||
	unified_inventory.registered_categories[category_name].symbol = symbol
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										154
									
								
								doc/mod_api.txt
									
									
									
									
									
								
							
							
						
						
									
										154
									
								
								doc/mod_api.txt
									
									
									
									
									
								
							@@ -1,7 +1,8 @@
 | 
			
		||||
unified_inventory API
 | 
			
		||||
=====================
 | 
			
		||||
 | 
			
		||||
This file provides information about the API of unified_inventory.
 | 
			
		||||
This file provides information about the API of unified_inventory
 | 
			
		||||
and can be viewed in Markdown readers.
 | 
			
		||||
 | 
			
		||||
API revisions within unified_inventory can be checked using:
 | 
			
		||||
 | 
			
		||||
@@ -20,6 +21,66 @@ Grouped by use-case, afterwards sorted alphabetically.
 | 
			
		||||
	* 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.
 | 
			
		||||
This callback is run before any recipe ingredients checks, hence it is also executed on recipes that are
 | 
			
		||||
purged after all mods finished loading.
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
-----
 | 
			
		||||
 | 
			
		||||
@@ -105,68 +166,57 @@ Register a non-standard craft 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(name, def)`
 | 
			
		||||
     * Registers a new category
 | 
			
		||||
     * `name` (string): internal category name
 | 
			
		||||
     * `def` (optional, table): also its fields are optional
 | 
			
		||||
 | 
			
		||||
	unified_inventory.register_category("category_name", {
 | 
			
		||||
		symbol = "mod_name:item_name" or "texture.png",
 | 
			
		||||
		symbol = source,
 | 
			
		||||
		-- ^ Can be in the format "mod_name:item_name" or "texture.png",
 | 
			
		||||
		label = "Human Readable Label",
 | 
			
		||||
		index = 5,
 | 
			
		||||
		-- ^ Categories are sorted by index. Lower numbers appear before higher ones.
 | 
			
		||||
		--   By default, the name is translated to a number: AA -> 0.0101, ZZ -> 0.2626
 | 
			
		||||
		---  Predefined category indices: "all" = -2, "uncategorized" = -1
 | 
			
		||||
		items = {
 | 
			
		||||
			"mod_name:item_name",
 | 
			
		||||
			"another_mod:different_item"
 | 
			
		||||
		}
 | 
			
		||||
		-- ^ List of items within this category
 | 
			
		||||
	})
 | 
			
		||||
 * `unified_inventory.remove_category(name)`
 | 
			
		||||
     * Removes an entire category
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
Modifier functions (to be removed)
 | 
			
		||||
 | 
			
		||||
	unified_inventory.set_category_symbol("category_name", "mod_name:item_name" or "texture.png")
 | 
			
		||||
 * `unified_inventory.set_category_symbol(name, source)`
 | 
			
		||||
     * Changes the symbol of the category. The category does not need to exist yet.
 | 
			
		||||
     * `name` (string): internal category name
 | 
			
		||||
     * `source` (string, optional): `"mod_name:item_name"` or `"texture.png"`.
 | 
			
		||||
       Defaults to `"default:stick"` if not specified.
 | 
			
		||||
 * `unified_inventory.set_category_label(name, label)`
 | 
			
		||||
     * Changes the human readable label of the category.
 | 
			
		||||
     * `name` (string): internal category name
 | 
			
		||||
     * `label` (string): human readable label. Defaults to the category name.
 | 
			
		||||
 * `unified_inventory.set_category_index(name, index)`
 | 
			
		||||
     * Changes the sorting index of the category.
 | 
			
		||||
     * `name` (string): internal category name
 | 
			
		||||
     * `index` (numeric): any real number
 | 
			
		||||
 | 
			
		||||
Add / override the human readable label for a category:
 | 
			
		||||
	If unset this will default to the category name
 | 
			
		||||
Item management
 | 
			
		||||
 | 
			
		||||
	unified_inventory.set_category_label("category_name", "Human Readable Label")
 | 
			
		||||
 * `	unified_inventory.add_category_item(name, itemname)`
 | 
			
		||||
     * Adds a single item to the category
 | 
			
		||||
     * `itemname` (string): self-explanatory
 | 
			
		||||
 * `unified_inventory.add_category_items(name, { itemname1, itemname2, ... }`
 | 
			
		||||
     * Same as above but with multiple items
 | 
			
		||||
 * `unified_inventory.remove_category_item(name, itemname)`
 | 
			
		||||
     * Removes an item from the category
 | 
			
		||||
 * `unified_inventory.find_category(itemname)`
 | 
			
		||||
     * Looks up the first category containing this item
 | 
			
		||||
     * Returns: category name (string) or nil
 | 
			
		||||
 * `unified_inventory.find_categories(itemname)`
 | 
			
		||||
     * Looks up the item name within all registered categories
 | 
			
		||||
     * Returns: array of category names (table)
 | 
			
		||||
 | 
			
		||||
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")
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										101
									
								
								group.lua
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								group.lua
									
									
									
									
									
								
							@@ -1,29 +1,5 @@
 | 
			
		||||
local S = minetest.get_translator("unified_inventory")
 | 
			
		||||
 | 
			
		||||
function unified_inventory.canonical_item_spec_matcher(spec)
 | 
			
		||||
	local specname = ItemStack(spec):get_name()
 | 
			
		||||
	if specname:sub(1, 6) ~= "group:" then
 | 
			
		||||
		return function (itemname)
 | 
			
		||||
			return itemname == specname
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local group_names = specname:sub(7):split(",")
 | 
			
		||||
	return function (itemname)
 | 
			
		||||
		local itemdef = minetest.registered_items[itemname]
 | 
			
		||||
		for _, group_name in ipairs(group_names) do
 | 
			
		||||
			if (itemdef.groups[group_name] or 0) == 0 then
 | 
			
		||||
				return false
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
		return true
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function unified_inventory.item_matches_spec(item, spec)
 | 
			
		||||
	local itemname = ItemStack(item):get_name()
 | 
			
		||||
	return unified_inventory.canonical_item_spec_matcher(spec)(itemname)
 | 
			
		||||
end
 | 
			
		||||
local ui = unified_inventory
 | 
			
		||||
 | 
			
		||||
function unified_inventory.extract_groupnames(groupname)
 | 
			
		||||
	local specname = ItemStack(groupname):get_name()
 | 
			
		||||
@@ -34,22 +10,6 @@ function unified_inventory.extract_groupnames(groupname)
 | 
			
		||||
	return table.concat(group_names, S(" and ")), #group_names
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
unified_inventory.registered_group_items = {
 | 
			
		||||
	mesecon_conductor_craftable = "mesecons:wire_00000000_off",
 | 
			
		||||
	stone = "default:cobble",
 | 
			
		||||
	wood = "default:wood",
 | 
			
		||||
	book = "default:book",
 | 
			
		||||
	sand = "default:sand",
 | 
			
		||||
	leaves = "default:leaves",
 | 
			
		||||
	tree = "default:tree",
 | 
			
		||||
	vessel = "vessels:glass_bottle",
 | 
			
		||||
	wool = "wool:white",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function unified_inventory.register_group_item(groupname, itemname)
 | 
			
		||||
	unified_inventory.registered_group_items[groupname] = itemname
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- This is used when displaying craft recipes, where an ingredient is
 | 
			
		||||
-- specified by group rather than as a specific item.  A single-item group
 | 
			
		||||
@@ -67,6 +27,7 @@ end
 | 
			
		||||
-- It may be a comma-separated list of group names.  This is really a
 | 
			
		||||
-- "group:..." ingredient specification, minus the "group:" prefix.
 | 
			
		||||
 | 
			
		||||
-- TODO Replace this with the more efficient spec matcher (below)
 | 
			
		||||
local function compute_group_item(group_name_list)
 | 
			
		||||
	local group_names = group_name_list:split(",")
 | 
			
		||||
	local candidate_items = {}
 | 
			
		||||
@@ -125,3 +86,61 @@ function unified_inventory.get_group_item(group_name)
 | 
			
		||||
	return group_item_cache[group_name]
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
--[[
 | 
			
		||||
This is for filtering known items by groups
 | 
			
		||||
e.g. find all items that match "group:flower,yellow" (flower AND yellow groups)
 | 
			
		||||
]]
 | 
			
		||||
local spec_matcher = {}
 | 
			
		||||
function unified_inventory.init_matching_cache()
 | 
			
		||||
	for _, name in ipairs(ui.items_list) do
 | 
			
		||||
		-- we only need to care about groups, exact items are handled separately
 | 
			
		||||
		for group, value in pairs(minetest.registered_items[name].groups) do
 | 
			
		||||
			if value and value ~= 0 then
 | 
			
		||||
				if not spec_matcher[group] then
 | 
			
		||||
					spec_matcher[group] = {}
 | 
			
		||||
				end
 | 
			
		||||
				spec_matcher[group][name] = true
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--[[
 | 
			
		||||
Retrieves all matching items
 | 
			
		||||
 | 
			
		||||
Arguments:
 | 
			
		||||
	specname (string): Item name or group(s) to filter
 | 
			
		||||
 | 
			
		||||
Output:
 | 
			
		||||
	{
 | 
			
		||||
		matchingitem1 = true,
 | 
			
		||||
		...
 | 
			
		||||
	}
 | 
			
		||||
]]
 | 
			
		||||
function unified_inventory.get_matching_items(specname)
 | 
			
		||||
	if specname:sub(1,6) ~= "group:" then
 | 
			
		||||
		return { [specname] = true }
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local accepted = {}
 | 
			
		||||
	for i, group in ipairs(specname:sub(7):split(",")) do
 | 
			
		||||
		if i == 1 then
 | 
			
		||||
			-- First step: Copy all possible item names in this group
 | 
			
		||||
			for name, _ in pairs(spec_matcher[group] or {}) do
 | 
			
		||||
				accepted[name] = true
 | 
			
		||||
			end
 | 
			
		||||
		else
 | 
			
		||||
			-- Perform filtering
 | 
			
		||||
			if spec_matcher[group] then
 | 
			
		||||
				for name, _ in pairs(accepted) do
 | 
			
		||||
					accepted[name] = spec_matcher[group][name]
 | 
			
		||||
				end
 | 
			
		||||
			else
 | 
			
		||||
				-- No matching items
 | 
			
		||||
				return {}
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	return accepted
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										51
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								init.lua
									
									
									
									
									
								
							@@ -1,4 +1,10 @@
 | 
			
		||||
-- Unified Inventory for Minetest >= 0.4.16
 | 
			
		||||
-- Unified Inventory
 | 
			
		||||
 | 
			
		||||
if not minetest.features.formspec_version_element then
 | 
			
		||||
	-- At least formspec_version[] is the minimal feature requirement
 | 
			
		||||
	error("Unified Inventory requires Minetest version 5.4.0 or newer.\n" ..
 | 
			
		||||
		" Please update Minetest or use an older version of Unified Inventory.")
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
 | 
			
		||||
local worldpath = minetest.get_worldpath()
 | 
			
		||||
@@ -24,6 +30,8 @@ unified_inventory = {
 | 
			
		||||
	filtered_items_list = {},
 | 
			
		||||
	pages = {},
 | 
			
		||||
	buttons = {},
 | 
			
		||||
	initialized_callbacks = {},
 | 
			
		||||
	craft_registered_callbacks = {},
 | 
			
		||||
 | 
			
		||||
	-- Homepos stuff
 | 
			
		||||
	home_pos = {},
 | 
			
		||||
@@ -42,8 +50,11 @@ unified_inventory = {
 | 
			
		||||
	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]",
 | 
			
		||||
	version = 2
 | 
			
		||||
	standard_background = "bgcolor[#0000]background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]",
 | 
			
		||||
 | 
			
		||||
	hide_disabled_buttons = minetest.settings:get_bool("unified_inventory_hide_disabled_buttons", false),
 | 
			
		||||
 | 
			
		||||
	version = 4
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local ui = unified_inventory
 | 
			
		||||
@@ -56,10 +67,16 @@ ui.style_full = {
 | 
			
		||||
	formspec_y = 1,
 | 
			
		||||
	formw = 17.75,
 | 
			
		||||
	formh = 12.25,
 | 
			
		||||
	-- Item browser size, pos
 | 
			
		||||
	pagecols = 8,
 | 
			
		||||
	pagerows = 9,
 | 
			
		||||
	page_x = 10.75,
 | 
			
		||||
	page_y = 2.30,
 | 
			
		||||
	-- Item browser controls
 | 
			
		||||
	page_buttons_x = 11.60,
 | 
			
		||||
	page_buttons_y = 10.15,
 | 
			
		||||
	searchwidth = 3.4,
 | 
			
		||||
	-- Crafting grid positions
 | 
			
		||||
	craft_x = 2.8,
 | 
			
		||||
	craft_y = 1.15,
 | 
			
		||||
	craftresult_x = 7.8,
 | 
			
		||||
@@ -71,13 +88,15 @@ ui.style_full = {
 | 
			
		||||
	craft_guide_resultstr_x = 0.3,
 | 
			
		||||
	craft_guide_resultstr_y = 0.6,
 | 
			
		||||
	give_btn_x = 0.25,
 | 
			
		||||
	-- Tab switching buttons
 | 
			
		||||
	main_button_x = 0.4,
 | 
			
		||||
	main_button_y = 11.0,
 | 
			
		||||
	page_buttons_x = 11.60,
 | 
			
		||||
	page_buttons_y = 10.15,
 | 
			
		||||
	searchwidth = 3.4,
 | 
			
		||||
	main_button_cols = 12,
 | 
			
		||||
	main_button_rows = 1,
 | 
			
		||||
	-- Tab title position
 | 
			
		||||
	form_header_x = 0.4,
 | 
			
		||||
	form_header_y = 0.4,
 | 
			
		||||
	-- Generic sizes
 | 
			
		||||
	btn_spc = 0.85,
 | 
			
		||||
	btn_size = 0.75,
 | 
			
		||||
	std_inv_x = 0.3,
 | 
			
		||||
@@ -89,10 +108,16 @@ ui.style_lite = {
 | 
			
		||||
	formspec_y =  0.6,
 | 
			
		||||
	formw = 14,
 | 
			
		||||
	formh = 9.75,
 | 
			
		||||
	-- Item browser size, pos
 | 
			
		||||
	pagecols = 4,
 | 
			
		||||
	pagerows = 5,
 | 
			
		||||
	page_x = 10.5,
 | 
			
		||||
	page_y = 2.15,
 | 
			
		||||
	-- Item browser controls
 | 
			
		||||
	page_buttons_x = 10.5,
 | 
			
		||||
	page_buttons_y = 6.15,
 | 
			
		||||
	searchwidth = 1.6,
 | 
			
		||||
	-- Crafting grid positions
 | 
			
		||||
	craft_x = 2.6,
 | 
			
		||||
	craft_y = 0.75,
 | 
			
		||||
	craftresult_x = 5.75,
 | 
			
		||||
@@ -104,13 +129,15 @@ ui.style_lite = {
 | 
			
		||||
	craft_guide_resultstr_x = 0.15,
 | 
			
		||||
	craft_guide_resultstr_y = 0.35,
 | 
			
		||||
	give_btn_x = 0.15,
 | 
			
		||||
	-- Tab switching buttons
 | 
			
		||||
	main_button_x = 10.5,
 | 
			
		||||
	main_button_y = 8.15,
 | 
			
		||||
	page_buttons_x = 10.5,
 | 
			
		||||
	page_buttons_y = 6.15,
 | 
			
		||||
	searchwidth = 1.6,
 | 
			
		||||
	main_button_cols = 4,
 | 
			
		||||
	main_button_rows = 2,
 | 
			
		||||
	-- Tab title position
 | 
			
		||||
	form_header_x =  0.2,
 | 
			
		||||
	form_header_y =  0.2,
 | 
			
		||||
	-- Generic sizes
 | 
			
		||||
	btn_spc = 0.8,
 | 
			
		||||
	btn_size = 0.7,
 | 
			
		||||
	std_inv_x = 0.1,
 | 
			
		||||
@@ -166,7 +193,5 @@ if minetest.settings:get_bool("unified_inventory_bags") ~= false then
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
dofile(modpath.."/item_names.lua")
 | 
			
		||||
 | 
			
		||||
if minetest.get_modpath("datastorage") then
 | 
			
		||||
	dofile(modpath.."/waypoints.lua")
 | 
			
		||||
end
 | 
			
		||||
dofile(modpath.."/waypoints.lua")
 | 
			
		||||
dofile(modpath.."/legacy.lua") -- mod compatibility
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										439
									
								
								internal.lua
									
									
									
									
									
								
							
							
						
						
									
										439
									
								
								internal.lua
									
									
									
									
									
								
							@@ -18,17 +18,22 @@ function ui.demangle_for_formspec(str)
 | 
			
		||||
	return string.gsub(str, "_([0-9]+)_", function (v) return string.char(v) end)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Get the player-specific unified_inventory style
 | 
			
		||||
function ui.get_per_player_formspec(player_name)
 | 
			
		||||
	local draw_lite_mode = ui.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true})
 | 
			
		||||
 | 
			
		||||
	return table.copy(draw_lite_mode and ui.style_lite or ui.style_full), draw_lite_mode
 | 
			
		||||
	local style = table.copy(draw_lite_mode and ui.style_lite or ui.style_full)
 | 
			
		||||
	style.is_lite_mode = draw_lite_mode
 | 
			
		||||
	return style
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Creates an item image or regular image button with a tooltip
 | 
			
		||||
local function formspec_button(ui_peruser, name, image, offset, pos, scale, label)
 | 
			
		||||
	local element = 'image_button'
 | 
			
		||||
	if minetest.registered_items[image] then
 | 
			
		||||
		element = 'item_image_button'
 | 
			
		||||
	elseif image:find(":", 1, true) then
 | 
			
		||||
		image = "unknown_item.png"
 | 
			
		||||
	end
 | 
			
		||||
	local spc = (1-scale)*ui_peruser.btn_size/2
 | 
			
		||||
	local size = ui_peruser.btn_size*scale
 | 
			
		||||
@@ -39,113 +44,103 @@ local function formspec_button(ui_peruser, name, image, offset, pos, scale, labe
 | 
			
		||||
		string.format("tooltip[%s;%s]", name, F(label or name))
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function ui.get_formspec(player, page)
 | 
			
		||||
 | 
			
		||||
	if not player then
 | 
			
		||||
		return ""
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local player_name = player:get_player_name()
 | 
			
		||||
	local ui_peruser,draw_lite_mode = 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 formspec = {
 | 
			
		||||
		"formspec_version[4]",
 | 
			
		||||
		"size["..ui_peruser.formw..","..ui_peruser.formh.."]",
 | 
			
		||||
		pagedef.formspec_prepend and "" or "no_prepend[]",
 | 
			
		||||
		ui.standard_background
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	local n = 5
 | 
			
		||||
 | 
			
		||||
	local perplayer_formspec = ui.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_col = 0
 | 
			
		||||
-- Add registered buttons (tabs)
 | 
			
		||||
local function formspec_tab_buttons(player, formspec, style)
 | 
			
		||||
	local n = #formspec + 1
 | 
			
		||||
 | 
			
		||||
	-- Main buttons
 | 
			
		||||
 | 
			
		||||
	local filtered_inv_buttons = {}
 | 
			
		||||
 | 
			
		||||
	for i, def in pairs(ui.buttons) do
 | 
			
		||||
		if not (draw_lite_mode and def.hide_lite) then
 | 
			
		||||
			table.insert(filtered_inv_buttons, def)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	for i, def in pairs(filtered_inv_buttons) do
 | 
			
		||||
 | 
			
		||||
		if draw_lite_mode and i > 4 then
 | 
			
		||||
			button_row = 1
 | 
			
		||||
			button_col = 1
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		if def.type == "image" then
 | 
			
		||||
			if (def.condition == nil or def.condition(player) == true) then
 | 
			
		||||
				formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s;]",
 | 
			
		||||
					ui_peruser.main_button_x + ui_peruser.btn_spc * (i - 1) - button_col * ui_peruser.btn_spc * 4,
 | 
			
		||||
					ui_peruser.main_button_y + button_row * ui_peruser.btn_spc,
 | 
			
		||||
					ui_peruser.btn_size,ui_peruser.btn_size,
 | 
			
		||||
					F(def.image),
 | 
			
		||||
					F(def.name))
 | 
			
		||||
				formspec[n+1] = "tooltip["..F(def.name)..";"..(def.tooltip or "").."]"
 | 
			
		||||
				n = n+2
 | 
			
		||||
			else
 | 
			
		||||
				formspec[n] = string.format("image[%f,%f;%f,%f;%s^[colorize:#808080:alpha]",
 | 
			
		||||
				ui_peruser.main_button_x + ui_peruser.btn_spc * (i - 1) - button_col * ui_peruser.btn_spc * 4,
 | 
			
		||||
				ui_peruser.main_button_y + button_row * ui_peruser.btn_spc,
 | 
			
		||||
				ui_peruser.btn_size,ui_peruser.btn_size,def.image)
 | 
			
		||||
				n = n+1
 | 
			
		||||
	for _, def in pairs(ui.buttons) do
 | 
			
		||||
		if not (style.is_lite_mode and def.hide_lite) then
 | 
			
		||||
			if def.condition == nil or def.condition(player) or not ui.hide_disabled_buttons then
 | 
			
		||||
				table.insert(filtered_inv_buttons, def)
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	if fsdata.draw_inventory ~= false then
 | 
			
		||||
		-- Player inventory
 | 
			
		||||
		formspec[n] = "listcolors[#00000000;#00000000]"
 | 
			
		||||
		formspec[n+1] = ui_peruser.standard_inv
 | 
			
		||||
		n = n+2
 | 
			
		||||
	local needs_scrollbar = #filtered_inv_buttons > style.main_button_cols * style.main_button_rows
 | 
			
		||||
 | 
			
		||||
	formspec[n] = ("scroll_container[%g,%g;%g,%g;tabbtnscroll;vertical]"):format(
 | 
			
		||||
		style.main_button_x, style.main_button_y, -- position
 | 
			
		||||
		style.main_button_cols * style.btn_spc, style.main_button_rows -- size
 | 
			
		||||
	)
 | 
			
		||||
	n = n + 1
 | 
			
		||||
 | 
			
		||||
	for i, def in pairs(filtered_inv_buttons) do
 | 
			
		||||
		local pos_x =           ((i - 1) % style.main_button_cols) * style.btn_spc
 | 
			
		||||
		local pos_y = math.floor((i - 1) / style.main_button_cols) * style.btn_spc
 | 
			
		||||
 | 
			
		||||
		if def.type == "image" then
 | 
			
		||||
			if (def.condition == nil or def.condition(player)) then
 | 
			
		||||
				formspec[n] = string.format("image_button[%g,%g;%g,%g;%s;%s;]",
 | 
			
		||||
					pos_x, pos_y, style.btn_size, style.btn_size,
 | 
			
		||||
					F(def.image),
 | 
			
		||||
					F(def.name))
 | 
			
		||||
				formspec[n+1] = "tooltip["..F(def.name)..";"..(def.tooltip or "").."]"
 | 
			
		||||
				n = n+2
 | 
			
		||||
 | 
			
		||||
			else
 | 
			
		||||
				formspec[n] = string.format("image[%g,%g;%g,%g;%s^[colorize:#808080:alpha]",
 | 
			
		||||
					pos_x, pos_y, style.btn_size, style.btn_size,
 | 
			
		||||
					def.image)
 | 
			
		||||
				n = n+1
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	if fsdata.draw_item_list == false then
 | 
			
		||||
		return table.concat(formspec, "")
 | 
			
		||||
	formspec[n] = "scroll_container_end[]"
 | 
			
		||||
	if needs_scrollbar then
 | 
			
		||||
		local total_rows = math.ceil(#filtered_inv_buttons / style.main_button_cols)
 | 
			
		||||
		formspec[n+1] = ("scrollbaroptions[max=%i;arrows=hide]"):format(
 | 
			
		||||
			-- This calculation is not 100% accurate but "good enough"
 | 
			
		||||
			(total_rows - style.main_button_rows) * style.btn_spc * 10
 | 
			
		||||
		)
 | 
			
		||||
		formspec[n+2] = ("scrollbar[%g,%g;0.4,%g;vertical;tabbtnscroll;0]"):format(
 | 
			
		||||
			style.main_button_x + style.main_button_cols * style.btn_spc - 0.1, -- x pos
 | 
			
		||||
			style.main_button_y, -- y pos
 | 
			
		||||
			style.main_button_rows * style.btn_spc -- height
 | 
			
		||||
		)
 | 
			
		||||
		formspec[n+3] = "scrollbaroptions[max=1000;arrows=default]"
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
	-- Category filters
 | 
			
		||||
-- Add category GUI elements (top right)
 | 
			
		||||
local function formspec_add_categories(player, formspec, ui_peruser)
 | 
			
		||||
	local player_name = player:get_player_name()
 | 
			
		||||
	local n = #formspec + 1
 | 
			
		||||
 | 
			
		||||
	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-(draw_lite_mode and 0 or 0.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+(draw_lite_mode and 0 or 0.2),
 | 
			
		||||
	formspec[n] = string.format("background9[%f,%f;%f,%f;%s;false;16]",
 | 
			
		||||
		ui_peruser.page_x-0.15, categories_scroll_pos[2],
 | 
			
		||||
		(ui_peruser.btn_spc * ui_peruser.pagecols) + 0.2, 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+(draw_lite_mode and 0.3 or 0.2), "Category:")
 | 
			
		||||
	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 = #unified_inventory.category_list
 | 
			
		||||
	local category_count = #ui.category_list
 | 
			
		||||
	if category_count > ui_peruser.pagecols then
 | 
			
		||||
		scroll_offset = unified_inventory.current_category_scroll[player_name]
 | 
			
		||||
		scroll_offset = ui.current_category_scroll[player_name]
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	for index, category in ipairs(unified_inventory.category_list) do
 | 
			
		||||
	for index, category in ipairs(ui.category_list) do
 | 
			
		||||
		local column = index - scroll_offset
 | 
			
		||||
		if column > 0 and column <= ui_peruser.pagecols then
 | 
			
		||||
			local scale = 0.8
 | 
			
		||||
			if unified_inventory.current_category[player_name] == category.name then
 | 
			
		||||
			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)
 | 
			
		||||
@@ -160,10 +155,13 @@ function ui.get_formspec(player, page)
 | 
			
		||||
	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"))
 | 
			
		||||
		n = n + 1
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function formspec_add_search_box(player, formspec, ui_peruser)
 | 
			
		||||
	local player_name = player:get_player_name()
 | 
			
		||||
	local n = #formspec + 1
 | 
			
		||||
 | 
			
		||||
	-- Search box
 | 
			
		||||
	formspec[n] = "field_close_on_enter[searchbox;false]"
 | 
			
		||||
 | 
			
		||||
	formspec[n+1] = string.format("field[%f,%f;%f,%f;searchbox;;%s]",
 | 
			
		||||
@@ -180,7 +178,16 @@ function ui.get_formspec(player, page)
 | 
			
		||||
		ui_peruser.btn_size, ui_peruser.btn_size)
 | 
			
		||||
	formspec[n+5] = "tooltip[searchresetbutton;"..F(S("Reset search and display everything")).."]"
 | 
			
		||||
 | 
			
		||||
	n = n + 6
 | 
			
		||||
	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
 | 
			
		||||
 | 
			
		||||
@@ -193,9 +200,9 @@ function ui.get_formspec(player, page)
 | 
			
		||||
		{ "ui_skip_forward_icon.png",  "end_list",   S("Last page") },
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if draw_lite_mode then
 | 
			
		||||
		btnlist[5] = nil
 | 
			
		||||
	if ui_peruser.is_lite_mode then
 | 
			
		||||
		btnlist[2] = nil
 | 
			
		||||
		btnlist[5] = nil
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local bn = 0
 | 
			
		||||
@@ -210,69 +217,114 @@ function ui.get_formspec(player, page)
 | 
			
		||||
		n = n + 2
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local no_matches = S("No matching items")
 | 
			
		||||
	if draw_lite_mode then
 | 
			
		||||
		no_matches = S("No matches.")
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- Items list
 | 
			
		||||
	if #ui.filtered_items_list[player_name] == 0 then
 | 
			
		||||
		formspec[n] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y+0.15)..";" .. F(no_matches) .. "]"
 | 
			
		||||
	else
 | 
			
		||||
		local dir = ui.active_search_direction[player_name]
 | 
			
		||||
		local list_index = ui.current_index[player_name]
 | 
			
		||||
		local page2 = math.floor(list_index / (ui_peruser.items_per_page) + 1)
 | 
			
		||||
		local pagemax = math.floor(
 | 
			
		||||
			(#ui.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 = 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
 | 
			
		||||
		local no_matches = S("No matching items")
 | 
			
		||||
		if ui_peruser.is_lite_mode then
 | 
			
		||||
			no_matches = S("No matches.")
 | 
			
		||||
		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
 | 
			
		||||
		formspec[n] = "label["..ui_peruser.page_x..","..(ui_peruser.page_y+0.15)..";" .. F(no_matches) .. "]"
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local dir = ui.active_search_direction[player_name]
 | 
			
		||||
	local list_index = ui.current_index[player_name]
 | 
			
		||||
	local page2 = math.floor(list_index / (ui_peruser.items_per_page) + 1)
 | 
			
		||||
	local pagemax = math.floor(
 | 
			
		||||
		(#ui.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 = 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
 | 
			
		||||
 | 
			
		||||
				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
 | 
			
		||||
				)
 | 
			
		||||
				local tooltip = item.description
 | 
			
		||||
				if item.mod_origin then
 | 
			
		||||
					-- "mod_origin" may not be specified for items that were
 | 
			
		||||
					-- registered in a callback (during or before ServerEnv init)
 | 
			
		||||
					tooltip = tooltip .. " [" .. item.mod_origin .. "]"
 | 
			
		||||
				end
 | 
			
		||||
				formspec[n + 1] = ("tooltip[%s;%s]"):format(
 | 
			
		||||
					button_name, minetest.formspec_escape(tooltip)
 | 
			
		||||
				)
 | 
			
		||||
				n = n + 2
 | 
			
		||||
				list_index = list_index + 1
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
		formspec[n] = string.format("label[%f,%f;%s: %s]",
 | 
			
		||||
			ui_peruser.page_buttons_x + ui_peruser.btn_spc * (draw_lite_mode and 1 or 2),
 | 
			
		||||
			ui_peruser.page_buttons_y + 0.1 + ui_peruser.btn_spc * 2,
 | 
			
		||||
			F(S("Page")), S("@1 of @2",page2,pagemax))
 | 
			
		||||
	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),
 | 
			
		||||
		ui_peruser.page_buttons_y + 0.1 + ui_peruser.btn_spc * 2,
 | 
			
		||||
		F(S("Page")), S("@1 of @2",page2,pagemax))
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
	if ui.activefilter[player_name] ~= "" then
 | 
			
		||||
		formspec[n] = 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]))
 | 
			
		||||
function ui.get_formspec(player, page)
 | 
			
		||||
 | 
			
		||||
	if not player then
 | 
			
		||||
		return ""
 | 
			
		||||
	end
 | 
			
		||||
	return table.concat(formspec, "")
 | 
			
		||||
 | 
			
		||||
	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_tab_buttons(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)
 | 
			
		||||
@@ -281,7 +333,7 @@ function ui.set_inventory_formspec(player, page)
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function valid_def(def)
 | 
			
		||||
function ui.is_itemdef_listable(def)
 | 
			
		||||
	return (not def.groups.not_in_creative_inventory
 | 
			
		||||
			or def.groups.not_in_creative_inventory == 0)
 | 
			
		||||
		and def.description
 | 
			
		||||
@@ -294,9 +346,11 @@ function ui.apply_filter(player, filter, search_dir)
 | 
			
		||||
		return false
 | 
			
		||||
	end
 | 
			
		||||
	local player_name = player:get_player_name()
 | 
			
		||||
 | 
			
		||||
	local lfilter = string.lower(filter)
 | 
			
		||||
	local ffilter
 | 
			
		||||
	if lfilter:sub(1, 6) == "group:" then
 | 
			
		||||
		-- Group filter: all groups of the item must match
 | 
			
		||||
		local groups = lfilter:sub(7):split(",")
 | 
			
		||||
		ffilter = function(name, def)
 | 
			
		||||
			for _, group in ipairs(groups) do
 | 
			
		||||
@@ -308,7 +362,10 @@ function ui.apply_filter(player, filter, search_dir)
 | 
			
		||||
			return true
 | 
			
		||||
		end
 | 
			
		||||
	else
 | 
			
		||||
		local lang = minetest.get_player_information(player_name).lang_code
 | 
			
		||||
		-- Name filter: fuzzy match item names and descriptions
 | 
			
		||||
		local player_info = minetest.get_player_information(player_name)
 | 
			
		||||
		local lang = player_info and player_info.lang_code or ""
 | 
			
		||||
 | 
			
		||||
		ffilter = function(name, def)
 | 
			
		||||
			local lname = string.lower(name)
 | 
			
		||||
			local ldesc = string.lower(def.description)
 | 
			
		||||
@@ -318,95 +375,53 @@ function ui.apply_filter(player, filter, search_dir)
 | 
			
		||||
				or llocaldesc and string.find(llocaldesc, lfilter, 1, true)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	ui.filtered_items_list[player_name]={}
 | 
			
		||||
 | 
			
		||||
	local is_itemdef_listable = ui.is_itemdef_listable
 | 
			
		||||
	local filtered_items = {}
 | 
			
		||||
 | 
			
		||||
	local category = ui.current_category[player_name] or 'all'
 | 
			
		||||
	if category == 'all' then
 | 
			
		||||
		for name, def in pairs(minetest.registered_items) do
 | 
			
		||||
			if valid_def(def)
 | 
			
		||||
			if is_itemdef_listable(def)
 | 
			
		||||
			and ffilter(name, def) then
 | 
			
		||||
				table.insert(ui.filtered_items_list[player_name], name)
 | 
			
		||||
				table.insert(filtered_items, name)
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	elseif category == 'uncategorized' then
 | 
			
		||||
		for name, def in pairs(minetest.registered_items) do
 | 
			
		||||
			if (not ui.find_category(name))
 | 
			
		||||
			and valid_def(def)
 | 
			
		||||
			if is_itemdef_listable(def)
 | 
			
		||||
			and not ui.find_category(name)
 | 
			
		||||
			and ffilter(name, def) then
 | 
			
		||||
				table.insert(ui.filtered_items_list[player_name], name)
 | 
			
		||||
				table.insert(filtered_items, name)
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	else
 | 
			
		||||
		for name,exists in pairs(ui.registered_category_items[category]) do
 | 
			
		||||
		-- Any other category is selected
 | 
			
		||||
		for name, exists in pairs(ui.registered_category_items[category]) do
 | 
			
		||||
			local def = minetest.registered_items[name]
 | 
			
		||||
			if exists and def
 | 
			
		||||
			and valid_def(def)
 | 
			
		||||
			and is_itemdef_listable(def)
 | 
			
		||||
			and ffilter(name, def) then
 | 
			
		||||
				table.insert(ui.filtered_items_list[player_name], name)
 | 
			
		||||
				table.insert(filtered_items, name)
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	table.sort(ui.filtered_items_list[player_name])
 | 
			
		||||
	ui.filtered_items_list_size[player_name] = #ui.filtered_items_list[player_name]
 | 
			
		||||
	table.sort(filtered_items)
 | 
			
		||||
 | 
			
		||||
	ui.filtered_items_list_size[player_name] = #filtered_items
 | 
			
		||||
	ui.filtered_items_list[player_name] = filtered_items
 | 
			
		||||
	ui.current_index[player_name] = 1
 | 
			
		||||
	ui.activefilter[player_name] = filter
 | 
			
		||||
	ui.active_search_direction[player_name] = search_dir
 | 
			
		||||
	ui.set_inventory_formspec(player,
 | 
			
		||||
	ui.current_page[player_name])
 | 
			
		||||
	ui.set_inventory_formspec(player, ui.current_page[player_name])
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function ui.items_in_group(groups)
 | 
			
		||||
	local items = {}
 | 
			
		||||
	for name, item in pairs(minetest.registered_items) do
 | 
			
		||||
		for _, group in pairs(groups:split(',')) do
 | 
			
		||||
			if item.groups[group] then
 | 
			
		||||
				table.insert(items, name)
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
-- Inform players about potential visual issues
 | 
			
		||||
minetest.register_on_joinplayer(function(player)
 | 
			
		||||
	local player_name = player:get_player_name()
 | 
			
		||||
	local info = minetest.get_player_information(player_name)
 | 
			
		||||
	if info and (info.formspec_version or 0) < 4 then
 | 
			
		||||
		minetest.chat_send_player(player_name, S("Unified Inventory: Your game version is too old"
 | 
			
		||||
			.. " and does not support the GUI requirements. You might experience visual issues."))
 | 
			
		||||
	end
 | 
			
		||||
	return items
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function ui.sort_inventory(inv)
 | 
			
		||||
	local inlist = inv:get_list("main")
 | 
			
		||||
	local typecnt = {}
 | 
			
		||||
	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)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										55
									
								
								legacy.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								legacy.lua
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
-- Inefficient pattern matching
 | 
			
		||||
 | 
			
		||||
local warned_funcs = {}
 | 
			
		||||
local function LOG_ONCE(funcname)
 | 
			
		||||
	if warned_funcs[funcname] then return end
 | 
			
		||||
	warned_funcs[funcname] = true
 | 
			
		||||
	minetest.log("error", "Call to undocumented, deprecated API '" .. funcname .. "'."
 | 
			
		||||
		.. " In a future version of Unified Inventory this will result in a real error.")
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function unified_inventory.canonical_item_spec_matcher(spec)
 | 
			
		||||
	LOG_ONCE("canonical_item_spec_matcher")
 | 
			
		||||
	local specname = ItemStack(spec):get_name()
 | 
			
		||||
	if specname:sub(1, 6) ~= "group:" then
 | 
			
		||||
		return function (itemname)
 | 
			
		||||
			return itemname == specname
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local group_names = specname:sub(7):split(",")
 | 
			
		||||
	return function (itemname)
 | 
			
		||||
		local itemdef = minetest.registered_items[itemname]
 | 
			
		||||
		for _, group_name in ipairs(group_names) do
 | 
			
		||||
			if (itemdef.groups[group_name] or 0) == 0 then
 | 
			
		||||
				return false
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
		return true
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function unified_inventory.item_matches_spec(item, spec)
 | 
			
		||||
	LOG_ONCE("item_matches_spec")
 | 
			
		||||
	local itemname = ItemStack(item):get_name()
 | 
			
		||||
	return unified_inventory.canonical_item_spec_matcher(spec)(itemname)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
unified_inventory.registered_group_items = {
 | 
			
		||||
	mesecon_conductor_craftable = "mesecons:wire_00000000_off",
 | 
			
		||||
	stone = "default:cobble",
 | 
			
		||||
	wood = "default:wood",
 | 
			
		||||
	book = "default:book",
 | 
			
		||||
	sand = "default:sand",
 | 
			
		||||
	leaves = "default:leaves",
 | 
			
		||||
	tree = "default:tree",
 | 
			
		||||
	vessel = "vessels:glass_bottle",
 | 
			
		||||
	wool = "wool:white",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function unified_inventory.register_group_item(groupname, itemname)
 | 
			
		||||
	LOG_ONCE("register_group_item")
 | 
			
		||||
	unified_inventory.registered_group_items[groupname] = itemname
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@@ -1,54 +1,52 @@
 | 
			
		||||
# textdomain: unified_inventory
 | 
			
		||||
 | 
			
		||||
# waypoints.lua
 | 
			
		||||
 | 
			
		||||
White=
 | 
			
		||||
Yellow=
 | 
			
		||||
Red=
 | 
			
		||||
Green=
 | 
			
		||||
Blue=
 | 
			
		||||
Waypoints=
 | 
			
		||||
Select Waypoint #@1=
 | 
			
		||||
Waypoint @1=
 | 
			
		||||
Set waypoint to current location=
 | 
			
		||||
Make waypoint @1=
 | 
			
		||||
invisible=
 | 
			
		||||
visible=
 | 
			
		||||
@1 display of waypoint coordinates=
 | 
			
		||||
Disable=
 | 
			
		||||
Enable=
 | 
			
		||||
Change color of waypoint display=
 | 
			
		||||
Edit waypoint name=
 | 
			
		||||
Waypoint active=
 | 
			
		||||
Waypoint inactive=
 | 
			
		||||
Finish editing=
 | 
			
		||||
World position=
 | 
			
		||||
Name=
 | 
			
		||||
HUD text color=
 | 
			
		||||
 | 
			
		||||
# group.lua
 | 
			
		||||
 | 
			
		||||
Mixing=
 | 
			
		||||
Cooking=
 | 
			
		||||
Digging=
 | 
			
		||||
Bags=
 | 
			
		||||
Bag @1=
 | 
			
		||||
Small Bag=
 | 
			
		||||
Medium Bag=
 | 
			
		||||
Large Bag=
 | 
			
		||||
All Items=
 | 
			
		||||
Misc. Items=
 | 
			
		||||
Plant Life=
 | 
			
		||||
Building Materials=
 | 
			
		||||
Tools=
 | 
			
		||||
Minerals and Metals=
 | 
			
		||||
Environment and Worldgen=
 | 
			
		||||
Lighting=
 | 
			
		||||
 and =
 | 
			
		||||
 | 
			
		||||
# register.lua
 | 
			
		||||
 | 
			
		||||
Scroll categories left=
 | 
			
		||||
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=
 | 
			
		||||
Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=
 | 
			
		||||
Crafting Grid=
 | 
			
		||||
Crafting Guide=
 | 
			
		||||
Set home position=
 | 
			
		||||
Home position set to: @1=
 | 
			
		||||
You don't have the \"home\" privilege!=
 | 
			
		||||
You don't have the "home" privilege!=
 | 
			
		||||
Go home=
 | 
			
		||||
Set time to day=
 | 
			
		||||
Set time to night=
 | 
			
		||||
Time of day set to 6am=
 | 
			
		||||
Time of day set to 9pm=
 | 
			
		||||
You don't have the settime privilege!=
 | 
			
		||||
Set time to night=
 | 
			
		||||
Time of day set to 9pm=
 | 
			
		||||
Clear inventory=
 | 
			
		||||
This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
			
		||||
Inventory cleared!=
 | 
			
		||||
This button has been disabled outside=
 | 
			
		||||
Crafting=
 | 
			
		||||
Trash:=
 | 
			
		||||
Refill:=
 | 
			
		||||
Any item belonging to the @1 group=
 | 
			
		||||
@@ -65,36 +63,28 @@ Show previous recipe=
 | 
			
		||||
Show previous usage=
 | 
			
		||||
@1 (@2)=
 | 
			
		||||
Give me:=
 | 
			
		||||
This recipe is too@nlarge to be displayed.=
 | 
			
		||||
This recipe is too@@large to be displayed.=
 | 
			
		||||
To craft grid:=
 | 
			
		||||
All=
 | 
			
		||||
 | 
			
		||||
# api.lua
 | 
			
		||||
 | 
			
		||||
Mixing=
 | 
			
		||||
Cooking=
 | 
			
		||||
Digging=
 | 
			
		||||
 | 
			
		||||
# internal.lua
 | 
			
		||||
 | 
			
		||||
First page=
 | 
			
		||||
Back three pages=
 | 
			
		||||
Back one page=
 | 
			
		||||
Forward one page=
 | 
			
		||||
Forward three pages=
 | 
			
		||||
Last page=
 | 
			
		||||
Search=
 | 
			
		||||
Reset search and display everything=
 | 
			
		||||
No matching items=
 | 
			
		||||
No matches.=
 | 
			
		||||
Page=
 | 
			
		||||
@1 of @2=
 | 
			
		||||
Filter=
 | 
			
		||||
 | 
			
		||||
# bags.lua
 | 
			
		||||
 | 
			
		||||
Bags=
 | 
			
		||||
Bag @1=
 | 
			
		||||
Small Bag=
 | 
			
		||||
Medium Bag=
 | 
			
		||||
Large Bag=
 | 
			
		||||
Crafting=
 | 
			
		||||
White=
 | 
			
		||||
Yellow=
 | 
			
		||||
Red=
 | 
			
		||||
Green=
 | 
			
		||||
Blue=
 | 
			
		||||
Waypoints=
 | 
			
		||||
Select Waypoint #@1=
 | 
			
		||||
Waypoint @1=
 | 
			
		||||
Set waypoint to current location=
 | 
			
		||||
Hide waypoint=
 | 
			
		||||
Show waypoint=
 | 
			
		||||
Hide coordinates=
 | 
			
		||||
Show coordinates=
 | 
			
		||||
Change color of waypoint display=
 | 
			
		||||
Edit waypoint name=
 | 
			
		||||
Waypoint active=
 | 
			
		||||
Waypoint inactive=
 | 
			
		||||
Finish editing=
 | 
			
		||||
World position=
 | 
			
		||||
Name=
 | 
			
		||||
HUD text color=
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
# textdomain: unified_inventory
 | 
			
		||||
Crafting=Fertigung
 | 
			
		||||
Mixing=Mischen
 | 
			
		||||
Cooking=Kochen
 | 
			
		||||
Digging=Graben
 | 
			
		||||
@@ -8,21 +7,32 @@ Bag @1=Tasche @1
 | 
			
		||||
Small Bag=Kleine Tasche
 | 
			
		||||
Medium Bag=Mittelgroße Tasche
 | 
			
		||||
Large Bag=Große Tasche
 | 
			
		||||
All Items=Alle Gegenstände
 | 
			
		||||
Misc. Items=Sonstige Gegenstände
 | 
			
		||||
Plant Life=Pfanzenwelt
 | 
			
		||||
Building Materials=Baumaterialien
 | 
			
		||||
Tools=Werkzeuge
 | 
			
		||||
Minerals and Metals=Minerale und Metalle
 | 
			
		||||
Environment and Worldgen=Umwelt und Welterstellung
 | 
			
		||||
Lighting=Beleuchtung
 | 
			
		||||
 and = und 
 | 
			
		||||
Scroll categories left=Kategorien nach links blättern
 | 
			
		||||
Scroll categories right=Kategorien nach rechts blättern
 | 
			
		||||
Search=Suchen
 | 
			
		||||
Reset search and display everything=Suche zurücksetzen und alles anzeigen
 | 
			
		||||
First page=Erste Seite
 | 
			
		||||
Back three pages=3 Seiten zurückblättern
 | 
			
		||||
Back one page=1 Seite zurückblättern
 | 
			
		||||
Forward one page=1 Seite vorblättern
 | 
			
		||||
Forward three pages=3 Seiten vorblättern
 | 
			
		||||
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 matches.=Keine Treffer
 | 
			
		||||
Page=Seite
 | 
			
		||||
@1 of @2=@1 von @2
 | 
			
		||||
Filter=Filter
 | 
			
		||||
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 Guide=Fertigungsführer
 | 
			
		||||
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
 | 
			
		||||
Time of day set to 9pm=Tageszeit auf 21 Uhr gesetzt
 | 
			
		||||
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!
 | 
			
		||||
Trash:=Müll:
 | 
			
		||||
Refill:=Nachfüllen:
 | 
			
		||||
@@ -50,9 +61,12 @@ Show next recipe=Nächstes Rezept zeigen
 | 
			
		||||
Show next usage=Nächste Verwendung zeigen
 | 
			
		||||
Show previous recipe=Vorheriges Rezept zeigen
 | 
			
		||||
Show previous usage=Vorherige Verwendung zeigen
 | 
			
		||||
@1 (@2)=
 | 
			
		||||
Give me:=Gib mir:
 | 
			
		||||
This recipe is too@@large to be displayed.=
 | 
			
		||||
To craft grid:=Ins Fertigungsraster:
 | 
			
		||||
All=Alles
 | 
			
		||||
Crafting=Fertigung
 | 
			
		||||
White=Weiß
 | 
			
		||||
Yellow=Gelb
 | 
			
		||||
Red=Rot
 | 
			
		||||
@@ -62,12 +76,10 @@ Waypoints=Wegpunkte
 | 
			
		||||
Select Waypoint #@1=Wegpunkt Nr. @1 auswählen
 | 
			
		||||
Waypoint @1=Wegpunkt Nr. @1
 | 
			
		||||
Set waypoint to current location=Setze Wegpunkt zur derzeitigen Position
 | 
			
		||||
invisible=unsichtbar
 | 
			
		||||
visible=sichtbar
 | 
			
		||||
Make waypoint @1=Wegpunkt @1 machen
 | 
			
		||||
Disable=ausschalten
 | 
			
		||||
Enable=einschalten
 | 
			
		||||
@1 display of waypoint coordinates=Anzeige der Wegpunktkoordinaten @1
 | 
			
		||||
Hide waypoint=Wegpunkt verstecken
 | 
			
		||||
Show waypoint=Wegpunkt zeigen
 | 
			
		||||
Hide coordinates=Koordinaten verstecken
 | 
			
		||||
Show coordinates=Koordinaten zeigen
 | 
			
		||||
Change color of waypoint display=Farbe der Darstellung der Wegpunkte ändern
 | 
			
		||||
Edit waypoint name=Name des Wegpunkts ändern
 | 
			
		||||
Waypoint active=Wegpunkt aktiv
 | 
			
		||||
@@ -76,4 +88,13 @@ Finish editing=Bearbeitung abschließen
 | 
			
		||||
World position=Weltposition
 | 
			
		||||
Name=Name
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
# waypoints.lua
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
Make waypoint @1=Hacer punto @1
 | 
			
		||||
invisible=invisible
 | 
			
		||||
visible=visible
 | 
			
		||||
@1 display of waypoint coordinates=Visualizar coordenadas del punto @1
 | 
			
		||||
Disable=Deshabilitado
 | 
			
		||||
Enable=Habilitado
 | 
			
		||||
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
 | 
			
		||||
Cooking=Hornear
 | 
			
		||||
Digging=Recoger
 | 
			
		||||
# bags.lua
 | 
			
		||||
Bags=Bolsos
 | 
			
		||||
Bag @1=Bolso @1
 | 
			
		||||
Small Bag=Bolso Pequeño
 | 
			
		||||
Medium Bag=Bolso Mediano
 | 
			
		||||
Large Bag=Bolso Grande
 | 
			
		||||
All Items=
 | 
			
		||||
Misc. Items=
 | 
			
		||||
Plant Life=
 | 
			
		||||
Building Materials=
 | 
			
		||||
Tools=
 | 
			
		||||
Minerals and Metals=
 | 
			
		||||
Environment and Worldgen=
 | 
			
		||||
Lighting=
 | 
			
		||||
# group.lua
 | 
			
		||||
 | 
			
		||||
 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
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
Crafting Grid=Cuadricula de Elaboración
 | 
			
		||||
Crafting Guide=Guía de Elaboración
 | 
			
		||||
Set home position=Establecer posición de la casa
 | 
			
		||||
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
 | 
			
		||||
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 9pm=Hora del día cambiada a 9 PM
 | 
			
		||||
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
 | 
			
		||||
This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
			
		||||
Inventory cleared!=¡Inventario limpio!
 | 
			
		||||
This button has been disabled outside=Este botón ha sido deshabilitado
 | 
			
		||||
Crafting=Elaboración
 | 
			
		||||
Trash:=Basura:
 | 
			
		||||
Refill:=Rellenar:
 | 
			
		||||
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
 | 
			
		||||
@1 (@2)=@1 (@2)
 | 
			
		||||
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:
 | 
			
		||||
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
 | 
			
		||||
Cooking=Hornear
 | 
			
		||||
Digging=Recoger
 | 
			
		||||
##### not used anymore #####
 | 
			
		||||
 | 
			
		||||
# 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
 | 
			
		||||
Search=Buscar
 | 
			
		||||
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
 | 
			
		||||
Make waypoint @1=Hacer punto @1
 | 
			
		||||
invisible=invisible
 | 
			
		||||
visible=visible
 | 
			
		||||
@1 display of waypoint coordinates=Visualizar coordenadas del punto @1
 | 
			
		||||
Disable=Deshabilitado
 | 
			
		||||
Enable=Habilitado
 | 
			
		||||
You don't have the \"home\" privilege!=¡No tienes el privilegio \"home\"!
 | 
			
		||||
This button has been disabled outside=Este botón ha sido deshabilitado
 | 
			
		||||
This recipe is too@nlarge to be displayed.=Esta receta es demasiado@ngrande para ser mostrada.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
# textdomain: unified_inventory
 | 
			
		||||
Crafting=Création
 | 
			
		||||
Mixing=
 | 
			
		||||
Cooking=Cuisson
 | 
			
		||||
Digging=Creuser
 | 
			
		||||
Bags=Sacs
 | 
			
		||||
@@ -7,35 +7,66 @@ Bag @1=Sac @1
 | 
			
		||||
Small Bag=Petit sac
 | 
			
		||||
Medium Bag=Sac moyen
 | 
			
		||||
Large Bag=Grand sac
 | 
			
		||||
All Items=
 | 
			
		||||
Misc. Items=
 | 
			
		||||
Plant Life=
 | 
			
		||||
Building Materials=
 | 
			
		||||
Tools=
 | 
			
		||||
Minerals and Metals=
 | 
			
		||||
Environment and Worldgen=
 | 
			
		||||
Lighting=
 | 
			
		||||
 and = et 
 | 
			
		||||
Scroll categories left=
 | 
			
		||||
Scroll categories right=
 | 
			
		||||
Search=Rechercher
 | 
			
		||||
Reset search and display everything=
 | 
			
		||||
First page=1ère page
 | 
			
		||||
Back three pages=3 pages en arrière
 | 
			
		||||
Back one page=Page précédente
 | 
			
		||||
Forward one page=Page suivante
 | 
			
		||||
Forward three pages=3 pages en avant
 | 
			
		||||
Last page=Dernière page
 | 
			
		||||
Search=Rechercher
 | 
			
		||||
No matching items=Aucun élément correspondant
 | 
			
		||||
No matches.=Aucun match
 | 
			
		||||
Page=Page
 | 
			
		||||
@1 of @2=@1 de @2
 | 
			
		||||
Filter=Filtre
 | 
			
		||||
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 Guide=Guide de création
 | 
			
		||||
Set home position=Position dans le monde
 | 
			
		||||
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"!
 | 
			
		||||
Go home=
 | 
			
		||||
Set time to day=
 | 
			
		||||
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"!
 | 
			
		||||
Set time to night=
 | 
			
		||||
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é !
 | 
			
		||||
Trash:=Poubelle :
 | 
			
		||||
Refill:=Remplir :
 | 
			
		||||
Any item belonging to the @1 group=
 | 
			
		||||
Any item belonging to the groups @1=
 | 
			
		||||
Recipe @1 of @2=Recette @1 de @2
 | 
			
		||||
Usage @1 of @2=
 | 
			
		||||
No recipes=
 | 
			
		||||
No usages=
 | 
			
		||||
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:
 | 
			
		||||
All=Tout
 | 
			
		||||
Crafting=Création
 | 
			
		||||
White=Blanc
 | 
			
		||||
Yellow=Jaune
 | 
			
		||||
Red=Rouge
 | 
			
		||||
@@ -45,8 +76,10 @@ Waypoints=Point de passage
 | 
			
		||||
Select Waypoint #@1=Choisir un point de passage #@1
 | 
			
		||||
Waypoint @1=Point de passage @1
 | 
			
		||||
Set waypoint to current location=Marquer un point de passage à la position actuelle
 | 
			
		||||
Make waypoint @1=Rendre @1 le point de passage
 | 
			
		||||
@1 display of waypoint coordinates=@1 montrer les coordonnées des points de passages
 | 
			
		||||
Hide waypoint=
 | 
			
		||||
Show waypoint=
 | 
			
		||||
Hide coordinates=
 | 
			
		||||
Show coordinates=
 | 
			
		||||
Change color of waypoint display=Changer la couleur du point de passage
 | 
			
		||||
Edit waypoint name=Editer le nom du point de passage
 | 
			
		||||
Waypoint active=Point de passage actif
 | 
			
		||||
@@ -55,3 +88,9 @@ Finish editing=Terminer l'édition
 | 
			
		||||
World position=Position dans le monde
 | 
			
		||||
Name=Nom
 | 
			
		||||
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
 | 
			
		||||
Crafting=Assemblaggio
 | 
			
		||||
Mixing=Unione
 | 
			
		||||
Cooking=Cottura
 | 
			
		||||
Digging=Scavo
 | 
			
		||||
@@ -8,21 +7,32 @@ Bag @1=Borsa @1
 | 
			
		||||
Small Bag=Borsa piccola
 | 
			
		||||
Medium Bag=Borsa media
 | 
			
		||||
Large Bag=Borsa grande
 | 
			
		||||
All Items=
 | 
			
		||||
Misc. Items=
 | 
			
		||||
Plant Life=
 | 
			
		||||
Building Materials=
 | 
			
		||||
Tools=
 | 
			
		||||
Minerals and Metals=
 | 
			
		||||
Environment and Worldgen=
 | 
			
		||||
Lighting=
 | 
			
		||||
 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
 | 
			
		||||
Back three pages=Indietro di tre pagine
 | 
			
		||||
Back one page=Indietro di una pagina
 | 
			
		||||
Forward one page=Avanti di una pagina
 | 
			
		||||
Forward three pages=Avanti di tre pagine
 | 
			
		||||
Last page=Ultima pagina
 | 
			
		||||
Search=Cerca
 | 
			
		||||
Reset search and display everything=Azzera la ricerca e mostra tutto
 | 
			
		||||
No matching items=Nessun oggetto corrispondente
 | 
			
		||||
No matches.=Nessuna corrispondenza.
 | 
			
		||||
Page=Pagina
 | 
			
		||||
@1 of @2=@1 di @2
 | 
			
		||||
Filter=Filtro
 | 
			
		||||
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 Guide=Guida di assemblaggio
 | 
			
		||||
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
 | 
			
		||||
Time of day set to 9pm=Orario impostato sulle 9am
 | 
			
		||||
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!
 | 
			
		||||
Trash:=Butta:
 | 
			
		||||
Refill:=Riempi:
 | 
			
		||||
@@ -50,9 +61,12 @@ Show next recipe=Mostra la prossima ricetta
 | 
			
		||||
Show next usage=Mostra il prossimo utilizzo
 | 
			
		||||
Show previous recipe=Mostra la ricetta precedente
 | 
			
		||||
Show previous usage=Mostra l'utilizzo precedente
 | 
			
		||||
@1 (@2)=
 | 
			
		||||
Give me:=Dammi:
 | 
			
		||||
This recipe is too@@large to be displayed.=
 | 
			
		||||
To craft grid:=Alla griglia di assemblaggio:
 | 
			
		||||
All=Tutto
 | 
			
		||||
Crafting=Assemblaggio
 | 
			
		||||
White=Bianco
 | 
			
		||||
Yellow=Giallo
 | 
			
		||||
Red=Rosso
 | 
			
		||||
@@ -62,12 +76,10 @@ Waypoints=Tappe
 | 
			
		||||
Select Waypoint #@1=Seleziona tappa n°@1
 | 
			
		||||
Waypoint @1=Tappa @1
 | 
			
		||||
Set waypoint to current location=Imposta tappa alla posizione attuale
 | 
			
		||||
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
 | 
			
		||||
Hide waypoint=
 | 
			
		||||
Show waypoint=
 | 
			
		||||
Hide coordinates=
 | 
			
		||||
Show coordinates=
 | 
			
		||||
Change color of waypoint display=Modifica il colore della visualizzazione della tappa
 | 
			
		||||
Edit waypoint name=Modifica il nome della tappa
 | 
			
		||||
Waypoint active=Tappa attiva
 | 
			
		||||
@@ -76,4 +88,13 @@ Finish editing=Termina la modifica
 | 
			
		||||
World position=Posizione del mondo
 | 
			
		||||
Name=Nome
 | 
			
		||||
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
 | 
			
		||||
Crafting=Pertukangan
 | 
			
		||||
Mixing=Pencampuran
 | 
			
		||||
Cooking=Pemasakan
 | 
			
		||||
Digging=Penggalian
 | 
			
		||||
@@ -8,21 +7,32 @@ Bag @1=Beg @1
 | 
			
		||||
Small Bag=Beg Kecil
 | 
			
		||||
Medium Bag=Beg Sederhana
 | 
			
		||||
Large Bag=Beg Besar
 | 
			
		||||
All Items=
 | 
			
		||||
Misc. Items=
 | 
			
		||||
Plant Life=
 | 
			
		||||
Building Materials=
 | 
			
		||||
Tools=
 | 
			
		||||
Minerals and Metals=
 | 
			
		||||
Environment and Worldgen=
 | 
			
		||||
Lighting=
 | 
			
		||||
 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
 | 
			
		||||
Back three pages=Tiga halaman sebelumnya
 | 
			
		||||
Back one page=Halaman sebelumnya
 | 
			
		||||
Forward one page=Halaman seterusnya
 | 
			
		||||
Forward three pages=Tiga halaman seterusnya
 | 
			
		||||
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 matches.=Tiada padanan.
 | 
			
		||||
Page=Halaman
 | 
			
		||||
@1 of @2=@1 drpd @2
 | 
			
		||||
Filter=Tapis
 | 
			
		||||
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 Guide=Panduan Pertukangan
 | 
			
		||||
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
 | 
			
		||||
Time of day set to 9pm=Masa ditetapkan ke 9 malam
 | 
			
		||||
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!
 | 
			
		||||
Trash:=Buang:
 | 
			
		||||
Refill:=Isi balik:
 | 
			
		||||
@@ -52,7 +63,10 @@ Show previous recipe=Tunjuk resipi sebelumnya
 | 
			
		||||
Show previous usage=Tunjuk kegunaan sebelumnya
 | 
			
		||||
@1 (@2)=@1 (@2)
 | 
			
		||||
Give me:=Beri saya:
 | 
			
		||||
This recipe is too@@large to be displayed.=
 | 
			
		||||
To craft grid:=Ke grid pertukangan:
 | 
			
		||||
All=
 | 
			
		||||
Crafting=Pertukangan
 | 
			
		||||
White=Putih
 | 
			
		||||
Yellow=Kuning
 | 
			
		||||
Red=Merah
 | 
			
		||||
@@ -62,12 +76,10 @@ Waypoints=Titik Arah
 | 
			
		||||
Select Waypoint #@1=Pilih Titik Arah #@1
 | 
			
		||||
Waypoint @1=Titik Arah @1
 | 
			
		||||
Set waypoint to current location=Tetapkan titik arah ke lokasi semasa
 | 
			
		||||
invisible=Sembunyikan
 | 
			
		||||
visible=Paparkan
 | 
			
		||||
Make waypoint @1=@1 titik arah
 | 
			
		||||
Disable=Sembunyikan
 | 
			
		||||
Enable=Paparkan
 | 
			
		||||
@1 display of waypoint coordinates=@1 koordinat untuk titik arah
 | 
			
		||||
Hide waypoint=
 | 
			
		||||
Show waypoint=
 | 
			
		||||
Hide coordinates=
 | 
			
		||||
Show coordinates=
 | 
			
		||||
Change color of waypoint display=Tukar warna paparan titik arah
 | 
			
		||||
Edit waypoint name=Edit nama titik arah
 | 
			
		||||
Waypoint active=Titik arah aktif
 | 
			
		||||
@@ -76,3 +88,13 @@ Finish editing=Selesai edit
 | 
			
		||||
World position=Kedudukan dunia
 | 
			
		||||
Name=Nama
 | 
			
		||||
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
 | 
			
		||||
Mixing=
 | 
			
		||||
Cooking=
 | 
			
		||||
Digging=
 | 
			
		||||
Bags=Plecaki
 | 
			
		||||
Bag @1=Plecak @1
 | 
			
		||||
Small Bag=Maly plecak
 | 
			
		||||
Medium Bag=Sredni plecak
 | 
			
		||||
Large Bag=Duzy plecak
 | 
			
		||||
All Items=
 | 
			
		||||
Misc. Items=
 | 
			
		||||
Plant Life=
 | 
			
		||||
Building Materials=
 | 
			
		||||
Tools=
 | 
			
		||||
Minerals and Metals=
 | 
			
		||||
Environment and Worldgen=
 | 
			
		||||
Lighting=
 | 
			
		||||
 and = i 
 | 
			
		||||
Scroll categories left=
 | 
			
		||||
Scroll categories right=
 | 
			
		||||
Search=Szukaj
 | 
			
		||||
Reset search and display everything=
 | 
			
		||||
First page=Pierwsza strona
 | 
			
		||||
Back three pages=3 strony w tyl
 | 
			
		||||
Back one page=1 strona w tyl
 | 
			
		||||
Forward one page=1 strona do przodu
 | 
			
		||||
Forward three pages=3 strony do przodu
 | 
			
		||||
Last page=Ostatnia strona
 | 
			
		||||
Search=Szukaj
 | 
			
		||||
No matching items=Brak pasujacych przedmiotow
 | 
			
		||||
No matches.=Brak wyników
 | 
			
		||||
Page=Strona
 | 
			
		||||
@1 of @2=@1 z @2
 | 
			
		||||
Filter=Filtr
 | 
			
		||||
Can use the creative inventory=
 | 
			
		||||
Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=
 | 
			
		||||
Crafting Grid=
 | 
			
		||||
Crafting Guide=
 | 
			
		||||
Set home position=Ustaw pozycję wyjściową
 | 
			
		||||
Home position set to: @1=Pozycja domowa ustawiona na: @1
 | 
			
		||||
You don't have the "home" privilege!=Nie masz uprawnien do zmiany czasu "home"!
 | 
			
		||||
@@ -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
 | 
			
		||||
Time of day set to 9pm=Czas ustawiony na 21:00
 | 
			
		||||
Clear inventory=Wyczyść zapasy
 | 
			
		||||
This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
			
		||||
Inventory cleared!=Zapasy zostały wyczyszczone!
 | 
			
		||||
Trash:=Smietnik:
 | 
			
		||||
Refill:=Uzupelnianie:
 | 
			
		||||
Any item belonging to the @1 group=
 | 
			
		||||
Any item belonging to the groups @1=
 | 
			
		||||
Recipe @1 of @2=Recepta @1 z @2
 | 
			
		||||
Usage @1 of @2=Użycie @1 z @2
 | 
			
		||||
No recipes=Brak recepty
 | 
			
		||||
No usages=Bez użycia
 | 
			
		||||
Result=Wynik
 | 
			
		||||
Ingredient=Składnik
 | 
			
		||||
Show next recipe=
 | 
			
		||||
Show next usage=
 | 
			
		||||
Show previous recipe=
 | 
			
		||||
Show previous usage=
 | 
			
		||||
@1 (@2)=
 | 
			
		||||
Give me:=Daj mi:
 | 
			
		||||
This recipe is too@@large to be displayed.=
 | 
			
		||||
To craft grid:=
 | 
			
		||||
All=Wszystko
 | 
			
		||||
Crafting=
 | 
			
		||||
White=Bialy
 | 
			
		||||
Yellow=Zolty
 | 
			
		||||
Red=Czerwony
 | 
			
		||||
@@ -47,10 +76,10 @@ Waypoints=Punkty orientacyjne
 | 
			
		||||
Select Waypoint #@1=Wybierz punkt #@1
 | 
			
		||||
Waypoint @1=Punkty orientacyjne @1
 | 
			
		||||
Set waypoint to current location=Ustaw punkt orientacyjny na biezacej pozycji
 | 
			
		||||
invisible=niewidzialny
 | 
			
		||||
visible=widomy
 | 
			
		||||
Make waypoint @1=Robić punkt @1
 | 
			
		||||
@1 display of waypoint coordinates=@1 koordynatow punktu
 | 
			
		||||
Hide waypoint=
 | 
			
		||||
Show waypoint=
 | 
			
		||||
Hide coordinates=
 | 
			
		||||
Show coordinates=
 | 
			
		||||
Change color of waypoint display=Zmien kolor punktu
 | 
			
		||||
Edit waypoint name=Edytuj nazwe punktu
 | 
			
		||||
Waypoint active=Punkt wlaczony
 | 
			
		||||
@@ -59,3 +88,11 @@ Finish editing=Zakoncz edycje
 | 
			
		||||
World position=Pozycja
 | 
			
		||||
Name=Nazwa
 | 
			
		||||
HUD text color=Kolor tekstu HUD
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
##### not used anymore #####
 | 
			
		||||
 | 
			
		||||
invisible=niewidzialny
 | 
			
		||||
visible=widomy
 | 
			
		||||
Make waypoint @1=Robić punkt @1
 | 
			
		||||
@1 display of waypoint coordinates=@1 koordynatow punktu
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
# textdomain: unified_inventory
 | 
			
		||||
Crafting=Artesanato
 | 
			
		||||
Mixing=Muistura
 | 
			
		||||
Cooking=Cozimento
 | 
			
		||||
Digging=Escavação
 | 
			
		||||
@@ -8,21 +7,32 @@ Bag @1=Bolsa @1
 | 
			
		||||
Small Bag=Bolsa Pequena
 | 
			
		||||
Medium Bag=Bolsa Média
 | 
			
		||||
Large Bag=Bolsa Grande
 | 
			
		||||
All Items=
 | 
			
		||||
Misc. Items=
 | 
			
		||||
Plant Life=
 | 
			
		||||
Building Materials=
 | 
			
		||||
Tools=
 | 
			
		||||
Minerals and Metals=
 | 
			
		||||
Environment and Worldgen=
 | 
			
		||||
Lighting=
 | 
			
		||||
 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
 | 
			
		||||
Back three pages=Voltar 3 Páginas
 | 
			
		||||
Back one page=Voltar 1 Página
 | 
			
		||||
Forward one page=Avançar 1 Página
 | 
			
		||||
Forward three pages=Avançar 3 Páginas
 | 
			
		||||
Last page=Ultima Página
 | 
			
		||||
Search=Pesquisar
 | 
			
		||||
Reset search and display everything=Redefinir pesquisa e exibir tudo
 | 
			
		||||
No matching items=Nenhum item correspondente
 | 
			
		||||
No matches.=Sem correspondências
 | 
			
		||||
Page=Página
 | 
			
		||||
@1 of @2=@1 de @2
 | 
			
		||||
Filter=Filtro
 | 
			
		||||
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 Guide=Guia de Artesanato
 | 
			
		||||
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
 | 
			
		||||
Time of day set to 9pm=Hora do dia ajustada para 21h
 | 
			
		||||
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!
 | 
			
		||||
Trash:=Lixo:
 | 
			
		||||
Refill:=Recarga:
 | 
			
		||||
@@ -50,9 +61,12 @@ Show next recipe=Exibir Próxima Receita
 | 
			
		||||
Show next usage=Mostrar Próxima Utilização
 | 
			
		||||
Show previous recipe=Exibir Receita Anterior
 | 
			
		||||
Show previous usage=Exibir Utilização Anterior
 | 
			
		||||
@1 (@2)=
 | 
			
		||||
Give me:=Gerado:
 | 
			
		||||
This recipe is too@@large to be displayed.=
 | 
			
		||||
To craft grid:=Para Grade de Artesanato
 | 
			
		||||
All=MAX
 | 
			
		||||
Crafting=Artesanato
 | 
			
		||||
White=Branco
 | 
			
		||||
Yellow=Amarelo
 | 
			
		||||
Red=Vermelho
 | 
			
		||||
@@ -62,10 +76,10 @@ Waypoints=Apontador de Direção
 | 
			
		||||
Select Waypoint #@1=Seleção de 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
 | 
			
		||||
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
 | 
			
		||||
Hide waypoint=
 | 
			
		||||
Show waypoint=
 | 
			
		||||
Hide coordinates=
 | 
			
		||||
Show coordinates=
 | 
			
		||||
Change color of waypoint display=Mudar cor exibida do Apontador de Direção
 | 
			
		||||
Edit waypoint name=Editar Nome de Apontador de Direção
 | 
			
		||||
Waypoint active=Apontador de Direção Ativo
 | 
			
		||||
@@ -74,3 +88,11 @@ Finish editing=Edição Finalizada
 | 
			
		||||
World position=Posição Mundial
 | 
			
		||||
Name=Nome
 | 
			
		||||
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
 | 
			
		||||
Crafting=Крафт
 | 
			
		||||
Mixing=Мешать
 | 
			
		||||
Cooking=Варить
 | 
			
		||||
Digging=Копать
 | 
			
		||||
@@ -8,21 +7,32 @@ Bag @1=Сумка @1
 | 
			
		||||
Small Bag=Малая сумка
 | 
			
		||||
Medium Bag=Средняя сумка
 | 
			
		||||
Large Bag=Большая сумка
 | 
			
		||||
All Items=
 | 
			
		||||
Misc. Items=
 | 
			
		||||
Plant Life=
 | 
			
		||||
Building Materials=
 | 
			
		||||
Tools=
 | 
			
		||||
Minerals and Metals=
 | 
			
		||||
Environment and Worldgen=
 | 
			
		||||
Lighting=
 | 
			
		||||
 and = и 
 | 
			
		||||
Scroll categories left=
 | 
			
		||||
Scroll categories right=
 | 
			
		||||
Search=Поиск
 | 
			
		||||
Reset search and display everything=Сброс поиска, показать всё
 | 
			
		||||
First page=Первая страница
 | 
			
		||||
Back three pages=3 страницы назад
 | 
			
		||||
Back one page=1 страницу назад
 | 
			
		||||
Forward one page=1 страницу вперёд
 | 
			
		||||
Forward three pages=3 страницы вперёд
 | 
			
		||||
Last page=Последняя страница
 | 
			
		||||
Search=Поиск
 | 
			
		||||
Reset search and display everything=Сброс поиска, показать всё
 | 
			
		||||
No matching items=Нет подходящих элементов
 | 
			
		||||
No matches.=Ничего не найдено
 | 
			
		||||
Page=Страница
 | 
			
		||||
@1 of @2=@1 из @2
 | 
			
		||||
Filter=Фильтр
 | 
			
		||||
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=Установить позицию дома
 | 
			
		||||
@@ -35,6 +45,7 @@ You don't have the settime privilege!=Вам не разрешено устан
 | 
			
		||||
Set time to night=Ночь
 | 
			
		||||
Time of day set to 9pm=Установлено время 9 вечера
 | 
			
		||||
Clear inventory=Очистить инвентарь
 | 
			
		||||
This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=
 | 
			
		||||
Inventory cleared!=Инвентарь очищен!
 | 
			
		||||
Trash:=Мусор:
 | 
			
		||||
Refill:=Наполнить:
 | 
			
		||||
@@ -50,9 +61,12 @@ 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:=На решeтку крафта:
 | 
			
		||||
All=Все
 | 
			
		||||
Crafting=Крафт
 | 
			
		||||
White=Белый
 | 
			
		||||
Yellow=Желтый
 | 
			
		||||
Red=Красный
 | 
			
		||||
@@ -62,12 +76,10 @@ Waypoints=Путевые точки
 | 
			
		||||
Select Waypoint #@1=Выбрать путевую точку №@1
 | 
			
		||||
Waypoint @1=Путевая точка @1
 | 
			
		||||
Set waypoint to current location=Установить путевую точку по текущей позиции
 | 
			
		||||
invisible=невидимой
 | 
			
		||||
visible=видимой
 | 
			
		||||
Make waypoint @1=Сделать путевую точку @1
 | 
			
		||||
Disable=Выключить
 | 
			
		||||
Enable=Включить
 | 
			
		||||
@1 display of waypoint coordinates=@1 показ координат путевых точек
 | 
			
		||||
Hide waypoint=
 | 
			
		||||
Show waypoint=
 | 
			
		||||
Hide coordinates=
 | 
			
		||||
Show coordinates=
 | 
			
		||||
Change color of waypoint display=Поменять цвет путевой точки
 | 
			
		||||
Edit waypoint name=Переименовать путевую точку
 | 
			
		||||
Waypoint active=Путевая точка включена
 | 
			
		||||
@@ -76,3 +88,13 @@ Finish editing=Закончить редакцию
 | 
			
		||||
World position=Позиция мира
 | 
			
		||||
Name=Имя
 | 
			
		||||
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
 | 
			
		||||
Crafting=Üretim
 | 
			
		||||
Mixing=Karıştırma
 | 
			
		||||
Cooking=Pişirme
 | 
			
		||||
Digging=Kazma
 | 
			
		||||
@@ -8,20 +7,32 @@ Bag @1=@1. Çanta
 | 
			
		||||
Small Bag=Küçük Çanta
 | 
			
		||||
Medium Bag=Ç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 
 | 
			
		||||
Scroll categories left=
 | 
			
		||||
Scroll categories right=
 | 
			
		||||
Search=Ara
 | 
			
		||||
Reset search and display everything=
 | 
			
		||||
First page=İlk Sayfa
 | 
			
		||||
Back three pages=3 Sayfa Gerile
 | 
			
		||||
Back one page=Geri
 | 
			
		||||
Forward one page=İleri
 | 
			
		||||
Forward three pages=3 Sayfa İlerile
 | 
			
		||||
Last page=Son Sayfa
 | 
			
		||||
Search=Ara
 | 
			
		||||
No matching items=Eşleşme yok
 | 
			
		||||
No matches.=Eşleşme yok
 | 
			
		||||
Page=Sayfa
 | 
			
		||||
@1 of @2=@1 dan @2
 | 
			
		||||
Filter=Süzgeç
 | 
			
		||||
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 Guide=Kılavuz
 | 
			
		||||
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!
 | 
			
		||||
Set time to night=Geceye zaman ayarla
 | 
			
		||||
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!
 | 
			
		||||
Trash:=Çöp
 | 
			
		||||
Refill:=Doldur
 | 
			
		||||
Any item belonging to the @1 group=
 | 
			
		||||
Any item belonging to the groups @1=
 | 
			
		||||
Recipe @1 of @2=@1 dan @2 tarifi
 | 
			
		||||
Usage @1 of @2=Kullanım @1/@2
 | 
			
		||||
No recipes=Tarifi yok
 | 
			
		||||
No usages=Kullanım yok
 | 
			
		||||
Result=Çıktı
 | 
			
		||||
Ingredient=Bileşen
 | 
			
		||||
Show next recipe=
 | 
			
		||||
Show next usage=
 | 
			
		||||
Show previous recipe=
 | 
			
		||||
Show previous usage=
 | 
			
		||||
@1 (@2)=
 | 
			
		||||
Give me:=Ver bana:
 | 
			
		||||
This recipe is too@@large to be displayed.=
 | 
			
		||||
To craft grid:=Üretim tablosuna kopyala
 | 
			
		||||
All=Tümü
 | 
			
		||||
Crafting=Üretim
 | 
			
		||||
White=Beyaz
 | 
			
		||||
Yellow=Sarı
 | 
			
		||||
Red=Kırmızı
 | 
			
		||||
@@ -55,10 +76,10 @@ Waypoints=Konum Noktaları
 | 
			
		||||
Select Waypoint #@1=#@1 konum noktası seç
 | 
			
		||||
Waypoint @1=@1 Konum Noktaları
 | 
			
		||||
Set waypoint to current location=Bulunduğun noktayı işaretle
 | 
			
		||||
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
 | 
			
		||||
Hide waypoint=
 | 
			
		||||
Show waypoint=
 | 
			
		||||
Hide coordinates=
 | 
			
		||||
Show coordinates=
 | 
			
		||||
Change color of waypoint display=Konum Gösterge Rengi
 | 
			
		||||
Edit waypoint name=Konum Noktasını Düzenle
 | 
			
		||||
Waypoint active=Konum Etkin
 | 
			
		||||
@@ -67,3 +88,12 @@ Finish editing=Düzenleme bitti
 | 
			
		||||
World position=Dünya konumu
 | 
			
		||||
Name=İsim
 | 
			
		||||
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
 | 
			
		||||
# traslation by: IFRFSX(BingFengFSX)
 | 
			
		||||
#Email: IFRFSX@Protonmail.com
 | 
			
		||||
 | 
			
		||||
Crafting=合成
 | 
			
		||||
Mixing=混合
 | 
			
		||||
Cooking=烹饪
 | 
			
		||||
Digging=挖出
 | 
			
		||||
@@ -11,20 +7,32 @@ Bag @1=背包@1
 | 
			
		||||
Small Bag=小背包
 | 
			
		||||
Medium Bag=中背包
 | 
			
		||||
Large Bag=大背包
 | 
			
		||||
All Items=所有物品
 | 
			
		||||
Misc. Items=杂项
 | 
			
		||||
Plant Life=植物
 | 
			
		||||
Building Materials=建材
 | 
			
		||||
Tools=工具
 | 
			
		||||
Minerals and Metals=矿物与金属
 | 
			
		||||
Environment and Worldgen=自然环境
 | 
			
		||||
Lighting=光源
 | 
			
		||||
 and = 和 
 | 
			
		||||
Scroll categories left=向左滚动分类栏
 | 
			
		||||
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=最后一页
 | 
			
		||||
Search=搜索
 | 
			
		||||
No matching items=没有匹配物品
 | 
			
		||||
No matches.=没有匹配
 | 
			
		||||
Page=页面
 | 
			
		||||
@1 of @2=第@1页,共@2页
 | 
			
		||||
Filter=过滤器
 | 
			
		||||
Can use the creative inventory=可以使用创造背包
 | 
			
		||||
Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=如果轻量模式被全局配置,强迫Unified Inventory以完全模式展现。
 | 
			
		||||
Crafting Grid=合成表
 | 
			
		||||
Crafting Guide=合成指南
 | 
			
		||||
Set home position=设置家的位置
 | 
			
		||||
@@ -36,21 +44,29 @@ Time of day set to 6am=时间设置到早晨6点
 | 
			
		||||
You don't have the settime privilege!=你没有“settime”权限!
 | 
			
		||||
Set time to night=设置时间到晚上
 | 
			
		||||
Time of day set to 9pm=时间设置到晚上9点
 | 
			
		||||
 | 
			
		||||
Inventory cleared!=清空背包
 | 
			
		||||
Clear inventory=清空背包
 | 
			
		||||
 | 
			
		||||
This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=此按钮已在非创造模式中禁用以防止意外的背包清空。@n请使用垃圾桶栏。
 | 
			
		||||
Inventory cleared!=清空背包
 | 
			
		||||
Trash:=丢弃:
 | 
			
		||||
Refill:=填满:
 | 
			
		||||
Any item belonging to the @1 group=属于@1组的任何项目
 | 
			
		||||
Any item belonging to the groups @1=属于组@1的任何项目
 | 
			
		||||
Recipe @1 of @2=第@1配方,共@2个
 | 
			
		||||
Usage @1 of @2=第@1用法,共@2个
 | 
			
		||||
No recipes=没有配方
 | 
			
		||||
No usages=没有用法
 | 
			
		||||
Result=结果
 | 
			
		||||
Ingredient=原料
 | 
			
		||||
Show next recipe=显示下一个配方
 | 
			
		||||
Show next usage=显示下一个用法
 | 
			
		||||
Show previous recipe=显示前一个配方
 | 
			
		||||
Show previous usage=显示前一个用法
 | 
			
		||||
@1 (@2)=@1 (@2)
 | 
			
		||||
Give me:=给予:
 | 
			
		||||
This recipe is too@@large to be displayed.=该配方太@@大,不能显示。
 | 
			
		||||
To craft grid:=填充物品到合成表
 | 
			
		||||
All=全部
 | 
			
		||||
Crafting=合成
 | 
			
		||||
White=白
 | 
			
		||||
Yellow=黄
 | 
			
		||||
Red=红
 | 
			
		||||
@@ -60,10 +76,10 @@ Waypoints=航路点
 | 
			
		||||
Select Waypoint #@1=查询航路点 #@1
 | 
			
		||||
Waypoint @1=航路点 @1
 | 
			
		||||
Set waypoint to current location=将航路点设置到当前位置
 | 
			
		||||
invisible=不可见的
 | 
			
		||||
visible=可见的
 | 
			
		||||
Make waypoint @1=设置航路点 @1
 | 
			
		||||
@1 display of waypoint coordinates=显示航路点@1坐标
 | 
			
		||||
Hide waypoint=隐藏航路点
 | 
			
		||||
Show waypoint=显示航路点
 | 
			
		||||
Hide coordinates=隐藏坐标
 | 
			
		||||
Show coordinates=显示坐标
 | 
			
		||||
Change color of waypoint display=改变航路点显示的颜色
 | 
			
		||||
Edit waypoint name=编辑航路点名称
 | 
			
		||||
Waypoint active=航路点已激活
 | 
			
		||||
@@ -73,7 +89,10 @@ World position=世界位置
 | 
			
		||||
Name=名称
 | 
			
		||||
HUD text color=HUD文本颜色
 | 
			
		||||
 | 
			
		||||
Reset search and display everything=重置搜索并显示所有物品
 | 
			
		||||
 | 
			
		||||
Any item belonging to the @1 group=属于@1组的任何项目
 | 
			
		||||
Any item belonging to the groups @1=属于组@1的任何项目
 | 
			
		||||
##### not used anymore #####
 | 
			
		||||
 | 
			
		||||
invisible=不可见的
 | 
			
		||||
visible=可见的
 | 
			
		||||
Make waypoint @1=设置航路点 @1
 | 
			
		||||
@1 display of waypoint coordinates=显示航路点@1坐标
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,4 @@
 | 
			
		||||
# textdomain: unified_inventory
 | 
			
		||||
# traslation by: IFRFSX(BingFengFSX)
 | 
			
		||||
#Email: IFRFSX@Protonmail.com
 | 
			
		||||
 | 
			
		||||
Crafting=合成
 | 
			
		||||
Mixing=混合
 | 
			
		||||
Cooking=烹飪
 | 
			
		||||
Digging=挖出
 | 
			
		||||
@@ -11,20 +7,32 @@ Bag @1=揹包@1
 | 
			
		||||
Small Bag=小揹包
 | 
			
		||||
Medium Bag=中揹包
 | 
			
		||||
Large Bag=大揹包
 | 
			
		||||
All Items=所有物品
 | 
			
		||||
Misc. Items=雜項
 | 
			
		||||
Plant Life=植物
 | 
			
		||||
Building Materials=建材
 | 
			
		||||
Tools=工具
 | 
			
		||||
Minerals and Metals=礦物與金屬
 | 
			
		||||
Environment and Worldgen=自然環境
 | 
			
		||||
Lighting=光源
 | 
			
		||||
 and = 和 
 | 
			
		||||
Scroll categories left=向左滾動分類欄
 | 
			
		||||
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=最後一頁
 | 
			
		||||
Search=搜索
 | 
			
		||||
No matching items=沒有匹配物品
 | 
			
		||||
No matches.=沒有匹配
 | 
			
		||||
Page=頁面
 | 
			
		||||
@1 of @2=第@1頁,共@2頁
 | 
			
		||||
Filter=過濾器
 | 
			
		||||
Can use the creative inventory=可以使用創造揹包
 | 
			
		||||
Forces Unified Inventory to be displayed in Full mode if Lite mode is configured globally=如果輕量模式被全局配置,強迫Unified Inventory以完全模式展現。
 | 
			
		||||
Crafting Grid=合成表
 | 
			
		||||
Crafting Guide=合成指南
 | 
			
		||||
Set home position=設置家的位置
 | 
			
		||||
@@ -36,21 +44,29 @@ Time of day set to 6am=時間設置到早晨6點
 | 
			
		||||
You don't have the settime privilege!=你沒有“settime”權限!
 | 
			
		||||
Set time to night=設置時間到晚上
 | 
			
		||||
Time of day set to 9pm=時間設置到晚上9點
 | 
			
		||||
 | 
			
		||||
Inventory cleared!=清空揹包
 | 
			
		||||
Clear inventory=清空揹包
 | 
			
		||||
 | 
			
		||||
This button has been disabled outside of creative mode to prevent accidental inventory trashing.@nUse the trash slot instead.=此按鈕已在非創造模式中禁用以防止意外的背包清空。@n請使用垃圾桶欄。
 | 
			
		||||
Inventory cleared!=清空揹包
 | 
			
		||||
Trash:=丟棄:
 | 
			
		||||
Refill:=填滿:
 | 
			
		||||
Any item belonging to the @1 group=屬於@1組的任何項目
 | 
			
		||||
Any item belonging to the groups @1=屬於組@1的任何項目
 | 
			
		||||
Recipe @1 of @2=第@1配方,共@2個
 | 
			
		||||
Usage @1 of @2=第@1用法,共@2個
 | 
			
		||||
No recipes=沒有配方
 | 
			
		||||
No usages=沒有用法
 | 
			
		||||
Result=結果
 | 
			
		||||
Ingredient=原料
 | 
			
		||||
Show next recipe=顯示下一個配方
 | 
			
		||||
Show next usage=顯示下一個用法
 | 
			
		||||
Show previous recipe=顯示上一個配方
 | 
			
		||||
Show previous usage=顯示上一個用法
 | 
			
		||||
@1 (@2)=@1 (@2)
 | 
			
		||||
Give me:=給予:
 | 
			
		||||
This recipe is too@@large to be displayed.=該配方太@@大,不能顯示。
 | 
			
		||||
To craft grid:=填充物品到合成表
 | 
			
		||||
All=全部
 | 
			
		||||
Crafting=合成
 | 
			
		||||
White=白
 | 
			
		||||
Yellow=黃
 | 
			
		||||
Red=紅
 | 
			
		||||
@@ -60,10 +76,10 @@ Waypoints=航路點
 | 
			
		||||
Select Waypoint #@1=查詢航路點 #@1
 | 
			
		||||
Waypoint @1=航路點 @1
 | 
			
		||||
Set waypoint to current location=將航路點設置到當前位置
 | 
			
		||||
invisible=不可見的
 | 
			
		||||
visible=可見的
 | 
			
		||||
Make waypoint @1=設置航路點 @1
 | 
			
		||||
@1 display of waypoint coordinates=顯示航路點@1座標
 | 
			
		||||
Hide waypoint=隱藏航路點
 | 
			
		||||
Show waypoint=顯示航路點
 | 
			
		||||
Hide coordinates=隱藏坐標
 | 
			
		||||
Show coordinates=顯示坐標
 | 
			
		||||
Change color of waypoint display=改變航路點顯示的顏色
 | 
			
		||||
Edit waypoint name=編輯航路點名稱
 | 
			
		||||
Waypoint active=航路點已激活
 | 
			
		||||
@@ -73,7 +89,10 @@ World position=世界位置
 | 
			
		||||
Name=名稱
 | 
			
		||||
HUD text color=HUD文本顏色
 | 
			
		||||
 | 
			
		||||
Reset search and display everything=重置搜索並顯示所有物品
 | 
			
		||||
 | 
			
		||||
Any item belonging to the @1 group=屬於@1組的任何項目
 | 
			
		||||
Any item belonging to the groups @1=屬於組@1的任何項目
 | 
			
		||||
##### not used anymore #####
 | 
			
		||||
 | 
			
		||||
invisible=不可見的
 | 
			
		||||
visible=可見的
 | 
			
		||||
Make waypoint @1=設置航路點 @1
 | 
			
		||||
@1 display of waypoint coordinates=顯示航路點@1座標
 | 
			
		||||
 
 | 
			
		||||
@@ -126,25 +126,18 @@ Example output:
 | 
			
		||||
	}
 | 
			
		||||
--]]
 | 
			
		||||
function unified_inventory.find_usable_items(inv_items, craft_items)
 | 
			
		||||
	local get_group = minetest.get_item_group
 | 
			
		||||
	local result = {}
 | 
			
		||||
 | 
			
		||||
	for craft_item in pairs(craft_items) do
 | 
			
		||||
		local group = craft_item:match("^group:(.+)")
 | 
			
		||||
		local found = {}
 | 
			
		||||
		-- may specify group:type1,type2
 | 
			
		||||
		local items = unified_inventory.get_matching_items(craft_item)
 | 
			
		||||
 | 
			
		||||
		if group ~= nil then
 | 
			
		||||
			for inv_item in pairs(inv_items) do
 | 
			
		||||
				if get_group(inv_item, group) > 0 then
 | 
			
		||||
					found[inv_item] = true
 | 
			
		||||
				end
 | 
			
		||||
			end
 | 
			
		||||
		else
 | 
			
		||||
			if inv_items[craft_item] ~= nil then
 | 
			
		||||
				found[craft_item] = true
 | 
			
		||||
		local found = {}
 | 
			
		||||
		for itemname, _ in pairs(items) do
 | 
			
		||||
			if inv_items[itemname] then
 | 
			
		||||
				found[itemname] = true
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		result[craft_item] = found
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								mod.conf
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								mod.conf
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
name = unified_inventory
 | 
			
		||||
depends = default
 | 
			
		||||
optional_depends = creative, sfinv, datastorage, farming
 | 
			
		||||
 | 
			
		||||
optional_depends = default, creative, sfinv, datastorage
 | 
			
		||||
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.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								register.lua
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								register.lua
									
									
									
									
									
								
							@@ -207,9 +207,9 @@ ui.register_page("craft", {
 | 
			
		||||
 | 
			
		||||
local function stack_image_button(x, y, w, h, buttonname_prefix, item)
 | 
			
		||||
	local name = item:get_name()
 | 
			
		||||
	local count = item:get_count()
 | 
			
		||||
	local description = item:get_meta():get_string("description")
 | 
			
		||||
	local show_is_group = false
 | 
			
		||||
	local displayitem = name.." "..count
 | 
			
		||||
	local displayitem = item:to_string()
 | 
			
		||||
	local selectitem = name
 | 
			
		||||
	if name:sub(1, 6) == "group:" then
 | 
			
		||||
		local group_name = name:sub(7)
 | 
			
		||||
@@ -219,7 +219,9 @@ local function stack_image_button(x, y, w, h, buttonname_prefix, item)
 | 
			
		||||
		selectitem = group_item.sole and displayitem or name
 | 
			
		||||
	end
 | 
			
		||||
	local label = show_is_group and "G" or ""
 | 
			
		||||
	local buttonname = F(buttonname_prefix..ui.mangle_for_formspec(selectitem))
 | 
			
		||||
	-- Unique id to prevent tooltip being overridden
 | 
			
		||||
	local id = string.format("%i%i_", x*10, y*10)
 | 
			
		||||
	local buttonname = F(id..buttonname_prefix..ui.mangle_for_formspec(selectitem))
 | 
			
		||||
	local button = string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",
 | 
			
		||||
			x, y, w, h,
 | 
			
		||||
			F(displayitem), buttonname, label)
 | 
			
		||||
@@ -235,10 +237,15 @@ local function stack_image_button(x, y, w, h, buttonname_prefix, item)
 | 
			
		||||
		if andcount >= 1 then
 | 
			
		||||
			button = button  .. string.format("tooltip[%s;%s]", buttonname, grouptip)
 | 
			
		||||
		end
 | 
			
		||||
	elseif description ~= "" then
 | 
			
		||||
		button = button  .. string.format("tooltip[%s;%s]", buttonname, F(description))
 | 
			
		||||
	end
 | 
			
		||||
	return button
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- The recipe text contains parameters, hence they can yet not be translated.
 | 
			
		||||
-- Instead, use a dummy translation call so that it can be picked up by the
 | 
			
		||||
-- static parsing of the translation string update script
 | 
			
		||||
local recipe_text = {
 | 
			
		||||
	recipe = NS("Recipe @1 of @2"),
 | 
			
		||||
	usage = NS("Usage @1 of @2"),
 | 
			
		||||
@@ -493,6 +500,14 @@ local function craftguide_craft(player, formname, fields)
 | 
			
		||||
	local alternate = ui.alternate[player_name]
 | 
			
		||||
 | 
			
		||||
	local craft = crafts[alternate]
 | 
			
		||||
	if not craft.width then
 | 
			
		||||
		if not craft.output then
 | 
			
		||||
			minetest.log("warning", "[unified_inventory] Craft has no output.")
 | 
			
		||||
		else
 | 
			
		||||
			minetest.log("warning", ("[unified_inventory] Craft for '%s' has no width."):format(craft.output))
 | 
			
		||||
		end
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	if craft.width > 3 then return end
 | 
			
		||||
 | 
			
		||||
	ui.craftguide_match_craft(player, "main", "craft", craft, amount)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								screenshot.png
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								screenshot.png
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 220 KiB  | 
@@ -10,5 +10,8 @@ unified_inventory_bags (Enable bags) bool true
 | 
			
		||||
#and the give privilege.
 | 
			
		||||
unified_inventory_trash (Enable trash) bool true
 | 
			
		||||
 | 
			
		||||
#If enabled, disabled buttons will be hidden instead of grayed out.
 | 
			
		||||
unified_inventory_hide_disabled_buttons (Hide disabled buttons) bool false
 | 
			
		||||
 | 
			
		||||
unified_inventory_automatic_categorization (Items automatically added to categories) bool true
 | 
			
		||||
 | 
			
		||||
unified_inventory_automatic_categorization (Items automatically added to categories) bool true
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 240 B After Width: | Height: | Size: 510 B  | 
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 139 B After Width: | Height: | Size: 551 B  | 
							
								
								
									
										228
									
								
								waypoints.lua
									
									
									
									
									
								
							
							
						
						
									
										228
									
								
								waypoints.lua
									
									
									
									
									
								
							@@ -1,6 +1,7 @@
 | 
			
		||||
local S = minetest.get_translator("unified_inventory")
 | 
			
		||||
local F = minetest.formspec_escape
 | 
			
		||||
local ui = unified_inventory
 | 
			
		||||
local COUNT = 5
 | 
			
		||||
 | 
			
		||||
local hud_colors = {
 | 
			
		||||
	{"#FFFFFF", 0xFFFFFF, S("White")},
 | 
			
		||||
@@ -10,11 +11,97 @@ local hud_colors = {
 | 
			
		||||
	{"#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 = {}
 | 
			
		||||
 | 
			
		||||
--[[
 | 
			
		||||
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)
 | 
			
		||||
		local player_name = player:get_player_name()
 | 
			
		||||
@@ -24,73 +111,83 @@ ui.register_page("waypoints", {
 | 
			
		||||
		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
 | 
			
		||||
		-- during sign-on and returned an empty entry
 | 
			
		||||
		if not waypoints_temp[player_name] then waypoints_temp[player_name] = {hud = 1} end
 | 
			
		||||
		local waypoints = get_waypoint_data(player)
 | 
			
		||||
		local sel = waypoints.selected or 1
 | 
			
		||||
 | 
			
		||||
		local waypoints = datastorage.get(player_name, "waypoints")
 | 
			
		||||
		local formspec = { ui.style_full.standard_inv_bg,
 | 
			
		||||
		local formspec = {
 | 
			
		||||
			ui.style_full.standard_inv_bg,
 | 
			
		||||
			string.format("label[%f,%f;%s]",
 | 
			
		||||
				ui.style_full.form_header_x, ui.style_full.form_header_y,
 | 
			
		||||
				F(S("Waypoints"))),
 | 
			
		||||
				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:
 | 
			
		||||
		for i = 1, 5 do
 | 
			
		||||
		for i = 1, COUNT do
 | 
			
		||||
			local sw="select_waypoint"..i
 | 
			
		||||
			formspec[n] = string.format("image_button[%f,%f;%f,%f;%sui_%i_icon.png;%s;]",
 | 
			
		||||
				ui.style_full.main_button_x, wp_bottom_row - (5-i) * ui.style_full.btn_spc,
 | 
			
		||||
				ui.style_full.btn_size, ui.style_full.btn_size,
 | 
			
		||||
				(i == waypoints.selected) and "ui_blue_icon_background.png^" or "",
 | 
			
		||||
				(i == sel) and "ui_blue_icon_background.png^" or "",
 | 
			
		||||
				i, sw)
 | 
			
		||||
			formspec[n+1] = "tooltip["..sw..";"..S("Select Waypoint #@1", i).."]"
 | 
			
		||||
			n = n + 2
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		local i = waypoints.selected or 1
 | 
			
		||||
		local waypoint = waypoints[i] or {}
 | 
			
		||||
		local temp = waypoints_temp[player_name][i] or {}
 | 
			
		||||
		local default_name = S("Waypoint @1", i)
 | 
			
		||||
		local waypoint = waypoints.data[sel] or {}
 | 
			
		||||
		local temp = waypoints_temp[player_name][sel] or {}
 | 
			
		||||
		local default_name = S("Waypoint @1", sel)
 | 
			
		||||
 | 
			
		||||
		-- Main buttons:
 | 
			
		||||
		local btnlist = {
 | 
			
		||||
			{ "ui_waypoint_set_icon.png", "set_waypoint", S("Set waypoint to current location") },
 | 
			
		||||
			{ waypoint.active and "ui_on_icon.png" or "ui_off_icon.png", "toggle_waypoint", S("Make waypoint @1", waypoint.active and "invisible" or "visible") },
 | 
			
		||||
			{ 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)", "toggle_display_pos", S("@1 display of waypoint coordinates", waypoint.display_pos and "Disable" or "Enable") },
 | 
			
		||||
			{ "ui_circular_arrows_icon.png", "toggle_color", S("Change color of waypoint display") },
 | 
			
		||||
			{ "ui_pencil_icon.png", "rename_waypoint", S("Edit waypoint name") }
 | 
			
		||||
			set_waypoint = {
 | 
			
		||||
				"ui_waypoint_set_icon.png",
 | 
			
		||||
				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")
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		local x = 4
 | 
			
		||||
		for _, b in pairs(btnlist) do
 | 
			
		||||
		for name, def in pairs(btnlist) do
 | 
			
		||||
			formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s%i;]",
 | 
			
		||||
				wp_buttons_rj - ui.style_full.btn_spc * x, wp_bottom_row,
 | 
			
		||||
				ui.style_full.btn_size, ui.style_full.btn_size,
 | 
			
		||||
				b[1], b[2], i)
 | 
			
		||||
			formspec[n+1] = "tooltip["..b[2]..i..";"..F(b[3]).."]"
 | 
			
		||||
				def[1], name, sel)
 | 
			
		||||
			formspec[n+1] = "tooltip["..name..sel..";"..F(def[2]).."]"
 | 
			
		||||
			x = x - 1
 | 
			
		||||
			n = n + 2
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		-- Waypoint's info:
 | 
			
		||||
		formspec[n] = "label["..wp_info_x..","..(wp_info_y+1.1)..";"
 | 
			
		||||
		if waypoint.active then
 | 
			
		||||
			formspec[n+1] = F(S("Waypoint active")).."]"
 | 
			
		||||
		else
 | 
			
		||||
			formspec[n+1] = F(S("Waypoint inactive")).."]"
 | 
			
		||||
		end
 | 
			
		||||
		n = n + 2
 | 
			
		||||
		formspec[n] = ("label[%f,%f;%s]"):format(
 | 
			
		||||
			wp_info_x, wp_info_y + 1.1,
 | 
			
		||||
			F(waypoint.active and S("Waypoint active") or S("Waypoint inactive"))
 | 
			
		||||
		)
 | 
			
		||||
		n = n + 1
 | 
			
		||||
 | 
			
		||||
		if temp.edit then
 | 
			
		||||
			formspec[n] = string.format("field[%f,%f;%f,%f;rename_box%i;;%s]",
 | 
			
		||||
				wp_buttons_rj - wp_edit_w - 0.1, wp_bottom_row - ui.style_full.btn_spc,
 | 
			
		||||
				wp_edit_w, ui.style_full.btn_size, i, (waypoint.name or default_name))
 | 
			
		||||
				wp_edit_w, ui.style_full.btn_size, sel, (waypoint.name or default_name))
 | 
			
		||||
			formspec[n+1] = string.format("image_button[%f,%f;%f,%f;ui_ok_icon.png;confirm_rename%i;]",
 | 
			
		||||
				wp_buttons_rj, wp_bottom_row - ui.style_full.btn_spc,
 | 
			
		||||
				ui.style_full.btn_size, ui.style_full.btn_size, i)
 | 
			
		||||
			formspec[n+2] = "tooltip[confirm_rename"..i..";"..F(S("Finish editing")).."]"
 | 
			
		||||
				ui.style_full.btn_size, ui.style_full.btn_size, sel)
 | 
			
		||||
			formspec[n+2] = "tooltip[confirm_rename"..sel..";"..F(S("Finish editing")).."]"
 | 
			
		||||
			n = n + 3
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
@@ -114,10 +211,12 @@ ui.register_button("waypoints", {
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
local function update_hud(player, waypoints, temp, i)
 | 
			
		||||
	local waypoint = waypoints[i]
 | 
			
		||||
	local waypoint = waypoints.data[i]
 | 
			
		||||
	if not waypoint then return end
 | 
			
		||||
 | 
			
		||||
	temp[i] = temp[i] or {}
 | 
			
		||||
	temp = temp[i]
 | 
			
		||||
 | 
			
		||||
	local pos = waypoint.world_pos or vector.new()
 | 
			
		||||
	local name
 | 
			
		||||
	if waypoint.display_pos then
 | 
			
		||||
@@ -126,10 +225,13 @@ local function update_hud(player, waypoints, temp, i)
 | 
			
		||||
			name = name..", "..waypoint.name
 | 
			
		||||
		end
 | 
			
		||||
	else
 | 
			
		||||
		name = waypoint.name or "Waypoint "..i
 | 
			
		||||
		name = waypoint.name or S("Waypoint @1", i)
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- Perform HUD updates
 | 
			
		||||
	if temp.hud then
 | 
			
		||||
		player:hud_remove(temp.hud)
 | 
			
		||||
		temp.hud = nil
 | 
			
		||||
	end
 | 
			
		||||
	if waypoint.active then
 | 
			
		||||
		temp.hud = player:hud_add({
 | 
			
		||||
@@ -139,8 +241,6 @@ local function update_hud(player, waypoints, temp, i)
 | 
			
		||||
			text = "m",
 | 
			
		||||
			world_pos = pos
 | 
			
		||||
		})
 | 
			
		||||
	else
 | 
			
		||||
		temp.hud = nil
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
@@ -152,9 +252,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
			
		||||
	local need_update_hud = false
 | 
			
		||||
	local hit = false
 | 
			
		||||
 | 
			
		||||
	local waypoints = datastorage.get(player_name, "waypoints")
 | 
			
		||||
	local waypoints = get_waypoint_data(player)
 | 
			
		||||
	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
 | 
			
		||||
			hit = true
 | 
			
		||||
			waypoints.selected = i
 | 
			
		||||
@@ -163,20 +265,15 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
			
		||||
 | 
			
		||||
		if fields["toggle_waypoint"..i] then
 | 
			
		||||
			hit = true
 | 
			
		||||
			waypoints[i] = waypoints[i] or {}
 | 
			
		||||
			waypoints[i].active = not (waypoints[i].active)
 | 
			
		||||
			waypoint.active = not (waypoint.active)
 | 
			
		||||
			need_update_hud = true
 | 
			
		||||
			update_formspec = true
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		if fields["set_waypoint"..i] then
 | 
			
		||||
			hit = true
 | 
			
		||||
			local pos = player:get_pos()
 | 
			
		||||
			pos.x = math.floor(pos.x)
 | 
			
		||||
			pos.y = math.floor(pos.y)
 | 
			
		||||
			pos.z = math.floor(pos.z)
 | 
			
		||||
			waypoints[i] = waypoints[i] or {}
 | 
			
		||||
			waypoints[i].world_pos = pos
 | 
			
		||||
			local pos = vector.round(player:get_pos())
 | 
			
		||||
			waypoint.world_pos = pos
 | 
			
		||||
			need_update_hud = true
 | 
			
		||||
			update_formspec = true
 | 
			
		||||
		end
 | 
			
		||||
@@ -190,51 +287,58 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
			
		||||
 | 
			
		||||
		if fields["toggle_display_pos"..i] then
 | 
			
		||||
			hit = true
 | 
			
		||||
			waypoints[i] = waypoints[i] or {}
 | 
			
		||||
			waypoints[i].display_pos = not waypoints[i].display_pos
 | 
			
		||||
			waypoint.display_pos = not waypoint.display_pos
 | 
			
		||||
			need_update_hud = true
 | 
			
		||||
			update_formspec = true
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		if fields["toggle_color"..i] then
 | 
			
		||||
			hit = true
 | 
			
		||||
			waypoints[i] = waypoints[i] or {}
 | 
			
		||||
			local color = waypoints[i].color or 1
 | 
			
		||||
			local color = waypoint.color or 0
 | 
			
		||||
			color = color + 1
 | 
			
		||||
			if color > hud_colors_max then
 | 
			
		||||
			if color > #hud_colors then
 | 
			
		||||
				color = 1
 | 
			
		||||
			end
 | 
			
		||||
			waypoints[i].color = color
 | 
			
		||||
			waypoint.color = color
 | 
			
		||||
			need_update_hud = true
 | 
			
		||||
			update_formspec = true
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		if fields["confirm_rename"..i] then
 | 
			
		||||
			hit = true
 | 
			
		||||
			waypoints[i] = waypoints[i] or {}
 | 
			
		||||
			temp[i] = temp[i] or {}
 | 
			
		||||
			temp[i].edit = false
 | 
			
		||||
			waypoints[i].name = fields["rename_box"..i]
 | 
			
		||||
			waypoint.name = fields["rename_box"..i]
 | 
			
		||||
			need_update_hud = true
 | 
			
		||||
			update_formspec = true
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		if hit then
 | 
			
		||||
			-- Save first
 | 
			
		||||
			waypoints.data[i] = waypoint
 | 
			
		||||
			set_waypoint_data(player, waypoints)
 | 
			
		||||
		end
 | 
			
		||||
		-- Update after
 | 
			
		||||
		if need_update_hud then
 | 
			
		||||
			update_hud(player, waypoints, temp, i)
 | 
			
		||||
		end
 | 
			
		||||
		if update_formspec then
 | 
			
		||||
			ui.set_inventory_formspec(player, "waypoints")
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		if hit then return end
 | 
			
		||||
	end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
minetest.register_on_joinplayer(function(player)
 | 
			
		||||
-- waypoints_temp must be initialized before the general unified_inventory
 | 
			
		||||
-- 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 waypoints = datastorage.get(player_name, "waypoints")
 | 
			
		||||
	local temp = {}
 | 
			
		||||
	waypoints_temp[player_name] = temp
 | 
			
		||||
	for i = 1, 5 do
 | 
			
		||||
		update_hud(player, waypoints, temp, i)
 | 
			
		||||
	local waypoints = get_waypoint_data(player)
 | 
			
		||||
 | 
			
		||||
	waypoints_temp[player_name] = {}
 | 
			
		||||
	for i = 1, COUNT do
 | 
			
		||||
		update_hud(player, waypoints, waypoints_temp[player_name], i)
 | 
			
		||||
	end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user