
Key RequiredUniversal

--// 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)No comments yet for this script.



