-- URL: https://pastebin.com/QbSGDWvG -- Run this on startup: -- Get the script: pastebin get QbSGDWvG turtle_server -- edit startup -- paste: shell.run("turtle_server") -- Reboot to check it's working -- Run update script on startup print("=== Turtle Server Starting ===") print("Running update script...") shell.run("update") print("Update complete. Starting turtle server...") -- Mainframe communication local MAINFRAME_ID = nil -- Function to discover mainframe ID via broadcast local function discoverMainframe() if MAINFRAME_ID then return MAINFRAME_ID end print("Broadcasting to discover mainframe...") rednet.broadcast("discover_mainframe") -- Wait for responses for up to 3 seconds local timeout = os.clock() + 3 while os.clock() < timeout do local senderId, message = rednet.receive(0.1) if senderId and message == "mainframe_here" then MAINFRAME_ID = senderId print("Discovered mainframe at ID: " .. MAINFRAME_ID) return MAINFRAME_ID end end print("No mainframe found via broadcast") return nil end -- Function to report current GPS location to mainframe local function reportLocationToMainframe() local mainframeId = discoverMainframe() if mainframeId then local gpsX, gpsY, gpsZ = gps.locate() if gpsX and gpsY and gpsZ then local message = { type = "location", x = gpsX, y = gpsY, z = gpsZ } rednet.send(mainframeId, message) print("Reported location to mainframe " .. mainframeId .. ": (" .. gpsX .. ", " .. gpsY .. ", " .. gpsZ .. ")") else print("Cannot report location - GPS not available") end else print("Cannot report location - mainframe not available") end end -- Function to open a modem on any side local function openModem() local sides = {"left", "right", "top", "bottom", "front", "back"} for _, side in ipairs(sides) do if peripheral.getType(side) == "modem" then rednet.open(side) return true end end return false end -- Function to get the current GPS position local function getCurrentPosition() local x, y, z = gps.locate(5) -- Wait up to 5 seconds for a GPS fix if x and y and z then return {x = x, y = y, z = z} else print("Unable to determine GPS position.") return nil end end -- Function to determine the turtle's current heading local function getHeading() local initialPos = getCurrentPosition() if not initialPos then return nil end -- Try moving forward to determine heading if turtle.forward() then local newPos = getCurrentPosition() turtle.back() -- Return to original position if newPos.x > initialPos.x then return 1 -- East elseif newPos.x < initialPos.x then return 3 -- West elseif newPos.z > initialPos.z then return 2 -- South elseif newPos.z < initialPos.z then return 0 -- North end end -- If forward is blocked, try moving up if turtle.up() then turtle.down() -- Return to original position return getHeading() -- Retry after moving up end -- If all directions are blocked, return nil return nil end -- Function to face a specific direction local function faceDirection(targetHeading) local currentHeading = getHeading() if currentHeading == nil then print("Unable to determine current heading.") return end local turns = (targetHeading - currentHeading) % 4 if turns == 1 then turtle.turnRight() elseif turns == 2 then turtle.turnRight() turtle.turnRight() elseif turns == 3 then turtle.turnLeft() end end -- Function to move to a specific GPS location local function goTo(x, y, z) local currentPos = getCurrentPosition() if not currentPos then print("Cannot move without GPS position.") return end -- Move vertically to the target y level first while currentPos.y < y do if not turtle.up() then turtle.digUp() end currentPos.y = currentPos.y + 1 reportLocationToMainframe() end while currentPos.y > y do if not turtle.down() then turtle.digDown() end currentPos.y = currentPos.y - 1 reportLocationToMainframe() end -- Move in the x direction if currentPos.x < x then faceDirection(1) -- East while currentPos.x < x do if not turtle.forward() then turtle.dig() end currentPos.x = currentPos.x + 1 reportLocationToMainframe() end elseif currentPos.x > x then faceDirection(3) -- West while currentPos.x > x do if not turtle.forward() then turtle.dig() end currentPos.x = currentPos.x - 1 reportLocationToMainframe() end end -- Move in the z direction if currentPos.z < z then faceDirection(2) -- South while currentPos.z < z do if not turtle.forward() then turtle.dig() end currentPos.z = currentPos.z + 1 reportLocationToMainframe() end elseif currentPos.z > z then faceDirection(0) -- North while currentPos.z > z do if not turtle.forward() then turtle.dig() end currentPos.z = currentPos.z - 1 reportLocationToMainframe() end end end -- Start the rednet server local function startRednetServer() if not openModem() then print("No modem found. Please attach a modem to the turtle.") return end print("Rednet server started. Listening for commands...") -- Report initial location to mainframe reportLocationToMainframe() while true do local senderId, message = rednet.receive() print("Received command from " .. senderId .. ": " .. message) if message == "get location" then local pos = getCurrentPosition() if pos then -- Report current location to mainframe as well reportLocationToMainframe() rednet.send(senderId, "Current location: (" .. pos.x .. ", " .. pos.y .. ", " .. pos.z .. ")") else rednet.send(senderId, "Unable to determine GPS position.") end elseif message:match("^go to location") then local x, y, z = message:match("go to location ([%-]?%d+) ([%-]?%d+) ([%-]?%d+)") if x and y and z then rednet.send(senderId, "Moving to location: (" .. x .. ", " .. y .. ", " .. z .. ")") goTo(tonumber(x), tonumber(y), tonumber(z)) rednet.send(senderId, "Arrived at location: (" .. x .. ", " .. y .. ", " .. z .. ")") else rednet.send(senderId, "Invalid location format. Use: go to location ") end end end end -- Run the server startRednetServer()