M
Description
script that allows you to add won/loss sounds into rivals, creating a "musickits" just like in cs2. !vibecoded!
GAMERIVALS [❄️FREEZE RAY❄️]
UPDATEDOct 26, 2026
ACCESSKeyless
PLATFORMDesktop
Script source Luau
-- [[ BloxScripts Risk Notice ]]
-- This script has not been verified by BloxScripts.fun. 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 BloxScripts 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
Review the source before using it. Executions count successful copies, capped at 10 per user and network per script in 24 hours.
Community discussion
0Start the conversation.


Your community, in one place