summaryrefslogtreecommitdiff
path: root/nodes/node_item_ejector.lua
diff options
context:
space:
mode:
Diffstat (limited to 'nodes/node_item_ejector.lua')
-rw-r--r--nodes/node_item_ejector.lua82
1 files changed, 82 insertions, 0 deletions
diff --git a/nodes/node_item_ejector.lua b/nodes/node_item_ejector.lua
new file mode 100644
index 0000000..ef016b7
--- /dev/null
+++ b/nodes/node_item_ejector.lua
@@ -0,0 +1,82 @@
+-- internationalization boilerplate
+local MP = minetest.get_modpath(minetest.get_current_modname())
+local S, NS = dofile(MP.."/intllib.lua")
+
+local pipeworks_path = minetest.get_modpath("pipeworks")
+
+minetest.register_node("digtron:inventory_ejector", {
+ description = S("Digtron Inventory Ejector"),
+ _doc_items_longdesc = digtron.doc.inventory_ejector_longdesc,
+ _doc_items_usagehelp = digtron.doc.inventory_ejector_usagehelp,
+ groups = {cracky = 3, oddly_breakable_by_hand=3, digtron = 1, tubedevice = 1},
+ tiles = {"digtron_plate.png", "digtron_plate.png", "digtron_plate.png", "digtron_plate.png", "digtron_plate.png^digtron_output.png", "digtron_plate.png"},
+ drawtype = "nodebox",
+ sounds = digtron.metal_sounds,
+ paramtype = "light",
+ paramtype2 = "facedir",
+ is_ground_content = false,
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5, -0.5, -0.5, 0.5, 0.5, 0.1875}, -- NodeBox1
+ {-0.3125, -0.3125, 0.1875, 0.3125, 0.3125, 0.3125}, -- NodeBox2
+ {-0.1875, -0.1875, 0.3125, 0.1875, 0.1875, 0.5}, -- NodeBox3
+ }
+ },
+
+ tube = (function() if pipeworks_path then return {
+ connect_sides = {back = 1}
+ } end end)(),
+
+ on_rightclick = function(pos, node, player)
+ local dir = minetest.facedir_to_dir(node.param2)
+ local destination_pos = vector.add(pos, dir)
+ local destination_node_name = minetest.get_node(destination_pos).name
+ local destination_node_def = minetest.registered_nodes[destination_node_name]
+ local layout = DigtronLayout.create(pos, player)
+
+ -- Build a list of all the items that builder nodes want to use.
+ local filter_items = {}
+ for _, node_image in pairs(layout.builders) do
+ filter_items[node_image.meta.inventory.main[1]:get_name()] = true
+ end
+
+ -- Look through the inventories and find an item that's not on that list.
+ local source_node = nil
+ local source_index = nil
+ local source_stack = nil
+ for _, node_image in pairs(layout.inventories) do
+ for index, item_stack in pairs(node_image.meta.inventory.main) do
+ if item_stack:get_count() > 0 and not filter_items[item_stack:get_name()] then
+ source_node = node_image
+ source_index = index
+ source_stack = item_stack
+ break
+ end
+ end
+ if source_node then break end
+ end
+
+ if source_node then
+ local meta = minetest.get_meta(source_node.pos)
+ local inv = meta:get_inventory()
+
+ if pipeworks_path and minetest.get_node_group(destination_node_name, "tubedevice") > 0 then
+ local from_pos = vector.add(pos, vector.multiply(dir, 0.5))
+ local start_pos = pos--vector.add(pos, dir)
+ inv:set_stack("main", source_index, nil)
+ pipeworks.tube_inject_item(from_pos, start_pos, vector.multiply(dir, 1), source_stack, player:get_player_name())
+ minetest.sound_play("steam_puff", {gain=0.5, pos=pos})
+ elseif destination_node_def and not destination_node_def.walkable then
+ minetest.add_item(destination_pos, source_stack)
+ inv:set_stack("main", source_index, nil)
+ minetest.sound_play("steam_puff", {gain=0.5, pos=pos})
+ else
+ minetest.sound_play("buzzer", {gain=0.5, pos=pos})
+ end
+ end
+ end,
+
+ after_place_node = (function() if pipeworks_path then return pipeworks.after_place end end)(),
+ after_dig_node = (function() if pipeworks_path then return pipeworks.after_dig end end)()
+})