diff options
Diffstat (limited to 'pipeworks')
| -rw-r--r-- | pipeworks/depends.txt | 1 | ||||
| -rw-r--r-- | pipeworks/filter-injector.lua | 215 | ||||
| -rw-r--r-- | pipeworks/textures/pipeworks_digiline_filter_input.png | bin | 0 -> 234 bytes | |||
| -rw-r--r-- | pipeworks/textures/pipeworks_digiline_filter_output.png | bin | 0 -> 217 bytes | |||
| -rw-r--r-- | pipeworks/textures/pipeworks_digiline_filter_side.png | bin | 0 -> 236 bytes | |||
| -rw-r--r-- | pipeworks/textures/pipeworks_digiline_filter_top.png | bin | 0 -> 236 bytes | 
6 files changed, 188 insertions, 28 deletions
diff --git a/pipeworks/depends.txt b/pipeworks/depends.txt index 02a542c..dff9dfb 100644 --- a/pipeworks/depends.txt +++ b/pipeworks/depends.txt @@ -1,3 +1,4 @@  default  mesecons?  mesecons_mvps? +digilines? diff --git a/pipeworks/filter-injector.lua b/pipeworks/filter-injector.lua index 4c407f6..78e6f25 100644 --- a/pipeworks/filter-injector.lua +++ b/pipeworks/filter-injector.lua @@ -12,14 +12,30 @@ end  local function set_filter_formspec(data, meta)  	local itemname = data.wise_desc.." Filter-Injector" -	local exmatch_button = "" -	if data.stackwise then -		exmatch_button = -			fs_helpers.cycling_button(meta, "button[4,3.5;4,1", "exmatch_mode", + +	local formspec +	if data.digiline then +		formspec = "size[8,2.7]".. +			"item_image[0,0;1,1;pipeworks:"..data.name.."]".. +			"label[1,0;"..minetest.formspec_escape(itemname).."]".. +			"field[0.3,1.5;8.0,1;channel;Channel;${channel}]".. +			fs_helpers.cycling_button(meta, "button[0,2;4,1", "slotseq_mode", +				{"Sequence slots by Priority", +				 "Sequence slots Randomly", +				 "Sequence slots by Rotation"}).. +			fs_helpers.cycling_button(meta, "button[4,2;4,1", "exmatch_mode",  				{"Exact match - off",  				 "Exact match - on "}) -	end -	local formspec = "size[8,8.5]".. +	else +		local exmatch_button = "" +		if data.stackwise then +			exmatch_button = +				fs_helpers.cycling_button(meta, "button[4,3.5;4,1", "exmatch_mode", +					{"Exact match - off", +					 "Exact match - on "}) +		end + +		formspec = "size[8,8.5]"..  			"item_image[0,0;1,1;pipeworks:"..data.name.."]"..  			"label[1,0;"..minetest.formspec_escape(itemname).."]"..  			"label[0,1;Prefer item types:]".. @@ -30,6 +46,7 @@ local function set_filter_formspec(data, meta)  				 "Sequence slots by Rotation"})..  			exmatch_button..  			"list[current_player;main;0,4.5;8,4;]" +	end  	meta:set_string("formspec", formspec)  end @@ -115,7 +132,7 @@ local function grabAndFire(data,slotseq_mode,exmatch_mode,filtmeta,frominv,fromi  	return false  end -local function punch_filter(data, filtpos, filtnode) +local function punch_filter(data, filtpos, filtnode, msg)  	local filtmeta = minetest.get_meta(filtpos)  	local filtinv = filtmeta:get_inventory()  	local owner = filtmeta:get_string("owner") @@ -131,15 +148,103 @@ local function punch_filter(data, filtpos, filtnode)  	if not fromdef then return end  	local fromtube = fromdef.tube  	if not (fromtube and fromtube.input_inventory) then return end + +	local slotseq_mode +	local exact_match +  	local filters = {} -	for _, filterstack in ipairs(filtinv:get_list("main")) do -		local filtername = filterstack:get_name() -		local filtercount = filterstack:get_count() -		if filtername ~= "" then table.insert(filters, {name = filtername, count = filtercount}) end +	if data.digiline then +		local t_msg = type(msg) +		if t_msg == "table" then +			local slotseq = msg.slotseq +			local t_slotseq = type(slotseq) +			if t_slotseq == "number" and slotseq >= 0 and slotseq <= 2 then +				slotseq_mode = slotseq +			elseif t_slotseq == "string" then +				slotseq = string.lower(slotseq) +				if slotseq == "priority" then +					slotseq_mode = 0 +				elseif slotseq == "random" then +					slotseq_mode = 1 +				elseif slotseq == "rotation" then +					slotseq_mode = 2 +				end +			end + +			local exmatch = msg.exmatch +			local t_exmatch = type(exmatch) +			if t_exmatch == "number" and exmatch >= 0 and exmatch <= 1 then +				exact_match = exmatch +			elseif t_exmatch == "boolean" then +				exact_match = exmatch and 1 or 0 +			end + +			local slotseq_index = msg.slotseq_index +			if type(slotseq_index) == "number" then +				-- This should allow any valid index, but I'm not completely sure what +				-- constitutes a valid index, so I'm only allowing resetting it to 1. +				if slotseq_index == 1 then +					filtmeta:set_int("slotseq_index", slotseq_index) +					set_filter_infotext(data, filtmeta) +				end +			end + +			if slotseq_mode ~= nil then +				filtmeta:set_int("slotseq_mode", slotseq_mode) +			end + +			if exact_match ~= nil then +				filtmeta:set_int("exmatch_mode", exact_match) +			end + +			if slotseq_mode ~= nil or exact_match ~= nil then +				set_filter_formspec(data, filtmeta) +			end + +			if msg.nofire then +				return +			end + +			if type(msg.name) == "string" then +				table.insert(filters, {name = msg.name, count = tonumber(msg.count) or 1}) +			else +				for _, filter in ipairs(msg) do +					local t_filter = type(filter) +					if t_filter == "table" then +						if type(filter.name) == "string" then +							table.insert(filters, {name = filter.name, count = tonumber(filter.count) or 1}) +						end +					elseif t_filter == "string" then +						local filterstack = ItemStack(filter) +						local filtername = filterstack:get_name() +						local filtercount = filterstack:get_count() +						if filtername ~= "" then table.insert(filters, {name = filtername, count = filtercount}) end +					end +				end +			end +		elseif t_msg == "string" then +			local filterstack = ItemStack(msg) +			local filtername = filterstack:get_name() +			local filtercount = filterstack:get_count() +			if filtername ~= "" then table.insert(filters, {name = filtername, count = filtercount}) end +		end +	else +		for _, filterstack in ipairs(filtinv:get_list("main")) do +			local filtername = filterstack:get_name() +			local filtercount = filterstack:get_count() +			if filtername ~= "" then table.insert(filters, {name = filtername, count = filtercount}) end +		end  	end  	if #filters == 0 then table.insert(filters, "") end -	local slotseq_mode = filtmeta:get_int("slotseq_mode") -	local exact_match = filtmeta:get_int("exmatch_mode") + +	if slotseq_mode == nil then +		slotseq_mode = filtmeta:get_int("slotseq_mode") +	end + +	if exact_match == nil then +		exact_match = filtmeta:get_int("exmatch_mode") +	end +  	local frommeta = minetest.get_meta(frompos)  	local frominv = frommeta:get_inventory()  	if fromtube.before_filter then fromtube.before_filter(frompos) end @@ -167,8 +272,14 @@ for _, data in ipairs({  		wise_desc = "Stackwise",  		stackwise = true,  	}, +	{ -- register even if no digilines +		name = "digiline_filter", +		wise_desc = "Digiline", +		stackwise = true, +		digiline = true, +	},  }) do -	minetest.register_node("pipeworks:"..data.name, { +	local node = {  		description = data.wise_desc.." Filter-Injector",  		tiles = {  			"pipeworks_"..data.name.."_top.png", @@ -194,14 +305,6 @@ for _, data in ipairs({  			pipeworks.after_place(pos)  		end,  		after_dig_node = pipeworks.after_dig, -		on_receive_fields = function(pos, formname, fields, sender) -			if not pipeworks.may_configure(pos, sender) then return end -			fs_helpers.on_receive_fields(pos, fields) -			local meta = minetest.get_meta(pos) -			meta:set_int("slotseq_index", 1) -			set_filter_formspec(data, meta) -			set_filter_infotext(data, meta) -		end,  		allow_metadata_inventory_put = function(pos, listname, index, stack, player)  			if not pipeworks.may_configure(pos, player) then return 0 end  			return stack:get_count() @@ -219,18 +322,63 @@ for _, data in ipairs({  			local inv = meta:get_inventory()  			return inv:is_empty("main")  		end, -		mesecons = { +		tube = {connect_sides = {right = 1}}, +	} + +	if data.digiline then +		node.groups.mesecon = nil +		if not minetest.get_modpath("digilines") then +			node.groups.not_in_creative_inventory = 1 +		end + +		node.on_receive_fields = function(pos, formname, fields, sender) +			if not pipeworks.may_configure(pos, sender) then return end +			fs_helpers.on_receive_fields(pos, fields) + +			if fields.channel then +				minetest.get_meta(pos):set_string("channel", fields.channel) +			end + +			local meta = minetest.get_meta(pos) +			--meta:set_int("slotseq_index", 1) +			set_filter_formspec(data, meta) +			set_filter_infotext(data, meta) +		end +		node.digiline = { +			effector = { +				action = function(pos, node, channel, msg) +					local meta = minetest.get_meta(pos) +					local setchan = meta:get_string("channel") +					if setchan ~= channel then return end + +					punch_filter(data, pos, node, msg) +				end, +			}, +		} +	else +		node.on_receive_fields = function(pos, formname, fields, sender) +			if not pipeworks.may_configure(pos, sender) then return end +			fs_helpers.on_receive_fields(pos, fields) +			local meta = minetest.get_meta(pos) +			meta:set_int("slotseq_index", 1) +			set_filter_formspec(data, meta) +			set_filter_infotext(data, meta) +		end +		node.mesecons = {  			effector = {  				action_on = function(pos, node)  					punch_filter(data, pos, node)  				end,  			}, -		}, -		tube = {connect_sides = {right = 1}}, -		on_punch = function (pos, node, puncher) +		} +		node.on_punch = function (pos, node, puncher)  			punch_filter(data, pos, node) -		end, -	}) +		end +	end + + + +	minetest.register_node("pipeworks:"..data.name, node)  end  minetest.register_craft( { @@ -250,3 +398,14 @@ minetest.register_craft( {  	        { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" }  	},  }) + +if minetest.get_modpath("digilines") then +	minetest.register_craft( { +		output = "pipeworks:digiline_filter 2", +		recipe = { +			{ "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" }, +			{ "group:stick", "digilines:wire_std_00000000", "homedecor:plastic_sheeting" }, +			{ "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" } +		}, +	}) +end diff --git a/pipeworks/textures/pipeworks_digiline_filter_input.png b/pipeworks/textures/pipeworks_digiline_filter_input.png Binary files differnew file mode 100644 index 0000000..c1ffa53 --- /dev/null +++ b/pipeworks/textures/pipeworks_digiline_filter_input.png diff --git a/pipeworks/textures/pipeworks_digiline_filter_output.png b/pipeworks/textures/pipeworks_digiline_filter_output.png Binary files differnew file mode 100644 index 0000000..4c57d0a --- /dev/null +++ b/pipeworks/textures/pipeworks_digiline_filter_output.png diff --git a/pipeworks/textures/pipeworks_digiline_filter_side.png b/pipeworks/textures/pipeworks_digiline_filter_side.png Binary files differnew file mode 100644 index 0000000..6a77896 --- /dev/null +++ b/pipeworks/textures/pipeworks_digiline_filter_side.png diff --git a/pipeworks/textures/pipeworks_digiline_filter_top.png b/pipeworks/textures/pipeworks_digiline_filter_top.png Binary files differnew file mode 100644 index 0000000..04ffda0 --- /dev/null +++ b/pipeworks/textures/pipeworks_digiline_filter_top.png  | 
