From 398716464a16f20113dc19d2bb24285d40454a52 Mon Sep 17 00:00:00 2001 From: FaceDeer Date: Sat, 14 Oct 2017 14:55:39 -0600 Subject: [PATCH] add inventory ejector --- doc.lua | 11 +++++ init.lua | 7 ++- nodes/node_item_ejector.lua | 82 ++++++++++++++++++++++++++++++++++++ nodes/node_misc.lua | 2 +- nodes/node_storage.lua | 19 +++++---- nodes/recipes.lua | 9 ++++ sounds/license.txt | 1 + sounds/steam_puff.ogg | Bin 0 -> 7925 bytes textures/digtron_output.png | Bin 0 -> 205 bytes 9 files changed, 119 insertions(+), 12 deletions(-) create mode 100644 nodes/node_item_ejector.lua create mode 100644 sounds/steam_puff.ogg create mode 100644 textures/digtron_output.png diff --git a/doc.lua b/doc.lua index 220fd21..b12f262 100644 --- a/doc.lua +++ b/doc.lua @@ -196,6 +196,17 @@ digtron.doc.power_connector_usagehelp = S("A power connector node automatically --------------------------------------------------------------------- +digtron.doc.inventory_ejector_longdesc = S("An outlet that can be used to eject accumulated detritus from a Digtron's inventory.") +digtron.doc.inventory_ejector_usagehelp = S("When this block is right-clicked it will search the entire inventory of the Digtron and will eject a stack of items taken from it, provided the items are not set for use by any of the Digtron's builders. Will not eject if the destination block is occupied.") + +if pipeworks_enabled then + digtron.doc.inventory_ejector_usagehelp = digtron.doc.inventory_ejector_usagehelp + .."\n\n".. + S("Item ejectors are compatible with pipeworks and will automatically connect to a pipeworks tube if one is adjacent in the output location.") +end + +--------------------------------------------------------------------- + digtron.doc.structure_longdesc = S("Structural component for a Digtron array") digtron.doc.structure_usagehelp = S("These blocks allow otherwise-disconnected sections of digtron blocks to be linked together. They are not usually necessary for simple diggers but more elaborate builder arrays might have builder blocks that can't be placed directly adjacent to other digtron blocks and these blocks can serve to keep them connected to the controller." .."\n\n".. diff --git a/init.lua b/init.lua index 5e93454..981bb39 100644 --- a/init.lua +++ b/init.lua @@ -31,16 +31,19 @@ dofile( digtron_modpath .. "/class_layout.lua" ) dofile( digtron_modpath .. "/entities.lua" ) dofile( digtron_modpath .. "/nodes/node_misc.lua" ) -- contains structure and light nodes dofile( digtron_modpath .. "/nodes/node_storage.lua" ) -- contains inventory and fuel storage nodes -dofile( digtron_modpath .. "/nodes/node_battery_holder.lua" ) -- holds rechargeable batteries from the technic mod dofile( digtron_modpath .. "/nodes/node_diggers.lua" ) -- contains all diggers dofile( digtron_modpath .. "/nodes/node_builders.lua" ) -- contains all builders (there's just one currently) dofile( digtron_modpath .. "/nodes/node_controllers.lua" ) -- controllers dofile( digtron_modpath .. "/nodes/node_axle.lua" ) -- Rotation controller dofile( digtron_modpath .. "/nodes/node_crate.lua" ) -- Digtron portability support -dofile( digtron_modpath .. "/nodes/recipes.lua" ) +dofile( digtron_modpath .. "/nodes/node_item_ejector.lua" ) -- ejects non-building, non-fuel items from inventories +--Technic +dofile( digtron_modpath .. "/nodes/node_battery_holder.lua" ) -- holds rechargeable batteries from the technic mod dofile( digtron_modpath .. "/nodes/node_power_connector.lua") +dofile( digtron_modpath .. "/nodes/recipes.lua" ) + dofile( digtron_modpath .. "/upgrades.lua" ) -- various LBMs for upgrading older versions of Digtron. -- digtron group numbers: 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)() +}) diff --git a/nodes/node_misc.lua b/nodes/node_misc.lua index e847045..cea823e 100644 --- a/nodes/node_misc.lua +++ b/nodes/node_misc.lua @@ -52,7 +52,7 @@ minetest.register_node("digtron:light", { node_box = { type = "wallmounted", wall_top = {-0.25, 0.3125, -0.25, 0.25, 0.5, 0.25}, - wall_bottom = {-0.25, -0.3125, -0.25, 0.25, -0.5, 0.25}, + wall_bottom = {-0.25, -0.5, -0.25, 0.25, -0.3125, 0.25}, wall_side = {-0.5, -0.25, -0.25, -0.1875, 0.25, 0.25}, }, }) diff --git a/nodes/node_storage.lua b/nodes/node_storage.lua index fccf28a..123104e 100644 --- a/nodes/node_storage.lua +++ b/nodes/node_storage.lua @@ -2,6 +2,7 @@ local MP = minetest.get_modpath(minetest.get_current_modname()) local S, NS = dofile(MP.."/intllib.lua") +local pipeworks_path = minetest.get_modpath("pipeworks") local inventory_formspec = "size[8,9.3]" .. @@ -55,7 +56,7 @@ minetest.register_node("digtron:inventory", { -- Pipeworks compatibility ---------------------------------------------------------------- - tube = (function() if minetest.get_modpath("pipeworks") then return { + tube = (function() if pipeworks_path then return { insert_object = function(pos, node, stack, direction) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -70,8 +71,8 @@ minetest.register_node("digtron:inventory", { connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1} } end end)(), - after_place_node = (function() if minetest.get_modpath("pipeworks") then return pipeworks.after_place end end)(), - after_dig_node = (function() if minetest.get_modpath("pipeworks") then return pipeworks.after_dig 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)() }) local fuelstore_formspec = @@ -138,7 +139,7 @@ minetest.register_node("digtron:fuelstore", { -- Pipeworks compatibility ---------------------------------------------------------------- - tube = (function() if minetest.get_modpath("pipeworks") then return { + tube = (function() if pipeworks_path then return { insert_object = function(pos, node, stack, direction) if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then local meta = minetest.get_meta(pos) @@ -159,8 +160,8 @@ minetest.register_node("digtron:fuelstore", { connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1} } end end)(), - after_place_node = (function() if minetest.get_modpath("pipeworks") then return pipeworks.after_place end end)(), - after_dig_node = (function() if minetest.get_modpath("pipeworks")then return pipeworks.after_dig 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)() }) local combined_storage_formspec = @@ -241,7 +242,7 @@ minetest.register_node("digtron:combined_storage", { -- Pipeworks compatibility ---------------------------------------------------------------- - tube = (function() if minetest.get_modpath("pipeworks") then return { + tube = (function() if pipeworks_path then return { insert_object = function(pos, node, stack, direction) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -262,8 +263,8 @@ minetest.register_node("digtron:combined_storage", { connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1} } end end)(), - after_place_node = (function() if minetest.get_modpath("pipeworks") then return pipeworks.after_place end end)(), - after_dig_node = (function() if minetest.get_modpath("pipeworks") then return pipeworks.after_dig 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)() }) -- Hopper compatibility diff --git a/nodes/recipes.lua b/nodes/recipes.lua index 87b0945..a275bb4 100644 --- a/nodes/recipes.lua +++ b/nodes/recipes.lua @@ -147,6 +147,15 @@ minetest.register_craft({ } }) +minetest.register_craft({ + output = "digtron:inventory_ejector", + recipe = { + {"default:steel_ingot","default:steel_ingot","default:steel_ingot"}, + {"","digtron:digtron_core",""}, + {"","default:steel_ingot",""} + } +}) + -- Structural minetest.register_craft({ diff --git a/sounds/license.txt b/sounds/license.txt index 722589d..1de8114 100644 --- a/sounds/license.txt +++ b/sounds/license.txt @@ -10,6 +10,7 @@ squeal.ogg - https://www.freesound.org/people/RutgerMuller/sounds/104026/ public truck.ogg - https://www.freesound.org/people/jberkuta14/sounds/134898/ public domain via CC 1.0 by jberkuta14 whirr.ogg - https://www.freesound.org/people/daveincamas/sounds/25034/ - under the CC BY 3.0 license by daveincamas woopwoopwoop.ogg - https://www.freesound.org/people/gregconquest/sounds/188012/ public domain via CC 1.0 by gregconquest +steam_puff.ogg - https://freesound.org/people/Aiwha/sounds/250703/ under the CC BY 3.0 license by Aiwha Creative Commons Attribution 3.0 license: diff --git a/sounds/steam_puff.ogg b/sounds/steam_puff.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6183d01fd5f391516cb78390602a05815f8512d6 GIT binary patch literal 7925 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 Gu>S%0cKEyi literal 0 HcmV?d00001 diff --git a/textures/digtron_output.png b/textures/digtron_output.png new file mode 100644 index 0000000000000000000000000000000000000000..1f121857b0f53e1c11b4efc4064ac1f19b3699b7 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDU^>lYlPE4@2G!G39WLWW4 zQBl#s);caG>YrQ51fUwmk|4ie28U-i(m