Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --theinsektAPIs/poz2a
- --this is an api for more advanced movements
- --while keeping track of the position relative to a start position
- --it uses poz2
- os.loadAPI("theinsektAPIs/poz2")
- function digCube2(dir1,len1,dir2,len2,dir3,len3,posT,refuel,returnToOrigin)
- --posT should not be nil
- if posT==nil then error("Error: posT is nil") end
- --dir1 should not be nil
- if dir1==nil then error("Error: dir1 is nil") end
- dir1=poz2.getAbsoluteDirection(dir1,posT)
- if dir2 ~= nil then
- dir2=poz2.getAbsoluteDirection(dir2,posT)
- end
- if dir3 ~= nil then
- --dir3 should be nil if dir2 is nil
- if(dir2==nil) then error("Error: dir2 can't be nil when dir3 isn't nil") end
- dir3=poz2.getAbsoluteDirection(dir3,posT)
- end
- if not checkNormal(dir1,dir2,dir3) then
- Error("Error: Two direction are on the same line")
- end
- --if a dir is nil then the length should be nil
- if dir2==nil and len2~=nil then error("Error: if dir2 is nil then len2 must be nil") end
- if dir3==nil and len3~=nil then error("Error: if dir3 is nil then len2 must be nil") end
- --nil means default value, and default is 1
- if len1==nil then len1=1 end
- if len2==nil then len2=1 end
- if len3==nil then len3=1 end
- --check that lengths aren't 0 or negative
- if len1<1 then error("Error: all lengths must be larger than 0, len1 isn't") end
- if len2<1 then error("Error: all lengths must be larger than 0, len2 isn't") end
- if len3<1 then error("Error: all lengths must be larger than 0, len3 isn't") end
- --the turtle is inside the cube so need to remove 1 distance
- len1=len1-1
- len2=len2-1
- len3=len3-1
- --save the origin
- local origin=poz2.copyPos(posT)
- --do the digging
- local i=1
- while(true) do
- local j=1
- while(true) do
- if digLoop(len1,dir1,posT,refuel)~=len1 then
- if returnToOrigin then digToCoords2(origin,posT,refuel) end
- return false
- end
- dir1=poz2.getReverse(dir1)
- if(j>len2) then break end
- if digLoop(1,dir2,posT,refuel)~=1 then
- if returnToOrigin then digToCoords2(origin,posT,refuel) end
- return false
- end
- j=j+1
- end
- dir2=poz2.getReverse(dir2)
- if(i>len3) then break end
- if digLoop(1,dir3,posT,refuel)~=1 then
- if returnToOrigin then digToCoords2(origin,posT,refuel) end
- return false
- end
- i=i+1
- end
- --try to return to origin
- if returnToOrigin then
- if not digToCoords2(origin,posT,refuel) then
- return false
- end
- end
- return true
- end
- function digCube(dir1,len1,dir2,len2,dir3,len3,posT)
- dir1=poz2.getAbsoluteDirection(dir1,posT)
- dir2=poz2.getAbsoluteDirection(dir2,posT)
- dir3=poz2.getAbsoluteDirection(dir3,posT)
- if not checkNormal(dir1,dir2,dir3) then
- Error("Error: Two direction are on the same line")
- end
- local i=1
- while(true) do
- local succes, d1,d1=digPlane(dir1,len1,dir2,len2,posT,refuel)
- dir1=d1
- dir2=d2
- if not succes then print("plane fail") return false end
- if(i>len3-1) then break end
- if digLoop(1,dir3,posT,refuel)~=1 then print("digloop fail") return false end
- i=i+1
- end
- return true
- end
- function digPlane(dir1,len1,dir2,len2,posT,refuel)
- print("digging plane")
- if posT==nil then error("Error: posT is nil") end
- dir1=poz2.getAbsoluteDirection(dir1,posT)
- dir2=poz2.getAbsoluteDirection(dir2,posT)
- if dir1==nil then error("Error: dir1 is nil") end
- if dir2==nil then error("Error: dir2 is nil") end
- print(dir1," ",dir2)
- local i=1
- while(true) do
- if digLoop(len1-1,dir1,posT,refuel)~=len1-1 then print("1 fail") return false,nil,nil end
- dir1=poz2.getReverse(dir1)
- if(i>len2-1) then break end
- if digLoop(1,dir2,posT,refuel)~=1 then print("2 fail") return false,nil,nil end
- i=i+1
- end
- return true, dir1, poz2.getReverse(dir2)
- end
- function checkNormal(dir1,dir2,dir3)
- local tmp={}
- return checkNormalHelp(tmp,dir1) and
- checkNormalHelp(tmp,dir2) and
- checkNormalHelp(tmp,dir3)
- end
- function checkNormalHelp(tmp,adir)
- if adir==nil then return true end
- if tmp[adir] or tmp[poz2.getReverse(adir)] then
- return false
- end
- tmp[adir]=adir
- tmp[poz2.getReverse(adir)]=adir
- return true
- end
- function detectDigGo2(direction,posT,refuel)
- --loop so that it won't be stopped by gravel
- while(true) do
- if(poz2.detect(direction,posT)) then
- if(not poz2.dig(direction,posT)) then
- return false
- end
- end
- if poz2.go(direction,posT) then
- return true
- else
- if turtle.getFuelLevel() == 0 then
- if not doRefuel or not doRefuel() then
- return false
- end
- end
- os.sleep(1)
- end
- end --while
- end
- function digLoop(iters,direction,posT,refuel)
- if posT==nil then error("Error: posT is nil") end
- direction=poz2.getAbsoluteDirection(direction,posT)
- return poz2.doLoop(iters,detectDigGo2,direction,posT,refuel)
- end
- function digToCoordsHelp(fieldName,targetCoord,posT,refuel)
- local iters=targetCoord-posT[fieldName]
- if iters==0 then
- return true, 0
- end
- local direction=poz2.getFieldToDirection(fieldName,iters)
- if iters<0 then
- local length=-digLoop(-iters,direction,posT,refuel)
- return length==iters, length
- else
- local length=digLoop(iters,direction,posT,refuel)
- return length==iters, length
- end
- end
- function digToCoords(x,y,z,posT,refuel,f)
- digToCoordsHelp("x",x,posT,refuel)
- digToCoordsHelp("y",y,posT,refuel)
- digToCoordsHelp("z",z,posT,refuel)
- if f~=nil then
- poz2.turn(f,posT)
- end
- return posT["x"]==x and posT["y"]==y and posT["z"]==z
- end
- function digToCoords2(wantedT,posT,refuel)
- return digToCoords(wantedT["x"],wantedT["y"],wantedT["z"],posT,refuel,wantedT["f"])
- end
- function doRefuel(amount)
- if amount==nil then
- os.run({},"rom/programs/turtle/refuel")
- --shell.run("refuel")
- else
- --shell.run("refuel",tostring(amount))
- os.run({},"rom/programs/turtle/refuel",tostring(amount))
- end
- return turtle.getFuelLevel()>0
- end
- function refuelToLevel(level)
- local fuelLevel=turtle.getFuelLevel()
- while(fuelLevel<level) do
- doRefuel()
- if(fuelLevel==turtle.getFuelLevel()) then
- return false
- end
- fuelLevel=turtle.getFuelLevel()
- end
- return true
- end
- function digShape(holes,refuel,posT,backOnFail)
- for k,v in ipairs(holes) do
- local direction,distance=unpack(v)
- local distanceRes=digLoop(distance,direction,posT,refuel)
- --failed so try to undo the moves
- if distance ~= distanceRes then
- if not backOnFail then return false,false end
- distance=distanceRes
- distanceRes=digLoop(distance,poz2.getReverse(direction),posT,refuel)
- if distance ~= distanceRes then return false,false end
- k=k-1
- while k>0 do
- v=holes[k]
- local direction,distance=unpack(v)
- distanceRes=digLoop(distance,poz2.getReverse(direction),posT,refuel)
- if distance ~= distanceRes then return false,false end
- k=k-1
- end--while
- return false,true
- end--if
- end--for
- return true,false
- end
- function mineUHole(direction1, length1, direction2,length2,posT,refuel,backoffDistance)
- direction1=poz2.getAbsoluteDirection(direction1)
- direction2=poz2.getAbsoluteDirection(direction2)
- direction3=poz2.getReverse(direction1)
- --mine part 1 of u
- local length3=digLoop(length1,direction1,posT,refuel)
- --mine backoff distance up, to avoid bedrock
- if backoffDistance ~= nil then
- length3=length3-digLoop(backoffDistance,direction3,posT,refuel)
- end
- local succes, isBack = digShape({{direction2,length2},{direction3,length3}},refuel,posT,true)
- if succes then return true,false,length3 end
- if isBack then
- local backRes=digLoop(length3,poz2.getReverse(direction1),posT,refuel)
- if backRes~=length3 then
- return false,false,length3
- else
- return false,true,length3
- end
- end
- return false,false,length3
- end
- function mine4by4(holeDirection,depth,extendDirection1,extendDirection2,posT,refuel,backoffDistance)
- local succes, _, depth = mineUHole(holeDirection, depth, extendDirection1,1,posT,refuel,backoffDistance)
- if not succes then return false end
- if digLoop(1,extendDirection2,posT,refuel) ~= 1 then return false end
- local succes, _, _=mineUHole(holeDirection, depth, poz2.getReverse(extendDirection1),1,posT,refuel,backoffDistance)
- if not succes then return false end
- if digLoop(1,poz2.getReverse(extendDirection2),posT,refuel) ~= 1 then return false end
- poz2.turn(extendDirection1,posT)
- return true
- end
- function emptyInventory(direction,posT)
- local isEmpty=true
- local i=1
- while(i<=16) do
- turtle.select(i)
- poz2.drop(direction,posT,64)
- isEmpty=isEmpty and turtle.getItemCount(i)==0
- i=i+1
- end
- return isEmpty
- end
- --uses a chest infront of it to empty it's inventory
- --tries to refuel before emptiying if below 2000 fuel
- --digs 4x4 holes one is hole 0 0
- --left is how many holes to the left of first hole
- --right is how many holes to the right of first hole
- --back is the amount opposite side of chest from the first hole
- --so 1,1,1 makes 6 holes
- --example poz2a.miningProgram1(150,1,1,1,posT)
- function miningProgram1(depth,left,right,back,posT)
- local chestPos=poz2.copyPos(posT)
- poz2.turn("r",posT)
- local rightDir=posT["f"]
- local leftDir=poz2.getReverse(rightDir)
- poz2.turn("r",posT)
- local backDir=posT["f"]
- print(rightDir," ",leftDir," ",backDir)
- local fuelLevel=2000
- refuelToLevel(fuelLevel)
- local i=-left
- local j=0
- while(i<=right) do
- j=0
- while(j<=back) do
- --refuel and fuel check
- refuelToLevel(fuelLevel)
- if turtle.getFuelLevel()<500 then
- print("low fuel level")
- return false
- end
- --calculate dig position
- local wantedPos=poz2.copyPos(chestPos)
- local coordName, change=poz2.getCoordinateChange(rightDir,i*2)
- wantedPos[coordName]=wantedPos[coordName]+change
- local coordName, change=poz2.getCoordinateChange(backDir,j*2)
- wantedPos[coordName]=wantedPos[coordName]+change
- --go to dig position
- digToCoords(wantedPos["x"],wantedPos["y"],wantedPos["z"],posT,refuel)
- --dig
- if not mine4by4("d",depth,rightDir,backDir,posT,refuel,7) then
- return false
- end
- --poz2.dig("d",posT)
- --back to chest
- digToCoords(chestPos["x"],chestPos["y"],chestPos["z"],posT,refuel)
- --refuel
- refuelToLevel(fuelLevel)
- --empty inventory
- if not emptyInventory(chestPos["f"],posT) then
- print("chest is full")
- return false
- end
- j=j+1
- end
- i=i+1
- end
- return true
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement