From e718c73b36fcf44c564c84d8bdfa45373c12f2a5 Mon Sep 17 00:00:00 2001
From: Jordan Snelling <jordach.snelling@gmail.com>
Date: Tue, 18 Jun 2013 15:52:34 +0200
Subject: [PATCH] Merge pull request #32 from kaeza/master

---
 technic/constructor.lua |   62 +++++++++++++++++++++++--------
 1 files changed, 46 insertions(+), 16 deletions(-)

diff --git a/technic/constructor.lua b/technic/constructor.lua
index b5a61cb..58d2dad 100644
--- a/technic/constructor.lua
+++ b/technic/constructor.lua
@@ -273,26 +273,56 @@
 
 
 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

--
Gitblit v1.8.0