ShadowNinja
2013-10-30 be2f30a1a2f5b6c2aae7fd4cf8231aec2da0844d
commit | author | age
be2f30 1
ee0765 2 technic.extractor_recipes ={}
be2f30 3
S 4 local S = technic.getter
ee0765 5
S 6 technic.register_extractor_recipe = function(src, src_count, dst, dst_count)
7     technic.extractor_recipes[src] = {src_count = src_count, dst_name = dst, dst_count = dst_count}
8     if unified_inventory then
9         unified_inventory.register_craft({
10             type = "extracting",
11             output = dst.." "..dst_count,
12             items = {src.." "..src_count},
13             width = 0,
14         })
15     end
16 end
17
18 -- Receive an ItemStack of result by an ItemStack input
19 technic.get_extractor_recipe = function(item)
20     if technic.extractor_recipes[item.name] and
21        item.count >= technic.extractor_recipes[item.name].src_count then
22         return technic.extractor_recipes[item.name]
23     else
24         return nil
25     end
26 end
27
28
29
30 technic.register_extractor_recipe("technic:coal_dust",        1,          "dye:black",      2)
31 technic.register_extractor_recipe("default:cactus",           1,          "dye:green",      2)
32 technic.register_extractor_recipe("default:dry_shrub",        1,          "dye:brown",      2)
33 technic.register_extractor_recipe("flowers:geranium",         1,          "dye:blue",       2)
34 technic.register_extractor_recipe("flowers:dandelion_white",  1,          "dye:white",      2)
35 technic.register_extractor_recipe("flowers:dandelion_yellow", 1,          "dye:yellow",     2)
36 technic.register_extractor_recipe("flowers:tulip",            1,          "dye:orange",     2)
37 technic.register_extractor_recipe("flowers:rose",             1,          "dye:red",        2)
38 technic.register_extractor_recipe("flowers:viola",            1,          "dye:violet",     2)
39 technic.register_extractor_recipe("technic:raw_latex",        1,          "technic:rubber", 3)
40 technic.register_extractor_recipe("moretrees:rubber_tree_trunk_empty", 1, "technic:rubber", 1)
41 technic.register_extractor_recipe("moretrees:rubber_tree_trunk",       1, "technic:rubber", 1)
42 technic.register_extractor_recipe("technic:uranium",          5,          "technic:enriched_uranium", 1)
43
44 minetest.register_alias("extractor", "technic:extractor")
45 minetest.register_craft({
46     output = 'technic:extractor',
47     recipe = {
48         {'technic:treetap', 'technic:motor',     'technic:treetap'},
49         {'technic:treetap', 'technic:lv_cable0', 'technic:treetap'},
50         {'',                '',                  ''},
51     }
52 })
53
54 local extractor_formspec =
55    "invsize[8,9;]"..
be2f30 56    "label[0,0;"..S("Extractor").."]"..
ee0765 57    "list[current_name;src;3,1;1,1;]"..
S 58    "list[current_name;dst;5,1;2,2;]"..
59    "list[current_player;main;0,5;8,4;]"
60
61 minetest.register_node("technic:extractor", {
be2f30 62     description = S("Extractor"),
ee0765 63     tiles = {"technic_lv_grinder_top.png",  "technic_lv_grinder_bottom.png", "technic_lv_grinder_side.png",
S 64              "technic_lv_grinder_side.png", "technic_lv_grinder_side.png",   "technic_lv_grinder_front.png"},
65     paramtype2 = "facedir",
66     groups = {cracky=2},
67     legacy_facedir_simple = true,
68     sounds = default.node_sound_wood_defaults(),
69     on_construct = function(pos)
70         local meta = minetest.get_meta(pos)
be2f30 71         meta:set_string("infotext", S("Extractor"))
ee0765 72         meta:set_string("formspec", extractor_formspec)
S 73         local inv = meta:get_inventory()
74         inv:set_size("src", 1)
75         inv:set_size("dst", 4)
76     end,
77     can_dig = function(pos,player)
78         local meta = minetest.get_meta(pos);
79         local inv = meta:get_inventory()
80         if not inv:is_empty("src") or not inv:is_empty("dst") then
81             minetest.chat_send_player(player:get_player_name(),
be2f30 82                 S("Machine cannot be removed because it is not empty"))
ee0765 83             return false
S 84         else
85             return true
86         end
87     end,
88 })
89
90 minetest.register_node("technic:extractor_active", {
be2f30 91     description = S("Extractor"),
ee0765 92     tiles = {"technic_lv_grinder_top.png",  "technic_lv_grinder_bottom.png",
S 93              "technic_lv_grinder_side.png", "technic_lv_grinder_side.png",
94              "technic_lv_grinder_side.png", "technic_lv_grinder_front_active.png"},
95     paramtype2 = "facedir",
96     groups = {cracky=2, not_in_creative_inventory=1},
97     legacy_facedir_simple = true,
98     sounds = default.node_sound_wood_defaults(),
99     can_dig = function(pos,player)
100         local meta = minetest.get_meta(pos);
101         local inv = meta:get_inventory()
102         if not inv:is_empty("src") or not inv:is_empty("dst") then
103             minetest.chat_send_player(player:get_player_name(),
be2f30 104                 S("Machine cannot be removed because it is not empty"))
ee0765 105             return false
S 106         else
107             return true
108         end
109     end,
110 })
111
112 minetest.register_abm({
113     nodenames = {"technic:extractor", "technic:extractor_active"},
114     interval = 1,
115     chance   = 1,
116     action = function(pos, node, active_object_count, active_object_count_wider)
117         -- The machine will automatically shut down if disconnected from power in some fashion.
118         local meta     = minetest.get_meta(pos)
119         local inv      = meta:get_inventory()
120         local srcstack = inv:get_stack("src", 1)
121         local eu_input = meta:get_int("LV_EU_input")
122
123         -- Machine information
be2f30 124         local machine_name = S("Extractor")
ee0765 125         local machine_node = "technic:extractor"
S 126         local demand       = 300
127
128         -- Setup meta data if it does not exist.
129         if not eu_input then
130             meta:set_int("LV_EU_demand", demand)
131             meta:set_int("LV_EU_input", 0)
132             return
133         end
134
135         -- Power off automatically if no longer connected to a switching station
136         technic.switching_station_timeout_count(pos, "LV")
137
138         if srcstack then
139             src_item = srcstack:to_table()
140         end
141         if src_item then
142             recipe = technic.get_extractor_recipe(src_item)
143         end
144         if recipe then
145             result = {name=recipe.dst_name, count=recipe.dst_count}
146         end 
147         if inv:is_empty("src") or (not recipe) or (not result) or
148            (not inv:room_for_item("dst", result)) then
149             hacky_swap_node(pos, machine_node)
be2f30 150             meta:set_string("infotext", S("%s Idle"):format(machine_name))
ee0765 151             meta:set_int("LV_EU_demand", 0)
S 152             return
153         end
154
155         if eu_input < demand then
156             -- unpowered - go idle
157             hacky_swap_node(pos, machine_node)
be2f30 158             meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
ee0765 159         elseif eu_input >= demand then
S 160             -- Powered
161             hacky_swap_node(pos, machine_node.."_active")
be2f30 162             meta:set_string("infotext", S("%s Active"):format(machine_name))
ee0765 163
S 164             meta:set_int("src_time", meta:get_int("src_time") + 1)
165             if meta:get_int("src_time") >= 4 then -- 4 ticks per output
166                 meta:set_int("src_time", 0)
167                 srcstack:take_item(recipe.src_count)
168                 inv:set_stack("src", 1, srcstack)
169                 inv:add_item("dst", result)
170             end
171         end
172         meta:set_int("LV_EU_demand", demand)
173     end
174 })
175
176 technic.register_machine("LV", "technic:extractor",        technic.receiver)
177 technic.register_machine("LV", "technic:extractor_active", technic.receiver)
178