Diego Martínez
2013-06-18 a1da74209b75c5543bd6f2e1cc8b1643adf13ffa
Constructor now digs node drops instead of actual nodes.
1 files modified
62 ■■■■ changed files
technic/constructor.lua 62 ●●●● patch | view | raw | blame | history
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