skypop

CC Farmer

Jun 22nd, 2018
1,177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. --Fichier de sauvegarde des variables utiles au reboot :
  2. -- turtle.farm.dir: Orientation de la turtle 0,1,2,3 (N-E-S-W)
  3. -- turtle.farm.fuel: Niveau de fuel au d?part d'une boucle
  4. -- Si le fichier n'existe pas il sera cree
  5. local settingsFile = "/settings/TurtleFarm"
  6.  
  7. --Fichier contenant les donnees a inscrire sur le moniteur
  8. -- N?cessairement sur un disk
  9. -- Si le mountPath est modifie, il sera corrige au premier disk drive trouve
  10. local dataFile = "/disk/FarmData"
  11.  
  12. --Delai applique a chaque pas
  13. local delay=.1
  14.  
  15. --Duree de la pause entre deux tours
  16. local pause=900 --15min
  17.  
  18. --Multiplicateur
  19. -- passe a 10, la turtle prevoira assez de fuel pour 10 tours
  20. local fuelSupply=4 -- minimum 2 par securite
  21.  
  22. --Soupape : nombre d'echecs successifs toleres dans une boucle while
  23. local limit=32
  24.  
  25. -- Delai d'attente de confirmation pour reinitialiser au reboot
  26. -- Hard reboot: Placer un bloc de redstone sur le parcours de la turtle
  27. -- La turtle stoppe. Retirer le bloc, la turtle demande confirmation pour reinitialiser
  28. -- Sans confirmation passe le delai hardRebootCountDown, elle reprend sa course
  29. local hardRebootCountDown = 10
  30.  
  31. --Liste des items bons a jeter (ne seront pas stockes)
  32. unwanted = {
  33. ["minecraft:poisonous_potato"]=1,
  34. --["minecraft:wheat_seeds"]=1, --NB: un stack de graines sera tout de meme conserve par la turtle pour replanter
  35. }
  36.  
  37. --
  38. -- API
  39. --
  40. if not os.loadAPI("/apis/dbFarm") then
  41.     error("Missing API: dbFarm\n> pastebin get k0bi24gr /apis/dbFarm")
  42.     return
  43. end
  44. if not os.loadAPI("/apis/dbFuel") then
  45.     error("Missing API: dbFuel\n> pastebin get 5g2DntXx /apis/dbFuel")
  46.     return
  47. end
  48.  
  49. --
  50. -- CONSTANTS
  51. --
  52. NORTH=0
  53. EAST=1
  54. SOUTH=2
  55. WEST=3
  56. sDir={"North","East","South","West"}
  57.  
  58. plantAges = {
  59. ["minecraft:wheat"]      =7,    
  60. ["minecraft:carrots"]    =7,  
  61. ["minecraft:potatoes"]   =7,  
  62. ["minecraft:melon_block"]=7,
  63. ["minecraft:pumpkin"]    =7,  
  64. ["minecraft:reeds"]      =7,    
  65. ["minecraft:nether_wart"]=3, --/!\
  66. ["minecraft:beetroots"]  =3, --/!\
  67. }
  68.  
  69. --Bloc reference (see function walk() 263)
  70. --sBlockType = "minecraft:stained_hardened_clay"
  71. sBlockType = "minecraft:stained_glass"
  72. local function blockType_north(data)
  73.     return data.name==sBlockType
  74.     and data.state
  75.     and data.state.color=="red"
  76. end
  77. local function blockType_east(data)
  78.     return data.name==sBlockType
  79.     and data.state
  80.     and data.state.color=="orange"
  81. end
  82. local function blockType_south(data)
  83.     return data.name==sBlockType
  84.     and data.state
  85.     and data.state.color=="yellow"
  86. end
  87. local function blockType_west(data)
  88.     return data.name==sBlockType
  89.     and data.state
  90.     and data.state.color=="white"
  91. end
  92.  
  93. local function isContainer(name)
  94.     return name=="minecraft:chest"
  95.     or name=="minecraft:trapped_chest"
  96.     or name=="minecraft:dispenser"
  97.     or name=="minecraft:hopper"
  98.     or name=="minecraft:dropper"
  99.     or name=="computercraft:CC-Turtle"
  100.     or name=="computercraft:CC-TurtleExpanded"
  101.     or name=="computercraft:CC-TurtleAdvanced"
  102.     or name=="ironchest:BlockIronChest"
  103. end
  104.  
  105. --
  106. -- GLOBALS
  107. --
  108. fuelSupply = math.max(2,fuelSupply)
  109. fuelUsed=0
  110. block={up={},down={}}
  111. tick = os.startTimer(.1)
  112. tFarmCrops,tFarmSeeds,tFarmBlocks = {},{},{}
  113. local _,v
  114. local _,_cropsList = dbFarm.query("crop")
  115. local _,_seedsList = dbFarm.query("seed")
  116. local _,_blocksList = dbFarm.query("block")
  117. for _,v in pairs(_cropsList)  do tFarmCrops[v]=1 end
  118. for _,v in pairs(_seedsList)  do tFarmSeeds[v]=1 end
  119. for _,v in pairs(_blocksList) do tFarmBlocks[v]=1 end
  120.  
  121.  
  122. --Demande l'orientation de la turtle (N-E-S-W)
  123. --Initialise le fichier de sauvegarde des settings
  124. init=function()
  125.     local msg = ""
  126.     local confirm=false
  127.     while not confirm do
  128.         term.setCursorPos(1,1)
  129.         term.clear()
  130.         print([[TurtleFarming
  131. Set Turtle current orientation
  132.   0:North
  133.   1:East
  134.   2:South
  135.   3:West]])
  136.         print(msg)
  137.         local d = read()
  138.         if not tonumber(d) or (d~="0" and d~="1" and d~="2" and d~="3") then
  139.             msg="Number: 0, 1, 2 ort 3"
  140.         else
  141.             settings.set("turtle.farm.dir",tonumber(d))
  142.             settings.save(settingsFile)
  143.             confirm=true
  144.             break
  145.         end
  146.     end
  147. end
  148.  
  149. --Charge les donnees stockees dans le fichier settings
  150. if not fs.exists(settingsFile) then init()
  151. else settings.load(settingsFile) end
  152. local dir = settings.get("turtle.farm.dir",init)
  153. --Statistiques par tour
  154. lap = {
  155.     loop=0,
  156.     chrono=0,
  157.     crops=settings.get("turtle.farm.crops",0),
  158.     fuel=settings.get("turtle.farm.fuel",turtle.getFuelLevel())
  159. }
  160.  
  161. --Ecrit sur le terminal ? une ligne donn?e
  162. local function printLine(str,y)
  163.     term.setCursorPos(1,y)
  164.     term.clearLine()
  165.     print(str)
  166. end
  167.  
  168. --Hard reboot
  169. if rs.getInput("back") or rs.getInput("front")
  170. or rs.getInput("top")  or rs.getInput("bottom")
  171. or rs.getInput("left") or rs.getInput("right") then
  172.     print("Hard Reboot")
  173.     os.pullEvent("redstone")
  174.     local x,y = term.getCursorPos()
  175.     local confirm,countdown,countdownTimer = false,hardRebootCountDown,os.startTimer(1)
  176.     while not confirm and countdown>0 do
  177.         printLine("Reset Turtle orientation ("..sDir[dir+1]..") ?",y)
  178.         printLine("Press Y/N ("..countdown..")", y+1)
  179.         local e,k = os.pullEvent()
  180.         if e=="key" and k==keys.y then
  181.             sleep(.3)
  182.             init()
  183.             confirm=true
  184.             break
  185.         elseif e=="key" and k==keys.n then
  186.             sleep(.3)
  187.             confirm=true
  188.             break
  189.         elseif e=="timer" then
  190.             countdown=countdown-1
  191.             countdownTimer = os.startTimer(1)
  192.         end
  193.     end
  194. end
  195.  
  196. -- Panne de Fuel
  197. -- interrompt la turtle, en l'attente de ravitaillement en fuel
  198. local function waitManualyRefuel()
  199.     printLine("Give some Fuel then press any key",8)
  200.     while turtle.getFuelLevel()==0 do
  201.         os.pullEvent("key")
  202.         term.setCursorPos(1,9)
  203.         term.clearLine()
  204.         shell.run("refuel all")
  205.     end
  206.     printLine("",8)
  207. end
  208.  
  209. -- Avance la turtle d'une case
  210. -- Recolte la canne a surcre si elle bloque le passage
  211. local function forward()
  212.     local test = turtle.forward()
  213.     if not test and turtle.detect() then
  214.         local test,data=turtle.inspect()
  215.         if test and data.name=="minecraft:reeds" then
  216.             if turtle.dig() and turtle.forward() then
  217.                 lap.crops = lap.crops+1
  218.                 settings.set("turtle.farm.crops",lap.crops)
  219.                 settings.save(settingsFile)
  220.                 turtle.suckUp()
  221.                 turtle.suck()
  222.                 turtle.suckDown()
  223.                 return true
  224.             end
  225.         end
  226.         error("Program stopped by a block forward\n"..textutils.serialize(data),-1) exit()
  227.     end
  228.     local count=1
  229.     while not test and not turtle.detect() and turtle.getFuelLevel()>0 and count<limit do
  230.         sleep(delay)
  231.         count = count+1
  232.         test = turtle.forward()
  233.     end
  234.     if not test then
  235.         if turtle.getFuelLevel()==0 then
  236.             waitManualyRefuel()
  237.         else
  238.             error("Program stopped. Can't go forward (tries:"..count..")",-1)
  239.             exit()
  240.         end
  241.     end
  242. end
  243.  
  244. -- Releve les donnees des blocs dessus/dessous
  245. local function inspect()
  246.     local test,data
  247.     test,data = turtle.inspectUp()
  248.     block.up = test and data or false
  249.     test,data = turtle.inspectDown()
  250.     block.down = test and data or false
  251. end
  252.  
  253. -- Aligne la turtle dans la direction indiquee
  254. -- Sauvegarde de la nouvelle direction dans le fichier settings
  255. local function turn(d)
  256.     if dir ~= d then
  257.         if d == NORTH then
  258.                 if dir==EAST  then turtle.turnLeft()
  259.             elseif dir==SOUTH then turtle.turnLeft() turtle.turnLeft()
  260.             elseif dir==WEST  then turtle.turnRight()
  261.             end                    
  262.         elseif d == EAST then      
  263.                 if dir==NORTH then turtle.turnRight()
  264.             elseif dir==SOUTH then turtle.turnLeft()
  265.             elseif dir==WEST  then turtle.turnLeft() turtle.turnLeft()
  266.             end                    
  267.         elseif d == SOUTH then    
  268.                 if dir==NORTH then turtle.turnLeft() turtle.turnLeft()
  269.             elseif dir==EAST  then turtle.turnRight()
  270.             elseif dir==WEST  then turtle.turnLeft()
  271.             end                    
  272.         elseif d == WEST then      
  273.                 if dir==NORTH then turtle.turnLeft()
  274.             elseif dir==EAST  then turtle.turnLeft() turtle.turnLeft()
  275.             elseif dir==SOUTH then turtle.turnRight()
  276.             end
  277.         end
  278.         dir = d
  279.         settings.set("turtle.farm.dir",d)
  280.         settings.save(settingsFile)
  281.     end
  282. end
  283.  
  284. -- Gere le mouvement de la turtle
  285. local function walk()
  286.     printLine("",7)
  287.     if block.up then
  288.         if blockType_north(block.up) then
  289.             printLine("North",7) turn(NORTH) forward()
  290.         elseif blockType_east(block.up) then
  291.             printLine("East",7)  turn(EAST)  forward()
  292.         elseif blockType_south(block.up) then
  293.             printLine("South",7) turn(SOUTH) forward()
  294.         elseif blockType_west(block.up) then
  295.             printLine("West",7)  turn(WEST)  forward()
  296.         elseif isContainer(block.up.name) then
  297.             printLine("Container",7) forward()
  298.         else
  299.             printLine(block.up.name,7)
  300.         end
  301.     end
  302. end
  303.  
  304. -- Formate un nombre de secondes en dur?e lisible
  305. local function timeStr(sec)
  306.     local d = math.floor(sec/86400) --24*60*60 sec
  307.     local h = math.floor(sec/3600)%24 -- 60x60 sec
  308.     local m = math.floor(sec/60)%60 -- 60sec
  309.     local s = math.floor(sec%60) --Reste
  310.     local str = ""
  311.     if d>0 then str = d>1 and d.. "days " or "1 day " end
  312.     if h>0 then str = str..h.."h" end
  313.     if m>0 then str = str..(m>9 and m or "0"..m) end
  314.     if h==0 then str = m>0 and str..":"..(s>9 and s or "0"..s) or s.."s" end
  315.     return str
  316. end
  317.  
  318. -- V?rifie que le repertoire racine de la disquette est bien present
  319. -- Sinon la variable est corrigee (au premier disk drive trouve)
  320. local function getMountedDisk()
  321.     if fs.exists(dataFile) then return true end
  322.     local _,name
  323.     for _,name in pairs(peripheral.getNames()) do
  324.         if peripheral.getType(name) == "drive" then
  325.             if disk.hasData(name) then
  326.                 local mount = disk.getMountPath(name)
  327.                 local pattern = "^/?disk%d*/(.+)$"
  328.                 dataFile = string.gsub(dataFile, pattern, "/"..mount.."/%1")
  329.                 return true
  330.             end
  331.         end
  332.     end
  333.     return false
  334. end
  335.  
  336. -- Sauvegarde les donnees statistiques dans une disquette
  337. -- a fin d'affichage sur un moniteur
  338. local function storeData()
  339.     lap.loop=lap.loop+1
  340.     if getMountedDisk() then --S'il y a bien une disquette disponible
  341.         local sChrono,sFuel="",""
  342.         if lap.chrono>0 then
  343.             sChrono = " / "..math.floor(os.clock()-lap.chrono)
  344.         end
  345.         if lap.fuel>0 then
  346.             sFuel = " / used: "..(lap.fuel - turtle.getFuelLevel())
  347.         end
  348.         local report = string.format([[Loops: %d
  349. Running until: %s%s
  350. Fuel level: %d%s
  351. Crops: %d]],
  352.             lap.loop,
  353.             timeStr(os.clock()), sChrono,
  354.             turtle.getFuelLevel(),sFuel,
  355.             lap.crops)
  356.         local fh = fs.open(dataFile,"w")
  357.         fh.write(report)
  358.         fh.close()
  359.     end
  360.     lap.chrono = os.clock()
  361.     lap.fuel = turtle.getFuelLevel()
  362.     settings.set("turtle.farm.fuel",lap.fuel)
  363.     settings.save(settingsFile)
  364. end
  365.  
  366. -- Regroupe les items identiques dans l'inventaire
  367. local function compactInventory()
  368.     printLine("Compact inventory",8)
  369.     local i,j,d1,d2
  370.     for i=1,16 do
  371.         d1 = turtle.getItemDetail(i)
  372.         if d1~=nil and turtle.getItemSpace(i)>0 then
  373.             for j=i+1,16 do
  374.                 d2 = turtle.getItemDetail(j)
  375.                 if d2~=nil and d1.name==d2.name then
  376.                     turtle.select(j)
  377.                     turtle.transferTo(i)
  378.                 end
  379.             end
  380.         end
  381.     end
  382. end
  383.  
  384. --Renvoi le premier slot vide trouve
  385. --Renvoi false si linventaire est plein
  386. local function findFreeSlot()
  387.     local i
  388.     for i=1,16 do
  389.         if turtle.getItemCount(i)==0 then
  390.             return i
  391.         end
  392.     end
  393.     return false
  394. end
  395.  
  396. --Renvoi le premier slot contenant un combustible compatible
  397. --Renvoi false si aucun combustible n'est trouv?
  398. local function findFuelSlot()
  399.     local i
  400.     for i=1,16 do
  401.         local data = turtle.getItemDetail(i)
  402.         if data and dbFuel.isFuel(data.name) then
  403.             return i
  404.         end
  405.     end
  406.     return false
  407. end
  408.  
  409. -- https://github.com/garrynewman/garrysmod/blob/master/garrysmod/lua/includes/extensions/table.lua#L93
  410. local function tableHasValue( t, val )
  411.     for k, v in pairs( t ) do
  412.         if ( v == val ) then return true end
  413.     end
  414.     return false
  415. end
  416.  
  417. --Compare les quantites de chaque slot indiques par slotList
  418. --_v: Retourne le num?ro du slot le moins fourni
  419. --_k: Retourne la cl? correspondante de la table slotList
  420. local function getMinQtySlot(slotList)
  421.     slotList = slotList or {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
  422.     local _min,k,v,_k,_v=64
  423.     for k,v in pairs(fuelSlots) do
  424.         if _min >= turtle.getItemCount(v) then
  425.             _min = turtle.getItemCount(v)
  426.             _k = k
  427.             _v = v
  428.         end
  429.     end
  430.     return _v,_k
  431. end
  432.  
  433. --Vide les slots contenant des items inutiles
  434. -- drop : function (turtle.drop, turtle.dropUp, turtle.dropDown)
  435. -- n : nombre de slot ? lib?rer
  436. local function dumpUnwanted(drop,n)
  437.     n = n or 16
  438.     compactInventory()
  439.     printLine("Dump unwanted",8)
  440.     local i,farmSlots,fuelSlots=1,{},{},{}
  441. -- >global  local tFarmCrops = dbFarm.query("crop")
  442. -- >global  local tFarmSeeds = dbFarm.query("seed")
  443.     for i=1,16 do
  444.         local data = turtle.getItemDetail(i)
  445.         if not data then
  446.             n=n-1
  447.         elseif dbFuel.isFuel(data.name) then
  448.             table.insert(fuelSlots,i)
  449.         elseif tFarmSeeds[data.name]~=nil then
  450.             table.insert(farmSlots,i)
  451.         elseif tFarmCrops[data.name]~=nil then
  452.             table.insert(farmSlots,i)
  453.         else
  454.             turtle.select(i)
  455.             drop(64)
  456.             n=n-1
  457.         end
  458.         if n<=0 then return true end
  459.     end
  460.     while n>1 do
  461.         if #fuelSlots > 0 then
  462.             local slot,key = getMinQtySlot(fuelSlots)
  463.             table.remove (fuelSlots, key)
  464.         else
  465.             local slot,key = getMinQtySlot(farmSlots)
  466.             table.remove (farmSlots, key)
  467.         end
  468.         turtle.select(s)
  469.         drop(64)
  470.         n=n-1
  471.     end
  472.     return not n>1
  473. end
  474.  
  475. -- Gestion automatique du fuel a la station
  476. local function autoRefuel()
  477.     printLine("Auto refuel",8)
  478.     if turtle.getFuelLevel()<fuelUsed*fuelSupply then
  479.         compactInventory()
  480.         slot = findFreeSlot()
  481.         if not slot then slot=findFuelSlot() end
  482.         if slot then
  483.             turtle.select(slot)
  484.             while turtle.getFuelLevel()<fuelUsed*fuelSupply do
  485.                 if not turtle.suckUp(1) then
  486.                     error("Fuel tank is empty...",-1)
  487.                     exit()
  488.                 end
  489.                 turtle.refuel()
  490.                 lap.fuel = turtle.getFuelLevel()+1 -- diff de la distance entre les stations storeData et autorefuel
  491.                 settings.set("turtle.farm.fuel",lap.fuel)
  492.                 settings.save(settingsFile)
  493.             end
  494.         end
  495.     end
  496. end
  497.  
  498. -- Trouve un slot contenant l'item indique
  499. -- Renvoi false s'il ne trouve rien
  500. local function findSlotItem(refName)
  501.     local slot=1
  502.     for slot=1,16 do
  503.         local data = turtle.getItemDetail(slot)
  504.         if data and data.name==refName then return slot end
  505.     end
  506.     return false
  507. end
  508.  
  509. -- Ramasse et replante, dans la mesure du possible
  510. -- Renvoi false si la manoeuvre n'est pas parfaitement execut?e.
  511. local function crop()
  512.     printLine("Crop manager",8)
  513.     if block.down and block.down.state and block.down.state.age then
  514.         local requiredAge = plantAges[block.down.name]
  515.         printLine(block.down.name.." "..block.down.state.age.."/"..requiredAge,5)
  516.         if block.down.state.age>=requiredAge then
  517.             local test,result = dbFarm.query("block",block.down.name)
  518.             if test and result["seed"] then
  519.                 local slot = findSlotItem(result["seed"])
  520.                 if not slot then slot = findFreeSlot() end
  521.                 if not slot and dumpUnwanted(turtle.dropDown,1) then slot = findFreeSlot() end
  522.                 if not slot  then error("Inventory saturation..",-1) exit() end
  523.                 turtle.select(slot)
  524.                 if turtle.digDown() then
  525.                     lap.crops=lap.crops+1
  526.                     settings.set("turtle.farm.crops",lap.crops)
  527.                     settings.save(settingsFile)
  528.                     turtle.select(findSlotItem(result["seed"]))
  529.                     return turtle.placeDown()
  530.                 end
  531.             end
  532.         end
  533.     end
  534.     return false
  535. end
  536.  
  537. local function storeCrops()
  538.     if lap.crops>0 and isContainer(block.up.name) then
  539.         local skip = {
  540.             wheat_seeds =    findSlotItem("minecraft:wheat_seeds"),
  541.             potato =         findSlotItem("minecraft:potato"),
  542.             carrot =         findSlotItem("minecraft:carrot"),
  543.             nether_wart =    findSlotItem("minecraft:nether_wart"),
  544.             beetroot_seeds = findSlotItem("minecraft:beetroot_seeds"),
  545.         }
  546.         local slot
  547.         for slot=1,16 do
  548.             if  slot ~= skip.wheat_seeds
  549.             and slot ~= skip.potato
  550.             and slot ~= skip.carrot
  551.             and slot ~= skip.nether_wart
  552.             and slot ~= skip.beetroot_seeds
  553.             and turtle.getItemCount(slot)>0
  554.             then
  555.                 turtle.select(slot)
  556.                 local data = turtle.getItemDetail(slot)
  557.                 if unwanted[data.name]~=nil then turtle.drop(64)
  558.                 else turtle.dropUp(64) end
  559.             end
  560.         end
  561.         lap.crops = 0
  562.         settings.set("turtle.farm.crops",lap.crops)
  563.         settings.save(settingsFile)
  564.     end
  565. end
  566.  
  567. -- Gere les op?rations de la turtle
  568. local function step()
  569.     printLine("",5)
  570.     if block.down then
  571.         --End loop
  572.         if block.down.name=="computercraft:CC-Peripheral" then
  573.             compactInventory()
  574.             fuelUsed = lap.fuel - turtle.getFuelLevel()
  575.             if block.down.state.variant=="disk_drive_full" then
  576.                 printLine("Disk-Drive",5)
  577.                 storeData()
  578.                 storeCrops()
  579.             else
  580.                 printLine(block.down.name.." / "..block.down.state.variant,5)
  581.             end
  582.             --init pause delay
  583.             settings.set("turtle.farm.pause",pause)
  584.             settings.save(settingsFile)
  585.         --Start Loop
  586.         elseif block.down.name=="computercraft:CC-Computer" then
  587.             autoRefuel()
  588.             local computer = peripheral.wrap("bottom")
  589.             if computer.isOn() then computer.reboot()
  590.             else computer.turnOn() end
  591.             --Pause
  592.             settings.load(settingsFile)
  593.             local pauseDelay = settings.get("turtle.farm.pause",pause)
  594.             while pauseDelay>0 do
  595.                 printLine("Pause : "..timeStr(pauseDelay),5)
  596.                 --Sauvegarde le temps ?coul? toutes les secondes
  597.                 local pauseTimer = os.startTimer(1)
  598.                 local e = os.pullEvent("timer")
  599.                 pauseDelay=pauseDelay-1
  600.                 settings.set("turtle.farm.pause",pauseDelay)
  601.                 settings.save(settingsFile)
  602.             end
  603.         --Crops
  604.         elseif block.down.name=="minecraft:pumpkin"
  605.         or block.down.name=="minecraft:melon_block"
  606.   or block.down.name=="minecraft:reeds" then
  607.             local cropName = (block.down.name == "minecraft:pumpkin") and "minecraft:pumpkin" or "minecraft:melon"
  608.    if block.down.name=="minecraft:reeds" then cropName="minecraft:reeds" end
  609.             local slot = findSlotItem(cropName)
  610.             if slot then turtle.select(slot) end
  611.             if turtle.digDown() then
  612.                 lap.crops = lap.crops+1
  613.                 settings.set("turtle.farm.crops",lap.crops)
  614.                 settings.save(settingsFile)
  615.             end
  616.         elseif tFarmBlocks[block.down.name]==1 and block.down.name~="minecraft:reeds" then
  617.             printLine(block.down.name,5)
  618.             crop()
  619.         else
  620.             printLine(block.down.name.."*",5)
  621.         end
  622.     end
  623.     printLine("Crops: "..lap.crops,3)
  624.     printLine("",8)
  625. end
  626.  
  627. -- Sequence des manoeuvres
  628. local function process()
  629.     printLine("Reading blocks",2)
  630.     inspect()
  631.     printLine("Process step",4)
  632.     step()
  633.     printLine("Process walk",6)
  634.     walk()
  635. end
  636.  
  637. --Gestionaire principal
  638. function main()
  639.     term.clear()
  640.     term.setCursorPos(1,1)
  641.     local continue=true
  642.     tick=os.startTimer(delay)
  643.     while continue do
  644.         local e,k=os.pullEvent()
  645.         if e=="redstone" then
  646.             os.reboot()
  647.             continue=false
  648.         elseif e=="key" and k==keys.t then
  649.             continue=false
  650.             os.cancelTimer(tick)
  651.         elseif e=="timer" then
  652.             printLine("Process new step "..os.clock(),1)
  653.             printLine("Fuel level is  "..turtle.getFuelLevel(),9)
  654.             process()
  655.             tick=os.startTimer(delay)
  656.         end
  657.     end
  658.     print("Terminate")
  659.     ignoreReboot = false
  660.     sleep(delay)
  661. end
  662.  
  663. main()
Add Comment
Please, Sign In to add comment