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