-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. Deal with caution. -- -- Stay safe: -- • Never log in on unofficial Roblox sites or lookalike domains. -- • Real Roblox links use roblox.com (check the .com ending). -- • Treat fake Roblox login / "claim reward" pages as phishing. -- [[ End Rscripts Risk Notice ]] -- soundkitzz | Roblox Rivals -- Client-side UI sound replacement for visible ROUND WON / ROUND LOST results. -- Default sounds. Existing shared values are preserved across re-execution. shared.WinSoundID = shared.WinSoundID or "rbxassetid://18431055231" shared.LoseSoundID = shared.LoseSoundID or "rbxassetid://18453244839" if shared.AudioModEnabled == nil then shared.AudioModEnabled = true end -- Soundkit configs are kept in the executor's shared environment for this session. if type(shared.SoundkitConfigs) ~= "table" or #shared.SoundkitConfigs == 0 then shared.SoundkitConfigs = { { Name = "Default", WinSoundID = shared.WinSoundID, LoseSoundID = shared.LoseSoundID } } end shared.SoundkitIndex = math.clamp(tonumber(shared.SoundkitIndex) or 1, 1, #shared.SoundkitConfigs) local Players = game:GetService("Players") local SoundService = game:GetService("SoundService") local UserInputService = game:GetService("UserInputService") local TweenService = game:GetService("TweenService") local LocalPlayer = Players.LocalPlayer local PlayerGui = LocalPlayer:WaitForChild("PlayerGui") -- Remove the previous UI if the script is run again. local oldGui = PlayerGui:FindFirstChild("soundkitzz") if oldGui then oldGui:Destroy() end local function currentKit() return shared.SoundkitConfigs[shared.SoundkitIndex] end local function applyKit(kit) if not kit then return end shared.WinSoundID = kit.WinSoundID shared.LoseSoundID = kit.LoseSoundID end applyKit(currentKit()) local ScreenGui = Instance.new("ScreenGui") ScreenGui.Name = "soundkitzz" ScreenGui.ResetOnSpawn = false ScreenGui.Parent = PlayerGui local MainFrame = Instance.new("Frame") MainFrame.Name = "MainFrame" MainFrame.Size = UDim2.new(0, 350, 0, 335) MainFrame.Position = UDim2.new(0.05, 0, 0.3, 0) MainFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 25) MainFrame.BorderSizePixel = 0 MainFrame.Active = true MainFrame.Draggable = true MainFrame.Parent = ScreenGui local MainCorner = Instance.new("UICorner") MainCorner.CornerRadius = UDim.new(0, 12) MainCorner.Parent = MainFrame local UIStroke = Instance.new("UIStroke") UIStroke.Thickness = 1.5 UIStroke.Color = Color3.fromRGB(50, 50, 65) UIStroke.Parent = MainFrame local function makeLabel(name, text, size, position, textSize, color) local label = Instance.new("TextLabel") label.Name = name label.Size = size label.Position = position label.BackgroundTransparency = 1 label.Text = text label.TextColor3 = color or Color3.fromRGB(230, 230, 235) label.TextSize = textSize or 11 label.Font = Enum.Font.Gotham label.TextXAlignment = Enum.TextXAlignment.Left label.Parent = MainFrame return label end local function makeButton(name, text, size, position) local button = Instance.new("TextButton") button.Name = name button.Size = size button.Position = position button.BackgroundColor3 = Color3.fromRGB(45, 45, 55) button.BorderSizePixel = 0 button.Text = text button.TextColor3 = Color3.fromRGB(240, 240, 245) button.Font = Enum.Font.GothamBold button.TextSize = 11 button.Parent = MainFrame local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0, 6) corner.Parent = button return button end local function makeTextBox(name, placeholder, size, position) local box = Instance.new("TextBox") box.Name = name box.Size = size box.Position = position box.BackgroundColor3 = Color3.fromRGB(30, 30, 38) box.BorderSizePixel = 0 box.Text = "" box.PlaceholderText = placeholder box.TextColor3 = Color3.fromRGB(230, 230, 235) box.PlaceholderColor3 = Color3.fromRGB(135, 135, 145) box.TextSize = 11 box.Font = Enum.Font.Gotham box.ClearTextOnFocus = false box.Parent = MainFrame local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0, 6) corner.Parent = box return box end local Title = Instance.new("TextLabel") Title.Name = "Title" Title.Size = UDim2.new(1, 0, 0, 38) Title.BackgroundColor3 = Color3.fromRGB(28, 28, 35) Title.Text = " soundkitzz | RIVALS" Title.TextColor3 = Color3.fromRGB(255, 255, 255) Title.TextSize = 13 Title.Font = Enum.Font.GothamBold Title.TextXAlignment = Enum.TextXAlignment.Left Title.Parent = MainFrame local TitleCorner = Instance.new("UICorner") TitleCorner.CornerRadius = UDim.new(0, 12) TitleCorner.Parent = Title local ToggleBtn = makeButton("ToggleBtn", "", UDim2.new(0, 310, 0, 32), UDim2.new(0, 20, 0, 48)) local KitNameBox = makeTextBox("KitName", "Name for the new kit (optional)", UDim2.new(0, 198, 0, 30), UDim2.new(0, 20, 0, 91)) local AddKitBtn = makeButton("AddKitBtn", "ADD KIT", UDim2.new(0, 102, 0, 30), UDim2.new(0, 228, 0, 91)) local PrevKitBtn = makeButton("PrevKitBtn", "<", UDim2.new(0, 42, 0, 30), UDim2.new(0, 20, 0, 130)) local KitStatus = makeLabel("KitStatus", "", UDim2.new(0, 220, 0, 30), UDim2.new(0, 70, 0, 130), 11) KitStatus.TextXAlignment = Enum.TextXAlignment.Center local NextKitBtn = makeButton("NextKitBtn", ">", UDim2.new(0, 42, 0, 30), UDim2.new(0, 288, 0, 130)) local SaveKitBtn = makeButton("SaveKitBtn", "SAVE SELECTED KIT", UDim2.new(0, 310, 0, 30), UDim2.new(0, 20, 0, 169)) makeLabel("WinLabel", "WIN SOUND ID / LINK", UDim2.new(1, -40, 0, 16), UDim2.new(0, 20, 0, 208), 10, Color3.fromRGB(170, 170, 185)) local WinInput = makeTextBox("WinInput", "Roblox audio ID or supported file/link", UDim2.new(0, 235, 0, 31), UDim2.new(0, 20, 0, 228)) local WinTest = makeButton("WinTest", "TEST", UDim2.new(0, 65, 0, 31), UDim2.new(0, 265, 0, 228)) makeLabel("LoseLabel", "LOSS SOUND ID / LINK", UDim2.new(1, -40, 0, 16), UDim2.new(0, 20, 0, 268), 10, Color3.fromRGB(170, 170, 185)) local LoseInput = makeTextBox("LoseInput", "Roblox audio ID or supported file/link", UDim2.new(0, 235, 0, 31), UDim2.new(0, 20, 0, 288)) local LoseTest = makeButton("LoseTest", "TEST", UDim2.new(0, 65, 0, 31), UDim2.new(0, 265, 0, 288)) local function refreshKitUI() local kit = currentKit() if not kit then return end KitNameBox.Text = "" WinInput.Text = kit.WinSoundID or "" LoseInput.Text = kit.LoseSoundID or "" KitStatus.Text = string.format("%d / %d | %s", shared.SoundkitIndex, #shared.SoundkitConfigs, kit.Name or "Soundkit") applyKit(kit) end local function saveSelectedKit() local kit = currentKit() if not kit then return end kit.WinSoundID = WinInput.Text kit.LoseSoundID = LoseInput.Text applyKit(kit) refreshKitUI() end local function switchKit(index) saveSelectedKit() local count = #shared.SoundkitConfigs shared.SoundkitIndex = ((index - 1) % count) + 1 refreshKitUI() end local function updateToggle() ToggleBtn.BackgroundColor3 = shared.AudioModEnabled and Color3.fromRGB(46, 204, 113) or Color3.fromRGB(231, 76, 60) ToggleBtn.Text = shared.AudioModEnabled and "SOUNDKIT: ON" or "SOUNDKIT: OFF" end ToggleBtn.MouseButton1Click:Connect(function() shared.AudioModEnabled = not shared.AudioModEnabled updateToggle() end) AddKitBtn.MouseButton1Click:Connect(function() local name = KitNameBox.Text:gsub("^%s+", ""):gsub("%s+$", "") if name == "" then name = "Soundkit " .. tostring(#shared.SoundkitConfigs + 1) end saveSelectedKit() local source = currentKit() table.insert(shared.SoundkitConfigs, { Name = name, WinSoundID = source.WinSoundID, LoseSoundID = source.LoseSoundID }) shared.SoundkitIndex = #shared.SoundkitConfigs refreshKitUI() end) PrevKitBtn.MouseButton1Click:Connect(function() switchKit(shared.SoundkitIndex - 1) end) NextKitBtn.MouseButton1Click:Connect(function() switchKit(shared.SoundkitIndex + 1) end) SaveKitBtn.MouseButton1Click:Connect(saveSelectedKit) WinInput.FocusLost:Connect(function() local kit = currentKit() if kit then kit.WinSoundID = WinInput.Text applyKit(kit) end end) LoseInput.FocusLost:Connect(function() local kit = currentKit() if kit then kit.LoseSoundID = LoseInput.Text applyKit(kit) end end) -- Sound playback local function playSmartSound(inputSource, fallbackFileName) if not shared.AudioModEnabled then return end if type(inputSource) ~= "string" or inputSource == "" then return end local sound = Instance.new("Sound") sound.Volume = 1 sound.Parent = SoundService if string.match(inputSource, "^https?://") then if writefile and getcustomasset then local fileName = fallbackFileName .. "_" .. tostring(os.time()) .. ".mp3" local exists = false if isfile then local ok, result = pcall(isfile, fileName) exists = ok and result end if not exists then local ok, data = pcall(function() return game:HttpGet(inputSource) end) if not ok or not data then warn("[soundkitzz] Could not download the sound link.") sound:Destroy() return end local writeOk = pcall(writefile, fileName, data) if not writeOk then warn("[soundkitzz] Could not save the sound file.") sound:Destroy() return end end local assetOk, assetId = pcall(getcustomasset, fileName) if not assetOk then sound:Destroy() return end sound.SoundId = assetId else warn("[soundkitzz] This executor does not support custom sound files.") sound:Destroy() return end elseif string.match(string.lower(inputSource), "%.mp3$") or string.match(string.lower(inputSource), "%.ogg$") then if not getcustomasset then sound:Destroy() return end local ok, assetId = pcall(getcustomasset, inputSource) if not ok then sound:Destroy() return end sound.SoundId = assetId else if string.match(inputSource, "^%d+$") then sound.SoundId = "rbxassetid://" .. inputSource elseif string.match(inputSource, "^rbxassetid://%d+$") then sound.SoundId = inputSource else warn("[soundkitzz] Use a numeric Roblox asset ID, rbxassetid:// ID, or supported file/link.") sound:Destroy() return end end sound.Ended:Connect(function() sound:Destroy() end) sound:Play() end WinTest.MouseButton1Click:Connect(function() playSmartSound(WinInput.Text, "test_win") end) LoseTest.MouseButton1Click:Connect(function() playSmartSound(LoseInput.Text, "test_lose") end) -- Right Control hides/shows the entire UI. local isVisible = true UserInputService.InputBegan:Connect(function(input, gameProcessedEvent) if input.KeyCode ~= Enum.KeyCode.RightControl then return end isVisible = not isVisible ScreenGui.Enabled = isVisible end) updateToggle() refreshKitUI() -- Match result detection local lastPlayed = 0 local boundLabels = setmetatable({}, { __mode = "k" }) local function cleanText(text) return string.upper((text or ""):gsub("%s+", "")) end local function isFullyVisible(guiObject) local current = guiObject while current and current ~= PlayerGui do if current:IsA("GuiObject") and not current.Visible then return false end if current:IsA("TextLabel") and current.TextTransparency >= 0.5 then return false end current = current.Parent end return true end local function isResultLabel(label) local ancestor = label.Parent -- In the shown HUD, ROUND and WON/LOST are separate labels. -- Search nearby containers for the ROUND heading. for _ = 1, 4 do if not ancestor or ancestor == PlayerGui then break end for _, item in ipairs(ancestor:GetDescendants()) do if item:IsA("TextLabel") and cleanText(item.Text) == "ROUND" and isFullyVisible(item) then return true end end ancestor = ancestor.Parent end return false end local function checkTextLabel(label) if not label:IsA("TextLabel") or boundLabels[label] then return end boundLabels[label] = true local previousText = cleanText(label.Text) local pendingResultSince = nil local wasVisible = isFullyVisible(label) local function validateAndPlay() local text = cleanText(label.Text) local visibleNow = isFullyVisible(label) local becameVisible = visibleNow and not wasVisible wasVisible = visibleNow local isWin = text == "WON" or text == "WIN" local isLoss = text == "LOST" or text == "LOSE" or text == "DEFEAT" local isResult = isWin or isLoss if text ~= previousText then previousText = text pendingResultSince = isResult and os.clock() or nil elseif becameVisible and isResult then -- Some rounds reuse the same WON/LOST text without changing it. -- Re-arm when its result card is shown again after being hidden. pendingResultSince = os.clock() end if not shared.AudioModEnabled or not isResultLabel(label) then return end if not isResult or not pendingResultSince then return end -- Text can update just before the result card becomes visible. if os.clock() - pendingResultSince > 5 then pendingResultSince = nil return end if not visibleNow or os.clock() - lastPlayed < 2 then return end lastPlayed = os.clock() pendingResultSince = nil if isWin then playSmartSound(shared.WinSoundID, "match_win") else playSmartSound(shared.LoseSoundID, "match_lose") end end label:GetPropertyChangedSignal("Text"):Connect(validateAndPlay) label:GetPropertyChangedSignal("Visible"):Connect(validateAndPlay) local ancestor = label.Parent while ancestor and ancestor ~= PlayerGui do if ancestor:IsA("GuiObject") then ancestor:GetPropertyChangedSignal("Visible"):Connect(validateAndPlay) end ancestor = ancestor.Parent end end PlayerGui.DescendantAdded:Connect(checkTextLabel) for _, descendant in ipairs(PlayerGui:GetDescendants()) do checkTextLabel(descendant) end