Advertisement
HarvDad

floor

Mar 14th, 2014
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.11 KB | None | 0 0
  1. -- floor
  2. -- Lays down a floor with whatever material is provided
  3. -- Turtle returns to its starting point when mission is completed or fuel runs low
  4. -- Written by HarvDad, March 2014
  5.  
  6. args = {...}
  7. nArgs = #args
  8.  
  9. version = "floor: Rev 1.3"
  10. mission = "Lay down a floor with the supplied material"
  11. instructions = "Place stack(s) of material starting in first slot."
  12.  
  13. usage = "floor <length> <width> [level]"
  14.  
  15. x = 0
  16. y = 0
  17. z = 0
  18. face = 0
  19. minimumFuel = 100
  20. missionMessage = "Mission complete."
  21. abort = false
  22. startLevel = 0
  23. local currentFuelLevel = turtle.getFuelLevel()
  24.  
  25. if nArgs == 0 or (nArgs == 1 and args[1]== "help") then
  26. print(version)
  27. print(mission)
  28. print(instructions)
  29. print(usage)
  30. return
  31. end
  32.  
  33. if nArgs < 2 or nArgs > 3 then
  34. print(usage)
  35. return
  36. end
  37.  
  38. length = tonumber(args[1])
  39. if length == nil then
  40. print("\"", args[1], "\" is not a valid length")
  41. return
  42. end
  43. if length < 1 then
  44. print("length must be a positive number greater than zero")
  45. end
  46.  
  47. width = tonumber(args[2])
  48. if width == nil then
  49. print("\"", args[2], "\" is not a valid width")
  50. return
  51. end
  52. if width < 1 then
  53. print("width must be a positive number greater than zero")
  54. end
  55.  
  56. if nArgs == 3 then
  57. startLevel = tonumber(args[3])
  58. if startLevel == nil then
  59. print("\"", args[3], "\" is not a valid start level")
  60. return
  61. end
  62. end
  63.  
  64. targetArea = length * width
  65. areaCovered = 1
  66. currentSlot = 2
  67. materialSlot = 1
  68. maxSlot = 16
  69.  
  70. nextTurn = "left"
  71.  
  72. local clock = os.clock
  73. function sleep(n) -- seconds
  74. local t0 = clock()
  75. while clock() - t0 <= n do end
  76. end
  77.  
  78. function left()
  79. if face == 0 then face = 1 turtle.turnLeft() return end
  80. if face == 1 then face = 2 turtle.turnLeft() return end
  81. if face == 2 then face = 3 turtle.turnLeft() return end
  82. if face == 3 then face = 0 turtle.turnLeft() return end
  83. print("function left\(\): Bad face value: ", face)
  84. end
  85.  
  86. function right()
  87. if face == 0 then face = 3 turtle.turnRight() return end
  88. if face == 1 then face = 0 turtle.turnRight() return end
  89. if face == 2 then face = 1 turtle.turnRight() return end
  90. if face == 3 then face = 2 turtle.turnRight() return end
  91. print("function right\(\): Bad face value: ", face)
  92. end
  93.  
  94. function up()
  95. while turtle.detectUp() do -- This loop added in case of falling sand or whatever
  96. turtle.digUp()
  97. end
  98. turtle.up()
  99. y = y+1
  100. end
  101.  
  102. function rise(nBlocks)
  103. local i
  104. for i=1,nBlocks do
  105. up()
  106. end
  107. end
  108.  
  109. function down()
  110. if turtle.detectDown() then
  111. turtle.digDown()
  112. end
  113. turtle.down()
  114. y = y-1
  115. end
  116.  
  117. function turn()
  118. if nextTurn == "left" then
  119. left()
  120. else
  121. right()
  122. end
  123. chomp()
  124. forward()
  125. if nextTurn == "left" then
  126. left()
  127. nextTurn = "right"
  128. else
  129. right()
  130. nextTurn = "left"
  131. end
  132. areaCovered = areaCovered + 1
  133. end
  134.  
  135. function forward()
  136. while turtle.detect() do -- This loop added in case of falling sand or whatever
  137. turtle.dig()
  138. end
  139. for i=1,10 do -- This loop trys to handle pests (mob) that might be in the way
  140. if turtle.forward() then
  141. break
  142. end
  143. turtle.attack()
  144. sleep(2)
  145. end
  146. areaCovered = areaCovered + 1
  147.  
  148. if face == 0 then z = z+1 return end
  149. if face == 1 then x = x-1 return end
  150. if face == 2 then z = z-1 return end
  151. if face == 3 then x = x+1 return end
  152. end
  153.  
  154. function setFace(f)
  155. if f == 0 then
  156. if face == 0 then return end
  157. if face == 1 then right() return end
  158. if face == 2 then right() right() return end
  159. if face == 3 then left() return end
  160. end
  161.  
  162. if f == 1 then
  163. if face == 0 then left() return end
  164. if face == 1 then return end
  165. if face == 2 then right() return end
  166. if face == 3 then right() right() return end
  167. end
  168.  
  169. if f == 2 then
  170. if face == 0 then left() left() return end
  171. if face == 1 then left() return end
  172. if face == 2 then return end
  173. if face == 3 then right() return end
  174. end
  175.  
  176. if f == 3 then
  177. if face == 0 then right() return end
  178. if face == 1 then left() left() return end
  179. if face == 2 then left() return end
  180. if face == 3 then return end
  181. end
  182. end
  183.  
  184. function home(targetY)
  185. -- print("home:face ", face, ", x = ", x, ", z = ", z)
  186. if x < 0 then
  187. setFace(3)
  188. while x < 0 do
  189. forward()
  190. end
  191. else
  192. if x > 0 then
  193. setFace(1)
  194. while x > 0 do
  195. forward()
  196. end
  197. end
  198. end
  199.  
  200. if z < 0 then
  201. setFace(0)
  202. while z < 0 do
  203. forward()
  204. end
  205. else
  206. if z > 0 then
  207. setFace(2)
  208. while z > 0 do
  209. forward()
  210. end
  211. end
  212. end
  213.  
  214. if y > 0 then
  215. while y > 0 do
  216. down()
  217. end
  218. end
  219.  
  220. setFace(0)
  221. end
  222.  
  223. function strip(nBlocks)
  224. local i
  225. -- print("strip ", nBlocks)
  226. for i=1,nBlocks do
  227. chomp()
  228. checkFuel()
  229. if abort then
  230. areaCovered = targetArea
  231. end
  232.  
  233. if areaCovered < targetArea then
  234. forward()
  235. end
  236. end
  237. end
  238.  
  239. function ensureMaterial()
  240. if turtle.getItemCount(materialSlot) < 3 then
  241. organizeMaterial()
  242. end
  243. if turtle.getItemCount(materialSlot) < 3 then
  244. print("No more material")
  245. return false
  246. end
  247. return true
  248. end
  249.  
  250. function organizeMaterial()
  251. local i
  252. materialCount = turtle.getItemCount(materialSlot)
  253.  
  254. if materialCount < 3 then
  255. -- print("Attempting to refill slot ", materialSlot)
  256. for i=2,16 do
  257. turtle.select(i)
  258. if turtle.compareTo(materialSlot) then
  259. turtle.transferTo(materialSlot)
  260. end
  261. end
  262. end
  263. turtle.select(materialSlot)
  264. end
  265.  
  266. function layBlock()
  267. turtle.select(materialSlot)
  268.  
  269. if startLevel > 2 then
  270. if turtle.detectUp() then
  271. if turtle.compareUp() then
  272. return
  273. else
  274. turtle.digUp()
  275. end
  276. end
  277. if ensureMaterial() then
  278. turtle.placeUp()
  279. end
  280. else
  281. if turtle.detectDown() then
  282. if turtle.compareDown() then
  283. return
  284. else
  285. turtle.digDown()
  286. end
  287. end
  288. if ensureMaterial() then
  289. turtle.placeDown()
  290. end
  291. end
  292. end
  293.  
  294. function checkFuel()
  295. if currentFuelLevel == "unlimited" then
  296. return true
  297. end
  298.  
  299. if currentFuelLevel < minimumFuel then
  300. if not turtle.refuel() then
  301. areaCovered = targetArea
  302. missionMessage = "Mission aborted due to low fuel."
  303. abort = true
  304. return false
  305. end
  306. end
  307. return true
  308. end
  309.  
  310. -- MAIN PROGRAM
  311.  
  312. turtle.select(1)
  313.  
  314. print("fuelLevel = ", currentFuelLevel)
  315. print("l: ", length, ", w: ", width, ", f: ", face)
  316.  
  317. print("Current Fuel Level: ", currentFuelLevel)
  318.  
  319. if currentFuelLevel ~= "unlimited" then
  320. if currentFuelLevel < minimumFuel then
  321. if not turtle.refuel() then
  322. print("No fuel")
  323. return
  324. end
  325. end
  326. end
  327.  
  328.  
  329. if startLevel < 2 then
  330. rise(startLevel)
  331. else
  332. rise(startLevel-2)
  333. end
  334.  
  335. while areaCovered < targetArea do
  336. if abort then
  337. break
  338. end
  339. for w=1,width do
  340. if abort then
  341. break
  342. end
  343. for z=1,length do
  344. if abort then
  345. break
  346. end
  347. layBlock()
  348. if z < length then
  349. forward()
  350. end
  351. end
  352. if nextTurn == "left" then
  353. if areaCovered < targetArea then
  354. left()
  355. forward()
  356. left()
  357. nextTurn = "right"
  358. end
  359. else
  360. if areaCovered < targetArea then
  361. right()
  362. forward()
  363. right()
  364. nextTurn = "left"
  365. end
  366. end
  367. end
  368. end
  369. --print("Finish the main loop.")
  370.  
  371. --print(missionMessage)
  372. --print(" Current fuel level is ", turtle.getFuelLevel())
  373. home(0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement