Prison Life Script – NightFall - Verified script for Prison Life
Key Required

Prison Life Script – NightFall

Prison LifeEntervalovEntervalov 6.4K views 15.5K executesUpdated Oct 18, 2026
Unrated
00
Lua Script•2917 lines (76034 chars)
--========================================================--
-- SERVICES
--========================================================--

local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Lighting = game:GetService("Lighting")
local Workspace = game:GetService("Workspace")

local LocalPlayer = Players.LocalPlayer

--========================================================--
-- WINDUI
--========================================================--

local WindUI = loadstring(game:HttpGet(
    "https://raw.githubusercontent.com/Footagesus/WindUI/main/dist/main.lua"
))()

--========================================================--
-- SETTINGS
--========================================================--

local Settings = {

    AntiJump = false,
    AutoSprint = false,

    Underground = false,
    UndergroundDepth = 8,
    UndergroundSpeed = 20,

    QuickRespawn = false,

    ESP = false,
    TeamColors = true,

    Highlight = true,
    HighlightColor = Color3.fromRGB(255, 70, 70),
    HighlightTransparency = 0.5,
	FireRateMultiplier = 1.0,

    Fullbright = false,

    TargetTeam = false,
    RapidFire = false,
    FireRate = 0.05,

    Hitbox = false,
    HitboxSize = 6,
}

--========================================================--
-- STATE
--========================================================--

local UndergroundConnection = nil
local UndergroundSavedCFrame = nil

local CharacterConnection = nil
local DeathConnection = nil
local CharacterTrackConnection = nil

local LastAliveCFrame = nil
local LastDeathCFrame = nil

local ESPObjects = {}
local HitboxObjects = {}

local OriginalLighting = {
    Brightness = Lighting.Brightness,
    ClockTime = Lighting.ClockTime,
    FogEnd = Lighting.FogEnd,
    FogStart = Lighting.FogStart,
    Ambient = Lighting.Ambient,
    OutdoorAmbient = Lighting.OutdoorAmbient,
    GlobalShadows = Lighting.GlobalShadows,
    ExposureCompensation = Lighting.ExposureCompensation,
}

--========================================================--
-- CHARACTER
--========================================================--

local function getCharacter()
    local Character = LocalPlayer.Character

    if not Character then
        return nil, nil, nil
    end

    local Humanoid = Character:FindFirstChildOfClass("Humanoid")
    local Root = Character:FindFirstChild("HumanoidRootPart")

    return Character, Humanoid, Root
end

--========================================================--
-- ESP
--========================================================--

local function removeESP(Player)

    local Object = ESPObjects[Player]

    if Object then

        if Object.Highlight then
            Object.Highlight:Destroy()
        end

        if Object.Billboard then
            Object.Billboard:Destroy()
        end

        ESPObjects[Player] = nil
    end
end

local function getPlayerColor(Player)

    if Settings.TeamColors
        and Player.Team
        and Player.Team.TeamColor then

        return Player.Team.TeamColor.Color
    end

    return Settings.HighlightColor
end

local function createESP(Player)

    if Player == LocalPlayer then
        return
    end

    removeESP(Player)

    local Character = Player.Character

    if not Character then
        return
    end

    local Root =
        Character:FindFirstChild("HumanoidRootPart")

    if not Root then
        return
    end

    local HighlightObject = nil

    if Settings.Highlight then

        HighlightObject =
            Instance.new("Highlight")

        HighlightObject.Name =
            "NightfallHighlight"

        HighlightObject.Adornee =
            Character

        HighlightObject.DepthMode =
            Enum.HighlightDepthMode.AlwaysOnTop

        HighlightObject.FillTransparency =
            Settings.HighlightTransparency

        HighlightObject.OutlineTransparency = 0

        HighlightObject.FillColor =
            getPlayerColor(Player)

        HighlightObject.OutlineColor =
            getPlayerColor(Player)

        HighlightObject.Parent =
            Character
    end

    local Billboard =
        Instance.new("BillboardGui")

    Billboard.Name =
        "NightfallESP"

    Billboard.Adornee =
        Root

    Billboard.Size =
        UDim2.fromOffset(220, 55)

    Billboard.StudsOffset =
        Vector3.new(0, 3.2, 0)

    Billboard.AlwaysOnTop = true

    Billboard.Active = true

    local Label =
        Instance.new("TextButton")

    Label.BackgroundTransparency = 1
    Label.Size = UDim2.fromScale(1, 1)

    Label.Font =
        Enum.Font.GothamSemibold

    Label.TextSize = 13
    Label.TextStrokeTransparency = 0.5

    Label.TextColor3 =
        getPlayerColor(Player)

    Label.Text = Player.DisplayName

    Label.AutoButtonColor = false
    Label.Active = true
    Label.Selectable = false

    Label.Parent = Billboard
    Label:SetAttribute("NF_Owner", Player.UserId)
    Billboard.Parent = Root

    ESPObjects[Player] = {
        Highlight = HighlightObject,
        Billboard = Billboard,
        Label = Label
    }
end

local function updateESP()

    for _, Player in ipairs(Players:GetPlayers()) do

        if Player ~= LocalPlayer then

            if Settings.ESP then

                if not ESPObjects[Player]
                    and Player.Character then

                    createESP(Player)
                end

                local Object =
                    ESPObjects[Player]

                if Object
                    and Object.Label then

                    local Character =
                        Player.Character

                    local Humanoid =
                        Character
                        and Character:FindFirstChildOfClass(
                            "Humanoid"
                        )

                    local Root =
                        Character
                        and Character:FindFirstChild(
                            "HumanoidRootPart"
                        )

                    local _, _, MyRoot =
                        getCharacter()

                    local DistanceText = ""

                    if Root and MyRoot then

                        local Distance =
                            math.floor(
                                (
                                    Root.Position
                                    - MyRoot.Position
                                ).Magnitude
                            )

                        DistanceText =
                            " [" .. Distance .. "m]"
                    end

                    local HealthText = ""

                    if Humanoid then

                        HealthText =
                            " | "
                            .. math.floor(
                                Humanoid.Health
                            )
                            .. " HP"
                    end

                    Object.Label.Text =
                        Player.DisplayName
                        .. DistanceText
                        .. HealthText

                    Object.Label.TextColor3 =
                        getPlayerColor(Player)
                end

            else
                removeESP(Player)
            end
        end
    end
end

--========================================================--
-- CLICK HOTKEY TP
--========================================================--

local ESP_CLICK_RADIUS = 60
local ESP_CLICK_COOLDOWN = 0.3
local _lastTeleportTime = 0

local TP_MODIFIER_KEY = Enum.KeyCode.LeftShift

local _tpKeyHeld = false

UserInputService.InputBegan:Connect(function(input, gameProcessed)
    if input.UserInputType == Enum.UserInputType.Keyboard
       and (input.KeyCode == Enum.KeyCode.LeftShift
         or input.KeyCode == Enum.KeyCode.RightShift) then
        _tpKeyHeld = true
    end
end)

UserInputService.InputEnded:Connect(function(input, gameProcessed)
    if input.UserInputType == Enum.UserInputType.Keyboard
       and (input.KeyCode == Enum.KeyCode.LeftShift
         or input.KeyCode == Enum.KeyCode.RightShift) then
        _tpKeyHeld = false
    end
end)

local function teleportToRoot(targetRoot)
    local myChar = LocalPlayer.Character
    local myRoot = myChar and myChar:FindFirstChild("HumanoidRootPart")
    if not myRoot or not targetRoot then return end

    local targetLook = targetRoot.CFrame.LookVector
    local newPos = targetRoot.Position - targetLook * 3

    myRoot.CFrame = CFrame.new(newPos, targetRoot.Position)
    myRoot.AssemblyLinearVelocity = Vector3.zero
    myRoot.AssemblyAngularVelocity = Vector3.zero
end

UserInputService.InputBegan:Connect(function(input, gameProcessed)

    if gameProcessed then return end

    if not _tpKeyHeld then return end

    local isClick = input.UserInputType == Enum.UserInputType.MouseButton1
                 or input.UserInputType == Enum.UserInputType.Touch
    if not isClick then return end

    if os.clock() - _lastTeleportTime < ESP_CLICK_COOLDOWN then return end

    local clickPos
    if input.UserInputType == Enum.UserInputType.Touch then
        clickPos = Vector2.new(input.Position.X, input.Position.Y)
    else
        clickPos = Vector2.new(
            UserInputService:GetMouseLocation().X,
            UserInputService:GetMouseLocation().Y
        )
    end

    local cam = workspace.CurrentCamera
    if not cam then return end

    local bestPlayer = nil
    local bestDist = ESP_CLICK_RADIUS

    for player, object in pairs(ESPObjects) do
        local billboard = object.Billboard
        if billboard and billboard.Adornee and billboard.Parent then

            local worldPos = billboard.Adornee.Position + billboard.StudsOffset
            local screenPos, onScreen = cam:WorldToViewportPoint(worldPos)

            if onScreen then
                local d = (Vector2.new(screenPos.X, screenPos.Y) - clickPos).Magnitude

                if d < bestDist then
                    bestDist = d
                    bestPlayer = player
                end
            end
        end
    end

    if not bestPlayer then return end

    local targetChar = bestPlayer.Character
    local targetRoot = targetChar and targetChar:FindFirstChild("HumanoidRootPart")
    if not targetRoot then return end

    _lastTeleportTime = os.clock()
    teleportToRoot(targetRoot)
end)

--========================================================--
-- CUSTOM WEAPON VISUAL
--========================================================--

local CustomWeapon = (function()
    local state = {
        Enabled = false,
        Saved   = {},
        Applied = {},
    }

    local CUSTOM_MESHES = {
        ["AK-47"]         = "rbxassetid://96327891060480",
        ["M4A1"]          = "rbxassetid://96327891060480",
        ["M9"]            = "rbxassetid://96327891060480",
        ["MP5"]           = "rbxassetid://96327891060480",
        ["Taser"]         = "rbxassetid://96327891060480",
        ["Remington 870"] = "rbxassetid://96327891060480",
        ["Revolver"]      = "rbxassetid://96327891060480",
    }

    local CUSTOM_TEXTURES = {
        ["AK-47"]         = "rbxassetid://128702198330575",
        ["M4A1"]          = "rbxassetid://128702198330575",
        ["M9"]            = "rbxassetid://128702198330575",
        ["MP5"]           = "rbxassetid://128702198330575",
        ["Taser"]         = "rbxassetid://128702198330575",
        ["Remington 870"] = "rbxassetid://128702198330575",
        ["Revolver"]      = "rbxassetid://128702198330575",
    }

    local function findOriginalVisuals(tool)
        local list = {}
        for _, d in ipairs(tool:GetDescendants()) do
            if d:IsA("MeshPart") and d.Name ~= "NF_CustomWeapon" then
                table.insert(list, d)
            end
        end
        return list
    end

    local function createCustomMeshPart(original, meshId, textureId)
        local custom = Instance.new("MeshPart")
        custom.Name         = "NF_CustomWeapon"
        custom.MeshId       = meshId
        custom.TextureID    = textureId or original.TextureID or ""
        custom.Size         = original.Size
        custom.Anchored     = false
        custom.CanCollide   = false
        custom.CanQuery     = false
        custom.CanTouch     = false
        custom.Massless     = true
        custom.Transparency = 0
        custom.CFrame       = original.CFrame
        custom.Parent       = original.Parent

        local weld = Instance.new("WeldConstraint")
        weld.Part0 = custom
        weld.Part1 = original
        weld.Parent = custom

        return custom
    end

    local function apply(tool)
        if not tool or not tool:IsA("Tool") then return end
        local meshId = CUSTOM_MESHES[tool.Name]
        if not meshId then return end

        if state.Applied[tool] then return end

        local originals = findOriginalVisuals(tool)
        if #originals == 0 then return end

        local textureId = CUSTOM_TEXTURES[tool.Name]
        state.Saved[tool] = {}

        for _, orig in ipairs(originals) do
            state.Saved[tool][orig] = orig.Transparency
            orig.Transparency = 1

            pcall(function()
                createCustomMeshPart(orig, meshId, textureId)
            end)
        end

        state.Applied[tool] = true
    end

    local function remove(tool)
        if not state.Applied[tool] then return end

        for _, d in ipairs(tool:GetDescendants()) do
            if d.Name == "NF_CustomWeapon" then
                pcall(function() d:Destroy() end)
            end
        end

        local saved = state.Saved[tool]
        if saved then
            for orig, val in pairs(saved) do
                if orig and orig.Parent then
                    pcall(function() orig.Transparency = val end)
                end
            end
        end

        state.Applied[tool] = nil
        state.Saved[tool]   = nil
    end

    local function hookTool(tool)
        if not tool:IsA("Tool") then return end

        tool.Equipped:Connect(function()
            if state.Enabled then apply(tool) end
        end)

        tool.Unequipped:Connect(function()
            remove(tool)
        end)

        if state.Enabled then apply(tool) end
    end

    local function hookCharacter(char)
        for _, child in ipairs(char:GetChildren()) do
            if child:IsA("Tool") then hookTool(child) end
        end

        char.ChildAdded:Connect(function(child)
            if child:IsA("Tool") then
                task.wait(0.2)
                hookTool(child)
            end
        end)

        char.ChildRemoved:Connect(function(child)
            if child:IsA("Tool") then remove(child) end
        end)
    end

    local function enable()
        if state.Enabled then return end
        state.Enabled = true

        local char = LocalPlayer.Character
        if char then hookCharacter(char) end

        LocalPlayer.CharacterAdded:Connect(function(c)
            if state.Enabled then hookCharacter(c) end
        end)
    end

    local function disable()
        if not state.Enabled then return end
        state.Enabled = false

        for tool in pairs(state.Applied) do
            remove(tool)
        end
        state.Applied = {}
        state.Saved   = {}
    end

    return {
        Set = function(v) if v then enable() else disable() end return state.Enabled end,
        Get = function() return state.Enabled end,
        SetMeshes = function(tbl)
            table.clear(CUSTOM_MESHES)
            for k, v in pairs(tbl) do CUSTOM_MESHES[k] = v end
        end,
        SetTextures = function(tbl)
            table.clear(CUSTOM_TEXTURES)
            for k, v in pairs(tbl) do CUSTOM_TEXTURES[k] = v end
        end,
    }
end)()

--========================================================--
-- HITBOX
--========================================================--

local HitboxObjects = HitboxObjects or {}

local function removeHitbox(Player)
    local data = HitboxObjects[Player]
    if not data then return end

    local head = data.Head
    if head and head.Parent and data.OriginalSize then
        pcall(function()
            head.Size = data.OriginalSize
        end)
    end

    HitboxObjects[Player] = nil
end

local function isAlive(Player)
    local Character = Player.Character
    if not Character then return false end
    local Humanoid = Character:FindFirstChildOfClass("Humanoid")
    return Humanoid ~= nil and Humanoid.Health > 0
end

local function createHitbox(Player)
    removeHitbox(Player)

    local Character = Player.Character
    if not Character then return end

    local Head = Character:FindFirstChild("Head")
    if not Head then
        task.spawn(function()
            Head = Character:WaitForChild("Head", 5)
            if not Head then return end
            if not Settings.Hitbox then return end
            if not isAlive(Player) then return end
            if HitboxObjects[Player] then return end

            local s = Settings.HitboxSize or 6
            local original = Head.Size

            pcall(function() Head.Size = Vector3.new(s, s, s) end)

            HitboxObjects[Player] = {
                Head = Head,
                OriginalSize = original,
                Player = Player,
            }
        end)
        return
    end

    local s = Settings.HitboxSize or 6
    local original = Head.Size

    pcall(function()
        Head.Size = Vector3.new(s, s, s)
    end)

    HitboxObjects[Player] = {
        Head = Head,
        OriginalSize = original,
        Player = Player,
    }
end

local _hbQueue = {}
local _hbRunning = false

local function processQueue()
    if _hbRunning then return end
    _hbRunning = true

    task.spawn(function()
        while #_hbQueue > 0 do
            local job = table.remove(_hbQueue, 1)
            if job
                and job.Player
                and job.Player.Parent
                and Settings.Hitbox
                and isAlive(job.Player) then
                createHitbox(job.Player)
            end
            task.wait(0.15)
        end
        _hbRunning = false
    end)
end

local function queueHitbox(Player)
    for _, job in ipairs(_hbQueue) do
        if job.Player == Player then return end
    end
    table.insert(_hbQueue, { Player = Player })
    processQueue()
end

local function updateHitboxes()
    for _, Player in ipairs(Players:GetPlayers()) do
        if Player ~= LocalPlayer then
            if Settings.Hitbox and isAlive(Player) then
                local data = HitboxObjects[Player]
                if not data
                    or not data.Head
                    or not data.Head.Parent
                    or data.Head ~= Player.Character:FindFirstChild("Head") then
                    queueHitbox(Player)
                end
            else
                removeHitbox(Player)
            end
        end
    end
end

local HitboxVisualObjects = HitboxVisualObjects or {}

local function removeHitboxVisual(Player)
    local part = HitboxVisualObjects[Player]
    if not part then return end
    if part.Parent then
        pcall(function() part:Destroy() end)
    end
    HitboxVisualObjects[Player] = nil
end

local function createHitboxVisual(Player)
    removeHitboxVisual(Player)

    local Character = Player.Character
    if not Character then return end

    local Head = Character:FindFirstChild("Head")
    if not Head then return end

    local s = Settings.HitboxSize or 6

    local Part = Instance.new("Part")
    Part.Name         = "NightfallHitboxVisual"
    Part.Size         = Vector3.new(s, s, s)
    Part.Transparency = 0.7
    Part.Material     = Enum.Material.ForceField
    Part.Color        = Settings.HitboxVisualColor or Color3.fromRGB(255, 0, 0)
    Part.CastShadow   = false
    Part.CanCollide   = false
    Part.CanTouch     = false
    Part.CanQuery     = false
    Part.Massless     = true
    Part.Anchored     = false
    Part.CFrame       = Head.CFrame
    Part.Parent       = Head

    local Weld = Instance.new("WeldConstraint")
    Weld.Part0 = Part
    Weld.Part1 = Head
    Weld.Parent = Part

    HitboxVisualObjects[Player] = Part
end

local function updateHitboxVisuals()
    for _, Player in ipairs(Players:GetPlayers()) do
        if Player ~= LocalPlayer then
            if Settings.Hitbox and Settings.HitboxVisual and isAlive(Player) then
                local part = HitboxVisualObjects[Player]
                local needRecreate = false

                if not part or not part.Parent then
                    needRecreate = true
                elseif part.Size.X ~= (Settings.HitboxSize or 6) then
                    needRecreate = true
                end

                if needRecreate then
                    createHitboxVisual(Player)
                end
            else
                removeHitboxVisual(Player)
            end
        end
    end
end

local DamageNumbers = (function()
    local state = {
        Enabled = false,
        Conn    = nil,
        LastHP  = {},
        Pool    = {},
    }

    local function spawnNumber(worldPosition, amount)
        local bb = Instance.new("BillboardGui")
        bb.Name             = "NF_DamageNumber"
        bb.Size             = UDim2.fromOffset(120, 50)
        bb.StudsOffset      = Vector3.new(0, 0, 0)
        bb.AlwaysOnTop      = true
        bb.LightInfluence   = 0
        bb.MaxDistance      = 300
        bb.Adornee          = nil
        bb.Parent           = Workspace.CurrentCamera
        bb.Enabled          = true

        local anchor = Instance.new("Part")
        anchor.Name           = "NF_DamageAnchor"
        anchor.Size           = Vector3.new(0.1, 0.1, 0.1)
        anchor.Transparency   = 1
        anchor.CanCollide     = false
        anchor.CanQuery       = false
        anchor.CanTouch       = false
        anchor.Anchored       = true
        anchor.Massless       = true
        anchor.CFrame         = CFrame.new(worldPosition)
        anchor.Parent         = Workspace.CurrentCamera

        bb.Adornee = anchor

        local label = Instance.new("TextLabel")
        label.BackgroundTransparency = 1
        label.Size                   = UDim2.fromScale(1, 1)
        label.Font                   = Enum.Font.GothamBold
        label.TextScaled             = true
        label.TextColor3             = Color3.fromRGB(255, 60, 60)
        label.TextStrokeTransparency = 0
        label.TextStrokeColor3       = Color3.fromRGB(0, 0, 0)
        label.Text                   = "-" .. tostring(amount)
        label.Parent                 = bb

        task.spawn(function()
            local startTime = os.clock()
            local duration  = 1.0
            local startPos  = worldPosition
            local riseY     = 4

            while os.clock() - startTime < duration do
                local t = (os.clock() - startTime) / duration

                if anchor and anchor.Parent then
                    anchor.CFrame = CFrame.new(
                        startPos + Vector3.new(0, riseY * t, 0)
                    )
                end

                if label then
                    label.TextTransparency = t
                    label.TextStrokeTransparency = t
                end

                task.wait(0.03)
            end

            if bb and bb.Parent then bb:Destroy() end
            if anchor and anchor.Parent then anchor:Destroy() end
        end)
    end

    local function hookPlayer(Player)
        local char = Player.Character
        if not char then return end

        local hum = char:FindFirstChildOfClass("Humanoid")
        if not hum then return end

        state.LastHP[Player] = hum.Health

        local conn
        conn = hum.HealthChanged:Connect(function(newHealth)
            if not state.Enabled then return end

            local oldHealth = state.LastHP[Player] or newHealth
            state.LastHP[Player] = newHealth

            local delta = oldHealth - newHealth
            if delta > 0 then

                local head = char:FindFirstChild("Head")
                local root = char:FindFirstChild("HumanoidRootPart")
                local pos

                if head then
                    pos = head.Position + Vector3.new(0, 2, 0)
                elseif root then
                    pos = root.Position + Vector3.new(0, 2, 0)
                else
                    pos = Vector3.new(0, 0, 0)
                end

                spawnNumber(pos, math.floor(delta + 0.5))
            end
        end)

        state.Conn = state.Conn
    end


    local function setupPlayer(Player)
        if Player == LocalPlayer then return end

        if Player.Character then
            hookPlayer(Player)
        end

        Player.CharacterAdded:Connect(function()
            task.wait(0.3)
            if state.Enabled then
                hookPlayer(Player)
            end
        end)
    end

    local function enable()
        if state.Enabled then return end
        state.Enabled = true
        state.LastHP  = {}

        for _, Player in ipairs(Players:GetPlayers()) do
            setupPlayer(Player)
        end
    end

    local function disable()
        if not state.Enabled then return end
        state.Enabled = false
        state.LastHP  = {}

        for _, obj in ipairs(Workspace.CurrentCamera:GetChildren()) do
            if obj.Name == "NF_DamageNumber"
                or obj.Name == "NF_DamageAnchor" then
                obj:Destroy()
            end
        end
    end

    Players.PlayerAdded:Connect(function(Player)
        if state.Enabled then
            setupPlayer(Player)
        end
    end)

    return {
        Set = function(v)
            if v then enable() else disable() end
            return state.Enabled
        end,
        Get = function() return state.Enabled end,
    }
end)()

--========================================================--
-- FULLBRIGHT
--========================================================--

local function enableFullbright()

    Lighting.Brightness = 1
    Lighting.ClockTime = 14

    Lighting.FogStart = 100
    Lighting.FogEnd = 10000

    Lighting.Ambient =
        Color3.fromRGB(140, 140, 140)

    Lighting.OutdoorAmbient =
        Color3.fromRGB(160, 160, 160)

    Lighting.GlobalShadows = true

    Lighting.ExposureCompensation = 0

    for _, Object in ipairs(Lighting:GetChildren()) do

        if Object:IsA("Atmosphere") then

            pcall(function()
                Object.Density = 0.1
            end)
        end

    end
end

local function disableFullbright()

    Lighting.Brightness =
        OriginalLighting.Brightness

    Lighting.ClockTime =
        OriginalLighting.ClockTime

    Lighting.FogStart =
        OriginalLighting.FogStart

    Lighting.FogEnd =
        OriginalLighting.FogEnd

    Lighting.Ambient =
        OriginalLighting.Ambient

    Lighting.OutdoorAmbient =
        OriginalLighting.OutdoorAmbient

    Lighting.GlobalShadows =
        OriginalLighting.GlobalShadows

    Lighting.ExposureCompensation =
        OriginalLighting.ExposureCompensation

end

local function updateFullbright()

    if Settings.Fullbright then
        enableFullbright()
    else
        disableFullbright()
    end
end

--========================================================--
-- RapidFire 
--========================================================--

local function patchTool(tool)
    if not tool or not tool:IsA("Tool") then return end
    if tool:GetAttribute("ToolType") ~= "Gun" then return end
    if not Settings.RapidFire then return end

    local newRate = tonumber(Settings.FireRate) or 0.05
    if newRate < 0.01 then newRate = 0.01 end

    pcall(function()
        tool:SetAttribute("FireRate", newRate)
    end)
end

LocalPlayer.CharacterAdded:Connect(function(char)
    task.wait(0.2)
    for _, child in ipairs(char:GetChildren()) do
        if child:IsA("Tool") then patchTool(child) end
    end
    char.ChildAdded:Connect(function(child)
        if child:IsA("Tool") then
            task.wait(0.3)
            patchTool(child)
        end
    end)
end)

if LocalPlayer.Character then
    for _, child in ipairs(LocalPlayer.Character:GetChildren()) do
        if child:IsA("Tool") then patchTool(child) end
    end
    LocalPlayer.Character.ChildAdded:Connect(function(child)
        if child:IsA("Tool") then
            task.wait(0.3)
            patchTool(child)
        end
    end)
end

--========================================================--
-- AUTO CRIMINAL
--========================================================--

local AutoCriminal = (function()
    local state = {
        Enabled   = false,
        Conn      = nil,
        LastCF    = nil,
        Teleporting = false,
    }

    local CRIMINAL_COLOR = Color3.fromRGB(218, 133, 65)
    local POLICE_COLOR   = Color3.fromRGB(13, 105, 172)

    local CRIMINAL_SPAWN_CFRAME = CFrame.new(
        -948.203491, 99.2255402, 2094.7876,
        0, 0, -1,
        0, 1, 0,
        1, 0, 0
    )

    local function getIndicatorColor()
        local ti = workspace:FindFirstChild("TeamIndicators")
        if not ti then return nil end

        local lp = ti:FindFirstChild("LocalPlayer")
        if lp then
            local frame = lp:FindFirstChild("Frame")
            if frame and frame:IsA("GuiObject") then
                return frame.BackgroundColor3
            end
        end

        local byName = ti:FindFirstChild(LocalPlayer.Name)
        if byName then
            local frame = byName:FindFirstChild("Frame")
            if frame and frame:IsA("GuiObject") then
                return frame.BackgroundColor3
            end
        end

        for _, v in ipairs(ti:GetChildren()) do
            if v:IsA("Folder") or v:IsA("Model") then
                if v.Name == LocalPlayer.Name then
                    local frame = v:FindFirstChild("Frame")
                    if frame and frame:IsA("GuiObject") then
                        return frame.BackgroundColor3
                    end
                end
            end
        end

        return nil
    end

    local function colorMatches(c, target, tolerance)
        tolerance = tolerance or 0.02
        return math.abs(c.R - target.R) < tolerance
           and math.abs(c.G - target.G) < tolerance
           and math.abs(c.B - target.B) < tolerance
    end

    local function teleportToSpawn()
        local char = LocalPlayer.Character
        local root = char and char:FindFirstChild("HumanoidRootPart")
        if not root then return end

        state.LastCF = root.CFrame

        root.CFrame = CRIMINAL_SPAWN_CFRAME
        root.AssemblyLinearVelocity  = Vector3.zero
        root.AssemblyAngularVelocity = Vector3.zero

        task.delay(0.4, function()
            local char2 = LocalPlayer.Character
            local root2 = char2 and char2:FindFirstChild("HumanoidRootPart")
            if root2 and state.LastCF then
                root2.CFrame = state.LastCF
                root2.AssemblyLinearVelocity  = Vector3.zero
                root2.AssemblyAngularVelocity = Vector3.zero
            end
            state.Teleporting = false
        end)
    end

    local function tick()
        if not state.Enabled then return end
        if state.Teleporting then return end

        local color = getIndicatorColor()
        if not color then return end

        if colorMatches(color, POLICE_COLOR) then
            return
        end

        if colorMatches(color, CRIMINAL_COLOR) then
            local char = LocalPlayer.Character
            local root = char and char:FindFirstChild("HumanoidRootPart")
            if not root then return end

            local dist = (root.Position - CRIMINAL_SPAWN_CFRAME.Position).Magnitude
            if dist < 5 then return end

            state.Teleporting = true
            teleportToSpawn()
        end
    end

    local function enable()
        if state.Enabled then return end
        state.Enabled = true

        if state.Conn then state.Conn:Disconnect() end
        state.Conn = task.spawn(function()
            while state.Enabled do
                pcall(tick)
                task.wait(0.42)
            end
        end)
    end

    local function disable()
        state.Enabled = false
        if state.Conn then
            task.cancel(state.Conn)
            state.Conn = nil
        end
        state.Teleporting = false
    end

    return {
        Set = function(v) if v then enable() else disable() end return state.Enabled end,
        Get = function() return state.Enabled end,
    }
end)()

--========================================================--
-- ANTI-FLING + BLOCK CAR SEATS
--========================================================--

local AntiFling = (function()
    local state = {
        Enabled    = false,
        Conn1      = nil,
        Conn2      = nil,
        Conn3      = nil,
        MaxSpeed   = 50,
        SeatHooks  = {},
    }

    local function disableCollisions()

        for _, player in ipairs(Players:GetPlayers()) do
            if player ~= LocalPlayer and player.Character then
                for _, v in ipairs(player.Character:GetDescendants()) do
                    if v:IsA("BasePart") then
                        v.CanCollide = false
                    end
                end
            end
        end

        local carContainer = workspace:FindFirstChild("CarContainer")
        if carContainer then
            for _, v in ipairs(carContainer:GetDescendants()) do
                if v:IsA("BasePart") then
                    v.CanCollide = false
                end
            end
        end

        for _, v in ipairs(workspace:GetChildren()) do
            if v.Name:lower():find("car") and v ~= LocalPlayer.Character then
                for _, p in ipairs(v:GetDescendants()) do
                    if p:IsA("BasePart") then
                        p.CanCollide = false
                    end
                end
            end
        end
    end

    local function clampVelocity()
        local char = LocalPlayer.Character
        local root = char and char:FindFirstChild("HumanoidRootPart")
        if not root then return end

        local v = root.AssemblyLinearVelocity
        if v.Magnitude > state.MaxSpeed then
            root.AssemblyLinearVelocity  = Vector3.zero
            root.AssemblyAngularVelocity = Vector3.zero
        end
    end

    local function blockSeat(seat)
        if not seat:IsA("VehicleSeat") and not seat:IsA("Seat") then return end
        if state.SeatHooks[seat] then return end

        local conn = seat:GetPropertyChangedSignal("Occupant"):Connect(function()
            if not state.Enabled then return end

            local occupant = seat.Occupant
            if occupant then
                local char = occupant.Parent
                if char == LocalPlayer.Character then
                    pcall(function()
                        occupant.Sit = false
                        occupant:ChangeState(Enum.HumanoidStateType.GettingUp)
                    end)
                end
            end
        end)

        state.SeatHooks[seat] = conn
    end

    local function unblockAllSeats()
        for seat, conn in pairs(state.SeatHooks) do
            if conn then
                pcall(function() conn:Disconnect() end)
            end
        end
        state.SeatHooks = {}
    end

    local function scanSeats()
        local carContainer = workspace:FindFirstChild("CarContainer")
        if carContainer then
            for _, v in ipairs(carContainer:GetDescendants()) do
                if v:IsA("VehicleSeat") or v:IsA("Seat") then
                    blockSeat(v)
                end
            end
        end

        for _, v in ipairs(workspace:GetChildren()) do
            if v.Name:lower():find("car") then
                for _, s in ipairs(v:GetDescendants()) do
                    if s:IsA("VehicleSeat") or s:IsA("Seat") then
                        blockSeat(s)
                    end
                end
            end
        end
    end

    local function enable()
        if state.Enabled then return end
        state.Enabled = true

        state.Conn1 = RunService.Stepped:Connect(disableCollisions)

        state.Conn2 = RunService.Heartbeat:Connect(clampVelocity)

        scanSeats()

        state.Conn3 = workspace.DescendantAdded:Connect(function(obj)
            if not state.Enabled then return end
            if obj:IsA("VehicleSeat") or obj:IsA("Seat") then
                blockSeat(obj)
            end
        end)
    end

    local function disable()
        if not state.Enabled then return end
        state.Enabled = false

        if state.Conn1 then state.Conn1:Disconnect(); state.Conn1 = nil end
        if state.Conn2 then state.Conn2:Disconnect(); state.Conn2 = nil end
        if state.Conn3 then state.Conn3:Disconnect(); state.Conn3 = nil end

        unblockAllSeats()
    end

    return {
        Set = function(v)
            if v then enable() else disable() end
            return state.Enabled
        end,
        Get = function() return state.Enabled end,
    }
end)()

--========================================================--
-- UNDERGROUND
--========================================================--

local function startUnderground()

    if UndergroundConnection then
        UndergroundConnection:Disconnect()
        UndergroundConnection = nil
    end
    UndergroundSavedCFrame = nil

    local Character, Humanoid, Root = getCharacter()
    if not Root or not Humanoid then return end

    UndergroundSavedCFrame = Root.CFrame

    UndergroundConnection = RunService.RenderStepped:Connect(function()

        if not Settings.Underground then return end

        local Character2, Humanoid2, Root2 = getCharacter()
        if not Root2 or not Humanoid2 then return end
        if not UndergroundSavedCFrame then return end

        local Current = Root2.CFrame
        local Rotation = Current - Current.Position
        local NewY = UndergroundSavedCFrame.Position.Y - Settings.UndergroundDepth

        Root2.CFrame = CFrame.new(
            Current.Position.X,
            NewY,
            Current.Position.Z
        ) * Rotation

        Root2.AssemblyLinearVelocity = Vector3.new(
            Root2.AssemblyLinearVelocity.X,
            0,
            Root2.AssemblyLinearVelocity.Z
        )
        Root2.AssemblyAngularVelocity = Vector3.zero

    end)
end

local function stopUnderground()

    if UndergroundConnection then
        UndergroundConnection:Disconnect()
        UndergroundConnection = nil
    end

    local _, Humanoid, Root = getCharacter()

    if Root then

        local CurrentPos = Root.Position
        local NewY = CurrentPos.Y + Settings.UndergroundDepth + 4

        Root.CFrame = CFrame.new(
            CurrentPos.X,
            NewY,
            CurrentPos.Z
        ) * (Root.CFrame - Root.CFrame.Position)

        Root.AssemblyLinearVelocity = Vector3.zero
        Root.AssemblyAngularVelocity = Vector3.zero
    end

    UndergroundSavedCFrame = nil
end

local function setUnderground(State)

    Settings.Underground = State

    if State then
        startUnderground()
    else
        stopUnderground()
    end
end

LocalPlayer.CharacterAdded:Connect(function(Character)

    local Humanoid = Character:WaitForChild("Humanoid", 10)
    local Root = Character:WaitForChild("HumanoidRootPart", 10)
    if not Humanoid or not Root then return end

    task.wait(0.5)

    if Settings.Underground then

        if UndergroundConnection then
            UndergroundConnection:Disconnect()
            UndergroundConnection = nil
        end
        UndergroundSavedCFrame = nil

        startUnderground()

    else
        if UndergroundConnection then
            UndergroundConnection:Disconnect()
            UndergroundConnection = nil
        end
        UndergroundSavedCFrame = nil
    end
end)

--========================================================--
-- TASE BYPASS
--========================================================--

local TaseBypass = (function()
    local TASE_ANIMS = {
        ["rbxassetid://279227693"] = true,
        ["rbxassetid://279229192"] = true,
    }

    local DEFAULT_SPEED = 16
    local DEFAULT_JUMP  = 7.2

    local Enabled = false

    local humanoid  = nil
    local lastSpeed = DEFAULT_SPEED
    local lastJump  = DEFAULT_JUMP

    local eventConns    = {}
    local humanoidConns = {}
    local charAddedConn = nil

    local PlayerTased = nil
    do
        local GunRemotes = ReplicatedStorage:FindFirstChild("GunRemotes")
        if GunRemotes then
            PlayerTased = GunRemotes:FindFirstChild("PlayerTased")
        end
    end

    local function clearTable(t)
        for _, c in ipairs(t) do
            if c and type(c.Disconnect) == "function" then
                pcall(function() c:Disconnect() end)
            end
        end
        table.clear(t)
    end

    local function enableBackpack()
        if LocalPlayer:GetAttribute("BackpackEnabled") ~= true then
            LocalPlayer:SetAttribute("BackpackEnabled", true)
        end
    end

    local function setupCharacter(character)
        if not character or not Enabled then return end

        local hum = character:FindFirstChildOfClass("Humanoid")
            or character:WaitForChild("Humanoid", 5)
        if not hum then return end
        if not Enabled then return end

        humanoid = hum

        if hum.WalkSpeed > 0 then lastSpeed = hum.WalkSpeed end
        if hum.JumpHeight > 0 then lastJump  = hum.JumpHeight end

        clearTable(humanoidConns)

        humanoidConns[#humanoidConns + 1] =
            hum:GetPropertyChangedSignal("WalkSpeed"):Connect(function()
                if hum.WalkSpeed > 0 then lastSpeed = hum.WalkSpeed end
            end)

        humanoidConns[#humanoidConns + 1] =
            hum:GetPropertyChangedSignal("JumpHeight"):Connect(function()
                if hum.JumpHeight > 0 then lastJump = hum.JumpHeight end
            end)
    end

    local function fixTase()
        if not Enabled then return end
        local hum = humanoid
        if not hum or not hum.Parent or hum.Health <= 0 then return end

        if hum.WalkSpeed == 0 and hum.JumpHeight == 0 then
            hum.WalkSpeed  = lastSpeed
            hum.JumpHeight = lastJump
        end

        for _, track in ipairs(hum:GetPlayingAnimationTracks()) do
            local anim = track.Animation
            if anim and TASE_ANIMS[anim.AnimationId] then
                track:Stop(0)
            end
        end

        enableBackpack()
    end

    local function enable()
        if Enabled then return end
        Enabled = true

        humanoid  = nil
        lastSpeed = DEFAULT_SPEED
        lastJump  = DEFAULT_JUMP
        clearTable(humanoidConns)

        if PlayerTased then
            eventConns[#eventConns + 1] = PlayerTased.OnClientEvent:Connect(function()
                task.defer(fixTase)
            end)
        end

        eventConns[#eventConns + 1] =
            LocalPlayer:GetAttributeChangedSignal("BackpackEnabled"):Connect(function()
                if Enabled and LocalPlayer:GetAttribute("BackpackEnabled") ~= true then
                    enableBackpack()
                end
            end)

        charAddedConn = LocalPlayer.CharacterAdded:Connect(function(c)
            humanoid = nil
            task.spawn(function()
                setupCharacter(c)
                enableBackpack()
            end)
        end)

        if LocalPlayer.Character then
            task.spawn(function()
                setupCharacter(LocalPlayer.Character)
                enableBackpack()
            end)
        end
    end

    local function disable()
        if not Enabled then return end
        Enabled = false

        clearTable(eventConns)
        clearTable(humanoidConns)

        if charAddedConn then
            charAddedConn:Disconnect()
            charAddedConn = nil
        end

        humanoid = nil
    end

    return {
        Set = function(v)
            if v == true then enable() else disable() end
            return Enabled
        end,
        Get = function() return Enabled end,
    }
end)()

--========================================================--
-- FE INVISIBLE
--========================================================--

local TweenService = game:GetService("TweenService")

local FEInvisible = (function()
    local state = {
        Enabled       = false,
        AnimTrack     = nil,
        HeartbeatConn = nil,
        Highlight     = nil,
        Saved         = {},
        RenderKey     = "FEInvisibleRenderStep",
    }

    local function getCharacter()
        return LocalPlayer.Character
    end

    local function isAlive()
        local char = getCharacter()
        local hum = char and char:FindFirstChildOfClass("Humanoid")
        return hum ~= nil and hum.Health > 0
    end

    local function getOffsets(char)
        local hum = char and char:FindFirstChildOfClass("Humanoid")
        local root = char and char:FindFirstChild("HumanoidRootPart")
        if not hum or not root then return nil end
        local isR15 = (hum.RigType == Enum.HumanoidRigType.R15)
        local offsetY = hum.HipHeight + root.Size.Y / 2 - 1
        return isR15, offsetY
    end

    local function tweenTransparency(inst, target)
        TweenService:Create(
            inst,
            TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
            { Transparency = target }
        ):Play()
    end

    local function applyGhostTransparency()
        local char = getCharacter()
        if not char then return end
        for _, d in ipairs(char:GetDescendants()) do
            if d:IsA("BasePart") or d:IsA("Decal") or d:IsA("Texture") then
                state.Saved[d] = state.Saved[d] or d.Transparency
                tweenTransparency(d, 0.99)
            end
        end
    end

    local function restoreTransparency()
        for inst, val in pairs(state.Saved) do
            if inst and inst.Parent then
                tweenTransparency(inst, val)
            end
        end
        state.Saved = {}
    end

    local function createGhostHighlight()
        local char = getCharacter()
        if not char or state.Highlight then return end

        local h = Instance.new("Highlight")
        h.Name = "FEInvisibleGhostOutline"
        h.FillTransparency = 1
        h.OutlineColor = Color3.fromRGB(255, 255, 255)
        h.OutlineTransparency = 1
        h.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop
        h.Adornee = char
        h.Parent = char

        TweenService:Create(
            h,
            TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
            { OutlineTransparency = 0.1 }
        ):Play()

        state.Highlight = h
    end

    local function removeGhostHighlight()
        if not state.Highlight then return end
        local h = state.Highlight
        state.Highlight = nil

        TweenService:Create(
            h,
            TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.Out),
            { OutlineTransparency = 1 }
        ):Play()

        task.delay(0.35, function()
            pcall(function() h:Destroy() end)
        end)
    end

    local function playInvisAnimation()
        if not isAlive() then return end

        local char = getCharacter()
        local hum = char and char:FindFirstChildOfClass("Humanoid")
        if not hum then return end

        local isR15 = (hum.RigType == Enum.HumanoidRigType.R15)
        local animId = isR15 and "18665825805" or "215384594"

        local anim = Instance.new("Animation")
        anim.AnimationId = "rbxassetid://" .. animId

        local animator = hum:FindFirstChildOfClass("Animator")
        if not animator then
            animator = Instance.new("Animator")
            animator.Parent = hum
        end

        state.AnimTrack = animator:LoadAnimation(anim)
        state.AnimTrack.Priority = Enum.AnimationPriority.Action4
        state.AnimTrack:Play(0, 0.001, 0)
        anim:Destroy()

        task.delay(0, function()
            if state.AnimTrack then
                state.AnimTrack.TimePosition = isR15 and 1.95 or 0.4
            end
        end)
    end

    local function cleanup()
        if state.HeartbeatConn then
            state.HeartbeatConn:Disconnect()
            state.HeartbeatConn = nil
        end

        pcall(function()
            RunService:UnbindFromRenderStep(state.RenderKey)
        end)

        if state.AnimTrack then
            pcall(function() state.AnimTrack:Stop(0) end)
            pcall(function() state.AnimTrack:Destroy() end)
            state.AnimTrack = nil
        end

        state.Saved = {}
        removeGhostHighlight()
    end

    local function enable()
        if state.Enabled or not isAlive() then return end
        state.Enabled = true

        applyGhostTransparency()
        createGhostHighlight()
        playInvisAnimation()

        pcall(function()
            RunService:UnbindFromRenderStep(state.RenderKey)
        end)

        RunService:BindToRenderStep(
            state.RenderKey,
            Enum.RenderPriority.Camera.Value - 1,
            function()
                if not state.Enabled or not isAlive() then return end

                local char = getCharacter()
                local isR15, offsetY = getOffsets(char)
                local root = char and char:FindFirstChild("HumanoidRootPart")
                if not root or not offsetY then return end

                root.CFrame = root.CFrame
                    * CFrame.new(0, offsetY, 0)
                    * CFrame.Angles(math.rad(isR15 and -180 or -90), 0, 0)

                if state.AnimTrack then
                    state.AnimTrack:AdjustWeight(0.001)
                end
            end
        )

        state.HeartbeatConn = RunService.Heartbeat:Connect(function()
            if not state.Enabled or not isAlive() then return end

            local char = getCharacter()
            local isR15, offsetY = getOffsets(char)
            local root = char and char:FindFirstChild("HumanoidRootPart")
            if not root or not offsetY then return end

            root.CFrame = root.CFrame
                * CFrame.new(0, -offsetY, 0)
                * CFrame.Angles(math.rad(isR15 and 180 or 90), 0, 0)

            if state.AnimTrack then
                state.AnimTrack:AdjustWeight(100)
            end
        end)
    end

    local function disable()
        if not state.Enabled then return end
        state.Enabled = false

        restoreTransparency()
        cleanup()
    end

    LocalPlayer.CharacterAdded:Connect(function()
        if not state.Enabled then return end
        state.Enabled = false
        cleanup()
        task.wait(0.2)
        enable()
    end)

    return {
        Set = function(v)
            if v then enable() else disable() end
            return state.Enabled
        end,
        Get = function() return state.Enabled end,
    }
end)()

--========================================================--
-- ANTI-INVIS
--========================================================--

local AntiInvis = (function()
    local state = {
        Enabled = false,
        Conn    = nil,
        Markers = {},
    }

    local FE_ANIM_IDS = {
        ["rbxassetid://18665825805"] = true,
        ["rbxassetid://215384594"]   = true,
        ["18665825805"] = true,
        ["215384594"]   = true,
    }

    local function removeMarker(Player)
        local m = state.Markers[Player]
        if m and m.Parent then
            m:Destroy()
        end
        state.Markers[Player] = nil
    end

    local function createMarker(Player)
        removeMarker(Player)

        local char = Player.Character
        if not char then return end

        local head = char:FindFirstChild("Head")
        if not head then return end

        local billboard = Instance.new("BillboardGui")
        billboard.Name = "AntiInvisMarker"
        billboard.Size = UDim2.fromOffset(200, 50)
        billboard.StudsOffset = Vector3.new(0, 3, 0)
        billboard.AlwaysOnTop = true
        billboard.Adornee = head
        billboard.Parent = head

        local label = Instance.new("TextLabel")
        label.Size = UDim2.fromScale(1, 1)
        label.BackgroundTransparency = 1
        label.Text = "↓ " .. Player.DisplayName .. " ↓"
        label.TextColor3 = Color3.fromRGB(255, 0, 0)
        label.TextStrokeTransparency = 0
        label.TextScaled = true
        label.Font = Enum.Font.GothamBold
        label.Parent = billboard

        state.Markers[Player] = billboard
    end

    local function isUnder(Player)
        local char = Player.Character
        if not char then return false end

        local hum = char:FindFirstChildOfClass("Humanoid")
        if not hum then return false end

        local animator = hum:FindFirstChildOfClass("Animator")
        if animator then
            for _, track in ipairs(animator:GetPlayingAnimationTracks()) do
                local anim = track.Animation
                if anim
                    and FE_ANIM_IDS[anim.AnimationId]
                    and track.WeightCurrent > 0.1 then
                    return true
                end
            end
        end

        local root = char:FindFirstChild("HumanoidRootPart")
        if root and root.Position.Y < -50 then
            return true
        end

        return false
    end

    local function update()
        for _, Player in ipairs(Players:GetPlayers()) do
            if Player ~= LocalPlayer then
                if Player.Character and isUnder(Player) then
                    if not state.Markers[Player] or not state.Markers[Player].Parent then
                        createMarker(Player)
                    end
                else
                    removeMarker(Player)
                end
            end
        end
    end

    local function enable()
        if state.Enabled then return end
        state.Enabled = true

        if state.Conn then state.Conn:Disconnect() end
        state.Conn = RunService.Heartbeat:Connect(update)
    end

    local function disable()
        if not state.Enabled then return end
        state.Enabled = false

        if state.Conn then
            state.Conn:Disconnect()
            state.Conn = nil
        end

        for Player in pairs(state.Markers) do
            removeMarker(Player)
        end
    end

    return {
        Set = function(v) if v then enable() else disable() end return state.Enabled end,
        Get = function() return state.Enabled end,
    }
end)()

--========================================================--
-- AUTO SPRINT
--========================================================--

local SprintState = {
    ShiftHeld = false,
}

UserInputService.InputBegan:Connect(function(input, gameProcessed)
    if input.UserInputType == Enum.UserInputType.Keyboard
       and (input.KeyCode == Enum.KeyCode.LeftShift
         or input.KeyCode == Enum.KeyCode.RightShift) then
        SprintState.ShiftHeld = true
    end
end)

UserInputService.InputEnded:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.Keyboard
       and (input.KeyCode == Enum.KeyCode.LeftShift
         or input.KeyCode == Enum.KeyCode.RightShift) then
        SprintState.ShiftHeld = false
    end
end)

local function updateSprint()
    local Character, Humanoid = getCharacter()
    if not Humanoid then return end

    if Settings.Underground then
        if Humanoid.WalkSpeed ~= Settings.UndergroundSpeed then
            Humanoid.WalkSpeed = Settings.UndergroundSpeed
        end
        return
    end

    if SprintState.ShiftHeld then
        if Humanoid.WalkSpeed ~= 24 then
            Humanoid.WalkSpeed = 24
        end
        return
    end

    if Settings.AutoSprint then
        if Humanoid.WalkSpeed ~= 24 then
            Humanoid.WalkSpeed = 24
        end
    else
        if Humanoid.WalkSpeed ~= 16 then
            Humanoid.WalkSpeed = 16
        end
    end
end

--========================================================--
-- BYPASS ANTIJUMP
--========================================================--

local function updateJump()
    local StarterPlayer = game:GetService("StarterPlayer")
    local StarterScripts = StarterPlayer:FindFirstChild("StarterCharacterScripts")
    if not StarterScripts then return end

    local shouldDisable = Settings.AntiJump

    local starterAntiJump = StarterScripts:FindFirstChild("AntiJump")
    if starterAntiJump then
        starterAntiJump.Disabled = shouldDisable
    end

    local char = LocalPlayer.Character
    if char then
        local activeAntiJump = char:FindFirstChild("AntiJump")
        if activeAntiJump then
            activeAntiJump.Disabled = shouldDisable
        end
    end
end

LocalPlayer.CharacterAdded:Connect(function(char)
    task.wait(0.1)
    local activeAntiJump = char:FindFirstChild("AntiJump")
    if activeAntiJump then
        activeAntiJump.Disabled = Settings.AntiJump
    end
end)

--========================================================--
-- CHARACTER TRACKING / QUICK RESPAWN
--========================================================--

local function disconnectCharacterConnections()

    if CharacterTrackConnection then
        CharacterTrackConnection:Disconnect()
        CharacterTrackConnection = nil
    end

    if DeathConnection then
        DeathConnection:Disconnect()
        DeathConnection = nil
    end
end

local function trackCharacter(Character)

    disconnectCharacterConnections()

    local Humanoid =
        Character:WaitForChild(
            "Humanoid",
            10
        )

    local Root =
        Character:WaitForChild(
            "HumanoidRootPart",
            10
        )

    if not Humanoid or not Root then
        return
    end

    LastAliveCFrame =
        Root.CFrame

    CharacterTrackConnection =
        RunService.Heartbeat:Connect(function()

            if not Character.Parent then

                if CharacterTrackConnection then
                    CharacterTrackConnection:Disconnect()
                    CharacterTrackConnection = nil
                end

                return
            end

            if Humanoid.Health > 0
                and Root.Parent then

                LastAliveCFrame =
                    Root.CFrame
            end
        end)

    DeathConnection =
        Humanoid.Died:Connect(function()

            if LastAliveCFrame then

                LastDeathCFrame =
                    LastAliveCFrame

            elseif Root then

                LastDeathCFrame =
                    Root.CFrame
            end

            if CharacterTrackConnection then

                CharacterTrackConnection:Disconnect()
                CharacterTrackConnection = nil
            end
        end)

    updateSprint()
    updateJump()
end

LocalPlayer.CharacterAdded:Connect(function(Character)

    task.wait()

    trackCharacter(Character)

    if Settings.QuickRespawn
        and LastDeathCFrame then

        local Root =
            Character:WaitForChild(
                "HumanoidRootPart",
                10
            )

        if Root then

            task.wait(0.15)

            if Character.Parent
                and Settings.QuickRespawn then

                Root.CFrame =
                    LastDeathCFrame
            end
        end
    end

    if Settings.Underground then

        task.wait(0.1)

        UndergroundSavedCFrame =
            nil

        startUnderground()
    end
end)

if LocalPlayer.Character then
    task.spawn(function()
        trackCharacter(
            LocalPlayer.Character
        )
    end)
end

--========================================================--
-- KILLFEED NOTIFICATIONS
--========================================================--

local KillfeedNotify = true

local KillfeedFolder = ReplicatedStorage:WaitForChild("Killfeed", 10)

if KillfeedFolder and KillfeedFolder:IsA("Folder") then

    KillfeedFolder.ChildAdded:Connect(function(child)

        if not KillfeedNotify then return end

        local text = child.Name
        if not text or #text < 5 or text == "#" then return end

        local icon = "skull"
        local tcolor = child:FindFirstChild("TColor")
        if tcolor and tcolor:IsA("Color3Value") then
            local c = tcolor.Value
            if c.R > c.B then
                icon = "sword"      
            elseif c.B > c.R then
                icon = "shield"     
            end
        end

        WindUI:Notify({
            Title = "Убийство",
            Content = text,
            Icon = icon,
            Image = nil,
            Duration = 5,
            Buttons = {
                {
                    Title = "ОК",
                    Callback = function()
                    end
                }
            }
        })
    end)
end

--========================================================--
-- CLOSEST PLAYER TRACKER
--========================================================--

local TrackerGui =
    Instance.new("ScreenGui")

TrackerGui.Name =
    "NightfallTracker"

TrackerGui.ResetOnSpawn = false
TrackerGui.IgnoreGuiInset = true
TrackerGui.Parent =
    LocalPlayer:WaitForChild("PlayerGui")

local TrackerLabel =
    Instance.new("TextLabel")

TrackerLabel.BackgroundTransparency = 1

TrackerLabel.Position =
    UDim2.fromOffset(15, 15)

TrackerLabel.Size =
    UDim2.fromOffset(350, 30)

TrackerLabel.Font =
    Enum.Font.GothamSemibold

TrackerLabel.TextSize = 13

TrackerLabel.TextXAlignment =
    Enum.TextXAlignment.Left

TrackerLabel.TextColor3 =
    Color3.fromRGB(255, 255, 255)

TrackerLabel.TextStrokeTransparency =
    0.5

TrackerLabel.Visible =
    Settings.ClosestTracker

TrackerLabel.Parent =
    TrackerGui

local function updateTracker()

    if not Settings.ClosestTracker then

        TrackerLabel.Visible = false
        return
    end

    TrackerLabel.Visible = true

    local Player, Part, Distance =
        getClosestTarget()

    if not Player then

        TrackerLabel.Text =
            "Target: none"

        return
    end

    local Character =
        Player.Character

    local Humanoid =
        Character
        and Character:FindFirstChildOfClass(
            "Humanoid"
        )

    local Health =
        Humanoid
        and math.floor(Humanoid.Health)
        or 0

    TrackerLabel.Text =
        string.format(
            "Target: %s | %.0f px | %d HP",
            Player.DisplayName,
            Distance or 0,
            Health
        )
end

--========================================================--
-- PLAYER CONNECTIONS
--========================================================--

local function setupPlayer(Player)

    if Player == LocalPlayer then
        return
    end

    Player.CharacterAdded:Connect(function()

        task.wait(0.2)

        if Settings.ESP then
            createESP(Player)
        end

        if Settings.Hitbox then
            createHitbox(Player)
        end
    end)

    Player.CharacterRemoving:Connect(function()

        removeESP(Player)
        removeHitbox(Player)
    end)
end

for _, Player in ipairs(Players:GetPlayers()) do
    setupPlayer(Player)
end

Players.PlayerAdded:Connect(setupPlayer)

Players.PlayerRemoving:Connect(function(Player)

    removeESP(Player)
    removeHitbox(Player)
end)

--========================================================--
-- MAIN LOOP
--========================================================--

RunService.RenderStepped:Connect(function()

    if Settings.ESP then
        updateESP()
    end

    
    updateHitboxVisuals()
    updateHitboxes()

    if Settings.Underground then
        updateSprint()
    end
end)

--========================================================--
-- WINDUI WINDOW
--========================================================--

local Window =
    WindUI:CreateWindow({
        Title = "Nightfall",
        Icon = "moon",
        Author = "Entervalov",
        Folder = "Nightfall",
        Size = UDim2.fromOffset(580, 460),
        Transparent = true,
        Theme = "Dark",
        SideBarWidth = 170,
        HasOutline = true
    })

--========================================================--
-- TABS
--========================================================--

local MovementTab =
    Window:Tab({
        Title = "Movement",
        Icon = "move"
    })

local CombatTab =
    Window:Tab({
        Title = "Fight",
        Icon = "crosshair"
    })

local VisualsTab =
    Window:Tab({
        Title = "Visual",
        Icon = "eye"
    })

local SettingsTab =
    Window:Tab({
        Title = "Settings",
        Icon = "settings"
    })

--========================================================--
-- MOVEMENT
--========================================================--

MovementTab:Section({
    Title = "Движение"
})

MovementTab:Toggle({
    Title = "Anti-Jump",
    Desc = "Disables the jump limit",
    Value = false,
    Callback = function(State)
        Settings.AntiJump = State
        updateJump()
    end,
})

MovementTab:Toggle({
    Title = "AutoSprint",
    Desc = "Autosprint",
    Value = false,

    Callback = function(State)

        Settings.AutoSprint = State

        updateSprint()
    end
})

MovementTab:Section({
    Title = "Подземщик"
})

MovementTab:Toggle({
    Title = "Подземщик",
    Desc = "It saves the startup point and returns to it when turned off",
    Value = false,

    Callback = function(State)

        setUnderground(State)
    end
})

MovementTab:Keybind({
    Title = "Подземщик (клавиша)",
    Desc = "Press to assign the on/off key for the undergrounder",
    Value = Enum.KeyCode.V,
    Callback = function()
        local Character, Humanoid = getCharacter()
        if not Character or not Humanoid then return end

        local newState = not Settings.Underground
        setUnderground(newState)

        print("[Underground]", newState and "ON" or "OFF")
    end,
})

MovementTab:Slider({
    Title = "Глубина",
    Desc = "It makes you an undergrounder btw",
    Value = {
        Min = 2,
        Max = 30,
        Default = 8
    },

    Callback = function(Value)

        Settings.UndergroundDepth =
            tonumber(Value) or 8
    end
})

MovementTab:Slider({
    Title = "Скорость",
    Desc = "Running speed underground",
    Value = {
        Min = 16,
        Max = 150,
        Default = 20
    },

    Callback = function(Value)

        Settings.UndergroundSpeed =
            tonumber(Value) or 20

        if Settings.Underground then
            updateSprint()
        end
    end
})

MovementTab:Section({
    Title = "Respawn"
})

MovementTab:Toggle({
    Title = "Quick Respawn",
    Desc = "Brings you back to the point where you died (if u have sheid ",
    Value = false,

    Callback = function(State)

        Settings.QuickRespawn = State
    end
})

MovementTab:Section({ Title = "Auto Criminal" })

MovementTab:Toggle({
    Title = "Auto Criminal",
    Desc = "Automatically becomes a criminal",
    Value = false,
    Callback = function(State)
        AutoCriminal.Set(State)
    end,
})

--========================================================--
-- COMBAT
--========================================================--

CombatTab:Section({
    Title = "Hitbox Visualizer"
})

CombatTab:Toggle({
    Title = "Hitbox",
    Desc = "Increases the player’s head size so that it’s easier to deal critical damage (Silent Aim btw)",
    Value = false,
    Callback = function(State)
        Settings.Hitbox = State
        if State then
            for _, Player in ipairs(Players:GetPlayers()) do
                if Player ~= LocalPlayer and isAlive(Player) then
                    createHitbox(Player)
                end
            end
        else
            for Player in pairs(HitboxObjects) do
                removeHitbox(Player)
            end
        end
    end,
})

CombatTab:Slider({
    Title = "Hitbox Size",
    Desc = "Increase the hitbox of players’ heads (Visual)",
    Value = { Min = 2, Max = 10, Default = 6 },
    Callback = function(Value)
        Settings.HitboxSize = tonumber(Value) or 6
        if Settings.Hitbox then
            for _, Player in ipairs(Players:GetPlayers()) do
                if Player ~= LocalPlayer and isAlive(Player) then
                    createHitbox(Player)
                end
            end
        end
    end,
})

CombatTab:Section({ Title = "Anti-Fling" })

CombatTab:Toggle({
    Title = "Anti-Fling",
    Desc = "It prevents you from flying off the map and stops the anti‑cheat from kicking you. Fucking FFling!",
    Value = false,
    Callback = function(State)
        AntiFling.Set(State)
    end,
})

CombatTab:Section({
    Title = "Rage"
})

CombatTab:Toggle({
    Title = "Rapid Fire",
    Desc = "Reduces the FireRate of the weapon when equipped (requires taking the weapon twice to use)",
    Value = false,
    Callback = function(State)
        Settings.RapidFire = State
        if State and LocalPlayer.Character then
            for _, child in ipairs(LocalPlayer.Character:GetChildren()) do
                if child:IsA("Tool") then patchTool(child) end
            end
        end
    end
})

CombatTab:Slider({
    Title = "Fire Rate",
    Desc = "Increases the firing speed",
    Value = { Min = 0.01, Max = 0.5, Default = 0.05 },
    Callback = function(Value)
        Settings.FireRate = tonumber(Value) or 0.05
        if Settings.RapidFire and LocalPlayer.Character then
            for _, child in ipairs(LocalPlayer.Character:GetChildren()) do
                if child:IsA("Tool") then patchTool(child) end
            end
        end
    end
})

CombatTab:Toggle({
    Title = "Tase Bypass",
    Desc = "Bypass Taser",
    Value = false,
    Callback = function(State)
        TaseBypass.Set(State)
    end,
})

--========================================================--
-- VISUALS
--========================================================--

VisualsTab:Section({
    Title = "XRAY"
})

VisualsTab:Toggle({
    Title = "ESP",
    Desc = "Shows players through walls",
    Value = false,

    Callback = function(State)

        Settings.ESP = State

        if not State then

            for Player in pairs(ESPObjects) do
                removeESP(Player)
            end
        end
    end
})

VisualsTab:Toggle({
    Title = "Team Colors",
    Desc = "The ESP color depends on the command",
    Value = true,

    Callback = function(State)

        Settings.TeamColors =
            State
    end
})

VisualsTab:Toggle({
    Title = "Highlight",
    Desc = "Player highlighting",
    Value = true,

    Callback = function(State)

        Settings.Highlight =
            State

        if Settings.ESP then

            for Player in ipairs(Players:GetPlayers()) do

                if Player ~= LocalPlayer then
                    createESP(Player)
                end
            end
        end
    end
})

VisualsTab:Section({ Title = "Custom Weapon" })

VisualsTab:Toggle({
    Title = "Custom Weapon Visual",
    Desc = "Replaces the weapon model with a custom one",
    Value = false,
    Callback = function(State)
        CustomWeapon.Set(State)
    end,
})

VisualsTab:Section({ Title = "Damage Visible" })

VisualsTab:Toggle({
    Title = "Damage Visible",
    Desc = "Shows the damage dealt to the player",
    Value = false,
    Callback = function(State)
        DamageNumbers.Set(State)
    end,
})

VisualsTab:Section({ Title = "Custom Weapon" })

VisualsTab:Toggle({
    Title = "Custom Weapon Visual",
    Desc = "Replaces the weapon model with a custom one (Visual)",
    Value = false,
    Callback = function(State)
        CustomWeapon.Set(State)
    end,
})

VisualsTab:Section({
    Title = "World"
})

VisualsTab:Toggle({
    Title = "Fullbright",
    Desc = "It removes darkness, fog, and shadows",
    Value = false,

    Callback = function(State)

        Settings.Fullbright =
            State

        updateFullbright()
    end
})

VisualsTab:Section({ Title = "Invisible" })

VisualsTab:Toggle({
    Title = "Invisible (FE)",
    Desc = "Invisibility",
    Value = false,
    Callback = function(State)
        FEInvisible.Set(State)
    end,
})

VisualsTab:Section({ Title = "Anti-Invis" })

VisualsTab:Toggle({
    Title = "Anti-Invis",
    Desc = "It tries to make invisible players visible so they can be killed.",
    Value = false,
    Callback = function(State)
        AntiInvis.Set(State)
    end,
})

--========================================================--
-- SETTINGS
--========================================================--

SettingsTab:Section({ Title = "Killfeed" })

SettingsTab:Toggle({
    Title = "Killfeed Notifications",
    Desc = "Shows notifications about who killed whom.",
    Value = true,
    Callback = function(State)
        KillfeedNotify = State
    end
})

SettingsTab:Section({
    Title = "Interface"
})

SettingsTab:Toggle({
    Title = "Closest Player Tracker",
    Desc = "Displays the selected closest target",
    Value = true,

    Callback = function(State)

        Settings.ClosestTracker =
            State

        TrackerLabel.Visible =
            State
    end
})

SettingsTab:Button({
    Title = "Reset Lighting",

    Callback = function()

        Settings.Fullbright = false

        disableFullbright()
    end
})

SettingsTab:Button({
    Title = "Unload Nightfall",

    Callback = function()

        Settings.ESP = false
        Settings.Hitbox = false
        Settings.RapidFire = false
        Settings.AntiJump = false
        Settings.AutoSprint = false

        if Settings.Underground then
            setUnderground(false)
        end

        pcall(function() FEInvisible.Set(false) end)

        pcall(function()
            if TaseBypass then TaseBypass.Set(false) end
        end)

        pcall(function() AutoCriminal.Set(false) end)
        	
        pcall(function() DamageNumbers.Set(false) end)
        
        pcall(function() CustomWeapon.Set(false) end)

        disableFullbright()

        pcall(function()
            local StarterScripts = game:GetService("StarterPlayer"):FindFirstChild("StarterCharacterScripts")
            if StarterScripts then
                local AntiJump = StarterScripts:FindFirstChild("AntiJump")
                if AntiJump then AntiJump.Disabled = false end
            end
            local char = LocalPlayer.Character
            if char then
                local activeAJ = char:FindFirstChild("AntiJump")
                if activeAJ then activeAJ.Disabled = false end
            end
        end)

        for Player in pairs(ESPObjects) do
            removeESP(Player)
        end

        for Player in pairs(HitboxObjects) do
            removeHitbox(Player)
        end

        if TrackerGui then
            TrackerGui:Destroy()
        end

        if CharacterTrackConnection then
            CharacterTrackConnection:Disconnect()
            CharacterTrackConnection = nil
        end

        if DeathConnection then
            DeathConnection:Disconnect()
            DeathConnection = nil
        end

        if UndergroundConnection then
            UndergroundConnection:Disconnect()
            UndergroundConnection = nil
        end

        UndergroundSavedCFrame = nil

        print("[Nightfall] All functions unloaded.")
    end
})

--========================================================--
-- INITIALIZATION
--========================================================--

task.spawn(function()

    task.wait(1)

    updateFullbright()
    updateJump()
    updateSprint()

    if Settings.ESP then
        updateESP()
    end

    if Settings.Hitbox then
        updateHitboxes()
    end

end)

print("[Nightfall] Loaded.")

How to Execute Prison Life Script – NightFall

Step 1: Copy Code: Click the Copy Code button in the viewer above to grab the clean Lua loadstring.

Step 2: Launch Executor: Open a compatible, unpatched executor. If you need one, check our Roblox Executors Directory.

Step 3: Join Experience: Launch Roblox and join Prison Life.

Step 4: Attach & Run: Attach/inject your executor into the Roblox process, paste the code into the script tab, and press Execute.

Created By

Entervalov
Entervalov
Script Creator
View Author Profile

Roblox Experience

Prison Life
Prison Life
By Aesthetical
Active Players:4.6K
Play on Roblox

Features & Information

Execute Prison Life Script – NightFall. Key system required, created by Entervalov, updated Oct 18, 2026. Tested and working on supported executors.
#Prison Life#PrisonLife#NightFall#Night Fall

Script Changelog (1)

@EntervalovOct 18, 2026

Create script

Community Comments (8)

realityxrealityxOct 26, 2026

cool lol

AskwjwjnsnsAskwjwjnsnsOct 18, 2026

6/10 because there aren't many features yet, and some Russian text is mixed in as well.

BigBoyTimmeBigBoyTimmeOct 18, 2026

Vibecoded SLOP

Replying to @BigBoyTimme
EntervalovEntervalovOct 18, 2026

@BigBoyTimme It’s funny to hear that especially when the script was put together from various other scripts. I just combined the known functions into a single whole, nvm.

Replying to @Entervalov
ScxptDevScxptDevOct 18, 2026

@Entervalov good script but the fast fire keeps bugging. Is there a way to fix it?

Replying to @ScxptDev
EntervalovEntervalovOct 18, 2026

@ScxptDev yeah

Replying to @Entervalov
ScxptDevScxptDevOct 19, 2026

@Entervalov Can u make one just for the fast fire and fix it so it doesn't bug out? cuz everytime I die or grab the gun it bugs out where it only shoots one at a time and its only for 1 gun

Replying to @ScxptDev
EntervalovEntervalovOct 26, 2026

@ScxptDev Done. Wait for the publication

Frequently Asked Questions

How do I execute Prison Life Script – NightFall in Roblox?

To run Prison Life Script – NightFall, copy the Lua loadstring from the code viewer above, launch Roblox and join Prison Life, attach a working executor (such as Potassium, Solara, or Delta from our Executors directory), paste the code into your executor console, and click Execute.

Is Prison Life Script – NightFall keyless or does it require an access key?

Prison Life Script – NightFall requires an access key. You can retrieve the official key directly using the Get Script Key link provided above.

Is Prison Life Script – NightFall currently safe and working?

This script is active and operational. Always test scripts using a secondary (alt) Roblox account to safeguard your main profile against anti-cheat bans.