Advertisement
theinsekt

poz2a

Sep 3rd, 2014
358
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 10.21 KB | None | 0 0
  1. --theinsektAPIs/poz2a
  2. --this is an api for more advanced movements
  3. --while keeping track of the position relative to a start position
  4. --it uses poz2
  5. os.loadAPI("theinsektAPIs/poz2")
  6.  
  7. function digCube2(dir1,len1,dir2,len2,dir3,len3,posT,refuel,returnToOrigin)
  8.  --posT should not be nil
  9.  if posT==nil then error("Error: posT is nil") end
  10.  --dir1 should not be nil
  11.  if dir1==nil then error("Error: dir1 is nil") end
  12.  
  13.  dir1=poz2.getAbsoluteDirection(dir1,posT)
  14.  
  15.  if dir2 ~= nil then
  16.   dir2=poz2.getAbsoluteDirection(dir2,posT)
  17.  end
  18.  if dir3 ~= nil then
  19.   --dir3 should be nil if dir2 is nil
  20.   if(dir2==nil) then error("Error: dir2 can't be nil when dir3 isn't nil") end
  21.   dir3=poz2.getAbsoluteDirection(dir3,posT)
  22.  end
  23.  if not checkNormal(dir1,dir2,dir3) then
  24.   Error("Error: Two direction are on the same line")
  25.  end
  26.  
  27.   --if a dir is nil then the length should be nil
  28.  if dir2==nil and len2~=nil then error("Error: if dir2 is nil then len2 must be nil") end
  29.  if dir3==nil and len3~=nil then error("Error: if dir3 is nil then len2 must be nil") end
  30.  
  31.  --nil means default value, and default is 1
  32.  if len1==nil then len1=1 end
  33.  if len2==nil then len2=1 end
  34.  if len3==nil then len3=1 end
  35.  
  36.  
  37.  --check that lengths aren't 0 or negative
  38.  if len1<1 then error("Error: all lengths must be larger than 0, len1 isn't") end
  39.  if len2<1 then error("Error: all lengths must be larger than 0, len2 isn't") end
  40.  if len3<1 then error("Error: all lengths must be larger than 0, len3 isn't") end
  41.  
  42.  --the turtle is inside the cube so need to remove 1 distance
  43.  len1=len1-1
  44.  len2=len2-1
  45.  len3=len3-1
  46.  
  47.  --save the origin
  48.  local origin=poz2.copyPos(posT)
  49.  
  50.  --do the digging
  51.  local i=1
  52.  while(true) do
  53.    local j=1
  54.    while(true) do
  55.     if digLoop(len1,dir1,posT,refuel)~=len1 then
  56.      if returnToOrigin then digToCoords2(origin,posT,refuel) end
  57.      return false
  58.     end
  59.     dir1=poz2.getReverse(dir1)
  60.     if(j>len2) then break end
  61.     if digLoop(1,dir2,posT,refuel)~=1 then
  62.      if returnToOrigin then digToCoords2(origin,posT,refuel) end
  63.      return false
  64.     end
  65.     j=j+1
  66.   end
  67.   dir2=poz2.getReverse(dir2)
  68.   if(i>len3) then break end
  69.   if digLoop(1,dir3,posT,refuel)~=1 then
  70.    if returnToOrigin then digToCoords2(origin,posT,refuel) end
  71.    return false
  72.   end
  73.   i=i+1
  74.  end
  75.  
  76.  --try to return to origin
  77.  if returnToOrigin then
  78.   if not digToCoords2(origin,posT,refuel) then
  79.    return false
  80.   end
  81.  end
  82.  
  83.  return true
  84. end
  85.  
  86. function digCube(dir1,len1,dir2,len2,dir3,len3,posT)
  87.  dir1=poz2.getAbsoluteDirection(dir1,posT)
  88.  dir2=poz2.getAbsoluteDirection(dir2,posT)
  89.  dir3=poz2.getAbsoluteDirection(dir3,posT)
  90.  if not checkNormal(dir1,dir2,dir3) then
  91.   Error("Error: Two direction are on the same line")
  92.  end
  93.  local i=1
  94.  while(true) do
  95.   local succes, d1,d1=digPlane(dir1,len1,dir2,len2,posT,refuel)
  96.   dir1=d1
  97.   dir2=d2
  98.   if not succes then print("plane fail") return false end
  99.   if(i>len3-1) then break end
  100.   if digLoop(1,dir3,posT,refuel)~=1 then print("digloop fail") return false end
  101.   i=i+1
  102.  end
  103.  return true
  104. end
  105.  
  106. function digPlane(dir1,len1,dir2,len2,posT,refuel)
  107.  print("digging plane")
  108.  if posT==nil then error("Error: posT is nil") end
  109.  dir1=poz2.getAbsoluteDirection(dir1,posT)
  110.  dir2=poz2.getAbsoluteDirection(dir2,posT)
  111.  if dir1==nil then error("Error: dir1 is nil") end
  112.  if dir2==nil then error("Error: dir2 is nil") end
  113.  print(dir1," ",dir2)
  114.  local i=1
  115.  while(true) do
  116.   if digLoop(len1-1,dir1,posT,refuel)~=len1-1 then print("1 fail") return false,nil,nil end
  117.   dir1=poz2.getReverse(dir1)
  118.   if(i>len2-1) then break end
  119.   if digLoop(1,dir2,posT,refuel)~=1 then print("2 fail") return false,nil,nil end
  120.   i=i+1
  121.  end
  122.  return true, dir1, poz2.getReverse(dir2)
  123. end
  124.  
  125.  
  126. function checkNormal(dir1,dir2,dir3)
  127.  local tmp={}
  128.  return checkNormalHelp(tmp,dir1) and
  129.   checkNormalHelp(tmp,dir2) and
  130.   checkNormalHelp(tmp,dir3)
  131. end
  132.  
  133. function checkNormalHelp(tmp,adir)
  134.  if adir==nil then return true end
  135.  if tmp[adir] or tmp[poz2.getReverse(adir)] then
  136.   return false
  137.  end
  138.  tmp[adir]=adir
  139.  tmp[poz2.getReverse(adir)]=adir
  140.  return true
  141. end
  142.  
  143. function detectDigGo2(direction,posT,refuel)
  144.  --loop so that it won't be stopped by gravel
  145.  while(true) do
  146.   if(poz2.detect(direction,posT)) then
  147.    if(not poz2.dig(direction,posT)) then
  148.     return false
  149.    end
  150.   end
  151.  
  152.   if poz2.go(direction,posT) then
  153.    return true
  154.   else
  155.    if turtle.getFuelLevel() == 0 then
  156.     if not doRefuel or not doRefuel() then
  157.      return false
  158.     end
  159.    end
  160.    os.sleep(1)
  161.   end
  162.  end --while
  163. end
  164.  
  165. function digLoop(iters,direction,posT,refuel)
  166.  if posT==nil then error("Error: posT is nil") end
  167.  direction=poz2.getAbsoluteDirection(direction,posT)
  168.  return poz2.doLoop(iters,detectDigGo2,direction,posT,refuel)
  169. end
  170.  
  171. function digToCoordsHelp(fieldName,targetCoord,posT,refuel)
  172.  local iters=targetCoord-posT[fieldName]
  173.  if iters==0 then
  174.   return true, 0
  175.  end
  176.  local direction=poz2.getFieldToDirection(fieldName,iters)
  177.  if iters<0 then
  178.   local length=-digLoop(-iters,direction,posT,refuel)
  179.   return length==iters, length
  180.  else
  181.   local length=digLoop(iters,direction,posT,refuel)
  182.   return length==iters, length
  183.  end
  184. end
  185.  
  186. function digToCoords(x,y,z,posT,refuel,f)
  187.  digToCoordsHelp("x",x,posT,refuel)
  188.  digToCoordsHelp("y",y,posT,refuel)
  189.  digToCoordsHelp("z",z,posT,refuel)
  190.  if f~=nil then
  191.   poz2.turn(f,posT)
  192.  end
  193.  return posT["x"]==x and posT["y"]==y and posT["z"]==z
  194. end
  195.  
  196. function digToCoords2(wantedT,posT,refuel)
  197.  return digToCoords(wantedT["x"],wantedT["y"],wantedT["z"],posT,refuel,wantedT["f"])
  198. end
  199.  
  200. function doRefuel(amount)
  201.  if amount==nil then
  202.   os.run({},"rom/programs/turtle/refuel")
  203.   --shell.run("refuel")
  204.  else
  205.   --shell.run("refuel",tostring(amount))
  206.   os.run({},"rom/programs/turtle/refuel",tostring(amount))
  207.  end
  208.  return turtle.getFuelLevel()>0
  209. end
  210.  
  211. function refuelToLevel(level)
  212.  local fuelLevel=turtle.getFuelLevel()
  213.  while(fuelLevel<level) do
  214.   doRefuel()
  215.   if(fuelLevel==turtle.getFuelLevel()) then
  216.    return false
  217.   end
  218.   fuelLevel=turtle.getFuelLevel()
  219.  end
  220.  return true
  221. end
  222.  
  223. function digShape(holes,refuel,posT,backOnFail)
  224.  for k,v in ipairs(holes) do
  225.   local direction,distance=unpack(v)
  226.   local distanceRes=digLoop(distance,direction,posT,refuel)
  227.  
  228.   --failed so try to undo the moves
  229.   if distance ~= distanceRes then
  230.    if not backOnFail then return false,false end
  231.    distance=distanceRes
  232.    distanceRes=digLoop(distance,poz2.getReverse(direction),posT,refuel)
  233.    if distance ~= distanceRes then return false,false end
  234.    k=k-1
  235.    
  236.    while k>0 do
  237.     v=holes[k]
  238.     local direction,distance=unpack(v)
  239.     distanceRes=digLoop(distance,poz2.getReverse(direction),posT,refuel)
  240.     if distance ~= distanceRes then return false,false end
  241.     k=k-1
  242.    end--while
  243.    return false,true
  244.   end--if
  245.  end--for
  246.  return true,false
  247. end
  248.  
  249. function mineUHole(direction1, length1, direction2,length2,posT,refuel,backoffDistance)
  250.  direction1=poz2.getAbsoluteDirection(direction1)
  251.  direction2=poz2.getAbsoluteDirection(direction2)
  252.  direction3=poz2.getReverse(direction1)
  253.  --mine part 1 of u
  254.  local length3=digLoop(length1,direction1,posT,refuel)
  255.  
  256.  --mine backoff distance up, to avoid bedrock
  257.  if backoffDistance ~= nil then
  258.   length3=length3-digLoop(backoffDistance,direction3,posT,refuel)
  259.  end
  260.  
  261.  local succes, isBack = digShape({{direction2,length2},{direction3,length3}},refuel,posT,true)
  262.  if succes then return true,false,length3 end
  263.  if isBack then
  264.   local backRes=digLoop(length3,poz2.getReverse(direction1),posT,refuel)
  265.   if backRes~=length3 then
  266.    return false,false,length3
  267.   else
  268.    return false,true,length3
  269.   end
  270.  end
  271.  return false,false,length3
  272.  
  273. end
  274.  
  275. function mine4by4(holeDirection,depth,extendDirection1,extendDirection2,posT,refuel,backoffDistance)
  276.  local succes, _, depth = mineUHole(holeDirection, depth, extendDirection1,1,posT,refuel,backoffDistance)
  277.  if not succes then return false end
  278.  if digLoop(1,extendDirection2,posT,refuel) ~= 1 then return false end
  279.  local succes, _, _=mineUHole(holeDirection, depth, poz2.getReverse(extendDirection1),1,posT,refuel,backoffDistance)
  280.  if not succes then return false  end
  281.  if digLoop(1,poz2.getReverse(extendDirection2),posT,refuel) ~= 1 then return false end
  282.  poz2.turn(extendDirection1,posT)
  283.  return true
  284. end
  285.  
  286. function emptyInventory(direction,posT)
  287.  local isEmpty=true
  288.  local i=1
  289.  while(i<=16) do
  290.   turtle.select(i)
  291.   poz2.drop(direction,posT,64)
  292.   isEmpty=isEmpty and turtle.getItemCount(i)==0
  293.   i=i+1
  294.  end
  295.  return isEmpty
  296. end
  297.  
  298.  
  299. --uses a chest infront of it to empty it's inventory
  300. --tries to refuel before emptiying if below 2000 fuel
  301. --digs 4x4 holes one is hole 0 0
  302. --left is how many holes to the left of first hole
  303. --right is how many holes to the right of first hole
  304. --back is the amount opposite side of chest from the first hole
  305. --so 1,1,1 makes 6 holes
  306. --example poz2a.miningProgram1(150,1,1,1,posT)
  307. function miningProgram1(depth,left,right,back,posT)
  308.  local chestPos=poz2.copyPos(posT)
  309.  
  310.  poz2.turn("r",posT)
  311.  local rightDir=posT["f"]
  312.  local leftDir=poz2.getReverse(rightDir)
  313.  poz2.turn("r",posT)
  314.  local backDir=posT["f"]
  315.  
  316.  print(rightDir," ",leftDir," ",backDir)
  317.  
  318.  local fuelLevel=2000
  319.  refuelToLevel(fuelLevel)
  320.  
  321.  local i=-left
  322.  local j=0
  323.  while(i<=right) do
  324.   j=0
  325.   while(j<=back) do
  326.    --refuel and fuel check
  327.    refuelToLevel(fuelLevel)
  328.    if turtle.getFuelLevel()<500 then
  329.     print("low fuel level")
  330.     return false
  331.    end
  332.    
  333.    --calculate dig position
  334.    local wantedPos=poz2.copyPos(chestPos)
  335.    local coordName, change=poz2.getCoordinateChange(rightDir,i*2)
  336.    wantedPos[coordName]=wantedPos[coordName]+change
  337.    local coordName, change=poz2.getCoordinateChange(backDir,j*2)
  338.    wantedPos[coordName]=wantedPos[coordName]+change
  339.  
  340.    --go to dig position
  341.    digToCoords(wantedPos["x"],wantedPos["y"],wantedPos["z"],posT,refuel)
  342.    
  343.    --dig
  344.    if not mine4by4("d",depth,rightDir,backDir,posT,refuel,7) then
  345.      return false
  346.    end
  347.    --poz2.dig("d",posT)
  348.    --back to chest
  349.    digToCoords(chestPos["x"],chestPos["y"],chestPos["z"],posT,refuel)
  350.    --refuel
  351.    refuelToLevel(fuelLevel)
  352.    --empty inventory
  353.    if not emptyInventory(chestPos["f"],posT) then
  354.     print("chest is full")
  355.     return false
  356.    end
  357.  
  358.    j=j+1
  359.   end
  360.   i=i+1
  361.  end
  362.  return true
  363. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement