--[[ 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")