diff options
| -rw-r--r-- | autocrafter.lua | 61 | 
1 files changed, 24 insertions, 37 deletions
diff --git a/autocrafter.lua b/autocrafter.lua index 1b899f3..9f9227d 100644 --- a/autocrafter.lua +++ b/autocrafter.lua @@ -1,18 +1,4 @@ -local autocrafterCache = {} - -function addCacheEntry(pos, recipe, result, new) -	if autocrafterCache[pos.x] == nil then autocrafterCache[pos.x] = {} end -	if autocrafterCache[pos.x][pos.y] == nil then autocrafterCache[pos.x][pos.y] = {} end -	if autocrafterCache[pos.x][pos.y][pos.z] == nil then autocrafterCache[pos.x][pos.z] = {} end -	autocrafterCache[pos.x][pos.y][pos.z] = {["recipe"] = recipe, ["result"] = result, ["new"] = new} -end - -function getCacheEntry(pos) -	if autocrafterCache[pos.x] == nil then return nil, nil, nil end -	if autocrafterCache[pos.x][pos.y] == nil then return nil, nil, nil end -	if autocrafterCache[pos.x][pos.y][pos.z] == nil then return nil, nil, nil end -	return autocrafterCache[pos.x][pos.y][pos.z]["recipe"], autocrafterCache[pos.x][pos.y][pos.z]["result"], autocrafterCache[pos.x][pos.y][pos.z]["new"] -end +local autocrafterCache = {}  -- caches some recipe data to avoid to call the slow function minetest.get_craft_result() every second  function autocraft(inventory, pos)  	local recipe = inventory:get_list("recipe") @@ -20,15 +6,23 @@ function autocraft(inventory, pos)  		local result  		local new -		recipe_last, result, new = getCacheEntry(pos) -		if recipe_last ~= nil then -			local recipeUnchanged = true +		if autocrafterCache[minetest.hash_node_position(pos)] == nil then +			--print("first call for this autocrafter at pos("..pos.x..","..pos.y..","..pos.z..")") +			recipe_last = {}  			for i = 1, 9 do -				--print ("recipe_base"..i.." ") -				--print (recipe[i]:get_name()) -				--print (recipe[i]:get_count()) +				recipe_last[i] = recipe[i]  				--print (recipe_last[i]:get_name()) -				--print (recipe_last[i]:get_count()) +				recipe[i] = ItemStack({name = recipe[i]:get_name(), count = 1}) +			end +			result, new = minetest.get_craft_result({method = "normal", width = 3, items = recipe}) +			autocrafterCache[minetest.hash_node_position(pos)] = {["recipe"] = recipe, ["result"] = result, ["new"] = new} +		else +			local autocrafterCacheEntry = autocrafterCache[minetest.hash_node_position(pos)] +			recipe_last = autocrafterCacheEntry["recipe"] +			result = autocrafterCacheEntry["result"] +			new = autocrafterCacheEntry["new"] +			local recipeUnchanged = true +			for i = 1, 9 do  				if recipe[i]:get_name() ~= recipe_last[i]:get_name() then  					recipeUnchanged = False  					break @@ -39,26 +33,16 @@ function autocraft(inventory, pos)  				end  			end  			if recipeUnchanged then -				-- print("autocrafter recipe unchanged") +				--print("autocrafter recipe unchanged")  			else -				print("autocrafter recipe changed at pos("..pos.x..","..pos.y..","..pos.z..")") +				--print("autocrafter recipe changed at pos("..pos.x..","..pos.y..","..pos.z..")")  				for i = 1, 9 do  						recipe_last[i] = recipe[i]  						recipe[i] = ItemStack({name = recipe[i]:get_name(), count = 1})  				end  				result, new = minetest.get_craft_result({method = "normal", width = 3, items = recipe}) -				addCacheEntry(pos, recipe_last, result, new) +				autocrafterCache[minetest.hash_node_position(pos)] = {["recipe"] = recipe, ["result"] = result, ["new"] = new}  			end -		else -			print("first call for this autocrafter at pos("..pos.x..","..pos.y..","..pos.z..")") -			recipe_last = {} -			for i = 1, 9 do -				recipe_last[i] = recipe[i] -				--print (recipe_last[i]:get_name()) -				recipe[i] = ItemStack({name = recipe[i]:get_name(), count = 1}) -			end -			result, new = minetest.get_craft_result({method = "normal", width = 3, items = recipe}) -			addCacheEntry(pos, recipe_last, result, new)  		end  		local input = inventory:get_list("input") @@ -126,8 +110,11 @@ minetest.register_node("pipeworks:autocrafter", {  		local inv = meta:get_inventory()  		return (inv:is_empty("src") and inv:is_empty("recipe") and inv:is_empty("dst"))  	end,  -	after_place_node = tube_scanforobjects,  -	after_dig_node = tube_scanforobjects,  +	after_place_node = tube_scanforobjects(pos), +	after_dig_node = function(pos) +			tube_scanforobjects(pos) +			autocrafterCache[minetest.hash_node_position(pos)] = nil +		end  })  minetest.register_abm({nodenames = {"pipeworks:autocrafter"}, interval = 1, chance = 1,   | 
