Advertisement
Serval_Mart-Lag

minage opti Turtle Lavres6

May 13th, 2020
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 12.92 KB | None | 0 0
  1. --[[
  2. https://computercraftfr.forumgaming.fr/t553-minage-version-2-0-minage-opti-turtle
  3. Program by cedmeu
  4.  
  5. Version 2.0 changelog :
  6. - add turtle.inspect()
  7. - add check before going up or place up in case of monsters, block, etc...
  8. - add last inventory emptying after going back to start point
  9.  
  10. Licence : CC BY NC SA
  11. https://creativecommons.org/licenses/by-nc-sa/3.0/fr/
  12.  
  13. Edited by Lavres6, 2020-05-12
  14. ]]--
  15.  
  16. local fonctionnement = "normal"                 -- choix du vidage : "normal" (avec coffre au départ) ou "enderchest"
  17. -- normal : coffre récup derrière départ tortue, coffre charbon au dessus tortue
  18. -- enderchest : voir variable pour emplacements des enderchest dans l'inventaire
  19. local direction = 0                             -- direction
  20. local drapeauBedrock = false                    -- indicateur pour savoir si on est arrivé à la bedrock
  21. local profondeur = 0                            -- indique de combien on a creusé
  22. local longueur = 96                             -- indique la longueur (x) de la zone à miner
  23. local largeur = 9                               -- indique la largeur (z) de la zone à miner
  24. local xPosition = 0                             -- indique la position courante en x
  25. local zPosition = 0                             -- indique la position courante en z
  26. local niveauFuelMini = 5                        -- niveau de déplacements auquel on doit refaire le plein de fuel
  27. local niveauCharbonMini = 5                     -- quantité de charbons restants à laquelle on doit refaire le plein de charbon
  28.  
  29. local premierSlot = 2                                   -- premier slot où se trouve le minerai ramassé
  30. local dernierSlot = fonctionnement == "normal" and 16 or 14-- dernier slot à surveiller pour enclencher le vidage de l'inventaire
  31. local enderchestSlot = 15                               -- slot où se trouve l'enderchest pour les minerais
  32. local enderchestCharbonSlot = 16                        -- slot où se trouve l'enderchest pour le charbon
  33. local charbonSlot = 1                                   -- slot ou est stocké le charbon
  34.  
  35. local plan = {}                                                 -- tableau pour stocker les coordonnées relatives des puits de minage.
  36.  
  37. local filtre = {"minecraft:gravel", "minecraft:stone", "minecraft:monster_egg"}
  38.  
  39. function compare_mine()                                 -- fonction qui compare et mine, tourne à droite et direction++
  40.     local slot = 0
  41.     local resultat = false
  42.  
  43.     local succ, insp = turtle.inspect()
  44.     for key, value in pairs(filtre) do
  45.         if insp.name == value then
  46.             resultat = true
  47.         end
  48.     end
  49.  
  50.     if resultat == false then
  51.         turtle.dig()
  52.     end
  53.  
  54.     turtle.turnRight()
  55.     direction = direction + 1
  56.  
  57.     testVidage(true)
  58. end
  59.  
  60. function verifFuel()                                    -- vérifie si on a assez de fuel (déplacements) en réserve.
  61.     -- 1 charbon = 96 deplacements, On vérifie le niveau de fuel
  62.     local niveauFuel = turtle.getFuelLevel()
  63.     if niveauFuel ~= "unlimited" and niveauFuel < niveauFuelMini then
  64.         -- On a besoin de faire le plein
  65.         turtle.select(charbonSlot)
  66.         turtle.refuel(1) -- on recharge pour 96 deplacements
  67.         -- et on vérifie s'il nous reste assez de charbon
  68.         if turtle.getItemCount(charbonSlot) < niveauCharbonMini then
  69.             recharge() -- on refait le plein de charbon
  70.         end
  71.     end
  72. end
  73.  
  74. function todirection(todir)
  75.     if (todir + 1) % 4 == direction then
  76.         turtle.turnLeft()
  77.         direction = (direction - 1) % 4
  78.     else
  79.         while todir ~= direction do
  80.             turtle.turnRight()
  81.             direction = (direction + 1) % 4
  82.         end
  83.     end
  84. end
  85.  
  86. function rechargeCharbon()                              -- permet de refaire le plein en charbon
  87.     turtle.select(enderchestCharbonSlot)
  88.     while not turtle.placeUp() do
  89.         sleep(0.1)
  90.         print("fu_turtleplaceup : false :o( a l'attaque !")
  91.         if not turtle.attackUp() then turtle.digUp() end
  92.     end
  93.     turtle.select(charbonSlot)
  94.     turtle.suckUp()
  95.  
  96.     turtle.select(enderchestCharbonSlot)
  97.     turtle.digUp()
  98. end
  99.  
  100. function rechargeCharbonCoffre()
  101.     -- d'abord je sauv les coordonnées x, z, profondeur et direction
  102.     xPositionSv = xPosition
  103.     zPositionSv = zPosition
  104.     profondeurSv = profondeur
  105.     directionSv = direction
  106.  
  107.     -- je remonte à la surface
  108.     while profondeurSv ~= 0 do
  109.         if turtle.detectUp() then turtle.digUp() end
  110.         turtleUp()
  111.         profondeurSv = profondeurSv-1
  112.         verifFuel()
  113.     end
  114.  
  115.     -- je me déplace vers le point de départ
  116.     deplacement(0, 0)
  117.  
  118.     --on prend du charbon dans le coffre au-dessus de la tortue
  119.     turtle.select(charbonSlot)
  120.     turtle.suckUp()
  121.  
  122.     --on retourne au-dessus du puit en cours de minage
  123.     deplacement(xPositionSv, zPositionSv)
  124.  
  125.     --on descend à la dernière profondeur
  126.     while profondeurSv ~= profondeur do
  127.         if turtle.detectDown() then turtle.digDown() end
  128.         turtle.down()
  129.         profondeurSv = profondeurSv+1
  130.         verifFuel()
  131.     end
  132.  
  133.     --on se met dans la bonne direction
  134.     todirection(directionSv)
  135. end
  136.  
  137. function recharge()
  138.     if fonctionnement == "normal" then
  139.         return rechargeCharbonCoffre()
  140.     elseif fonctionnement == "enderchest" then
  141.         return rechargeCharbon()
  142.     end
  143. end
  144.  
  145. function videInventaire()                               -- vide l'inventaire de la tortue dans l'enderchest dédié à ça
  146.     local slot
  147.     turtle.select(enderchestSlot)
  148.     while not turtle.placeUp() do
  149.         sleep(0.1)
  150.         print("fu_turtleplaceup resultat du placeup : false :o( a l'attaque !")
  151.         if not turtle.attackUp() then turtle.digUp() end
  152.     end
  153.     for slot = premierSlot,dernierSlot do
  154.         turtle.select(slot)
  155.         while turtle.getItemCount(slot) > 0 do
  156.             turtle.dropUp(turtle.getItemCount(slot))
  157.             if turtle.getItemCount(slot) > 0 then
  158.                 sleep(0.5)
  159.             end
  160.         end
  161.     end
  162.  
  163.     turtle.select(enderchestSlot)
  164.     turtle.digUp()
  165.  
  166.     turtle.select(charbonSlot)
  167. end
  168.  
  169. function videInventaireCoffre()
  170.     -- d'abord je sauv les coordonnées x, z, profondeur et direction
  171.     xPositionSv = xPosition
  172.     zPositionSv = zPosition
  173.     profondeurSv = profondeur
  174.     directionSv = direction
  175.  
  176.     -- je remonte à la surface
  177.     while profondeurSv ~= 0 do
  178.         if turtle.detectUp() then turtle.digUp() end
  179.         turtleUp()
  180.         profondeurSv = profondeurSv-1
  181.         verifFuel()
  182.     end
  183.  
  184.     -- je me déplace vers le point de départ
  185.     deplacement(0,0)
  186.  
  187.     --on se remet en direction "deux", face au coffre
  188.     todirection(2)
  189.  
  190.     --on vide l'inventaire
  191.     for slot = premierSlot,dernierSlot do
  192.         turtle.select(slot)
  193.         while turtle.getItemCount(slot) > 0 do
  194.             turtle.drop(turtle.getItemCount(slot))
  195.             if turtle.getItemCount(slot) > 0 then
  196.                 sleep(0.5)
  197.             end
  198.         end
  199.     end
  200.     turtle.select(charbonSlot)
  201.  
  202.     --on se remet en direction "zéro"
  203.     todirection(0)
  204.  
  205.     --on retourne au-dessus du puit en cours de minage
  206.     deplacement(xPositionSv, zPositionSv)
  207.  
  208.     --on descend à la dernière profondeur
  209.     while profondeurSv ~= profondeur do
  210.         if turtle.detectDown() then turtle.digDown() end
  211.         turtle.down()
  212.         profondeurSv = profondeurSv + 1
  213.         verifFuel()
  214.     end
  215.  
  216.     --on se met dans la bonne direction
  217.     todirection(directionSv)
  218. end
  219.  
  220. function testVidage(cond)
  221.     if cond and turtle.getItemCount(dernierSlot) > 0 then  -- on vérifie si on doit vider l'inventaire de la tortue
  222.         print("vidage inventaire "..fonctionnement.." ; prof "..profondeur.." ; nbitem ds slot "..dernierSlot.." : "..turtle.getItemCount(dernierSlot).." ; ")
  223.         if fonctionnement == "normal" then
  224.             return videInventaireCoffre()
  225.         elseif fonctionnement == "enderchest" then
  226.             return videInventaire()
  227.         end
  228.     end
  229. end
  230.  
  231. function calcPlan()                                     -- calcule les emplacements des puits de minage
  232.     local x, z, temp, xTemp
  233.     temp = 1
  234.     for z = 0,(largeur - 1) do
  235.         if z % 2 == 0 then
  236.             x = (-2 * z) % 5
  237.             while x < longueur do
  238.                 plan[temp] = {x, z}
  239.                 temp = temp + 1
  240.                 x = x + 5
  241.             end
  242.         else
  243.             x = longueur - 1 - (2 * z + longueur + 4) % 5
  244.             while x >= 0 do
  245.                 plan[temp] = {x, z}
  246.                 temp = temp + 1
  247.                 x = x - 5
  248.             end
  249.         end
  250.         z = z + 1
  251.     end
  252. end
  253.  
  254. function deplacement(r,s)                               -- pour aller à des coordonnées précises
  255.  
  256.     print("("..xPosition.." ; "..zPosition..") => ("..r.." ; "..s..")")
  257.  
  258.     r = tonumber(r)
  259.     s = tonumber(s)
  260.  
  261.     if r ~= xPosition then
  262.         local nbX = math.abs(r - xPosition)
  263.         todirection(r < xPosition and 2 or 0)
  264.         while nbX > 0 do
  265.             while not turtle.forward() do
  266.                 if not turtle.attack() then turtle.dig() end
  267.                 turtle.attack()
  268.                 testVidage(r ~= 0 or s ~= 0)
  269.             end
  270.             xPosition = xPosition - direction + 1
  271.             verifFuel()
  272.             nbX = nbX - 1
  273.         end
  274.     end
  275.  
  276.     if s ~= zPosition then
  277.         local nbZ = math.abs(s - zPosition)
  278.         todirection(s < zPosition and 3 or 1)
  279.         while nbZ > 0 do
  280.             while not turtle.forward() do
  281.                 if not turtle.attack() then turtle.dig() end
  282.                 testVidage(r ~= 0 or s ~= 0)
  283.             end
  284.             zPosition = zPosition - direction + 2
  285.             verifFuel()
  286.             nbZ = nbZ - 1
  287.         end
  288.     end
  289.  
  290.     todirection(0)
  291. end
  292.  
  293. function turtleDown()
  294.     if turtle.detectDown() then   -- on vérifie s'il y a un bloc en dessous
  295.         if not turtle.digDown() then -- si on n'arrive pas à creuser en dessous, alors c'est la bedrock
  296.             drapeauBedrock = true             -- donc je met le drapeau à true pour sortir de la boucle
  297.         end
  298.     end
  299.     if not drapeauBedrock then
  300.         testVidage(true)
  301.         while not turtle.down() do
  302.             sleep(0.1)
  303.             print("fu_turtledown resultat du down : false :o( ")
  304.             if not turtle.attackDown() then turtle.digDown() end
  305.         end
  306.         profondeur = profondeur + 1
  307.         verifFuel()
  308.     end
  309. end
  310.  
  311. function turtleUp()
  312.     if not turtle.attackUp() then turtle.digUp() end
  313.     while not turtle.up() do
  314.         sleep(0.1)
  315.         print("fu_turtleup resultat du up : false :o( a l'attaque !")
  316.         if not turtle.attackUp() then turtle.digUp() end
  317.     end
  318. end
  319.  
  320. --********************************************--
  321. --********** Programme principal *************--
  322. --********************************************--
  323.  
  324. local p = 1
  325.  
  326. if fs.exists("minage.txt") then
  327.     local file = fs.open("minage.txt","r")
  328.     local data = file.readAll()
  329.     file.close()
  330.     data = textutils.unserialize(data)
  331.     largeur = data.largeur
  332.     longueur = data.longueur
  333.     p = data.puis
  334.     print("Largeur (vers la droite) : "..largeur)
  335.     print("Longueur (en face) : "..longueur)
  336.     print("Commencera au puis n°"..p)
  337. else
  338.     print("Entrez les dimensions de la zone à miner.")
  339.     print("Largeur (vers la droite) : ")
  340.     largeur = tonumber(read())
  341.     print("Longueur (en face) : ")
  342.     longueur = tonumber(read())
  343.     local file = fs.open("minage.txt","w")
  344.     file.write(textutils.serialize({largeur=largeur, longueur=longueur, puis=1}))
  345.     file.close()
  346. end
  347.  
  348. calcPlan() -- on calcule les emplacements des puits de forage
  349.  
  350. local pmax = #plan
  351.  
  352. -- ici, affichage du nombre de puits à creuser et attente confirmation pour commencer
  353. -- puis à chaque down ou up, affichage de la profondeur et màj du "puit en cours/nb puits total"
  354. -- et affichage lorsqu'on vide l'inventaire ou que l'on reprend du charbon
  355.  
  356. print("Nombre de puits à creuser : "..#plan)
  357. print("Appuyez sur [ENTREE] pour commencer !")
  358. read()
  359. turtle.select(charbonSlot)
  360. while p <= pmax do
  361.     print("Puit n°"..p.."/"..pmax)
  362.     drapeauBedrock = false --avant tout, on reset ce flag
  363.     verifFuel() -- on refait le plein si besoin
  364.     deplacement(unpack(plan[p])) -- puis on se déplace sur le puit à forer
  365.     turtleDown()
  366.  
  367.     while not drapeauBedrock do
  368.         while direction ~= 4 do
  369.             compare_mine()
  370.         end
  371.         direction=0
  372.         turtleDown()
  373.     end
  374.  
  375.     local file = fs.open("minage.txt","w")
  376.     file.write(textutils.serialize({largeur=largeur, longueur=longueur, puis=p+1}))
  377.     file.close()
  378.  
  379.     while profondeur ~= 0 do
  380.         turtleUp()
  381.         profondeur = profondeur-1
  382.         verifFuel()
  383.     end
  384.  
  385.     p = p + 1
  386. end
  387.  
  388. deplacement(0,0) -- retour au point de départ
  389. if fonctionnement == "normal" then
  390.     return videInventaireCoffre()
  391. elseif fonctionnement == "enderchest" then
  392.     return videInventaire()
  393. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement