Novatux
2014-07-02 2a23587445cfcd4019275c063ea09ad072a25421
commit | author | age
2a2358 1
N 2 local S = technic.getter
3
4 local extractor_formspec =
5    "invsize[8,9;]"..
6    "label[0,0;"..S("%s Extractor"):format("LV").."]"..
7    "list[current_name;src;3,1;1,1;]"..
8    "list[current_name;dst;5,1;2,2;]"..
9    "list[current_player;main;0,5;8,4;]"
10
11 function technic.register_extractor(data)
12     local tier = data.tier
13     local ltier = string.lower(tier)
14
15     local groups = {cracky = 2}
16     local active_groups = {cracky = 2, not_in_creative_inventory = 1}
17     if data.tube then
18         groups.tubedevice = 1
19         groups.tubedevice_receiver = 1
20         active_groups.tubedevice = 1
21         active_groups.tubedevice_receiver = 1
22     end
23
24
25     local formspec =
26         "invsize[8,9;]"..
27         "list[current_name;src;3,1;1,1;]"..
28         "list[current_name;dst;5,1;2,2;]"..
29         "list[current_player;main;0,5;8,4;]"..
30         "label[0,0;"..S("%s Extractor"):format(tier).."]"
31     
32     if data.upgrade then
33         formspec = formspec..
34             "list[current_name;upgrade1;1,4;1,1;]"..
35             "list[current_name;upgrade2;2,4;1,1;]"..
36             "label[1,5;"..S("Upgrade Slots").."]"
37     end
38
39     minetest.register_node("technic:"..ltier.."_extractor", {
40         description = S("%s Extractor"):format(tier),
41         tiles = {"technic_"..ltier.."_extractor_top.png",  "technic_"..ltier.."_extractor_bottom.png",
42              "technic_"..ltier.."_extractor_side.png", "technic_"..ltier.."_extractor_side.png",
43              "technic_"..ltier.."_extractor_side.png", "technic_"..ltier.."_extractor_front.png"},
44         paramtype2 = "facedir",
45         groups = groups,
46         tube = data.tube and tube or nil,
47         legacy_facedir_simple = true,
48         sounds = default.node_sound_wood_defaults(),
49         on_construct = function(pos)
50             local node = minetest.get_node(pos)
51             local meta = minetest.get_meta(pos)
52             meta:set_string("infotext", S("%s Extractor"):format(tier))
53             meta:set_int("tube_time",  0)
54             meta:set_string("formspec", formspec)
55             local inv = meta:get_inventory()
56             inv:set_size("src", 1)
57             inv:set_size("dst", 4)
58             inv:set_size("upgrade1", 1)
59             inv:set_size("upgrade2", 1)
60         end,
61         can_dig = technic.machine_can_dig,
62         allow_metadata_inventory_put = technic.machine_inventory_put,
63         allow_metadata_inventory_take = technic.machine_inventory_take,
64         allow_metadata_inventory_move = technic.machine_inventory_move,
65     })
66
67     minetest.register_node("technic:"..ltier.."_extractor_active",{
68         description = S("%s Grinder"):format(tier),
69         tiles = {"technic_"..ltier.."_extractor_top.png",  "technic_"..ltier.."_extractor_bottom.png",
70              "technic_"..ltier.."_extractor_side.png", "technic_"..ltier.."_extractor_side.png",
71              "technic_"..ltier.."_extractor_side.png", "technic_"..ltier.."_extractor_front_active.png"},
72         paramtype2 = "facedir",
73         drop = "technic:"..ltier.."_extractor",
74         groups = active_groups,
75         legacy_facedir_simple = true,
76         sounds = default.node_sound_wood_defaults(),
77         tube = data.tube and tube or nil,
78         can_dig = technic.machine_can_dig,
79         allow_metadata_inventory_put = technic.machine_inventory_put,
80         allow_metadata_inventory_take = technic.machine_inventory_take,
81         allow_metadata_inventory_move = technic.machine_inventory_move,
82     })
83
84     minetest.register_abm({
85         nodenames = {"technic:"..ltier.."_extractor","technic:"..ltier.."_extractor_active"},
86         interval = 1,
87         chance   = 1,
88         action = function(pos, node, active_object_count, active_object_count_wider)
89             local meta     = minetest.get_meta(pos)
90             local inv      = meta:get_inventory()
91             local eu_input = meta:get_int(tier.."_EU_input")
92
93             local machine_name   = S("%s Extractor"):format(tier)
94             local machine_node   = "technic:"..ltier.."_extractor"
95             local machine_demand = data.demand
96
97             -- Setup meta data if it does not exist.
98             if not eu_input then
99                 meta:set_int(tier.."_EU_demand", machine_demand[1])
100                 meta:set_int(tier.."_EU_input", 0)
101                 return
102             end
103         
104             -- Power off automatically if no longer connected to a switching station
105             technic.switching_station_timeout_count(pos, tier)
106
107             local EU_upgrade, tube_upgrade = 0, 0
108             if data.upgrade then
109                 EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
110             end
111             if data.tube then
112                 technic.handle_machine_pipeworks(pos, tube_upgrade)
113             end
114
115             local srcstack = inv:get_stack("src", 1)
116             local result = technic.get_extractor_recipe(inv:get_stack("src", 1))
117
118             if not result then
119                 technic.swap_node(pos, machine_node)
120                 meta:set_string("infotext", S("%s Idle"):format(machine_name))
121                 meta:set_int(tier.."_EU_demand", 0)
122                 return
123             end
124         
125             if eu_input < machine_demand[EU_upgrade+1] then
126                 -- Unpowered - go idle
127                 technic.swap_node(pos, machine_node)
128                 meta:set_string("infotext", S("%s Unpowered"):format(machine_name))
129             elseif eu_input >= machine_demand[EU_upgrade+1] then
130                 -- Powered    
131                 technic.swap_node(pos, machine_node.."_active")
132                 meta:set_string("infotext", S("%s Active"):format(machine_name))
133
134                 meta:set_int("src_time", meta:get_int("src_time") + 1)
135                 if meta:get_int("src_time") >= result.time / data.speed then
136                     meta:set_int("src_time", 0)
137                     local result_stack = ItemStack(result.output)
138                     if inv:room_for_item("dst", result_stack) then
139                         srcstack = inv:get_stack("src", 1)
140                         srcstack:take_item(ItemStack(result.input):get_count())
141                         inv:set_stack("src", 1, srcstack)
142                         inv:add_item("dst", result_stack)
143                     end
144                 end
145             end
146             meta:set_int(tier.."_EU_demand", machine_demand[EU_upgrade+1])
147         end
148     })
149
150     technic.register_machine(tier, "technic:"..ltier.."_extractor",        technic.receiver)
151     technic.register_machine(tier, "technic:"..ltier.."_extractor_active", technic.receiver)
152
153 end -- End registration
154