Added autocrafter.

Fixed a bug where items in mese tubes disappeared whan placing or removing a tube next to it.
This commit is contained in:
Novatux 2013-01-19 15:37:27 +01:00
parent 4ecb747570
commit b3fcf6734f
4 changed files with 82 additions and 2 deletions

75
autocrafter.lua Normal file

@ -0,0 +1,75 @@
function autocraft(inventory)
local recipe=inventory:get_list("recipe")
local result
local new
result,new=minetest.get_craft_result({method="normal",width=3,items=recipe})
local input=inventory:get_list("input")
if result.item:is_empty() then return end
result=result.item
local to_use={}
for _,item in ipairs(recipe) do
if item~=nil and not item:is_empty() then
if to_use[item:get_name()]==nil then
to_use[item:get_name()]=1
else
to_use[item:get_name()]=to_use[item:get_name()]+1
end
end
end
local stack
for itemname,number in pairs(to_use) do
stack=ItemStack({name=itemname, count=number})
if not inventory:contains_item("src",stack) then return end
end
for itemname,number in pairs(to_use) do
stack=ItemStack({name=itemname, count=number})
inventory:remove_item("src",stack)
end
inventory:add_item("dst",result)
print(dump(new))
end
minetest.register_node("pipeworks:autocrafter",{
description = "Autocrafter",
drawtype="normal",
tiles={"pipeworks_autocrafter.png"},
groups={snappy=3,tubedevice=1,tubedevice_receiver=1},
tube={insert_object=function(pos,node,stack,direction)
local meta=minetest.env:get_meta(pos)
local inv=meta:get_inventory()
return inv:add_item("src",stack)
end,
can_insert=function(pos,node,stack,direction)
local meta=minetest.env:get_meta(pos)
local inv=meta:get_inventory()
return inv:room_for_item("src",stack)
end,
input_inventory="dst"},
on_construct = function(pos)
local meta = minetest.env:get_meta(pos)
meta:set_string("formspec",
"size[8,11]"..
"list[current_name;recipe;0,0;3,3;]"..
"list[current_name;src;0,3;8,3;]"..
"list[current_name;dst;4,0;4,3;]"..
"list[current_player;main;0,7;8,4;]")
meta:set_string("infotext", "Autocrafter")
local inv = meta:get_inventory()
inv:set_size("src",3*8)
inv:set_size("recipe",3*3)
inv:set_size("dst",4*3)
end,
can_dig = function(pos,player)
local meta = minetest.env:get_meta(pos);
local inv = meta:get_inventory()
return (inv:is_empty("src") and inv:is_empty("recipe") and inv:is_empty("dst"))
end})
minetest.register_abm({nodenames={"pipeworks:autocrafter"},interval=1,chance=1,
action=function(pos,node)
local meta=minetest.env:get_meta(pos)
local inv=meta:get_inventory()
autocraft(inv)
end})

@ -87,7 +87,12 @@ function tube_autoroute(pos)
nsurround = pxm..pxp..pym..pyp..pzm..pzp
if is_tube(nctr.name) then
minetest.env:add_node(pos, { name = string.sub(nctr.name,1,-7)..nsurround })
local meta=minetest.env:get_meta(pos)
local meta0=meta:to_table()
nctr.name=string.sub(nctr.name,1,-7)..nsurround
minetest.env:add_node(pos, nctr)
local meta=minetest.env:get_meta(pos)
meta:from_table(meta0)
end
end

@ -328,5 +328,5 @@ dofile(minetest.get_modpath("pipeworks").."/crafts.lua")
dofile(minetest.get_modpath("pipeworks").."/flowing_logic.lua")
dofile(minetest.get_modpath("pipeworks").."/compat.lua")
dofile(minetest.get_modpath("pipeworks").."/item_transport.lua")
dofile(minetest.get_modpath("pipeworks").."/autocrafter.lua")
print("Pipeworks loaded!")

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 B