ShadowNinja
2013-10-30 be2f30a1a2f5b6c2aae7fd4cf8231aec2da0844d
commit | author | age
704925 1
be2f30 2 local S = technic.getter
S 3
704925 4 function technic.register_generator(data) 
P 5     local tier = data.tier
6     local ltier = string.lower(tier)
7
8     local generator_formspec =
9         "invsize[8,9;]"..
be2f30 10         "label[0,0;"..S("%s Generator"):format(tier).."]"..
704925 11         "list[current_name;src;3,1;1,1;]"..
P 12         "image[4,1;1,1;default_furnace_fire_bg.png]"..
13         "list[current_player;main;0,5;8,4;]"
14     
be2f30 15     local desc = S("%s Generator"):format(tier)
9aee83 16     minetest.register_node("technic:"..ltier.."_generator", {
704925 17         description = desc,
P 18         tiles = {"technic_"..ltier.."_generator_top.png", "technic_machine_bottom.png",
19                  "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_side.png",
20                  "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_front.png"}, 
21         paramtype2 = "facedir",
22         groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2},
23         legacy_facedir_simple = true,
24         sounds = default.node_sound_wood_defaults(),
25         on_construct = function(pos)
26             local meta = minetest.get_meta(pos)
27             meta:set_string("infotext", desc)
28             meta:set_int(data.tier.."_EU_supply", 0)
29             meta:set_int("burn_time", 0)
30             meta:set_string("formspec", generator_formspec)
31             local inv = meta:get_inventory()
32             inv:set_size("src", 1)
33         end,
34         can_dig = function(pos, player)
35             local meta = minetest.get_meta(pos)
36             local inv = meta:get_inventory()
37             if not inv:is_empty("src") then
38                 minetest.chat_send_player(player:get_player_name(),
be2f30 39                     S("Machine cannot be removed because it is not empty"))
704925 40                 return false
P 41             else
42                 return true
43             end
44         end,
45     })
46     minetest.register_node("technic:"..ltier.."_generator_active", {
47         description = desc,
48         tiles = {"technic_"..ltier.."_generator_top.png", "technic_machine_bottom.png",
49                  "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_side.png",
50                  "technic_"..ltier.."_generator_side.png", "technic_"..ltier.."_generator_front_active.png"},
51         paramtype2 = "facedir",
52         groups = {snappy=2, choppy=2, oddly_breakable_by_hand=2,
53             not_in_creative_inventory=1},
54         legacy_facedir_simple = true,
55         sounds = default.node_sound_wood_defaults(),
56         drop = "technic:"..ltier.."_generator",
57         can_dig = function(pos, player)
58             local meta = minetest.get_meta(pos)
59             local inv = meta:get_inventory()
60             if not inv:is_empty("src") then
61                 minetest.chat_send_player(player:get_player_name(),
be2f30 62                     S("Machine cannot be removed because it is not empty"))
704925 63                 return false
P 64             else
65                 return true
66             end
67         end,
68     })
69     minetest.register_abm({
70         nodenames = {"technic:"..ltier.."_generator", "technic:"..ltier.."_generator_active"},
71         interval = 1,
72         chance = 1,
73         action = function(pos, node, active_object_count, active_object_count_wider)
74             local meta = minetest.get_meta(pos)
75             local burn_time = meta:get_int("burn_time")
76             local burn_totaltime = meta:get_int("burn_totaltime")
77             -- If more to burn and the energy produced was used: produce some more
78             if burn_time > 0 then
79                 meta:set_int(data.tier.."_EU_supply", data.supply)
80                 burn_time = burn_time - 1
81                 meta:set_int("burn_time", burn_time)
82             end
83             -- Burn another piece of fuel
84             if burn_time == 0 then
85                 local inv = meta:get_inventory()
86                 if not inv:is_empty("src") then 
87                     local fuellist = inv:get_list("src")
88                     fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
89                     if not fuel or fuel.time == 0 then
be2f30 90                         meta:set_string("infotext", S("%s Out Of Fuel"):format(desc))
704925 91                         hacky_swap_node(pos, "technic:"..ltier.."_generator")
P 92                         return
93                     end
94                     meta:set_int("burn_time", fuel.time)
95                     meta:set_int("burn_totaltime", fuel.time)
96                     local stack = inv:get_stack("src", 1)
97                     stack:take_item()
98                     inv:set_stack("src", 1, stack)
99                     hacky_swap_node(pos, "technic:"..ltier.."_generator_active")
100                     meta:set_int(data.tier.."_EU_supply", data.supply)
101                 else
102                     hacky_swap_node(pos, "technic:"..ltier.."_generator")
103                     meta:set_int(data.tier.."_EU_supply", 0)
104                 end
105             end
106             if burn_totaltime == 0 then burn_totaltime = 1 end
107             local percent = math.floor((burn_time / burn_totaltime) * 100)
108             meta:set_string("infotext", desc.." ("..percent.."%)")
109                 meta:set_string("formspec", 
110                     "size[8, 9]"..
111                     "label[0, 0;Generator]"..
112                     "list[current_name;src;3, 1;1, 1;]"..
113                     "image[4, 1;1, 1;default_furnace_fire_bg.png^[lowpart:"..
114                     (percent)..":default_furnace_fire_fg.png]"..
115                     "list[current_player;main;0, 5;8, 4;]")
116         end
117     })
118     technic.register_machine(data.tier, "technic:"..ltier.."_generator", technic.producer)
119     technic.register_machine(data.tier, "technic:"..ltier.."_generator", technic.producer)
120 end
be2f30 121