summaryrefslogtreecommitdiff
path: root/nodes
diff options
context:
space:
mode:
Diffstat (limited to 'nodes')
-rw-r--r--nodes/node_duplicator.lua178
-rw-r--r--nodes/recipes.lua9
2 files changed, 187 insertions, 0 deletions
diff --git a/nodes/node_duplicator.lua b/nodes/node_duplicator.lua
new file mode 100644
index 0000000..7d20a65
--- /dev/null
+++ b/nodes/node_duplicator.lua
@@ -0,0 +1,178 @@
+-- internationalization boilerplate
+local MP = minetest.get_modpath(minetest.get_current_modname())
+local S, NS = dofile(MP.."/intllib.lua")
+
+local inventory_formspec_string =
+ "size[9,9.3]" ..
+ default.gui_bg ..
+ default.gui_bg_img ..
+ default.gui_slots ..
+ "label[0,0;" .. S("Digtron components") .. "]" ..
+ "list[current_name;main;0,0.6;8,4;]" ..
+ "list[current_player;main;0,5.15;8,1;]" ..
+ "list[current_player;main;0,6.38;8,3;8]" ..
+ "listring[current_name;main]" ..
+ "listring[current_player;main]" ..
+ default.get_hotbar_bg(0,5.15)..
+ "button_exit[8,3.5;1,1;duplicate;"..S("Duplicate").."]" ..
+ "tooltip[duplicate;" .. S("Puts a copy of the adjacent Digtron into an empty crate\nlocated at the output side of the duplicator,\nusing components from the duplicator's inventory.") .. "]"
+
+if minetest.get_modpath("doc") then
+ inventory_formspec_string = inventory_formspec_string ..
+ "button_exit[8,4.5;1,1;help;"..S("Help").."]" ..
+ "tooltip[help;" .. S("Show documentation about this block") .. "]"
+end
+
+minetest.register_node("digtron:duplicator", {
+ description = S("Digtron Duplicator"),
+ _doc_items_longdesc = digtron.doc.duplicator_longdesc,
+ _doc_items_usagehelp = digtron.doc.duplicator_usagehelp,
+ groups = {cracky = 3, oddly_breakable_by_hand=3},
+ sounds = digtron.metal_sounds,
+ tiles = {"digtron_plate.png^(digtron_axel_side.png^[transformR90)",
+ "digtron_plate.png^(digtron_axel_side.png^[transformR270)",
+ "digtron_plate.png^digtron_axel_side.png",
+ "digtron_plate.png^(digtron_axel_side.png^[transformR180)",
+ "digtron_plate.png^digtron_builder.png",
+ "digtron_plate.png",
+ },
+ paramtype = "light",
+ paramtype2= "facedir",
+ is_ground_content = false,
+ drawtype="nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5, 0.3125, 0.3125, 0.5, 0.5, 0.5}, -- FrontFrame_top
+ {-0.5, -0.5, 0.3125, 0.5, -0.3125, 0.5}, -- FrontFrame_bottom
+ {0.3125, -0.3125, 0.3125, 0.5, 0.3125, 0.5}, -- FrontFrame_right
+ {-0.5, -0.3125, 0.3125, -0.3125, 0.3125, 0.5}, -- FrontFrame_left
+ {-0.0625, -0.3125, 0.3125, 0.0625, 0.3125, 0.375}, -- frontcross_vertical
+ {-0.3125, -0.0625, 0.3125, 0.3125, 0.0625, 0.375}, -- frontcross_horizontal
+ {-0.4375, -0.4375, -0.4375, 0.4375, 0.4375, 0.3125}, -- Body
+ {-0.5, -0.3125, -0.5, -0.3125, 0.3125, -0.3125}, -- backframe_vertical
+ {0.3125, -0.3125, -0.5, 0.5, 0.3125, -0.3125}, -- backframe_left
+ {-0.5, 0.3125, -0.5, 0.5, 0.5, -0.3125}, -- backframe_top
+ {-0.5, -0.5, -0.5, 0.5, -0.3125, -0.3125}, -- backframe_bottom
+ {-0.0625, -0.0625, -0.5625, 0.0625, 0.0625, -0.4375}, -- back_probe
+ },
+ },
+ selection_box = {
+ type = "regular"
+ },
+
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec", inventory_formspec_string)
+ local inv = meta:get_inventory()
+ inv:set_size("main", 8*4)
+ end,
+
+ can_dig = function(pos,player)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ return inv:is_empty("main")
+ end,
+
+ allow_metadata_inventory_put = function(pos, listname, index, stack, player)
+ if minetest.get_item_group(stack:get_name(), "digtron") > 0 then
+ return stack:get_count()
+ else
+ return 0
+ end
+ end,
+
+ on_receive_fields = function(pos, formname, fields, sender)
+ if fields.help then
+ minetest.after(0.5, doc.show_entry, sender:get_player_name(), "nodes", "digtron:duplicator", true)
+ end
+
+ if fields.duplicate then
+ local node = minetest.get_node(pos)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ local target_pos = vector.add(pos, minetest.facedir_to_dir(node.param2))
+ local target_node = minetest.get_node(target_pos)
+
+ if target_node.name ~= "digtron:empty_crate" then
+ minetest.sound_play("buzzer", {gain=0.5, pos=pos})
+ meta:set_string("infotext", S("Needs an empty crate in output position to store duplicate"))
+ return
+ end
+
+ local layout = DigtronLayout.create(pos, sender)
+
+ if layout.contains_protected_node then
+ minetest.sound_play("buzzer", {gain=0.5, pos=pos})
+ meta:set_string("infotext", S("Digtron can't be duplicated, it contains protected blocks"))
+ return
+ end
+
+ if #layout.all == 1 then
+ minetest.sound_play("buzzer", {gain=0.5, pos=pos})
+ meta:set_string("infotext", S("No Digtron components adjacent to duplicate"))
+ return
+ end
+
+ layout.all[1] = {node={name="digtron:empty_crate"}, meta={fields = {}, inventory = {}}, pos={x=pos.x, y=pos.y, z=pos.z}} -- replace the duplicator's image with the empty crate image
+
+ -- count required nodes, skipping node 1 since it's the crate and we already know it's present in-world
+ local required_count = {}
+ for i = 2, #layout.all do
+ local nodename = layout.all[i].node.name
+ required_count[nodename] = (required_count[nodename] or 0) + 1
+ end
+
+ -- check that there's enough in the duplicator's inventory
+ local unsatisfied = {}
+ for name, count in pairs(required_count) do
+ if not inv:contains_item("main", ItemStack({name=name, count=count})) then
+ table.insert(unsatisfied, tostring(count) .. " " .. minetest.registered_nodes[name].description)
+ end
+ end
+ if #unsatisfied > 0 then
+ minetest.sound_play("dingding", {gain=1.0, pos=pos}) -- Insufficient inventory
+ meta:set_string("infotext", S("Duplicator requires:\n@1", table.concat(unsatisfied, "\n")))
+ return
+ end
+
+ meta:set_string("infotext", "") -- clear infotext, we're good to go.
+
+ -- deduct nodes from duplicator inventory
+ for name, count in pairs(required_count) do
+ inv:remove_item("main", ItemStack({name=name, count=count}))
+ end
+
+ -- clear inventories of image's nodes
+ for _, node_image in pairs(layout.inventories) do
+ local main_inventory = node_image.meta.inventory.main
+ for index, _ in pairs(main_inventory) do
+ main_inventory[index] = ItemStack(nil)
+ end
+ end
+ for _, node_image in pairs(layout.fuelstores) do
+ local fuel_inventory = node_image.meta.inventory.fuel
+ for index, _ in pairs(fuel_inventory) do
+ fuel_inventory[index] = ItemStack(nil)
+ end
+ end
+ for _, node_image in pairs(layout.battery_holders) do
+ local battery_inventory = node_image.meta.inventory.batteries
+ for index, _ in pairs(battery_inventory) do
+ battery_inventory[index] = ItemStack(nil)
+ end
+ end
+
+ -- replace empty crate with loaded crate and write image to its metadata
+ local layout_string = layout:serialize()
+
+ minetest.set_node(target_pos, {name="digtron:loaded_crate", param1=node.param1, param2=node.param2})
+ local target_meta = minetest.get_meta(target_pos)
+ target_meta:set_string("crated_layout", layout_string)
+ target_meta:set_string("title", S("Crated Digtron"))
+ target_meta:set_string("infotext", S("Crated Digtron"))
+ minetest.sound_play("machine1", {gain=1.0, pos=pos})
+ end
+ end,
+
+}) \ No newline at end of file
diff --git a/nodes/recipes.lua b/nodes/recipes.lua
index a275bb4..baef07f 100644
--- a/nodes/recipes.lua
+++ b/nodes/recipes.lua
@@ -148,6 +148,15 @@ minetest.register_craft({
})
minetest.register_craft({
+ output = "digtron:duplicator",
+ recipe = {
+ {"default:mese_crystal","default:mese_crystal","default:mese_crystal"},
+ {"default:chest","digtron:digtron_core","default:chest"},
+ {"default:mese_crystal","default:mese_crystal","default:mese_crystal"}
+ }
+})
+
+minetest.register_craft({
output = "digtron:inventory_ejector",
recipe = {
{"default:steel_ingot","default:steel_ingot","default:steel_ingot"},