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