diff options
| -rw-r--r-- | technic/machines/other/init.lua | 2 | ||||
| -rw-r--r-- | technic/machines/other/solar_furnace.lua | 206 | ||||
| -rw-r--r-- | technic/machines/register/alloy_recipes.lua | 21 | ||||
| -rw-r--r-- | technic/machines/register/common.lua | 8 | ||||
| -rw-r--r-- | technic/machines/register/compressor_recipes.lua | 8 | ||||
| -rw-r--r-- | technic/machines/register/recipes.lua | 3 | ||||
| -rw-r--r-- | technic/textures/technic_prospector_mk2.png | bin | 0 -> 391 bytes | |||
| -rw-r--r-- | technic/textures/technic_solar_furnace_bottom.png | bin | 0 -> 254 bytes | |||
| -rw-r--r-- | technic/textures/technic_solar_furnace_side.png | bin | 0 -> 340 bytes | |||
| -rw-r--r-- | technic/textures/technic_solar_furnace_top.png | bin | 0 -> 729 bytes | |||
| -rw-r--r-- | technic/tools/prospector.lua | 181 | ||||
| -rw-r--r-- | technic/tools/walking_tractor.lua | 1 | 
12 files changed, 402 insertions, 28 deletions
diff --git a/technic/machines/other/init.lua b/technic/machines/other/init.lua index a67d1a1..a7e90d3 100644 --- a/technic/machines/other/init.lua +++ b/technic/machines/other/init.lua @@ -16,5 +16,7 @@ end  -- Coal-powered machines  dofile(path.."/coal_alloy_furnace.lua")  dofile(path.."/coal_furnace.lua") +dofile(path.."/solar_furnace.lua") +  dofile(path.."/anchor.lua") diff --git a/technic/machines/other/solar_furnace.lua b/technic/machines/other/solar_furnace.lua new file mode 100644 index 0000000..dba4789 --- /dev/null +++ b/technic/machines/other/solar_furnace.lua @@ -0,0 +1,206 @@ + +-- A solar furnace is an auxiliary device which allows to use cooking recipes +-- without fuel. The downside is half the speed of a fuel-consuming furnace  +-- and the need to be exposed to maximal direct sunlight at all times (L = 15). + + +local S = technic.getter + +minetest.register_craft({ +	output = 'technic:solar_furnace', +	recipe = { +		{'technic:stainless_steel_ingot',	'technic:stainless_steel_ingot',	'technic:stainless_steel_ingot'}, +		{'technic:composite_plate',		'default:furnace',			'technic:composite_plate'}, +		{'technic:cast_iron_ingot',		'technic:cast_iron_ingot',		'technic:cast_iron_ingot'}, +	} +}) + +local machine_name = S("Solar Furnace") +local formspec = +	"size[8,9]".. +	"label[0,0;"..machine_name.."]".. +	"image[2,2;1,1;technic_power_meter_bg.png]".. +	"list[current_name;src;2,1;1,1;]".. +	"list[current_name;dst;5,1;2,2;]".. +	"list[current_player;main;0,5;8,4;]".. +	"listring[current_name;dst]".. +	"listring[current_player;main]".. +	"listring[current_name;src]".. +	"listring[current_player;main]" + +minetest.register_node("technic:solar_furnace", { +	description = machine_name, +	drawtype = "nodebox", +	node_box = { +		type = "fixed", +		fixed = { +                     {-5/16, -1/2, -5/16, 5/16, 3/16, 5/16}, +                     {-1/2, 3/16, -1/2, 1/2, 1/2, 1/2}, +                     {-2/16, 1/2, -2/16, 2/16, 17/32, 2/16}, +			}, +	}, +	tiles = {"technic_solar_furnace_top.png",  "technic_solar_furnace_bottom.png", +	         "technic_solar_furnace_side.png", "technic_solar_furnace_side.png", +	         "technic_solar_furnace_side.png", "technic_solar_furnace_side.png"}, +	paramtype2 = "facedir", +	groups = {cracky=2}, +	legacy_facedir_simple = true, +	sounds = default.node_sound_stone_defaults(), +	on_construct = function(pos) +		local meta = minetest.get_meta(pos) +		meta:set_string("formspec", formspec) +		meta:set_string("infotext", machine_name) +		local inv = meta:get_inventory() +		inv:set_size("src", 1) +		inv:set_size("dst", 4) +		meta:set_int("elapsed", 0) +		meta:set_int("cook_time", 0) +	end, +	can_dig = technic.machine_can_dig, +	allow_metadata_inventory_put = technic.machine_inventory_put, +	allow_metadata_inventory_take = technic.machine_inventory_take, +	allow_metadata_inventory_move = technic.machine_inventory_move, +}) + +minetest.register_node("technic:solar_furnace_active", { +	description = machine_name, +	drawtype = "nodebox", +	node_box = { +		type = "fixed", +		fixed = { +                     {-5/16, -1/2, -5/16, 5/16, 3/16, 5/16}, +                     {-1/2, 3/16, -1/2, 1/2, 1/2, 1/2}, +                     {-2/16, 1/2, -2/16, 2/16, 17/32, 2/16}, +			}, +	}, +	tiles = {"technic_solar_furnace_top.png",  "technic_solar_furnace_bottom.png", +	         "technic_solar_furnace_side.png", "technic_solar_furnace_side.png", +	         "technic_solar_furnace_side.png", "technic_solar_furnace_side.png"}, +	paramtype2 = "facedir", +	light_source = 14, +	drop = "technic:solar_furnace", +	groups = {cracky=2, not_in_creative_inventory=1}, +	legacy_facedir_simple = true, +	sounds = default.node_sound_stone_defaults(), +	can_dig = technic.machine_can_dig, +	allow_metadata_inventory_put = technic.machine_inventory_put, +	allow_metadata_inventory_take = technic.machine_inventory_take, +	allow_metadata_inventory_move = technic.machine_inventory_move, +}) + +minetest.register_abm({ +	label = "Machines: run solar furnace", +	nodenames = {"technic:solar_furnace", "technic:solar_furnace_active"}, +	interval = 1, +	chance = 1, +	action = function(pos, node, active_object_count, active_object_count_wider) +		local meta = minetest.get_meta(pos) +		local inv    = meta:get_inventory() +		 +		local recipe = nil + +		if not meta:get_int("elapsed") then +			meta:set_int("elapsed", 0) +		end +                       +		if not meta:get_int("cook_time") then +			meta:set_int("cook_time", 0) +		end +                       +		local light_pos = {x = pos.x, y = pos.y + 1, z = pos.z} +				                      +		local powered = false +		 +		local node = minetest.get_node_or_nil(light_pos) + +		if minetest.get_node_light(light_pos) == 15 and node.name == "air" then +			powered = true +		end +                       +		local result = technic.get_recipe("cooking", inv:get_list("src")) +		if result and result.time then +			meta:set_int("cook_time", result.time * 2) +		end +		 + +		           +		if powered then  + +			if result then +				 +				if meta:get_int("elapsed") >= meta:get_int("cook_time") then +                       +					local percent = 100 +					meta:set_string("infotext", S("%s is active"):format(machine_name).." ("..percent.."%)") +					meta:set_string("formspec", +							"size[8,9]".. +							"label[0,0;"..machine_name.."]".. +							"image[2,2;1,1;technic_power_meter_bg.png^[lowpart:" .. percent .. ":technic_power_meter_fg.png]".. +							"list[current_name;src;2,1;1,1;]".. +							"list[current_name;dst;5,1;2,2;]".. +							"list[current_player;main;0,5;8,4;]".. +							"listring[current_name;dst]".. +							"listring[current_player;main]".. +							"listring[current_name;src]".. +							"listring[current_player;main]") +                       +					local result_stack = ItemStack(result.output) +					if inv:room_for_item("dst", result_stack) then +						inv:set_list("src", result.new_input) +						inv:add_item("dst", result_stack) +					end +                       +					meta:set_int("elapsed", 0) +                       +					local recipe = technic.get_recipe("cooking", inv:get_list("src")) + +					if not recipe then +						meta:set_string("infotext", S("%s is empty"):format(machine_name)) +						technic.swap_node(pos, "technic:solar_furnace") +						meta:set_string("formspec", formspec) +					end +                       +				else + +					local percent = math.floor(meta:get_int("elapsed") / meta:get_int("cook_time") * 100) +					if percent > 100 then +						percent = 100 +					end +					meta:set_string("infotext", S("%s is active"):format(machine_name).." ("..percent.."%)") +					technic.swap_node(pos, "technic:solar_furnace_active") +					meta:set_string("formspec", +							"size[8,9]".. +							"label[0,0;"..machine_name.."]".. +							"image[2,2;1,1;technic_power_meter_bg.png^[lowpart:" .. percent .. ":technic_power_meter_fg.png]".. +							"list[current_name;src;2,1;1,1;]".. +							"list[current_name;dst;5,1;2,2;]".. +							"list[current_player;main;0,5;8,4;]".. +							"listring[current_name;dst]".. +							"listring[current_player;main]".. +							"listring[current_name;src]".. +							"listring[current_player;main]") +					return +	 +					meta:set_int("elapsed", meta:get_int("elapsed") + 1) +				end +			else +				meta:set_int("elapsed", 0) +				 +				meta:set_string("infotext", S("%s is empty"):format(machine_name)) +				technic.swap_node(pos, "technic:solar_furnace") +				meta:set_string("formspec", formspec) +			end +				 +		else + +			meta:set_int("elapsed", 0) +                                                      +			meta:set_string("infotext", S("%s cannot function\nMust be in full direct sunlight"):format(machine_name)) +			technic.swap_node(pos, "technic:solar_furnace") +			meta:set_string("formspec", formspec) +		end +		 +		 +	end, +}) + diff --git a/technic/machines/register/alloy_recipes.lua b/technic/machines/register/alloy_recipes.lua index 0d40b77..209d376 100644 --- a/technic/machines/register/alloy_recipes.lua +++ b/technic/machines/register/alloy_recipes.lua @@ -14,10 +14,10 @@ end  local recipes = {  	{"technic:copper_dust 3",         "technic:tin_dust",           "technic:bronze_dust 4"},  	{"default:copper_ingot 3",        "moreores:tin_ingot",         "default:bronze_ingot 4"}, -	{"technic:wrought_iron_dust",     "technic:coal_dust",          "technic:carbon_steel_dust", 3}, -	{"technic:wrought_iron_ingot",    "technic:coal_dust",          "technic:carbon_steel_ingot", 3}, -	{"technic:carbon_steel_dust",     "technic:coal_dust",          "technic:cast_iron_dust", 3}, -	{"technic:carbon_steel_ingot",    "technic:coal_dust",          "technic:cast_iron_ingot", 3}, +	{"technic:wrought_iron_dust",     "technic:coal_dust",          "technic:carbon_steel_dust",        3}, +	{"technic:wrought_iron_ingot",    "technic:coal_dust",          "technic:carbon_steel_ingot",       3}, +	{"technic:carbon_steel_dust",     "technic:coal_dust",          "technic:cast_iron_dust",           3}, +	{"technic:carbon_steel_ingot",    "technic:coal_dust",          "technic:cast_iron_ingot",          3},  	{"technic:carbon_steel_dust 3",   "technic:chromium_dust",      "technic:stainless_steel_dust 4"},  	{"technic:carbon_steel_ingot 3",  "technic:chromium_ingot",     "technic:stainless_steel_ingot 4"},  	{"technic:copper_dust 2",         "technic:zinc_dust",          "technic:brass_dust 3"}, @@ -27,16 +27,19 @@ local recipes = {  	-- from https://en.wikipedia.org/wiki/Carbon_black  	-- The highest volume use of carbon black is as a reinforcing filler in rubber products, especially tires.  	-- "[Compounding a] pure gum vulcanizate … with 50% of its weight of carbon black improves its tensile strength and wear resistance …"  -	{"technic:raw_latex 4",           "technic:coal_dust 2",        "technic:rubber 6", 2}, -	{"technic:raw_latex 3",           "technic:sulfur_dust 1",      "technic:latex_foam", 2}, +	{"technic:raw_latex 4",           "technic:coal_dust 2",        "technic:rubber 6",                  2}, +	{"technic:raw_latex 3",           "technic:sulfur_dust 1",      "technic:latex_foam",                2}, +	-- straightforward way to get red stone +	{"default:stone",                 "dye:red",                    "default:desert_stone",              2}, +  }  if minetest.get_modpath("ethereal") then  	table.insert(recipes, {"ethereal:crystal_spike", "ethereal:fire_dust 2", "default:mese_crystal 2"})  	if not minetest.get_modpath("bakedclay") then -		table.insert(recipes, {"default:clay", "dye:red", "bakedclay:red"}) -		table.insert(recipes, {"default:clay", "dye:orange", "bakedclay:orange"}) -		table.insert(recipes, {"default:clay", "dye:grey", "bakedclay:grey"}) +		table.insert(recipes, {"default:clay", "dye:red",    "bakedclay:red",    3}) +		table.insert(recipes, {"default:clay", "dye:orange", "bakedclay:orange", 3}) +		table.insert(recipes, {"default:clay", "dye:grey",   "bakedclay:grey",   3})  	end  	if minetest.get_modpath("bonemeal") then  		table.insert(recipes, {"default:sand", "bonemeal:mulch", "ethereal:sandy 2"}) diff --git a/technic/machines/register/common.lua b/technic/machines/register/common.lua index f872fa2..0dcdbe1 100644 --- a/technic/machines/register/common.lua +++ b/technic/machines/register/common.lua @@ -130,12 +130,14 @@ function technic.handle_machine_pipeworks(pos, tube_upgrade, send_function)  	local x_velocity = 0  	local z_velocity = 0 -	-- Output is on the left side of the furnace -	if node.param2 == 3 then pos1.z = pos1.z - 1  z_velocity = -1 end +	-- The machines shall always eject items to the right side +	-- This will be easy to remember, since the destination inventory is always on the right as well +	if node.param2 == 3 then pos1.z = pos1.z - 1  z_velocity =  1 end  	if node.param2 == 2 then pos1.x = pos1.x - 1  x_velocity = -1 end -	if node.param2 == 1 then pos1.z = pos1.z + 1  z_velocity =  1 end +	if node.param2 == 1 then pos1.z = pos1.z + 1  z_velocity = -1 end  	if node.param2 == 0 then pos1.x = pos1.x + 1  x_velocity =  1 end +	  	local output_tube_connected = false  	local node1 = minetest.get_node(pos1)   	if minetest.get_item_group(node1.name, "tubedevice") > 0 then diff --git a/technic/machines/register/compressor_recipes.lua b/technic/machines/register/compressor_recipes.lua index 3339981..6952e07 100644 --- a/technic/machines/register/compressor_recipes.lua +++ b/technic/machines/register/compressor_recipes.lua @@ -12,7 +12,9 @@ local recipes = {  	{"default:snowblock",          "default:ice"},  	{"default:sand 2",             "default:sandstone"},  	{"default:silver_sand 2",      "default:silver_sandstone"}, -	{"default:desert_sand",        "default:desert_stone"}, +--	{"default:desert_sand",        "default:desert_stone"}, +--	for consistency, any sand should be compressed into respective sandstone type +	{"default:desert_sand 2",      "default:desert_sandstone"},  	{"technic:mixed_metal_ingot",  "technic:composite_plate"},  	{"default:copper_ingot 5",     "technic:copper_plate"},  	{"technic:coal_dust 4",        "technic:graphite"}, @@ -24,6 +26,10 @@ local recipes = {  if minetest.get_modpath("ethereal") then +	-- substitute for old recipe chain +	-- instead of 5 dry dirt -> 1 desert sand -> compressing -> desert_stone +	table.insert(recipes, {"ethereal:dry_dirt 5", "default:desert_stone"}) +	  	-- compressing most copious leaves into more compact fuel  	-- this conversion is based on the burn time (1 vs. 10) + some overhead  	table.insert(recipes, {"default:acacia_leaves 15", "ethereal:charcoal_lump 1"}) diff --git a/technic/machines/register/recipes.lua b/technic/machines/register/recipes.lua index d30fd4f..bef678a 100644 --- a/technic/machines/register/recipes.lua +++ b/technic/machines/register/recipes.lua @@ -67,6 +67,9 @@ end  function technic.get_recipe(typename, items)  	if typename == "cooking" then -- Already builtin in Minetest, so use that +		if not items then +			return nil +		end  		local result, new_input = minetest.get_craft_result({  			method = "cooking",  			width = 1, diff --git a/technic/textures/technic_prospector_mk2.png b/technic/textures/technic_prospector_mk2.png Binary files differnew file mode 100644 index 0000000..e255dd7 --- /dev/null +++ b/technic/textures/technic_prospector_mk2.png diff --git a/technic/textures/technic_solar_furnace_bottom.png b/technic/textures/technic_solar_furnace_bottom.png Binary files differnew file mode 100644 index 0000000..bfefccb --- /dev/null +++ b/technic/textures/technic_solar_furnace_bottom.png diff --git a/technic/textures/technic_solar_furnace_side.png b/technic/textures/technic_solar_furnace_side.png Binary files differnew file mode 100644 index 0000000..8c7128f --- /dev/null +++ b/technic/textures/technic_solar_furnace_side.png diff --git a/technic/textures/technic_solar_furnace_top.png b/technic/textures/technic_solar_furnace_top.png Binary files differnew file mode 100644 index 0000000..6f17029 --- /dev/null +++ b/technic/textures/technic_solar_furnace_top.png diff --git a/technic/tools/prospector.lua b/technic/tools/prospector.lua index 6373e98..99ab172 100644 --- a/technic/tools/prospector.lua +++ b/technic/tools/prospector.lua @@ -1,6 +1,7 @@  local S = technic.getter  technic.register_power_tool("technic:prospector", 650000) +technic.register_power_tool("technic:prospector_mk2", 650000)  local function get_metadata(toolstack)  	local m = minetest.deserialize(toolstack:get_metadata()) @@ -9,6 +10,7 @@ local function get_metadata(toolstack)  	if not m.target then m.target = "" end  	if not m.look_depth then m.look_depth = 7 end  	if not m.look_radius then m.look_radius = 1 end +	if not m.scan_radius then m.scan_radius = 1 end  	return m  end @@ -96,33 +98,182 @@ minetest.register_tool("technic:prospector", {  	end,   }) + + +local function remove_waypoints(user, w) +	 +	for i,p in ipairs(w) do +		user:hud_remove(p) +	end +	 +end + + +minetest.register_tool("technic:prospector_mk2", { +	description = S("Prospector Mk2"), +	inventory_image = "technic_prospector_mk2.png", +	wear_represents = "technic_RE_charge", +	on_refill = technic.refill_RE_charge, +	on_use = function(toolstack, user, pointed_thing) +		if not user or not user:is_player() or user.is_fake_player then return end +		if pointed_thing.type ~= "node" then return end +		local toolmeta = get_metadata(toolstack) +		local look_diameter = toolmeta.look_radius * 2 + 1 +		local charge_to_take = math.pow(toolmeta.scan_radius * 7, 3) +		if toolmeta.charge < charge_to_take then return end +		if toolmeta.target == "" then +			minetest.chat_send_player(user:get_player_name(), "Right-click to set target block type") +			return +		end +		if not technic.creative_mode then +			toolmeta.charge = toolmeta.charge - charge_to_take +			toolstack:set_metadata(minetest.serialize(toolmeta)) +			technic.set_RE_wear(toolstack, toolmeta.charge, technic.power_tools[toolstack:get_name()]) +		end +		local start_pos = pointed_thing.under +		 +		local min_pos = {x = start_pos.x - toolmeta.scan_radius * 7, y = start_pos.y - toolmeta.scan_radius * 7,  z = start_pos.z - toolmeta.scan_radius * 7 } +		 +		local max_pos = {x = start_pos.x + toolmeta.scan_radius * 7, y = start_pos.y + toolmeta.scan_radius * 7,  z = start_pos.z + toolmeta.scan_radius * 7 } +		 +		local results = minetest.find_nodes_in_area(min_pos, max_pos, toolmeta.target) +		 +		local waypoints = {} +		local found = false +				 +		if #results > math.pow(toolmeta.scan_radius * 7, 3) * 0.25 then +		 +			minetest.chat_send_player(user:get_player_name(), minetest.registered_nodes[toolmeta.target].description.." is literally everywhere within the scanned region") +			 +		else +		 +			for _,p in ipairs(results) do +			 +				if math.random() >= 0.02 then +					found = true +					local idx = user:hud_add({ +						hud_elem_type = "waypoint", +						name = "", +						text = "", +						number = 0xFF0000, +						world_pos = p +					}) +					table.insert(waypoints, idx) +			 +				end +			 +			end +			 +			if found then +				minetest.after(7, remove_waypoints, user, waypoints) +			end +			 +			minetest.chat_send_player(user:get_player_name(), minetest.registered_nodes[toolmeta.target].description.." is "..(found and "present" or "absent").." within ".. toolmeta.scan_radius * 7 .." meters radius") +		end +		 +		minetest.sound_play("technic_prospector_"..(found and "hit" or "miss"), { pos = vector.add(user:getpos(), { x = 0, y = 1, z = 0 }), gain = 1.0, max_hear_distance = 10 }) +		 +		return toolstack +	end, +	on_place = function(toolstack, user, pointed_thing) +		if not user or not user:is_player() or user.is_fake_player then return end +		local toolmeta = get_metadata(toolstack) +		local pointed +		if pointed_thing.type == "node" then +			local pname = minetest.get_node(pointed_thing.under).name +			local pdef = minetest.registered_nodes[pname] +			if pdef and (pdef.groups.not_in_creative_inventory or 0) == 0 and pname ~= toolmeta.target then +				pointed = pname +			end +		end +		local scan_radius = toolmeta.scan_radius * 7 +		minetest.show_formspec(user:get_player_name(), "technic:prospector_control_mk2", +			"size[7,8.5]".. +			"item_image[0,0;1,1;"..toolstack:get_name().."]".. +			"label[1,0;"..minetest.formspec_escape(toolstack:get_definition().description).."]".. +			(toolmeta.target ~= "" and +				"label[0,1.5;Current target:]".. +				"label[0,2;"..minetest.formspec_escape(minetest.registered_nodes[toolmeta.target].description).."]".. +				"item_image[0,2.5;1,1;"..toolmeta.target.."]" or +				"label[0,1.5;No target set]").. +			(pointed and +				"label[3.5,1.5;May set new target:]".. +				"label[3.5,2;"..minetest.formspec_escape(minetest.registered_nodes[pointed].description).."]".. +				"item_image[3.5,2.5;1,1;"..pointed.."]".. +				"button_exit[3.5,3.65;2,0.5;target_"..pointed..";Set target]" or +				"label[3.5,1.5;No new target available]").. +			"label[0,4.5;Scan radius:]".. +			"label[0,5;".. scan_radius .."]".. +			"label[3.5,4.5;Set scan radius:]".. +			"button_exit[3.5,5.15;1,0.5;scan_radius_1;7]".. +			"button_exit[4.5,5.15;1,0.5;scan_radius_2;14]".. +			"button_exit[5.5,5.15;1,0.5;scan_radius_3;21]".. +			"label[0,7.5;Accuracy:]".. +			"label[0,8;98%]") +		return +	end,  +}) + + +  minetest.register_on_player_receive_fields(function(user, formname, fields) -        if formname ~= "technic:prospector_control" then return false end +	if formname ~= "technic:prospector_control" and formname ~= "technic:prospector_control_mk2" then return false end  	if not user or not user:is_player() or user.is_fake_player then return end  	local toolstack = user:get_wielded_item() -	if toolstack:get_name() ~= "technic:prospector" then return true end -	local toolmeta = get_metadata(toolstack) -	for field, value in pairs(fields) do -		if field:sub(1, 7) == "target_" then -			toolmeta.target = field:sub(8) -		end -		if field:sub(1, 12) == "look_radius_" then -			toolmeta.look_radius = field:sub(13) +                                           +	if formname == "technic:prospector_control" and toolstack:get_name() == "technic:prospector" then + +		local toolmeta = get_metadata(toolstack) +		for field, value in pairs(fields) do +			if field:sub(1, 7) == "target_" then +				toolmeta.target = field:sub(8) +			end +			if field:sub(1, 12) == "look_radius_" then +				toolmeta.look_radius = field:sub(13) +			end +			if field:sub(1, 11) == "look_depth_" then +				toolmeta.look_depth = field:sub(12) +			end  		end -		if field:sub(1, 11) == "look_depth_" then -			toolmeta.look_depth = field:sub(12) +		toolstack:set_metadata(minetest.serialize(toolmeta)) +		user:set_wielded_item(toolstack) +		return true +	end +                                           +	if formname == "technic:prospector_control_mk2" and toolstack:get_name() == "technic:prospector_mk2" then +		 +		local toolmeta = get_metadata(toolstack) +		for field, value in pairs(fields) do +			if field:sub(1, 7) == "target_" then +				toolmeta.target = field:sub(8) +			end +			if field:sub(1, 12) == "scan_radius_" then +				toolmeta.scan_radius = field:sub(13) +			end  		end +		toolstack:set_metadata(minetest.serialize(toolmeta)) +		user:set_wielded_item(toolstack) +		return true  	end -	toolstack:set_metadata(minetest.serialize(toolmeta)) -	user:set_wielded_item(toolstack) +                                            	return true +                                            end)  minetest.register_craft({  	output = "technic:prospector",  	recipe = { -		{"moreores:pick_silver", "moreores:mithril_block", "pipeworks:teleport_tube_1"}, +		{"moreores:pick_silver", "default:goldblock", "pipeworks:teleport_tube_1"},  		{"technic:brass_ingot", "technic:control_logic_unit", "technic:brass_ingot"}, -		{"", "technic:blue_energy_crystal", ""}, +		{"", "technic:red_energy_crystal", ""},  	}  }) + +minetest.register_craft({ +	output = "technic:prospector_mk2", +	recipe = { +		{"moreores:pick_mithril", "moreores:mithril_block", "pipeworks:teleport_tube_1"}, +		{"technic:brass_ingot", "technic:control_logic_unit_adv", "technic:brass_ingot"}, +		{"", "technic:blue_energy_crystal", ""}, +	} +})
\ No newline at end of file diff --git a/technic/tools/walking_tractor.lua b/technic/tools/walking_tractor.lua index 1f40a4b..0f514e2 100644 --- a/technic/tools/walking_tractor.lua +++ b/technic/tools/walking_tractor.lua @@ -55,6 +55,7 @@ local ripe_for_harvest = {  	"ethereal:onion_5",  	"ethereal:strawberry_8",  	-- also doubles as a snow-plough +	"default:snow",  	"default:snowblock",  	"stairs:slab_snowblock",  	-- mushrooms  | 
