Advertisement
ecco7777

Me Turtle Autocraft

Apr 1st, 2018
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.56 KB | None | 0 0
  1. meSide="west"
  2. me=peripheral.wrap("front")
  3. tm=peripheral.wrap("bottom")
  4. recipes={}
  5. nullFP={id="",dmg=0}
  6. turtleSlot={1,2,3,5,6,7,9,10,11}
  7. itemsToCraft={}
  8. debug=false
  9.  
  10. function log(str)
  11. if debug then
  12. print(str)
  13. end
  14. end
  15.  
  16. function string.slice(str,char)
  17.     tiles={}
  18.     local i=1
  19.     while string.find(str,char) do
  20.         tiles[i]=string.sub(str,1,string.find(str,char)-1)
  21.         str=string.sub(str,string.find(str,char)+1)
  22.         i=i+1
  23.     end
  24.     return(tiles)
  25. end
  26.  
  27. function initializeRecipes()
  28. fp=fs.open("recipes","w")
  29. fp.writeLine("{}")
  30. fp.close()
  31. end
  32.  
  33. function saveRecipes()
  34. fp=fs.open("recipes","w")
  35. fp.writeLine(textutils.serialize(recipes))
  36. fp.close()
  37. end
  38.  
  39. function getRecipes()
  40. fp=fs.open("recipes","r")
  41. recipes=textutils.unserialize(fp.readAll())
  42. fp.close()
  43. end
  44.  
  45. function scanItems()
  46.     if me~=nil then
  47.         items=me.getAvailableItems()
  48.         itemById={}
  49.         for i=1,#items do
  50.             itemById[items[i].fingerprint.id..'/'..items[i].fingerprint.dmg]=items[i]
  51.         end
  52.     end
  53. end
  54.  
  55. function scanRecipe()
  56.     if tm.getStackInSlot(10)~=nil then
  57.     tmRecipe={}
  58.     meRecipe={}
  59.         for i=1,9 do
  60.         tmRecipe[i]=tm.getStackInSlot(i)
  61.             if tmRecipe[i]~=nil then
  62.                 meRecipe[i]={id=tmRecipe[i].id,dmg=tmRecipe[i].dmg}
  63.             else
  64.                 meRecipe[i]={id="",dmg=0}
  65.             end
  66.         end
  67.     meRecipe[10]={id=tm.getStackInSlot(10).id,dmg=tm.getStackInSlot(10).dmg}
  68.     recipes[meRecipe[10].id.."/"..meRecipe[10].dmg]=meRecipe
  69.     saveRecipes()
  70.     return(meRecipe)
  71.     end
  72. end
  73.  
  74. getRecipes()
  75.  
  76. function compareFP(fingerprint1,fingerprint2)
  77.     return(fingerprint1.id==fingerprint2.id and fingerprint1.dmg==fingerprint2.dmg)
  78. end
  79.  
  80. function FPEmpty(fingerprint)
  81. return(compareFP(fingerprint,nullFP))
  82. end
  83.  
  84. function countInRecipe(fingerprint,recipe)
  85.     count=0
  86.     for i=1,9 do
  87.         if compareFP(fingerprint,recipe[i]) then
  88.             count=count+1
  89.         end
  90.     end
  91.     return(count)
  92. end
  93.  
  94. function uniqeInRecipe(recipe)
  95.     recipeItems={}
  96.     n=1
  97.     for i=1,9 do
  98.         used=false
  99.         for i2=1,#recipeItems do
  100.             if compareFP(recipeItems[i2],recipe[i]) then
  101.                 used=true
  102.             end
  103.         end
  104.         if used==false then
  105.             recipeItems[n]=recipe[i]
  106.             n=n+1
  107.         end
  108.     end
  109.     return(recipeItems)
  110. end
  111.  
  112. function FPToIndex(fingerprint)
  113.     return(fingerprint.id.."/"..fingerprint.dmg)
  114. end
  115.  
  116. function indexToFP(FPIndex)
  117.     return({id=string.sub(FPIndex,1,string.find(FPIndex,'/')-1),dmg=tonumber(string.sub(FPIndex,string.find(FPIndex,'/')+1))})
  118. end
  119.  
  120. function checkRecipe(fingerprint)
  121.     local itemsMissing={}
  122.     craftPossible=true
  123.     if recipes[FPToIndex(fingerprint)]~=nil then --pråBCft ob Rezept vorhanden ist
  124.         local recipe=recipes[FPToIndex(fingerprint)]
  125.         if #itemsToCraft==1 then
  126.         scanItems()
  127.         end
  128.         recipeItems=uniqeInRecipe(recipe)
  129.         for i=1,#recipeItems do
  130.             if compareFP(recipeItems[i],nullFP)==false then
  131.                 if itemById[FPToIndex(recipeItems[i])]~=nil then
  132.                     if countInRecipe(recipeItems[i],recipe)<=itemById[FPToIndex(recipeItems[i])].size then
  133.                        
  134.                     else
  135.                         log(countInRecipe(recipeItems[i],recipe)-itemById[FPToIndex(recipeItems[i])].size.." "..recipeItems[i].id.." fehlt")
  136.                         craftPossible=false
  137.                         for i2=1,countInRecipe(recipeItems[i],recipe)-itemById[FPToIndex(recipeItems[i])].size do
  138.                             itemsMissing[#itemsMissing]=recipeItems[i]
  139.                         end
  140.                     end
  141.                 else
  142.                     log(countInRecipe(recipeItems[i],recipe).." "..recipeItems[i].id.." fehlt")
  143.                     craftPossible=false
  144.                     for i2=1,countInRecipe(recipeItems[i],recipe) do
  145.                         itemsMissing[#itemsMissing]=recipeItems[i]
  146.                     end
  147.                 end
  148.             end
  149.         end
  150.     else
  151.     log("kein Rezept fåBCr "..FPToIndex(fingerprint).." gefunden.")
  152.     craftPossible=false
  153.     end
  154. return craftPossible, itemsMissing
  155. end
  156.  
  157. function craft(fingerprint)
  158.     log("crafte: "..fingerprint.id)
  159.     itemsToCraft[#itemsToCraft+1]=FPToIndex(fingerprint)
  160.     if checkRecipe(fingerprint) then
  161.         local recipe=recipes[FPToIndex(fingerprint)]
  162.         for i=1,9 do
  163.             if FPEmpty(recipe[i])==false then
  164.                 me.exportItem(recipe[i],meSide,1,turtleSlot[i])
  165.             end
  166.         end
  167.         turtle.craft()
  168.         me.pullItem(meSide,1)
  169.         itemsToCraft[#itemsToCraft]=nil
  170.     else
  171.         local itemsMissing
  172.         craftPossible, itemsMissing = checkRecipe(fingerprint)
  173.         if itemsMissing[0]~=nil then
  174.             log("fehlende items fåBCr "..fingerprint.id..": "..textutils.serialize(itemsMissing))
  175.             for i=0,#itemsMissing do
  176.                 log(itemsMissing[i].id.." nachcraften")
  177.                 craft(itemsMissing[i])
  178.             end
  179.             if checkRecipe(fingerprint) then
  180.                 craft(fingerprint)
  181.             end
  182.         end
  183.     end
  184.  
  185. end
  186.  
  187. function crafte(fingerprint)
  188.     local i = 0
  189.         while checkRecipe(fingerprint)==false and i<100 do
  190.             itemsToCraft={}
  191.             craft(fingerprint)
  192.             i=i+1
  193.         end
  194.         itemsToCraft={}
  195.         craft(fingerprint)
  196. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement