meuced

Minage Turtle V2.0

Jan 9th, 2017
675
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 16.84 KB | None | 0 0
  1. --[[
  2.  
  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. ]]--
  14.  
  15. local fonctionnement = "normal"                 -- choix du vidage : "normal" (avec coffre au départ) ou "enderchest"
  16.                                                 -- normal : coffre récup derrière départ tortue, coffre charbon au dessus tortue
  17.                                                 -- enderchest : voir variable pour emplacements des enderchest dans l'inventaire
  18. local direction = 0                             -- direction
  19. local drapeauBedrock = false                    -- indicateur pour savoir si on est arrivé à la bedrock
  20. local profondeur = 0                            -- indique de combien on a creusé
  21. local longueur = 96                             -- indique la longueur (x) de la zone à miner
  22. local largeur = 9                               -- indique la largeur (y) de la zone à miner
  23. local xPosition = 0                             -- indique la position courante en x
  24. local zPosition = 0                             -- indique la position courante en z
  25. local niveauFuelMini = 5                        -- niveau de déplacements auquel on doit refaire le plein de fuel
  26. local niveauCharbonMini = 5                     -- quantité de charbons restants à laquelle on doit refaire le plein de charbon
  27.  
  28. local premierSlot = 1                                   -- premier slot où se trouve le minerai ramassé
  29. local dernierSlot = 13                                  -- dernier slot à surveiller pour enclencher le vidage de l'inventaire
  30. if fonctionnement == "normal" then dernierSlot = 15 end  -- si on est en mode normal, on gagne 2 slots d'inventaire
  31. local enderchestSlot = 14                               -- slot où se trouve l'enderchest pour les minerais
  32. local enderchestCharbonSlot = 15                -- slot où se trouve l'enderchest pour le charbon
  33. local charbonSlot = 16                                  -- 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"}
  38.  
  39. --local idAffichage = 22                                  -- id du computer vers lequel on envoie les infos par rednet
  40.  
  41. local idChannel = 123                                   -- num du canal pour envoyer les infos via modem
  42.  
  43. local resDown = true
  44.  
  45. function compare_mine()                                 -- fonction qui compare et mine, tourne à droite et direction++
  46.  
  47.         local slot = 0
  48.         local resultat = false
  49.        
  50. --[[        for slot=1,3 do
  51.                 turtle.select(slot)
  52.                 if turtle.compare() or resultat then
  53.                         resultat = true
  54.                 end
  55.         end
  56. ]]--
  57.         local succ, insp = turtle.inspect()
  58.         for key, value in pairs(filtre) do
  59.             if (insp.name == value) or resultat then
  60.                 resultat = true
  61.             end
  62.         end
  63.  
  64.         if resultat == false then
  65.             turtle.dig()
  66.         end
  67.        
  68.         turtle.turnRight()
  69.         direction=direction+1
  70.        
  71.         if turtle.getItemCount(dernierSlot) > 0 then  -- on vérifie si on doit vider l'inventaire de la tortue
  72.             print("vidage inventaire comp_mine; prof "..profondeur.." ; nbitem ds slot "..dernierSlot.." : "..turtle.getItemCount(dernierSlot).." ; ")
  73.             --videInventaire()
  74.             --videInventaireCoffre()
  75.             return vidage()
  76.         end
  77.        
  78. end
  79.  
  80. function verifFuel()                                    -- vérifie si on a assez de fuel (déplacements) en réserve.
  81.   -- 1 charbon = 96 deplacements
  82.   -- On vérifie le niveau de fuel
  83.         local niveauFuel = turtle.getFuelLevel()
  84.         if (niveauFuel ~= "unlimited") then
  85.                 if (niveauFuel < niveauFuelMini) then
  86.                         -- On a besoin de faire le plein
  87.                         turtle.select(charbonSlot)
  88.                         turtle.refuel(1) -- on recharge pour 96 deplacements
  89.                         -- et on vérifie si il nous reste assez de charbon
  90.                         if turtle.getItemCount(charbonSlot) < niveauCharbonMini then
  91.                                 return recharge() -- on refait le plein de charbon
  92.                         end
  93.                 end
  94.         end
  95. end
  96.  
  97. function rechargeCharbon()                              -- permet de refaire le plein en charbon
  98.        
  99.     turtle.select(enderchestCharbonSlot)
  100.     while turtle.placeUp() == false do
  101.         sleep(0.1)
  102.         print("fu_turtleplaceup resultat du placeup : false :o( a l'attaque !")
  103.         if ( turtle.attackUp() ==false ) then turtle.digUp() end
  104.     end
  105.     turtle.select(charbonSlot)
  106.     turtle.suckUp()
  107.    
  108.     turtle.select(enderchestCharbonSlot)
  109.     turtle.digUp()
  110.        
  111. end
  112.  
  113. function rechargeCharbonCoffre()
  114.  
  115.     -- d'abord je sauv les coordonnées x, z, profondeur et direction
  116.         xPositionSv = xPosition
  117.         zPositionSv = zPosition
  118.         profondeurSv = profondeur
  119.         directionSv = direction
  120.        
  121.         --je préviens que je remonte pour recharger en charbon
  122.         modem.transmit(idChannel,idChannel,"etat:charbon")
  123.        
  124.         -- je remonte à la surface
  125.         while profondeurSv ~= 0 do
  126.                 if turtle.detectUp() then turtle.digUp() end
  127.                 turtleUp()
  128.                 profondeurSv = profondeurSv-1
  129.                 modem.transmit(idChannel,idChannel,"profondeur:"..profondeurSv)
  130.                 verifFuel()
  131.         end
  132.        
  133.         -- je me déplace vers le point de départ
  134.         deplacement(0,0)
  135.        
  136.         --on prend du charbon dans le coffre au-dessus de la tortue
  137.         turtle.select(charbonSlot)
  138.         turtle.suckUp()
  139.        
  140.         --on retourne au-dessus du puit en cours de minage
  141.         deplacement(xPositionSv, zPositionSv)
  142.        
  143.         --on descend à la dernière profondeur
  144.         while profondeurSv ~= profondeur do
  145.                 if turtle.detectDown() then turtle.digDown() end
  146.                 turtle.down()
  147.                 profondeurSv = profondeurSv+1
  148.                 modem.transmit(idChannel,idChannel,"profondeur:"..profondeurSv)
  149.                 verifFuel()
  150.         end
  151.        
  152.         --on se met dans la bonne direction
  153.         while directionSv ~= direction do
  154.                 turtle.turnRight()
  155.                 direction=direction+1
  156.                 if direction == 4 then direction = 0 end
  157.         end
  158.        
  159.         --et normalement c'est bon.
  160.         modem.transmit(idChannel,idChannel,"etat:encours")
  161.  
  162. end
  163.  
  164. function recharge()
  165.  
  166.         if fonctionnement == "normal" then
  167.                 return rechargeCharbonCoffre()
  168.         elseif fonctionnement == "enderchest" then
  169.                 return rechargeCharbon()
  170.         end
  171.  end
  172.        
  173. function videInventaire()                               -- vide l'inventaire de la tortue dans l'enderchest dédié à ça
  174.  
  175.     local slot
  176.     turtle.select(enderchestSlot)
  177.     while turtle.placeUp() == false do
  178.         sleep(0.1)
  179.         print("fu_turtleplaceup resultat du placeup : false :o( a l'attaque !")
  180.         if ( turtle.attackUp() ==false ) then turtle.digUp() end
  181.     end
  182.     for slot=premierSlot,dernierSlot do
  183.             turtle.select(slot)
  184.             while turtle.getItemCount(slot) > 0 do
  185.                     turtle.dropUp(turtle.getItemCount(slot))
  186.                     if turtle.getItemCount(slot) > 0 then
  187.                             sleep(0.5)
  188.                     end
  189.             end
  190.     end
  191.  
  192.     turtle.select(enderchestSlot)
  193.     turtle.digUp()
  194.        
  195. end
  196.  
  197. function videInventaireCoffre()
  198.  
  199.         -- d'abord je sauv les coordonnées x, z, profondeur et direction
  200.         xPositionSv = xPosition
  201.         zPositionSv = zPosition
  202.         profondeurSv = profondeur
  203.         directionSv = direction
  204.        
  205.         --je préviens que je remonte pour vider mon inventaire
  206.         modem.transmit(idChannel,idChannel,"etat:vidage")
  207.        
  208.         -- je remonte à la surface
  209.         while profondeurSv ~= 0 do
  210.                 if turtle.detectUp() then turtle.digUp() end
  211.                 turtleUp()
  212.                 profondeurSv = profondeurSv-1
  213.                 modem.transmit(idChannel,idChannel,"profondeur:"..profondeurSv)
  214.                 verifFuel()
  215.         end
  216.        
  217.         -- je me déplace vers le point de départ
  218.         deplacement(0,0)
  219.        
  220.         --on se remet en direction "deux", face au coffre
  221.         while direction ~= 2 do
  222.                 turtle.turnRight()
  223.                 direction=direction+1
  224.                 if direction == 4 then direction = 0 end
  225.         end
  226.        
  227.         --on vide l'inventaire
  228.         for slot=premierSlot,dernierSlot do
  229.                 turtle.select(slot)
  230.                 while turtle.getItemCount(slot) > 0 do
  231.                         turtle.drop(turtle.getItemCount(slot))
  232.                         if turtle.getItemCount(slot) > 0 then
  233.                                 sleep(0.5)
  234.                         end
  235.                 end
  236.         end
  237.        
  238.         --on se remet en direction "zéro"
  239.         while direction ~= 0 do
  240.                 turtle.turnRight()
  241.                 direction=direction+1
  242.                 if direction == 4 then direction = 0 end
  243.         end
  244.        
  245.         --on retourne au-dessus du puit en cours de minage
  246.         deplacement(xPositionSv, zPositionSv)
  247.        
  248.         --on descend à la dernière profondeur
  249.         while profondeurSv ~= profondeur do
  250.                 if turtle.detectDown() then turtle.digDown() end
  251.                 turtle.down()
  252.                 profondeurSv = profondeurSv+1
  253.                 modem.transmit(idChannel,idChannel,"profondeur:"..profondeurSv)
  254.                 verifFuel()
  255.         end
  256.        
  257.         --on se met dans la bonne direction
  258.         while directionSv ~= direction do
  259.                 turtle.turnRight()
  260.                 direction=direction+1
  261.                 if direction == 4 then direction = 0 end
  262.         end
  263.        
  264.         --et normalement c'est bon.
  265.         modem.transmit(idChannel,idChannel,"etat:encours")
  266. end
  267.  
  268. function vidage()
  269.  
  270.         if fonctionnement == "normal" then
  271.                 return videInventaireCoffre()
  272.         elseif fonctionnement == "enderchest" then
  273.                 return videInventaire()
  274.         end
  275.  
  276. end
  277.  
  278. function calcPlan()                                     -- calcule les emplacements des puits de minage
  279.  
  280.         local x, z, temp, xTemp
  281.         temp = 1
  282.         -- pour forcer à miner le point de départ
  283.         plan[temp] = {}
  284.         plan[temp][1] = 0
  285.         plan[temp][2] = 0
  286.         temp = temp + 1
  287.        
  288.         -- on boucle sur les colonnes
  289.         for z=0,largeur do
  290.                 x = 0
  291.                 print("z : "..z)
  292.                
  293.                 --on calcule le x du 1er premier puit de minage pour la colonne z
  294.                 x = 5 - (z*2) +x
  295.                 while x < 0 do
  296.                         x = x + 5
  297.                 end
  298.                 plan[temp] = {}
  299.                 plan[temp][1] = x
  300.                 plan[temp][2] = z
  301.                 temp = temp + 1
  302.                 print("x : "..x)
  303.  
  304.                 -- et ensuite on trouve automatiquement les autres emplacements de la colonne z
  305.                 while x <= longueur do
  306.                         x = x + 5
  307.                         if x <= longueur then
  308.                                 plan[temp] = {}
  309.                                 plan[temp][1] = x
  310.                                 plan[temp][2] = z
  311.                                 temp = temp + 1
  312.                                 print("x : "..x)
  313.                         end
  314.                 end
  315.                 z = z + 1
  316.         end
  317. end
  318.  
  319. function deplacement(r,s)                               -- pour aller à des coordonnées précises
  320.  
  321.         local nbX
  322.         local nbZ
  323.        
  324. -- On commence par se déplacer en x
  325.         print("f_depl r : "..r.." ; s : "..s)
  326.         print("f_depl xPosition : "..xPosition.." ; zPosition : "..zPosition)
  327.        
  328.         r = tonumber(r)
  329.         s = tonumber(s)
  330.        
  331.         if r > xPosition then
  332.                 nbX = r - xPosition
  333.                 print("dans r>= xposition")
  334.                 while direction ~= 0 do -- ici on se met dans la bonne direction
  335.                         turtle.turnRight()
  336.                         direction=direction+1
  337.                         if direction == 4 then direction = 0 end
  338.                 end
  339.         elseif r < xPosition then
  340.                 nbX = xPosition - r
  341.                 print("dans xposition > r")
  342.                 while direction ~= 2 do -- ici on se met dans la bonne direction
  343.                         turtle.turnRight()
  344.                         direction=direction+1
  345.                         if direction == 4 then direction = 0 end
  346.                 end
  347.         end
  348.        
  349.         if r ~= xPosition then
  350.                 print("nbX : "..nbX)
  351.                 while nbX > 0 do
  352.                         if not turtle.forward() then
  353.                                 turtle.dig() -- ici, on n'a pas réussi à avancer, donc on creuse devant soit pour dégager le passage
  354.                                 if turtle.getItemCount(dernierSlot) > 0 then  -- on vérifie si on doit vider l'inventaire de la tortue
  355.                                         print("vidage inventaire comp_mine; prof "..profondeur.." ; nbitem ds slot "..dernierSlot.." : "..turtle.getItemCount(dernierSlot).." ; ")
  356.                                         --videInventaire()
  357.                                         --videInventaireCoffre()
  358.                                         vidage()
  359.                                 end
  360.                                 turtle.forward()
  361.                         end
  362.                         if direction == 0 then xPosition = xPosition + 1 else xPosition = xPosition - 1 end
  363.                         verifFuel()
  364.                         nbX = nbX - 1
  365.                 end
  366.         end
  367.  
  368. -- Ensuite on fait le déplacement en z
  369.        
  370.         if s > zPosition then
  371.                 nbZ = s - zPosition
  372.                
  373.                 while direction ~= 1 do -- ici on se met dans la bonne direction
  374.                         turtle.turnRight()
  375.                         direction=direction+1
  376.                         if direction == 4 then direction = 0 end
  377.                 end
  378.         elseif s < zPosition then
  379.                 nbZ = zPosition - s
  380.                
  381.                 while direction ~= 3 do -- ici on se met dans la bonne direction
  382.                         turtle.turnRight()
  383.                         direction=direction+1
  384.                         if direction == 4 then direction = 0 end
  385.                 end
  386.         end
  387.        
  388.         if s ~= zPosition then
  389.                 while nbZ > 0 do
  390.                         if not turtle.forward() then
  391.                                 turtle.dig() -- ici, on n'a pas réussi à avancer, donc on creuse devant soit pour dégager le passage
  392.                                 if turtle.getItemCount(dernierSlot) > 0 then  -- on vérifie si on doit vider l'inventaire de la tortue
  393.                                         print("vidage inventaire comp_mine; prof "..profondeur.." ; nbitem ds slot "..dernierSlot.." : "..turtle.getItemCount(dernierSlot).." ; ")
  394.                                         --videInventaire()
  395.                                         --videInventaireCoffre()
  396.                                         vidage()
  397.                                 end
  398.                                 turtle.forward()
  399.                         end
  400.                         if direction == 1 then zPosition = zPosition + 1 else zPosition = zPosition - 1 end
  401.                         verifFuel()
  402.                         nbZ = nbZ - 1
  403.                 end
  404.         end
  405.        
  406.         --on se remet en direction "zéro"
  407.         while direction ~= 0 do
  408.                 turtle.turnRight()
  409.                 direction=direction+1
  410.                 if direction == 4 then direction = 0 end
  411.         end
  412.  
  413. end
  414.  
  415. function turtleDown()
  416.     if turtle.detectDown() == true then   -- on vérifie si il y a un bloc en dessous
  417.         if turtle.digDown() == false then -- si on n'arrive pas à creuser en dessous, alors c'est la bedrock
  418.                 drapeauBedrock = true             -- donc je met le drapeau à true pour sortir de la boucle
  419.                 print("bedrock !")
  420.         else
  421.             if turtle.getItemCount(dernierSlot) > 0 then  -- on vérifie si on doit vider l'inventaire de la tortue
  422.                 print("vidage inventaire princ1; prof "..profondeur.." ; nbitem ds slot "..dernierSlot.." : "..turtle.getItemCount(dernierSlot).." ; ")
  423.                 --videInventaire()
  424.                 --videInventaireCoffre()
  425.                 vidage()
  426.             end
  427.             --resDown = turtle.down()
  428.             while turtle.down() == false do
  429.                 sleep(0.1)
  430.                 print("fu_turtledown resultat du down : false :o( ")
  431.             end
  432.             print("fu_turtledown resultat du down : true :o) ")
  433.             profondeur = profondeur+1
  434.             modem.transmit(idChannel,idChannel,"profondeur:"..profondeur)
  435.             verifFuel()
  436.         end
  437.     else                                    -- si il n'y a pas de bloc alors c'est de l'air, de l'eau ou de la lave
  438.         --resDown = turtle.down()           -- alors on descend simplement (la tortue ne craint pas la lave ou l'eau) et on continue à miner
  439.         while turtle.down() == false do
  440.         sleep(0.1)
  441.         print("fu_turtledown resultat du down : false :o( ")
  442.         end
  443.         print("fu_turtledown resultat du down : true :o) ")
  444.         profondeur = profondeur+1
  445.         modem.transmit(idChannel,idChannel,"profondeur:"..profondeur)
  446.         verifFuel()
  447.     end
  448.     --if resDown ==false then print("fu_turtledown resultat du down : false")
  449.     --else print("fu_turtledown resultat du down : true")
  450.     --end
  451. end
  452.  
  453.  
  454. function turtleUp()
  455.     while turtle.up() == false do
  456.         sleep(0.1)
  457.         print("fu_turtleup resultat du up : false :o( a l'attaque !")
  458.         if ( turtle.attackUp() ==false ) then turtle.digUp() end
  459.     end
  460. end
  461.  
  462. --********************************************--
  463. --********** Programme principal *************--
  464. --********************************************--
  465.  
  466. print("Entrez les dimensions de la zone à miner.")
  467. print("")
  468. print("Largeur (vers la droite) : ")
  469. largeur = tonumber(read())
  470. print("Longueur (en face) : ")
  471. longueur = tonumber(read())
  472.  
  473. calcPlan() -- on calcule les emplacements des puits de forage
  474.  
  475. local p, pmax = 1, #plan
  476.  
  477. -- ici, affichage du nombre de puits à creuser et attente confirmation pour commencer
  478. -- puis à chaque down ou up, affichage de la profondeur et màj du "puit en cours/nb puits total"
  479. -- et affichage lorsqu'on vide l'inventaire ou que l'on reprend du charbon
  480.  
  481. modem = peripheral.wrap("left")
  482. modem.transmit(idChannel,idChannel,"etat:attente")
  483. print("")
  484. print("Nombre de puits à creuser : "..#plan)
  485. modem.transmit(idChannel,idChannel,"nbPuitsTotal:"..#plan)
  486. modem.transmit(idChannel,idChannel,"profondeur:"..profondeur)
  487. print("Appuyez sur [ENTREE] pour commencer !")
  488. read()
  489. modem.transmit(idChannel,idChannel,"etat:encours")
  490. --read()
  491. turtle.select(1)
  492. while p <= pmax do
  493.     print("rentre dans boucle p")
  494.     modem.transmit(idChannel,idChannel,"nbPuits:"..p)
  495.         drapeauBedrock = false --avant tout, on reset ce flag
  496.         verifFuel() -- on refait le plein si besoin
  497.         deplacement(plan[p][1],plan[p][2]) -- puis on se déplace sur le puit à forer
  498.  
  499.         turtleDown()
  500.  
  501.         while drapeauBedrock == false do
  502.  
  503.             -- ici, direction = 0
  504.             while direction~=4 do
  505.                     --compare et mine, tourne à droite et direction++
  506.                     compare_mine()
  507.             end
  508.             direction=0
  509.                
  510.             turtleDown()
  511.                
  512.         end
  513.        
  514.         print("fin de la boucle "..profondeur)
  515.         -- ici je remonte à la surface
  516.         while profondeur ~= 0 do
  517.                 if turtle.detectUp() then turtle.digUp() end
  518.                 turtleUp()
  519.                 profondeur = profondeur-1
  520.                 modem.transmit(idChannel,idChannel,"profondeur:"..profondeur)
  521.                 verifFuel()
  522.         end
  523.        
  524.         p = p + 1
  525. end
  526.  
  527. modem.transmit(idChannel,idChannel,"etat:retour")
  528. deplacement(0,0) -- retour au point de départ
  529. vidage() -- dernier vidage
  530. modem.transmit(idChannel,idChannel,"etat:fin")
  531. --rednet.close(right)
Add Comment
Please, Sign In to add comment