summaryrefslogtreecommitdiff
path: root/autocrafter.lua
diff options
context:
space:
mode:
authorchlue <chlue@gmx.de>2013-10-04 10:41:23 -0400
committerVanessa Ezekowitz <vanessaezekowitz@gmail.com>2013-10-04 10:41:23 -0400
commit0fadfa537234953e2bf99984afe8148781f241f3 (patch)
tree6bcdf05184c83e001afeb038690f5c8076af011f /autocrafter.lua
parentcedb49d887b3a6782c4472813dc7b6ebeeedc2ea (diff)
downloadpipeworks-0fadfa537234953e2bf99984afe8148781f241f3.tar
pipeworks-0fadfa537234953e2bf99984afe8148781f241f3.tar.gz
pipeworks-0fadfa537234953e2bf99984afe8148781f241f3.tar.bz2
pipeworks-0fadfa537234953e2bf99984afe8148781f241f3.tar.xz
pipeworks-0fadfa537234953e2bf99984afe8148781f241f3.zip
Made autocrafter take less CPU/time
Diffstat (limited to 'autocrafter.lua')
-rw-r--r--autocrafter.lua71
1 files changed, 62 insertions, 9 deletions
diff --git a/autocrafter.lua b/autocrafter.lua
index 8cca0a5..663b14c 100644
--- a/autocrafter.lua
+++ b/autocrafter.lua
@@ -1,14 +1,67 @@
+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
-function autocraft(inventory)
+function autocraft(inventory,pos)
local recipe=inventory:get_list("recipe")
- local result
- local new
- for i=1,9 do
- recipe[i]=ItemStack({name=recipe[i]:get_name(),count=1})
- end
- result,new=minetest.get_craft_result({method="normal",width=3,items=recipe})
- local input=inventory:get_list("input")
+ local recipe_last
+ local result
+ local new
+
+ recipe_last, result, new = getCacheEntry(pos)
+ if recipe_last ~=nil then
+ local recipeUnchanged = true
+ for i=1,9 do
+ --print ("recipe_base"..i.." ")
+ --print (recipe[i]:get_name())
+ --print (recipe[i]:get_count())
+ --print (recipe_last[i]:get_name())
+ --print (recipe_last[i]:get_count())
+ if recipe[i]:get_name() ~= recipe_last[i]:get_name() then
+ recipeUnchanged = False
+ break
+ end
+ if recipe[i]:get_count() ~= recipe_last[i]:get_count() then
+ recipeUnchanged = False
+ break
+ end
+ end
+ if recipeUnchanged then
+ -- print("autocrafter recipe unchanged")
+ else
+ 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)
+ 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")
if result.item:is_empty() then return end
result=result.item
if not inventory:room_for_item("dst", result) then return end
@@ -81,6 +134,6 @@ minetest.register_abm({nodenames={"pipeworks:autocrafter"},interval=1,chance=1,
action=function(pos,node)
local meta=minetest.get_meta(pos)
local inv=meta:get_inventory()
- autocraft(inv)
+ autocraft(inv,pos)
end
})