diff options
author | FaceDeer <derksenmobile@gmail.com> | 2017-10-14 14:55:39 -0600 |
---|---|---|
committer | FaceDeer <derksenmobile@gmail.com> | 2017-10-14 14:55:39 -0600 |
commit | 398716464a16f20113dc19d2bb24285d40454a52 (patch) | |
tree | 28791d7cdc18119499e22a29d44621b6180fd85e /nodes/node_item_ejector.lua | |
parent | 776bbb1811802cf46b79f22e407664155157e260 (diff) |
add inventory ejector
Diffstat (limited to 'nodes/node_item_ejector.lua')
-rw-r--r-- | nodes/node_item_ejector.lua | 82 |
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)() +}) |