Further enhance the reaction time and enhance the animation-detection so that if it detects THE animation it'll automatically try to maneuver around that block animation.

```
--[[
    Enhanced Lock-On and ESP Script with GUI for Body Part Selection, Layered Tracking, Animation Detection, and Advanced Reaction-Time Algorithm
    - Allows selection of specific humanoid body parts: Left Arm, Left Leg, Torso, Torso (Back), Head, Right Leg, Right Arm.
    - Implements a layered tracking method to prioritize and manage target selections based on Field of View (FOV) and distance.
    - Integrates a user-friendly and visually appealing GUI for real-time body part selection.
    - Maintains all previous functionalities including ShiftLock support, predictive algorithms, and hitbox detection.
    - **Enhancements:**
        - Robust Movement Prediction using Kalman Filter
        - **New Feature**: Instant Back-Facing Lock-On
        - **New Feature**: Automatic Reaction to Specific Animations
        - **New Feature**: Advanced Reaction-Time Algorithm
--]]

-- Services
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local GuiService = game:GetService("GuiService")
local TweenService = game:GetService("TweenService")
local Workspace = game:GetService("Workspace")
local CurrentCamera = Workspace.CurrentCamera

-- Configuration
local DEBUG = true  -- Toggle debug logs
local ROTATION_SPEED = 21        -- Smooth rotation speed multiplier (reduced for smoother effect)
local ESP_TEXT_PREFIX = "Targeted: " -- Prefix Text displayed in ESP
local ESP_COLOR = Color3.fromRGB(0, 255, 0)  -- Color of the ESP text
local PREDICTION_TIME_BASE = 0.2 -- Base time in seconds to predict target movement (reduced for responsiveness)
local PREDICTION_TIME_ADJUSTMENT_FACTOR = 0.4 -- Factor to adjust prediction time based on velocity and distance
local VELOCITY_ALPHA = 0.8 -- Alpha value for Exponential Moving Average (now replaced by Kalman Filter)
local LOCK_ON_KEY = Enum.KeyCode.E -- Key to toggle lock-on
local SHIFT_LOCK_TOGGLE_KEY = Enum.KeyCode.LeftShift -- Key to toggle ShiftLock mode
local MAX_FOV_ANGLE = 60 -- Maximum angle (in degrees) for FOV-based target selection
local GUI_CONFIG = {
    ScreenGuiName = "EnhancedLockOnESPGUI",
    FrameSize = UDim2.new(0, 220, 0, 350),
    FramePosition = UDim2.new(0, 10, 0.5, -175),
    ButtonSize = UDim2.new(1, -20, 0, 35),
    BodyParts = {
        "Left Arm",
        "Left Leg",
        "Torso",
        "Torso (Back)",
        "Head",
        "Right Leg",
        "Right Arm"
    },
    SelectedColor = Color3.fromRGB(70, 130, 180), -- Steel Blue
    UnselectedColor = Color3.fromRGB(50, 50, 50),
    HoverColor = Color3.fromRGB(100, 100, 100),
    TextColor = Color3.fromRGB(255, 255, 255),
    BackgroundColor = Color3.fromRGB(30, 30, 30),
    StrokeColor = Color3.fromRGB(255, 255, 255)
}

-- Animation Detection Configuration
local ANIMATION_DETECTION = {
    AnimationId = "rbxassetid://10470389827",
    ReactionDistance = 10, -- Maximum distance to consider for reaction
}

-- Advanced Reaction-Time Algorithm Configuration
local REACTION_TIME_MIN = 0.2 -- Minimum reaction time in seconds
local REACTION_TIME_MAX = 0.3 -- Maximum reaction time in seconds
local VELOCITY_CHANGE_THRESHOLD = 8 -- Threshold for significant velocity change

-- Debug Function
local function debugLog(message)
    if DEBUG then
        print("[EnhancedLockOnScript]: " .. message)
    end
end

-- Variables
local player = Players.LocalPlayer
if not player then
    error("LocalPlayer not found!")
    return
end

local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
local humanoidRootPart = character:WaitForChild("HumanoidRootPart")
local trackedTarget = nil          -- Currently tracked target (another player)
local espIndicator = nil           -- BillboardGui for ESP
local shiftLockMode = false        -- ShiftLock mode toggle
local lockOnMode = false           -- Lock-On mode toggle
local selectedBodyPart = "Torso (Back)" -- Default selected body part

-- Determine Rig Type and set the torso part name
local isR15 = humanoid.RigType == Enum.HumanoidRigType.R15
local torsoPartName = isR15 and "UpperTorso" or "Torso"
debugLog("Rig type determined: " .. (isR15 and "R15" or "R6"))
debugLog("Torso part set to: " .. torsoPartName)

-- Mapping for R6 and R15 body parts
local bodyPartMappings = {
    ["Left Arm"] = isR15 and "LeftUpperArm" or "Left Arm",
    ["Left Leg"] = isR15 and "LeftUpperLeg" or "Left Leg",
    ["Torso"] = torsoPartName,
    ["Torso (Back)"] = torsoPartName, -- Special handling
    ["Head"] = "Head",
    ["Right Leg"] = isR15 and "RightUpperLeg" or "Right Leg",
    ["Right Arm"] = isR15 and "RightUpperArm" or "Right Arm"
}

-- Helper Function: Check if a model has a Humanoid
local function hasHumanoid(model)
    return model and model:FindFirstChildOfClass("Humanoid") ~= nil
end

-- Helper Function: Calculate angle between two vectors
local function calculateAngle(direction)
    local viewVector = CurrentCamera.CFrame.LookVector
    local directionUnit = direction.Unit
    local dotProduct = viewVector:Dot(directionUnit)
    local angle = math.acos(math.clamp(dotProduct, -1, 1)) * (180 / math.pi) -- Clamp to avoid NaNs
    return angle
end

-- Kalman Filter Implementation for Enhanced Prediction
local KalmanFilter = {}
KalmanFilter.__index = KalmanFilter

function KalmanFilter.new()
    local self = setmetatable({}, KalmanFilter)
    self.position = Vector3.new(0, 0, 0)
    self.velocity = Vector3.new(0, 0, 0)
    self.previousVelocity = Vector3.new(0, 0, 0)
    self.acceleration = Vector3.new(0, 0, 0)
    self.dt = 1 / 60 -- Default timestep, will be updated each frame
    return self
end

function KalmanFilter:update(measurement)
    -- Time update
    self.position = self.position + self.velocity * self.dt + 0.5 * self.acceleration * self.dt^2
    self.velocity = self.velocity + self.acceleration * self.dt

    -- Measurement update
    local error = measurement - self.position
    local adjustmentFactor = 0.5 -- Tunable parameter for responsiveness
    self.position = self.position + error * adjustmentFactor

    -- Store previous velocity before updating
    self.previousVelocity = self.velocity

    -- Estimate velocity based on the new position
    self.velocity = (self.position - (self.position - self.velocity * self.dt)) / self.dt

    -- Optionally, update acceleration if needed
end

-- Create a table to hold tracking data for each target
local trackingDataTable = {}

-- Helper Function: Find or create tracking data for a target
local function getTrackingData(target)
    if not trackingDataTable[target] then
        trackingDataTable[target] = {
            kalmanFilter = KalmanFilter.new(),
            reactionDelay = 0,
            reactionTimer = 0,
            lastUpdateTime = tick(),
            animationReactionDelay = 0,
            animationReactionTimer = 0,
            dt = 1 / 60,
        }
    end
    return trackingDataTable[target]
end

-- Helper Function: Find the best target based on FOV and distance
local function findBestTarget()
    local bestTarget = nil
    local shortestDistance = math.huge
    local bestAngle = MAX_FOV_ANGLE

    for _, otherPlayer in ipairs(Players:GetPlayers()) do
        if otherPlayer ~= player and otherPlayer.Character and hasHumanoid(otherPlayer.Character) then
            local targetPartName = bodyPartMappings[selectedBodyPart]
            local otherTorso = otherPlayer.Character:FindFirstChild(targetPartName)
            if otherTorso and otherTorso:IsA("BasePart") then
                local direction = otherTorso.Position - humanoidRootPart.Position
                local distance = direction.Magnitude
                local angle = calculateAngle(direction)
                
                if angle <= MAX_FOV_ANGLE and distance < shortestDistance then
                    shortestDistance = distance
                    bestTarget = otherPlayer
                    bestAngle = angle
                end
            end
        end
    end

    if bestTarget then
        debugLog(string.format("Best target found: %s | Distance: %.2f | Angle: %.2f", bestTarget.Name, shortestDistance, bestAngle))
    else
        debugLog("No suitable target found within FOV.")
    end

    return bestTarget
end

-- Function: Toggle Lock-On to the Best Target based on layered selection
local function toggleLockOn()
    if lockOnMode then
        -- Deselect the current target
        debugLog("Deselecting current target: " .. (trackedTarget and trackedTarget.Name or "None"))
        trackedTarget = nil
        lockOnMode = false
        if espIndicator then
            espIndicator:Destroy()
            espIndicator = nil
            debugLog("ESP indicator destroyed.")
        end
        -- Disconnect animation listener if connected
        if animationConnection then
            animationConnection:Disconnect()
            animationConnection = nil
            debugLog("Disconnected animation listener.")
        end
    else
        -- Find and select the best target
        local bestPlayer = findBestTarget()
        if bestPlayer and bestPlayer.Character then
            trackedTarget = bestPlayer.Character
            lockOnMode = true
            debugLog("Tracking new target: " .. bestPlayer.Name)
            -- Create ESP indicator
            local targetPartName = bodyPartMappings[selectedBodyPart]
            local targetPart = trackedTarget:FindFirstChild(targetPartName)
            if targetPart then
                -- Ensure previous ESP is removed
                if espIndicator then
                    espIndicator:Destroy()
                    espIndicator = nil
                    debugLog("Previous ESP indicator destroyed.")
                end

                -- Create BillboardGui for ESP
                espIndicator = Instance.new("BillboardGui")
                espIndicator.Adornee = targetPart
                espIndicator.Size = UDim2.new(0, 150, 0, 50)
                espIndicator.StudsOffset = Vector3.new(0, 2, 0)
                espIndicator.AlwaysOnTop = true
                espIndicator.Name = "TargetESP"

                -- Create TextLabel for ESP
                local textLabel = Instance.new("TextLabel")
                textLabel.Parent = espIndicator
                textLabel.Size = UDim2.new(1, 0, 1, 0)
                textLabel.BackgroundTransparency = 1
                textLabel.Text = ESP_TEXT_PREFIX .. trackedTarget.Name .. " (" .. selectedBodyPart .. ")"
                textLabel.TextColor3 = ESP_COLOR
                textLabel.Font = Enum.Font.SourceSansBold
                textLabel.TextScaled = true
                textLabel.TextStrokeTransparency = 0.8

                -- Parent the ESP to the player's PlayerGui
                local playerGui = player:WaitForChild("PlayerGui")
                espIndicator.Parent = playerGui
                debugLog("ESP indicator created for " .. bestPlayer.Name .. " targeting " .. selectedBodyPart)
            else
                debugLog("Selected body part '" .. targetPartName .. "' not found on " .. bestPlayer.Name)
                trackedTarget = nil
            end

            -- Monitor the tracked target's animations
            local targetHumanoid = trackedTarget:FindFirstChildOfClass("Humanoid")
            if targetHumanoid then
                animationConnection = targetHumanoid.AnimationPlayed:Connect(function(animationTrack)
                    if animationTrack and animationTrack.Animation and animationTrack.Animation.AnimationId == ANIMATION_DETECTION.AnimationId then
                        debugLog(string.format("Detected specified animation on target: %s", animationTrack.Animation.AnimationId))
                        -- Set animation reaction delay
                        local trackingData = getTrackingData(trackedTarget)
                        if trackingData.animationReactionDelay == 0 then
                            trackingData.animationReactionDelay = math.random() * (REACTION_TIME_MAX - REACTION_TIME_MIN) + REACTION_TIME_MIN
                            trackingData.animationReactionTimer = 0
                            debugLog(string.format("Setting animation reaction delay of %.2f seconds.", trackingData.animationReactionDelay))
                        end
                    end
                end)
                debugLog("Connected animation listener for target.")
            end
        else
            debugLog("No valid target to track.")
        end
    end
end

-- Function: Predict Future Position Based on Target's Velocity using Kalman Filter and Reaction-Time Algorithm
local function getPredictedPosition(targetCharacter)
    local targetPartName = bodyPartMappings[selectedBodyPart]
    local targetPart = targetCharacter:FindFirstChild(targetPartName)
    if not targetPart then
        debugLog("Target does not have the part: " .. targetPartName)
        return nil
    end

    -- Get current position
    local currentPosition = targetPart.Position

    -- Get tracking data
    local trackingData = getTrackingData(targetCharacter)
    local kalFilter = trackingData.kalmanFilter

    -- Calculate deltaTime
    local currentTime = tick()
    trackingData.dt = currentTime - trackingData.lastUpdateTime
    trackingData.lastUpdateTime = currentTime
    kalFilter.dt = trackingData.dt

    -- Update Kalman Filter with the current position
    kalFilter:update(currentPosition)

    -- Now calculate change in velocity
    local deltaVelocity = kalFilter.velocity - kalFilter.previousVelocity
    local deltaVelocityMagnitude = deltaVelocity.Magnitude

    -- Check for significant velocity change
    if deltaVelocityMagnitude > VELOCITY_CHANGE_THRESHOLD then
        -- Significant change detected
        if trackingData.reactionDelay == 0 then
            -- Set reaction delay
            trackingData.reactionDelay = math.random() * (REACTION_TIME_MAX - REACTION_TIME_MIN) + REACTION_TIME_MIN
            trackingData.reactionTimer = 0
            debugLog(string.format("Significant velocity change detected. Setting reaction delay of %.2f seconds.", trackingData.reactionDelay))
        end
    end

    -- Update reaction timer
    if trackingData.reactionDelay > 0 then
        trackingData.reactionTimer = trackingData.reactionTimer + trackingData.dt
        if trackingData.reactionTimer >= trackingData.reactionDelay then
            -- Reaction delay expired
            trackingData.reactionDelay = 0
            trackingData.reactionTimer = 0
            debugLog("Reaction delay expired. Adjusting tracking.")
        else
            -- Still in reaction delay
            debugLog("In reaction delay period. Not adjusting tracking.")
            return nil -- Do not adjust tracking
        end
    end

    -- Get predicted position
    local predictedPosition = kalFilter.position

    -- Enhanced Handling for "Torso (Back)"
    if selectedBodyPart == "Torso (Back)" then
        local targetHumanoid = targetCharacter:FindFirstChildOfClass("Humanoid")
        if targetHumanoid then
            local rootPart = targetHumanoid.RootPart or targetCharacter:FindFirstChild("HumanoidRootPart") or targetCharacter:FindFirstChild("UpperTorso")
            if rootPart then
                -- Calculate back position based on target's orientation without any offset
                predictedPosition = rootPart.Position - (rootPart.CFrame.LookVector * 2) -- 2 studs behind, adjust as needed
                debugLog("Calculated back position using LookVector without offset.")
            else
                debugLog("Root part not found for back position calculation.")
            end
        end
    end

    debugLog(string.format("Final target position: (%.2f, %.2f, %.2f)", predictedPosition.X, predictedPosition.Y, predictedPosition.Z))
    return predictedPosition
end

-- Function: Instantly rotate to face the back of the target's humanoidRootPart
local function instantBackFaceRotate(targetCharacter)
    if not targetCharacter then return end

    local targetHumanoid = targetCharacter:FindFirstChildOfClass("Humanoid")
    if not targetHumanoid then return end

    local targetRootPart = targetHumanoid.RootPart or targetCharacter:FindFirstChild("HumanoidRootPart") or targetCharacter:FindFirstChild("UpperTorso")
    if not targetRootPart then return end

    -- Calculate the position directly behind the target's RootPart
    local backPosition = targetRootPart.Position - (targetRootPart.CFrame.LookVector * 2) -- 2 studs back; adjust as necessary

    -- Instantly set the CFrame to look at the backPosition
    humanoidRootPart.CFrame = CFrame.new(humanoidRootPart.Position, backPosition)
    debugLog("Instantly rotated to face the back of the target's HumanoidRootPart.")
end

-- Function: Instantly rotate to face a specific position
local function instantRotateToPosition(targetPosition)
    if not targetPosition then return end

    local desiredCFrame = CFrame.new(humanoidRootPart.Position, targetPosition)
    humanoidRootPart.CFrame = desiredCFrame
    debugLog("Instantly rotated to face target position.")
end

-- Function: Smoothly rotate to face the predicted target position
local function smoothRotateToPosition(targetPosition, deltaTime)
    if not targetPosition then return end

    local direction = (Vector3.new(targetPosition.X, humanoidRootPart.Position.Y, targetPosition.Z) - humanoidRootPart.Position).Unit
    local desiredCFrame = CFrame.new(humanoidRootPart.Position, humanoidRootPart.Position + direction)

    -- Smoothly interpolate the CFrame
    humanoidRootPart.CFrame = humanoidRootPart.CFrame:Lerp(desiredCFrame, ROTATION_SPEED * deltaTime)
    debugLog("Smoothly rotated to face target position.")
end

-- Function: Rotate to Target (Instant or Smooth based on toggle)
local function rotateToTarget(deltaTime)
    if not trackedTarget then return end

    local targetPartName = bodyPartMappings[selectedBodyPart]
    local targetPart = trackedTarget:FindFirstChild(targetPartName)
    if targetPart and targetPart:IsA("BasePart") then
        local predictedPosition = getPredictedPosition(trackedTarget)
        if predictedPosition then
            if shiftLockMode then
                -- Use the new instant back-facing algorithm when selectedBodyPart is "Torso (Back)"
                if selectedBodyPart == "Torso (Back)" then
                    instantBackFaceRotate(trackedTarget)
                else
                    instantRotateToPosition(predictedPosition)
                end
            else
                smoothRotateToPosition(predictedPosition, deltaTime)
            end

            -- Hitbox Detection: Ensure predicted position is within part bounds
            local partSize = targetPart.Size
            local partPosition = targetPart.Position
            local deltaPosition = predictedPosition - partPosition

            local withinX = math.abs(deltaPosition.X) <= (partSize.X / 2)
            local withinY = math.abs(deltaPosition.Y) <= (partSize.Y / 2)
            local withinZ = math.abs(deltaPosition.Z) <= (partSize.Z / 2)

            if withinX and withinY and withinZ then
                debugLog("Predicted position is within the part's hitbox.")
            else
                debugLog("Predicted position is outside the part's hitbox.")
            end
        else
            debugLog("Failed to get predicted target position.")
        end
    else
        debugLog("Target part '" .. targetPartName .. "' is invalid or missing.")
    end
end

-- Function: Handle ShiftLock Toggle
local function toggleShiftLock()
    if shiftLockMode then
        -- Disable ShiftLock Mode
        shiftLockMode = false
        CurrentCamera.CameraType = Enum.CameraType.Custom
        debugLog("ShiftLock mode disabled.")
    else
        if lockOnMode then
            -- Disable Lock-On before enabling ShiftLock to prevent conflicts
            toggleLockOn()
        end
        -- Enable ShiftLock Mode
        shiftLockMode = true
        CurrentCamera.CameraType = Enum.CameraType.Scriptable
        -- Lock the camera to look at the target
        if trackedTarget then
            local targetPartName = bodyPartMappings[selectedBodyPart]
            local targetPart = trackedTarget:FindFirstChild(targetPartName)
            if targetPart then
                local predictedPosition = getPredictedPosition(trackedTarget)
                CurrentCamera.CFrame = CFrame.new(humanoidRootPart.Position, predictedPosition)
                debugLog("ShiftLock mode enabled and camera locked onto target.")
            end
        end
    end
end

-- Function: Clean up ESP when the tracked target dies or leaves
local function onTrackedTargetRemoved()
    if not trackedTarget then return end
    debugLog("Tracked target removed or died: " .. (trackedTarget.Name or "Unknown"))
    trackedTarget = nil
    lockOnMode = false
    if espIndicator then
        espIndicator:Destroy()
        espIndicator = nil
        debugLog("ESP indicator destroyed due to target removal.")
    end
    -- Disconnect animation listener if connected
    if animationConnection then
        animationConnection:Disconnect()
        animationConnection = nil
        debugLog("Disconnected animation listener.")
    end
    -- Reset tracking data for the target
    trackingDataTable[trackedTarget] = nil
    -- Reset camera if ShiftLock was active
    if shiftLockMode then
        toggleShiftLock()
    end
end

-- Function: Monitor Tracked Target for Removal or Death
local function monitorTrackedTarget(targetCharacter)
    if not targetCharacter then return end

    local targetHumanoid = targetCharacter:FindFirstChildOfClass("Humanoid")
    if targetHumanoid then
        targetHumanoid.Died:Connect(function()
            debugLog("Tracked target " .. (targetCharacter.Name or "Unknown") .. " has died.")
            onTrackedTargetRemoved()
        end)
    end

    targetCharacter.AncestryChanged:Connect(function()
        if not targetCharacter:IsDescendantOf(game) then
            debugLog("Tracked target " .. (targetCharacter.Name or "Unknown") .. " has left the game.")
            onTrackedTargetRemoved()
        end
    end)
end

-- Modify toggleLockOn to monitor the tracked target
local originalToggleLockOn = toggleLockOn
toggleLockOn = function()
    originalToggleLockOn()
    if trackedTarget then
        monitorTrackedTarget(trackedTarget)
    end
end

-- Variable to hold animation connection
local animationConnection = nil

-- Function: Handle Character Respawn
player.CharacterAdded:Connect(function(newCharacter)
    debugLog("Character respawned.")
    character = newCharacter
    humanoid = character:WaitForChild("Humanoid")
    humanoidRootPart = character:WaitForChild("HumanoidRootPart")
    
    -- Determine rig type using RigType property
    isR15 = humanoid.RigType == Enum.HumanoidRigType.R15
    torsoPartName = isR15 and "UpperTorso" or "Torso"
    debugLog("New rig type determined: " .. (isR15 and "R15" or "R6"))
    
    -- Reset tracking and ESP on respawn
    onTrackedTargetRemoved()
end)

-- Function: Update Camera during ShiftLock Mode
local function updateCamera(deltaTime)
    if shiftLockMode and trackedTarget then
        local targetPartName = bodyPartMappings[selectedBodyPart]
        local targetPart = trackedTarget:FindFirstChild(targetPartName)
        if targetPart then
            -- Smoothly move the camera to follow the target
            local predictedPosition = getPredictedPosition(trackedTarget)
            if predictedPosition then
                local desiredCFrame = CFrame.new(humanoidRootPart.Position, predictedPosition)
                CurrentCamera.CFrame = CurrentCamera.CFrame:lerp(desiredCFrame, ROTATION_SPEED * deltaTime)
                debugLog("Camera updated to follow target in ShiftLock mode.")
            end
        end
    end
end

-- Function: Create and Setup the Body Part Selection GUI with Enhanced Aesthetics
local function createBodyPartSelectionGUI()
    -- Check if the GUI already exists to prevent duplication
    if player.PlayerGui:FindFirstChild(GUI_CONFIG.ScreenGuiName) then
        debugLog("GUI already exists. Skipping creation.")
        return
    end

    -- Create ScreenGui
    local screenGui = Instance.new("ScreenGui")
    screenGui.Name = GUI_CONFIG.ScreenGuiName
    screenGui.Parent = player.PlayerGui
    screenGui.ResetOnSpawn = false

    -- Create Background Frame
    local frame = Instance.new("Frame")
    frame.Size = GUI_CONFIG.FrameSize
    frame.Position = GUI_CONFIG.FramePosition
    frame.BackgroundColor3 = GUI_CONFIG.BackgroundColor
    frame.BackgroundTransparency = 0.8
    frame.BorderSizePixel = 0
    frame.Parent = screenGui

    -- Add UIStroke for Frame
    local frameStroke = Instance.new("UIStroke")
    frameStroke.Color = GUI_CONFIG.StrokeColor
    frameStroke.Thickness = 2
    frameStroke.Parent = frame

    -- Create Title
    local title = Instance.new("TextLabel")
    title.Size = UDim2.new(1, 0, 0, 40)
    title.Position = UDim2.new(0, 0, 0, 0)
    title.BackgroundTransparency = 1
    title.Text = "Lock-On ESP"
    title.Font = Enum.Font.GothamBold
    title.TextSize = 24
    title.TextColor3 = GUI_CONFIG.TextColor
    title.TextStrokeTransparency = 0.5
    title.TextXAlignment = Enum.TextXAlignment.Center
    title.Parent = frame

    -- Create UIListLayout for organized buttons
    local uiListLayout = Instance.new("UIListLayout")
    uiListLayout.Parent = frame
    uiListLayout.FillDirection = Enum.FillDirection.Vertical
    uiListLayout.SortOrder = Enum.SortOrder.LayoutOrder
    uiListLayout.Padding = UDim.new(0, 10)
    uiListLayout.VerticalAlignment = Enum.VerticalAlignment.Top

    -- Create UIListLayoutPadding to position buttons below the title
    local layoutPadding = Instance.new("UIPadding")
    layoutPadding.PaddingTop = UDim.new(0, 50)
    layoutPadding.Parent = frame

    -- Function to handle body part selection
    local function selectBodyPart(bodyPart, button)
        selectedBodyPart = bodyPart
        debugLog("Selected body part: " .. bodyPart)
        toggleLockOn() -- Deselect current target

        -- Update ESP text if a target is already locked on
        if lockOnMode and espIndicator then
            espIndicator:Destroy()
            espIndicator = nil
            debugLog("ESP indicator destroyed due to body part change.")
            toggleLockOn() -- Re-select target with new body part
        end

        -- Update button colors to indicate selection
        for _, btn in ipairs(frame:GetChildren()) do
            if btn:IsA("TextButton") then
                btn.BackgroundColor3 = GUI_CONFIG.UnselectedColor
            end
        end
        button.BackgroundColor3 = GUI_CONFIG.SelectedColor
    end

    -- Create Buttons for each Body Part with Enhanced Aesthetics
    for _, bodyPart in ipairs(GUI_CONFIG.BodyParts) do
        local button = Instance.new("TextButton")
        button.Size = GUI_CONFIG.ButtonSize
        button.Text = bodyPart
        button.Font = Enum.Font.Gotham
        button.TextSize = 18
        button.TextColor3 = GUI_CONFIG.TextColor
        button.BackgroundColor3 = (bodyPart == selectedBodyPart) and GUI_CONFIG.SelectedColor or GUI_CONFIG.UnselectedColor
        button.AutoButtonColor = false
        button.BorderSizePixel = 0
        button.Parent = frame

        -- Add UIStroke for Buttons
        local buttonStroke = Instance.new("UIStroke")
        buttonStroke.Color = GUI_CONFIG.StrokeColor
        buttonStroke.Thickness = 1
        buttonStroke.Parent = button

        -- Hover Effects
        button.MouseEnter:Connect(function()
            if bodyPart ~= selectedBodyPart then
                button.BackgroundColor3 = GUI_CONFIG.HoverColor
            end
        end)

        button.MouseLeave:Connect(function()
            if bodyPart ~= selectedBodyPart then
                button.BackgroundColor3 = GUI_CONFIG.UnselectedColor
            end
        end)

        button.MouseButton1Click:Connect(function()
            selectBodyPart(bodyPart, button)
        end)
    end

    debugLog("Enhanced Body Part Selection GUI created.")
end

-- Call the function to create the GUI
createBodyPartSelectionGUI()

-- Function: Setup ShiftLock and Lock-On Toggles
local function setupShiftLockToggle()
    UserInputService.InputBegan:Connect(function(input, gameProcessed)
        if gameProcessed then return end

        if input.KeyCode == LOCK_ON_KEY then
            toggleLockOn()
        elseif input.KeyCode == SHIFT_LOCK_TOGGLE_KEY then
            toggleShiftLock()
        end
    end)
end

-- Function: Update Reaction Timers
local function updateReactionTimers(deltaTime)
    if not trackedTarget then return end

    local trackingData = getTrackingData(trackedTarget)

    -- Update animation reaction timer
    if trackingData.animationReactionDelay > 0 then
        trackingData.animationReactionTimer = trackingData.animationReactionTimer + deltaTime
        if trackingData.animationReactionTimer >= trackingData.animationReactionDelay then
            -- Reaction delay expired
            trackingData.animationReactionDelay = 0
            trackingData.animationReactionTimer = 0
            debugLog("Animation reaction delay expired. Performing action.")
            -- Perform the action
            instantBackFaceRotate(trackedTarget)
        else
            -- Still in reaction delay
            debugLog("In animation reaction delay period.")
        end
    end
end

-- Event Listeners

-- Setup ShiftLock and Lock-On Toggles
setupShiftLockToggle()

-- Render Step: Continuously update rotation and camera if a target is tracked
RunService.RenderStepped:Connect(function(deltaTime)
    if lockOnMode and trackedTarget then
        pcall(function()
            updateReactionTimers(deltaTime)
            rotateToTarget(deltaTime)
            updateCamera(deltaTime)
        end)
    end
end)