Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ---@diagnostic disable: undefined-global, lowercase-global, cast-local-type
- local modeFonctionnement = "normal"
- -- choix du vidage : "normal" (avec coffre au depart) ou "enderchest"
- -- normal : coffre recup derriere depart tortue, coffre charbon au dessus tortue
- -- enderchest : voir variable pour emplacements des enderchest dans l'inventaire
- local idChannel = 123
- local fuelMini = 500 -- Fuel minimum pour recharger
- local profondeur = 0 -- indique de combien on a creuse
- local longueur = 9 -- indique la longueur (x) de la zone a miner
- local largeur = 9 -- indique la largeur (y) de la zone a miner
- local xPosition = 0 -- indique la position courante en x
- local zPosition = 0 -- indique la position courante en z
- local niveauFuelMini = 5 -- niveau de deplacements auquel on doit refaire le plein de fuel
- local niveauCharbonMini = 5 -- quantite de charbons restants a laquelle on doit refaire le plein de charbon
- local premierSlot = 1 -- premier slot ou se trouve le minerai ramasse
- --local dernierSlot = 13 -- dernier slot a surveiller pour enclencher le vidage de l'inventaire
- --if modeFonctionnement == "normal" then dernierSlot = 15 end -- si on est en mode normal, on gagne 2 slots d'inventaire
- local dernierSlot = (modeFonctionnement == "normal") and 15 or 13
- local enderchestSlot = 14 -- slot ou se trouve l'enderchest pour les minerais
- local enderchestCharbonSlot = 15 -- slot ou se trouve l'enderchest pour le charbon
- local charbonSlot = 16 -- slot ou est stocke le charbon
- -- Filtre des blocs à ignorer
- local filtre = {
- "minecraft:cobblestone", "minecraft:gravel", "minecraft:stone",
- "minecraft:dirt", "minecraft:grass", "minecraft:diorite",
- "minecraft:granite", "minecraft:andesite", "minecraft:deepslate",
- "minecraft:tuff", "minecraft:netherrack"
- }
- -- Plan de minage et communication
- local plan = {}
- local modem = peripheral.find("modem")
- if not modem then error("Modem not found") end
- -- Variables d'état de la tortue
- local direction = 0 -- 0: +X, 1: +Z, 2: -X, 3: -Z
- local drapeauBedrock = false
- local message = "attente"
- -----------------------------------------------------------
- -- Fonctions utilitaires
- -----------------------------------------------------------
- function logStatus()
- local fuel = turtle.getFuelLevel()
- local fuelItemCount = turtle.getItemCount(charbonSlot)
- modem.transmit(idChannel, idChannel, "fuel:" .. fuel)
- modem.transmit(idChannel, idChannel, "fuelItem:" .. fuelItemCount)
- modem.transmit(idChannel, idChannel, "xPos:" .. xPosition)
- modem.transmit(idChannel, idChannel, "yPos:" .. zPosition)
- end
- function chestStatus()
- local chest = peripheral.wrap("top") -- Assure-toi que le coffre est bien au-dessus
- if chest then
- local items = chest.list() -- Liste des objets dans le coffre
- local total = 0
- for slot, item in pairs(items) do
- total = total + item.count
- end
- print("Le coffre contient " .. total .. " items.")
- modem.transmit(idChannel, idChannel, "charbonCount:" .. total)
- else
- print("Pas de coffre detecte.")
- end
- end
- -----------------------------------------------------------
- -- Fonctions principales
- -----------------------------------------------------------
- function compare_mine() -- fonction qui compare et mine, tourne a droite et direction++
- --local slot = 0
- local resultat = false
- local succ, insp = turtle.inspect()
- if succ then
- for key, value in pairs(filtre) do
- if insp.name == value then --if (insp.name == value) or resultat then
- resultat = true
- break -- ajout new
- end
- end
- end
- if not resultat then
- turtle.dig() -- Miner si ce n'est pas un bloc à ignorer
- scan() --ajout pour voir l'item dans le dernier slot
- end
- turtle.turnRight()
- direction = (direction + 1) % 4
- print("A_direction:", direction)
- if turtle.getItemCount(dernierSlot) > 0 then -- on verifie si on doit vider l'inventaire de la tortue
- print("vidage inventaire comp_mine; prof "..profondeur.." ; nbitem ds slot "..dernierSlot.." : "..turtle.getItemCount(dernierSlot).." ; ")
- scan() --ajout pour voir l'item dans le dernier slot
- return vidage()
- end
- end
- function scan()
- local items = {}
- for i = premierSlot, dernierSlot do
- local data = turtle.getItemDetail(i)
- if data then
- --items[i]={name=data.name..":"..data.damage,count=data.count}
- items[i]={name=data.name, count=data.count}
- end
- end
- modem.transmit(idChannel, idChannel, textutils.serialize(items))
- end
- function verifFuel() -- verifie si on a assez de fuel (deplacements) en reserve.
- local niveauFuel = turtle.getFuelLevel()
- if niveauFuel ~= "unlimited" and niveauFuel < niveauFuelMini then
- -- On a besoin de faire le plein
- print("Niveau de carburant bas, recharge en cours.")
- turtle.select(charbonSlot)
- turtle.refuel(5) -- on recharge pour 96 deplacements / 80 1.21.1
- turtle.select(premierSlot)
- --fuelLevel = turtle.getFuelLevel() -- mise à jour du niveau de fuel
- --fuelItem = turtle.getItemCount(charbonSlot) -- mise à jour du nombre de charbon
- print("Niveau de carburant apres recharge : " .. turtle.getFuelLevel())
- logStatus()
- verifCharbon()
- --return recharge() -- on refait le plein de charbon
- end
- end
- -- Fonction pour vérifier le niveau de charbon et recharger si nécessaire
- function verifCharbon()
- if turtle.getItemCount(charbonSlot) < niveauCharbonMini then
- print("Charbon bas, recharge de charbon en cours.")
- return recharge() -- on refait le plein de charbon
- end
- end
- -- Recharge générique (selon le mode)
- function recharge()
- if modeFonctionnement == "normal" then
- return rechargeCharbonCoffre()
- elseif modeFonctionnement == "enderchest" then
- return rechargeCharbon()
- end
- end
- -- Recharge via enderchest (mode enderchest)
- function rechargeCharbon() -- permet de refaire le plein en charbon
- turtle.select(enderchestCharbonSlot)
- 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
- turtle.select(charbonSlot)
- turtle.suckUp()
- turtle.select(enderchestCharbonSlot)
- turtle.digUp()
- end
- -- Recharge via coffre (mode normal)
- function rechargeCharbonCoffre()
- -- d'abord je sauv les coordonnees x, z, profondeur et direction
- xPositionCharbonSv = xPosition
- zPositionCharbonSv = zPosition
- profondeurCharbonSv = profondeur
- directionCharbonSv = direction
- if turtle.getFuelLevel() < fuelMini then -- ajout 1.21.1
- turtle.select(charbonSlot)
- turtle.refuel(5) -- Recharge pour avoir assez de carburant
- turtle.select(premierSlot)
- end
- --je previens que je remonte pour recharger en charbon
- modem.transmit(idChannel,idChannel,"etat:charbon")
- logStatus()
- -- je remonte a la surface
- while profondeurCharbonSv ~= 0 do
- if turtle.detectUp() then turtle.digUp() end
- turtleUp()
- profondeurCharbonSv = profondeurCharbonSv - 1
- modem.transmit(idChannel,idChannel,"profondeur:"..profondeurCharbonSv)
- logStatus()
- end
- -- je me deplace vers le point de depart
- deplacement(0,0)
- --on se remet en direction "deux", face au coffre
- while direction ~= 2 do
- turtle.turnRight()
- direction = (direction + 1) % 4
- end
- --on prend du charbon dans le coffre au-dessus de la tortue
- turtle.select(charbonSlot)
- turtle.dropUp()
- turtle.suckUp()
- turtle.select(premierSlot)
- logStatus()
- chestStatus()
- --on vide l'inventaire ici ?
- modem.transmit(idChannel,idChannel,"etat:encours")
- --on retourne au-dessus du puit en cours de minage
- deplacement(xPositionCharbonSv, zPositionCharbonSv)
- --on descend a la derniere profondeur
- while profondeurCharbonSv ~= profondeur do
- if turtle.detectDown() then turtle.digDown() end
- turtle.down()
- profondeurCharbonSv = profondeurCharbonSv + 1
- modem.transmit(idChannel,idChannel,"profondeur:"..profondeurCharbonSv)
- logStatus()
- --verifFuel()
- end
- --on se met dans la bonne direction
- while directionCharbonSv ~= direction do
- turtle.turnRight()
- direction = (direction + 1) % 4
- end
- --et normalement c'est bon.
- --modem.transmit(idChannel,idChannel,"etat:encours")
- end
- -- Vidage de l'inventaire via enderchest
- function videInventaire()
- --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()
- end
- -- Vidage via coffre (mode normal)
- function videInventaireCoffre()
- -- d'abord je sauv les coordonnees x, z, profondeur et direction
- xPositionInvSv = xPosition
- zPositionInvSv = zPosition
- profondeurInvSv = profondeur
- directionInvSv = direction
- if turtle.getFuelLevel() < fuelMini then -- ajout 1.21.1
- turtle.select(charbonSlot)
- turtle.refuel(5) -- Recharge pour avoir assez de carburant
- turtle.select(premierSlot)
- end
- --je previens que je remonte pour vider mon inventaire
- modem.transmit(idChannel,idChannel,"etat:vidage")
- -- je remonte a la surface
- while profondeurInvSv ~= 0 do
- if turtle.detectUp() then turtle.digUp() end
- turtleUp()
- profondeurInvSv = profondeurInvSv - 1
- modem.transmit(idChannel,idChannel,"profondeur:"..profondeurInvSv)
- logStatus()
- end
- -- je me deplace vers le point de depart
- deplacement(0, 0)
- --on se remet en direction "deux", face au coffre
- while direction ~= 2 do
- turtle.turnRight()
- direction = (direction + 1) % 4
- end
- --on vide l'inventaire
- for slot = premierSlot, dernierSlot do
- turtle.select(slot)
- local data = turtle.getItemDetail()
- if data and data.name == "minecraft:coal" or data.name == "minecraft:charcoal" or data.name == "modern_industrialization:coke" then
- turtle.dropUp()
- else
- while turtle.getItemCount(slot) > 0 do
- turtle.drop(turtle.getItemCount(slot))
- if turtle.getItemCount(slot) > 0 then
- sleep(0.5)
- end
- end
- end
- end
- if turtle.getItemCount(charbonSlot) < niveauCharbonMini then
- turtle.select(charbonSlot)
- turtle.dropUp()
- turtle.suckUp()
- turtle.select(premierSlot)
- end
- scan() -- ajout pour des que ces vide on met a jour ecran
- logStatus()
- modem.transmit(idChannel,idChannel,"etat:encours")
- --on se remet en direction "zero"
- while direction ~= 0 do
- turtle.turnRight()
- direction = (direction + 1) % 4
- end
- --on retourne au-dessus du puit en cours de minage
- deplacement(xPositionInvSv, zPositionInvSv)
- --on descend a la derniere profondeur
- while profondeurInvSv ~= profondeur do
- if turtle.detectDown() then turtle.digDown() end
- turtle.down()
- profondeurInvSv = profondeurInvSv + 1
- modem.transmit(idChannel,idChannel,"profondeur:"..profondeurInvSv)
- logStatus()
- -- Pas besoin de vérifier le carburant ici
- -- verifFuel()
- end
- --on se met dans la bonne direction
- while directionInvSv ~= direction do
- turtle.turnRight()
- direction = (direction + 1) % 4
- print("B_direction" ..direction)
- end
- turtle.select(1)
- --et normalement c'est bon.
- --modem.transmit(idChannel,idChannel,"etat:encours")
- end
- function vidage()
- if modeFonctionnement == "normal" then
- return videInventaireCoffre()
- elseif modeFonctionnement == "enderchest" then
- return videInventaire()
- end
- end
- -----------------------------------------------------------
- -- Calcul du plan de minage
- -----------------------------------------------------------
- function calcPlan()
- local x, z, temp --, xTemp
- temp = 1
- -- pour forcer a miner le point de depart
- plan[temp] = {}
- plan[temp][1] = 0
- plan[temp][2] = 0
- temp = temp + 1
- -- on boucle sur les colonnes
- for z = 0, largeur do
- x = 0
- print("Colonne z = " .. z)
- --on calcule le x du 1er premier puit de minage pour la colonne z
- x = 5 - (z * 2) + x
- while x < 0 do
- x = x + 5
- end
- plan[temp] = {}
- plan[temp][1] = x
- plan[temp][2] = z
- temp = temp + 1
- print("Premier puits de colonne: x = " .. x)
- -- et ensuite on trouve automatiquement les autres emplacements de la colonne z
- while x <= longueur do
- x = x + 5
- if x <= longueur then
- plan[temp] = {}
- plan[temp][1] = x
- plan[temp][2] = z
- temp = temp + 1
- print("Autre puits: x = " .. x)
- end
- end
- z = z + 1 -- chat gpt suggere la suppression
- end
- end
- -----------------------------------------------------------
- -- Function de deplacement
- -----------------------------------------------------------
- function deplacement(r,s)-- pour aller a des coordonnees precises
- local nbX, nbZ
- -- On commence par se deplacer en x
- print("Déplacement vers (" .. r .. ", " .. s .. ")")
- print("Position actuelle: (" .. xPosition .. ", " .. zPosition .. ")")
- r, s = tonumber(r), tonumber(s)
- if not r or not s then
- error("Invalid coordinates: r and s must be numbers")
- end
- if r > xPosition then
- nbX = r - xPosition
- print("dans r>= xposition")
- while direction ~= 0 do -- ici on se met dans la bonne direction
- turtle.turnRight()
- direction = (direction + 1) % 4
- end
- elseif r < xPosition then
- nbX = xPosition - r
- print("dans xposition > r")
- while direction ~= 2 do -- ici on se met dans la bonne direction
- turtle.turnRight()
- direction = (direction + 1) % 4
- --print(direction)
- end
- end
- if r ~= xPosition then
- print("nbX : "..nbX)
- while nbX > 0 do
- if not turtle.forward() then
- turtle.dig() -- ici, on n'a pas reussi a avancer, donc on creuse devant soit pour degager le passage
- turtle.forward()
- logStatus()
- end
- if direction == 0 then
- xPosition = xPosition + 1
- else
- xPosition = xPosition - 1
- end
- modem.transmit(idChannel, idChannel, "xPos:" .. xPosition)
- print(nbX .." x " ..xPosition)
- verifFuel()
- nbX = nbX - 1
- end
- end
- -- Ensuite on fait le deplacement en z
- if s > zPosition then
- nbZ = s - zPosition
- while direction ~= 1 do -- ici on se met dans la bonne direction
- turtle.turnRight()
- direction = (direction + 1) % 4
- end
- elseif s < zPosition then
- nbZ = zPosition - s
- while direction ~= 3 do -- ici on se met dans la bonne direction
- turtle.turnRight()
- direction = (direction + 1) % 4
- end
- end
- if s ~= zPosition then
- print("nbZ : "..nbZ)
- while nbZ > 0 do
- if not turtle.forward() then
- turtle.dig() -- ici, on n'a pas reussi a avancer, donc on creuse devant soit pour degager le passage
- turtle.forward()
- logStatus()
- end
- if direction == 1 then zPosition = zPosition + 1 else zPosition = zPosition - 1 end
- modem.transmit(idChannel, idChannel, "yPos:" .. zPosition)
- print(nbZ .."z " ..zPosition)
- verifFuel()
- nbZ = nbZ - 1
- end
- end
- --on se remet en direction "zero"
- while direction ~= 0 do
- turtle.turnRight()
- direction = (direction + 1) % 4
- end
- -- Envoi des nouvelles positions
- --modem.transmit(idChannel, idChannel, "xPos:" .. xPosition)
- --modem.transmit(idChannel, idChannel, "yPos:" .. zPosition)
- end
- -- Fonction de descente
- function turtleDown()
- if turtle.detectDown() then -- on verifie si il y a un bloc en dessous
- if not turtle.digDown() then -- si on n'arrive pas a creuser en dessous, alors c'est la bedrock
- drapeauBedrock = true -- donc je met le drapeau a true pour sortir de la boucle
- print("bedrock !")
- logStatus()
- else
- if turtle.getItemCount(dernierSlot) > 0 then -- on verifie si on doit vider l'inventaire de la tortue
- print("vidage inventaire princ1; prof "..profondeur.." ; nbitem ds slot "..dernierSlot.." : "..turtle.getItemCount(dernierSlot).." ; ")
- vidage()
- end
- while not turtle.down() do
- sleep(0.1)
- --print("C_fu_turtledown resultat du down : false :o( ")
- end
- --print("D_fu_turtledown resultat du down : true :o) ")
- profondeur = profondeur + 1
- modem.transmit(idChannel,idChannel,"profondeur:"..profondeur)
- logStatus()
- verifFuel()
- end
- else -- si il n'y a pas de bloc alors c'est de l'air, de l'eau ou de la lave
- while not turtle.down() do
- sleep(0.1)
- --print("E_fu_turtledown resultat du down : false :o( ")
- end
- --print("F_fu_turtledown resultat du down : true :o) ")
- profondeur = profondeur + 1
- modem.transmit(idChannel,idChannel,"profondeur:"..profondeur)
- logStatus()
- verifFuel()
- end
- end
- function turtleUp()
- 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
- --print("Turtle monte.")
- end
- --********************************************--
- --********** Programme principal *************--
- --********************************************--
- print("Entrez les dimensions de la zone a miner.")
- print("")
- print("Largeur (vers la droite) : ")
- largeur = tonumber(read())
- print("Longueur (en face) : ")
- longueur = tonumber(read())
- calcPlan() -- on calcule les emplacements des puits de forage
- --local p, pmax = 1, #plan
- -- Demande du numéro du puits de démarrage
- print("Entrez le numero du puits de demarrage (laisser vide pour commencer au puits 1) :")
- local startWellInput = read()
- local startWell = tonumber(startWellInput) or 1
- if startWell < 1 or startWell > #plan then
- print("Le numéro du puits doit être compris entre 1 et " .. #plan .. ". Démarrage au puits 1.")
- startWell = 1
- end
- local p = startWell
- local pmax = #plan
- -- ici, affichage du nombre de puits a creuser et attente confirmation pour commencer
- -- puis a chaque down ou up, affichage de la profondeur et maj du "puit en cours/nb puits total"
- -- et affichage lorsqu'on vide l'inventaire ou que l'on reprend du charbon
- --ajout
- modem.transmit(idChannel,idChannel,"etat:attente")
- print("")
- print("Nombre de puits a creuser : "..#plan)
- modem.transmit(idChannel,idChannel,"nbPuitsTotal:"..#plan)
- modem.transmit(idChannel,idChannel,"profondeur:"..profondeur)
- logStatus()
- chestStatus()
- print("Appuyez sur [ENTREE] pour commencer !")
- read()
- modem.transmit(idChannel,idChannel,"etat:encours")
- turtle.select(1)
- while p <= pmax do
- print("Traitement du puits " .. p)
- modem.transmit(idChannel, idChannel, "nbPuits:" .. p)
- modem.transmit(idChannel, idChannel, "nbPuitsTotal:" .. #plan) -- ajout test
- drapeauBedrock = false --avant tout, on reset ce flag
- verifFuel() -- on refait le plein si besoin
- deplacement(plan[p][1],plan[p][2]) -- puis on se deplace sur le puit a forer
- turtleDown()
- while not drapeauBedrock do
- -- ici, direction = 0
- local tours = 0
- while tours < 4 do
- print("G_tour: " ..tours)
- --compare et mine, tourne a droite et direction++
- compare_mine()
- tours = tours + 1
- end
- direction = 0
- --scan()
- turtleDown()
- end
- print("Fin du puits, profondeur: " .. profondeur)
- -- ici je remonte a la surface
- while profondeur ~= 0 do
- if turtle.detectUp() then turtle.digUp() end
- turtleUp()
- profondeur = profondeur - 1
- --modem.transmit(idChannel,idChannel,"nbPuitsTotal:"..#plan) -- ajout test
- modem.transmit(idChannel, idChannel, "profondeur:" .. profondeur)
- logStatus()
- --turtle.select(1)
- verifFuel()
- end
- turtle.select(1)
- p = p + 1
- end
- modem.transmit(idChannel, idChannel, "etat:retour")
- deplacement(0,0) -- retour au point de depart
- vidage() -- dernier vidage
- modem.transmit(idChannel, idChannel, "etat:fin")
- print("Vous pouvez recuperer la turtle !")
- --rednet.close(right)
Add Comment
Please, Sign In to add comment