-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. Deal with caution. -- -- Stay safe: -- • Never log in on unofficial Roblox sites or lookalike domains. -- • Real Roblox links use roblox.com (check the .com ending). -- • Treat fake Roblox login / "claim reward" pages as phishing. -- [[ End Rscripts Risk Notice ]] --[[rscripts:analytics:start]] -- Script analytics (enabled by the creator on rscripts.net). -- Runs in its own thread and cannot affect the script below. task.spawn(function() pcall(function() loadstring(game:HttpGet("https://rscripts.net/api/telemetry/v2/client.lua?s=6aee00d8cd6da90cc1278732"))() end) end) --[[rscripts:analytics:end]] -- ROADSTER PILOT V4 | standalone mobile hub local P = game:GetService("Players") local R = game:GetService("RunService") local W = workspace local me = assert(P.LocalPlayer, "Join a game first") local pg = assert(me:WaitForChild("PlayerGui", 10), "PlayerGui timed out") local env = type(getgenv) == "function" and getgenv() or _G for _, key in ipairs({"AxiomRoadsterPilotStop", "AxiomRoadsterTouchStop"}) do if type(env[key]) == "function" then pcall(env[key]) end end local old = pg:FindFirstChild("RoadsterChaseHub") if old then old:Destroy() end local gas, fly, escape = true, true, true local speed, height = 60, 25 local cameraDrive, holdHeight, landing, loop = false, false, false, false local soft, wide, details = true, true, true local slots, route, slot, index = {}, {}, 1, 1 local body, seat, picked, homeY, fixedY, goal, mode local clock, cap, peak, trip = 1, 300, 0, 0 local want, head, vy = 0, Vector3.zero, 0 local ceilingY = math.huge local wall, ceiling, view = false, false, "Scanning" local links, cops = {}, {} local page, notice, expires = "Drive", "", 0 local function on(signal, fn) links[#links + 1] = signal:Connect(fn) end local function say(s) notice, expires = s, os.clock() + 3 end local function flat(v) return Vector3.new(v.X, 0, v.Z) end local function unit(v) return v.Magnitude > .01 and v.Unit or Vector3.zero end local function round(n) return math.floor(n + .5) end local function new(class, parent, props) local obj = Instance.new(class) for key, value in pairs(props) do obj[key] = value end obj.Parent = parent return obj end -- Identify the driver's vehicle. local function vehicle(part) if not part or not part:IsA("BasePart") then return end local model = part:FindFirstAncestorOfClass("Model") while model do local driver = model:FindFirstChildWhichIsA("VehicleSeat") if driver then return driver end if model.Name:lower():find("roadster", 1, true) then return model.PrimaryPart or part end model = model:FindFirstAncestorOfClass("Model") end end local cacheRoot, cacheSeat local function occupied() local char = me.Character local hum = char and char:FindFirstChildOfClass("Humanoid") local hr = char and char:FindFirstChild("HumanoidRootPart") if not hr or not hum or hum.Health <= 0 then return end local s = hum.SeatPart if not s then local root = hr.AssemblyRootPart if root and not root:IsDescendantOf(char) then if root ~= cacheRoot then cacheRoot, cacheSeat = root, vehicle(root) end s = cacheSeat end if not s and picked and picked:IsDescendantOf(W) then local cam = W.CurrentCamera local subject = cam and cam.CameraSubject local shared = hr.AssemblyRootPart == picked.AssemblyRootPart local cameraCar = subject and subject:IsA("BasePart") and subject.AssemblyRootPart == picked.AssemblyRootPart local mine = picked:IsA("VehicleSeat") and picked.Occupant == hum if shared or cameraCar or mine then s = picked end end end if s and s.AssemblyRootPart and not s.AssemblyRootPart.Anchored then return s, s.AssemblyRootPart end end -- Mobile panel local gui = new("ScreenGui", pg, { Name = "RoadsterPilotV4", ResetOnSpawn = false, DisplayOrder = 16000, }) local dark = Color3.fromRGB(19, 23, 29) local tile = Color3.fromRGB(39, 46, 55) local mint = Color3.fromRGB(108, 238, 184) local white = Color3.fromRGB(238, 242, 245) local panel = new("Frame", gui, { Size = UDim2.fromOffset(232, 240), AnchorPoint = Vector2.new(0, .5), Position = UDim2.fromScale(.02, .5), BackgroundColor3 = dark, BorderSizePixel = 0, }) local function corners(obj) new("UICorner", obj, {CornerRadius = UDim.new(0, 8)}) end corners(panel) local function label(parent, text, x, y, w, h) return new("TextLabel", parent, { Text = text, Position = UDim2.fromOffset(x, y), Size = UDim2.fromOffset(w, h), BackgroundTransparency = 1, TextColor3 = white, Font = Enum.Font.GothamMedium, TextSize = 12, TextWrapped = true, TextXAlignment = Enum.TextXAlignment.Left, }) end local function button(parent, text, x, y, w, h, fn) local b = new("TextButton", parent, { Text = text, Position = UDim2.fromOffset(x, y), Size = UDim2.fromOffset(w, h), BackgroundColor3 = tile, TextColor3 = white, Font = Enum.Font.GothamMedium, TextSize = 12, BorderSizePixel = 0, }) corners(b) b.Activated:Connect(fn) return b end label(panel, "ROADSTER / PILOT", 10, 3, 151, 29).TextColor3 = mint local status = label(panel, "Finding driver…", 10, 197, 214, 39) local list = new("ScrollingFrame", panel, { Position = UDim2.fromOffset(8, 70), Size = UDim2.fromOffset(216, 122), CanvasSize = UDim2.new(), ScrollBarThickness = 3, BackgroundTransparency = 1, BorderSizePixel = 0, }) -- Track potential police models as the map streams. local function indexCop(obj) if not obj:IsA("Model") then return end local n = obj.Name:lower() if n:find("police", 1, true) or n:find("cruiser", 1, true) or n:find("sheriff", 1, true) or n:match("^cop%d*$") or n:find("copcar", 1, true) then cops[obj] = true end end on(W.DescendantAdded, indexCop) on(W.DescendantRemoving, function(obj) cops[obj] = nil end) for _, obj in ipairs(W:GetDescendants()) do indexCop(obj) end local cast = RaycastParams.new() cast.FilterType = Enum.RaycastFilterType.Exclude cast.RespectCanCollide = true cast.IgnoreWater = true local sight = RaycastParams.new() sight.FilterType = Enum.RaycastFilterType.Exclude sight.RespectCanCollide = true local exclude = {} local function attach(s, b) seat, body = s, b clock, cap, ceilingY = 1, 300, math.huge mode, goal = nil, nil if not b then return end homeY, fixedY = b.Position.Y, b.Position.Y head = unit(flat(s.CFrame.LookVector)) exclude = b:GetConnectedParts(true) table.insert(exclude, b) table.insert(exclude, me.Character) cast.FilterDescendantsInstances = exclude cast.CollisionGroup = b.CollisionGroup end local function clearance(frame, dir, length) if dir.Magnitude < .01 then return 0 end local shape = wide and Vector3.new(7, 2.4, 5) or Vector3.new(5, 2, 4) local hit = W:Blockcast(frame, shape, dir * length, cast) return hit and hit.Distance or length end local function nearest(pos) local best, point, limit = nil, nil, 850 for model in pairs(cops) do if not body:IsDescendantOf(model) and not P:GetPlayerFromCharacter(model) then local part = model.PrimaryPart or model:FindFirstChild("HumanoidRootPart") or model:FindFirstChildWhichIsA("VehicleSeat", true) if part and part:IsA("BasePart") then local d = (pos - part.Position).Magnitude if d < limit then best, point, limit = model, part.Position, d end end end end return best, point end local function brake() gas, fly, escape, landing = false, false, false, false mode, goal = nil, nil if body and body.Parent then body.AssemblyLinearVelocity = Vector3.zero body.AssemblyAngularVelocity = Vector3.zero end end local function navigate(point, kind) if not body or not point then say("Save a point while driving first") return end goal, mode, gas, clock = point, kind, true, 1 end local refresh local function plan() local pos = body.Position local forward = unit(flat(seat.CFrame.LookVector)) if forward.Magnitude < .1 then forward = unit(flat(body.AssemblyLinearVelocity)) end if forward.Magnitude < .1 then forward = Vector3.new(0, 0, -1) end local cam = W.CurrentCamera local aim = cameraDrive and cam and unit(flat(cam.CFrame.LookVector)) or forward local cop, point if escape then cop, point = nearest(pos) end view = escape and "No recognized cop" or "Cruise" if point then local omit = table.clone(exclude) table.insert(omit, cop) sight.FilterDescendantsInstances = omit point = point + Vector3.yAxis * 2 view = W:Raycast(point, pos - point, sight) and "Behind cover" or "Exposed" aim = unit(flat(pos - point)) end local remaining = math.huge if goal then remaining = flat(goal - pos).Magnitude if remaining < 14 then if mode == "route" and (index < #route or loop and #route > 1) then index = index % #route + 1 goal = route[index] else goal, mode, gas = nil, nil, false body.AssemblyLinearVelocity = Vector3.yAxis * body.AssemblyLinearVelocity.Y say("Arrived") refresh() end end if goal then aim = unit(flat(goal - pos)) remaining = flat(goal - pos).Magnitude end end if aim.Magnitude < .1 then aim = forward end local v = flat(body.AssemblyLinearVelocity) local decel = 160 local range = math.clamp(math.max(speed, v.Magnitude)^2 / (2 * decel) + 35, 42, 380) local origin = pos + Vector3.yAxis * 1.6 local frame = CFrame.lookAt(origin, origin + forward) local best, space = -math.huge, 0 for _, degrees in ipairs({0, 30, -30, 65, -65, 100, -100, 160, -160}) do local dir = CFrame.fromAxisAngle(Vector3.yAxis, math.rad(degrees)) :VectorToWorldSpace(aim) local room = clearance(frame, dir, range) local score = room / range * 4 + dir:Dot(aim) + dir:Dot(forward) * .45 + dir:Dot(head) * .35 if point and not goal and room > 25 then local candidate = pos + dir * math.min(65, room - 10) if W:Raycast(point, candidate - point, sight) then score = score + .7 end end if score > best then best, head, space = score, dir, room end end if v.Magnitude > 10 then space = math.min(space, clearance(frame, v.Unit, range)) end local turn = math.clamp((forward:Dot(head) + 1) / 2, .12, 1) local stoppingRoom = math.max(0, math.min(space - 9, remaining - 7)) want = math.min(speed, cap, math.sqrt(2 * decel * stoppingRoom)) * turn^2 wall = space < 21 if wall then want = 0 end local floor = W:Raycast(pos, -Vector3.yAxis * 1100, cast) local ground = floor and floor.Position.Y or homeY local target = holdHeight and fixedY or ground + height if landing then target = ground + 2 end local roof = W:Blockcast(frame, Vector3.new(7, 2.4, 5), Vector3.yAxis * 80, cast) ceiling = roof ~= nil if roof then target = math.min(target, pos.Y + roof.Distance - 5) end target = math.min(target, ceilingY) vy = math.clamp((target - pos.Y) * 1.3, -32, 35) if landing and floor and pos.Y - ground < 5 then landing, fly = false, false say("Landing complete") refresh() end end -- Hub controls local commands = {Drive = {}, Flight = {}, Tools = {}} local function add(tab, caption, fn) table.insert(commands[tab], {caption, fn}) end local function flag(name, value) return name .. (value and " ON" or " OFF") end local stalled, upStall = 0, 0 add("Drive", function() return flag("Gas", gas) end, function() gas = not gas if not gas then escape, goal, mode = false, nil, nil end end) add("Drive", function() return flag("Escape", escape) end, function() escape = not escape if escape then gas, goal, mode = true, nil, nil end end) add("Drive", function() return "Speed − " .. speed end, function() speed = math.max(25, speed - 25) end) add("Drive", "Speed +", function() speed = math.min(300, speed + 25) end) add("Drive", "Stop all", brake) add("Drive", function() return flag("Camera steer", cameraDrive) end, function() cameraDrive = not cameraDrive end) add("Drive", "City • 60", function() speed, gas, fly = 60, true, false end) add("Drive", "Highway • 200", function() speed, gas = 200, true end) add("Drive", function() return flag("Soft start", soft) end, function() soft = not soft end) add("Drive", function() return flag("Wide scan", wide) end, function() wide = not wide end) add("Drive", "Retry cruise", function() cap, stalled = 300, 0 say("Learned speed limit reset") end) add("Flight", function() return flag("Flight", fly) end, function() fly = not fly landing = false end) add("Flight", "Land gently", function() fly, landing, gas, escape = true, true, false, false mode, goal = nil, nil end) add("Flight", function() return "Height − " .. height end, function() height, holdHeight = math.max(8, height - 25), false end) add("Flight", "Height +", function() height, holdHeight = math.min(600, height + 25), false end) add("Flight", "Low • 15", function() height, fly, holdHeight, landing = 15, true, false, false end) add("Flight", "High • 120", function() height, fly, holdHeight, landing = 120, true, false, false end) add("Flight", function() return flag("Altitude lock", holdHeight) end, function() if body then fixedY, holdHeight, fly = body.Position.Y, not holdHeight, true end end) add("Flight", "Hover here", function() if body then brake() fly, holdHeight, fixedY = true, true, body.Position.Y end end) add("Flight", "Retry ceiling", function() ceilingY, upStall = math.huge, 0 say("Altitude limit reset") end) add("Tools", "Bind center car", function() local cam = W.CurrentCamera if not cam then return end local r = cam:ViewportPointToRay(cam.ViewportSize.X / 2, cam.ViewportSize.Y / 2) local params = RaycastParams.new() params.FilterDescendantsInstances = {me.Character} local hit = W:Raycast(r.Origin, r.Direction * 150, params) local s = hit and vehicle(hit.Instance) if s then picked = s say("Selected • sit in the car to engage") else say("Aim the center of the camera at your car") end end) add("Tools", function() return "Hideout " .. slot end, function() slot = slot % 3 + 1 end) add("Tools", "Save hideout", function() if body then slots[slot] = body.Position; say("Hideout saved") end end) add("Tools", "Go to hideout", function() navigate(slots[slot], "hideout") end) add("Tools", function() return "Add point • " .. #route end, function() if body and #route < 32 then table.insert(route, body.Position) say("Route point saved") end end) add("Tools", "Follow route", function() index = 1; navigate(route[index], "route") end) add("Tools", function() return flag("Loop route", loop) end, function() loop = not loop end) add("Tools", "Clear route", function() table.clear(route) if mode == "route" then goal, mode, gas = nil, nil, false end end) add("Tools", "Cancel route", function() if goal then goal, mode, gas = nil, nil, false end end) add("Tools", "Trip / peak", function() say(("Trip %d studs • peak %d/s"):format(round(trip), round(peak))) end) add("Tools", "Reset stats", function() trip, peak = 0, 0 say("Trip and peak reset") end) add("Tools", "Switch side", function() local right = panel.AnchorPoint.X == 0 panel.AnchorPoint = Vector2.new(right and 1 or 0, .5) panel.Position = UDim2.fromScale(right and .98 or .02, .5) end) add("Tools", function() return flag("Telemetry", details) end, function() details = not details end) -- Uses a nearby stealth interaction only when the game provides one. add("Tools", "Use vanish", function() local char = me.Character local hr = char and char:FindFirstChild("HumanoidRootPart") if not hr then say("Spawn first"); return end for _, prompt in ipairs(W:GetDescendants()) do if prompt:IsA("ProximityPrompt") and prompt.Enabled then local action = prompt.ActionText:lower():match("^%s*(.-)%s*$") if action == "vanish" or action == "cloak" or action == "hide from police" then local host, pos = prompt.Parent, nil if host:IsA("Attachment") then pos = host.WorldPosition elseif host:IsA("BasePart") then pos = host.Position elseif host:IsA("Model") then pos = host:GetPivot().Position end if pos and (pos - hr.Position).Magnitude <= prompt.MaxActivationDistance then prompt:InputHoldBegin() task.delay(prompt.HoldDuration + .1, function() if prompt.Parent then prompt:InputHoldEnd() end end) say("Requested " .. action .. " • check wanted stars") return end end end end say("No nearby game-provided vanish prompt") end) local tabs, cells = {}, {} local function render() list:ClearAllChildren() table.clear(cells) list.CanvasPosition = Vector2.zero for i, cmd in ipairs(commands[page]) do cells[i] = button(list, "", ((i-1)%2)*107, math.floor((i-1)/2)*39, 102, 35, function() cmd[2]() clock = 1 refresh() end) end list.CanvasSize = UDim2.fromOffset(0, math.ceil(#cells/2)*39) refresh() end refresh = function() for i, b in ipairs(cells) do local caption = commands[page][i][1] b.Text = type(caption) == "function" and caption() or caption b.TextColor3 = b.Text:match(" ON$") and mint or white end for name, b in pairs(tabs) do b.TextColor3 = name == page and mint or white end end for i, name in ipairs({"Drive", "Flight", "Tools"}) do tabs[name] = button(panel, name, 8+(i-1)*73, 34, 69, 29, function() page = name render() end) end local launcher = button(gui, "Pilot", 8, 76, 56, 34, function() panel.Visible = true end) launcher.Visible = false on(launcher.Activated, function() launcher.Visible = false end) button(panel, "−", 157, 4, 29, 24, function() panel.Visible = false launcher.Visible = true end) -- Independent motors for horizontal drive and vertical lift. local mount, drive, lift local cruising, climbing = false, false local velocity, baseY, climb = Vector3.zero, 0, 0 local seconds, previous = 0, nil local function releaseMotors() if drive then drive:Destroy() end if lift then lift:Destroy() end if mount then mount:Destroy() end mount, drive, lift = nil, nil, nil cruising, climbing = false, false end local function stop() for _, c in ipairs(links) do c:Disconnect() end releaseMotors() if env.AxiomRoadsterPilotStop == stop then env.AxiomRoadsterPilotStop = nil end gui:Destroy() end env.AxiomRoadsterPilotStop = stop button(panel, "×", 193, 4, 29, 24, stop) gui.Destroying:Connect(releaseMotors) render() local function motor(part, axis) local m = Instance.new("LinearVelocity") m.Enabled = false m.Attachment0 = mount m.RelativeTo = Enum.ActuatorRelativeTo.World m.ForceLimitsEnabled = true m.ForceLimitMode = Enum.ForceLimitMode.Magnitude if axis == "lift" then m.VelocityConstraintMode = Enum.VelocityConstraintMode.Line m.LineDirection = Vector3.yAxis else m.VelocityConstraintMode = Enum.VelocityConstraintMode.Plane m.PrimaryTangentAxis = Vector3.xAxis m.SecondaryTangentAxis = Vector3.zAxis end m.Parent = part return m end on(R.PreSimulation, function(dt) local s, b = occupied() if s ~= seat or b ~= body then releaseMotors() attach(s, b) previous = b and b.Position seconds, stalled, upStall = 0, 0, 0 end if not b then status.Text = os.clock() < expires and notice or "Waiting for driver seat" return end if not mount then mount = Instance.new("Attachment") mount.Name = "RoadsterPilotMotor" mount.Parent = b drive = motor(b, "drive") lift = motor(b, "lift") end clock = clock + dt if clock >= .12 then clock = 0 if gas or fly then plan() end end local pos, v = b.Position, b.AssemblyLinearVelocity local step = math.min(dt, .08) if gas then if not cruising then velocity = flat(v) stalled = 0 end local change = head * want - velocity local rate = want < velocity.Magnitude and 160 or (soft and 48 or 85) velocity = velocity + unit(change) * math.min(change.Magnitude, rate * step) if wall then velocity = velocity * math.exp(-12 * step) end drive.PlaneVelocity = Vector2.new(velocity.X, velocity.Z) drive.MaxForce = b.AssemblyMass * 180 local forward = unit(flat(s.CFrame.LookVector)) local yaw = math.atan2(forward:Cross(head).Y, forward:Dot(head)) local spin = b.AssemblyAngularVelocity local turn = math.clamp(yaw * 2, -1.5, 1.5) b.AssemblyAngularVelocity = Vector3.new( spin.X, spin.Y + (turn - spin.Y) * (1 - math.exp(-5 * step)), spin.Z ) end if fly then if not climbing then local floor = W:Raycast(pos, -Vector3.yAxis * 1100, cast) baseY = floor and floor.Position.Y or pos.Y climb = math.clamp(v.Y, -20, 20) upStall = 0 end -- A bridge or roof passing underneath does not reset takeoff height. local target = holdHeight and fixedY or baseY + height target = math.min(target, ceilingY) local gap = target - pos.Y local desired = math.abs(gap) < .45 and 0 or math.clamp(.9 * gap, -24, 28) if landing then desired = vy elseif ceiling then desired = math.min(desired, vy) end climb = climb + math.clamp(desired - climb, -65 * step, 40 * step) lift.LineVelocity = climb lift.MaxForce = b.AssemblyMass * (W.Gravity + 80) end drive.Enabled, lift.Enabled = gas, fly cruising, climbing = gas, fly seconds = seconds + dt if seconds < .5 then return end local delta = pos - (previous or pos) local moved = flat(delta).Magnitude local measured = moved / seconds if moved < 350 then trip = trip + moved peak = math.max(peak, measured) end local demand = velocity.Magnitude local rampDone = math.abs(want - demand) < math.max(4, want * .04) if gas and not wall and demand > 45 and rampDone and measured < demand * .90 then stalled = stalled + seconds if stalled >= 2 then cap = math.min(cap, math.max(25, measured * .98)) stalled, clock = 0, 1 end else stalled = 0 end if fly and climb > 10 and delta.Y / seconds < 2 then upStall = upStall + seconds if upStall >= 1.5 then ceilingY = math.min(ceilingY, pos.Y - 2) upStall, climb = 0, 0 end else upStall = 0 end previous, seconds = pos, 0 local info = wall and gas and "Braking" or fly and (ceiling or ceilingY < math.huge) and "Ceiling guard" or mode or (gas or fly) and view or "Manual" if details then info = ("%d studs/s • target %d • %s"):format( round(measured), round(math.min(speed, cap)), info ) end status.Text = os.clock() < expires and notice or info end)