AVTMC

MC Mining turtle

Sep 20th, 2019
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 10.74 KB | None | 0 0
  1. local direction = 0                     -- direction
  2. local drapeauBedrock = false            -- indicateur pour savoir si on est arrivé à la bedrock
  3. local profondeur = 0                    -- indique de combien on a creusé
  4. local longueur = 9                      -- indique la longueur (x) de la zone à miner
  5. local largeur = 9                       -- indique la largeur (y) de la zone à miner
  6. local xPosition = 0                     -- indique la position courante en x
  7. local zPosition = 0                     -- indique la position courante en z
  8. local niveauFuelMini = 5                -- niveau de déplacements auquel on doit refaire le plein de fuel
  9. local niveauCharbonMini = 5             -- quantité de charbons restants à laquelle on doit refaire le plein de charbon
  10.  
  11. local premierSlot = 4                   -- premier slot où se trouve le minerai ramassé
  12. local dernierSlot = 13                  -- dernier slot à surveiller pour enclencher le vidage de l'inventaire
  13. local enderchestSlot = 14               -- slot où se trouve l'enderchest pour les minerais
  14. local enderchestCharbonSlot = 15        -- slot où se trouve l'enderchest pour les minerais
  15. local charbonSlot = 16                  -- slot ou est stocké le charbon
  16.  
  17. local plan = {}                         -- tableau pour stocker les coordonnées relatives des puits de minage.
  18.  
  19. local idAffichage = 22                  -- id du computer vers lequel on envoie les infos par rednet
  20.  
  21. -- "funtion + nom ()" sert à créer une fonction
  22.  
  23. function compare_mine()                 -- fonction qui compare et mine, tourne à droite et direction++
  24.  
  25.     local slot = 0
  26.     local resultat = false
  27.    
  28.     for slot=1,3 do                     -- boucle for qui va aller du chiffre 1 à 3
  29.         turtle.select(slot)
  30.         if turtle.compare() or resultat then                -- la comparaison est faite à chaque fois par rapport au resultat.
  31.             resultat = true
  32.         end
  33.     end
  34.    
  35.     if resultat == false then
  36.         turtle.dig()
  37.         if turtle.getItemCount(dernierSlot) > 0 then        -- on vérifie si on doit vider l'inventaire de la tortue
  38.             print("vidage inventaire comp_mine; prof "..profondeur.." ; nbitem ds slot "..dernierSlot.." : "..turtle.getItemCount(dernierSlot).." ; ")
  39.             videInventaire()
  40.         end
  41.     end
  42.    
  43.     turtle.turnRight()
  44.     direction=direction+1
  45.    
  46. end
  47.  
  48. function verifFuel()                    -- vérifie si on a assez de fuel (déplacements) en réserve.
  49.   -- 1 charbon = 96 deplacements
  50.   -- On vérifie le niveau de fuel
  51.     local niveauFuel = turtle.getFuelLevel()
  52.     if (niveauFuel ~= "unlimited") then
  53.         if (niveauFuel < niveauFuelMini) then
  54.             -- On a besoin de faire le plein
  55.             if turtle.getItemCount(charbonSlot) < niveauCharbonMini then
  56.                 rechargeCharbon() -- on refait le plein de charbon
  57.             end
  58.             turtle.select(charbonSlot)
  59.             turtle.refuel(1) -- on recharge pour 96 deplacements
  60.         end
  61.     end
  62. end
  63.  
  64. function rechargeCharbon()              -- permet de refaire le plein en charbon
  65.    
  66.     turtle.dig()
  67.    
  68.     if turtle.getItemCount(dernierSlot-1) > 0 then  -- on vérifie si on doit vider l'inventaire de la tortue
  69.             print("vidage inventaire rech_charbon1; prof "..profondeur.." ; nbitem ds slot "..dernierSlot.." : "..turtle.getItemCount(dernierSlot).." ; ")
  70.             videInventaire()
  71.     end
  72.    
  73.     turtle.select(enderchestCharbonSlot)
  74.     turtle.placeUp()
  75.     turtle.select(charbonSlot)
  76.     turtle.suckUp()
  77.    
  78.     turtle.select(enderchestCharbonSlot)
  79.     turtle.digUp()
  80.    
  81. end
  82.  
  83. function videInventaire()               -- vide l'inventaire de la tortue dans l'enderchest dédié à ça
  84.  
  85.     local slot
  86.     turtle.select(enderchestSlot)
  87.     turtle.placeUp()
  88.     for slot=premierSlot,dernierSlot do
  89.         turtle.select(slot)
  90.         while turtle.getItemCount(slot) > 0 do
  91.             turtle.dropUp(turtle.getItemCount(slot))
  92.             if turtle.getItemCount(slot) > 0 then
  93.                 sleep(0.5)
  94.             end
  95.         end
  96.     end
  97.  
  98.     turtle.select(enderchestSlot)
  99.     turtle.digUp()
  100.    
  101. end
  102.  
  103. function calcPlan()                     -- calcule les emplacements des puits de minage
  104.  
  105.     local x, z, temp, xTemp
  106.     temp = 1
  107.     -- pour forcer à miner le point de départ
  108.     plan[temp] = {}
  109.     plan[temp][1] = 0                                       -- dans le tableau "plan" on rentre les coordonnées 0,0 (valeurs relatives au point de depart)
  110.     plan[temp][2] = 0                                       -- "temp" est une valeur du tableau, auquel on lui assigne un autre tableau qui est {}
  111.     temp = temp + 1     -- on incrémente l'indice de 1         -- le premier élément est 0 et le deuxieme est 0
  112.    
  113.     -- on boucle sur les colonnes
  114.     for z=0,largeur do
  115.         x = 0
  116.         print("z : "..z)
  117.        
  118.         --on calcule le x du 1er premier puit de minage pour la colonne z
  119.         x = 5 - (z*2) +x
  120.         while x < 0 do
  121.             x = x + 5
  122.         end
  123.         plan[temp] = {}
  124.         plan[temp][1] = x
  125.         plan[temp][2] = z
  126.         temp = temp + 1
  127.         print("x : "..x)
  128.  
  129.         -- et ensuite on trouve automatiquement les autres emplacements de la colonne z
  130.         while x <= longueur do
  131.             x = x + 5
  132.             if x <= longueur then
  133.                 plan[temp] = {}
  134.                 plan[temp][1] = x
  135.                 plan[temp][2] = z
  136.                 temp = temp + 1
  137.                 print("x : "..x)
  138.             end
  139.         end
  140.         z = z + 1
  141.     end
  142. end
  143.  
  144. function deplacement(r,s)               -- pour aller à des coordonnées précises
  145.  
  146.     local nbX       -- nbr de déplacement en x     -- Dans cette fonction, il y a un calcul qui soustraie les coordonnées actuelles de la tortues ( xPosition et zPosition)
  147.     local nbZ       -- nbr de déplacement en z     -- ...au coordonnées on l'on veut aller (r et s)
  148.    
  149. -- On commence par se déplacer en x
  150.     print("r : "..r.." ; s : "..s)
  151.     print("xPosition : "..xPosition.." ; zPosition : "..zPosition)
  152.    
  153.     r = tonumber(r)
  154.     s = tonumber(s)
  155.    
  156.     if r > xPosition then
  157.         nbX = r - xPosition
  158.         print("dans r>= xposition")
  159.         while direction ~= 0 do -- ici on se met dans la bonne direction
  160.             turtle.turnRight()
  161.             direction=direction+1
  162.             if direction == 4 then direction = 0 end
  163.         end
  164.     elseif r < xPosition then
  165.         nbX = xPosition - r
  166.         print("dans xposition > r")
  167.         while direction ~= 2 do -- ici on se met dans la bonne direction
  168.             turtle.turnRight()
  169.             direction=direction+1
  170.             if direction == 4 then direction = 0 end
  171.         end
  172.     end
  173.    
  174.     if r ~= xPosition then
  175.         print("nbX : "..nbX)
  176.         while nbX > 0 do
  177.             if not turtle.forward() then
  178.                 turtle.dig() -- ici, on n'a pas réussi à avancer, donc on creuse devant soit pour dégager le passage
  179.                 if turtle.getItemCount(dernierSlot) > 0 then  -- on vérifie si on doit vider l'inventaire de la tortue
  180.                     print("vidage inventaire comp_mine; prof "..profondeur.." ; nbitem ds slot "..dernierSlot.." : "..turtle.getItemCount(dernierSlot).." ; ")
  181.                     videInventaire()
  182.                 end
  183.                 turtle.forward()
  184.             end
  185.             if direction == 0 then xPosition = xPosition + 1 else xPosition = xPosition - 1 end
  186.             verifFuel()
  187.             nbX = nbX - 1
  188.         end
  189.     end
  190.  
  191. -- Ensuite on fait le déplacement en z
  192.    
  193.     if s > zPosition then
  194.         nbZ = s - zPosition
  195.        
  196.         while direction ~= 1 do -- ici on se met dans la bonne direction
  197.             turtle.turnRight()
  198.             direction=direction+1
  199.             if direction == 4 then direction = 0 end
  200.         end
  201.     elseif s < zPosition then
  202.         nbZ = zPosition - s
  203.        
  204.         while direction ~= 3 do -- ici on se met dans la bonne direction
  205.             turtle.turnRight()
  206.             direction=direction+1
  207.             if direction == 4 then direction = 0 end
  208.         end
  209.     end
  210.    
  211.     if s ~= zPosition then
  212.         while nbZ > 0 do
  213.             if not turtle.forward() then
  214.                 turtle.dig() -- ici, on n'a pas réussi à avancer, donc on creuse devant soit pour dégager le passage
  215.                 if turtle.getItemCount(dernierSlot) > 0 then  -- on vérifie si on doit vider l'inventaire de la tortue
  216.                     print("vidage inventaire comp_mine; prof "..profondeur.." ; nbitem ds slot "..dernierSlot.." : "..turtle.getItemCount(dernierSlot).." ; ")
  217.                     videInventaire()
  218.                 end
  219.                 turtle.forward()
  220.             end
  221.             if direction == 1 then zPosition = zPosition + 1 else zPosition = zPosition - 1 end
  222.             verifFuel()
  223.             nbZ = nbZ - 1
  224.         end
  225.     end
  226.    
  227.     --on se remet en direction "zéro"
  228.     while direction ~= 0 do
  229.         turtle.turnRight()
  230.         direction=direction+1
  231.         if direction == 4 then direction = 0 end
  232.     end
  233.  
  234. end
  235.  
  236. --********************************************--
  237. --********** Programme principal *************--
  238. --********************************************--
  239.  
  240. print("Entrez les dimensions de la zone à miner.")
  241. print("")
  242. print("Largeur (vers la droite) : ")
  243. largeur = tonumber(read())
  244. print("Longueur (en face) : ")
  245. longueur = tonumber(read())
  246.  
  247. calcPlan()                                          -- on calcule les emplacements des puits de forage
  248.  
  249. local p, pmax = 1, #plan                            -- dièse plan renvoit au nombre d'élément qu'il y a dans le tableau
  250.  
  251. -- ici, affichage du nombre de puits à creuser et attente confirmation pour commencer
  252. -- puis à chaque down ou up, affichage de la profondeur et màj du "puit en cours/nb puits total"
  253. -- et affichage lorsqu'on vide l'inventaire ou que l'on reprend du charbon
  254.  
  255. rednet.open("right")
  256. rednet.send(idAffichage,"etat:attente")
  257. print("")
  258. print("Nombre de puits à creuser : "..#plan)
  259. rednet.send(idAffichage,"nbPuitsTotal:"..#plan)
  260. rednet.send(idAffichage,"profondeur:"..profondeur)
  261. print("Appuyez sur [ENTREE] pour commencer !")
  262. read()
  263. rednet.send(idAffichage,"etat:encours")
  264. read()
  265.  
  266. while p <= pmax do
  267.    
  268.     rednet.send(idAffichage,"nbPuits:"..p)
  269.     drapeauBedrock = false --avant tout, on reset ce flag
  270.     deplacement(plan[p][1],plan[p][2]) -- puis on se déplace sur le 1er puit à forer
  271.     turtle.digDown() --creuse le bloc dessous
  272.     sleep(0.2)
  273.     turtle.down() --descend d'un cran
  274.     profondeur = profondeur+1
  275.     rednet.send(idAffichage,"profondeur:"..profondeur)
  276.     verifFuel()
  277.  
  278.     while drapeauBedrock == false do
  279.  
  280.         -- ici, direction = 0
  281.         while direction~=4 do
  282.             --compare et mine, tourne à droite et direction++
  283.             compare_mine()
  284.         end
  285.         direction=0
  286.        
  287.         if turtle.detectDown() == true then   -- on vérifie si il y a un bloc en dessous
  288.             if turtle.digDown() == false then -- si on n'arrive pas à creuser en dessous, alors c'est la bedrock
  289.                 drapeauBedrock = true         -- donc je met le drapeau à true pour sortir de la boucle
  290.                 print("bedrock !")
  291.             else
  292.                 if turtle.getItemCount(dernierSlot) > 0 then  -- on vérifie si on doit vider l'inventaire de la tortue
  293.                     print("vidage inventaire princ1; prof "..profondeur.." ; nbitem ds slot "..dernierSlot.." : "..turtle.getItemCount(dernierSlot).." ; ")
  294.                     videInventaire()
  295.                 end
  296.                 turtle.down()
  297.                 profondeur = profondeur+1
  298.                 rednet.send(idAffichage,"profondeur:"..profondeur)
  299.                 verifFuel()
  300.             end
  301.         else                                -- si il n'y a pas de bloc alors c'est de l'air, de l'eau ou de la lave
  302.             turtle.down()                   -- alors on descend simplement (la tortue ne craint pas la lave ou l'eau) et on continue à miner
  303.             profondeur = profondeur+1
  304.             rednet.send(idAffichage,"profondeur:"..profondeur)
  305.             verifFuel()
  306.         end
  307.        
  308.     end
  309.    
  310.     print("fin de la boucle "..profondeur)
  311.     -- ici je remonte à la surface
  312.     while profondeur ~= 0 do
  313.         if turtle.detectUp() then turtle.digUp() end
  314.         turtle.up()
  315.         profondeur = profondeur-1
  316.         rednet.send(idAffichage,"profondeur:"..profondeur)
  317.         verifFuel()
  318.     end
  319.    
  320.     p = p + 1
  321. end
  322.  
  323. rednet.send(idAffichage,"etat:retour")
  324. deplacement(0,0)                        -- retour au point de départ
  325. rednet.send(idAffichage,"etat:fin")
  326. rednet.close(right)
Add Comment
Please, Sign In to add comment