Advertisement
MarcPino

ChatGPT's well digger

Apr 11th, 2025 (edited)
313
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 8.47 KB | None | 0 0
  1. ----------------------------------------------------------------
  2. -- Script pour creuser un puits vertical (CC:Tweaked) de dimensions X par Y
  3. -- Zone de creusage de [1,0,-1] à [1+X, Y, bedrock]
  4. -- Auto-dumping et auto-refuel uniquement lorsque l'inventaire est presque plein.
  5. --
  6. -- Hypothèses :
  7. -- - La Turtle démarre en [0,0,0], face +X.
  8. -- - Un coffre est à gauche ([0,-1,0]) pour le dump (sauf items "coal" ou "charcoal").
  9. -- - Un coffre est à droite ([0,1,0]) pour le re‑fuel (contenant du coal ou charcoal).
  10. ----------------------------------------------------------------
  11.  
  12. -- Variables de suivi de position et orientation
  13. local pos = {x = 0, y = 0, z = 0}
  14. -- Orientations : 0 = est (+X), 1 = nord (+Y), 2 = ouest (-X), 3 = sud (-Y)
  15. local facing = 0
  16.  
  17. -------------------------------------------------
  18. -- Fonctions de mise à jour de la position et rotation
  19. -------------------------------------------------
  20. local function updatePos(dx, dy, dz)
  21.   pos.x = pos.x + dx
  22.   pos.y = pos.y + dy
  23.   pos.z = pos.z + dz
  24. end
  25.  
  26. local function turnLeft()
  27.   turtle.turnLeft()
  28.   facing = (facing + 1) % 4
  29. end
  30.  
  31. local function turnRight()
  32.   turtle.turnRight()
  33.   facing = (facing + 3) % 4
  34. end
  35.  
  36. local function turnAround()
  37.   turnLeft()
  38.   turnLeft()
  39. end
  40.  
  41. -------------------------------------------------
  42. -- Fonctions de déplacement avec creusage si besoin
  43. -------------------------------------------------
  44. local function forward()
  45.   while not turtle.forward() do
  46.     if turtle.detect() then
  47.       turtle.dig()
  48.     else
  49.       sleep(0.5)
  50.     end
  51.   end
  52.   if facing == 0 then updatePos(1,0,0)
  53.   elseif facing == 2 then updatePos(-1,0,0)
  54.   elseif facing == 1 then updatePos(0,1,0)
  55.   elseif facing == 3 then updatePos(0,-1,0)
  56.   end
  57. end
  58.  
  59. local function up()
  60.   while not turtle.up() do
  61.     if turtle.detectUp() then turtle.digUp() else sleep(0.5) end
  62.   end
  63.   updatePos(0,0,1)
  64. end
  65.  
  66. local function down()
  67.   while not turtle.down() do
  68.     if turtle.detectDown() then turtle.digDown() else sleep(0.5) end
  69.   end
  70.   updatePos(0,0,-1)
  71. end
  72.  
  73. -------------------------------------------------
  74. -- Déplacement vers une destination donnée
  75. -- On déplace d'abord en X, puis en Y, enfin en Z
  76. -------------------------------------------------
  77. local function faceDirection(targetDir)
  78.   local diff = (targetDir - facing) % 4
  79.   if diff == 1 then
  80.     turnLeft()
  81.   elseif diff == 2 then
  82.     turnAround()
  83.   elseif diff == 3 then
  84.     turnRight()
  85.   end
  86. end
  87.  
  88. local function goTo(targetX, targetY, targetZ)
  89.   -- Déplacement en X
  90.   local dx = targetX - pos.x
  91.   if dx ~= 0 then
  92.     if dx > 0 then
  93.       faceDirection(0)
  94.       for i = 1, math.abs(dx) do forward() end
  95.     else
  96.       faceDirection(2)
  97.       for i = 1, math.abs(dx) do forward() end
  98.     end
  99.   end
  100.   -- Déplacement en Y
  101.   local dy = targetY - pos.y
  102.   if dy ~= 0 then
  103.     if dy > 0 then
  104.       faceDirection(1)
  105.       for i = 1, math.abs(dy) do forward() end
  106.     else
  107.       faceDirection(3)
  108.       for i = 1, math.abs(dy) do forward() end
  109.     end
  110.   end
  111.   -- Déplacement en Z
  112.   local dz = targetZ - pos.z
  113.   if dz > 0 then
  114.     for i = 1, dz do up() end
  115.   elseif dz < 0 then
  116.     for i = 1, -dz do down() end
  117.   end
  118. end
  119.  
  120. -------------------------------------------------
  121. -- Gestion de l'inventaire : dump et refuel
  122. -------------------------------------------------
  123. local function dumpInventory()
  124.   print("Dump de l'inventaire...")
  125.   -- Se tourner vers la gauche (coffre de dump)
  126.   faceDirection(1)
  127.   turtle.forward()  -- Aller dans le coffre
  128.   for slot = 1, 16 do
  129.     local item = turtle.getItemDetail(slot)
  130.     if item then
  131.       -- Conserver les items de fuel (coal/charcoal)
  132.       if not (string.find(item.name, "coal") or string.find(item.name, "charcoal")) then
  133.         turtle.select(slot)
  134.         turtle.drop()
  135.       end
  136.     end
  137.   end
  138.   turtle.select(1)
  139.   turnAround()
  140.   while not turtle.forward() do sleep(0.5) end
  141.   faceDirection(0)
  142. end
  143.  
  144. local function refuelIfNeeded()
  145.   if turtle.getFuelLevel() == "unlimited" then return end
  146.   local fuelLevel = turtle.getFuelLevel()
  147.   if fuelLevel < 100 then  -- Seuil modifiable selon les besoins
  148.     print("Fuel insuffisant ("..fuelLevel.."). Refuel en cours...")
  149.     faceDirection(3)  -- se tourner vers la droite
  150.     turtle.forward()  -- Aller dans le coffre de fuel
  151.     for i = 1, 16 do turtle.suck() end
  152.     for slot = 1, 16 do
  153.       turtle.select(slot)
  154.       turtle.refuel()
  155.     end
  156.     turtle.select(1)
  157.     turnAround()
  158.     while not turtle.forward() do sleep(0.5) end
  159.     faceDirection(0)
  160.   end
  161. end
  162.  
  163. -------------------------------------------------
  164. -- Retour à la base pour dump et refuel, avec possibilité de reprendre à une position donnée
  165. -------------------------------------------------
  166. local function returnToStart(resumeX, resumeY, resumeZ)
  167.   print("Retour au point de départ pour dump & refuel...")
  168.   goTo(0,0,0)
  169.   dumpInventory()
  170.   refuelIfNeeded()
  171.   if resumeX and resumeY and resumeZ then
  172.     goTo(resumeX, resumeY, resumeZ)
  173.   end
  174. end
  175.  
  176. -------------------------------------------------
  177. -- Fonction utilitaire pour vérifier si l'inventaire est presque plein
  178. -------------------------------------------------
  179. local function inventoryAlmostFull(threshold)
  180.   local freeSlots = 0
  181.   for slot = 1, 16 do
  182.     if not turtle.getItemDetail(slot) then
  183.       freeSlots = freeSlots + 1
  184.     end
  185.   end
  186.   return freeSlots < threshold
  187. end
  188.  
  189. -------------------------------------------------
  190. -- Excavation d'une couche horizontale de la zone
  191. -- La zone est balayée en zigzag et, à chaque déplacement,
  192. -- on vérifie que l'inventaire n'est pas presque plein.
  193. -------------------------------------------------
  194. local function digLayer(X, Y)
  195.   -- La zone de creusage commence en [1,0] (plan local)
  196.   for j = 0, Y - 1 do
  197.     for i = 1, X do
  198.       -- Creuser le bloc situé en dessous s'il est présent
  199.       while turtle.detectDown() do
  200.         turtle.digDown()
  201.         sleep(0.2)
  202.       end
  203.      
  204.       if i < X then
  205.         forward()
  206.         -- Vérifier l'inventaire après un déplacement
  207.         if inventoryAlmostFull(3) then
  208.           print("Inventaire presque plein au niveau de la couche. Dump en cours...")
  209.           local resumeX, resumeY, resumeZ = pos.x, pos.y, pos.z
  210.           returnToStart(resumeX, resumeY, resumeZ)
  211.         end
  212.       end
  213.     end
  214.     -- Si ce n'est pas la dernière rangée, passer à la rangée suivante en zigzag
  215.     if j < Y - 1 then
  216.       if (j % 2 == 0) then
  217.         turnRight()
  218.         forward()
  219.         turnRight()
  220.       else
  221.         turnLeft()
  222.         forward()
  223.         turnLeft()
  224.       end
  225.       if inventoryAlmostFull(3) then
  226.         print("Inventaire presque plein entre les rangées. Dump en cours...")
  227.         local resumeX, resumeY, resumeZ = pos.x, pos.y, pos.z
  228.         returnToStart(resumeX, resumeY, resumeZ)
  229.       end
  230.     end
  231.   end
  232.   -- Repositionnement pour revenir au coin de départ de la couche
  233.   if (Y % 2 == 0) then
  234.     faceDirection(2)
  235.     for i = 1, X - 1 do forward() end
  236.   end
  237. end
  238.  
  239. -------------------------------------------------
  240. -- Vérification de la présence de bedrock en dessous
  241. -------------------------------------------------
  242. local function isBedrockBelow()
  243.   local success, data = turtle.inspectDown()
  244.   if success and data.name == "minecraft:bedrock" then
  245.     return true
  246.   end
  247.   return false
  248. end
  249.  
  250. -------------------------------------------------
  251. -- Programme principal
  252. -------------------------------------------------
  253. local function main()
  254.   if #arg < 2 then
  255.     print("Usage: lua well.lua <X> <Y>")
  256.     return
  257.   end
  258.  
  259.   local X = tonumber(arg[1])
  260.   local Y = tonumber(arg[2])
  261.   if not X or not Y then
  262.     print("Dimensions invalides.")
  263.     return
  264.   end
  265.  
  266.   print("Début de l'excavation d'un puits de dimension "..X.."x"..Y)
  267.  
  268.   -- Se positionner au coin en haut à gauche de la zone de creusage
  269.   goTo(1, 0, 0)
  270.   -- Descendre d'une case pour commencer à la couche z = -1
  271.   down()
  272.  
  273.   local layer = 1
  274.   while true do
  275.     print("Creusage de la couche "..layer.." (z = "..pos.z..")")
  276.     digLayer(X, Y)
  277.    
  278.     -- Vérifier si le bedrock est présent sous la couche actuelle
  279.     if isBedrockBelow() then
  280.       print("Bedrock détecté. Fin de l'excavation.")
  281.       break
  282.     end
  283.    
  284.     -- Fin de la couche : retourner au point de départ pour dump/refuel si nécessaire
  285.     returnToStart()
  286.     goTo(1, 0, pos.z)
  287.     down()
  288.     layer = layer + 1
  289.   end
  290.  
  291.   returnToStart()
  292.   print("Puits terminé en profondeur "..(-pos.z).." blocs.")
  293. end
  294.  
  295. main()
Tags: cc:tweaked
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement