local CustomDarkTheme = {
    TextColor = Color3.fromRGB(240, 240, 240),
    Background = Color3.fromRGB(25, 25, 25),
    Topbar = Color3.fromRGB(34, 34, 34),
    Shadow = Color3.fromRGB(20, 20, 20),
    NotificationBackground = Color3.fromRGB(20, 20, 20),
    NotificationActionsBackground = Color3.fromRGB(230, 230, 230),
    TabBackground = Color3.fromRGB(80, 80, 80),
    TabStroke = Color3.fromRGB(85, 85, 85),
    TabBackgroundSelected = Color3.fromRGB(210, 210, 210),
    TabTextColor = Color3.fromRGB(240, 240, 240),
    SelectedTabTextColor = Color3.fromRGB(50, 50, 50),
    ElementBackground = Color3.fromRGB(35, 35, 35),
    ElementBackgroundHover = Color3.fromRGB(40, 40, 40),
    SecondaryElementBackground = Color3.fromRGB(25, 25, 25),
    ElementStroke = Color3.fromRGB(50, 50, 50),
    SecondaryElementStroke = Color3.fromRGB(40, 40, 40),
    SliderBackground = Color3.fromRGB(50, 138, 220),
    SliderProgress = Color3.fromRGB(50, 138, 220),
    SliderStroke = Color3.fromRGB(58, 163, 255),
    ToggleBackground = Color3.fromRGB(30, 30, 30),
    ToggleEnabled = Color3.fromRGB(0, 146, 214),
    ToggleDisabled = Color3.fromRGB(100, 100, 100),
    ToggleEnabledStroke = Color3.fromRGB(0, 170, 255),
    ToggleDisabledStroke = Color3.fromRGB(125, 125, 125),
    ToggleEnabledOuterStroke = Color3.fromRGB(100, 100, 100),
    ToggleDisabledOuterStroke = Color3.fromRGB(65, 65, 65),
    DropdownSelected = Color3.fromRGB(40, 40, 40),
    DropdownUnselected = Color3.fromRGB(30, 30, 30),
    InputBackground = Color3.fromRGB(30, 30, 30),
    InputStroke = Color3.fromRGB(65, 65, 65),
    PlaceholderColor = Color3.fromRGB(178, 178, 178)
}

local Rayfield = loadstring(game:HttpGet('https://[Log in to view URL]'))()

local Window = Rayfield:CreateWindow({
   Name = "Friendly hacks",
   Icon = 0, -- Icon in Topbar. Can use Lucide Icons (string) or Roblox Image (number). 0 to use no icon (default).
   LoadingTitle = "Rayfield Interface Suite",
   LoadingSubtitle = "by Mango",
   ShowText = "HACK", -- for mobile users to unhide rayfield, change if you'd like
   Theme = CustomDarkTheme, -- Check https://[Log in to view URL]

   ToggleUIKeybind = "K", -- The keybind to toggle the UI visibility (string like "K" or Enum.KeyCode)

   DisableRayfieldPrompts = false,
   DisableBuildWarnings = false, -- Prevents Rayfield from warning when the script has a version mismatch with the interface

   ConfigurationSaving = {
      Enabled = true,
      FolderName = nil, -- Create a custom folder for your hub/game
      FileName = "Big Hub"
   },

   Discord = {
      Enabled = false, -- Prompt the user to join your Discord server if their executor supports it
      Invite = "noinvitelink", -- The Discord invite code, do not include discord.gg/. E.g. discord.gg/ ABCD would be ABCD
      RememberJoins = true -- Set this to false to make them join the discord every time they load it up
   },

   KeySystem = true, -- Set this to true to use our key system
   KeySettings = {
      Title = "90 hour key",
      Subtitle = "Link",
      Note = "Linkvertize is where the key is", -- Use this to tell the user how to get a key
      FileName = "Key", -- It is recommended to use something unique as other scripts using Rayfield may overwrite your key file
      SaveKey = true, -- The user's key will be saved, but if you change the key, they will be unable to use your script
      GrabKeyFromSite = true, -- If this is true, set Key below to the RAW site you would like Rayfield to get the key from
      Key = {"FREEKEY"} -- List of keys that will be accepted by the system, can be RAW file links (pastebin, github etc) or simple strings ("hello","key22")
   }
})

--// THEME MANAGER TAB (put this right AFTER your CreateWindow)
local ThemeTab = Window:CreateTab("Theme Manager", "palette") -- "palette" is the tab icon (Lucide)

ThemeTab:CreateSection("Theme Presets")

-- Dropdown to change theme
ThemeTab:CreateDropdown({
    Name = "Select Theme",
    Options = {
        "Default",
        "AmberGlow",
        "Amethyst",
        "Bloom",
        "DarkBlue",
        "Green",
        "Light",
        "Ocean",
        "Serenity",
        "AMOLED",
        "Purpleset",
        "AMOLEDPurple",
        "Custom Dark" -- this will use your CustomDarkTheme table
    },
    CurrentOption = {"Custom Dark"}, -- starts on your custom one
    MultipleOptions = false,
    Flag = "ThemeManagerTheme",
    Callback = function(Option)
        -- Option might be a table or a single string depending on Rayfield version
        local chosen = typeof(Option) == "table" and Option[1] or Option

        if chosen == "Custom Dark" then
            -- Use your Lua table theme
            Window.ModifyTheme(CustomDarkTheme)
        else
            -- Use built-in Rayfield themes by identifier
            Window.ModifyTheme(chosen)
        end
    end
})

--// TRANSPARENCY CONTROL
ThemeTab:CreateSection("GUI Transparency")

-- Helper function: change Rayfield GUI transparency
local function SetGuiTransparency(percent)
    local transparency = math.clamp(percent / 100, 0, 1)

    -- Try gethui() (executor), fall back to CoreGui
    local guiParent = (gethui and gethui()) or game:GetService("CoreGui")
    if not guiParent then return end

    local rf = guiParent:FindFirstChild("Rayfield")
    if not rf then return end

    for _, obj in ipairs(rf:GetDescendants()) do
        if obj:IsA("Frame") or obj:IsA("TextLabel") or obj:IsA("TextButton") or obj:IsA("TextBox") then
            -- Only touch things that aren't already fully invisible
            if obj.BackgroundTransparency < 1 then
                obj.BackgroundTransparency = transparency
            end
        elseif obj:IsA("ImageLabel") or obj:IsA("ImageButton") then
            if obj.ImageTransparency < 1 then
                obj.ImageTransparency = transparency
            end
        end
    end
end

-- Slider to control transparency
ThemeTab:CreateSlider({
    Name = "GUI Transparency",
    Range = {0, 100},          -- 0% = solid, 100% = invisible
    Increment = 5,
    Suffix = "%",
    CurrentValue = 0,
    Flag = "GuiTransparency",
    Callback = function(Value)
        SetGuiTransparency(Value)
    end
})

-- Optional: button to reset transparency instantly
ThemeTab:CreateButton({
    Name = "Reset Transparency",
    Callback = function()
        SetGuiTransparency(0)
    end
})

local ATab = Window:CreateTab("MainScript🏠", nil) -- Title, Image
local Section = ATab:CreateSection("MainScript🏠")

local Toggle = ATab:CreateToggle({
   Name = "Fly",
   CurrentValue = false,
   Flag = "Toggle2234", -- A flag is the identifier for the configuration file, make sure every element has a different flag if you're using configuration saving to ensure no overlaps
   Callback = function(Value)
        -- OP Fly Script

-- Talk To Me: qrcode1 on discord
-- Keybinds : X To Fly Or press the button

-- Instances:
 
local ScreenGui = Instance.new("ScreenGui")
local Frame = Instance.new("Frame")
local TextLabel = Instance.new("TextLabel")
local TextLabel_2 = Instance.new("TextLabel")
local TextButton = Instance.new("TextButton")
 
--Properties:
 
ScreenGui.Parent = game.CoreGui
 
Frame.Parent = ScreenGui
Frame.BackgroundColor3 = Color3.fromRGB(24, 255, 51)
Frame.BorderColor3 = Color3.fromRGB(255, 0, 4)
Frame.BorderSizePixel = 15
Frame.Position = UDim2.new(0.0575905927, 0, 0.653887033, 0)
Frame.Size = UDim2.new(0, 295, 0, 152)
Frame.Active = true
Frame.Draggable = true
 
TextLabel.Parent = Frame
TextLabel.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
TextLabel.BackgroundTransparency = 1.000
TextLabel.BorderColor3 = Color3.fromRGB(255, 255, 255)
TextLabel.BorderSizePixel = 0
TextLabel.Size = UDim2.new(0, 295, 0, 63)
TextLabel.Font = Enum.Font.SciFi
TextLabel.Text = "OP FLY SCRIPT"
TextLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
TextLabel.TextScaled = true
TextLabel.TextSize = 14.000
TextLabel.TextStrokeTransparency = 0.000
TextLabel.TextWrapped = true
 
TextLabel_2.Parent = Frame
TextLabel_2.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
TextLabel_2.BackgroundTransparency = 1.000
TextLabel_2.BorderColor3 = Color3.fromRGB(255, 255, 255)
TextLabel_2.BorderSizePixel = 0
TextLabel_2.Position = UDim2.new(0, 0, 0.342105269, 0)
TextLabel_2.Size = UDim2.new(0, 295, 0, 18)
TextLabel_2.Font = Enum.Font.SciFi
TextLabel_2.Text = "(May Not Work On All Games)"
TextLabel_2.TextColor3 = Color3.fromRGB(255, 255, 255)
TextLabel_2.TextScaled = true
TextLabel_2.TextSize = 14.000
TextLabel_2.TextStrokeTransparency = 0.000
TextLabel_2.TextWrapped = true
 
TextButton.Parent = Frame
TextButton.BackgroundColor3 = Color3.fromRGB(8, 0, 255)
TextButton.Position = UDim2.new(0.159322038, 0, 0.552631557, 0)
TextButton.Size = UDim2.new(0, 200, 0, 50)
TextButton.Font = Enum.Font.SciFi
TextButton.Text = "Click Me To Fly"
TextButton.TextColor3 = Color3.fromRGB(255, 255, 255)
TextButton.TextScaled = true
TextButton.TextSize = 14.000
TextButton.TextStrokeTransparency = 0.000
TextButton.TextWrapped = true
TextButton.MouseButton1Down:connect(function()
	local plr = game.Players.LocalPlayer
	local mouse = plr:GetMouse()
 
	localplayer = plr
 
	if workspace:FindFirstChild("Core") then
		workspace.Core:Destroy()
	end
 
	local Core = Instance.new("Part")
	Core.Name = "Core"
	Core.Size = Vector3.new(0.05, 0.05, 0.05)
 
	spawn(function()
		Core.Parent = workspace
		local Weld = Instance.new("Weld", Core)
		Weld.Part0 = Core
		Weld.Part1 = localplayer.Character.LowerTorso
		Weld.C0 = CFrame.new(0, 0, 0)
	end)
 
	workspace:WaitForChild("Core")
 
	local torso = workspace.Core
	flying = true
	local speed=10
	local keys={a=false,d=false,w=false,s=false} 
	local e1
	local e2
	local function start()
		local pos = Instance.new("BodyPosition",torso)
		local gyro = Instance.new("BodyGyro",torso)
		pos.Name="EPIXPOS"
		pos.maxForce = Vector3.new(math.huge, math.huge, math.huge)
		pos.position = torso.Position
		gyro.maxTorque = Vector3.new(9e9, 9e9, 9e9) 
		gyro.cframe = torso.CFrame
		repeat
			wait()
			localplayer.Character.Humanoid.PlatformStand=true
			local new=gyro.cframe - gyro.cframe.p + pos.position
			if not keys.w and not keys.s and not keys.a and not keys.d then
				speed=5
			end
			if keys.w then 
				new = new + workspace.CurrentCamera.CoordinateFrame.lookVector * speed
				speed=speed+0
			end
			if keys.s then 
				new = new - workspace.CurrentCamera.CoordinateFrame.lookVector * speed
				speed=speed+0
			end
			if keys.d then 
				new = new * CFrame.new(speed,0,0)
				speed=speed+0
			end
			if keys.a then 
				new = new * CFrame.new(-speed,0,0)
				speed=speed+0
			end
			if speed>10 then
				speed=5
			end
			pos.position=new.p
			if keys.w then
				gyro.cframe = workspace.CurrentCamera.CoordinateFrame*CFrame.Angles(-math.rad(speed*0),0,0)
			elseif keys.s then
				gyro.cframe = workspace.CurrentCamera.CoordinateFrame*CFrame.Angles(math.rad(speed*0),0,0)
			else
				gyro.cframe = workspace.CurrentCamera.CoordinateFrame
			end
		until flying == false
		if gyro then gyro:Destroy() end
		if pos then pos:Destroy() end
		flying=false
		localplayer.Character.Humanoid.PlatformStand=false
		speed=10
	end
	e1=mouse.KeyDown:connect(function(key)
		if not torso or not torso.Parent then flying=false e1:disconnect() e2:disconnect() return end
		if key=="w" then
			keys.w=true
		elseif key=="s" then
			keys.s=true
		elseif key=="a" then
			keys.a=true
		elseif key=="d" then
			keys.d=true
		elseif key=="x" then
			if flying==true then
				flying=false
			else
				flying=true
				start()
			end
		end
	end)
	e2=mouse.KeyUp:connect(function(key)
		if key=="w" then
			keys.w=false
		elseif key=="s" then
			keys.s=false
		elseif key=="a" then
			keys.a=false
		elseif key=="d" then
			keys.d=false
		end
	end)
	start()
end)   
   end,
})

local Slider = ATab:CreateSlider({
   Name = "WalkSpeed",
   Range = {16, 300},
   Increment = 1,
   Suffix = "Speed",
   CurrentValue = 16,
   Flag = "Slider1", -- A flag is the identifier for the configuration file, make sure every element has a different flag if you're using configuration saving to ensure no overlaps
   Callback = function(Value)
        game.Players.LocalPlayer.Character.Humanoid.WalkSpeed = (Value)
   end,
})

local Slider = ATab:CreateSlider({
   Name = "JumpPower",
   Range = {50, 2000},
   Increment = 1,
   Suffix = "Jump",
   CurrentValue = 50,
   Flag = "Slider2", -- A flag is the identifier for the configuration file, make sure every element has a different flag if you're using configuration saving to ensure no overlaps
   Callback = function(Value)
        game.Players.LocalPlayer.Character.Humanoid.JumpPower = (Value)
   end,
})

local BTab = Window:CreateTab("FortLineScript🏠", nil) -- Title, Image
local Section = BTab:CreateSection("FortLineScript🏠")

local Button = BTab:CreateButton({
   Name = "Fortline leak",
   Callback = function()
        local Players = game:GetService("Players")
local LocalPlayer = Players.LocalPlayer
local Workspace = game:GetService("Workspace")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local ContextActionService = game:GetService("ContextActionService")
local StarterGui = game:GetService("StarterGui")
local Camera = Workspace:FindFirstChildOfClass("Camera") or Workspace.CurrentCamera

-- ===== Rayfield UI =====
local Rayfield = loadstring(game:HttpGet('https://[Log in to view URL]'))()
local Window = Rayfield:CreateWindow({
    Name = "FORTLINE BIG UPDATE 2025",
    Icon = 0,
    LoadingTitle = "LOADING",
    LoadingSubtitle = "by Chance",
    Theme = "Default",
    ConfigurationSaving = {Enabled=true, FolderName=nil, FileName="FORTLINE_PRO_2025_CFG"},
})

-- Tabs: Main, Combat, ESP, Aimbot, Movement, Settings
local TabMain    = Window:CreateTab("Main",    4483362458)
local TabCombat  = Window:CreateTab("Combat",  4483362458)
local TabESP     = Window:CreateTab("ESP",     4483362458)
local TabAimbot  = Window:CreateTab("Aimbot",  4483362458)
local TabMove    = Window:CreateTab("Movement",4483362458)
local TabSettings= Window:CreateTab("Settings",4483362458)

-- ===== Internal state =====
local Connections = {}
local Drawings = {} -- store any drawing objects for cleanup
local PlayersESP = {}
local LoopKillAllRunning = false
local LoopKillPlayers = {} -- name -> bool
local GodRunning = false
local AntiKickRunning = true

-- ===== Cached remote finder =====
local function safeFindWeaponsNetwork()
    local ok, net = pcall(function()
        local ws = ReplicatedStorage:FindFirstChild("WeaponsSystem")
        if not ws then return nil end
        local network = ws:FindFirstChild("Network")
        if not network then return nil end
        return network:FindFirstChild("WeaponHit") or network:FindFirstChild("WeaponHit")
    end)
    return ok and net or nil
end
local cachedWeaponNetwork = safeFindWeaponsNetwork()
-- attempt a short wait if nil
if not cachedWeaponNetwork then
    task.spawn(function()
        pcall(function()
            cachedWeaponNetwork = ReplicatedStorage:WaitForChild("WeaponsSystem", 2)
                and ReplicatedStorage.WeaponsSystem:WaitForChild("Network", 2)
                and ReplicatedStorage.WeaponsSystem.Network:FindFirstChild("WeaponHit")
        end)
    end)
end

-- ===== Utilities =====
local function safeFire(weapon, args)
    if not weapon or not cachedWeaponNetwork then return end
    pcall(function() cachedWeaponNetwork:FireServer(weapon, args) end)
end

local function findRocketLauncher()
    local w = (LocalPlayer.Backpack and LocalPlayer.Backpack:FindFirstChild("RocketLauncher"))
           or (LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("RocketLauncher"))
    return w
end

local function isPartValid(part)
    return part and typeof(part.Position) == "Vector3" and part:IsA("BasePart")
end

-- ===== Combat: Fire helper, Kill All, Loop Kill player =====
local function FireWeaponAtPart(part)
    if not isPartValid(part) then return false end
    local weapon = findRocketLauncher()
    if not weapon then return false end
    if not cachedWeaponNetwork then cachedWeaponNetwork = safeFindWeaponsNetwork() end
    if not cachedWeaponNetwork then return false end

    pcall(function()
        cachedWeaponNetwork:FireServer(weapon, {
            p = part.Position,
            pid = 0,
            part = part,
            d = 0, maxDist = 0, h = part, m = Enum.Material.Concrete,
            n = Vector3.new(0,0,0), t = 0, sid = 0
        })
    end)
    return true
end

local function KillAll()
    for _, pl in ipairs(Players:GetPlayers()) do
        if pl ~= LocalPlayer and pl.Character then
            local head = pl.Character:FindFirstChild("Head") or pl.Character:FindFirstChild("HumanoidRootPart")
            if head and head:IsA("BasePart") then
                pcall(function() FireWeaponAtPart(head) end)
            end
        end
    end
end

local function ToggleLoopKillAll()
    LoopKillAllRunning = not LoopKillAllRunning
    if LoopKillAllRunning then
        task.spawn(function()
            while LoopKillAllRunning do
                pcall(KillAll)
                task.wait(0.5)
            end
        end)
    end
end

local function ToggleLoopKillPlayer(name)
    if not name or name == "" then return end
    LoopKillPlayers[name] = not LoopKillPlayers[name]
    if LoopKillPlayers[name] then
        task.spawn(function()
            while LoopKillPlayers[name] do
                local p = Players:FindFirstChild(name)
                if p and p.Character then
                    local head = p.Character:FindFirstChild("Head") or p.Character:FindFirstChild("HumanoidRootPart")
                    if head and head:IsA("BasePart") then
                        pcall(function() FireWeaponAtPart(head) end)
                    end
                end
                task.wait(0.5)
            end
        end)
    end
end

-- Combat UI
TabCombat:CreateButton({Name="Kill All (once)", Callback=function() pcall(KillAll) end})
TabCombat:CreateButton({Name="Toggle LoopKill All", Callback=ToggleLoopKillAll})
TabCombat:CreateInput({Name="Kill Player (once)", CurrentValue="", PlaceholderText="Player Name", RemoveTextAfterFocusLost=false, Callback=function(txt)
    local p = Players:FindFirstChild(txt)
    if p and p.Character then
        local head = p.Character:FindFirstChild("Head") or p.Character:FindFirstChild("HumanoidRootPart")
        if head then FireWeaponAtPart(head) end
    end
end})
TabCombat:CreateInput({Name="Toggle LoopKill Player", CurrentValue="", PlaceholderText="Player Name", RemoveTextAfterFocusLost=false, Callback=ToggleLoopKillPlayer})

-- ===== God Mode (improved) =====
local function ToggleGod()
    GodRunning = not GodRunning
    if GodRunning then
        task.spawn(function()
            while GodRunning do
                pcall(function()
                    if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
                        local safePart = Workspace:FindFirstChild("Safe")
                        if safePart and safePart:IsA("BasePart") then
                            safePart.CFrame = LocalPlayer.Character.HumanoidRootPart.CFrame
                        end
                    end
                end)
                task.wait(0.1)
            end
        end)
    end
end
TabMain:CreateButton({Name="Toggle God Mode", Callback=ToggleGod})

-- ===== Reset =====
TabMain:CreateButton({Name="Reset (Ragdoll)", Callback=function()
    if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("Humanoid") then
        pcall(function() LocalPlayer.Character.Humanoid.Health = 0 end)
    end
end})

-- ===== Hitbox Expander (external) =====
TabMain:CreateButton({Name="Hitbox Expander (external)", Callback=function()
    pcall(function()
        loadstring(game:HttpGet("https://[Log in to view URL]"))()
    end)
end})

-- ===== Movement: Speed, Jump, Fly, Noclip, Teleport UI =====
local defaultSpeed, defaultJump = 16, 50
local speedValue, jumpValue = defaultSpeed, defaultJump
local speedEnabled, jumpEnabled = false, false
local FlyActive = false
local FlySpeed = 70
local NoclipActive = false

local function UpdateHumanoid()
    if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("Humanoid") then
        local hum = LocalPlayer.Character.Humanoid
        hum.WalkSpeed = speedEnabled and speedValue or defaultSpeed
        hum.JumpPower = jumpEnabled and jumpValue or defaultJump
    end
end

LocalPlayer.CharacterAdded:Connect(function()
    task.wait(1)
    UpdateHumanoid()
end)

TabMove:CreateToggle({Name="Speed Enabled", CurrentValue=false, Callback=function(val) speedEnabled = val UpdateHumanoid() end})
TabMove:CreateSlider({Name="Speed", Range={16,200}, Increment=1, CurrentValue=50, Callback=function(v) speedValue = v UpdateHumanoid() end})

TabMove:CreateToggle({Name="Jump Enabled", CurrentValue=false, Callback=function(val) jumpEnabled = val UpdateHumanoid() end})
TabMove:CreateSlider({Name="Jump Power", Range={50,300}, Increment=1, CurrentValue=100, Callback=function(v) jumpValue = v UpdateHumanoid() end})

TabMove:CreateToggle({Name="Fly (Hold F)", CurrentValue=false, Callback=function(val)
    FlyActive = val
end})
TabMove:CreateSlider({Name="Fly Speed", Range={20,200}, Increment=1, CurrentValue=FlySpeed, Callback=function(v) FlySpeed = v end})
TabMove:CreateToggle({Name="Noclip (Toggle N)", CurrentValue=false, Callback=function(v) NoclipActive = v end})
TabMove:CreateInput({Name="Teleport to Player", CurrentValue="", PlaceholderText="Player Name", RemoveTextAfterFocusLost=false, Callback=function(txt)
    local p = Players:FindFirstChild(txt)
    if p and p.Character and p.Character:FindFirstChild("HumanoidRootPart") and LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
        pcall(function() LocalPlayer.Character.HumanoidRootPart.CFrame = p.Character.HumanoidRootPart.CFrame end)
    end
end})

-- Fly implementation
local bodyVel
task.spawn(function()
    while task.wait() do
        if FlyActive and LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
            local hrp = LocalPlayer.Character.HumanoidRootPart
            if not bodyVel or not bodyVel.Parent then
                bodyVel = Instance.new("BodyVelocity")
                bodyVel.MaxForce = Vector3.new(1e5,1e5,1e5)
                bodyVel.Velocity = Vector3.new(0,0,0)
                bodyVel.Parent = hrp
            end
            local camCf = Camera and Camera.CFrame or CFrame.new()
            local forward = camCf.LookVector
            local right = camCf.RightVector
            local move = Vector3.new(0,0,0)
            if UserInputService:IsKeyDown(Enum.KeyCode.W) then move = move + forward end
            if UserInputService:IsKeyDown(Enum.KeyCode.S) then move = move - forward end
            if UserInputService:IsKeyDown(Enum.KeyCode.A) then move = move - right end
            if UserInputService:IsKeyDown(Enum.KeyCode.D) then move = move + right end
            if UserInputService:IsKeyDown(Enum.KeyCode.Space) then move = move + Vector3.new(0,1,0) end
            if UserInputService:IsKeyDown(Enum.KeyCode.LeftControl) then move = move - Vector3.new(0,1,0) end
            bodyVel.Velocity = move.Unit == move.Unit and move.Unit * FlySpeed or Vector3.new(0,0,0)
        else
            if bodyVel then
                pcall(function() bodyVel:Destroy() end)
                bodyVel = nil
            end
        end
    end
end)

-- Noclip implementation
task.spawn(function()
    while task.wait(0.25) do
        if NoclipActive and LocalPlayer.Character then
            for _, part in pairs(LocalPlayer.Character:GetDescendants()) do
                if part:IsA("BasePart") then
                    pcall(function() part.CanCollide = false end)
                end
            end
        end
    end
end)

-- ===== Anti-kick / Anti-AFK =====
task.spawn(function()
    while AntiKickRunning do
        pcall(function()
            if LocalPlayer and LocalPlayer.SetAttribute then
                LocalPlayer:SetAttribute("PreventKick", true)
            end
            -- anti-AFK: send a controller input
            pcall(function() StarterGui:SetCore("ResetButtonCallback", true) end)
        end)
        task.wait(1)
    end
end)

-- ===== ESP System (improved) =====
local ESPSettings = {
    Enabled = true,
    ShowNames = true,
    ShowHealth = true,
    ShowDistance = true,
    Tracers = true,
    BoxScale = 1.0,
    TeamColor = true,
}

TabESP:CreateToggle({Name="Enable ESP", CurrentValue=true, Callback=function(v) ESPSettings.Enabled = v end})
TabESP:CreateToggle({Name="Show Names", CurrentValue=true, Callback=function(v) ESPSettings.ShowNames = v end})
TabESP:CreateToggle({Name="Show Health", CurrentValue=true, Callback=function(v) ESPSettings.ShowHealth = v end})
TabESP:CreateToggle({Name="Show Distance", CurrentValue=true, Callback=function(v) ESPSettings.ShowDistance = v end})
TabESP:CreateToggle({Name="Tracers", CurrentValue=true, Callback=function(v) ESPSettings.Tracers = v end})
TabESP:CreateSlider({Name="Box Scale", Range={0.5,2.5}, Increment=0.1, CurrentValue=1.0, Callback=function(v) ESPSettings.BoxScale = v end})
TabESP:CreateToggle({Name="Team color tags", CurrentValue=true, Callback=function(v) ESPSettings.TeamColor = v end})

-- Drawing helpers
local function newSquare()
    local sq = Drawing.new("Square")
    sq.Thickness = 2
    sq.Filled = false
    sq.Visible = false
    return sq
end
local function newText()
    local t = Drawing.new("Text")
    t.Size = 16
    t.Center = true
    t.Outline = true
    t.Visible = false
    return t
end
local function newLine()
    local l = Drawing.new("Line")
    l.Thickness = 1
    l.Visible = false
    return l
end

-- cleanup utility
local function cleanupESPForPlayer(player)
    if PlayersESP[player] then
        pcall(function()
            if PlayersESP[player].Box then PlayersESP[player].Box:Remove() end
            if PlayersESP[player].Text then PlayersESP[player].Text:Remove() end
            if PlayersESP[player].Tracer then PlayersESP[player].Tracer:Remove() end
        end)
        PlayersESP[player] = nil
    end
end

Players.PlayerRemoving:Connect(function(plr)
    cleanupESPForPlayer(plr)
end)

-- ESP render loop
Connections.ESP = RunService.RenderStepped:Connect(function()
    if not ESPSettings.Enabled then
        for p,_ in pairs(PlayersESP) do cleanupESPForPlayer(p) end
        return
    end

    for _,player in ipairs(Players:GetPlayers()) do
        if player ~= LocalPlayer and player.Character and (player.Character:FindFirstChild("HumanoidRootPart") or player.Character:FindFirstChild("Head")) then
            if not PlayersESP[player] then
                PlayersESP[player] = {
                    Box = newSquare(),
                    Text = newText(),
                    Tracer = newLine()
                }
            end

            local root = player.Character:FindFirstChild("HumanoidRootPart") or player.Character:FindFirstChild("Head")
            if not root then cleanupESPForPlayer(player); continue end
            local screenPos, onScreen = Camera:WorldToViewportPoint(root.Position)
            local data = PlayersESP[player]
            local box = data.Box; local text = data.Text; local tracer = data.Tracer

            if onScreen then
                local dist = 0
                if LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") then
                    dist = math.floor((LocalPlayer.Character.HumanoidRootPart.Position - root.Position).Magnitude)
                end

                -- scale box by distance
                local scale = math.clamp(200 / math.max(dist, 10), 0.7, 2.0) * ESPSettings.BoxScale
                local w,h = 50 * scale, 100 * scale
                box.Position = Vector2.new(screenPos.X - w/2, screenPos.Y - h/1.8)
                box.Size = Vector2.new(w, h)
                box.Color = (ESPSettings.TeamColor and (player.Team and (player.Team.TeamColor.Color) or Color3.fromRGB(255,0,0))) or Color3.fromRGB(255,0,0)
                box.Visible = true

                -- text info
                local info = ""
                if ESPSettings.ShowNames then info = info .. player.Name .. " " end
                if ESPSettings.ShowHealth and player.Character:FindFirstChild("Humanoid") then
                    info = info .. "[" .. math.floor(player.Character.Humanoid.Health) .. "] "
                end
                if ESPSettings.ShowDistance then info = info .. "("..dist.."m)" end
                text.Position = Vector2.new(screenPos.X, screenPos.Y - h/2 - 14)
                text.Text = info
                text.Color = Color3.fromRGB(255,255,255)
                text.Visible = true

                if ESPSettings.Tracers then
                    tracer.From = Vector2.new(Camera.ViewportSize.X/2, Camera.ViewportSize.Y) -- bottom centre
                    tracer.To = Vector2.new(screenPos.X, screenPos.Y)
                    tracer.Color = box.Color
                    tracer.Visible = true
                else
                    tracer.Visible = false
                end
            else
                box.Visible = false; text.Visible = false; tracer.Visible = false
            end
        else
            if PlayersESP[player] then cleanupESPForPlayer(player) end
        end
    end
end)

-- ===== Aimbot: Hold-to-aim, Legit, Smoothing, FOV circle, Silent Aim =====
local Aimbot = {
    Enabled = false,
    HoldToAim = true,
    AimKey = Enum.UserInputType.MouseButton2, -- Right mouse
    FOV = 120,
    Smooth = 0.25,
    Bone = "HumanoidRootPart",
    Legit = false, -- lower smoothing & randomization
    SilentAim = false, -- when true, FireWeaponAtPart is used directly (no camera move)
    AutoHeadshot = false,
    DrawFOV = true,
    FOVCircle = nil
}

-- FOV circle drawing
local function createFOVCircle()
    if Aimbot.FOVCircle then
        pcall(function() Aimbot.FOVCircle:Remove() end)
    end
    local circ = Drawing.new("Circle")
    circ.Radius = Aimbot.FOV
    circ.Filled = false
    circ.Transparency = 1
    circ.Thickness = 1
    circ.Visible = Aimbot.DrawFOV
    Aimbot.FOVCircle = circ
end
createFOVCircle()

TabAimbot:CreateToggle({Name="Enable Aimbot", CurrentValue=false, Callback=function(v) Aimbot.Enabled = v end})
TabAimbot:CreateToggle({Name="Hold-to-Aim (RMB)", CurrentValue=true, Callback=function(v) Aimbot.HoldToAim = v end})
TabAimbot:CreateSlider({Name="Aimbot FOV", Range={50,500}, Increment=1, CurrentValue=Aimbot.FOV, Callback=function(v) Aimbot.FOV = v if Aimbot.FOVCircle then Aimbot.FOVCircle.Radius = v end end})
TabAimbot:CreateSlider({Name="Smoothing", Range={0.01,0.8}, Increment=0.01, CurrentValue=Aimbot.Smooth, Callback=function(v) Aimbot.Smooth = v end})
TabAimbot:CreateInput({Name="Aim Bone", CurrentValue="HumanoidRootPart", PlaceholderText="Bone name", RemoveTextAfterFocusLost=false, Callback=function(v) if v and v ~= "" then Aimbot.Bone = v end end})
TabAimbot:CreateToggle({Name="Legit Mode (subtle)", CurrentValue=false, Callback=function(v) Aimbot.Legit = v end})
TabAimbot:CreateToggle({Name="Silent Aim (fire w/out camera)", CurrentValue=false, Callback=function(v) Aimbot.SilentAim = v end})
TabAimbot:CreateToggle({Name="Auto Headshot", CurrentValue=false, Callback=function(v) Aimbot.AutoHeadshot = v end})
TabAimbot:CreateToggle({Name="Show FOV Circle", CurrentValue=true, Callback=function(v) Aimbot.DrawFOV = v if Aimbot.FOVCircle then Aimbot.FOVCircle.Visible = v end end})
TabAimbot:CreateInput({Name="Aim Hotkey (for HoldToAim leave empty)", CurrentValue="", PlaceholderText="E.g. Q", RemoveTextAfterFocusLost=false, Callback=function(v)
    -- optional: map a single-key hotkey to toggle aim while HoldToAim disabled
    -- handled below via InputBegan/Ended
end})

-- Helper to get mouse position
local function getMousePos()
    local mousePos = UserInputService:GetMouseLocation()
    -- On some exploits mouseY includes topbar offset; Camera.ViewportSize is used in FOV circle positioning
    return Vector2.new(mousePos.X, mousePos.Y)
end

-- find closest player within FOV (screen-space)
local function getClosestInFOV()
    local closest, best = nil, Aimbot.FOV + 0
    local mouse = getMousePos()
    for _, pl in ipairs(Players:GetPlayers()) do
        if pl ~= LocalPlayer and pl.Character and pl.Character:FindFirstChild(Aimbot.Bone) then
            local pos = pl.Character[Aimbot.Bone].Position
            local screenPos, onScreen = Camera:WorldToViewportPoint(pos)
            if onScreen then
                local d = (Vector2.new(screenPos.X, screenPos.Y) - mouse).Magnitude
                if d < best then
                    best = d
                    closest = pl
                end
            end
        end
    end
    return closest, best
end

-- Draw FOV circle updating
Connections.FOV = RunService.RenderStepped:Connect(function()
    if Aimbot.FOVCircle and Aimbot.DrawFOV then
        local view = Camera and Camera.ViewportSize or Vector2.new(800,600)
        Aimbot.FOVCircle.Position = getMousePos()
        Aimbot.FOVCircle.Radius = Aimbot.FOV
        Aimbot.FOVCircle.Visible = Aimbot.Enabled and Aimbot.DrawFOV
    end
end)

-- Aim actions: move camera to look at target (smooth) OR silent-fire
local function aimAtPlayer(pl)
    if not pl or not pl.Character or not pl.Character:FindFirstChild(Aimbot.Bone) then return end
    local targetPos = pl.Character[Aimbot.Bone].Position
    if Aimbot.SilentAim then
        -- Fire directly at head or specified bone (silent)
        local aimPart = (Aimbot.AutoHeadshot and pl.Character:FindFirstChild("Head")) or pl.Character[Aimbot.Bone]
        if aimPart then FireWeaponAtPart(aimPart) end
    else
        -- Move camera towards target smoothly
        local smooth = Aimbot.Legit and math.max(Aimbot.Smooth * 1.8, 0.05) or Aimbot.Smooth
        if Camera and Camera.CFrame then
            pcall(function()
                Camera.CFrame = Camera.CFrame:Lerp(CFrame.new(Camera.CFrame.Position, targetPos), smooth)
            end)
        end
    end
end

-- Input handling for hold-to-aim
local aiming = false
UserInputService.InputBegan:Connect(function(input, gameProcessed)
    if gameProcessed then return end
    -- Right mouse for hold-to-aim
    if Aimbot.HoldToAim and input.UserInputType == Aimbot.AimKey then
        aiming = true
    end
    -- example single-key toggle (Q) for manual aim if not hold-to-aim
    if not Aimbot.HoldToAim and input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode == Enum.KeyCode.Q then
        aiming = not aiming
    end
end)
UserInputService.InputEnded:Connect(function(input)
    if Aimbot.HoldToAim and input.UserInputType == Aimbot.AimKey then
        aiming = false
    end
end)

-- Aimbot loop
Connections.Aimbot = RunService.RenderStepped:Connect(function()
    if not Aimbot.Enabled then return end
    if Aimbot.HoldToAim and not aiming then return end

    local target, dist = getClosestInFOV()
    if target and dist <= Aimbot.FOV then
        aimAtPlayer(target)
    end
end)

-- ===== FPS & Ping monitor =====
local FPS = 0
local lastTick = tick()
local frameCount = 0
Connections.FPS = RunService.RenderStepped:Connect(function()
    frameCount = frameCount + 1
    if tick() - lastTick >= 1 then
        FPS = frameCount / (tick() - lastTick)
        frameCount = 0
        lastTick = tick()
    end
end)

-- Ping: try to use stats from RunService or network object if available (best-effort)
local Ping = 0
task.spawn(function()
    while task.wait(1) do
        pcall(function()
            -- some exploits expose GetNetworkStats or similar; we fallback to 0
            local ok, res = pcall(function() return Workspace:GetServerTimeNow() end)
            Ping = 0 -- best-effort; leave 0 if not available
            -- alternative methods are exploit-dependent; keep ping as 0 fallback
        end)
    end
end)

-- show FPS/Ping in top-left using Drawing
local fpsText = Drawing.new("Text")
fpsText.Position = Vector2.new(8,8)
fpsText.Size = 16
fpsText.Outline = true
fpsText.Center = false
fpsText.Visible = true
Connections.FPSText = RunService.RenderStepped:Connect(function()
    fpsText.Text = string.format("FPS: %d  Ping: %dms", math.floor(FPS), math.floor(Ping))
    fpsText.Color = Color3.fromRGB(255,255,255)
end)
table.insert(Drawings, fpsText)

-- ===== Settings / Hotkeys / Cleanup =====
-- Hotkeys
local Hotkeys = {
    {key = Enum.KeyCode.N, action = function() NoclipActive = not NoclipActive end, desc = "Toggle Noclip"},
    {key = Enum.KeyCode.F, action = function() FlyActive = not FlyActive end, desc = "Toggle Fly"},
    {key = Enum.KeyCode.B, action = function() Aimbot.Enabled = not Aimbot.Enabled end, desc = "Toggle Aimbot"},
    {key = Enum.KeyCode.K, action = function() ToggleLoopKillAll() end, desc = "Toggle LoopKill All"},
}
UserInputService.InputBegan:Connect(function(input, gameProcessed)
    if gameProcessed then return end
    if input.UserInputType == Enum.UserInputType.Keyboard then
        for _,h in ipairs(Hotkeys) do
            if input.KeyCode == h.key then
                pcall(h.action)
            end
        end
    end
end)

-- Settings UI
TabSettings:CreateLabel({Name="Hotkeys (N:Noclip, F:Fly, B:Aimbot, K:LoopKillAll)"})
TabSettings:CreateButton({Name="Unload / Cleanup (SAFE)", Callback=function()
    -- call cleanup (defined below)
    cleanupAll()
end})
TabSettings:CreateButton({Name="Reload Config", Callback=function() pcall(function() Rayfield:LoadConfiguration() end) end})

-- ===== Cleanup handler (disconnects + remove drawings) =====
function cleanupAll()
    -- stop loops/state
    LoopKillAllRunning = false
    for k,_ in pairs(LoopKillPlayers) do LoopKillPlayers[k] = false end
    GodRunning = false
    FlyActive = false
    NoclipActive = false
    Aimbot.Enabled = false
    AntiKickRunning = false

    -- disconnect connections
    for k,conn in pairs(Connections) do
        if conn and typeof(conn) == "RBXScriptConnection" then
            pcall(function() conn:Disconnect() end)
        end
        Connections[k] = nil
    end

    -- remove all drawing objects produced by this script
    for _,obj in ipairs(Drawings) do
        pcall(function() obj:Remove() end)
    end
    Drawings = {}

    for p,_ in pairs(PlayersESP) do cleanupESPForPlayer(p) end
    PlayersESP = {}

    -- destroy FOV circle
    if Aimbot.FOVCircle then pcall(function() Aimbot.FOVCircle:Remove() end) end

    -- unset any attributes
    pcall(function() if LocalPlayer and LocalPlayer.SetAttribute then LocalPlayer:SetAttribute("PreventKick", nil) end end)
end

-- Ensure Rayfield config loads (if present)
pcall(function() Rayfield:LoadConfiguration() end)

-- Auto-unload if player leaves or resets (best-effort)
LocalPlayer.AncestryChanged:Connect(function()
    if not LocalPlayer.Parent then
        pcall(cleanupAll)
    end
end)

-- End of script
print("FORTLINE PRO 2025 — BIG UPDATE loaded. Use tabs/hotkeys to control features.")
   end,
})

local CTab = Window:CreateTab("TB3", 4483362458) -- Title, Image
local Section = CTab:CreateSection("TB3")

local Button = CTab:CreateButton({
    Name = "Inf Money💰🤑💰💵",
    Callback = function()

        -- The creator of this file is "wtwcaws" on Discord, owner of LTK Hub.
        -- The same license applies, this code was posted with his consent.

        local Players = game:GetService("Players")
        local LocalPlayer = Players.LocalPlayer
        local CoreGui = game:GetService("CoreGui")

        -- FIRST: Teleport to your location
        LocalPlayer.Character.HumanoidRootPart.CFrame = CFrame.new(-70.59, 287.06, -319.82)

        -- Save old position (after teleport)
        local oldPos = LocalPlayer.Character.HumanoidRootPart.CFrame

        -- Spam the sell prompt
        for i = 1, 999 do
            fireproximityprompt(workspace["IceFruit Sell"].ProximityPrompt)
        end

        task.wait(4.5)

        -- Check if money hit max
        if LocalPlayer.stored.FilthyStack.Value == LocalPlayer:GetAttribute("MaxMoney") then
            
            -- Re-enable UI
            CoreGui:WaitForChild("RobloxGui").Backpack.Visible = true

            local pg = LocalPlayer:WaitForChild("PlayerGui")
            pg.Hunger.Enabled = true
            pg.HealthGui.Enabled = true
            pg.Run.Enabled = true
            pg.SleepGui.Enabled = true
            pg.MoneyGui.Enabled = true
            pg.NewMoneyGui.Enabled = true

            -- Teleport back
            LocalPlayer.Character.HumanoidRootPart.CFrame = oldPos

            -- Alert
            Notifications:Notify("[ LTK: Hub ] Money Dupe has been completed, you can now go wash your money & repeat.", 10, "success")
        end
    end,
})

local DTab = Window:CreateTab("Player Mods", nil) -- Title, Image
local Section = DTab:CreateSection("Mods")

local Toggle = DTab:CreateToggle({
   Name = "Instant equip",
   CurrentValue = false,
   Flag = "Toggle13432", -- A flag is the identifier for the configuration file, make sure every element has a different flag if you're using configuration saving to ensure no overlaps
   Callback = function(Value)
        type GunSettings = FeatureObject & {
	SetupListeners: (this: GunSettings) -> ();
	SetMods: (this: GunSettings, Mods: { [string]: any }) -> ();
	ModifyWeapon: (this: GunSettings, Weapon: Tool) -> ();
	FreeWeapon: (this: GunSettings, Weapon: Tool?) -> ();

	Binder: Binder;
	Cache: { [Tool]: { [string]: any } };
	Mods: { [string]: any };
}

local InstantEquip = class "InstantEquip" (GunSettings) {
	constructor = function(this: GunSettings, ...)
		return this:super(...)
	end;

	Protected = {
		EntryPoint = function(this: GunSettings): ()
			this:SetMods({
				EquipTime = 0;
			})

			return this:super()
		end;
	};
}
   end,
})

local Toggle = DTab:CreateToggle({
   Name = "No ragdoll",
   CurrentValue = false,
   Flag = "Toggle19348", -- A flag is the identifier for the configuration file, make sure every element has a different flag if you're using configuration saving to ensure no overlaps
   Callback = function(Value)
        local function NoRagdoll()
	while Rio.NoRagdoll do

		-- Wait if the player is dead
		if Rio.IsDead then
			Rio.Signals.CharacterRespawned.Event:Wait()
		end

		-- Remove the ragdoll logic if it exists
		local RagdollLogic = LocalCharacter:WaitForChild("FallDamageRagdoll", 30)
		if RagdollLogic then
			RagdollLogic:Destroy()
		end

		-- Wait for any important signal
		Thread.WaitForAny({
			Rio.Signals.FeatureDisabled.Event;
			Rio.Signals.CharacterRespawned.Event;
		})
	end
end
   end,
})

local Toggle = DTab:CreateToggle({
   Name = "InstantPrompt",
   CurrentValue = false,
   Flag = "Toggle1jiuh", -- A flag is the identifier for the configuration file, make sure every element has a different flag if you're using configuration saving to ensure no overlaps
   Callback = function(Value)
        type InstantPrompts = FeatureObject & {
	Binder: Binder;
	Cache: { [ProximityPrompt]: number };

	SetupListeners: (this: InstantPrompts) -> ();
	SetState: (this: InstantPrompts, State: boolean) -> ();
}

local World = workspace -- make sure this exists

local InstantPrompts = class "InstantPrompts" (Feature) {

	constructor = function(this: InstantPrompts, ...)
		this:super(...)
		this.Binder = Binder.new()
		this.Cache = {}
	end;

	Protected = {

		Binder = false;
		Cache = false;
		State = false;

		EntryPoint = function(this: InstantPrompts): ()
			local Cache = this.Cache
			local Binder = this.Binder

			-- cache all existing prompts
			for _, Obj in World:GetDescendants() do
				if Obj:IsA("ProximityPrompt") then
					if not Cache[Obj] then
						Cache[Obj] = Obj.HoldDuration
					end
				end
			end

			-- start listening for new prompts
			this:SetupListeners()

			-- actually turn instant prompts ON
			return this:SetState(true)
		end;

		Shutdown = function(this: InstantPrompts): ()
			-- restore normal timings
			this:SetState(false)

			this.Binder:Destroy()
			table.clear(this.Cache)

			this.Cache = false :: any
			this.Binder = false :: any

			return this:super()
		end;

		SetupListeners = function(this: InstantPrompts): ()
			local Cache = this.Cache
			local Binder = this.Binder

			-- when new stuff is added to the world
			Binder:Connect(World.DescendantAdded, function(Obj: Instance)
				if Obj:IsA("ProximityPrompt") and not Cache[Obj] then
					-- save original duration
					Cache[Obj] = Obj.HoldDuration

					-- if feature is currently ON, make it instant
					if this.State then
						Obj.HoldDuration = 0
					end

					-- cleanup when prompt is destroyed
					Binder:Once(Obj.Destroying, function()
						Cache[Obj] = nil
					end)
				end
			end)
		end;

		SetState = function(this: InstantPrompts, State: boolean): ()
			this.State = State

			for Prompt, Duration in pairs(this.Cache) do
				if Prompt and Prompt.Parent then
					Prompt.HoldDuration = if State then 0 else Duration
				end
			end
		end;
	};
}
   end,
})

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: