Salty Hub
Key Required

Salty Hub

Arsenalweripdabzweripdabz 164 views 156 executesUpdated Jul 10, 2026
Unrated
00
Lua Script•354 lines (13707 chars)
--// Force Disconnect Previous Loops Safely
if shared.SaltyLoop then 
    pcall(function() shared.SaltyLoop:Disconnect() end)
    shared.SaltyLoop = nil
end
if shared.FOVCircle then 
    pcall(function() shared.FOVCircle:Destroy() end)
    shared.FOVCircle = nil 
end


--// Services
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Workspace = game:GetService("Workspace")


--// Variables
local LocalPlayer = Players.LocalPlayer
local Camera = Workspace.CurrentCamera


--// Settings Configuration
local Settings = {
    AimbotEnabled = true,       
    PlayerTPEnabled = false,    
    FOV = 160,                  
    Smoothness = 1,             
    TargetLock = true,          
    WallCheck = false,          
    ESPEnabled = true,
    MinMapHeight = -10 -- Anything below this Y level is strictly treated as void/respawn zone
}


--// State Variables
local CurrentTarget = nil
local UI_Visible = true


--// Core UI Setup (Robust Fallback)
local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "SaltyFramework_UI"
ScreenGui.ResetOnSpawn = false


local success, err = pcall(function()
    ScreenGui.Parent = game:GetService("CoreGui")
end)
if not success or not ScreenGui.Parent then
    ScreenGui.Parent = LocalPlayer:WaitForChild("PlayerGui", 5)
end


--// FOV Circle Visual
local FOVCircle = nil
pcall(function()
    FOVCircle = Drawing.new("Circle")
    FOVCircle.Color = Color3.fromRGB(255, 255, 255)
    FOVCircle.Thickness = 1
    FOVCircle.NumSides = 64
    FOVCircle.Radius = Settings.FOV
    FOVCircle.Filled = false
    FOVCircle.Visible = Settings.AimbotEnabled
    shared.FOVCircle = FOVCircle
end)


--// UI Creation Helper Functions
local function createFrame(parent, name, pos, size, color)
    local f = Instance.new("Frame")
    f.Name = name; f.Position = pos; f.Size = size; f.BackgroundColor3 = color
    f.BorderSizePixel = 0; f.Parent = parent
    return f
end


--// Build Menu Layout 
local MainMenu = createFrame(ScreenGui, "MainMenu", UDim2.new(0.05, 0, 0.2, 0), UDim2.new(0, 220, 0, 350), Color3.fromRGB(25, 25, 25))
local TitleBar = createFrame(MainMenu, "TitleBar", UDim2.new(0, 0, 0, 0), UDim2.new(1, 0, 0, 30), Color3.fromRGB(35, 35, 35))
local tLabel = Instance.new("TextLabel")
tLabel.BackgroundTransparency = 1; tLabel.Position = UDim2.new(0, 10, 0, 0); tLabel.Size = UDim2.new(1, -40, 1, 0)
tLabel.Text = "SALTY AIM/ESP"; tLabel.TextColor3 = Color3.fromRGB(240, 240, 240)
tLabel.Font = Enum.Font.SourceSansBold; tLabel.TextSize = 14; tLabel.TextXAlignment = Enum.TextXAlignment.Left; tLabel.Parent = TitleBar


-- Persistent Open Button Bar
local OpenBar = Instance.new("TextButton")
OpenBar.Name = "OpenBar"
OpenBar.Size = UDim2.new(0, 100, 0, 25)
OpenBar.Position = UDim2.new(0, 10, 0, 10) 
OpenBar.BackgroundColor3 = Color3.fromRGB(35, 35, 35)
OpenBar.BorderSizePixel = 0
OpenBar.Text = "OPEN SALTY"
OpenBar.TextColor3 = Color3.fromRGB(240, 240, 240)
OpenBar.Font = Enum.Font.SourceSansBold
OpenBar.TextSize = 12
OpenBar.Visible = false 
OpenBar.Parent = ScreenGui


local CloseButton = Instance.new("TextButton")
CloseButton.Name = "CloseButton"
CloseButton.Size = UDim2.new(0, 24, 0, 24)
CloseButton.Position = UDim2.new(1, -27, 0, 3)
CloseButton.BackgroundColor3 = Color3.fromRGB(45, 45, 45)
CloseButton.BorderSizePixel = 0
CloseButton.Text = "-"
CloseButton.TextColor3 = Color3.fromRGB(240, 240, 240)
CloseButton.Font = Enum.Font.SourceSansBold
CloseButton.TextSize = 16
CloseButton.Parent = TitleBar


local function toggleMenuVisibility()
    UI_Visible = not UI_Visible
    MainMenu.Visible = UI_Visible
    if FOVCircle then FOVCircle.Visible = (UI_Visible and Settings.AimbotEnabled) end
    OpenBar.Visible = not UI_Visible 
end


CloseButton.MouseButton1Click:Connect(toggleMenuVisibility)
OpenBar.MouseButton1Click:Connect(toggleMenuVisibility)


-- Safe UI Dragging Mechanic
local dragging, dragStart, startPos
TitleBar.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 then
        dragging = true; dragStart = input.Position; startPos = MainMenu.Position
    end
end)
UserInputService.InputChanged:Connect(function(input)
    if dragging and input.UserInputType == Enum.UserInputType.MouseMovement then
        local delta = input.Position - dragStart
        MainMenu.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
    end
end)
UserInputService.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1 then dragging = false end
end)


--// Component Generators
local layoutY = 35
local function addToggle(label, settingKey, callback)
    local btn = Instance.new("TextButton")
    btn.Size = UDim2.new(1, -20, 0, 25); btn.Position = UDim2.new(0, 10, 0, layoutY)
    btn.BackgroundColor3 = Settings[settingKey] and Color3.fromRGB(46, 117, 89) or Color3.fromRGB(45, 45, 45)
    btn.Text = label .. ": " .. (Settings[settingKey] and "ON" or "OFF")
    btn.TextColor3 = Color3.fromRGB(255, 255, 255); btn.BorderSizePixel = 0
    btn.Font = Enum.Font.SourceSans; btn.TextSize = 14; btn.Parent = MainMenu


    btn.MouseButton1Click:Connect(function()
        Settings[settingKey] = not Settings[settingKey]
        btn.Text = label .. ": " .. (Settings[settingKey] and "ON" or "OFF")
        btn.BackgroundColor3 = Settings[settingKey] and Color3.fromRGB(46, 117, 89) or Color3.fromRGB(45, 45, 45)
        if callback then callback(Settings[settingKey]) end
    end)
    layoutY = layoutY + 30
end


local function addSlider(label, min, max, settingKey, callback)
    local container = createFrame(MainMenu, label.."_Container", UDim2.new(0, 10, 0, layoutY), UDim2.new(1, -20, 0, 35), Color3.fromRGB(35, 35, 35))
    local txt = Instance.new("TextLabel")
    txt.BackgroundTransparency = 1; txt.Position = UDim2.new(0, 5, 0, 2); txt.Size = UDim2.new(1, -10, 0, 15)
    txt.Text = label .. ": " .. Settings[settingKey]; txt.TextColor3 = Color3.fromRGB(240, 240, 240)
    txt.Font = Enum.Font.SourceSansBold; txt.TextSize = 12; txt.TextXAlignment = Enum.TextXAlignment.Left; txt.Parent = container
    
    local track = Instance.new("TextButton")
    track.Name = "Track"; track.Position = UDim2.new(0, 5, 0, 22); track.Size = UDim2.new(1, -10, 0, 6)
    track.BackgroundColor3 = Color3.fromRGB(50, 50, 50); track.BorderSizePixel = 0; track.Text = ""; track.Parent = container
    
    local fill = createFrame(track, "Fill", UDim2.new(0, 0, 0, 0), UDim2.new((Settings[settingKey]-min)/(max-min), 0, 1, 0), Color3.fromRGB(52, 152, 219))
    local isSliding = false


    local function snapToMouse(inputObject)
        local trackWidth = track.AbsoluteSize.X
        if trackWidth <= 0 then return end
        local relativeX = inputObject.Position.X - track.AbsolutePosition.X
        local percentage = math.clamp(relativeX / trackWidth, 0, 1)
        local value = math.floor(min + (max - min) * percentage)
        
        Settings[settingKey] = value
        txt.Text = label .. ": " .. value
        fill.Size = UDim2.new(percentage, 0, 1, 0)
        if callback then callback(value) end
    end


    track.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then isSliding = true; snapToMouse(input) end
    end)
    track.InputChanged:Connect(function(input)
        if isSliding and input.UserInputType == Enum.UserInputType.MouseMovement then snapToMouse(input) end
    end)
    UserInputService.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1 then isSliding = false end
    end)
    
    layoutY = layoutY + 40
end


--// Build Functional UI Elements
addToggle("Master Aimbot", "AimbotEnabled", function(v) if FOVCircle then FOVCircle.Visible = v and UI_Visible end end)
addToggle("Smooth TP Track", "PlayerTPEnabled") 
addToggle("Target Lock", "TargetLock")
addToggle("Wall Check", "WallCheck")
addToggle("Player ESP (Chams)", "ESPEnabled")
addSlider("FOV Radius", 10, 800, "FOV", function(v) if FOVCircle then FOVCircle.Radius = v end end)
addSlider("Smoothness Value", 1, 20, "Smoothness")


--// Core Mechanics & Functions
local function IsVisible(targetPart)
    if not Settings.WallCheck then return true end
    local origin = Camera.CFrame.Position
    local direction = targetPart.Position - origin
    local params = RaycastParams.new()
    params.FilterType = Enum.RaycastFilterType.Exclude
    params.FilterDescendantsInstances = {LocalPlayer.Character, targetPart.Parent}
    
    local raycastResult = Workspace:Raycast(origin, direction, params)
    return raycastResult == nil
end


-- Helper function to check if player is actually standing on game geometry
local function IsOnSolidGround(rootPart)
    local ray = Ray.new(rootPart.Position, Vector3.new(0, -15, 0))
    local hitPart, hitPosition = Workspace:FindPartOnRayWithIgnoreList(ray, {rootPart.Parent, LocalPlayer.Character})
    return hitPart ~= nil
end


local function GetClosestPlayer()
    local mouseLocation = UserInputService:GetMouseLocation()
    
    -- STICKY TARGET CHECK
    if CurrentTarget and CurrentTarget.Parent and CurrentTarget.Parent:FindFirstChild("Humanoid") and CurrentTarget.Parent.Humanoid.Health > 0 then
        if CurrentTarget.Position.Y > Settings.MinMapHeight and IsOnSolidGround(CurrentTarget) then 
            return CurrentTarget
        end
    end


    local closestTarget = nil
    local maxDistance = Settings.FOV


    for _, player in ipairs(Players:GetPlayers()) do
        if player ~= LocalPlayer and player.Team ~= LocalPlayer.Team and player.Character and player.Character:FindFirstChild("Humanoid") and player.Character.Humanoid.Health > 0 then
            local root = player.Character:FindFirstChild("HumanoidRootPart")
            local head = player.Character:FindFirstChild("Head")
            
            -- Checks height and makes sure they aren't floating in space or deep below spawn zones
            if root and head and root.Position.Y > Settings.MinMapHeight then
                if IsOnSolidGround(root) then
                    local screenPos, onScreen = Camera:WorldToViewportPoint(head.Position)
                    if onScreen then
                        local dist = (Vector2.new(screenPos.X, screenPos.Y) - mouseLocation).Magnitude
                        if dist < maxDistance then
                            if IsVisible(head) then
                                maxDistance = dist
                                closestTarget = root 
                            end
                        end
                    end
                end
            end
        end
    end
    return closestTarget
end


--// Keybind Hooks
UserInputService.InputBegan:Connect(function(input, gameProcessed)
    if input.KeyCode == Enum.KeyCode.RightShift then
        toggleMenuVisibility()
    end
end)


--// Main Render Loop
shared.SaltyLoop = RunService.RenderStepped:Connect(function()
    local mouseLocation = UserInputService:GetMouseLocation()
    if FOVCircle and FOVCircle.Visible then
        FOVCircle.Position = mouseLocation
    end


    if Settings.AimbotEnabled then
        CurrentTarget = GetClosestPlayer()
        
        if CurrentTarget and (CurrentTarget.Position.Y <= Settings.MinMapHeight or not IsOnSolidGround(CurrentTarget)) then
            CurrentTarget = nil
        end


        if CurrentTarget and CurrentTarget.Parent and CurrentTarget.Parent:FindFirstChild("Humanoid") then
            local camPos = Camera.CFrame.Position
            local targetPos = CurrentTarget.Position
            
            local headOffset = Vector3.new(0, 1.5, 0)
            local finalCFrame = CFrame.lookAt(camPos, targetPos + headOffset)
            Camera.CFrame = Camera.CFrame:Lerp(finalCFrame, 1 / Settings.Smoothness)
            
            -- Auto-TP Trigger
            if Settings.PlayerTPEnabled and LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
                local rootPart = LocalPlayer.Character.HumanoidRootPart
                local targetAboveCFrame = CurrentTarget.CFrame * CFrame.new(0, 5, 0)
                
                if targetAboveCFrame.Position.Y > Settings.MinMapHeight then
                    rootPart.CFrame = rootPart.CFrame:Lerp(targetAboveCFrame, 0.25)
                else
                    CurrentTarget = nil
                end
            end
        else
            CurrentTarget = nil
        end
    end


    -- ESP rendering loop
    for _, player in ipairs(Players:GetPlayers()) do
        if player ~= LocalPlayer and player.Team ~= LocalPlayer.Team and player.Character then
            local highlight = player.Character:FindFirstChild("ESPHighlight")
            if Settings.ESPEnabled then
                if not highlight then
                    highlight = Instance.new("Highlight")
                    highlight.Name = "ESPHighlight"
                    highlight.FillColor = Color3.fromRGB(255, 0, 85)
                    highlight.OutlineColor = Color3.fromRGB(255, 255, 255)
                    highlight.FillTransparency = 0.4
                    highlight.OutlineTransparency = 0
                    highlight.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
                    highlight.Parent = player.Character
                end
            else
                if highlight then highlight:Destroy() end
            end
        elseif player.Character and player.Character:FindFirstChild("ESPHighlight") then
            player.Character.ESPHighlight:Destroy()
        end
    end
end)

Features & Information

šŸ”„ SALTY AIM/ESP/TP IS NOW OUT! šŸ”„ The ultimate FREE & KEYLESS script for Arsenal. No keys, no ads, and completely open-source! ✨ What's Packed Inside: šŸŽÆ Instant Aimbot (Adjustable Smoothness & FOV Radius) šŸ‘€ Advanced Player ESP/Chams (Team-Filtered) 🧱 Wall Check Toggle (Choose whether to target through walls or not) šŸ”’ Sticky Target Lock (Keeps you locked onto your current target) šŸš€ Smooth Teleport Tracking (Moves your character above your target while locked) šŸ›”ļø Smart Target Filtering (Ignores dead players and players in the void) šŸ–„ļø Sleek, Draggable GUI with a floating re-open bar ⚔ Fully configurable with simple toggles and sliders šŸ’” May support other Roblox shooters, but has only been tested on Potassium. Skip the key systems and get straight to using it. Copy, paste, and enjoy! šŸš€
#Arsenal#Keyless#Aimbot#ESP#Teleport

Community Comments (0)

No comments yet for this script.

More Scripts for Arsenal