Add registration code for extractor
authorNovatux <nathanael.courant@laposte.net>
Wed, 2 Jul 2014 17:43:13 +0000 (19:43 +0200)
committerNovatux <nathanael.courant@laposte.net>
Wed, 2 Jul 2014 17:43:13 +0000 (19:43 +0200)
technic/legacy.lua
technic/machines/LV/extractor.lua
technic/machines/register/extractor.lua [new file with mode: 0644]
technic/machines/register/extractor_recipes.lua [new file with mode: 0644]
technic/machines/register/init.lua
technic/textures/technic_lv_extractor_bottom.png [new file with mode: 0644]
technic/textures/technic_lv_extractor_front.png [new file with mode: 0644]
technic/textures/technic_lv_extractor_front_active.png [new file with mode: 0644]
technic/textures/technic_lv_extractor_side.png [new file with mode: 0644]
technic/textures/technic_lv_extractor_top.png [new file with mode: 0644]

index bc6fd9c4d8a358c8a94f0fda91451068d9bfa866..f1ecf670a9ae23951c22408e821089e3b894bc47 100644 (file)
@@ -17,6 +17,8 @@ technic.legacy_nodenames = {
        ["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",
index 72d2ce7c5ff1e4007c20c04686045635af3862a9..df1ca2ecf4842eb5fa60e84541cecf763fd75a06 100644 (file)
@@ -1,57 +1,8 @@
 
-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'},
@@ -59,116 +10,4 @@ minetest.register_craft({
        }
 })
 
-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})
diff --git a/technic/machines/register/extractor.lua b/technic/machines/register/extractor.lua
new file mode 100644 (file)
index 0000000..e79d32c
--- /dev/null
@@ -0,0 +1,154 @@
+
+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
+
diff --git a/technic/machines/register/extractor_recipes.lua b/technic/machines/register/extractor_recipes.lua
new file mode 100644 (file)
index 0000000..2d19130
--- /dev/null
@@ -0,0 +1,77 @@
+
+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
+
index 673b2651790bdfd93d30be038c1d6ce91ee7aa36..a4435c257b98902a9ebdab3d256999330ab7b7d8 100644 (file)
@@ -7,6 +7,8 @@ dofile(path.."/common.lua")
 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")
 
diff --git a/technic/textures/technic_lv_extractor_bottom.png b/technic/textures/technic_lv_extractor_bottom.png
new file mode 100644 (file)
index 0000000..aecd719
Binary files /dev/null and b/technic/textures/technic_lv_extractor_bottom.png differ
diff --git a/technic/textures/technic_lv_extractor_front.png b/technic/textures/technic_lv_extractor_front.png
new file mode 100644 (file)
index 0000000..1bd7e9a
Binary files /dev/null and b/technic/textures/technic_lv_extractor_front.png differ
diff --git a/technic/textures/technic_lv_extractor_front_active.png b/technic/textures/technic_lv_extractor_front_active.png
new file mode 100644 (file)
index 0000000..7f8b30a
Binary files /dev/null and b/technic/textures/technic_lv_extractor_front_active.png differ
diff --git a/technic/textures/technic_lv_extractor_side.png b/technic/textures/technic_lv_extractor_side.png
new file mode 100644 (file)
index 0000000..99d9486
Binary files /dev/null and b/technic/textures/technic_lv_extractor_side.png differ
diff --git a/technic/textures/technic_lv_extractor_top.png b/technic/textures/technic_lv_extractor_top.png
new file mode 100644 (file)
index 0000000..e7d9ff9
Binary files /dev/null and b/technic/textures/technic_lv_extractor_top.png differ