est31
2015-06-18 a793747d92d9b1d93153c7fb4e0c82fe90624c78
commit | author | age
aa8af0 1
N 2 local S = technic.getter
3
4 local tube = {
5     insert_object = function(pos, node, stack, direction)
6         local meta = minetest.get_meta(pos)
7         local inv = meta:get_inventory()
8         return inv:add_item("src", stack)
9     end,
10     can_insert = function(pos, node, stack, direction)
11         local meta = minetest.get_meta(pos)
12         local inv = meta:get_inventory()
13         return inv:room_for_item("src", stack)
14     end,
15     connect_sides = {left = 1, right = 1, back = 1, top = 1, bottom = 1},
16 }
17
814646 18 local function round(v)
Z 19     return math.floor(v + 0.5)
20 end
21
aa8af0 22 function technic.register_base_machine(data)
N 23     local typename = data.typename
dd65a6 24     local input_size = technic.recipes[typename].input_size
aa8af0 25     local machine_name = data.machine_name
N 26     local machine_desc = data.machine_desc
27     local tier = data.tier
28     local ltier = string.lower(tier)
29
563a4c 30     local groups = {cracky = 2, technic_machine = 1}
N 31     local active_groups = {cracky = 2, technic_machine = 1, not_in_creative_inventory = 1}
aa8af0 32     if data.tube then
N 33         groups.tubedevice = 1
34         groups.tubedevice_receiver = 1
35         active_groups.tubedevice = 1
36         active_groups.tubedevice_receiver = 1
37     end
38
39
40     local formspec =
41         "invsize[8,9;]"..
dd65a6 42         "list[current_name;src;"..(4-input_size)..",1;"..input_size..",1;]"..
aa8af0 43         "list[current_name;dst;5,1;2,2;]"..
N 44         "list[current_player;main;0,5;8,4;]"..
d732c8 45         "label[0,0;"..machine_desc:format(tier).."]"..
E 46         "listring[current_name;dst]"..
47         "listring[current_player;main]"..
48         "listring[current_name;src]"..
49         "listring[current_player;main]"
aa8af0 50     if data.upgrade then
N 51         formspec = formspec..
52             "list[current_name;upgrade1;1,3;1,1;]"..
53             "list[current_name;upgrade2;2,3;1,1;]"..
d732c8 54             "label[1,4;"..S("Upgrade Slots").."]"..
E 55             "listring[current_name;upgrade1]"..
56             "listring[current_player;main]"..
57             "listring[current_name;upgrade2]"..
58             "listring[current_player;main]"
aa8af0 59     end
N 60
563a4c 61     local run = function(pos, node)
N 62         local meta     = minetest.get_meta(pos)
63         local inv      = meta:get_inventory()
64         local eu_input = meta:get_int(tier.."_EU_input")
65
66         local machine_desc_tier = machine_desc:format(tier)
67         local machine_node      = "technic:"..ltier.."_"..machine_name
68         local machine_demand    = data.demand
69
70         -- Setup meta data if it does not exist.
71         if not eu_input then
72             meta:set_int(tier.."_EU_demand", machine_demand[1])
73             meta:set_int(tier.."_EU_input", 0)
74             return
75         end
76
77         local EU_upgrade, tube_upgrade = 0, 0
78         if data.upgrade then
79             EU_upgrade, tube_upgrade = technic.handle_machine_upgrades(meta)
80         end
81         if data.tube then
82             technic.handle_machine_pipeworks(pos, tube_upgrade)
83         end
84
814646 85         local powered = eu_input >= machine_demand[EU_upgrade+1]
Z 86         if powered then
87             meta:set_int("src_time", meta:get_int("src_time") + round(data.speed*10))
563a4c 88         end
814646 89         while true do
Z 90             local result = technic.get_recipe(typename, inv:get_list("src"))
91             if not result then
92                 technic.swap_node(pos, machine_node)
93                 meta:set_string("infotext", S("%s Idle"):format(machine_desc_tier))
94                 meta:set_int(tier.."_EU_demand", 0)
95                 meta:set_int("src_time", 0)
96                 return
97             end
98             meta:set_int(tier.."_EU_demand", machine_demand[EU_upgrade+1])
563a4c 99             technic.swap_node(pos, machine_node.."_active")
N 100             meta:set_string("infotext", S("%s Active"):format(machine_desc_tier))
814646 101             if meta:get_int("src_time") < round(result.time*10) then
Z 102                 if not powered then
103                     technic.swap_node(pos, machine_node)
104                     meta:set_string("infotext", S("%s Unpowered"):format(machine_desc_tier))
dd65a6 105                 end
814646 106                 return
563a4c 107             end
814646 108             local output = result.output
Z 109             if type(output) ~= "table" then output = { output } end
110             local output_stacks = {}
111             for _, o in ipairs(output) do
112                 table.insert(output_stacks, ItemStack(o))
113             end
114             local room_for_output = true
115             inv:set_size("dst_tmp", inv:get_size("dst"))
116             inv:set_list("dst_tmp", inv:get_list("dst"))
117             for _, o in ipairs(output_stacks) do
118                 if not inv:room_for_item("dst_tmp", o) then
119                     room_for_output = false
120                     break
121                 end
122                 inv:add_item("dst_tmp", o)
123             end
124             if not room_for_output then
125                 meta:set_int("src_time", round(result.time*10))
126                 return
127             end
128             meta:set_int("src_time", meta:get_int("src_time") - round(result.time*10))
129             inv:set_list("src", result.new_input)
130             inv:set_list("dst", inv:get_list("dst_tmp"))
563a4c 131         end
N 132     end
133     
aa8af0 134     minetest.register_node("technic:"..ltier.."_"..machine_name, {
N 135         description = machine_desc:format(tier),
136         tiles = {"technic_"..ltier.."_"..machine_name.."_top.png", 
137                      "technic_"..ltier.."_"..machine_name.."_bottom.png",
138                  "technic_"..ltier.."_"..machine_name.."_side.png",
139                  "technic_"..ltier.."_"..machine_name.."_side.png",
140                  "technic_"..ltier.."_"..machine_name.."_side.png",
141                  "technic_"..ltier.."_"..machine_name.."_front.png"},
142         paramtype2 = "facedir",
143         groups = groups,
144         tube = data.tube and tube or nil,
145         legacy_facedir_simple = true,
146         sounds = default.node_sound_wood_defaults(),
147         on_construct = function(pos)
148             local node = minetest.get_node(pos)
149             local meta = minetest.get_meta(pos)
150             meta:set_string("infotext", machine_desc:format(tier))
151             meta:set_int("tube_time",  0)
152             meta:set_string("formspec", formspec)
153             local inv = meta:get_inventory()
dd65a6 154             inv:set_size("src", input_size)
aa8af0 155             inv:set_size("dst", 4)
N 156             inv:set_size("upgrade1", 1)
157             inv:set_size("upgrade2", 1)
158         end,
159         can_dig = technic.machine_can_dig,
160         allow_metadata_inventory_put = technic.machine_inventory_put,
161         allow_metadata_inventory_take = technic.machine_inventory_take,
162         allow_metadata_inventory_move = technic.machine_inventory_move,
563a4c 163         technic_run = run,
011397 164         after_place_node = data.tube and pipeworks.after_place,
c8cbd2 165         after_dig_node = technic.machine_after_dig_node
aa8af0 166     })
N 167
168     minetest.register_node("technic:"..ltier.."_"..machine_name.."_active",{
169         description = machine_desc:format(tier),
170         tiles = {"technic_"..ltier.."_"..machine_name.."_top.png",
171                  "technic_"..ltier.."_"..machine_name.."_bottom.png",
172                  "technic_"..ltier.."_"..machine_name.."_side.png",
173                  "technic_"..ltier.."_"..machine_name.."_side.png",
174                  "technic_"..ltier.."_"..machine_name.."_side.png",
175                  "technic_"..ltier.."_"..machine_name.."_front_active.png"},
176         paramtype2 = "facedir",
177         drop = "technic:"..ltier.."_"..machine_name,
178         groups = active_groups,
179         legacy_facedir_simple = true,
180         sounds = default.node_sound_wood_defaults(),
181         tube = data.tube and tube or nil,
182         can_dig = technic.machine_can_dig,
183         allow_metadata_inventory_put = technic.machine_inventory_put,
184         allow_metadata_inventory_take = technic.machine_inventory_take,
185         allow_metadata_inventory_move = technic.machine_inventory_move,
563a4c 186         technic_run = run,
N 187         technic_disabled_machine_name = "technic:"..ltier.."_"..machine_name,
aa8af0 188     })
N 189
190     technic.register_machine(tier, "technic:"..ltier.."_"..machine_name,            technic.receiver)
191     technic.register_machine(tier, "technic:"..ltier.."_"..machine_name.."_active", technic.receiver)
192
193 end -- End registration
194