diff options
| -rw-r--r-- | autocrafter.lua | 53 | 
1 files changed, 33 insertions, 20 deletions
| diff --git a/autocrafter.lua b/autocrafter.lua index 1233497..39291d7 100644 --- a/autocrafter.lua +++ b/autocrafter.lua @@ -136,21 +136,6 @@ local function on_output_change(pos, inventory, stack)  	after_recipe_change(pos, inventory)  end -local function update_autocrafter(pos) -	local meta = minetest.get_meta(pos) -	if meta:get_string("virtual_items") == "" then -		meta:set_string("virtual_items", "1") -		local inv = meta:get_inventory() -		for idx, stack in ipairs(inv:get_list("recipe")) do -			minetest.item_drop(stack, "", pos) -			stack:set_count(1) -			stack:set_wear(0) -			inv:set_stack("recipe", idx, stack) -		end -		after_recipe_change(pos, inv) -	end -end -  local function set_formspec(meta, enabled)  	local state = enabled and "on" or "off"  	meta:set_string("formspec", @@ -168,6 +153,38 @@ local function set_formspec(meta, enabled)  			"list[current_player;main;0,7;8,4;]")  end +-- 1st version of the autocrafter had actual items in the crafting grid +-- the 2nd replaced these with virtual items, dropped the content on update and set "virtual_items" to string "1" +-- the third added an output inventory, changed the formspec and added a button for enabling/disabling +-- so we work out way backwards on this history and update each single case to the newest version +local function update_autocrafter(pos, meta) +	local meta = meta or minetest.get_meta(pos) +	local inv = meta:get_inventory() + +	if inv:get_size("output") == 0 then -- we are version 2 or 1 +		inv:set_size("output", 1) +		-- migrate the old autocrafters into an "enabled" state +		meta:set_int("enabled", 1) +		set_formspec(meta, true) + +		if meta:get_string("virtual_items") == "1" then -- we are version 2 +			-- we allready dropped stuff, so lets remove the metadatasetting (we are not being called again for this node) +			meta:set_string("virtual_items", "") +			return +		else -- we are version 1 +			for idx, stack in ipairs(inv:get_list("recipe")) do +				minetest.item_drop(stack, "", pos) +				stack:set_count(1) +				stack:set_wear(0) +				inv:set_stack("recipe", idx, stack) +			end +		end + +		-- update the recipe, cache, and start the crafter +		after_recipe_change(pos, inv) +	end +end +  minetest.register_node("pipeworks:autocrafter", {  	description = "Autocrafter",   	drawtype = "normal",  @@ -189,9 +206,8 @@ minetest.register_node("pipeworks:autocrafter", {  		connect_sides = {left = 1, right = 1, front = 1, back = 1, top = 1, bottom = 1}},   	on_construct = function(pos)  		local meta = minetest.get_meta(pos) -		set_formspec(meta) +		set_formspec(meta, false)  		meta:set_string("infotext", "unconfigured Autocrafter") -		meta:set_string("virtual_items", "1")  		local inv = meta:get_inventory()  		inv:set_size("src", 3*8)  		inv:set_size("recipe", 3*3) @@ -209,11 +225,8 @@ minetest.register_node("pipeworks:autocrafter", {  			meta:set_int("enabled", 1)  			set_formspec(meta, true)  			start_crafter(pos) -		else -- update formspec on esc for now -			set_formspec(meta, meta:get_int("enabled") == 1)  		end  	end, -	on_punch = update_autocrafter,  	can_dig = function(pos, player)  		update_autocrafter(pos)  		local meta = minetest.get_meta(pos) | 
