RealBadAngel
2013-06-30 8e03d7ded6441b26e9d44102c0cd2ee39f9e90bc
technic/constructor.lua
@@ -273,26 +273,72 @@
deploy_node =function (inv, slot_name, pos1, node1, node)
if node1.name == "air" then
         if not inv:is_empty(slot_name) then
   if node1.name == "air" then
      if not inv:is_empty(slot_name) then
         stack1=inv:get_list(slot_name)
         node_to_be_placed={name=stack1[1]:get_name(), param1=0, param2=node.param2}
         minetest.env:set_node(pos1,node_to_be_placed)
         stack1[1]:take_item()
         inv:set_stack(slot_name, 1, stack1[1])
         return
         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.env: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
      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
         inv:add_item(slot_name,node1)
      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.env:remove_node(pos1)
      elseif type(drop) == "string" then
         inv:add_item(slot_name,drop)
         minetest.env:remove_node(pos1)
      end
   end
end