jille_Jr icon

[CC] Turtle Do - by Slamakans

jille_Jr | PRO | 11/20/17 06:48:33 PM UTC | 0 ⭐ | 508 👁️ | Never ⏰ | []
Lua |

11.21 KB

|

None

|

0 👍

/

0 👎

-- Defaults
local flags = {
    ["placing"] = false,
    ["placingDown"] = false,
    ["placingUp"] = false,
    ["placingLeft"] = false,
    ["placingRight"] = false,
    ["placingBack"] = false,
    ["digging"] = false,
    ["diggingUp"] = false,
    ["diggingDown"] = false,
    ["diggingLeft"] = false,
    ["diggingRight"] = false,
    ["attacking"] = true,
}
 
local fuelList = {
    "minecraft:coal",
    "minecraft:planks",
    "minecraft:log",
    "minecraft:stick",
    "minecraft:coal_block",
}
 
function contains(table, element)
    for _,v in ipairs(table) do
        if v == element then
            return true
        end
    end
    return false
end
 
function selectFromList(list)
    local selected = turtle.getItemDetail()
    if selected and contains(list, selected.name) then
        -- Already selected
        return true
    end
 
    for slot=16,1,-1 do
        local data = turtle.getItemDetail(slot)
 
        if data then
            if contains(list, data.name) then
                turtle.select(slot)
                return true
            end
        end
    end
    return false
end
 
function refuelIfLow(val, amt)
    val = val or 5
    amt = amt or 1
    if turtle.getFuelLevel() < val then
        if selectFromList(fuelList) then
            turtle.refuel(amt)
        end
    end
end
 
function select(slot)
    turtle.select(slot)
end
 
function togglePlace()
    flags["placing"] = not flags["placing"]
end
 
function togglePlaceDown()
    flags["placingDown"] = not flags["placingDown"]
end
 
function togglePlaceUp()
    flags["placingUp"] = not flags["placingUp"]
end
 
function togglePlaceLeft()
    flags["placingLeft"] = not flags["placingLeft"]
end
 
function togglePlaceRight()
    flags["placingRight"] = not flags["placingRight"]
end
 
function togglePlaceBack()
    flags["placingBack"] = not flags["placingBack"]
end
 
function toggleDig()
    flags["digging"] = not flags["digging"]
end
 
function toggleDigUp()
    flags["diggingUp"] = not flags["diggingUp"]
end
 
function toggleDigDown()
    flags["diggingDown"] = not flags["diggingDown"]
end
 
function toggleDigLeft()
    flags["diggingLeft"] = not flags["diggingLeft"]
end
 
function toggleDigRight()
    flags["diggingRight"] = not flags["diggingRight"]
end
 
function toggleAttack()
    flags["attacking"] = not flags["attacking"]
end
 
function turnRight(turns)
    turns = turns or 1
    for i=1,turns do
        turtle.turnRight()
    end
end
 
function turnLeft(turns)
    turns = turns or 1
    for i=1,turns do
        turtle.turnLeft()
    end
end
 
function move(func, blocks)
    blocks = blocks or 1
    local digFunc
    if func == "f" then
        func = turtle.forward
        digFunc = turtle.dig
    elseif func == "u" then
        func = turtle.up
        digFunc = turtle.digUp
    elseif func == "d" then
        func = turtle.down
        digFunc = turtle.digDown
    elseif func == "b" then
        func = turtle.back
        digFunc = turtle.dig
    end
 
    for block=1,blocks do
        if flags["placing"] and not turtle.detect() then
            turtle.place()
        end
 
        if flags["placingDown"] and not turtle.detectDown() then
            turtle.placeDown()
        end
 
        if flags["placingUp"] and not turtle.detectUp() then
            turtle.placeUp()
        end
 
        if flags["placingLeft"] then
            turnLeft()
            turtle.place()
            turnRight()
        end
 
        if flags["placingRight"] then
            turnRight()
            turtle.place()
            turnLeft()
        end
 
        if flags["placingBack"] then
            if math.random(2) == 1 then
                turnRight(2)
            else
                turnLeft(2)
            end
            turtle.place()
            if math.random(2) == 1 then
                turnRight(2)
            else
                turnLeft(2)
            end
        end
 
        local dug, digError
        if flags["digging"] then
            dug, digError = turtle.dig()
            if not dug and flags["attacking"] then
                repeat until not turtle.attack()
            end
        end
 
        if flags["diggingUp"] then
            turtle.digUp()
        end
 
        if flags["diggingDown"] then
            turtle.digDown()
        end
 
        if flags["diggingLeft"] then
            turnLeft()
            dug, digError = turtle.dig()
            if not dug and flags["attacking"] then
                repeat until not turtle.attack()
            end
            turnRight()
        end
 
        if flags["diggingRight"] then
            turnRight()
            dug, digError = turtle.dig()
            if not dug and flags["attacking"] then
                repeat until not turtle.attack()
            end
            turnLeft()
        end
 
        refuelIfLow()
        local moved = func()
        if not moved then
            repeat
                local dug,err
                if flags["digging"] then
                    dug,err = digFunc()
                end
 
                if flags["attacking"] and not dug then
                    if not turtle.attack() then
                        print("I think I hit bedrock, skipping to next command...")
                        return false
                    end
                end
            until func()
        end
    end
 
    return true
end
 
function forward(blocks)
    return move("f", blocks)
end
 
function right(blocks)
    turnRight()
    local result = move("f", blocks)
    turnLeft()
    return result
end
 
function left(blocks)
    turnLeft()
    local result = move("f", blocks)
    turnRight()
    return result
end
 
function back(blocks)
    if flags["attacking"] or flags["digging"] then
        if math.random(2) == 1 then
            turnRight(2)
        else
            turnLeft(2)
        end
    end
    local result = move((flags["attacking"] or flags["digging"]) and "f" or "b", blocks)
    if flags["attacking"] or flags["digging"] then
        if math.random(2) == 1 then
            turnRight(2)
        else
            turnLeft(2)
        end
    end
    return result
end
 
function up(blocks)
    return move("u", blocks)
end
 
function down(blocks)
    return move("d", blocks)
end
 
function place()
    return turtle.place()
end
 
function placeDown()
    return turtle.placeDown()
end
 
function placeUp()
    return turtle.placeUp()
end
 
function placeBack()
    if math.random(2) == 1 then
        turnRight(2)
    else
        turnLeft(2)
    end
    local result = turtle.place()
    if math.random(2) == 1 then
        turnRight(2)
    else
        turnLeft(2)
    end
    return result
end
 
function placeLeft()
    turnLeft()
    local result = turtle.place()
    turnRight()
    return result
end
 
function placeRight()
    turnRight()
    local result = turtle.place()
    turnLeft()
    return result
end
 
function dig()
    return turtle.dig()
end
 
function digUp()
    return turtle.digUp()
end
 
function digDown()
    return turtle.digDown()
end
 
function digRight()
    turnRight()
    local result = turtle.dig()
    turnLeft()
    return result
end
 
function digLeft()
    turnLeft()
    local result = turtle.dig()
    turnRight()
    return result
end
 
function digBack()
    if math.random(2) == 1 then
        turnRight(2)
    else
        turnLeft(2)
    end
    local result = turtle.dig()
    if math.random(2) == 1 then
        turnRight(2)
    else
        turnLeft(2)
    end
    return result
end
 
local commands = {
    ["f"] = forward, ["fd"] = forward, ["forward"] = forward,
    ["r"] = right, ["right"] = right,
    ["l"] = left, ["left"] = left,
    ["b"] = back, ["back"] = back,
    ["u"] = up, ["up"] = up,
    ["d"] = down, ["down"] = down,
    ["tr"] = turnRight, ["rt"] = turnRight, ["turnright"] = turnRight,
    ["tl"] = turnLeft, ["lt"] = turnLeft, ["turnleft"] = turnLeft,
    ["s"] = select, ["sl"] = select, ["sel"] = select, ["select"] = select,
    ["p"] = place, ["place"] = place,
    ["tp"] = togglePlace, ["toggleplace"] = togglePlace,
    ["pd"] = placeDown, ["placedown"] = placeDown,
    ["tpd"] = togglePlaceDown, ["toggleplacedown"] = togglePlaceDown,
    ["pu"] = placeUp, ["placeup"] = placeUp,
    ["tpu"] = togglePlaceUp, ["toggleplaceup"] = togglePlaceUp,
    ["pl"] = placeLeft, ["placeleft"] = placeLeft,
    ["tpl"] = togglePlaceLeft, ["toggleplaceleft"] = togglePlaceLeft,
    ["pr"] = placeRight, ["placeright"] = placeRight,
    ["tpr"] = togglePlaceRight, ["toggleplaceright"] = togglePlaceRight,
    ["pb"] = placeBack, ["placeback"] = placeBack,
    ["tpb"] = togglePlaceBack, ["tpb"] = togglePlaceBack,
    ["dig"] = dig,
    ["td"] = toggleDig, ["tdig"] = toggleDig, ["toggledig"] = toggleDig,
    ["du"] = digUp, ["digup"] = digUp,
    ["tdu"] = toggleDigUp, ["tdigup"] = toggleDigUp, ["toggledigup"] = toggleDigUp,
    ["dd"] = digDown, ["digdown"] = digDown,
    ["tdd"] = toggleDigDown, ["tdigdown"] = toggleDigDown, ["toggledigdown"] = toggleDigDown,
    ["dr"] = digRight, ["digright"] = digRight,
    ["tdr"] = toggleDigRight, ["tdigright"] = toggleDigRight, ["toggledigright"] = toggleDigRight,
    ["dl"] = digLeft, ["digleft"] = digLeft,
    ["tdl"] = toggleDigLeft, ["tdigleft"] = toggleDigLeft, ["toggledigleft"] = toggleDigLeft,
    ["db"] = digBack, ["digback"] = digBack,
    ["ta"] = toggleAttack, ["toggleattack"] = toggleAttack,
}
 
function shift(t)
    return table.remove(t, 1)
end
 
local queue = {}
 
function join(t, s)
    local result = ""
    for i,v in ipairs(t) do
        result = result .. v
        if i ~= #t then
            result = result .. s
        end
    end
    
    return result
end
 
function trim(s)
  return (s:gsub("^%s*(.-)%s*$", "%1"))
end
 
function capture(s)
    local p = "(%b()) (%d%d?)"
    local _,_,group,times = s:find(p)
 
    if not group then
        return false
    end
 
    local times = tonumber(times)
    local result = trim(
        s:gsub(p, (group:sub(2, -2) .. " "):rep(times))
    )
 
    return result
end
 
function parse(s)
    local result = s
    repeat
        result = capture(s) or result
    until not capture(result)
 
    return result
end
 
function validate(name)
    return name and (commands[name] or shell.resolveProgram(name))
end
 
local args = {...}
local joinedArgs = join(args, " ")
local unpackedArgs = {}
for word in parse(joinedArgs):gmatch("%S+") do table.insert(unpackedArgs, word) end
 
while #unpackedArgs ~= 0 do
    local name = shift(unpackedArgs)
    if not validate(name) then
        print(name .. " is not a valid program")
        return
    end
    local arg = tonumber(unpackedArgs[1])
    if arg ~= nil then
        shift(unpackedArgs)
    end
    table.insert(queue, { ["name"] = name, ["arg"] = arg })
end
 
for i,v in ipairs(queue) do
    local name, arg = v.name:lower(), v.arg
    local cmd = commands[name]
 
    if cmd then
        cmd(arg)
    elseif name then
        local resolved = shell.resolveProgram(name)
        if resolved then
            shell.run(resolved, arg)
        else
        end
    end
end

Comments