agot137

turtle_miner.lua

Aug 5th, 2025 (edited)
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.01 KB | None | 0 0
  1. local modemSide = "left"
  2. local SIZE = 5
  3.  
  4. assert(peripheral.isPresent(modemSide), "Wireless modem kell a Turtle bal oldalára!")
  5. rednet.open(modemSide)
  6.  
  7. -- Kezdőpont
  8. local x0, y0, z0 = gps.locate() x0, y0, z0 = x0 or 0, y0 or 0, z0 or 0
  9. local currX, currY, currZ = x0, y0, z0
  10. local facing = 1 -- 1 = EAST, mert az első sorban jobbra kell mennie!
  11. local state = "mine"
  12.  
  13. local function forward()
  14. if turtle.forward() then
  15. if facing == 0 then currZ = currZ - 1
  16. elseif facing == 1 then currX = currX + 1
  17. elseif facing == 2 then currZ = currZ + 1
  18. elseif facing == 3 then currX = currX - 1 end
  19. return true
  20. end
  21. return false
  22. end
  23.  
  24. local function turnLeft() facing = (facing + 3) % 4; turtle.turnLeft() end
  25. local function turnRight() facing = (facing + 1) % 4; turtle.turnRight() end
  26. local function down() if turtle.down() then currY = currY - 1; return true end return false end
  27. local function up() if turtle.up() then currY = currY + 1; return true end return false end
  28.  
  29. local function goTo(x, y, z)
  30. while currY < y do up() end
  31. while currY > y do down() end
  32. while currX < x do while facing ~= 1 do turnRight() end; forward() end
  33. while currX > x do while facing ~= 3 do turnRight() end; forward() end
  34. while currZ < z do while facing ~= 2 do turnRight() end; forward() end
  35. while currZ > z do while facing ~= 0 do turnRight() end; forward() end
  36. end
  37.  
  38. local function refuelIfNeeded()
  39. if turtle.getFuelLevel() < 20 and turtle.getItemCount(1) > 0 then
  40. turtle.select(1) turtle.refuel(1)
  41. end
  42. end
  43.  
  44. local function isInventoryFull()
  45. for i=2,16 do if turtle.getItemCount(i)==0 then return false end end
  46. return true
  47. end
  48.  
  49. local function dropAllExceptFuel()
  50. for i=2,16 do turtle.select(i) turtle.drop() end
  51. turtle.select(1)
  52. end
  53.  
  54. local function reportStatus(rel_x, rel_z, layerStartX, layerStartZ)
  55. local status = {
  56. id = os.getComputerID(),
  57. active = true,
  58. x = currX, y = currY, z = currZ,
  59. fuel = turtle.getFuelLevel(),
  60. rel_x = rel_x, rel_z = rel_z,
  61. layerStartX = layerStartX, layerStartZ = layerStartZ
  62. }
  63. rednet.broadcast(textutils.serialize(status), "turtle_status")
  64. end
  65.  
  66. local function mineSnake()
  67. -- Bal alsó sarokban indul keletre (facing = 1)
  68. local layerStartX, layerStartZ = currX, currZ
  69. local rel_x, rel_z = 1, 1
  70. for row = 1, SIZE do
  71. -- 5 mezőt megy minden sorban (első sor: 1,1 .. 5,1; második: 5,2 .. 1,2, stb.)
  72. for step = 1, SIZE-1 do
  73. turtle.dig()
  74. forward()
  75. if (row % 2 == 1) then rel_x = rel_x + 1 else rel_x = rel_x - 1 end
  76. reportStatus(rel_x, rel_z, layerStartX, layerStartZ)
  77. refuelIfNeeded()
  78. if isInventoryFull() then
  79. goTo(layerStartX, currY, layerStartZ)
  80. dropAllExceptFuel()
  81. goTo(currX, currY, currZ)
  82. end
  83. end
  84. -- Sor végén, ha nem az utolsó sor, ásson le!
  85. if row < SIZE then
  86. if (row % 2 == 1) then turnRight() else turnLeft() end
  87. turtle.digDown()
  88. if down() then
  89. rel_z = rel_z + 1
  90. reportStatus(rel_x, rel_z, layerStartX, layerStartZ)
  91. else
  92. return
  93. end
  94. if (row % 2 == 1) then turnRight() else turnLeft() end
  95. end
  96. end
  97. end
  98.  
  99. local function mineFull()
  100. while true do
  101. mineSnake()
  102. -- Réteg után vissza bal alsó sarokba, majd új réteg le
  103. goTo(x0, currY, z0)
  104. if not turtle.detectDown() then
  105. turtle.digDown()
  106. if not down() then break end
  107. else
  108. break
  109. end
  110. end
  111. end
  112.  
  113. parallel.waitForAny(
  114. function()
  115. while true do
  116. local _, msg, _ = rednet.receive("turtle_cmd")
  117. if msg == "home" then
  118. state = "home"
  119. elseif msg == "resume" then
  120. state = "mine"
  121. end
  122. end
  123. end,
  124. function()
  125. while true do
  126. if state == "home" then
  127. goTo(x0, y0, z0)
  128. while state == "home" do os.sleep(0.1) end
  129. elseif state == "mine" then
  130. mineFull()
  131. goTo(x0, y0, z0)
  132. while state == "home" do os.sleep(0.1) end
  133. end
  134. end
  135. end
  136. )
  137.  
Advertisement
Add Comment
Please, Sign In to add comment