Zefram
2014-04-26 f5041784212a5045538983f41e1fc73bf79277a8
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
7a3cd4 21     local groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2}
S 22     local active_groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2, not_in_creative_inventory=1}
23     if data.tube then
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;]"..
be2f30 32         "label[0,0;"..S("%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     
be2f30 37     local desc = S("%s Generator"):format(tier)
9aee83 38     minetest.register_node("technic:"..ltier.."_generator", {
704925 39         description = desc,
P 40         tiles = {"technic_"..ltier.."_generator_top.png", "technic_machine_bottom.png",
41                  "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_side.png",
42                  "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_front.png"}, 
43         paramtype2 = "facedir",
7a3cd4 44         groups = groups,
704925 45         legacy_facedir_simple = true,
P 46         sounds = default.node_sound_wood_defaults(),
7a3cd4 47         tube = data.tube and tube or nil,
704925 48         on_construct = function(pos)
P 49             local meta = minetest.get_meta(pos)
50             meta:set_string("infotext", desc)
51             meta:set_int(data.tier.."_EU_supply", 0)
52             meta:set_int("burn_time", 0)
7a3cd4 53             meta:set_int("tube_time",  0)
704925 54             meta:set_string("formspec", generator_formspec)
P 55             local inv = meta:get_inventory()
56             inv:set_size("src", 1)
57         end,
0809dd 58         can_dig = technic.machine_can_dig,
S 59         allow_metadata_inventory_put = technic.machine_inventory_put,
60         allow_metadata_inventory_take = technic.machine_inventory_take,
61         allow_metadata_inventory_move = technic.machine_inventory_move,
704925 62     })
0809dd 63
704925 64     minetest.register_node("technic:"..ltier.."_generator_active", {
P 65         description = desc,
66         tiles = {"technic_"..ltier.."_generator_top.png", "technic_machine_bottom.png",
67                  "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_side.png",
68                  "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_front_active.png"},
69         paramtype2 = "facedir",
7a3cd4 70         groups = active_groups,
704925 71         legacy_facedir_simple = true,
P 72         sounds = default.node_sound_wood_defaults(),
7a3cd4 73         tube = data.tube and tube or nil,
704925 74         drop = "technic:"..ltier.."_generator",
0809dd 75         can_dig = technic.machine_can_dig,
S 76         allow_metadata_inventory_put = technic.machine_inventory_put,
77         allow_metadata_inventory_take = technic.machine_inventory_take,
78         allow_metadata_inventory_move = technic.machine_inventory_move,
704925 79     })
P 80     minetest.register_abm({
81         nodenames = {"technic:"..ltier.."_generator", "technic:"..ltier.."_generator_active"},
82         interval = 1,
83         chance = 1,
84         action = function(pos, node, active_object_count, active_object_count_wider)
85             local meta = minetest.get_meta(pos)
86             local burn_time = meta:get_int("burn_time")
87             local burn_totaltime = meta:get_int("burn_totaltime")
88             -- If more to burn and the energy produced was used: produce some more
89             if burn_time > 0 then
a35db4 90                 meta:set_int(tier.."_EU_supply", data.supply)
704925 91                 burn_time = burn_time - 1
P 92                 meta:set_int("burn_time", burn_time)
93             end
94             -- Burn another piece of fuel
95             if burn_time == 0 then
96                 local inv = meta:get_inventory()
97                 if not inv:is_empty("src") then 
98                     local fuellist = inv:get_list("src")
2df417 99                     local fuel = minetest.get_craft_result(
S 100                             {method = "fuel", width = 1,
101                             items = fuellist})
704925 102                     if not fuel or fuel.time == 0 then
be2f30 103                         meta:set_string("infotext", S("%s Out Of Fuel"):format(desc))
f3d8b4 104                         technic.swap_node(pos, "technic:"..ltier.."_generator")
704925 105                         return
P 106                     end
107                     meta:set_int("burn_time", fuel.time)
108                     meta:set_int("burn_totaltime", fuel.time)
109                     local stack = inv:get_stack("src", 1)
110                     stack:take_item()
111                     inv:set_stack("src", 1, stack)
f3d8b4 112                     technic.swap_node(pos, "technic:"..ltier.."_generator_active")
a35db4 113                     meta:set_int(tier.."_EU_supply", data.supply)
704925 114                 else
f3d8b4 115                     technic.swap_node(pos, "technic:"..ltier.."_generator")
a35db4 116                     meta:set_int(tier.."_EU_supply", 0)
704925 117                 end
P 118             end
119             if burn_totaltime == 0 then burn_totaltime = 1 end
120             local percent = math.floor((burn_time / burn_totaltime) * 100)
121             meta:set_string("infotext", desc.." ("..percent.."%)")
122                 meta:set_string("formspec", 
123                     "size[8, 9]"..
124                     "label[0, 0;Generator]"..
125                     "list[current_name;src;3, 1;1, 1;]"..
126                     "image[4, 1;1, 1;default_furnace_fire_bg.png^[lowpart:"..
127                     (percent)..":default_furnace_fire_fg.png]"..
128                     "list[current_player;main;0, 5;8, 4;]")
129         end
130     })
a35db4 131     technic.register_machine(tier, "technic:"..ltier.."_generator",        technic.producer)
S 132     technic.register_machine(tier, "technic:"..ltier.."_generator_active", technic.producer)
704925 133 end
be2f30 134