Advertisement
flypip

mine

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