109729cfb2
Items can now flow from one chest (or Nore's filter object) to another via the pneumatic tubes! Thanks to Nore and RealBadAngel for the code. Note that this mod has to redefine the default chests and furnaces (see compat.lua) in order to add some new group definitions so that tubes can appear to connect to these objects.
167 lines
5.4 KiB
Lua
167 lines
5.4 KiB
Lua
|
|
default.furnace_inactive_formspec =
|
|
"size[8,9]"..
|
|
"image[2,2;1,1;default_furnace_fire_bg.png]"..
|
|
"list[current_name;fuel;2,3;1,1;]"..
|
|
"list[current_name;src;2,1;1,1;]"..
|
|
"list[current_name;dst;5,1;2,2;]"..
|
|
"list[current_player;main;0,5;8,4;]"
|
|
|
|
minetest.register_node(":default:furnace", {
|
|
description = "Furnace",
|
|
tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png",
|
|
"default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"},
|
|
paramtype2 = "facedir",
|
|
groups = {cracky=2,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()
|
|
if direction.y==1 then
|
|
return inv:add_item("fuel",stack)
|
|
elseif direction.y==-1 then
|
|
return inv:add_item("src",stack)
|
|
else
|
|
return stack
|
|
end
|
|
end,
|
|
can_insert=function(pos,node,stack,direction)
|
|
local meta=minetest.env:get_meta(pos)
|
|
local inv=meta:get_inventory()
|
|
if direction.y==1 then
|
|
return inv:room_for_item("fuel",stack)
|
|
elseif direction.y==-1 then
|
|
return inv:room_for_item("src",stack)
|
|
else
|
|
return 0
|
|
end
|
|
end,
|
|
input_inventory="dst"},
|
|
legacy_facedir_simple = true,
|
|
sounds = default.node_sound_stone_defaults(),
|
|
on_construct = function(pos)
|
|
local meta = minetest.env:get_meta(pos)
|
|
meta:set_string("formspec", default.furnace_inactive_formspec)
|
|
meta:set_string("infotext", "Furnace")
|
|
local inv = meta:get_inventory()
|
|
inv:set_size("fuel", 1)
|
|
inv:set_size("src", 1)
|
|
inv:set_size("dst", 4)
|
|
end,
|
|
can_dig = function(pos,player)
|
|
local meta = minetest.env:get_meta(pos);
|
|
local inv = meta:get_inventory()
|
|
if not inv:is_empty("fuel") then
|
|
return false
|
|
elseif not inv:is_empty("dst") then
|
|
return false
|
|
elseif not inv:is_empty("src") then
|
|
return false
|
|
end
|
|
return true
|
|
end,
|
|
})
|
|
|
|
minetest.register_node(":default:furnace_active", {
|
|
description = "Furnace",
|
|
tiles = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png",
|
|
"default_furnace_side.png", "default_furnace_side.png", "default_furnace_front_active.png"},
|
|
paramtype2 = "facedir",
|
|
light_source = 8,
|
|
drop = "default:furnace",
|
|
groups = {cracky=2, not_in_creative_inventory=1,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()
|
|
if direction.y==1 then
|
|
return inv:add_item("fuel",stack)
|
|
elseif direction.y==-1 then
|
|
return inv:add_item("src",stack)
|
|
else
|
|
return stack
|
|
end
|
|
end,
|
|
can_insert=function(pos,node,stack,direction)
|
|
local meta=minetest.env:get_meta(pos)
|
|
local inv=meta:get_inventory()
|
|
if direction.y==1 then
|
|
return inv:room_for_item("fuel",stack)
|
|
elseif direction.y==-1 then
|
|
return inv:room_for_item("src",stack)
|
|
else
|
|
return 0
|
|
end
|
|
end,
|
|
input_inventory="dst"},
|
|
legacy_facedir_simple = true,
|
|
sounds = default.node_sound_stone_defaults(),
|
|
on_construct = function(pos)
|
|
local meta = minetest.env:get_meta(pos)
|
|
meta:set_string("formspec", default.furnace_inactive_formspec)
|
|
meta:set_string("infotext", "Furnace");
|
|
local inv = meta:get_inventory()
|
|
inv:set_size("fuel", 1)
|
|
inv:set_size("src", 1)
|
|
inv:set_size("dst", 4)
|
|
end,
|
|
can_dig = function(pos,player)
|
|
local meta = minetest.env:get_meta(pos);
|
|
local inv = meta:get_inventory()
|
|
if not inv:is_empty("fuel") then
|
|
return false
|
|
elseif not inv:is_empty("dst") then
|
|
return false
|
|
elseif not inv:is_empty("src") then
|
|
return false
|
|
end
|
|
return true
|
|
end,
|
|
})
|
|
|
|
minetest.register_node(":default:chest", {
|
|
description = "Chest",
|
|
tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png",
|
|
"default_chest_side.png", "default_chest_side.png", "default_chest_front.png"},
|
|
paramtype2 = "facedir",
|
|
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,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("main",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("main",stack)
|
|
end,
|
|
input_inventory="main"},
|
|
legacy_facedir_simple = true,
|
|
sounds = default.node_sound_wood_defaults(),
|
|
on_construct = function(pos)
|
|
local meta = minetest.env:get_meta(pos)
|
|
meta:set_string("formspec",
|
|
"size[8,9]"..
|
|
"list[current_name;main;0,0;8,4;]"..
|
|
"list[current_player;main;0,5;8,4;]")
|
|
meta:set_string("infotext", "Chest")
|
|
local inv = meta:get_inventory()
|
|
inv:set_size("main", 8*4)
|
|
end,
|
|
can_dig = function(pos,player)
|
|
local meta = minetest.env:get_meta(pos);
|
|
local inv = meta:get_inventory()
|
|
return inv:is_empty("main")
|
|
end,
|
|
on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
|
minetest.log("action", player:get_player_name()..
|
|
" moves stuff in chest at "..minetest.pos_to_string(pos))
|
|
end,
|
|
on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
minetest.log("action", player:get_player_name()..
|
|
" moves stuff to chest at "..minetest.pos_to_string(pos))
|
|
end,
|
|
on_metadata_inventory_take = function(pos, listname, index, stack, player)
|
|
minetest.log("action", player:get_player_name()..
|
|
" takes stuff from chest at "..minetest.pos_to_string(pos))
|
|
end,
|
|
})
|