Advertisement
Le_JuiceBOX

[Module] turtleBrain.lua

Mar 29th, 2024 (edited)
888
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 10.91 KB | None | 0 0
  1. -- 4YV4ewAY
  2. local fileHelper = require("/fileHelper")
  3.  
  4. local FILE_HASMOVED = "/temp/mine_has_made_move.txt"
  5. local MOVE_DELAY = 0.5
  6. --=================================================================================================================
  7. --// Enums
  8. --=================================================================================================================
  9.  
  10. local module = {}
  11. module.Dir = {
  12.     N = 1,
  13.     E = 2,
  14.     S = 3,
  15.     W = 4,
  16. }
  17.  
  18. --=================================================================================================================
  19. --// TurtleBrain
  20. --=================================================================================================================
  21.  
  22. module.__index = module
  23.  
  24. function module:new(navDataSavePath)
  25.     local self = setmetatable({}, module)
  26.  
  27.     self.CurrentDir = 1
  28.     self.X = 0
  29.     self.Y = 0
  30.     self.Z = 0
  31.    
  32.     self.navSavePath = navDataSavePath or false
  33.  
  34.     self.navLast = false
  35.     if self.navSavePath then
  36.         self.navLast = string.gsub(navDataSavePath,".txt","_last.txt")
  37.         fileHelper.setLines(FILE_HASMOVED,{"1"})
  38.     end
  39.  
  40.     self.useToolForward = turtle.dig
  41.     return self
  42. end
  43.  
  44. --=================================================================================================================
  45. --// Turtle Navigation
  46. --=================================================================================================================
  47.  
  48. function module:forwardUntilBlock()
  49.     self:setHasMoved(false)
  50.     self:saveLastNav()
  51.     if self.CurrentDir == module.Dir.N then
  52.         self.Z = self.Z + 1
  53.     elseif self.CurrentDir == module.Dir.S then
  54.         self.Z = self.Z - 1
  55.     elseif self.CurrentDir == module.Dir.E then
  56.         self.X = self.X + 1
  57.     elseif self.CurrentDir == module.Dir.W then
  58.         self.X = self.X - 1
  59.     end
  60.     self:saveNav()
  61.     repeat until turtle.forward()
  62.     os.sleep(MOVE_DELAY)
  63.     self:setHasMoved(true)
  64. end
  65.  
  66. function module:forceForward(times, ignoreTurts)
  67.     ignoreTurts = ignoreTurts or false
  68.     times = times or 1
  69.     if times == 0 then return; end
  70.     turtle.select(1)
  71.     for i = 1, times do
  72.         self:setHasMoved(false)
  73.         self:saveLastNav()
  74.         if self.CurrentDir == module.Dir.N then
  75.             self.Z = self.Z + 1
  76.         elseif self.CurrentDir == module.Dir.S then
  77.             self.Z = self.Z - 1
  78.         elseif self.CurrentDir == module.Dir.E then
  79.             self.X = self.X + 1
  80.         elseif self.CurrentDir == module.Dir.W then
  81.             self.X = self.X - 1
  82.         end
  83.         self:saveNav()
  84.                
  85.         -- wait for no turtle
  86.         if ignoreTurts == false then
  87.             local isBlock,data = turtle.inspect()
  88.             if isBlock and string.find(data.name,"computercraft:turtle") then
  89.                 repeat os.sleep(0.25) until not turtle.inspect()
  90.             end
  91.         end
  92.        
  93.         repeat turtle.dig() until turtle.forward()
  94.         os.sleep(MOVE_DELAY)
  95.         self:setHasMoved(true)
  96.     end
  97. end
  98.  
  99. function module:forceUp(times,ignoreTurts)
  100.     ignoreTurts = ignoreTurts or false
  101.     times = times or 1
  102.     if times == 0 then return; end
  103.     turtle.select(1)
  104.     for i = 1, times do
  105.         self:setHasMoved(false)
  106.         self:saveLastNav()
  107.         self.Y = self.Y + 1
  108.         self:saveNav()
  109.  
  110.         -- wait for no turtle
  111.         if ignoreTurts == false then
  112.             local isBlock,data = turtle.inspectUp()
  113.             if isBlock and string.find(data.name,"computercraft:turtle") then
  114.                 repeat os.sleep(0.25) until not turtle.inspectUp()
  115.             end
  116.         end
  117.  
  118.         repeat turtle.digUp() until turtle.up()
  119.         os.sleep(MOVE_DELAY)
  120.         self:setHasMoved(true)
  121.     end
  122. end
  123.  
  124. function module:forceDown(times,ignoreTurts)
  125.     ignoreTurts = ignoreTurts or false
  126.     times = times or 1
  127.     if times == 0 then return; end
  128.     turtle.select(1)
  129.     for i = 1, times do
  130.         self:setHasMoved(false)
  131.         self:saveLastNav()  
  132.         self.Y = self.Y - 1
  133.         self:saveNav()
  134.                
  135.         -- wait for no turtle
  136.         if ignoreTurts == false then
  137.             local isBlock,data = turtle.inspectDown()
  138.             if isBlock and string.find(data.name,"computercraft:turtle") then
  139.                 repeat os.sleep(0.25) until not turtle.inspectDown()
  140.             end
  141.         end
  142.        
  143.         repeat turtle.digDown() until turtle.down()
  144.         os.sleep(MOVE_DELAY)
  145.         self:setHasMoved(true)
  146.     end
  147. end
  148.  
  149.  
  150. function module:turnRight(times)
  151.     times = times or 1
  152.     if times == 0 then return; end
  153.     for i = 1, times do
  154.         self:setHasMoved(false)
  155.         self:saveLastNav()
  156.         self:_changeDir(1)
  157.         self:saveNav()
  158.         turtle.turnRight()
  159.         os.sleep(MOVE_DELAY)
  160.         self:setHasMoved(true)
  161.     end
  162. end
  163.  
  164.  
  165.  
  166. function module:turnLeft(times)
  167.     times = times or 1
  168.     if times == 0 then return; end
  169.     for i = 1, times do
  170.         self:setHasMoved(false)
  171.         self:saveLastNav()
  172.         self:_changeDir(-1)
  173.         self:saveNav()
  174.         turtle.turnLeft()
  175.         os.sleep(MOVE_DELAY)
  176.         self:setHasMoved(true)
  177.     end
  178. end
  179.  
  180. -- order: e.g {3,1,2} for z x y
  181.  
  182. function module:moveTo(x,y,z,order)
  183.     order = order or {2,1,3}
  184.     x = x or self.X
  185.     y = y or self.Y
  186.     z = z or self.Z
  187.     local xDiff = self.X - x
  188.     local yDiff = self.Y - y
  189.     local zDiff = self.Z - z
  190.     local xDir = (((getRelativeSide(self.X,x) > 0) and module.Dir.E) or module.Dir.W)
  191.     local zDir = (((getRelativeSide(self.Z,z) > 0) and module.Dir.N) or module.Dir.S)
  192.     local isAbove = (((getRelativeSide(self.Y,y) > 0) and true) or false)
  193.  
  194.     for _,axis in pairs(order) do
  195.         if axis == 1 then -- MOVE X
  196.             if xDiff ~= 0 then
  197.                 --print("XDir: "..xDir)  
  198.                 self:turnToFace(xDir)
  199.                 self:forceForward(math.abs(xDiff))
  200.             end
  201.         elseif axis == 2 then -- MOVE Y
  202.             if isAbove then
  203.                 self:forceUp(math.abs(yDiff))
  204.             else
  205.                 self:forceDown(math.abs(yDiff))
  206.             end
  207.         elseif axis == 3 then -- MOVE Z
  208.             if zDiff ~= 0 then
  209.                 self:turnToFace(zDir)
  210.                 self:forceForward(math.abs(zDiff))
  211.             end
  212.         end
  213.     end
  214. end
  215.  
  216. function module:turnToFace(dir)
  217.     assert(dir, "Dir is nil.")
  218.     if dir == self.CurrentDir then return; end
  219.     local turnTo = tonumber(dir)
  220.     --print(self.CurrentDir)
  221.     local diff = math.abs(turnTo - self.CurrentDir)
  222.     if dir > self.CurrentDir then
  223.         self:turnRight(diff)
  224.     else
  225.         self:turnLeft(diff)
  226.     end
  227. end
  228.  
  229. function module:getWorldPos()
  230.     settings.load()
  231.     local wx,wy,wz = settings.get("TurtleWorldOrigin",nil)
  232.     if wx then
  233.         return self.x+wx,self.y+wy,self.z+wz
  234.     end
  235. end
  236.  
  237. --=================================================================================================================
  238. --// Turtle
  239. --=================================================================================================================
  240.  
  241. function module:refuelAll()
  242.     for i = 1,16 do
  243.         turtle.select(i)
  244.         turtle.refuel()
  245.     end
  246.     turtle.select(1)
  247. end
  248.  
  249. function module:isInvFull()
  250.     for i = 16,1,-1 do
  251.         turtle.select(i)
  252.         if turtle.getItemCount() == 0 then
  253.             turtle.select(1)
  254.             return false
  255.         end
  256.     end
  257.     turtle.select(1)
  258.     return true
  259. end
  260.  
  261. function module:predictFuelUsageTo(x,y,z) -- predicts the fuel usage to pos
  262.     local blocks =
  263.         (self.X - x) +
  264.         (self.Y - y) +
  265.         (self.Z - z)
  266.     return (blocks)
  267. end
  268.  
  269. function module:predictFuelUsage(x,y,z,x2,y2,z2)
  270.     local blocks =
  271.     (x - x2) +
  272.     (y - y2) +
  273.     (z - z2)
  274.     return (blocks)
  275. end
  276.  
  277. function module:hasEnoughFuel(blocksToTravel)
  278.     return turtle.getFuelLevel() >= blocksToTravel
  279. end
  280.  
  281. function module:getPos()
  282.     return {self.X,self.Y,self.Z}
  283. end
  284.  
  285. function module:emptyInventoryDown(ignoreSlot)
  286.     ignoreSlot = ignoreSlot or -1
  287.     for i = 1,16 do
  288.         if i ~= ignoreSlot then
  289.             turtle.select(i)
  290.             turtle.dropDown()
  291.         end
  292.     end
  293.     turtle.select(1)
  294. end
  295.  
  296.  
  297. --=================================================================================================================
  298. --// Files
  299. --=================================================================================================================
  300.  
  301. function module:deleteNav()
  302.     if not self.navSavePath then return; end
  303.     if fs.exists(self.navSavePath) then
  304.         fs.delete(self.navSavePath)
  305.     end
  306.     if fs.exists(self.navLast) then
  307.         fs.delete(self.navLast)
  308.     end
  309.     if fs.exists(FILE_HASMOVED) then
  310.         fs.delete(FILE_HASMOVED)
  311.     end
  312. end
  313.  
  314. function module:loadNav(useLastNav)
  315.     if self.navSavePath then
  316.         if fs.exists(self.navSavePath) then
  317.             useLastNav = useLastNav or false
  318.             local x,y,z,dir
  319.             if useLastNav then
  320.                 x,y,z,dir = table.unpack(fileHelper.getLines(self.navLast))
  321.             else
  322.                 x,y,z,dir = table.unpack(fileHelper.getLines(self.navSavePath))
  323.             end
  324.             self.X = tonumber(x)
  325.             self.Y = tonumber(y)
  326.             self.Z = tonumber(z)
  327.             self.CurrentDir = tonumber(dir)
  328.             return
  329.         end
  330.     end
  331. end
  332.  
  333. function module:saveNav()
  334.     if self.navSavePath then
  335.         fileHelper.setLines(self.navSavePath, {
  336.             self.X,
  337.             self.Y,
  338.             self.Z,
  339.             self.CurrentDir
  340.         })
  341.     end
  342. end
  343. -- COMBINE INTO ONE NAV FILE, PASTE THIS & MINE.LUA
  344. function module:saveLastNav()
  345.     if self.navSavePath then
  346.         fileHelper.setLines(self.navLast, {
  347.             self.X,
  348.             self.Y,
  349.             self.Z,
  350.             self.CurrentDir
  351.         })
  352.     end
  353. end
  354.  
  355. function module:setHasMoved(bool)
  356.     local s
  357.     if bool then
  358.         s = "1"
  359.     else
  360.         s = "0"
  361.     end
  362.     fileHelper.setLines(FILE_HASMOVED,{s})
  363. end
  364.  
  365. function module:getHasMoved()
  366.     local n = fileHelper.getLines(FILE_HASMOVED)[1]
  367.     return (n == 1)
  368. end
  369.  
  370. --=================================================================================================================
  371. --// Private
  372. --=================================================================================================================
  373.  
  374. function module:_changeDir(inc)
  375.     local pred = self.CurrentDir + inc
  376.     if pred > module.Dir.W then
  377.         pred = module.Dir.N
  378.     elseif pred < 1 then
  379.         pred = module.Dir.W
  380.     end
  381.     self.CurrentDir = pred
  382. end
  383.  
  384. --=================================================================================================================
  385. --// Local
  386. --=================================================================================================================
  387.  
  388. function getRelativeSide(x1,x2)
  389.     return ((x2 >= x1) and 1) or -1
  390. end
  391.  
  392. return module
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement