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',
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