Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require("Class")
- require("BasicTaskModule")
- ---@class TreeCuttingTaskModule : TaskModule
- TreeCuttingTaskModule = Class(TaskModule)
- TreeCuttingTaskModule.states = {
- PLANTING = {},
- CUTTING = {},
- WAITING = {},
- UNLOADING = {},
- IDLE = {}
- }
- TreeCuttingTaskModule.WAIT_TIME = 60
- function TreeCuttingTaskModule:init()
- self:initStates(TreeCuttingTaskModule.states)
- self.state = self.states.IDLE
- self.waitingIx = 0
- if self:handleStart() then
- while true do
- if self:isWaiting() then
- self:handleWaiting()
- elseif self:isPlanting() then
- if not self:handlePlating() then
- self:debug("Error: no more saplings.")
- break
- end
- elseif self:isCutting() then
- self:handleCutting()
- else
- if not self:handleUnloading() then
- self:debug("Error: no more free space in the chest.")
- break
- end
- end
- end
- end
- end
- function TreeCuttingTaskModule:isWaiting()
- return self.state == self.states.WAITING
- end
- function TreeCuttingTaskModule:isCutting()
- return self.state == self.states.CUTTING
- end
- function TreeCuttingTaskModule:isPlanting()
- return self.state == self.states.PLANTING
- end
- function TreeCuttingTaskModule:isUnloading()
- return self.state == self.states.UNLOADING
- end
- function TreeCuttingTaskModule:handleStart()
- local hasBlock,itemDetails = turtle.inspect()
- if hasBlock then
- if self:isLog(itemDetails) then
- self:changeState(self.states.CUTTING)
- elseif self:isSapling(itemDetails) then
- self:changeState(self.states.WAITING)
- else
- self:debug("Error: invalid block in front.")
- return false
- end
- else
- self:changeState(self.states.PLANTING)
- end
- self:rotate180()
- if not self:placeChest() then
- self:rotate180()
- self:debug("Error: no chest in inventory.")
- return false
- end
- self:rotate180()
- return true
- end
- function TreeCuttingTaskModule:handleCutting()
- self:moveForward()
- local ix = 0
- while true do
- ix = ix + 1
- self:moveUp()
- local hasBlock,itemDetails = turtle.inspectUp()
- if not self:isLog(itemDetails) then
- break
- end
- end
- for i=1,ix do
- self:moveDown()
- end
- self:moveBack()
- self:changeState(self.states.UNLOADING)
- end
- ---@param itemDetails table
- function TreeCuttingTaskModule:isLog(itemDetails)
- return itemDetails and itemDetails.tags and itemDetails.tags[ItemTags.logs]
- end
- ---@param itemDetails table
- function TreeCuttingTaskModule:isSapling(itemDetails)
- return itemDetails and itemDetails.tags and itemDetails.tags[ItemTags.saplings]
- end
- function TreeCuttingTaskModule:handlePlating()
- if self:selectItemSlotByTag(ItemTags.saplings) then
- self:place()
- self:changeState(self.states.WAITING)
- else
- return false
- end
- return true
- end
- function TreeCuttingTaskModule:handleUnloading()
- local itemsDropped = false
- self:rotate180()
- itemsDropped = self:dropItemByTag(ItemTags.logs)
- self:rotate180()
- self:changeState(self.states.PLANTING)
- return itemsDropped
- end
- function TreeCuttingTaskModule:handleWaiting()
- local hasBlock,itemDetails = turtle.inspect()
- if not hasBlock then
- self:changeState(self.states.PLANTING)
- self.waitingIx = 0
- else
- if self:isLog(itemDetails) then
- self:changeState(self.states.CUTTING)
- self.waitingIx = 0
- else
- sleep(self.WAIT_TIME)
- self.waitingIx = self.waitingIx + 1
- self:debug("Waiting iteration: %d",self.waitingIx)
- end
- end
- end
- TreeCuttingTaskModule()
Add Comment
Please, Sign In to add comment