Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local modemSide = "left"
- local SIZE = 5
- assert(peripheral.isPresent(modemSide), "Wireless modem kell a Turtle bal oldalára!")
- rednet.open(modemSide)
- -- Kezdőpont
- local x0, y0, z0 = gps.locate() x0, y0, z0 = x0 or 0, y0 or 0, z0 or 0
- local currX, currY, currZ = x0, y0, z0
- local facing = 1 -- 1 = EAST, mert az első sorban jobbra kell mennie!
- local state = "mine"
- local function forward()
- if turtle.forward() then
- if facing == 0 then currZ = currZ - 1
- elseif facing == 1 then currX = currX + 1
- elseif facing == 2 then currZ = currZ + 1
- elseif facing == 3 then currX = currX - 1 end
- return true
- end
- return false
- end
- local function turnLeft() facing = (facing + 3) % 4; turtle.turnLeft() end
- local function turnRight() facing = (facing + 1) % 4; turtle.turnRight() end
- local function down() if turtle.down() then currY = currY - 1; return true end return false end
- local function up() if turtle.up() then currY = currY + 1; return true end return false end
- local function goTo(x, y, z)
- while currY < y do up() end
- while currY > y do down() end
- while currX < x do while facing ~= 1 do turnRight() end; forward() end
- while currX > x do while facing ~= 3 do turnRight() end; forward() end
- while currZ < z do while facing ~= 2 do turnRight() end; forward() end
- while currZ > z do while facing ~= 0 do turnRight() end; forward() end
- end
- local function refuelIfNeeded()
- if turtle.getFuelLevel() < 20 and turtle.getItemCount(1) > 0 then
- turtle.select(1) turtle.refuel(1)
- end
- end
- local function isInventoryFull()
- for i=2,16 do if turtle.getItemCount(i)==0 then return false end end
- return true
- end
- local function dropAllExceptFuel()
- for i=2,16 do turtle.select(i) turtle.drop() end
- turtle.select(1)
- end
- local function reportStatus(rel_x, rel_z, layerStartX, layerStartZ)
- local status = {
- id = os.getComputerID(),
- active = true,
- x = currX, y = currY, z = currZ,
- fuel = turtle.getFuelLevel(),
- rel_x = rel_x, rel_z = rel_z,
- layerStartX = layerStartX, layerStartZ = layerStartZ
- }
- rednet.broadcast(textutils.serialize(status), "turtle_status")
- end
- local function mineSnake()
- -- Bal alsó sarokban indul keletre (facing = 1)
- local layerStartX, layerStartZ = currX, currZ
- local rel_x, rel_z = 1, 1
- for row = 1, SIZE do
- -- 5 mezőt megy minden sorban (első sor: 1,1 .. 5,1; második: 5,2 .. 1,2, stb.)
- for step = 1, SIZE-1 do
- turtle.dig()
- forward()
- if (row % 2 == 1) then rel_x = rel_x + 1 else rel_x = rel_x - 1 end
- reportStatus(rel_x, rel_z, layerStartX, layerStartZ)
- refuelIfNeeded()
- if isInventoryFull() then
- goTo(layerStartX, currY, layerStartZ)
- dropAllExceptFuel()
- goTo(currX, currY, currZ)
- end
- end
- -- Sor végén, ha nem az utolsó sor, ásson le!
- if row < SIZE then
- if (row % 2 == 1) then turnRight() else turnLeft() end
- turtle.digDown()
- if down() then
- rel_z = rel_z + 1
- reportStatus(rel_x, rel_z, layerStartX, layerStartZ)
- else
- return
- end
- if (row % 2 == 1) then turnRight() else turnLeft() end
- end
- end
- end
- local function mineFull()
- while true do
- mineSnake()
- -- Réteg után vissza bal alsó sarokba, majd új réteg le
- goTo(x0, currY, z0)
- if not turtle.detectDown() then
- turtle.digDown()
- if not down() then break end
- else
- break
- end
- end
- end
- parallel.waitForAny(
- function()
- while true do
- local _, msg, _ = rednet.receive("turtle_cmd")
- if msg == "home" then
- state = "home"
- elseif msg == "resume" then
- state = "mine"
- end
- end
- end,
- function()
- while true do
- if state == "home" then
- goTo(x0, y0, z0)
- while state == "home" do os.sleep(0.1) end
- elseif state == "mine" then
- mineFull()
- goTo(x0, y0, z0)
- while state == "home" do os.sleep(0.1) end
- end
- end
- end
- )
Advertisement
Add Comment
Please, Sign In to add comment