Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- DIR = 1
- startDIR = 1
- prevDiff = 0
- status = "Inactive"
- pos = vector.new(gps.locate())
- host = 5
- doResume, tarX, tarY, tarZ= ...
- function getOrientation()
- loc1 = vector.new(gps.locate(2, false))
- if not turtle.forward() then
- for j=1,6 do
- if not turtle.forward() then
- turtle.dig()
- else break end
- end
- end
- loc2 = vector.new(gps.locate(2, false))
- heading = loc2 - loc1
- return ((heading.x + math.abs(heading.x) * 2) + (heading.z + math.abs(heading.z) * 3))
- end
- function left()
- if turtle then turtle.turnLeft() end
- DIR = DIR - 1
- if DIR < 1 then DIR = DIR + 4 end
- end
- function right()
- if turtle then turtle.turnRight() end
- DIR = DIR + 1
- if DIR > 4 then DIR = DIR - 4 end
- end
- function face(target)
- if(DIR == target) then return end
- if(target == 5) then target = 1 else
- if(target == 6) then target = 2 else
- if(target == 7) then target = 3 else
- if(target == 8) then target = 4 end
- end
- end
- end
- diff = DIR - target
- if(diff == 1 or diff == -3) then left()
- else
- if(math.abs(diff) == 2) then right() right()
- else right() end
- end
- end
- function unload(start, startDIR)
- status = "Unloading "
- local pause = vector.new(gps.locate())
- local pauseDIR = DIR
- pos = vector.new(gps.locate())
- while(pos.y < start.y) do
- if not turtle.up() then
- turtle.digUp()
- end
- pos = vector.new(gps.locate())
- end
- pos = vector.new(gps.locate())
- if(start.x ~= pos.x) then
- if(start.x > pos.x) then
- face(3)
- else
- face(1)
- end
- diff = start - pos
- while(math.abs(diff.x) > 0) do
- if not turtle.forward() then
- turtle.dig()
- turtle.attack()
- end
- pos = vector.new(gps.locate())
- diff = start - pos
- if(turtle.getFuelLevel() < 300) then
- for i=1, 16 do
- turtle.select(i)
- turtle.refuel()
- end
- turtle.select(1)
- end
- end
- end
- pos = vector.new(gps.locate())
- if(start.z ~= pos.z) then
- if(start.z > pos.z) then
- face(4)
- else
- face(2)
- end
- diff = start - pos
- while(math.abs(diff.z) > 0) do
- if not turtle.forward() then
- turtle.dig()
- turtle.attack()
- end
- pos = vector.new(gps.locate())
- diff = start - pos
- if(turtle.getFuelLevel() < 300) then
- for i=1, 16 do
- turtle.select(i)
- turtle.refuel()
- end
- turtle.select(1)
- end
- end
- end
- face(startDIR + 2)
- turtle.forward()
- for I = 1,16 do
- turtle.select(I)
- if(turtle.refuel(0) == false) then
- turtle.drop()
- end
- end
- turtle.select(1)
- right()
- right()
- turtle.forward()
- status = "Resuming "
- pos = vector.new(gps.locate())
- if(pause.z > pos.z) then
- face(4)
- else
- face(2)
- end
- diff = pause - pos
- while(math.abs(diff.z) > 0) do
- if not turtle.forward() then
- turtle.dig()
- turtle.attack()
- end
- pos = vector.new(gps.locate())
- diff = pause - pos
- if(turtle.getFuelLevel() < 300) then
- for i=1, 16 do
- turtle.select(i)
- turtle.refuel()
- end
- turtle.select(1)
- end
- end
- pos = vector.new(gps.locate())
- if(pause.x > pos.x) then
- face(3)
- else
- face(1)
- end
- diff = pause - pos
- while(math.abs(diff.x) > 0) do
- if not turtle.forward() then
- turtle.dig()
- turtle.attack()
- end
- pos = vector.new(gps.locate())
- diff = pause - pos
- if(turtle.getFuelLevel() < 300) then
- for i=1, 16 do
- turtle.select(i)
- turtle.refuel()
- end
- turtle.select(1)
- end
- end
- pos = vector.new(gps.locate())
- while(pos.y > pause.y) do
- if not turtle.down() then
- turtle.digDown()
- turtle.attackDown()
- end
- pos = vector.new(gps.locate())
- if(turtle.getFuelLevel() < 300) then
- for i=1, 16 do
- turtle.select(i)
- turtle.refuel()
- end
- turtle.select(1)
- end
- end
- face(pauseDIR)
- end
- function save_config()
- sw = fs.open("config.txt", "w")
- sw.writeLine(pos.x)
- sw.writeLine(pos.y)
- sw.writeLine(pos.z)
- sw.writeLine(DIR)
- sw.writeLine(start.x)
- sw.writeLine(start.y)
- sw.writeLine(start.z)
- sw.writeLine(startDIR)
- sw.writeLine(layerCount)
- sw.writeLine(rowCount)
- sw.close()
- end
- function load_config()
- sr = fs.open("config.txt", "r")
- resumePos.x = tonumber(sr.readLine())
- resumePos.y = tonumber(sr.readLine())
- resumePos.z = tonumber(sr.readLine())
- resumeDIR = tonumber(sr.readLine())
- start.x = tonumber(sr.readLine())
- start.y = tonumber(sr.readLine())
- start.z = tonumber(sr.readLine())
- startDIR = tonumber(sr.readLine())
- layerCount = tonumber(sr.readLine())
- rowCount = tonumber(sr.readLine())
- sr.close()
- end
- function resume()
- pos = vector.new(gps.locate())
- if(resumePos.z > pos.z) then
- face(4)
- else
- face(2)
- end
- diff = resumePos - pos
- if(resumePos.z ~= pos.z) then
- while(math.abs(diff.z) > 0) do
- if not turtle.forward() then
- turtle.dig()
- turtle.attack()
- end
- pos = vector.new(gps.locate())
- diff = resumePos - pos
- if(turtle.getFuelLevel() < 300) then
- for i=1, 16 do
- turtle.select(i)
- turtle.refuel()
- end
- turtle.select(1)
- end
- end
- end
- pos = vector.new(gps.locate())
- if(resumePos.x > pos.x) then
- face(3)
- else
- face(1)
- end
- diff = resumePos - pos
- while(math.abs(diff.x) > 0) do
- if not turtle.forward() then
- turtle.dig()
- turtle.attack()
- end
- pos = vector.new(gps.locate())
- diff = resumePos - pos
- if(turtle.getFuelLevel() < 300) then
- for i=1, 16 do
- turtle.select(i)
- turtle.refuel()
- end
- turtle.select(1)
- end
- end
- pos = vector.new(gps.locate())
- if(pos.y > resumePos.y) then
- while(pos.y > resumePos.y) do
- if not turtle.down() then
- turtle.digDown()
- turtle.attackDown()
- end
- pos = vector.new(gps.locate())
- if(turtle.getFuelLevel() < 300) then
- for i=1, 16 do
- turtle.select(i)
- turtle.refuel()
- end
- turtle.select(1)
- end
- end
- else
- while(pos.y < resumePos.y) do
- if not turtle.up() then
- turtle.digUp()
- turtle.attackUp()
- end
- pos = vector.new(gps.locate())
- if(turtle.getFuelLevel() < 300) then
- for i=1, 16 do
- turtle.select(i)
- turtle.refuel()
- end
- turtle.select(1)
- end
- end
- end
- face(resumeDIR)
- end
- function quarry()
- local modem = peripheral.find("modem")
- rednet.open("left")
- pos = vector.new(gps.locate())
- DIR = getOrientation()
- startDIR = DIR
- resumeDIR = 1
- start = vector.new(gps.locate())
- resumePos = vector.new(0,0,0)
- target = vector.new(tarX, tarY, tarZ)
- print(target)
- print(startDIR)
- print("|" .. doResume .. "|")
- status = "Mining"
- rowCount = 1
- layerCount = 1
- local diff = 0
- layerDone = false
- if(doResume == "Y") then
- load_config()
- print("RESUMING")
- resume()
- end
- while(pos.y ~= target.y - 1) do
- layerDone= false
- if(layerCount % 2 == 1) then diff = target - pos else diff = start - pos end
- while(layerDone == false) do
- if(layerCount % 2 == 1) then diff = target - pos else diff = start - pos end
- if(math.abs(diff.z) > 0) then
- layerDone = false
- else
- layerDone = true
- end
- if(rowCount % 2 == 1) then diff = target - pos else diff = start - pos end
- --1 = W, 3 = E
- if(rowCount % 2 == 1) then
- if(target.x > pos.x) then
- face(3)
- else
- face(1)
- end
- else
- if(start.x > pos.x) then
- face(3)
- else
- face(1)
- end
- end
- while(math.abs(diff.x) > 0) do
- prevDiff = diff
- turtle.dig()
- if not turtle.forward() then
- turtle.dig()
- turtle.attack()
- end
- pos = vector.new(gps.locate())
- if(rowCount % 2 == 1) then diff = target - pos else diff = start - pos end
- if(math.abs(prevDiff.x) < math.abs(diff.x)) then
- break
- end
- if(turtle.getFuelLevel() < 300) then
- for i=1, 16 do
- turtle.select(i)
- turtle.refuel()
- end
- turtle.select(1)
- end
- if(turtle.getItemCount(16) > 0) then
- unload(start, startDIR)
- status = "Mining"
- end
- save_config()
- end
- rowCount = rowCount + 1
- --4 = N, 2 = S
- if(layerCount % 2 == 1) then
- if(target.z > pos.z) then
- face(4)
- else
- face(2)
- end
- else if(start.z > pos.z) then
- face(4)
- else
- face(2)
- end
- end
- if(layerDone == false) then
- turtle.dig()
- if not turtle.forward() then
- turtle.dig()
- turtle.attack()
- end
- end
- pos = vector.new(gps.locate())
- save_config()
- if(layerCount % 2 == 1) then diff = target - pos else diff = start - pos end
- end
- turtle.digDown()
- if not turtle.down() then
- turtle.digDown()
- turtle.attackDown()
- end
- layerCount = layerCount + 1
- if(rowCount % 2 == 1) then
- rowCount = 1
- else
- rowCount = 2
- end
- pos = vector.new(gps.locate())
- save_config()
- end
- print("Done!")
- status = "Complete"
- end
- function rangeCheck()
- while true do
- local sender2, message2, protocol2 = rednet.receive("failsafe", 10)
- print(message2)
- if (message2) == null then
- rednet.send(host, os.getComputerLabel() .. " " .. turtle.getFuelLevel() .. " " .. pos.x .. " " .. pos.y .." " .. pos.z .. " " .. status, "miners")
- print("Failsafe tripped!")
- return
- end
- sleep(1)
- end
- end
- function transmit()
- while(true) do
- local sender, message, protocol = rednet.receive("ping")
- if(message ~= nil and message == "send") then
- print("Sending")
- rednet.send(host, os.getComputerLabel() .. " " .. turtle.getFuelLevel() .. " " .. pos.x .. " " .. pos.y .." " .. pos.z .. " " .. status, "miners")
- sleep(0.5)
- end
- end
- end
- parallel.waitForAny(quarry, rangeCheck, transmit)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement