
Universal Script – Wave Universal
--[[
WAVE UNIVERSAL v1.7
Roblox Studio LocalScript
Place in StarterPlayer > StarterPlayerScripts
]]
-- SERVICES
local Players = game:GetService("Players")
local UIS = game:GetService("UserInputService")
local RS = game:GetService("RunService")
local SoundService = game:GetService("SoundService")
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
-- CONFIG
local LOGO_ID = "rbxassetid://115299800628540"
local themeOrder = { "Cyan", "Crimson", "Purple", "Monochrome" }
local themes = {
Cyan = Color3.fromRGB(0, 220, 255),
Crimson = Color3.fromRGB(255, 40, 60),
Purple = Color3.fromRGB(170, 80, 255),
Monochrome = Color3.fromRGB(220, 220, 220),
}
local accent = themes.Cyan
local backgroundColor = Color3.fromRGB(15, 15, 19)
local panelColor = Color3.fromRGB(25, 25, 31)
local textColor = Color3.fromRGB(240, 240, 245)
local musicIds = {
"1846088038",
"1836009208",
"9045766377",
"9045766074",
}
-- STATE
local alive = true
local noclipEnabled = false
local infiniteJumpEnabled = false
local espEnabled = false
local musicEnabled = false
local selectedWalkSpeed = 16
local selectedJumpPower = 50
local musicIndex = 0
local connections = {}
local highlights = {}
local originalCollision = {}
local originalWalkSpeed
local originalJumpPower
local logEntries = {}
local logLabel
local sectionLabels = {}
local windowStroke
local title
local logo
local reopen
local reopenLogo
local musicToggleButton
local function track(connection)
table.insert(connections, connection)
return connection
end
local function log(message)
local entry = os.date("%H:%M:%S") .. " " .. tostring(message)
table.insert(logEntries, entry)
if #logEntries > 100 then
table.remove(logEntries, 1)
end
if logLabel and logLabel.Parent then
logLabel.Text = table.concat(logEntries, "\n")
end
print("[Wave Universal] " .. tostring(message))
end
-- PLAYER HELPERS
local function getCharacter()
return player.Character
end
local function getHumanoid()
local character = getCharacter()
return character and character:FindFirstChildOfClass("Humanoid")
end
local function saveMovementDefaults()
local humanoid = getHumanoid()
if not humanoid then return end
originalWalkSpeed = humanoid.WalkSpeed
originalJumpPower = humanoid.JumpPower
end
saveMovementDefaults()
local function restoreMovement()
local humanoid = getHumanoid()
if not humanoid then return end
if originalWalkSpeed then
humanoid.WalkSpeed = originalWalkSpeed
end
if originalJumpPower then
humanoid.JumpPower = originalJumpPower
end
end
local function applyWalkSpeed(value)
selectedWalkSpeed = value
local humanoid = getHumanoid()
if humanoid then
humanoid.WalkSpeed = value
end
log("WalkSpeed set to " .. value)
end
local function applyJumpPower(value)
selectedJumpPower = value
local humanoid = getHumanoid()
if humanoid then
humanoid.UseJumpPower = true
humanoid.JumpPower = value
end
log("JumpPower set to " .. value)
end
-- GUI ROOT
local gui = Instance.new("ScreenGui")
gui.Name = "WaveUniversal"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
gui.Parent = playerGui
local function makeCorner(object, radius)
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, radius or 8)
corner.Parent = object
return corner
end
local function makeStroke(object, color, thickness)
local stroke = Instance.new("UIStroke")
stroke.Color = color or accent
stroke.Thickness = thickness or 1
stroke.Transparency = 0.2
stroke.Parent = object
return stroke
end
local function makeLabel(parent, text, size, position, fontSize)
local label = Instance.new("TextLabel")
label.BackgroundTransparency = 1
label.Text = text
label.Size = size
label.Position = position
label.Font = Enum.Font.Gotham
label.TextSize = fontSize or 13
label.TextColor3 = textColor
label.TextXAlignment = Enum.TextXAlignment.Left
label.TextWrapped = true
label.Parent = parent
return label
end
local function makeButton(parent, text, size, position, callback)
local button = Instance.new("TextButton")
button.AutoButtonColor = true
button.BackgroundColor3 = panelColor
button.BorderSizePixel = 0
button.Text = text
button.Size = size
button.Position = position
button.Font = Enum.Font.GothamMedium
button.TextSize = 12
button.TextColor3 = textColor
button.Parent = parent
makeCorner(button, 7)
makeStroke(button, Color3.fromRGB(55, 55, 65), 1)
if callback then
button.Activated:Connect(callback)
end
return button
end
-- MAIN WINDOW
local window = Instance.new("Frame")
window.Name = "MainWindow"
window.Size = UDim2.new(0, 540, 0, 360)
window.Position = UDim2.new(0.5, -270, 0.5, -180)
window.BackgroundColor3 = backgroundColor
window.BorderSizePixel = 0
window.Parent = gui
makeCorner(window, 10)
windowStroke = makeStroke(window, accent, 1.5)
local header = Instance.new("Frame")
header.Size = UDim2.new(1, 0, 0, 42)
header.BackgroundColor3 = panelColor
header.BorderSizePixel = 0
header.Parent = window
makeCorner(header, 10)
logo = Instance.new("ImageLabel")
logo.Name = "WaveLogo"
logo.Size = UDim2.fromOffset(28, 28)
logo.Position = UDim2.new(0, 8, 0, 7)
logo.BackgroundTransparency = 1
logo.Image = LOGO_ID
logo.ScaleType = Enum.ScaleType.Fit
logo.Parent = header
title = makeLabel(
header,
"WAVE UNIVERSAL",
UDim2.new(1, -155, 1, 0),
UDim2.new(0, 43, 0, 0),
14
)
title.Font = Enum.Font.GothamBold
-- SIDEBAR
local sidebar = Instance.new("Frame")
sidebar.Name = "Sidebar"
sidebar.Position = UDim2.new(0, 8, 0, 50)
sidebar.Size = UDim2.new(0, 105, 1, -58)
sidebar.BackgroundColor3 = panelColor
sidebar.BorderSizePixel = 0
sidebar.Parent = window
makeCorner(sidebar, 8)
local sidebarLayout = Instance.new("UIListLayout")
sidebarLayout.Padding = UDim.new(0, 6)
sidebarLayout.SortOrder = Enum.SortOrder.LayoutOrder
sidebarLayout.Parent = sidebar
local sidebarPadding = Instance.new("UIPadding")
sidebarPadding.PaddingTop = UDim.new(0, 8)
sidebarPadding.PaddingLeft = UDim.new(0, 6)
sidebarPadding.PaddingRight = UDim.new(0, 6)
sidebarPadding.Parent = sidebar
-- CONTENT AREA
local content = Instance.new("Frame")
content.Name = "Content"
content.Position = UDim2.new(0, 121, 0, 50)
content.Size = UDim2.new(1, -129, 1, -58)
content.BackgroundTransparency = 1
content.Parent = window
local pages = {}
local tabButtons = {}
local function createPage(name)
local page = Instance.new("ScrollingFrame")
page.Name = name .. "Page"
page.Size = UDim2.fromScale(1, 1)
page.BackgroundTransparency = 1
page.BorderSizePixel = 0
page.ScrollBarThickness = 4
page.ScrollBarImageColor3 = accent
page.CanvasSize = UDim2.new(0, 0, 0, 0)
page.AutomaticCanvasSize = Enum.AutomaticSize.Y
page.Visible = false
page.Parent = content
local layout = Instance.new("UIListLayout")
layout.Padding = UDim.new(0, 8)
layout.SortOrder = Enum.SortOrder.LayoutOrder
layout.Parent = page
local padding = Instance.new("UIPadding")
padding.PaddingTop = UDim.new(0, 3)
padding.PaddingLeft = UDim.new(0, 3)
padding.PaddingRight = UDim.new(0, 7)
padding.PaddingBottom = UDim.new(0, 8)
padding.Parent = page
pages[name] = page
return page
end
local function showTab(name)
for pageName, page in pairs(pages) do
page.Visible = pageName == name
end
for tabName, tab in pairs(tabButtons) do
tab.BackgroundColor3 = tabName == name and accent or panelColor
tab.TextColor3 = tabName == name and Color3.new(0, 0, 0) or textColor
end
end
local function createTab(name, order)
local tab = makeButton(
sidebar,
name,
UDim2.new(1, 0, 0, 34),
UDim2.new(),
function()
showTab(name)
end
)
tab.LayoutOrder = order
tabButtons[name] = tab
createPage(name)
return pages[name]
end
-- CONTROL HELPERS
local function addSection(parent, text)
local label = makeLabel(
parent,
text,
UDim2.new(1, 0, 0, 25),
UDim2.new(),
14
)
label.Font = Enum.Font.GothamBold
label.TextColor3 = accent
table.insert(sectionLabels, label)
return label
end
local function addAction(parent, text, callback)
return makeButton(
parent,
text,
UDim2.new(1, 0, 0, 34),
UDim2.new(),
callback
)
end
local function addSlider(parent, name, minimum, maximum, initial, callback)
local holder = Instance.new("Frame")
holder.Size = UDim2.new(1, 0, 0, 58)
holder.BackgroundTransparency = 1
holder.Parent = parent
local valueLabel = makeLabel(
holder,
name .. ": " .. initial,
UDim2.new(1, 0, 0, 22),
UDim2.new(),
12
)
local bar = Instance.new("TextButton")
bar.Name = "SliderBar"
bar.Text = ""
bar.AutoButtonColor = false
bar.Size = UDim2.new(1, 0, 0, 10)
bar.Position = UDim2.new(0, 0, 0, 32)
bar.BackgroundColor3 = Color3.fromRGB(48, 48, 58)
bar.BorderSizePixel = 0
bar.Parent = holder
makeCorner(bar, 5)
local fill = Instance.new("Frame")
fill.Size = UDim2.new((initial - minimum) / (maximum - minimum), 0, 1, 0)
fill.BackgroundColor3 = accent
fill.BorderSizePixel = 0
fill.Parent = bar
makeCorner(fill, 5)
local dragging = false
local function update(input)
local width = math.max(bar.AbsoluteSize.X, 1)
local fraction = math.clamp(
(input.Position.X - bar.AbsolutePosition.X) / width,
0,
1
)
local currentValue = math.floor(
minimum + fraction * (maximum - minimum) + 0.5
)
fill.Size = UDim2.new(
(currentValue - minimum) / (maximum - minimum),
0,
1,
0
)
valueLabel.Text = name .. ": " .. currentValue
callback(currentValue)
end
bar.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
update(input)
end
end)
track(UIS.InputChanged:Connect(function(input)
if not dragging then return end
if input.UserInputType == Enum.UserInputType.MouseMovement
or input.UserInputType == Enum.UserInputType.Touch then
update(input)
end
end))
track(UIS.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch then
dragging = false
end
end))
return holder
end
local function addToggle(parent, name, callback)
local enabled = false
local button
button = addAction(parent, name .. ": OFF", function()
enabled = not enabled
button.Text = name .. ": " .. (enabled and "ON" or "OFF")
button.BackgroundColor3 = enabled and accent or panelColor
button.TextColor3 = enabled and Color3.new(0, 0, 0) or textColor
callback(enabled)
log(name .. (enabled and " enabled" or " disabled"))
end)
return button
end
-- CREATE TABS
createTab("Home", 1)
createTab("Player", 2)
createTab("ESP", 3)
createTab("Info Log", 4)
createTab("Music", 5)
createTab("Settings", 6)
-- HOME
local homePage = pages["Home"]
addSection(homePage, "Welcome to Wave Universal")
makeLabel(
homePage,
"A compact utility panel for your own Roblox Studio experience.",
UDim2.new(1, 0, 0, 42),
UDim2.new(),
12
)
addAction(homePage, "Refresh Character", function()
if getCharacter() then
log("Character is loaded")
else
log("Character is not loaded")
end
end)
addAction(homePage, "Show Current Settings", function()
log("WalkSpeed: " .. selectedWalkSpeed)
log("JumpPower: " .. selectedJumpPower)
log("Noclip: " .. tostring(noclipEnabled))
log("Infinite Jump: " .. tostring(infiniteJumpEnabled))
log("ESP: " .. tostring(espEnabled))
log("Music: " .. tostring(musicEnabled))
end)
-- PLAYER
local playerPage = pages["Player"]
addSection(playerPage, "Movement")
addSlider(playerPage, "WalkSpeed", 0, 100, selectedWalkSpeed, applyWalkSpeed)
addSlider(playerPage, "JumpPower", 0, 150, selectedJumpPower, applyJumpPower)
local function setNoclip(enabled)
noclipEnabled = enabled
if not enabled then
for part, oldValue in pairs(originalCollision) do
if part and part.Parent then
part.CanCollide = oldValue
end
end
table.clear(originalCollision)
end
end
addToggle(playerPage, "Noclip", setNoclip)
addToggle(playerPage, "Infinite Jump", function(enabled)
infiniteJumpEnabled = enabled
end)
track(UIS.JumpRequest:Connect(function()
if not alive or not infiniteJumpEnabled then return end
local humanoid = getHumanoid()
if humanoid then
humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
end
end))
track(RS.Stepped:Connect(function()
if not alive or not noclipEnabled then return end
local character = getCharacter()
if not character then return end
for _, part in ipairs(character:GetDescendants()) do
if part:IsA("BasePart") then
if originalCollision[part] == nil then
originalCollision[part] = part.CanCollide
end
part.CanCollide = false
end
end
end))
track(player.CharacterAdded:Connect(function(character)
originalCollision = {}
task.wait(0.5)
if not alive then return end
local humanoid = character:FindFirstChildOfClass("Humanoid")
if humanoid then
originalWalkSpeed = humanoid.WalkSpeed
originalJumpPower = humanoid.JumpPower
humanoid.WalkSpeed = selectedWalkSpeed
humanoid.UseJumpPower = true
humanoid.JumpPower = selectedJumpPower
end
end))
-- ESP
local espPage = pages["ESP"]
addSection(espPage, "Player Highlight")
makeLabel(
espPage,
"Highlights other players in this experience. Uses occluded depth mode.",
UDim2.new(1, 0, 0, 40),
UDim2.new(),
12
)
local function createHighlight(character)
local highlight = Instance.new("Highlight")
highlight.Name = "WavePlayerHighlight"
highlight.Adornee = character
highlight.FillColor = accent
highlight.OutlineColor = Color3.new(1, 1, 1)
highlight.FillTransparency = 0.65
highlight.OutlineTransparency = 0
highlight.DepthMode = Enum.HighlightDepthMode.Occluded
highlight.Parent = character
return highlight
end
local function clearHighlights()
for playerObject, highlight in pairs(highlights) do
if highlight then
highlight:Destroy()
end
highlights[playerObject] = nil
end
end
local function refreshESP()
if not espEnabled then
clearHighlights()
return
end
for _, otherPlayer in ipairs(Players:GetPlayers()) do
if otherPlayer ~= player then
local character = otherPlayer.Character
local existing = highlights[otherPlayer]
-- Drop highlights that belong to a dead or replaced character
if existing and (not character or existing.Adornee ~= character) then
existing:Destroy()
highlights[otherPlayer] = nil
end
if character and not highlights[otherPlayer] then
highlights[otherPlayer] = createHighlight(character)
end
end
end
end
addToggle(espPage, "Player ESP", function(enabled)
espEnabled = enabled
if enabled then
refreshESP()
else
clearHighlights()
end
end)
track(Players.PlayerAdded:Connect(function()
task.delay(1, refreshESP)
end))
track(Players.PlayerRemoving:Connect(function(leavingPlayer)
local highlight = highlights[leavingPlayer]
if highlight then
highlight:Destroy()
highlights[leavingPlayer] = nil
end
end))
local espTimer = 0
track(RS.Heartbeat:Connect(function(deltaTime)
if not alive or not espEnabled then return end
espTimer += deltaTime
if espTimer >= 1 then
espTimer = 0
refreshESP()
end
end))
-- INFO LOG
local infoPage = pages["Info Log"]
addSection(infoPage, "Activity")
logLabel = makeLabel(
infoPage,
"Wave Universal initialized.",
UDim2.new(1, -4, 0, 0),
UDim2.new(),
11
)
logLabel.AutomaticSize = Enum.AutomaticSize.Y
logLabel.TextYAlignment = Enum.TextYAlignment.Top
logLabel.Font = Enum.Font.Code
addAction(infoPage, "Clear Log", function()
table.clear(logEntries)
logLabel.Text = ""
end)
-- MUSIC
local musicPage = pages["Music"]
addSection(musicPage, "Music Player")
makeLabel(
musicPage,
"Cycles through the configured audio IDs. Audio availability depends on Roblox permissions.",
UDim2.new(1, 0, 0, 48),
UDim2.new(),
12
)
local music = Instance.new("Sound")
music.Name = "WaveMusic"
music.Volume = 0.35
music.Looped = false
music.Parent = SoundService
local playNextTrack
playNextTrack = function()
if not alive or not musicEnabled then return end
musicIndex = (musicIndex % #musicIds) + 1
music.SoundId = "rbxassetid://" .. musicIds[musicIndex]
music:Play()
log("Playing playlist track " .. musicIndex)
-- If a track fails to load, Ended never fires, so skip ahead after a delay
local expectedIndex = musicIndex
task.delay(15, function()
if musicEnabled and musicIndex == expectedIndex and not music.IsPlaying then
playNextTrack()
end
end)
end
track(music.Ended:Connect(function()
if musicEnabled then
playNextTrack()
end
end))
musicToggleButton = addAction(musicPage, "Play Playlist", function()
if musicEnabled then
musicEnabled = false
music:Stop()
musicToggleButton.Text = "Play Playlist"
log("Music stopped")
else
musicEnabled = true
musicToggleButton.Text = "Stop Music"
playNextTrack()
end
end)
addAction(musicPage, "Next Track", function()
musicEnabled = true
musicToggleButton.Text = "Stop Music"
playNextTrack()
end)
-- SETTINGS
local settingsPage = pages["Settings"]
addSection(settingsPage, "Appearance")
local function applyTheme(themeName)
accent = themes[themeName] or themes.Cyan
windowStroke.Color = accent
title.TextColor3 = accent
logo.Image = LOGO_ID
for _, label in ipairs(sectionLabels) do
label.TextColor3 = accent
end
for _, page in pairs(pages) do
page.ScrollBarImageColor3 = accent
end
for name, tab in pairs(tabButtons) do
if pages[name].Visible then
tab.BackgroundColor3 = accent
tab.TextColor3 = Color3.new(0, 0, 0)
else
tab.BackgroundColor3 = panelColor
tab.TextColor3 = textColor
end
end
for _, highlight in pairs(highlights) do
if highlight then
highlight.FillColor = accent
end
end
if reopen then
reopen.BackgroundColor3 = accent
end
if reopenLogo then
reopenLogo.Image = LOGO_ID
end
log("Theme changed to " .. themeName)
end
for _, themeName in ipairs(themeOrder) do
addAction(settingsPage, "Theme: " .. themeName, function()
applyTheme(themeName)
end)
end
-- WINDOW DRAGGING
local dragging = false
local dragStart
local startPosition
track(header.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPosition = window.Position
end
end))
track(UIS.InputChanged:Connect(function(input)
if not dragging then return end
if input.UserInputType == Enum.UserInputType.MouseMovement
or input.UserInputType == Enum.UserInputType.Touch then
local delta = input.Position - dragStart
window.Position = UDim2.new(
startPosition.X.Scale,
startPosition.X.Offset + delta.X,
startPosition.Y.Scale,
startPosition.Y.Offset + delta.Y
)
end
end))
track(UIS.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch then
dragging = false
end
end))
-- FLOATING REOPEN BUTTON
reopen = makeButton(
gui,
"",
UDim2.fromOffset(44, 44),
UDim2.new(0, 12, 0.5, -22),
function()
if alive then
window.Visible = true
reopen.Visible = false
end
end
)
reopen.Name = "WaveReopen"
reopen.BackgroundColor3 = accent
reopen.Visible = false
reopen.ZIndex = 20
reopenLogo = Instance.new("ImageLabel")
reopenLogo.Name = "WaveLogo"
reopenLogo.Size = UDim2.new(1, -6, 1, -6)
reopenLogo.Position = UDim2.new(0, 3, 0, 3)
reopenLogo.BackgroundTransparency = 1
reopenLogo.Image = LOGO_ID
reopenLogo.ScaleType = Enum.ScaleType.Fit
reopenLogo.ZIndex = 21
reopenLogo.Parent = reopen
-- HEADER BUTTONS
local minimize = makeButton(
header,
"—",
UDim2.fromOffset(28, 26),
UDim2.new(1, -70, 0, 8),
function()
window.Visible = false
reopen.Visible = true
end
)
minimize.Name = "MinimizeButton"
minimize.ZIndex = 10
local close = makeButton(
header,
"X",
UDim2.fromOffset(28, 26),
UDim2.new(1, -36, 0, 8),
function()
cleanup()
end
)
close.Name = "CloseButton"
close.ZIndex = 10
-- CLEANUP
local cleanup
cleanup = function()
if not alive then return end
alive = false
setNoclip(false)
restoreMovement()
infiniteJumpEnabled = false
espEnabled = false
musicEnabled = false
music:Stop()
clearHighlights()
for _, connection in ipairs(connections) do
pcall(function()
connection:Disconnect()
end)
end
gui:Destroy()
music:Destroy()
log("Wave Universal closed")
end
-- FINAL INITIALIZATION
showTab("Home")
applyTheme("Cyan")
log("Wave Universal v1.7 loaded")How to Execute Universal Script – Wave Universal
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
View Author ProfileFeatures & Information
Script Changelog (1)
Community Comments (0)
No comments yet for this script.
Frequently Asked Questions
How do I execute Universal Script – Wave Universal in Roblox?
To run Universal Script – Wave Universal, 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 – Wave Universal keyless or does it require an access key?
Universal Script – Wave Universal requires an access key. You can retrieve the official key directly using the Get Script Key link provided above.
Is Universal Script – Wave Universal 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.


![Ez Hub [Open Source] [150+ games] - Verified script for Universal Script](https://media.kocakz.me/b74a9ac15370ba766b2fa9531f17c9dad2c0befb2b951693ae723e4c7d2c3fb6.webp)

![[KEYLESS] Moondiety Script | 20+ supported Games - Verified script for Universal Script](https://media.kocakz.me/6834c33a36c9fbe66afae4c6754c2b80386ce636b2f972464a95866f4b6a42eb.webp)

