Bbuild a boat script Keyless – BABFT Ultimate Edition
Build A Boat For Treasure Keyless
Bbuild a boat script Keyless – BABFT Ultimate Edition
👤 alexriderr 👁 37 views ❤️ 0 likes ⏱ Apr 4, 2026
This is a solid Build A Boat For Treasure script that is open source and safe to use with the Xeno executor. It also comes with a wide range of useful features.
✨ Features
Auto farm ESP Place wood block Place stone block Place gold block 3D sphere settings Block selection Build position Realistic vehicles Pattern selection Choose block type
📋 Script Code
-- services --
local players = game:GetService("Players")
local TS = game:GetService("TweenService")
local workspace = game:GetService("Workspace")
local runService = game:GetService("RunService")
local lighting = game:GetService("Lighting")
local userInput = game:GetService("UserInputService")
local vim = game:GetService("VirtualInputManager")
local replicatedStorage = game:GetService("ReplicatedStorage")

-- local player
local player = players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
local HRP = character:WaitForChild("HumanoidRootPart")

-- flags --
local tweening = false
local autoFarmEnabled = false
local autoClickerEnabled = false
local autoCollectEnabled = false
local noClipEnabled = false
local flyEnabled = false
local speedEnabled = false
local boatSpeedEnabled = false
local espEnabled = false
local aimbotEnabled = false
local infiniteJumpEnabled = false
local antiAFKEnabled = true
local godModeEnabled = false
local showBuildPreview = true
local rescaleClick = false
local ignoreAnchored = true

-- auto farm values --
local currentStage = 1
local farmDelay = 2

-- esp storage
local espObjects = {}

-- fly variables
local flySpeed = 50
local flyBodyVelocity = nil
local flyConnection = nil
local flyDirection = {f=0, b=0, l=0, r=0, u=0, d=0}

-- speed variables
local originalWalkSpeed = 16
local currentSpeed = 50
local currentBoatSpeed = 100
local boatSpeedConnection = nil

-- image build variables
local imageBuildInProgress = false
local selectedBlockForBuild = "WoodBlock"
local selectedVehicleBlock = "IronBlock"
local currentBuildPosition = nil
local buildPreviewParts = {}
local pastePercent = 0
local isPasting = false
local buildNotification = nil
local clipboard = nil
local selectedBase = nil
local playerToBring = nil

--paths
local blockData = player:WaitForChild("Data")
local blocksFolder = workspace:WaitForChild("Blocks")
local usedList = {}

-- rayfield --
local Rayfield = loadstring(game:HttpGet('https://sirius.menu/rayfield'))()
local Window = Rayfield:CreateWindow({
    Name = "BABFT | Ultimate Edition",
    Icon = 0,
    LoadingTitle = "Ultimate BABFT Script",
    LoadingSubtitle = "3D Sphere Builder + Realistic Vehicles",
    Theme = "Default",
    ToggleUIKeybind = "G",
    DisableRayfieldPrompts = false,
    DisableBuildWarnings = false,
    ConfigurationSaving = {
        Enabled = true,
        FolderName = "BABFT",
        FileName = "Ultimate Config"
    },
})

-- All Blocks List --
local allBlocks = {
    "WoodBlock", "StoneBlock", "GoldBlock", "DiamondBlock", "IronBlock",
    "SteelBlock", "TitaniumBlock", "CopperBlock", "BronzeBlock", "SilverBlock",
    "PlatinumBlock", "RedBlock", "BlueBlock", "GreenBlock", "YellowBlock",
    "PurpleBlock", "OrangeBlock", "PinkBlock", "CyanBlock", "WhiteBlock", "BlackBlock"
}

-- Color to Block Mapping --
local function getBlockFromColor(r, g, b)
    local colors = {
        {r=255,g=0,b=0, block="RedBlock"},
        {r=0,g=0,b=255, block="BlueBlock"},
        {r=0,g=255,b=0, block="GreenBlock"},
        {r=255,g=255,b=0, block="YellowBlock"},
        {r=255,g=165,b=0, block="OrangeBlock"},
        {r=255,g=192,b=203, block="PinkBlock"},
        {r=128,g=0,b=128, block="PurpleBlock"},
        {r=0,g=255,b=255, block="CyanBlock"},
        {r=255,g=255,b=255, block="WhiteBlock"},
        {r=0,g=0,b=0, block="BlackBlock"},
        {r=139,g=69,b=19, block="WoodBlock"},
        {r=128,g=128,b=128, block="StoneBlock"},
        {r=255,g=215,b=0, block="GoldBlock"},
        {r=192,g=192,b=192, block="IronBlock"},
        {r=176,g=196,b=222, block="SteelBlock"},
        {r=135,g=206,b=235, block="TitaniumBlock"},
    }
    
    local bestMatch = "WoodBlock"
    local smallestDiff = math.huge
    
    for _, color in pairs(colors) do
        local diff = math.abs(color.r - r) + math.abs(color.g - g) + math.abs(color.b - b)
        if diff = blockID) then
                local relative = getJoint(block)
                relative = (relative == hisBase) and myBase or relative
                usedList[block.Name] = (usedList[block.Name] or 0) + 1
                
                table.insert(t, {
                    Name = block.Name,
                    Pos = getNewBlockPos(hisBase, block, myBase),
                    Relative = getPlayerZone(player),
                    Transparency = block.PPart.Transparency,
                    Anchored = block.PPart.Anchored,
                    Size = block.PPart.Size,
                    Color = block.PPart.Color
                })
            end
        end
    end
    return t
end

local function getBlock(expected, createdList)
    local best = nil
    local bestDist = math.huge
    for _, b in ipairs(createdList) do
        if b and b:FindFirstChild("PPart") and b.Name == expected.Name then
            local dist = (b.PPart.Position - expected.Pos.Position).Magnitude
            if dist  5
    
    local playerBaseList = folder:GetChildren()
    
    for i, v in ipairs(t) do
        local b = getBlock(v, playerBaseList)
        if b then
            pcall(function()
                rescaleBlock(b, v.Pos, v.Size)
                paintBlock(b, v.Color)
                setTransparency(v.Transparency, b)
            end)
        end
        pastePercent = 50 + (i / tCount) * 50
        if buildNotification and buildNotification.Update then
            pcall(function()
                buildNotification:Update({
                    Title = "Build In Progress",
                    Content = "Painting & scaling... " .. math.floor(pastePercent) .. "%"
                })
            end)
        end
        if i % 20 == 0 then
            task.wait(0.05)
        end
    end
    
    c:Disconnect()
    pastePercent = 0
    isPasting = false
    
    if buildNotification and buildNotification.Dismiss then
        pcall(function()
            buildNotification:Dismiss()
        end)
    end
    
    Rayfield:Notify({
        Title = "Build Complete!",
        Content = "Successfully built " .. tCount .. " blocks!",
        Duration = 2
    })
end

local function getPlayers()
    local playersList = {}
    for _, p in pairs(players:GetPlayers()) do
        table.insert(playersList, p.DisplayName)
    end
    return playersList
end

local function getRealName(displayName)
    for _, p in pairs(players:GetPlayers()) do
        if p.DisplayName == displayName then return p.Name end
    end
    return nil
end

local function bringPlayer(targetPlayer, firstSeat, secondSeat)
    local originalPos = character:GetPivot()
    local targetChar = targetPlayer.Character
    if not targetChar then
        Rayfield:Notify({Title = "Error", Content = "Target player has no character", Duration = 3})
        return
    end
    
    local offset = firstSeat.CFrame:Inverse() * secondSeat.CFrame
    local torso = targetChar:FindFirstChild("LowerTorso") or targetChar:FindFirstChild("Torso")
    
    if torso then
        local newPivot = torso.CFrame * offset:Inverse()
        firstSeat:PivotTo(newPivot + Vector3.new(math.random(-1,1), math.random(-1,1), math.random(-1,1)))
        task.wait(0.5)
    end
    
    firstSeat:PivotTo(originalPos)
    Rayfield:Notify({Title = "Success", Content = "Player brought to seat!", Duration = 3})
end

local function getCar()
    return humanoid.SeatPart and humanoid.SeatPart.Parent or nil
end

-- Create Build Preview --
local function createBuildPreview(position, width, height, blockSize)
    for _, preview in pairs(buildPreviewParts) do
        if preview and preview.Parent then
            preview:Destroy()
        end
    end
    buildPreviewParts = {}
    
    if not showBuildPreview then return end
    
    for x = 0, width - 1 do
        for y = 0, height - 1 do
            local previewPart = Instance.new("Part")
            previewPart.Size = Vector3.new(blockSize, blockSize, blockSize)
            previewPart.Position = position.Position + Vector3.new(x * blockSize, y * blockSize, 0)
            previewPart.Anchored = true
            previewPart.CanCollide = false
            previewPart.Transparency = 0.6
            previewPart.Color = Color3.fromRGB(0, 255, 255)
            previewPart.Material = Enum.Material.Neon
            previewPart.Parent = workspace
            table.insert(buildPreviewParts, previewPart)
        end
    end
end

-- 3D SPHERE/BALL PREVIEW --
local function createSpherePreview(center, radius, blockSize)
    for _, preview in pairs(buildPreviewParts) do
        if preview and preview.Parent then
            preview:Destroy()
        end
    end
    buildPreviewParts = {}
    
    if not showBuildPreview then return end
    
    local radiusBlocks = math.floor(radius / blockSize)
    local previewCount = 0
    
    -- Create a wireframe sphere preview
    for theta = 0, math.pi, math.pi / 20 do
        for phi = 0, 2 * math.pi, math.pi / 20 do
            local x = radius * math.sin(theta) * math.cos(phi)
            local y = radius * math.cos(theta)
            local z = radius * math.sin(theta) * math.sin(phi)
            
            local previewPart = Instance.new("Part")
            previewPart.Size = Vector3.new(blockSize * 0.8, blockSize * 0.8, blockSize * 0.8)
            previewPart.Position = center.Position + Vector3.new(x, y, z)
            previewPart.Anchored = true
            previewPart.CanCollide = false
            previewPart.Transparency = 0.5
            previewPart.Color = Color3.fromRGB(255, 100, 0)
            previewPart.Material = Enum.Material.Neon
            previewPart.Parent = workspace
            table.insert(buildPreviewParts, previewPart)
            previewCount = previewCount + 1
            
            if previewCount % 100 == 0 then
                task.wait()
            end
        end
    end
end

local function clearBuildPreview()
    for _, preview in pairs(buildPreviewParts) do
        if preview and preview.Parent then
            preview:Destroy()
        end
    end
    buildPreviewParts = {}
end

-- 3D SPHERE/BALL BUILDER --
local function build3DSphere(center, radius, blockSize, blockType, hollow, thickness)
    if imageBuildInProgress then
        Rayfield:Notify({Title = "Busy", Content = "A build is already in progress!", Duration = 2})
        return
    end
    
    imageBuildInProgress = true
    local notification = Rayfield:Notify({
        Title = "Building 3D Sphere",
        Content = "Calculating sphere points...",
        Duration = math.huge
    })
    
    task.spawn(function()
        local blocksPlaced = 0
        local centerPos = center.Position
        local radiusBlocks = radius / blockSize
        local totalVolume = (4/3) * math.pi * (radiusBlocks ^ 3)
        local estimatedBlocks = math.floor(totalVolume)
        
        if notification and notification.Update then
            notification:Update({
                Title = "Building 3D Sphere",
                Content = string.format("Radius: %.1f blocks, Estimated blocks: %d", radiusBlocks, estimatedBlocks)
            })
        end
        
        -- Use sphere equation: x² + y² + z² ≤ r²
        for x = -radiusBlocks, radiusBlocks do
            for y = -radiusBlocks, radiusBlocks do
                for z = -radiusBlocks, radiusBlocks do
                    local dist = math.sqrt(x^2 + y^2 + z^2)
                    
                    local shouldPlace = false
                    
                    if hollow then
                        -- Hollow sphere: only place blocks within thickness range
                        local innerRadius = radiusBlocks - thickness
                        if dist = innerRadius then
                            shouldPlace = true
                        end
                    else
                        -- Solid sphere: place all blocks within radius
                        if dist <= radiusBlocks then
                            shouldPlace = true
                        end
                    end
                    
                    if shouldPlace then
                        local blockPos = centerPos + Vector3.new(x * blockSize, y * blockSize, z * blockSize)
                        placeBlockAtPosition(blockType, blockPos)
                        blocksPlaced = blocksPlaced + 1
                        
                        if notification and notification.Update then
                            local percent = (blocksPlaced / estimatedBlocks) * 100
                            notification:Update({
                                Title = "Building 3D Sphere",
                                Content = string.format("Building sphere: %.1f%% (%d blocks)", percent, blocksPlaced)
                            })
                        end
                        
                        if blocksPlaced % 50 == 0 then
                            task.wait(0.05)
                        end
                    end
                end
            end
        end
        
        if notification and notification.Dismiss then
            notification:Dismiss()
        end
        
        Rayfield:Notify({
            Title = "Sphere Complete!",
            Content = string.format("Built %d blocks in a perfect 3D sphere! Radius: %.1f studs", blocksPlaced, radius),
            Duration = 4
        })
        
        imageBuildInProgress = false
    end)
end

-- PAINT PATTERN FUNCTION --
local function paintPattern(patternType, startPosition, width, height, blockSize, customBlock)
    if imageBuildInProgress then
        Rayfield:Notify({Title = "Busy", Content = "A build is already in progress!", Duration = 2})
        return
    end
    
    imageBuildInProgress = true
    local notification = Rayfield:Notify({
        Title = "Building Pattern",
        Content = "Starting...",
        Duration = math.huge
    })
    
    task.spawn(function()
        local totalBlocks = width * height
        local blocksPlaced = 0
        local startPos = startPosition.Position
        
        for y = 0, height - 1 do
            for x = 0, width - 1 do
                local r, g, b
                
                if patternType == "Rainbow" then
                    local hue = (x / width) % 1
                    local color = Color3.fromHSV(hue, 1, 1)
                    r, g, b = color.R * 255, color.G * 255, color.B * 255
                elseif patternType == "Checkerboard" then
                    local isEven = ((x + y) % 2 == 0)
                    if isEven then
                        r, g, b = 255, 255, 255
                    else
                        r, g, b = 0, 0, 0
                    end
                elseif patternType == "Stripes" then
                    if x % 2 == 0 then
                        r, g, b = 255, 0, 0
                    else
                        r, g, b = 0, 0, 255
                    end
                elseif patternType == "Gradient" then
                    r = (x / width) * 255
                    g = (y / height) * 255
                    b = 128
                elseif patternType == "Heart" then
                    local nx = (x / width) * 2 - 1
                    local ny = (y / height) * 2 - 1
                    local heart = (nx^2 + (ny - 0.5 * math.abs(nx))^2 - 0.3)
                    if heart < 0 then
                        r, g, b = 255, 0, 0
                    else
                        r, g, b = 100, 100, 100
                    end
                elseif patternType == "Target" then
                    local centerX = width / 2
                    local centerY = height / 2
                    local dist = math.floor(math.sqrt((x - centerX)^2 + (y - centerY)^2) / 3)
                    local ringColors = {{255,0,0}, {255,255,255}, {255,0,0}, {0,0,255}}
                    local color = ringColors[(dist % #ringColors) + 1]
                    r, g, b = color[1], color[2], color[3]
                elseif patternType == "Mario" then
                    local marioPattern = {
                        {0,0,0,0,1,1,1,1,1,1,0,0,0,0},
                        {0,0,0,1,1,1,1,1,1,1,1,0,0,0},
                        {0,0,0,2,2,2,1,1,2,1,1,0,0,0},
                        {0,0,2,2,2,2,1,1,2,1,1,1,0,0},
                        {0,0,2,2,2,2,2,2,2,2,2,1,1,0},
                        {0,0,2,2,2,2,2,2,2,2,2,1,1,0},
                        {0,0,0,2,2,2,1,1,2,2,2,0,0,0},
                        {0,0,0,1,1,1,1,1,1,1,1,0,0,0},
                        {0,0,0,0,1,1,1,1,1,1,0,0,0,0},
                    }
                    local px = math.floor(x / (width / #marioPattern[1]))
                    local py = math.floor(y / (height / #marioPattern))
                    if py <= #marioPattern and px  50 and Color3.new(0, 1, 0) or (healthPercent > 25 and Color3.new(1, 1, 0) or Color3.new(1, 0, 0))
        esp.healthLabel.TextColor3 = color
        esp.healthLabel.Text = math.floor(healthPercent) .. "%"
    end
end

local function removeESP(part)
    local esp = espObjects[part]
    if esp then
        if esp.billboard then esp.billboard:Destroy() end
        if esp.outline then esp.outline:Destroy() end
        espObjects[part] = nil
    end
end

local function setupESP()
    if not espEnabled then return end
    
    for part, _ in pairs(espObjects) do
        removeESP(part)
    end
    espObjects = {}
    
    for _, p in pairs(players:GetPlayers()) do
        if p ~= player and p.Character then
            local head = p.Character:FindFirstChild("Head")
            if head then
                local humanoidChar = p.Character:FindFirstChild("Humanoid")
                local healthPercent = humanoidChar and (humanoidChar.Health / humanoidChar.MaxHealth) * 100 or 100
                espObjects[head] = createESP(head, p.DisplayName)
                updateESPHealth(head, healthPercent)
            end
        end
    end
end

-- God Mode --
local function enableGodMode()
    if not character or not humanoid then return end
    godModeEnabled = true
    humanoid.MaxHealth = math.huge
    humanoid.Health = math.huge
    humanoid.BreakJointsOnDeath = false
    Rayfield:Notify({Title = "God Mode", Content = "God Mode Enabled!", Duration = 2})
end

local function disableGodMode()
    godModeEnabled = false
    if character and humanoid then
        humanoid.MaxHealth = 100
        humanoid.Health = 100
        humanoid.BreakJointsOnDeath = true
    end
    Rayfield:Notify({Title = "God Mode", Content = "God Mode Disabled!", Duration = 2})
end

-- Fly Functions --
local function startFly()
    if flyEnabled then return end
    
    local partToFly = HRP
    if partToFly then
        flyEnabled = true
        flyBodyVelocity = Instance.new("BodyVelocity")
        flyBodyVelocity.Name = "FlyBV"
        flyBodyVelocity.MaxForce = Vector3.new(9e9, 9e9, 9e9)
        flyBodyVelocity.Parent = partToFly
        
        flyConnection = runService.RenderStepped:Connect(function()
            if not flyEnabled or not flyBodyVelocity then return end
            
            local cam = workspace.CurrentCamera
            local moveDir = (cam.CFrame.LookVector * (flyDirection.f + flyDirection.b)) +
                            (cam.CFrame.RightVector * (flyDirection.r + flyDirection.l)) +
                            (Vector3.new(0, flyDirection.u + flyDirection.d, 0))
            
            if moveDir.Magnitude > 0 then
                flyBodyVelocity.Velocity = moveDir.Unit * flySpeed
            else
                flyBodyVelocity.Velocity = Vector3.zero
            end
        end)
        
        Rayfield:Notify({Title = "Fly", Content = "Fly mode enabled! Use WASD + Space/Ctrl", Duration = 2})
    end
end

local function stopFly()
    flyEnabled = false
    if flyBodyVelocity then
        flyBodyVelocity:Destroy()
        flyBodyVelocity = nil
    end
    if flyConnection then
        flyConnection:Disconnect()
        flyConnection = nil
    end
end

-- Input Handling for Fly --
userInput.InputBegan:Connect(function(input, processed)
    if processed then return end
    if flyEnabled then
        if input.KeyCode == Enum.KeyCode.W then flyDirection.f = 1 end
        if input.KeyCode == Enum.KeyCode.S then flyDirection.b = -1 end
        if input.KeyCode == Enum.KeyCode.A then flyDirection.l = -1 end
        if input.KeyCode == Enum.KeyCode.D then flyDirection.r = 1 end
        if input.KeyCode == Enum.KeyCode.Space then flyDirection.u = 1 end
        if input.KeyCode == Enum.KeyCode.LeftControl then flyDirection.d = -1 end
    end
end)

userInput.InputEnded:Connect(function(input)
    if flyEnabled then
        if input.KeyCode == Enum.KeyCode.W then flyDirection.f = 0 end
        if input.KeyCode == Enum.KeyCode.S then flyDirection.b = 0 end
        if input.KeyCode == Enum.KeyCode.A then flyDirection.l = 0 end
        if input.KeyCode == Enum.KeyCode.D then flyDirection.r = 0 end
        if input.KeyCode == Enum.KeyCode.Space then flyDirection.u = 0 end
        if input.KeyCode == Enum.KeyCode.LeftControl then flyDirection.d = 0 end
    end
end)

-- No Clip --
local function toggleNoClip()
    noClipEnabled = not noClipEnabled
    if noClipEnabled then
        Rayfield:Notify({Title = "No Clip", Content = "No clip enabled!", Duration = 2})
    else
        Rayfield:Notify({Title = "No Clip", Content = "No clip disabled!", Duration = 2})
    end
end

runService.Stepped:Connect(function()
    if noClipEnabled and character then
        for _, part in pairs(character:GetDescendants()) do
            if part:IsA("BasePart") then
                part.CanCollide = false
            end
        end
    end
end)

-- Infinite Jump --
local infiniteJumpConnection = nil
local function setupInfiniteJump()
    if infiniteJumpConnection then infiniteJumpConnection:Disconnect() end
    infiniteJumpConnection = userInput.InputBegan:Connect(function(input)
        if infiniteJumpEnabled and input.KeyCode == Enum.KeyCode.Space and humanoid then
            humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
        end
    end)
end

-- Auto Farm --
local function startAutoFarm()
    autoFarmEnabled = not autoFarmEnabled
    
    if autoFarmEnabled then
        task.spawn(function()
            while autoFarmEnabled do
                task.wait(farmDelay)
                if not HRP then continue end
                
                local stages = workspace:FindFirstChild("BoatStages")
                if not stages then continue end
                
                local normalStages = stages:FindFirstChild("NormalStages")
                if not normalStages then continue end
                
                if currentStage == 11 then
                    local endpoint = normalStages:FindFirstChild("TheEnd")
                    if endpoint then
                        local chest = endpoint:FindFirstChild("GoldenChest")
                        if chest then
                            HRP:PivotTo(chest:GetPivot() + Vector3.new(0, 0, -10))
                            task.wait(10)
                            currentStage = 1
                        end
                    end
                else
                    local roomName = "CaveStage" .. currentStage
                    local stage = normalStages:FindFirstChild(roomName)
                    if stage then
                        local darkPart = stage:FindFirstChild("DarknessPart")
                        if darkPart then
                            character:PivotTo(darkPart.CFrame - Vector3.new(0, 0, 15))
                            local tween = TS:Create(HRP, TweenInfo.new(2, Enum.EasingStyle.Linear), {
                                CFrame = darkPart.CFrame + Vector3.new(0, 0, 20)
                            })
                            tweening = true
                            tween:Play()
                            tween.Completed:Wait()
                            tweening = false
                            currentStage = currentStage + 1
                        end
                    end
                end
            end
        end)
        Rayfield:Notify({Title = "Auto Farm", Content = "Auto farm enabled!", Duration = 2})
    else
        Rayfield:Notify({Title = "Auto Farm", Content = "Auto farm disabled!", Duration = 2})
    end
end

-- Auto Collect --
local function startAutoCollect()
    autoCollectEnabled = not autoCollectEnabled
    
    if autoCollectEnabled then
        task.spawn(function()
            while autoCollectEnabled do
                task.wait(0.5)
                for _, v in pairs(workspace:GetDescendants()) do
                    if v:IsA("BasePart") and (string.find(string.lower(v.Name), "coin") or string.find(string.lower(v.Name), "gold")) then
                        if HRP and (v.Position - HRP.Position).Magnitude  0 then
            local base = getPlayerBase()
            if base then
                pasteBuild(clipboard, base)
            else
                Rayfield:Notify({Title = "Error", Content = "Could not find your base folder", Duration = 3})
            end
        else
            Rayfield:Notify({Title = "Error", Content = "No base copied to clipboard", Duration = 3})
        end
    end,
})

local pasteStatus = buildingTab:CreateParagraph({
    Title = "Build Progress",
    Content = "0%"
})

task.spawn(function()
    while task.wait(0.2) do
        pasteStatus:Set({Title = "Build Progress", Content = tostring(pastePercent) .. "%"})
    end
end)

buildingTab:CreateSection("Build Settings")
buildingTab:CreateToggle({
    Name = "Ignore Anchored State",
    CurrentValue = true,
    Callback = function(Value)
        ignoreAnchored = Value
    end,
})

-- 3D SPHERE/BALL TAB --
sphereTab:CreateSection("3D Sphere Settings")

local sphereRadius = 10
local sphereBlockSize = 1
local sphereBlockType = "StoneBlock"
local hollowSphere = false
local sphereThickness = 1

sphereTab:CreateSlider({
    Name = "Sphere Radius (studs)",
    Range = {3, 25},
    Increment = 0.5,
    Suffix = " studs",
    CurrentValue = 10,
    Callback = function(value)
        sphereRadius = value
        if showBuildPreview and currentBuildPosition then
            createSpherePreview(currentBuildPosition, sphereRadius, sphereBlockSize)
        end
    end,
})

sphereTab:CreateSlider({
    Name = "Block Size (studs)",
    Range = {0.5, 2},
    Increment = 0.5,
    Suffix = " studs",
    CurrentValue = 1,
    Callback = function(value)
        sphereBlockSize = value
        if showBuildPreview and currentBuildPosition then
            createSpherePreview(currentBuildPosition, sphereRadius, sphereBlockSize)
        end
    end,
})

sphereTab:CreateToggle({
    Name = "Hollow Sphere",
    CurrentValue = false,
    Callback = function(value)
        hollowSphere = value
        if showBuildPreview and currentBuildPosition then
            createSpherePreview(currentBuildPosition, sphereRadius, sphereBlockSize)
        end
    end,
})

sphereTab:CreateSlider({
    Name = "Wall Thickness (hollow only)",
    Range = {1, 5},
    Increment = 1,
    Suffix = " blocks",
    CurrentValue = 1,
    Callback = function(value)
        sphereThickness = value
    end,
})

sphereTab:CreateSection("Block Selection")

local sphereBlockDropdown = sphereTab:CreateDropdown({
    Name = "Select Block Material",
    Options = allBlocks,
    CurrentOption = {"StoneBlock"},
    MultipleOptions = false,
    Callback = function(Options)
        sphereBlockType = Options[1]
        Rayfield:Notify({Title = "Material", Content = "Using: " .. sphereBlockType, Duration = 2})
    end,
})

sphereTab:CreateSection("Build Position")

sphereTab:CreateButton({
    Name = "Set Sphere Center Here",
    Callback = function()
        currentBuildPosition = HRP.CFrame + Vector3.new(0, sphereRadius, 0)
        if showBuildPreview then
            createSpherePreview(currentBuildPosition, sphereRadius, sphereBlockSize)
        end
        Rayfield:Notify({Title = "Center Set", Content = "Sphere center set at your position!", Duration = 2})
    end,
})

sphereTab:CreateButton({
    Name = "Set Center in Front",
    Callback = function()
        currentBuildPosition = HRP.CFrame + Vector3.new(0, sphereRadius, 10)
        if showBuildPreview then
            createSpherePreview(currentBuildPosition, sphereRadius, sphereBlockSize)
        end
        Rayfield:Notify({Title = "Center Set", Content = "Sphere center set in front of you!", Duration = 2})
    end,
})

sphereTab:CreateButton({
    Name = "Clear Preview",
    Callback = function()
        clearBuildPreview()
        Rayfield:Notify({Title = "Preview Cleared", Content = "Sphere preview removed!", Duration = 2})
    end,
})

sphereTab:CreateSection("Build")

sphereTab:CreateButton({
    Name = "BUILD 3D SPHERE",
    Callback = function()
        if not currentBuildPosition then
            Rayfield:Notify({Title = "Error", Content = "Please set a build position first!", Duration = 3})
            return
        end
        clearBuildPreview()
        build3DSphere(currentBuildPosition, sphereRadius, sphereBlockSize, sphereBlockType, hollowSphere, sphereThickness)
    end,
})

sphereTab:CreateParagraph({
    Title = "Sphere Info",
    Content = "⚪ Creates a perfect 3D sphere/ball using sphere equation x²+y²+z² ≤ r²\n" ..
               "⚪ Solid spheres are completely filled\n" ..
               "⚪ Hollow spheres create a shell with adjustable thickness\n" ..
               "⚪ Orange preview shows wireframe sphere outline\n" ..
               "⚪ Choose any block material for your sphere!"
})

-- REALISTIC VEHICLES TAB --
vehicleTab:CreateSection("Choose Vehicle")

local realisticVehicles = {
    "Lamborghini Aventador",
    "Ferrari F40", 
    "Bugatti Chiron",
    "F-22 Raptor",
    "Boeing 747",
    "Luxury Yacht",
    "Aircraft Carrier"
}
local selectedVehicle = "Lamborghini Aventador"

local vehicleDropdown = vehicleTab:CreateDropdown({
    Name = "Select Realistic Vehicle",
    Options = realisticVehicles,
    CurrentOption = {"Lamborghini Aventador"},
    MultipleOptions = false,
    Callback = function(Options)
        selectedVehicle = Options[1]
        Rayfield:Notify({Title = "Vehicle", Content = "Selected: " .. selectedVehicle, Duration = 2})
    end,
})

vehicleTab:CreateSection("Choose Block Material")

local vehicleBlockDropdown = vehicleTab:CreateDropdown({
    Name = "Select Block Material",
    Options = allBlocks,
    CurrentOption = {"IronBlock"},
    MultipleOptions = false,
    Callback = function(Options)
        selectedVehicleBlock = Options[1]
        Rayfield:Notify({Title = "Material", Content = "Using: " .. selectedVehicleBlock, Duration = 2})
    end,
})

vehicleTab:CreateSection("Build Position")

vehicleTab:CreateButton({
    Name = "Build In Front of Me",
    Callback = function()
        currentBuildPosition = HRP.CFrame + Vector3.new(0, 0, 15)
        Rayfield:Notify({Title = "Position Set", Content = "Vehicle will build in front of you!", Duration = 2})
    end,
})

vehicleTab:CreateButton({
    Name = "Build at My Feet",
    Callback = function()
        currentBuildPosition = HRP.CFrame + Vector3.new(0, 0, 5)
        Rayfield:Notify({Title = "Position Set", Content = "Vehicle will build at your feet!", Duration = 2})
    end,
})

vehicleTab:CreateSection("Build")

vehicleTab:CreateButton({
    Name = "BUILD REALISTIC VEHICLE",
    Callback = function()
        if not currentBuildPosition then
            Rayfield:Notify({Title = "Error", Content = "Please set a build position first!", Duration = 3})
            return
        end
        buildRealisticVehicle(selectedVehicle, currentBuildPosition, selectedVehicleBlock)
    end,
})

-- Image Paint Tab --
imagePaintTab:CreateSection("Pattern Selection")

local paintWidth = 30
local paintHeight = 30
local paintBlockSize = 2
local selectedPattern = "Rainbow"

local patternDropdown = imagePaintTab:CreateDropdown({
    Name = "Select Pattern",
    Options = {"Rainbow", "Checkerboard", "Stripes", "Gradient", "Heart", "Target", "Mario"},
    CurrentOption = {"Rainbow"},
    MultipleOptions = false,
    Callback = function(Options)
        selectedPattern = Options[1]
        Rayfield:Notify({Title = "Pattern", Content = "Selected: " .. selectedPattern, Duration = 2})
    end,
})

imagePaintTab:CreateSection("Choose Block Type")

local patternBlockDropdown = imagePaintTab:CreateDropdown({
    Name = "Select Block Material",
    Options = {"Auto (Color Match)", "WoodBlock", "StoneBlock", "GoldBlock", "IronBlock", "SteelBlock", "TitaniumBlock", "CopperBlock", "RedBlock", "BlueBlock", "GreenBlock", "YellowBlock", "WhiteBlock", "BlackBlock"},
    CurrentOption = {"Auto (Color Match)"},
    MultipleOptions = false,
    Callback = function(Options)
        selectedBlockForBuild = Options[1]
        Rayfield:Notify({Title = "Block", Content = "Using: " .. selectedBlockForBuild, Duration = 2})
    end,
})

imagePaintTab:CreateSection("Size Settings")

imagePaintTab:CreateSlider({
    Name = "Width (blocks)",
    Range = {5, 50},
    Increment = 1,
    Suffix = " blocks",
    CurrentValue = 30,
    Callback = function(value)
        paintWidth = value
        if showBuildPreview and currentBuildPosition then
            createBuildPreview(currentBuildPosition, paintWidth, paintHeight, paintBlockSize)
        end
    end,
})

imagePaintTab:CreateSlider({
    Name = "Height (blocks)",
    Range = {5, 50},
    Increment = 1,
    Suffix = " blocks",
    CurrentValue = 30,
    Callback = function(value)
        paintHeight = value
        if showBuildPreview and currentBuildPosition then
            createBuildPreview(currentBuildPosition, paintWidth, paintHeight, paintBlockSize)
        end
    end,
})

imagePaintTab:CreateSlider({
    Name = "Block Size (studs)",
    Range = {1, 4},
    Increment = 0.5,
    Suffix = " studs",
    CurrentValue = 2,
    Callback = function(value)
        paintBlockSize = value
        if showBuildPreview and currentBuildPosition then
            createBuildPreview(currentBuildPosition, paintWidth, paintHeight, paintBlockSize)
        end
    end,
})

imagePaintTab:CreateSection("Build Preview")

imagePaintTab:CreateToggle({
    Name = "Show Build Preview",
    CurrentValue = true,
    Callback = function(value)
        showBuildPreview = value
        if not value then
            clearBuildPreview()
        elseif currentBuildPosition then
            createBuildPreview(currentBuildPosition, paintWidth, paintHeight, paintBlockSize)
        end
    end,
})

imagePaintTab:CreateSection("Build Position")

imagePaintTab:CreateButton({
    Name = "Set Position Here (Preview)",
    Callback = function()
        currentBuildPosition = HRP.CFrame + Vector3.new(0, 5, 15)
        if showBuildPreview then
            createBuildPreview(currentBuildPosition, paintWidth, paintHeight, paintBlockSize)
        end
        Rayfield:Notify({Title = "Position Set", Content = "Build position set to front of you!", Duration = 2})
    end,
})

imagePaintTab:CreateButton({
    Name = "Set Position at Feet",
    Callback = function()
        currentBuildPosition = HRP.CFrame + Vector3.new(0, 0, 5)
        if showBuildPreview then
            createBuildPreview(currentBuildPosition, paintWidth, paintHeight, paintBlockSize)
        end
        Rayfield:Notify({Title = "Position Set", Content = "Build position set at your feet!", Duration = 2})
    end,
})

imagePaintTab:CreateButton({
    Name = "Clear Preview",
    Callback = function()
        clearBuildPreview()
        Rayfield:Notify({Title = "Preview Cleared", Content = "Build preview removed!", Duration = 2})
    end,
})

imagePaintTab:CreateSection("Build")

imagePaintTab:CreateButton({
    Name = "BUILD PATTERN",
    Callback = function()
        if not currentBuildPosition then
            Rayfield:Notify({Title = "Error", Content = "Please set a build position first!", Duration = 3})
            return
        end
        clearBuildPreview()
        paintPattern(selectedPattern, currentBuildPosition, paintWidth, paintHeight, paintBlockSize, selectedBlockForBuild)
    end,
})

-- Auto Farm Tab --
farmTab:CreateToggle({
    Name = "Auto Farm",
    CurrentValue = false,
    Callback = function(value)
        if value then
            startAutoFarm()
        else
            autoFarmEnabled = false
        end
    end,
})

farmTab:CreateSlider({
    Name = "Farm Delay (seconds)",
    Range = {0.5, 5},
    Increment = 0.1,
    Suffix = "s",
    CurrentValue = farmDelay,
    Callback = function(value)
        farmDelay = value
    end,
})

farmTab:CreateParagraph({
    Title = "Current Stage",
    Content = tostring(currentStage) .. " / 10"
})

task.spawn(function()
    while task.wait(1) do
        if farmTab then
            pcall(function()
                farmTab:UpdateParagraph("Current Stage", tostring(currentStage) .. " / 10")
            end)
        end
    end
end)

farmTab:CreateToggle({
    Name = "Auto Collect Items",
    CurrentValue = false,
    Callback = function(value)
        if value then
            startAutoCollect()
        else
            autoCollectEnabled = false
        end
    end,
})

-- Movement Tab --
movementTab:CreateToggle({
    Name = "Fly Mode (WASD + Space/Ctrl)",
    CurrentValue = false,
    Callback = function(value)
        if value then
            startFly()
        else
            stopFly()
        end
    end,
})

movementTab:CreateSlider({
    Name = "Fly Speed",
    Range = {20, 200},
    Increment = 5,
    Suffix = " studs/s",
    CurrentValue = flySpeed,
    Callback = function(value)
        flySpeed = value
    end,
})

movementTab:CreateToggle({
    Name = "No Clip",
    CurrentValue = false,
    Callback = function(value)
        toggleNoClip()
    end,
})

movementTab:CreateToggle({
    Name = "Speed Boost",
    CurrentValue = false,
    Callback = function(value)
        speedEnabled = value
        if value then
            originalWalkSpeed = humanoid.WalkSpeed
            setSpeed(currentSpeed)
            Rayfield:Notify({Title = "Speed Boost", Content = "Walk speed set to " .. currentSpeed .. " studs/s!", Duration = 2})
        else
            setSpeed(originalWalkSpeed)
            Rayfield:Notify({Title = "Speed Boost", Content = "Walk speed restored to normal!", Duration = 2})
        end
    end,
})

movementTab:CreateSlider({
    Name = "Walk Speed",
    Range = {16, 250},
    Increment = 5,
    Suffix = " studs/s",
    CurrentValue = currentSpeed,
    Callback = function(value)
        currentSpeed = value
        if speedEnabled then
            setSpeed(value)
        end
    end,
})

movementTab:CreateToggle({
    Name = "Infinite Jump",
    CurrentValue = false,
    Callback = function(value)
        infiniteJumpEnabled = value
        setupInfiniteJump()
    end,
})

-- Boat Speed Tab --
boatTab:CreateToggle({
    Name = "Boat Speed Boost",
    CurrentValue = false,
    Callback = function(value)
        if value then
            startBoatSpeed()
        else
            stopBoatSpeed()
        end
    end,
})

boatTab:CreateSlider({
    Name = "Boat Speed",
    Range = {50, 500},
    Increment = 10,
    Suffix = " studs/s",
    CurrentValue = currentBoatSpeed,
    Callback = function(value)
        currentBoatSpeed = value
        if boatSpeedEnabled then
            Rayfield:Notify({Title = "Boat Speed", Content = "Boat speed set to " .. value .. " studs/s!", Duration = 2})
        end
    end,
})

boatTab:CreateButton({
    Name = "Stop Boat",
    Callback = function()
        local car = getCar()
        if car then
            for _, part in pairs(car:GetDescendants()) do
                if part:IsA("BasePart") then
                    part.Velocity = Vector3.zero
                    part.RotVelocity = Vector3.zero
                end
                local velocity = part:FindFirstChild("BodyVelocity")
                if velocity then
                    velocity:Destroy()
                end
            end
            Rayfield:Notify({Title = "Stopped", Content = "Boat has been stopped!", Duration = 2})
        end
    end,
})

-- Combat Tab --
combatTab:CreateToggle({
    Name = "ESP (Player Names & Health)",
    CurrentValue = false,
    Callback = function(value)
        espEnabled = value
        if value then
            setupESP()
            Rayfield:Notify({Title = "ESP", Content = "ESP enabled! Player names and health visible!", Duration = 3})
        else
            for part, _ in pairs(espObjects) do
                removeESP(part)
            end
            espObjects = {}
            Rayfield:Notify({Title = "ESP", Content = "ESP disabled!", Duration = 2})
        end
    end,
})

combatTab:CreateToggle({
    Name = "God Mode",
    CurrentValue = false,
    Callback = function(value)
        if value then
            enableGodMode()
        else
            disableGodMode()
        end
    end,
})

-- Utility Tab --
utilityTab:CreateToggle({
    Name = "Auto Clicker",
    CurrentValue = false,
    Callback = function(value)
        startAutoClicker()
    end,
})

utilityTab:CreateSlider({
    Name = "Click Delay (seconds)",
    Range = {0.05, 0.5},
    Increment = 0.01,
    Suffix = "s",
    CurrentValue = clickDelay,
    Callback = function(value)
        clickDelay = value
    end,
})

utilityTab:CreateToggle({
    Name = "Anti AFK",
    CurrentValue = true,
    Callback = function(value)
        antiAFKEnabled = value
    end,
})

utilityTab:CreateButton({
    Name = "Rejoin Game",
    Callback = function()
        game:GetService("TeleportService"):Teleport(game.PlaceId, player)
    end,
})

-- Fun Tab --
local firstSeat = nil
local secondSeat = nil

funTab:CreateSection("Bring Player")

local dd2 = funTab:CreateDropdown({
    Name = "Choose Player To Bring",
    Options = getPlayers(),
    CurrentOption = {"None Selected"},
    MultipleOptions = false,
    Callback = function(Options)
        local realName = getRealName(Options[1])
        if realName then
            playerToBring = players:FindFirstChild(realName)
        end
    end,
})

players.PlayerAdded:Connect(function()
    dd2:Refresh(getPlayers())
end)

funTab:CreateButton({
    Name = "Set First Seat (Sit In It)",
    Callback = function()
        if humanoid.SeatPart then
            firstSeat = humanoid.SeatPart
            Rayfield:Notify({Title = "Seat Set", Content = "First seat selected!", Duration = 2})
        else
            Rayfield:Notify({Title = "Error", Content = "You are not sitting in a seat!", Duration = 2})
        end
    end,
})

funTab:CreateButton({
    Name = "Set Second Seat (Sit In It)",
    Callback = function()
        if humanoid.SeatPart then
            secondSeat = humanoid.SeatPart
            Rayfield:Notify({Title = "Seat Set", Content = "Second seat selected!", Duration = 2})
        else
            Rayfield:Notify({Title = "Error", Content = "You are not sitting in a seat!", Duration = 2})
        end
    end,
})

funTab:CreateButton({
    Name = "Bring Player to Second Seat",
    Callback = function()
        if not firstSeat or not secondSeat then
            Rayfield:Notify({Title = "Error", Content = "Please set both seats first!", Duration = 3})
            return
        end
        if firstSeat == secondSeat then
            Rayfield:Notify({Title = "Error", Content = "Seats must be different!", Duration = 3})
            return
        end
        if not playerToBring then
            Rayfield:Notify({Title = "Error", Content = "Please select a player to bring!", Duration = 3})
            return
        end
        bringPlayer(playerToBring, firstSeat, secondSeat)
    end,
})

funTab:CreateSection("Visual Effects")

funTab:CreateToggle({
    Name = "Rainbow Sky",
    CurrentValue = false,
    Callback = function(value)
        if value then
            task.spawn(function()
                local hue = 0
                while value do
                    hue = (hue + 0.01) % 1
                    lighting.Sky.SkyboxBk = Color3.fromHSV(hue, 1, 1)
                    lighting.Sky.SkyboxDn = Color3.fromHSV(hue, 1, 1)
                    lighting.Sky.SkyboxFt = Color3.fromHSV(hue, 1, 1)
                    lighting.Sky.SkyboxLf = Color3.fromHSV(hue, 1, 1)
                    lighting.Sky.SkyboxRt = Color3.fromHSV(hue, 1, 1)
                    lighting.Sky.SkyboxUp = Color3.fromHSV(hue, 1, 1)
                    task.wait(0.05)
                end
            end)
        else
            lighting.Sky.SkyboxBk = Color3.fromRGB(0, 0, 0)
            lighting.Sky.SkyboxDn = Color3.fromRGB(0, 0, 0)
            lighting.Sky.SkyboxFt = Color3.fromRGB(0, 0, 0)
            lighting.Sky.SkyboxLf = Color3.fromRGB(0, 0, 0)
            lighting.Sky.SkyboxRt = Color3.fromRGB(0, 0, 0)
            lighting.Sky.SkyboxUp = Color3.fromRGB(0, 0, 0)
        end
    end,
})

funTab:CreateButton({
    Name = "Rainbow Character",
    Callback = function()
        task.spawn(function()
            while true do
                local hue = tick() % 1
                local color = Color3.fromHSV(hue, 1, 1)
                if character then
                    for _, part in pairs(character:GetDescendants()) do
                        if part:IsA("BasePart") then
                            part.Color = color
                        end
                    end
                end
                task.wait(0.1)
            end
        end)
    end,
})

funTab:CreateButton({
    Name = "Explode Character",
    Callback = function()
        if character and HRP then
            local explosion = Instance.new("Explosion")
            explosion.BlastRadius = 10
            explosion.Position = HRP.Position
            explosion.Parent = workspace
        end
    end,
})

-- Load Configuration --
Rayfield:LoadConfiguration()

print("=" .. string.rep("=", 60))
print("ULTIMATE BABFT Script Loaded Successfully!")
print("")
print("NEW 3D SPHERE/BALL BUILDER:")
print("⚪ Creates perfect 3D spheres using sphere equation x²+y²+z² ≤ r²")
print("⚪ Solid spheres are completely filled")
print("⚪ Hollow spheres create a shell with adjustable thickness")
print("⚪ Orange preview shows wireframe sphere outline")
print("⚪ Choose any block material for your sphere!")
print("")
print("REALISTIC VEHICLES:")
print("🏎️ Lamborghini Aventador - Scissor doors, LED headlights")
print("🏎️ Ferrari F40 - Pop-up headlights, classic design")
print("🏎️ Bugatti Chiron - Horseshoe grille")
print("✈️ F-22 Raptor - Stealth fighter, missiles")
print("✈️ Boeing 747 - Jumbo jet with upper deck")
print("⛵ Luxury Yacht - Cabin, mast, sail")
print("🚢 Aircraft Carrier - Flight deck, island")
print("")
print("OTHER FEATURES:")
print("🎨 Pattern Painter - Rainbow, Checkerboard, Stripes, Gradient, Heart, Target, Mario")
print("👁️ ESP with Player Names & Health")
print("🕊️ Fly Mode, No Clip, Speed Boost")
print("🤖 Auto Farm, Auto Collect, Auto Clicker")
print("⛵ Boat Speed Boost")
print("👑 God Mode")
print("=" .. string.rep("=", 60))
🎮 Similar Scripts
💬 Comments (0)
Login to post a comment
No comments yet. Be the first!
Script Info
Game Build A Boat For Treasure
TypeKeyless
Authoralexriderr
Views37
Likes0
PublishedApr 4, 2026
🎮 Play Game on Roblox
🕐 Recent Scripts
Universal Script Keyless – Infinite Yield (Admin Commands)
Universal Script Keyless – Infinite Yield (Admin Commands)
Baseplate • 👁 2
Keyless
Best Script for Baddies Hitbox Expander And Freeze Trade
Best Script for Baddies Hitbox Expander And Freeze Trade
Baddies • 👁 3
Keyless
C4RL BABFT Hub Keyless Script | AutoFarm, Statistics, God Mode
C4RL BABFT Hub Keyless Script | AutoFarm, Statistics, God Mode
Build A Boat For Treasure • 👁 4
Keyless
Catch And Tame Script | Auto Buy, Auto Collect, Teleport to Pet
Catch And Tame Script | Auto Buy, Auto Collect, Teleport to Pet
Catch And Tame • 👁 6
Keyless
Vexlo Hub Script Keyless for MM2
Vexlo Hub Script Keyless for MM2
Murdеr Mystеry 2 • 👁 10
Keyless