SHOW:
|
|
- or go back to the newest paste.
| 1 | --TODO : make check for slot 1 being empty | |
| 2 | -- create exit for when chest is full | |
| 3 | ||
| 4 | ||
| 5 | --Load the saved Turtle state from disk if available, if not set to 0 | |
| 6 | function loadState() | |
| 7 | if fs.exists("xpTurtleState") then
| |
| 8 | local file = fs.open("xpTurtleState","r")
| |
| 9 | data = file.readAll() | |
| 10 | file.close() | |
| 11 | data=tonumber(data) | |
| 12 | moveState=data | |
| 13 | else | |
| 14 | print("debug -- no xpTurtleState found, setting movement state to 0\n")
| |
| 15 | moveState = 0 | |
| 16 | end | |
| 17 | end | |
| 18 | ||
| 19 | -- Save the current state to disk | |
| 20 | function saveState(a) | |
| 21 | local file = fs.open("xpTurtleState","w")
| |
| 22 | file.write(a) | |
| 23 | file.close() | |
| 24 | -- io.write(string.format("debug -- wrote %s to file\n",a))
| |
| 25 | ||
| 26 | end | |
| 27 | ||
| 28 | -- Check where the turtle is right now, and it it isn't at block 0, move there | |
| 29 | function moveToStart() | |
| 30 | loadState() | |
| 31 | -- io.write(string.format("debug -- Moving %s blocks to starting point\n", moveState))
| |
| 32 | if moveState~=nil then | |
| 33 | printStatus("moving to start", getLvl())
| |
| 34 | moveForward(moveState) | |
| 35 | end | |
| 36 | end | |
| 37 | ||
| 38 | -- Move forward with checking for blockage and save the move state | |
| 39 | function moveForward(nDistance) | |
| 40 | printStatus("moving to start", getLvl())
| |
| 41 | -- print("moveForward nDistance is ", nDistance)
| |
| 42 | while nDistance > 0 do | |
| 43 | if turtle.forward() then | |
| 44 | nDistance=nDistance-1 | |
| 45 | moveState = moveState -1 | |
| 46 | saveState(moveState) | |
| 47 | else | |
| 48 | sleep(0.5) | |
| 49 | end | |
| 50 | end | |
| 51 | end | |
| 52 | ||
| 53 | -- Move back with checking for blockage and save the move state | |
| 54 | function moveBack(nDistance) | |
| 55 | while nDistance > 0 do | |
| 56 | printStatus("moving to enchant area", curLev)
| |
| 57 | -- print("moveBack () nDistance is ", nDistance)
| |
| 58 | if turtle.back() then | |
| 59 | nDistance=nDistance-1 | |
| 60 | moveState = moveState +1 | |
| 61 | saveState(moveState) | |
| 62 | else | |
| 63 | sleep(0.5) | |
| 64 | end | |
| 65 | end | |
| 66 | end | |
| 67 | ||
| 68 | ||
| 69 | - | -- check if there's enough fuel, if not refuel from slot 16. If no fuel available, exit. |
| 69 | + | |
| 70 | - | function checkFuel() |
| 70 | + | |
| 71 | - | if turtle.getFuelLevel()<20 then |
| 71 | + | |
| 72 | - | if turtle.getItemCount(16)>=1 then |
| 72 | + | |
| 73 | - | turtle.select(16) |
| 73 | + | |
| 74 | - | turtle.refuel(1) |
| 74 | + | |
| 75 | end | |
| 76 | - | exitMsg(1) |
| 76 | + | |
| 77 | -- Check if nLvl(default=30) levels have been reached, if not wait, if yes, return true. | |
| 78 | function checkLevel(nLvl) | |
| 79 | getLvl() | |
| 80 | if curLev<nLvl then | |
| 81 | printStatus("gathering XP", curLev)
| |
| 82 | return false | |
| 83 | else | |
| 84 | printStatus("moving to enchant area", getLvl())
| |
| 85 | return true | |
| 86 | end | |
| 87 | ||
| 88 | end | |
| 89 | ||
| 90 | -- Look for items to enchant in slots 2 through 14, if there are none, default to findBooks() | |
| 91 | function getItems() | |
| 92 | for i=2,14 do | |
| 93 | if turtle.getItemCount(i)>0 then | |
| 94 | turtle.select(i) | |
| 95 | turtle.transferTo(1,1) | |
| 96 | turtle.select(1) | |
| 97 | return true | |
| 98 | end | |
| 99 | end | |
| 100 | -- print("no items found, trying to find books")
| |
| 101 | if findBook() then | |
| 102 | -- print("Books found")
| |
| 103 | return true | |
| 104 | else | |
| 105 | return false | |
| 106 | end | |
| 107 | ||
| 108 | end | |
| 109 | ||
| 110 | -- Get books from inventory slot 15 and put 1 in slot 1, returning true, if not return false | |
| 111 | function findBook() | |
| 112 | if turtle.getItemCount(15)>=1 then | |
| 113 | turtle.select(15) | |
| 114 | turtle.transferTo(1,1) | |
| 115 | turtle.select(1) | |
| 116 | return true | |
| 117 | else | |
| 118 | return false | |
| 119 | end | |
| 120 | end | |
| 121 | ||
| 122 | -- enchant the book in slot one and drop it into the chest underneath the turtle | |
| 123 | function enchantBook(nLvl) | |
| 124 | if m.enchant(nLvl) then | |
| 125 | turtle.dropDown() | |
| 126 | else | |
| 127 | error("Unexpected error while trying to enchant")
| |
| 128 | end | |
| 129 | ||
| 130 | end | |
| 131 | ||
| 132 | -- End program with a message | |
| 133 | ||
| 134 | function exitMsg(exitNr) | |
| 135 | if exitNr == 1 then exitStr="Out of fuel. Place more fuel in slot 16 and restart the program" | |
| 136 | elseif exitNr == 2 then exitStr="No more items or books" | |
| 137 | -- elseif exitNr == 3 then exitStr="" | |
| 138 | -- elseif exitNr == 4 then exitStr="" | |
| 139 | -- elseif exitNr == then exitStr="" | |
| 140 | ||
| 141 | end | |
| 142 | term.clear() | |
| 143 | term.setCursorPos(2,2) | |
| 144 | sleep(0.5) | |
| 145 | print(exitStr) | |
| 146 | run.state="end" | |
| 147 | end | |
| 148 | ||
| 149 | ||
| 150 | ||
| 151 | function printIntro() | |
| 152 | term.clear() | |
| 153 | print("---------------------------------------")
| |
| 154 | print("------- XPturtle 0.2 by Gili710 -------")
| |
| 155 | print("---------------------------------------")
| |
| 156 | print() | |
| 157 | print("This turtle will automatically enchant items in its inventory")
| |
| 158 | print("Place any items in slots 2 through 14")
| |
| 159 | print("Place some books in slot 15.")
| |
| 160 | print("Place some fuel in slot 16")
| |
| 161 | print("Press any key to start")
| |
| 162 | print() | |
| 163 | ||
| 164 | end | |
| 165 | ||
| 166 | function printStatus(curTask, curLvl) | |
| 167 | term.clear() | |
| 168 | term.setCursorPos(1,1) | |
| 169 | print("------- XPturtle 0.2 by Gili710 -------")
| |
| 170 | term.setCursorPos(2,4) | |
| 171 | io.write(string.format("Current Task: %s", curTask))
| |
| 172 | term.setCursorPos(2,6) | |
| 173 | io.write(string.format("Current Level: %s", curLvl))
| |
| 174 | end | |
| 175 | ||
| 176 | ||
| 177 | --INIT | |
| 178 | m=peripheral.wrap("right")
| |
| 179 | m.setAutoCollect(true) | |
| 180 | nLvl=30 | |
| 181 | run = {}
| |
| 182 | run.state="running" | |
| 183 | screenw, screenh = term.getSize() | |
| 184 | ||
| 185 | -- Main Program | |
| 186 | ||
| 187 | printIntro() | |
| 188 | os.pullEvent() | |
| 189 | if run.state=="running" then | |
| 190 | moveToStart() | |
| 191 | end | |
| 192 | ||
| 193 | ||
| 194 | ||
| 195 | -- start main loop | |
| 196 | while run.state=="running" do | |
| 197 | while not checkLevel(nLvl) do | |
| 198 | sleep(1) | |
| 199 | ||
| 200 | - | checkFuel() |
| 200 | + | |
| 201 | ||
| 202 | loadState() | |
| 203 | ||
| 204 | -- Extra safety here | |
| 205 | while moveState ~= 5 do | |
| 206 | moveToStart() | |
| 207 | moveBack(5) | |
| 208 | end | |
| 209 | printStatus("enchanting", getLvl())
| |
| 210 | sleep(2) | |
| 211 | if getItems() then | |
| 212 | enchantBook(nLvl) | |
| 213 | - | checkFuel() |
| 213 | + | |
| 214 | moveForward(5) | |
| 215 | else | |
| 216 | exitMsg(2) | |
| 217 | end | |
| 218 | end |