Add centrifuge
The centrifuge, currently only existing in an MV variety, is a machine
that separates a mixed substance into its constituents. Currently the
main use is to reverse alloying of metals. The alloy separation recipes
intentionally only operate on the dust form of metals, making this less
convenient than the original alloying. It also only recovers metal
constituents, not the carbon that went into cast iron or carbon steel.
This change incidentally generalises the technic recipe and
machine infrastructure to handle recipes with multiple outputs.
As unified_inventory's craft guide can't yet handle that, these recipes
are not registered there.
8 files added
9 files modified
| | |
| | | %s Battery Box = |
| | | %s Cable = |
| | | %s CNC Machine = |
| | | %s Centrifuge = |
| | | %s Compressor = |
| | | %s Extractor = |
| | | %s Forcefield Emitter = |
| | |
| | | Grinding = |
| | | Compressing = |
| | | Extracting = |
| | | Separating = |
New file |
| | |
| | | minetest.register_craft({ |
| | | output = "technic:mv_centrifuge", |
| | | recipe = { |
| | | { "technic:motor", "technic:copper_plate", "technic:diamond_drill_head" }, |
| | | { "technic:copper_plate", "technic:machine_casing", "technic:copper_plate" }, |
| | | { "pipeworks:one_way_tube", "technic:mv_cable0", "pipeworks:mese_filter" }, |
| | | } |
| | | }) |
| | | |
| | | technic.register_centrifuge({ |
| | | tier = "MV", |
| | | demand = { 8000, 7000, 6000 }, |
| | | speed = 2, |
| | | upgrade = 1, |
| | | tube = 1, |
| | | }) |
| | |
| | | dofile(path.."/grinder.lua") |
| | | dofile(path.."/extractor.lua") |
| | | dofile(path.."/compressor.lua") |
| | | dofile(path.."/centrifuge.lua") |
| | | |
| | | dofile(path.."/tool_workshop.lua") |
| | | |
| | |
| | | |
| | | local S = technic.getter |
| | | |
| | | technic.register_recipe_type("alloy", S("Alloy cooking"), 2) |
| | | technic.register_recipe_type("alloy", { |
| | | description = S("Alloy cooking"), |
| | | input_size = 2, |
| | | }) |
| | | |
| | | function technic.register_alloy_recipe(data) |
| | | data.time = data.time or 6 |
New file |
| | |
| | | local S = technic.getter |
| | | |
| | | function technic.register_centrifuge(data) |
| | | data.typename = "separating" |
| | | data.machine_name = "centrifuge" |
| | | data.machine_desc = S("%s Centrifuge") |
| | | technic.register_base_machine(data) |
| | | end |
New file |
| | |
| | | local S = technic.getter |
| | | |
| | | technic.register_recipe_type("separating", { |
| | | description = S("Separating"), |
| | | output_size = 2, |
| | | }) |
| | | |
| | | function technic.register_separating_recipe(data) |
| | | data.time = data.time or 10 |
| | | technic.register_recipe("separating", data) |
| | | end |
| | | |
| | | local rubber_tree_planks = minetest.get_modpath("moretrees") and "moretrees:rubber_tree_planks" or "default:wood" |
| | | |
| | | local recipes = { |
| | | { "technic:bronze_dust 4", "technic:copper_dust 3", "technic:tin_dust" }, |
| | | { "technic:stainless_steel_dust 4", "technic:wrought_iron_dust 3", "technic:chromium_dust" }, |
| | | { "technic:brass_dust 3", "technic:copper_dust 2", "technic:zinc_dust" }, |
| | | { "moretrees:rubber_tree_trunk_empty", rubber_tree_planks.." 4", "technic:raw_latex" }, |
| | | { "moretrees:rubber_tree_trunk", rubber_tree_planks.." 4", "technic:raw_latex" }, |
| | | } |
| | | |
| | | if minetest.get_modpath("bushes_classic") then |
| | | for _, berry in ipairs({ "blackberry", "blueberry", "gooseberry", "raspberry", "strawberry" }) do |
| | | table.insert(recipes, { "bushes:"..berry.."_bush", "default:stick 20", "bushes:"..berry.." 4" }) |
| | | end |
| | | end |
| | | |
| | | for _, data in pairs(recipes) do |
| | | technic.register_separating_recipe({ input = { data[1] }, output = { data[2], data[3] } }) |
| | | end |
| | |
| | | |
| | | local S = technic.getter |
| | | |
| | | technic.register_recipe_type("compressing", S("Compressing")) |
| | | technic.register_recipe_type("compressing", { description = S("Compressing") }) |
| | | |
| | | function technic.register_compressor_recipe(data) |
| | | data.time = data.time or 4 |
| | |
| | | |
| | | local S = technic.getter |
| | | |
| | | technic.register_recipe_type("extracting", S("Extracting")) |
| | | technic.register_recipe_type("extracting", { description = S("Extracting") }) |
| | | |
| | | function technic.register_extractor_recipe(data) |
| | | data.time = data.time or 4 |
| | |
| | | |
| | | local S = technic.getter |
| | | |
| | | technic.register_recipe_type("grinding", S("Grinding")) |
| | | technic.register_recipe_type("grinding", { description = S("Grinding") }) |
| | | |
| | | function technic.register_grinder_recipe(data) |
| | | data.time = data.time or 3 |
| | |
| | | dofile(path.."/grinder_recipes.lua") |
| | | dofile(path.."/extractor_recipes.lua") |
| | | dofile(path.."/compressor_recipes.lua") |
| | | dofile(path.."/centrifuge_recipes.lua") |
| | | |
| | | -- Machines |
| | | dofile(path.."/alloy_furnace.lua") |
| | |
| | | dofile(path.."/grinder.lua") |
| | | dofile(path.."/extractor.lua") |
| | | dofile(path.."/compressor.lua") |
| | | |
| | | dofile(path.."/centrifuge.lua") |
| | |
| | | |
| | | function technic.register_base_machine(data) |
| | | local typename = data.typename |
| | | local numitems = technic.recipes[typename].numitems |
| | | local input_size = technic.recipes[typename].input_size |
| | | local machine_name = data.machine_name |
| | | local machine_desc = data.machine_desc |
| | | local tier = data.tier |
| | |
| | | |
| | | local formspec = |
| | | "invsize[8,9;]".. |
| | | "list[current_name;src;"..(4-numitems)..",1;"..numitems..",1;]".. |
| | | "list[current_name;src;"..(4-input_size)..",1;"..input_size..",1;]".. |
| | | "list[current_name;dst;5,1;2,2;]".. |
| | | "list[current_player;main;0,5;8,4;]".. |
| | | "label[0,0;"..machine_desc:format(tier).."]" |
| | |
| | | meta:set_int("src_time", meta:get_int("src_time") + 1) |
| | | if meta:get_int("src_time") >= result.time / data.speed then |
| | | meta:set_int("src_time", 0) |
| | | local result_stack = ItemStack(result.output) |
| | | if inv:room_for_item("dst", result_stack) then |
| | | local output = result.output |
| | | if type(output) ~= "table" then output = { output } end |
| | | local output_stacks = {} |
| | | for _, o in ipairs(output) do |
| | | table.insert(output_stacks, ItemStack(o)) |
| | | end |
| | | local room_for_output = true |
| | | inv:set_size("dst_tmp", inv:get_size("dst")) |
| | | inv:set_list("dst_tmp", inv:get_list("dst")) |
| | | for _, o in ipairs(output_stacks) do |
| | | if not inv:room_for_item("dst_tmp", o) then |
| | | room_for_output = false |
| | | break |
| | | end |
| | | inv:add_item("dst_tmp", o) |
| | | end |
| | | if room_for_output then |
| | | inv:set_list("src", result.new_input) |
| | | inv:add_item("dst", result_stack) |
| | | inv:set_list("dst", inv:get_list("dst_tmp")) |
| | | else |
| | | end |
| | | end |
| | | end |
| | |
| | | meta:set_int("tube_time", 0) |
| | | meta:set_string("formspec", formspec) |
| | | local inv = meta:get_inventory() |
| | | inv:set_size("src", numitems) |
| | | inv:set_size("src", input_size) |
| | | inv:set_size("dst", 4) |
| | | inv:set_size("upgrade1", 1) |
| | | inv:set_size("upgrade2", 1) |
| | |
| | | |
| | | technic.recipes = {cooking = {numitems = 1}} |
| | | function technic.register_recipe_type(typename, desc, numitems) |
| | | numitems = numitems or 1 |
| | | if unified_inventory and unified_inventory.register_craft_type then |
| | | technic.recipes = { cooking = { input_size = 1, output_size = 1 } } |
| | | function technic.register_recipe_type(typename, origdata) |
| | | local data = {} |
| | | for k, v in pairs(origdata) do data[k] = v end |
| | | data.input_size = data.input_size or 1 |
| | | data.output_size = data.output_size or 1 |
| | | if unified_inventory and unified_inventory.register_craft_type and data.output_size == 1 then |
| | | unified_inventory.register_craft_type(typename, { |
| | | description = desc, |
| | | height = numitems, |
| | | description = data.description, |
| | | height = data.input_size, |
| | | width = 1, |
| | | }) |
| | | end |
| | | technic.recipes[typename] = {numitems = numitems, recipes = {}} |
| | | data.recipes = {} |
| | | technic.recipes[typename] = data |
| | | end |
| | | |
| | | local function get_recipe_index(items) |
| | |
| | | for i, stack in ipairs(data.input) do |
| | | data.input[i] = ItemStack(stack):to_string() |
| | | end |
| | | data.output = ItemStack(data.output):to_string() |
| | | if type(data.output) == "table" then |
| | | for i, v in ipairs(data.output) do |
| | | data.output[i] = ItemStack(data.output[i]):to_string() |
| | | end |
| | | else |
| | | data.output = ItemStack(data.output):to_string() |
| | | end |
| | | |
| | | local recipe = {time = data.time, input = {}, output = data.output} |
| | | local index = get_recipe_index(data.input) |
| | |
| | | end |
| | | |
| | | technic.recipes[typename].recipes[index] = recipe |
| | | if unified_inventory then |
| | | if unified_inventory and technic.recipes[typename].output_size == 1 then |
| | | unified_inventory.register_craft({ |
| | | type = typename, |
| | | output = data.output, |