if-statementluacomputercraft

How to fix 'if statement with multi conditions' in lua


I use Lua in computercraft to automate the mining. But, my turtle whose program worked very well before, stops if it meets a lava/flowing_lava/water/flowing_water source.

Inside my program, I have a lot of function to manage, for example, the fuel management, the tunnel, the collision with gravel, and .. the detection if the turtle meets a "block".

If the block is just an air block, the turtle continues to advance, elseif the block isn't an air block, the turtle digs this block and doesn't move forward if there is still a block in front of her. The problem? The four sources which I quoted previously are considered as blocks, and the turtle can't move forward.

I try to fix this problem with multi-condition into the if, but it's doesn't work, the turtle moves forward and dig in any direction.

So I think it's because my way of creating the if isn't good, maybe the syntax (for concatenating many or into () ).

How to solve this issue?

function blockDetection(position, justDetection)
    success, detectionBlock = nil
    block_name = ""

    if position == "right" then
        turtle.turnRight()
        success, detectionBlock = turtle.inspect()
        turtle.turnLeft()
        if success then
            block_name = detectionBlock.name
            if justDetection == true and detectionBlock.name == "minecraft:air" then
                block_name = true

            elseif justDetection == true and detectionBlock.name ~= "minecraft:air" then
                block_name = false  
            else

            end
        end
    end
end

Solution

  • I think your problem is that you forgot to return block_name. If you omit the return statement, you implicitly return 0 arguments, so trying to access any would give nil values. For example if blockDetection (position,justDetetcion) then --[[something]] end, would never execute the then-end block, since nil is considered false.

    You should also one more thing you should change in your code: You shouldn't use x==true. If x is a boolean, then if x==true then ... is equivalent to if x then ....

    So, your code should look a like this:

    function blockDetection(position, justDetection)
        success, detectionBlock = nil
        block_name = ""
    
        if position == "right" then
            turtle.turnRight()
            success, detectionBlock = turtle.inspect()
            turtle.turnLeft()
            if success then
                block_name = detectionBlock.name
                if justDetection and detectionBlock.name == "minecraft:air" then
                    block_name = true
    
                elseif justDetection and detectionBlock.name ~= "minecraft:air" then
                    block_name = false  
                else
    
                end
            end
        end
        return block_name
    end