Constructor now digs node drops instead of actual nodes.
authorDiego Martínez <kaeza@users.sf.net>
Tue, 18 Jun 2013 13:46:28 +0000 (10:46 -0300)
committerDiego Martínez <kaeza@users.sf.net>
Tue, 18 Jun 2013 13:46:28 +0000 (10:46 -0300)
technic/constructor.lua

index b5a61cb724d973b2612b4cbe00acf2480715b8f5..58d2dad18270c74b1d3d4e76d4a2a4d1eca36c66 100644 (file)
@@ -273,26 +273,56 @@ minetest.register_node("technic:constructor_mk3_on", {
 
 
 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
+                               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