Maciej 'agaran' Pijanka
2017-03-15 10307f23a78b33af50dc4a5f3d1baafb4ee4b0d9
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
83c649 18 local connect_default = {"bottom", "back", "left", "right"}
S 19
814646 20 local function round(v)
Z 21     return math.floor(v + 0.5)
22 end
23
aa8af0 24 function technic.register_base_machine(data)
N 25     local typename = data.typename
dd65a6 26     local input_size = technic.recipes[typename].input_size
aa8af0 27     local machine_name = data.machine_name
N 28     local machine_desc = data.machine_desc
29     local tier = data.tier
30     local ltier = string.lower(tier)
31
83c649 32     local groups = {cracky = 2, technic_machine = 1, ["technic_"..ltier] = 1}
aa8af0 33     if data.tube then
N 34         groups.tubedevice = 1
35         groups.tubedevice_receiver = 1
36     end
83c649 37     local active_groups = {not_in_creative_inventory = 1}
S 38     for k, v in pairs(groups) do active_groups[k] = v end
aa8af0 39
N 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
a529ba 125                 technic.swap_node(pos, machine_node)
T 126                 meta:set_string("infotext", S("%s Idle"):format(machine_desc_tier))
127                 meta:set_int(tier.."_EU_demand", 0)
814646 128                 meta:set_int("src_time", round(result.time*10))
Z 129                 return
130             end
131             meta:set_int("src_time", meta:get_int("src_time") - round(result.time*10))
132             inv:set_list("src", result.new_input)
133             inv:set_list("dst", inv:get_list("dst_tmp"))
563a4c 134         end
N 135     end
136     
aa8af0 137     minetest.register_node("technic:"..ltier.."_"..machine_name, {
N 138         description = machine_desc:format(tier),
139         tiles = {"technic_"..ltier.."_"..machine_name.."_top.png", 
140                      "technic_"..ltier.."_"..machine_name.."_bottom.png",
141                  "technic_"..ltier.."_"..machine_name.."_side.png",
142                  "technic_"..ltier.."_"..machine_name.."_side.png",
143                  "technic_"..ltier.."_"..machine_name.."_side.png",
144                  "technic_"..ltier.."_"..machine_name.."_front.png"},
145         paramtype2 = "facedir",
146         groups = groups,
147         tube = data.tube and tube or nil,
83c649 148         connect_sides = data.connect_sides or connect_default,
aa8af0 149         legacy_facedir_simple = true,
N 150         sounds = default.node_sound_wood_defaults(),
151         on_construct = function(pos)
152             local node = minetest.get_node(pos)
153             local meta = minetest.get_meta(pos)
154             meta:set_string("infotext", machine_desc:format(tier))
155             meta:set_int("tube_time",  0)
156             meta:set_string("formspec", formspec)
157             local inv = meta:get_inventory()
dd65a6 158             inv:set_size("src", input_size)
aa8af0 159             inv:set_size("dst", 4)
N 160             inv:set_size("upgrade1", 1)
161             inv:set_size("upgrade2", 1)
162         end,
163         can_dig = technic.machine_can_dig,
164         allow_metadata_inventory_put = technic.machine_inventory_put,
165         allow_metadata_inventory_take = technic.machine_inventory_take,
166         allow_metadata_inventory_move = technic.machine_inventory_move,
563a4c 167         technic_run = run,
011397 168         after_place_node = data.tube and pipeworks.after_place,
c8cbd2 169         after_dig_node = technic.machine_after_dig_node
aa8af0 170     })
N 171
172     minetest.register_node("technic:"..ltier.."_"..machine_name.."_active",{
173         description = machine_desc:format(tier),
174         tiles = {"technic_"..ltier.."_"..machine_name.."_top.png",
175                  "technic_"..ltier.."_"..machine_name.."_bottom.png",
176                  "technic_"..ltier.."_"..machine_name.."_side.png",
177                  "technic_"..ltier.."_"..machine_name.."_side.png",
178                  "technic_"..ltier.."_"..machine_name.."_side.png",
179                  "technic_"..ltier.."_"..machine_name.."_front_active.png"},
180         paramtype2 = "facedir",
181         drop = "technic:"..ltier.."_"..machine_name,
182         groups = active_groups,
83c649 183         connect_sides = data.connect_sides or connect_default,
aa8af0 184         legacy_facedir_simple = true,
N 185         sounds = default.node_sound_wood_defaults(),
186         tube = data.tube and tube or nil,
187         can_dig = technic.machine_can_dig,
188         allow_metadata_inventory_put = technic.machine_inventory_put,
189         allow_metadata_inventory_take = technic.machine_inventory_take,
190         allow_metadata_inventory_move = technic.machine_inventory_move,
563a4c 191         technic_run = run,
N 192         technic_disabled_machine_name = "technic:"..ltier.."_"..machine_name,
aa8af0 193     })
N 194
195     technic.register_machine(tier, "technic:"..ltier.."_"..machine_name,            technic.receiver)
196     technic.register_machine(tier, "technic:"..ltier.."_"..machine_name.."_active", technic.receiver)
197
198 end -- End registration
199