This is a read-only snapshot of the ComputerCraft forums, taken in April 2020.
Minithra's profile picture

[lua] Editing stock Excavate program

Started by Minithra, 11 February 2013 - 03:29 PM
Minithra #1
Posted 11 February 2013 - 04:29 PM
Hello.

I am very new to lua, and programming in general.

I am attempting to modify the stock Excavate program to make it go upwards.

This was very easy to do. Unfortunately, there is no bedrock to stop it, so it just keeps going.

I have tried various ways to make it stop after a certain number of blocks… no go.

This is the current code: http://pastebin.com/FnQtqgS7

Spoiler

local tArgs = { ... }
if #tArgs ~= 1 then
print( "Usage: excavate <diameter>" )
return
end
-- Mine in a quarry pattern until we hit something we can't dig
local size = tonumber( tArgs[1] )
if size < 1 then
print( "Excavate diameter must be positive" )
return
end

local height = 0
local unloaded = 0
local collected = 0
local maxhigh = 0
local maxhigher = 0
local xPos,zPos = 0,0
local xDir,zDir = 0,1
local goTo -- Filled in further down
local refuel -- Filled in further down
local function unload()
print( "Unloading items..." )
for n=1,16 do
  unloaded = unloaded + turtle.getItemCount(n)
  turtle.select(n)
  turtle.drop()
end
collected = 0
turtle.select(1)
end
local function returnSupplies()
local x,y,z,xd,zd = xPos,height,zPos,xDir,zDir
print( "Returning to surface..." )
goTo( 0,0,0,0,-1 )

local fuelNeeded = x+y+z + x+y+z + 1
if not refuel( fuelNeeded ) then
  unload()
  print( "Waiting for fuel" )
  while not refuel( fuelNeeded ) do
   sleep(1)
  end
else
  unload()
end
print( "Resuming mining..." )
goTo( x,y,z,xd,zd )

end
local function collect()
local bFull = true
local nTotalItems = 0
for n=1,16 do
  local nCount = turtle.getItemCount(n)
  if nCount == 0 then
   bFull = false
  end
  nTotalItems = nTotalItems + nCount
end

if nTotalItems > collected then
  collected = nTotalItems
  if math.fmod(collected + unloaded, 50) == 0 then
   print( "Mined "..(collected + unloaded).." items." )
  end
end

if bFull then
  print( "No empty slots left." )
  return false
end
return true
end
function refuel( ammount )
local fuelLevel = turtle.getFuelLevel()
if fuelLevel == "unlimited" then
  return true
end

local needed = ammount or (xPos + zPos + height + 1)
if turtle.getFuelLevel() < needed then
  local fueled = false
  for n=1,16 do
   if turtle.getItemCount(n) > 0 then
    turtle.select(n)
    if turtle.refuel(1) then
	 while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
	  turtle.refuel(1)
	 end
	 if turtle.getFuelLevel() >= needed then
	  turtle.select(1)
	  return true
	 end
    end
   end
  end
  turtle.select(1)
  return false
end

return true
end
local function tryForwards()
if not refuel() then
  print( "Not enough Fuel" )
  returnSupplies()
end

while not turtle.forward() do
  if turtle.detect() then
   if turtle.dig() then
    if not collect() then
	 returnSupplies()
    end
   else
    return false
   end
  elseif turtle.attack() then
   if not collect() then
    returnSupplies()
   end
  else
   sleep( 0.5 )
  end
end

xPos = xPos + xDir
zPos = zPos + zDir
return true
end
local function tryDown()
if not refuel() then
  print( "Not enough Fuel" )
  returnSupplies()
end

while not turtle.up() do
  if turtle.detectUp() then
   if turtle.digUp() then
    if not collect() then
	 returnSupplies()
    end
   else
    return false
   end
  elseif turtle.attackUp() then
   if not collect() then
    returnSupplies()
   end
  else
   sleep( 0.5 )
  end
end
height = height + 1
if math.fmod( height, 10 ) == 0 then
  print( "Ascended "..height.." metres." )
end
return true
end
local function turnLeft()
turtle.turnLeft()
xDir, zDir = -zDir, xDir
end
local function turnRight()
turtle.turnRight()
xDir, zDir = zDir, -xDir
end
function goTo( x, y, z, xd, zd )
while height > y do
  if turtle.up() then
   height = height - 1
  elseif turtle.digUp() or turtle.attackUp() then
   collect()
  else
   sleep( 0.5 )
  end
end
if xPos > x then
  while xDir ~= -1 do
   turnLeft()
  end
  while xPos > x do
   if turtle.forward() then
    xPos = xPos - 1
   elseif turtle.dig() or turtle.attack() then
    collect()
   else
    sleep( 0.5 )
   end
  end
elseif xPos < x then
  while xDir ~= 1 do
   turnLeft()
  end
  while xPos < x do
   if turtle.forward() then
    xPos = xPos + 1
   elseif turtle.dig() or turtle.attack() then
    collect()
   else
    sleep( 0.5 )
   end
  end
end

if zPos > z then
  while zDir ~= -1 do
   turnLeft()
  end
  while zPos > z do
   if turtle.forward() then
    zPos = zPos - 1
   elseif turtle.dig() or turtle.attack() then
    collect()
   else
    sleep( 0.5 )
   end
  end
elseif zPos < z then
  while zDir ~= 1 do
   turnLeft()
  end
  while zPos < z do
   if turtle.forward() then
    zPos = zPos + 1
   elseif turtle.dig() or turtle.attack() then
    collect()
   else
    sleep( 0.5 )
   end
  end
end

while height < y do
  if turtle.down() then
   height = height + 1
  elseif turtle.digDown() or turtle.attackDown() then
   collect()
  else
   sleep( 0.5 )
  end
end

while zDir ~= zd or xDir ~= xd do
  turnLeft()
end
end
if not refuel() then
print( "Out of Fuel" )
return
end
print( "Excavating..." )
local reseal = false
turtle.select(1)
if turtle.digDown() then
reseal = true
end
local alternate = 0
local done = false
while not done do
for n=1,size do
  for m=1,size-1 do
   if not tryForwards() then
    done = true
    break
   end
  end
  if done then
   break
  end
  if n<size then
   if math.fmod(n + alternate,2) == 0 then
    turnLeft()
    if not tryForwards() then
	 done = true
	 break
    end
    turnLeft()
   else
    turnRight()
    if not tryForwards() then
	 done = true
	 break
    end
    turnRight()
   end
  end
end
if done then
  break
end

if size > 1 then
  if math.fmod(size,2) == 0 then
   turnRight()
  else
   if alternate == 0 then
    turnLeft()
   else
    turnRight()
   end
   alternate = 1 - alternate
  end
end

if not tryDown() then
  done = true
  break
end
end
print( "Returning to surface..." )
-- Return to where we started
goTo( 0,0,0,0,-1 )
unload()
goTo( 0,0,0,0,1 )
-- Seal the hole
if reseal then
turtle.placeDown()
end
print( "Mined "..(collected + unloaded).." items total." )

The way I understand it, I need to make the functions tryDown() and tryForwards() return false. I don't know how to do it. :/
tesla1889 #2
Posted 11 February 2013 - 06:49 PM
try turtle.detect("top")

if there is no block above, add one to your air counter

if there is a block, set the air counter to 0

when air counter == some tolerance, end the program
Minithra #3
Posted 11 February 2013 - 07:02 PM
I tried adding counters, both outside and within the functions… no dice. The detection of air wouldn't work for my needs - I want this program for twilight oak chopping, and there's a lot of useless flying through the air for it.
punchin #4
Posted 09 March 2013 - 08:49 PM
Can you add a line to the beginning to just go up before running the stock program?You're going to be doing a lot of empty space traveling anyway. You could set it next to the trunk and have it go up till it doesn't detect anything, then go a little farther to make sure. Then move to one corner of the square and start excavating.
3LiD #5
Posted 09 March 2013 - 08:54 PM
try turtle.detect("top")

if there is no block above, add one to your air counter

if there is a block, set the air counter to 0

when air counter == some tolerance, end the program

Will not work… Say you come across a cave! Extremely common…

Pastebin link broken.