Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- https://computercraftfr.forumgaming.fr/t553-minage-version-2-0-minage-opti-turtle
- Program by cedmeu
- Version 2.0 changelog :
- - add turtle.inspect()
- - add check before going up or place up in case of monsters, block, etc...
- - add last inventory emptying after going back to start point
- Licence : CC BY NC SA
- https://creativecommons.org/licenses/by-nc-sa/3.0/fr/
- Edited by Lavres6, 2020-05-12
- ]]--
- local fonctionnement = "normal" -- choix du vidage : "normal" (avec coffre au départ) ou "enderchest"
- -- normal : coffre récup derrière départ tortue, coffre charbon au dessus tortue
- -- enderchest : voir variable pour emplacements des enderchest dans l'inventaire
- local direction = 0 -- direction
- local drapeauBedrock = false -- indicateur pour savoir si on est arrivé à la bedrock
- local profondeur = 0 -- indique de combien on a creusé
- local longueur = 96 -- indique la longueur (x) de la zone à miner
- local largeur = 9 -- indique la largeur (z) de la zone à miner
- local xPosition = 0 -- indique la position courante en x
- local zPosition = 0 -- indique la position courante en z
- local niveauFuelMini = 5 -- niveau de déplacements auquel on doit refaire le plein de fuel
- local niveauCharbonMini = 5 -- quantité de charbons restants à laquelle on doit refaire le plein de charbon
- local premierSlot = 2 -- premier slot où se trouve le minerai ramassé
- local dernierSlot = fonctionnement == "normal" and 16 or 14-- dernier slot à surveiller pour enclencher le vidage de l'inventaire
- local enderchestSlot = 15 -- slot où se trouve l'enderchest pour les minerais
- local enderchestCharbonSlot = 16 -- slot où se trouve l'enderchest pour le charbon
- local charbonSlot = 1 -- slot ou est stocké le charbon
- local plan = {} -- tableau pour stocker les coordonnées relatives des puits de minage.
- local filtre = {"minecraft:gravel", "minecraft:stone", "minecraft:monster_egg"}
- function compare_mine() -- fonction qui compare et mine, tourne à droite et direction++
- local slot = 0
- local resultat = false
- local succ, insp = turtle.inspect()
- for key, value in pairs(filtre) do
- if insp.name == value then
- resultat = true
- end
- end
- if resultat == false then
- turtle.dig()
- end
- turtle.turnRight()
- direction = direction + 1
- testVidage(true)
- end
- function verifFuel() -- vérifie si on a assez de fuel (déplacements) en réserve.
- -- 1 charbon = 96 deplacements, On vérifie le niveau de fuel
- local niveauFuel = turtle.getFuelLevel()
- if niveauFuel ~= "unlimited" and niveauFuel < niveauFuelMini then
- -- On a besoin de faire le plein
- turtle.select(charbonSlot)
- turtle.refuel(1) -- on recharge pour 96 deplacements
- -- et on vérifie s'il nous reste assez de charbon
- if turtle.getItemCount(charbonSlot) < niveauCharbonMini then
- recharge() -- on refait le plein de charbon
- end
- end
- end
- function todirection(todir)
- if (todir + 1) % 4 == direction then
- turtle.turnLeft()
- direction = (direction - 1) % 4
- else
- while todir ~= direction do
- turtle.turnRight()
- direction = (direction + 1) % 4
- end
- end
- end
- function rechargeCharbon() -- permet de refaire le plein en charbon
- turtle.select(enderchestCharbonSlot)
- while not turtle.placeUp() do
- sleep(0.1)
- print("fu_turtleplaceup : false :o( a l'attaque !")
- if not turtle.attackUp() then turtle.digUp() end
- end
- turtle.select(charbonSlot)
- turtle.suckUp()
- turtle.select(enderchestCharbonSlot)
- turtle.digUp()
- end
- function rechargeCharbonCoffre()
- -- d'abord je sauv les coordonnées x, z, profondeur et direction
- xPositionSv = xPosition
- zPositionSv = zPosition
- profondeurSv = profondeur
- directionSv = direction
- -- je remonte à la surface
- while profondeurSv ~= 0 do
- if turtle.detectUp() then turtle.digUp() end
- turtleUp()
- profondeurSv = profondeurSv-1
- verifFuel()
- end
- -- je me déplace vers le point de départ
- deplacement(0, 0)
- --on prend du charbon dans le coffre au-dessus de la tortue
- turtle.select(charbonSlot)
- turtle.suckUp()
- --on retourne au-dessus du puit en cours de minage
- deplacement(xPositionSv, zPositionSv)
- --on descend à la dernière profondeur
- while profondeurSv ~= profondeur do
- if turtle.detectDown() then turtle.digDown() end
- turtle.down()
- profondeurSv = profondeurSv+1
- verifFuel()
- end
- --on se met dans la bonne direction
- todirection(directionSv)
- end
- function recharge()
- if fonctionnement == "normal" then
- return rechargeCharbonCoffre()
- elseif fonctionnement == "enderchest" then
- return rechargeCharbon()
- end
- end
- function videInventaire() -- vide l'inventaire de la tortue dans l'enderchest dédié à ça
- local slot
- turtle.select(enderchestSlot)
- while not turtle.placeUp() do
- sleep(0.1)
- print("fu_turtleplaceup resultat du placeup : false :o( a l'attaque !")
- if not turtle.attackUp() then turtle.digUp() end
- end
- for slot = premierSlot,dernierSlot do
- turtle.select(slot)
- while turtle.getItemCount(slot) > 0 do
- turtle.dropUp(turtle.getItemCount(slot))
- if turtle.getItemCount(slot) > 0 then
- sleep(0.5)
- end
- end
- end
- turtle.select(enderchestSlot)
- turtle.digUp()
- turtle.select(charbonSlot)
- end
- function videInventaireCoffre()
- -- d'abord je sauv les coordonnées x, z, profondeur et direction
- xPositionSv = xPosition
- zPositionSv = zPosition
- profondeurSv = profondeur
- directionSv = direction
- -- je remonte à la surface
- while profondeurSv ~= 0 do
- if turtle.detectUp() then turtle.digUp() end
- turtleUp()
- profondeurSv = profondeurSv-1
- verifFuel()
- end
- -- je me déplace vers le point de départ
- deplacement(0,0)
- --on se remet en direction "deux", face au coffre
- todirection(2)
- --on vide l'inventaire
- for slot = premierSlot,dernierSlot do
- turtle.select(slot)
- while turtle.getItemCount(slot) > 0 do
- turtle.drop(turtle.getItemCount(slot))
- if turtle.getItemCount(slot) > 0 then
- sleep(0.5)
- end
- end
- end
- turtle.select(charbonSlot)
- --on se remet en direction "zéro"
- todirection(0)
- --on retourne au-dessus du puit en cours de minage
- deplacement(xPositionSv, zPositionSv)
- --on descend à la dernière profondeur
- while profondeurSv ~= profondeur do
- if turtle.detectDown() then turtle.digDown() end
- turtle.down()
- profondeurSv = profondeurSv + 1
- verifFuel()
- end
- --on se met dans la bonne direction
- todirection(directionSv)
- end
- function testVidage(cond)
- if cond and turtle.getItemCount(dernierSlot) > 0 then -- on vérifie si on doit vider l'inventaire de la tortue
- print("vidage inventaire "..fonctionnement.." ; prof "..profondeur.." ; nbitem ds slot "..dernierSlot.." : "..turtle.getItemCount(dernierSlot).." ; ")
- if fonctionnement == "normal" then
- return videInventaireCoffre()
- elseif fonctionnement == "enderchest" then
- return videInventaire()
- end
- end
- end
- function calcPlan() -- calcule les emplacements des puits de minage
- local x, z, temp, xTemp
- temp = 1
- for z = 0,(largeur - 1) do
- if z % 2 == 0 then
- x = (-2 * z) % 5
- while x < longueur do
- plan[temp] = {x, z}
- temp = temp + 1
- x = x + 5
- end
- else
- x = longueur - 1 - (2 * z + longueur + 4) % 5
- while x >= 0 do
- plan[temp] = {x, z}
- temp = temp + 1
- x = x - 5
- end
- end
- z = z + 1
- end
- end
- function deplacement(r,s) -- pour aller à des coordonnées précises
- print("("..xPosition.." ; "..zPosition..") => ("..r.." ; "..s..")")
- r = tonumber(r)
- s = tonumber(s)
- if r ~= xPosition then
- local nbX = math.abs(r - xPosition)
- todirection(r < xPosition and 2 or 0)
- while nbX > 0 do
- while not turtle.forward() do
- if not turtle.attack() then turtle.dig() end
- turtle.attack()
- testVidage(r ~= 0 or s ~= 0)
- end
- xPosition = xPosition - direction + 1
- verifFuel()
- nbX = nbX - 1
- end
- end
- if s ~= zPosition then
- local nbZ = math.abs(s - zPosition)
- todirection(s < zPosition and 3 or 1)
- while nbZ > 0 do
- while not turtle.forward() do
- if not turtle.attack() then turtle.dig() end
- testVidage(r ~= 0 or s ~= 0)
- end
- zPosition = zPosition - direction + 2
- verifFuel()
- nbZ = nbZ - 1
- end
- end
- todirection(0)
- end
- function turtleDown()
- if turtle.detectDown() then -- on vérifie s'il y a un bloc en dessous
- if not turtle.digDown() then -- si on n'arrive pas à creuser en dessous, alors c'est la bedrock
- drapeauBedrock = true -- donc je met le drapeau à true pour sortir de la boucle
- end
- end
- if not drapeauBedrock then
- testVidage(true)
- while not turtle.down() do
- sleep(0.1)
- print("fu_turtledown resultat du down : false :o( ")
- if not turtle.attackDown() then turtle.digDown() end
- end
- profondeur = profondeur + 1
- verifFuel()
- end
- end
- function turtleUp()
- if not turtle.attackUp() then turtle.digUp() end
- while not turtle.up() do
- sleep(0.1)
- print("fu_turtleup resultat du up : false :o( a l'attaque !")
- if not turtle.attackUp() then turtle.digUp() end
- end
- end
- --********************************************--
- --********** Programme principal *************--
- --********************************************--
- local p = 1
- if fs.exists("minage.txt") then
- local file = fs.open("minage.txt","r")
- local data = file.readAll()
- file.close()
- data = textutils.unserialize(data)
- largeur = data.largeur
- longueur = data.longueur
- p = data.puis
- print("Largeur (vers la droite) : "..largeur)
- print("Longueur (en face) : "..longueur)
- print("Commencera au puis n°"..p)
- else
- print("Entrez les dimensions de la zone à miner.")
- print("Largeur (vers la droite) : ")
- largeur = tonumber(read())
- print("Longueur (en face) : ")
- longueur = tonumber(read())
- local file = fs.open("minage.txt","w")
- file.write(textutils.serialize({largeur=largeur, longueur=longueur, puis=1}))
- file.close()
- end
- calcPlan() -- on calcule les emplacements des puits de forage
- local pmax = #plan
- -- ici, affichage du nombre de puits à creuser et attente confirmation pour commencer
- -- puis à chaque down ou up, affichage de la profondeur et màj du "puit en cours/nb puits total"
- -- et affichage lorsqu'on vide l'inventaire ou que l'on reprend du charbon
- print("Nombre de puits à creuser : "..#plan)
- print("Appuyez sur [ENTREE] pour commencer !")
- read()
- turtle.select(charbonSlot)
- while p <= pmax do
- print("Puit n°"..p.."/"..pmax)
- drapeauBedrock = false --avant tout, on reset ce flag
- verifFuel() -- on refait le plein si besoin
- deplacement(unpack(plan[p])) -- puis on se déplace sur le puit à forer
- turtleDown()
- while not drapeauBedrock do
- while direction ~= 4 do
- compare_mine()
- end
- direction=0
- turtleDown()
- end
- local file = fs.open("minage.txt","w")
- file.write(textutils.serialize({largeur=largeur, longueur=longueur, puis=p+1}))
- file.close()
- while profondeur ~= 0 do
- turtleUp()
- profondeur = profondeur-1
- verifFuel()
- end
- p = p + 1
- end
- deplacement(0,0) -- retour au point de départ
- if fonctionnement == "normal" then
- return videInventaireCoffre()
- elseif fonctionnement == "enderchest" then
- return videInventaire()
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement