Le_JuiceBOX

[Module] turtleBrain.lua

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