--// 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)