diff options
| -rw-r--r-- | callbacks.lua | 95 | ||||
| -rw-r--r-- | internal.lua | 105 | ||||
| -rw-r--r-- | register.lua | 59 | ||||
| -rw-r--r-- | textures/ui_group.png | bin | 0 -> 29697 bytes | 
4 files changed, 100 insertions, 159 deletions
diff --git a/callbacks.lua b/callbacks.lua index 32a096c..4f9913c 100644 --- a/callbacks.lua +++ b/callbacks.lua @@ -3,45 +3,46 @@ 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.filtered_items_list[player_name] = unified_inventory.items_list +	unified_inventory.filtered_items_list[player_name] = +			unified_inventory.items_list  	unified_inventory.activefilter[player_name] = ""  	unified_inventory.apply_filter(player, "")  	unified_inventory.alternate[player_name] = 1  	unified_inventory.current_item[player_name] = nil -	unified_inventory.set_inventory_formspec(player, unified_inventory.default) +	unified_inventory.set_inventory_formspec(player, +			unified_inventory.default)  	-- Crafting guide inventories -	local inv = minetest.create_detached_inventory(player:get_player_name().."craftrecipe", { +	local inv = minetest.create_detached_inventory(player_name.."craftrecipe", {  		allow_put = function(inv, listname, index, stack, player)  			return 0  		end,  		allow_take = function(inv, listname, index, stack, player) -			if unified_inventory.is_creative(player:get_player_name()) then -				return stack:get_count() -			else -				return 0 -			end +			return 0  		end, -		allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) +		allow_move = function(inv, from_list, from_index, to_list, +				to_index, count, player)  			return 0  		end,  	})  	inv:set_size("output", 1) -	inv:set_size("build", 3 * 3)  	-- Refill slot  	local refill = minetest.create_detached_inventory(player_name.."refill", {  		allow_put = function(inv, listname, index, stack, player) -			if unified_inventory.is_creative(player:get_player_name()) then +			local player_name = player:get_player_name() +			if unified_inventory.is_creative(player_name) then  				return stack:get_count()  			else  				return 0  			end  		end,  		on_put = function(inv, listname, index, stack, player) +			local player_name = player:get_player_name()  			stack:set_count(stack:get_stack_max())  			inv:set_stack(listname, index, stack) -			minetest.sound_play("electricity", {to_player=player_name, gain = 1.0}) +			minetest.sound_play("electricity", +					{to_player=player_name, gain = 1.0})  		end,  	})  	refill:set_size("main", 1) @@ -60,9 +61,12 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)  	end  	-- Inventory page controls -	local start = math.floor(unified_inventory.current_index[player_name] / 80 + 1) +	local start = math.floor( +		unified_inventory.current_index[player_name] / 80 + 1)  	local start_i = start -	local pagemax = math.floor((unified_inventory.filtered_items_list_size[player_name] - 1) / (80) + 1) +	local pagemax = math.floor( +		(#unified_inventory.filtered_items_list[player_name] - 1) +		/ (80) + 1)  	if fields.start_list then  		minetest.sound_play("paperflip1", @@ -106,44 +110,37 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)  				unified_inventory.current_page[player_name])  	end -	-- Item list buttons -	local list_index = unified_inventory.current_index[player_name] -	local page = unified_inventory.current_page[player_name] -	for i = 0, 80 do -		local button = "item_button"..list_index -		if fields[button] then  -			minetest.sound_play("click", -					{to_player=player_name, gain = 0.1}) -			if not unified_inventory.is_creative(player_name) then -				unified_inventory.set_inventory_formspec(player, "craftguide") -				page = "craftguide" -			end -			if page == "craftguide" then  -				unified_inventory.current_item[player_name] = -						unified_inventory.filtered_items_list -							[player_name][list_index]  -				unified_inventory.alternate[player_name] = 1 -				unified_inventory.update_recipe(player, -						unified_inventory.filtered_items_list -							[player_name][list_index], 1) -				unified_inventory.set_inventory_formspec(player, -						unified_inventory.current_page[player_name]) -			else -				if unified_inventory.is_creative(player_name) then -					local inv = player:get_inventory() -					dst_stack = {} -					dst_stack.name = unified_inventory.filtered_items_list -							[player_name][list_index]  -					dst_stack.count = 99 -					if inv:room_for_item("main", dst_stack) then -						inv:add_item("main", dst_stack) -					end +	local clicked_item = nil +	for name, value in pairs(fields) do +		if string.sub(name, 1, 12) == "item_button_" then +			clicked_item = string.sub(name, 13) +			break +		end +	end +	if clicked_item then +		minetest.sound_play("click", +				{to_player=player_name, gain = 0.1}) +		local page = unified_inventory.current_page[player_name] +		if not unified_inventory.is_creative(player_name) then +			page = "craftguide" +		end +		if page == "craftguide" then +			unified_inventory.current_item[player_name] = clicked_item +			unified_inventory.alternate[player_name] = 1 +			unified_inventory.set_inventory_formspec(player, +					"craftguide") +		else +			if unified_inventory.is_creative(player_name) then +				local inv = player:get_inventory() +				local stack = ItemStack(clicked_item) +				stack:set_count(99) +				if inv:room_for_item("main", stack) then +					inv:add_item("main", stack)  				end  			end  		end -		list_index = list_index + 1  	end -	 +  	if fields.searchbutton then  		unified_inventory.apply_filter(player, fields.searchbox)  		unified_inventory.set_inventory_formspec(player, @@ -170,8 +167,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)  					alternate = 1  				end  				unified_inventory.alternate[player_name] = alternate		 -				unified_inventory.update_recipe(player, -						unified_inventory.current_item[player_name], alternate)  				unified_inventory.set_inventory_formspec(player,  						unified_inventory.current_page[player_name])  			end diff --git a/internal.lua b/internal.lua index 6d22530..cbd134f 100644 --- a/internal.lua +++ b/internal.lua @@ -47,8 +47,9 @@ function unified_inventory.get_formspec(player, page)  	-- Items list  	local list_index = unified_inventory.current_index[player_name]  	local page = math.floor(list_index / (80) + 1) -	local pagemax = math.floor((unified_inventory.filtered_items_list_size[player_name] - 1) / (80) + 1) -	local image = nil +	local pagemax = math.floor( +		(#unified_inventory.filtered_items_list[player_name] - 1) +			/ (80) + 1)  	local item = {}  	for y = 0, 9 do  	for x = 0, 7 do @@ -57,8 +58,8 @@ function unified_inventory.get_formspec(player, page)  			formspec = formspec.."item_image_button["  					..(8.2 + x * 0.7)..","  					..(1   + y * 0.7)..";.81,.81;" -					..name..";item_button" -					..list_index..";]" +					..name..";item_button_" +					..name..";]"  			list_index = list_index + 1  		end  	end @@ -112,102 +113,6 @@ function unified_inventory.apply_filter(player, filter)  			unified_inventory.current_page[player_name])  end - --- update_recipe -function unified_inventory.update_recipe(player, stack_name, alternate) -	local inv = minetest.get_inventory({ -		type = "detached", -		name = player:get_player_name().."craftrecipe" -	})	 -	for i = 0, inv:get_size("build") do -		inv:set_stack("build", i, nil) -	end -	inv:set_stack("output", 1, nil) -	alternate = tonumber(alternate) or 1 -	local crafts = unified_inventory.crafts_table[stack_name] -	--print(dump(crafts)) -	if next(crafts) == nil then -- No craft recipes -		return -	end -	if alternate < 1 or alternate > #crafts then -		alternate = 1 -	end -	local craft = crafts[alternate] -	inv:set_stack("output", 1, craft.output) -	local items = craft.items - -	if craft.type == "cooking" or -	   craft.type == "fuel" or -	   craft.type == "grinding" or -	   craft.type == "extracting" or -	   craft.type == "compressing" then -		def = unified_inventory.find_item_def(craft["items"][1]) -		if def then -			inv:set_stack("build", 1, def) -		end -		return -	end -	if craft.width == 0 then -		for i = 1, 3 do -			if craft.items[i] then -				def = unified_inventory.find_item_def(craft.items[i]) -				if def then -					inv:set_stack("build", i, def) -				end -			end -		end -	end -	if craft.width == 1 then -		local build_table={1, 4, 7} -		for i = 1, 3 do -			if craft.items[i] then -				def = unified_inventory.find_item_def(craft.items[i]) -				if def then -					inv:set_stack("build", build_table[i], def) -				end -			end -		end -	end -	if craft.width == 2 then -		local build_table = {1, 2, 4, 5, 7, 8} -		for i=1, 6 do -			if craft.items[i] then -				def = unified_inventory.find_item_def(craft.items[i]) -				if def then -					inv:set_stack("build", build_table[i], def) -				end -			end -		end -	end -	if craft.width == 3 then -		for i=1, 9 do -			if craft.items[i] then -				def = unified_inventory.find_item_def(craft.items[i]) -				if def then -					inv:set_stack("build", i, def) -				end -			end -		end -	end -end - -function unified_inventory.find_item_def(def) -	if type(def) ~= "string" then -		return nil -	end -	if string.find(def, "group:") then -		def = string.gsub(def, "group:", "") -		def = string.gsub(def, "\"", "") -		if minetest.registered_nodes["default:"..def] then -			return "default:"..def -		end -		local items = unified_inventory.items_in_group(def) -		return items[1] -	else -		return def -	end -end -  function unified_inventory.items_in_group(groups)  	local items = {}  	for name, item in pairs(minetest.registered_items) do diff --git a/register.lua b/register.lua index ad85537..9ca1f77 100644 --- a/register.lua +++ b/register.lua @@ -1,6 +1,6 @@  minetest.register_privilege("creative", { -	description="Can use the creative inventory", +	description = "Can use the creative inventory",  	give_to_singleplayer = false,  }) @@ -137,27 +137,27 @@ unified_inventory.register_page("craftguide", {  		local player_name = player:get_player_name()  		formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_craftguide_form.png]"  		formspec = formspec.."label[0,0;Crafting Guide]" -		formspec = formspec.."list[detached:"..player_name.."craftrecipe;build;2,1;3,3;]"  		formspec = formspec.."list[detached:"..player_name.."craftrecipe;output;6,1;1,1;]"  		formspec = formspec.."label[2,0.5;Input:]"  		formspec = formspec.."label[6,0.5;Output:]"  		formspec = formspec.."label[6,2.6;Method:]"  		local item_name = unified_inventory.current_item[player_name] +		local craft = nil  		if item_name then  			formspec = formspec.."label[2,0;"..item_name.."]"	  			local alternates = 0  			local alternate = unified_inventory.alternate[player_name]  			local crafts = unified_inventory.crafts_table[item_name] -  			if crafts ~= nil and #crafts > 0 then  				alternates = #crafts -				local craft = crafts[alternate] +				craft = crafts[alternate]  				local method = craft.type -				if craft.type == "shapeless" then -					method="shapeless crafting" -				end	 -				if craft.type == "alloy" then -					method="alloy cooking" +				if craft.type == "normal" then +					method = "crafting" +				elseif craft.type == "shapeless" then +					method = "shapeless crafting" +				elseif craft.type == "alloy" then +					method = "alloy cooking"  				end  				formspec = formspec.."label[6,3;"..method.."]"  			end @@ -168,6 +168,47 @@ unified_inventory.register_page("craftguide", {  				formspec = formspec.."button[0,3.15;2,1;alternate;Alternate]"  			end  		end + +		local craftinv = minetest.get_inventory({ +			type = "detached", +			name = player_name.."craftrecipe" +		}) + +		if not craft then +			craftinv:set_stack("output", 1, nil) +			return formspec +		end + +		craftinv:set_stack("output", 1, craft.output) + +		local width = craft.width +		if width == 0 then +			-- Shapeless recipe +			width = 3 +		end + +		local i = 1 +		for y = 1, 3 do +		for x = 1, width do +			local item = craft.items[i] +			if item then +				if string.sub(item, 1, 6) == "group:" then +					local group = string.sub(item, 7) +					formspec = formspec.."image_button[" +						..(1.05 + x)..","..(0.05 + y)..";0.9,0.9;" +						.."ui_group.png;;" +						..minetest.formspec_escape(group).."]" +				else +					formspec = formspec.."item_image_button[" +						..(1.05 + x)..","..(0.05 + y)..";0.9,0.9;" +						..minetest.formspec_escape(item)..";" +						.."item_button_" +						..minetest.formspec_escape(item)..";]" +				end +			end +			i = i + 1 +		end +		end  		return formspec  	end,  }) diff --git a/textures/ui_group.png b/textures/ui_group.png Binary files differnew file mode 100644 index 0000000..8de5a77 --- /dev/null +++ b/textures/ui_group.png  | 
