Novatux
2014-08-16 35b10adb401c90d3ca8b69a106e82e1fb43a9f52
commit | author | age
82cba9 1
354ee6 2 local S = technic.getter
S 3
f3bba0 4 local function inject_items (pos)
VE 5         local meta=minetest.env:get_meta(pos) 
6         local inv = meta:get_inventory()
7         local mode=meta:get_string("mode")
8         if mode=="single items" then
9             local i=0
10             for _,stack in ipairs(inv:get_list("main")) do
11             i=i+1
12                 if stack then
13                 local item0=stack:to_table()
14                 if item0 then 
baf7f6 15                     item0["count"] = "1"
049129 16                     technic.tube_inject_item(pos, pos, vector.new(0, -1, 0), item0)
baf7f6 17                     stack:take_item(1)
f3bba0 18                     inv:set_stack("main", i, stack)
VE 19                     return
20                     end
21                 end
22             end
23         end
24         if mode=="whole stacks" then
25             local i=0
26             for _,stack in ipairs(inv:get_list("main")) do
27             i=i+1
28                 if stack then
29                 local item0=stack:to_table()
30                 if item0 then 
049129 31                     technic.tube_inject_item(pos, pos, vector.new(0, -1, 0), item0)
f3bba0 32                     stack:clear()
VE 33                     inv:set_stack("main", i, stack)
34                     return
35                     end
36                 end
37             end
38         end
39         
40 end
41
91cdd1 42 minetest.register_craft({
R 43     output = 'technic:injector 1',
44     recipe = {
45         {'', 'technic:control_logic_unit',''},
46         {'', 'default:chest',''},
749df3 47         {'', 'pipeworks:tube_1',''},
91cdd1 48     }
R 49 })
50
827509 51 local function set_injector_formspec(meta)
Z 52     local is_stack = meta:get_string("mode") == "whole stacks"
53     meta:set_string("formspec",
54             "invsize[8,9;]"..
55             "item_image[0,0;1,1;technic:injector]"..
56             "label[1,0;"..S("Self-Contained Injector").."]"..
57             (is_stack and
58                 "button[0,1;2,1;mode_item;"..S("Stackwise").."]" or
59                 "button[0,1;2,1;mode_stack;"..S("Itemwise").."]")..
60             "list[current_name;main;0,2;8,2;]"..
61             "list[current_player;main;0,5;8,4;]")
62 end
63
82cba9 64 minetest.register_node("technic:injector", {
827509 65     description = S("Self-Contained Injector"),
74cf47 66     tiles = {"technic_injector_top.png", "technic_injector_bottom.png", "technic_injector_side.png",
R 67         "technic_injector_side.png", "technic_injector_side.png", "technic_injector_side.png"},
1a94fd 68     groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, tubedevice=1},
ca6947 69     tube = {connect_sides={bottom=1}},
82cba9 70     sounds = default.node_sound_wood_defaults(),
R 71     on_construct = function(pos)
72         local meta = minetest.env:get_meta(pos)
827509 73         meta:set_string("infotext", S("Self-Contained Injector"))
82cba9 74         local inv = meta:get_inventory()
R 75         inv:set_size("main", 8*4)
fd26a8 76         meta:set_string("mode","single items")
827509 77         set_injector_formspec(meta)
82cba9 78     end,
R 79     can_dig = function(pos,player)
80         local meta = minetest.env:get_meta(pos);
81         local inv = meta:get_inventory()
82         return inv:is_empty("main")
fd26a8 83     end,
R 84     on_receive_fields = function(pos, formanme, fields, sender)
0809dd 85         local meta = minetest.env:get_meta(pos)
827509 86         if fields.mode_item then meta:set_string("mode", "single items") end
Z 87         if fields.mode_stack then meta:set_string("mode", "whole stacks") end
88         set_injector_formspec(meta)
82cba9 89     end,
0809dd 90     allow_metadata_inventory_put = technic.machine_inventory_put,
S 91     allow_metadata_inventory_take = technic.machine_inventory_take,
92     allow_metadata_inventory_move = technic.machine_inventory_move,
82cba9 93 })
R 94
74cf47 95 minetest.register_abm({
R 96     nodenames = {"technic:injector"},
97     interval = 1,
98     chance = 1,
99     action = function(pos, node, active_object_count, active_object_count_wider)
35b10a 100         local pos1 = vector.add(pos, vector.new(0, -1, 0))
N 101         local node1 = minetest.get_node(pos1) 
102         if minetest.get_item_group(node1.name, "tubedevice") > 0 then
103             inject_items(pos)
104         end
82cba9 105     end,
R 106 })
107