fix crash in constructor
authorVanessa Ezekowitz <vanessaezekowitz@gmail.com>
Sat, 21 Dec 2013 07:26:09 +0000 (02:26 -0500)
committerVanessa Ezekowitz <vanessaezekowitz@gmail.com>
Sat, 21 Dec 2013 07:26:19 +0000 (02:26 -0500)
technic/machines/other/constructor.lua

index 1210c5b8d73295a39d44c5ed5dd8058fa35103ef..b330b156f1b3f03ef443b4ec2795f96a358c3193 100644 (file)
@@ -1,6 +1,77 @@
 
 local S = technic.getter
 
+local function deploy_node(inv, slot_name, pos1, node1, node)
+       if node1.name == "air" then 
+               if not inv:is_empty(slot_name) then
+                       stack1=inv:get_list(slot_name)
+                       local def = stack1[1]:get_definition()
+                       if def.type == "node" then
+                               node_to_be_placed={name=stack1[1]:get_name(), param1=0, param2=node.param2}
+                               minetest.set_node(pos1,node_to_be_placed)
+                               stack1[1]:take_item()
+                               inv:set_stack(slot_name, 1, stack1[1])
+                       elseif def.type == "craft" then
+                               if def.on_place then
+                                       -- print("deploy_node: item has on_place. trying...")
+                                       local ok, stk = pcall(def.on_place, stack1[1], nil, {
+                                               -- Fake pointed_thing
+                                               type = "node",
+                                               above = pos1,
+                                               under = { x=pos1.x, y=pos1.y-1, z=pos1.z },
+                                       })
+                                       if ok then
+                                               -- print("deploy_node: on_place succeeded!")
+                                               inv:set_stack(slot_name, 1, stk or stack1[1])
+                                               return
+                                       -- else
+                                               -- print("deploy_node: WARNING: error while running on_place: "..tostring(stk))
+                                       end
+                               end
+                               minetest.item_place_object(stack1[1], nil, {
+                                       -- Fake pointed_thing
+                                       type = "node",
+                                       above = pos1,
+                                       under = pos1,
+                               })
+                               inv:set_stack(slot_name, 1, nil)
+                       end
+               end
+               return 
+       end
+       if node1.name == "ignore" or
+          node1.name == "default:lava_source" or
+          node1.name == "default:lava_flowing" or
+          node1.name == "default:water_source" or
+          node1.name == "default:water_flowing" 
+          then return end
+       if inv:room_for_item(slot_name,node1) then
+               local def = minetest.registered_nodes[node1.name]
+               if not def then return end
+               local drop = def.drop or node1.name
+               if type(drop) == "table" then
+                       local pr = PseudoRandom(math.random())
+                       local c = 0
+                       local loop = 0 -- Prevent infinite loop
+                       while (c < (drop.max_items or 1)) and (loop < 1000) do
+                               local i = math.floor(pr:next(1, #drop.items))
+                               if pr:next(1, drop.items[i].rarity or 1) == 1 then
+                                       for _,item in ipairs(drop.items[i].items) do
+                                               inv:add_item(slot_name,item)
+                                       end
+                                       c = c + 1
+                               end
+                               loop = loop + 1
+                       end
+                       minetest.remove_node(pos1)
+               elseif type(drop) == "string" then
+                       inv:add_item(slot_name,drop)
+                       minetest.remove_node(pos1)
+               end
+       end
+
+end
+
 minetest.register_craft({
        type = "shapeless",
        output = 'technic:constructor_mk1_off 1',
@@ -288,74 +359,3 @@ minetest.register_node("technic:constructor_mk3_on", {
        allow_metadata_inventory_move = technic.machine_inventory_move,
 })
 
-
-local function deploy_node(inv, slot_name, pos1, node1, node)
-       if node1.name == "air" then 
-               if not inv:is_empty(slot_name) then
-                       stack1=inv:get_list(slot_name)
-                       local def = stack1[1]:get_definition()
-                       if def.type == "node" then
-                               node_to_be_placed={name=stack1[1]:get_name(), param1=0, param2=node.param2}
-                               minetest.set_node(pos1,node_to_be_placed)
-                               stack1[1]:take_item()
-                               inv:set_stack(slot_name, 1, stack1[1])
-                       elseif def.type == "craft" then
-                               if def.on_place then
-                                       -- print("deploy_node: item has on_place. trying...")
-                                       local ok, stk = pcall(def.on_place, stack1[1], nil, {
-                                               -- Fake pointed_thing
-                                               type = "node",
-                                               above = pos1,
-                                               under = { x=pos1.x, y=pos1.y-1, z=pos1.z },
-                                       })
-                                       if ok then
-                                               -- print("deploy_node: on_place succeeded!")
-                                               inv:set_stack(slot_name, 1, stk or stack1[1])
-                                               return
-                                       -- else
-                                               -- print("deploy_node: WARNING: error while running on_place: "..tostring(stk))
-                                       end
-                               end
-                               minetest.item_place_object(stack1[1], nil, {
-                                       -- Fake pointed_thing
-                                       type = "node",
-                                       above = pos1,
-                                       under = pos1,
-                               })
-                               inv:set_stack(slot_name, 1, nil)
-                       end
-               end
-               return 
-       end
-       if node1.name == "ignore" or
-          node1.name == "default:lava_source" or
-          node1.name == "default:lava_flowing" or
-          node1.name == "default:water_source" or
-          node1.name == "default:water_flowing" 
-          then return end
-       if inv:room_for_item(slot_name,node1) then
-               local def = minetest.registered_nodes[node1.name]
-               if not def then return end
-               local drop = def.drop or node1.name
-               if type(drop) == "table" then
-                       local pr = PseudoRandom(math.random())
-                       local c = 0
-                       local loop = 0 -- Prevent infinite loop
-                       while (c < (drop.max_items or 1)) and (loop < 1000) do
-                               local i = math.floor(pr:next(1, #drop.items))
-                               if pr:next(1, drop.items[i].rarity or 1) == 1 then
-                                       for _,item in ipairs(drop.items[i].items) do
-                                               inv:add_item(slot_name,item)
-                                       end
-                                       c = c + 1
-                               end
-                               loop = loop + 1
-                       end
-                       minetest.remove_node(pos1)
-               elseif type(drop) == "string" then
-                       inv:add_item(slot_name,drop)
-                       minetest.remove_node(pos1)
-               end
-       end
-
-end