Advertisement
Kamioda

minecraft_straight_dig_ver2

Jul 13th, 2021 (edited)
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.35 KB | None | 0 0
  1. local function TurnBack()
  2. turtle.turnLeft()
  3. turtle.turnLeft()
  4. end
  5.  
  6. ---@class ItemManager
  7. ---@field __ReservedSlot number
  8. ---@field __AllowDropWhenExceed boolean
  9. ---@field private __AllowSave boolean
  10. ---@field private __Slots integer[]
  11. ---@field private __GetName fun(self: ItemManager):string
  12. ---@field private __Scanimpl fun(self: ItemManager, WhenFoundFunc: "fun(Slot: integer):void")
  13. ---@field Scan fun(self: ItemManager)
  14. ---@field private __GetItemSlot fun(self:ItemManager):integer|nil
  15. ---@field Place fun(self: ItemManager, place_fn: "fun():boolean,string"):boolean,string
  16. ---@field DropWhenExceed fun(self: ItemManager):void `AllowDropWhenExceed`が`true`のとき、手持ちに1slot分だけ残して後ろにアイテムをすべて吐き出す。`Scan`を呼んだのと同じ事後効果を持つ
  17. ---@field IsSavableSlot fun(self: ItemManager, Slot: integer):boolean
  18. local ItemManager = {}
  19. ---@param ReservedSlot number 管理対象アイテムが必ず存在するスロット番号
  20. ---@param AllowDropWhenExceed boolean 一定数ストックした後はドロップを許可するか
  21. ---@param AllowSave boolean 一定数ストックを残してチェストへの格納を許可するか
  22. ItemManager.New = function (ReservedSlot, AllowDropWhenExceed, AllowSave)
  23. local re = {
  24. __ReservedSlot = ReservedSlot,
  25. __AllowDropWhenExceed = AllowDropWhenExceed,
  26. __AllowSave = AllowSave,
  27. __Slots = {},
  28. ---@param self ItemManager
  29. ---@param WhenFoundFunc fun(Slot: integer)
  30. __Scanimpl = function (self, WhenFoundFunc)
  31. local init_slot = turtle.getSelectedSlot() -- 退避
  32. ---@type integer[]
  33. for i = 1, 16 do
  34. if i ~= self.__ReservedSlot then
  35. turtle.select(i)
  36. if turtle.compareTo(self.__ReservedSlot) then
  37. WhenFoundFunc(i)
  38. end
  39. end
  40. end
  41. turtle.select(init_slot)
  42. end,
  43. __GetName = function (self)
  44. return turtle.getItemDetail(self.__ReservedSlot).name
  45. end,
  46. ---@param self ItemManager
  47. Scan = function (self)
  48. ---@type integer[]
  49. local re = { self.__ReservedSlot }
  50. self:__Scanimpl(function (Slot) table.insert(re, Slot) end)
  51. self.__Slots = re
  52. --PrintArray(self:__GetName(), self.__Slots)
  53. end,
  54. ---使用するスロット番号を求める
  55. ---
  56. ---末尾のスロットから使うようにする
  57. ---@param self ItemManager
  58. __GetItemSlot = function (self)
  59. if #self.__Slots == 0 then
  60. return nil
  61. elseif 1 < #self.__Slots then
  62. return self.__Slots[#self.__Slots]
  63. elseif turtle.getItemCount(self.__Slots[#self.__Slots]) == 1 then
  64. return nil
  65. end
  66. return self.__Slots[#self.__Slots]
  67. end,
  68. ---@param self ItemManager
  69. ---@param place_fn fun():boolean,string
  70. Place = function (self, place_fn)
  71. local slot = self:__GetItemSlot()
  72. if not slot then return false end
  73. local init_slot = turtle.getSelectedSlot() -- 退避
  74. --debug_print(string.format("ItemManager(%s): %d -> %d", self:__GetName(), init_slot, slot))
  75. turtle.select(slot)
  76. local re, message = place_fn()
  77. --PrintArray(self:__GetName(), self.__Slots)
  78. if re and turtle.getItemCount(self.__Slots[#self.__Slots]) == 0 then
  79. table.remove(self.__Slots, #self.__Slots)
  80. end
  81. --debug_print(string.format("ItemManager(%s): %d -> %d", self:__GetName(), slot, init_slot))
  82. turtle.select(init_slot)
  83. return re, message
  84. end,
  85. ---`AllowDropWhenExceed`が`true`のとき、手持ちに1slot分だけ残して後ろにアイテムをすべて吐き出す。`Scan`を呼んだのと同じ事後効果を持つ
  86. ---@param self ItemManager
  87. DropWhenExceed = function (self)
  88. if not self.__AllowDropWhenExceed then
  89. return
  90. end
  91. self:__Scanimpl(function (Slot)
  92. TurnBack()
  93. turtle.drop()
  94. TurnBack()
  95. end)
  96. self.__Slots = { self.__ReservedSlot }
  97. end,
  98. ---@param self ItemManager
  99. ---@param Slot integer
  100. IsSavableSlot = function(self, Slot)
  101. if self.__AllowSave then
  102. return Slot ~= self.__ReservedSlot
  103. end
  104. for _, value in ipairs(self.__Slots) do
  105. if Slot == value then
  106. return false
  107. end
  108. end
  109. return true
  110. end
  111. }
  112. re:Scan()
  113. return re
  114. end
  115.  
  116. local function Dig(digFunc, inspectFunc)
  117. local blockExist, itemInfo = inspectFunc()
  118. if blockExist then
  119. if itemInfo.name == "appliedenergistics2:quartz_ore" or itemInfo.name == "appliedenergistics2:charged_quartz_ore" then
  120. print("Certus Quarts is found! Please dig target block yourself.")
  121. while blockExist do
  122. blockExist, itemInfo = inspectFunc()
  123. end
  124. else
  125. local result, message = digFunc()
  126. if not result then
  127. print(message)
  128. end
  129. end
  130. end
  131. end
  132.  
  133. local arg1, arg2, arg3 = ...
  134. local MaxDigCount = tonumber(arg1)
  135. local CurrentDigCount = tonumber(arg2) + 1
  136. local TorchManager = ItemManager.New(1, false, false)
  137. local StoneManager = ItemManager.New(2, false, false)
  138. local TorchInterval = tonumber(arg3)
  139. for i = CurrentDigCount, MaxDigCount do
  140. print(string.format("Current: %d Max: %d", i, MaxDigCount))
  141. while turtle.detect() do
  142. Dig(turtle.dig, turtle.inspect)
  143. end
  144. turtle.forward()
  145. Dig(turtle.digUp, turtle.inspectUp)
  146. Dig(turtle.digDown, turtle.inspectDown)
  147. if i % TorchInterval == 0 then
  148. local PlaceResult = TorchManager:Place(turtle.placeDown)
  149. if not PlaceResult then
  150. turtle.down()
  151. if not turtle.detectDown() then
  152. StoneManager:Place(turtle.placeDown)
  153. end
  154. turtle.up()
  155. TorchManager:Place(turtle.placeDown)
  156. end
  157. end
  158. end
  159.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement