main2:254: vm error: java.lang.ArrayIndexOutOfBoundsException: 256
I've not had much experience with CC before now and I'm a hobbiest programmer at best. I can't figure out what I'm doing wrong. Would anyone mind having a look for me? I know it's a bit messy in places and that there is a fair bit of it, but I'd really appreciate some help.
Lines 254 - 256 are in the checkIfFull() function which is supposed to loop through all the inventory slots that aren't being used for identifying unwanted blocks (dirt, stone, sand, gravel) and tell if they contain items. If they all do it'll place an ender chest and deposit them.
The Code:
Spoiler
-- quarry local centerX = 0 local centerY = 0 local size = 20 -- turtle local status = 0 local curDir = "x" local moveDir = 1 local justTurned = 0 local travelHeight = 0 local ignoreList = 0 local surfaceZ = 249 local startup = false --[[------- Param.txt ----------- status moveDir justTurned ignoreList surfaceZ ]]--------- patMap = { {0, 0, 0, 1, 0}, {1, 0, 0, 0, 0}, {0, 0, 2, 0, 0}, {0, 0, 0, 0, 1}, {0, 1, 0, 0, 0}}; -- ####################################################################### -- Basic movement and navigation -- ####################################################################### function refuelTurtle() if turtle.getFuelLevel() < 10 then -- keeps digging up until it can place the ender chest while turtle.detectUp() do turtle.digUp() os.sleep(1) end turtle.select(13) turtle.placeUp() -- keeps trying to get and use fuel until it manages while true do turtle.select(12) turtle.suckUp() if turtle.getItemCount(12) > 0 then break end os.sleep(5) end -- uses some of the fuel and keeps trying to return the rest turtle.refuel(1) while true do turtle.dropUp() if turtle.getItemCount(12) == 0 then break end os.sleep(5) end -- breaks the ender chest turtle.select(13) turtle.digUp() end end -- ####################################################################### function dig(dir) if checkIfFull() then depositOres() end -- keeps breaking blocks until their are no blocks or it is unbreakable if dir == "up" then -- keeps trying to dig the block in front while turtle.detectUp() do -- if it is not mineable then return false if not turtle.digUp() then return false end -- wait for sand / gravel to fall os.sleep(1) -- if there is still no block then return true if not turtle.detectUp() then return true end end -- if there was never any block then return false return false elseif dir == "down" then while turtle.detectDown() do if not turtle.digDown() then return false end os.sleep(1) if not turtle.detectDown() then return true end end return false else while turtle.detect() do if not turtle.dig() then return false end os.sleep(1) if not turtle.detect() then return true end end return false end end -- ####################################################################### function moveTurtle(dir,mining) refuelTurtle() if mining and dir ~= "back" then dig(dir) end if dir == "up" then while not turtle.up() do os.sleep(2) end elseif dir == "down" then while not turtle.down() do os.sleep(2) end elseif dir == "back" then while not turtle.back() do os.sleep(2) end else while not turtle.forward() do os.sleep(2) end end end -- ####################################################################### function turnTurtle(dir) if dir == "right" or nil then turtle.turnRight() if curDir == "n" then curDir = "e" elseif curDir == "e" then curDir = "s" elseif curDir == "s" then curDir = "w" elseif curDir == "w" then curDir = "n" end elseif dir == "left" then turtle.turnLeft() if curDir == "n" then curDir = "w" elseif curDir == "w" then curDir = "s" elseif curDir == "s" then curDir = "e" elseif curDir == "e" then curDir = "n" end end end -- ####################################################################### function turnTurtleTo(dir) -- turn right if that is fastest if curDir == "n" and dir == "e" then turnTurtle("right") elseif curDir == "e" and dir == "s" then turnTurtle("right") elseif curDir == "s" and dir == "w" then turnTurtle("right") elseif curDir == "w" and dir == "n" then turnTurtle("right") end -- turn left if that is fastest if curDir == "n" and dir == "w" then turnTurtle("left") elseif curDir == "w" and dir == "s" then turnTurtle("left") elseif curDir == "s" and dir == "e" then turnTurtle("left") elseif curDir == "e" and dir == "n" then turnTurtle("left") end -- default to turn right if neither right or left is fastest while curDir ~= dir do turnTurtle("right") end end -- ####################################################################### function getDirection() -- take gps reading 1 local x1, y1, z1 = gps.locate(5) -- move turtle and take reading 2 moveTurtle("forward",true) local x2, y2, z2 = gps.locate(5) -- return turtle to starting position moveTurtle("back",true) -- compare reading 1 and 2 to figure out the turtles direction if x2 > x1 then curDir = "e" elseif x2 < x1 then curDir = "w" elseif y2 > y1 then curDir = "s" else curDir = "n" end end -- ####################################################################### function moveTurtleTo(desX,desY,desZ) local curX,curY,curZ = gps.locate(5) -- Z / vertical movement local zDif = desZ - curZ local zDir = -1 if desZ > curZ then zDir = 1 end for i = curZ+zDir, desZ, zDir do if zDir == 1 then moveTurtle("up",true) else moveTurtle("down",true) end end -- X movement (+east/-west) local xDif = desX - curX local xDir = -1 if desX > curX then xDir = 1 turnTurtleTo("e") elseif desX < curX then turnTurtleTo("w") end for i = curX+xDir, desX, xDir do moveTurtle("forward",true) end -- Y movement (-north/+south) local yDif = desY - curY local yDir = -1 if desY > curY then yDir = 1 turnTurtleTo("s") elseif desX < curY then turnTurtleTo("n") end for i = curY+yDir, desY, yDir do moveTurtle("forward",true) end end -- ####################################################################### -- ####################################################################### -- Quarry Specific -- ####################################################################### function changeStatus(str) if str == "start" then status = 0 elseif str == "row" then status = 1 elseif str == "corner" then status = 2 elseif str == "dig" then status = 3 elseif str == "surface" then status = 4 end saveParams() print("status changed to: "..str) end -- ####################################################################### function checkOres() print ("checking ores") for i = 0, 3 do for ii = 1, ignoreList do turtle.select(ii) if turtle.compare() then break end if ii == ignoreList then dig("forward") end end turnTurtle("right") end end -- ####################################################################### function depositOres() dig("up") turtle.select(14) turtle.placeUp() for i = ignoreList + 1, 11 do if turtle.getItemCount(i) > 0 then turtle.select(i) while not turtle.dropUp() do os.sleep(5) end end end end -- ####################################################################### function checkIfFull() for i = ignoreList+1, 11 do if turtle.getItemCount(i) == 0 then return false end if i == 11 then return true end end end -- ####################################################################### function checkColumn() local curX,curY,curZ = gps.locate(5) if patMap[(curX % 5)+1][(curY % 5)+1] > 0 then return true end end -- ####################################################################### function digColumn() changeStatus("dig") -- find surface if not startup then while not turtle.detectDown() do moveTurtle("down") end end -- remeber surface Z (might sometimes end up in a tree or similar) local curX,curY,curZ = gps.locate(5) --surfaceZ = curZ -- dig down to bedrock while true do checkOres() turtle.digDown() if not turtle.down() then returnToSurface() break end end end -- ####################################################################### function returnToSurface() changeStatus("surface") local curX,curY,curZ = gps.locate(5) for i = curZ, surfaceZ-1 do moveTurtle("up",true) end if startup then getDirection() startup = false end turnTurtleTo(moveDir) moveTurtle("forward",true) changeStatus("row") end -- ####################################################################### function nextRow() if startup then getDirection() startup = false end local curX,curY,curZ = gps.locate(5) if curX == 10 and justTurned == 0 then changeStatus("corner") moveTurtleTo(curX,curY+1,249) justTurned = 1 moveDir = "w" changeStatus("row") elseif curX == -10 and justTurned == 0 then changeStatus("corner") moveTurtleTo(curX,curY+1,249) justTurned = 1 moveDir = "e" changeStatus("row") else changeStatus("row") end end -- ####################################################################### function populateIgnoreList() for i = 1, 11 do if turtle.getItemCount(i) == 0 then break end ignoreList = ignoreList + 1 end end -- ####################################################################### -- ####################################################################### -- File management and startup -- ####################################################################### function makeStartupFile() outputFile = io.open("startup", "a") outputFile:write("\nshell.run(\"") outputFile:write(shell.getRunningProgram()) outputFile:write("\")\n") outputFile:close() end -- ####################################################################### function readLine(file) nextLine = file.readLine() if (nextLine ~= nil) then return tonumber(nextLine) end end -- ####################################################################### function saveParams() outputFile = io.open("Params.txt", "w") outputFile:write(status) outputFile:write("\n") local temp if moveDir == "n" then temp = 0 elseif moveDir == "e" then temp = 1 elseif moveDir == "s" then temp = 2 elseif moveDir == "w" then temp = 3 end outputFile:write(temp) outputFile:write("\n") outputFile:write(justTurned) outputFile:write("\n") outputFile:write(ignoreList) outputFile:write("\n") --outputFile:write(surfaceZ) --outputFile:write("\n") --[[ outputFile:write(status) outputFile:write("\n") ]]-- outputFile:close() end -- ####################################################################### function loadParams() file = fs.open("Params.txt", "r") if file ~= nil then status = readLine(file) temp = readLine(file) if temp == 0 then moveDir = "n" elseif temp == 1 then moveDir = "e" elseif temp == 2 then moveDir = "s" elseif temp == 3 then moveDir = "w" end print("moveDir: "..moveDir) justTurned = readLine(file) ignoreList = readLine(file) --surfaceZ = readLine(file) file.close() end end -- ####################################################################### -- Program Proper -- ####################################################################### -- if there is a startup file then wait for the world to load if fs.exists("startup") then print("waiting for world to load") startup = true sleep(5) loadParams() else populateIgnoreList() saveParams() makeStartupFile() end -- program loop while true do -- STARTING POSITION if status == 0 then changeStatus("start") getDirection() moveTurtleTo(centerX-9,centerY-10,249) turnTurtleTo("e") moveDir = "e" changeStatus("row") end -- ROW while status == 1 do local curX,curY,curZ = gps.locate(5) -- check if column is to be mined print("checking if column needs mining") if checkColumn() then digColumn() end print("checking if last column is finished") -- stop if at end of last row if curX == 10 and curY == 10 then status = 10 break end -- cornering: move to start of next row if at end of current nextRow() -- face the right direction and move forward turnTurtleTo(moveDir) moveTurtle("forward",true) justTurned = 0 end -- CORNERING if status == 2 then print("resuming cornering") nextRow() end -- DIG DOWN if status == 3 then print("resuming digging down") digColumn() end -- SURFACE while status == 4 do print("resuming returning to surface") returnToSurface() end -- -- END PROGRAM if status == 10 then break end end -- clean up after turtle has finished routine if fileExists("startup") then fs.delete("startup") end if fileExists("Params.txt") then fs.delete("Params.txt") end
Cheers,