Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local function TurnBack()
- turtle.turnLeft()
- turtle.turnLeft()
- end
- ---@class ItemManager
- ---@field __ReservedSlot number
- ---@field __AllowDropWhenExceed boolean
- ---@field private __AllowSave boolean
- ---@field private __Slots integer[]
- ---@field private __GetName fun(self: ItemManager):string
- ---@field private __Scanimpl fun(self: ItemManager, WhenFoundFunc: "fun(Slot: integer):void")
- ---@field Scan fun(self: ItemManager)
- ---@field private __GetItemSlot fun(self:ItemManager):integer|nil
- ---@field Place fun(self: ItemManager, place_fn: "fun():boolean,string"):boolean,string
- ---@field DropWhenExceed fun(self: ItemManager):void `AllowDropWhenExceed`が`true`のとき、手持ちに1slot分だけ残して後ろにアイテムをすべて吐き出す。`Scan`を呼んだのと同じ事後効果を持つ
- ---@field IsSavableSlot fun(self: ItemManager, Slot: integer):boolean
- local ItemManager = {}
- ---@param ReservedSlot number 管理対象アイテムが必ず存在するスロット番号
- ---@param AllowDropWhenExceed boolean 一定数ストックした後はドロップを許可するか
- ---@param AllowSave boolean 一定数ストックを残してチェストへの格納を許可するか
- ItemManager.New = function (ReservedSlot, AllowDropWhenExceed, AllowSave)
- local re = {
- __ReservedSlot = ReservedSlot,
- __AllowDropWhenExceed = AllowDropWhenExceed,
- __AllowSave = AllowSave,
- __Slots = {},
- ---@param self ItemManager
- ---@param WhenFoundFunc fun(Slot: integer)
- __Scanimpl = function (self, WhenFoundFunc)
- local init_slot = turtle.getSelectedSlot() -- 退避
- ---@type integer[]
- for i = 1, 16 do
- if i ~= self.__ReservedSlot then
- turtle.select(i)
- if turtle.compareTo(self.__ReservedSlot) then
- WhenFoundFunc(i)
- end
- end
- end
- turtle.select(init_slot)
- end,
- __GetName = function (self)
- return turtle.getItemDetail(self.__ReservedSlot).name
- end,
- ---@param self ItemManager
- Scan = function (self)
- ---@type integer[]
- local re = { self.__ReservedSlot }
- self:__Scanimpl(function (Slot) table.insert(re, Slot) end)
- self.__Slots = re
- --PrintArray(self:__GetName(), self.__Slots)
- end,
- ---使用するスロット番号を求める
- ---
- ---末尾のスロットから使うようにする
- ---@param self ItemManager
- __GetItemSlot = function (self)
- if #self.__Slots == 0 then
- return nil
- elseif 1 < #self.__Slots then
- return self.__Slots[#self.__Slots]
- elseif turtle.getItemCount(self.__Slots[#self.__Slots]) == 1 then
- return nil
- end
- return self.__Slots[#self.__Slots]
- end,
- ---@param self ItemManager
- ---@param place_fn fun():boolean,string
- Place = function (self, place_fn)
- local slot = self:__GetItemSlot()
- if not slot then return false end
- local init_slot = turtle.getSelectedSlot() -- 退避
- --debug_print(string.format("ItemManager(%s): %d -> %d", self:__GetName(), init_slot, slot))
- turtle.select(slot)
- local re, message = place_fn()
- --PrintArray(self:__GetName(), self.__Slots)
- if re and turtle.getItemCount(self.__Slots[#self.__Slots]) == 0 then
- table.remove(self.__Slots, #self.__Slots)
- end
- --debug_print(string.format("ItemManager(%s): %d -> %d", self:__GetName(), slot, init_slot))
- turtle.select(init_slot)
- return re, message
- end,
- ---`AllowDropWhenExceed`が`true`のとき、手持ちに1slot分だけ残して後ろにアイテムをすべて吐き出す。`Scan`を呼んだのと同じ事後効果を持つ
- ---@param self ItemManager
- DropWhenExceed = function (self)
- if not self.__AllowDropWhenExceed then
- return
- end
- self:__Scanimpl(function (Slot)
- TurnBack()
- turtle.drop()
- TurnBack()
- end)
- self.__Slots = { self.__ReservedSlot }
- end,
- ---@param self ItemManager
- ---@param Slot integer
- IsSavableSlot = function(self, Slot)
- if self.__AllowSave then
- return Slot ~= self.__ReservedSlot
- end
- for _, value in ipairs(self.__Slots) do
- if Slot == value then
- return false
- end
- end
- return true
- end
- }
- re:Scan()
- return re
- end
- local function Dig(digFunc, inspectFunc)
- local blockExist, itemInfo = inspectFunc()
- if blockExist then
- if itemInfo.name == "appliedenergistics2:quartz_ore" or itemInfo.name == "appliedenergistics2:charged_quartz_ore" then
- print("Certus Quarts is found! Please dig target block yourself.")
- while blockExist do
- blockExist, itemInfo = inspectFunc()
- end
- else
- local result, message = digFunc()
- if not result then
- print(message)
- end
- end
- end
- end
- local arg1, arg2, arg3 = ...
- local MaxDigCount = tonumber(arg1)
- local CurrentDigCount = tonumber(arg2) + 1
- local TorchManager = ItemManager.New(1, false, false)
- local StoneManager = ItemManager.New(2, false, false)
- local TorchInterval = tonumber(arg3)
- for i = CurrentDigCount, MaxDigCount do
- print(string.format("Current: %d Max: %d", i, MaxDigCount))
- while turtle.detect() do
- Dig(turtle.dig, turtle.inspect)
- end
- turtle.forward()
- Dig(turtle.digUp, turtle.inspectUp)
- Dig(turtle.digDown, turtle.inspectDown)
- if i % TorchInterval == 0 then
- local PlaceResult = TorchManager:Place(turtle.placeDown)
- if not PlaceResult then
- turtle.down()
- if not turtle.detectDown() then
- StoneManager:Place(turtle.placeDown)
- end
- turtle.up()
- TorchManager:Place(turtle.placeDown)
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement