["technic:electric_furnace_active"] = "technic:lv_electric_furnace_active",
["technic:grinder"] = "technic:lv_grinder",
["technic:grinder_active"] = "technic:lv_grinder_active",
+ ["technic:extractor"] = "technic:lv_extractor",
+ ["technic:extractor_active"] = "technic:lv_extractor_active",
["technic:hv_battery_box"] = "technic:hv_battery_box0",
["technic:hv_cable"] = "technic:hv_cable0",
["technic:lv_cable"] = "technic:lv_cable0",
-technic.extractor_recipes ={}
+minetest.register_alias("extractor", "technic:lv_extractor")
-local S = technic.getter
-
-if unified_inventory and unified_inventory.register_craft_type then
- unified_inventory.register_craft_type("extracting", {
- description = S("Extracting"),
- height = 1,
- width = 1,
- })
-end
-
-technic.register_extractor_recipe = function(src, src_count, dst, dst_count)
- technic.extractor_recipes[src] = {src_count = src_count, dst_name = dst, dst_count = dst_count}
- if unified_inventory then
- unified_inventory.register_craft({
- type = "extracting",
- output = dst.." "..dst_count,
- items = {src.." "..src_count},
- width = 0,
- })
- end
-end
-
--- Receive an ItemStack of result by an ItemStack input
-technic.get_extractor_recipe = function(item)
- if technic.extractor_recipes[item.name] and
- item.count >= technic.extractor_recipes[item.name].src_count then
- return technic.extractor_recipes[item.name]
- else
- return nil
- end
-end
-
-
-
-technic.register_extractor_recipe("technic:coal_dust", 1, "dye:black", 2)
-technic.register_extractor_recipe("default:cactus", 1, "dye:green", 2)
-technic.register_extractor_recipe("default:dry_shrub", 1, "dye:brown", 2)
-technic.register_extractor_recipe("flowers:geranium", 1, "dye:blue", 2)
-technic.register_extractor_recipe("flowers:dandelion_white", 1, "dye:white", 2)
-technic.register_extractor_recipe("flowers:dandelion_yellow", 1, "dye:yellow", 2)
-technic.register_extractor_recipe("flowers:tulip", 1, "dye:orange", 2)
-technic.register_extractor_recipe("flowers:rose", 1, "dye:red", 2)
-technic.register_extractor_recipe("flowers:viola", 1, "dye:violet", 2)
-technic.register_extractor_recipe("technic:raw_latex", 1, "technic:rubber", 3)
-technic.register_extractor_recipe("moretrees:rubber_tree_trunk_empty", 1, "technic:rubber", 1)
-technic.register_extractor_recipe("moretrees:rubber_tree_trunk", 1, "technic:rubber", 1)
-technic.register_extractor_recipe("technic:uranium", 5, "technic:enriched_uranium", 1)
-
-minetest.register_alias("extractor", "technic:extractor")
minetest.register_craft({
- output = 'technic:extractor',
+ output = 'technic:lv_extractor',
recipe = {
{'technic:treetap', 'technic:motor', 'technic:treetap'},
{'technic:treetap', 'technic:lv_cable0', 'technic:treetap'},
}
})
-local extractor_formspec =
- "invsize[8,9;]"..
- "label[0,0;"..S("%s Extractor"):format("LV").."]"..
- "list[current_name;src;3,1;1,1;]"..
- "list[current_name;dst;5,1;2,2;]"..
- "list[current_player;main;0,5;8,4;]"
-
-minetest.register_node("technic:extractor", {
- description = S("%s Extractor"):format("LV"),
- tiles = {"technic_lv_grinder_top.png", "technic_lv_grinder_bottom.png", "technic_lv_grinder_side.png",
- "technic_lv_grinder_side.png", "technic_lv_grinder_side.png", "technic_lv_grinder_front.png"},
- paramtype2 = "facedir",
- groups = {cracky=2},
- legacy_facedir_simple = true,
- sounds = default.node_sound_wood_defaults(),
- on_construct = function(pos)
- local meta = minetest.get_meta(pos)
- meta:set_string("infotext", S("%s Extractor"):format("LV"))
- meta:set_string("formspec", extractor_formspec)
- local inv = meta:get_inventory()
- inv:set_size("src", 1)
- inv:set_size("dst", 4)
- end,
- can_dig = technic.machine_can_dig,
- allow_metadata_inventory_put = technic.machine_inventory_put,
- allow_metadata_inventory_take = technic.machine_inventory_take,
- allow_metadata_inventory_move = technic.machine_inventory_move,
-})
-
-minetest.register_node("technic:extractor_active", {
- description = S("%s Extractor"):format("LV"),
- tiles = {"technic_lv_grinder_top.png", "technic_lv_grinder_bottom.png",
- "technic_lv_grinder_side.png", "technic_lv_grinder_side.png",
- "technic_lv_grinder_side.png", "technic_lv_grinder_front_active.png"},
- paramtype2 = "facedir",
- drop = "technic:extractor",
- groups = {cracky=2, not_in_creative_inventory=1},
- legacy_facedir_simple = true,
- sounds = default.node_sound_wood_defaults(),
- can_dig = technic.machine_can_dig,
- allow_metadata_inventory_put = technic.machine_inventory_put,
- allow_metadata_inventory_take = technic.machine_inventory_take,
- allow_metadata_inventory_move = technic.machine_inventory_move,
-})
-
-minetest.register_abm({
- nodenames = {"technic:extractor", "technic:extractor_active"},
- interval = 1,
- chance = 1,
- action = function(pos, node, active_object_count, active_object_count_wider)
- -- The machine will automatically shut down if disconnected from power in some fashion.
- local meta = minetest.get_meta(pos)
- local inv = meta:get_inventory()
- local srcstack = inv:get_stack("src", 1)
- local eu_input = meta:get_int("LV_EU_input")
-
- -- Machine information
- local machine_name = S("%s Extractor"):format("LV")
- local machine_node = "technic:extractor"
- local demand = 300
-
- -- Setup meta data if it does not exist.
- if not eu_input then
- meta:set_int("LV_EU_demand", demand)
- meta:set_int("LV_EU_input", 0)
- return
- end
-
- -- Power off automatically if no longer connected to a switching station
- technic.switching_station_timeout_count(pos, "LV")
-
- local src_item = nil
- if srcstack then
- src_item = srcstack:to_table()
- end
- if src_item then
- recipe = technic.get_extractor_recipe(src_item)
- end
- if recipe then
- result = {name=recipe.dst_name, count=recipe.dst_count}
- end
- if inv:is_empty("src") or (not recipe) or (not result) or
- (not inv:room_for_item("dst", result)) then
- technic.swap_node(pos, machine_node)
- meta:set_string("infotext", S("%s Idle"):format(machine_name))
- meta:set_int("LV_EU_demand", 0)
- return
- end
-
- if eu_input < demand then
- -- unpowered - go idle
- technic.swap_node(pos, machine_node)
- meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
- elseif eu_input >= demand then
- -- Powered
- technic.swap_node(pos, machine_node.."_active")
- meta:set_string("infotext", S("%s Active"):format(machine_name))
-
- meta:set_int("src_time", meta:get_int("src_time") + 1)
- if meta:get_int("src_time") >= 4 then -- 4 ticks per output
- meta:set_int("src_time", 0)
- srcstack:take_item(recipe.src_count)
- inv:set_stack("src", 1, srcstack)
- inv:add_item("dst", result)
- end
- end
- meta:set_int("LV_EU_demand", demand)
- end
-})
-
-technic.register_machine("LV", "technic:extractor", technic.receiver)
-technic.register_machine("LV", "technic:extractor_active", technic.receiver)
-
+technic.register_extractor({tier = "LV", demand = {300}, speed = 1})
--- /dev/null
+
+local S = technic.getter
+
+local extractor_formspec =
+ "invsize[8,9;]"..
+ "label[0,0;"..S("%s Extractor"):format("LV").."]"..
+ "list[current_name;src;3,1;1,1;]"..
+ "list[current_name;dst;5,1;2,2;]"..
+ "list[current_player;main;0,5;8,4;]"
+
+function technic.register_extractor(data)
+ local tier = data.tier
+ local ltier = string.lower(tier)
+
+ local groups = {cracky = 2}
+ local active_groups = {cracky = 2, not_in_creative_inventory = 1}
+ if data.tube then
+ groups.tubedevice = 1
+ groups.tubedevice_receiver = 1
+ active_groups.tubedevice = 1
+ active_groups.tubedevice_receiver = 1
+ end
+
+
+ local formspec =
+ "invsize[8,9;]"..
+ "list[current_name;src;3,1;1,1;]"..
+ "list[current_name;dst;5,1;2,2;]"..
+ "list[current_player;main;0,5;8,4;]"..
+ "label[0,0;"..S("%s Extractor"):format(tier).."]"
+
+ if data.upgrade then
+ formspec = formspec..
+ "list[current_name;upgrade1;1,4;1,1;]"..
+ "list[current_name;upgrade2;2,4;1,1;]"..
+ "label[1,5;"..S("Upgrade Slots").."]"
+ end
+
+ minetest.register_node("technic:"..ltier.."_extractor", {
+ description = S("%s Extractor"):format(tier),
+ tiles = {"technic_"..ltier.."_extractor_top.png", "technic_"..ltier.."_extractor_bottom.png",
+ "technic_"..ltier.."_extractor_side.png", "technic_"..ltier.."_extractor_side.png",
+ "technic_"..ltier.."_extractor_side.png", "technic_"..ltier.."_extractor_front.png"},
+ paramtype2 = "facedir",
+ groups = groups,
+ tube = data.tube and tube or nil,
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_wood_defaults(),
+ on_construct = function(pos)
+ local node = minetest.get_node(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("infotext", S("%s Extractor"):format(tier))
+ meta:set_int("tube_time", 0)
+ meta:set_string("formspec", formspec)
+ local inv = meta:get_inventory()
+ inv:set_size("src", 1)
+ inv:set_size("dst", 4)
+ inv:set_size("upgrade1", 1)
+ inv:set_size("upgrade2", 1)
+ end,
+ can_dig = technic.machine_can_dig,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+ })
+
+ minetest.register_node("technic:"..ltier.."_extractor_active",{
+ description = S("%s Grinder"):format(tier),
+ tiles = {"technic_"..ltier.."_extractor_top.png", "technic_"..ltier.."_extractor_bottom.png",
+ "technic_"..ltier.."_extractor_side.png", "technic_"..ltier.."_extractor_side.png",
+ "technic_"..ltier.."_extractor_side.png", "technic_"..ltier.."_extractor_front_active.png"},
+ paramtype2 = "facedir",
+ drop = "technic:"..ltier.."_extractor",
+ groups = active_groups,
+ legacy_facedir_simple = true,
+ sounds = default.node_sound_wood_defaults(),
+ tube = data.tube and tube or nil,
+ can_dig = technic.machine_can_dig,
+ allow_metadata_inventory_put = technic.machine_inventory_put,
+ allow_metadata_inventory_take = technic.machine_inventory_take,
+ allow_metadata_inventory_move = technic.machine_inventory_move,
+ })
+
+ minetest.register_abm({
+ nodenames = {"technic:"..ltier.."_extractor","technic:"..ltier.."_extractor_active"},
+ interval = 1,
+ chance = 1,
+ action = function(pos, node, active_object_count, active_object_count_wider)
+ local meta = minetest.get_meta(pos)
+ local inv = meta:get_inventory()
+ local eu_input = meta:get_int(tier.."_EU_input")
+
+ local machine_name = S("%s Extractor"):format(tier)
+ local machine_node = "technic:"..ltier.."_extractor"
+ local machine_demand = data.demand
+
+ -- Setup meta data if it does not exist.
+ if not eu_input then
+ meta:set_int(tier.."_EU_demand", machine_demand[1])
+ meta:set_int(tier.."_EU_input", 0)
+ return
+ end
+
+ -- Power off automatically if no longer connected to a switching station
+ technic.switching_station_timeout_count(pos, tier)
+
+ local EU_upgrade, tube_upgrade = 0, 0
+ if data.upgrade then
+ EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
+ end
+ if data.tube then
+ technic.handle_machine_pipeworks(pos, tube_upgrade)
+ end
+
+ local srcstack = inv:get_stack("src", 1)
+ local result = technic.get_extractor_recipe(inv:get_stack("src", 1))
+
+ if not result then
+ technic.swap_node(pos, machine_node)
+ meta:set_string("infotext", S("%s Idle"):format(machine_name))
+ meta:set_int(tier.."_EU_demand", 0)
+ return
+ end
+
+ if eu_input < machine_demand[EU_upgrade+1] then
+ -- Unpowered - go idle
+ technic.swap_node(pos, machine_node)
+ meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
+ elseif eu_input >= machine_demand[EU_upgrade+1] then
+ -- Powered
+ technic.swap_node(pos, machine_node.."_active")
+ meta:set_string("infotext", S("%s Active"):format(machine_name))
+
+ 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
+ srcstack = inv:get_stack("src", 1)
+ srcstack:take_item(ItemStack(result.input):get_count())
+ inv:set_stack("src", 1, srcstack)
+ inv:add_item("dst", result_stack)
+ end
+ end
+ end
+ meta:set_int(tier.."_EU_demand", machine_demand[EU_upgrade+1])
+ end
+ })
+
+ technic.register_machine(tier, "technic:"..ltier.."_extractor", technic.receiver)
+ technic.register_machine(tier, "technic:"..ltier.."_extractor_active", technic.receiver)
+
+end -- End registration
+
--- /dev/null
+
+local S = technic.getter
+
+if unified_inventory and unified_inventory.register_craft_type then
+ unified_inventory.register_craft_type("extracting", {
+ description = S("Extracting"),
+ height = 1,
+ width = 1,
+ })
+end
+
+technic.extractor_recipes = {}
+
+function technic.register_extractor_recipe(data)
+ data.time = data.time or 4
+ local src = ItemStack(data.input):get_name()
+ technic.extractor_recipes[src] = data
+ if unified_inventory then
+ unified_inventory.register_craft({
+ type = "extracting",
+ output = data.output,
+ items = {data.input},
+ width = 0,
+ })
+ end
+end
+
+-- Receive an ItemStack of result by an ItemStack input
+function technic.get_extractor_recipe(item)
+ if technic.extractor_recipes[item:get_name()] and
+ item:get_count() >= ItemStack(technic.extractor_recipes[item:get_name()].input):get_count() then
+ return technic.extractor_recipes[item:get_name()]
+ else
+ return nil
+ end
+end
+
+minetest.after(0.01, function ()
+ for ingredient, recipe in pairs(technic.extractor_recipes) do
+ ingredient = minetest.registered_aliases[ingredient]
+ while ingredient do
+ technic.grinder_recipes[ingredient] = recipe
+ ingredient = minetest.registered_aliases[ingredient]
+ end
+ end
+end)
+
+-- Receive an ItemStack of result by an ItemStack input
+function technic.get_grinder_recipe(itemstack)
+ return technic.grinder_recipes[itemstack:get_name()]
+end
+
+local recipes = {
+ -- Dyes
+ {"technic:coal_dust", "dye:black 2"},
+ {"default:cactus", "dye:green 2"},
+ {"default:dry_shrub", "dye:brown 2"},
+ {"flowers:geranium", "dye:blue 2"},
+ {"flowers:dandelion_white", "dye:white 2"},
+ {"flowers:dandelion_yellow", "dye:yellow 2"},
+ {"flowers:tulip", "dye:orange 2"},
+ {"flowers:rose", "dye:red 2"},
+ {"flowers:viola", "dye:violet 2"},
+
+ -- Rubber
+ {"technic:raw_latex", "technic:rubber 3"},
+ {"moretrees:rubber_tree_trunk_empty", "technic:rubber"},
+ {"moretrees:rubber_tree_trunk", "technic:rubber"},
+
+ -- Other
+ {"technic:uranium 5", "technic:enriched_uranium"},
+}
+
+for _, data in pairs(recipes) do
+ technic.register_extractor_recipe({input = data[1], output = data[2]})
+end
+
dofile(path.."/electric_furnace.lua")
dofile(path.."/grinder.lua")
dofile(path.."/grinder_recipes.lua")
+dofile(path.."/extractor.lua")
+dofile(path.."/extractor_recipes.lua")
dofile(path.."/solar_array.lua")
dofile(path.."/generator.lua")