Zefram
2014-08-13 38e85e9775b132b0ce504d8d795632668eb47852
commit | author | age
be2f30 1 local S = technic.getter
7a3cd4 2
S 3 local tube = {
4     insert_object = function(pos, node, stack, direction)
5         local meta = minetest.get_meta(pos)
6         local inv = meta:get_inventory()
47b0b5 7         return inv:add_item("src", stack)
7a3cd4 8     end,
S 9     can_insert = function(pos, node, stack, direction)
10         local meta = minetest.get_meta(pos)
11         local inv = meta:get_inventory()
12         return inv:room_for_item("src", stack)
13     end,
14     connect_sides = {left=1, right=1, back=1, top=1, bottom=1},
15 }
be2f30 16
704925 17 function technic.register_generator(data) 
P 18     local tier = data.tier
19     local ltier = string.lower(tier)
47b0b5 20
563a4c 21     local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1}
N 22     local active_groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, technic_machine=1, not_in_creative_inventory=1}
7a3cd4 23     if data.tube then
S 24         groups.tubedevice = 1
25         groups.tubedevice_receiver = 1
26         active_groups.tubedevice = 1
27         active_groups.tubedevice_receiver = 1
28     end
47b0b5 29
704925 30     local generator_formspec =
P 31         "invsize[8,9;]"..
7c4b70 32         "label[0,0;"..S("Fuel-Fired %s Generator"):format(tier).."]"..
704925 33         "list[current_name;src;3,1;1,1;]"..
P 34         "image[4,1;1,1;default_furnace_fire_bg.png]"..
35         "list[current_player;main;0,5;8,4;]"
36     
7c4b70 37     local desc = S("Fuel-Fired %s Generator"):format(tier)
563a4c 38     
N 39     local run = function(pos, node)
40         local meta = minetest.get_meta(pos)
41         local burn_time = meta:get_int("burn_time")
42         local burn_totaltime = meta:get_int("burn_totaltime")
43         -- If more to burn and the energy produced was used: produce some more
44         if burn_time > 0 then
45             meta:set_int(tier.."_EU_supply", data.supply)
46             burn_time = burn_time - 1
47             meta:set_int("burn_time", burn_time)
48         end
49         -- Burn another piece of fuel
50         if burn_time == 0 then
51             local inv = meta:get_inventory()
52             if not inv:is_empty("src") then 
53                 local fuellist = inv:get_list("src")
6ec12b 54                 local fuel
G 55                 local afterfuel
56                 fuel, afterfuel = minetest.get_craft_result(
563a4c 57                         {method = "fuel", width = 1,
N 58                         items = fuellist})
59                 if not fuel or fuel.time == 0 then
60                     meta:set_string("infotext", S("%s Out Of Fuel"):format(desc))
61                     technic.swap_node(pos, "technic:"..ltier.."_generator")
62                     return
63                 end
64                 meta:set_int("burn_time", fuel.time)
65                 meta:set_int("burn_totaltime", fuel.time)
6ec12b 66                 inv:set_stack("src", 1, afterfuel.items[1])
563a4c 67                 technic.swap_node(pos, "technic:"..ltier.."_generator_active")
N 68                 meta:set_int(tier.."_EU_supply", data.supply)
69             else
70                 technic.swap_node(pos, "technic:"..ltier.."_generator")
71                 meta:set_int(tier.."_EU_supply", 0)
72             end
73         end
74         if burn_totaltime == 0 then burn_totaltime = 1 end
75         local percent = math.floor((burn_time / burn_totaltime) * 100)
76         meta:set_string("infotext", desc.." ("..percent.."%)")
77             meta:set_string("formspec", 
78                 "size[8, 9]"..
79                 "label[0, 0;"..minetest.formspec_escape(desc).."]"..
80                 "list[current_name;src;3, 1;1, 1;]"..
81                 "image[4, 1;1, 1;default_furnace_fire_bg.png^[lowpart:"..
82                 (percent)..":default_furnace_fire_fg.png]"..
83                 "list[current_player;main;0, 5;8, 4;]")
84     end
85     
9aee83 86     minetest.register_node("technic:"..ltier.."_generator", {
704925 87         description = desc,
P 88         tiles = {"technic_"..ltier.."_generator_top.png", "technic_machine_bottom.png",
89                  "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_side.png",
90                  "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_front.png"}, 
91         paramtype2 = "facedir",
7a3cd4 92         groups = groups,
704925 93         legacy_facedir_simple = true,
P 94         sounds = default.node_sound_wood_defaults(),
7a3cd4 95         tube = data.tube and tube or nil,
704925 96         on_construct = function(pos)
P 97             local meta = minetest.get_meta(pos)
98             meta:set_string("infotext", desc)
99             meta:set_int(data.tier.."_EU_supply", 0)
100             meta:set_int("burn_time", 0)
7a3cd4 101             meta:set_int("tube_time",  0)
704925 102             meta:set_string("formspec", generator_formspec)
P 103             local inv = meta:get_inventory()
104             inv:set_size("src", 1)
105         end,
0809dd 106         can_dig = technic.machine_can_dig,
S 107         allow_metadata_inventory_put = technic.machine_inventory_put,
108         allow_metadata_inventory_take = technic.machine_inventory_take,
109         allow_metadata_inventory_move = technic.machine_inventory_move,
563a4c 110         technic_run = run,
704925 111     })
0809dd 112
704925 113     minetest.register_node("technic:"..ltier.."_generator_active", {
P 114         description = desc,
115         tiles = {"technic_"..ltier.."_generator_top.png", "technic_machine_bottom.png",
116                  "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_side.png",
117                  "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_front_active.png"},
118         paramtype2 = "facedir",
7a3cd4 119         groups = active_groups,
704925 120         legacy_facedir_simple = true,
P 121         sounds = default.node_sound_wood_defaults(),
7a3cd4 122         tube = data.tube and tube or nil,
704925 123         drop = "technic:"..ltier.."_generator",
0809dd 124         can_dig = technic.machine_can_dig,
S 125         allow_metadata_inventory_put = technic.machine_inventory_put,
126         allow_metadata_inventory_take = technic.machine_inventory_take,
127         allow_metadata_inventory_move = technic.machine_inventory_move,
563a4c 128         technic_run = run,
1c617f 129         technic_on_disable = function(pos, node)
N 130             local timer = minetest.get_node_timer(pos)
131                 timer:start(1)
132             end,
133         on_timer = function(pos, node)
134             local meta = minetest.get_meta(pos)
135             
136             -- Connected back?
137             if meta:get_int(tier.."_EU_timeout") > 0 then return end
138             
139             local burn_time = meta:get_int("burn_time") or 0
140
141             if burn_time <= 0 then
142                 meta:set_int(tier.."_EU_supply", 0)
143                 meta:set_int("burn_time", 0)
144                 technic.swap_node(pos, "technic:"..ltier.."_generator")
145                 return
146             end
147
148             local burn_totaltime = meta:get_int("burn_totaltime") or 0
149             if burn_totaltime == 0 then burn_totaltime = 1 end
150             burn_time = burn_time - 1
151             meta:set_int("burn_time", burn_time)
152             local percent = math.floor(burn_time / burn_totaltime * 100)
153             meta:set_string("formspec", 
154                 "size[8, 9]"..
155                 "label[0, 0;"..minetest.formspec_escape(desc).."]"..
156                 "list[current_name;src;3, 1;1, 1;]"..
157                 "image[4, 1;1, 1;default_furnace_fire_bg.png^[lowpart:"..
158                 (percent)..":default_furnace_fire_fg.png]"..
159                 "list[current_player;main;0, 5;8, 4;]")
160             local timer = minetest.get_node_timer(pos)
161                 timer:start(1)
162         end,
704925 163     })
563a4c 164
a35db4 165     technic.register_machine(tier, "technic:"..ltier.."_generator",        technic.producer)
S 166     technic.register_machine(tier, "technic:"..ltier.."_generator_active", technic.producer)
704925 167 end
be2f30 168