Universal Script – kktty.lol assist (PLEASE READ DESC - Verified script for Universal Roblox
Key RequiredUniversal

Universal Script – kktty.lol assist (PLEASE READ DESC

Universal ScriptTheRealCheeseTheRealCheese 759 views 1.3K executesUpdated Oct 19, 2026
Unrated
00
Lua Script•671 lines (18846 chars)
--// SKY HOP V2 YE
--// Dark Glass + Blue Accent | Mobile Friendly
--// Place in StarterPlayer > StarterPlayerScripts

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")

local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")

--==================================================
-- CONFIG
--==================================================

local DEFAULT_HEIGHT = 200
local MIN_HEIGHT, MAX_HEIGHT = 50, 500

local DEFAULT_DISTANCE = 75
local MIN_DISTANCE, MAX_DISTANCE = 50, 100

local DEFAULT_INTERVAL = 1
local MIN_INTERVAL, MAX_INTERVAL = 0.25, 5

local ACCENT = Color3.fromRGB(85, 145, 255)
local PANEL_COLOR = Color3.fromRGB(18, 20, 28)
local PANEL_TRANSPARENCY = 0.08

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

local height = DEFAULT_HEIGHT
local distance = DEFAULT_DISTANCE
local interval = DEFAULT_INTERVAL
local panelTransparency = PANEL_TRANSPARENCY

local hoverEnabled = false
local sideEnabled = false
local equipEnabled = false
local autoReturnEnabled = false

local character, humanoid, root, backpack
local anchorPosition
local sideDirection = Vector3.xAxis
local sideOffset = 0
local sideSign = 1
local sideTimer = 0
local equipTimer = 0

local activeSlider
local alive = true
local minimized = false
local characterGeneration = 0

--==================================================
-- CHARACTER HELPERS
--==================================================

local function getRoot()
    character = player.Character
    if not character then return false end

    humanoid = character:FindFirstChildOfClass("Humanoid")
    root = character:FindFirstChild("HumanoidRootPart")
    backpack = player:FindFirstChildOfClass("Backpack")

    return humanoid ~= nil and root ~= nil
end

local function stopMovement()
    hoverEnabled = false
    sideEnabled = false
    anchorPosition = nil
    sideOffset = 0
    sideTimer = 0
end

local function prepareAnchor()
    if not getRoot() then
        return false
    end

    anchorPosition = root.Position

    local look = root.CFrame.RightVector
    sideDirection = Vector3.new(look.X, 0, look.Z)

    if sideDirection.Magnitude < 0.01 then
        sideDirection = Vector3.xAxis
    else
        sideDirection = sideDirection.Unit
    end

    sideOffset = 0
    sideSign = 1
    sideTimer = 0

    return true
end

--==================================================
-- GUI
--==================================================

local oldGui = playerGui:FindFirstChild("SkyHopV2YE")
if oldGui then
    oldGui:Destroy()
end

local gui = Instance.new("ScreenGui")
gui.Name = "SkyHopV2YE"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = false
gui.DisplayOrder = 20
gui.Parent = playerGui

local main = Instance.new("Frame")
main.Name = "Main"
main.Size = UDim2.fromOffset(300, 440)
main.Position = UDim2.new(0.5, -150, 0.5, -220)
main.BackgroundColor3 = PANEL_COLOR
main.BackgroundTransparency = PANEL_TRANSPARENCY
main.BorderSizePixel = 0
main.Parent = gui

Instance.new("UICorner", main).CornerRadius = UDim.new(0, 14)

local stroke = Instance.new("UIStroke")
stroke.Color = ACCENT
stroke.Transparency = 0.55
stroke.Thickness = 1
stroke.Parent = main

local header = Instance.new("Frame")
header.Name = "Header"
header.Size = UDim2.new(1, 0, 0, 48)
header.BackgroundColor3 = Color3.fromRGB(25, 30, 43)
header.BorderSizePixel = 0
header.Parent = main

Instance.new("UICorner", header).CornerRadius = UDim.new(0, 14)

local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, -90, 1, 0)
title.Position = UDim2.fromOffset(14, 0)
title.BackgroundTransparency = 1
title.Text = "SKY HOP  /  V2 YE"
title.TextColor3 = Color3.fromRGB(235, 240, 255)
title.TextSize = 15
title.Font = Enum.Font.GothamBold
title.TextXAlignment = Enum.TextXAlignment.Left
title.Parent = header

local minimize = Instance.new("TextButton")
minimize.Size = UDim2.fromOffset(34, 30)
minimize.Position = UDim2.new(1, -42, 0, 9)
minimize.Text = "—"
minimize.TextSize = 18
minimize.Font = Enum.Font.GothamBold
minimize.TextColor3 = ACCENT
minimize.BackgroundColor3 = Color3.fromRGB(38, 43, 59)
minimize.BorderSizePixel = 0
minimize.Parent = header

Instance.new("UICorner", minimize).CornerRadius = UDim.new(0, 8)

local body = Instance.new("ScrollingFrame")
body.Position = UDim2.fromOffset(10, 56)
body.Size = UDim2.new(1, -20, 1, -66)
body.BackgroundTransparency = 1
body.BorderSizePixel = 0
body.ScrollBarThickness = 3
body.ScrollBarImageColor3 = ACCENT
body.AutomaticCanvasSize = Enum.AutomaticSize.Y
body.CanvasSize = UDim2.new(0, 0, 0, 0)
body.ScrollingDirection = Enum.ScrollingDirection.Y
body.Parent = main

local list = Instance.new("UIListLayout")
list.Padding = UDim.new(0, 9)
list.SortOrder = Enum.SortOrder.LayoutOrder
list.Parent = body

local padding = Instance.new("UIPadding")
padding.PaddingBottom = UDim.new(0, 10)
padding.Parent = body

--==================================================
-- UI HELPERS
--==================================================

local function makeLabel(text, parent)
    local label = Instance.new("TextLabel")
    label.Size = UDim2.new(1, -4, 0, 24)
    label.BackgroundTransparency = 1
    label.Text = text
    label.TextColor3 = Color3.fromRGB(190, 199, 218)
    label.TextSize = 12
    label.Font = Enum.Font.GothamMedium
    label.TextXAlignment = Enum.TextXAlignment.Left
    label.Parent = parent or body
    return label
end

local function makeButton(text, parent, color)
    local button = Instance.new("TextButton")
    button.Size = UDim2.new(1, -4, 0, 38)
    button.BackgroundColor3 = Color3.fromRGB(30, 35, 48)
    button.BorderSizePixel = 0
    button.Text = text
    button.TextColor3 = Color3.fromRGB(235, 240, 255)
    button.TextSize = 12
    button.Font = Enum.Font.GothamSemibold
    button.AutoButtonColor = true
    button.Parent = parent or body

    Instance.new("UICorner", button).CornerRadius = UDim.new(0, 9)

    local outline = Instance.new("UIStroke")
    outline.Color = color or ACCENT
    outline.Transparency = 0.72
    outline.Parent = button

    return button
end

local function makeSlider(labelText, minVal, maxVal, initial, callback)
    local holder = Instance.new("Frame")
    holder.Size = UDim2.new(1, -4, 0, 55)
    holder.BackgroundTransparency = 1
    holder.Parent = body

    local label = Instance.new("TextLabel")
    label.Size = UDim2.new(1, 0, 0, 22)
    label.BackgroundTransparency = 1
    label.TextColor3 = Color3.fromRGB(215, 224, 243)
    label.Font = Enum.Font.GothamMedium
    label.TextSize = 12
    label.TextXAlignment = Enum.TextXAlignment.Left
    label.Parent = holder

    local bar = Instance.new("TextButton")
    bar.Position = UDim2.fromOffset(0, 30)
    bar.Size = UDim2.new(1, 0, 0, 16)
    bar.Text = ""
    bar.BackgroundColor3 = Color3.fromRGB(42, 47, 62)
    bar.BorderSizePixel = 0
    bar.AutoButtonColor = false
    bar.Parent = holder

    Instance.new("UICorner", bar).CornerRadius = UDim.new(1, 0)

    local fill = Instance.new("Frame")
    fill.Name = "AccentFill"
    fill.BackgroundColor3 = ACCENT
    fill.BorderSizePixel = 0
    fill.Size = UDim2.new(
        (initial - minVal) / (maxVal - minVal), 0, 1, 0
    )
    fill.Parent = bar

    Instance.new("UICorner", fill).CornerRadius = UDim.new(1, 0)

    local knob = Instance.new("Frame")
    knob.Size = UDim2.fromOffset(12, 12)
    knob.AnchorPoint = Vector2.new(0.5, 0.5)
    knob.Position = UDim2.new(fill.Size.X.Scale, 0, 0.5, 0)
    knob.BackgroundColor3 = Color3.new(1, 1, 1)
    knob.BorderSizePixel = 0
    knob.Parent = bar

    Instance.new("UICorner", knob).CornerRadius = UDim.new(1, 0)

    local value = initial

    local function setFromX(x)
        local width = bar.AbsoluteSize.X
        if width <= 0 then return end

        local alpha = math.clamp(
            (x - bar.AbsolutePosition.X) / width, 0, 1
        )

        value = minVal + (maxVal - minVal) * alpha
        value = math.floor(value * 100 + 0.5) / 100

        local shown = value
        if maxVal > 5 then
            shown = math.floor(value + 0.5)
        end

        fill.Size = UDim2.new(alpha, 0, 1, 0)
        knob.Position = UDim2.new(alpha, 0, 0.5, 0)
        label.Text = labelText .. "  •  " .. tostring(shown)

        callback(value)
    end

    label.Text = labelText .. "  •  " .. tostring(initial)

    bar.InputBegan:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1
        or input.UserInputType == Enum.UserInputType.Touch then
            activeSlider = bar
            setFromX(input.Position.X)
        end
    end)

    UserInputService.InputChanged:Connect(function(input)
        if activeSlider == bar and (
            input.UserInputType == Enum.UserInputType.MouseMovement
            or input.UserInputType == Enum.UserInputType.Touch
        ) then
            setFromX(input.Position.X)
        end
    end)

    UserInputService.InputEnded:Connect(function(input)
        if input.UserInputType == Enum.UserInputType.MouseButton1
        or input.UserInputType == Enum.UserInputType.Touch then
            activeSlider = nil
        end
    end)

    return holder
end

--==================================================
-- DRAGGING
--==================================================

local dragging = false
local dragInput
local dragStart
local startPosition

header.InputBegan:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseButton1
    or input.UserInputType == Enum.UserInputType.Touch then
        dragging = true
        dragStart = input.Position
        startPosition = main.Position

        input.Changed:Connect(function()
            if input.UserInputState == Enum.UserInputState.End then
                dragging = false
            end
        end)
    end
end)

header.InputChanged:Connect(function(input)
    if input.UserInputType == Enum.UserInputType.MouseMovement
    or input.UserInputType == Enum.UserInputType.Touch then
        dragInput = input
    end
end)

UserInputService.InputChanged:Connect(function(input)
    if dragging and (
        input == dragInput
        or input.UserInputType == Enum.UserInputType.Touch
    ) then
        local delta = input.Position - dragStart

        main.Position = UDim2.new(
            startPosition.X.Scale,
            startPosition.X.Offset + delta.X,
            startPosition.Y.Scale,
            startPosition.Y.Offset + delta.Y
        )
    end
end)

minimize.Activated:Connect(function()
    minimized = not minimized
    body.Visible = not minimized

    main.Size = minimized
        and UDim2.fromOffset(300, 48)
        or UDim2.fromOffset(300, 440)

    minimize.Text = minimized and "+" or "—"
end)

--==================================================
-- MOVEMENT CONTROLS
--==================================================

local function updateButton(button, name, enabled)
    if not button then return end

    button.Text = name .. "     [" .. (enabled and "ON" or "OFF") .. "]"
    button.BackgroundColor3 = enabled
        and Color3.fromRGB(36, 57, 88)
        or Color3.fromRGB(30, 35, 48)
end

local hoverButton = makeButton("AUTO HOVER  [OFF]")
local sideButton = makeButton("SIDE TELEPORT  [OFF]")
local equipButton = makeButton("AUTO EQUIP SLOT 1  [OFF]")
local respawnButton = makeButton("AUTO RETURN ON RESPAWN  [OFF]")

local status = makeLabel("STATUS  •  Ready")
status.Size = UDim2.new(1, -4, 0, 30)

hoverButton.Activated:Connect(function()
    if not hoverEnabled then
        if not prepareAnchor() then return end
        hoverEnabled = true
    else
        hoverEnabled = false

        if getRoot() then
            anchorPosition = root.Position
            sideOffset = 0
        end
    end

    updateButton(hoverButton, "AUTO HOVER", hoverEnabled)
end)

sideButton.Activated:Connect(function()
    if not sideEnabled then
        if not anchorPosition then
            if not prepareAnchor() then return end
        end

        sideEnabled = true
        sideOffset = 0
        sideSign = 1
        sideTimer = 0
    else
        sideEnabled = false
        sideOffset = 0
    end

    updateButton(sideButton, "SIDE TELEPORT", sideEnabled)
end)

equipButton.Activated:Connect(function()
    equipEnabled = not equipEnabled
    updateButton(equipButton, "AUTO EQUIP SLOT 1", equipEnabled)
end)

respawnButton.Activated:Connect(function()
    autoReturnEnabled = not autoReturnEnabled

    updateButton(
        respawnButton,
        "AUTO RETURN ON RESPAWN",
        autoReturnEnabled
    )

    status.Text = autoReturnEnabled
        and "STATUS  •  Auto return enabled"
        or "STATUS  •  Auto return disabled"
end)

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

makeLabel("MOVEMENT SETTINGS")

makeSlider("Hover height (studs)", MIN_HEIGHT, MAX_HEIGHT,
    DEFAULT_HEIGHT, function(v)
        height = v
    end)

makeSlider("Side distance (studs)", MIN_DISTANCE, MAX_DISTANCE,
    DEFAULT_DISTANCE, function(v)
        distance = v
    end)

makeSlider("Side interval (seconds)", MIN_INTERVAL, MAX_INTERVAL,
    DEFAULT_INTERVAL, function(v)
        interval = v
    end)

makeLabel("APPEARANCE")

makeSlider("Panel transparency (%)", 0, 70, 8, function(v)
    panelTransparency = v / 100
    main.BackgroundTransparency = panelTransparency
end)

local accentButton = makeButton("CHANGE ACCENT COLOR")

local accentColors = {
    Color3.fromRGB(85, 145, 255),
    Color3.fromRGB(175, 110, 255),
    Color3.fromRGB(65, 220, 190),
    Color3.fromRGB(255, 135, 160),
    Color3.fromRGB(255, 190, 85),
}

local accentIndex = 1

accentButton.Activated:Connect(function()
    accentIndex = accentIndex % #accentColors + 1
    ACCENT = accentColors[accentIndex]

    stroke.Color = ACCENT
    accentButton.TextColor3 = ACCENT
    body.ScrollBarImageColor3 = ACCENT

    for _, obj in ipairs(gui:GetDescendants()) do
        if obj:IsA("UIStroke") then
            obj.Color = ACCENT
        elseif obj:IsA("Frame") and obj.Name == "AccentFill" then
            obj.BackgroundColor3 = ACCENT
        end
    end
end)

--==================================================
-- RESPAWN HANDLING
--==================================================

player.CharacterAdded:Connect(function(char)
    characterGeneration += 1
    local thisGeneration = characterGeneration

    -- Stop movement using the previous character.
    stopMovement()

    character = char
    humanoid = nil
    root = nil

    status.Text = "STATUS  •  Waiting for character"

    task.spawn(function()
        local newHumanoid = char:WaitForChild("Humanoid", 10)
        local newRoot = char:WaitForChild("HumanoidRootPart", 10)

        if thisGeneration ~= characterGeneration then
            return
        end

        if not newHumanoid or not newRoot then
            status.Text = "STATUS  •  Character unavailable"
            return
        end

        humanoid = newHumanoid
        root = newRoot
        backpack = player:FindFirstChildOfClass("Backpack")

        if autoReturnEnabled and humanoid.Health > 0 then
            -- Use the new spawn point as the anchor.
            anchorPosition = root.Position

            local look = root.CFrame.RightVector
            sideDirection = Vector3.new(look.X, 0, look.Z)

            if sideDirection.Magnitude < 0.01 then
                sideDirection = Vector3.xAxis
            else
                sideDirection = sideDirection.Unit
            end

            sideOffset = 0
            sideSign = 1
            sideTimer = 0

            -- Resume hovering with the selected height.
            hoverEnabled = true
            sideEnabled = false

            updateButton(hoverButton, "AUTO HOVER", true)
            updateButton(sideButton, "SIDE TELEPORT", false)

            status.Text = "STATUS  •  Returning to sky"
        else
            updateButton(hoverButton, "AUTO HOVER", false)
            updateButton(sideButton, "SIDE TELEPORT", false)

            status.Text = "STATUS  •  Respawned"
        end
    end)
end)

-- Initialize the current character if it already exists.
if player.Character then
    character = player.Character
    humanoid = character:FindFirstChildOfClass("Humanoid")
    root = character:FindFirstChild("HumanoidRootPart")
    backpack = player:FindFirstChildOfClass("Backpack")
end

--==================================================
-- MOVEMENT LOOP
--==================================================

RunService.Heartbeat:Connect(function(dt)
    if not alive then return end

    if hoverEnabled or sideEnabled then
        if not getRoot() or humanoid.Health <= 0 then
            stopMovement()

            updateButton(hoverButton, "AUTO HOVER", false)
            updateButton(sideButton, "SIDE TELEPORT", false)

            status.Text = "STATUS  •  Waiting for character"
            return
        end

        if not anchorPosition then
            if not prepareAnchor() then return end
        end

        if sideEnabled then
            sideTimer += dt

            if sideTimer >= interval then
                sideTimer %= interval
                sideSign = -sideSign
                sideOffset = distance * sideSign
            end
        else
            sideOffset = 0
        end

        local targetPosition =
            anchorPosition
            + Vector3.new(0, hoverEnabled and height or 0, 0)
            + sideDirection * sideOffset

        -- Client-side character positioning.
        local rotation = root.CFrame - root.Position
        root.CFrame = CFrame.new(targetPosition) * rotation

        root.AssemblyLinearVelocity = Vector3.zero
        root.AssemblyAngularVelocity = Vector3.zero

        status.Text = "STATUS  •  "
            .. (hoverEnabled and "Hovering" or "Ground mode")
            .. (sideEnabled and " / Side movement" or "")
    end

    -- Automatically equip the first available Tool.
    if equipEnabled then
        equipTimer += dt

        if equipTimer >= 0.25 then
            equipTimer = 0

            if getRoot() and humanoid.Health > 0 and backpack then
                local equippedTool =
                    character:FindFirstChildOfClass("Tool")

                if not equippedTool then
                    for _, item in ipairs(backpack:GetChildren()) do
                        if item:IsA("Tool") then
                            pcall(function()
                                humanoid:EquipTool(item)
                            end)
                            break
                        end
                    end
                end
            end
        end
    end
end)

print("[SKY HOP V2 YE] Loaded successfully.")

How to Execute Universal Script – kktty.lol assist (PLEASE READ DESC

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 Universal Script.

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

Created By

TheRealCheese
TheRealCheese
Script Creator
View Author Profile

Features & Information

Execute Universal Script – kktty.lol assist (PLEASE READ DESC. Key system required, created by TheRealCheese, updated Oct 19, 2026. Tested and working on supported executors.
#kittylol#UNIVERSAL

Script Changelog (1)

@TheRealCheeseOct 19, 2026

Create script

Community Comments (4)

QueueSherlockQueueSherlockOct 20, 2026

Love you too homie

Replying to @QueueSherlock
QueueSherlockQueueSherlockOct 20, 2026

Jokes aside “use it kat” you should have written all supported games alike

Replying to @QueueSherlock
TheRealCheeseTheRealCheeseOct 21, 2026

@QueueSherlock i cant be bothered to find all the support games but ill try once i upload v3

Replying to @TheRealCheese
QueueSherlockQueueSherlockOct 21, 2026

@TheRealCheese not all, just more than one to call it universal or hub

Frequently Asked Questions

How do I execute Universal Script – kktty.lol assist (PLEASE READ DESC in Roblox?

To run Universal Script – kktty.lol assist (PLEASE READ DESC, copy the Lua loadstring from the code viewer above, launch Roblox and join Universal Script, 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 Universal Script – kktty.lol assist (PLEASE READ DESC keyless or does it require an access key?

Universal Script – kktty.lol assist (PLEASE READ DESC requires an access key. You can retrieve the official key directly using the Get Script Key link provided above.

Is Universal Script – kktty.lol assist (PLEASE READ DESC 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.