2017-10-14 22:55:39 +02:00
|
|
|
-- 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},
|
2017-10-15 08:38:31 +02:00
|
|
|
tiles = {"digtron_plate.png", "digtron_plate.png", "digtron_plate.png", "digtron_plate.png", "digtron_plate.png^digtron_output.png", "digtron_plate.png^digtron_output_back.png"},
|
2017-10-14 22:55:39 +02:00
|
|
|
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)()
|
|
|
|
})
|