forked from minetest-mods/unified_inventory
		
	Merge remote-tracking branch 'upstream/master'
This commit is contained in:
		
							
								
								
									
										3
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								init.lua
									
									
									
									
									
								
							@@ -43,7 +43,8 @@ unified_inventory = {
 | 
			
		||||
	imgscale = 1.25,
 | 
			
		||||
	list_img_offset = 0.13,
 | 
			
		||||
	standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]",
 | 
			
		||||
	version = 2
 | 
			
		||||
 | 
			
		||||
	version = 3
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local ui = unified_inventory
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										320
									
								
								internal.lua
									
									
									
									
									
								
							
							
						
						
									
										320
									
								
								internal.lua
									
									
									
									
									
								
							@@ -22,7 +22,9 @@ end
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
local function formspec_button(ui_peruser, name, image, offset, pos, scale, label)
 | 
			
		||||
@@ -41,54 +43,24 @@ 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 function formspec_add_filters(player, formspec, style)
 | 
			
		||||
	local button_row = 0
 | 
			
		||||
	local button_col = 0
 | 
			
		||||
	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
 | 
			
		||||
		if not (style.is_lite_mode and def.hide_lite) then
 | 
			
		||||
			table.insert(filtered_inv_buttons, def)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local j = 1 --Modif NALC (sys4 20/11/2018) 12 buttons max by row
 | 
			
		||||
	for i, def in pairs(filtered_inv_buttons) do
 | 
			
		||||
 | 
			
		||||
		if draw_lite_mode and i > 4 then
 | 
			
		||||
		if style.is_lite_mode and i > 4 then
 | 
			
		||||
			button_row = 1
 | 
			
		||||
			button_col = 1
 | 
			
		||||
		elseif not draw_lite_mode and j > 12 then
 | 
			
		||||
@@ -97,62 +69,61 @@ function ui.get_formspec(player, page)
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		if def.type == "image" then
 | 
			
		||||
			local pos_x = style.main_button_x + style.btn_spc * (j - 1) - button_col * style.btn_spc * 4
 | 
			
		||||
			local pos_y = style.main_button_y + button_row * style.btn_spc
 | 
			
		||||
			if (def.condition == nil or def.condition(player) == true) then
 | 
			
		||||
				formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s;]",
 | 
			
		||||
					ui_peruser.main_button_x + ui_peruser.btn_spc * (j - 1) - button_col * ui_peruser.btn_spc * 4, -- Modif NALC
 | 
			
		||||
					ui_peruser.main_button_y + button_row * ui_peruser.btn_spc,
 | 
			
		||||
					ui_peruser.btn_size,ui_peruser.btn_size,
 | 
			
		||||
					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[%f,%f;%f,%f;%s^[colorize:#808080:alpha]",
 | 
			
		||||
				ui_peruser.main_button_x + ui_peruser.btn_spc * (j - 1) - button_col * ui_peruser.btn_spc * 4, -- Modif NALC
 | 
			
		||||
				ui_peruser.main_button_y + button_row * ui_peruser.btn_spc,
 | 
			
		||||
				ui_peruser.btn_size,ui_peruser.btn_size,def.image)
 | 
			
		||||
					pos_x, pos_y, style.btn_size, style.btn_size,
 | 
			
		||||
					def.image)
 | 
			
		||||
				n = n+1
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
		j = j + 1 -- Modif NALC
 | 
			
		||||
	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
 | 
			
		||||
	end
 | 
			
		||||
local function formspec_add_categories(player, formspec, ui_peruser)
 | 
			
		||||
	local player_name = player:get_player_name()
 | 
			
		||||
	local n = #formspec + 1
 | 
			
		||||
 | 
			
		||||
	if fsdata.draw_item_list == false then
 | 
			
		||||
		return table.concat(formspec, "")
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- Category filters
 | 
			
		||||
 | 
			
		||||
	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),
 | 
			
		||||
		(ui_peruser.btn_spc * ui_peruser.pagecols) + 0.13, 1.4 + (ui_peruser.is_lite_mode and 0 or 0.2),
 | 
			
		||||
		"ui_smallbg_9_sliced.png")
 | 
			
		||||
	n = n + 1
 | 
			
		||||
 | 
			
		||||
	formspec[n] = string.format("label[%f,%f;%s]", ui_peruser.page_x, ui_peruser.form_header_y+(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)
 | 
			
		||||
@@ -167,10 +138,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]",
 | 
			
		||||
@@ -187,7 +161,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
 | 
			
		||||
 | 
			
		||||
@@ -200,9 +183,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
 | 
			
		||||
@@ -217,69 +200,109 @@ 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
 | 
			
		||||
				)
 | 
			
		||||
				formspec[n + 1] = ("tooltip[%s;%s \\[%s\\]]"):format(
 | 
			
		||||
					button_name, minetest.formspec_escape(item.description),
 | 
			
		||||
					item.mod_origin or "??"
 | 
			
		||||
				)
 | 
			
		||||
				n = n + 2
 | 
			
		||||
				list_index = list_index + 1
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
		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_add_filters(player, fs, ui_peruser)
 | 
			
		||||
 | 
			
		||||
	if fsdata.draw_inventory ~= false then
 | 
			
		||||
		-- Player inventory
 | 
			
		||||
		fs[#fs + 1] = "listcolors[#00000000;#00000000]"
 | 
			
		||||
		fs[#fs + 1] = ui_peruser.standard_inv
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	if fsdata.draw_item_list == false then
 | 
			
		||||
		return table.concat(fs, "")
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	formspec_add_categories(player, fs, ui_peruser)
 | 
			
		||||
	formspec_add_search_box(player, fs, ui_peruser)
 | 
			
		||||
	formspec_add_item_browser(player, fs, ui_peruser)
 | 
			
		||||
 | 
			
		||||
	return table.concat(fs)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function ui.set_inventory_formspec(player, page)
 | 
			
		||||
@@ -360,60 +383,3 @@ function ui.apply_filter(player, filter, search_dir)
 | 
			
		||||
	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
 | 
			
		||||
	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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user